OmniAICreator/Qiita-1.07M huggingface dataset:
PIPインストールでよくあるエラーと対策

PIPインストールでよくあるエラーと対策をまとめてみた。

#インターネット接続が制限されている（社内ネットワークなど）
▶ 下記のようにプロキシサーバーを通過できるようにする
※プロキシサーバーのURLが「http://proxy.会社名.co.jp」、ポート番号が 「8080」 の場合

```
C:¥Users¥username> set HTTPS_PROXY=http://proxy.会社名.co.jp:8080
C:¥Users¥username> py -m pip install ライブラリ名
```

もしくは

```
C:¥Users¥username> set HTTPS_PROXY=http://ユーザ名:パスワード@proxy.会社名.co.jp:8080
C:¥Users¥username> py -m pip install ライブラリ名
```

#ファイル書込みの権限がない
▶　管理者権限でコマンドプロンプトを起動
「コマンドプロンプト」を右クリックして「管理者として実行」
▶　「--user」オプションをつけて、pip installを実行（userディレクトリ内に生成）

```
C:¥Users¥Taro> py -m pip install openpyxl --user
```

#pipのバージョンが古い
▶pipをアップグレードする

```
C:¥Users¥Taro> py -m pip install --force-reinstall -U pip
```

または

```
C:¥Users¥Taro> py -m pip install --force-reinstall --upgrade pip
# forceは強制インストール
```

#ソースからのビルドで失敗する
▶ ビルド済みパッケージがあるバージョンを使う

```
py -3.8 -m pip install NumPy
# Python3.9(最新)の前のバージョンである3.8にインストールする
```

##参考
YouTubeで「Pythonを使った事務処理の効率化」というタイトルで紹介。
<iframe width="560" height="315" src="https://www.youtube.com/embed/qtBend9uYCI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Web3.0検証(1)-Web3.0対応ブラウザに触れてみる

## はじめに

「Web3.0」の話題がホットになっているようですので、検証してみます。

## Web3.0とは何者?何ができる?

- 次世代の分散型ウェブ
- ブロックチェーン技術を利用
- サイバー攻撃に強い

などキーワードがヒットするものの、机上ではなかなか本質を掴みづらいので、
実際検証してみることにします。

### 何を検証すればよいか
Web3.0の技術的な側面から、個人的に気になっているのは以下2点です。

- 検索エンジンはどう変わる?
- セキュリティはどのように強化される?

### どのように検証するか

普段使っているブラウザが一番とっつきやすいかもしれません。
Web3.0対応のブラウザ[Brave](!https://brave.com/ja/)を導入しイメージをつかんでみます。

https://brave.com/ja/download/

「Braveは、ページの読み込みを遅くしたりプライバシーを脅かす危険性のある広告やトラッカーをブロックします」と記されています。
Braveがセキュアで高速な理由がこれだったのですね。

### Brave の検証

#### 画面操作はChromeと変わらずでした

BraveもChrome同様[Chromium](https://ja.wikipedia.org/wiki/Chromium)をベースとしているので、使用していて特に違和感は感じませんでした。
試しに、検索エンジンの設定画面(brave://settings/search)で`アドレスバーで使用する検索エンジン`を`Brave`に指定し、日本語キーワードで検索を行ってみましたが、期待できるような結果を得られず。
検索エンジンは、しばらく`Google`を使ったほうがよさそうです。

#### プライバシーに影響するリクエストはどのようにブロックされるか

- Brave画面を開き、F12キーでデベロッパーツールを起動、`Network`タブを選択します
- Braveのアドレスバーに`https://etherscan.io`と入力します
- デベロッパーツールにStatusが`(blocked:other)`のリクエストが赤い文字で表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/0da4c0cd-17fe-7453-3162-f5a336bad0a5.png)

- ブロックされたリクエスト名をクリックし、`Headers`タブを選択します
Google Tag ManagerへのURLがBraveによりブロックされたことが確認できます(Google Analyticsがプライバシーに影響すると判定されたか)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523098/266195d9-9e5d-59d2-fabe-fd2fdf7d4654.png)

## おわりに
Web3.0を理解する入り口として、Web3.0対応のブラウザBraveを導入・操作してみました。
広告やトラッカーをブロックすることにより、セキュアで高速なブラウジングを実現することも確認できました。
次回からは、Web3.0の内部構造を理解するため、もう少しディープな検証を行う予定です。
お楽しみに。

##### [次回] [Web3.0検証(2)-分散型アプリのアーキテクチャ](https://qiita.com/mingchun_zhao/items/00ade4202335ec7288af)
凝集度と結合度を調べてみた

## プログラミングにおける凝集度と結合度の考え方があるらしい

### 凝集度

> 凝集度（ぎょうしゅうど、コヒージョン、cohesion）とは、情報工学においてモジュール内のソースコードが特定の機能を提供すべく如何に協調しているかを表す度合いである。IPAが実施する情報処理技術者試験では、強度(きょうど、ストレングス、strength)という言葉が使われる。凝集度は順序尺度の一種であり、「凝集度が高い」とか「凝集度が低い」といった言い方で使われる。凝集度の高いモジュールは、堅牢性、信頼性、再利用性、読みやすさなどの点で好ましく、凝集度の低いモジュールは保守/評価/再利用/読解が難しいため好ましくないとされる。
出典: フリー百科事典『ウィキペディア（Wikipedia）』


### 結合度

>コンピュータープログラマにとっては、既存のソフトウェア製品に対して　無い機能の追加、対応していないデータへの対応といった事柄に対応する場面がある。この際、全ての既存のソフトウェア製品の内部（より具体的にはソースコード）の各機能各データに対して、どのデータはどこで利用されまたどこで利用されていないか確実に判断できるよう整理、分割が行き届いている状態を結合度が低いと表現する。結合度は低いほど好ましい。逆に結合度が高いとは、例えば1つのデータの持ち方の変更が　部品の関連性を伝って波及し（遠く離れた、と感じる）意図しなかった箇所での不具合を招く。1つの変更に対して　広範囲かつ複数の散在した箇所の部品の動作を改造する必要が出てくることがある。
出典: フリー百科事典『ウィキペディア（Wikipedia）』


### なるほど

**凝集度は高くて結合度が低い**と余分なファイルを見に行く必要がないからメンテナンスが行いやすくなる。

### フロントだとこで考えれば良いのか
`例 :  ブログ投稿サイト
記事群のファイル(article)
 プロフィール群のファイル(profile)
 登録・ログイン群のファイル(member)
`

- 3つの群でディレクトリを分けて見るとかすると凝集度は高まりそう。
- 結合度を下げるためには、トップに近いコンポーネントは共通のコンポーネントを使いすぎないように意識する。
- TypeScriptでの型定義も群ごとに分けた方が良さそう。
- CSS記述だけのコンポーネントなら問題はなさそうで、propsで値や関数が渡ってきてるコンポーネントは結合度が高くなりすぎないように意識する。

:::note warn
DRY原則に乗っ取りすぎると結合度は高くなる。
だから、群単位で結合度と凝集度を意識しながらコードを書くことが必要。
DRYには気をつけつつも...。
:::
PowerBI: カスタムコネクター作成のメモ

# 背景
いくつかカスタムコネクターを作ってみて見えてきたことをなど、現状把握したことのまとめ


# 内容


#　公開した際の名前はどうやって付けるの？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/dd6cac23-cfe4-36d6-d0be-23bd222e9fe4.png)

- 以下のように、ButtonText に対して、設定。
    - resource.resx を利用する場合は、Extension.LoadString("") で

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/207725d6-65df-01e2-6110-c69d8748361f.png)


https://docs.microsoft.com/en-us/power-query/handlingdataaccess#publish-to-ui

# Extension.LoadString("") って何？
- resource.resx で定義した文字列を利用する為のもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/639b3645-9698-0075-7b56-c19455e99360.png)

ただ・・以下は、shared してる名称を取得してる感じだけど、不明

- Extension.LoadString("FormulaTitle")
- Extension.LoadString("FormulaHelp")

# アイコンは？
見ればわかるけど、サイズ毎に用意して以下のように定義

]![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/9249a356-ef0a-5a5f-3177-681abd2945f7.png)

サイズは、16/20/24/32, 32/40/48/64 の計 7 種類用意

:::note warn
プロジェクト作ると、80 ピクセルっぽいファイル名があるけど、不要
:::

# 起動時に入力を求める方法は？
以下に別途記載

https://qiita.com/baku2san/items/d733c80909d761d45538

# 同一プロジェクトで複数コネクター定義することは可能？
それぞれの Publish 定義をしていけば出来る。以下が例。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/3fd8db84-bdb3-0402-0dad-ba105a25ec88.png)

# 認証必要な API は？
以下参考に

https://github.com/Microsoft/DataConnectors/blob/master/docs/m-extensions.md#authentication-and-credentials

AAD を簡単に使う場合は、以下のようにして利用時に認証させることで アプリ登録なしで利用できるけど・・ Power BI Service では更新不可。更新させたい場合は、アプリ登録する必要がある（うちの会社だと社内での登録料が必要なのであまり使いたくない・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/9a0e7d7f-761d-6b26-47df-ebcbc97833cb.png)

# Power BI Service で更新する場合の注意点
## 動的 URL は使わない
Query や、RelativePath を使って、Pagination をうまく使って Web.Contents に渡す URL は固定にしておけば大丈夫

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/531def3a-d581-b6e5-0e34-2bea082d15a6.png)

https://docs.microsoft.com/ja-jp/powerquery-m/web-contents

## 認証が必要なら実装しておく
今回は、アプリ登録したくなかったので、パス

# あとがき
ん－・・アプリ登録せずに、Power BI Service で更新させたかったんだけど、やっぱり無理なのかも。誰か知ってたら教えてください。
csvファイルをpandasで読み書き（自分用）

#csvのファイルを都合の良いように作り直す
##目的
私がよく使う家計簿アプリのcsv出力後に、自分の欲しい情報だけを抽出して、新しいcsvに出力する

```python
import locale
import os
import pandas as pd
import glob
import time
df = pd.read_csv('zaim10.csv',encoding='Shift-JIS',header=0)

df = df[['カテゴリの内訳','品目','お店','支出']]
data = []
#c1,c2,c3はカテゴリごとの合計金額を出力するための変数、salesは全合計
c1=0
c2=0
c3=0
sales = 0

# print(f'df["支出"]')
# print(df['支出'])

for row in df.values:
    row[2] = row[2].replace('-','関西スーパー')
    #そのまま出力すると\u3000が出てくるのでreplaceを使って置き換える
    row[2] = row[2].replace('\u3000',' ')
    row[2] = row[2].replace('ボトルワールドＯＫ＆業務スーパー 奈良店', '業務スーパー')

    print(f'-行:{row}')
    data.append(row)
    #dataはreplace関数を使った後のリスト表示を格納する
    sales += row[3]
    if('食料品'==row[0]):
        c1+=row[3]
    if('朝ご飯' == row[0]):
        c2+=row[3]
    if('晩ご飯' == row[0]):
        c3 += row[3]
print(f'支出金額合計 :{sales}')
print(f'食料品金額合計 :{c1}')
print(f'朝ご飯金額合計 :{c2}')
print(f'晩ご飯金額合計 :{c3}')
de = pd.DataFrame(data)#pandasのdata.objectになおすため。これをしないとcsvに書き出しの作業がpandasで出来ない
encoding = locale.getpreferredencoding()

de.to_csv('test.csv',encoding=encoding,index=False,header=0)#localeをimportせずにencoding="utf_8_sig"でも行ける
#indexは行番号、index_labelは行番号の表示、headerは先頭行の開始位置。
```

##引用一覧
https://teratail.com/questions/104353

https://note.nkmk.me/python-pandas-to-csv/
Emacsでテーマのロードでハマった話も聞く？

leafに慣れてないていうか、まっさらな状況でinit.elを編集してたから。
なんだこの使いにくいクソエディタと久しぶりに思った。
手が勝手に動いてエディタが勝手に小さくなって消えてって、そりゃねーだろおいと。

## ffapが無いと何も出来ない体になっていた

まじで思考停止。
ソースファイル何処だっけって、ほけーっと呆けてしまった。
ffapを入れるとカーソル位置にあるソースファイルをディスクから探して来てくれて、これでしょ？って教えてくれるます。まるで良い犬のような心地よさ。グッボーイ！グッボーイ！

```emacs-lisp: init.el 抜粋
;; ffapで上書き
(leaf files
  :doc "file input and output commands for Emacs"
  :tag "builtin"
  :custom `((auto-save-timeout . 15)
            (auto-save-interval . 60)
            (auto-save-file-name-transforms . '((".*" ,(locate-user-emacs-file "backup/") t)))
            (backup-directory-alist . '((".*" . ,(locate-user-emacs-file "backup"))
                                        (,tramp-file-name-regexp . nil)))
            (version-control . t)
            (delete-old-versions . t)))
  ;; :bind (([(control ?x) (control ?f)] . find-file)))

;; カーソル下のファイルを頑張って開く
(leaf ffap
  :doc "find file (or url) at point"
  :tag "builtin"
  :custom (ffap-bindings . 1)
  :bind ("C-x C-f" . find-file-at-point)
  )
```

それで。init.elでロードテーマを挿入する場所で、leafのテンプレート挿入コマンドを入力します。

M-x leaf-convert-insert-template
Package name: material-theme

パッケージ名入れている途中何度かタブキーを押して補間させながら入力すると、パッケージリストにあるかないか判断出来る。
あとは、途中アスタリスクを入力してタブキー連打すると、それに一致するパッケージリストが表示される。私のEmacs環境では！

Package name: m*-theme[タブキー連打]

```emacs-lisp:これがこう！
;; (leaf material-theme
;;   :doc "A Theme based on the colors of the Google Material Design"
;;   :req "emacs-24.1"
;;   :tag "themes" "emacs>=24.1"
;;   :url "http://github.com/cpaulik/emacs-material-theme"
;;   :added "2022-02-13"
;;   :emacs>= 24.1
;;   :ensure t)

;; これを元に次のように編集する

(leaf material-theme :ensure t :config (load-theme 'material t))
```

パッケージテンプレートの入力が終わったらinit.elを実行し直すか、８行をリージョンで選択してevalしないと、パッケージを持ってきてくれないのを忘れていた。

1. M-x eval-buffer
1. M-x eval-region

全体を実行し直すコマンドと、選択したリージョンだけを実行するコマンドです。
実行されてleafがパッケージを持ってきてくれないと、ソースを読めないです。

(load-theme 'material t) このmaterialてのを見るのにffapを使ったのです。
leafの後に続く material-theme 上にカーソルを置いて C-x C-f する。
ffapさえロードされていれば、C-x C-f の代わりに M-x ffap でも行けはず。

おすすめされたソースファイルを開く
~/.emacs.d/elpa/material-theme-20210904.1226/material-theme.el

ほら、(deftheme material ってテーマ名あるでしょ。
たぶんこれを指定しないと行けないっぽい。
それ以前に、コメントに material をロードしてねって書いてあるし。

```emacs-lisp: ~/.emacs.d/elpa/material-theme-20210904.1226/material-theme.el 抜粋
;;; Commentary:

;; To use it, put the following in your Emacs configuration file:
;;
;;   (load-theme 'material t)
;;
;; Requirements: Emacs 24.

;;; Credits:

;; Thanks to Bruce Williams of the Spacegray Theme which was used as the boilerplate:
;; https://github.com/bruce/emacs-spacegray-theme

;;; Code:

(deftheme material
```

作者さん、必要なところだけ抜粋してごめんんささい。
テーマ名を入れてやれば、leafでのードテーマロ記載は完了せづ。
リージョンで１行まるまる選択して、M-x eval-region すれば、テーマの反映までテストできます。

```emacs-lisp
;;(leaf tangotango-theme :ensure t :config (load-theme 'tangotango t))
;;(leaf solarized-theme :ensure t :config (load-theme 'solarized-dark t))
;;(leaf moe-theme :ensure t :config (load-theme 'moe-dark t))
;;(leaf tango-2-theme :ensure t :config (load-theme 'tango-2 t))

(leaf atom-dark-theme :ensure t :config (load-theme 'atom-dark t))
(leaf material-theme :ensure t :config (load-theme 'material t))
```
Oracle APEX インストールメモ

# Oracle APEX　インストールメモ

#### Oracle Databaseに簡単にWEBアプリケーションを構築できるAPEXという宝が眠っています。今回、オンプレミス環境で、APEX環境構築手順を紹介します。

- 今回はPDB環境にAPEXを構築する手順を説明
- DBインストール手順,APEX,ORDSの配置は割愛（DB:19c APEX:21.1 ORDS:21.4） 
- CDB_SID：ORAPX　PDB_SID:PDB

##### ①APEXインストール確認

```
sqlplus / as sysdba
--APEXインストールされているか確認
SQL> SELECT STATUS FROM DBA_REGISTRY WHERE COMP_ID = 'APEX';
--APEXインストールされている場合、削除
SQL> @$ORACLE_HOME/apex/apxremov.sql
SQL> SELECT STATUS FROM DBA_REGISTRY WHERE COMP_ID = 'APEX';
```

##### ②PDBにAPEXをインストール

:::note info 
事前にTNSを構成し、TNSでPDBに接続できることを確認
:::

- APEX用表領域作成

```
sqlplus / as sysdba
alter pluggable database all open;
Alter session set container = pdb;
create tablespace APEX_DATA datafile 'C:\APP\ORACLE\ORADATA\ORAPX\PDB\apexdata.dbf' size 1G autoextend on;
create tablespace APEX_FILES datafile 'C:\APP\ORACLE\ORADATA\ORAPX\PDB\apexfiles.dbf'size 1G autoextend on;
```
##### ③APEXのインストール

```
apexins.sql配置されているディレクトリに移動してから
sqlplus / as sysdba
Alter session set container = pdb;
@apexins.sql APEX_DATA APEX_FILES TEMP /i/
```
- APEXユーザのアンロック

```
ALTER USER APEX_PUBLIC_USER ACCOUNT UNLOCK IDENTIFIED BY <passwd>;
```
- network構成

```
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
ace => xs$ace_type(privilege_list => xs$name_list('connect'),
principal_name => 'APEX_210100',
principal_type => xs_acl.ptype_db));
END;
/
```

- RESTful Servicesを構成

```
@apex_rest_config.sql
```

### ④ ORDS (Oracle Rest Data Services)インストール
```
@ords_installer_privileges.sql PDBADMIN
cd C:\app\apex\ords
java -jar ords.war setup advanced
```
:::note warn 
コマンド実行中に下記を入力
①設定ファイル構成場所を指定C:\app\apex\ords\21.4\ords_pdb\myConfData
②Enter number for [1] Basic [2] TNS [3] Custom URL [1]:1
　Enter the name of the database server [localhost]:実際のホスト名を指定
③管理アカウント要求されるので[sys]ユーザを入力
:::

- WARを構成
 
```
java -jar ords.war static C:\app\apex\ords\images
```

- Start ORDS standalone server

```
java -jar ords.war standalone C:\app\apex\ords\images
```

- APEX管理者アカウント作成

```
SQL> CONN /@pdb AS SYSDBA
SQL> @apxchpwd.sql
```

- ログイン

` http://hostname:port/apex/apex_admin
`

##### 参考URL
`https://ttmatters.com/install-apex-ords-oracle-database
https://mutatsu.wordpress.com/2018/01/07/pcローカル環境の再作成（その５）/
`
40 代おっさん GASを学んでみた！！

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## GASとは

Google社社が提供するプログラミング言語

### JavaScriptベースのスクリプト言語

※スクリプト言語とは台本（スクリプト）のように簡易に記述や実行ができるように作られたプログラミング言語

JavaScriptを実行するためのエンジンのことをランタイムと言う
GASではエンジンとしてRhinoランタイムが使用されてきたが2020年よりV8ランタイムがサポートされた。

### GASはGoogle社のクラウドサーバー上で動作

Excel VBAなどはPC内で動作するが、GASはクラウドサーバー上で動作する。

### GASで必要な物

・Googleアカウント
・ブラウザ
・インターネットに接続できるPC

### Google APPSとは

Googleのアプリケーション群を指す場合もあったり、Google　Workspaceを指す場合もあるので注意が必要。

### Googleで提供されているアプリケーションと連携できる

アプリケーション操作するための機能がある。
Google社のすべてのアプリではないまた拡張機能も良いされている。

## GASを学ぶ上で知っておくべき注意点

### GAS = JavaScriptでない

JavaScriptがベースであるが全く同一ではない。
ブラウザを操作するブラウザオブジェクトや、Webページを記述するHTMLを操作するDOMオブジェクトと言った機能はサポートされていない。

### 制限と割り当て

実行時間やデータサイズなどの制限と一日当たりの実行回数の割り当て（クォーター）が設けられている。

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>
Python 学習ノート #2【自動フォルダ作成】

#1.きっかけ

昨日作成した自動ファイル名変換プログラムで図に命名することができた。
さらに、それぞれの模擬試験をフォルダに連番で分けていきたい。

なので、連番のフォルダを自動で作成するプログラムを作成しようと考えた。

#2.作成

では、さっそく自動フォルダ作成機能をさっと作っておこうと思います。

##2-1.フォルダ数選択

まずは作成する量を入力値から読み込みます。　

```Auto_Make_Folder.py
#フォルダ数選択
print("いくつのフォルダを作成しますか==>",end="")
folder_maker=int(input())
print("{}件のフォルダが作成されます。".format(folder_maker))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/246d8089-3b1e-d679-4157-1a3a1afa98d2.png)

これで作成する量をユーザー入力から任意で設定することができました。

##2-2.フォルダ作成

次に、フォルダを実際に作成していきます。
ファイルの命名規則を作成する際に使用したformatを用いて零埋めで連番のフォルダを作成していきます。
フォルダの作成は、OSのmkdirを使用しました。

mkdirと聞くと、Linuxのコマンドに似ていると思ってしまいます。
昔の知識が今につながると嬉しくなります。

```Auto_Make_Folder.py
import os

#フォルダ数選択
print("いくつのフォルダを作成しますか==>",end="")
folder_maker=int(input())
print("{}件のフォルダが、以下のように作成されます。".format(folder_maker))
[print('./{:03}'.format(i+1)) for i in range(folder_maker)]

#フォルダ作成
for i in range(folder_maker):
    os.mkdir('./{:03}'.format(i+1))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2502107/e011e0cb-8343-3f42-e824-e14c0ec714bf.png)

#3.実行結果

完成したプログラムを実際に動かした動画を撮影してみました。
自身の業務効率化にまた一歩貢献出来ました。

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

さらに作成したプログラムに文字式などを用いて生成するフォルダをカスタマイズしてみました。
<iframe width="926" height="579" src="https://www.youtube.com/embed/uHIf0744fKg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
線形多様体について

※本記事は私自身が学習したことを備忘録として残しておくためのモノです。

#背景
最適化理論について学習を始めました。
勉強内容をアウトプットする場が欲しかったので、一度に学んだ内容をこのような記事として残すことにしています。記載内容はあくまで自己理解内容です。

#線形多様体
本記事のテーマは線形多様体です。
系とその証明スケッチをまとめておきます。

##線形多様体の定義
ベクトル空間$\mathbb R^n$の部分集合$V$が部分集合$M$とベクトル$\boldsymbol x$によって
$V=\boldsymbol x+M$と表されるとき、$V$を線形多様体と呼ぶ。

## 線形多様体の性質
**系. 線形多様体$V$について、以下が成立する。**
**$M$を部分空間とする。$V=\boldsymbol x_0 + M$のとき、任意の$\boldsymbol x \in V$に対して、$V=\boldsymbol x + M$が成立する。**

自明と思えるかもしれませんが、証明のスケッチは下記の通りです。

**証明スケッチ**
$V$の任意の元を$\boldsymbol v = \boldsymbol x_0 + \boldsymbol m_1$とおく$\(\boldsymbol m_1 \in M\)$。
一方で、仮定より$\boldsymbol x \in V$であるから、$\boldsymbol m_2\in M$を用いて、$\boldsymbol x = \boldsymbol x_0 + \boldsymbol m_2$と表される。
従って、$\boldsymbol v=\boldsymbol x_0 + \boldsymbol m_1 = \boldsymbol x - \boldsymbol m_2 + \boldsymbol m_1$が成立する。
ここで、$M$は部分空間であるから、$- \boldsymbol m_2 + \boldsymbol m_1 \in M$である。
よって、$V$の任意の元$\boldsymbol v$を$\boldsymbol x \in V$と$M$の元で表せることが示せ、系の証明が完了する。□
Java 初心者でもわかる関数型インタフェイス(Consumer編）

#はじめに
Javaではあらかじめいくつかの関数型インターフェイスが用意されてますが、皆さんはいくつご存知でしょうか。今回は代表的な関数型インターフェースのConsumerインターフェースについて解説していきます。
#Consumerインターフェイスとは？
英語を勉強したことがある人なら「Consumer」という単語は何度か聞いたことあると思います。
日本語に訳すと「消費者」という意味になります。
__名前の通り、Consumerインタフェイスは引数を受け取ってその引数を使った処理を実行するメソッドを定めます。__

その定められたメソッドが__accept()__です。

:::note info
関数型インターフェイスとはメソッドを一つしか持たないインタフェースのことを言います。
:::

##いつ使うの？
引数を受け取ってその引数を使った処理を実行する時に使います。
具体的には引数で受け取ったものをコンソールに出力することやインスタンスの初期化に必要な値を受け取ったりします。

##どうやって使うの？
関数型インターフェイスはラムダ式でよく利用します。
ラムダ式がまだわからないっていう方は下記の記事を参考にしてください。
https://qiita.com/110shun/items/07f96b571532c18d97c0
下記のサンプルコードはConsumer型変数引数コンソールへ出力するラムダ式を代入します。

```main.java
import java.util.function.Consumer;

public class Main {
	public static void main(String[] args) {
		//Consumer型変数引数コンソールへ出力するラムダ式を代入します。
      Consumer<String> consumer = (x)-> System.out.println(x);
      consumer.accept("最後まで読んで頂きありがとうございます。");
	}
}
```
```
結果
最後まで読んで頂きありがとうございます。
```

#まとめ
・Consumerインタフェイスは引数を受け取ってその引数を使った処理を実行するメソッドを定めます
・acceptメソッドを持っています。

##参考文献
・[Java 関数型インターフェースのサンプル(Supplier)](https://itsakura.com/java-supplier)
Windows端末でBlazorアプリを作ってiPhoneにデプロイするためには(macbookが別途必要) - その１

## Windows機でiPhone向けアプリを開発をしたい！
皆さんこんにちは。
僕は、とにかく開発については、操作性などから、Windows愛用者。

で、iPhone向けのモバイルデスクトップアプリを作ろうと思ったときに、
選択肢はいろいろあるのですが、
とにもかくにも「Experimental Mobile Blazor」で、Blazorアプリにしたくなり。

Webじゃなくて、モバイルネイティブなアプリです（のつもりですｗ）

で、そんなときに、Macbookも持っているのですが、
現時点(2022/02）では、VisualStudio2022がMacbookに対応していなかったりなどなど。

いろいろあって、やっぱりWindowsで開発したいよね～と。

そんなときの手順の覚書です。


## MacBook側の設定
3. Visual Studio for Macをインストール  (Xcodeより先に入っていると、Win機側のVSからペアリングすると、見つからないといわれる。。)
　※何がダメだったって、Win機からペアリングしようとすると、XCodeが見つかんねーよって言われました。  
　　確実な方法は、Visual Studio for Macを入れることってあったので、入れちゃいます。 
1. Xcodeを入れる
    1. AppStoreからXCodeを入れるだけです。ちなみにインストール完了までに、M1Pro16GBのスペックで1Hくらいかかりましたｗ
2. XCodeでアカウントの設定
    1. 個人用のアカウントでXCodeでアカウントの設定を行います。
        1. [Xcode] > [Prereference] > [Accounts] > Apple IDを自分のもので設定してチームを作成
        2. アプリの設定を開いて、Bundle Identifierに任意の文字列を指定
3. VisualStudioからペアリングできるようにする
    3. [設定] > [システム環境設定] > [共有]で、[リモートログイン]をONにする   

## Windows側の設定(こっちでVisualStudio2022を動かす)
1. 下記あたりを参考に、Mobile Blazorアプリを作成する

    https://docs.microsoft.com/en-us/mobile-blazor-bindings/walkthroughs/build-first-app
2. iOSコントロールパネル（ツールバーにある）にて、Macとペアリングをクリック
2. 表示されたMacに接続
2. 不足しているコンポーネントのインストールを求められるのでインストール
    ※この時、xamarin.iosがサイズが大きいので、インストールエラーになる場合あり。その場合は、以下からMac側に直接DLしてインストール。  
https://aka.ms/xvs/pkg/macios/15.4.0.0  
※実際は、インストールエラーになったダイアログを見てバージョンを確認のこと。（変わるかもしれないので）

おっと、ここらで時間が来てしまいました。。
この続きはまた今度。
2日目での実施内容について

## ２日目：htmlで画面作成(アカウント登録画面、検索画面)

### 前提条件
* html、cssの書き方がなんとなくわかること
* Githubにこれまで作成したツールなどがリポジトリに登録できていること。

### アカウント登録画面
#### STEP❶アカウント登録に必要な情報を考えていく。

* ユーザーID(user_id)
* 名前(username)
* メールアドレス(mailaddress)
* パスワード(password)

#### STEP❷ユーザーテーブルとそれにひもづく第二のユーザーテーブルをイメージしておく。

パスワードに関してはそのままデータベースに登録することはできない(危険な)ため、ハッシュ値としてパスワードを暗号化することで一意の値としてデータベースに保存することとした。
またセキュリティの観点からユーザーに関するテーブルは２つ作成する。

> 作成テーブル名
user_table(ユーザーテーブル)
auth_info_table(ユーザー認証テーブル)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542047/868e0100-4230-12cb-a67d-5ef3e092fa8b.png)


### 検索画面
#### STEP❶検索する際に必要な情報を考えていく。
今回はアカウント情報を検索するため
* ユーザーID
* 名前
* メールアドレス

### アカウント登録画面と検索画面の設計

#### STEP❶登録するデータと作成するテーブルのイメージができたので画面を設計する。(イメージなのでこの通りでなくても大丈夫です。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542047/07158215-98a0-03d7-3735-57de6f2475c4.png)
VirtualBoxでCentOS7.9が起動しなかった

Kuberetesのローカル環境を構築しようと思い、VirtualBox上にLinux(CentOS)の仮想OSを構築しようとした際にハマったメモ
多分、原因があまりにも基本的過ぎて検索してもヒットしなかったが、自分と同じ所でハマってしまう人を救済するため、そしてポップアップちゃんへの謝罪のために。

## 事象

CentOSのisoイメージをダウンロードして、仮想OS上にインストールしようとしたが、
OS起動中にエラーになってしまい、インストール画面までなかなかたどり着けない。
エラーにもいくつかパターンがあって、

### パターン①
![error_5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47734/7dd83f4d-c751-8f46-cb5e-78b2c660ae05.jpeg)
"Pane is dead"というメッセージが出て先に進まなくなる。

### パターン②

![error2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47734/ee8a66d6-da9a-9746-5c36-8197a9651a16.jpeg)

```
dracut-initqueue[xxx]: Warning: dracut-initqueue timeout - starting  timeout scripts
```
という文言が何度か表示されてからの、、、

![error1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47734/3c08253b-7fee-83be-52eb-57fb1d2fad09.jpeg)

```
Generating "/run/initramfs/rdsosreport.txt"

Entering mergency mode. Exit the shell to continue.
Type "journalctl" to view system logs.
You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot
after mounting them and attach it to a bug report
```
というメッセージが出て先に進まなくなる。

### パターン③
奇跡的に、GUIのインストール画面へ進むことができた。
いくつか設定して、いざインストール！となってからの、、、

![error_4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47734/4f44d5ed-dcf5-5342-426d-02b71a379b92.jpeg)

"An unknown error has occurred"のエラーメッセージが出て終了。


調べてみても、「VMware」のパターンばかりがヒットし、VirtualBoxの事例になかなかたどり着けず。
見つけたフォーラムのコメントでは、チェックサムが合っているか確認せよ、とのことだったが
ダウンロード時点でチェックサムが合致することは確認済み。

## 原因
VirtualBoxのソフトウェアバージョンが原因だった模様。。。

バージョン6.1.14を使い続けていたが、
6.1.32にアップデートしたところ、インストール完了まで進むことができた。

![error_7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47734/a654567c-c3b1-6a05-fa27-8b7f6dabc91c.jpeg)

![error_6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47734/b2413bb3-937f-0ef9-8e6f-5bfca7dc1dc4.jpeg)

一応、何度か繰り返し試してみたが、上記①～③の再現は無し。

## まとめ

起動するたびに「バージョンアップでたよ！」というポップアップが出ているのを、
「はいはい、今度やりますよ」と言いながらそっ閉じしていたツケがここで回ってきたようです。
今度からはポップアップちゃんの言うことは、ちゃんと聞いてあげようと思います。
yt-dlpのMacでの使い方

今まで使っていた「youtube-dl」のダウンロード速度が遅くなっていたので上位互換とも言われている「yt-dlp」に移行しました。これは備考録的な何かです。

筆者のMacの環境
・MacOS Monterey 12.1
・ターミナルはzshシェル
・ffmpegをすでに入れています。もし記載してある通りに実行しても同じようにできない場合は`brew install ffmpeg`をコマンドプロンプトに打てばダウンロードできるのでやってください。

まずは「YouTube-dl」を消して行きます。Homebrewを使って入れたのでbrewコマンドを使います。
コマンドプロンプトに↓を入力

```
brew uninstall youtube-dl
```

これで消えます。念のためにこちらも打っておきます

```
sudo find / -name youtube-dl
```

何も出てこなければyoutube-dlの削除が終わったので早速「yt-dlp」を入れて行きます。こちらもHomebrewを使い入れるのでHomebrewを持ってない人は事前に入れておいてください。
コマンドプロンプトに↓を入力

```
brew install yt-dlp/taps/yt-dlp
```

でインストール完了です。`ニコニコ`や`YouTube`でも使えるので早速試してみます。まずはニコニコで動画サイズの確認から

```
yt-dlp  -F https://www.nicovideo.jp/watch/sm適切な文字列
```
720pまで動画サイズがあった動画なのに360pまでしかダウンロードができないです。ニコニコには使えそうではないですね。
![スクリーンショット 2022-02-13 18.48.27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1709437/8b31a34b-9436-2c5c-84f3-6a1998d8a979.jpeg)

それでもダウンロードしたい場合は`yt-dlp https://www.nicovideo.jp/watch/sm適切な文字列`でやってみてください。


それではYouTubeもやってみます。youtubeは少し特殊です。Windowsだと必要ないのですがMac(zsh)の場合はYouTubeのURLを`"`の中に入れる必要があるので`"`は忘れないでください。

```
yt-dlp -F "YouTubeのURL"
```
![スクリーンショット 2022-02-13 19.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1709437/8666097c-864a-8947-7b2c-a1a1bd8f20d1.png)

最高で1440pまでダウンロードができますね。1080pをmp4でダウンロードするためのコマンドを書いておきます。好きに使ってください。
```
yt-dlp -f 'bv[height=1080][ext=mp4]+ba[ext=m4a]' --merge-output-format mp4 YouTubeのURL
```
hightの数字を変えたら他のサイズでもダウンロードができます。先ほど確認したように`-F`を使用して出てきたサイズじゃないとダウンロードできないです。そこは理解しておきましょう。




##参考サイト一覧##

https://github.com/yt-dlp/yt-dlp

https://www.reddit.com/r/youtubedl/comments/pjh3n0/unable_to_use_ytdlp_on_mac/

https://write.corbpie.com/downloading-youtube-videos-and-playlists-with-yt-dlp/

https://stackoverflow.com/questions/38884374/how-to-completely-remove-youtube-dl-from-mac
gitlabのコンテナレジストリ

##概要

Docker Hubでコンテナイメージを登録できますが、githubでもコンテナレジストリを使うことでコンテナイメージを登録することが出来るようなので、gitlabのコンテナレジストリの有効化とコンテナイメージの登録をしてみます。

##環境

■gitlabサーバ
　OS:CentOS7
　IPアドレス:192.168.11.211
■gitlab
　ユーザ名:root
　プロジェクト名:ansible

##設定方法

gitlabのコンテナレジストリを有効化するためには、/etc/gitlab/gitlab.rb内のregistry_external_urlを変更します。
コンテナレジストリ用のポートはgitlabのexternal_urlで使用しているポート(デフォルト80 or 443)以外にします。

```/etc/gitlab/gitlab.rb
#コメントアウトを外し、gitlabのドメインを登録する
#registry_external_url '<gitlabのドメイン名orアドレス>:<ポート番号>'
registry_external_url 'http://192.168.11.211:5050'
```
以下のコマンドでgitlabを再構成します。

```
gitlab-ctl reconfigure
```

gitlabにログインし、目的のプロジェクトのトップ画面を開きます。
左メニューより[パッケージとレジストリ]-[コンテナレジストリ]をクリックします。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226209/0cae6f44-4631-38f2-3b01-ffd3d13fa8e3.png)

以下の画面が表示されます。
![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226209/aebd03e8-70b0-1ce8-4805-8b60b97fa0c0.png)


コンテナイメージを登録するために、まずレジストリを登録しますが、
今回httpを利用しているため、登録時エラーが発生します。
dockerのサービスファイルにinsecure-registryをオプションに加えます。

```/usr/lib/systemd/system/docker.service
#ExecStartに「--insecure-registry <gitlabのドメインまたはアドレス>:<ポート番号>」を付け加える
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.11.211:5050
```
サービスファイルを修正後、ファイルを読込み、サービスを再起動します。

```bash
systemctl daemon-reload
systemctl restart docker.service
```

コンテナイメージを登録するには、dockerコマンドでレジストリ及びイメージの登録をします。
※登録前にdockerfileを作成します。

```dockerコマンド
docker login http://192.168.11.211:5050
docker build -t 192.168.11.211:5050/root/ansible /root/work/
docker push 192.168.11.211:5050/root/ansible
```

コンテナイメージが登録されていると、画面のように表示されます。

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226209/e95c40c7-5851-5629-37a2-5d340fb33cc7.png)
vue vite azure static web app 静的サイト github actionsで自動デプロイ monorepo

備忘録的に
ハマったところ

Monorepositoryで作成していたためディレクトリの設定で躓く

GitHub Actions内で

```workflow.yml
---
        with:
          azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_BLACK_FIELD_03150D510 }}
          repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments)
          action: "upload"
          ###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
          # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
          app_location: "/client/project-files" # App source code path
          api_location: "" # Api source code path - optional
          output_location: "docs" # Built app content directory - optional
          ###### End of Repository/Build Configurations ######
---
```

また、vueプロジェクト内で(vite）でビルド後のフォルダの設定

```vite.config.ts
export default defineConfig({
  base:'./',
  build: {
    outDir: 'docs',
 },
```

どちらもを合わせる必要がある。

それまでは、こういうエラーが出ていた。
The app build failed to produce artifact folder: '../docs/'. Please ensure this property is configured correctly in your workflow file.
[OutSystems]Data Actionは何に使うのか

Reactive Web/Mobile Appには、画面からデータを取得する方法として、

1. Aggregate
1. Data Action
1. Server/Service Action

という方法がある。
Aggregateがあるのに、なぜData Actionを使う必要があるのか、という疑問を持つ人もいるようなので、解説してみる。

ちなみに、Data Actionというのは、Screenのすぐ下に作成する、これのこと
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/930cbf19-3a11-e66d-dbf2-8fe1f3a1712f.png)


# 結論から言うと
「DataBaseから取得するだけでは終わらないサーバー処理」をするのがData Actionの役割。
「(Client Actionから）Server/Service Actionを実行する」方法でも代用可能だが、Data Actionにすると、画面表示時に自動で取得開始してくれるので、使い分けをする。

## 画面のイベントでServer Actionを呼ぶことの問題点
画面のイベントというのは、On InitializeやOn Readyのように、画面のライフサイクルで自動発生するイベントのこと。その中でも、On InitializeやOn Readyは画面の初期処理としてサーバーからデータを取得するのに都合が良いものに見える。

しかし、On InitializeやOn Readyが終わらないと画面の描画が始まらないため、サーバーにアクセスするような処理時間のかかる処理を行うのは非推奨となっている（その間、ユーザーを待たせてしまうため）。
[パフォーマンスの提案に関する警告](https://success.outsystems.com/ja-jp/Documentation/11/Reference/Errors_and_Warnings/Warnings/Performance_Suggestion_Warning)の「'&lt;OnInitialize action | OnReady action&gt;' contains accesses to the local」で始まる項を参照。

この代替としてはData Actionが適している。Data ActionのOutput Parameterか、それをOn After Fetchで後処理を行ってLocal Variableに格納したものを利用するようにWidgetのプロパティを設定しておくとよい。

# 利用例
## 外部サービスの値を取得する
RESTやSOAPなど、外部のデータソースからサービス経由でデータを取得したい場合。
Aggregateでは取得できず、Data Actionを使うことがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/6cd7781c-4321-40eb-82c1-404a63962305.png)

## DBで取得した結果を後処理する
Aggregateで取得した結果によって、処理を分岐して別のAggregateを取得したり複雑な計算をサーバー側でするような場合。
例：顧客の情報を外部ソースから取得するとして。顧客をまずAggregateで取得、更にその規模によって大企業はCRM、それ以外はSaaSのサービスに問い合わせないといけない場合など。

### On After Fetchという方法もある
単にDBから取得した値に後処理したいのなら、AggregateのOn After Fetchのイベントハンドラで処理する手もある。クライアントで解決するならこっちの方法もあり。

ただし、後処理がサーバーでないと行えない（外部サービスを呼ぶ、Server Actionで作られた部品を使うなど）場合はData Actionにしたほうが通信回数が減ってよい。

## サイトプロパティを取得する
クライアント側ではSite Propertyを直接操作できないので、Data ActionのOutput Parameterに編集するしておいて、画面側で利用できるようにする。
「信頼されていないデベロッパ」のダイアログが出て自作アプリが起動できない！

## XCodeで作成したアプリを自分のiPhoneで「信頼されてないよ」と出た時の対応。

### 環境
* iOS 15.2.1

### 手順
1. [設定」を開く
2. [一般]を開く
3. [VPNとデバイス管理]を開く
4. [デベロッパAPP]をクリック
5. 信頼したいアカウントを選択して信頼するをクリック

##### 以上で完了です。
##### iOS更新のたびに、こういった設定周りの場所が、ネットで出ている情報と変わってしまうので、備忘録でした。
Ubuntu Server 20.04.3 LTS 構築#14 セキュリティ設定7-1(マルウェア対策)

実施日:2022/02/13

<<今回の内容>>
マルウェア対策としてmaldectを導入します。


調べてみると、公式サイトからwgetコマンドかcurlコマンドを使用してダウンロードする必要がある。

```
cd /tmp/ && wget http：//www.rfxn.com/downloads/maldetect-current.tar.gz
ダウンロードコマンドと併せてcdコマンドで任意のディレクトリに移動してから、ダウンロードします

```

ダウンロードファイルはgzがファイル名の最後についているため、tarコマンドで解凍します。

```
tara xfz maldetect-current.tar.gz
```


:::note warn
エラーメッセージが表示されました。
tar:ERROR is not recoverable exting now
tarアーカイブではないという意味のようです。

fileコマンドで該当ファイルを確認してみます。
file maldetect-current.tar.gz
HTML Document,ASCII text with no line terminators
HTMLドキュメントのようです。
:::
:::note
解決方法
上記のようにダウンロードサイトからダウンロードしたにも関わらず、正しくダウンロード出来ていないものは
コマンドの記述に誤りがあったり、ダウンロードの失敗で起きているようですので、再ダウンロードします。
再ダウンロードして、解凍出来ました。
:::

```
lsコマンドで/tmp/ディレクトリの中を確認します。

/tmp$ ls
maldetect-current.tar.gz
maldetect-1.6.4
#maldetect-1.6.4が解凍後のファイルになります。

このままインストールまで作業を進めます。
cd maldetect-1.6.4 && ./install.sh
./insall.shの前にsudoを入れていないで実行したため、～のファイルやディレクトリはありませんと
ズラズラと表示されましたので、やり直しです。
sudo ./install.sh
参考にさせて頂いたサイト様と同様にインストールが完了しました。
```

インストールが完了しましたので、設定をします。

```
その前に設定ファイルのバックアップを取っておきます。
cp /usr/local/maldetect/conf.maldet /usr/local/maldetect/conf.maldet-default

取得したバックアップファイルを別のディレクトリに移します。
sudo mv /usr/local/maldetect/conf.maldet-default /tmp/default-file/

設定ファイルの編集
sudo nano /usr/local/maldetect/conf.maldet

編集項目
email_alert="0"を"1"に変更
email_address="you@domain.com"を"ユーザー名@localhost"に変更
scan_user_access="0"を"1"に変更
quarantine_hits="0"を"1"に変更
quarantine_suspend_user="0"を"1"に変更
```

設定を編集しましたので、次は更新をしてみます。

```
更新の前にログインしているユーザーの正しいパスを作成します。
sudo /usr/local/sbin/maldet --mkpubpaths

更新をします。
maldet -u

最新バージョンがあるか確認します。
maldet -d

最新バージョンであることが表示されていました。
```

実際にmaldetが機能しているか確認します。

```
clamavでお世話になったeicarから確認用で頂いてきます。
wget http://www.eicar.org/download/eicar_com.zip

スキャンします。
maldet -a /tmp
マルウェアとしてヒットしたのが9件ありました。
誤検知の可能性があるため、ヒットしたファイルの確認が必要です。
```

本日はここまで。
strip,chomp,chopメソッド

## stripメソッド
stripメソッドに関しては、以前記事を書いたので[こちら](https://qiita.com/wangqijiangjun/items/2c3d9f61afed9d7ecddf)を参照してください

簡単にいうとstripメソッドは、文字列の先頭と末尾の空白や改行をすべて消してくれるメソッドでしたね。

## chompメソッド
このメソッドは、末尾の改行コードを削除するメソッドです。
以下のような結果が返ってきます。
```
a = "RubyOnRails \r\n"
a.chomp
=> "RubyOnRails "
```
このように、改行コードが削除されます
## chopメソッド
chopメソッドは文字列の末尾の1文字を削除します。
chompメソッドの違いは、末尾の1文字に改行コードがあるかないかに関わらず、末尾の1文字を削除します。
文字列の終端が "\r\n" であればその 2 文字を取り除きます。
```
a = "RubyOnRails \r\n"
a.chomp
a = "RubyOnRails"
a.chop
=> "RubyOnRail"
```

## 実際に問題を解いてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/840a113d-5806-c1ab-8d83-17a22c8d5f9a.png)
stripメソッドは先ほども述べたように、文字列の先頭と末尾の空白や改行をすべて消してくれるメソッドなので選択肢➂が正解ですね

以上です。何か間違いがございましたら、ご教示いただけますと幸いです。
vue3 element plus modal 親から子のmodalを開く

```ko.vue

<el-button type="text" @click="tuuhouVisible = true">modal 開く</el-button>
<el-dialog
    title="モーダル"
    v-model="tuuhouVisible"
    width="90%"
    :show-close=true
    :close-on-click-modal=false
>

    <div>

        {{model}}<br>
        {{foreign_key}}<br>
        {{user_id}}<br>

    </div>

    <span slot="footer" class="dialog-footer">
                    <el-button @click="tuuhouVisible = false">キャンセル</el-button>
                    <el-button type="primary" @click="tuuhouVisible = false">送信</el-button>
                </span>
</el-dialog>


//略
<script>
    export default {

        props: [
            'model',
            'foreign_key',
            'user_id',
        ],//設定することで親から値を渡すことができる

        data(){
            return {
                tuuhouVisible:false
            }
        },



```

```oya.vue

<TuuhouComponent model="User"
                 :foreign_key="this.$route.params.id"
                 :user_id="this.$root.user.id"></TuuhouComponent>


```

こんな感じ。
ko.vueを

```

v-model="tuuhouVisible"

```

という感じで指定するのが味噌みたい。
Visual Studioでファイルの相対参照をする

# Visual Studioでファイルの相対参照をしたい
Visual Studioを使っていて、ファイルの場所を指定するのに、.exeファイルが生成されるディレクトリからの相対参照をする必要がある。
しかし、普段から使っていたら.exeがどこの階層にできるのか覚えていられるが、しばらく時間が空くと、どこにできるのか忘れてしまう。
そこで、参照するリソースのフォルダを移動させることによって、つねにカレントディレクトリからの相対参照できるようにしてみた。

## やり方
以下のようなファイル攻勢になっているとする。なお、Visual Studioにおけるプロジェクト名はMyProjectとする。
また、x64 デバッグである。

```bash:source/repos/MyProjct
|-.vs/
|- Debug/
|- MyProject/ 
|- x64
|- MyProject.sln
```
```bash:source/repos/MyProjct/Myprojct
|- Debug
|- include
|- resources  -|  <- これを参照したい
|- main.cpp    |-test.txt
|- x64
|- MyProject.vcxproj
|- MyProject.vcxproj.filters
|- MyProject.vcxproj.user
```

```text:test.txt
hello
```

プロジェクト->プロパティとクリックして、
構成->すべての構成
プラットフォーム->すべてのプラットフォーム
として、
ビルドイベント->ビルド後のイベント
をクリックする。

そこで、コマンドラインに以下を追加。

```bash
copy "$(SolutionDir)MyProject\resources" "$(OutDir)"  
```
これで、.exeファイルが出力される階層と同じ階層にresourcesフォルダがコピーされる。
あとは、読み込むだけ。

```cpp:main.cpp
#include <iostream>
#include <fstream>

int main(int argc, char** argv)
{
	std::string filePath = ".\\resources\\test.txt";
	
	std::ifstream ifs;
	ifs.open(filePath, std::ios::in);
	while (!ifs.eof()) {
		std::string text_buff;
		std::getline(ifs, text_buff);
		std::cout << text_buff;
	}

	return 0;
}
```
出力結果

```bash
hello
```

## まとめ
Visual Studioでビルド後に、参照したいフォルダをコピーして.exeと同じ階層に置いてやることで、いつでも相対参照でアクセスできるようになる。
Javaのラムダ式についてまとめてみる

Javaシルバーの合格を目指して、ラムダ式についてまとめてみました。

もし指摘やアドバイスなどありましたら書いていただけると本当に嬉しく思います。

#ラムダ式とは

まず最初に、ラムダ式のメリットについて書いていきたいと思います。
ラムダ式のメリットとしては、
「抽象メソッドの処理を完結に書くことができる」
というのがメリットとしてあります。

今から、そんな便利なラムダ式の書き方を紹介します

#ラムダ式の書き方

まず最初にラムダ式の構文を紹介します。ラムダ式の構文は

```
インターフェース名 変数名 = (引数名) -> { 処理内容 };
```

そして、ラムダ式を書く時に知っておいたほうがいいと思うので知っておいたほうがいいですが、引数名の型を書く必要はありません。
ラムダ式の場合は、引数の型をラムダ式の中に書き込まなくてもJava側できちんと型を推論してくれるので書かなくても大丈夫です。

ラムダ式で実装できるのは、関数型インターフェイスのメソッドです。関数型インターフェースというのは、そのインターフェースの中に入っているメソッドが抽象メソッドかつ一つしかメソッドが入っていない状態です。
関数型インターフェースの中に入っている抽象メソッドは処理が決まっていないので、その中に入れる処理を呼び出した先で決める必要があります。それをラムダ式を使わないで実装するとめっちゃめんどくさいです。いやこれ本当にまじで。

抽象メソッドに対する処理をラムダ式で書こうとすると、
試しに以下のインターフェースInterfaceTestの抽象メソッドのmethodに対して処理を書いてみようと思います。

```main.java
interface InterfaceTest{
	public String method(String name);
}
```

以下が、そのインターフェースを呼び出して使う部分
```main.java
InterfaceTest h = new InterfaceTest(){
	public String method(String name){
		return "Hello" + name;
	}
};
```

こんなふうに、InterfaceTestのオブジェクトを作成して、そのメソッドの中の関数methodに対してなんの処理を入れるのかっていうのを書いていきます。
めんどくさいですよね。それにこんな書き方していたら一回目は大丈夫かもしれませんが、何回かやったら絶対ミスってコンパイルエラー起こすと思います(特に僕みたいに注意力のない人間がやると)
なので、こんな書き方をしないでラムダ式を使って一回で済ませたほうがいいです。

先程の呼び出して使う部分をラムダ式で書くと

```main.java
InterfaceTest h = name -> { return "Hello" + name; };
```

また、短文であればreturn文を省略して以下のように書く事ができます。

```main.java
InterfaceTest h = name -> { "Hello" + name; };
```

更に省略して短文であれば{}も省略できます。

```main.java
InterfaceTest h = name -> "Hello" + name; ;
```

ちなみに、ラムダ式で処理内容が短文のときは中括弧{}を省略できるのですが、この時にreturunを省略するとコンパイルエラーになりますので注意してください。

このようにラムダ式を使うことで

```
・書く文字数が少なくなるのでタイポが減る(これ大事です。長時間作業で疲れてるときとか特に)
・ソースコードが冗長化しないので可読性が上がる
```
というの効果があります。


## おまけ：読んでくれた方に聞きたいこと(ここちょっと気になってます)

ラムダ式を書く時に引数の欄に抽象メソッドの型を書き込みますか。
初心者なりに考えてみたのですが、引数の部分に僕は型を書かないほうがいいのではないかと思っています。
理由としては、抽象クラスの型をいちいち書いていると、コピペをしていたとしてもコピペする箇所をミスったり、スペルミスに気づかないという事が起きてエラーになることが起きうるので、書かないほうがいいんじゃないかなと思いました。
もしよろしければ皆さんの意見をコメントで教えていただければと思います!
場合によるよってなったら皆さんの好みを聞いてみたいです!!

# 参考サイト

https://www.internetacademy.jp/it/programming/java/introduction-of-java-new-function-lambda-formula.html#:~:text=%E3%83%A9%E3%83%A0%E3%83%80%E5%BC%8F%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%81%AF,%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82
STM32G031のI2Cでマスターから送られた来たデータを受信する。(STM32G031J6M6)(Arduino)


目的　
とりま、I2Cのデータを受信してみた　テスト

いろいろ
回路図を書いていた。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8f376406-b97a-a37d-f036-99649cbd415a.png)



```c++


//i2c_s_LCD_031_b1_1
//9600bps

#include <Arduino.h>
#include <Wire.h> //I2Cのヘッダー

//文字列の表示 nana_seg
int ns_printf(char *str1)
{

  //文字の中身がゼロか
  while (*str1) {

    digitalWrite(PB7, LOW);//Start
    delayMicroseconds(102);

    for (int ii = 0; ii < 8; ii++) { //Data x 8
      digitalWrite(PB7, ( (*str1) >> ii) & 1  );
      delayMicroseconds(102);
    }//for

    digitalWrite(PB7, HIGH);//Stop
    delayMicroseconds(102);

    str1++;//ポインターをカウントアップ

  } //while

  //戻り値
  return (0);

}//ns_printf


//初期化
void setup() {

  //仮想シリアルの出力ポートの初期化
  pinMode(PB7, OUTPUT);
  digitalWrite(PB7, HIGH);

  //I2Cの初期化
  Wire.begin(PA12,PA11); //stm32g031

  Wire.begin(0x40);  //I2Cスレーブアドレスの設定
  Wire.onReceive(receiveEvent); //データが来ると呼ばれる関数


}//setup


//無限ループ
void loop() {

  //I2Cに文字列を出力
  ns_printf("hello world\r\n");

  //1秒の待ち
  delay(1000);

}//loop

char c_hex[] = { 
'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'
}; 

//レシーブイベント
void receiveEvent(int howMany) {

  int x = Wire.read(); //I2C受信データの読み込み
  //I2Cに文字列を出力
  ns_printf("READ\r\n"); //受信した数値の表示

  char data_i[] = { c_hex[x>>4],c_hex[x & 0x0f]   };
  ns_printf(data_i); //受信した数値の表示
  ns_printf("\r\n");


}//receiveEvent



```


テストプログラム


```c++


//I2C_A_031_1

#include <Arduino.h>
#include <Wire.h>

//STM32G031J6M6 i2cピンの定義
#define sdaPin PA12    // ArduinoA4
#define sclPin PA11    // ArduinoA5

#define en     PB7     // 1pin

#define ADDR1  0x40

//初期化
void setup() {

  delay(3000); //not Delete

  //GPIOの初期化
  pinMode(en, OUTPUT);

  //i2cの初期化
  Wire.begin(sdaPin, sclPin); //STM32G031J6M6

}//setup

//メインループ
void loop() {

  digitalWrite(en, 1); //LED ON debug

  //I2Cに送信
  Wire.beginTransmission(ADDR1);
  Wire.write('A');
  Wire.endTransmission();

  delay(500);//0.5秒待つ


  digitalWrite(en, 0); //LED OFF debug
  delay(500);//0.5秒待つ

}//loop



```
[Vue3 + VueRouter4] ルーター準備完了タイミングは isReady() を使う

# はじめに

Vue3 + VueRouter4 の環境で、コンポーネントのマウント時にルーターの名前、パラメータなどを取得したら `undefined` になってしまいました。

色々調べてみると `isReady()` を使うのが良さそうなので備忘録を残します。

ルートの書き方は公式ガイドをご覧下さい。

https://router.vuejs.org/guide/essentials/route-matching-syntax.html


# Vue2 + VueRouter3 で Options API の書き方

コンポーネントがマウントされた時に、合致するルートが指定されていなければ `list` というルートに誘導する処理です。
合致するルートがあれば誘導しません。

```vue
<script>
export default {
  //  〜略〜
  mounted() {
    if (!this.$route.name) {
      this.$router.replace({
        name: 'list',
      });
    }
  },
}
</script>
```

# Vue3 + VueRouter4 だと

Vue3 の `<script setup>` 構文で書きました。

```vue
<script setup lang="ts">
import { onMounted } from 'vue';
import { useRoute, useRouter } from 'vue-router';

const route = useRoute();
const router = useRouter();

onMounted(() => {
  console.log(route.name); // undefined になる

  if (!route.name) {
    router.replace({
      name: 'list',
    });
  }
});
</script>
```

## 合致するルートの URL を開いても「合致なし」判定になる

上記の書き方では他のルートに合致する URL で開いても `list` に誘導されてしまいます。
`console.log(route.name)` で確認しても `undefined` と表示されるだけです。


# `isReady()` を使って準備完了を知る

`await router.isReady();` を使うことでルーターの初期準備が完了を知ることができます。

```vue
<script setup lang="ts">
import { watch, onMounted } from 'vue';
import { useRoute, useRouter } from 'vue-router';

const route = useRoute();
const router = useRouter();

const checkRouterReady = async () => {
  console.log('ルーター準備前', route.name);
  await router.isReady();
  console.log('ルーター準備完了', route.name);
  // route.name や route.params に関する処理を書く
};

watch(route, () => {
  console.log('ルート変更された');
});

onMounted(() => {
  checkRouterReady();
});
</script>
```

ルート `list` に合致する URL 開いた時の `console.log()` の結果は下記のようになります。

```
ルーター準備前 undefined
ルート変更された
ルーター準備完了 list
```

# おわり

今まで JavaScript + Vue2 + VueRouter3 + Vuex3 で制作していたものを
TypeScript + Vue3 + VueRouter4 + Pinia で作り直しているので色々大変です。
Oracleデータベースインスタンスの管理

# データベース各起動における状態

- STARTUP NOMOUNT
    - 初期化パラメータファイルを読み込む
    - バックグラウンドプロセスが起動する
    - SGAが割り当てられる
    - アラートログに実行の詳細が記録される
- ALTER DATABASE MOUNT
    - 制御ファイルを読み込む
- ALTER DATEBASE OPEN
    - REDOファイルを読み込む
    - データファイルを読み込む
    - 一般ユーザの接続が可能


### Oracleデータベースの運用モードをARCHIVELOGモードに変更する。

```
ALTER DATABASE ARCHIVELOG
```


### インスタンスを強制停止するSQL*Plusコマンド

```
SHUTDOWN ABORT
```

# SHUTDOWNコマンドオプション

|オプション|説明|既存の接続扱い|実行中のSQL|
|----|----|----|----|
|NORMAL|すべての接続が終了するまで待機|ユーザが接続を終了するまで待機|何もしない|
|TRANSACTIONAL|実行中のトランザクションが終了するまで待機|トランザクション終了時に切断される|トランザクション終了を待機|
|IMMEDIATE|実行中の処理を取り消す|切断|取り消し(ロールバック)|
|ABORT|実行中の処理に対する取り消し処理を実行せず、インスタンスを強制終了する|切断|強制終了|

ABORTは、インスタンスを強制停止する。そのため、データベースファイルは整合性が取れていない状態になる。データベースファイルの整合性は次回インスタンス起動時に自動的に回復される(インスタンスリカバリ)

#Oracle内部の管理情報を確認する特殊なビュー
## データディクショナリビュー（管理情報）
### 主なデータディクショナリビュー
|ビュー名|確認できる情報|
|-|-|
|DBA_TABLE|表の情報|
|DBA_INDEXES|索引の情報|
|DBA_VIEWS|ビューの情報|
|DBA_SEQUENCES|シーケンスの情報|
|DBA_SYNONYMS|シノニムの情報|
|DBA_CONSTRAINTS|制約の情報|
|DBA_USERS|ユーザの情報|
|DBA_TABLESPACES|表領域の情報|
|DBA_DATA_FILES|データファイルの情報|
|DBA_FREE_SPACE|データファイルの空き容量に関する情報|
### データディクショナリビューの分類
- DBA_
    - データベース全体の管理情報が表示される。
    - 権限を持つユーザのみがアクセス可能。
- ALL_
    - 問い合わせを実行下ユーザーがアクセスできる範囲の管理情報が表示される
- USER_
    - 問い合わせを実行したユーザが所有する範囲の管理情報が表示される。

## 動的パフォーマンスビュー
制御ファイルに格納された内部情報、または、インスタンス(SGA)で保管している内部管理情報を確認するビュー
### 主な動的パフォーマンスビュー
|ビュー名|確認できる内部管理情報|
|-|-|
|V$PARAMETER|初期化パラメータの設定値|
|V$SGA|SGAのサマリー情報|
|V$SGAINFO|SGAのサイズ情報|
|V$SESSION|インスタンス内の全セッションの情報|
|V$DATAFILE|制御ファイルに格納されたデータファイルの情報|
|V$TEMPFILE|制御ファイルに格納された一時ファイルの情報|
|V$INSTANCE|インスタンスの情報|
|V$SQL|共有プールにキャッシュされているSQL情報|
|V$SYSSTAT|インスタンスの様々な稼働統計情報|
|V$SESSTAT|セッションの様々な稼働統計情報|

##違い
- データディクショナリビュー
    - OPEN状態でのみ問合せを行える
    - 読み取り一貫性が保証される
    - 実表は、SYSTEM表領域に格納されている
- 動的パフォーマンスビュー
    - OPEN状態でなくても問合せを行える
    - 読取り一貫性が保証されない
    - メモリー構造から導出される(制御ファイルに格納された内部情報、またはSGAで保管している内部管理情報)
   
#　自動診断リポジトリ(ADR)
##特徴
- 製品やデータベースなどに応じたディレクトリ構造で整理されたログファイルの集合体
- ADRベース内では、DBインスタンス用、ASMインスタンス用、リスナー用など各コンポーネントごとのサブディレクトリが作成される
- データベース外部に格納されるため、インスタンス停止中でもアクセス可能である。
- DIAGNOSTIC_DESTパラメータで格納先を指定できる
- Oracle Database、Oracle Client、Oracleリスナー、Oracle ASM、Oracle Clusterwareなどの製品ログ・ファイルが格納される

#初期化パラメータファイル
各メモリー領域のサイズや各機能のON/OFF、プロセスの動作特性など、インスタンスの動作特性を決定するパラメータ

## SPFILE

- バイナリ形式の初期化パラメータファイル
- テキストエディタなどでファイルを直接編集する事はできない
- ALTER SYSTEM SET文で設定値の変更可能


##### 格納された初期化パラメータの設定値を変更

```
ALTER SYSTEM SET
```
##### SPFILEのみの設定値を変更

```
ALTER SYSTEM SET SCOPE = SPFILE
```
　※再起動後に変更が有効になる。
##### 現在起動中のインスタンス内でのみの設定値を変更

```
ALTER SYSTEM SET SCOPE = MEMORY
```
## PFILE
- テキスト形式の初期化パラメータファイル
- テキストエディタでファイルを直接編集できる
- ALTER SYSTEM SET 文で現行のインスタンスには反映される
- ただし、ALTER SYSTEM SET 文でのPFILE内の設定内容を変更することはできない
- 再起動後も変更後の値を維持したい場合は、手動でPFILEを編集する必要がある
はじめてCiscoに触れたときの体験について

今回は自分が初めてネットワークに触れたときにメモした内容を記事にまとめました。<br>初めて触れる方に少しでも参考になればと思います。<br>
# 1．自宅の環境でネットワーク構築準備
自分の場合、家にネットワーク機材を置くスペースがないため<br>ネットでよく紹介されているパケットトレーサーを利用して、<br>時々触れることもあります。<br>
参考記事：[Cisco シミュレータ Packet Tracer のインストール](https://qiita.com/suzuyui/items/76764d7fc4b4183a7d45)

※上記記事を参照しながら、ぜひインストールしてみてください。<br>　個人的にアカウント登録する辺りが時間がかかりました。。<br>　また、機材購入を検討している方は通販サイトで購入できます。
# 2．ネットワークのモードについて
ネットワークの設定やポートの詳細情報を確認する場合、<br>以下図のモードで移動して確認が必要になります。<br>
<img width="700" alt="モード一覧" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681098/9ef212d8-3a84-d373-c2aa-113ef7001088.png">

### 1．コンソールやTelnet、ssh接続を用いてネットワーク機器に接続する。
　はじめにネットワーク機器に接続するため、どの方法を実施するかによって分かれます。<br>　コンソール接続は物理的に自端末とネットワーク機器を接続する方法です。<br>　また、VTYを利用した接続はどの環境からでもアクセスすることができる方法です。<br>
※VTYは、Virtual Typewriterの略称になります。

https://www.infraexpert.com/study/ciscorouter6.html

### 2．ユーザEXECモード、特権EXECモードについて

#### ・ユーザEXECモード
通常、どの接続方法を実施してもはじめはユーザEXECモードに移行します。<br>このモードでは、機器のステータスを確認することが可能です。<br>しかし、詳細情報を参照する場合、一部制限がかけられて確認できません。<br>
その場合、1つ上のモードである特権EXECモードへ移行する必要があります。<br>以下コマンドを実行して移行します。<br>

```
>enable
#
##省略形
>en
#
※ログアウトするときはexit又はend、quitになります。
```

#### ・特権EXECモード
このモードでは、ユーザEXECモードでは確認できなかった機器のステータスを<br>制限なく参照することが可能です。また、ファイル操作を利用することも可能です。<br>確認作業が一通り完了して設定を行う場合は、以下コマンドを実行して移行します。

```
#configure terminal
(config)#
##省略形
#conf t
(config)#
```

### 3．グローバルコンフィグレーションモードについて

このモードでは、機器全般の設定を行うことができるモードになります。<br>特権EXECモードから各種インターフェイスへ移行することはできないため、<br>必ずこのモードを経由して移行します。<br>※各種インターフェイスへ移行するコマンドは以下となります。

```
##機器のインターフェイスの設定
(config)#interface <タイプ> <ポート番号>

##ラインコンフィグレーションモード
(config)#line <タイプ> <ポート番号>

##その他設定モード
(config)#router <タイプ> <ポート番号>
(config)#vlan <タイプ> <ポート番号>
```

# 3．個人的に苦悩した点
1．初めて触れたとき、適切なモードを移行することをイメージできるまで時間かかりました。<br>　先輩方から教えていただきネットワークを構築しましたが、どの階層がどのような役目があるか<br>　知るところから始めたので苦戦しました。自分の場合は参考書を読み、理解することができました。<br>
2．設定できるIPアドレスはサブネットによって、変化する点です。<br>　サブネットによって、設定できるIPアドレスが変化するため、空言で言えるようになるまで苦悩しました。<br>　正直専用サイトを使用した方が早い気がしますが、色々とタメになりました。<br>
※初歩的な話ですが、端末からルータまで疎通確認するときにコマンドプロンプトを利用することを知らず<br>ルータやスイッチのターミナルで何とか確認できないか試した記憶がありました。。

# 4．まとめ
今回はネットワークのシミュレーターやモード、過去体験などについて、記述しました。<br>実際に機材に触れて設定を行う方が良いのですが、できない場合<br>よろしければ、シミュレーターを利用して触れてみて下さい。

# 4．参考文献
・[ネットワーク入門サイト](https://beginners-network.com/catalyst_config_use.html)
・[ネットワークエンジニアとして](https://www.infraexpert.com/)
A10 vThunder on ESXi（負荷分散対象ホスト/ヘルスモニタ/サービスグループの登録）

前回に引き続き、vThunderの記事です。今回は負荷分散対象ホスト/ヘルスモニタ/サービスグループの作成を実施します。ホストはロードバランサーから負荷分散対象として認識されたノードを意味します。サービスグループは登録されているホストをグルーピングして、負荷分散アルゴリズム（ラウンドロビンとかLeast Connectionとか）を設定しておきます。ヘルスモニタはホストのIPやサービスグループのPort番号など監視する役割を担います。

インタフェース設定の記事をご覧になれていない方は下記URLからどうぞ。

https://qiita.com/nw-engineer/items/d7102c4087b3f7f4df94


**設定範囲**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/ce44146a-a9d6-0005-6b96-08a4888a64d2.png)


## 1. ホスト登録
まずは負荷分散対象となるサーバ情報を登録しましょう。管理画面上にある「ADC」から「SLB」をクリックします。負荷分散対象ノードの登録などはこちらから設定する形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/5b7b24b6-0899-d338-e038-f679e3c073bb.png) 

画面上部にある「サーバー」をクリックし画面遷移させます。右側の「＋作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/af5a2f71-fdde-8a72-fe39-28e7096bb3cd.png) 

ここでは負荷分散対象のホストを登録できます。名前には任意のわかりやすい名前をいれて、ホストにはIPアドレスを入力します。ヘルスモニターのプルダウンから「ping」を選択して画面右下の「作成」ボタンをクリックします。同様の手順で2台分のホストを登録します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/de415dde-51f9-c681-5742-867e475a925f.png) 

しばらくすると、ホストのステータスが緑(UP)に変わります。もし赤(Down)のままの場合はサーバ側のFireWall設定など確認をして下さい。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/15e03c7f-891d-7590-7c1d-709c389be4a1.png) 

## 2. ヘルスモニタの作成
次は登録したホストのサービスポートを監視するためのヘルスモニタを作成します。画面上部の「ADC」からヘルスモニタをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/035647b7-204e-9aae-ac83-1f5f1aadda43.png)

画面が遷移します。画面右にある「＋作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/89fc651b-b693-1a5e-2aae-ccb8fc531c8e.png) 

下記画面のようにTCP80番ポートを監視するためのヘルスモニタを作成しましょう。入力が終ったら「作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/477a2281-2d72-ca17-ca58-a443c909f674.png) 

ヘルスモニタが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/c4c8e3a2-1a1f-1add-52f5-e38cc884da9b.png) 

## 3. サービスグループ作成
最後にサービスグループを作成しましょう。「ADC」から「SLB」をクリックし、画面遷移後に「サービスグループ」をクリックします。画面がさらに遷移します。「＋作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/a2b2c16c-b3e2-015c-05fc-d2d53c3da1c6.png) 

ここでは、負荷分散ポリシーの設定と作成したヘルスモニターの適用が出来ます。下記画面の通り設定し、画面右側の「作成」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/88206a73-820a-fd25-1689-adc79f673abb.png) 

事前に登録したホストを選択して作成ボタンをクリックします。2台分同様の手順で作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/06eed615-a0b8-4510-3008-c224563fc3b7.png) 

サービスグループ画面右下の作成ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/4b274644-096e-d5d1-c366-7797ddadaaec.png) 

## 4. その他
次回はバーチャルサーバ/バーチャルサービスおよび負荷分散状況の確認を実施致します。