OmniAICreator/Qiita-1.07M huggingface dataset:
環境変数を永続化させる方法(RHEL8)

皆さんこんにちは！haruです。

環境変数は、export コマンド(UNIX)や set コマンド(Windows)によって、セッション単位で設定することができますが、セッションが切れてしまうと無効化されてしまいます。
そこで今回は、RHEL環境で環境変数を永続化させる方法について共有します。

## 記載するファイル
設定ファイルは、以下の 1 → 2 → 3 → 4 の順で読み込まれていきます。 
今回は以下のうち、[.bash_profile]に記載をします。

- **1. /etc/profile**
・bashがログインシェルとして起動された際、最初に読み込まれる設定ファイルです。
・全ユーザに適用されます。

- **2. ~/.bash_profile**
・「/etc/profile」の次に読み込まれるファイルです。
・特定ユーザに適用されます（「~/」配下のため）

- **3. ~/.bash_login**
・「~/.bash_profile」が存在しない場合、「/etc/profile」から２番目に読み込まれるファイルです。
・特定ユーザに適用されます（「~/」配下のため）

- **4. ~/.profile**
・「~/.bash_profile」が存在しない場合、「/etc/profile」から３番目に読み込まれるファイルです。
・特定ユーザに適用されます（「~/」配下のため）
・②③と異なり、sh等の別のシェルからでも読み込まれます。

## 現状の確認
環境変数を設定していない場合は、コマンドが通りませんね。
コマンド情報が格納されている bin の位置がわからないためです。
```
[postgres@primary ~]$ pg_ctl
bash: pg_ctl: コマンドが見つかりませんでした...
```

## 環境変数の設定
vi コマンドで記載していきます。
```
[root@primary pgsql]# su - postgres
[postgres@primary ~]$ vi .bash_profile
[postgres@primary ~]$ cat .bash_profile
[ -f /etc/profile ] && source /etc/profile
PGDATA=/var/lib/pgsql/15/data
export PGDATA
# If you want to customize your settings,
# Use the file below. This is not overridden
# by the RPMS.
[ -f /var/lib/pgsql/.pgsql_profile ] && source /var/lib/pgsql/.pgsql_profile
export PATH=$PATH:/usr/pgsql-15/bin
export MANPATH=$MANPATH:/usr/pgsql-15/share/man
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/pgsql-15/lib
export PGDATA=/var/lib/pgsql/15/data
```

## 設定の反映
```
[postgres@primary ~]$ source ~/.bash_profile
```

## セッションの再接続
無事認識されています。
```
[postgres@primary ~]$ pg_ctl
pg_ctl: 操作モードが指定されていません
詳細は"pg_ctl --help"を実行してください。
```

以上です！
上級者を目指すExcelVBA #8『マジックナンバー』

### マジックナンバーとは

変数や定数に格納されずにコード内でいきなり出てくる数字のことをマジックナンバーといいます。

以下の例では32や4の数字が何の意味を指しているのかパッと見で分かりづらいため、保守がしづらくなります。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200881/fd93529d-af5a-5bb0-3d7b-56ca0c878914.png" width = "621">

### 数字は定数化する

これを避けるため、このような数字は極力定数化し、名前から意味が推測できるようにしてやります。
できれば"福岡県"の部分も定数にしておくと良いでしょう。
数字やシート名を定数化することで、後で変更する際にも編集しやすくなります。

<img src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200881/f014a6c5-a03b-c547-6fd6-631f138852bb.png" width = "621">

上記はかなりシンプルなコードですが、コードが複雑になるほど定数化の恩恵が出てきます。

別記事で書いたモジュール分割やネーミングルールなどと併用し、大規模なプログラムになっても一目で処理内容が判別出来るコードを書けるよう心がけましょう。
スリープから復帰後WSL2の時刻がズレるのを何とかしたい

タイトルの通りスリープから復帰すると、WSL側の時間がズレてしまいます。

```:PowerShell
↓ dateコマンドで両方を確認
PS C:\> date; wsl date
2022年10月月25日 火曜日 22:14:10
2022年 10月 25日 火曜日 17:22:37 JST
```

以前にもこの不具合はありましたけど、22H2が出る前には修正されていたはずなのですが…
22H2に上げると、WSLも同時にMicrosoft Store版のWSL Previewになるようで、こちらをアンインストールして以前に戻すと不具合は出ないみたいです。
（私は、`wsl --update`ができないため戻していません。といいますか、アップデートするとStore版になってしまうようです）
ということで、時刻合わせに**chrony**をインストールして、とりあえずの対策をしたいと思います。

# 環境
- エディション: Windows 11 Home
- バージョン: 22H2
- WSL バージョン: 0.70.4.0
- カーネル バージョン: 5.15.68.1
- ディストリビューション: Debian GNU/Linux 11

# chronyをインストール
**WSL2+Debian 11**での使用を前提としています。
```:WSL
$ sudo apt install chrony
```

## NTPサーバーを追加
Windowsでは`ntp.nict.jp`を指定しているので併せました。

```:WSL
$ sudo vi /etc/chrony/chrony.conf
-----
↓ NTPサーバーを変更
#pool 2.debian.pool.ntp.org iburst  ← コメントアウト
pool ntp.nict.jp iburst  ← 追加
```

## 起動
```:PowerShell
PS C:\> wsl -u root -- service chrony start
Starting time daemon: chronyd.
```

# スリープから復帰後
PowerShellから以下のコマンドを実行します。
WSLのシェルから実行でも良いのですが、sudoの際パスワードを求められる1アクションがあるのでPowerShellを利用しています。
```:PowerShell
PS C:\> wsl -u root -- service chrony restart
↓ 表示されてリスタート
Stopping time daemon: chronyd.
Starting time daemon: chronyd.
```
以下の場合はリスタートできていないようなので、もう一度実行
```:PowerShell
Stopping time daemon: chronyd.
chronyd is already running.
↑ この後、dateで確認しても反映されていない
```

# どうしてchrony？
自分の環境だけかもしれませんが、`sudo hwclock -s`を実行して同期させても全く反映してくれないことが度々あったため、chronyを用いることにしました。
`wsl --shutdown`でWSL自体を再起動でも良いのですが、バッチ処理でvhdのmountとserviceを幾つか起動（ssh cron apache2 mariadb php-fpm smtp4dev etc.）してまして、それなりに起動に時間が掛かるため、もっと容易に時刻を反映させたいと思い導入しました。
システム開発のプロセス

# 開発工程と作業内容
ソフトウェアは```作ってしまえば終わりというものではなく、その後の長期間にわたって運用・保守```が続けられる。
システムの利用環境が変化し、```保守では対応できなくなったとき、新たなシステム構築が必要```となる。

## 開発プロセスの詳細
### システム要件定義
システムを機能的な単位に切り分け、目標とすべきシステムとその対象範囲をまとめる。
```ユーザーの業務手順```、```操作手順```、```入出力データの分析・整理し、ユーザ要求を踏まえながらシステムに入れるべき機能を明確```にしておく。

### ソフトウェア要件定義
ソフトウェア部分についての要件を確立。
* 業務の詳細な流れをシステムの形にする。
* データの流れを掴む
* 画面や帳票のなどを設計する。
* セキュリティ対策
* システム保守の仕様

### 設計
#### システム設計
* ハードウェア構成
* ソフトウェア構成
* 集中・分散処理などのシステムの処理方式
* データベース方式および統合テストのテスト使用を決めていく。

#### ソフトウェア設計
システムをコンポーネントやモジュール（機能単位）~ソフトウェアユニット（プログラム単位)まで分割し、機能、インタフェース仕様を決めていく。

### 実装・構築
分割した各ソフトウェアユニットについて、実際にコーディング（プログラミング）を行っていく。
各ユニットのデバッグを経て、レビュー及びユニットテストを行う。

### 統合・テスト
機能単位に統合（ソフトウェア統合）し、さらにシステムとして機能するように統合（システム統合）する。テスト、レビューを経てシステムのチューニング（調整）を実施する。

### 導入・受け入れ支援
導入計画及び導入を行う。また、```テスト支援や教育訓練、利用者マニュアルの整備などの受け入れ支援```を実施

### 保守・廃棄
次期システムの完成による廃棄まで稼働を続ける。

# 関連記事
https://qiita.com/masatom86650860/items/5d76d5c12597d04f7c3c

# 参考
https://ssaits.jp/promapedia/concepts/acquisition.html#

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8
【SwiftUI】MenuBarExtra使ってみた

# はじめに
以前、SwiftUIでメニューバーアプリを作成しました。

https://qiita.com/SNQ-2001/items/7e8ac52e9e8726228806

この時は公式でサポートされていませんでしたので、NSHostingControllerとNSPopoverを使用して無理やり作っていました。

しかし！！WWDC22で`MenuBarExtra`というメニューバーアプリをSwiftUIで作る用の機能が発表されました！！

macOS13がリリースされたので早速使ってみました！

以前の実装方法と比較しながら紹介できたらと思います！

# 以前の実装方法
```swift
import SwiftUI

@main
struct SwiftUI_MenuBar_DemoApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var delegate
    var body: some Scene {
        Settings { }
    }
}

class AppDelegate: NSObject, NSApplicationDelegate {
    var statusBarItem: NSStatusItem!
    var popover = NSPopover()
    func applicationDidFinishLaunching(_ notification: Notification) {
        popover.behavior = .transient
        popover.contentViewController = NSHostingController(rootView: ContentView())
        self.statusBarItem = NSStatusBar.system.statusItem(withLength: CGFloat(NSStatusItem.variableLength))
        guard let button = self.statusBarItem.button else { return }
        // アイコンの設定
        button.image = NSImage(systemSymbolName: "camera.macro", accessibilityDescription: nil)
        // アクションの設定
        button.action = #selector(menuButtonAction(sender:))
    }
    @objc func menuButtonAction(sender: AnyObject) {
        guard let button = self.statusBarItem.button else { return }
        if self.popover.isShown {
            self.popover.performClose(sender)
        } else {
            // ポップアップを表示
            self.popover.show(relativeTo: button.bounds, of: button, preferredEdge: NSRectEdge.minY)
            // 他の位置をタップすると消える
            self.popover.contentViewController?.view.window?.makeKey()
        }
    }
}
```

# macOS13からの実装方法
これだけ！！簡単！！！
```swift
import SwiftUI

@main
struct MenuBarApp: App {
    var body: some Scene {
        MenuBarExtra {
            ContentView()
        } label: {
            Image(nsImage: NSImage(named: "menubar"))
        }
        .menuBarExtraStyle(.window)
    }
}
```

:::note warn
**注意1**
`MenuBarExtra`のlabelにImageを設定する場合は`NSImage`でないとライトモードとダークモードでの切り替えがされません
:::

:::note warn
**注意2**
`.menuBarExtraStyle(.window)`
これがないと`ContentView`のサイズで表示されません
:::

# おわり
SwiftUIでできることが増えると嬉しいです😆

MenuBarExtraを使ったメニューバーアプリです！
スターください！！！！

https://github.com/SNQ-2001/github-contributions-menubar-macos/tree/1.1.0
メッセージブローカーを使ってあそんでみる 環境構築編

# メッセージブローカーを使ってあそんでみるの目的


## 今回のお題
メッセージブローカー「ActiveMQ」をインストールしサービスの自動起動と確認を行います。

## ■事前環境
・Ubuntu 18.04.6 LTS
・openjdk version "11.0.16" 2022-07-19

## １．ActiveMQの圧縮ファイルをダウンロード
~~~
$ wget https://dlcdn.apache.org//activemq/5.17.2/apache-activemq-5.17.2-bin.tar.gz
~~~

## ２．圧縮ファイルの解凍
圧縮ファイルを解凍し/opt配下に解凍されたフォルダーを移動
~~~
$ sudo tar xfz apache-activemq-5.17.2-bin.tar.gz
$ sudo mv apache-activemq-5.17.2 /opt/.
$ cd /opt/apache-activemq-5.17.2
~~~

## ３．設定ファイルを変更
デフォルトでは、ローカルホストからのみアクセスが許可されています。
ローカルまたはパブリック ネットワークから ActiveMQへアクセスを
有効にするには、conf/jetty.xml 構成ファイルを編集します。

例えば、すべてのネットワークからアクセスを有効にするには、「0.0.0.0」と設定します。
~~~conf/jetty.xml
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
    <!-- the default port number for the web console -->
    <property name="host" value="0.0.0.0"/>
    <property name="port" value="8161"/>
</bean>
~~~

## ４．Systemdサービスへの登録と設定
### ４-１．起動用ユーザとグループの作成
~~~
$sudo adduser activemq
Adding user `activemq' ...
Adding new group `activemq'  ...
~~~

### ４-２．サービス構成用ファイルを作成
起動ユーザとして上記で作成したユーザとグループを設定。
~~~/etc/systemd/system/activemq.service 
[Unit]
Description=Apache ActiveMQ Message Broker
After=network-online.target

[Service]
Type=forking

User=activemq
Group=activemq

WorkingDirectory=/opt/apache-activemq-5.17.2/bin
ExecStart=/opt/apache-activemq-5.17.2/bin/activemq start
ExecStop=/opt/apache-activemq-5.17.2/bin/activemq stop
Restart=on-abort

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

### ４-３．Systemdサービスをリロード
リロードすることで構成ファイルに問題がなければ、登録されます。
~~~
$ sudo systemctl daemon-reload 
~~~

### ４-４．サービスの自動起動設定および起動確認
~~~
$ sudo systemctl enable activemq.service 
$ sudo systemctl start activemq.service 
~~~

#### ４－５．状態の確認
~~~
$ sudo systemctl status activemq
● activemq.service - Apache ActiveMQ Message Broker
   Loaded: loaded (/etc/systemd/system/activemq.service; enabled; vendor preset:
   Active: active (running) since Wed 2022-01-01 0:0:0 JST; 29min ago
  Process: 8754 ExecStop=/opt/apache-activemq-5.17.2/bin/activemq stop (code=exi
  Process: 8942 ExecStart=/opt/apache-activemq-5.17.2/bin/activemq start (code=e
 Main PID: 9033 (java)
    Tasks: 53 (limit: 4181)
   CGroup: /system.slice/activemq.service
           mq9033 /usr/bin/java -Xms64M -Xmx1G -Djava.util.logging.config.file=l
~~~

## ５．ActiveMQの管理コンソールを表示
サービスが正常起動している場合、ブラウザーでコンソールにアクセスできます。
管理コンソールにアクセスする際はデフォルトで以下のパスワードが設定されています。
http://[サーバ]:8161/admin/
ユーザID:admin
パスワード:admmin
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578067/6adbe9ef-c459-f49d-4282-ceb2519eed24.png)
AmazonLinux2 + cron + reboot で正しく再起動させるには

# はじめに

Amazon Linux 2で運用しているサーバーをyum updateで更新したが、アクセス数が低い夜中に再起動したくなった。
そこで以下の設定をcronに設定する。

```Text:crontab -e
0 5 * * * reboot
```

しかし次の日確認したら再起動されていなかったので、その確認方法・対応方法をメモとして残しておく。

# 結論

rebootコマンドを絶対パスで指定する。

```Text:crontab -e
0 5 * * * /usr/sbin/reboot
```

# 確認方法

これまで他のディストリビューションで実施した際は問題なかったのでなんで？？？と思ったが、cronではPATHが通っていないことがあるので、まずはPATH環境変数の確認。そこで以下を実施。

```Text:crontab -e(cronでPATH環境変数出力)
MM HH * * * echo $PATH > /root/cron.log
```

※上記MMは数分後にしておいた方が吉。1分後だと間に合わないケースも。

↑で出力された/root/cron.logを確認。

```Text:cronのPATH環境変数
# cat /root/cron.log
/usr/bin:/bin
```

ふむふむ。

rebootはどこ？

```Text:whereis
# whereis reboot
reboot: /usr/sbin/reboot /usr/share/man/man2/reboot.2.gz /usr/share/man/man8/reboot.8.gz
```

ということで予想通りPATHが通っていないことが判明。

# 対応方法その1

```Text:crontab -e
export PATH=$PATH:/usr/sbin

0 5 * * * reboot
```

上記のようにcrontab -eで開いた後に、冒頭でPATH環境変数に/usr/sbinを設定する。

# 対応方法その2

```Text:crontab -e
0 5 * * * /usr/sbin/reboot
```

冒頭の「結論」でも記載したがrebootコマンドを絶対パスで指定する。
今回はこちらの方法で対応。

無事に再起動した。
Docker run from image

```
#!/bin/sh

docker run -v $(pwd):/app -w /app -t -i --env GITLAB_TOKEN=xxxxxx --env UV_MODE=ci docker/compose:debian-1.29.2 bash

```

解読
- docker/compose:debian-1.29.2 イメージからcontainer作成
- 現在のfolderをappにmountします
- GITLAB_TOKENとUV_MODEの環境変数を設定します。
[Git入門] コミットを取り消す・元に戻す




# 「reset」でコミットを取り消して無かったことにする
```
 git reset [option][打ち消したいコミットID]
```
### HEADでコミット指定する場合
```
 git reset [option] HEAD^
```
# git reset のオプション
 git reset には3種類のオプションがあります。
それぞれ使用するタイミングを間違えないようよく理解して使うようにしましょう。
- ####  `--soft`
    -  `commit`のみ取り消し (HEADの位置のみが修正される）
    -  ディレクトリの内容はそのままでコミットのみを取り消したい場合に使用

- ####  `--hard` (最も強力なオプション)

    - 全部を取り消し（HEADの位置・インデックス・ワーキングツリーが修正される）
    - ディレクトリの内容も書き換えコミット取り消したい場合に使用


    
- ####  `--mixed`

    - `commit`と`add`の取り消し（HEADの位置・インデックスが修正される）
    - ディレクトリはそのままで、`git add`を取り消したい場合に使用

# 「--revert」でコミットを打ち消す
```
git revert  [打ち消したいコミットID]
```
`revert`はコミットを打ち消すと言う表現より、逆の内容をコミットしてくれています。
`reset`のように取り消すのではなく、**「逆向きのコミット」として履歴が残ります。**
もし間違えて`revert`したとしても、もう一度`revert`し直せば問題ありません

# 「--amend」で直前のcommitを上書き修正する
```
 git commit --amend
```
- 「単に直近のコミットメッセージを変更したい」
- 「コミット内容を後から追加したい」

などの場合に使用すると便利

# 現在の状態をよく確認しよう
間違ったコミットの防止のためにも、自身の編集が完了したらコミットの前に現在の状態を確認しましょう。
- `git status`
　現在の状態を表示します。変更があったファイルを確認することができます。

- `git diff`
　ソース内でどのような変更があったのか、差分を確認することができます。

- `git log`
　コミット履歴を確認することができます。
Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azureの認証方法」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Azureの認証方法」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azure のアーキテクチャとサービスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/azure-fundamentals-describe-azure-architecture-services/)
◇対応するモジュール
[Azure の認証方法について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-azure-identity-access-security/3-authentication-methods)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Azure ディレクトリサービス」](https://qiita.com/fsd-jume/items/7d919c2192d2e47d29f2)

## Azureの認証方法
### シングルサインオン(SSO：Single Sign On)
・1セットの資格情報で複数のアプリにサインインできる認証方式
・アプリ間のアクセスは単一のIDのみ許可されるため、セキュリティモデルが簡素化
・ユーザ側はID管理が容易になり、IT部門はユーザ管理が容易になる

### 多要素認証(MFA：Multi-Factor Authentication)
・サインインプロセス中に追加で本人確認できるものをユーザに求める認証方式
・下記の認証要素を2つ以上必須とする
　-ユーザが知っているもの(通常はパスワード)
　-ユーザが持っているもの(携帯電話やハードウェアキーなどの信頼できるデバイス)
　-ユーザ自身(指紋や顔などの生体認証)
・持っているものや自身の情報は取得や複製が困難なため、セキュリティが向上する
・Azure AD Multi-Factor Authenticationにより、電話やモバイルアプリなどで多要素認証が可能

### パスワードレス認証
・パスワードを使用せずにサインインできる認証方式
・ユーザが持っているものと生体認証またはPINで認証
・パスワードの漏洩によるリスクがなく、ユーザの利便性も高い
・組織のニーズにより3つのパスワードレス認証オプションがある
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2851723/ed2741d1-48e2-2071-e8a9-9b167dda78bd.png)

## 次の学習内容
**◆Azureの外部ID**

https://qiita.com/fsd-jume/items/98670d565420bf9f70dc

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
suse-sles-sap-15-sp4-byos-v20220621-hvm-ssd-x86_64が動かない

下記、AMIから起動したけど全く動かない。
>ami-06c73730f8d26059e
suse-sles-sap-15-sp4-byos-v20220621-hvm-ssd-x86_64

インスタンスタイプをr6i→r5に変更したら動いた。
paiza.ioでelixir その14

# 概要
paiza.ioでelixirやってみた。
jwtの検証やってみた。

# 検証したjwt
- 出所
wikiペディア

- 全体

```
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
```

- タイプ
HS256

- キー
secretkey

- ヘッダー
{
"alg": "HS256",
"typ": "JWT"
}

- ペイロード
{
"loggedInAs":"admin",
"iat":1422779638
}

- シグニチャー
gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

# 結果

```
{"alg":"HS256","typ":"JWT"}
{"loggedInAs":"admin","iat":1422779638}
gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI=

```

# サンプルコード

```
defmodule Jwt do
	def decode(str) do
	    [head, payload, _] = String.split(str, ".") 
	    head = String.replace(head, "-", "+")
	    head = String.replace(head, "_", "/")
	    {:ok, res} = Base.decode64 head
        res
        |> IO.puts
        payload = String.replace(payload, "-", "+")
	    payload = String.replace(payload, "_", "/")
	    {:ok, res} = Base.decode64 payload
        res
        |> IO.puts
	end
    def enc(str) do
        :crypto.mac(:hmac, :sha256, "secretkey", str)
        |> Base.encode64( case: :lower)
        |> String.replace("+", "-")
	    |> String.replace("/", "_")
        |> IO.puts
    end
end


Jwt.decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI")
Jwt.enc("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9")





```

# 成果物

https://paiza.io/projects/PScU48rTJ1Nl7TCIRvGCfg

以上。
Webを支える技術のまとめ(1部)

# はじめに
「Webを支える技術」を読んで，その内容を自分の知識と織り交ぜながら自分なりにまとめました．
(「Webを支える技術」のリンクは最後の参考文献に記載しています．)
# Webとは何か
文書を公開，閲覧するためのシステム．
Web上の文章は，ハイパーテキストという言語で記述されている．
World Wide Webの略．
## Webの用途
1. Webサイト
   - 検索サイト，ブログ，etc
2. UI
   - デバイスの設定画面，HTMLを用いたファイルの記述
3. API
   - Web API

## Webを支える技術
1. HTTP,URI,HTML
   - HTTP：Webサーバがクライアントとやりとりする際の通信プロトコル(get,post etc)
   - URI：Web上のあらゆる情報を識別するための識別子のようなもの
   - HTML：ハイパーテキストを記述するための言語
2. ハイパーメディア
   - 色々なメディアをハイパーリンク(Webページの参照)で繋げて構成したシステム
3. 分散システム
   - 複数のコンピュータによって構成されたシステム
   - 負荷分散，故障・障害に強い，低コスト
# REST
Webのアーキテクチャスタイル．
クライアントサーバ方式にいくつかの制約を追加してできたアーキテクチャスタイル．
## リソースについて
RESTにおける重要な概念の一つ．
WEB上に存在する名前をもったありとあらゆる情報．
## RESTの構成
RESTは，次の6つを組み合わせたアーキテクチャスタイルのこと．
一部の構成要素を除外しても，RESTと呼んでも問題ない．
次節以降にこの6つの要素について説明する．
1. クライアント/サーバ
2. ステートレスサーバ
3. キャッシュ
4. 統一インタフェース
5. 階層化システム
6. コードオンデマンド

### クライアント/サーバ
ネットワークシステムのアーキテクチャ．
HTTPでクライアントとサーバが通信している．
クライアントとサーバにわけて処理を行う．
### ステートレスサーバ
クライアント/サーバに最初に追加するアーキテクチャスタイル
サーバ側でアプリケーションの状態を管理しない方式．
→サーバ側での実装を簡略化できる．
逆のステートフルの方式として，Cookieなどが挙げられる．
### キャッシュ
一度取得したリソースをクライアントサイドで再利用する方式．
→サーバとクライアント間の通信を減らすことができ，ネットワークの帯域の利用や処理時間の縮小に貢献．効率的な処理が可能に．
### 統一インタフェース
URIで指し示したリソースに対する操作を統一した限定的なインターフェースで実施すること．
HTTP1.1では，GET,POSTなど8メソッドに限定されている．
→全体のアーキテクチャがシンプルになる
### 階層化システム
システムをいくつかの階層にわけるアーキテクチャスタイルのこと．
ex)サーバとクライアントの間にロードバランサを入れる場合，クライアントは同じインタフェースから接続できるため，サーバかproxyかを考えなくてよい．
### コードオンデマンド
プログラムコードをサーバからダウンロードし、クライアント側でそれを実行するアーキテクチャスタイルのこと．
ex)Jsなど
→メリット：クライアントを後から拡張できる．
→デメリット：ネットワークの可視性が低下する
# 参考文献
Webを支える技術：
https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042
Red Hat OpenShift LocalをMacOSにインストールしてみる

# はじめに
当記事では、Red Hat社が開発およびテストの目的で提供しているRed Hat OpenShift LocalをMacBook Pro(13-inch, 2020, Intel)にインストールする手順を記載します。
Red Hat OpenShift Localは、主に開発者がデスクトップ上で開発およびテストを実行することを目的とした製品です。

コンテナオーケストレーションツールを手元のPCで軽く試してみることができそうということでやってみました。

製品の紹介は、[スタートガイド](https://access.redhat.com/documentation/ja-jp/red_hat_openshift_local/2.5/html/getting_started_guide/index)で読むことができます（2022年10月現在ドキュメントの記載はバージョンは2.5が最新ですが、アクセスする際にはバージョンを確認してください）。

# 最小システム要件
今回は手元のMacBook Proを使用するため、MacOSの要件を確認します。
スタートガイドの[最小システム要件](https://access.redhat.com/documentation/ja-jp/red_hat_openshift_local/2.5/html/getting_started_guide/installation_gsg#minimum-system-requirements_gsg)を参照します。

- 物理 CPU コア 4 個
- 空きメモリー 9 GB
- ストレージ領域の 35 GB
- macOS では、Red Hat OpenShift Local には macOS 11 Big Sur 以降が必要です。
Red Hat OpenShift Localは、以前のバージョンの macOS では機能しません。

M1チップはサポートしていないようです。（2022年10月現在）早くサポートしてくれると良いですね。

# 前提環境

今回使用した手元のMacBook Proの環境はこちらです。

- MacBook Pro (13-inch, 2020)
- 2.3 GHz クアッドコア Intel Core i7
- 32 GB 3733 MHz LPDDR4X
- MacOS Monterey 12.6

導入したRed Hat OpenShift Localのバージョン 2.9.0

# 導入手順
スタートガイドの[インストール手順](https://access.redhat.com/documentation/ja-jp/red_hat_openshift_local/2.5/html/getting_started_guide/installing_gsg)に記載されているRed Hat社のダウンロードサイトへアクセスします。
Red Hatアカウントでのログインを求められます。

- Red Hatアカウント登録が済んでいない場合は、登録（無料）が必要です。
- Red Hatアカウント登録済みの場合は、ログインをするとダウンロード画面にアクセスできます。

環境に合わせたインストーラをダウンロードします。

![OpenShiftLocalのダウンロード画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/cd4c7c0f-9406-3518-fcae-8fb0d122f758.png)

また、初回の起動時にプルシークレットの入力を求められるため、同じ画面でプルシークレット(pull-secret.txt)をダウンロードしておきます。
すぐにインストールするならプルシークレットのコピーボタンが便利です。

## インストール
ダウンロードしたインストーラを起動するとガイドに従って導入できます。

## セットアップ
インストールできたらセットアップします。
ターミナルを開いて次のコマンドを実行します。

```zsh
% crc setup
```

途中で改善のための統計情報取得に協力するかどうか聞かれますので、y/Nで答えます。![OpenShiftLocalのダウンロード画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/920feb27-2e01-cdfa-8710-288a882f3899.png)

上記の環境で、セットアップには5分くらいかかります。

## 起動
セットアップが完了したら、次は利用するために起動します。
LaunchpadからRed Hat OpenShift Localを起動するか、もしくはターミナルから以下のコマンドを実行します。

```zsh
% crc start
```

初回の起動途中で、プルシークレットの入力を求められますので、上記でダウンロードしたファイルの内容をコピーペーストします。
コマンドの出力の最後に、ログインに必要なIDとパスワード、URLが表示されるため控えておきます。

## ログイン
上記で出力されたログインのための情報を使ってログインします。
ターミナルから以下のコマンドでログインします。

```zsh
% oc login <上記の出力内容による>
```

## コンソールの利用
また、コンソールによる操作も可能です。
LaunchpadからRed Hat OpenShift Localを選択します。

![LaunchpadのOpenShiftLocal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/319a19f9-b01e-c6c2-2ebb-406ee36db444.png)

メニューバーにアイコンが表示されます。
アイコンをクリックするとメニューが表示されますので、そこからコンソールを開く(Open Console)ことが可能です。
![OpenShiftLocalのメニュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/b8d6fbdb-4611-c0a8-90d4-d1d0ef0e7ecb.png)

この場合は、ブラウザが起動してコンソール画面が開きます。

![OpenShiftLocalのコンソール画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342308/0e870284-55c1-82bc-6386-f2ef297c9ac2.png)

## 停止する場合
Red Hat OpenShift Localを停止する場合は、次のコマンドを実行します。

```zsh
% crc stop
```

## 削除する場合
Red Hat OpenShift Localの設定を削除する場合は、次のコマンドを実行します。

```zsh
% crc delete
% rm -r ~/.crc
```

以上
alpine 向け ImageMagick イメージのインストールに失敗する（IO Error）

2022/10/26 の午前にいつものように Dockerfile から `docker-compose build` しようとすると

```
ERROR: imagemagick6-c++-6.9.10.75-r0.apk: IO ERROR
```

のエラーが。imagemagick6 はホスティングサイトから個別に apk をダウンロードしていたが、Dockerfile やコードに変更はないのでホストされているファイルか URL に問題がありそう。

かいつまんで言うとダウンロードしていた URL を以下のように修正
http://dl-4.alpinelinux.org/alpine/v3.11/community/x86_64/
↓
https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/

また alpine3.13 を使っていたので合わせて ImageMagick のバージョンも 6.9.11.55-r0 に変更（ここは各々のバージョンによる）。
これでビルドできるようになった。
取り急ぎ。
【Scheduler】Sending message to Microsoft Teams (Channel Link:Basic)

This time, we will use Channel Link to send a message to Microsoft Teams.
### Getting channel link URL in Microsoft Teams ###
First, select the channel you want to send the message to and get its link URL.
Select `Get link to channel` from the channel's menu.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/17c8ad22-712e-8c75-8fe9-bca33b161061.png)
Copy the **link URL** to your clipboard.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/baf06e0a-bd53-dd59-c463-a78e784642ac.png)
### Defining Scheduler Tasks ###
Launch **Scheduler** from the [Sharperlight](https://sharperlight.com/) application menu. Start creating a new task. Fill in the **Code**, **Group** and **Description** in the `General` tab.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4e88c5ab-0762-d3cb-24ff-2ce7b435918f.png)
Go to the `Actions` tab and add the **Microsoft Teams - Send Message** action with the `New` icon.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/02e3a2f5-fabe-51b0-632f-20e73906a837.png)
Select **Channel Link** for the `Connection` option. Paste the channel link URL that you just copied to the clipboard into the text box.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7d0a4ac3-99a5-a718-1767-ee9a22f926d6.png)
Use the `Authenticate` button to set the connection authentication properties.
Select **Microsoft Azure Graph** for `type`.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/11996586-a7cb-88a5-fae1-f38f36b5efc7.png)
Then enter the account information to be used for authentication and test with the `Test` button. Save after confirming that the test has finished normally. A unique code is automatically assigned and saved.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/50e8ed92-267a-d735-73ec-06c6d172f8f7.png)
This authenticate can be shared by other Sharperlight applications.
Set the `method` to **Basic**, enter the `Subject` and `Message` in plain text and save with the `OK` button.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/aee900b4-62a8-b6aa-4ac4-69fa14cc945b.png)
Try executing the task manually using the scheduler right-click menu `Execute`.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0e2cbb0b-7e70-be85-23b4-0010a2d06047.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9da37aca-265a-f273-90d2-5914404ff05d.png)
After the task is finished, check the results in Teams. The result is :thumbsup:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3e82d6bc-5722-bc13-032b-d4bf56a54164.png)
Thank you.
Get-Host behaves differently in PSRemoting.

Get-Hostはinvoke-commandで実行すると、なぜか同じバージョン情報を返してくる。Enter-PSSessionで実行しても同じだった。

* PCXX is Windows11.
* PCYY is Windows10.
* localhost is Windows8.1.


```powershell
PS >(get-host).version

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      14409  1027


PS >$h = ( get-content .\hosts.txt )
PS >$h
PCXX
PCYY
localhost

PS >invoke-command -computername $h -scriptblock { (get-host).version }

Major  Minor  Build  Revision PSComputerName
-----  -----  -----  -------- --------------
1      0      0      0        localhost
1      0      0      0        PCXX
1      0      0      0        PCYY


PS >invoke-command -computername $h -scriptblock { [system.environment]::osversion }


PSComputerName : PCXX
RunspaceId     : **********
Platform       : Win32NT
ServicePack    :
Version        : 10.0.22621.0
VersionString  : Microsoft Windows NT 10.0.22621.0

PSComputerName : localhost
RunspaceId     : ***********
Platform       : Win32NT
ServicePack    :
Version        : 6.3.9600.0
VersionString  : Microsoft Windows NT 6.3.9600.0

PSComputerName : PCYY
RunspaceId     : **********
Platform       : Win32NT
ServicePack    :
Version        : 10.0.19044.0
VersionString  : Microsoft Windows NT 10.0.19044.0
```
Why?
【スケジューラ】Microsoft Teamsにメッセージを送ってみる（Channel Link:基礎編）

今回はChannel Linkを使用して、Microsoft Teamsにメッセージを送ってみようと思います。
### Microsoft TeamsでのチャンネルリンクURLの取得 ###
先ずメッセージの送信先にするチャンネルを選び**リンクURL**を取得します。
チャンネルのメニューから`Get link to channel`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/17c8ad22-712e-8c75-8fe9-bca33b161061.png)
**リンクURL**が表示されるのでクリップボードにコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/baf06e0a-bd53-dd59-c463-a78e784642ac.png)
### スケジューラタスクの定義 ###
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから**スケジューラ**を起動します。タスクの新規作成を開始します。`一般`タブで**コード**、**グループ**、**説明**を記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/eed7f1fa-c5a1-0f43-9b8e-8286acdf62dc.png)
`アクション`タブに移動して、`新規`アイコンで**マイクロソフトチーム - メッセージの送信**アクションを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9dfdba82-3490-b8e0-8931-f7827a0a7823.png)
`接続`オプションでは**チャンネルリンク**を選びます。先ほどクリップボードにコピーしたチャンネルリンクURLをテキストボックスに貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/ccdabe74-94a1-e275-acb4-ae8764f45a46.png)
`認証`ボタンを利用して接続認証プロパティの設定を行います。
`タイプ`には**Micorosoft Azure Graph**を指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e7039919-b8c7-f1e1-8a37-b9489ff3d2c9.png)
そして認証に使用するアカウント情報を入力し、`接続テスト`ボタンでテストを行います。正常にテストが終了したことを確認してから保存します。自動的に一意なコードが割り振られて保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a0c78eae-983b-7c2c-7dab-63e24e878bbb.png)
この認証は、他のSharperlightアプリケーションで共有できます。
`メソッド`を**基本**とし、`件名`と`メッセージ`をプレインテキストで入力して`OK`ボタンで保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/61e6941c-d5e5-6f02-056e-476e500f6fe7.png)
スケジューラ右クリックメニューの`実行`を利用して手動でタスクを走らせてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4f12593a-df26-4442-9f81-16e68603d62c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e83a1e47-2fc6-79ec-6255-5fd7f9a9ddd1.png)
タスクが終了した後、Teamsで結果を確認してみます。結果は:thumbsup:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b09896d4-96ca-a868-6f37-170551abd555.png)

では、失礼します。
同期と非同期の違いとPromiseの役割

# 同期処理と非同期処理とは

## 同期処理

同期処理は順番通りに処理を行う

```javascript
console.log("一番");
console.log("二番");
console.log("三番");

コンソールログ
//上から順番通り
一番
二番
三番
```
同期処理の問題点
同期処理は順番通りに処理を行うために
途中に重い処理が合った場合その処理を待たないといけない

## 非同期処理
処理を順番通りにとは限らない、終わった処理から実行される
例えばsetTimeoutなど

```javascript
      console.log("一番");
      setTimeout(() => console.log("二番"), 5000);
      console.log("三番");

//コンソールログ
一番
三番
二番
```
このように順番通りではなく処理が終わった順番になる

## Promise

resolve実行時は
thenの処理

reject実行時は
catchの処理

finallyはresolve,reject両方とも最後に実行される






```javascript

      new Promise(function (resolve, reject) {
        console.log("promise");
        resolve("hello"); //thenが順番に実行される
        // reject("bye"); //catchが実行される
      })
        .then(function (data) {
          console.log("then" + data); //then helloと表示される
          return data;
        })
        .then(function (data) {
          console.log("then" + data); //then helloと表示される
          return data;
        })
        .catch(function (data) {
          console.log("catch" + data); //catch byeと表示される
        })
        .finally(function () {
          //resolveとreject両方とも表示される
          //finallyにはデータを渡せない
          console.log("finally");
        });
      console.log("global end");
```
Kria KV260のVitis Custom Embedded Platform Creation Exampleを試す

# 目的
- Xilinx Kria KV260のVitis Custom Embedded Platform Creation Exampleをやってみた
- 公式ドキュメント通りにやろうと思ったら少し詰まった部分があったので、作業と追加調査の備忘録を残す
    - Xilinx Kria KV260: [Link](https://www.xilinx.com/products/som/kria/kv260-vision-starter-kit.html)
    - Exampleのドキュメント: [Link](https://xilinx.github.io/Vitis-Tutorials/2021-1/build/html/docs/Vitis_Platform_Creation/Design_Tutorials/01-Edge-KV260/README.html)

# 環境
- OS: Ubuntu 20.04
- Vivado 2021.1
- Vitis 2021.1

# 詳細手順
- [Kria KV260基板のboot SDカードを用意する (0/4)](https://lethediana.sakura.ne.jp/tech/archives/steps/749/)
- [Vivadoでハードウェアを用意する (1/4)](https://lethediana.sakura.ne.jp/tech/archives/steps/759/)
- [PetalinuxでLinuxイメージを作成・デバイスツリーを作成する (2/4)](https://lethediana.sakura.ne.jp/tech/archives/steps/768/)
- [VitisでPlatformプロジェクトを作成する (3/4)](https://lethediana.sakura.ne.jp/tech/archives/steps/771/)
- [VitisでApplicationプロジェクトを作成・Kria KV260基板でアプリケーションを実行する (4/4)](https://lethediana.sakura.ne.jp/tech/archives/steps/775/)
プログラミング言語と命名規則

# はじめに

こんにちは。上野です。

本日は命名規則について。

最近転職をしました。
それに伴い開発環境もガラッと変わりました。
例として、
    Windows → Mac
    Visual C++ → C
    Visual Studio 2018 → Visual Studio Code
    などです。

ソースコードを読んでまず感じたのは、その命名規則の違いです。
実装の層ごとに命名規則は少々異なりますが、ざっくりいうと以下のような違いです。

前職は関数はパスカルケースとキャメルケース。
一方、現職はスネークケース。

まだ慣れないですね、とチームの同僚に話したら「言語によって命名は違うよね〜」とコメントをもらいました。

命名規則自体はソースの制御に影響は受けません。
個人で開発しているのであればほとんど必要ありません。
しかし、複数人で開発するとなると話は別。
ソースに秩序をもたらさなければなりません。

それを承知の上で、じゃあ最適だと思われる解ってなんだろうとちょっと考えてみます。

# 言語と命名規則

そもそも言語と命名規則の関連なんていうものを意識してなかったので、調べてみました。

まず、命名規則の種類。以下の4つが代表的です。
・アッパーキャメルケース
・パスカルケース
・スネークケース
・チェインケース（ケバブケース）

アッパーキャメルケースとパスカルケースは２つまとめてキャメルケースとも言います。

では、それぞれの命名規則はどういった場面で使われることが多いのでしょうか。
以下の記事ではこのように書かれています。

https://designsupply-web.com/media/development/4052/

キャメルケース　→　プログラミングでの関数や変数
スネークケース　→　DBなどで扱う値
ケバブケース　→　HTMLのclass名

他の記事にも同じような意見がありました。
私も体感では上記の使い分けにおおむね納得感があります。
前職でCSSをいじった際に、classはケバブケースで書かれていました。

一方でこちらの記事ではこのように書かれています。

https://kotamorishita.com/programm-naming-convention/

キャメルケース　→　Java, C, Swiftなどでよく利用されている
スネークケース　→　PHPでよく利用されている
ケバブケース　→　HTMLのclass名

さっきの記事とそこまで変わらないですね。

さらに、こちら。
https://www.irohabook.com/case

キャメルケース　→使用言語:Java,C#,Swift,JavaScript
スネークケース　→使用言語：C,C++,Python,PHP

こちらの記事では、言語ごとに提供されている関数について言及しています。

確かに提供されている関数と自身で実装する新しい関数の間で命名規則がガタガタになるよりも、
既に実装されている関数に合わせる。
その方が、読んでいる側としては読みやすいですね。

ただ、命名規則が異なっていることで提供済みの関数か否かを判別できる、そんなことも考えたり。。。

# まとめ

言語で使われているライブラリとかに合わせっるっていうのが一番納得感ありました。
ただ、企業の中にいると既に書かれた関数名やら変数名やらをリファクタリングするのは下手したら設計するよりものエネルギー使うんで、なかなか荷が重い。
メンバー個人個人が意識してコーディングできるといいですね。

上野
DNSの大枠の仕組みに関してまとめてみた

## 概要
ブラウザにURLを入力した後、DNSを介してWebサーバーにリクエストを送信するまでの大枠の流れを学習したためアウトプットする。

## URLとは
Uniform Resource Locatorの略である。
インターネット上のリソースの位置情報を特定するための文字列である。

### 例
`https://www.example.com/`

上記URLは以下の様に分類できる。

`https`・・・スキーム。HTTPなどのプロトコルやmailtoなどが記載されている。
`://`・・・スキームの区切りを表す。これ以降はドメインやポート番号が記載されている。

`www`・・・ホスト名。ホストとはサーバーに付けられた識別用の名前である。。`www`はWorld Wide Webの略称である。例えばヤフーニュースだと`news`というホスト名が使用されている。
`example.com`・・・ドメイン名。インターネット上の住所に相当する。
`www.example.com`・・・FQDN（Fully Qualified Domain Name）で、ホスト名とドメイン名を合わせたもの。

### ドメイン階層
ドメインにはトップレベル・セカンドレベルなどの階層が存在する。

#### 例
`example.co.jp`
上記ドメインだと下記の様に分類される。
- `jp`・・・トップレベルドメイン
- `co`・・・セカンドレベルドメイン
- `example`・・・サードレベルドメイン

上記は階層構造になっており、詳しくは[こちら](https://lpi.or.jp/lpic_all/linux/network/network07.shtml#:~:text=%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D%E3%81%A8IP%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%82%92%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%81%97%E3%81%9F%E6%83%85%E5%A0%B1%EF%BC%88%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3,%E3%81%8CDNS%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF%E3%81%A7%E3%81%99%E3%80%82)の記事に分かりやすく記載していただいている。

## DNSとは
Domain Name Systemの略であり、ドメイン名とIPアドレスを関連付ける機能・サーバーのことである。
IPアドレスは`123.123.123.11`等の数値で表し、ドメインは上記にも記載した`example.co.jp`の様な文字列である。
人間が無数にあるIPアドレスを覚えて使いこなすことは不可能に近いため、ドメイン名と関連付けることで直感的に目的のサーバー等へアクセスできるようにしている。

## DNSの処理の流れ
![SnapCrab_NoName_2022-10-26_14-57-0_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/11a84fd2-4d5c-6abe-2760-bc0017ec31f6.png)


DNSは流れは上図のようなの処理の流れで動作している。

① ブラウザで入力したドメイン名をDNSサーバーに問い合わせる。
② DNSサーバーはキャッシュ機能を有しており、過去にあった問い合わせを保存している。キャッシュ機能があることにより、より高速に名前解決を行い、また、ルートサーバー等のDNSサーバーの負荷を軽減している。
③ キャッシュに情報が保存されていない場合は、ルートサーバーに対してトップレベルドメインを管理しているTLD管理サーバーの情報をリクエストする。（図の例だと`com`）
④ ルートサーバーは、TLD管理サーバーの情報を管理しているので、リクエストにあるトップレベルドメインを管理しているTLD管理サーバーの情報を返却する。
⑤ レスポンスを受けたDNSサーバーはTLD管理サーバーに対してドメインに紐づくIPアドレスをリクエストする。
⑥ TLD管理サーバーがリクエストのドメインに紐づいているIPアドレスを管理している場合はIPアドレスを返却する。管理していない場合は、下位サーバ（今回の場合はexample.comを管理するサーバー）の情報を返却する。
⑦ DNSサーバーはレスポンスにある下位DNSサーバーに対してドメインに紐づくIPアドレスをリクエストする。
⑧ 下位DNSサーバーはリクエストのドメインに紐づいているIPアドレスを管理している場合はIPアドレスを返却する。今回だと、`example.co.jp`に紐づいているIPアドレスを管理しているためIPアドレスを返却する。
⑨⑩⑪ ブラウザは受け取ったIPアドレスに対してクリエストを送信し、Webサーバーがレスポンスを返却してブラウザに画面が表示される。

## 参考文献
https://jprs.jp/glossary/index.php?ID=0058
https://developer.mozilla.org/ja/docs/Learn/Common_questions/What_is_a_URL#%E3%82%AA%E3%83%BC%E3%82%BD%E3%83%AA%E3%83%86%E3%82%A3
https://www.nic.ad.jp/ja/newsletter/No22/080.html
Meta Quest Pro,Quest2のパススルー画面を録画(キャプチャ)する方法

# はじめに
MetaQuest Proの標準録画機能ではプライバシー保護機能のため、カメラ部分が黒塗りされてしまうため、カメラ部分も正しく録画できる方法を記録します。
※手順はQuestシリーズ全て共通

本記事では`Meta Quest Developer Hub`(旧:Oculus Developer Hub)を利用する方法と`SideQuest`のScyCpy機能を利用する方法の２パターンを紹介します。
<br/>

# 手順
## 共通の事前準備
* Questを開発者モードに設定する

* ADB(Oculus ADB Drivers)をダウンロードする
 
https://developer.oculus.com/downloads/package/oculus-adb-drivers/

* パッケージを解凍後、android_winusb.infを右クリック→PCにインストールする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/b4f4076f-f81c-cdec-93c6-fc466ce2b681.png)

## Meta Quest Developer Hub(MQDH)で録画する
* MQDHをダウンロード→インストールする

https://developer.oculus.com/downloads/package/oculus-developer-hub-win
* 利用するQuestデバイスを起動させておく、またPC側はBlueToothを利用するため有効にしておく
* MQDHを起動し、DeviceManager→SetUpNewDevice→Nextを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/3c47848c-2a6d-bdaf-5f7c-9e8eb13ff654.png)
* 利用するデバイスの種類を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/bfcb73d8-0bc5-2824-a093-f84e2e0ded5f.png)
* 暫く待つとデバイスが表示されるので、利用するデバイスを選択後Nextを押下する
※スリープ状態でも検出可能ですが、これ以降の設定はスリープの解除を推奨します
* 画面に従いアカウント認証や開発者モード設定等をNextを選択して進めて設定を進める
* 設定完了後、USBケーブルとPCを接続しQuestの画面でPCへの接続を許可する
* MQDH上でデバイスが表示されているので、任意のキャプチャボタンを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/5779e04b-5b02-7eb9-7de6-5767eaf94827.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/86170e67-2aa8-d32e-fe68-3f565d8617d9.png)


## SideQuestで録画する
* ADB(Oculus ADB Drivers)をインストールする

* SideQuestをインストールする

https://sidequestvr.com/

* SideQuestを起動する
* ScrCpyウィンドウを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/40ed9116-0381-c6b0-0c53-6781a4016587.png)
6.CROP(切り出し)設定を変更する
* QuestProの場合
手動で設定を行う、以下は参考値
    * 左目のみ : `1750:1900:80:0`
* Quest2の場合
`Quest 2 CROP`を押してプリセット値を入力する 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/7bebb5e4-d076-8a63-2902-eb89d9ab9216.png)
* `START STREAM`を押してPCの画面に表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/c3792ec2-df44-8791-86a5-b00db295d9f1.png)
* 好みのキャプチャツールで撮影・録画する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1336886/10e26949-396a-e3b3-9362-ac365ebdb111.png)

こちらの動画はSideQuestでキャプチャした動画です。
丸型で撮影されますのでCROPの値を調整し、任意の箇所を切り抜いて使用することになると思います。
<iframe width="560" height="460" src="https://www.youtube.com/embed/zQCLXd1IPt0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# 関連記事
https://qiita.com/kazuki_kuriyama/items/10e5384e482fb9005a9d
UTM

# UTM(Unified Threat Management)
```色々なセキュリティ機能をひとまとめにしたファイアウォール```です。
* サーバに対する不正侵入を検知・防御するIDS／IPS機能
* ウイルス検知を行うアンチウイルス機能
* 迷惑メールチェックするアンチスパム機能
* 閲覧できるWebサイトを制御するURLフィルタリング機能
* 拠点間及びリモート接続を行うVPN機能

別々の機器でおこなっていたセキュリティ機能を一台で賄うことができる。
そのため
* 機器コストを大幅に削減できる。
* 運用管理が楽になる。

## パフォーマンスの劣化に気をつける。
たくさんの```機能を一つに詰め込んだことによる、パフォーマンスの劣化```には注意が必要。
使用した機能がどれくらいパフォーマンスに影響があるのか、しっかり見極める必要がある。
UTMの例え```どこかの機能がボトルネックになってもその機能だけをアップグレードすることができない```。
ゆとりを持ったスペックの機器の選定をしておく必要がある。

# 出典
https://www.sbcr.jp/product/4797386660/
Salesforce認定Platformアプリケーションビルダー試験の公式サンプル問題解説してみた-06

こんにちは

Salesforce認定Platformアプリケーションビルダー試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。


https://trailhead.salesforce.com/ja/content/learn/modules/platform-app-builder-pt1/platform-app-builder-security-ui


今回はTrailhead

認定 Platform アプリケーションビルダー資格の受験準備: Fundamentals and User Interface (基本事項とユーザインターフェース)
ユーザインターフェーズについて

にある練習問題６問目をご紹介します

なお今回の内容は動画でも公開しております

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

<iframe width="560" height="315" src="https://www.youtube.com/embed/JK_6rA2bhsE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


今回の内容はこちらです

![C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b3447d19-06a2-b5a8-62af-4a43560a7132.png)


正解はCです

強調表示パネルを作成すればこのような見え方になるのでモバイルでも簡単に項目アクセスが可能です
twitter apiとtkinterでツイート送信画面を作ります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2134624/bb897907-f1b7-de48-645d-dca678184184.png)

# 環境
windows11
Python 3.9.6
# はじめに
今回はtwitter apiとtkinterでツイート送信画面を作ります。twitter開発者登録のやり方やトークン類の取得の仕方は説明を省略しています。
# コード
トークン関係をまとめるkeys.pyと画面関係をまとめるgui.pyに分けてコードを書きます。
```python:keys.py
import tweepy

class Apikeys:
     CK = '' # Consumer API key
     CKS = '' # Consumer API Secret key
     AT = '' # Access token
     ATS = '' # Access token secret
     auth = tweepy.OAuthHandler(CK, CKS)
     auth.set_access_token(AT, ATS)
     api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
```
トークン関係をclassにまとめて書いてあります。取得したトークン類をコピペしましょう。
次にgui.pyを書きます。
```python:gui.py
import tweepy
import tkinter 
from keys import Apikeys

api = Apikeys.api # twitter apiを使えるようにする

def send_sentence(sentence):
    sentence = entry_1.get()
    try:
        api.update_status(sentence)
        entry_1.delete(0,tkinter.END)
        print("送信完了!")
    except tweepy.TweepError as e:
        print(e.reason) # exceptでエラーの原因を出力

root = tkinter.Tk() # インスタンスの生成
root.title('送信画面')
root.geometry('512x256')

canvas = tkinter.Canvas(root, bg="#000000", height=256, width=512) 
canvas.place(x=0, y=0)
canvas.create_image(30, 30, anchor=tkinter.NW)

entry_1 = tkinter.Entry(root)
entry_1.insert(0,"文章をかいてね")
entry_1.place(x=10,y=10,width=500,height=50)

button_1 = tkinter.Button(root, text='送信！')
button_1.place(x=10,y=60,width=100,height=20)
button_1.bind("<ButtonPress>",send_sentence)

root.mainloop()
```
# tkinterのメソッド
使っているメソッドの説明をして終わります。
### root.title() 
ウインドウのタイトルを決められます。
### root.geometry() 
ウインドウの横と縦のサイズを決められます。
### tkinter.Canvas(root, bg="", height=, width=) 
キャンバスの色や大きさを指定できます
### tkinter.button()
ボタンのテキストや大きさを決められます。
### tkinter.Entry()
送信したい文字列を入力できるボックスを作成できます。
[windows] ファイルの保存がフリーズするときはexplorer.exeを再起動しよう

- snipping toolでキャプチャを保存するとき、くるくるアイコンのままになる
- ペイントにキャプチャを貼りつけて保存するとき、くるくるのままになる
- キャプチャ以外でもファイルの保存ができない

explorer.exeを再起動すると直りました。
やり方は以下です

- タスクマネージャで、explorer.exeを終了する
- タスクマネージャのファイルタブ -> 新しいタスクを実行 -> explorerと入力してEnter

ちなみにこのとき、OSのメモリは余裕がありましたが、explorer.exeのコミットサイズが1.4GBくらいになってました(ワーキングセットは300MBくらい)
僕のPCは仮想メモリOFFってるので、ワーキングセット外部分も物理メモリにあるはずなので、スワッピング的なものではないと思うのですが..
PC長時間起動してるとあちこち調子悪くなります。explorer.exeとか、cftmon.exe(IMEのプロセス)がメモリ使ってるときは、それらを落としたり、ブラウザをすべて落としたりしてメモリを空ければ良くなったりします。
たまにそれでもなんか調子悪いときがあって、そういうときはカーネル部分で何かあるか、(会社に管理されてて停止できない)ウィルス対策ソフトとかが原因だと思うので、PC再起動しかなさそうです
git log -G ですべてのブランチ/コミットを全文検索（grep）する方法

「このコードどこでコミットしたっけ？」「これってコミットされてる？」「このコード入ってるはずなのに消されてるな、、、どこで（誰が）消したんだ？」というときにすべてのブランチ/コミットを一括で全文検索（grep）する方法です。ググってもすぐに出てこなかったのでメモ


```bash
git log -G "検索したいテキスト" --all
```

`-G`がコミットの差分の中を検索するという意味。
`--all`というのがすべてのブランチ\/コミットという意味（ちょっと違うけど）。

## 余談
`-G`じゃなくて`-S`じゃないの？？って思った方は「[行が削除されたコミットを特定するのにgit log -Sを使ってはいけない話（git log -Gを使うべき）](https://qiita.com/shoheihagiwara/items/7a30e6a4cc107615d0a2)」をどうぞ

## 参考
https://nickjanetakis.com/blog/search-all-of-your-git-history-for-code-and-commits-with-2-commands
AWS Advanced Networking - Specialty (ANS-C01)の勉強

対処すべきトラブルがあったとします。
--
オンプレのサーバとVPCをAWS Direct Connectで、プライベート仮想インターフェース経由で接続したい。設定は、上手くできたはず。。
しかし、VPC内にあるEC2インスタンスのプライベートIPアドレスに対して、Ping で疎通確認を行うと、失敗する。

確認するポイントには、どんなものがあるのでしょうか？
--
〇仮想インターフェースをアップして、BGPピアリングセッションを確立出来た。
〇オンプレのプレフィックスのルートのアドバタイズは、出来ている。
〇AWS Direct Connectの物理的な接続は、リンクが上がっていて、問題がない。
〇AWSのピアIPアドレスには、pingが出来ている。
〇アドバタイズするルートは、100以下に集約出来ている。
〇NACLとセキュリティグループは、適切に設定されている。

確認するポイントに漏れはありませんか？
--
__考えるプロセス__
Virtual Private GatewayとVPC間のルーティングに問題がある可能性がある。

__解決策__
Virtual Private GatewayをVPCにアタッチして、Route Propagationを有効化し、経路情報をルートテーブルに反映出来るようにする。


勉強のご参考に。。

以上
単体テストコードで重複したメールアドレスを通さないようにする

重複したメールアドレスについて単体テストコードでつまづいたので記録。
ファクトリーボットでインスタンスを作成したあと、
セーブメソッドで保存。
あとは記述の通り。

```ruby
 it "重複したメールアドレスは登録できない" do
          @user.save
          another_user = FactoryBot.build(:user)
          another_user.email = @user.email
          another_user.valid?
         expect(another_user.errors.full_messages).to include('Email has already been taken')
       end
```
IDSとIPS

# IDS(Intrusion Detection System,侵入検知装置)とは？
```通信のふるまい```を見てサーバーに対するDos（サービス妨害）攻撃や侵入攻撃を検知したり、防御したりする機器。
最近は、ファイアウォールやUTM（Unifed Threat Management)の中の機能の一つとして含まれている。
単体で導入することは少なくなってきた。

https://qiita.com/masatom86650860/items/9077285291493226da8f

## IDSはどうやって検知するのか？
IDSは、通信のふるまいから侵入を検知する機能です。
IDSは怪しい通信の振る舞いや攻撃パターンを```シグネチャ```という形で保持している。
指定した時刻で更新されるか手動で更新されます。
IDSはサーバに対する通信を受け取ると、シグネチャと照合し、不正通信として認識すると、管理者にアラートをあげます。
アラートを受け取った管理者は、サーバーのアクセスログを見たり、ファイアウォールのフィルタを変更したりして対応する。

## IPSで侵入を防御
IPSは、```IDSのパワーアップバージョン```でサーバーに対する不正通信を```シグネチャで検知すると、即座に遮断```します。
即座に遮断することで```管理者の手間が省ける```ことができる。
しかし最近の攻撃手法や侵入方法が巧妙になっているので、```不正通信かそうでないかを機械的に判断することが難しく```なってきました。

### とりあえずの処置
とりあえず```IDSで検知だけを行い、サーバーの状態を確認してから、IPSで止めることが多い```。
IDS/IPSは運用管理がポイント。
環境に合わせて、設定をしっかりカスタマイズすることが大事。

# 出典　
https://www.sbcr.jp/product/4797386660/
【React】フラグメント

## フラグメントとは？？
`React でよくあるパターンの 1 つに、コンポーネントが複数の要素を返すというものがあります。フラグメント (fragment) を使うことで、DOM に余分なノードを追加することなく子要素をまとめることができるようになります。`
参考：https://ja.reactjs.org/docs/fragments.html

要素を複数返すときに必要ということですね。


## 確認してみる
以下のプログラムは***Example関数内でインクリメントした変数`value`をCountPrint関数に引数として渡し、表示***します

## NG例
```javascript
const CountPrint = ({ value }) => {
  return <div>count:{value}</div>;
};

const Example = () => {
  let value = 0;
  return (
      <CountPrint value={++value} />
      <CountPrint value={++value} />
      <CountPrint value={++value} />
  );
};

export default Example;
```

このようにすると
```javascript
<CountPrint value={++value} />
<CountPrint value={++value} />
<CountPrint value={++value} />
```
でエラーが出力されます。
内容は以下の通り
```javascript
Parsing error: Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment 
<>...</>?
```
`複数の要素を返すには囲みタグでラップしてください`だそうだ

## OK例
```javascript
const CountPrint = ({ value }) => {
  return <div>count:{value}</div>;
};

const Example = () => {
  let value = 0;
  return (
    <>
      <CountPrint value={++value} />
      <CountPrint value={++value} />
      <CountPrint value={++value} />
    </>
  );
};

export default Example;
```

先ほどエラーが出ていた部分を`<></>`で囲ってあげる
```javascript
<>
    <CountPrint value={++value} />
    <CountPrint value={++value} />
    <CountPrint value={++value} />
</>
```

* 表示結果
![スクリーンショット 2022-10-26 135456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/be3c86e7-fad5-0409-8308-9744a3458f30.png)

無事表示された

## <>とdivどっちがいい？
フラグメントは`<div></div>`でも代用できるようだ
```javascript
<div>
    <CountPrint value={++value} />
    <CountPrint value={++value} />
    <CountPrint value={++value} />
</div>
```

フラグメントより`<div>`の方をつかうという方もいらっしゃるようです
参考：https://zenn.dev/januswel/articles/c80ac055b72955d71d41
nugetでパケージを追加するときはずっと検索中

vs2015でパケージを追加しようとしたとき、ずっと検索中の状態で対象パケージが表示されない。

解決策
以下ファイルを削除する。
C:\Users\AVD_wsstj_you_ke\AppData\Roaming\NuGet
・NuGet.config

参照
https://github.com/NuGet/Home/issues/3281
【UE5】ビューポート内でのカメラ操作メモ

UE5のビューポート内のカメラ移動の方法をメモする

|操作方法|操作内容|
|:--|:--|
|右クリック＋マウス操作|カメラの角度変更|
|右クリック＋W|カメラ移動(前)|
|右クリック＋A|カメラ移動(右)|
|右クリック＋S|カメラ移動(後)|
|右クリック＋D|カメラ移動(左)|
|右クリック＋Q|カメラ移動(上)|
|右クリック＋E|カメラ移動(下)|
|右クリック＋Z|カメラ画角変更(広く)|
|右クリック＋C|カメラ画角変更(狭く)|

以上。
UbuntuでC言語の環境を整える

# はじめに

UbuntuでC言語が使える環境を整える方法を記載していきます。

# C言語用コンパイラの確認

まず、C言語用のコンパイラが入っているか確認します。

'''gcc --version'''

入っていると以下のコマンドが出てきます。
![Screenshot from 2022-10-26 13-58-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949441/fefbd159-3be2-e548-0279-4578dd0254dc.png)

C言語を使うにはbuild-essentialというプログラムを実行するために必要なツールを入れます。

以下のコマンドでインストールします。

'''sudo apt install build-essential'''

これでできればC言語が使えるようになります。
Meta Quest 2でガーディアンをオフにする

2022/10/26時点での記事です。
Meta Quest 2のガーディアンをオフにする際に試した手順のメモ。
※スマホやブラウザ設定しなくても、いきなり開発者モードにできるかもしれません。


----
スマホのMetaアプリを起動し、求められる各種設定を行う。

開発者組織をとりあえず作る。
https://developer.oculus.com/manage/organizations/create

Meta Quest 2を起動し、
メニューバーの左端「クイック設定」を開く。
右上の「設定」歯車アイコンを選択し、4x4グリッドの設定メニューを表示する。
左上の「システム」を選択する。
左メニューの、下から５番目の「開発者」を選択する。
右メニューの「ガーディアン」をオフにする。

これで、どこまでも、走っていくことができます。
十分広い場所で使うか、現実と同じVR空間を作らないと、怪我しそうです。
アプリケーションセキュリティ対策

# アプリケーションセキュリティ
### セキュリティバイデザイン
ソフトウェアや情報機器などを含む```システムの企画・設計段階から、セキュリティへの方策を考慮```しておくこと。
結果的に```運用コストの削減につがなる```。特にIoT機器をシステムの一部と捉えることが重要になる。

### プライバシーバイデザイン
セキュリティバイデザインと同様な考え方になる。
企画・設計段階からプライバシーの確保を考慮しておくこと。

### WAF(Web Application Firewall)
Webアプリケーションの```脆弱性を突く攻撃から守るための機器```またはソフトウェア。
クライアント側から```Webアプリケーションに渡される入力などの通信内容を、あらかじめ設定した検出パターンに基づいて検査する```ことで、攻撃と見做されるアクセスを遮断できる。また、クライアント側のWebブラウザとWebサーバ間に設定するため、複数のWebアプリケーションをまとめて、SQLインジェクションやクロスサイトスリプティングなどから保護することが可能になる。

* WAFはWebアプリケーション内に直接実装するものではなく、Webアプリケーションの前面やネットワークに配置し、脆弱性を悪用した攻撃を検出・低減する対策です。WAFの形態によっては、複数のWebアプリケーションに対する攻撃をまとめて防御することもできます。WAFは直接管理・改修することができないWebアプリケーションに対策を施したい場合や、Webアプリケーションの脆弱性を修正することが難しい場合に有効です。あるいは修正に時間が掛かるためすぐに対策を採りたい場合にも役立ちます。
出典 https://www.jbsvc.co.jp/useful/security/what-is-waf.html

* ファイアウォールやIPS/IDSではカバーできない範囲のセキュリティ対策が行えるとされているWAFですが、どのような仕組みになっているのでしょうか。

https://qiita.com/masatom86650860/items/aa569b05fcdb5ea2a6d7

* WAFでは、```攻撃の検知に「シグネチャ」を用います```。シグネチャとは、```アクセスのパターンを記録```しているものです。Webアプリケーションへのアクセスのパターンを、```シグネチャを用いて照合し、通信可否の判断```を行う仕組みです。
シグネチャの定義の方法には、ブラックリスト型とホワイトリスト型があります。
    * ブラックリスト型
ブラックリスト型では既知の攻撃パターン、すなわち```「拒否する通信」をシグネチャに定義```しておき、シグネチャに一致する通信を拒否します。複数のWebアプリケーションに対して適用することが可能ですが、未知の攻撃には対応することができません。ブラックリスト型で最新の攻撃を検知するためには、攻撃の方法が分かり次第、シグネチャの更新が必要となります。
    * ホワイトリスト型
ホワイトリスト型は、```「許可する通信」をシグネチャに定義```し、シグネチャと一致しなかった通信についてはすべて拒否し、不正アクセスの防止を図っています。未知の攻撃を防ぎ、Webアプリケーションに応じて柔軟な対応ができるのです。一方で、「許可する通信」の定義が難しく、Webアプリケーションごとにホワイトリストを用意する必要があるため、運用が大変になる可能性があります。


### セキュアプログラミング
セキュアプログラミングの基本は、```脆弱性を作らないこと```と、```予防としての準備```をしておくこと。
具体的には、```外部入力のデータはすべて検査```する、```外部出力するデータは問題が起こらないように加工する```、```シンプルな設計にする```、```許可でなく否定ベースでアクセス```を決める、```多層防御を行い被害を限定```する、などを行う。

### 脆弱性低減技術
開発するアプリケーションは、さまざまな検査を行うことにより、機能テストでは発見の難しいバグや脆弱性を発見できる。方法としては次のようなものがある。

#### ソースコードの静的テスト
主にソースコードについて実行を伴わずに検査する方法。
```脆弱性に関わるコーディングパターンを早期に見つけ出す```ことができる。

#### プログラムの動的テスト
プログラムを実行した結果を解析する方法。
既知の脆弱性の発見は、```代表的な攻撃手法を試して特徴的な応答を観察する脆弱性診断がある。

#### ファジング(fuzzing)
通常ではあり得ない、```予想不可能なデータを投入することでバグや脆弱性を見つけ出す```検査手法。入力データのサク英は手作業のほか自動で作り出したり、データの組み合わせをテストできるファジングツールを用いる。

* ファジングとは、ソフトウェアテストの手法の一つで、ファズ（fuzz）と呼ばれる```通常想定されていない```「不正データ」「予期せぬデータ」「ランダムなデータ」を対象の製品・システムに与え```意図的に例外を発生させ、潜在的なバグ・脆弱性を検出```する手法です。
出典 https://www.veriserve.co.jp/service/detail/fuzzing.html

# 関連記事
https://qiita.com/masatom86650860/items/efceb390945efb48644e#%E9%9D%99%E7%9A%84%E8%A7%A3%E6%9E%90

# 出典 
https://gihyo.jp/book/2022/978-4-297-12375-8