OmniAICreator/Qiita-1.07M huggingface dataset:
Navigator.pushNamedで渡された値をコンストラクタの引数として使いたいとき

まず前提として、

``` dart
Navigator.pushNamed(context, "/page", arguments: "渡したい引数");
```

こんな感じでpushNamedに引数を渡せますよね。
そして次は受け取る方法です。

でよく紹介されているのは

``` dart
Widget build(BuildContext context) {
    final args = ModalRoute.of(context)!.settings.arguments;
    print(args) // "渡したい引数"
    ...
}
```
こういうやつですよね。

でもこれだとcontextが必要なので、buildの中にしか書けません。
ちょっと不便です。
そこでこちら。

``` dart
MaterialApp(
  ...
  onGenerateRoute: (settings) {
    if (settings.name == "/page") {
      // ↓settings.argumentsに渡された引数入ってる
      final args = settings.arguments as ScreenArguments;
      return MaterialPageRoute(
        builder: (context) {
          // ↓こんな感じで引数をコンストラクタに渡せるので便利
          return NextPage(
            // args = "渡したい引数"
            title: args,
          );
        },
      );
    }
    assert(false, 'Need to implement ${settings.name}');
    return null;
  },
)
```

この方法だと、NextPageのコンストラクタに自分で引数を渡せるので、自由度が高くて便利です。

公式HPから引用。
https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments
AWSで放置してたEC2から請求が上がってて損した話

###前書き
タイトルの通りです。
２０００円くらい損したのでQiitaのネタにします。

###見つけた不審な詐欺メールっぽい請求メール
たまたまGmailを確認したときに見つけました。
以下メール

```
Title: Amazon Web Services Billing Statement Available

Greetings from Amazon Web Services,

This e-mail confirms that your latest billing statement,
for the account ending in ********, is available on the AWS web site.
Your account will be charged the following:

Total: $17.36

You can see a complete break down of all charges on the Billing & Cost Management page located here:
```

最初詐欺メールかと思ったんですが、
どうもそうではなくVプリカの期限が切れてた上に付けっぱなしにしていた物が課金されてて
しかも未払いだったみたいです（大変だ）

案内通りコンソールを開いてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443834/4d18f090-e12f-6654-1654-19f421e45afc.png)

先月の未払いの請求＋今月の請求まで入ってきてるーという状況で払わなきゃいけないし止めなきゃいけないという状況でした。
どう対応したかを以下に書き記していきます。

###未払いを払った
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443834/b6a180e8-3ade-8fd1-3329-5934ec2b32f1.png)
払ったのでもう表示されてないんですが
左のメニューから「支払い」を押下して画像の画面に遷移すると未払いの請求が出てきます。
払いましょう。

###課金されてるサービスを特定して止めた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443834/bb06b91e-2405-9953-2a12-2fade63ead2f.png)
左のメニューから「請求書」を押下して画像の画面に遷移すると請求されてるサービスが分かるようになります。

この画像で見ると請求が発生してるのは
・Elastic Compute Cloud (EC2)
・Relational Database Service (RDS)
の二つです。

それぞれの画面に遷移してインスタンスを止めるなりなんなりしましょう。

###再発防止のためにアラートの設定を変えといた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443834/ad566cb1-ad45-d416-a24b-d21c897c5fb6.png)

左のメニューから「Budgets」をクリックして予算の設定が出来ます。
実は最初から作ってたんですが、20$までアラート出さないようになってたので0.01$に変更しました。
といってもあまりメール見ないので関係は無いんですが。。。

###請求ちゃんと止まってるか経過観察した
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443834/66407863-b2d4-bdcc-2af3-b19fe9887709.png)


上の画像をみてほしいのですが、
実は日々日々おいくらかかってるかをグラフで表示できます。
「AWS Cost Explorer」というやつですね。
検索したら出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443834/0fd2c364-a083-1219-d8bd-27290f918333.png)

３日目くらいにデータベース系のやつ全部止めて（S3から削除したり色々しました）、
７日目に忘れてたEC2を止めたので８日には請求が上がってない形になってます。
月末予想コストが$2.44と書いててまだ止め忘れがあるのかと不安になりますが、恐らく大丈夫でしょう。

###あとがき
使わない物はちゃんと止めよう。
[python]hstack,vstack

# 概要
pythonのhstackとvstackの使い方
# どんな時に使うか
np.appendより使いやすいリストの結合方法？
pythonの標準ライブラリで

```python
l = []
for i in range(5):
  l.append(i)
print(l)
#[0, 1, 2, 3, 4, 5]
```
のような処理をよく私自身が書くのだが、リストだと要素の一括削除など意外とめんどくさい
(ある要素をpopすると他の要素のインデックスも変わるため。)
その時、listで行っていた作業をnumpyで書き換えようと思うのだが、よくappendで詰まるため本記事を備忘録のため残した。

# 参考
この記事を見ればわかる。
https://deepage.net/features/numpy-stack.html
# hstack
横方向に繋げる。
(10,)と(10,)をhstackをすると(20,)になる。

# vstack
縦方向に繋げる
(10,)と(10,)をvstackすると(2, 10)になる。

# サンプルプログラム

```python
import numpy as np
a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
b = np.arange(10, 20) # [10 11 12 13 14 15 16 17 18 19]

print(np.hstack((a,b)))
# [0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19]

print(np.vstack((a,b)))
# [[ 0  1  2  3  4  5  6  7  8  9]
# [10 11 12 13 14 15 16 17 18 19]]
```
DynamoDBテーブル設計　パーティションキーとソートキー

## はじめに

AWSのフルマネージドNoSQLサービス、DynamoDBのテーブル設計をする機会があった。
以前に右も左も分からない状態で設計をしたことがあったが、学びがあったので自分用にメモ。

## パーティションキー (PK)

RDBでいうところのプライマリキーである。ソートキーが異なれば重複可👌

パーティションキーごとに、物理的な保存場所が異なる。
DynamoDBはキャパシティーユニットに応じてスケーリングできる。

この時、パーティションキーの値がなるべく分散するように設計する。
特定のキーにアクセスが集中すると、スケーリングしても速度が上がらず結果的に性能不足になってしまうからだ。

したがって、日付などの分散しにくい値はよくない。
なるべく分散する値を選んで設計しよう。

## ソートキー (SK)

パーティションキーで指定した値を取り出す際の順序が決まるキー。
これ単体で検索（クエリ）することはできず、パーティションキーと組み合わせて検索する。

その名の通り順番を決めるキーなので、UNIXタイムスタンプなどソートしたい要素を指定すると良いだろう。

## 結論

- PK
  - 物理的に保存する場所を定義
  - なるべく分散する値
- SK
  - PKと組み合わせて検索
  - ソートしたい要素
  - 任意

## おまけ

以前はRDBしか使ったことがなかったのでたくさんのカラムを持つテーブル設計をしてしまったが、NoSQLではある程度JSONとしてObjectやArrayをカラムに記録する設計も大アリのようである。
Amplifyで条件付きでリアルタイム更新 (subscribe) する

# 概要
Amplifyが `@model` で自動生成してくれるsubscriptionは何でもかんでも通知してくる。チャットを例にすると、チャットメッセージが投稿されたらどのチャットルームだろうが通知してくる。しかし現実的には特定のチャットルームの通知しか受けたくないはずだ。

[公式ドキュメント](https://docs.amplify.aws/cli/graphql-transformer/examples#filter-subscriptions-by-model-fields-andor-relations)にそういう場合の対応が書いてあるのだが、分かりづらいのと最後まで書かれていないのでやり方をメモ。

# 前提
例として、下記のようなスキーマが存在するとする。
Chatがチャットルームで、ChatMessageがその中でやり取りされるユーザのメッセージだ。

```graphql:amplify/backend/api/myqpi/schema.graphql
type Chat @model {
  id: ID!
  title: String!
}

type ChatMessage @model {
  id: ID!
  chatId: ID!
  body: String
}
```

# 手順
## Amplifyのsubscription自動生成を無効にする

まず、ChatMessageの `@model` に `subscriptions: null` を追加して、Subscriptionが勝手に作成されないようにする。

```graphql:amplify/backend/api/myqpi/schema.graphql
type ChatMessage @model(subscriptions: null) { # <-- これ
  id: ID!
  chatId: ID!
  body: String
}
```

この段階で `amplify push` する。しておかないと、後の手順で自分で定義するSubscriptionを `push` する際に、既にAmplifyが自動生成したSubscriptionとぶつかってエラーになる。

```bash
% amplify push
```

## パラメータ付きのSubscriptionを定義する
下記のように `chatId` を引数に取るSubscriptionを記述する。当然、`ChatMessage` typeに存在するフィールドを指定する必要がある。

```graphql:amplify/backend/api/myqpi/schema.graphql
type Subscription {
  onCreateChatMessage(chatId: ID): ChatMessage @aws_subscribe(mutations: ["createChatMessage"])
}
```

`onCreateChatMessage`の型は作成された`ChatMessage`が返されるので`ChatMessage`になる。
`@aws_subscribe` ではsubscribeしたいmutationを指定する。この場合、`createChatMessage`になる。

これで再度 `amplify push` を実行する。

## クライアントアプリで使用する
幸い、Amplifyがその他諸々は生成してくれるので、後は、クライアントアプリから呼び出すだけだ。JSの場合、下記のようになる。`graphqlOperation` を使用して、追加した `chatId` パラメータは見ての通りの渡し方になる。

```javascript
import { API, graphqlOperation } from 'aws-amplify'

// 通知の受け取りを開始する
const subscription = API.graphql(
  graphqlOperation(subscriptions.onCreateChatMessage, { chatId: currChatId }),
).subscribe({
  next: ({ provider, value }) => {
    console.log(value.data.onCreateChatMessage)
  },
  error: error => console.warn(error),
})

// 通知を止める（SPAなどで更新が不要になった場合など）
subscription.unsubscribe()
```

## おまけ
これによりAmplifyが生成するコードには下記の変化がある。

* `amplify/backend/api/myapi/build/schema.graphql` の Subscription が自分で追加した `onCreateChatMessage` に置き換わる。
* 自動生成してくれるsubscriptionのGraphQL（今回の場合`onCreateChatMessage`）がパラメータ付きに変わる。（JSの場合、 graphql/subscriptions.js にあたる。）

リゾルバには変化がない。GraphQLスキーマとGraphQLステートメントの変更だけでパラメータを追加できるようだ。
SQL についての調べたことと個人的学習ロードマップ

# 1. きっかけ
　SQL を勉強しようとしたきっかけは、機械学習や Python の勉強を進めていくうちに、
　データを取り扱う機会が非常に多いと感じたため、これまで避けていたのですが、さすがに着手しないとな… と思ったためです。
　今回は調べたことのまとめと、ロードマップを書いて自身のモチベーションを維持するための投稿です。
　知識があまりない状態で始めているので、間違っているところがあればご指摘お願いします。

# 2. SQL とは？
　データベース言語の一つで、データベースの定義や操作を行なうために欠かせないものです。
　ここで、「データベースって何？」と思った方は以下の Oracle からの引用でイメージをつけてください。
> データベースとは、構造化した情報またはデータの組織的な集合であり、通常はコンピューター・システムに電子的に格納されています。データベースは通常、データベース管理システム（DBMS）で制御します。データとDBMS、およびそれらに関連するアプリケーションをまとめてデータベース・システムと呼びます。多くの場合は単にデータベースと呼んでいます。
URL: [Oracle](https://www.oracle.com/jp/database/what-is-database/)

　まあ要するに色んなデータが格納されている箱があって、その中の整理整頓をするイメージかなと思ってます。

# 3. RDB（リレーショナルデータベース）
　 ”列” と ”行” によって表現される ”表” の形で格納されたデータベース。
　これを自由に加工することが現在最も普及されているのだそう。
　確かに機械学習でもだいたいはこの形式。データの処理は表を上手く取り扱えるかどうかがカギなのか…。
　もう少し自分の言葉でうまく説明できる必要がありそう。

# 4. 処理方法
　データの登録、抽出、更新、削除 etc... といった Excel を触ったことがある人ならイメージしやすい作業。
　ただ、このあたりのコマンドはボリュームがあるので、基本の処理方法 + 自分が使いそうな処理を覚えておくとよいと思われる。とりあえずは基本的な処理の方法を知ることからスタートする。

# 5. 学習ロードマップ
　以下のような進め方を考えている。
　当面、(1) の勉強にはなるが、まずは 1 ヵ月である程度処理ができるようになることを目標に進める。

　(1) SQL の基本構文の理解を行なう
　　・まずはどのような文で何を行なうのかを知る。
　　　土台をしっかり固めて基本的な処理はできるくらいの知識をつける。
　(2) 練習問題を解く
　　・以下のサイトをどちらか最低 1 周はして (1) の部分が理解できているか確認する。
　　　TECH Projin ( [URL](https://tech.pjin.jp/) )
　　　SQLZOO ( [URL](https://sqlzoo.net/wiki/SQL_Tutorial/ja) )
　(3) 実践環境の構築
　　・自身が実際に PC 上でデータベースを処理する環境の構築
　　　MySQL、Oracle、SQL Server などがあるが、やっぱり MySQL が無難かな？
　(4) 実際にデータベースを処理する
　　・これまでの知識を生かして実際にデータベースを作ってみる。

# 6. まとめ
　そんなに凝った投稿ではないですが、これから各部分の理解を深めてまた記事化できればなと思います。
　また、就活もちょこちょこ始めているのですが、データを扱う職種関連は SQL を使えないと土俵にすら立てない感じなのかな … と調べていく上で思いました。
　夏休み期間を存分に生かして、自身の研究および機械学習や多言語の勉強などと並行して行ないたいと思います。
[VB.NET]基本構文まとめ

VB.NETについて、ちょっとだけ学習したので、今の自分の理解度の範囲でアウトプットしていきます。

まだVB.NETを使った開発をしたことがないので、間違ってるかもしれませんがご容赦ください。

#VB.NETとは

Microsoftが開発したプログラミング言語で、Windowsで動くプログラムを作れます。

#変数の定義

変数の定義は、変数の有効範囲によって使い分ける。

####どこでも使える変数

```visualbasic:
Public 変数名 As データ型
```

####クラスの中だけで使える変数

```visualbasic:
Private 変数名 As データ型
```

####プロシージャの中だけで使える変数

```visualbasic:
Dim 変数名 As データ型
```

#定数の定義

定数も変数と同じで、有効範囲によって使い分けることが可能。

```visualbasic:
Private Const 定数名 As データ型 = 値
```

#If文

条件によって処理を変えたいときに使用。
さらに条件を絞り込むときは、`ElseIf`、それ以外の条件のときは、`Else`。

```visualbasic:
if 条件 Then
  処理
ElseIf 条件 Then
  処理
Else
  処理
End If
```

#Select Case文

値が１のときはこの処理、2のときはこの処理など、if文よりすっきり書ける。

```visualbasic:
Select Case 条件
  Case 条件
    処理
  Case Else
    処理
End Select
```

#For文

繰り返し処理。

```visualbasic:
For Each 変数名 As データ型 In 配列の入った変数名
  処理
Next
```

#Do文

前判断と後判断を使い分けられる。

条件の指定には2種類。

1.Until `条件が一致しない間のみ処理を続ける`、条件が一致したら処理終了
2.While `条件が一致してる間のみ処理を続ける`、条件が一致しなくなったら処理終了

####前判断

条件を指定して、その条件がが一致する場合のみ処理を繰り返す。(Loopまで来たらDoの条件を確認して判断)

```visualbasic:
Do 条件
  処理
Loop
```

####後判断

後判断にすることで、条件に合わない場合でも1回は処理が実行される。

```visualbasic:
Do
  処理
Loop 条件
```

#イベントハンドラー

クリックしたときになどのイベント発生時の処理を記述ができる

#Subプロシージャ

ボタンをクリックしたときなどの処理など、よく使う処理を記述しておくことで、コードがすっきりできる。

```visualbasic:
Private Sub メソッド名()
  処理
End Sub
```

#Functionプロシージャ

Subプロシージャと違って値を返せる。

```visualbasic:
Private Function メソッド名() As データ型
  処理
End Function
```

#メソッドの引数

メソッドのメソッド名( )の中の( )に値を入れることで、引数を渡せる。

```visualbasic:
メソッド名(ByVal 引数 As データ型)
```

Boolean型は少し特殊。
Optional ByValにすること。
初期値を設定。

```visualbasic:
メソッド名(ByVal 引数 As データ型, Optional ByVal 引数 As Boolean = 初期値) As Boolean
```

#まとめ

今回は、VB.NETのほんとうに入門的な基本構文をまとめてみました。

まだまだ理解の浅いところもありますが、基本構文に関しては、まあなんとかなるかなという印象です。

他の言語と違って、( )や ; が不要なので、構文エラーをあまり気にしなくていいので気持ち的に楽。(JavaScriptの ; をよく忘れて怒られる)

まだ開発環境も構築できてないので、ひさびさにサブ機のSurfaceでも引っ張り出してきますかね。
Laravelで気軽にバルクアップデートしたい

# バルクアップデートとは

バッチ処理などでは、データベースに複数の行を挿入したり、更新したりしたい場合がよくあると思います。挿入に関しては、大抵のRDBMSでは`INSERT INTO table (...) VALUES (...), (...)`のような形で簡単に実行可能ですし、Laravelでも`insert()`の第1引数に連想配列の配列を渡せば可能です。

更新に関してはそう簡単ではありませんが、MySQLに限っては、`ELT()`と`FIELD()`という2つの関数を使った方法で可能です。ただし、これをLaravelで実行するのはだいぶややこしいので、簡単に実行できるようにしてみました。


# 使い方

https://gist.github.com/HAYASHI-Masayuki/26887258dcc59f79438224f860381ad0

上記にあるサービスプロバイダクラスのファイルを、`app/Providers`以下に配置し、`config/app.php`の`providers`に`App\Providers\MySqlBulkUpdateServiceProvider::class`を追加、その上で、

```php
<?php

DB::table('users')->whereNull('email_verified_at')->updateBulk([
    ['id' => 1, 'name' => 'admin1', 'email' => 'admin@example.com'],
    ['id' => 2, 'name' => 'admin2', 'email' => 'admin@example.com'],
    ['id' => 3, 'name' => 'admin3', 'email' => 'admin@example.com'],
]);
```

あるいは、

```php
<?php

App\Models\User::whereNull('email_verified_at')->updateBulk([
    ['id' => 1, 'name' => 'admin1', 'email' => 'admin@example.com'],
    ['id' => 2, 'name' => 'admin2', 'email' => 'admin@example.com'],
    ['id' => 3, 'name' => 'admin3', 'email' => 'admin@example.com'],
]);
```

のように実行します。


## 詳細

第1引数で渡した配列から、`id`(`Eloquent\Builder`からの場合は、モデルに設定された主キー)あるいは第2引数で渡したカラムで検索し、残りの値を更新します。上記の`Query\Builder`の例の場合は、以下のようなSQLにコンパイルされます。

```sql
UPDATE
    `users`
SET
    `name` = ELT(FIELD(`id`, ?, ?, ?), ?, ?, ?),
    `email` = ?
WHERE
    `email_verified_at` IS NULL
    AND `id` IN (?, ?, ?)
```

`email`は全行で同じとなっているため、`ELT()`, `FIELD()`は使わない形にします。また、`updateBulk()`以前に追加したWHERE句も別途設定されます。

さらに、`Eloquent\Builder`経由の場合は`updated_at`等も自動で設定されます。

`Query\Builder`経由の実行時に、主キーが`id`以外の場合、あるいは`Eloquent\Builder`で、主キー以外で検索したい場合は、第2引数にカラム名を指定します。

```php
DB::table('users')->updateBulk([
    ['name' => 'admin1', 'email' => 'admin1@example.com'],
    ['name' => 'admin2', 'email' => 'admin2@example.com'],
    ['name' => 'admin3', 'email' => 'admin3@example.com'],
], 'email');
```


# この記事のライセンス

![クリエイティブ・コモンズ・ライセンス](https://i.creativecommons.org/l/by/4.0/88x31.png)
この文書は[CC BY(クリエイティブ・コモンズ表示4.0国際ライセンス)](http://creativecommons.org/licenses/by/4.0/)で公開します。
3.16(標準) 正規分布4

## 1.答案

Z=|X|^kの分布関数は，

```math
\begin{align}
F_Z(z)&= P[|X|^k\leq z]\\
&= P[|X|\leq z^{1/k}]\ \ \ \ \ \because 0<k\\
&= P[-z^{1/k}\leq X\leq z^{1/k}]\\
&= \int_{-\infty}^{z^{1/k}}f_X(x)dx-\int_{-\infty}^{-z^{1/k}}f_X(x)dx
\end{align}
```

ゆえ，確率密度関数は

```math
\begin{align}
f_Z(z)&= f_X(z^{1/k})(\frac{1}{k}z^{\frac{1}{k}-1})-f_X(-z^{1/k})(-\frac{1}{k}z^{\frac{1}{k}-1})\\
&= 2f_X(z^{1/k})(\frac{1}{k}z^{\frac{1}{k}-1})-f_X(-z^{1/k})(-\frac{1}{k}z^{\frac{1}{k}-1})\\
&= 2f_X(z^{1/k})(\frac{1}{k}z^{\frac{1}{k}-1})\\
&= 2\frac{1}{\sqrt{2\pi}}\exp(-\frac{z^{2/k}}{2})\frac{1}{k}z^{\frac{1}{k}-1}\\
&= \frac{2}{k\sqrt{2\pi}}z^{\frac{1}{k}-1}\exp(-\frac{z^{2/k}}{2})
\end{align}
```

## 2.答案

Z=|X|^2mと置くと，

```math
f_Z(z)=\frac{1}{m\sqrt{2\pi}}z^{\frac{1}{2m}-1}\exp(-\frac{z^{1/m}}{2})
```

なので，

```math
\begin{align}
\mathbb{E}_{X\sim f_X}[X^{2m}]&= \mathbb{E}_{X\sim f_X}[|X|^{2m}]\\
&= \mathbb{E}_{Z\sim f_Z}[Z]\\
&= \int_0^\infty\frac{1}{m\sqrt{2\pi}}z^{\frac{1}{2m}}\exp(-\frac{1}{2}z^{\frac{1}{m}})dz\tag{1}
\end{align}
```

ここで，t=z^1/mと置換すると，

```math
\begin{align}
(1)&= \int_0^\infty\frac{1}{m\sqrt{2\pi}}t^{1/2}\exp(-\frac{1}{2}t)mt^{m-1}dt\\
&= \int_0^\infty\frac{1}{\sqrt{2\pi}}t^{(m+\frac{1}{2})-1}\exp(-\frac{1}{2}t)dt\\
&= \frac{(\frac{1}{2})^{1/2}}{\Gamma(\frac{1}{2})}\frac{\Gamma(\frac{1}{2}+m)}{(\frac{1}{2})^{\frac{1}{2}+m}}\int_0^\infty\frac{(\frac{1}{2})^{\frac{1}{2}+m}}{\Gamma(\frac{1}{2}+m)}t^{(m+\frac{1}{2})-1}\exp(-\frac{1}{2}t)dt\\
&= \frac{2^m\Gamma(\frac{1}{2}+m)}{\Gamma(\frac{1}{2})}
\end{align}
```

次に，Z=|X|^{2m+1}と置くと，

```math
f_Z(z)=\frac{2}{(2m+1)\sqrt{2\pi}}z^{\frac{1}{2m+1}-1}\exp(-\frac{z^{\frac{2}{2m+1}}}{2})
```

であるから

```math
\begin{align}
\mathbb{E}_{X\sim f_X}[|X|^{2m+1}]&= \mathbb{E}_{Z\sim f_Z}[Z]\\
&= \int_0^\infty\frac{2}{(2m+1)\sqrt{2\pi}}z^{\frac{1}{2m+1}}\exp(-\frac{1}{2}z^{\frac{2}{2m+1}})dz\tag{2}
\end{align}
```

ここで，

```math
t=z^{\frac{2}{2m+1}}
```

と置換すると

```math
\begin{align}
(2)&= \int_0^\infty\frac{1}{\sqrt{2\pi}}t^{(m+1)-1}\exp(-\frac{1}{2}t)dt\\
&= \frac{(\frac{1}{2})^{1/2}}{\Gamma(\frac{1}{2})}\frac{\Gamma(m+1)}{(\frac{1}{2})^{m+1}}\int_0^\infty\frac{(\frac{1}{2})^{m+1}}{\Gamma(m+1)}t^{(m+1)-1}\exp(-\frac{1}{2}t)dt\\
&= \frac{2^{m+\frac{1}{2}}\Gamma(m+1)}{\Gamma(\frac{1}{2}}
\end{align}
```

## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
技術ネタ発表のススメ

# 技術ネタ発表のススメ
　チーム内定例会で毎回5分ぐらいもらって技術ネタを発表するコーナーを作っているのですが、その背景や目的についてまとめてみます。


## 背景・目的・読み手
### 背景

- 昨今「VUCAの時代」と言われ、ますます1つのスキル・領域だけでは生き残っていくことが難しくなってきている。
- テレワークによるメンバー同士の分断が進んでおり、一体感を醸成する仕掛けがなにか必要
- 技術革新がますます加速しており、1人の情報収集だけでは追いつかない領域も出ている

### 目的

- IT技術者もプレゼン能力が必要な時代に
    - システム導入にあたって、各利害関係者に必要性をアピールするために必要
    - 自分のキャリア形成のため（転職・技術交流会での発表…など）
- 自分がこれまで興味を持たなかった分野・知らない分野に触れることで新しい化学反応が生まれる
    - あの考え方を現行のサービスに応用できないだろうか？
    - 今日聞いたソリューションを試しに導入し、サービス品質を向上することは出来ないだろうか？
    - 今後の提案に役立てられないだろうか？
- 死ぬまで勉強が必要
    - 経験する全てのことを「学びの対象」として面白がる習慣があるとよい
- アウトプットを伴うことで、高い学習効果が期待できる

### 読み手
　チームリーダ相当の方。


## 進め方
　メンバーの負担にならないようにしつつも、なにか有意義なネタを持ち帰ってもらうための時間として設計しています。

- 時間は5分程度
- ネタはITに関することなら何でも良い
- 強制はしない
    - こういうイベント、やらされ感があればあるほどやる気が無くなっていくし、やる意味がなくなるため
    - とはいえ、何人かが発表しないと回らなくなり自然消滅する可能性もあるため、コアメンバーを2～3人用意するか、毎回発表のネタをストックしておくと良い


## 効果
　定量的な効果はまだまだこれからではありますが、しばらく自分が毎回発表する体で始めてみたところ、普段発表しない方がたまにネタ作って発表してくださったり、意欲のある方がバリバリ仕事の深い情報共有に使ってくださったりと、定性的な効果は生まれているようです。


## 今後の課題
　メンバーが主体的に面白がって技術ネタを発表するようになるにはどうしたらよいか。
【Ruby】二桁の整数問題

二桁以上の整数を入力すると、十の位と一の位の数字の足し算、十の位と一の位の数字の掛け算をそれぞれ行い、最後に2つの結果を足し合わせて出力するプログラムをRubyで作成する。

という問題で私の最初の回答がこちら。

```rb
puts "二桁の整数を入力してください"
sum = gets.to_i

if sum >= 10
  num1 = sum / 10 % 10
  num2 = sum % 10
  total = (num1 + num2) + (num1 * num2)
  puts total
end
```

実行して数値を入力すると確かに要件通り動くように思われますが...
記述のスマートさがありません。

よって下記のようにするといいみたいです。

```rb
def addition(a, b)
  a + b
end

def multiplication(a,b)
  a * b
end

def slice_num(num)
  tens_place = (num / 10) % 10
  ones_place = num % 10
  return tens_place, ones_place
end

puts "二桁の整数を入力してください"
input = gets.to_i
X, Y = slice_num(input)
add_result = addition(X, Y)
multiple_result = multiplication(X, Y)
puts "足し算結果と掛け算結果の合計値は#{add_result + multiple_result}です"
```

ポイントは下記2点
1.整数同士（integer型）の計算だと返り値は整数
2.変数の定義をカンマ区切りにすることで、複数の変数を一度に定義している

感想
Rubyの基礎的なアルゴリズム問題ですが、メソッドへの意識がまだ低いため最初のような回答になったんだと思います。
「考え工夫する」ということ常に意識していきたいです。
製造現場のITシステム構築において知っておくと良い事柄

# 製造現場のITシステム構築において知っておくと良い事柄

## 背景・目的・読み手

### 背景
　製造現場の自動化・効率化のためにITシステムを構築することがあるが、IT技術者は製造現場の事柄について知らないことが多々ある。実体験の中で調べた言葉や、知っておいたほうが良さそうな言葉をまとめておいたほうが良いと至ったため本記事を作成。

### 目的
　製造現場のITシステム構築に携わるIT技術者向けに用語をまとめ、製造現場のユーザとの会話の一助とする、知らなかったり忘れたりしたときに見返す事ができるようにする。

### 読み手
　主に自分（と、同様の境遇のIT技術者）


## 用語
※随時記載していく想定。

### 製造関連機器

#### AGV
　Automatic Guided Vehicle。無人搬送車・無人搬送ロボット。自走させるために磁気テープ等によるガイドが必要。
参考：<a href="https://www.kantsu.com/case/2019-10-11/">AGV（無人搬送車）とは</a>

#### AMR
　Autonomous Mobile Robot。自律走行搬送ロボット。人との協業が主眼に置かれているため、AMRと人が協業できるよう、人の行う作業や運用法雨を明確に定める必要がある。
参考：

- <a href="https://www.kantsu.com/case/amr%ef%bc%88%e8%87%aa%e5%be%8b%e8%b5%b0%e8%a1%8c%e6%90%ac%e9%80%81%e3%83%ad%e3%83%9c%e3%83%83%e3%83%88%ef%bc%89%e3%81%a8%e3%81%af%ef%bd%9cagv%e3%81%a8%e3%81%ae%e9%81%95%e3%81%84%e3%82%84%e9%81%8b/">AMR（自律走行搬送ロボット）とは</a>
- <a href="https://www.kyodo-robot.com/blog_amr/202004-amr2">AGVとAMRの違い</a>
Proxmoxのバックアップで物理ディスクを除外する方法

お世話になります。

以下のような構成で物理ディスクをパススルーしたVMを作成しました。（VMWareでいうところのRDM）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/71a7aec0-d928-832f-967c-66f80906ba40.png)

しかし、このようなVMはスナップショットが使えません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/9224d352-153f-e460-2c9e-a7704be582d0.png)

また、バックアップしようとすると全ドライブのバックアップとなり、C:ドライブのみバックアップするといった指定ができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/66b0c27b-0af3-c609-1b48-2e8b03f548db.png)

そこでconfファイルを書き換えます。
以下のサイトを参考にさせて頂きました。
https://forum.proxmox.com/threads/how-to-backup-only-one-disk-for-a-vm-with-the-proxmox-backup-web-manager.5320/

```
nano /etc/qemu-server/<VMID>.conf
```
該当するディスクの末尾にbackup=noを付加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/a0e1eb14-b94a-89f5-65ca-856679db6f89.png)

そしてバックアップを再実行すると、C:のみのバックアップが開始されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790864/969ba51d-4fa3-f530-dccf-7a9625abd686.png)

今回はパススルーした物理ディスクを除外しましたが、仮想ディスクでも同じ方法が可能と思われます。

また、物理ディスクをパススルーするとスナップショットが使えなくなりますが、LVM-Thinボリュームをバックアップ先にすればシンプロビジョニングが効きますので実運用上はそれほどデメリットはなさそうです。（割り当て64GBに対し実容量16GBのみをバックアップ）
`require': cannot load such file -- rexml/document (LoadError)の対処法

メイラーの機能をつけるためrails g mailerを実行して
その後の工程を進めていき
rails s
サーバー起動しようと思い実行すると
なんだか果てしないエラー文がお出まし＾＾；

***ターミナルエラー文一部抜粋***

```sh
#~省略~
 `require':cannot load such file -- rexml/document (LoadError)

#~省略~

```
長文を読み解くと多分ここが原因かな...?と


その後もいろいろrails コマンドを試しても
全てrailsコマンドは死亡(全部エラー吐く


これでエラーが出るようになるという事は
毎回追加しないといけないgemっぽいのでメモ


***参考サイト***
[記事](https://stackoverflow.com/questions/65479863/rails-6-1-ruby-3-0-0-tests-error-as-they-cannot-load-rexml)
[gemサイト](https://rubygems.org/gems/rexml)

Gemファイルに追記
>gem 'rexml', '~> 3.2', '>= 3.2.5'
追記後
>bundle install

このgemを入れたら問題は解決しましたが、
なんか理由が明確にわからないから不安、、、

どなたか理由が分かる方いたらコメントで教えていただきたいです！

環境
rails6.1.4
ruby3.0.1
【Unity】AdMob テストアプリID


公式ページに見当たらなかったのでメモ

<font color="red">**両OSとも Google Mobile Ads Unity Plugin v8.5.1で使用したところ
実機ビルドにてアプリが起動しませんでした。そのため、こちらは使用せず
本番広告のアプリIDを使用した方が良いです。**</font>


## ANDROID
```
ca-app-pub-3940256099942544~3347511713
```


## iOS
```
ca-app-pub-3940256099942544~1458002511
```
物の名前がわからなくても教えてくれる映像判断ツール

#「これって何？」って思うことがありませんか？
下の画像の物の名前はわかりますか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1806653/66d317f8-c0bf-4c0c-8d33-6abef4bb531f.png)
正解は「バッグクロージャー」と言います。
私はバッグクロージャーと言われても何のことか最初わかりませんでした。
でも画像を見れば何をするための物なのかわからない人は少ないと思います。
このように世の中には画像で見れば知っていても、名前を知らない物ってありますよね。

#仕事で使う物も「これって何？」が多い
お店の中には沢山の機器が置いてあります。
しかし、それらの機器の名前を丁寧に教えてもらったことはないと思います。
似たような機械でも人によって呼び方が違ったりしていて、何の事を言っているのかわからない。
それに加えて「どこが管理しているのか？」「問い合わせ先はどこなのか？」完璧に理解している人は少ないのではないでしょうか。
一応問い合わせ先は機器にシールで貼り付けたり、一覧表はあったりしますが、<font color="Red">文字が擦れていて読めなかったり、一覧表もどれに該当するのかわからないと調べようもありません。</font>
滅多に触らない機器の場合、本部の担当者も引き継ぎができておらず、誰も知らない機器なんて物もよくあります。
困るのが正しい名称で会話しないとメーカーに「それはうちの機器ではないかもしれないので、本部に確認してくれ」と言われてしまう事もあります。
#名前はわかなくても大丈夫！問い合わせ先確認ツール
名前を教えてくれることに加えて、業務でも使えるよう問い合わせ先を教えてくれるツールを作りました。
電話番号を聞くボタンを押すと、写した物の名前と問い合わせ先を教えてくれます。
CodePenの[リンク先](https://codepen.io/junkihanawa/pen/WNjgvrV)
![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1806653/89589e33-e6d7-f91a-f033-e76667aaf3cd.gif)
利用したツール
Teachable Machine
CodePen
Node-RED
#Teachable Machineで対象の機器を設定
まずはTeachable Machineで機器の画像を覚えさせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1806653/0b1b0721-4c16-3d58-a1e1-f4d8ef8eeaa2.png)
#CodePenで画面とNode-Redに情報を送るJavaScriptを書きます。
コードの詳細は[リンク先](https://codepen.io/junkihanawa/pen/WNjgvrV)を参照してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1806653/ed83f03b-3c0f-a037-942d-6bf9becbc8a7.png)
#Node-REDで取得した機器情報から問い合わせ先を参照します
問い合わせ先はGoogleのスプレッドシートに記述してあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1806653/14a879af-4b2c-a66d-67d1-e7fc8171dc5e.png)
②の解説
Teachable Machineから取得した物の名前がスプレッドシートの配列と同じ文字があった場合、電話番号が入っている次の配列の値を取得します。

```javascript
for (  var i = 0;  i < 10;  i++  ) {
 if (msg.item == msg.payload[i]){
     msg.payload = msg.payload[i + 1]
     break;
 }
}    
return msg;
```
#当該ツールを振り返ってみて
今回はスプレッドシートから情報を取得するやり方を使ってみました。
この仕組みならTeachable Machineとスプレッドシート側を変えればユーザーにはまったく入力をさせることもないため実用的だと感じました。
同僚にも使ってもらったところ、以下の回答をもらいました。
**・全くPCの知識がなくても使えて便利。**
**・今ある一覧表をデータとして使えばよいので導入も簡単**
**・画像をどれだけ覚えさせる事ができるかにもよる**
**・膨大なデータを覚えこませても処理速度早いのか？**
**・問い合わせ先以外にも機器の説明を出したら教育にも使える**
#足りないところ
導入にあたり処理速度と画像データをどれだけ覚えさせられるのかは課題だと思います。
なかなか表示されないと人に聞いた方が早いと思われると作った意味がなくなってしまいます。
CSS部分を工夫してみたかったのですが、ユーザーにとっつきやすい画面をどのようにすればよいのかアイデアが思いつきませんでした。
別パターンも見せましたが、もっとシンプルでいいんじゃないと言われてしまい、今の形に落ち着きました。
デザイン部分は苦手なので、プログラムより苦戦しそうです・・・
SQLで連続する日付の両端の日を取得する

# これは何

SQLテーブルにてユニークな日付の入ったカラムから、連続した日を抽出しその開始と終了の両端の日を取得したい。そのための作業メモ。

## 方針

1. 自己結合
1. Window関数

## 先に結論

SQL文のわかりやすさで自己結合一択。データ量が多い場合はWindow関数の方がスキャンが1回で済むがそもそも日付連続するデータは有史以来多くないためその恩恵に意味がない。

以後 bigquery 上で実行できる（ユニーク、ソート済みのデータから）サンプルを書く。

インプット

```csvs
行	_date	
1	2021-01-01
2	2021-01-02
3	2021-01-04
4	2021-01-07
5	2021-01-08
6	2021-01-09
7	2021-01-15
8	2021-01-16
9	2021-01-20
```

### 方針1

- pros: 自己結合し `d1._date - COUNT(d2._date)` で連続する対象を同一グループをするところがテクニカル。そこ以外は素直なSQL文でわかりやすい
- cons: 自己結合なのでスキャンが2回実行される

```sql
WITH d AS (
  SELECT * FROM
    UNNEST(ARRAY<DATE>[
        "2021-01-01", "2021-01-02",
        "2021-01-04",
        "2021-01-07", "2021-01-08", "2021-01-09",
        "2021-01-15", "2021-01-16",
        "2021-01-20"
    ] ) AS _date ),
o1 AS (
  SELECT
    d1._date, d1._date - COUNT(d2._date) AS grp
  FROM d AS d1 INNER JOIN d AS d2 ON
    d1._date >= d2._date
  GROUP BY
    d1._date ),
out1 AS (
  SELECT
    MIN(_date) AS _from, MAX(_date) AS _to
  FROM
    o1
  GROUP BY
    grp )

SELECT * FROM out1
```

結果

```csvs
行	low	high	
1	2021-01-01	2021-01-02
2	2021-01-04	2021-01-04
3	2021-01-07	2021-01-09
4	2021-01-15	2021-01-16
5	2021-01-20	2021-01-20
```

### 方針2

pros: あるのか・・・?SQLパズル力が高められるぐらい（実践には不要）
cons: SQL文が複雑で解読しずらい

```sql
WITH d AS (
  SELECT * FROM
    UNNEST(ARRAY<DATE>[
        "2021-01-01", "2021-01-02",
        "2021-01-04",
        "2021-01-07", "2021-01-08", "2021-01-09",
        "2021-01-15", "2021-01-16",
        "2021-01-20"
    ] ) AS _date ),
o1 AS (
  SELECT
    _date,
    LAG(_date) OVER(ORDER BY _date) AS prev_diff,
    LEAD(_date) OVER(ORDER BY _date) AS next_diff,
  FROM d
  ),
o2 AS (
  SELECT
    _date,
    CASE WHEN COALESCE(EXTRACT(DAY FROM _date - prev_diff), 0) <> 1 THEN _date ELSE NULL END AS low,
    CASE WHEN COALESCE(EXTRACT(DAY FROM next_diff - _date), 0) <> 1 THEN _date ELSE NULL END AS high
  FROM o1
),
o3 AS (
    SELECT 
        low,
        CASE 
          WHEN high IS NULL THEN min(high) OVER(ORDER BY _date ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) 
          ELSE high
        END AS high
    FROM o2
),
out2 as (
    SELECT * FROM o3 WHERE low IS NOT NULL
)
SELECT * FROM out2
```

結果: 同上のため略

## 参考文献

[SQL実践入門](https://gihyo.jp/book/2015/978-4-7741-7301-6) 第8章
Rustでズンドコキヨシ

先駆者様: [ズンドコキヨシ with Rust](https://qiita.com/tatsuya6502/items/aea38af7fcfb912c3aff)

## TL;DR

```console
$ ./target/debug/zundoko-cli
ズンズンドコドコドコズンズンズンズンドコ
キ・ヨ・シ！
```

## コード

```rust:main.rs
use rand;

fn main() {
    println!("{}", ZundokoKiyoshi::build_str());
}

enum Zundoko {
    Zun,
    Doko,
}

impl ToString for Zundoko {
    fn to_string(&self) -> String {
        match self {
            Self::Zun => "ズン".to_string(),
            Self::Doko => "ドコ".to_string(),
        }
    }
}

struct ZundokoKiyoshi;

impl ZundokoKiyoshi {
    fn zundoko() -> Zundoko {
        match rand::random() {
            true => Zundoko::Zun,
            false => Zundoko::Doko,
        }
    }

    fn kiyoshi() -> String {
        "\nキ・ヨ・シ！".to_string()
    }

    fn build_str() -> String {
        let mut result = String::new();
        let mut cnt = 0;

        loop {
            let zundoko = Self::zundoko();
            result += &zundoko.to_string();

            match zundoko {
                Zundoko::Zun => cnt += 1,
                Zundoko::Doko if cnt < 4 => cnt = 0,
                _ => {
                    result += &Self::kiyoshi();
                    break;
                }
            }
        }

        result
    }
}
```

## 終わりに

Rust は触っていないとすぐお作法を忘れてしまいますね。
ズンドコキヨシはリハビリにはちょうどよかったです。

今回はちょっと冗長なコードで記述させていただきました。
でも先駆者様はすごくシンプルなコードで記述できているんですよね。見習いたいです。
TabBarControllerの各タブを別のStoryboardへ分割する


## はじめに
StoryboardでTabBarControllerを追加した際に、各タブのViewControllerを別Storyboardに分けたい。

## 環境
Xcode 12.4
Swift 5.3.2

## 作業手順

対象のタブのViewControllerを選択し、「Editor」「Refactor to Storyboard」をクリック
![スクリーンショット 2021-08-07 17.24.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/eaea4d8d-3b5b-367f-dcb9-995ed2853368.png)


分割するStoryboard名を決め、配下に置きたいフォルダーをGroupで選択する
![スクリーンショット 2021-08-07 17.29.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/2a7b1a97-7515-16ec-a428-17a123a6bb05.png)


これで別のStoryboardに分けられました
![スクリーンショット 2021-08-07 17.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/c1370635-9bed-faf2-0284-fc65e31b1075.png)


TabBarControllerのあるStoryboardで必要な分のViewControllerを追加し、同じく作業を繰り返す
![スクリーンショット 2021-08-07 17.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/405ea00c-7a9a-c7e9-a21d-b13af164bba5.png)

## 結果
無事TabBarControllerのタブ二つをそれぞれ別のStoryboardに分けられました。
![スクリーンショット 2021-08-07 17.33.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631585/548acf2d-8323-e664-ec2d-74dca9478775.png)


## 感想
今後も同じことをやりそうだったので、次回のためのメモです。

## 参考記事
特になし。
色々いじってみたら上手くいきました。
もっと別の方法があるのかもしれませんが。
CircleCIでECRのログインができない

CircleCIで以下のエラーが出た時にめちゃめちゃ悩みました。

```sh
#!/bin/bash -eo pipefail
# get-login-password returns a password that we pipe to the docker login command
aws ecr get-login-password --region $AWS_DEFAULT_REGION --profile default | docker login --username AWS --password-stdin $AWS_ECR_ACCOUNT_URL

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
aws: error: argument operation: Invalid choice, valid choices are:

batch-check-layer-availability           | batch-delete-image                      
batch-get-image                          | complete-layer-upload                   
create-repository                        | delete-repository                       
delete-repository-policy                 | describe-images                         
describe-repositories                    | get-authorization-token                 
get-download-url-for-layer               | get-repository-policy                   
initiate-layer-upload                    | list-images                             
put-image                                | set-repository-policy                   
upload-layer-part                        | get-login                               
help                                    
Error: Cannot perform an interactive login from a non TTY device

Exited with code exit status 1
CircleCI received exit code 1
```

その時の設定は以下の感じです。

```yml
orbs:
  aws-cli: circleci/aws-cli@2.0.3
  aws-ecr: circleci/aws-ecr@7.0.0

commands:
  build_and_push:
    parameters:
      dockerfile: { type: string }
      repo:       { type: string }
      build_args: { type: string, default: "" }
    steps:
      - aws-cli/install
      - checkout
      - run: echo "export DATE_TAG=`date +%Y%m%d%H%M%S`" >> $BASH_ENV
      - aws-ecr/build-and-push-image:
          checkout:         false
          region:           AWS_DEFAULT_REGION
          dockerfile:       << parameters.dockerfile >>
          extra-build-args: << parameters.build_args >>
          repo:             << parameters.repo >>
          tag:              latest
      - aws-ecr/build-and-push-image:
          checkout:         false
          region:           AWS_DEFAULT_REGION
          dockerfile:       << parameters.dockerfile >>
          extra-build-args: << parameters.build_args >>
          repo:             << parameters.repo >>
          tag:              ${DATE_TAG}
```

## 原因
- 原因は、最初の`aws-cli/install`でバージョン2系を使っているのに、既に1系がインストールされていて、　`aws ecr get-login-password`というコマンドが存在しないことでした。

### 1系がインストール済みで2系のインストールがスキップされていることのスクショ

![スクリーンショット 2021-08-09 9.00.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89696/92a64530-f174-5aee-e654-4050ee6c1af9.png)

### 対応
- 以下のようにして回避しました。

```yml
- aws-cli/install:
    override-installed: true
```
Rx Pills Point

RxPillsPoint.com is legit Online Pharmacy. Good prices; Good quality products; Fast and Reliable delivery; Best customer support; Various payment options
Rx Pills Point online pharmacy services is an Online US Based Drug Store for your Prescription Drugs. We are committed to providing Safe and Quality branded Drugs from US FDA approved manufacturers to our customers. https://rxpillspoint.com
![Slider-3-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448997/1450cc2a-8d4c-f326-c3a6-c759c9dd1fa4.jpeg)
【Git】ブランチ名を変更する方法（リモート・ローカル）


#対象者

* ローカルブランチ名を変更したい方


#目的

* ローカルブランチ名を変えてより他者にわかりやすいブランチ名に変更すること

#実際の手順と実例
###1.ローカルブランチ名の変更方法

下記コマンドで変更できます

```
$ git branch -m <現在のブランチ名> <新しいブランチ名>
```

これで変更できます。
作成後にこれでは分かりくい！と感じたときにおすすめです。

###2.リモートブランチ名の変更方法

````
$ git branch -m 古いブランチ名 新しいブランチ名
$ git push -u origin 現在のブランチ名
$ git push origin :リモートのブランチ名
`````

もしくは、GitHub上でも変更できます。

####投稿者コメント

なんだかブランチ名がわかりにくいと思って変更方法調べてみました。そもそも最初からわかりやすい名前付けていればよかったのですが、、、、、

####My Profile
プログラミング学習歴３ヶ月目のアカウントです！
プログラミングスクールで学んだ内容や自分が躓いた箇所等のアウトプットの為に発信しています。
また、プログラミング初学者の方にわかりやすく、簡潔にまとめて情報共有できればと考えています。
もし、投稿した記事の中に誤り等ございましたら、コメント欄でご教授いただけると幸いです。
pd.DataFrame をエクセル感覚で操作するいくつかの方法

pandas の DataFrame は、エクセルを操作するイメージで簡単にデータを処理できるのですが、毎回「あれどうやったらいいんだっけ……」とググっている気がするのでまとめました。

# 行の階差を取りたい

![aoeua.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/97929572-d04c-6ebc-7fcd-131f4290695a.png)

```python:行の階差を取りたい
diff = df['A'].diff(1)
```

![ueoau.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/0431c944-6927-8dfc-a049-ee4e447416d1.png)

```python:行の階差を取りたい
diff = df['A'].diff(2)
```

# 行を上下（行方向）にずらしたい

![oeua.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/a099c72a-a055-62b9-187e-2c91645f98e1.png)

```python:行を上下にずらしたい
shift = df['A'].shift(2)  # A'
shift = df['A'].shift(-2) # A''
```

# NaN になった行を削除したい

![ouaou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/83435e16-80dc-e736-f1d8-4f2179703f9c.png)

```python:NaNになった行を削除したい
df = df.dropna()
```

# DataFrame を行末に追加していきたい

![opuao.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/b1bf24f0-d3b4-e9de-0353-0bf8a08e0f37.png)

```python:DataFrameを行末に追加していきたい
df = pd.DataFrame([])
for _ in range(N):
  tmp = pd.DataFrame(...)  # DataFrame型のtmpを作る
  tmp = ...                # tmpに対して何か加工する
  df = df.append(tmp)      # dfの末尾にtmpを追加（for文がまわるたびにtmpが追加されていく）
```

# DataFrame を列方向に追加したい

![aouo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/e64f5c8f-a182-9c47-99ef-48e7a8f112ba.png)


```python:DataFrameを列方向に追加したい
df = pd.concat([df1, df2], axis=1)
```

# DataFrame を２分割したい

![eupao.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/797cf070-ad5b-ec43-48dc-e118a50c1b16.png)

```python:DataFrameを２分割したい
df1 = df.iloc[:, 0:2]
df2 = df.iloc[:, 2:3]
```

# bool を 1/0 に変換したい

![opaou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/667942/a1faf1e6-c9f6-7fe7-8d65-954544a6b073.png)

```python
df = df_bool * 1
```
AI時代に生き残れるエンジニアの条件とは？

https://www.youtube.com/watch?v=cHaE5oFaVuI

を視聴して

#SE
最近聞かなくなった**SE**という言葉
「ユーザ要件をシステム要件へコンバートする仕事」
と個人的に位置づけていた職種。
今後、人間が受け持つ領域として、業務寄りのスキルが必要になってくることから、SEの需要が高まると予想されます。

#EUC
これも最近聞かなくなった言葉
End User Computingの略
[WiKi](https://ja.wikipedia.org/wiki/エンドユーザー・コンピューティング) では

> エンドユーザー・コンピューティング（英: end-user computing, EUC）とは、プログラマーや技術者でなくてもアプリケーションを作成できるシステムのことである[1]。EUCは、情報システム部や開発部門の担当者ではない、業務部門のエンドユーザーがシステムの構築や運用管理に携われるようにするための一連のアプローチのことを指す。

と説明しています。

#Excel
EUCの代表格
一般企業でも多くの企業が多かれ少なかれ使っているもので、Webエンジニアに比べて、比較にならないほど必要とされている人材。
一番使いやすい、そして効果的なシステムを構築するには、実際に使う人が開発することが理想です。
現在の開発では、業務要件をSEが分析し、開発の専門家が仕様に基づいて開発するという流れ
この流れの中では、多くの分断と変換が生じています。
この変換時にバグや齟齬の発生とともに多くの稼働と時間を使うことになります。
エンジニアにもコミュニケーションスキルが求められるのはこのギャップを埋めるためです。
ここがシームレスになることがEUCの最大の利点です。

自分で業務要件を決め、自分でシステム仕様を決め、自分で実装し、自分で使う。。
コミュニケーションスキルもそれほど要求されず、ドキュメントも最小化できます。

#VBA
Excelを自動化するためのプログラム言語
PCが世に出だした頃のプログラミング言語Basicを基にしている言語
おそらく、世界で一番使われているプログラミング言語
面倒な環境構築も不要で、コンパイルも不要
２バイト文字も変数などに使用できるので、日本人には理解しやすいプログラムを書くことができます。
EUCには最適な言語で、最適な組み合わせ

#効果
筆者自身も長年IT企業で働いてきて、多くの現場でExcelとVBAによる自動化を進めてきました。
２０人日かかっていた毎月のレポート作成を３人日に短縮するなど、貢献度はそれなりに大きかったのではと考えています。

#結論
AIが進んで特殊なスキルを必要とするWebエンジニアをはじめとする開発環境が縮小しても、業務に近いスキルの需要は拡大してきます。
そして、多くの企業でEUCが進めば、その効果は膨大なものになります。
その中で、エンジニアが生き残るために業務要件の分析やEUCの推進者として準備することは無駄ではないと考えます。
プログラム言語や開発スキルを磨くことだけが企業の需要に合うとは限りません。
業務を改善し効率化することが企業がエンジニアに求める最終的な要件です。
戦術（テクニック）だけでなく戦略（目的達成）のためのスキルを磨くことも重要です。
Macで定期的にcsvファイルをDLして任意の名前をつけて保存する

# 社内のツールやクラウドツールなどからcsv形式のファイルをDLする業務を自動化したい

- ツール側で定期DLの仕組みがなくローカルで自動化する必要があるとする
- Macの場合はopenコマンドを利用してDLを自動化する方法が便利
- 以下の手順でやることが多い

## openコマンドでcsvファイルをDLできるようにする
### 1.csvダウンロードのURLを読み解く
#### URLを調べる
- クラウドツールなどで、csvダウンロードのURLが公開されていることが前提
- DLボタンを右クリックでパスをコピーなどでわかる事が多い

#### URLを解析する
- だいたい以下のような形式が多い
    - ```https:xxxxxxx｛固定URL1｝/segmentxx{セグメント}/xxxxxxx｛固定URL2｝/yyyymmdd{データ抽出開始日}/xxxxxxx｛固定URL3｝/xx{データの抽出期間}```
    - この**固定のURL**と**可変のパラメータ**を見極める

#### openコマンド用の変数を考える
- 上記の例でいうと、以下のような変数が考えられる
    - 固定URLの変数
        - URL変数1=https:xxxxxxx｛固定URL1｝
        - URL変数2=/xxxxxxx/｛固定URL2｝
        - URL変数3=/xxxxxxx｛固定URL3｝
    - 可変パラメーターの変数
        - セグメント=segmentxx{セグメント}
        - データ抽出開始日=yyyymmdd
        - データの抽出期間=xx{データの抽出期間}
- この可変パラメーターを自由に変更しつつ、openコマンドで開けるようにする



### 2.openコマンドで抽出するscript
#### openコマンドの基本的な使い方
```bash
#!/bin/bash

open "https://qiita.com/"
```
これを、解析したURLの変数を使えるようにする

```bash
#!/bin/bash

# 抽出用の変数
## 固定URLの変数
URL変数1=https:xxxxxxx｛固定URL1｝
URL変数2=/xxxxxxx/｛固定URL2｝
URL変数3=/xxxxxxx｛固定URL3｝
## 可変パラメーターの変数
セグメント=segmentxx{セグメント}
データ抽出開始日=yyyymmdd
データの抽出期間=xx{データの抽出期間}

# 抽出用openコマンド
open ""$URL変数1""$セグメント""$URL変数2""$データ抽出開始日""$URL変数3""$データの抽出期間""

```

さらに、引数で可変パラメーターを指定できるようにする

```bash
#!/bin/bash

#########################################
# csvDL用script
# 引数
# 1:セグメント
# 2:データ抽出開始日(yyyymmdd)
# 3:データの抽出期間
# （利用例）sh csv_dl.sh segmentA 2021-7-1 7
#########################################

# 抽出用の変数
## 固定URLの変数
URL変数1=https:xxxxxxx｛固定URL1｝
URL変数2=/xxxxxxx/｛固定URL2｝
URL変数3=/xxxxxxx｛固定URL3｝
## 可変パラメーターの変数
セグメント=$1
データ抽出開始日=$2
データの抽出期間=$3

# 抽出用openコマンド
open ""$URL変数1""$セグメント""$URL変数2""$データ抽出開始日""$URL変数3""$データの抽出期間""

```

### 3.DLしたファイルの名前を変更して保存するscript
- csvDL系のファイル名はだいたいわかりにくいので一貫性のあるファイル名に変更する
- csvDLしたファイルがローカルのdownloadsにおかれる場合を想定
- ```固定のファイル名+セグメント名+データ抽出開始日+データ抽出期間.csv```というファイル名にしたい場合

```bash
#!/bin/bash
 cd /Users/DIRNAME/Downloads
  text=$(ls -t | head -n 1)
  mv "$text" "ファイル名"$セグメント""$データ抽出開始日""$データの抽出期間".csv"
```

### ４．処理を一つにまとめる

```bash
#!/bin/bash

#########################################
# csvDL用script
# 引数
# 1:セグメント
# 2:データ抽出開始日(yyyymmdd)
# 3:データの抽出期間
# （利用例）sh csv_dl.sh segmentA 2021-7-1 7
#########################################

# 抽出用の変数
## 固定URLの変数
URL変数1=https:xxxxxxx｛固定URL1｝
URL変数2=/xxxxxxx/｛固定URL2｝
URL変数3=/xxxxxxx｛固定URL3｝
## 可変パラメーターの変数
セグメント=$1
データ抽出開始日=$2
データの抽出期間=$3

# 抽出用openコマンド
open ""$URL変数1""$セグメント""$URL変数2""$データ抽出開始日""$URL変数3""$データの抽出期間""
sleep 10 # ファイルを保存するまでスリープさせる

# ファイル名を変更して保存
cd /Users/DIRNAME/Downloads
text=$(ls -t | head -n 1)
mv "$text" "ファイル名"$セグメント""$データ抽出開始日""$データの抽出期間".csv"
```

## 作成したscriptを定期実行できる仕組みつくる
Automatorなどを利用して定期的に叩く仕組みを作成すれば完了！

以上

## ひとこと
- 絶対もっとよい方法ありそうなのと、書き方も拙いので忌憚なきご意見を
- 世の中のcsvファイルDLの命名規則を統一化してほしい
Notificationを使ったオブザーバパターンを理解

## Notification

`Poster`と`Observer`は直接繋がっていないが、`addObserver`を使って、通知を監視し通知があった際に`#selecter`で指定した関数を実行可能です。

```swift
import Foundation

class Poster {
    static let notificationName = Notification.Name("SomeNotification")
    
    func post(message: String) {
        NotificationCenter.default.post(name: Poster.notificationName, object: message)
    }
}

class Observer {
    init() {
        NotificationCenter.default.addObserver(self, selector: #selector(handleNotification(_:)), name: Poster.notificationName, object: nil)
    }
    
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
    
    @objc func handleNotification(_ notification: Notification) {
        if let object = notification.object {
            print(object)
        }
        print("通知を受け取りました")
    }
}

var observer = Observer()
let poster = Poster()
poster.post(message: "Hello")


```
ひさしぶりにGithub Desktopを使おうと思ったら、アカウント認証が通らなくなったときの解決方法

#一度サインアウト、そしてサインイン
以上
（これに気づくのに時間かかりました）

##サインアウト手順：
![スクリーンショット 2021-08-09 4.18.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/05968ecf-a9df-60fb-80da-668a9057d9bd.png)
![スクリーンショット 2021-08-09 4.20.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552712/ab19d5cd-9853-0d6e-a45d-1ab39baf44b6.png)

再びサインインしてください
Visual Studio Codeをroot実行する方法

# 概要

* VS Codeをroot権限 (sudo)で実行する方法
    * Dockerコンテナ内などrootユーザしかいない場合に役立つ
* 「--user-data-dir」オプションと、--no-sandboxオプションをつけると起動可能
    * ver.1.57系統までは、「--user-data-dir」オプションのみで起動できたが、ver.1.58以降は「--no-sandbox」を追加しないと起動しない


# 方法

```bash
$ code --user-data-dir="~/.vscode-root" --no-sandbox 
```

* 「--user-data-dir」は、任意のディレクトリを設定可能
    * [参考：VS Code の設定ファイルの場所](https://maku.blog/p/tfq2cnw/)
* 「--no-sandbox」は、v1.58以降は必須

## スクリプト化

```bash
$ cd ~/bin
$ vi code-as-a-root-user.sh
```

code-as-a-root-user.sh

```bash
#!/bin/bash
code --user-data-dir="/root/.config/Code" --no-sandbox
exit 0
```

```bash
$ chmod +x code-as-a-root-user.sh
```

# 参考

* https://github.com/microsoft/vscode/issues/129273
* https://stackoverflow.com/questions/67929938/running-vs-code-with-the-root-privileges-not-work-anymore-in-ubuntu-linux/68637450#68637450
mod_wsgi  pip  install error

## mod_wsgi を pip でインストールできない場合のメモ

```
# pip install mod-wsgi
Collecting mod-wsgi
  Downloading https://files.pythonhosted.org/packages/b6/54/4359de02da3581ea4a17340d87fd2c5a47adc4c8e626f9809e2697b2d33f/mod_wsgi-4.9.0.tar.gz (497kB)
     |████████████████████████████████| 501kB 2.9MB/s
    ERROR: Command errored out with exit status 1:
     command: /usr/bin/python3.8 -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/tmp/pip-install-_whtcua2/mod-wsgi/setup.py'"'"'; __file__='"'"'/tmp/pip-install-_whtcua2/mod-wsgi/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base /tmp/pip-install-_whtcua2/mod-wsgi/pip-egg-info
         cwd: /tmp/pip-install-_whtcua2/mod-wsgi/
    Complete output (5 lines):
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-install-_whtcua2/mod-wsgi/setup.py", line 88, in <module>
        raise RuntimeError('The %r command appears not to be installed or '
    RuntimeError: The 'apxs' command appears not to be installed or is not executable. Please check the list of prerequisites in the documentation for this package and install any missing Apache httpd server packages.
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
```

Apache の dev がないのが原因

```
# dnf install -y rpm-build
# dnf install -y httpd-devel
# pip install mod-wsgi
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip install --user` instead.
Collecting mod-wsgi
  Using cached https://files.pythonhosted.org/packages/b6/54/4359de02da3581ea4a17340d87fd2c5a47adc4c8e626f9809e2697b2d33f/mod_wsgi-4.9.0.tar.gz
Installing collected packages: mod-wsgi
    Running setup.py install for mod-wsgi ... done
Successfully installed mod-wsgi-4.9.0
# dnf install -y python3-mod_wsgi
```

ちなみに MySQL 関係のモジュールがインストールできない場合は python38-devel がインストールされていないのが原因のこともあり
[2021Aug] Mingw-w64 バージョン別サポート API レベルを軽く調べてみた

# はじめに

[先日](https://qiita.com/teruo-oshida/items/d5bd139b561d49a2d0f7) Debian Buster で Mingw-w64 v6.0.0 を試したとき、使いたかった [GetCurrentProcessToken()](https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentprocesstoken) が使えず、後日 Ubuntu Focal Fossa の v7.0.0 なら使えるのかなと試しました。

結果、使えました。めでたしめでたし。

なんですが、何となく、Mingw-w64 がバージョン別にサポートしている API レベルってどんな感じなんだろうと気になったので、軽く調べてみようと思い立ち、ホントに軽く調べた次第です。


# 結論

WINVER と _WIN32_WINNT を簡単に一覧してみた結果が下記です。

予想していたことではありますが、Mingw-w64 v6 だから Windows 7 相当、とか、そういうことではなかったです。Windows 順ではなく要望順に実装しているのでしょう。互換処理系ではリーズナブルだと思います。

|Code|Windows Ver|v6.0.0|v7.0.0|v8.0.2|v9.0.0|
|:--|:--|:-:|:-:|:-:|:-:|
|0x0400|NT 4.0|o|o|o|o|
|0x0500|2000|o|o|o|o|
|0x0501|XP|o|o|o|o|
|0x0502|XP 64bit / Server 2003|o|o|o|o|
|0x0600|Vista / Server 2008|o|o|o|o|
|0x0601|7 / Server 2008 R2|o|o|o|o|
|0x0602|8 / Server 2012|o|o|o|o|
|0x0603|8.1 / Server 2012 R2|o|o|o|o|
|0x0604|10 Technical Preview|x|x|o|o|
|0x0605|???|x|x|o|o|
|0x0606|???|x|x|o|o|
|0x0A00|10 / Server 2016, 2019|o|o|o|o|


# 不明な Windows バージョンについて

前記表中 Windows Ver の列が ??? の行が２つありますが、これらのコードに対応する Windows バージョンを見つけることができませんでした。
[2020-06-19 付の一覧](https://docs.microsoft.com/ja-jp/cpp/porting/modifying-winver-and-win32-winnt?view=msvc-160)には出現していませんし、site:microsoft.com でググってもヒットしません。

`winuser.h` で `>= 0x0605` と `>= 0x0606` の箇所を見ると、DPI 関連の関数が出てきます。[GetThreadDpiHostingBehavior()](https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getthreaddpihostingbehavior) など。同関数のシステム要件は Windows 10 1803 以降のようです。他方 [.NET Framework 4.8 の新機能](https://docs.microsoft.com/ja-jp/dotnet/framework/whats-new/)として WPF の高 DPI の強化があるそうです。

WPF デビューは Vista にプリインストールされている .NET Framework 3.0 でした。WPF は 0x0600 番台で管理されているのかもしれません。


# ところで GetCurrentProcessToken() デビューは

Mingw-w64 に GetCurrentProcessToken() が実装されたのは、v6 から v7 の間の [2018-09-27 のコミット](https://sourceforge.net/p/mingw-w64/mingw-w64/ci/8b329a09beeada1b80d05aaa51faa991c1dba6cb)でした。

ちなみに GetCurrentProcessToken() が返す疑似ハンドルは固定値で `-4` です。


# おわりに

使いたい関数などが Mingw-w64 で利用できるかどうかは、つど個々のバージョンにて確認するしかなさそうです。
なので、出来るならば最新リリースを実行できるようにしておくと良さそうです。

そして、Snappy には Mingw-w64 は無いようです。残念。
Ubuntuに最新版のNode.jsをインストールする

Ubuntuに最新版のNode.jsをインストールする方法を紹介します。
また、簡単にですがnpmの使い方も紹介します。

OSは「Ubuntu Desktop 18.04.5」です。



## Node.jsのインストール
バージョン14.15.5を利用するため、ディストリビューションの安定版ではなく、NodeSourceで管理されているPPAをインストールします。

まず、curlをインストールします。

```
$ sudo apt install -y curl
```

curlコマンドでNodeSourceからPPAをダウンロードします。
続いて、ダウンロードしたモジュールのビルドに必要になるため、build-essentialをインストールします。

```
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt install -y build-essential
```

下記コマンドでPPAをインストールします。
インストール後は、バージョン確認をします。

```
$ sudo apt install -y nodejs
```

```
$ node -v
v14.15.5
$ npm -v
6.14.11
```



## npmについて
最初に初期化処理を行います。
初期化処理を行うと、package.jsonが生成されます。
package.jsonはjson形式で記載されたインストールしたライブラリを管理するための目録のような情報です。

ここでは、sampleというディレクトリ上で行いました。

```
$ mkdir sample
$ cd sample
$ npm init
```

例として、react、nextライブラリをインストールしてみます。
バージョンも指定しておきます。

```
$ npm install react@16.2.0 next@10.1.3
```



## 参考文献
Ethereum and Solidity: The Complete Developer's Guide

https://www.udemy.com/course/ethereum-and-solidity-the-complete-developers-guide/

試して学ぶ スマートコントラクト開発

https://www.amazon.co.jp/dp/4839966885

React.js&Next.js超入門

https://www.amazon.co.jp/dp/4798056928
CDN で手軽に Font Awesome を使う

どこにでも書いてある簡単すぎる内容ですが、余計な情報を省いて、最短で [Font Awesome](https://fontawesome.com/) を使えるようにメモとして書いておきます。

## サンプルコード

次のように書けば、どんなフレームワークでも関係なく Font Awesome が使えます。

```sample.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <link rel ="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css">
  <title>test</title>
</head>
<body>
  <i class="fas fa-thumbs-up"></i>
</html>
```
こんな感じでアイコンが表示されます。
![2021-08-09 012838.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/36699748-6757-1183-907c-37ca7eb8466d.png)

## 補足としての説明

### css ファイルを読み込む URI を取得する

次の１行で、Font Awesome を表示する css ファイルを読み込んでいます。

```html
<link rel ="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css">
```
この css ファイルの URI は「[font-awesome - Libraries](https://cdnjs.com/libraries/font-awesome)」から取得できます。
![2021-08-09 013232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/1d847a55-bf00-07ac-dcfd-497c90b363d9.png)

### 使用するアイコンの HTML を取得する

次の１行でアイコンを表示しています。

```html
<i class="fas fa-thumbs-up"></i>
```
この HTML は、[Font Awesome](https://fontawesome.com/)のサイトに行って、取得します。
フリーのものを使うなら「Free Icons」（赤枠部分）をクリックします（2021年8月現在）。
![2021-08-09 014159.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/69781514-0a18-54cc-f8ac-85d5df020bcd.png)
表示されたアイコンから、必要なものを探し出しクリックます。
![2021-08-09 014854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/e7ce8a1e-3866-d61b-2d02-028d139bbe40.png)
赤枠部分が必要な HTML です。クリックすればコピーで取得できます。
![2021-08-09 015157.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551412/1c84291f-f4ca-b8f6-2b1f-977d9077e91c.png)
＜参考サイト＞
[Font Awesome 5のアイコンをCDNとダウンロードデータでブラウザ表示する](https://notes-de-design.com/website/use-fontawesome-cdn-download/)
[Font Awesome 5は公式のCDNでCSS配布をやめるらしい](https://tadtadya.com/html-css-fontawesome-quit-official-cdn/)

## 雑記

現在は、Spring Boot という WEB フレームワークを使っていますが、ダウンロードしてライブラリ（[MVN Repository Font Awesome](https://mvnrepository.com/artifact/org.webjars/font-awesome/5.15.3)）を入れるのは面倒なのでパスしました。必要に迫られたときに調べれば良いかと思います。