OmniAICreator/Qiita-1.07M huggingface dataset:
Veeamのライセンス更新例

Veeamのライセンスを管理画面から更新するためには、Veeamがインターネットに接続できる必要がある。IBM CloudにおけるVCSのautomationで作成したVeeamは、default gatewayがNSX-VのESG or NSX-TのT0ルーターになっており、NATされてインターネットアクセスできるように構成されている。

- ライセンス情報にアクセス。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746922/d6605162-e2c1-c615-73ce-856996b47070.png)
- ライセンス情報を確認。有効期限があと16日しかない。`Update Now`を押下![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746922/e78190a3-b003-204e-d764-e5391acd2f8e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746922/8042f6f3-1f93-1ab6-7ac5-2ae34e409691.png)
- 更新完了画面。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746922/4108729f-e1ac-1092-3eb8-b7040ea0067e.png)
- 1年延長された ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746922/2d025c9e-5abd-dc22-45cc-4c4b1634b199.png)
【Terraform】Data Sources と Resource の違いとは？

## はじめに
Terraform の Data Sources と Resource の違いについて考えることがあったので、記事として残しておきます。

## Data Sources と Resources

### Data Sources とは？
- Data Sources を定義することで、Terraform の外部で定義された情報を参照することが可能
- 読み取り専用のリソース

#### 記述例

```terraform
data "aws_ami" "example" {
  most_recent = true

  owners = ["self"]
  tags = {
    Name   = "db-server"
    Tested = "true"
  }
}
```

### Resource とは？
- Resource を定義することで、Terraformで管理するリソースを定義することが可能
    - 例: インスタンスやネットワーク設定等

#### 記述例

```terraform
resource "aws_s3_bucket" "bucket" {
  bucket = "test_bucket"
}
```

## まとめ

|  項目  |  説明  |
| ---- | ---- |
|  Data Sources  |  Terraform管理外のデータを参照するために定義するもの  |
|  Resource  |  Terraformで管理するリソースを定義するもの  |

## 参考記事
- Terraform公式
    - [Data Sources](https://www.terraform.io/language/data-sources)
    - [Resources](https://www.terraform.io/language/resources)
- その他
    - [データリソース](https://docs.usacloud.jp/terraform-v1/configuration/resources/data_resource/)
    - [Terraform職人入門: 日々の運用で学んだ知見を淡々とまとめる](https://qiita.com/minamijoyo/items/1f57c62bed781ab8f4d7)
Docker imageの容量合計をワンライナーで出してみた

# docker imageの容量合計をワンライナーで出してみた
ホストに保存されているdocker imageの容量合計は`docker system df`で表示できます。
しかし、imageの種類ごとに合計を出したい場合は`docker`コマンドだけでは実現することができません。

そこで、`awk`の練習も兼ねてイメージ名にある文字列が含まれるイメージの合計容量を出してみました。
## ワンライナー
Repository名に`hoge`が含まれるイメージの容量合計を出すワンライナーです。
```
docker images --format "table {{.Repository}}\t{{.Size}}" | grep hoge | awk '$2 ~ /[0-9\.]+GB/ { $2 = int($2 * 1024) "MB" } 1' | awk '{sum+=$2} END {print sum "MB" }'
```

## 説明
- `docker images --format "table {{.Repository}}\t{{.Size}}"`
    - repository名を１列目、ファイルサイズを２列目に表示するコマンドです
- `awk '$2 ~ /[0-9\.]+GB/ { $2 = int($2 * 1024) "MB" } 1'`
    - `docker images`コマンドではファイルサイズとして単位を指定できなかったので、GBをMBに変換しています
- `awk '{sum+=$2} END {print sum "MB" }'`
    - 2列目を合計して表示しています
【AWS】M1 MacOSでDockerイメージを作成し、ECS Fargateでタスク実行すると「standard_init_linux.go:228: exec user process caused: exec format error」のエラーメッセージが出た

# 解決策
Dockerイメージをビルドする際に、`--platform`オプションでどのプラットフォーム (OSおよびCPUアーキテクチャの組み合わせ) に対応したイメージを作成するかを指定する。

```
docker build --platform=linux/amd64 -t [タグ名] .
```

ビルド後にECRへDockerイメージをプッシュし、ECSのタスクを実行すると無事に処理が完了した。

このオプションにより、「マルチCPUアーキテクチャ」に対応したイメージのビルドができる。
他には、`--platform amd64`の指定でも解決するようである。

# エラーの原因
Dockerイメージを作成したM1 MacOSと、ECSでコンテナが動くFargateのCPUアーキテクチャが違うためにエラーとなった。
つまり、今回のエラーは、イメージをビルドしたマシンと、コンテナを実行するマシンのCPUアーキテクチャが異なるために発生する。

ECRのリポジトリにAWSマネジメントコンソールからアクセスすると「プッシュコマンドの表示」というボタンがあり、ECRリポジトリへのDockerイメージのプッシュ手順を見ることができる。
Linux/MacOSとWindowsとで手順とコマンドを分けて表示してくれているので、コピペして使うことができる。
しかし、その手順をそのまま行うだけではタスク実行時にエラーが出た。
M1 MacOS上で、platformオプションを指定せずにDockerイメージをビルドしたためである。
**DockerイメージのECRへのプッシュ時には警告やエラーは出ないので気付きにくい。**

# 参考資料
- ['exec user process caused: exec format error' in AWS Fargate Service](https://stackoverflow.com/questions/67361936/exec-user-process-caused-exec-format-error-in-aws-fargate-service)
    - Docker BuildxというCLIプラグインを使った解決例があるが、このプラグインは今回は不要
- [ECSタスク起動時のstandard_init_linux.go:228: exec user process caused: exec format errorへの対処法](https://qiita.com/sokon/items/5e0a3d40898a96dadb90)
- [M1 mac docker error: exec user process caused "exec format error"](https://qiita.com/keita_ogawa/items/e115c46f1c8caf6fd34d)
- [ECSのタスク起動時に「standard_init_linux.go」関連のエラーが出た場合の対処方法](https://dev.classmethod.jp/articles/how-to-fix-standard-init-linux-error/)
    - 同一or似たエラーメッセージで原因が異なるパターンがあるようなので注意
- [Dockerの「マルチCPUアーキテクチャ」に対応したイメージをビルドする](https://dev.classmethod.jp/articles/docker-multi-architecture-image-build/)
ローカル環境でGitLab CI ジョブを動かす

# はじめに
GitLab CI の練習としてジョブを作成し、パイプラインを動かします。

[前回記事: Dockerを用いたGitLab-CIローカル環境の作り方](https://qiita.com/miyah/items/fe4fa1971056b6efe36c)で作成したローカル環境のGitLab, GitLab-runner 上で行います。
使用するプロジェクトは引き続き `ci-practice` を使用します。

この記事では、とりあえずローカル環境でジョブが動くことを目標とします。

# プロジェクトをClone
前回作成した環境から、`ci-practice`プロジェクトをCloneします。
Docker ネットワークの外からのアクセスになるので、設定した `172.20.0.2`は`localhost`に読み替えます。

任意の作業ディレクトリで clone コマンドを打ってください。

```
git clone http://localhost/root/ci-practice.git
```

また、このディレクトリでの作業者名を変更しておきましょう。

```
git config --local user.name root
git config --local user.email ""
```

# .gitlab-ci.ymlを作成
`ci-practice` プロジェクト直下で `.gitlab-ci.yml`を作成します。
中身は以下のように書きます。

```.gitlab-ci.yml
stages:
  - test
  - build

test-job:
  image: alpine
  script:
    - echo 'test'
  stage: test
  tags: 
    - local
  only:
    - main

build-job:
  image: alpine
  script:
    - echo 'build'
  stage: build
  tags:
    - local
  only:
    - main
```

これで`main`ブランチに対しプッシュなどの操作を行った場合、２つのジョブが流れるようになりました。

`main`ブランチにコミットして、プッシュしましょう。

# 実行確認
プッシュが終われば、`http://localhost:80`へアクセスし「CI/CD」 => 「Pipelines」 から結果を確認できます。
各ジョブのチェックマークを押すとログが見れます。

![SS 2022-09-14 10.42.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/5676f535-cee2-7cd6-8d9b-5c6ccf567dae.png)
![SS 2022-09-14 10.55.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784710/66137313-742a-9733-e0d7-3985cd7fd5b0.png)

`.gitlab-ci.yml`に記述したとおり、`echo 'test'`が実行されていますね。

# おわりに
前回の環境構築のほうが予想以上に手間取ったため、こちらの記事はジョブの実行のみとしました。
`.gitlab-ci.yml`の書き方については他のサイトを参照ください。
Power Apps のアプリを Teams から利用する場合のマニフェストについて

Power Apps で作成したアプリは Teams 上から利用することができます。
これによってTeamsがかなり便利なプラットフォームになります。

# Teams で利用するための準備

いくつかのアプローチ方法がありますが、例えば、Power Apps ホーム画面でアプリを選択し、[Teams に追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/5f9a4648-5b9e-bbb1-78c8-41baed715dba.png)

ここで、[Teamsに追加]を選択すればそのままTeams画面が起動しアプリをTeamsに追加できます。
[アプリをダウンロード]を選択すると ZIP ファイルがダウンロードされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/f5d5fc33-4d4a-6a1f-8b17-5aad2112fa57.png)

この中にはマニフェスト、つまり、アプリの名前やURL、バージョン情報といった情報が記載されています。（アプリの実行ファイルーバイナリファイルがはいっているわけではない）

このマニフェストをTeamsからアップロードすることでアプリを利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/48053ff3-0071-fac5-81a1-b5037609271c.png)


#アプリを変えたらどうなる？

上記の通り、マニフェストには「URL」「アプリ名」「バージョン情報」が含まれています。したがって、Power Apps を編集してアプリの実装を変更した場合、特にマニフェストを再発行しなくても、Teams からは変更後のアプリが利用可能です。
ところが、アプリの名前はマニフェスト上にあるので、Appsのアプリ名から変更してもTeams側には反映されません

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/6e2ab35b-a280-508a-5ab6-c3f5122cf603.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/dcb50203-5f53-7134-30cb-da412b69f9bf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2095776/81c2cc59-dd24-15f8-eb9d-1d699fedf41d.png)

アプリの名前を変更したい場合は、マニフェストの再作成が必要となります。
【Unreal Engine】マテリアルのWorldAlignedBlendノード

Unreal EngineのマテリアルでWorldAlignedBlendノードを用いることで法線の向きに基づく処理を行うことができます。WorldAlignBlendノードの実態はマテリアル関数なのでアセットを開けば実装を確認することができます。


内部的な処理をGLSLっぽく書くと次のような操作を行っているようです。

```glsl
// インプット
vec3 inExplicitNormal = vec3(0.0, 0.0, 1.0);
float blendSharpness = 2.0;
float blendBias = -1.0;
vec3 InWorldVector = vec3(0.0, 0.0, 1.0);
bool clamped = false;

float worldAlignedBlend(float3 normal) {
    float v = dot(normalize(InWorldVector), worldSpaceNormal);
    v = 0.5 * v * blendSharpness + blendBias;
    if (clamped) {
        v = clamp(v, 0.0, 1.0);
    }
    return v;
}

vec3 transformTangentSpaceToWorldSpace(vec3 v) {
    // ベクトルをタンジェント空間ワールド空間に変換する関数
}

vec3 worldSpaceNormal; // ワールド空間のピクセル法線
vec3 worldSpaceVertexNormal; // ワールド空間の頂点法線

// アウトプット
float alpha = worldAlignedNormal(worldSpaceNormal);
float withVertexNormals = worldAlignedNormal(worldSpaceVertexNormal);
float withExplicitNormal = worldAlignedNormal(transformTangentSpaceToWorldSpace(inExplicitNormal));
```

デフォルトの`In World Vector`インプットが上向き(Z方向)なので、上方向に対して法線がどれぐらい向いているかによって出力が変化します。
![Network.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/5d8be729-f4a5-c918-ca5e-d16ae10862e7.png)
![Result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/dc752b91-092e-eb30-da2f-b4f3530a61b4.png)



使用例として、上を向いている面だけ雪のテクスチャを使用することで、雪が積もっているような演出を作ることができます。
![Network_Snow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/ce087c96-6260-637c-2bcd-37c77db9e415.png)
![Result_Snow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/7cb8636d-7027-1f38-4665-cb9f6c86515f.png)

Landscapeで崖などの傾斜部分だけマテリアルを変更するといった処理を行うときにも使用することができます。
![Network_Landscape.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/a3ec50b2-d635-e56d-dda4-975a70d9947a.png)
![Result_Landscape.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/b50333a5-683c-4c2a-3190-8eb3ab20c844.png)
Attribute "data-gr-ext-disabled" on element <body> is not allowed, or has an invalid value.

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[メール関係の設定のまとめ](https://qiita.com/Keiji_otsubo/items/160369c1c4c7dca02ea9)


こんにちは、私はちょうどこれと同じ問題に遭遇しました-私はこれを私の側で修正することができました-それはあなたの電子メールHTMLにコードを挿入するGrammarly拡張機能です。これは、ブラウザーの切り替えが機能した理由を説明している可能性があります（Grammarlyが元のブラウザーにあり、他のブラウザーにはない場合）。 

Grammarly拡張機能を無効にしたところ、問題は解決しました。

回答例：Try disabling the Grammarly extension

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a9a78ead-be74-e13b-51e6-a85d70a9c153.png)

+ [Getting error message when building Lightning Email Template](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000A8wUj)
+ [Lightning Email Template HTLM Errors](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000FTGwl)
+ [Error while configuring an email template for the Configure an Email Letterhead and Template badge](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000FvREfSAN)

-----------------------

+ [When I compose an email in email templates and then try to save I get the following error.](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000DyyTO)

+ **Attribute "data-lt-installed" on element <html> is not allowed, or has an invalid value.**
+ **Attribute "data-gramm" on element <body> is not allowed, or has an invalid value.**


回答例
```
Perri Marc (Easly)
Hello, I just came across this same issue - I was able to fix this on my end - it's the Grammarly extension injecting code into your email HTML. That could explain why switching browsers worked for you (if you have Grammarly on the original browser and not on the other). 
I disabled the Grammarly extension and that resolved the issue.

https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A8A2TSAV
```

キャッシュをクリアーして解決したようです。
Grateful for your time and assistance @Otsubo Keiji and @Svoboda Tim! It worked after I cleared my cache and did a refresh.

# これも同じみたい

+ [Issue in creating or saving the lightning email templates](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000PeISa)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/82157e52-5abd-3163-1f0a-a3904772ddaf.png)


+ [When I compose an email in email templates and then try to save I get the following error.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000DyyTO)

:::note
It worked after I cleared my cache and did a refresh.
:::
Vimエディタのゆるくて実用的な使い方 ～差分確認編～

# はじめに

[Vim エディタ][Vim]は**汎用テキストエディタ**です。使い方を覚えると便利です。

今回は**差分確認編**です。

尚、面倒なので [Vim][Vim] の基本的な使い方は書きません。😆

# 具体的な利用シーン

- 似ている関数があるけど何が違うんだろう？を確認するとき。
- MS Wordファイルを乱暴でもよいので差分確認するとき。(乱暴 = CTRL-A & CTRL-C でコピーするだけ)
  - バカげているように思うかもしれませんが、案外役に立ちます。

# 差分を確認してみる

例えば Java でこんな実装があったとします。

```java
public interface Yoshizumi {

  String sayHello();

}


class Nisemono implements Yoshizumi {

  @Override
  public String sayHello() {
    return "こんちゃ！";
  }

}


class Honmono implements Yoshizumi {

  @Override
  public String sayHello() {
    return "こんにちは";
  }

}
```

ここでふと思うわけです。`Nisemono` と `Honmono` の違いって何だろう？

差分を確認するため [Vim][Vim] を起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773745/7398365b-cf99-7b59-310b-479fa07b39ae.png)

ウィンドウを分割して `Nisemono` と `Honmono` のコードをそれぞれのウィンドウにコピペします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773745/23ad1286-3b82-30d0-1985-317417d51413.png)

`:windo diffthis` コマンドを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773745/50002d4f-ae04-f581-194c-784a61fbced4.png)

差分が出ましたー！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2773745/bcd7ec5f-7a1e-bd53-0a21-eae3de0da8ea.png)
`Honmono` は普通に挨拶していることがわかりますね！

# まとめ

この程度の比較なら [VSCode](https://azure.microsoft.com/ja-jp/products/visual-studio-code/) でも [Eclipse](https://www.eclipse.org/) でも `diff` コマンドでも実現できます。
あえて [Vim][Vim] を使う利点は、以下になります。

- ファイルに保存しなくても比較ができる。
- 動作が軽快。

使えそうだなと思えたら、是非試してみてください。😀

[Vim]:https://www.vim.org/
OS移行時にLVM構成を復旧する (メタデータファイルなし)

# 原因
## OSの移行
サーバーの定期アップデートをしようと思い、yum updateをかけたところlibc.so.6が勝手にアップデートされて再起動後にカーネルパニックを起こして起動できなくなってしまった。

LiveUSBからリンク貼り直しetcを試したものの復旧できず、設定ファイル等をコピーしてそのままOS再インストールへ。

## そういえば、LVM復旧用のメタデータバックアップしてなくね？
データを格納していたLVMデバイスをマウントしようとして気がついた。
REDHATのマニュアルには、
```
pvcreate --uuid physical-volume-uuid --restorefile /etc/lvm/archive/volume-group-name_backup-number.vg block-device
```

でLVM構成を復旧できるよ！とあったものの、肝心のレストア用のメタデータをバックアップしていなかった。

# 対処
色々調べていたらどうやら

1\. LVMを構成する全ディスクを接続
2\. pvscanでPVを認識
3\. vgscanでVGを認識
4\. vgchange -a y VG名 でVGをアクティベート

で復旧できるらしい。

### やってみよう
```
# pvscan
  PV /dev/sda   VG data            lvm2 [931.51 GiB / 0    free]
  PV /dev/sdb   VG data            lvm2 [931.51 GiB / 0    free]
  PV /dev/sdd   VG data            lvm2 [<465.76 GiB / 0    free]
  PV /dev/sde   VG data            lvm2 [<465.76 GiB / 0    free]
  Total: 4 [<2.73 TiB] / in use: 4 [<2.73 TiB] / in no VG: 0 [0   ]
```
おや？

```
# vgscan
  Reading volume groups from cache.
  Found volume group "data" using metadata type lvm2
```

いけそうだ

```
# vgchange -a y data
  1 logical volume(s) in volume group "data" now active
```

```
# fdisk -l
~~~~
 Disk /dev/mapper/data-lv0: 3000.6 GB, 3000613470208 bytes, 5860573184 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
~~~~
```

正常にマウント出来た。
データもサルベージ出来た。
Laravel-admin を導入した


## はじめに
サクッと管理画面を作りたいのでlaravel-adminで作成しました。

laravel 9.0.X
PHP 8.1.2
laravel-admin 1.3

xamppの環境で行っています。


## Laravel-adminとは
管理画面を簡単に構築できるライブラリです。

##　環境構築インストール
```

1. //最新をインストール
　　　　　　composer require encore/laravel-admin //最新がインストールされる
　　　　　　//バージョン指定でインストール
   composer require encore/laravel-admin:1.* //バージョン指定の場合

2. php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"

3. php artisan admin:install
```

これで準備完了です。

もし途中で
```
//メモリが足りずにエラー
PHP Fatal error: Allowed memory size of 634235547 bytes exhausted
(tried to allocate 4096 bytes) in
```
みたいなエラーがでたら

php.iniの
```
//変更前
memory_limit = 512M
//変更後
memory_limit = -1
```
に変更して再度試してください。
※php artisan admin:installが終わったあとは
php.iniは再度
```
memory_limit = 512M
```
のように戻してください。


あとはブラウザで/adminでアクセスすれば表示されます。

デフォルトでは
Username: admin
Password: admin
でログインできます。

ファイルの以下にlaravel-adminの構成ができています。

```
app/Admin
├── Controllers
│   ├── ExampleController.php
│   └── HomeController.php
├── bootstrap.php
└── routes.php

```

簡易な管理画面を作りたい場合におすすめです。
「データベースリライアビリティエンジニアリング」読了

https://www.oreilly.co.jp/books/9784873119403/
## 感想
タイトルだけみて「データベースに関する書籍かな？なんか面白そうだし読んでみるかー」ぐらいに思って手に取ったが、奥深き本だった。データベースそのものというより、データベースを軸にビジネスをどう発展させるか？より良いシステムを作るにはどうすればいいか？が具体的に書いてあり、面白かった。保守性って大事なんだなと、しみじみ、、、。
後半の内容は私にはレベルが高すぎてパラパラ読んでしまった。

以下印象に残った部分。

## 速度こそ全て
一時的なシステムダウンより、恒常的なレイテンシが遅いサービスのほうがより多くのユーザ離れを引き起こす。
Googleの実験[^1]によると、100ミリ秒から400ミリ秒の遅延に対して0.2%から0.6%のユーザが離脱することが確認された。

## 回復力のあるシステム
障害のない堅牢なシステムは、堅牢であるがゆえに、一旦障害が発生して対応を迫られた場合の影響度が深刻なものとなってしまう。しばしば障害を起こすものの、その都度すぐ回復するサービスのほうがユーザビリティが高いといえる。

回復力のあるシステムとは以下の特徴を持つ。
- 障害を検知する優れた監視システムを持ち、さらに自己修復機能を備えているため平均修復時間が短くなる。
- 分散システム採用により高い冗長性を確保しているため、１つの障害が全体に与える影響が小さくなる
- 障害に対する自動修復機能、洗練されたドキュメント、事前トレーニングといった組織全体での回復力を高めることで、障害対応はもはや特別なものではなくなり、通常業務の１つとなる。

## 1.SLOを定義する
1. レイテンシ指標を定義する
    - リクエストの99%においてレイテンシは25ミリ秒から100ミリ秒の間におさめること
1. 可用性の指標を定義する
    - 1週間あたりの可用性の平均が99.9%であること
    - 障害が発生した場合、10.08分間以内に復旧すること
    - ダウンタイムとは、全体のユーザ数の5%以上に影響を与える事象とする
    - 1年に1回は4時間のダウンタイムを許容する。ただし以下を満たさなければならない
        - 2週間前にユーザへ通知すること
        - 1度にユーザ数の10%以上に影響を与えないこと
1. スループットの指標を定義する
1. 費用対効果の指標を定義する

定義したSLOは定期的に見直すこと。
SLOを定義するさいにはダッシュボード1ページに収まる簡潔なものとし、ユーザ中心で優先順位を組み立てること。

## 2.SLOに基づいた監視とレポートを行う
1. 監視システムによる __生データ__ を収集する
1. 可用性の監視を行う
    - ユーザからのリクエストに対するエラー発生率(RUM - Real User Monitoring)に着目する
1. レイテンシの監視を行う
    - ユーザからのリクエストに対するレスポンスにかかった時間に着目する
1. スループットの監視を行う
    - 秒単位でトランザクションを記録し、どのタイミングで出力が落ちてきたのかを把握する
1. 費用対効果の監視を行う

## 3.SLOに基づいたリスクマネジメントを行う
1. 監視とレポートを基にSLOを脅かすリスクを認識する
1. リスクが現実となって起こりうる可能性及び発生した場合にもたらす影響を考慮して各リスクに対して優先順位づけを行う
    - 非常に深刻な影響を与える(Severe: 即SLO違反となる)
    - 深刻な影響を与える(Major: SLO違反ギリギリ)
    - 中程度の影響を与える(Moderate: 他のケースが同時発生した場合SLO違反となりうる)
    - 軽微な影響を与える(Minor: 軽微)
1. 各リスクに対して、回避・低減・需要の意思決定を行う

## 用語集
### SLO - サービスレベル目標
設計及び運用に関して遵守すべき事柄をまとめたもの。
### レイテンシ
1リクエストに対するレスポンスにかかる時間を表すもの。
ユーザ側の環境からエンドツーエンドでどの程度かかるか。
### 可用性
サービスにリクエストに対して決めれらた基準内でレスポンスを返すことができる状態であり、パーセンテージで表される。
### スループット
一定時間において正常に処理されたリクエストの割合のこと。一定時間とは一般的に秒単位で測定される。
### 耐久性
ストレージに対して一定の成功率で書き込みができるかどうか。
### 費用対効果
ユーザがとる１つの行動（１ページビュー、１購読数、購入１件、、、）に対する効果。費用対効果の結果は、オンラインマガジンなどであればページビューであるし、オンラインサービスならばユーザ数、小売業ならトランザクション数になる。

[^1]: Speed Matters(https://ai.googleblog.com/2009/06/speed-matters.html)
AWS SSO CodeCommit+SourceTreeを利用する方法

# はじめに
AWS SSOで管理している AWSアカウントのCodecommitからクローンしたり
クローンしてきたリポジトリをSourceTreeから操作できるようにする為の
備忘録的な記事です。

# 環境
- MacOS
    - git
    - aws-cli

# 利用サービス
- AWS
    - Codecommit

- その他
    - SourceTree

# 前提
- 対象AWSアカウントのCodecommitへ リポジトリが作成されている事
- 対象AWSアカウントの認証情報が`aws configure`で設定されている事

# 手順
## 1. Git Configの設定書き換え

下記コマンドを実行し、Git認証情報ヘルパーがAWS認証情報プロファイルを使用するよう指定

```
$ git config --global credential.helper '!aws codecommit credential-helper $@'
$ git config --global credential.UseHttpPath true
```

## 2. gitconfig を編集

下記コマンドを実行し、`.gitconfig`を一部編集

```
$ git config --global --edit
```

`.gitconfig` から削除（又はコメントアウト）
```
# credential.helper=osxkeychain
```

`.gitconfig` へ追記
```
[credential]
helper = !aws codecommit credential-helper $@
UseHttpPath = true
```

## 3. クローン

下記コマンドを実行し、クローンする
※ リポジトリURL(HTTPS)はCodecommitのより取得
```
git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/xxxxxxx
```

## 4. SourceTreeで利用

[新規...] →[既存のリポジトリを追加]でクローンしてきたリポジトリを選択
※ ここまでの設定に問題なければ、`fetch` `pull`等を行えるはず

# おわりに
誰かの助けになれば幸いです。
【TypeScript】配列の中に同じキーの連想配列をまとめる

# はじめに
TypeScriptでタイトルに記載してあることをしたので記事にすることにしました。
さっそく結論に入ります！
※タイトル分かり辛いかもです。悩んだ末にこれにしました😅
　もっと良いタイトルを思いついたらタイトル名変わるかもです…

# 結論
```tsx
const initDataArray: {[key: string]: string|number}[] = [
  {"id": 1, "name": "リンゴ", "type": "果物"},
  {"id": 2, "name": "ブドウ", "type": "果物"},
  {"id": 3, "name": "ミカン", "type": "果物"},
  {"id": 4, "name": "人参", "type": "野菜"},
  {"id": 5, "name": "キャベツ", "type": "野菜"},
  {"id": 6, "name": "ピーマン", "type": "野菜"},
];
const sortArray: any = new Array();

for(let initData of initDataArray) {
  if(!initData["type"]) continue;
  // 空の配列追加。push時に下記エラーが発生するため。
  // TypeError: Cannot read properties of undefined (reading 'push')
  if(!sortArray[initData["type"]]) sortArray[initData["type"]] = new Array();
  sortArray[initData["type"]].push(initData);
}

console.log(sortArray);
```
配列の中に同じキーの連想配列をまとめることができました！
![配列の中身.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2708185/08269dba-737d-e80c-2d13-381d65577751.png)
MIDIをSound Canvas VAでデコードさせる

# 概要
　むかしー、Sound Canvas VA が出た時に MIDI を再生したいなぁと思った時に作ったソースコードが出てきたので、整理しました。
- https://gitlab.com/nekodevteam/nyaon
  - Windows版(x86/x64)
  - MacOS版(Intel)

　最終的には Neko Project II に組み込みこんでますので、リアルタイム再生はそっち見てください
　※今回ちょっとだけ更新しました

## MIDI パーサ 
　PocketPC用ゲーム用のパーサだったものを派生した

## VSTi Host
　新規で作成
　MIDI イベントを投げると音源データを吐いてくれる

## Midi2Vsti
 MIDI ファイルを Sound Canvas VA でデコードするコンソール ツール

## その他
　確認のために最新の Sound Canvas VA をインストールしたら、Windows版だけパスが変更されてた
- https://gitlab.com/nekodevteam/nyaon/-/merge_requests/6/diffs

　ねこも直さないとね。。。

## ToDo
 
 新しめの VST3 SDK だとファイル構成が変わったらしくビルド エラーになるので直したい
人事のおじさんプログラミングを学ぶ Day14「わかりやすく日時を表示する」

書籍『確かな力が身につくJavaScript「超」入門 第2版』に沿って、
わかりやすく日時を表示してみた。
Day13でひっかかったバックコーテーションには気づくことができました。
![2022-09-14 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/ff679351-32f7-3319-c9ea-ab0cb0bd98de.png)
![2022-09-14 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2783084/d64d0341-2c6d-30bc-a632-e796dc81ae36.png)
chatbotのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


[EinsteinBotのまとめ](https://qiita.com/Keiji_otsubo/items/208b748c2c0a0ba25321)

Einstein Bots are available with Service Cloud and hence they can also be setup with a Community. Although, Bots are more contextual for anonymous user queries. 
Einstein ボットは Service Cloud で使用できるため、コミュニティでセットアップすることもできます。ただし、ボットは匿名ユーザーのクエリに対してよりコンテキストに依存しています。

+ [Chatbots in Salesforce communities](https://salesforce.stackexchange.com/questions/225807/chatbots-in-salesforce-communities)

+ [全てのコミュニティページにBotを表示したい](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JdWXXSA3)

+ [アインシュタインボット 関係のまとめ](https://qiita.com/Keiji_otsubo/items/a4cfd4137b1ed9e9cf47)


+ [「埋め込みチャット ウィンドウでのエンド ユーザーの推定待ち時間」を表示する方法はありますか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XII4F)

:::note
It seems that you can get it using Chat API.

Give Chat Customers an Estimated Wait Time (Beta)
https://help.salesforce.com/s/articleView?id=release-notes.rn_omnichannel_estimated_wait.htm&release=222&type=5
:::

+ [【未解決】How to delete a chat queue?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jg5Ec)


# chat Transcript is stucked with "Waiting"

+ [chat Transcript is stucked with "Waiting"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007QeM8k)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/4ee878ad-cd8a-38ea-b016-04795e690870.png)

:::note
Under certain circumstances, Chat Service Channel is not created. Any other custom Service Channel, even if set to Chat, will not work for chat routing using Omni-Channel.  Please disable the Chat  and Omni Channel, then re-enable, which will lead to the creation of the default service channel.
:::

+ [チャットボットの設定 - 事前チャットが読み込まれない](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX00000Kg4M5)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/79ce957d-dec5-2625-fbfb-51d176ca6690.png)

:::note
もう一度設定を確認しましたが、オムニチャネルが有効になっていませんでした。これで問題は解決しました -  https://help.salesforce.com/s/articleView?id=service.omnichannel_enable.htm&type=5
:::


# 埋込

+ [埋め込みチャットの設定を添付しましたが、ポータルに配置できません](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007clbHy)

:::note
以下のヘルプ記事をご覧ください。

https://help.salesforce.com/s/articleView?id=sf.embedded_static_resources.htm&type=5
:::


# 未解決

+ [最初に顧客にメッセージを送信せずにボットにウェルカム メッセージを自動送信させる方法](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZB92D)
JavaのSerializableに対する自分の理解

# そもそもSerializableとは
javadoc↓
https://docs.oracle.com/javase/jp/8/docs/api/java/io/Serializable.html

`java.io.Serializable`がimplementされたクラスは、serialize（＝直列化）できる。
serializeとは、具体的にはバイト配列化させるということ。

バイト化させることで、クラスのデータをストリーム（ファイル）やディスクに読み書きできるようになるため、低レイヤでのデータやりとりが可能になる。

おもにdtoやformクラスにimplementすることが多い。

# Serializableをimplementしないことによって起きる害

sessionにdtoを詰める際は、dtoが直列化可能である必要がある。
（＝Serializableをimplementしている必要がある）

https://teratail.com/questions/78928

> HttpSessionオブジェクトは、コンテナへ特に設定しない場合はメモリに格納されたままなので特にシリアライズは不要ですが、JavaEEの仕様としてHttpSessionに格納されるオブジェクトは複数コンテナ間に永続可能にできるよう、単一コンテナのメモリ以外へオブジェクトを共有できる仕様があり(HttpSession persistence)、以下のいくつかが選択できます（コンテナによってはこれ以外にも機能があります）
> 
> - ファイルへ読み書きする
> - JDBC経由でデータベースを使う
> - クラスタリング
> - キャッシュサーバ(redisなど)
> 
> つまりWebアプリケーションが動作しているJVMから全く別の場所にオブジェクトを送受信できるようにしてるため、シリアライスが必須です。

https://qiita.com/esgr_dxx/items/346b0e08ffeece9df1de

> セッションは画面遷移をまたいでオブジェクトを保存できる便利な「入れ物」ですが、基本的にメモリ領域の一部を割り当てて使っているため、 (1)割り当て領域が満杯になってしまったときや、(2)サーブレットコンテナを停止するときに、セッション上の保存オブジェクトをいったんDiskに書き出して退避させます。
このようなオブジェクトのDisk書き出し処理をシリアライズといいます。 Javaではどんなオブジェクトもシリアライズできるわけではなくて、 java.io.Serializable を実装(implements)したクラスだけが対象となります。


# Serializableの実装例
以下が参考になった

https://qiita.com/NBT/items/9f76c9fd1c7a90506658
Salesforce で API アクセスを有効にする

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)

[Enable API access in Salesforce](https://support.geckoboard.com/en/articles/6055614-enable-api-access-in-salesforce)

ユーザープロファイルまたは権限セットのいずれかによって、Salesforce アカウントで API アクセスを有効にすることができます。Salesforce 管理者が、あなたのプロファイルとその権限を制御します。


# プロファイルを使用して API アクセスを有効にする
ユーザー プロファイルによる Salesforce での API アクセスを有効にします。

1. [セットアップ]をクリックします。
2. [ユーザーの管理]に移動し、[プロファイル] をクリックします。
3. 更新する特定のプロファイルで[編集]をクリックします。
4. [管理者権限] まで下にスクロールし、[ API 有効化]ボックスをオンにします。 
5. [保存]をクリックします。

# 権限セットを使用して API アクセスを有効にする
システム権限を設定して、Salesforce で API アクセスを有効にします。

1. [セットアップ]をクリックします。
2. [ユーザーの管理]に移動し、[権限セット] をクリックします
3. 更新する権限セットを選択します。
4. [システム]に移動し、[システム権限] をクリックします。
5. [編集]をクリックします。
6. [ API 有効化]ボックスをオンにします。
7. [保存]をクリックします。
Python,Ruby,PHP,Java,JavaScript,Perlのデバッガ(デバッグ)の比較 | プログラミング言語比較

<a href="https://qiita.com/yuki_kimoto/items/f9c2454e7f9130ddb003">Qiita > プログラミング言語の比較</a>

プログラミング言語Python,Ruby,PHP,Java,JavaScript,Perlのデバッガ(デバッグ)の比較

# Python

https://qiita.com/kaitolucifer/items/dc58efebd72d72a8feb2

# Ruby

https://qiita.com/port-development/items/5ea6448eb2b45c70ef65

https://qiita.com/suketa/items/52c60d79332c9a24f973

# PHP

https://qiita.com/ryouya3948/items/0055c1935b7bd62ba3b9

# Java

https://qiita.com/gatchan03/items/3c43b674e2b7c4b5c5cb

# JavaScript

https://qiita.com/a_ya_ka/items/b5160cd7d592931d7507

# Perl

https://perlzemi.com/blog/20100302126967.html
Open5GS の Quickstartを実施するにはUbuntu 22.04はだめで、20.04以前が良さそう。

おうちにモバイルコア網(EPC or 5GC)ありますよ。とマウント取りたいので、勉強しています。
本記事では、Open5GSのチュートリアルを読んで概要を掴むところを目指しましたが。OS選びで失敗しました。

# 参考文献
Open 5GSのドキュメント
https://open5gs.org/open5gs/docs/

# 概要
Open 5GCのドキュメントにUbuntuの推奨バージョンは書かれていなかったが、
Open5GCで、mongodbというパッケージを使う。
mongodbは、Ubuntu 22.04のパッケージにはまだ含まれていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/fb7e2c14-5a51-3ae5-acf2-de2fe4dae857.png)

※何か回避方法があれば教えてください。

# User’s Guide

## Quickstart
5GCoreを建てようと思うと、ピンクの部分がごちゃっとしてて難しそうなので、
まずは緑の部分EPCを建てようと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/28e32df1-77f6-3db8-32c4-135ae6342537.png)

### 1. Introduction 4G/ 5G NSA Core
SGWとPGWが、C(制御側)とU(データの転送)で分かれている（いわゆるC/U分離　CUPS）なのが若干気になりますが、
ほぼ私の知っているEPCなので、なんとかなりそう。
>The Open5GS 4G/ 5G NSA Core contains the following components:
MME - Mobility Management Entity
HSS - Home Subscriber Server
PCRF - Policy and Charging Rules Function
SGWC - Serving Gateway Control Plane
SGWU - Serving Gateway User Plane
PGWC/SMF - Packet Gateway Control Plane / (component contained in Open5GS SMF)
PGWU/UPF - Packet Gateway User Plane / (component contained in Open5GS UPF)

MME - HSS　で認証したり、端末が移動したときのハンドオーバー制御して、
HSS - PCRF　で認証されたユーザーの情報を渡して、
PCRFがSGW/PGWに流れるデータの転送を制御する
ようなイメージ。

### 2.Install Open5GS with a Package Manager
Ubuntuはパッケージがあるので、簡単にインストールできる。
我が家のミニPCに突っ込んでみます。
下図の右側
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/f6cf9c52-bea4-f6a0-a4a8-59c9faf2ae50.png)

ミニPCのインストールは下記記事参照
https://qiita.com/kanegae/items/8c22273fa7abfa454034

UbuntuにOpen5GSをインストール
~~~
$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add-apt-repository ppa:open5gs/latest
$ sudo apt update
$ sudo apt install open5gs
~~~~

・apt update
https://packages.ubuntu.com/jammy/
色々まとめて最新化してくれるらしい。
コンパイラ、ライブラリ、エディタ等

・apt install software-properties-common
https://packages.ubuntu.com/ja/bionic-updates/software-properties-common
open sslとかPythonがインストールされるらしい

・add-apt-repository ppa:open5gs/latest
　opne5gsのリポジトリを追加

・sudo apt install open5gs
opne5gsをインストール　
~~~
The following packages have unmet dependencies:
 open5gs-hss : Depends: mongodb-org but it is not installable or
                        mongodb but it is not installable
 open5gs-pcrf : Depends: mongodb-org but it is not installable or
                         mongodb but it is not installable
~~~

### mongodbをインストール
悲しいことに、Ubuntu 22.04は未サポートの様子。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2311625/76b91cac-740e-c25a-e58c-d9b70ea4e6d1.png)

20.04にOSを変えるところから出直します。
2022/9/14主にITとかセキュリティの記事

Apple、「iOS 16」でゼロデイ脆弱性を修正 - 「iOS 15.7」などもあわせて公開
https://www.security-next.com/139687

SonicWall製のSMB向けリモートアクセス製品に脆弱性
https://www.security-next.com/139696

CSIRT交流イベント「NCA Annual Conference 2022」、12月にハイブリッド開催
https://www.security-next.com/139699

「SECCON CTF」、3年ぶりにリアル開催
https://www.security-next.com/139678

茨城県産業技術イノベーションセンターでサイト改ざん - 不審な英文
https://www.security-next.com/139649

インターコンチネンタルホテルの予約システム、サイバー攻撃受けダウン(9/12)
https://news.mynavi.jp/techplus/article/20220912-2451983/

「三越伊勢丹」を騙るフィッシング詐欺サイトが急増、高齢者を狙い打ち？【BBソフトサービス調べ】(9/12)
https://webtan.impress.co.jp/n/2022/09/12/43300

「BIMI」とは? - いまさら聞けないスマートフォン用語(9/11)
https://news.mynavi.jp/article/20220911-smartphone_word/

【今週の注目トピック(3)】話題のテーマ『ロシア系ハッカー、日本政府サイトにサイバー攻撃か』など(9/11)
https://finance.yahoo.co.jp/news/detail/20220911-00930003-fisf-stocks

件名「【最終警告】イオンカード からの緊急のご連絡」などのメール、イオンカードをかたるフィッシングに注意(9/12)
https://internet.watch.impress.co.jp/docs/news/1438895.html

設定不備重なりフォーム利用者の情報274件が外部閲覧可能に、休日ハック(9/12)
https://cybersecurity-jp.com/news/71473

iPhoneやiPadがスパイウェアに感染しているか確認する方法(9/11)
https://www.gizmodo.jp/2022/09/how-to-tell-if-your-iphone-or-ipad-is-infected-with-peg-1.html

中国外務省　米サイバー攻撃に『厳正な申し入れ』(9/11)
https://news.tv-asahi.co.jp/news_international/articles/000268064.html?display=full

アルダグラム、電子小黒板に公共工事における改ざん検知機能を提供(9/12)
https://ascii.jp/elem/000/004/104/4104395/

「デスクトップ仮想化」によってセキュリティ向上やコスト削減が期待できる理由(9/12)
https://gunosy.com/articles/eMNab

イスラム国がテロメッセージの拡散等でNFTを活用と判明(9/12)
https://zuuonline.com/archives/241161

【予告】「地域金融機関ICTコンサルティングの取組状況」FISC調査報告会開催(9/12)
https://www.fisc.or.jp/event/event/005452.php

DevOpsの現状、開発と運用のあり方の今後は（上）(9/12)
https://project.nikkeibp.co.jp/idg/atcl/19/00325/090200001/

デジタル庁、中国TikTokとマイナンバー制度の普及啓発　元閣僚も疑問呈す(9/12)
https://mb.epochtimes.jp/2022/09/117357.html

あるはずのデジタル化された資産、見つからないときは(9/12)
https://style.nikkei.com/article/DGXZQOLM198230Z10C22A8000000?channel=ASH05029

知らない人から菓子はもらわない、子供時代の体験が生むセキュリティ対策(9/12)
https://news.mynavi.jp/techplus/article/20220912-2451992/

CMS移行で検索ビジビリティが22%低下、原因はcookieの同意フォームだった！？(9/12)
https://webtan.impress.co.jp/e/2022/09/12/43289

イーサリアム、最後のシャドーフォークが成功｜「マージ」の準備整う(9/12)
https://jp.cointelegraph.com/news/ethereum-ready-for-the-merge-as-last-shadow-fork-completes-successfully

Facebookを「見るだけ」（アカウント無し）で利用する方法 – ログインせずに見る方法解説(9/12)
https://otona-life.com/2022/09/11/135019/

導入期に入るマイクロサービス、メリットと留意すべき課題(9/12)
https://japan.zdnet.com/article/35193083/

Windows 11で「ユーザー名(アカウント)」を変更する方法！(9/11)
https://otona-life.com/2022/09/11/134614/

クラウドの負荷分散装置に不正侵入　脆弱性突かれ「多層防御」も効かず　富士通クラウドテクノロジーズ(9/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600011/090600115/

派遣会社からの情報流出で利用者を脅迫、事件前の削除要請に対応未了で被害拡大か(9/13)
https://xtech.nikkei.com/atcl/nxt/column/18/00598/070100181/

子会社の弊害あらわ　DX機運が改新迫る(9/13)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/090600311/090600001/
Flaskでファイルのダウンロード・アップロードを実装してみた

Flaskでファイルのやり取りができる方法を調べてみたので、忘れないようにメモを残します。

# ファイルのダウンロード

下のプログラムは、クライアントでのブラウザのURL欄に`http://[サーバのIPアドレス]/xxx.bin`と入れると、サーバにある`yyy.bin`というファイルをダウンロードし、クライアント上に`zzz.bin`という名前で保存する、という動作を行います。

```:ファイル構成
.
├── download.py
└── yyy.bin
```

```python:download.py
from flask import Flask,send_file

app = Flask(__name__)
@app.route("/xxx.bin",methods=["GET"])
def download():
    return send_file("./yyy.bin",mimetype="application/octet-stream",as_attachment=False,download_name="zzz.bin")

if __name__ == "__main__":
    app.run(host="[サーバのIPアドレス]",debug=False,port=80)
```

下のコマンドで動作確認をします。

```bash:
curl http://[サーバのIPアドレス]/xxx.bin -O
```

※補足説明
curlだと`zzz.bin`ではなく`xxx.bin`という名前で保存されました。しかし、chromeではちゃんと`zzz.bin`という名前で保存されました。

# ファイルのアップロード

下のプログラムは、`http://[サーバのIPアドレス]/xxx`にname属性を`yyy`として`zzz.bin`をPOSTすると、`upload.py`と同じフォルダに`zzz.bin`が保存される、という動作を行います。

```python:upload.py
from flask import Flask,request

app = Flask(__name__)
@app.route("/xxx",methods=["POST"])
def upload():
    name = "yyy"
    if name in request.files:
        fs = request.files[name]
        fs.save("./"+fs.filename)
        return "ok"
    else:
        return "ng"

if __name__ == "__main__":
    app.run(host="[サーバのIPアドレス]",debug=False,port=80)
```

下のコマンドで動作確認をします。

```bash:
curl http://[サーバのIPアドレス]/xxx -X POST -F yyy=@zzz.bin
```
【AWS】ACMでSSL証明書を発行する方法と注意点（コンソールの画像付きで解説）

## 背景
- AWSでSSL証明書を取得するときには[ACM](https://aws.amazon.com/jp/certificate-manager/)を利用する。
- ACMでSSL証明書を取得する時に、ワイルドカード表記のドメインでの証明書を取得し忘れてしまい、[Route53](https://aws.amazon.com/jp/route53/)で作成したレコードが使えないSSL証明書を発行してしまったので、二度としないようにまとめておく。

## ACM（AWS Certificate Manager）とは？
- AWSでSSL/TLS証明書を発行できるAWSのサービス
- ACMで取得したSSL証明書はロードバランサー（ALBやELB）やCloudFrontで使用することがよくある。

## 目標
- ACMでSSL証明書を発行するときに、ワイルドカード表記のドメイン取得も忘れないようにする。
- 例として「example.com」というドメインのSSL証明書発行までをコンソール画像で解説する。

■ワイルドカード指定をした項目を入れることを忘れるな！
|example.com  |オリジナルドメイン  |
|---|---|
|*.example.com |Route53で作成したレコードが使えるようにワイルドカードのドメインも入れておく　|



## AWSのコンソールからACMサービスに移動
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/b3cde39c-a084-d2d0-194e-b0afd2512630.png)

## 左の3本バーをクリック
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/a544abf6-2d2a-7ed0-ee4f-fd7ee6138d40.png)

## 「証明書を一覧」をクリック
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/06db57e5-e02f-d862-05c2-eb049a0b989d.png)

## 「リクエスト」をクリック
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/78d035a8-ef6c-d6a6-faa7-15264f3d19be.png)

## パブリック証明書を取得するので、そのまま「次へ」をクリック
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/df20a871-8c48-2920-7619-1f87d1301a72.png)

## SSL証明書を取得したいドメインを入力
- 「この証明書に別の名前を追加」をクリックし、オリジナルドメイン（ここでは、example.com）以外に、前方にワイルドカードを指定したドメインの証明書も合わせて取得すること！
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/12a09adf-e2ef-3639-0123-c6b1875d6fa5.png)

## 補足
- 記事を記載後に気づいたのですが、上記までの手順の後にRoute53にCNAMEを登録する必要があります。

## 参考資料

https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/gs-acm-request-public.html

https://aws.amazon.com/jp/certificate-manager/

https://aws.amazon.com/jp/route53/

## 個人ブログ

https://takuma-tech.com/2022/09/27/199/
GASをGitHubで管理する方法を調べてみた

## 　はじめに
僕がGoogle Apps Script（GAS）を使うときに困ることが、GitHub等で管理できないことでした。調べてみると、GASのスクリプトをGitHubやGitLab、Bitbucket等で管理できる方法があるようなので、今回はそのやり方をまとめていきたいと思います。

やり方としては、以下のChrome拡張機能をインストールするということです。具体的なやり方を以下にまとめます。

https://chrome.google.com/webstore/detail/google-apps-script-github/lfjcgcmkmjjlieihflfhjopckgpelofo?hl=ja

## 　使い方
Chrome拡張機能のインストールから、GASのIDEで実際にGitHubを利用して管理する方法は、以下のページに記載してあります。今回はこちらのページをもとに書いていきます。

http://gas.a4114.net/


### 1. Chrome拡張機能をインストールする
以下のページから、Chrome拡張機能をインストールします。
https://chrome.google.com/webstore/detail/google-apps-script-github/lfjcgcmkmjjlieihflfhjopckgpelofo?hl=ja

### 2. GitHubでアクセストークンを作成する
1でダウンロードした拡張機能を使うためにGitHubのアクセストークンが必要なので、そちらを作成します。
GitHubにログインして、ユーザーアイコン > Settings > Developer settings > Personal access tokens の順に進むと作成画面に遷移することができます。Noteには適当な名前をつけて、Scopeでは`repo`と`gist`を選択しておきましょう。

![スクリーンショット 2022-09-14 1.02.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/5817ac5d-6656-58ff-f2f9-0a5dc7d71247.png)


### 3. 拡張機能にログインする
Chromeの画面右上からインストールした拡張機能 > オプションをクリックします。そうすると、ユーザ名とアクセストークンの入力を求められるので、先ほど作成したアクセストークンを入力します。GitLabやBitbucketはモーダル下部のリンクをクリックすることで変更可能です。

![スクリーンショット 2022-09-14 1.42.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/91926436-9b04-cb90-11a9-dd0ecb731af9.png)


入力が完了すると以下の画面が表示されますが、そうするとScript APIが有効になっているか確認してくださいと出るので、リンクから遷移して有効にします。

![スクリーンショット 2022-09-14 1.37.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/2e3e06b3-58be-c62c-98aa-c5225313eef2.png)

ここまでで設定は完了です！

### 4. GASのIDEで使う
ログイン完了後にGASのIDEを開くと、エディタ上部にリポジトリとブランチを選択できる画面が表示されているはずです。

![スクリーンショット 2022-09-14 1.51.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/0d7ecd43-7b23-ec64-8fc8-a346e91b3c86.png)

IDE上からRepository、Branchと書いてあるドロップダウンから新規のリポジトリやブランチの作成、選択が可能です。下向きの矢印をクリックするとリポジトリからプルしてきて、上向きの矢印をクリックするとプッシュまですることが可能です。

![スクリーンショット 2022-09-14 2.04.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/04f3bab4-150b-c162-fae8-e235b5c514e2.png)

## さいごに
今回はGASをGitHubで管理する方法を紹介しました！簡単にできるものなので、興味のある方はぜひやってみてください！
HackTheBox Writeup: Redeemer

## 概要
HackTheBox:Redeemerのflagを入手する手順を記す。

## Port Scan
今回は広範囲にスキャンを掛ける必要があるので--min-rateを設定する。

```terminal
$ nmap -p- -A redeemer.htb --min-rate 5000 
Starting Nmap 7.92 ( https://nmap.org ) at 2022-09-13 12:23 EDT
Nmap scan report for redeemer.htb (10.129.153.222)
Host is up (0.25s latency).
Not shown: 65534 closed tcp ports (conn-refused)
PORT     STATE SERVICE VERSION
6379/tcp open  redis   Redis key-value store 5.0.7

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 31.61 seconds
```
スキャン結果からRedisが提供されていることが分かる。

## Redis
Redisに接続し、infoを確認する。
```
$ redis-cli -h redeemer.htb
redeemer.htb:6379> info

~~~
省略
~~~

# Cluster
cluster_enabled:0

# Keyspace
db0:keys=4,expires=0,avg_ttl=0
redeemer.htb:6379> 
```
db0にkeyを4つ保持していることが分かる。

```
redeemer.htb:6379> keys *
1) "numb"
2) "flag"
3) "temp"
4) "stor"
redeemer.htb:6379> get flag
```
これでflagを手に入れられる。
Reactでマークダウンエディタを作った話

## 作り始めたきっかけ

アウトプットのために、[Zenn](https://zenn.dev/)に記事を書こうとした、Zennのマークダウンエディタには、プレビューが同時に見れない、いちいちタブを選択しないといけない。[Qiita](https://qiita.com/)でも、いちいち記号(ex:水平線とかQuoteなど)も手入力しないといけない。


そんなときに、夏休みだし自分で使うものぐらい自分で作るかと思って、作ったのがきっかけです



-----




## 使用した技術

- [React](https://ja.reactjs.org/)
- [react-simplemde-editor](https://github.com/RIP21/react-simplemde-editor)
- [Firebase(storage)](https://firebase.google.com/docs/storage?hl=ja)
- [Vite](https://vitejs.dev/)

## 開発環境
```
npm -v
8.11.0
node -v
v16.16.0
yarn -v
1.22.19
```

-----

### 少し紹介

![image](https://firebasestorage.googleapis.com/v0/b/typing-game-a06e4.appspot.com/o/images%2F%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-09-14%200.27.04.png?alt=media&token=00a1858a-59d2-456d-b073-ad450981cea2)

このライブラリは、JSのライブラリをforkして作られたライブラリなので、optionでfork元のoptionが使えるのがとても魅力的です！

[fork元のモジュール](https://github.com/Ionaru/easy-markdown-editor)


-----

## モジュールで簡単にできること

- D&Dが簡単に実装できる
	- 今回は、Firebaseのstorageを用いて、実装しました！
- ツールバーの編集が簡単
	- 自分好みカスタマイズしやすかった
- 文章のオートセーブも簡単に実装できる！
	- 裏側はLocalStorageを使っているみたいでした(今回は実装してません)


-----

## 詰まったところ

- 要件を決めずに開発
	- 実装のしていく中で、戻りが発生
		- 使用している技術に対応していない(Viteに対応していない)
			- 作りたい用件に合わない(D&Dが実装するのが複雑)
			- UIが気に入らない

こんな感じで、行き当たりばったりで開発していたので、少し時間かかってしまいました。


-----

## 実際に作った機能

- D&Dで画像を表示する機能
	- 自分はかなり使うので、実装できて良かったです
	- デフォルトで関数が用意されているので、そちらを用いて、Firebase(storage)にアップロードして、アップロードした画像のURLを取得して、マークダウンにURLを埋め込んでるような実装にしてます！
- UIの変更
	- 実はデフォルトのフォントではなく、少し変更したりしてます。色合いとかも自分の見やすいように設定してます。
- ツールバーのショートカットキーも自分の使いやすいように設定してます。これのおかげで、かなりマークダウンを書くことが楽になってます。

-----
## 今後やっていきたいこと

- D&Dしたときの画像サイズが大きすぎるのを修正したり、ダークモードを対応したり、マークダウンのUIが少し変なところあるところの修正

-----

## 最後に

夏休みにアウトプットができるものが良かったです。これからもいろんなものを作っていきたいと思ってます！！ご清聴ありがとうございました！！
Linux iptables、firewalld、forewall-ctlコマンドについて（自分用メモ

ファイアウォールは外部からの攻撃や不正なアクセスを防ぐためのセキュリティ機能。
ファイアウォールの主要機能のパケットフィルタリングでは、パケットの送信元アドレス、宛先アドレス、ポート番号をチェックし、ルールに従ってパケットの通過を許可、破棄。アクセスリストと同様の働きをする。

●iptables
Linuxカーネルにはnetfilterというパケット処理機能が組み込まれている。
iptables（IPv6環境ではip6tables）は、netfilterを利用してパケットフィルタリングやNAT（ネットワークアドレス変換）の設定を行う機能およびコマンド。CentOS6までのデフォルトのファイアウォールの仕組み。

設定内容によって書式が異なるが、基本的なフィルタリングの書式：

iptables [-t テーブル] -[A|D] チェイン　ルール

テーブル...iptablesで作成するルール群（チェイン）の使用目的を決定するもの。デフォルトはfilter（パケットフィルタリング用）
A|D...ルールの追加|削除
チェイン...パケットの処理方法を定義したルール群。また、どのタイミングでルールを適用するかを表す


※iptablesの設定はシステム再起動を行うと消えてしまう。再起動後も同じ設定にしたい場合は、設定をファイルへ保存し、再起動後には復元する必要がある。


●firewalld
CentOS7からは、iptablesの代わりにfirewalldがデフォルトのファイアウォール機能として実装。firewalldもnetfilterを利用しますが、iptablesより簡単に設定できる。

firewalldサービスはデフォルトでは有効だが、以下のコマンドでステータス確認、有効化、起動。

・firewalldのステータス確認
systemctl status firewalld

・firewalldの自動起動の有効化
systemctl enable firewalld

・firewalldの起動
systemctl start firewalld

●ゾーン
firewalldには「ゾーン」という概念があります。パケットフィルタリングのルールをゾーンごとに定義しておき各NICに割り当てる、テンプレートのようなもの。
firewalldでは同じ性質のインタフェースに同じルール定義のゾーンを割り当てることができる。
デフォルトでは9種類のゾーンがあり、それぞれの用途を想定したルールが設定されている。ゾーンは作成して追加することも可能。

public...公共領域での利用（デフォルト）
work...業務での利用
home...家庭での利用
internal...ファイアウォールの内部ネットワーク側での利用
external...ファイアウォールの外部ネットワーク側での利用
dmz...ファイアウォールのDMZ（外部から内部ネットワークを守る緩衝地帯）での利用
block...受信パケットを拒否。外部への通信と戻りパケットだけを許可
drop...受信パケットを廃棄。外部への通信と戻りパケットだけを許可
trusted...全ての通信を許可

●firewall-cmdコマンド
firewall-cmdコマンドを使用してfirewalldを設定。

基本的なコマンド

・firewalldサービスのステータス確認
firewall-cmd --state

・ゾーンの設定を確認
firewall-cmd [--zone=ゾーン] --list-all

「--zone=ゾーン」を指定しない場合は、デフォルトのゾーン（初期値はpublic）

デフォルトのゾーンは「--get-default-zone」オプションで確認。
firewall-cmd --get-default-zone

・ゾーンにサービスを追加
firewall-cmd [--zone=ゾーン] --add-service=サービス

・ゾーンからサービスを削除
firewall-cmd [--zone=ゾーン] --remove-service=サービス


設定は即時反映されるが、firewalldサービスやシステムを再起動すると消える。
恒久的に設定したい場合は「--permanent」オプションを指定して設定した後に、「firewall-cmd --reload」で再読み込みさせる必要がある。
firewall-cmd --reload
Ubuntu 18.04でpip install しようとすると"ModuleNotFoundError: No module named 'pip._internal'が出る。

# pip が見つからない
```
pip install pandas
```

```
"ModuleNotFoundError: No module named 'pip._internal'
```
と出る。。。
pip を再インストールする。
```
sudo apt install python-pip
```
```
sudo apt install curl
```
```
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
```
```
sudo python get-pip.py
```
バージョン確認
```
pip --version
```
apt update
```
sudo apt update
```
apt upgrade
```
sudo apt upgrade
```
# pip3 もインストール
```
sudo apt install python3-pip
```
```
pip3 --version
```
# あとはご自由にpip install 
```
sudo pip install matplotlib
...
```

# 参考

Ubuntuでpip/pip3がインストールできないときの対処法 | Python：
https://www.bioerrorlog.work/entry/install-pip-pip3-ubuntu
HackTheBox Writeup: Dancing

## 概要
HackThebox:Dancingのflagを入手する手順を記す。

## Port Scan
```terminal
$ nmap -F -sV dancing.htb
Starting Nmap 7.92 ( https://nmap.org ) at 2022-09-13 11:34 EDT
Nmap scan report for dancing.htb (10.129.78.51)
Host is up (0.25s latency).
Not shown: 97 closed tcp ports (conn-refused)
PORT    STATE SERVICE       VERSION
135/tcp open  msrpc         Microsoft Windows RPC
139/tcp open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp open  microsoft-ds?
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.92 seconds
```
SMBプロトコルを提供していることが分かる。

## SMB
最初にShareのリストを表示する。
パスワードは空でログインできた。
```terminal
$ smbclient -L \\\\dancing.htb\\      
Password for [WORKGROUP\kali]:

        Sharename       Type      Comment
        ---------       ----      -------
        ADMIN$          Disk      Remote Admin
        C$              Disk      Default share
        IPC$            IPC       Remote IPC
        WorkShares      Disk      
Reconnecting with SMB1 for workgroup listing.
do_connect: Connection to dancing.htb failed (Error NT_STATUS_RESOURCE_NAME_NOT_FOUND)
Unable to connect with SMB1 -- no workgroup available
```
次にWorkSharesにログインを試みる。

```terminal
$ smbclient \\\\dancing.htb\\WorkShares
Password for [WORKGROUP\kali]:
Try "help" to get a list of possible commands.
smb: \>
```
flagを探す。
```terminal
smb: \> ls
  .                                   D        0  Mon Mar 29 04:22:01 2021
  ..                                  D        0  Mon Mar 29 04:22:01 2021
  Amy.J                               D        0  Mon Mar 29 05:08:24 2021
  James.P                             D        0  Thu Jun  3 04:38:03 2021

                5114111 blocks of size 4096. 1731803 blocks available
smb: \> cd James.P
smb: \James.P\> ls
  .                                   D        0  Thu Jun  3 04:38:03 2021
  ..                                  D        0  Thu Jun  3 04:38:03 2021
  flag.txt                            A       32  Mon Mar 29 05:26:57 2021

                5114111 blocks of size 4096. 1731846 blocks available
smb: \James.P\> get flag.txt
getting file \James.P\flag.txt of size 32 as flag.txt (0.0 KiloBytes/sec) (average 0.0 KiloBytes/sec)
```
無事flag.txtをダウンロードできたので完了。
HackTheBox Writeup: Fawn

## 概要
HackTheBox:Fawnのflagを入手する手順を記す。

## Port Scan
とりあえずnmap
```terminal
nmap -F -sV fawn.htb  
Starting Nmap 7.92 ( https://nmap.org ) at 2022-09-13 11:19 EDT
Nmap scan report for fawn.htb (10.129.193.119)
Host is up (0.25s latency).
Not shown: 99 closed tcp ports (conn-refused)
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 3.0.3
Service Info: OS: Unix

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 2.35 seconds
```
ftpが提供されていることが分かる。

## FTP
とりあえずanonymousでログインできるか試す。
(詳しくは「anonymous ftp」でググれば出る)
```terminal
$ ftp fawn.htb
Connected to fawn.htb.
220 (vsFTPd 3.0.3)
Name (fawn.htb:kali): anonymous
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp >
```
無事ログインできたのでflagを探す。
```terminal
ftp> ls
229 Entering Extended Passive Mode (|||58592|)
150 Here comes the directory listing.
-rw-r--r--    1 0        0              32 Jun 04  2021 flag.txt
226 Directory send OK.
ftp> get flag.txt
local: flag.txt remote: flag.txt
229 Entering Extended Passive Mode (|||59144|)
150 Opening BINARY mode data connection for flag.txt (32 bytes).
100% |***********************************************************************|    32       26.23 KiB/s    00:00 ETA
226 Transfer complete.
32 bytes received in 00:00 (0.12 KiB/s)
```
無事flag.txtをダウンロードできたので完了。
Window10のバッチで特定アプリが起動しているかどうか判定

# やり方

```bat
rem タスクリストから対象のyuruyuri.exeの起動数を取得してapp_count_という名前の変数に格納。
FOR /F "DELIMS=" %%A IN ('tasklist ^| find /C "yuruyuri.exe"') DO SET app_count_=%%A

rem 対象exeの起動数が0なら落ちてると判定。（数値の判定は==ではないので注意）
rem 結果をbatと同じフォルダーのlog.txtに出力。
IF %app_count_% equ 0 (
	ECHO おちてるよ >> log.txt
) ELSE (
	ECHO おちてないよ >> log.txt
)
```

# 参考サイトさん

https://tooljp.com/bat_qa/Sample-process-for-determining-whether-a-process-is-running-1D33.html

https://www.k-tanaka.net/cmd/find.php

https://jj-blues.com/cms/wantto-comparenumber/

https://maku77.github.io/windows/io/set-command-result.html

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889

TODO:tasklist、find、コマンド結果の変数格納、数値のif判定、の一つ一つに単技術について記事さくせ