OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelを触ってみたので基礎を振り返ってみる

# Laravelでの開発の流れ
ハッカソンでバックエンド担当としてLaravelを使用しましたので、基本的な開発の流れを書いておこうと思います。

## 前提
- 環境構築が終わっていること
  - Laravel 8.x
  - PHP 7.x

とします。

## MVCを何となく理解する
![0ea88fa012e77de8e76f47a6b3c61d9c4b7a012a73cae73c9d55639b695f12c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2564369/b7f57dde-b07f-0107-6e1a-917306a9a7a7.png)

参考: [Laravel学習帳](https://laraweb.net/surrounding/922/)

- MVCとは
  - Model
  - View
  - Controller

の３つの事を指します。
このMVCと、ルーティング、DBがあるんだな～ぐらいで最初は大丈夫です！

## HelloWorldを表示するまでの流れ
参考: [Laravel で HelloWorld](https://qiita.com/ekzemplaro/items/c74e7431a8a90e2feb03)
バージョンが合っていませんが、こちらの流れに沿っていけば表示されますので大丈夫です。
同バージョンの場合[Laravel インストール HelloWorld](https://syslog.life/2020/10/20/laravel-%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB-helloworld/)


大まかな流れとしては、
1. Controllerの作成
2. Routingの作成
3. BladeでViewの作成
4. サーバーの起動

4ステップでもう見れるんですね！
記述内容は上記の参考サイトを参考にしていただいて、ポイントを記述したいと思います。

## Controllerの作成
作成には2パターンあります。
ターミナルでコマンドを打つと作成されるパターン or 対象ディレクトリ内に手動でファイル名を打って作成するか。


- コマンドで作成
  - php artisan make:controller コントローラ名
- 手動で作成
  - app -> Http -> Controllers内に「 ~ Controller.php」という名前で作成

:::note warn
Controllerファイルはキャメルケースで最後がController.phpという名前で決める決まりがあります。
:::

## Routingの作成
Routesディレクリ内のWeb.phpに記述します。

:::note warn
※Laravel8では
```c
Route::get('hello', 'App\Http\Controllers\HelloController@index');
```
このようにAppから順にコントローラーの場所を指定しなくてはいけません。
:::

参考: [Laravel8 新しいルーティングの書き方](https://kawax.biz/laravel8-routing/)
他のアプローチや詳しい事が書いてあります。

```c
Route::get('hello', 'App\Http\Controllers\HelloController@index')->name(hello);
```
->name(名前)のように別名を付ける事が出来ますが、注意なのはControllerでは指定できません。Viewファイル(Blade)でルーティングを指定するときに指定することができます。

その際には url('/hello') -> route('hello')のように記述の仕方が変わります。
利点としてはルーティングを変更した際に名前で指定してれば、Viewファイルを書き直さなくて良いという点があります。

## Viewの作成
Resources -> viewsディレクトリ内に作成します

:::note warn
ファイル名の最後は「ファイル名.blade.php」というように名前にするのが決まりです。
bladeという名前が出てきたら「あっ、Viewファイルのことだな！」と思ってください。
:::

html, cssのような記述方法で記述可能です。
formやCSSのファイルを指定する際などに {{ }} の中に記述する場合があります。
ファサードと呼ばれる物で、筆者もまだ詳しくは分かっておりません。(奥が深いです...)
適宜必要な場合に使用していく感じで良いと思います。

## サーバーの起動
ターミナルでコマンドを打ち込む事で起動します。
環境次第でここは変わってきます。

```c
php artisan serve
```
このコマンドが基本となります。

ローカル環境の場合、
XAMPPであればXAMPPでWebサーバを立ち上げれば見れますし、
DockerであればDockerでWebサーバを立ち上げれば見れます。


# まとめ
今回はモデルに関しては触っていませんが、DBにデータを入れてそれをいじる際にモデルを作成していじっていく事になります。

MVCは最初は慣れないかもしれませんが、慣れてくるとどこに何が書いてあるのか分かりやすく、問題を切り分けて考える事が出来ますので、色々いじって慣れていきましょう！
A型事業所を利用する前にしたこと

こんにちは。

二度目の梅雨明けのような晴天ですね。
今日もA型事業所にきています。

さて、今日はA型事業所の利用の前にやっていたことをちょっと書きたいと思います。
A型事業所は興味を持たれる方が多いのか、記事もよく読まれているようです。
同じような境遇の方の参考になればと思いますので参考にしてみてください。

# A型事業所利用のきっかけ

私は一般の大学に通っていました。
そこは中退してしまったのですが、その時の友人とやり取りをする機会があり、彼は障害者雇用で総務の仕事をしているようでした。
最近になり、社会保険労務士の試験を受けているようで、いろいろと情報交換をする機会がありました。

ちょっと話題にのぼったのが「**社会との接点を作る**」という目的で、どんな感じかなとA型事業所を利用してみるのは良いのではないか、ということでした。

いまのところだけ見ていたわけではなく、ほかのA型事業所も見ていました。
事業所によって、だいぶ事情や環境が違うようで環境を選ぶというところではいくつか見てみたほうがいいなと思います。
相性の問題だと思いますが、合う合わないがあります。

## それより前のはなし
A型事業所を見学、体験する前は、まずは**よくやすみ**ました。
自分で簡単な案件を受けたりして、副収入程度に収入を得ていたのですが、生活のメインは**障害年金**でした。
統合失調症の場合は、年金も比較的とれるようで、それをメインに生活していた感じです。

大学にも長くいましたが、やめた後数年はふらふらしていました。
地元に戻ってきて、しばらくはおやすみをしっかりして、趣味程度に案件をこなしつつ、散歩ができるようになってきたら、**ポケモンGo**をしていました。

いまの事業所のサービス管理者の方からそういうおはなしも聞いたのですが、パソコンが得意で、いまの事業所を希望される方はやはり多いんだそうです。
でも、体力がなかったり、会社までこれなくて、利用に至らないケースもあるんだそう。

私の場合は散歩ができてきたら、とにかく外に出てポケモンGoをしました。
一時期は案件はほどほどにポケモンGoでたくさん歩くことを目的に日々過ごしていた時もありました。

早稲田メンタルクリニックの益田先生という方がYouTubeで療養の順番として、まずは「やすむ環境を整えて」「しっかり休む」それができてきたら「散歩」をして、その次は「**読書**」をすると良い。というおはなしをされていたので、私も本を読むようにしました。

実家に戻ってやすみはじめてから、案件を受けつつ、ポケモンGoをする生活も5,6年続いたと思います。
そこから、世の中がコロナショックで外に出れなくなってきました。


## コロナショックというきっかけ

コロナをきっかけに世の名がだいぶ変わりましたね。
私の場合もいくつか転機になりました。

まず、大学の卒業をあきらめました。
その前はなんとか前にいた大学を卒業できないかと考えていたのですが、その道を諦めて、学位授与機構というところで学位をとる道を選択しました。

いまは放送大学で学んでいて、単位が取り終わりそうなので、今年の終わりころに、学位の試験を受けに行く予定です。レポートもやらないといけないので、ちょっと忙しい感じですね。
学位授与機構については、調べてみてから行動に移すと良いと思いますが、私は前の大学ではほとんど単位が取れていたので、学位をとるところまではもうちょっとです。頑張っています。

仕事に関しても、それまで、ちょくちょく案件を請ける生活を送っていたのですが、そのまま**規模を大きくしていくのではうまくいかないな**と感じました。
**趣味を広げて大きくして仕事にしていくという発想ではうまくいかず**「仕事としてやっていくぞ。」という風にならないといけなかったのですが、モチベーションが足りず、同じことを10年くらいやって**活動に飽きてきていた**こともあって、A型事業所をきっかけに仕事をはじめる決意をした感じでした。

## これからの予定
まだプランは練っている最中ですが、最低でも一年はこちらのA型事業所は利用したいなと思います。
一年の実務経験があれば案件を請けたり、ほかの企業に勤めたりもしやすくなるので、ちょっとずつ経験を積んでやっていく感じかなと思います。

最近は、体験の段階ですが、もうすでに案件を請け始める準備がはじまっていて、来週か再来週くらいにはきている案件に着手する予定です。
最初はJavascriptの案件をやっていく感じになると思いますので、しっかりと身につけていきたいと思います。

## 今日のまとめ
今日のエントリーはこんな感じです。
来週から、出勤が月・木・金になると思いますので、また記事を書く頻度が高くなると思います。
今日からmarkdownの記法も試してみています。
これからちょっとずつ身に着けたいと思いますので、みなさんどうぞ、温かく見守っていただけるとありがたいです。

それでは、今回はこんなところで。
Laravel 9 の日本語化

初心者の備忘録。
Laravel9を昨日から始めたので、備忘録がてら記録しておく。

Laravel、認証周りのBreezeの初期画面までは立ち上げられた。
その後の日本語化で地味につまづいた。

最終的にはこれらの記事を読んで、解決した。
https://qiita.com/nekyo/items/eba7f145a71a5d04b57d
https://qiita.com/rikua0023/items/6384075345b1d14dc9e3
https://qiita.com/yoshidashuntarou/items/160f1e49409223c7da63

# 手順
1.`config/app.php`を以下のように日本の設定に変更する。
`'timezone' => 'Asia/Tokyo'`
`'locale' => 'ja'`
`'faker_locale' => 'ja_JP'`

2.下記のコマンドを打つ。
```powershell
php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"
```
すると、`resources/lang/ja`というディレクトリの中に、`auth.php`, `pagination.php`, `passwords.php`, `validation.php`というファイルができる。
3.`resources/lang/`下に`ja.json`というファイルを作成し、以下のようにする。
```json:resources/lang/ja.json
{
    "Login":"ログイン",
    "E-Mail Address":"メールアドレス",
    "Password":"パスワード",
    "Remember Me":"ログイン状態を保存する",
    "Forgot Your Password?":"パスワードをお忘れですか ?",
    "Register":"登録",
    "Name":"お名前",
    "Confirm Password":"パスワード(確認用)",
    "Reset Password":"パスワードリセット",
    "Send Password Reset Link":"パスワードリセットリンク送信",
    "Logout":"ログアウト",

    "Verify Your Email Address":"ユーザ登録を完了してください",
    "A fresh verification link has been sent to your email address.":"新しいリンクをあなたのメールアドレスに送信しました。",
    "Before proceeding, please check your email for a verification link.":"メールに記載されているリンクをクリックして、登録手続きを完了してください。",
    "If you did not receive the email":"メールが届いていなければ、",
    "click here to request another":"こちらをクリックして再送信してください。",

    "Please click the link below to verify your email address.":"メールアドレスを確認するために下のリンクをクリックしてください。",
    "Verify Email Address":"メールアドレス確認",
    "If you did not create an account, no further action is required.":"心当たりがない場合は、本メッセージは破棄してください。",

    "Click button below and reset password.":"下のボタンをクリックしてパスワードを再設定してください。",
    "Reset password":"パスワードリセット",
    "If you did not request a password reset, no further action is required.":"心当たりがない場合は、本メッセージは破棄してください。"
} 
```
4.日本語化ができていない部分を確認し、上記の`ja.json`に追加する。

以上。

# 解説
・`fallback_locale`はそのままの`en`のほうがいいみたい。日本語ファイルがなかったときに、enファイルにいかせるようにする。
・`faker_locale`はテストデータをFakerするときに日本語化してくれるようだ。
・`resources/lang/ja/`内のファイルはバリデーションの日本語化を担当。
・`ja.json`と`resources/lang/ja/****.php`の違い：
bladeファイル内で`{{__('hello')}}`と書かれている場合、日本語だとresources/lang/ja.jsonを参照し、
```json:resources/lang/ja.json
{
    "hello" : "こんにちは"
}
```
で、「こんにちは」と表示される。
一方、bladeファイル内で`{{__('messages.hello')}}`と書かれている場合、日本語だとresources/lang/ja内のmessages.phpファイルを参照し、helloというキーを参照し、
```php:resources/lang/ja/messages.php
<?php

return [
'hello' => 'こんにちは'
];
```
こちらも「こんにちは」と表記される。
【SwiftUI】iOS15から発生するPickerのバグ

# はじめに
iOS14では機能していたコードがiOS15で突然挙動がおかしくなるバグに遭遇しました。
解決方法が分かる方はコメントください。

# 条件
- iOS15
- スタイルが`wheel`

# 仕様？バグ？
まず前提として、なぜか`Picker`スタイルが`wheel`だと`frame`だけでサイズ変更する事ができません。
`clipped()`を追加する必要があります。
```diff_swift
import SwiftUI

struct ContentView: View {
    @State var index: Int = 0
    var body: some View {
        Picker("", selection: $index) {
            ForEach(0..<5) { i in
                Text("選択肢\(i + 1)")
            }
        }
        .labelsHidden()
        .pickerStyle(.wheel)
        .frame(width: 150, height: 60)
+       .clipped()
    }
}
```
このようになりました。
![スクリーンショット 2022-07-08 11.15.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/008f9509-86ac-84aa-fdb0-940b200e3baa.png)
「ちゃんとサイズ変更できてるじゃん。」と思うかも知れませんが、これには問題があります
![Videotogif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/b85dd1b1-eb24-eb00-fc87-0cc6045d05ca.gif)
「えぇ、Pickerじゃない所をスクロールしても反応してる！！」
そうなんです。なぜかPickerがリサイズ出来てないんです。
見た目だけ変わっていて機能は元の範囲まであるっていう落とし穴なんですね
![スクリーンショット 2022-07-08 11.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/dbd3482c-cae8-da27-8d32-bf91f1499c2a.png)

# 解決に向けて試した事
このツイートを発見した時、「おぉ！」と思いました。
`clipped()`は見た目だけ変更される仕様だったっぽいです。
じゃあ`.contentShape(Rectangle())`を付けたらなおる？と思い試してみました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">気づいたのだけど、.clipped()だと見えていないだけで .onTapGesture() に反応してしまう様です。<br><br>.contentShape(Rectangle()) を最後につけることでタップもできない様になりました。<br><br>Gridで表示する時に隣のセルをタップしてたりしてハマってしまいましたよと。<a href="https://twitter.com/hashtag/SwiftUI?src=hash&amp;ref_src=twsrc%5Etfw">#SwiftUI</a> <a href="https://t.co/DR4XQ0TzQX">pic.twitter.com/DR4XQ0TzQX</a></p>&mdash; shohe@iOS developer (@ShoheOhtani) <a href="https://twitter.com/ShoheOhtani/status/1542666646325669888?ref_src=twsrc%5Etfw">July 1, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

```diff_swift
import SwiftUI

struct ContentView: View {
    @State var index: Int = 0
    var body: some View {
        Picker("", selection: $index) {
            ForEach(0..<5) { i in
                Text("選択肢\(i + 1)")
            }
        }
        .labelsHidden()
        .pickerStyle(.wheel)
        .frame(width: 150, height: 60)
        .clipped()
+       .contentShape(Rectangle())
    }
}
```
結果は、、、解決せず、、、
先ほどと同じ結果となりました。

# 似たような内容の記事
https://developer.apple.com/forums/thread/687986

https://stackoverflow.com/questions/65630511/how-to-change-swiftui-picker-view-size-with-no-additional-space

# おわり
解決方法が分かる方はコメントください。
pandasをマスターしたい生活3日目

## これまで
https://qiita.com/Hayaa6211/items/abbacfe935c9bd1fc78e  

https://qiita.com/Hayaa6211/items/4c3b847b7a9a57747d32

## よく使えるやつ
```python
df.index                     #indexの表示
index = df.index.tolist()    #indexの中身をリストにする
type(index)
>>> List

df.columns                    #カラムの表示
columns = df.columns.tolist() #カラムの中身をリストにする
type(columns)
>>> List
```

### index,columns名の変更
```df.rename(index={"index名":"変更したいindex名"},columns={"columns名":"変更したいcolumns名"})```
```python
df = pd.DataFrame({"A":[1,2,3,4,5],"B":[10,9,8,7,6]})
df = df.rename(index={0:"zero"})
print(df.index.tolist())
>>> ["zero",1,2,3,4]
```

```python
df = df.reaname(columns={"A":"A_rename"})
print(df.columns.tolist())
>>> ["A_rename","B"]
```

### データの並び替え

```df.sort_values(by="並び変えたいcolumns",ascending=True,inplace=False)```
- by:columns名
- ascending:降順か昇順か(Trueで昇順)
- inplace:元のdfを置き換えるか(戻り値はnull)
```python
df_sorted = df.sort_values(by="B")
df_sorted["B"].tolist()
>>> [6,7,8,9,10]

df_sorted_ascending = df.sort_values(by="A_rename",ascending=False)
df_sorted_ascending["A_rename"].tolist()
>>>[5,4,3,2,1]

df_sorted_2 = df.sort_values(by=["A_rename","B",ascending=[False,True]]
```

### dfの演算
numpy配列みたいにそれぞれに演算を適用できる

```python
df["A*B"] = df["A_rename"] * df["B"]
df["A*B"].tolist()
>>> [6,14,24,36,50]
```

### 関数を用いた列の演算
- ```df.apply(関数)```

```python
import math
df["A_SQRT"] = df["A_rename"].apply(lambda x: math.sqrt(x))
```

### 列の削除
- ```df.drop(列名,axis=1)```
- ```df.drop([列名1,列名2],axis=1)```

### 列の結合
```pd.concat([df1,df2],ignore_index=False)```
- ignore_index:indexを振りなおすかどうか


### mergeによる結合
```pd.merge(df1,df2,how="結合方法",on="結合キー")```
- df1:左側のdf
- df2:右側のdf
- how:結合方法
    - inner:内部結合
    - left:左外部結合
    - right:右外部結合
    - outer:完全外部結合
- on:結合キー

### おわり
mergeよくわからん
Octave で一元配置分散分析

# Octave で一元配置分散分析

各群の分散が等しいと仮定して検定を行う。

    usage:
    [pval, f, df_b, df_w] = anova (y, g)
    
    y は測定値ベクトル，g は測定値がどのグループのものかを示すベクトル
    戻り値を指定しない場合は分散分析表を表示する
    戻り値を指定した場合は，後で変数を使用する（表示するなど）ことができる


## 使用例 1

分散分析表を表示する。


```matlab
% statistics が必要
pkg load statistics

% 表示精度を高くする（任意）
format long
```


```matlab
y = [62.76; 51.52; 42.27; 53.28; 46.12; 45.28; 66.35; 51; 44.74;
    44.97; 47.88; 47.1; 53.65; 49.51; 44.5; 41.63; 46.07; 48.27;
    44.41; 40.98; 44.75; 67.46; 41.14; 36.35; 56.11; 52.02; 44.62;
    41.6; 53.21; 51.65];

g = [2; 2; 3; 1; 3; 1; 3; 2; 1; 1; 2; 1; 2; 2; 2; 2; 2; 3; 2; 3;
    3; 2; 1; 3; 3; 3; 3; 1; 1; 2];


anova(y, g);
```

    
    One-way ANOVA Table:
    
    Source of Variation   Sum of Squares    df  Empirical Var
    *********************************************************
    Between Groups              113.8232     2        56.9116
    Within Groups              1439.2585    27        53.3059
    ---------------------------------------------------------
    Total                      1553.0817    29
    
    Test Statistic f              1.0676
    p-value                       0.3579
    


## 使用例 2

結果を変数に代入し，後で使用する。変数名はどのように決めてもよいが，変数が何を表すかの順序は変えることができない。


```matlab
[pval, F, df_b, df_w] = anova(y, g);
F
pval
```

    F = 1.067641881484378
    pval = 0.357891110019130



```matlab
printf("F = %.5g,  df_b = %d,  df_w = %d,  p value = %.5g\n", f, df_b, df_w, pval)
```

    F = 1.0676,  df_b = 2,  df_w = 27,  p value = 0.35789


必要のないものが後ろのほうにある場合には指定しないだけでよい。


```matlab
[pval, F] = anova(y, g);
F
pval
```

    F = 1.067641881484378
    pval = 0.357891110019130


必要のないものが前のほうにある場合にはその場所に `~` を書けばよい。


```matlab
[~, F] = anova(y, g);
F
```

    F = 1.067641881484378
ReactでCORSエラー

# 概要
サーバサイドが得意なエンジニアですが、フロントエンドも少し勉強しようと思ってReactの学習はじめました。

最近勉強してもすぐ忘れます(>_<)

Reactでaxiosを使って外部API(Amazon API Gatewayで作ったMockのAPI)を呼び出した時にCORSエラーが出て色々調べた結果やっとこの設定で動いたというのを自分のために記録しておきます。

表示されたエラー
```
Access to XMLHttpRequest at 'https://hoge-foo-piyo.amazonaws.com/dev/users' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
```


## Proxyを使えばいいらしい？
色々と調べて```http-proxy-middleware```をインストールしてproxyを使えば簡単に出来るということは分かりましたが、なかなか表示されない。暑い中イライラ。今年の夏も暑いですね(>_<)

## 出来たこと
```http-proxy-middleware```は問題なくインストール出来た。

でもなんかProxyの設定がうまくいかない。

## 結論
(1)src配下に、```setupProxy.js```を作る。
色々調べるとだいたいこのファイル名ですが、このファイル名でないとどうなるんだろう？あとで確かめてみる。

(2)```setupProxy.js```の中身をこれにしたらうまくいきました。
```
const { createProxyMiddleware } = require("http-proxy-middleware");

module.exports = function (app) {
  app.use(
    "/dev/users",
    createProxyMiddleware({
      target: "https://hoge-foo-piyo.amazonaws.com",
      changeOrigin: true,
    })
  );
};
```

(3)axios側
```axios.get("/dev/users")```と書くと、

アプリ側からの```http://localhost:3000/dev/users```というリクエストが```https://hoge-foo-piyo.amazonaws.com/dev/users```に転送されて外部APIからデータを取得出来ました。

## 参考にしたサイト
[react開発時に特定のリクエストを外部サーバへ転送する方法](https://ufirst.jp/memo/2021/09/29/react%E9%96%8B%E7%99%BA%E6%99%82%E3%81%AB%E7%89%B9%E5%AE%9A%E3%81%AE%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92%E5%A4%96%E9%83%A8%E3%82%B5%E3%83%BC%E3%83%90%E3%81%B8%E8%BB%A2%E9%80%81/)
以上
Reactを基本からまとめてみた【28】【React-paginate】

## 環境の準備
①ターミナルでreactアプリケーションを作成する。

```
$ npx create-react-app <プロジェクト名>
$ cd <プロジェクト名>
$ npm start
```
② 必要なパッケージをインストールする。
```
$ yarn add react-paginate
```

## 参考サイト
[React js Pagination With API Call Using React-paginate](https://www.youtube.com/watch?v=kMuRr53RjcE)
addSubviewしたカスタムビューのUIButtonが押せない時

# はじめに
xibでカスタムビューを作成し、viewControllerでaddSubviewしたのですが、カスタムビュー内のUIButtonをタップしても反応してくれなかったので対処法をメモ
# 原因
カスタムビューのサイズ指定をviewControllerではなくカスタムビューで行っていました。
```CustomView.swift
final class CustomView: UIView { 

  @IBOutlet private weak var button: UIButton!
  
  init() {
    let view = UINib(nibName: "UpperSearchView", bundle: nil).instantiate(withOwner: self, options: nil).first as! UIView
    view.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 50) //カスタムビューでサイズ指定
    addSubview(view)
  }
}
```
# 対処法
カスタムビューのサイズ指定をviewControllerでaddSubviewした後に行います。
```ViewController.swift
final class ViewController: UIViewController {

  @IBOutlet private weak var containerView: UIView!
  private let customView = CustomView()

  override func viewDidLoad() {
    super.viewDidLoad()
    containerView.addSubview(customView)
    customView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: 50) //viewControllerでサイズ指定
  }
}
```
# さいごに
他にもviewControllerにタップされた時のメソッドを追加し、addTargetすることでも可能ですが、今回は一番手っ取り早い方法で対応しました。
以上です。
angularのroutingに挟むguard


```
> ng generate guard guard-name
```
が使える

生成された後はこんな感じで書いて
```
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree,  Router } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class MyAuthGuard implements CanActivate {
  constructor(private router: Router) {}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    // return false;
    return this.router.parseUrl('/auth?url='+state.url);
  }
  
}
```

こんな感じで書けばOK
app.routing.ts
```

export const routes: Routes = [
  {
    path: 'pages',
    component: Pages,
    canActivate: [MyAuthGuard],
```
MacでのHomeBrewのインストールのメモ

# はじめに
タイトルに書いたように、MacにHomeBrewをインストールを試みたところしょぼいミスをしたので忘れないようにメモ。

# インストール方法
まずは当方の環境。
- OS : macOS Monterey(ver 12.2.1)　※Mac mini(M1 2020)
- チップ : Apple M1
- メモリ : 8GB

インストール方法については、公式サイトを確認する。
https://brew.sh/index_ja

Macのターミナル上で、以下のコマンドを実行すれば良い。
```
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
コマンドを実行すると、インストール状況がターミナル上に出力される。
途中でキーボード操作が必要となる箇所があるため★で補足。

```
==> Checking for `sudo` access (which may request your password)...
Password:　★★sudoで実行するためMacのユーザパスワードを入力。★★
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew

Press RETURN/ENTER to continue or any other key to abort:　★★エンターキーを入力。★★
==> /usr/bin/sudo /usr/sbin/chown -R ****:**** /opt/homebrew
==> Downloading and installing Homebrew...

※※　途中は省略　※※

==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ユーザ名/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
    https://docs.brew.sh
```

Installation successful!
が出力されているので、インストールは無事成功している（ハズ）と思い、以下のコマンドを実行してHomeBrewのバージョンを確認。
```
% brew -v
zsh: command not found: brew
```
はい、動きませんね(；´Д｀)
エラーの内容的にPATHが設定されていないか、そもそもインストールが失敗しているか、というところと思います。
改めて先程のターミナル上のログを参照してみると、、
```
- Run these two commands in your terminal to add Homebrew to your PATH:
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ユーザ名/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
```
実行すべきコマンドが不足してますね・・・
以下のコマンドを実行（ユーザ名は各環境で違うと思うので、適宜修正）
```
% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/ユーザ名/.zprofile
% eval "$(/opt/homebrew/bin/brew shellenv)"
```
この状態でまたコマンドを実行すると、
```
% brew -v   
Homebrew 3.5.4
Homebrew/homebrew-core (git revision f85ce66fab3; last commit 2022-07-07)
```
バージョンが表示されたので正常にインストールされていることが確認できました。

# 最後に
インストール時には、ターミナルに出力されているメッセージはきちんと読みましょう・・・
GoogleAnalyticsで、どの項目をインポートすべきか悩んで結局使った項目例

Power BIのGoogle Analyticsコネクター接続手順を検索をすると、解説した情報は多くあるので、接続自体は簡単なのですが、接続後、ナビゲータ画面から、どの項目を使ったら良いのか悩みます。

やりたい事は、弊社アルファーコミュニケーションズの会社Webサイトで、以下を可視化するような項目取得です。
* 主に、どのメニューが、どれだけ参照されているのか？
* どのページが、どれだけ参照されているのか？
* ブログの人気ページは何か
* 外部メディアへの案内や投稿へ貼り付けたリンクからの流入は何処からなのか？(いわゆるキャンペーンのトラッキングを参照したい)

PowerBIのGoogleAnalyticsコネクターで取得できるディメンジョン（文字項目）数は9種類までの上限がありますので、試行錯誤の結果、以下項目を取得しています。
![取得項目表](https://alpcom.co.jp/cms/wp-content/uploads/image-92-1024x469.png)
その中でSource / Medium、Page path level 1、Page Titleは、そのまま用いず、変換や分類テーブルと組み合わせ使用しています。

詳しい解説を弊社ブログでご紹介しております。
[https://alpcom.co.jp/blog/20220708/](https://alpcom.co.jp/blog/20220708/?utm_source=Qiita&utm_medium=post&utm_campaign=yas&utm_id=20220708)
ブラウザのタブをメモ帳化するURL文字列。ファビコンあり。

# Chromeなどのブラウザをメモ帳に

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/1d7fa92d-c2e4-c232-091b-75f1ff182bda.png)
https://twitter.com/lotz84_/status/1543915415491194880?s=20&t=E0akFH9EHfUINlaij_9ayA
こちらの方のtweetでバズっていた、
Chromeなどのブラウザを書き込み可能なメモ帳にするというURL文字列。
```HTML
data:text/html,<html contenteditable>
```
これをブラウザのURL欄に入れると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/2b8a79cd-02e5-cddb-69e1-cb0ba271d578.png)
タグの中に自由に書き込めるメモ帳になる。画像を貼ったりも可能。

# タブを閉じる前に警告する機能
メモ帳であるならば、タブを閉じたときに急に消えてしまうと困ることがあるので、
閉じる前に警告を出したい。ということで
こちらの方のtweetで警告が出るように追加したテキストが提案された。
https://twitter.com/yamorimoremi/status/1544003778973556736?s=20&t=E0akFH9EHfUINlaij_9ayA
```HTML
data:text/html,<html contenteditable> <script>onbeforeunload = ( ) => true</script>
```
これだと、メモ帳にしたタブを閉じようとすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/4390dac1-7344-f3b0-44bf-9c52e92df65a.png)
と警告してくれるようになった。

# ブックマークしたときのアイコン（ファビコン）を絵文字で設定

これは便利ということで、この文字列をブックマークして使おうと思う。
そうなると、ブックマークバーの上のアイコン（ファビコン）を設定したくなる。
（↓こういうやつ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/62d6a765-4835-dbcd-a3c7-6d6f99dc7dd8.png)
通常ファビコンは画像ファイルを用意する必要があるが、やはりテキストで済ませたい。そこで絵文字を設定する。
（参考URL）https://zenn.dev/catnose99/articles/3d2f439e8ed161
で、できたのがこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/3cb8f2ed-cc62-4226-a9d1-8124135b7356.png)
URLバーに貼り付ける文字列はこちら。
```HTML
data:text/html,<html contenteditable><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text x='50%' y='50%' style='dominant-baseline:central;text-anchor:middle;font-size:90px;'>📝</text></svg>"><title>メモ</title><script>onbeforeunload=()=>true;</script>
```
文字列の後ろの方のこの絵文字部分を変更すれば、好きな絵文字をアイコン（ファビコン）に設定できる。
またタイトルも変更すれば、好きなタイトルにできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/908810a0-4295-625f-1125-862f0c12b8f2.png)

笑顔（😀）の絵文字にすると、😀になる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/14076370-977f-8955-9a8a-74234505c99e.png)

# フォントサイズを変える
こちらの方のtweetにて、フォントサイズの変更が提案されていた。
https://twitter.com/QFTlover/status/1544136581161689089?s=20&t=PIXnxwikwIQbahCW-yjArA
最初の<html>タグの中に、style="font-size:20em"を追加するというもの。
実際にやってみると、巨大なメモ帳となった。とっさにブラウザでカンペを出したいときなどに便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/cd9315fb-4478-8073-1e6b-90fbf12db8be.png)
文字サイズ変更を加えた文字列がこちら。font-sizeの後の数字を変えると調整できる。
```HTML
data:text/html,<html contenteditable style="font-size:20em"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><link rel="icon" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text x='50%' y='50%' style='dominant-baseline:central;text-anchor:middle;font-size:90px;'>%F0%9F%98%80</text></svg>"><title>%E3%83%A1%E3%83%A2</title><script>onbeforeunload=()=>true;</script>
```



# おわりに
参考にさせていただいたtwitterの皆様、Webサイトの皆様、たいへん勉強になる知見をいただきました。ありがとうございます。
Self-Registration in a Portal  > Assign the Login Flow and Test It in Your Portal


[Trailhead関係　個別の課題別 に戻る](https://qiita.com/Keiji_otsubo/items/56eb7a90bb72138ece1f)

https://trailhead.salesforce.com/ja/content/learn/modules/selfregistration-in-a-portal/assign-the-login-flow-and-test-it-in-your-portal

# エラーメッセージ

+ 何もしないでチェックした場合
**Assign the 'Privacy Settings' flow to the 'Customer Account Portal' profile as the login flow.**
ログインフローとして、「プライバシー設定」フローを「顧客アカウントポータル」プロファイルに割り当てます。


# その他の資料

+ [Canot select Checkbox: Render Flow in Lightning Runtime](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HDqo1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/c46dbd38-1555-9beb-be0f-7af4a57d0dab.png)


[Set the Runtime Experience for URL-Based Flows](https://help.salesforce.com/s/articleView?language=en_US&type=5&id=sf.flow_distribute_internal_lexruntime.htm)

この設定がないのでは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/43bb3dad-9c57-188d-1290-9bec8c8e19be.png)

# よくわからん

+ [Stuck in Self-Registration in a Portal-> Assign the Login Flow and Test It in Your Portal](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000JfcAr)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/5e0ac426-dcf3-1b06-bee0-70ac0a755493.png)

:::note
As per your instructions I went to

Users-->Mary Hollywood --> and Reset Password manually. I received a link to rest password on my mail. After that I those 3 checkboxes are appeared successfully.
:::


# CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY

+ [Self-Registration in a Portal Assign the Login Flow and Test It in Your Portal - FLOW NOT WORKING](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000O6bhLSAR)

UPDATE RECORDS: Update Contact with Individual
Find all Contact records where:
Id Equals {!UserInfo.ContactId} (0033t00004Ae5H7AAJ)
Update the records’ field values.
IndividualId = {!individualId} (0PK3t000000Cvz8GAC)
Result
Failed to update records that meet the filter criteria.
Error Occurred: The flow tried to update these records: null. This error occurred: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY: entity type cannot be updated: Contact. You can look up ExceptionCode values in the SOAP API Developer Guide.

:::note
I actually solved the issue -- the problem was OWD settings for Contact object. 
It is now working as should and I was able to pass the challenge 


私は実際に問題を解決しました - 問題は Contact オブジェクトの OWD 設定でした。
現在は正常に機能しており、課題に合格することができました
:::


+ [【未解決】Module: Self-Registration in a Portal -> Assign the Login Flow and Test It in Your Portal -> No chance to fulfil this Modul because of the Error in the Flow "Required fields are missing: [LastName]"](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000E9d2a)

+ [【未解決】Looks like you don’t have access to create a case. Ask your community manager for access.](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007bLWyo)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/e4e1a0ad-3e37-13ca-52c2-041ec1b3856a.png)
firebaseAuthの開始方法およびfschuindt / firebase_id_tokenの実装をみる

# 概要
RailsでfirebaseAuthのJWTを用いて認証するまでの流れです。

# firebaseAuth
1. firebaseプロジェクト作成
1. firebaseAuth開始
<img width="400" alt="スクリーンショット 2022-07-08 10.29.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236425/8a819928-418e-8059-df2c-8e3f0337194f.png">

## （APIを直接実行する場合）
SDKではなくAPIを直接叩きたい場合は以下手順。（ユーザー作成APIの例）

### APIキー
プロジェクトの概要の右のアイコンから開ける
`https://console.firebase.google.com/u/0/project/{project_id}/settings/general`
<img width="400" alt="スクリーンショット 2022-07-08 10.31.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236425/810b8f40-4335-ebd9-abfd-68db18b03c07.png">

### ユーザー作成(idToken取得）
`POST https://identitytoolkit.googleapis.com/v1/accounts:signUp?key={{firebase-api-key}}`

### access_token(JWT)取得
`POST https://securetoken.googleapis.com/v1/token?key={{firebase-api-key}}`

`x-www-form-urlencoded`でbodyを指定
```
grant_type:refresh_token
refresh_token:{{上のrefresh-token}}
```

（補足）取得した`access_token`の内容はここで確認できる 

https://jwt.io/

# [fschuindt / firebase_id_token](https://github.com/fschuindt/firebase_id_token)
firebaseAuthのJWTを検証してpayloadを返すライブラリ
firebaseの推奨する検証方法に準じて実装している

https://firebase.google.com/docs/auth/admin/verify-id-tokens#verify_id_tokens_using_a_third-party_jwt_library

## 処理の流れ
1. [エントリーポイント](https://github.com/fschuindt/firebase_id_token/blob/master/lib/firebase_id_token/signature.rb#L54-L56)
1. [JWTに含まれるkidを取得](https://github.com/fschuindt/firebase_id_token/blob/master/lib/firebase_id_token/signature.rb#L74)
1. [kidに対応するGooglの公開鍵を取得](https://github.com/fschuindt/firebase_id_token/blob/master/lib/firebase_id_token/signature.rb#L81-L94)
1. [JTWを公開鍵で検証](https://github.com/fschuindt/firebase_id_token/blob/master/lib/firebase_id_token/signature.rb#L97)
　　1.　[参考](https://follmy.com/ruby-jwt-flow/)
1. [検証したpayloadを返す](https://github.com/fschuindt/firebase_id_token/blob/master/lib/firebase_id_token/signature.rb#L125-L140)

## payloadからユーザー情報を取得
[このライブラリ](https://github.com/penguinwokrs/firebase-auth-rails)などが利用していて、`before_action :authenticate_user`の実装だけでログインユーザーが取れるようにしている。

https://github.com/penguinwokrs/firebase-auth-rails/blob/master/lib/firebase/auth/token.rb#L20
7.3 (標準) 尤度比検定3，ワルド検定2，スコア検定2

## 方針

(1)は単に尤度比検定．(2)は，正規母集団のパラメータが複数あるので，最尤推定量の漸近分布は多次元になる．パラメータが複数ある場合も，一つだけのケースと同様に，スコア関数やフィッシャー情報量が定義でき，クラメール・ラオ不等式や最尤推定量の漸近正規性が成り立つ．漸近正規性を利用することで，ワルド検定やスコア検定を求めることができる．

![知ったこと-89.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/ac32d126-bff6-2eeb-fe85-8e047d7e45cf.jpeg)
![知ったこと-90.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/76913a0c-0f65-79d3-b272-6bd751be735e.jpeg)
![知ったこと-91.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/3ffe5c17-f2d6-f998-916a-84ca7e766d34.jpeg)
![知ったこと-92.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/8b67d992-fc53-ae40-7e83-39364de817b3.jpeg)
![知ったこと-93.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/a4575525-2e72-f1d7-2693-e68ea5677c83.jpeg)

## 答案

![7.-9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/607058a7-30d1-be4f-1b8a-e68a8f79a735.jpeg)
![7.-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/e5017743-c0a2-7a7f-ada2-7f3579b905f0.jpeg)
![7.-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/df70196c-652f-4c15-730c-f2f9610e9244.jpeg)
![7.-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/f7148e8e-f638-4c49-4e3d-a534ff9c2bdc.jpeg)
![7.-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/1184271c-b44b-0489-55fb-a735dba6b50a.jpeg)

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
加速度センサによる移動距離算出

# はじめに
本記事では，研究の一環として[BMX055](https://akizukidenshi.com/catalog/g/gK-13010/)といった9軸センサを用い移動距離の算出方法の説明をする．

# [BMX055の使用](https://akizukidenshi.com/download/ds/akizuki/AE-BMX055_20180403.pdf)
■ 主な使用
・電源電圧：$3.3V$または$５V$
・センサ：加速度3軸，ジャイロ3軸，磁気3軸
・インターフェース：$I2C$
・基板サイズ：$14×10mm$

# ESP32との接続方法と準備
BMX055：JP7，JP4，JB5　→　ショート
(ESP32) Vin5 - VCC (BMX055)
(ESP32) GND - GND (BMX055)
(ESP32) [GIOP21] I2C SDA - SDA(BMX055)
(ESP32) [GIOP22]I2C SCL - SCL(BMX055)

# 加速度と速度，変位の関係と算出方法と実験
#### 加速度と速度，変位の関係
加速度 (積分) → 速度 (積分) → 変位

#### 実験動作
停止→移動（$5m$）→停止

### 算出方法
![z-a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814190/2b08a04a-e228-caa3-a531-0fe56f6d907e.png)
重力加速度の影響を受けていることから重力加速度を取り除く作業を行う．

重力加速度の除去は実験として停止→移動→停止としていることから最初に取れたデータを全データに対して引き算を行う事とした．
行ったものが次の画像である．
![z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814190/05e27cc1-9648-e00e-5910-b26f499c19a0.png)

#### 加速度の積分
台形の面積を求め足すことにより求めることが可能になる．
###### 台形の面積公式
（上底　＋　下底）×　高さ　÷　2
###### 加速度データの場合
※N○をデータ番号とする．また，加速度の値は正である．
( N2 - N1 ) * N1からN2までの時間間隔 ÷ 2

※ 停止していても重力加速度の除去が仕切れず，移動と判定されてしまう．
![z-b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814190/e38e297f-c2aa-cbe3-485f-37adcf863425.png)

そこで停止，移動の閾値を決定した．
0.2以上を移動していると判定することにより停止と移動を区別することができた．

![z-c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1814190/9b3cc4c4-3aee-1ebe-9c40-8aaea1ea39c7.png)

[実験] 5mの歩行
[実測結果]5.2056081m
「何がわからないのかがわからない」人は何がわかっていなくて何がわかれば何がわからないのかがわかるのか

タイトルですが、どこで句読点を入れるべきか悩んだのですが最終的にはどこにも入れないほうが一番良さそうという結論に至りました。
それでは本題に入ります。

新人さんとかの話を聞いてると、
「よく、『わからないことがあったら聞いてください』って言われるけど何がわからないのかわからないんだよね〜」
「それな〜！！」
「「あっはっは！！」」

っていうことめっちゃ聞きます。

新人さんと言いましたが僕も新しい案件についたときに、
「わからないことがあったらなんでも聞いてください。といっても何がわからないのかがわからない状態とは思いますけど^^:」
というふうに言われます。

「なにがわからないのかがわからない」というのは誰しも経験があることだと思います。もちろん僕もありました。人一倍あった自信すらあります。プロ級です。

つまり「なにがわからないのかがわからない」という状態は**多くの現場で起こり得てる**ことだと思います。

とはいえ僕はあまり「なにがわからないのかがわからない」という状態は好ましくないと思ってます。
この状態って当事者としてはすごく辛いですよね。鬱にもなりますよ。

「なにがわからないのかがわからない」という状態がダメだ！っていうわけではなくて、「できればそんな状態誰しもなりたくないよね。」っていう意図でこの記事を書いてます。

それはそうなんだけどじゃあどうしてそういう状態になってしまうのか。そしてどうすればそうならないのかについて今日は僕なりに書いてみたいと思った次第です。

そしてこれは、「何がわからないのかがわからない本人」宛だけではなく、**新人を受け入れてる先輩方に対してのメッセージ**でもあります。

よく、
* スキルが足りない
* 経験が浅い
* プロジェクトの全体像がわかっていない（これがわかるとなんとかなるケースは多いのですが）
* 用語が難しすぎる

いろいろ挙がると思いますが、どれも違うと思います。もっと誰でも **「これさえわかれば」** というのがあります。

## 結論：「自分がその職場で『何をすればいいか』がわかっていない」

これに尽きると思います。

つまり、**自分がなぜそこにいるのかがわかっていない**。ということです。

究極、**それがわかれば「何がわからないのかがわからない」という状態は脱却できます。**


そしてそれがわかるための質問はこうです。
**「わたしは、ここでなにをすればいいですか」**
あるいは、
**「わたしに期待してることはなんですか」**
前者は新人向け、後者はそれ以外です。
※新人とは。というツッコミはありそうですが、それは自身の判断におまかせします。

* 「 周りの人と同じことをしてくれ」と言われたら
	* 周りの人に、「なにをしてるんですか」と聞けばOK
* 「○○をやってくれ」と言われたら
	* 「 やりかたがわからないので教えて下さい」と聞けばOK（わかるなら聞くまでもない）
* 「『DX』」を進めてほしい」と言われたら
	* 「そもそも何が課題でDXをしたいのか」を聞く
	* 「そもそもDXってなんですか」と聞く

こんな具合でなんとかなるはずです。

## つまり
### なにがわからないのかがわからなくて困ってる人は「自分はここで何をすればいいのか聞く」
### そういう不幸な人を生みたくない人は「きちんとその人に期待してることを示す（説明する）」

かなと思います。

今日言いたいのは、
* 新しく参画した人→自分がなにをすべきなのかを聞く
* 既存の人→相手に何をしてほしいのか、期待してることはなにかをきちんと伝える

です。

この問題、突き詰めていくと「既存の人」が「何がわからないのかがわからない人は、何がわかればわからないことがわかるのか」を真剣に考えることが大事なんだと思います。


ただ、「何がわからないのかわからない」っていう仲間がたくさんいるからといって平然と「なにがわからないのかがわからないしｗｗ」って言う人は僕は苦手です。
当然、「『何がわからないかがわからない』っていう部下がいて困るよ」っていう上司っぽい人はもっと苦手です。
JavaScriptチートシート

僕がよければよいだけのメモ張

# iframeに再帰的に処理したい

```js
(x=>{
  let opr=d=>{/*documentに対するなんらかの処理*/};
  let f=d=>{Array.from(d.querySelectorAll("iframe"),i=>f(i.contentDocument));opr(d);};
  f(x);
})(top.document);
```

# Object / Array 全体の値の複製を作る

```js:src を dest にコピー
dest = eval('(' + JSON.stringify(src) + ')');
dest = JSON.parse(JSON.stringify(src));
```

`JSON.stringify(src)`でObject値をJSON文字列にする。
これを`eval`とか`JSON.parse`に食わせて、新しい値として生みなおす。

`JSON.parse`は、引数が厳密なJSONじゃないとダメなので、
予め`stringify`した値を切り貼りした結果を使いたいときとかに、
JSON的な構文エラーがあったりすると通らなくて不便かも。

`eval`なら、「JSON的にはアウトだけど、JavaScript上のObjectの宣言としては許される」書き方(*)が許される。
(リスト末尾のカンマとか、Objectのkeyを文字列にしないとか)
ただし、`eval('{/*なかみ*/}')`のように、値になる式でないものを指定すると、実行できないエラーになるので、値にするために`eval('({/*なかみ*/})')`つまり`eval('('+'{/*なかみ*/}'+')')`にする。


# 配列を複数の文字列要素で並べ替えする

```js
key1=src.map(v=>v[accessor1]).sort().reduce((p,v,i)=>Object.assign(p,{[v]:i}),{});
src.sort((a,b)=>key1[a[accessor1]]-key1[b[accessor1]]);
```

```js:↑の説明
key1=src.map(v=>v[accessor1]/*並べ替えするデータソースを指定*/).
sort(/*別途並べ替え方法に指定があれば指定*/).
reduce((p,v,i)=>Object.assign(p,{[v]:i}/*データソースに対して並び順を記録。一意に取得できるように、accesor1と合わせて調整する*/),{});

src.sort((a,b)=>key1[a[accessor1]]-key1[b[accessor1]])/*昇順/降順を切り替えるならaとbを逆にする*/;
```

複数条件指定は下記
```js
key1=src.map(v=>v[accessor1]).sort().reduce((p,v,i)=>Object.assign(p,{[v]:i}),{});
key2=src.map(v=>v[accessor2]).sort().reduce((p,v,i)=>Object.assign(p,{[v]:i}),{});
src.sort((a,b)=>(key1[a[accessor1]]-key1[b[accessor1]])||(key2[a[accessor2]]-key2[b[accessor2]]));
```

3行目は以下と同じ
```js
src.sort((a,b) => {
  return (key1[a[accessor1]]-key1[b[accessor1]]) ||
         (key2[a[accessor2]]-key2[b[accessor2]]);
});
// or 演算子は短絡評価のため、
// key1 による順序照会で0でない値になった(=並び順が確定した)らそれが return される
//   (引数の2値は、key1 による並び替えで順位が異なるため、これに従い並び替え)
// 確定しない(つまり0)の場合、演算子(||)の右の式が評価され、その値が return される。
//   (引数の2値は、key1 による並び替えで同順位だったため、 key2 による並び替えを行う)

```

すなわち、 `order by accessor1, accessor2` みたいなことになる。

# `yyyy/mm/dd hh:mi:ss` 形式の日時文字列を得る

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat

古いverの環境では動かない(htaとか)

```js
new Date().toLocaleString({},{dateStyle:'medium', timeStyle:'medium'})
```

`dateStyle`だけ書けば日付のみに、`timeStyle`だけ書けば時刻のみになる。
`locale`が日本の前提の記述なので、日本の書式がいいよってどこかに書かないと、国が変わると見た目が変わる。
(「`locale`毎に定義された`Style:midium のときの書式`」になる)
VSCode関連のあれこれ

# 起
最近ATOMからVSCodeに乗り換えたので、その際の注意書きをまとめていく。


# Markdown関連

## 改行コードの設定
ATOMとVSCodeで一番違うのが改行コードの扱いで、ATOMの場合は通常**改行すれば改行として認識してプレビューでも反映してくれる**。
しかし、VSCodeの場合は半角スペース2つで改行コードを認識するため、プレビューで反映する場合は改行コードの前に半角スペースを埋め込む必要が出てくる。
ただし、これをめくらで検索置き換えを使って行うと、他にも影響が出てくるので、今回は初期設定が修正していくことにする。
方法は、まずは設定を表示させる。
![スクリーンショット 2022-07-08 時刻 10.03.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125657/d5646211-54d8-da61-ee3a-b84ed007f5a1.png)

次に検索窓に`markdown.preview.breaks: true`と入力する。
すると
`Markdown › Preview: Breaks`
`Markdown プレビューで改行を表現する方法を設定します。'true' に設定すると、段落内の改行に対して <br> が作成されます。`
と表示されるので、チェックする。
![スクリーンショット 2022-07-08 時刻 10.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125657/1e5ec689-e13e-2ddb-4211-49efd2461f57.png)

これで終了である。
他の方法としてはsetting.jsonを直接編集する方法もあるが、こっちの方が簡単なので、おすすめである。


# 結
とりあえず、気の向いたときに編集していくので、次いつ足されるのか自分でもわからない。
そもそも、VSCodeってすでに割と完成されているエディターなので、それほど難しいもんでもないしね。
Office Wordでスタイル毎に異なる図表番号を使いたい

Wordでは図表番号に使えるスタイルは一つしかありません。
例えば、見出し２に連動した図表番号と、見出し３に連動した図表番号を混在させることができないのです。

ただ、それはメニューからGUI操作によって図表番号を設定する場合に限ります。
フィールドコードを手動で修正すれば、複数のスタイルの図表番号が可能になります。

▼やり方
例えば、４.５.６章において、メニューから図表番号を挿入し、
その後その図表番号を選んでコンテキストメニュー「フィールドコードの表示/非表示」を選ぶ
（あるいはショートカット「SHIFT+F9」を押す）
と、図表番号のコードが出ます。

図{ STYLEREF 1 \s }－{ SEQ 図 \* DBCHAR \s 1 }
「1」は見出し番号を表します。
このままだだと、
「図４－１」
と表示します。

ここで、別の見出しに連動した図表番号にしたければ、
図{ STYLEREF 2 \s }－{ SEQ 図a \* DBCHAR \s 2 }
とすれば、
「図４．５－１」
と表示します。

図{ STYLEREF 3 \s }-{ SEQ 図b \* DBCHAR \s 3 }
とすれば、
「図４．５．６－１」
と表示します。


▼注1
どうやら、SEQの隣にある「図」は図表番号のパターンを示すインデックスのようです。
新しい図表番号のスタイルを作る際には、
これを別名にしておいた方が無難のようです。
（上記例では「図a」や「図b」とした箇所）
というのも、文書全体をまとめてフィールド更新をすると、
このインデックスが同じものはすべて同じスタイルに戻ってしまうからです。

▼注2
これで挿入した図表については、本文中に図表番号を挿入するの「相互参照」機能が使えなくなります。
「相互参照」ダイアログボックスのリストに表示されるのはインデックス「図」であって、インデックス「図a」は認知してくれないようです。
有名企業のエンジニア向け研修資料まとめ

## はじめに

今回は有名企業の公開されているエンジニア新人研修資料をまとめました。

昨今、新人向けの研修資料を公開する企業が増えています。

またクオリティーがかなり高いものが多く、初級者~中級者でも学びがある資料となっています。

資料の作り方も勉強になるので「勉強会で登壇している人」「企業の研修担当の人」にも有益な資料になっています。

## この記事の主な対象者

- 有名企業の研修資料を網羅的に見たい人
- エンジニア初級~中級者の人
- 独学で学習をしている人
- 研修資料の作成を今後していきたい人

## [ミクシィ](https://mixi-developers.mixi.co.jp/23-technical-training-20a6f610140c)

まずはじめに紹介するのは、毎年新人向けの研修資料を公開している株式会社ミクシィです。

https://mixi-developers.mixi.co.jp/23-technical-training-20a6f610140c

ミクシィの研修資料で公開されている内容は、

- Git研修
- データベース研修
- 設計・テスト研修
- コンテナ研修
- iOSアプリ開発研修
- Androidアプリ開発研修
- フロントエンド研修
- ゲーム開発研修
- Flutter研修
- AI研修
- セキュリティー研修
- チーム開発研修

と、正直「**ここまで公開しちゃうんですか**」と思わんばかりに濃い内容になっています。

またそのほとんどに動画、スライド、リポジトリーが付いているので学習教材としても十分な内容になっています。

さらに毎年更新されているので、最新の内容を学ぶことができます。

## [リクルート](https://blog.recruit.co.jp/rtc/2023/08/10/recruit-bootcamp-2023/)
次に紹介するのは株式会社リクルートが公開している新人向け研修資料です。

https://blog.recruit.co.jp/rtc/2023/08/10/recruit-bootcamp-2023/

こちらの資料ではソフトエンジニアとしての心構えだったり、ABテストの概論、AWS、TypeScriptといったフロント周りと幅広く対応しています。

「**ブラウザ上でどのような処理が行われているのか**」をトピックとしており、分野が組まれています。

こちらも資料も豊富でかなり勉強になると思うのでぜひ利用してみてください。


## [サイボウズ](https://blog.cybozu.io/entry/2022/06/23/170000)

次に紹介するのはサイボウズ株式会社が公開しているエンジニア新人研修の講義資料です。

https://blog.cybozu.io/entry/2022/06/23/170000

こちらの資料では、

- モバイルアプリ開発
- サイボウズのアジャイル・クオリティ
- MySQL - テストデータが偏るということ
- モブに早く慣れたい人のためのガイド
- テクニカルライティングの基本
- ソフトウェアテスト
- セキュリティ
- ソフトウェアライセンス

とアプリ開発に加えて、データベース周りだったりやテストやセキュリティー周りも対応している資料になっています。

内容も「**そもそもアプリとは何か**」といった初歩的なところから解説がはじまっているので知識がほとんどなくても読み進めることができます。

かつ図が多用されているので処理のイメージがつきやすい資料になっています。

## [サイバーエージェント](https://note.com/cyberz_cto/n/n26f535d6c575)

次は株式会社サイバーエージェントが公開している新卒向けの研修資料です。

https://note.com/cyberz_cto/n/n26f535d6c575

資料は「**良いコードとは何か**」といった誰もが学ぶべき内容になっています。

具体的には、

- 品質とスピードはトレードオフか
- 技術的負債の発生と解消
- 凝集度と結合度
- clean architecture

といった内容になっています。

若干難易度が高い内容もありますが、わかりやすい言葉で解説をされているので理解もしやすいです。

初心者から中級者まで学びになるような資料だったのでぜみ読んでみてください。


## [ゆめみ](https://github.com/yumemi-inc/ios-training)

次に紹介するのは株式会社ゆめみが提供するiOSエンジニアの研修資料です。

https://qiita.com/watanave/items/1cefa5aae18f5141c426

https://github.com/yumemi-inc/ios-training

こちらの研修資料ではGitHubのリポジトリーが公開されており、天気予報アプリを開発しながら学習を進めることができます。

14ステップの課題が用意されており、1ヶ月程度で完成できる内容になっています(Qiita参照)

iOSアプリについてこれから学びたい人にとってかなりタメになる教材となっているのでぜひ使ってみてください。

## [Wantedly](https://www.wantedly.com/companies/wantedly/post_articles/173824)

最後に紹介するのはウォンテッドリー株式会社が公開している新卒研修資料です。

https://www.wantedly.com/companies/wantedly/post_articles/173824

こちらに関してはエンジニア向けの内容に加えて、社会人1年目として考え方やプロダクトについても学ぶことができる資料になっています。

そのため新卒向けの新人研修マニュアルや資料を作る新卒担当の人もかなり勉強になる内容になっています。


## 最後に

いかがだったでしょうか。

今回は有名企業の研修資料を紹介しました。

研修というだけあってわかりやすい構成なので、エンジニア初心者から中級者また社内の新卒担当者もかなり勉強になる内容と感じました。

ぜひこれらの資料を使ってよりスキルアップしていただければなと思います。

自分は他にも様々な記事を出しているのであわせて読んでいただけると嬉しいです。

https://qiita.com/SMAC/items/e50c981e0518141be28f

https://qiita.com/SMAC/items/550b52ff980c0c32bf2a

https://qiita.com/SMAC/items/3b14e2e8f89a33c0f959
LocustとseleniumをDockerで構築する

## はじめに
研究の実験としてLocustを使った負荷試験を行ったのですが、WordPressの決済プラグインであるStripeがREST APIに対応していませんでした。そのためseleniumで直接クレジットカードの番号などを入力する必要があるました。
今回はseleniumとlocustをDockerで実行する方法を記述していきます！

## 前提
- Dockerが入っていること！
- Docker Hubのアカウントを作っていること！

## Dockerfile

```Dockerfile
FROM locustio/locust@sha256:78148a8b40d012f29d7f274a72e347552e373d740275b7e2f455e70e11c4e9b1
USER root

RUN apt-get update

RUN apt-get install -y vim less psmisc

RUN sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN apt update
RUN apt install google-chrome-stable -y
RUN apt install openjdk-11-jdk -y

RUN wget https://github.com/SeleniumHQ/selenium/releases/download/selenium-4.0.0-beta-4/selenium-server-4.0.0-beta-4.jar

RUN pip install --upgrade pip
RUN pip install --upgrade setuptools
RUN pip install locust-plugins
RUN pip install webdriver-manager
RUN pip install chromedriver-binary-auto
RUN pip install Faker

ENV PATH $PATH:/usr/local/lib/python3.8/site-packages/chromedriver_binary
RUN echo $PATH

# java実行のために初期化
ENTRYPOINT [""]
```
今回必要なこととして，seleniumがpipでインストールするだけでなくselenium server本体が必要です．
seleniumが動かなかったので本当にわからなかったです(下記の記事が私を救ってくれました
https://qiita.com/itomaki_kokoro/items/1d06811c6c0799827d14

## docker-compose.yaml

```docker-compose.yaml
version: '3'

services:
  master:
    build:
      context: .
      dockerfile: Dockerfile
    tty: true
    container_name: locust_master
    ports:
      - "8089:8089"
    volumes:
      - ./:/mnt/locust
    command: >
      sh -c '
        java -jar selenium-server-4.0.0-beta-4.jar standalone &
        locust -f /mnt/locust/locustfile.py --master -H http://master:8089
      '

  worker:
    build:
      context: .
      dockerfile: Dockerfile
    tty: true
    container_name: locust_worker
    volumes:
      - ./:/mnt/locust
    command: >
      sh -c '
        java -jar selenium-server-4.0.0-beta-4.jar standalone &
        locust -f /mnt/locust/locustfile.py --worker --master-host master
      '
```
このコードは上記のqiita記事を丸コピさせていただきました...
私が書いたdocker-compose.yamlが動かなかったので 😇

## locustfile.py
locustfileはlocust-pluginのexampleにあるコードを使わさせていただきました．
自分の環境に合わせて変更が必要です
https://github.com/SvenskaSpel/locust-plugins/blob/master/examples/webdriver_ex.py

## 実行
```
docker-compose up 
```
上記を実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469304/5414140f-7f28-7dcf-8ea3-8694eac50976.png)

動きました！！！
改めてQiitaを書いてくれた先駆者の方に感謝です．
https://qiita.com/itomaki_kokoro/items/1d06811c6c0799827d14

## おわりに
今回はDockerでseleniumとlocustを実行する方法を記述しました．
英語で調べても情報がなかったりしたのですが，Qiitaがあって本当に助かりました．本当にありがとうございます！！

## 私を救ってくれた参考記事
https://qiita.com/itomaki_kokoro/items/1d06811c6c0799827d14
組み分けパターン（モノの区別、組の区別、組に属するモノの数の指定がいずれもない場合）

久々に1日半ぐらい頭を使ったので、同じお題に直面した方に向けて、私なりの解法を書いてみます。
## お題
同種のモノがn個あるとき、nを一度に運ぶこともあれば、半分ずつ2回に分けて運ぶこともあったり、1個ずつn回に分けて運ぶこともある、みたいな場合に、そのありうる組合せを出せ。
例えば、nが5の場合は、(5,),(4,1),(3,2),(3,1,1),(2,2,1),(2,1,1,1),(1,1,1,1,1)の7通り。
## 何ていう問題？
文系の私は高校卒後以来30年近く数学に触れていなかったので、「白玉と赤玉の組合せパターンみたいな問題があったなぁ」ぐらいの記憶しかなく、問題の名前すら全く思い出せませんでした。。。そこで、少しググると、「組分け問題」という名前らしいということがわかりました。

https://hiraocafe.com/note/kumiwake.html#link1

私の遠い記憶では、「場合の数」が数式でサクッと出せるイメージだったのですが、どうやらこの問題は上記のリンクの「組分け問題のパターン」の（12）にあたるので、「書き出し」という解決法だということが分かりました。そうでしたか、力技でしたか。
## 私の解法のアプローチ
いろいろ試行錯誤した割には、シンプルというか、大したことないものになりました。

1. 数字を入れるリスト（numbers）を用意し、heapqのリストにして、n（例えば3）を入れる
1. numbersがn（例えば3）なら、その数字のみ戻す（例えば(3,)）
1. numbersから3を取り出して、1を引いて（例えば2）numbersに入れる（numbers=[2]）
1. numbersの数字の合計は2でn（例えば3）に満たないので、同じ数字（例えば2）を入れる（同じ数字を入れるのは、nが4のような場合に（2,2）の組み合わせがあるため）
1. すると、numbersは[2,2]になり合計値がn（例えば3）を超えるので、最小値を取り出して1を引いて（例えば1）、numbersに入れる
1. すると、numbersは[2,1]になり合計値がn（例えば3）になるので、その組み合わせ（2,1）を戻す
1. そこから最小値（例えば1）を取り出し1を引きたいところだがゼロになってしまうので、numbersからもう１個数字を取り出し（例えば2）、1を引いて（例えば、1）numbersに入れる（numbers=[1]）
1. numbersの合計値がn（例えば3）に満たないので、同じ数字を入れる（numbers=[1,1])
1. まだ合計値に満たないので同じ数字を入れる（numbers=[1,1,1]）
1. 合計値がn（例えば3）になったので、その組み合わせ（1,1,1）を戻す
1. そこから最小値を取り出して1を引きたいところだがゼロになるので、次の最小値を取り出す。1を引きたいところだがゼロになってしまうので次の最小値を取り出す。1を引きたいところだがゼロになってしまうので次の最小値を取り出したいところだが、numbersに数字がなくなってしまったので終了。

以上のように書き出すと大変そうですが、コードにするとスッキリします。

```python
import heapq

def divide_number(n):
    """n個のものを1回または複数回に分けて運ぶ場合のパターン。例えば、n =3のとき、(3,), (2, 1), (1, 1, 1)。戻り値の型はgenerator。"""
    if n <1: return []
    
    numbers = []
    heapq.heappush(numbers, n)
    while numbers:
        if sum(numbers) < n:
            heapq.heappush(numbers, numbers[0])  
        
        else:
            if sum(numbers) == n:
                yield tuple(sorted(numbers, reverse= True))  # generatorを返す
            
            smallest = heapq.heappop(numbers)
            while smallest == 1 and numbers:
                smallest = heapq.heappop(numbers)
            if smallest >1: heapq.heappush(numbers, smallest -1)
```

あまり使い途が無いかもしれませんが、誰かのお役に立てれば幸いです。
EC2 Classic 環境廃止の確認（Macの場合）

EC2 Classic 環境が 2022年8月15日に廃止になるということで確認した時のメモ

Macでやりました

# セットアップ
・Python 割愛
・pip割愛

ちょっとハマったところ
実行したら下記のようなメッセージをいただいた
```
Traceback (most recent call last):
  File "/Users/xxx/Documents/work/ec2-classic-resource-finder/py-Classic-Resource-Finder.py", line 27, in <module>
    import boto3
ModuleNotFoundError: No module named 'boto3'
```

こちらを参考にさせていただいてboto3をセットアップ
https://qiita.com/hiroyuki7/items/a2246511a4f24a75f02d

チェックスクリプトはこれ
https://github.com/aws-samples/ec2-classic-resource-finder

こんな感じでもってくる
```
mkdir work
cd work
git clone https://github.com/aws-samples/ec2-classic-resource-finder.git
cd ec2-classic-resource-finder/
```

# 実行
AWSプロファイル設定してるので、自分は下記でやりました
```
python3 py-Classic-Resource-Finder.py --profile プロファイル名
```

AWSアカウントの番号のフォルダに結果ファイルができます。

めんどくさいので一気に見る

```
# 結果ファイル
cat AWSアカウントの番号/*.csv

# エラーファイルはなんとなく別で確認
cat AWSアカウントの番号/*.txt

```
Prometheusで監視してDiscordにアラートを通知する

- 監視の設定やエクスポーターについては記述していません。
- Debian系はそのままaptコマンドで動きますが、RedHat系OSの場合はyumコマンドに置き換えてください。

# prometheusのインストール

```bash
apt install prometheus prometheus-alertmanager
systemctl enable prometheus prometheus-alertmanager
```

# alertmanager-discord

## DLしてビルド

goが入っていない場合はインストール
[Wiki](https://github.com/golang/go/wiki/Ubuntu)
```bash
add-apt-repository ppa:longsleep/golang-backports
apt install golang-go
```

DLしてビルド
```bash
git clone https://github.com/benjojo/alertmanager-discord.git
cd alertmanager-discord
go build
cp alertmanager-discord /usr/local/bin/
```

[benjojo/alertmanager-discord](https://github.com/benjojo/alertmanager-discord)

## Unitファイル作成

```bash
vim /lib/systemd/system/prometheus-alertmanager-discord.service
```

※`-webhook.url`は自分のものに置き換えてください [webhookの作成](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks)
※ 9094ポートが使用済みの場合は別のポートに書き換えてください
```
[Unit]
Description=alertmanager-discord
Documentation=https://github.com/benjojo/alertmanager-discord
After=network-online.target

[Service]
ExecStart=/usr/local/bin/alertmanager-discord -webhook.url=https://discord.com/api/webhooks/*********** -listen.address=127.0.0.1:9094
ExecStop=/bin/kill -TERM ${MAINPID}
ExecReload=/bin/kill -HUP ${MAINPID}
Restart=on-failure

[Install]
WantedBy=multi-user.target
```

```bash
systemctl daemon-reload
systemctl start prometheus-alertmanager-discord
systemctl enable prometheus-alertmanager-discord
```

## alertmanagerの設定

```bash
vim /etc/prometheus/alertmanager.yml
```

`route:`と`receivers:`の部分を書き足す

```yaml
# /etc/prometheus/alertmanager.yml
---
global: {}
templates: []
route:
  receiver: discord_webhook
  routes: []
receivers:
  - name: discord_webhook
    webhook_configs:
      - url: http://localhost:9094
inhibit_rules: []
```

これでDiscordにアラートが通知されるはずです。  
後はお好みでexporterやアラートルールを設定してみてください！