OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPTで万能Slack秘書を作る話

ChatGPT（正確にはGPT3.5）の凄さに感動したので、万能Slack秘書目指して作っていきます。
記事後半に簡単な手順も書いています。

# GPT知らない人は以下tweetからどうぞ

https://twitter.com/yakigac/status/1611741046802898944

# 結果

Slackから色んな仕事をお願いできるSlack秘書ができた（最初の一歩）。
[コードはこちらから](https://github.com/yakigac/gpt3chatbot)）。
![image](https://user-images.githubusercontent.com/10434946/211309598-246e8766-cac1-476b-a28e-13b3610bf630.png)

## 現時点でできること

・Slackを使った会話形式でのGPTとのやり取り（同じチャンネルで話かけられた内容を覚えている）
・AI(GPT)がプログラムをSlackのスニペットで返す

## 現時点でできないこと（=これからやること）

・GPTのツール利用結果をGPTに投げなおす処理（現状は人間→GPT→ツール→人間のみ）
※将来的には図の流れで使えるものを作りたいと思っています。
![GPTをインタフェースとして使う](https://storage.googleapis.com/zenn-user-upload/cb7bc52af6c9-20230109.png)

# 利用手順

## Google Apps Scriptでの初期設定

1. [Google Apps Script](https://script.google.com/home)のページからプロジェクトを作成する。
1. GASプロジェクトに、スクリプトを追加する。
1. 「種類の選択：ウェブアプリ」「アクセスできるユーザー：全員」の設定でデプロイし、GASプロジェクトの公開URLをメモする。

## Slackでの初期設定

1. [Slackのアプリ管理画面](https://api.slack.com/apps)にアクセスし、「Create New App」からSlackアプリを作成する。
1. 「Event Subscriptions」画面の「Enable Events」をオンにし、「Request URL」にGASプロジェクトの公開URLをペーストする。
1. 「Subscribe to bot events」の「Add Bot User Event」から「app_mention」を追加し、「Save changes」をクリックして保存する。
1. 「Install App」からワークスペースにアプリをインストールする。
1. 「Bot User OAuth Token」をGASプロジェクトの「プロジェクトの設定」から「スクリプトプロパティ」に「SLACK_TOKEN」として登録する。

## OPENAIでの初期設定

1. [Open AIのAPI key管理画面](https://beta.openai.com/account/api-keys)にアクセスし、「Create a new secret key」をクリックする。
1. 「Secret key」をGASプロジェクトの「プロジェクトの設定」から「スクリプトプロパティ」に「OPENAI_SECRET_KEY」として登録する。


# 参考にした情報

- https://qiita.com/paranishian/items/9cb754683584c6c05164
- https://qiita.com/noritsune/items/c4d58bc933198cfa101e
- https://github.com/hwchase17/langchain/blob/master/LICENSE
UIButtonのsetBackgroundImageが効かない

## [問題]
```swift:swift
otherButton.setBackgroundImage(UIImage(named: "other"), for: .normal)
```
こんな感じで書いていたsetBackgroundImageのコードが反映されず、なかなか時間かかってしまったので備忘録です。

## [解決法]
以下の画像のように、storyboardのUIButtonの設定部にある Button>StyleをDefaultにすると無事にコードが反映されるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569820/41f64fdf-5052-203b-e21b-992c9b08acd4.png)

## [原因]

iOS15に対応したXcode13からの仕様変更によるもので、StoryboardでUIButtonを作成すると自動的に 「Plain」が選択されることが原因のようです。
UIButtonに新しく4つのタイプ(Plain, Gray, Tinted, Filled)が追加されました。



参考にした記事
https://zenn.dev/koux99/articles/1abce4ed574b23
Googleプロジェクト管理：プロジェクトガバナンス

# はじめに

わたしが [Google プロジェクト管理:プロフェッショナル認定証で得られた素晴らしい体験][google]を、要点をまとめ小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ ***"Google プロジェクト管理:プロフェッショナル認定証"*** を受講してみてください。

[google]: https://qiita.com/mapami/items/317ae776a2268fd54c8f

https://jp.coursera.org/professional-certificates/google-project-management

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/579e805c-6045-9c1c-543d-f9519b57d50c.png" width="800">

# ガバナンスとは？

ビジネスにおけるガバナンスとは、意思決定を行い、説明責任と責任を決定するためのマネジメントの枠組みを指します。

　***<font color="MediumVioletRed">『ガバナンスとは、誰が責任者なのかを理解すること』</font>***

今回、コーポレートガバナンスとプロジェクトガバナンスについて紹介します。

# コーポレートガバナンス

各組織は、その行動を方向付け、制御する一連の基準や慣行によって統治されています。これらの基準や慣行はコーポレートガバナンスと呼ばれ、あなたのプロジェクトに影響を与えます。


　***<font color="MediumVioletRed">『コーポレートガバナンスは、組織がその目標や目的を達成するための枠組みです。』</font>***


ガバナンスと[前回ご紹介したチェンジマネジメント][ref1]は密接に関係しています。チェンジマネジメントを成功させるためには、組織の構造と文化を理解することが不可欠です。

[ref1]: https://qiita.com/mapami/items/853de9ea0005759e70af

# プロジェクトガバナンス

プロジェクトマネージャーとして、プロジェクトガバナンスを担当することになります。

***<font color="MediumVioletRed">『プロジェクトガバナンスとは、プロジェクトの意思決定をどのように行うかのフレームワークです。』</font>***

プロジェクトガバナンスは、プロジェクトを円滑に、時間通りに、予算内で進行させるのに役立ちます。そして、次のようなプロジェクトを成功に導くための重要な要素が含まれています。
- ポリシー
- 規制
- 機能
- プロセス
- 手順
- 責任


# プロジェクトとコーポレートガバナンスの関わり方

プロジェクトガバナンスは、組織固有のニーズに合わせて調整する必要があります。これらのニーズは、プロジェクトにおけるガバナンスの枠組みをどのように実装し、どのように監視するかに影響します。

プロジェクトガバナンスは、コーポレートガバナンスのうち、特にプロジェクト活動に関連する領域に関するものです。効果的なプロジェクトガバナンスは、組織のプロジェクトが組織の大きな目標に沿い、効率的に提供され、持続可能であることを保証します。

これには以下が含まれます。

- 組織の長期的な利益と短期的な利益を考慮すること
- どのプロジェクトを引き受けるかについて思慮深い決定を下し、十分な資源がない場合はプロジェクトを回避すること
- 取締役会やその他の主要なステークホルダーに対し、タイムリーで適切、かつ信頼性の高い情報を提供すること
- 意思決定者である上級管理職の意見を聞き、賛同を得ること
- 開始段階では、混乱や対立を減らすために、明確で到達可能、かつ持続可能な目標を優先的に設定すること
- 計画段階では、経験豊富なチームにオーナーシップとアカウンタビリティを与え、プロセスの実行、監視、管理をさせるること
- 実行段階では、失敗から学び、新しい知識や改善された知識に適応していくこと

コーポレートガバナンスは、多くのハードルをクリアした上で意思決定を行うことが必要です。これらの決定は、一つのプロジェクトだけでなく、企業全体に影響を与える可能性があります。

同時に、コーポレートガバナンスは、コンプライアンスやリスク軽減に関する監視、プロジェクトマネージャーへのガイダンスや方向性の提示など、プロジェクトガバナンスのサポートにもなります。

また、コーポレートガバナンスは、プロジェクトマネージャーがリソースを確保し、問題に対処し、意思決定の遅れを防ぎ、ステークホルダーから賛同を得て、経営層からプロジェクトを見えるようにするためにも有効です。
【今日からDocker始めた方向け】Dockerコンテナの動かし方

筆者も初学者のため誤った記載がありましたらご指摘お待ちしております。

## ■Dockerコンテナのライフサイクルについて
Dockerではコンテナと呼ばれる様々なソフトウェアを隔離する箱を組み合わせることで開発環境の構築・運用を簡単に行うことができます。Dockerコンテナは作成→起動→停止→破棄というライフサイクルに基づ木、作って捨てるまでの一連の流れがあります。このコラムではmysql（データベース）やApache（WEBサーバ）のコンテナを立てて破棄するまでの一連の流れを実行してみます。

## ■起動中のコンテナ確認
念のため、起動中のコンテナがないか確認のコマンドを実行します。

```docker
    docker container ls #省略形は docker ps
```
すると下記のような画面が表示されたかと思います。
特に起動中のコンテナが表示されていなければOK。
![スクリーンショット 2023-01-09 21.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3092884/a5871e2a-0e3a-6fdd-e6cb-8f2d56bc0813.png)
・CONTAINER_ID:コンテナ作成時に付番されるID
・IMAGE:元となったコンテナイメージ名
・COMMAND:デフォルトで構成されているプログラム
・CREATED:作られてから経過した時間
・STATUS:現在のステータス
・PORTS:割り当てられたポート番号(後ほど記載)
・NAMES:コンテナ名


## ■コンテナの作成＆起動(Apache)
Dockerコンテナを作成するときは 

Docker run [オプション] [イメージ名][引数]

が基本です。

今回はApacheサーバを建てたいと思います。
以下コマンドを実行してください。

```docker
    docker run --name コンテナ名 -d -p 3000:80 httpd
```
するとブラウザでlocalhost:3000にアクセスし、It Works!の文字が表示されるかと思います。

## ■コンテナの停止
Dockerコンテナを停止する際には、

docker stop [コンテナ名orコンテナID]

で実行することができます。

```
    docker stop　コンテナ名 
```

## ■コンテナの廃棄
停止したコンテナはリソースを食わないよう廃棄します。
廃棄用コマンドは以下です。

```docker
    docker rm コンテナ名
```

以上がDockerの初歩中の初歩となるコンテナ操作です。
## ■備考
mysqlの場合は以下のコマンドでコンテナ作成＆起動ができます。
```docker
    docker run --name コンテナ名 -dit -e MYSQL_ROOT_PASSWORD=パスワード mysql #パスワードやコンテナ名は任意
```
ぜひ試してみてください。
[gsap] SrollTriggerでdelayが効かない

### 動作環境
gsap: 3.10.4
react: 17.0.2 


これのdelayが動かない・・・
```tsx
gsap.to(Element, {
  y: () => '0',
  ease: Power1.easeOut,
  duration: 1.5,
  delay: delay ? delay : null,
  scrollTrigger: {
    trigger: trigger ? trigger : Element,
    start: () => `${start ? start : 'top 30%'}`,
    invalidateOnRefresh: true,
    markers: true,
  },
})
```

参考サイトで海外の人がいろいろ話しているのを見ると、とりあえず下記オプションを`flase`で動いた

```
invalidateOnRefresh:true
```

[参考]同じ現象の話↓
https://greensock.com/forums/topic/25610-problem-delay-property-not-working-with-srolltrigger/
リーダブルコードの要約_6章

**6章 コメントは正確で簡潔に**
本章では、コメントを正確で簡潔に書く方法について説明する。

**あいまいな代名詞を避ける**
```php
//データをキャッシュに入れる。ただし、先にそのサイズをチェックする。
```
「その」が指しているものは、「データ」かもしれないし「キャッシュ」かもしれない。
紛らわしいので代名詞の使用は避けるべきである。
```php
//データをキャッシュに入れる。ただし、先にデータのサイズをチェックする。
```

**関数の動作を正確に記述する**
```php
//ファイルに含まれる行数を返す
function countLines(fileName) {
    ...
}
```
「行」にはさまざまな意味があり、このコメントだけでは関数の正確な動作がわからない。
例えば、"hello\n"は、1行なのか2行なのか？
この関数が改行文字`\n`の数をカウントするのだとしたら、以下のようなコメントの方が適切だ。
```php
//ファイルに含まれる改行文字(\n)を数える。
function countLines(fileName) {
    ...
}
```
数学_Q10

## 考察
ベクトルの垂直、平行条件を表現して演算。
垂直は内積、平行条件は・・暗算ですかね。

## コードで解決
sympy.Matrixでベクトル表現して
条件組み立ててSolveでどうにかなるか、検証

### ベクトル表現確認
```python
# 変数定義
k, l = symbols('k l', real=True)

# 条件定義
a = Matrix(
    [3, -2, 1]
)
b = sympy.Matrix(
    [-6, k, -2]
)
display(a)
display(b)
```
安定の縦ベクトル生成
![Screenshot from 2023-01-08 16-30-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/409932e8-a9e4-f98f-7d75-bc0a33b8b54d.png)

### 条件設定してSolve
```python
# 条件設定その１
## 平行ベクトル→ l倍で表現一致
eq1 = Eq(a, l*b)
display(eq1)
display(solve(eq1))

# 条件設定その２
## 内積で判定
eq2 = Eq(a.dot(b), 0)
display(eq2)
display(solve(eq2, k))

# 解答
print(f'(k1, k2) = {solve(eq1)[0][k]}, {solve(eq2)[0]}')
```
よさげ
![Screenshot from 2023-01-08 16-31-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/14b20598-3f93-c8c5-c23c-5dd15774d174.png)
数学_Q09

## 考察
確率とlogの計算

## コードで解決
今回は実際に数値計算が必要になるので
sympyではなくnumpyで数値算出します。

```python
# 定数定義
LOG2_5 = 2.322
LOG2_3 = 1.585

PA = 1 / nC(10, 2)
print(PA)
display(-1 * log(PA, 2))
```
sympyだとこうなってしまう。数値計算してくれない。

![Screenshot from 2023-01-08 00-05-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/7341e075-ec22-e523-8063-42c1f2c513dd.png)

`numpy`なら数値計算します。
底が２なので `log2`メソッドを使います

```python
# sympyの結果を利用、floatへ型変換
print(type(PA))
PA = float(PA)

# numpyで数値計算
IA = -1 * np.log2(PA)
IA
```


![Screenshot from 2023-01-08 00-06-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/1ce7be32-3c33-91a5-8863-6062e643cdd3.png)
数学_Q08

## 考察
確率の期待値、標準偏差
即答

確率／統計の問題の多くは
手計算で良いのでは

## コードで解決
答えは分数のまま扱っているのでひと工夫

```python
# 定数定義
n = 90
p = Fraction(1, 3)
print(n, p)

# 平均
mu = n * p

# 標準偏差
sigma = sqrt(n*p*(1-p))

# 解答
print(mu, sigma)
```
![Screenshot from 2023-01-07 21-19-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/602338b0-3d33-a64c-7ac2-b4e5ad370888.png)
数学_Q07

## 積分の話
積分範囲の $ x $ と 積分変数の $t$

## コードで解決
```python
# 変数定義
x, t = symbols('x t', real=True)

# 関数定義
f = integrate(t**2-t-2, (t, -1, x))
display(f)

# 関数描画
plot(f, (x, -5, 5), ylim=(-5, 5))

# 極値を確認
display(solve(f.diff(x), x))
```
グラフと算出結果、一致してますね。
![Screenshot from 2023-01-07 20-58-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/0a66c55a-ac2d-f197-de02-b175d406d17c.png)

## 問題に解答
```python
# 極大値を確認
display(f.subs(x, -1))

# 極小値を確認
display(f.subs(x, 2))

# 解答
display(f.subs(x, -1) + f.subs(x, 2))
```
![Screenshot from 2023-01-07 20-59-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/a1342f58-99d0-d492-08cb-9211ceb337f4.png)
数学_Q05

## 考察
対数をとって後は計算力。
３分でやりきれるか、ギリギリラインか。

## コードで解決
```python
# 変数定義
x, y = symbols('x y',real=True)

# 連立方程式定義
eq1 = Eq((2/x)**log(2, E), (3/y)**log(3, E))
eq2 = Eq(3**(-log(x, E)), 2**(-log(y, E)))
display(eq1, eq2)
solve([eq1, eq2], [x, y])
```
解けない。。。？
![Screenshot from 2023-01-07 19-47-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/6ddbd652-ff20-9d8e-6715-bef946ca7f59.png)

## 再び考察
どうやらそのまま投入すると解けないのか。。。
であれば計算の過程で対数を取るので結果状態から解いてみる。

両辺対数とって分解まで実施。
$\log{2}(\log{2}-\log{x}) = \log{3}(\log{3}-\log{y})$
$-\log{x}\log{3} = -\log{y}\log{2}$

この状態にしてコードで解いてみます

## コードで解決：リトライ
```python
eq3 = Eq(log(2, E)*((log(2, E) - log(x, E))), (log(3, E)*((log(3,E) - log(y, E)))))
eq4 = Eq(-log(x, E)*log(3, E), (-log(y, E)*log(2, E)))
display(eq3, eq4)
solve([eq3, eq4], [x, y])
```
よさげ
![Screenshot from 2023-01-07 19-56-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/7c1f5a30-8ed5-6d9b-b60c-ce9e98d3305a.png)

ひと手間かける必要あり、、、と。

なお課題は
$ x^2 + y^2$ の算出なので
$4 + 9 = 13$


---

$ \frac{2}{x}^{\log{2}} =\frac{3}{y}^{\log{3}} $

$ 3^{-\log{x}} = 2^{-\log{y}} $


---

ChatGPTにきいてみる。

![Screenshot from 2023-01-18 16-54-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/dc6473da-6fd3-e9d7-568a-244443b0f58c.png)
数学_Q06

絶対値を含む関数、微分係数
$ f(x) = {x}|{x}-3| $
$ f'(2) $ と $ f'(4) $

## 考察
場合分けして算出するのみ
まずはグラフを書いてみる

## コードで解決
```python
# ちゃんと実数であることを宣言する（必須）
x = symbols('x', real=True)

f = x * Abs(x - 3)
display(f)
ax = plot(f, (x, -5, 5), ylim=(-2, 4))
```
なるほど、微分の問題ですが
微分不可能な位置がありますね。留意で。

![Screenshot from 2023-01-07 20-05-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/554d9f85-b6c4-f30e-c6d6-3b1654ba7b44.png)

```python
# 変数定義
x = symbols('x', real=True)

# 関数定義
f = x * Abs(x - 3)
display(f)

# 微分してみる
display(f.diff(x))
```
絶対値含む関数認識もできているし
微分しても絶対値含む関数としてただしそう。

![Screenshot from 2023-01-07 20-32-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/6696a6b5-5008-9f82-ef47-cdf41557bf02.png)

解答します
```python
# 解答
display(f.diff(x).subs(x, 2))
display(f.diff(x).subs(x, 4))
display(f.diff(x).subs(x, 2) - f.diff(x).subs(x, 4))
```
![Screenshot from 2023-01-07 20-35-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/3181ea99-2dba-ce27-01ef-b5134f11d133.png)
草莽Erlang ── 17. lists:foreach

口で言うより行うことがErlang習得への近道と信じています。

https://qiita.com/mnishiguchi/items/9237780e849d80a85e11

## lists:foreach

```
foreach(fun((term) -> term), [term]) -> ok
foreach(各要素に対して実行したい処理, リスト) -> ok
```

リストの各要素に対して一度ずつ同じ処理を実行することができます。

https://www.erlang.org/doc/man/lists.html#foreach-2

練習してみます。

```erlang
> lists:foreach(fun(S) -> io:put_chars([S, $\n]) end, ["1", "2", "3", "ダー！"]).
1
2
3
ダー！
ok
```

https://youtu.be/AWxwmqzbOaw

https://youtu.be/FSz7N5hCltw

https://note.com/awesomey/n/n4d8c355bc8f7

`lists`モジュールには他にもリスト処理のための関数がたくさんあります。

https://www.erlang.org/doc/man/lists.html

他にもいくつか反復処理をする方法があります。

https://qiita.com/mnishiguchi/items/5c62d94aacd7a67e23da

## Elixirにも挑戦したい

闘魂ElixirシリーズとElixir Schoolがオススメです。

https://qiita.com/torifukukaiou/items/3b65e5c04fa8c55f526e

https://elixirschool.com/ja

https://qiita.com/piacerex/items/09876caa1e17169ec5e1
リーダブルコードの要約_5章

**5章 コメントすべきことを知る**
コメントの目的は、「書き手の意図を読み手に知らせること」である。
本章ではコメントについて以下の３つのポイントを解説する。

* コメントすべきでは「ない」ことを知る。
* コードを書いているときの自分の考えを記録する。
* 読み手の立場になって何が必要になるかを考える。

**コメントすべきでは「ない」ことを知る**

【コードからすぐにわかることをコメントに書かない】
```php
class Account {
    //コンストラクタ
    function __construct() {
        ...
    }
...
}
```
この`コンストラクタ`というコメントは、コードからわかること以上の新しい情報を読み手に提供しておらず、価値のないコメントである。こういうコメントは残すべきではない。

**コードを書いているときの自分の考えを記録する**
優れたコメントとは、書き手がコードを書いているときに持っている「大切な考え」を記録したものだ。
【コードの欠陥にコメントをつける】
例えばコードに欠陥があるときは、それを文章化しておくと良い。
```php
    // TODO: もっと早いアルゴリズムを使う
```
こうしたコメントを残すことで、コードの品質や状態を知らせたり、改善の方向を示すことができる。
プログラマがよく使うコメント記法がいくつかある。
| 記法 | 典型的な意味合い |
|:-|:-|
| TODO: | あとで手をつける |
| FIXME: | 既知の不具合があるコード |
| HACK: | あまり綺麗じゃない解決策 |
| XXX: | 危険!大きな問題がある |

※こうした記法をいつどのように使うかについては、チームの規約があるかもしれないので、確認してみるのが良い。

	
読み手の立場になって考える
【要約コメントを残す】
処理の最初に要約コメントを残すことで、読み手が処理の「全体像」を把握しやすくなる。
```php
foreach ($users as $key => $user) {
   //ユーザがゴールド会員ならクーポンを付与する
   if(...) {
        ...
   }
}
```
また、関数の中で複数の処理が走っている場合は、処理ごとに要約コメントを書いておくと読みやすくなる。

```php
function GenerateUserReport() {
   // ユーザのロックを獲得する
   ...
   // ユーザの情報をDBから読み込む
   ...
   // 情報をファイルへ書き出す
   ...
   // このユーザのロックを解放する
   ...
 }
 ```
Dos攻撃について

# はじめに
最近よく耳にするDos攻撃。情報工学を学ぶ学生として必要最低限のことは整理しておこうと思い、ここに備忘録として記しておくことにしました。

参考資料
情報処理教科書　情報処理安全確保支援士2019版-翔泳社
# Dos攻撃とは
　Dos攻撃には様々な種類があり、近年多く見かけるものとして挙げられるのが「**大量にパケット（データ）を送信することによってネットワーク上の特定帯域をパンクさせるもの**」です。その他の定義としては「**コンピュータのCPUやメモリなどのリソースを高負荷状態やオーバーフロー状態にするもの**」、「**セキュリティホールを利用して相手のコンピュータを強制終了させるようなもの**」があります。
　Dos攻撃の中でもターゲットがネットワーク帯域であるものと特定のシステム・システムリソースであるものに分類することができます。
　また、近年ではこれら複数のターゲットを同時に攻撃するマルチベクトル型DoS攻撃が多くなってきています。（ネットワーク帯域とシステムリソースの両方に高負荷を与えるなど。）

# SYN Flood攻撃
　TCP通信の接続開始要求（SYN）を大量に送信することで相手のサーバを攻撃するものです。
　送信元を偽ったSYNパケットを大量に送信することによって、サーバは接続許可（SYN/ACK）を返信したのち一定時間の待機時間に入る動作を何度も行う必要が出てくるため、サーバはやがてシステムリソースを使い果たし、正常な稼働が困難になります。

＜対策＞
- SYNクッキー機能をもつOSやファイアウォールを使用する。
- SYNを受けとった後のコネクション確率時の待機時間を短縮する。
- SYNパケットの帯域制限を行う。

# ICMP Flood攻撃
　標的に対してデータ量の大きいICMP echo request（ping）を大量に送信することで相手のサーバを攻撃するものです。
　ICMPはコネクションレスであり、送信元の偽造が容易なため、送信元の特定が困難となります。同じICMP echo requestを利用した攻撃としてsmurf攻撃があります。

＜対策＞
- ICMPパケットの遮断を行う。
- ICMPパケットの帯域制限を行う。

# UDP Flood攻撃
　標的のUDPポートにデータ量の大きいパケットを大量に送信することで相手のサーバを攻撃するものです。標的がファイアウォールなどのネットワーク機器の場合はデータ量が非常に小さいパケットを大量に送信する手法が使われることがあります。ICMP同様、コネクションレスであり、送信元の偽造が容易なため、送信元の特定が困難となります。

＜対策＞
- 不要なUDPサービスは停止する。
- 不要なUDPサービスへのアクセスは制限する。（ファイアウォールによるフィルタリング）
- UDPパケットへの帯域制限を行う。

# connection Flood攻撃
　標的のTCPポートに対して、立て続けにコネクションを確立し続けることで相手のソケットを占拠するものです。標的のコネクション数に一定の制限がある場合、この攻撃によってソケットが完全に占領されてしまう恐れがあります。コネクション数に制限がない場合でもシステムリソースを食い尽くすまでコネクションを確立し続けてしまいます。これは攻撃者と標的がコネクションを確率するため、送信元の偽造は不可能に近い反面、攻撃の規模によっては標的に大きな損害を与える攻撃です。

＜対策＞
- ソケットオープン数を増やす。
- 同じIPアドレスからの同時接続数を制限する。
- 送信元アドレスからのパケットを遮断する。

# DDos攻撃
　インターネット上にある複数のサイトに予め仕掛けておいた攻撃プログラムから一斉にDos攻撃を仕掛けることで標的のネットワーク帯域を溢れさせるものです。この攻撃はボットネットによって実行されるパターンが多いです。

＜対策＞
- 帯域の広いネットワークを使用する。
- サーバと経路上のネットワーク機器の処理能力を強化する。
- 明らかに送信元アドレスが偽造されているものは遮断する。
- CDNサービスを利用する。
　

# EDos攻撃
　ストレージ容量やトラフィック量に対応して課金されるクラウドの特性を利用して、クラウドを利用する利用者のリソースを大量消費させることで経済的な損失を狙う攻撃です。海外と比べると、日本国内ではクラウド課金サービスの利用者自体が少ないため、被害数も他の攻撃と比べて少ないです。

＜対策＞
- EDos攻撃による損失を補償しているサービスを選択する。
- 予め課金額に上限を設けておく。

# 対策のまとめ
- ルータやファイアウォールで不要なパケットは遮断する。
- 帯域の広いネットワークを使用する。
- ネットワーク機器の処理能力は十分なものにしておく。
- ルータやスイッチでプロトコルごとに帯域制限を設定する。
- 事前にDos攻撃のテストを行い、各部分への影響を確認・改善をしておく。
- CDNサービスを利用する。
npm audit fixで修正されない時の対処法

# 概要
`npm install` をしたときに `npm audit fix` をしてバージョンを上げようとしても
うまく上がらなかったので対処する方法の確認

# とりあえずどんな感じになっていたのか
```
$ npm install

up to date, audited 610 packages in 651ms

118 packages are looking for funding
  run `npm fund` for details

14 vulnerabilities (7 moderate, 7 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
```

このように脆弱性がある状態のようなので修正する

# `npm audit fix` をしてみる
```
$ npm audit fix

up to date, audited 610 packages in 3s

118 packages are looking for funding
  run `npm fund` for details

# npm audit report

axios  <=0.21.1
Severity: high
axios Inefficient Regular Expression Complexity vulnerability - https://github.com/advisories/GHSA-cph5-m8f7-6c5x
Axios vulnerable to Server-Side Request Forgery - https://github.com/advisories/GHSA-4w2v-q235-vp99
Depends on vulnerable versions of follow-redirects
fix available via `npm audit fix`
node_modules/axios
  gulp-reporter  >=1.5.0
  Depends on vulnerable versions of axios
  Depends on vulnerable versions of emphasize
  Depends on vulnerable versions of in-gfw
  node_modules/gulp-reporter
```

こんな感じでエラーレポートが出るだけで`npm audit fix`でも修正されない

# package-lock.json を手動編集する
パージョン固定をしているこちらのファイルを編集する

例えば
```package-lock.json
    "node_modules/gulp-reporter": {
      "version": "2.10.0",
      "resolved": "https://registry.npmjs.org/gulp-reporter/-/gulp-reporter-2.10.0.tgz",
      "integrity": "sha512-HeruxN7TL/enOB+pJfFmeekVsXsZzQvVGpL7vOLdUe7y7VdqHUvMQRRW5qMIvVSKqRs3EtQiR/kURu3WWfXq6w==",
      "dependencies": {
        "ansi-escapes": "^3.1.0",
        "axios": "^0.18.0",
        "buffered-spawn": "^3.3.2",
```
この`axios`についてちょっと見てみる
https://www.npmjs.com/package/axios?activeTab=versions
さすがにメジャーバージョンを変えるのは怖いので`^0.27`にしてみる

node_modulesフォルダを一度削除して、再度`npm install`をしてみると

```
$ npm install
npm WARN deprecated sorted-array@2.0.4: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
npm WARN deprecated date-format@0.0.2: 0.x is no longer supported. Please upgrade to 4.x or higher.
npm WARN deprecated highlight.js@9.12.0: Version no longer supported. Upgrade to @latest

added 612 packages, and audited 613 packages in 7s

119 packages are looking for funding
  run `npm fund` for details

12 vulnerabilities (8 moderate, 4 high)

To address all issues, run:
  npm audit fix

Run `npm audit` for details.
```
こんな感じで警告が減っている。

この調子で、`package-lock.json`の `dependencies` を書き換えていけばOK

# 本当は…
これって大元のリポジトリにPRとか投げた方がいいんだろうな…とか思いつつどうなんですかね。
メンテナンスされてないってことにもなる気がするので、forkして自分のところで修正してしまう方が良いのか正直迷うところ

# 参考
https://ichi-station.com/npm-audit-manual-fix/

https://zenn.dev/kugyu10/articles/d297123ba0eae3
リーダブルコードの要約_4章

**4章 美しさ**
プログラミングの時間のほとんどはコードを読む時間だと言っても過言ではない。
美しいコードは、さっと流し読みができて誰にとっても使いやすいコードである。
本章では、コードを読みやすく（美しく）するための余白・配置・順序について説明する。

**縦の線をまっすぐにする**

以下のようなコードがあるとする。
```php
$details = $_POST['details'];
$location = $_POST['location'];
$phone = $_POS['phone'];
$email = $_POST['email'];
$url = $_POST['url'];
```
上から３つ目の定義でタイプミスをしている。以下のようにコードの縦のラインが揃っていた方が、読みやすくミスがあった場合にも気が付きやすい。
```php
$details  = $_POST['details'];
$location = $_POST['location'];
$phone    = $_POS['phone']; 
$email    = $_POST['email'];
$url      = $_POST['url'];
```

**一貫性と意味のある並び**
以下の変数の定義は、どんな順番で並べてもコードの正しさに影響を及ぼすことはない。
```php
$details  = $_POST['details'];
$location = $_POST['location'];
$phone    = $_POS['phone']; 
$email    = $_POST['email'];
$url      = $_POST['url'];
```
であれば、ランダムに並べるのではなく、意味のある順番で並べる方が望ましい。
* 対応するHTMLフォームの<input>要素と同じ並び順にする。
* 重要なものから順に並べる。
* アルファベット順に並べる。

また、同じ変数を再定義するような場合には、最初に定義した時と同じ順番で定義して一貫性を持たせた方が良い。
もし仮に一貫性を持たせなかった場合、余計な混乱を招く可能性がある。
```php
$details  = htmlspecialchars($details,  ENT_QUOTES, "UTF-8");
$phone    = htmlspecialchars($phone,    ENT_QUOTES, "UTF-8"); //$locationはどこ？
$email    = htmlspecialchars($email,    ENT_QUOTES, "UTF-8");
$url      = htmlspecialchars($url,      ENT_QUOTES, "UTF-8");
$location = htmlspecialchars($location, ENT_QUOTES, "UTF-8");//なぜ$locationが下にくるのか？
```
【Laravel】Postgresに接続するための方法

LaravelからPostgreSQLへの接続方法について解説します。

【Laravelのバージョン】
9.42.2
【PHPのバージョン】
8.1.13
【検証環境】
■Windows11

【設定の概略】
１．PHP本体に配置してある設定ファイル「php.ini」で接続するデータベースドライバを指定する
２．Laravel本体に配置してあるデータベース情報ファイル「database.php」を変更する
３。Laravel本体に配置してある環境変数に関する情報ファイル「.env」ファイルを変更する

それでは、順番に説明します。

# 1.PHP本体に配置してある設定ファイル「php.ini」で接続するデータベースドライバを指定する

1-1)PHP本体に配置してある設定ファイル「php.ini」をテキストエディタ(VS Codeなど)で開きます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/fcf57181-7299-c1e9-9c1b-d30fa52746cf.png)


1-2)デフォルトではpostgreSQLドライバの設定はコメントアウトされているので、↓の図にある939行目の箇所のコメントアウトを解除しましょう。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/192f7fbe-31e5-3fa8-075c-784d440f6932.png)


これで完了です。つぎの説明に移ります。

# ２．Laravel本体に配置してあるデータベース情報ファイル「database.php」を変更する
database.phpファイルは「config」フォルダの中にあるので、それを開きましょう↓。
デフォルトではMySQLへの接続になっているので、赤い部分を「'pgsql'」に変更して完了です。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/05c7f113-5f4e-1d6a-58e2-0976bdddd907.png)



# ３。Laravel本体に配置してある環境変数に関する情報ファイル「.env」ファイルを変更する
最後に環境変数ファイル「.env」ファイルについてです。

変更する箇所は以下の通りです。
DB_HOST=127.0.0.1またｈlocalhostのいずれかを入力する。
DB_PORT=5432
DB_DATABASE=接続するデータベース名を入力する。
DB_USERNAME=PostgreSQLにログイン時のユーザー名を入力する。
DB_PASSWORD=PostgreSQLにログイン時のパスワードをを入力する。


![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169664/00aa0be0-e5e1-7fbc-d8e7-1c765dae5f0c.png)

【参考にしたサイト】
■PHPの設定
https://www.javadrive.jp/php/postgresql/index1.html
数学_Q04

## 考察

２次方程式の解と係数の関係から一旦 $k$ について算出して改めて $x$ に対して解く方向で。

$\displaystyle \alpha + \beta = -\frac{b}{a},\alpha\beta = \frac{c}{a}$

```python
# 変数定義
x, t, k = symbols('x t k',real=True)

eq0 = Eq(sqrt(10) * x**2 -2*x + k, 0)
eq1 = Eq(sin(t) + cos(t), 2/sqrt(10))
eq2 = Eq(sin(t) * cos(t), k/sqrt(10))
display(eq0, eq1, eq2)
# 計算
display(solve([eq1, eq2], k))
```
![Screenshot from 2023-01-07 17-45-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/443bf49c-fb21-76b7-ba52-e8a3c3d6c5b4.png)

う〜ん、ほしいのはそうではない・・・
たぶん３番目の式から単純に。。。となっしまうのか。

## リトライ
変数指定しないケースといきなり $x$ について解いてみる
```python
# 変数定義
x, t, k = symbols('x t k',real=True)

eq0 = Eq(sqrt(10) * x**2 -2*x + k, 0)
eq1 = Eq(sin(t) + cos(t), 2/sqrt(10))
eq2 = Eq(sin(t) * cos(t), k/sqrt(10))
display(eq0, eq1, eq2)

# 計算
display(solve([eq1, eq2], k))
display(solve([eq1, eq2]))
display(solve([eq0, eq1, eq2], x)) 
```
![Screenshot from 2023-01-07 18-09-48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/30063152-3892-46cc-fc29-1fff2ed58594.png)


それらしき結果として
２つ目の計算より $k$ の値は一意に $\displaystyle k = \frac{-3}{\sqrt{10}}$ が得られているっぽい。
$t$ の値は・・・ここではスルー

３つの式から一気に $x$ を目指すが得られた回答には $k$ が入った式で返ってきている。
だけどこの $k$ を代入するとそれらしき $x$ の回答は得られてかつ回答選択肢にもある。。。なるほど

## 当初方針でリトライ☓２
$k$ の値が得られたので最初の戦略に戻って関数に $k$ を代入して改めて解いてみる。

```python
# 変数定義
x = symbol('x', real=True)

# 改めて関数定義
g = sqrt(10)*x**2 -2 * x -3 * sqrt(10)/10
display(g)
display(solve(g, x))
```
無事（選択肢にある答えに）たどり着く

$\displaystyle \sqrt{10} x^{2} - 2 x - \frac{3 \sqrt{10}}{10} $

$\displaystyle \left[ - \frac{\sqrt{10}}{10}, \ \frac{3 \sqrt{10}}{10}\right]$
【マイクラ】中学英語で簡単に出来るSkript言語【導入】

# 1. Skriptってなんぞや?
**Skript**というのは、「プラグイン作るのむずすぎ！」なんて人に**ピッタリ**なプラグインです✨

また、この記事では**導入編**, **基礎編**と**応用編**に分けてお送りします。

# 2. Skriptの導入
Skriptというのはそもそもプラグインのため、プラグインが動くサーバーを作る必要があります。
ですが、そこから触れていくとかなり長くなってしまうので、**この記事では省略させていただきます**

Skript は様々なバージョンがあり、私の環境では**2.6.4**が最新でした。 ※2023 01/09情報

- Skript 2.6.4
ｺﾁﾗ ➜ https://github.com/SkriptLang/Skript/releases/tag/2.6.4

サイトを開き、下らへんのAssetsの1個下に**Skript-2.6.4.jar**があります。それです。
ダウンロードが出来たらそのJARファイルをサーバーのpluginsというフォルダに入れてください。

サーバーは**再起動してください。** **決して`/reload`で済ませたり、Plugmanなどでロードしないでください。**

そうすると、plugins/のフォルダに``scripts``が生成されると思います。その中にはテンプレートとして10個ぐらいskriptが試しに入っていると思います。
それらに共通するものは ファイル名頭の ``-`` と終わりの ``.sk`` です  (拡張子表示をONにしていない場合はONにすることを推奨します。)

- ``-``はそのファイルが無効化されていることを表します。つまり、それらテンプレートは現段階では無効になっています。
- ``.sk``は、Skript専用の拡張子です。専用といっても、中身はただのテキストファイルですので、メモ帳などで開くことができます。

> 環境ですが、私は Visual Studio Code でSkriptのアドオンを入れてプログラミングをしています。
>ご自由な環境でプログラミングしてみてください。

# 3. いざプログラミング開始！
このプラグインは、**必ず**以下のように記述されます。
```
~~~~:
    ~~~~~~~:
        ~~~~~~
```
※この階段みたいな形を覚えていただければokです。

もちろん、この階段のような記述にはルールがあり、空白の数を必ず一定間隔で開けないといけません。
何を言いたいのかというと、
```
~~~~:
[][][][]~~~~:
[][][][][][][][]~~~~:
```
こういう感じです。
空白は、 ``2個``, ``4個``, ``tab`` のどれかです。（他は検証していないためわかりません。）


気づいた方もいらっしゃるかもしれませんが、空白は``:``の後開けます。
※逆に、いらないところに``:``を付けてしまうとかえってエラーが出てしまいます。


ところで、Skriptのプログラムには構成があります。基本的には、**7つの柱**があると思ってください。
その7つの柱から、派生していって様々なプログラムが完成します。

それは次の記事で解説させていただきます。

# 4. 終わりに
Skriptは簡単に書ける言語ですが、習得には少し時間が必要になります。
また、この記事ではサンプルコードなどを見てあなたがある程度理解できるようになる。または自分のためのコードが書けるようになることを目標としています。
ぜひ全部の記事を見ていただけると幸いです。

それでは次の記事でお会いしましょう。

次 ➜ マダダヨ
４０代おっさんDockerメモ②

## 本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

## YAML

YAMLファイルはインデントで区切りをつけるJSONの兄弟で、セミコロンでなくインデントを使うpythonに似てる。

トップダウンのヒエラルキーになっている。

基本Key-Valueペアのマップになっている。

```yaml
version: "3.7"
services:
  nginx:
    image: nginx:latest
    container_name: docker_compose_nginx
    environment:
      - env_key=env_value
    ports:
      - "80:80"
    volumes:
      - ${PWD}:/usr/share/nginx/html:ro
  ubuntu:
    image: ubuntu
    container_name: docker_compose_ubuntu
    command: ["sleep", "1500"]
    ports:
      - "8080:8080"
  busybox:
    image: busybox
    container_name: docker_compose_busybox
    command: ["sleep", "1500"]
```
GitHubの学生プランの登録ができないときの対処法

# メリットしかないので学生なら全員におすすめ、月額数ドルのものが無料で使えてしまう。

GitHubは学生プランに申請すると、GitHub Proが無料になったり、他にもさまざまな恩恵が受けられる。


https://qiita.com/SNQ-2001/items/796dc5e794ac3f57a945　

の記事を拝見して、登録したくなったのでやってみた。基本はこちらを参考にしていただきたい。

**しかし**、私の場合は、上記の記事のように写真のアップロードをしても申請がなかなか通らなかった。この申請はAIが判定しているため、AI攻略が鍵となる。

少なくとも私と同じ早稲田大学の学生はこの記事を見て登録するのがベストプラクティスだろう。他の学校の方も同じ手法でいけると思う。

# 解決方法

### まず大学のメールアドレスを入力すると自動でどこの大学かをGitHubが判定してくる。
私の場合は、
**Waseda University（早稲田大学）** と表示された。これを念頭においておく。
### https://github.com/settings/profile のNameとBioを埋めておかないとおそらく通らない。
私はBioに
>I am a student in Department of Computer Science and Engineering, School of Fundamental Science and Engineering, WASEDA University.

と記載した。（学科、学部、大学の情報）
**引用した記事の方と大きく違うのがここからで、私の場合は、英語訳した学生証を横に記載しても通らなかった。何パターンか試してもダメだった。**![スクリーンショット 2023-01-09 19.57.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1790537/19b0df00-2aeb-02a8-78d0-3ba33346df17.png)
なのでPowerPointなどを使って写真の上に英語を書いていくことにした。

### 記入例
PowerPointで以下のように編集した。jpegしかアップロードできないので、こういったサイトでスクショで得られたpngファイルをjpegに変換する。
https://png2jpg.com/
![myIDのコピー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1790537/f5a491d6-f9d9-7eed-6429-214443b5c15d.jpeg)

:::note
Point
- WASEDA UNIVERSITYが全て大文字になっているが前述の自動抽出されたWaseda University（早稲田大学）を踏まえWaseda Universityと書いておく。（一応）
- Bioに記入した事項をそのまま貼り付ける。
- 名前は隠してあるが、ローマ字で漢字の上に書いた。
:::

無事通った！！申請が終わると、一瞬でProアカウントになった。AIのあとに人間が判定しているとも思えない。
 ![スクリーンショット 2023-01-09 20.05.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1790537/e9677694-6d7c-c176-a482-a7de68f80fd5.png)
TM1637への波形観測

microbitをいじって勉強しています。
先に言い訳だけします。
2石トランジスタラジオが精一杯な超ド級の初心者かつ おっさんなので、「そんなこと・・・」と言われるようなネタです。
生暖かく見守ってください。

7seg LEDドライバとして有名なものにTITAN MICRO ELECTRONICS社のTM1637があります。
microbitからTM1627へは、CLK、DIO、VCC、GNDの4本の線で接続できます。
7segLED自体は6個までコントロールできますが、Amazonなどでは4桁7segLEDとして格安で売られています。
プログラムは可愛らしいブロックつくり拡張機能としてあった「TM1637」を使っています。
今回、実際の波形を観測したので記録として残します。

観測はこれまた格安でAmazonで売られていたロジックアナライザ　24MHz8chというものです（1399円！）　

↓が観測された波形です。
![無題1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2876479/7d46ac6e-b2b9-60a3-3f7d-ddf3e76c801b.jpeg)

↓おなじことが4回繰り返しているみたいなので赤丸部を拡大してデータシートと見比べます。
・・・・なんか私の解釈間違ってる？！


![TM1637の観測.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2876479/71d21fd1-b535-2e4e-7cd7-c52a870cfe79.jpeg)


![IMG_20230109_131449.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2876479/d8ee6b4c-959b-1aef-afdb-60ca6e992c29.jpeg)
Inkscape で png の画像を SVG に変換する

# Inkscape で png の画像を SVG に変換する方法
Web サイトを実装中に、ロゴを png で作成し、SVG に変換するときに色々と詰まったので、変換方法の手順を log として残しておく.

# 手順
使用しているツールは [Inkscape](https://inkscape.org/ja/).

## Inkscape を起動してファイルをインポートする
**1. Inkscape を起動**
![スクリーンショット 2023-01-09 19.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/1aeaa8c1-ff35-b27c-4fb5-6b1d24039c2e.png)

**2.「ファイル」→「インポート」で SVG にしたい画像ファイルを選択**
![スクリーンショット 2023-01-09 19.42.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/4a7dd18c-bed7-8dac-fc69-e168f1853788.png)

選択後のダイアログでいろいろな設定ができるが、ここは触らずにそのまま「OK」にする.

## インポートした画像をトレースする
**1. 「パス」→「ビットマップのトレース」で画像ファイルのアウトラインを抽出**
![スクリーンショット 2023-01-09 19.46.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/79c248f9-3162-0277-2b3d-f3ea52adbaed.png)

**2. 「ビットマップのトレース」タブを編集**
![スクリーンショット 2023-01-09 19.48.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/3429153c-c1ca-5a68-dd71-7e15295c6f3b.png)
画像がプレビューに表示されるまで「明るさの境界」の「しきい値」を変更する.
![スクリーンショット 2023-01-09 19.50.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/53d7b215-e4b3-e00e-c693-80e6e77a3cab.png)
しきい値を 1 にするとプレビューが真っ暗になる.
今回の場合だと、一部画像がプレビューしきれなかったが画像サイズを大きくすることで解決できた.

「適用」を押下すると、パスの抽出結果がキャンバスに表示される.
![スクリーンショット 2023-01-09 19.54.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/5196e486-1747-2fb1-8ec5-4bfdc8466a61.png)

元画像は不要になるので削除する.

## キャンバスのサイズを縮小する
**1. 「ファイル」→「ドキュメントのプロパティ」でプロパティモーダルを開く**
![スクリーンショット 2023-01-09 19.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/e98122fe-9e7d-459c-83ac-ab8192dab496.png)

**2. 「ページサイズをコンテンツに合わせて変更」を押下**
![スクリーンショット 2023-01-09 19.57.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/072c7bfc-c2aa-c720-0082-2e4a9de475f3.png)

**3. モーダルをとじてキャンバスに戻る**
コンテンツに合わせてキャンバスの大きさが変わる.
![スクリーンショット 2023-01-09 20.00.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/0b7851a2-f908-29bb-d453-23e9772bb3c0.png)

ここまでできたら、出来上がったものを .svg で保存する.

以上！
数学_Q03

## 考察

$\displaystyle x=1\,の時\,y=0$
$\displaystyle x=2\,の時\,y=-1$

この情報から対象となるグラフは選定できそう。

## コードで解決
```python
# 変数定義
x = symbols('x', real=True)

# 関数定義
f = log(1/x, 2)
display(f)
```
![Screenshot from 2023-01-07 17-40-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/5b634939-7a4e-9b70-2009-fffc6b41f96c.png)

---

ChatGPTではグラフは書けないのだそうです。

![Screenshot from 2023-01-17 20-26-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213343/868e9129-fe5c-6605-5c1c-f263d2da8d33.png)
Rails7構築 -その3- importmapでfontawesomeを導入

### ↓その２の続き

https://qiita.com/devzooiiooz/items/262f71e737f94738debf

bootstrap5の後にFontAwesomeを導入します。

### 参考
ほぼここのまんまです。

https://qiita.com/gazayas/items/9224b22ce6416a624f33

# yarnでfortawesomeをインストール

```sh:
$ yarn add @fortawesome/fontawesome-free
```

### インストールしたfontawesomeをimportmapにpinします。
```sh:
$ ./bin/importmap pin @fortawesome/fontawesome-free
```

### config/importmap.rbを変更
fontawesome.js→all.jsに変更

```rb:importmap.rb
# pin "@fortawesome/fontawesome-free", to: "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.2.1/js/fontawesome.js
pin "@fortawesome/fontawesome-free", to: "https://ga.jspm.io/npm:@fortawesome/fontawesome-free@6.2.1/js/all.js
```

### app/javascript/application.jsにfontawesomeをimport

```js:app/javascript/application.js
//= require jquery3
//= require popper
//= require bootstrap-sprockets
import "@hotwired/turbo-rails"
import "controllers"
import "@fortawesome/fontawesome-free"
```

### 確認
fontawesomeのアイコンを追加
```erb:index.erb
<h1>
<i class="fas fa-space-shuttle"></i>
<i class="fas fa-snowman"></i>
<i class="fas fa-kiwi-bird"></i>
</h1>
```
表示されました
![fontawesome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82975/19b11976-c4bc-5eb3-4fa2-bf378e6f887f.png)
テスターちゃん　メモ

## OAとは
Quality Assuranceの略称。日本語では、品質保証と言われる。
製品がユーザーの満足する品質（クオリティー）に至っていることを保証する仕事。

## ソフトウエアテスト（以下テスト）とは
### 確認すべき3つのポイント
#### バグの確認
できるはずのことができないこと、あるはずのデータがないことを確認する
#### 性能の確認
スピーディーに画面遷移したり、データを取得出来たりするのか確認する
#### 使いやすさ
ユーザーの視点に立ち、使いやすいかどうかを確認する

## テスト実行
### テスト自動化とは
プログラムで自動的にテストを行うこと。

### 回帰テストとは
バグ修正後に別の箇所に異常が発生していないか確認するテスト。

### テストケースとは
テスト項目のこと。実行する条件と期待値結果が書かれている。

### 正常系、異常系確認
正常系とはできることを確認する作業.
異常系とはできないことを確認する作業

###　テスト観点
どんな方向性・内容でテストを行うのかという観点。

## バグ票
### バグ票とは
関係者がバグの情報を明確に理解し、再現できるように、バグの情報がまとまった資料

## 書き方
### 要約
「どのテスト項目で、どのように行ったら、どんな結果になったか」を簡潔に伝える。
### 環境
テストを行った環境を明記する
### 再現手順
関係者も再現できるように、1つ1つの手順を明記する。
### 現状
どのようなバグが発生しているのかを伝える。
### 期待値結果
どのように動いて欲しいのかを伝える。
### 画面キャプチャ
図でも伝える方が、理解して貰いやすい。

## 探索的テスト
### 探索テストとは
テストケースを使用せずに、目的に沿って、考えながら自由に行うテスト。
どうシステムが動くかを理解しながら、どうテストするのかと考え、テストを行い、テストが終了したら結果を踏まえて次にどうするのかを考える。

### テストチャータ
テストの目的達成のためのガイドライン。

### バリデーション
入力したデータが条件や書式に則っているのかの確認。例えば、パスワードの入力できる文字数が最大60字場合、60字でも可能か確認。

### セッションベースト
取り組むテストチャータに時間制限を設ける。

## バグの出し方
### 繰り返す
例えば、いいねボタンをクリック後に、リロードを行うなどの作業のこと。
### タイミング
システムが何かを行っている間に、何かを操作すること。
例えば、twitterにtweetしている間に、もう一度tweetボタンをクリックすること。
### 境界値
端っこ部分。例えば、パスワードに入力可能な文字数が10文字だったら、10文字でテストを行う。
### 種類
例えば、入力できる文字が日本語だけなのか、絵文字を可能か確認するテスト。
### 順番
様々な操作手順で行う方法
### 外部制御
ブラウザ機能で操作し、確認する方法
### 制限下にある状態
例えば、位置情報を求めるアプリにで位置情報をオフにする。

## KPT
K(keep): やってよかったこと
P(problem)：困ったこと
T(try)：試してみたいこと

## テスト原則
### テストは、バグがないと証明できない。
### すべてのパターンを網羅したテストを行うことは不可能
そのため、システムの目的や使用されるリスクに考慮し、テストを重点的に行う箇所や優先的に行う場所を決める。
### 早期にテストを行うことで修正時間を短縮可能
### バグの偏在
### 絶えず視点を変え、テストを行うこと
### 取り組みシステムによって行うテスト手法は異なる
### バグゼロを目指したことによって性能低下。

## 仕様書を理解するコツ
### 仕様書に質問しながら何回も読む
例えば、何をするシステムなのか、どんな機能があるのか、その機能がなにをするのか等を質問しながら、読み込む。

### マインドマップ
情報を整理できたり、盲点を気づけたりできる。

## 感想
現場ではこんなに上手くいくことが少ないと思います。テストを行っていたら、矛盾を感じるところにあたることもあると思います。その場合、矛盾を感じた箇所に関する担当の人に質問を行い問題がないかの確認を取りたいと思います。テスト内容と詳細設計とで差異があったらどちらが正しいのか確認を取るのか確認を取ることで未然に問題を防止できるのではないかと思います。また、もし仕様をはじめに確認できなかったら、バグを見つけ場合、仕様を確認しつつテスト結果とテスト内容を把握するというのも有りかなと思いました。

参考資料
マンガでわかるソフトウェアテスト入門 テスターちゃん
自動車産業関連分野


自動車産業関連分野の分類と関連を記録する。　

AUTOSAR、車載Linux、車載Ethernetが、今後の産業界の根幹技術となりうる可能性を示す・　
基本は、連続と離散の模型からのコード自動生成である。

製造業（土木、建築を含む）だけでなく、商業（金融、公共、運輸を含む）でも有益な技術体系である。

# 目次
宇宙　
航空　
自動車　
鉄道　
通信、放送
電力、ガス、水道
材料
石油　
製鉄　
土木、建築
商業
農業・畜産・食品
　
# 宇宙, 航空
自動車製造業の前身が航空機製造業である会社はBMW、SUBARUなど、何社かある。　
エンジン設計が基礎技術である。　
宇宙は、航空とは異なり、地表での実験では不十分な点があることと、三次元以上の空間を移動する制御が異なるかもしれない。

# 自動車　
四輪と二輪では、安全設計が異なる。大型二輪を製造している会社は四輪自動車も製造している。　


# 鉄道　
蒸気機関、ディーゼル、電気と、自動車の原動機においては近い。　
鉄路を走るという１次元制御である点が異なる。


# 通信、放送
通信路は、航空宇宙、自動車、鉄道を始め、電力、土木、建築でも重要な役割を果たしている。


# 電力 ガス、水道
電動機が小さいものから大きいものまで、働く力の中心になろうとしている。
電力をいかに節約するかは、排ガス規制に近い取り組みがあるとよい。



# 材料、プラスチック、ガラス、ゴム、アルミ
鉄以外の材料は、ありとあらゆる製造物に登場する。

石油由来の原料か、それ以外かで、焦点が異なるかもしれない。、

# 石油　
石油の精製から加工、運搬まで、現代産業の基本である。鉄器時代の次は、石油時代なのかもしれない。
公害という負の遺産をいまだに残しており、排ガス規制はますます強化していくのだろう。

一時期すごく進んだはずの公害対策が、足踏みしている分野があるかもしれない。

# 製鉄　
近代は鉄器時代である。鉄は国家と呼ばれ、国の基幹産業であった。　
鉱山を探すマイニングは、情報領域にも応用でき、最先端の技術である。

機械学習を利用した制御の調整が進んでいる。

# 土木、建築
鉄だけでなく、土も木も使う産業が土木である。上に積んでいく建築も連接した産業である。　
トンネル自動掘削機はじめ、自動化は進んでいる。


# 商業（金融、公共、運輸）　
商業だけで年間５００，９３０億円。
自動化が限定的だった分野である。在宅勤務の比率が増えるに従い、商業、金融の仮想化が進んでいくのだろう。　
現物の配達は輸送機械が必要である点は変わらない。

# 農業・畜産・食品
食品産業は生物系を取り扱う場合は、個々の生物の特性に依存した、幅広い道具、作業が存在する。　

自動包装、自動唐揚げ機械のように、需要に対応した機器の開発も進んでいる。　

boschのように食品機械に参入している自動車部品製造業もある。


### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
ASP.NETでAPI作ったら`net::ERR_FAILED 307`に悩まされた話

# はじめに
ASP/NET CoreでAPI開発の勉強をしていたら、`net::ERR_FAILED 307`エラーが出て上手くいかなかったので、解決方法を備忘録代わりに記載します。

# やったことと起きたこと
.NET CoreでAPI開発をしていて、コンテナ化するためにリクエストURLを`http://*:5000`にしたかったので`UseUrls(http://*:5000)`を使用してURLの指定を行いました。フロントからAPIをたたくと、画像のようにCORSのエラーが出てしまい、APIをたたけない状態になってしまいました、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883790/a356ee5f-0c40-fb8e-c1ca-e34078e00ec3.png)

# 調べてみた
私がこの問題に直面した際の状況は以下の通りです。
- バックエンド側では下記のコードでCORSの設定を記載済み

```
 services.AddCors(options =>
            {
                options.AddPolicy(name: "myAllowCrossOrigin", policy =>
                 {
                     policy.AllowAnyOrigin();
                     policy.AllowAnyHeader();
                     policy.AllowAnyMethod();
                 });
            });

/* Configure()内 */
app.UseCors("myAllowCrossOrigin");
```

- `UseUrls()`を使用する前はCORSエラーが出ずにレスポンスが返ってきていた

エラーを出したリクエストを見てみると、`https://localhost:5001`にリダイレクトしているようでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883790/298a43ae-0f29-452a-908e-5c978c56ca09.png)

# 解決方法
この問題は、***StartUp.cs内から`app.UseHttpsRedirection();`を削除する***ことで解決しました！
公式によると、このメソッドにより、HTTPからのリクエストを拒否するそうです、、
今回はローカルでの個人的な開発だったのでhttpで行っていたのですが、盲点でした、、

> API プロジェクトでは、UseHttpsRedirection を使用して HTTPS に要求をリダイレクトするのではなく、HTTP 要求を拒否できます。

# さいごに
まだまだ.NET初心者なので、わからない点がたくさんありました、、
エラーログは細かく見るべきだと学びました。

# 参考
- [.NET Core 3.1 API - 307 Temporary Redirect](https://stackoverflow.com/questions/61906760/net-core-3-1-api-307-temporary-redirect)
- [HTTPS への HTTP リダイレクトにより、CORS プレフライト要求で、ERR_INVALID_REDIRECT が発生する](https://learn.microsoft.com/ja-jp/aspnet/core/security/enforcing-ssl?view=aspnetcore-7.0&tabs=visual-studio#http-redirection-to-https-causes-err_invalid_redirect-on-the-cors-preflight-request)
日本語言語モデルで現状最大規模を誇るdeberta-v2をQAタスク用にファインチューニングして公開してみた

こんにちにゃんです。
水色桜（みずいろさくら）です。
今回は現状日本語モデルで最大規模を誇る言語モデルdeberta-v2-base-japaneseをファインチューニングして、Question-Answeringタスクを解いてみようと思います。
作成したモデルは[こちらのサイト（Hugging Face）](https://huggingface.co/Mizuiro-sakura/deberta-v2-base-japanese-finetuned-QA)で配布しています。
初心者でも簡単に使えるようにしているのでぜひ使ってみてください。

https://huggingface.co/Mizuiro-sakura/deberta-v2-base-japanese-finetuned-QA

# 環境

torch 1.12.1
transformers 4.24.0
Python 3.9.13
sentencepiece 0.1.97

# deberta-v2-base-japaneseとは？

日本語Wikipedeia（3.2GB）および、cc100(85GB)、oscar(54GB)を用いて訓練されたモデルです。京都大学黒橋研究室が公表されました。

# データセット

今回はファインチューニングのためのデータとして運転ドメインQAデータセット（DDQA）を用いました。
このデータセットはウェブ上で公開されている運転ドメインのブログ記事を基に構築されており、述語項構造QAデータセット（PAS-QAデータセット）と文章読解QAデータセット（RC-QAデータセット）から構成されています。その中でも、RC-QAデータセットは文章の中から質問に対する答えを抽出する問題です。今回はSQuAD（質問に対する応答（該当部分の抜き出し））の学習を行いたいので、RC-QAデータセットを用いました。

# 作成したモデルの精度

'em'（厳密一致）: 0.8038277511961722, 'f1': 0.8959389668095072
厳密一致およびf1値は両方とも比較的高い値となりました（同じデータセットを用いた際の参考：BERTの厳密一致：0.15）。

# デモ

下記のコードを実行することでQAタスクを解くことができます。
[こちらのサイト（Hugging Face）](https://huggingface.co/Mizuiro-sakura/deberta-v2-base-japanese-finetuned-QA)から.pthモデルをダウンロードする場合は、.pthファイルを任意のディレクトリに置いて、コメントアウトしてある方のコードを利用してください。

```python: exe.py
import torch
from transformers import AutoTokenizer, AutoModelForQuestionAnswering

tokenizer = AutoTokenizer.from_pretrained('ku-nlp/deberta-v2-base-japanese')
#model=torch.load('C:\\[modelのあるディレクトリ]\\My_deberta_model_squad.pth') # 学習済みモデルの読み込み(.pthモデルをダウンロードした方はこちらを実行してください)
model=AutoModelForQuestionAnswering.from_pretrained('Mizuiro-sakura/deberta-v2-base-japanese-finetuned-QAe')

text={
    'context':'私の名前はEIMIです。好きな食べ物は苺です。 趣味は皆さんと会話することです。',
    'question' :'好きな食べ物は何ですか'
}

input_ids=tokenizer.encode(text['question'],text['context']) # tokenizerで形態素解析しつつコードに変換する
output= model(torch.tensor([input_ids])) # 学習済みモデルを用いて解析
prediction = tokenizer.decode(input_ids[torch.argmax(output.start_logits): torch.argmax(output.end_logits)]) # 答えに該当する部分を抜き取る
print(prediction)
```

```ruby:実行結果
苺
```

# 終わりに
今回はdeberta-v2-base-japaneseをファインチューニングしてQAタスクを解く方法について書いてきました。
このモデルは厳密一致が0.80と非常に高く、十分実用に足る性能だと感じました。
ぜひ皆さんも使ってみてください。
では、ばいにゃん～。

# 謝辞
モデルを公開してくださった、京都大学黒橋研究室には感謝いたします。
【脱QWERTY】日本人エンジニア向けのキーボード配列を考えてみた

こんな記事を読む方にはQWERTY配列がいかに非効率かを語る必要はないと思うのでいきなり本題に入ります。
エンジニア向け情報にありがちな「カタカナ語」「日本語内の英単語」がローマ字入力で打ちやすい配列を目指して、オリジナルのキーボード配列を考案しました。つまり「エンジニア向け」と銘打ってはいますが実際は「エンジニア向け情報を発信する人向け」です。
制作にあたってTomisuke配列、Eucalyn配列を参考にしました。

![key2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/990842/ca9ea5a1-38b0-9430-0107-cdf2d47b9fe0.png)

# 概要

* ZXCV の位置が QWERTYと同じ
* 日本語ローマ字打ちで同指連打が少ない
* 英語もある程度考慮

# 効果

使いはじめて2か月で QWERTY 配列時代の8割くらいのスピードが出るようになりました(5.5TPS → 4.5TPS)。体感として、同指打鍵の少なさや「-」が打ちやすい位置にあるので早くタイピングするのに「頑張る」必要がなく、楽に文章が書ける印象です。プログラミングするにあたってはIDEが優秀なためそれほど効果は感じられませんが、まさにこの記事を書くことで効果を感じています。

# 詳細

## ZXCVの位置がQWERTY配列と同じ

ショートカットキーによく使われるキーはそのままの位置に残してあります。Q は悩んだのですが、ショートカットキーとしてZXCVほど頻繁に使わないので右に追いやりました。ただし、 `;` と入れ替えることで元の位置に復帰できます。

## ローマ字入力で疲れにくい

* 左手に母音、右手に子音を集めており、特に使用率の高い子音はホームポジションに置いてあるので指の移動距離が少なく疲れにくいです。
* カタカナ語を考慮して `-` を左手薬指の上段というアクセスしやすい位置に置いています。

子音字2文字以上で打つ `kya` `thi` `dhi` などを打つ際に同じ指を連続で使わず、なるべく上段 + 下段の組み合わせにならないようにしました。
次のように打つことを想定しています。

* しゃ行 → `sh` ( `s` と `y` が同じ指なので)
* ちゃ行 → `ty` ( `c` は基本的に使いません)
* じゃ行 → `zy` でも `j` でも
* ふ → `hu` ( `f` はふぁ行でしか使いません)

例外的に、次の子音はやや打ちにくいです。

* ぢゃ行 `dy` → 右手薬指の連打になります。ほとんど打たないはず。
* みゃ行 `my` 、ひゃ行 `hy` → 下段から上段に飛びます。右手を斜めにして打つことになります。

## 英語もある程度考慮

基本的にローマ字打ちを意識した配列ですが、英語内での文字の出現頻度もある程度考慮しています。例えば、日本語での登場頻度が高く英語で登場頻度が低い `K` は小指ホームポジションにし、日本語での登場頻度が低く英語で登場頻度が高い `L` を手前に置いています。ほんとに「ある程度」なので過度に期待してはいけません。

# 打ち方のコツ

子音と母音が分かれているので、2回連続で右手、左手を使うパターンは少ないです。
片手を2連続で使うパターンは「流れ」を覚えましょう。
左手は `ou` `ei` などの連続母音、右手は `ky` `sh` などの拗音や `nt` `nk` などの「n + 子音」に慣れておくと早く打てるようになります。

# バリエーション

`Q` と `;` 、 `F` と `/` はそれぞれ入れ替えてもOKです。入れ替えることで `Q` と `F` が左手の範囲内に来るため、ショートカットキーとして使いやすくなります。
例外処理の原則 "Throw early, catch late"

例外の原則で有名な"Throw early, catch late"の紹介です。[^1]


# ざっくり説明
## Throw early（早く投げろ）
- 例外的な状況になったらさっさと例外をThrowしよう

## Catch late（後でキャッチしろ）
- 例外をハンドリングするのは、例外をどうハンドリングすべきかを知っている場所でやろう
- どうハンドリングすべきかを知らない場所では余計なことをしちゃダメ


# 具体例を交えて説明
## なぜThrow earlyなのか
**例外的な状況に遭遇したら処理を続行できるわけがないため**。（至極当然な話をしています）

### Throw earlyをちゃんとやっている例
```java
public class FileUtil {
    /** 指定されたパスのファイルを全部読み込んで文字列で返す。*/
    public static String readAll(String path) {
        if (path == null) {
             throw new NullPointerException("パスが指定されてないからファイルを読み込めるわけがないよ。。。");
        }

        if (!Files.exists(path)) {
        	throw new FileNotFoundException("指定されたファイルが存在しないからファイルを読み込めるわけがないよ。。。");
        }

        // 以下略
    }
}
```

## なぜCatch lateなのか
基本的に**例外をどうハンドリングすべきかを知っているのは呼び出し元（上位層）であるため**。

### 例
前出の`FileUtil#readAll(path)`にとっては、指定されたファイルが存在しないという状況は処理が続行できない状況（つまり例外的な状況）でした。
しかしながら`FileUtil#readAll(path)`を呼び出している上位層にとっては、ファイルが存在しないのは想定済みの状況（つまり処理が続行できる状況）かもしれません。↓

```java
public class BusinessLogic {
    /** 
     * `hoge.txt`の中身を標準出力する。
     * `hoge.txt`が存在しなければ`Not exist.`と標準出力する。
     */
    public static void execute() {
         try {
             String text = FileUtil.readAll("hoge.txt");
             System.out.println(text);

         } catch (FileNotFoundException e) { // ファイルが存在しなかった場合
             System.out.println("Not exist.");
         }
    }
}
```

このような状況で**もし`FileUtil#readAll(path)`で余計なハンドリングをしてしまった場合、色々と問題が起きてしまいます**。

#### 余計なハンドリングの例
##### 例外をThrowせずにプロセスを停止する
```java
    public static String readAll(String path) {
        // 中略
        if (!Files.exists(path)) {
        	System.exit(1);
        }
        // 後略
    }
```
プロセスを停止してしまったら業務が遂行できません。（本当は`Not exist.`と標準出力するのが正解なのに。。。）

###### エラーログを出力してから例外をThrow
```java
    public static String readAll(String path) {
        // 中略
        if (!Files.exists(path)) {
        	LOGGER.error("指定されたファイルが存在しません！");
        	throw new FileNotFoundException("指定されたファイルが存在しないからファイルを読み込めるわけがないよ。。。");
        }
        // 後略
    }
```
もしシステムが「エラーログを検知したら即座にエンジニアに連絡！」みたいな仕組みになっていた場合、業務的には問題ないハズなのにエンジニアに連絡が来るようになってしまいます。


# まとめ
- 例外的な状況になったらさっさと例外をThrowする。
- 例外をどうハンドリングすればわからないときは上位層に任せる。 余計なことはしない。


# おすすめ記事
- [Exceptions: Why throw early? Why catch late?](https://softwareengineering.stackexchange.com/questions/231057/exceptions-why-throw-early-why-catch-late) `Throw early, catch late`でググると一番上に出てくるやつ。 読もう。
- [早期リターンを書こう](https://zenn.dev/media_engine/articles/early_return) 早期リターンを心がけていれば自然とThrow earlyになる……ハズ。
- [Java 例外処理における 11 個の誤り](https://blueskyarea.hatenablog.com/entry/2017/07/06/001336) 例外処理で気にすることは`Throw early, catch late`だけじゃないので注意。


# 記事を書いてみた感想
プライベートな時間を使ってコンスタントにアウトプットし続けられる人って本当にすごい。 えらすぎる。

[^1]:有名だと思ってたけど意外と日本語の記事がなかったので書いてみた。
小道具：ホスト名からIPアドレスを得る(getaddrinfo の動作確認)

### getaddrinfo の動作確認用です

getaddrinfo を使用して、ホスト名に対しする IP アドレスを表示します。

```python:getaddrinfo.py
#!/usr/bin/env python3

import socket
import argparse


def get_socket_param(name):
    if name in socket.__dict__:
        return socket.__dict__[name]
    return int(name)


def get_socket_name(prefix, value):
    nprefix = len(prefix)
    for key in socket.__dict__:
        if (len(key) > nprefix and
            key[:nprefix] == prefix and
                socket.__dict__[key] == value):
            return key
    return f'{value}'


parser = argparse.ArgumentParser()
parser.add_argument('host')
parser.add_argument('-N', '--port', help='ポート番号を指定')
parser.add_argument('-A', '--family', help='AF_ に続く名前を指定')
parser.add_argument('-T', '--type', help='SOCK_ に続く名前を指定')
parser.add_argument('-P', '--proto', help='IPPROTO_ に続く名前を指定')
parser.add_argument('flag', nargs='*', help='AI_ に続くフラグ名前を指定')
args = parser.parse_args()

host = args.host
port = 0 if not args.port else int(args.port)
af_family = 0 if not args.family else get_socket_param('AF_' + args.family.upper())
sock_type = 0 if not args.type else get_socket_param('SOCK_' + args.type.upper())
ipproto = 0 if not args.proto else get_socket_param('IPPROTO_' + args.proto.upper())
flags = sum(get_socket_param('AI_' + flag.upper()) for flag in (args.flag or []))

param = ', '.join([f'host="{host}"',
                   f'port={port}',
                   'family=%s' % get_socket_name('AF_', af_family),
                   'type=%s' % get_socket_name('SOCK_', sock_type),
                   'proto=%s' % get_socket_name('IPPROTO_', ipproto),
                   f'flags=0x{flags:02x}'])

print(f'getaddrinfo({param}):')
addrinfo = socket.getaddrinfo(host, port, af_family, sock_type, ipproto, flags)
print('\n'.join(ai[4][0] for ai in addrinfo))
```

```console:実行結果
$ python3 getaddrinfo.py example.com
getaddrinfo(host="example.com", port=0, family=AF_UNSPEC, type=0, proto=IPPROTO_IP, flags=0x00):
2606:2800:220:1:248:1893:25c8:1946
2606:2800:220:1:248:1893:25c8:1946
93.184.216.34
93.184.216.34
$ python3 getaddrinfo.py example.com -A inet
getaddrinfo(host="example.com", port=0, family=AF_INET, type=0, proto=IPPROTO_IP, flags=0x00):
93.184.216.34
93.184.216.34
$ python3 getaddrinfo.py example.com -A inet6
getaddrinfo(host="example.com", port=0, family=AF_INET6, type=0, proto=IPPROTO_IP, flags=0x00):
2606:2800:220:1:248:1893:25c8:1946
2606:2800:220:1:248:1893:25c8:1946
```
【Log】Next.js で SVG ファイルを表示する

# 実現したいこと
- 個人 web サイトのヘッダーに自作のロゴ（SVG）を表示させたい
- ロゴの色味は css で変更可能な状態にしたい

▼ 今回作ったロゴのサンプル
![スクリーンショット 2023-01-02 21.59.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/51a3f3fb-dc8a-6604-7a8a-813164ac8774.png)

## SVG を表示させる方法
1. img タグの src に SVG ファイルへのパスを設定して読み込ませる
2. CSS ファイル内の background-image にパスを設定して読み込ませる 
3. HTML 内で SVG をインラインコードで埋め込む

1 や 2 の方法だと、比較的簡単に SVG を表示することができるけど、css でデザインを変更することができない。
今回は SVG のデザインを変更したいので、3. の方法で実装してみる

Next.js 内で SVG のインライン埋め込みを実現するには、SVG ファイル内のコードを JSX 記法に対応させる修正が必要になるようなので、[@svgr/webpack](https://react-svgr.com/docs/webpack/) を使って読み込めるようにする

# 実際にやってみる
## 導入手順
**1. `@svgr/webpack` をインストール**
```
yarn add -D @svgr/webpack
```

**2. `next.config.js` を編集**
自身のリポジトリには `next.config.js` がなかったので新規作成
```
touch next.config.js
```
新規作成したファイルに以下を記載
```
module.exports = {
  webpack(config) {
    config.module.rules.push({
      test: /\.svg$/,
      issuer: {
        and: [/\.(js|ts)x?$/],
      },
      use: [
        {
          loader: '@svgr/webpack',
          options: {
            svgo: false, // 圧縮を無効にする設定
          },
        },
      ],
    });

    return config;
  },
  images: {
    disableStaticImages: true, // importした画像の型定義設定を無効にする設定
  },
};
```

**3. `index.d.ts` を作成し、SVG の型定義をする**
今回は、src/types 配下に `index.d.ts` を作成
```
declare module '*.svg' {
  const content: React.FC<React.SVGProps<SVGElement>>;
  export default content;
}
```

## 実際に呼び出してみる
**1. `logo.tsx` を src/components/common/parts 配下に追加**
```
import Logo from 'public/logo.svg';
const LogoView = (): JSX.Element => {
  return <Logo />;
};

export default LogoView;
```

**2. header.tsx で logo.tsx を import**
```
import LogoView from './parts/logo';

const Header = (): JSX.Element => {
  return (
    <header className="relative py-3 shadow-md">
      <Container className="flex items-center justify-between">
        {/* ロゴ */}
        <Link href="/">
          <a>
            <LogoView />
          </a>
        </Link>

        {/* 略 */}
      
      </Container>
    </header>
  );
};

export default Header;
```
▼ 正常に読み込めた！
![スクリーンショット 2023-01-02 22.57.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/50734b72-d83d-b416-1068-aee1ebfe736c.png)

## デザインを当ててみる
今のままだとロゴが大きすぎるので、サイズを変更する
ついでにヘッダーの色と SVG の文字色も変えてみる

▼ できた！
![スクリーンショット 2023-01-09 19.25.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515031/781f32d3-4ade-2a0d-f09d-02bc4a2e6581.png)

けど...
png で作った画像を SVG に変換する際に、SVG の中身の影響で css が適用できない問題に遭遇して、何時間も詰みんだ...
こっちについては別の記事で log を残す