OmniAICreator/Qiita-1.07M huggingface dataset:
VNC タスクスケジューラを開くと操作ができなくなる

# タスクスケジューラを開くとクリックが一切きかなくなる
タスクスケジューラを開くとなぜか操作が一切できなくなるという問題が発生した。対処法を忘れたときの備忘録として残しておく。
# 解決策
VNCサーバを管理者として実行することで解決できた。
参考:https://riku-zen.cocolog-nifty.com/blog001/2020/05/post-d44ffa.html
LIGGGHTSのPraviewでの可視化　時刻の設定

Liggghtsでの解析結果をParaviewで可視化する場合に、ステップ数と時間の対応方法が分からず悩んだので、その方法を共有します。

### Liggghts結果データのフォーマット
Liggghtsの結果ファイルはdumpコマンドで出力を行います。
~~~dumpコマンド.
dump ID group-ID style N file args

使用例
dump dmp all custom 100 dump*.liggghts_run id type x y z vx vy vz fx fy fz radius mass
~~~
出力ファイルは以下のような中身になっています。

~~~dump.
ITEM: TIMESTEP
23500
ITEM: NUMBER OF ATOMS
1
ITEM: BOX BOUNDS ff ff ff
0 1.5
0 0.5
0 0.5
ITEM: ATOMS id type x y z vx vy vz fx fy fz radius mass 
1 1 0.75 0.25 0.25 0 0 0 2.23481e-08 -0.0248054 1.49699e-15 0.00553014 0.00252857 
~~~
このままでは、Paraviewで読み込めないのでプリポスト用のPythonツール集であるLPPパッケージを使用してVTKファイルに変換します。LPPについては、以前の記事を参考にダウンロードしてください。

https://qiita.com/maumu1119/items/89c83569b0a7b195fd7f

dumpコマンドで出力した結果データがあるフォルダーで、lpp.pyというPythonスクリプトを実行することで変換することができます。lpp.pyはダウンロードしたLPPパッケージの中に含まれます。

~~~.sh
python -i lpp.py 出力ファイル名
~~~

これにより、出力されたvtkファイルを読み込むことでParaviewで可視化できます。
しかし、この方法で読み込んだ結果は解析ステップと時刻の対応がなされていません。したがって、解析のアニメーションで時刻を表示させたい場合に、解析内での実時間とアニメーションでの表記が一致しない問題が発生します。
CFDEMでCFDの結果と同時に表示させる際に、２つの時間進行が一致しない等の問題が起こります。

ParaviewにおいてVTKファイルでのステップ数と時刻の対応を行うには、以下のようなjson形式のSeriesファイルが必要になります。(Paraview5.6以上)

~~~.series
{
  "file-series-version" : "1.0",
  "files" : [
    { "name" : "foo1.vtk", "time" : 0 },
    { "name" : "foo2.vtk", "time" : 5.5 },
    { "name" : "foo3.vtk", "time" : 11.2 }
  ]
}
~~~

Paraview5.6以下では以下のような書式のものを作成ください。
~~~.vtp
<VTKFile type="Collection" version="0.1" byte_order="LittleEndian">
  <Collection>
<DataSet timestep="0.01" group="" part="0" file="Foo_001.vtu"/>
<DataSet timestep=“0.02" group="" part="0" file=“Foo_002.vtu"/>
<DataSet timestep=“0.03" group="" part="0" file=“Foo_003.vtu"/>
  </Collection>
</VTKFile>
~~~

これらのファイルをvtkファイルがあるフォルダーに置き、Paraviewで読み込むとステップ数と時刻の対応が可能です。
Information>Time にIndexとTimeが表示されると思います。

![WS000014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514546/e89209ff-3e3d-e62d-a577-c883c8efde7b.jpeg)



vtkファイルの数が多いと、テキストの編集も大変になるので、.seriesファイルを出力するPythonスクリプトを作成しました。実行時に、必要項目をinputするとseriesファイルを作成することができます。

~~~CreateSeries.py
import json

def generate_json(prefix, start, end, interval, start_time, time_interval):
    files = []
    time = start_time
    for i in range(start, end + 1, interval):
        # 追番を4桁以上にし、不足分を0で埋める
        formatted_number = str(i).zfill(4)
        filename = f"{prefix}{formatted_number}.vtk"
        files.append({"name": filename, "time": time})
        time += time_interval

    data = {
        "file-series-version": "1.0",
        "files": files
    }
    return json.dumps(data, indent=2)

if __name__ == "__main__":
    prefix = input("ファイル名のプレフィックスを入力してください（例：ファイル）: ")
    start = int(input("開始番号を入力してください: "))
    end = int(input("終了番号を入力してください: "))
    interval = int(input("追番の間隔を入力してください: "))
    start_time = float(input("時間の開始時刻を入力してください: "))
    time_interval = float(input("時間の間隔を入力してください: "))

    result = generate_json(prefix, start, end, interval, start_time, time_interval)
    
    with open("TimeSteps.series", "w") as file:
        file.write(result)

    print("TimeSteps.seriesファイルにJSONテキストを出力しました。")
~~~
今回は、ParaviewでVTKの時刻の設定を行う方法を説明しました。
Pythonのscikit-learnによる分類まとめ2

前回の続きです。

https://qiita.com/wanana12/items/fd0a1558cbf13158aed1

Pythonのscikit-learnによる分類をまとめました。
今回は、ガウス過程、単純ベイズ、決定木を用いた分類を行います。

# ガウス過程
GaussianProcessClassifier
https://scikit-learn.org/stable/modules/generated/sklearn.gaussian_process.GaussianProcessClassifier.html
```Python
from sklearn.datasets import load_iris
from sklearn.gaussian_process import GaussianProcessClassifier # GaussianProcessClassifierのインポート
X, y = load_iris(return_X_y=True)
model = GaussianProcessClassifier().fit(X, y)
model.score(X, y)
```
スコアは0.9733333333333334でした。

# 単純ベイズ
GaussianNB
https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html
```Python
from sklearn.datasets import load_iris
from sklearn.naive_bayes import GaussianNB # GaussianNBのインポート
X, y = load_iris(return_X_y=True)
model = GaussianNB().fit(X, y)
model.score(X, y)
```
スコアは0.96でした。

MultinomialNB
https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html
```Python
from sklearn.datasets import load_iris
from sklearn.naive_bayes import MultinomialNB # MultinomialNBのインポート
X, y = load_iris(return_X_y=True)
model = MultinomialNB().fit(X, y)
model.score(X, y)
```
スコアは0.9533333333333334でした。

ComplementNB
https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.ComplementNB.html
```Python
from sklearn.datasets import load_iris
from sklearn.naive_bayes import ComplementNB # ComplementNBのインポート
X, y = load_iris(return_X_y=True)
model = ComplementNB().fit(X, y)
model.score(X, y)
```
スコアは0.6666666666666666でした。
irisデータセットの分類には適していない可能性があります。

BernoulliNB
https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.BernoulliNB.html
```Python
from sklearn.datasets import load_iris
from sklearn.naive_bayes import BernoulliNB # BernoulliNBのインポート
X, y = load_iris(return_X_y=True)
model = BernoulliNB().fit(X, y)
model.score(X, y)
```
スコアは0.3333333333333333でした。
ComplementNBと同様、irisデータセットの分類には適していない可能性があります。

CategoricalNB
https://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.CategoricalNB.html
```Python
from sklearn.datasets import load_iris
from sklearn.naive_bayes import CategoricalNB # CategoricalNBのインポート
X, y = load_iris(return_X_y=True)
model = CategoricalNB().fit(X, y)
model.score(X, y)
```
スコアは0.9333333333333333でした。

# 決定木
DecisionTreeClassifier
https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
```Python
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier # DecisionTreeClassifierのインポート
X, y = load_iris(return_X_y=True)
model = DecisionTreeClassifier().fit(X, y)
model.score(X, y)
```
スコアは1.0でした。

ComplementNBとBernoulliNBでスコアが低い理由がわからず、まだまだ勉強が必要です。

https://qiita.com/wanana12/items/202a37382ff61b4d27a9
[Angular]Jasmineでつまった内容まとめ

### 書きたかったテストコード
ユーザ操作によって呼び出されたmethodから呼ばれるmethod内でグローバル変数値が期待値通り更新されるか確認


### ベースコード

```A.html
<button
class="buttond"
    (click)="onChange()">
    ボタン
</button>
```
```A.ts
　//変数定義
  public add:Number = 0;

  public methodTest(val:boolean){
    this.add = 12;
    if(val){
      this.add = 10;
      console.log(this.add);
    }else {
      this.add = 3;
    }
  }

//buttonクリックで実行
  public onChange(){
    if(this.isChanged){
      this.methodTest(false);
    }else {
      this.methodTest(true);
    }
  }

```

#### 内容

上記ベースコードに対して、

●結果が正しいケース

``` spec.ts

  it(('userIF click methodTest check'), (()=>{
    
    let inputTag = fixture.debugElement.query(By.css('.buttond'));

    inputTag.triggerEventHandler('click',null); //☆
    const spy = spyOn(component,'methodTest');

      expect(spy).toHaveBeenCalled();
      expect(component.add).toEqual(10);

  }))

```

●結果が誤りでエラーになるケース

```spec.ts

  it(('userIF click methodTest check'), (()=>{
    
    let inputTag = fixture.debugElement.query(By.css('.buttond'));

    const spy = spyOn(component,'methodTest');
    inputTag.triggerEventHandler('click',null); //☆

      expect(spy).toHaveBeenCalled();
      expect(component.add).toEqual(10);

  }))

```


spyOnとtriggerEventHandlerの実行順により、テスト結果が異なる点について
30分近く詰まりました。


spyOnとは、引数で指定したオブジェクト関数をモック化し、その関数の呼び出しを追跡するメソッドです。

* 【誤り】では、 methodTest()をモック化した後にtriggerEventHandlerでclickが実行されます。 この場合、clickイベントが発生したときにmethodTest()が実際に呼び出されますが、その呼び出しはspyOnによって検出されません。expect(add).toEqual(10)も失敗します。これは変数addがcomponent.addの初期値（0）を保持し続けているためです。

* 【正しい】では、 triggerEventHandlerでclickが実行されて処理されてからspyOnでmethodTest()がモック化されます。 この場合、clickイベントが発生したときにmethodTest()がモック化された関数として呼び出されます。その呼び出しはspyOnによって検出されます。 expect(component.add).toEqual(10)も成功します。これはcomponent.addが常に最新の値を反映しているためです。



### 結果まとめ

そもそも今回のテストケースでは、spyOnが不要でした。。。
spyOnは、以下のケースのような際に使用する。
「
A関数のreturn値を持ってproperty更新するとか、return値を持って処理を進める際に
このreturn値をモックすることでA関数の実装とは切り離して処理の単体テストを行うために使用する。
・APIからの返り値が必要なケース
」


以上の結果の違いとspyOnの理解が乏しく、、、
気づくのに時間を要したためざっとまとめました。
docker-compose でのポートフォワードについて

### 概要
 - docker-compose で定義する ports で何が行われているかをまとめた

### 想定読者
 - docker-compose で定義する ports が分からない人

### ポートフォワードとは
 - 特定のポート番号に届けられたメッセージを、特定のIPアドレス、ポート番号に転送する仕組みのこと

### docker-compose の port から、ホスト側とコンテナ側のポートを対応付けることができる (ポートフォワード)
以下は db と adminer (db を管理する GUI) を定義した docker-compose.yaml  
ホストマシン側の 5433 ポート、 8081 ポートをコンテナ側の 5432 ポート、8080 ポートに紐付けている

```docker-compose:docker-compose.yaml
services:
  postgres:
    image: postgres:14.4-alpine
    ports:
      - "5433:5432"
    container_name: postgres

  adminer:
    container_name: adminer
    hostname: adminer
    image: adminer:4.7.5
    ports:
      - 8081:8080
    depends_on:
      - postgres
```

※ 注意点として、コンテナ側のポートは Dockerfile 内で定義されているポートを指定しないとアクセスできない。  
docker-compose では、ポートの紐付けを行っているだけで、コンテナ側でどのポートを listen するかは Dockerfile で定義する

adminer にアクセスする際のイメージとしては以下の通り

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1776098/14db68a3-0d0b-29b8-7505-1858224a89c6.png)


### 何故ポートフォワードが必要なのか？
コンテナとホストマシンが接続するネットワークはそれぞれ異なる  
そのため、ポートフォワードを行わずにホストマシンに対してコンテナ側のポート 8080 を直接指定しても、コンテナにはアクセスできず、ホストマシンの 8080 にアクセスするだけである
PM2でerroredのまま動かなくなった場合

### PM2
プロジェクト構成を更新した際、何度`pm2 restart`かけても`errored`のまま動かなくなった。
サイト上のHTTPステータスは502で表示されるみたい。

![status:errored](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/990851/d48bf0c1-1852-82bd-b872-03aff71a1b49.png)

### 結論

一度`pm2 delete $var`する。

pm2は一度起動したサービスは`stop`してもサーバー自体が停止しても覚えているようで、サービス構成用のJSONファイルの中身が更新されていなかったことが原因だった。


デバッグは`pm2 logs`が役に立つ。

https://stackoverflow.com/questions/51300544/getting-error-when-trying-to-launch-node-js-app-with-pm2-cluster
母集団のパラメータの区間推定

## 頻度論的信頼区間

教養レベルの教科書では、推定を学ぶ際に母集団のパラメータ(平均値など)の点推定の次に出て来るのが母集団のパラメータの区間推定ですが、よく言われるようにこれは実は相当な曲者です。

その原因は母集団のパラメータ(平均値など)を**未知だがすでに決まっている定数**とし、信頼区間を確率変数を両端とする閉区間としていることです。

すなわち、パラメータ$\theta$に対する頻度論的な信頼区間とは以下のように定義されています。
```math:
ランダムな区間[l(X),u(X)]が、\thetaに対する95％信頼区間であるとは、データが得られる前に以下が成り立つことを言う。
```
```math:
P(l(X)<\theta<u(X)|\theta)=0.95
```
教養レベルの統計学の本では例題や演習問題でよく以下の様な、信頼区間の両端の確率変数に具体的な数値を代入する問題が出題されます。


「ある工場の部品を8個抽出し、その重量を測定したところ、次の値を得た。
```math:
32.1, ~~33.0, ~~ 31.0, ~~ 32.0, ~~ 32.5, ~~ 32.2, ~~ 32.8, ~~ 32.4


```
この部品の重量は正規分布に従うとみて、この部品の重量の平均,分散の95%信頼区間を求めよ。」

しかし実はこれはこの理論上はあまりそれほど重要でない計算をしていることになります。何故なら、その時の標本抽出の結果はこの区間になりました、ということであり、それ以上のことは言えないからです。

## ベイズ信頼区間

実現値を基に計算した区間は、直感的には何か意味のある閉区間のように思えます。これは**ベイズ信用区間**の考えを導入することで説明できます。すなわち、今度は母集団のパラメータを**事前分布をもつ確率変数**とすれば、具体的な数値を両端とする閉区間の中にその確率変数が値を取る確率ということが数学的に意味をもちます。

```math:
観測データX=\overrightarrow{x}に基づく区間[l(\overrightarrow{x}),u(\overrightarrow{x})]が、\thetaに対する95％ベイズ信用区間であるとは、以下が成り立つことを言う。
```
```math:
P(l(\overrightarrow{x})<\theta<u(\overrightarrow{x})|X=\overrightarrow{x})=0.95
```
母平均の区間推定の場合では母平均の事前分布を正規分布とし、その分散を無限大にすれば(そうすることにより事前分布を**無情報事前分布**とすれば)ベイズ信用区間は古典的な信頼区間に一致します。
K8sのネットワークエコシステム

# K8sのネットワークエコシステム

### 1. はじめに

#### Kubernetesとは
Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、および管理を自動化するオープンソースのオーケストレーションプラットフォームです。高い柔軟性と拡張性を持ち、大規模なクラスタ管理を可能にします。

#### ネットワークの重要性
Kubernetesのエコシステムにおけるネットワークは、Pod間の通信や外部からの接続など、多くの要件をサポートするために必要です。この記事では、そのエコシステムを構築・管理する要素に焦点を当てます。

---

### 2. Kube-Proxyの役割

#### Kube-Proxyの基本的な機能
Kube-Proxyは、Kubernetesのノードごとに動作するキーコンポーネントであり、Serviceオブジェクトとエンドポイントの変更を監視し、これらの変更をノード内のネットワークルールに変換します。

#### Kube-Proxyの動作モード
Kube-Proxyはいくつかのモードで動作可能であり、iptablesモードやIPVSモードなど、異なるネットワークインフラストラクチャに合わせて選択できます。

#### エンドポイントオブジェクトとサービスの連携
Kube-Proxyはエンドポイントオブジェクトを使用して、サービスとPodの関連性を確立します。これにより、動的に変化するPodのIPアドレスを考慮して、トラフィックを適切にルーティングできます。

---

### 3. Kubernetesのネットワークモデル

#### Pod-to-Pod通信
Pod同士は、クラスタ内の任意のノード上で直接通信することができます。これは、例えば、マイクロサービスのコンポーネント間での通信などのシナリオで利用されます。

#### Service-to-Service通信
KubernetesのServiceは、異なるサービスやアプリケーション間での通信を抽象化し、安定した接続エンドポイントを提供します。

#### External-to-Service通信
外部からのトラフィックをKubernetesのサービスにルーティングするための方法として、NodePortやLoadBalancer、ExternalNameなどのServiceタイプが存在します。

---

### 4. CNI (Container Network Interface) の解説

#### CNIとは？
CNIは、コンテナのネットワークインターフェイスを動的に設定・管理するための規格です。

#### KubernetesとCNIの連携
KubernetesはCNIプラグインを通じて、ネットワーク設定をコンテナランタイムに適用します。

#### ソフトウェア定義ネットワーキング (SDN)
CNIはSDNアプローチを使用して、クラスタ全体のコンテナ間の通信を一元化します。

---

### 5. StatefulSetと持続的なデータストレージ

#### StatefulSetの概要
StatefulSetは、状態を持つアプリケーション、特にデータベースなどの分散システムをKubernetesで管理するためのリソースです。

#### Persistent Volume (PV) と Persistent Volume Claim (PVC) の

関連
PVはクラスタ内のストレージリソースを表し、PVCはそのストレージを使用するリクエストを表します。これらは、データの永続性を確保するために連携して動作します。

#### PVとPVCの具体的なシナリオ
例えば、データベースをコンテナ化する場合、データの永続性を確保するためにPVとPVCを使用してデータを保存します。

---

### 6. 結論

Kubernetesのネットワークエコシステムは非常に強力で柔軟です。それぞれのコンポーネントやリソースが連携して、効果的な通信とデータ管理を実現しています。継続的な学習と実践を通じて、このエコシステムの深い理解を得ることができます。
文字コードを確認する方法【Mac】


## ファイルの文字コードを確認するコマンド

次のいずれかのコマンドで文字コードを確認できます。

### `file -I`
```terminal
file -I /path/to/file
```

```terminal
$ file -I sample.txt
sample.txt: text/plain; charset=utf-8
```

### `file --mime`
```terminal
file --mime /path/to/file
```

```terminal
$ file --mime sample.txt
sample.txt: text/plain; charset=utf-8
```

### `file --mime-encoding`

```terminal
file --mime-encoding /path/to/file
```

```terminal
$ file --mime-encoding sample.txt
sample.txt: utf-8
```
競馬のレース掲示板でテキストマイニング

# はじめに
最近は競馬のデータ分析をいろいろ試しています。その中で[netkeiba](https://www.netkeiba.com/)さんにある掲示板のデータを分析したら面白い知見が得られるんじゃないかと考えたのでやってみた。

# 用意したもの
- Python
    - Selenium
    - BeautifulSoup
- MeCab
    - NEologd
- KHCoder

# データスクレイピング（クローリング）
netkeibaさんの掲示板サイトは動的サイトですのでSeleniumで操作してHTMLを持ってきます。
今回は明日（10/9）に開催される京都大賞典の掲示板を取得してきます。

```python
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
import time
import re

# Seleniumをヘッドレスで実行する
options = Options()
options.add_argument("--headless")

URL = "https://race.netkeiba.com/race/bbs.html?race_id=202308020311&rf=special_sidemenu"
file_name = "2023_京都大賞典.txt"

driver = webdriver.Chrome(options=options)
driver.get(URL)
# 一番下のレス番号を取得
res_no = driver.find_elements(By.CLASS_NAME, "Res_No")[-1].text
# [??]なので中心のみを抽出
res_no = int(res_no[1:-1])

# 最後のレスになるまでループ
print("ボタン操作開始")
while res_no!=1:
    # 「もっと表示する」ボタンを探す
    more_btn = driver.find_element(By.ID, "MoreComment01")
    # ボタンを押す
    driver.execute_script("arguments[0].click();", more_btn)
    time.sleep(1)
    res_no = driver.find_elements(By.CLASS_NAME, "Res_No")[-1].text
    res_no = int(res_no[1:-1])
    print("最後のレス番号:",res_no)

print("コメント処理開始")
# BeautifulSoupに渡して解析
page = driver.page_source
soup = BeautifulSoup(page, "html.parser")
# 余計な文字を削除
comments = [i.text.replace("\nフォローする", "").replace("\n", "").replace("\u3000", "") 
             for i in soup.find_all("p", attrs={"class":"Comment"})]
# [>>??]というようなレスをしているコメントの数字部分を削除する
for i in range(len(comments)):
    res = re.match(r">>[0-9]+", comments[i])
    if res is not None:
        res_body = res.group()
        comments[i] = comments[i].replace(res_body, "")
comment_all = "。\n".join(comments)

print("ファイル保存")
# 保存
with open("レース掲示板/"+file_name, "w", encoding='utf-8') as b:
    b.write(comment_all)
    
print("処理終了")
```

細かい処理の説明は省きますが、ざっくり書くと
- seleniumでサイトを開く
- 「もっと表示する」ボタンを最後のレス番号が1になるまで押し続ける
- HTMLを持ってくる
- BeautifulSoupで解析しつつ、余分な文字を削除する

です。

# KHCoderで共起分析
我らがKHCoderで分析します。
自宅のPCにはMeCabとNEologdの環境がなかったので以下の記事を参考に構築しておきました。

https://qiita.com/yakipudding/items/0372dc79bb5722fa4b8b

KHCoderを起動して、新規→出力したテキストファイルを選択→前処理の実行→共起ネットワークの作成、で完成したのがこちらの図です。

![2023_京都大賞典.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456646/b7e75d0c-5a0a-1ac1-411f-2d2d89219f46.png)

正直言うと微妙ですね...
ぱっと見でみんなが穴馬として指名しているサクセスシュート...いや出馬表にいないじゃん！
人気しそうな馬は右上に固まっていますね。

良くも悪くも単語ごとの関係性のため、
- 予想-当たる
- 馬連-ワイド-BOX-3連単
- 穴-本命

のような、わかりきってる関係性や、
- DEEP-ボンド
- サクセス-シュート
- ビッグ-リボン

といった馬の名前が分かれている関係性もあります。
ただ、
- DEEP-ボンド-京都-経験-本命
- ビッグ-リボン-無い
- 牡(馬)-(人)気

といった関係性が出てるのはとても良いです。

# まとめ
今回は掲示板データを使った共起分析というテーマでやってみました。課題はあるものの、自分だと見落としていたポイントなどを発見できたり、ほかの人の予想を確認できるという点では可能性を感じました。

とりあえず改善点として、
- 馬の名前は一つになるようにユーザ辞書の追加
- 競馬の用語は改めてユーザ辞書へ登録
- テキストの前処理をもう少し頑張る
- 表示するエッジの数を閾値を定めて表示する

といったところでしょうか。次の開催日にはまた良い結果を出せたらと思います。

# 参考文献
- netkeiba、https://www.netkeiba.com/
- 京都大賞典(G2) レース掲示板、https://race.netkeiba.com/race/bbs.html?race_id=202308020311&rf=special_sidemenu
- WindowsのMeCab＋NEologdの入れ方、https://qiita.com/yakipudding/items/0372dc79bb5722fa4b8b
[TypeScript]Playwright：何がSeleniumより優れているのか

## Playwrightとは

https://playwright.dev/

Seleniumよりも新しいE2Eテストフレームワーク

## Seleniumよりいい所

:::note
まとめ：特に、サクッと画面動作の検証を行いたい場合に適している
:::

- Playwright-Codegenにより、コードの自動生成ができる
- TypeScriptの強力な型特性により、初心者が自力でコードを書いても間違いが起きにくい
- [ARIA role](https://playwright.dev/docs/locators#locate-by-role)と[label](https://playwright.dev/docs/locators#locate-by-label)、[placeholder](https://playwright.dev/docs/locators#locate-by-placeholder)に対応している
  - 結果、可読性が高く、画面要素とコードが一致しやすい
- [レポート出力機能](https://playwright.dev/docs/test-reporters)が強力
  - 
  - サードパーティの高機能なレポーターを利用することもできる

## 実行方法

### 注意：Playwright用のDockerコンテナを使う場合、2種類のImageがある

:::note
- 
  - 1: 最初からブラウザがインストールされているImageを使うhttps://mcr.microsoft.com/en-us/product/playwright/tags
    - この場合は、`npx playwright install`は不要
  - 2: 普通のNodeJS(またはJava/Pythonなど)Imageを使う
    - この場合は、`npx playwright install`が必要
:::


### Gitlab-CI利用時のExample

```yaml
pages:
  needs: []
  image: mcr.microsoft.com/playwright:v1.35.1-jammy
  variables:
    FF_USE_FASTZIP: "true"
  before_script:
    - npm ci
  script:
    - npx playwright test
  publish: html-report
  artifacts:
    paths:
      - '*.csv'　　　　　# テスト中にダウンロードしたcsvがある場合の例(なければ不要)
      - html-report/    # htmlレポーターの既定ディレクトリ
      - test-results/   # テスト出力結果の既定ディレクトリ
    reports:
      junit: test-results/results.xml #junit
    when: always
```
laravel migrateできない！


以下のエラーが発生してmigrateできないです。
![スクリーンショット 2023-10-08 23.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/6aa3f993-3ba6-f4cb-7387-208db3105a34.png)
エラーメッセージを確認すると、SQLiteデータベースが存在しないことが原因であることが示されています。具体的には、/home/pi/hello-laravel/database/db.sqliteというパスでデータベースファイルが見つかりませんということでしょうか。

SQLiteデータベースファイルが存在しない場合は以下で追加
```
touch database/db.sqlite
```
SQLiteデータベースファイルが存在する場合
```
 database % ls
db.sqlite	factories	migrations	seeds
```
.env に指定されたデータベースのパス /home/pi/hello-laravel/database/db.sqlite と、実際にlsコマンドで確認したディレクトリの内容から見ると、SQLiteのデータベースファイル db.sqlite は存在しています。

しかし、エラーメッセージはこのファイルが存在しないと示唆しています。これは、パスが正しくない、またはLaravelがその場所にアクセスできない可能性があるようです。

**絶対パスを利用する**
.env ファイル内の DB_DATABASE の設定で絶対パスを指定する代わりに、相対パスを使用します。
```
DB_DATABASE=/home/pi/hello-laravel/database/db.sqlite
```
上記の絶対パスの部分を以下の相対パスに変更
```
DB_DATABASE=database/db.sqlite
```
**キャッシュのクリア**
Laravelは設定をキャッシュすることがあるみたいなので、.env ファイルを変更した後は、キャッシュをクリアする。
```
php artisan config:clear
```
**再度マイグレーションを試す**
```
php artisan migrate
```
以下のように表示されればOK！
![スクリーンショット 2023-10-08 23.49.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/9cec9055-dbc1-f3b2-4f61-374cd15caef9.png)
GitHub Actions を使用して Kotest の自動実行を行う

# はじめに
個人開発で使用しているリポジトリに自動テストを導入したため、リポジトリへのプッシュが
行われた際にテストの自動実行を導入する方法を説明します。

## 実行環境
- 言語：Kotlin 1.9.0
- ビルドツール：Gradle 8.3
- テストフレームワーク：Kotest 5.7.2
- IDE：Intellij IDEA Community Edition 2023.1.2

## 想定する読者
基本的には手順の説明のみとなります。
KotlinやKotest、GitHub Actions について知りたい方は他の記事や公式をご覧ください。

- Kotlin の基本的な内容を理解している方
- Kotest の導入方法を知りたい方
- Kotlin に Kotest を導入する方法を知りたい方
- テストを自動化したい方

## リポジトリ
今回説明する内容を実装したリポジトリは以下となります。

https://github.com/kamishi-44/kotest-ci-sample

# 実行環境の構築
## 準備
- GitHub でリポジトリを作成します

- Intellij IDEA からクローンし、以下の のコマンドを実行します
   ``` gradle init --type kotlin-application ```

## ソースコードの修正
- `App.kt`を以下の通りに修正します
   計算を行う`Calc`クラスを作成し、足し算を行う関数を作成します。
   `main()`関数からは`Calc`クラスのインスタンスを生成し、`add()`関数を呼び出す
   シンプルなプログラムです。
```kotlin
/*
 * This Kotlin source file was generated by the Gradle 'init' task.
 */
package kotest.ci.sample

/**
 * 計算クラス
 */
class Calc(
    private val num1: Int,
    private val num2: Int
) {
    /**
     * num1 と num2 を加算します。
     *
     * @return num1 と num2 の加算の結果
     */
    fun add(): Int {
        return num1 + num2
    }
}

fun main() {
    val calc = Calc(1, 1)
    print("1 + 1 = ${calc.add()}")
}
```

- `build.gradle.kts` を修正して Kotest を導入します
  修正後、`gradle build` のコマンドを実行して修正を反映させます
```yaml 
// dependenciesの修正
dependencies {
    testImplementation("io.kotest:kotest-runner-junit5-jvm:5.7.2")
} 

// Kotest junit5ランナーの依存関係を追加
tasks.named<Test>("test") {
    // Use JUnit Platform for unit tests.
    useJUnitPlatform()
}
``` 

- `AppTest.kt`を以下の通り修正します
```kotlin
/*
 * This Kotlin source file was generated by the Gradle 'init' task.
 */
package kotest.ci.sample

import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe


class AppTest : FunSpec() {
    init {
        context("正常系") {
            val calc = Calc(1, 1)
            calc.add() shouldBe 2
        }
    }
}

```

- `gradle test` コマンドを実行しテストが正常に終了することを確認しておきます

## GitHub Actions のジョブを作成
- `.github/workflows` ディレクトリを作成します
- `.github/workflows` に`kotest-ci-sample.yaml` を作成します
```yaml
name: kotest-ci-sample

on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up JDK 19
        uses: actions/setup-java@v3
        with:
          java-version: '19'
          distribution: 'temurin'
          cache: 'gradle'

      - name: Grant gradle permission
        run: chmod +x ./gradlew

      - name: Run test
        run: ./gradlew test
```
準備はここまでです。

## ジョブの実行
この時点でリポジトリでプッシュすると、作成したジョブが実行されるようになります。
`git push` した後に GitHub の Actions を確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187508/833ec7bb-bb41-fc19-b600-4ddad22ee4da.png)

うん、無事に正常終了してますね。

## 最後に
今回初めてGitHub Actions を使用しましたが、感想としては想像以上に簡単に導入できるな、というのが正直なところです。
もう少しややこしいものかと思っていましたが、何でもやってみるものですね。
php バージョン変更

**php artisan migrateを行うと以下のエラーが発生してmigrateできない！**
LaravelのバージョンとPHPのバージョンの間に不整合があるため実行できないというエラーが発生しています。
（現在のバージョン**8.2**)
![スクリーンショット 2023-10-08 22.14.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/fb6e2689-1008-bd24-7577-126dc3f7bd1a.png)
PHP 8.0にグレードダウンするためPHP 8.0をインストールする
```
brew install php@8.0
```

シンボリックリンクを変更して、デフォルトのPHPバージョンとして設定
```
brew link --overwrite --force php@8.0
```
PHPのバージョンを確認
```
php -v
```
以下のようにバージョンが8.0に変更されたらOK。
![スクリーンショット 2023-10-08 22.58.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/14a2e1d0-b643-8b42-72ff-4d3cf9ece51e.png)

アプリのディレクトリに移動しmigrateを行う
```
php artisan migrate
```
何故か以下のようにバージョン**8.1**以上を求められた
![スクリーンショット 2023-10-08 22.31.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/478bfe61-0dad-85b3-00dd-765d383b5f27.png)
そこでバージョン**8.1**に変更してみましたが**8.2**の時と同じエラーが発生してしまいました。どういうこと？

**利用可能なPHPのバージョンを確認**

```
braw search php
```


![スクリーンショット 2023-10-08 22.40.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/858b4a98-d4c9-4249-7533-b815549565ce.png)
PHP 8.1: 現在インストールされており、アクティブになっているバージョンです。 (php@8.1 ✔ により示されています)
PHP 8.0: インストールされていますが、現在はアクティブではありません。(php@8.0 ✔ により示されています)
PHP 7.4: インストールされているバージョンです。(php@7.4 により示されています)
PHP 7.1, 7.0, 5.6: これらは非推奨としてマークされたバージョンです。

___________
ある依存パッケージがPHP 8.1を要求している一方、Laravel自体はPHP 8.1に完全に対応していないために起こっているようだったのでPHP 8.0を使用する必要があるので以下を実行。


**composer.lockとvendorディレクトリを削除**
```
rm composer.lock
rm -rf vendor/
```
**Composerの依存関係を更新**
このとき、PHP 8.0をターゲットとして指定します。
```
composer update --ignore-platform-reqs
```
--ignore-platform-reqsオプションは、現在の環境のPHPバージョンを無視して依存関係を解決します。これにより、PHP 8.1を要求するパッケージがインストールされるのを防ぎます。
再びmigrateを行う
```
php artisan migrate
```
この手順で、PHP 8.0の環境でLaravelのマイグレーションができます。
____________________


参考

https://ex1.m-yabe.com/archives/6952
CSSを初期化しないとどうなるか？

## なぜ知りたいと思ったか？
marginやpaddingを指定していないのに、要素と要素の間に余白ができているのが気になった


## 余白を指定していないのに、初めから余白が出来ているのはなぜか？
①ブラウザのデフォルトCSSを参照しているので、初めから余白が出来ている
下のWebページでは見出しタグしか設定していないが、margin-topとmargin-bottomが設定されている
![スクリーンショット 2023-08-17 131635.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/0c384332-d649-2790-78b9-8df4da31d088.png)

②ブラウザによってスタイルが違う
「Google Chrome」や「Safari」等のブラウザ毎にスタイルの表示方法が異なるので、CSSを初期化して設定し直す
以下のURLを確認すると、ブラウザによってスタイルが微妙に違う
https://gray-code.com/html_css/make-the-website-vol8/


## リセットCSSの機能とは？
デフォルトCSSを使ってリセットすれば、どのブラウザでも同じ表示方法で統一される


## リセットCSSの種類は2つある
①ほぼ全てのスタイルをリセットするタイプデフォルトCSSを完全にリセットするので、どうレイアウトするかをコーディングしやすくなる
②極力デフォルトCSSを残すタイプスタイルの形状を残りつつリセットできるので、1からコーディングする必要が無い


## 2種類のリセットCSSを使ってみる

①ほぼ全てのスタイルをリセットするタイプ
[destyle.cssを利用]
```destyle.css
<head>
  <meta charset="UTF-8">
  <title>CSS Cafe</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/destyle.css@3.0.2/destyle.css">
  <link rel="stylesheet" href="css/base.css">
</head>
```
見出しとなる太字までリセットしているので、CSSファイルでフォント調整する必要がある
![スクリーンショット 2023-08-17 141627.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/0cb3b34a-9493-3041-fe5b-f031ac2048b8.png)

②極力デフォルトCSSを残すタイプ
[A Modern CSS Resetを利用]
```A Modern CSS Reset.css
<head>
  <meta charset="UTF-8">
  <title>CSS Cafe</title>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/modern-css-reset/dist/reset.min.css">
  <link rel="stylesheet" href="css/base.css">
</head>
```
太字の機能を残しつつ、デフォルトの余白が存在しない
![スクリーンショット 2023-08-17 134030.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568357/48afda28-27dd-93cf-1e7f-65938db81acf.png)


## 調べてみて分かったこと
①ブラウザ毎に「デフォルトでスタイルをどう表示するか」が違うことを理解しておく
②どのブラウザで対応するかを明確にしてから、スタイルを指定し直した方が良いと思う
ソラナの最新アップデート：プライバシー機能強化でマネーロンダリング防止とユーザーの利便性向上を両立

レイヤー1のブロックチェーン技術を提供するソラナ（SOL）は、最近、そのバリデータクライアントをバージョン「1.16」へとアップデートしました。このアップデートはゼロ知識証明（zk-SNARKs）のサポートの強化とハードウェア要件の軽減を含む、多くの新機能と最適化の実装準備を提供します。これらの新機能は、今後段階的に展開される予定です。

この中でも特に注目すべきは「機密取引」の実装です。ソラナのトークン（SPL規格）の残高やトランザクション金額を「ゼロ知識証明」技術を使用して暗号化することで、取引の追跡や取引履歴を秘匿化することが可能になります。この機能が実装されると、利用者はCLI（コマンドラインインターフェース）を通じて、トークンの作成やトランザクションの設定が可能になります。さらに、ウォレットへのこの機能の導入も計画されています。

バリデータのハードウェア要件の軽減は、パフォーマンスの最適化とシステムの安定性向上をもたらします。zk-SNARKsのサポートの強化は、イーサリアムのスマートコントラクトとの互換性向上にも貢献する見込みです。

### プライバシー保護とデジタル通貨の運用
デジタル通貨の運用におけるプライバシー保護と、詐欺やマネーロンダリング防止に向けた安全なシステムの確立は、技術の普及において重要なテーマとなっています。イングランド銀行（BoE）は、一般利用を目指すCBDC（中央銀行デジタル通貨）プロジェクトにおいて、プライバシー保護手段として「ゼロ知識証明」の利用を計画しています。BoEは、個人の特定情報を共有せずに、CBDCアカウントに対する凍結、解除、削除などの対応を可能にすることを目指しています。

### ゼロ知識証明の探求
[ゼロ知識証明](https://www.nttdata.com/jp/ja/data-insight/2023/0724/#:~:text=%E3%82%BC%E3%83%AD%E7%9F%A5%E8%AD%98%E8%A8%BC%E6%98%8E%EF%BC%88zero%2Dknowledge,%E3%81%AA%E3%81%8F%E8%A8%BC%E6%98%8E%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93%E3%81%A7%E3%81%99%E3%80%82)は、証明（Proof）プロトコルの一種であり、証明者が「自身の主張は真実である」ということを検証者に対して、追加の情報を開示することなく証明するメカニズムです。

### 仮想通貨のプライバシー機能の動向
プライバシー機能の強化はユーザーに対して追加の安全性や取引の透明性を提供する一方で、取引所との関係にも影響を及ぼす可能性があります。バイナンスは今年5月に、プライバシー機能を有する暗号資産（仮想通貨）の取引を欧州市場で中止すると発表しました。EUでは、マネーロンダリング防止策として、プライバシー仮想通貨の取引制限が議論されています。

関連リンク:

**関連リンク:**
- [ソラナ公式ウェブサイト](https://solana.com/)
- [レイヤー1技術の説明](https://example.com/layer1)
- [ライトコインについて](https://example.com/litecoin)
- [バイナンスについて](https://example.com/binance)
- [バリデータクライアントの役割](https://example.com/validator-client)
Amazon EventBridgeスケジューラで完了したスケジュールを削除する

# はじめに
少し前のAWS UpdateでAmazon EventBridgeスケジューラのスケジュールをタスク完了時に削除する機能が追加されました。

https://aws.amazon.com/jp/about-aws/whats-new/2023/08/amazon-eventbridge-scheduler-deletion-completion/

これにより、スケジュール実行後に以後必要のないスケジュールを自動で削除することができます。

# Amazon EventBridgeスケジューラとは
一言で言えば、EventBridgeのスケジュール機能に特化したサービスです。
EventBridgeスケジューラが公開される以前は、定期実行と言えばEventBridge Ruleを利用した作りこみだったと思いますが、Amazon EventBridge スケジューラを利用することでより柔軟な定期実行のルール作りができるようになりました。
公式がEventBridge Ruleとの比較表を出しているので詳しくはそちらをご参照ください。
今後EventBridgeで定期実行の仕組みを作る場合は特別な理由が無い限りAmazon EventBridgeスケジューラが第一候補となると思います。

https://aws.amazon.com/jp/blogs/compute/introducing-amazon-eventbridge-scheduler/

# やってみる

Amazon EventBridgeのコンソールから「スケジュール」を選択し、「スケジュールを作成」を押下する。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/5cb9673d-909c-7401-022a-beafa8cb8e86.png)
スケジュールとターゲットの設定を行う。
今回は適当なLambda関数を作成し、Invokeする。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/cffb79b2-7e06-e979-f7bc-3da5fd439841.png)

最後にStep3の設定で、「スケジュール完了後のアクション」を「**DELETE**」とする。
この項目を設定することでスケジュール完了後にこのスケジュールが削除される。

![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/4ebaeea8-05b0-4333-3128-258f86780901.png)

設定したタイミングになるとLambda関数がInvokeされたのち、スケジュールが削除される。
![image4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675893/208ff279-29d1-3a5b-20bd-298415c27ebb.png)

AWS CLIでスケジュールを設定する場合は`--action-after-completion`オプションを使用して設定する。
`--target`のarnにはLambda関数のarnを指定し、RoleArnには対象のLambda関数をInvokeできる権限を持ったRoleを指定する。

```shell:例
aws scheduler create-schedule \
    --name delete-test-schedule \
    --group-name default \
    --schedule-expression "at(YYYY-MM-DDTHH:MM:SS)" \
    --schedule-expression-timezone "Asia/Tokyo" \
    --flexible-time-window '{"Mode":"OFF"}' \
    --target '{"Arn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXX:function:FUNCTION_NAME",
"RoleArn": "arn:aws:iam::XXXXXXXXXX:role/service-role/Amazon_EventBridge_Scheduler_LAMBDA_1814e"}' \
    --action-after-completion "DELETE"
```
https://docs.aws.amazon.com/cli/latest/reference/scheduler/
Virtual boxで立ち上げたCent7でGuest Additonsを使えるようにするまで（忘備録）

# はじめに
いつもやるけど，忘れちゃう．
その都度調べて，条件にあるやつを探すの面倒なので，まとめておく．
### 環境
- cent 7
- GUI環境（KDE Desktop）
- Virtual Box 6.1.16
- netowrkインターフェース
    -  アダプター1 NAT
    -  アダプター2 内部ネットワーク（今回は関係ない．）
### できるようになること
- ホストと仮想マシン(cent7)との間でマウスがシームレスに動かせる．（やらない限り，仮想マシンから出るには右のCtrを押す必要あり）
- ドラックアンドドロップなどが使えるようになるはず．
# 1 Cent7へのログイン
Cent7へのログインしましょう．
このとき，作っていれば普通のユーザとrootユーザがあるはず．
筆者は基本的には普通のユーザでログインしています．
※理由としては，rootユーザって権限が強くて，基本何でもできてしまう．
　なので，誤ったコマンド打ったときなんかの影響が計り知れない．スクリプトの実行時も...
　まあ，いろいろあるので，作業で必要なときのみrootにsuしています．
# 2 terminalの立ち上げと権限昇格
1. まずはGUIで「アプリケーション」をクリック
2. 次に「システムツールをクリック」
3. 「端末」をクリック
以上によりterminalが起動します．
### 背景色や文字色なんかを変えたい
そんな時は下記により変更
1. 「編集」をクリック
2. Prefencesをクリック
3. 文字のタブが開いていると思うので，色のタブをクリック
4. 「文字と背景色」のシステムのテーマ色を使用するのチェックを外す．
5. 文字，背景をそれぞれクリックし，好みの色に変える．
6. 右上端の×をクリック（画面上で見つからなければ，マウスでPreferencesの文字のあたりをつかみ移動させる．）
# 3 アップデートとインストール
```terminal:(terminal:root権限)
# yum update  -y kernel
```
上記が完了したら再起動を行う．
```terminal:
# reboot
```
起動してきたら，再度terminalを立ち上げ，root権限になり次へ．
# 3 アップデートとインストール
```terminal:(terminal:root権限)
# yum -y install bzip2 gcc kernel-devel kernel-headers make perl
```
しばらく待っていたら終わるはず．
# Guest Additonsをインストール
1. Virtual boxの「デバイス」をクリック
2. 「Guest Additons　CDイメージの挿入...」をクリック
3. 「場所」，「VBox_GAs_6.1.16」をクリック　（数字のところはバージョンにより変わります．）
4. 「ソフトウェアの実行」をクリック
5. 「実行する」をクリック
特に問題がなければ，errorなど表示されず，Press~というのが表示される．その後，再起動すれば反映されます．
# 確認
マウスを動かしてみて，CentとホストOSを行き来できるようになればOK！
# ついでに
一通り終わったら，Virtual Boxの「デバイス」の「クリップボードの共有」や「ドラックアンドドロップ」を設定すると便利
不要になったGuest AdditonsについてはremoveしてOK
# 最後に
良き，仮想マシンライフを！
監視設計入門1

# はじめに
監視システムとして有名なところとしては，Prometheusやzabbixなどがある．
それらの構築方法なんかはあったりするし，こういう設定をすれば監視を追加できるよみたいな手引書なんかもある．ただ，実際のインフラ・システム運用において使っていくと意外とどこを見ればよいのかというのは悩みどころ．今回はそんな監視設計についての導入編というところで基本的なところをお話をします．
考え方から書いていくので，回りくどいと思います．飛ばせるところは飛ばしてください．
# そもそも監視の目的ってなんだ？
　監視する目的とは何だろうか
+ アプリケーションの異常をみつける
+ インフラの異常を見つける

上記が恐らく想定される回答であろう．
だが，ここで立ち止まって考えてみてほしい．本当は***何のために***監視を入れようとしている？
監視の目的を考え，目標を決めておかないと，どうなるか．答えは，際限なくいれときゃいいだろうという監視が乱立したり，必要な監視ポイントが抜けるのである．
## 監視の目的，ついでに目標
いうまでもなく，提供したいものが提供できているか，定めさ仕様を満たしているかといった何らかの達成するべきものが満たせているかというのがポイントとなる．
二つほど例を出そう．
+ 例1 お客様に提供しているサービスが提供できているか
+ 例2 自社内で提供しているシステムが機能しているか

例1をWebサービスに例えてもう少し掘り下げる．
お客様が活用するECサイトの場合，お客様がアクセスしてきたタイミングで必要な応答ができることが重要になる．例えば，商品検索で長々と検索時間がかかったり，決済ページに飛ぶのにエラーが出まくったとする．そんなサイトだとお客様は離れてしまう．（そこでしか手に入らないなら別だろうが…）
それを考えると，この例においての監視の目的は
+ ECサイトの運営において，（お客様に許容していただける範囲内での）Webサービスレベルを維持する

ことと言うのが一例としてあげられる．
そしてそれを達成するための目標として
+ システム
    + Web
        + 応答速度
        + エラー頻度，内容
    + DB
        + 応答速度
        + ・・・
    + ・・・
+ インフラ
    + ネットワーク遅延
    + CPU,メモリ,
    + ・・・

といった感じで決まっていく．
ここがあいまいなまま適当に進めると，先に述べたように乱立したり，漏れが出たりする．
# 目的，目標の導出の仕方
まず，つまずきやすい厄介な目的の導出の仕方について．
## 目的導出
目的を決める際に，個人的に有効だなと思っているのは，きっかけに対して，***そもそもなぜやる必要がある？***というのを必要な回数だけ行うこと．
例えば，「Web監視で抜けがあったせいで気づかず，お客様からのクレームにより対応することになった」というものがあったとする．この時，漏れだけをカバーする監視を適用すればよいだろうか？それだけで解決することもあるかもしれないが，ここでは少し掘り下げてみよう．
1. Web監視を追加する必要がある．それはなぜか.
2. お客様がWebサービスを利用している際に不便があったため．
今回は1回でそれっぽいところに来た．
では，「お客様がWebサービスを利用している際に不便があったため」を解決するために目的を下記のように反転させ定めよう．
+ 反転前「お客様がWebサービスを利用している際に不便があったため」
+ 反転後「お客様がWebサービスを利用している際に快適に利用できるようにするため」
それっぽい監視の目的ができた．今度はそれに付随する目標を導出する
## 目標導出
目標を導出する際は，目的を達成するにはどうすればよいか考えていこう．この時，何が達成されていればOKであるかを考える．
考える際の切り口としてはすでに記述したように，システム，インフラに分けても良いし，自分なりの切り口を持って作っても良いと思う．
ここでは再掲しておく．
+ システム
    + Web
        + 応答速度
        + エラー頻度，内容
    + DB
        + 応答速度
        + ・・・
    + ・・・
+ インフラ
    + ネットワーク遅延
    + CPU,メモリ,
    + ・・・

目的，目標を定めたうえで，やっと監視の設計に入るのである．目標が漏れが少なく・具体的になっていればいるほど監視を実際に作って，導入した際に期待通りに機能してくれる．
なのでここの考える作業において手を抜かずやることをおススメする．
# おわりに
本記事は，監視設計をせざるおえないけど，何からすればよいのか，何をすればよいのかで迷っている人に最初に考えてほしい監視の目的や目標の必要性やその導出方法についての例を示しました．
困っている人の一助になれば幸いです
IBM Cloud: BIOS Boot order 変更方法&注意点

# はじめに
IBM Cloudのベアメタルでは、ISOファイルからブートすることが可能です。ただし、ISOブートするためにはBIOSのboot orderを変更する必要があります。
以下では、変更方法・注意点を記載します。

# 変更手順
変更手順は、払い出されたベアメタルの種類によって異なります。
Supermicro・Lenovoサーバーそれぞれについて記載します。

## Supermicroサーバーの場合
Caseにて依頼する必要があります。
Case作成時のトピックは以下を指定します。
- トピック：Bare Metal Server for Classic
- サブトピック：Other

以下、サンプル文 です。(ISO ブートしたい場合)

```
タイトル：request for changing boot order on "server name"

Hello,
We would like to boot from ISO.
Could you change boot order on "server name" as CD-ROM is top?

Best regards,
```
また、対象サーバーをCaseにアタッチしておくとサポート担当が作業しやすくなります。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/17b5d4b1-88be-85a6-aed1-0b5aed0ef166.png width=60%>

また、KVM ConsoleにてISOをマウントしていると、以下のようにISOを認識するブート・オプションに表示されます（この場合 `USB CD/DVD` に「Virtual CDROM」の表示があります）。
事前にマウントしておくことで、変更すべきブート・オプションをCase担当者が判別しやすくなります。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/38aa9869-3440-df3b-1518-13e3e77dcff5.jpeg width=70%>


## Lenovoの場合
Lenoboサーバーでは、モデルの種類によって対応が2つに分かれます。新しいモデルの場合は以下の対応となります。
新しいモデルのLenovoサーバーをオーダーしてKVM Consoleへアクセスすると、以下のような`Xclarity Controller`画面が表示されます。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/b5d9f1e7-c172-be0f-6c87-3976ec2cd492.png width=80%>

IBM Cloudポータル記載のリモート管理ユーザー/パスワードを入力してログインすると、ホーム画面が表示されます。
「Server Configuration」をクリックし、「Boot Options」をクリックします。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/b966254e-1cb8-9884-fb96-26b23667b89d.png width=80%>

変更したいboot optionを選択し、矢印にて優先順位を変更します。（上部が優先してブートされます）
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2199676/ae3a72f0-d32c-44e6-e3a9-d502c09b9c73.png width=80%>

「Restart server immediately」をチェックし、「Apply」をクリックして完了です。

:::note warn 
古い種類の場合は、Supermicroと同様にCaseで依頼する必要があります。
:::

# 注意点
### 1つのCaseで依頼するのは1,2台
一度に多くのサーバーの変更依頼をしますと、Case担当者が混乱してしまい、boot orderのミスや変更のし忘れにつながります。
一度に依頼する台数は1,2台としましょう

### エビデンスをもらう
上記のように、Case担当者の変更作業においてミスが発生する可能性があります。そのため、必ず作業後のスクリーンショットなど、エビデンスをもらうようにしましょう。
Raspberry Pi 4 Model B セキュリティ基本設定

# はじめに

Raspberry Pi 4 のリモート接続を構築した。
持ち歩くことも多そうなので、基本的なセキュリティ設定をしていきます。

# 実現したいこと

* Raspberry Pi をネットワークに接続する上で、最低限必要なセキュリティ設定を行う

# 環境

* 作業PC
  * OS：Windows 11 Home
  * Version：22H2
  * プロセッサ：11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz 3.00 GHz
  * RAM：16GB
* Raspberry Pi 4 Model B

# 最低限必要なセキュリティ設定

## 作業PC側で鍵を作成する

0. Windows PowerShell を開く
0. `ssh-keygen -t ecdsa -f .ssh/tkmsk-raspberrypi`を入力し、ECDSA暗号方式でtkmsk-raspberripiという名前の鍵を作成する
   パスフレーズは任意の文字を入力する

## Raspberry Pi に公開鍵を登録する

※`.ssh/authorized_keys`に公開鍵が既に登録されている場合は、手順6、8のみでOK

0. 作業PCのWindows PowerShellから`scp -P 22 .ssh/tkmsk-raspberrypi.pub tkmsk@raspberrypi.local:/home/tkmsk`を入力し、公開鍵をRaspberry Piに転送する
0. VNC でRaspberry Piに接続する
0. LXTerminalを開く
0. `mkdir ~/.ssh`を入力し、鍵を入れるディレクトリを作成する
0. `chmod 700 ./ssh`と入力し、`.ssh`ディレクトリのパーミッションを700(rootユーザーのみ読み/書き/実行可能)に変更
0. `cat tkmsk-raspberrypi.pub >> .ssh/authorized_keys`と入力し、公開鍵を登録する
0. `chmod 600 ./ssh`と入力し、`.ssh`ディレクトリのパーミッションを600(rootユーザーのみ読み/書き)に変更
0. `rm tkmsk-raspberrypi.pub`を入力し、tkmsk-raspberrypi.pubを削除する

## Raspberry Pi のssh設定を変更する

0. `sudo nano /etc/ssh/sshd_config`を入力し、sshd_configファイルを開く
0. `PasswordAuthentication`を`no`に設定する
0. `PermitEmptyPasswors`を`no`に設定する
0. `Port`を任意の数字(49152～65535の中のどれか)に設定する
0. `PermitRootLogin`を`no`に設定する
0. `PubkeyAuthentication`を`yes`に設定する
0. `AuthorizedKeysFile`を`.ssh/authorized_keys`に設定する

## Raspberry Pi のファイアウォール設定を変更する

* `sudo apt install ufw`を入力し、`ufw`をインストールする
* `sudo ufw status`と入力し、ファイアウォールの状態を確認する
  ※`inactive`でない場合は、`sudo ufw disable`を入力して`inactive`に変更する
* `sudo ufw default deny`を入力し、全ポートのアクセスを拒否する
* `sudo ufw allow <ポート番号>`を入力し、必要なポートのアクセスを許可する
  * VNC: 5900/tcp
  * ssh: (Raspberry Piで設定したPort番号)/tcp
  * インターネット通信の標準ポート: 80/tcp
  * SSL通信の標準ポート: 443/tcp
  * NTPサーバー時刻同期に使うポート: 123/udp
* `sudo ufw enable`と入力し、ファイアウォールを有効にする
* `sudo reboot`と入力し、Raspberry Piを再起動し、設定を反映させる

# 備考

## VSCodeのssh接続設定を変更する

* VSCodeのリモートエクスプローラーの設定ファイルを開く
* Raspberry Piの設定の`Port`をRaspberry Piに設定したポート番号に変更する
* Raspberry Piの設定の`IdentiyFile`に`~/.ssh/tkmsk-raspberrypi`を設定する
* Raspberry Piの設定の`IdentitiesOnly`を`yes`に設定する

# まとめ

これで最低限のセキュリティ設定ができたので、ある程度安心してネットワークにつないで使えるかなと思います。

# 参考

* [ラズパイ(Raspberry Pi 4B)をVisual Studio Codeでリモート操作する設定（備忘録）](https://www.mgo-tec.com/blog-entry-raspi4-vscode-ssh01.html/3#title06)
* [ラズパイでやらなければいけない４つのセキュリティ対策！](https://qiita.com/nokonoko_1203/items/94a888444d5019f23a11)
久しぶりにgithubでソース管理する手順【備忘録】

# 久しぶりにソース管理をしたいけどすべて忘れた。
日曜プログラマーを目指す私はこのような状況によく見舞われます。そのたびに仲間に聞いて何とかリポジトリを作るのですが、今回も進めていたプロジェクトがそろそろソース管理したい規模になってき為ついでに 手順を残していこうと思います。

# 現行のプロジェクトをワークスペース外に退避する
まずいま進めている途中のプロジェクがある場合はフォルダをデスクトップ等、gitクローンする予定の**フォルダ以外**のところに移動します。gitのリポジトリ名がの後プロジェクトフォルダ名になるため、同じフォルダ名が既にあるとクローンできなくなります。

# githubでリポジトリを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832106/9f656650-f71f-30e5-0dfc-c293ede5778d.png)
newボタンからリポジトリを作成し、名前をつけてリポジトリを作成する。
この時リモジトリ名がクローンした時のフォルダ名になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832106/c77dd751-15c6-ac5a-0961-89647ea62645.png)


# ローカルPCにクローンする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832106/003dc3d7-6963-8d53-8c2f-5c96792ab9b7.png)
作成されたリポジトリページからクローン用のリンクをコピーします。ワークスペースのフォルダでターミナルを開きしてクローンコマンドを使ってクローンするとリポジトリ名と同じ名前でフォルダが作成されます。
```
PS D:\WorkSpace> git clone https://[ユーザー名]:[アクセストークン]@github.com/xxxxxxxxx/xxxxxxxxxxx.git
```

# フォルダを確認する。
クローンをするとリポジトリ名でフォルダが作成されるので、中を確認すると隠しフォルダで```.git```ファイルが作成されている。

# ファーストのコミット
ここまでくるといつもと同じ身のgit環境になっていると思うので最初に退避していたプロジェクトフォルダの中身を```.git```ファイルと同じ階層にコピーしてきます。
フォルダが更新されるのでgit graphなどでコミットしてプッシュするとgithubでソース管理が進められます。
pycryptodome , RSA

<!--
2023/10/9
-->
[picoCTF][Cryptography][Mind your Ps and Qs]

## Writeup
* 素因数分解してくれるサイトがある。すげー。とりあえずnを素因数分解。

http://www.factordb.com/


* 素因数分解の結果
p = 1899107986527483535344517113948531328331
q = 674357869540600933870145899564746495319033
<br>

* 必要なライブラリをインストール
`pip install pycryptodome`
<br>

* ググって、ほとんどコピペしました。
pycryptodomeは初めて使いましたな。
~~~python:dec.py
from Crypto.Util.number import *

c = 62324783949134119159408816513334912534343517300880137691662780895409992760262021
n = 1280678415822214057864524798453297819181910621573945477544758171055968245116423923
e = 65537
p = 1899107986527483535344517113948531328331
q = 674357869540600933870145899564746495319033

phi = (p-1)*(q-1)
# eを-1乗して、phiのmod（余り）を計算
d = pow(e, -1, phi)
# 暗号文をd乗して、nのmod（余り）を計算
P = pow(c, d, n)

print(long_to_bytes(P).decode())
~~~
![answer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/075e3a9f-232f-725b-30ae-fd6c378034f1.png)
<br>

* 参考サイト
https://qiita.com/O-Jun/items/e7a5fd2c0046d3f7daf0
https://qiita.com/Anko_9801/items/14a45eddfa2c29a571d1
CyberChef, ROT13

<!--
2023/10/8
-->

とりあえず[picoCTF](https://picoctf.org/)に登録して、動作確認できそうな問題を探した。
## 動作確認(WirteUp)
* CyberChefの動作確認にができそうな[Cryptography]の[Mod 26]をやってみた。
[ROT13]って書いてある。そのままのやさしさに、安心感を覚える。
動作確認完了。ありがとう。
![cyberchef.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/9f66ea3c-f960-113f-3b73-e2668a7f1962.png)
<br>

* Kali linuxの動作が重たい。
メモリが95%以上使用していた。
memory 2GB -> 4GB に変更

----
追記：２０２３/11/08
* ROT13が明確であれば、コマンドで。
![screenshot 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160736/9d036614-fba9-8e7c-4e0d-27f2bbca6cb9.png)
```bash:ROT13
echo "cvpbPGS{arkg_gvzr_V'yy_gel_2_ebhaqf_bs_ebg13_MAZyqFQj}" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
```
<br>

* 以上です。
ロケールは英語のままで、manコマンドだけ日本語にする方法

# 概要

`man`コマンドを日本語にしたいが、ロケール設定は現在のままにしておきたい場合の方法を載せています。

想定環境は、`Ubuntu 22.04`です。

# manpages-jaの導入

`manpages-ja`は、[JM Project](https://linuxjm.osdn.jp/)が作成している`man`の日本語版です。`manpages-ja`は一般ユーザ向け、`manpages-ja-dev`は、開発者向けです。

両方インストールして問題ありません。

```sh
sudo apt update
sudo apt install manpages-ja
sudo apt install manpages-ja-dev
```

# manコマンドの日本語情報表示

`-L`オプションを使用する方法と、環境変数`MANOPT`を設定する方法の、2つがあります。

# `-L`オプション

`man`コマンドには`-L`というオプションがあり、これに`ja`を指定してやると、日本語になります。

```
man -L ja ls
```

# 環境変数`MANOPT`の設定

環境変数`MANOPT`に、`-L ja`を指定すると、いちいち`man`コマンドにオプションを設定する必要がなくなります。

```
export MANOPT="-L ja"
man ls
```

# 常に日本語表示する方法

ただし、`export MANOPT="-L ja"`を指定する方法は、ログアウトすると設定が元に戻ってしまいます。

常に日本語を設定したい場合は、`~/.profile`や、`/etc/profile.d/`で、環境変数を設定します。自分だけに設定する場合は`~/.profile`に記述し、サーバにログインするユーザー全てに設定する場合は、`/etc/profile.d/`以下にスクリプトを設置しましょう。

```
vi /etc/profile.d/man.sh

# 以下を入力し、保存
export MANOPT="-L ja"
```

あとはログアウトして再ログインするか、`source /etc/profile.d/man.sh`などで再読み込みすると、以後は常に`MANOPT`が設定された状態となります。

# 参考

* [linux - CentOS > 日本語環境でmanだけ英語で読みたい - スタック・オーバーフロー](https://ja.stackoverflow.com/questions/4268/centos-%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%92%B0%E5%A2%83%E3%81%A7man%E3%81%A0%E3%81%91%E8%8B%B1%E8%AA%9E%E3%81%A7%E8%AA%AD%E3%81%BF%E3%81%9F%E3%81%84)
* [manコマンドの日本語化 - Qiita](https://qiita.com/emiki/items/4bd859e359d99eb9d4c9)
* [manを日本語化する](https://zenn.dev/okz/articles/39d7faa7a6d59a)
shift-jisのURLにaxiosでpostする

```js
const axios = require('axios');
const Encoding = require('encoding-japanese');

function toSJIS(keyword) {
  const unicodeArray = Array.from(keyword, char => char.charCodeAt(0));
  const sjisArray = Encoding.convert(unicodeArray, { to: 'SJIS', from: 'UNICODE' });
  return Encoding.urlEncode(sjisArray);
};

async function test() {
    const keyword = 'あああ';
    const sjisKeyword = toSJIS(keyword);
    const data = `param1=${sjisKeyword}&param2=2`;
    const response = await axios.post('https://example.com/xxxxx', data, {
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded; charset=shift_jis'
      },
      responseType: 'arraybuffer',
      transformResponse: data => new TextDecoder('shift-jis').decode(data)
    });
    console.log(response);
}
test();
```
Kali , CyberChef

<!--
2023/10/7
-->

社内CTFで散々な結果だったので、CTFのお勉強を始めることにした。
とりあえず、がんばろっと。

* メモのとり方
[qiitaへの書き方](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)

## kali Linuxを使う方針
* とりあえずはKali Linuxをダウンロード

https://www.kali.org/get-kali/#kali-virtual-machines


* ログイン
kali * 2
<br>

* キーボードの設定を変更
アプリケーション（左上のロゴ）を選択
[keyboard]を入力、keyboardを選択
タブの右側にある[layout]を選択
[Use system defaults]をオフ
[Keyboard layout]から[Add]をクリック
[Japanese]を選択して[OK]
[English(US)]を[Remove]
[Close]
<br>

* とりあえずCyberChefを使用できるようしよう。
~~~:CyberChefのインストールと実行
sudo apt update
sudo apt install -y npm node.js
git clone https://github.com/gchq/CyberChef.git
cd CyberChef
npm install

npm start &
~~~
<br>

* ブラウザでアクセス
動きそうに見えました。どうだろ。
`http://localhost:8080`
<br>

* 参考サイト

https://github.com/gchq/CyberChef/wiki/Getting-started
応用情報を受けた感想（令和5年秋季）

本日（令和5年10月8日）、自身2度目となる応用情報技術者試験を受験してきましたので、自身の振り返りとして記事を書きました。
自分が実際にやった勉強法を反面教師にして、応用情報に取り組む人の一助になればと幸いです。

-試験を受けた感想
    -　午前試験
    →知らない用語が結構多かった印象、後半はかなり過去問からの出題も多く答えを覚えてればノータイムで回答できる問題も結構あった。　
    -　午後試験
    →選択科目にもよるが、自分としては結構難しかった。
    記述式の問題が多く感じた（個人の感想です。）


- 試験に向けて行った学習
午前
→過去問演習　過去10回分
 参考書　読み込み　1回通し　以降は、よく間違える部分を集中的に読み返した。

午後
→問題集を周回
重点対策とよく出るの選択科目を全問

試験直前には、復習メインで全体を見る感じ

-反省点
午前問題の対策が全然身についていなかった。
ほかの人の受験の振り返りを見て過去問演習をすればよいと漠然ととらえ、隙間時間（通勤中や休憩時間）を見つけて問題を演習していた。
過去問演習ができるアプリでやっており、よく間違えた問題やラッキー正解したものをマークしておく機能などあり、1通りやり終えてからそれらを重点的にやろうとしていた。実際にやっていた。
けれど、解いた後から時間がたちすぎて、実質初見の問題ですみたいになっていたことが多々あった。
また、問題数をこなすことばかりに目が行っており、復習などを軽視して実際の試験では、見たことある問題なのに解けないとか根拠を持って答えられないことがかなりあった。
ここはかなり公開している。
せっかく社会人の貴重なプライベートの時間をささげたにもかかわらず勉強のやり方ひとつで、ささげた時間の大半が無駄になってしまったような感覚を覚えた。
試験中の絶望感と虚しさは2度と味わいたくないと感じた。

午後の選択は、ネットワーク、システムアーキテクチャ、システム監査、サービスマネジメントを選択した。
事前の対策ではこれらの科目に加えてDBもやっていたが、当日見たときに時間がかかりそうだと判断したため選ばなかった。

-まとめ
正直しばらくは受けたくないという感情になっている。
午前の解答速報で見たところ、何とか午前は通っているようだが、午後は全く自信がない。

多くの人からしたら勉強の方法がよくなかったり、投入する時間が不足していると思うかもしれないが、自分の中ではかなり頑張った気でいる。

ただ、どれだけ時間を割いても頑張ったと自身が感じていてもそれは他人からしたら全くもってどうでもよいもので、試験に受かったかどうか、それだけが評価される点かと思う。

しばらくは資格試験から離れたい気持ちでいっぱいである。


とりあえず、今日はこんな感じで殴り書き
気が向いたら、結果とかもう少し詳細に書いたりするかも…
【VB.NET】アプリ起動時に実行されるフォームを変更する方法

開発環境：Visual Studio 2022

①プロジェクト > "プロジェクト名"のプロパティ を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/1f93c921-14b2-f149-e874-b67314f68e36.png)


②アプリケーション > スタートアップフォーム でアプリ起動時に実行したいフォームを選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3323019/c506607e-03eb-cdb1-d71f-1ad745d02ed8.png)
Webコーディング - (模写)PRサイト*7+PHOTO BOOK*1(2023/10/08)

2023/10/8

模写コーディング ・1カラム、プロフィールサイト

———————————
・全体のコーディング

↪︎まずはアイコン、リセットCSS、CSSを設置
<link rel=“icon” href=“”>
<link rel="stylesheet" href="https://unpkg.com/ress/dist/ress.min.css">
 
↪︎セクションの大枠をコーディングしていく
(クラス属性での分別のこの時に行う)

・CSSの大枠コーディング
@charset
html
body
a
img
li
.site-title
.site-title a
.section-title
.content-title
.wrapper

——————————
border-radius - 画像の角を切り取る

——————————
・Adobe XDで作成されたデザインカンプを元に作成

・フォント指定
「フォントファミリー名は、日本語フォント・欧文フォント、またフォント名にスペースを含む・含まずを問わず、ダブルクォーテーション（”）、またはシングルクォーテーション（’）の引用符で囲うことが推奨されています。」
(例)  font-family:”メイリオ”,”Meiryo”,sans-serif;

・line-height … 行間の高さ
・display: inline-block
・border-bottom
・object-fit: cover … 固定したエリアの中に画像を表示
・flex-direction: column

？section - secttionと入力ミスの為エラー
　↪︎Code Spall Checkerの導入

——————————第6回
・bodyで指定するカラーは全体で主要なもの
・サイトタイトル画像の幅、余白を指定
・セクションタイトルの配置とインラインブロック指定、余白調整
・コンテントタイトル、余白
・padding … 内側 margin … 外側 
・wrapperの中央寄せ

・ヘッダーのマージン
・ヘッダーulのmargin

・メイン画像100%幅に調整
・最大幅の指定
[クラス指定のmax-width:960がwidth:になっていた]

——————————第7回 
[作業時間]16:45~18:00
[メインCSS]
・imgの最大幅
・line-height調整
・.section-titleの下余白
・.wrapperの幅
[ヘッダー]
ヘッダーの外幅指定
[Mainvisual]
・メイン画像100%幅に調整
[About]
・flex-direction
[footer]
paddingで調整

—————————1カラムPHOTOBOOK Vol.1
[作業時間]18:45-21:00
・番号付きリスト ol 無し ul
>background-colorはbodyに指定
>img - max-width: 100%
>ヘッダーの文字高さ line-height: 1px
GradleビルドコマンドでJavaプロジェクトのビルドを効率化しよう

GradleはJavaおよび他の多くのプログラミング言語のプロジェクトのビルド、テスト、デプロイメントを自動化するためのパワフルなビルドツールです。この記事では、Gradleの主要なビルドコマンドについて解説します。

## 目次
1. [assemble](#assemble)
2. [bootBuildImage](#bootBuildImage)
3. [bootBuildInfo](#bootBuildInfo)
4. [bootjar](#bootjar)
5. [bootJarMainClassName](#bootJarMainClassName)
6. [bootRunMainClassName](#bootRunMainClassName)
7. [build](#build)
8. [buildDependents](#buildDependents)
9. [buildNeeded](#buildNeeded)
10. [classes](#classes)
11. [clean](#clean)
12. [jar](#jar)
13. [testClasses](#testClasses)

## assemble
プロジェクトのアーティファクトをアセンブルします。通常、このタスクはプロジェクトのビルド成果物を生成するために使用されます。これは主に、プロジェクトのソースコードをコンパイルし、アプリケーションやライブラリのアーティファクト（JAR、WAR、など）を生成します。

## bootBuildImage
Spring Bootプロジェクト用のタスクで、コンテナイメージをビルドします。Dockerなどのコンテナプラットフォームで実行できる実行可能なイメージを作成します。Spring Bootアプリケーションをコンテナ環境で実行する際に使用されます。

:::note warn
このタスクを実行するには、事前にDockerがインストールされている必要があります。
:::

## bootBuildInfo
Spring Bootプロジェクトで、ビルド情報を生成します。バージョン情報やビルド時のプロパティなどのメタデータを提供します。この情報はアプリケーション内で利用することがあり、デバッグやログ出力などで役立ちます。

## bootjar
Spring Bootプロジェクト用のJARファイルを生成します。Spring Bootの特別な設定を含む実行可能なJARファイルです。通常、このJARファイルはSpring Bootアプリケーションを実行するために使用されます。

## bootJarMainClassName
Spring Bootプロジェクトで、生成される実行可能なJARファイルのエントリポイント（mainメソッドを持つクラス名）を指定します。これにより、JARファイルが実行される際のエントリポイントが設定されます。

## bootRunMainClassName
Spring Bootアプリケーションを実行する際に、エントリポイントとして使用するmainクラスの名前を指定します。Spring Boot DevToolsなどのツールを使用する際に役立ちます。

## build
プロジェクト全体をビルドします。ソースコードのコンパイル、テストの実行、アプリケーションやライブラリの生成などが含まれます。通常、プロジェクトをビルドする際に最もよく使用されるコマンドです。

## buildDependents
プロジェクトの依存関係を持つすべてのプロジェクトをビルドします。マルチプロジェクト構成で使用され、依存関係のあるプロジェクトを連続してビルドする場合に便利です。

## buildNeeded
必要なプロジェクトをビルドします。依存するプロジェクトだけでなく、ビルドが必要なプロジェクトも含みます。無駄なビルドを避け、最小限のビルドを実行するのに役立ちます。

## classes
ソースコードをコンパイルし、クラスファイルを生成します。ビルドプロセスの一部として、ソースコードをバイナリコードに変換するために使用されます。

## clean
プロジェクトの一時ファイルやビルド成果物を削除して、プロジェクトをクリーンアップします。ゴミファイルを削除し、ビルド環境をリセットするのに便利です。

## jar
JARファイルを生成します。通常、これはアプリケーションやライブラリのアーカイブに使用され、Javaアプリケーションを配布する際に利用されます。

## testClasses
テストソースコードをコンパイルし、テスト用のクラスファイルを生成します。テストの実行に備えてテストケースを準備するのに役立ちます。


## まとめ

この記事では、Gradleのビルドコマンドについて詳しく説明しました。これらのコマンドを理解し、プロジェクトに適切に適用することで、Javaプロジェクトのビルドプロセスを最適化し、効率化するのに役立つでしょう。