OmniAICreator/Qiita-1.07M huggingface dataset:
Windows11 × WSL2でFeliCaを使えるようにする

# はじめに
単にWindowsでFeliCaを使いたいというだけであればそもそもWSLを使う必要自体が無いのですが、

- RaspberryPiなどLinux機で使う予定のシステムをWindowsで開発する場合
- 現にLinuxで動いているシステムをWindowsに移植する場合

などの状況もあり得るかと思います。

Windows11×WSL2ではUSBデバイスの利用がサポートされており、丁寧な公式ドキュメントも用意されています。
その上でこの記事では自分が詰まったところを中心に書いていきたいと思います。

# 動作を確認した環境

- OS : Windows 11
- WSLで使用したディストリビューション : Ubuntu 20.04
- カードリーダー : Sony RC-S330

# FeliCaリーダーのドライバのインストール
WSLで使う予定とはいえまずは普通にドライバのインストールを行わないとこの後の工程で認識すらされないため、ソニー公式サイトの指示に従ってドライバをインストールします。

# WSLのインストール
公式ドキュメント : 
https://docs.microsoft.com/ja-jp/windows/wsl/setup/environment

これからWSLおよびUbuntuの準備をする場合は上記を参考に作業を進めるのが良いと思います。なお **インストールは管理者権限でおこなってください**。

# WSLでUSBデバイスを使えるようにする

公式ドキュメント : 
https://docs.microsoft.com/ja-jp/windows/wsl/connect-usb

基本的には上記のドキュメントの通りに作業を進めます。

なお、ここから先の工程は **管理者として実行** する箇所が大半を占めます。
PowerShellを管理者として起動するのを忘れないでください。できれば管理者権限のあるアカウントで作業をするのが無難ですが、その都度パスワードを入力しても一応可能です。逆に **管理者権限を一切使えない場合は現状WSLでUSBを使うことはできない**かと思います。

## 失敗しそうな箇所 

### usbipd wsl listを実行してもFeliCaリーダーが見つからない

FeliCaリーダーのドライバのインストールを忘れている可能性が高いです。

### usbipd wsl attach --busid \<busid>が失敗する
様々な原因が考えられます。
#### WSLが起動していない
別のPowerShellを立ち上げるなどの方法でWSLを実行してください。

#### 対象となるディストリビューションが無い
「現に今WSLでubuntuを使っているからそんなはずはない」と思うかもしれませんが、WSLのディストリビューションはユーザごとに独立しており共有できないため例えば一般ユーザのアカウントでubuntuをインストールした場合にこの状況になります。

一度

`wsl --list --verbose`

を実行して、もしそこにubuntuがなければインストールしてください。
あるいは一般ユーザで使っていたディストリビューションをどうしてもそのまま使いたいという場合は下記のリンクを参考に一般ユーザからのエクスポートおよび管理者アカウントへのインポートをおこなってください。

https://forest.watch.impress.co.jp/docs/serial/yajiuma/1220926.html

#### ファイアウォールでブロックされている
この場合はファイアウォールの設定を確認するようメッセージが表示されます。usbipdはTCP通信で3240番ポートを使うため、必要に応じてセキュリティソフトの設定を変更してください。

`usbipd wsl attach --busid <busid>`
でエラーが出なくなればここまではおそらく大丈夫です。

## (ubuntu側)lsusbの結果を確認する

うまく行っていれば接続されているUSBデバイスの一覧にFeliCaリーダーが表示されます。
これでWSL側からUSBデバイスを使用する準備ができました。

# Felicaリーダーの動作確認

ここから先は主にubuntu側での作業になります。

nfcpyを使って動作確認をします。

nfcpy :
https://nfcpy.readthedocs.io/en/latest/topics/get-started.html

おそらくpython3自体は既にインストールされていると思うのでnfcpyをインストールします。
`
pip install -U nfcpy
`

次に

`
python -m nfc
`

を実行します。おそらくFeliCaリーダーへのアクセスに失敗すると思いますが、エラーメッセージの中に次に実行すべきコマンドが書かれています。

**注：下記は公式ドキュメントの引用です。実際には機種ごとにベンダーIDやプロダクトIDが異なるので必ずご自身のターミナルに表示されているコマンドを実行してください**
```
（略）
-- it's better to add the device to the 'plugdev' group
   sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"04e6\", ATTRS{idProduct}==\"5591\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
   sudo udevadm control -R # then re-attach device
（略）
```

ここで書かれているsudo...のコマンドを2つ実行すれば良いのですが、自分が試したときは`sudo udevadm control -R`を実行したときにエラーが発生しましたが

`sudo service udev restart`

を実行してから改めて`sudo udevadm control -R`を実行すればうまくいくと思います。

nfcpyを用いた動作確認用のプログラムについては上記の公式ドキュメントをはじめ検索するとたくさんある、かつFeliCaリーダーの機種に合わせて調べ直していただいた方が良いと思うので割愛させていただきます。

# おわりに
WSL2でUSBデバイスがサポートされたとはいえ、正直言ってWSL2でFeliCaを使うのはかなりしんどいです。
ただもし自分以外にもやむを得ず今回のような構成でFeliCaを使わざるを得なくなった方がいれば少しでもお役に立てば幸いです。
nodeがインストールできない環境でもmermaid.jsのSVGをゲットしたい

尚且つ、公式のライブエディターを使うのがはばかられる場合に備えて

https://qiita.com/irukiti/items/91cff8a61d4dccc8779d

https://qiita.com/yasumichi/items/e388aae97f7116e1e80d

を混ぜて簡易エディターをでっち上げてみました。

```html
<!DOCTYPE html>
<html lang="jp">
<head>
  <meta charset="utf-8">
  <link rel="stylesheet" href="all.min.css">
  <style>
  textarea#diagram {
    width: 50%;
    height: 50vh
  }
  textarea#svgCode {
    width: 90%;
    height: 20vh
  }
  .flex {
    display: flex;
  }
  .mermaid {
    width: 50%;
  }
  </style>
</head>
<body>
  <div class="flex">
    <textarea id="diagram" onchange="changeContainer()">
graph TD
  あ-->B
  あ-->C
  B-->D
  C-->D
    </textarea>
    <div id="mermaidContainer" class="mermaid"></div>
  </div>
  <textarea id="svgCode"></textarea>
  <br />
  <button>Save SVG</button>

  <script src="mermaid.min.js"></script>
  <script>mermaid.initialize({startOnLoad:false});</script>

  <script>
const container = document.getElementById("mermaidContainer")
const svgCode = document.getElementById("svgCode")

function changeContainer (){
    container.removeAttribute('data-processed')
    let diagram = document.getElementById("diagram").value
    if (!diagram) return
    container.innerHTML = diagram.replace(/</g, '&lt;')
    mermaid.init()
    
    svgCode.innerText = container.innerHTML
}
changeContainer()
  </script>
  
  <script>
const button = document.querySelector('button')

button.addEventListener('click', async () => {
  const opts = {
    suggestedName: 'diagram',
    types: [{
      description: 'Text file',
      accept: {'text/plain': ['.svg']},
    }],
  };
  const handle = await window.showSaveFilePicker(opts);
  const writable = await handle.createWritable()
  await writable.write(svgCode.value)
  await writable.close()
})
  </script>
<body>
</html>
```

ダイアグラムを書いたらtextarea外をポチっとすると絵が更新されます。
Save SVGボタンを押すとsvgがゲットできます。

これがローコードプログラミングって奴ですよね（違

追記：
```text
classDiagram
class Shape{
    <<interface>>
    noOfVertices
    draw()
}
class Color{
    <<enumeration>>
    RED
    BLUE
    GREEN
    WHITE
    BLACK
}
```
で
```mermaid
classDiagram
class Shape{
    <<interface>>
    noOfVertices
    draw()
}
class Color{
    <<enumeration>>
    RED
    BLUE
    GREEN
    WHITE
    BLACK
}
```
を表示させようとするとsyntax errorになってしまっていたのを修正しました。
[Java] 内部クラスについて　まとめ

### はじめに
Javaの学習を始めたのでアウトプットとして投稿しています
今回は内部クラスについてまとめました

### 内部クラスとは？
名前の通りクラスの中にクラスがあり、ネストしているような状態のクラスのこと
通常は１ファイルの中に１クラスを定義するが、言語仕様上は１ファイルの中にいくつもクラスを持つことが出来る

クラスAの中に内部クラスB、の中に内部クラスCを持つ
```java
public class A {
    public class B {
        public class C {
        }
    }
}
```
これは１ファイルに複数のクラスを持っているだけで内部クラスではない
```java
public class A {

}

class B {

}
```

### 使い方
クラス同様インスタンス化ができるが制約もある
- staticクラスは、クラス外から直接インスタンス化できる
- 非staticクラスは、外部クラスのインスタンスからのみインスタンス化できる
(非staticな場合のみ内部クラスと呼ぶ、それ以外は「ネストしたクラス」として扱う場合あり)

### 具体例
##### 非staticな内部クラス
```java
public class Outer {
  public class Inner {
  }
}
```
別のクラス（クラスCと仮定）から↑をインスタンス化
```java
public class Example {
  public static void main(String[] args) {
    Outer outer = new Outer();
    // クラスOuterの内部クラスInnerをインスタンス化
    Outer.Inner inner = outer.new Inner();
  }
}
```
クラスCからクラスInnerを直接参照できないため、型として用いる際には`Outer.Inner`、もしくは`import inner_class_sample.Outer.Inner;`を記述すれば`Inner inner = ~ `で生成できる

非staticなクラスInnerをインスタンス化するには外部クラス（クラスOuter）のインスタンスを使ってインスタンスを作る必要があるため、`outer.Inner();`と記述する

<font color="red">⚠`new outer.Inner();`ではないので注意<font>

##### staticな内部クラス
```java
public class Outer {
    public static class Inner {
    }
}
```
インスタンス化
```java
public class Example {
  public static void main(String[] args) {
    Outer outer = new Outer();
    Outer.Inner inner = new OuterInner();
  }
}
```
`new Outer.Inner();`で直接インスタンス化が可能
先程と同様、import文があれば`new Inner();`でok

### 内部クラスと外部クラスの関係性
内部クラスは外部クラスのフィールドを直接参照できる
```java
public class Outer {
  private String greeting = "こんちは";

  public class Inner {
    public String hello() {
      // "こんちは"が返る
      return greeting;
    }
  }
}
```
たとえ`private`でも内側からであれば参照可能

ただし内部クラスがstaticだと非staticの`greeting`は参照できない
→`private static`フィールドがstaticなら参照可能

### 内部クラスを使うケース
1ファイル1クラスを破ってまで使用するならメリットが大きい場合に限って使用
- 定数クラスを読みやすくしたい時
定数クラス：定数をまとめて置いとくクラスの事
猫の名前、猫の足の本数、タコの名前、タコの足の本数を定数化すると仮定
一つの定数クラスの中に全ての定数を置くだけだと、全く相互関係がない猫の定数とタコの定数があるのは読みにくくなる
そのため定数クラスの**中**で`public static class Cat`と`public static class Octopus`を作成し、その中に定数を定義する
```java
// 定数クラス
public class Constants {
  //内部クラスCatの中に、猫関係の定数を定義
    public static class Cat {
        public static final String NAME = "猫";
        public static final int LEG_COUNT = 4;
    }

  //内部クラスOctopusの中に、タコ関係の定数を定義
    public static class Octopus {
        public static final String NAME = "タコ";
        public static final int LEG_COUNT = 8;
    }
}
```
使用例）`Constants.Cat.NAME`で猫の名前の定数が取得できる

- クラス間の関連性を強調したい時
猫クラス、猫の爪クラス、タコクラス、タコの吸盤クラス
Catクラスの中にCatNailクラスを、Octopusクラスの中にOctopusSuckerクラスを内部クラスにすることで、関連性が表現できる

しかし詰め込みすぎると可読性・メンテナンス性が落ちるので使いたい時は注意する

### 最後に
結局使い所がいまいちわかりませんでしたが、とりあえず頭の片隅に入れておこうと思います。
閲覧頂きありがとうございました。
AndroidにBluetoothイヤフォンを接続するとAudioTrackの音が鳴らない問題

# はじめに

Android で AudioTrack を使って音楽を再生するアプリを開発しているのですが、ユーザーからレビューで「ワイヤレスイヤフォンだと音楽が鳴らない」というご指摘をいただき調査した結果、割と謎な手段で問題を回避したので紹介します。

## AudioTrack 使用の流れ

```kotlin
    private fun createAudioTrack(
        seek: Int,
        onSeek: ((length: Int, time: Int) -> Unit)?,
        onPlayEnded: (() -> Unit)?
    ) {
        audioTrack?.release()
        val attributes = AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .build()
        val format = AudioFormat.Builder()
            .setSampleRate(22050)
            .setChannelMask(AudioFormat.CHANNEL_OUT_MONO)
            .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
            .build()
        audioTrack = AudioTrack.Builder()
            .setAudioAttributes(attributes)
            .setAudioFormat(format)
            .setBufferSizeInBytes(basicBufferSize * 2)
            .setTransferMode(AudioTrack.MODE_STREAM)
            .build()
        audioTrack?.positionNotificationPeriod = basicBufferSize / 2
        audioTrack?.setVolume(masterVolume / 100f)
        audioTrack?.setPlaybackPositionUpdateListener(object :
            AudioTrack.OnPlaybackPositionUpdateListener {
            override fun onMarkerReached(audioTrack: AudioTrack?) {
            }

            override fun onPeriodicNotification(p0: AudioTrack?) {
                // 音楽をループしたりフェードアウトしたりシーク位置を検出したり再enqueueしたり （長いので省略）
            }
        })
        JNI.seek(vgsContext, seek * 22050)
        JNI.kobushi(vgsContext, kobushi)
        decode(decodeAudioBufferFirst)
        audioTrack?.write(decodeAudioBufferFirst, 0, decodeAudioBufferFirst.size)
        audioTrack?.play()
        decodeAudioBufferLatch = 0
        decode(decodeAudioBuffers[decodeAudioBufferLatch])
```

（ザックリとした処理の流れ）

- デコードした音声データ（22050Hz, mono, 16bit PCM形式）を write
- play
- onPeriodicNotification で次データの enqueue や デコード

## 原因（?）

最初に　AudioTrack のバッファサイズ（setBufferSizeInBytes）と同じデータを write していますが、何故か Bluetooth イヤフォン を接続した状態だと **バッファサイズの2倍のデータ** を書き込まないと再生が始まらない謎の状態でした。

_バッファサイズは 16KB にしているので、先頭に 32KB (約0.74秒) の無音が入ることになりますが、これぐらいなら使い勝手上の問題はないからヨシ...ということで。_

## 対策

最初に **バッファサイズの2倍の空データを write する** ように修正しました。

https://github.com/suzukiplan/tohovgs4-android/pull/36

バッファサイズの2倍のデータを write しなければ動かないのは多分OSのバグかもしれないので、その内治るかもしれません。

## 再現環境

- device: Pixel 3
- OS: Android 12 (sequrity update October 5, 2021)
- Bluetooth earphone: Power HBQ Pro
Androidのlicense出力ライブラリとパーサー

# Androidのlicense一覧の自動抽出
Androidアプリが使用しているlicense一覧を自動抽出するライブラリが公開されています。
[https://developers.google.com/android/guides/opensource](https://developers.google.com/android/guides/opensource)

このライブラリを使用すると、license一覧画面が簡単に作れます。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2726391/d8ab7a68-8c5f-2f80-d3b8-342654f436ce.jpeg)

# パーサー
ただ、Activityが必要ですし、このUIを使いたくない場合もあります。

自分でUIを作るには、まずはこのライブラリが出力する下記ファイルをパースする必要があります。
third_party_licenses
third_party_license_metadata

下記ファイルについては、全ライブラリのlicenseの中身が入っております。
```:third_party_licenses
http://www.apache.org/licenses/LICENSE-2.0.txt
https://developer.android.com/studio/terms.html

   Copyright (c) 2005-2011, The Android Open Source Project

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
           ：
           ：
```

一方、下記ファイルについては、ライブラリ名と、そのライブラリのlicenseは
さきほどのファイルの何バイト目から何バイト目にあたるかが書かれております。
```:third_party_license_metadata
0:46 Android Support Library Cursor Adapter
0:46 Android Support Library Interpolators
0:46 Android Support Library Annotations
```

このままではlicense一覧画面を作れないので、パーサーを作りました。
今回はGo langで作っております。
```:パーサーの出力結果
ライブラリ１
licenseの内容

ライブラリ２
ライブラリ３
licenseの内容
     ：
     ：
```
このようなテキストファイルを出力するようにしました。
また、htmlでも出力するようにしました。

ソースは[ココ](https://github.com/gomagon/android-license-parser)


# 参考文献
[https://zenn.dev/chibatching/articles/google-license-data-parse](https://zenn.dev/chibatching/articles/google-license-data-parse)
WebRTC SFUのOSSについて実装言語とGitHubのスター数をまとめた

## はじめに
WebRTC SFUのOSSについて、実装言語とGitHubのスター数をまとめました。
スター数の比較には[GitHub Star History](https://star-history.com/)を使いました。

### 実装言語
| OSS | 実装言語 | 
| --- | --- |
| [Janus](https://github.com/meetecho/janus-gateway) | C | 
| [mediasoup](https://github.com/versatica/mediasoup) | C++/Node.js |
| [LiveKit](https://github.com/livekit/livekit) | Go |
| [licode](https://github.com/lynckia/licode) | C++ |
| [Kurento](https://github.com/Kurento/kurento-media-server) | C++ |
| [Jisti-videobridge](https://github.com/jitsi/jitsi-videobridge) | Java |
| [Pion](https://github.com/pion/ion-sfu) | Go |

### スター数の比較
![star-history-2022630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2527384/7cfa2967-24da-79c4-9a4a-be463d32d00e.png)

### 参考
- [仕事で WebRTC](https://gist.github.com/voluntas/379e48807635ed18ebdbcedd5f3beefa#oss-sfu-mcu)
- [WebRTC MediaServer(SFU/MCU)の情報まとめ](https://iwashi.co/2016/09/03/webrtc-sfu-mcu-summary#fn:1)
怪しい日本語ジェネレータ(LINE bot)

# 怪しい日本語ジェネレータを作った
LINEでトーク送ると変換してくれます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383410/2b2e1502-531e-23a4-3a58-06cb5c942f71.png)

ソースコード

https://github.com/phabet/CorrectJP_LINEbot
AWS初心者によるSAA合格体験記


先日、SAAに合格しました！
[AWS Certified Solutions Architect – Associate](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)

合格点は720でスコアは747なのでギリギリでしたが
AWS初心者による合格までの記録を残します。

# 前提
AWSは少し触ったことがある程度。（EC2、IAM、S3、CloudTrail）
このサービスに関しても深い理解までは出来ていなかったです。
運用の経験はなし。
IT知識もまだ乏しい。

# 勉強期間
部署でSAAを取ろう！という勉強会を2月から開始。
6月中には合格するのを目標としていました。

* 勉強会
30分週2回、持ち回りでサービスの説明をする。
既に合格している人や詳しい人にも参加してもらって
分からないことがあったら聞けたり補足説明をしてくれたり。

* 勉強会振り返り
勉強会の翌日にチームでやってもらっていました。
参考書等を読んだりするだけでは理解が深まりづらいことも多かったので
ここで更に教えていただいて理解が深まりました。

最初は知らないサービスだらけだったので、サービスの特徴をなんとなく覚えていった。
でも日が経つとたくさんある英語3文字が混合して忘れがちでした…

# 利用教材
* 参考書
[(模擬問題付き)改訂新版 徹底攻略 AWS認定 ソリューションアーキテクト − アソシエイト教科書[SAA-C02]対応](https://www.amazon.co.jp/%E6%A8%A1%E6%93%AC%E5%95%8F%E9%A1%8C%E4%BB%98%E3%81%8D-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88%E6%95%99%E7%A7%91%E6%9B%B8-SAA-C02/dp/4295010650/ref=pd_sbs_sccl_2_1/358-0266961-2880460?pd_rd_w=95IKx&content-id=amzn1.sym.7ee6fb34-dad9-4643-b21d-aeaa6bf884aa&pf_rd_p=7ee6fb34-dad9-4643-b21d-aeaa6bf884aa&pf_rd_r=YQFC1BA35NE37G29542Z&pd_rd_wg=SiCD9&pd_rd_r=b71cbf7b-20cf-4673-a25a-f0e805efa37e&pd_rd_i=4295010650&psc=1)
*  Udemy
[AWS認定ソリューションアーキテクト – アソシエイト 【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)
* [AWS Blackbelt](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)
*  youtube
[AWS ソリューションアーキテクト アソシエイト試験 対策動画](https://youtu.be/fsz6G45A4H4)
サービス概要が分かりやすくまとまっていて、試験に出るポイントも抑えられていた。
ドライヤーしながらとか隙間時間で視聴。
*  [AWS公式模擬試験](https://dev.classmethod.jp/articles/new-aws-official-practice-questions/)
無料、20問。

# 勉強方法

試験のために本格的に勉強を始めたのは受験1か月半前位。
ある程度サービス概要を覚えたらudemyの模試を解き始めました。
高難易度の演習問題は難しく、最初の正答率は4割位からのスタートでした。
間違えた問題、サービスは見直して知識を定着させたり理解を深めていました。
問題を解くのが試験対策では効果的だったと思います！

ですが、時間をおいてやるとまた5割位の正答率であまり上がらなかったり、
一度間違えた箇所は再度間違えがちで理解が浅いなと実感しました。


# 合計勉強時間
70時間位
問題を解いて復習するのに時間がかかりました。

# 試験

* 前日
忘れがちなサービスもあるのと、
udemyの演習問題の正答率が一向に55%以上でなくて不安で前日は12時間位は勉強してました。
この1日で曖昧に覚えてたこととか頭でまとまったので
テスト合格という意味では効果があった気がしますが、
一夜漬けなので記憶の定着とかでいうと良いことではないですね。

* 当日
テストセンターで受験。
朝から試験ギリギリまで記憶が曖昧なサービス名と内容を覚えたり間違えた問題見直したり。
試験中も自信満々に答えられる問題は少なかったですが、見直しを含め残り2分まで粘ってました。
合格の文字が見えた時は本当に安心した！


# 感想
勉強も問題も難しかったです。
ソリューションアーキテクトなので、ざっくりサービス名と機能を覚えてるだけだと分からなく
サービスの覚える範囲も結構細かく覚えてないといけない印象。

6月中に合格したいのでUdemyの模試で正答率が悪くても期限を延ばさず受験しましたが、
結果的に合格したのでいつまでも先延ばしにせずに一回受けたほうが良いかもです。
受験料が高いのでもったいないですが！


今回、数年ぶりに試験の勉強をしたので受かったことに達成感を得られました！
ですが、まだ実装とかまでできる実力はないので
今後、実際に手を動かして実装できる力を付けていこうと思います！
【#15 エンジニア転職学習】Git/Github　仕組み

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

本日よりGitに関して進めていきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
Gitの基本的な仕組みやデータ管理の方法までの基礎知識を学習しました。

* **Gitの基礎　←Topics!!**

# Gitの基礎
「どのファイルの何を・誰が・いつ・何のために」を記録して復元できるようにしておくシステム。
git addでリポジトリに圧縮ファイル作成　→　ステージにインデックス作成　→　git commitでツリーとコミットを作成　の流れでローカルリポジトリへ変更内容を保存する。

* Gitは差分ではなく、コミット時点のファイルをスナップショットとして丸々保存している（差分だと処理に時間がかかる）
* .git/objectsディレクトリ下に圧縮ファイル等のGitオブジェクトがおかれる


使用している教材はこちら↓


https://www.udemy.com/course/unscared_git/


# おわりに
最後までお読みいただきありがとうございました。
しばらくはGit基礎をやっていきます。
アドバイス・応援コメント等いただけますと幸いです。
Shopify Dawnテーマで検索結果を商品のみ表示する方法

今回は検索結果に表示される内容を商品だけに絞り込みたいについてです！
Dawnでは、テーマのカスタム機能に検索結果に表示される内容を商品、ページ、記事どれかに絞り込んで表示させる機能がありません。
なので、直接コードを触って、表示されるものを絞り込んであげる必要があります。
コードの記載箇所さえ分かれば、難しいコードを書く必要がないので、非エンジニアの方もぜひ参考にされてください。

## Dawnのコードを編集
コードを編集すると言っても、コードを１箇所に付き１行追加するだけです。
Dawnのバージョンは、６.０.2で説明してます。

<b>1,コードエディターを開く</b>
Shopify 管理画面 ＞ オンラインストア ＞ テーマ ＞ コードを編集する
を選択し、コードエディターを開きましょう。

<b>２、header.liquidを開く</b>
テーマのsectionディレクトリ内にある、header.liquidファイルを開きます。
このファイルの中に、変更する箇所が２箇所あります。

・コマンドFで`routes.search_url`と書かれている箇所を探す
・316行目に
`<form action="{{ routes.search_url }}" method="get" role="search" class="search search-modal__form">`
が見つかると思います。（バージョンによっては、上下するかもしれませんが、formと書かれている行が見つかればOK）
・フォームのすぐ下に、`<input type="hidden" name="type" value="product">`を追記します。
　
もう１箇所が、
・512行目にある
`<form action="{{ routes.search_url }}" method="get" role="search" class="search search-modal__form">`
の下に`<input type="hidden" name="type" value="product">`を追加します。
　
headerは、この二箇所に２行追加するだけです。

<b>３、main-search.liquidを開く</b>
検索結果になるページです。こちらは１箇所になります。

・コマンドFで`routes.search_url`が書かれている箇所を探します
・74行目の
`<form action="{{ routes.search_url }}" method="get" role="search" class="search">`
の下に、`<input type="hidden" name="type" value="product">`を追記します。
これで完了です。

<b>補足</b>
行数はあくまで目安です。
大事なのが、検索に使うフォーム `< from`で始まり、`action="{{ routes.search_url }}"`か`action="/search"`と書かれている行を探し、その下に`<input type="hidden" name="type" value="product">`を追記してあげることです。
formの部分が検索したいデータを、サーバーに送る役目をし、inputで始まる部分が、表示タイプを商品に絞り込んでくれます。
　
これがわかっていれば、他のテーマにも応用できるので、ぜひ参考にしてください。
※formだけで探すと、検索以外のフォームの可能性もあるので、actionも必ず確認してください。
　
## 余談…
ついでに言うと、この検索を入力する欄に入力していると、入力欄の直ぐ下にローディングのグルグルが周り始めませんか？
これをそのままにしているショップを結構見ます。
　
このグルグル何かというと、入力中のキーワードに関連する商品などを表示しようとしています！
めっちゃいい機能！
ですがこの機能、テーマの設定言語が日本語だと対応しておらず、エラーでデータが取得できないので、ずっとグルグルですw
　
この機能の切り方は、
管理画面 ＞ テーマ ＞ カスタマイズ ＞ テーマの設定 ＞ 検索行動 ＞ 商品のおすすめを有効にする　のチェックを外してください
グルグルが表示されなくなると思います。

## まとめ
今回は、商品だけに絞り込む形になりましたが、value="product"の箇所をページや記事に変更してあげると、別のもので限定するこができ、
バージョンが変わっても、補足の箇所を参考にしてもらえば、絞り込むことは出来ると思います！
また、何か使えそうなネタがあれば記事を追加していきますので、よろしくお願いします！
　
あと…
私が働くARCHETYPでは、Shopifyのテーマ開発やアプリ開発をやりたいエンジニアを募集しております！
気になった方はお気軽にエントリーをお待ちしております！(業務委託もOK）
https://www.archetyp.jp/recruit/
noteでブログもやってるので良かったらチェックしてください！
https://note.com/archetyp
e-paperで低消費電力ダッシュボード作った

やったのは2021年10月ごろです

# きっかけ
Amazonでe-paperを購入できることを知って、低消費電力ダッシュボードを作ることを思いついた。
意外にもカラーのものがあるのでそれを使ってみる。
GoogleのAPIからカレンダー、予定を表示させます。あと天気も気象庁のページから。
あとせっかくカラーを買ったので、背景はGoogle Photoのアルバムからランダムに選択するようにしました。

# 全体像
ラズパイで作れば簡単なのですが、ラズパイは消費電力がでかいのでESP32を電池で駆動させる。
マイコン使うのは初めてです。MicroPythonのファームウェアを書き込んで作る。
マイコンに画像生成するような能力はないので、PaaS上で画像生成APIを作ってそれを介して表示させる。
マイコンからGoogleのアクセストークンと画像生成パラメータ(JSON)を送信して、画像を生成。

# 工夫したところ
・欲張ってカラーにしたら画像のサイズがRAM容量を超えてしまったので、uhttpライブラリのコードを書き直して受信→ディスプレイのコントローラーに送信を繰り返して表示させるようにした。
・e-paperの特性上、画像が表示されるまで時間がかかる。その間にWiFiモジュールを付けていると電力を食うので通信終わったら即座にオフに
・表示させたら設定した時間だけDeep sleepして節電。ただマイコンの内部タイマーはあまり正確でないらしいので、起きるたびにNTPで時刻を補正。

# 完成
![IMG_20211106_171119.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383410/316713a9-0a7f-f26c-efe7-d00752b5960f.jpeg)
単3電池2本から昇圧して駆動させています。節電したつもりだったのですが、10分間隔では3日程度しか持ちませんでした。
まあ10分ごとに更新する必要もないと思うので、1時間とかにすれば、実用範囲のものになるかなと思います。
ただ、カレンダーは複雑な漢字を表示するには画素数不足を感じてしまいますね。

# おまけ
![FCWniISUcAEeX93.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/383410/67f1fb1d-ec46-66ec-0b48-c4eed3060ebc.png)
設定ファイル生成用GUIを作ってみた。時間かかった割にビジュアルがプアな感じでちょっと悲しい。
# ソースコード
API
https://github.com/phabet/e-indicator-api
ESP32
https://github.com/phabet/e-Paper-Micropython
コンフィグGUI
https://github.com/phabet/e-indicator-configure
Compute Engine への接続 （OS Loginで接続する）

## 前提

SSH認証鍵を自作する方式（AWSでのEC2への接続手順）じゃなくてこちらが推奨されてる。
※[公式](https://cloud.google.com/compute/docs/instances/access-overview?hl=ja#oslogin)


## 手順

### 設定

インスタンス作成時の設定入力時に、

「 ネットワーキング、ディスク、セキュリティ、管理、単一テナンシー」 > 
「セキュリティ」 > 
「アクセスを管理する」 > 
「IAM権限でVMアクセスを制御する」 にチェックを入れる

※
作成されたインスタンスのメタデータに enable-oslogin : true が追加された状態になる。
つまり、後からインスタンスのメタデータに enable-oslogin : true を設定してもOK。 

### 接続コマンド

※コンソールのインスタンス一覧の「SSH ▼」の▼押下時のメニュー内に gcloud のコマンドを表示する機能が有るので、表示されるコマンドを git-bash などで実行する。

```bash:例（表示されるコマンドコピペした方が早いけど。。
gcloud compute ssh --zone "asia-northeast1-b" "インスタンス名（not ID）"  --project "プロジェクトID（not name）"
```

コマンドを実行すると、 gcloud で設定されているアカウントを使って putty でログインされる。
※ログイン後、`sudo su -` で root になれる。

### 注意点

* アカウントに対してロールの付与が必要（ ※[公式](https://cloud.google.com/compute/docs/oslogin/set-up-oslogin?hl=ja#configure_users) ）。
※とりあえず、オーナーか編集者であればログインできる。そうでない場合は ↑ の公式ドキュメント参照。

## 自記事へのリンク

* [Google Cloud 関係まとめ](https://qiita.com/k_hoso/private/804a15e546cf5761ce8f)
windowsにPHPを入れてみた

## PHPのインストールが難しかった
私は英語が大層苦手で、バージョンも沢山あってよく分からなかったのでやったことを残しておきます。
[PHPマニュアル](https://www.php.net/manual/ja/install.php)を読んでできる人は全く問題ないです。

# PHPのインストール方法

[PHP For Windows : Home](https://windows.php.net/index.php)にアクセスします。
タブの2つ目に`Downloads`があるのでクリックします。

[![Image from Gyazo](https://i.gyazo.com/4e17dc7117f9f4be7d1258ba97da4e37.png)](https://gyazo.com/4e17dc7117f9f4be7d1258ba97da4e37)

何を入れていいか分からないですが、グレー枠の上から2番目のZipファイルをダウンロードします。ApacheというWebサーバーを使いたいときにこっちの方がいいらしいという記事を見ただけなので、一番上のZipファイルでもいいかもしれません。
[![Image from Gyazo](https://i.gyazo.com/5bc066b03ec49cca3f9d856afd5cdb79.png)](https://gyazo.com/5bc066b03ec49cca3f9d856afd5cdb79)

ダウンロードしたZipファイルを`すべて展開`し、展開先をCドライブ直下にしたり、Userファイルの下に入れたり、ダウンロードフォルダ以外の場所で解凍します。

# PATHの設定をする

WindowsのPC内検索機能を使って`システムの詳細設定の表示`を開きます。
そして、一番下の`環境変数（N）…`をクリックして開きます。
[![Image from Gyazo](https://i.gyazo.com/8ca4695ff8fddccf6bae14e4d27521ff.png)](https://gyazo.com/8ca4695ff8fddccf6bae14e4d27521ff)

2枠表示されると思いますが、システム環境変数の方を編集します。
システム環境変数の中に、`PATH`だったり`Path`だったりパスと表示されている枠をクリックします。
`編集`ボタンを押します。
[![Image from Gyazo](https://i.gyazo.com/b05129ffa6cddfeab60da9b03f39a785.png)](https://gyazo.com/b05129ffa6cddfeab60da9b03f39a785)

先ほどPHPフォルダを展開した先のパスをコピーします。
[![Image from Gyazo](https://i.gyazo.com/9ed37191132b9f42fa48b18ea242b86d.png)](https://gyazo.com/9ed37191132b9f42fa48b18ea242b86d)

環境変数名の編集に戻って、`新規`ボタンを押します。
一番下にコピーしたパスを貼り付けてOKとすればパスが通ります。

コマンドプロンプトで、以下を入力しPHPのバージョン表示ができることを確認します。
```php
php -v
// PHP 8.1.7 (cli) (built: Jun  7 2022 21:45:53) (ZTS Visual C++ 2019 x64)
```

参考：[Let'sプログラミング：PATHを設定する](https://www.javadrive.jp/php/install/index3.html)

# Composerをインストールする
ComposerはPHPのパッケージライブラリ管理ツールだそうです。


[Download Composer](https://getcomposer.org/download/)にアクセスしてインストーラーをダウンロードします。
どこでダウンロードできるかパッと見て分からないのですが、Composer-Setup.exeという青文字部分でできます。
[![Image from Gyazo](https://i.gyazo.com/91528181cd2af32ac787b3b75ec33e14.png)](https://gyazo.com/91528181cd2af32ac787b3b75ec33e14)

インストーラーの見た目変わっていますが、以下のサイトに沿って実行してください。分かりやすく書かれています。
[Composer を Windows にインストールする手順](https://weblabo.oscasierra.net/php-composer-windows-install/)

インストーラーが入ったら、全部`next`を押していけば基本的には問題なしです。
> 開発者モードにしますか？はパッケージになっていないようなのでチェック入れない方が良さそうだし、プロキシ（インターネットに直接接続できないコンピューターに代わり、インターネットに接続し、Webサイトへのアクセスなどを行うサーバーのこと）は持ってないのでこれもチェックしない方が良さそうだったので。
得意な方は是非是非カスタムしてください！

最後にComposerが入っていることをコマンドプロンプトで確認します。
```php
composer -v

//    ______
//  / ____/___  ____ ___  ____  ____  ________  _____
// / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
// / /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
// \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
//                     /_/
// Composer version 2.3.7 2022-06-06 16:43:28
```

PHPを触るにあたって何が必要か分かりませんがセッティングはできました。
やってみてまた必要なものがあれば環境設定していこうと思います！
脆弱性診断、ペネトレ、SOC...だけじゃない！セキュリティエンジニアになって3ヶ月の振り返り

# 自己紹介
こんにちは。ちょこぱい([@choco_py3](https://twitter.com/choco_py3 "Twitter"))です。
都内のユーザ系SIerに勤務しているセキュリティエンジニアです。

# 経歴
情報系専門学校中退→フリーター→SES（ネットワークエンジニア）→受託（プログラマ）→SES（ネットワークエンジニア）→SIer（イマココ!）
 ~~一応まだ20代なので、経歴はかなりボコボコです~~ 

# セキュリティエンジニアになった経緯
某42Tokyoというプログラミングスクールで一日12hくらいC言語を書いていたときにCTFの存在を知りました。

とりあえず初心者向けの[cpawCTF](https://ctf.cpaw.site/ "cpawCTF")を始めてみることに。
そこからセキュリティエンジニアという職業を知り、3社目でセキュリティエンジニアとして働くことになったものの、案件が無いと言われ、PJが炎上し体調を崩し退社。

現職の面接は ~~元々ネットワークエンジニアとしての募集だったため正直やる気が無かったけど~~ たまたま面接官にセキュリティエンジニアのポジションを提案され、念願のセキュリティエンジニアへ...


# 資格
* 基本情報
* 応用情報
* 情報処理安全確保支援士（登録予定）
* ネットワークスペシャリスト
* ITサービスマネージャ
* CCNA
* CCNP
* AWS SAA

※---以下勉強中の資格---※
* GCP ACE
* プロジェクトマネージャ
* CISSP

# セキュリティエンジニアの業務内容って？
セキュリティエンジニア志望の方がまず思い浮かぶ業務内容は

**脆弱性診断！**
**SOC！**
**ペネトレーションテスト！**
**フォレンジック！**
**セキュリティコンサル！**
**セキュリティ監査！**

ざっとこんな感じだと思います。

ですが私が担当している業務は上記のどれにも当てはまりません。

# じゃあ実際何やってるの？
* セキュリティ製品の運用（アラート/障害対応）
* ゼロトラスト製品導入の要件定義
* 会議
* 会議
* 会議
* 担当システムの勉強

こんな感じです。（まだ入社して3ヶ月なのでこんなもんです...）
ユーザー系SIerなので親会社のシステムのセキュリティを守るのが役割となります。

ちなみにSOC、フォレンジック、脆弱性診断などは他部署やベンダーさんが担当しています。
なので、ベンダーコントロールスキルが求められますね。

# Q&A
Q. 「プログラミングって使うの？」
A. 『使いません。』

Q. 「セキュリティエンジニアってお給料良いって聞くけどどうなん？」
A. 『正直最初に入った会社とあんまり変わってないです。でも弊社だと評価が上がったり役職についたりするとかなりもらえるみたいです。（でもセキュリティエンジニアだからというのは関係ないかも...）』

Q. 「数学できなきゃダメ？」
A. 『そんなことはありません。』

Q. 「英語できなきゃダメ？」
A. 『DeepLとかいう便利なツールがあります。（でもできた方がいいよね）』

Q. 「情報処理安全確保支援士などの資格って必要？」
A. 『持ってない人もいますが、自分は資格をたくさん持っていること（意欲）を評価されたのであるに越したことはないです。』

Q. 「どんな能力があると良い？」
A. 『言語化する能力や論理的思考力、自走力があると強いと思います』

# セキュリティ関係で購入した書籍や勉強していることについて
### 書籍：
* 徳丸本
* ホワイトハッカーの教科書
* CISSP 問題集
### 勉強していること
* ねこプロ（プログラミングコミュニティ）
* ゆるいハッキング大会（勉強会参加）


# 最後に
[技術書典13](https://techbookfest.org/ "技術書典13")にサークル参加しようと思っています（テーマはもちろんサイバーセキュリティ）。将来書籍を出版するのが目標なので、その足掛かりになれたらいいな...と！

次の振り返りは半年（3ヶ月後）にまたできたらなと思います
お気軽にコメントください！
未経験者からHTML・CSSを始めましょう！

この記事は、未経験者の外国人が初めてHTMLとCSSを勉強する経験についてです。

# 私について
 - __出身・母国語__
     台湾・中国語
     日本語のレベルはN1ですが、日本語でプログラミングの勉強はまだ辛いです...

 - __ITに関する背景__
     文系出身なので今年4月までゼロでした。
     4月から、[神戸情報大学院大学（KIC）](https://www.kic.ac.jp/)に入学し勉強し始めました。

 - __プログラミングを勉強する契機__
     フロントエンドエンジニアになりたい！

#  ProgateでHTML・CSSを勉強し始めます
- __Progate（プロゲート）とは__
[Progate](https://prog-8.com/)はプログラミングの基礎から学べる、入門者向けのアプリケーションです。
![markdown_matome.PNG](https://prog-8.com/assets/packs/dist/images/first_view_ja-ab351ae2e2501cc8bff6..webp)
- __なぜProgate？__
KIC（大学院）のクラスメートからのお勧めがきっかけで、Progateを始めました。
- __Progateを使った所感__
<font color="Green">大変お勧めです！！！</font>理由は以下に述べます。
    - **プログラミングの教え方も日本語も分かりやすいです！**
    初心者の外国人からすると、プログラミングと聞くだけでかなり怖いですが、Progateのプログラミングの教え方はとても優しいです。日本語が少し苦手の私にとってすごく分かりやすいです！時々専門用語が理解できませんが、大した問題はないんですよ。
    - **素敵なUI・UX**
    見た目のデザインは良いし、操作も簡単なのでProgateを使うと、とても楽です。
![markdown_matome.PNG](https://prog-8.com/assets/packs/dist/images/slide_image_jp-42aa3c4af733b44f6d51..webp)
    - **バーチャルにプログラミングの実践ができます**
    勉強しながらバーチャルにプログラミングをしているのは、結構面白くて覚えやすいです。また、入力したコード・コマンドのプレビューが見えることは、達成感いっぱいです！
![markdown_matome.PNG](https://prog-8.com/assets/packs/dist/images/editor_image_jp-449785c0f9a62d3e5ceb..webp)
    - **ゲームのような進め方の設定**
    レベルに分けて、プログラミングについてミッションが配られます。そして、ミッションを受ける前に、分かりやすいチュートリアルがあります。
![markdown_matome.PNG](https://prog-8.com/assets/packs/dist/images/path_image_jp-7cff9fa3f076201e6c4a..webp)

# 3時間ぐらい勉強すると、初級のHTML・CSSができます！
プロゲートのHTML & CSS 初級編に通じて、未経験は3時間ぐらい簡単なHTML & CSS のプログラミングを学べて、シンプルなページの作りが実践できます。最初、プログラミングに関する言葉を聞くと怖くなるという私も短時間でHTML・CSSを勉強できると思えなかったんです！達成感はすごくいっぱいです！
もし、あなたも私のような初心者なら、ぜひ __自分がプログラミングを身に付けられると信じて、やってみてください！__ 
>
>>You don't have to be great to start, but you have to start to be great. 
始めるのに優れている必要はありません。 しかし、あなたは偉大になり始めなければなりません。
>
>Zig Ziglar（ジグ・ジグラー）

次の記事から、HTML・CSSのプログラミングを紹介していきます。
makeはMakefileなしでも実行できる（時がある）

# 概要
`make`コマンドは、内部にデータベースがあるとのことで、Makefileがなくても簡単な例であれば実行できる。
（知らなかった）

# 内容
## 状況
```bash
$ ls
hello.c
```
```c:hello.c
#include <stdio.h>

int main(void)
{
  printf("hello, world\n");
}
```
## 実行
```bash
$ make hello
cc     hello.c   -o hello
```
## 確認
```bash
$ ls
hello   hello.c
$ ./hello
hello, world
```

# 感想
ちょっと便利。



※追記蛇足(オプションをちょっと添えたいとき)
コンパイラを指定したり、ライブラリを指定したりしたいときは、ちょっとだけMakefileを書いておくのも良い。
```bash
$ ls
hello.c Makefile
$ make hello
clang     hello.c  -lhogefuga -o hello
$ ./hello
hello, world
```
```Makefile:Makefile
LDLIBS += -lhogefuga
CC := clang
```
```c:hello.c
#include <hogefuga.h>
#include <stdio.h>

int main(void)
{
  printf("hello, world\n");
}
```
【Python】open()、withを使ってファイルに文字列を書き込もう

#### 方法①ファイルをopen()→書き込む→ファイルを閉じるclose()

【ターミナル操作】ディレクトリにあるファイルを確認する
~~~unix:【ターミナル操作】ディレクトリにあるファイルを確認する
~ $ ls
test.py
~ $ 
~~~

ファイルの作成と文字列の書き込み
mode="w"にしていると、writeするたびにファイルの中身が上書きされる。
~~~python:ファイルの作成と文字列の書き込み
file_name = "names.txt"

# 書き込みモード　mode="w"　　読み取りは"r"、追加書き込みは"a"などがある。
f = open(file_name, mode="w")

# 文字を書き込む write
# 改行　\n
f.write("Sakamoto\n")

# ファイルを最後に閉じる
f.close()
~~~
【ターミナル操作】ファイルと中身の確認
~~~unix:【ターミナル操作】ファイルの中身の確認
~ $ ls
test.py    names.txt
~ $ cat names.txt 
Sakamoto
~ $ 
~~~


#### 方法②ファイルの作成と文字列の書き込み withを使用したVer.
~~~python:ファイルの作成と文字列の書き込み withを使用したVer.
file_name = "names.txt"
# openしたファイルをfとして、字下げした処理を行う
with open(file_name, mode="w") as f:
    f.write("Hakase\n")
# withは終了時に自動的にクローズ
~~~

【ターミナル操作】ファイルと中身の確認
~~~unix:【ターミナル操作】ファイルと中身の確認
~ $ ls
test.py    names.txt
~ $ cat names.txt 
Hakase
~ $ 
~~~
「React.js と Spring Data REST」を使って簡単なTodoアプリを作成　その１

## はじめに
先輩社員の方と一緒に業務中に自己学習の一環として簡単なTodoアプリを作成を行ったので、その記録を残します。

## 背景
[前回記事](https://qiita.com/yoneda_y/items/e79ffb7707ab7b5c3494)の続きとして今回は簡単なTodoアプリを
[「React.js と Spring Data REST」](https://spring.pleiades.io/guides/tutorials/react-and-spring-data-rest/)のチュートリアルに習って作成します。

### パート 1 　基本的な機能
#### ①プロジェクト作成
[spring-initializr](https://start.spring.io/)でプロジェクト作成
|項目　　　　　|選択　　　　　|
|:--|:--|
|Project|Gradle|
|Language|Java|
|Spring boot|2.6.6|
|Packaging|War|
|Java|11|
|Dependencies|Rest Repositories,Thymeleaf,Spring Data JPA,H2 Database,Spring Web,Lombok,PostgreSQL Driver|

※[EARファイル・WARファイル・JARファイルの違いや特徴について](https://rainbow-engine.com/ear-jar-war-difference/#:~:text=WAR%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AFWeb%E3%82%A2%E3%83%97%E3%83%AA,%E5%BD%B9%E5%89%B2%E3%81%8C%E7%95%B0%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82)

#### ②コマンド実行にてCRUD操作可能なアプリ作成
1. @Entityをつけて管理したいデータ格納クラスを作成
2. 1で作ったデータをCRUD操作するためにCrudRepositoryを継承したinterfaceを作成
3. 1で作ったデータを2を実装したクラスでDB操作するために
CommandLineRunnerを継承したデータ操作用クラスを作成
4. @SpringBootApplicationをつけてアプリ起動時に呼ばれるクラスを作成
このrunメソッドから3.1で作ったRunnerが呼ばれる

ざっくり上記作業だけでcurlコマンドでCRUD操作ができるようになっていることを確認

#### ③React.jsを用いて画面の表示
※今回はGradleを選択していてpom.xmlの存在がないので
[「Spring BootアプリにCreate React Appを導入する」](https://www.hypertextcandy.com/create-react-app-on-spring-boot)を参考に画面描画の準備を整える
（チュートリアルはpom.xml,package.json,webpack.config.jsに記載で準備完了）


1. Create React Appを用いてフロントエンドをfrontendフォルダ配下に作成
2. 1で作成したフォルダ配下の成果物をチュートリアルのjs,htmlファイルで置き換える
3. 今回はrestを使いたいので、1で作成したフォルダ配下のpackage.jsonにrestを追記
4. yarn install 実行で3で追加したrestも含めnode_modules配下にモジュール準備
4. Create React Appで作成するとeslint入りで作成されるので.eslintrc.jsonを作成して
[eslint](https://qiita.com/mzmz__02/items/63f2624e00c02be2f942)を利用できるようにする　（js解析ツールなので利用しない場合はpackage.jsonから宣言消す）
5. 成果物をアプリ側に転送するpostbuild.jsを作成
6. yarn build実行
7. アプリ側（サーバー側）から参照できる位置に成果物が置かれる


ざっくり上記作業だけでブラウザ画面で登録されているTodo内容を参照可能になっていることを確認


## 一旦ここまで
引き続き現在も、
・DBでデータ管理できるようにしたり
・Bulma使って見た目を良くしたり
しながらパート2以降に進んでいますが長くなるので一旦ここまで。

一緒に勉強している先輩の力がかなり大きいですが、
継続できているのが良い感触（先輩には感謝）。
引き続きまたアウトプット、なんとなくの自分なりの理解を文字で残していければと思います。
極座標と直交座標「22年 公立千歳科技大 理工 1(2)」をsympy でやってみた。

オリジナル

https://kamelink.com/blog/2022/06/28/5-9-22-kouritutitosekagidai-rikou-1-2/

```
r**2=(r*(sin(t) + 4*cos(t))-5 + r**2*sin(t)**2
```
# sympyで
作図は、sympyのplotモジュールです。matplotlibではありません。


![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/6e5d8a7b-60e2-6175-cfeb-0a8ffc526c42.png)

```python
from sympy import *
var('x y r t')
myEq=Eq(r**2,(r*(sin(t) + 4*cos(t))-5 + r**2*sin(t)**2).expand(trig= true))
myEq=myEq.subs({r**2:x**2 + y**2,r*cos(t):x,r*sin(t):y})
y=solve(myEq,y)[0]
print("#",y)
plot(y)
# x**2 - 4*x + 5
```


# wolframalphaで
勉強中
基本情報（ハードディスクの構造と記録方法）

ハードディスクは大容量で安価、かつ比較的高速のため、ほとんど全てのパソコンに搭載されるほどの代表的な補助記憶装置です。

![Harddisk-head.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/a3a4fbbb-92ed-358a-2932-efb2c9d5685a.jpeg)

上記のアーム部分が**アクセスアーム**と呼ばれているところで、ディスク上の目的地まで磁気ヘッドを運ぶためにあります。
アクセスアームの先端部分が**磁気ヘッド**と呼ばれる部分です。微小な磁気コイルで、ディスク表面の磁性体を磁化させたり、読み取ったりします。
**ディスク（プラッタ）**は金属やガラスで出来ている硬い円盤です。表面に磁性体が塗布されていて、ディスクを磁化させることで情報を記録します。

![200px-Hard_disk_head.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/03ebbc35-9b62-15a2-779a-ba6bd5fe818c.jpeg)
磁気ヘッド拡大画像

## セクタとトラック
![200px-Cylinder_Head_Sector.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/02d27dec-d689-936f-a76f-72de97c6eec2.png)
ハードディスクを最初に使う時は初期化作業が必要です。ディスク（プラッタ）の上にデータを記録するための領域が作成されます。
作成された領域の扇状に分かれた最小範囲を**セクタ**、そのセクタを複数集めた１周分の領域を**トラック**と呼びます。

トラックを複数集めると**シリンダ**と呼ばれる単位になります。

## ハードディスクの記憶容量
セクタの集まったものがトラックでトラックの集まったものがシリンダです。
ハードディスクの仕様表から記憶容量を算出することができます。

下記のハードディスクがあった時にその総容量は幾つになるか計算してみます。

|シリンダ数|1,500|
|:--|--:|
|1シリンダあたりのトラック数|20|
|１トラックあたりのセクタ数|40|
|１セクタあたりのバイト数|512|

１セクタが512バイトです。40個集まると1トラックです。
1トラックは 512 * 40 = 20,480バイトです。

トラックが20個集まってシリンダを形成します。
20,480 * 20 = 409,600
上記が１シリンダです。

409,600 * 1,500 = 614,400,000バイト
614MBとなります。

## ファイルはクラスタ単位で記録する
ハードディスクが扱う最小単位はセクタです。基本ソフトウェアであるOSがファイルを読み書きするときは、複数のセクタを１ブロックと見なした
**クラスタ**という単位を用いるのが一般的です。

例えば８セクタを1つクラスタとします。
１セクタ512バイトだとすると１クラスタが4096バイトです。

OSはクラスタ単位でファイルを読み書きするため、クラスタ内で余った部分は使用されない無駄な領域となってしまいます。

## データへのアクセス時間
データへアクセスするのは、実際にデータを書き込んだり、書き込み済みのデータを読み込んだりする作業のことです。
ハードディスクはこれらの作業を次の３ステップで行います。

```
①シーク（位置決め）
②サーチ（回転待ち）
③データ転送
```
シーク時間　＋　サーチ時間　＋　データ転送時間　＝　アクセス時間
となります。

|回転速度|5,000回転/分|
|:--|--:|
|平均シーク時間|20m秒|
|１トラックあたりの記憶容量|15,000バイト|

このハードディスクから5,000バイトのデータを読み出す場合のアクセス時間はいくつか計算します。

シーク時間とサーチ時間は平均値を使います。
平均シーク時間は出ているので、平均サーチ時間を求めます。

１分間に5000回転するので、1分（60,000m秒） / 5,000回転 = 12ミリ秒 
上記は１回転する時間です。その1/2が平均サーチ時間 6ミリ秒です。

1回転するのが12ミリ秒で、その時間に転送できるデータ量が1トラック15,000バイトです。
15,000 / 12ミリ秒 = 1,250バイト/ミリ秒

5,000バイト / 1,250バイト = 4ミリ秒

3つの時間を合わせて

20ミリ秒 + 6ミリ秒 + 4ミリ秒　＝ 30ミリ秒
上記がアクセス時間となります。

[画像は全てwikipedia引用](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%83%89%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96)

## まとめ
何の計算しているかたまにわからなくなりますが、覚えます。
Google Skills Boost "Engineer Data in Google Cloud" コンプリートを目指して

このクエストの最後の[Google Cloud でのデータ エンジニアリング: チャレンジラボ](https://www.cloudskillsboost.google/focuses/12379) を実施してみます。

... 勉強が足りないのに無謀でした。最初のタスクすら完了できませんでした。

しまった。途中のSQL文だけでも書いておけばよかった。

自分が考えたのがこれ。

UPDATE taxirides.taxi_training_data_789 t1
SET
pickup_datetime = t0.pickup_datetime,
pickuplon = t0.pickup_longitude,
pickuplat = t0.pickup_latitude ,
dropofflon = t0.dropoff_longitude,
dropofflat = t0.dropoff_latitude,
passengers = t0.passenger_count,
fare_amount_810 = ( t0.tolls_amount + t0.fare_amount )
FROM
`taxirides.historical_taxi_rides_raw` t0
WHERE
t0.trip_distance > 0
AND t0.fare_amount >= 2.5
AND t0.pickup_longitude > -75
AND t0.pickup_longitude < -73
AND t0.dropoff_longitude > -75
AND t0.dropoff_longitude < -73
AND t0.pickup_latitude > 40
AND t0.pickup_latitude < 42
AND t0.dropoff_latitude > 40
AND t0.dropoff_latitude < 42
AND t0.passenger_count > 0

変更されたのが0件だった。

正しくは、クエリのオプションを「クエリ結果の宛先テーブルを設定する」にしておき、以下のクエリーで検索結果がtaxirides.taxi_training_data_789 に入るようにする。

Select
pickup_datetime,
pickup_longitude AS pickuplon,
pickup_latitude AS pickuplat,
dropoff_longitude AS dropofflon,
dropoff_latitude AS dropofflat,
passenger_count AS passengers,
( tolls_amount + fare_amount ) AS fare_amount_810
FROM
`taxirides.historical_taxi_rides_raw`
WHERE
trip_distance > 1
AND fare_amount >= 3.0
AND pickup_longitude > -75
AND pickup_longitude < -73
AND dropoff_longitude > -75
AND dropoff_longitude < -73
AND pickup_latitude > 40
AND pickup_latitude < 42
AND dropoff_latitude > 40
AND dropoff_latitude < 42
AND passenger_count > 1
AND RAND() < 999999 / 1031673361
AWSでMFAを自身で管理できるポリシーを作成してみる

AWSのIAMポリシーでMFAを有効にしない場合、操作権限を制限しつつ自身でMFAの管理をするポリシーについては`IAM`サービスのキュメントに記載があります。

- [ユーザーが認証情報と MFA 設定を管理できるようにする](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_users-self-manage-mfa-and-creds.html)
- [AWS: MFA で認証された IAM ユーザーが [My Security Credentials] (マイセキュリティ資格情報) ページで自分の認証情報を管理できるようにする](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_aws_my-sec-creds-self-manage.html)
- [IAM: IAM ユーザーに MFA デバイスの自己管理を許可する](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_iam_mfa-selfmanage.html)

またなぜか`AWS RoboMaker`サービスのドキュメントにも、似たような事をやっているドキュメントがあります。

- [ユーザーに認証情報の自己管理を許可する](https://docs.aws.amazon.com/ja_jp/robomaker/latest/dg/auth_access_getting-started.html#auth_access_manage-password-mfa)

三者三様といった感じですが、見比べると基本は`Condition`で`aws:MultiFactorAuthPresent`が`false`になっている際は、`Deny`と`NotAction`で指定したアクション**以外**を拒否する事により、MFAが有効になっていない場合、操作権限を制限するポリシーとなっていました。

## マネジメントコンソールからポリシーを作成する

今回、3種類のポリシーを紹介しましたが各々の要件にしたがって選ぶなり編集するなりしてポリシーを作成すればOKです。

ここではマネジメントコンソールから登録してみます。

IAMのコンソール　ポリシー　の画面で　`ポリシーの作成`　を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/35d2d0a0-a95f-3cb8-7a33-0d3c182675db.png)

ポリシーの作成でJSONタブを選択してJSONを入力して `次のステップ` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e6eda363-cb1b-0ac8-2e99-ebe42b777d52.png)

今回はタグを追加しないので　`次のステップ`　を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/54c0e7b7-7dea-c6e0-f05a-bf6eff96a8fa.png)

ポリシーの名前を入力してポリシーの作成を選択
今回は`ForceMFAPolicy`という名前にしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/0049327b-6182-bf75-7bc2-f7327e2ec825.png)

作成できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3fe2bdb4-029e-2911-5c69-5b3aff796d9f.png)

このポリシーをIAMユーザ、IAMロール、グループ等々に割り当てて利用することにより。

MFAが付いていない場合権限を制限する事ができ、またMFAが割当たってない場合に自分でMFAを割り当てるといった操作ができる権限が実現できます。

## 総評

検索していて、なぜか`RoboMaker`サービスのドキュメントに記載されているポリシーには詳細な説明があることに気が付きました。

それぞれのドキュメントでちょっとした違いはありますが、読み比べてどれを利用するかは選択したい所です。
カルマンフィルタと状態空間モデルを浅くでいいから行間なく理解したい

# はじめに
画像系の研究ばかりをやっていると実はあまり時系列データを扱う機会がなかったんですが，とある事情により扱いたい理由が発生したのでできるだけ行間なく自分の秘密ノートとしてここに残したいと思います．

# 状態空間モデルとは
一言で言えば時系列分析に使われるモデルです．有名なところで言えば株価や売上予測などに用いられています．

例えばある店の売上を予測するとしましょう．あるお店の売り上げが以下のようだったとします．
|  日付  |  売上  |
| ---- | ---- |
|  5/1  |  100  |
|  5/2  |  200  |
|  5/3  |  300  |
|  5/4  |  400  |
|  5/5  |  500  |
|  5/6  |  600  |

この時，5/7 の売上を予測しましょう．多くの人はなんとなく比例関係が見えるので 700 かな？と予測するのではないでしょうか．しかし，ただ単にこの売上というのは独立に変動していくものではありません．テレビに出演したから売り上げが 1 週間連続で伸び続けたのかもしれませんし，それとも暑くなってきて新作の "冷やしメロンパン" が売れたからなのかもしれませんし，もしくは人口が増えていったので自然と購買数が増えたのかもしれません．つまり，我々が売上として **観測** できるのは所詮売上だけなのです．

ですので，結論から言うと 5/7 の売り上げを 700 と言ってしまうのは少し気が早すぎるというものです．

状態空間モデルでは，こうした「目に見えない潜在的な要因」，すなわち **状態** の変動も考慮して予測を行おうという考え方をします．

しかし，こうなるとパンの売上に対して ~~(ちょっと待って書きながら思ったけどいつパン屋さんになったんだ)~~ 効いてくる潜在的要因の多さにうんざりしそうな気もしてきます．
ですので，あくまで「そういう世界を仮定しよう」というのがこのアイデアです．

# 具体的にどうやるの？
状態更新式および観測式と呼ばれる式を考えます．
まず初めに簡単のために今の状態 $k+1$ は 前の状態 $k$ によって決定され，$f$ により写像されるとします．("写像" が難しい場合はただ単に状態変化・遷移のための行列を掛けたと考えてよいでしょう．)
```math
x_{k+1} = f(x_{k})
```
という **状態** を **更新する式**，すなわち **状態更新式** が得られます．ちなみに繰り返しますが，状態というのは潜在的な説明変数のことを意味しており，「その日の気温」「人出の数」「周辺の住民の人口」などを変数化させたものを指しています．

加えて，先述した通り状態空間モデルでは観測値を獲得しなければなりません．そのため，
```math
y_{k} = g(x_{k})
```
という式で状態から観測した結果が得られると仮定します．これを **観測式** と呼びます．しかし，モデル化をするにあたって状態変化にあたってのノイズや観測にあたってのノイズを考慮する必要があります．(実社会データはノイズで溢れています．)
そのため，それぞれのノイズを加味すると，
```math
x_{k+1} = f(x_{k}) + w_k
```
```math
y_{k} = g(x_{k}) + v_k
```
と表記することができます．
このノイズは仮定としてよく用いられるのは平均 0 の正規分布です．(平均が 0 の時のノイズを白色，これが正規性 (ガウシアンに基づいている性質) を持っている場合に正規性白色雑音と呼ぶこともあるようです．~~どっかのサイトで分散 1 の状態を正規性白色と呼ぶような表記がありましたが分散は別にどうでもいいです．~~)

ところで，状態空間モデルの旨味はどこにあるかというと「状態の変化も予測の要因に加えることができる」という点にあったかと思います．つまり，もしも状態更新式について，状態が一切変化しない状態を考えるとただの重回帰問題に帰着させることができます．よって状態空間モデルは重回帰問題の拡張版と捉えてよいでしょう．

# じゃあカルマンフィルタってなんだったの？
一言で言えば「状態変数およびモデル構築の最適化手法」を指しています．カルマンフィルタにおいては先述の状態遷移式について以下のように表記します．
```math
x_{k+1} = f(x_{k}) + G(y_{k+1}-\hat{y_{k}})
```
さて，ここで話も長くなってきたので状況を整理しましょう．
1. 時系列のデータについて予測をしたい
1. 実際の事象についても数式で全てを表現することができるけれども，いざ表現しようとすると「状態」については見ることができないので我々が「観測」できるデータから考えよう．
1. モデルを仮定して予測するのであれば，仮定した方の状態と観測は可観測である (だってそう自分がデザインしたんだから)
1. じゃあ「実際モデル」から得られる「観測値」および，「仮定モデル」から得られる「観測値」の誤差を最小化していけば，「仮定モデル」は「実際モデル」に近づいていくよね？

というのがこの状態空間モデルのモチベーションであった．ある意味で機械学習と似ていて ~~(というと怒られそうだが)~~ ，犬猫クラス分類であれば世の中の犬猫の画像を完全に分けるための「実際モデル(=完璧な関数)」が存在していて，それに対して「仮定モデル」を作成して，関数フィッティングのように近づけていくというのが機械学習における解法だったはずである．つまり BackProp という観点においては似た物なのかもしれない．というか近年の "AI" ~~とかいう四次元ポケット的なインチキ用語~~ の意味で言えば十分包含しているような気もする．

そして，このカルマンフィルタにおけるゲイン $G$ をカルマンゲインと呼びます．
さて，観測値に対して ($v_k$ のノイズが少ないという) 自信があれば，このカルマンゲインを大きくするべきです．なぜならば，大きく状態補正をすることができるためです．一方で状態推移の方に ($w_k$ のノイズが少ないという) 自信があればあまり変化をして欲しくないので $G$ は小さくするべきです．

なお，このカルマンゲイン $G$ の定め方は理論的には実際の状態および仮定の状態の二乗期待値誤差によって求めるという手法をとります．これはただ単に (数的処理から見れば複雑だが) 真の値に対する MSE を最小化しているだけのことです．
ここから先のカルマンゲインの導出に関しては他サイト様 (参考文献に記載あり) にお願いし申し上げたいと思います．

# さいごに
慣れてないが故か，むずすぎないかこの概念．

# 参考文献
[裏口からのカルマンフィルタ入門 (YouTube 動画)](https://www.youtube.com/watch?v=zVAq_3HClGs)

[カルマンゲインの導出方法](http://arduinopid.web.fc2.com/O21.html)
サクラエディタマクロ（連続Grep）


https://qiita.com/usagisita/items/bf1e56afac6279027bb7

せっかくなので

1. 開いているタブに書かれてる文字列（複数行可）をキーにして、
2. 指定したフォルダに対して、

連続Grepするようにインターフェースを付けてみました。

```javascript
var sakura = 'C:\\Program Files (x86)\\sakura\\sakura.exe'

var keys = []
var cnt = GetLineCount(0)
for (var i = 1; i <= cnt; i++) {
    keys.push(GetLineStr(i).replace(/\r\n/,"").replace(/\n/,""));
}

var file = '*.*'
var folder = FolderDialog("フォルダを指定", ExpandParameter("$e"))
var option = 'SLP1B'
if (folder) {
    ActivateWinOutput()
    for(var i = 0; i < keys.length; ++i){
        ExecCommand('"' + sakura + '" -CODE=3 -GREPMODE -GCODE=99 -GOPT=U' +
            option + ' -GKEY="'+ keys[i] +'" -GFILE="' + file +
            '" -GFOLDER="'+ folder +'"', 73)   // 外部コマンド実行
    }
    ActivateWinOutput()
}
```
mermaid-cliがWindowsでエラーを吐く場合の対処

mermaid.jsでsvgを作りたいと思って

```shell
$ npm install -g mermaid-cli
$ mmdc -i diagram.md -o diagram.svg
```

で起動したところ、

```shell
node:internal/error:465
  ErrorCaptureStackTrace(err);
  ^

Error: spawn EPERM
  at ChildProcess.spawn (略)
  at Object.spawn (略)
  at Lancher.launch (略) {
 errno: -4048,
 code: 'EPERM',
 syscall: 'spawn'
}
```
のエラーが。

不思議に思って、mermaid-cli/node_modules/puppeteerの下にインストールされるChromiumを単独起動してみると、
Chromium上には「Google APIキーが欠落しています。Chromiumの一部の機能は無効になります」表示と、
consoleには「Failed to load resource: net::ERR_FAILD」の文字がでてました。

環境依存かとは思いますが。

仕方がないので、

```puppeteerConfig.json
{
    "ignoreDefaultArgs":[
        "--disable-extensions"
    ]
}
```

を作成して -p オプションで

```console
$ mmdc -i diagram.md -o diagram.svg -p puppeteerConfig.json
```

と指定することで回避できました。

ちなみにexecutablePathを指定するとEdgeも起動できたりします、ハイ。
googlecharts 背景色 background color の設定　

# はじめに

以下の画像のようにgooglechartsで背景色を設定したい。
けれどgooglechartsってoptionの設定がいっぱいあってどう書けばどの範囲のbackground color を指定できるのかわからない。
日本語文献も少なそうなのでまとめました。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462069/cae79810-a3a6-c534-e4dc-95cb12adf9f1.png)

# ソースコード
```test.blade.php
<div class="p-header base-bg">
    テスト
</div>
<section class="pg-body">
    <div class="bg-white">
        <div id="group-graph" style="background-color:black;"></div>
    </div>
   
</section>
```

cssは以下のように設定
```test.css
.p-header{
    margin-top:0pt;
    margin-bottom:10pt;
    font-size:45pt;
    height:50pt;
    padding-top:40pt;
    padding-left:15pt;
    font-weight:bold;
}
.base-bg{
    background-color:#4BACC6;(タイトル背景色の青系の色)
    color:#fff;
}

.pg-body{
    background-color:#B8E2DB;(水色っぽい色)
}
.bg-white{
    background-color:#fff;(白)
}
```
```test.blade.php javascript
        function drawChartGroup(){

            const groups_count = {{ $groups_count }};
            const groups = @json($getData);
            var data = new google.visualization.DataTable();

            data.addColumn('string', 'title');
            data.addColumn('number', '受注数');
            var count = 0;
            while(count < groups_count){
                data.addRow([groups[count]['name'], groups[count]['count']]);
                count++;
            
            }

            var view = new google.visualization.DataView(data);
            view.setColumns([0, 1, {
              calc: 'stringify',
              role: 'annotation',
              sourceColumn: 1,
              type: 'string'
            }]);

            var options = {
                title: 'グラフタイトル',
                titleTextStyle:{
                    fontSize:50,
                    color: 'green',
                },
                height:700,
                width:1500,
                chartArea: { backgroundColor : {
                    fill: 'red',
                    fillOpacity: 100
                    },
                },
                backgroundColor: 'pink',
                vAxis: { format: '###' },
                legend: { position: 'top', alignment: 'start' },
            
            }

            var chart = new google.visualization.ColumnChart(document.getElementById('group-graph'));
            chart.draw(data, options);



    }
```



わかりやすいように各所で激しめの(？)色を設定してみました。
上記のソースコードで入力の結果、以下の画像の結果になりました。
![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462069/7f81cbd5-b8e6-d842-0110-72bb73a217c2.png)


# まとめ

ソースコードに書いた色と、出力結果を照らし合わせてまとめると。。

![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462069/70f2903f-e614-8a65-6732-967957f8e688.png)
optionではこの項目で指定して背景色を設定すれば
自分の意図した箇所に色を設定できることがわかりました！！
Cloudwatch 複数メトリクス 複数条件 の アラーム 設定方法

# はじめに
Cloudwatchで複数のメトリクス・複数の条件でアラーム設定したい場合、のお話です。例えば、LoadBalancerにおける「HTTP400カウントのHTTP200カウントに対する比がXX以上」かつ「HTTP400カウントの実数がYY回以上」などとしたい場合です。

# 複合アラームの場合
下記アラームをそれぞれ作成します。
1. 「HTTP400カウントのHTTP200カウントに対する比がXX以上」
2. 「HTTP400カウントの実数がYY回以上」

条件にしたいアラームを全て選択して、「複合アラームの作成」を実施します。各アラームのAND/OR条件を選択すれば、あとは通常のアラーム作成と同じです。
![スクリーンショット 2022-06-30 17.43.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989777/2bbfbbf3-3b6d-9dca-a156-26604485021a.png)

# 数式 ( Metric Math ) のみで解決する
上記のように、複数条件がある場合は複合アラームで対応していたのですが、アラームを最低３つ作成する必要があります。作成の手間と、管理コストが増えます。対して、演算で表現するとアラーム１つで済む可能性があります。

例えば、下記のように表します。2.「HTTP400カウントの実数がYY回以上」の条件で乗算しているので、条件を満たさなければ偽（ゼロ）になります。後は、アラームで1. 条件の閾値を設定するだけです。
```mathematica
(m1*100)/(m1+m2)*(m1>YY)
```

![スクリーンショット 2022-06-22 19.25.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989777/689f6832-1714-65b6-e716-2404e7dbc439.png)

または、IF式を使って下記のようにも表せます。
```mathematica
IF(m1>YY,(m1*100)/(m1+m2),0)
```

参考：
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/using-metric-math.html

# まとめ
Cloudwatchで、数式や関数はたまに使っていたのですが、条件式（比較演算、IF式）は有効活用できていませんでした。思考停止で複合アラームを使っていた私には、この解決策はあまりにも単純で目から鱗だったのでまとめました。

:::note
複数メトリクス・複数条件のCloudwatchアラームは、「複合アラーム」の前に「数式」で解決できないか検討してみると吉
:::