OmniAICreator/Qiita-1.07M huggingface dataset:
活性化関数って何？

>[初めに](#初めに)
[sigmoid関数](#sigmoid関数)
[tanh関数](#tanh関数)
[relu関数](#relu関数)
[softmax関数](#softmax関数)
[終わりに](#終わりに)

# 始めに
 　これまで様々な関数が出てきました。[損失関数](https://qiita.com/Lapinna/items/152c75f43682e72ae225 "損失関数ってなぁに?")や[最適化関数](https://qiita.com/Lapinna/items/d5c331b74c99767ca04a "AIを調べるとよく出てくる最適化関数とは何ぞ？")といったモノたち、強敵でしたがここまで来たあなたなら次の関数も分かるはず!
　なんと今回の関数でAIに使われている関数の紹介が終わります。
　そして、今回解説する関数は……活性化関数です!
　活性化関数は損失関数や最適化関数とは比べ物にならないほど数があるため、今回は代表的な関数を4つ解説していきます。

では、たくさんあるとされている活性化関数とはいったい何でしょうか？

一言でいうと、活性化関数とは各層の出力の前に使うことで、値を最適化することができる関数です。
イメージとしては、フィルターの役割に似ています。
# sigmoid関数
```math
 f(x) = \frac{1}{1+e^{-x}}
```
![ｌ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163792/2af4791c-b710-c570-535b-6d46bcf05653.png)

　sigmoid関数は、値を必ず1から0の間に変換することのできる関数です。
　値が必ず0～1の間になるということは、その値を確立としてみなすことができます。
　これらの特性を生かして、主に二値分類の最終層に使われたりします。

# Tanh関数

```math
 f(x) = \frac{e^x-e^{-x}}{e^x+e^{-x}}
```
![tanh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163792/b24d345c-c052-1ea9-965d-bc44b317658b.png)

　Tanh（ハイパボリックタンジェント）関数は、値を必ず1から-1の間に変換することのできる関数です。
　また、Sigmoid関数では値の変動が0～1までの間しかないため微分係数を求めた際の最大値が0.25しかなく、なかなか学習が進まない問題がありましたが、Tanhの場合は微分係数の最大値が1となり、学習を進めやすくすることができるようになりました。

# ReLu関数
```math
f(x) = \left\{
\begin{array}{ll}
x & (x > 0) \\
0 & (X \leq 0)
\end{array}
\right.
```
![ReLu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163792/d1754f7e-82c7-1719-7a86-34baa6625c57.png)

　ReLU（レクティファイドリニアユニットまたはランプ）関数は、値がマイナス域の場合は0を出力し、プラス域の場合はそのまま出力する関数です。
　この特徴を生かして、マイナスの値があると不都合となる問題（画像に関わる問題など）に使用されることが多いです。

# Softmax関数
```math
 f(x) = \frac{\exp(a_x)}{\sum_{i=1}^a exp(a_i)}
```
![Softmax.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3163792/bb955b02-1708-11e7-5b6e-3c589e3af35b.png)

　softmax関数は、入力された項目毎に出力される値が変わり、それらすべての値を足し合わせると必ず1になるようにな関数です。
　softmax関数は今回紹介する中で一番数式が複雑です。注意点として、softmax関数のみ入力された値に応じてグラフの形も変わります。
　また、すべての値は必ず0～1の間（確率）になります。

# 終わりに

これであなたも関数マスターです！
　
　
　
　
え？実感がわかないって？
　
ならば試しに、道行く少女に関数の説明をしてみなさい。
さすればあっという間に通報されることでしょう。

記事作成:Y&N
ansibleでのユーザ削除用playbook

ansibleでのユーザ削除コマンド

実行コマンド

```
ansible-playbook -i 192.168.2.180, userdel_playbook.yml
```

playbookの中身
```
---
- hosts: all
  become: yes
  tasks:

  - name: Add user 'example-user'
    ansible.builtin.user:
      name: test001
      state: absent　
      remove: yes

```

実行結果

```
PLAY RECAP **************************************************************************************************************************************************
192.168.2.180              : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

ユーザが存在しないで再度実行した場合
changed=0になる

```
PLAY RECAP **************************************************************************************************************************************************
192.168.2.180              : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
```

state の説明を追記
https://tekunabe.hatenablog.jp/entry/2019/03/03/ansible_user_intro
【祝安定化】once_cellについて

https://github.com/rust-lang/rust/issues/74465

:tada:`once_cell`がRust 1.70で安定化されます！:tada:

というわけで今回はそのonce_cellとstaticについて述べていこうと思います。

----

# once_cellとは？

----

そもそもonce_cellとは何かというと「一度しか初期化できない」型を提供してくれます。今回安定化されるのは以下の三つの型です。
- [`core::cell::OnceCell`](https://doc.rust-lang.org/core/cell/struct.OnceCell.html)
- [`std::cell::OnceCell`](https://doc.rust-lang.org/std/cell/struct.OnceCell.html)
- [`std::sync::OnceLock`](https://doc.rust-lang.org/std/sync/struct.OnceLock.html)

2番目は1番目のre-exportだけなため、実質二つの型であり、また1番目と3番目の違いは同期版と非同期版のため実質的な違いはありません。
これらはもともと[`once_cell`というcrate](https://docs.rs/once_cell/latest/once_cell/)にいたものです。

----

`OnceCell<T>`の目的としては、「不変参照だけど初期化が一度だけ行われることを保証すること」です。
Rustは不変参照では、「不変」の名の通り、変更を加えることはできません。ただ設定などを使いまわす場合、可変参照だと取り回しが悪いことがあります。また初期化することを遅延させたいことがあります。そういった時に使うことを目的としています。

----

## `OnceCell`の中身

----

内部はどうなっているでしょうか。`OnceCell<T>`の場合、中身は単純な`UnsafeCell<Option<T>>`になっています。(`OnceLock<T>`はLockのため多少複雑になっています。)
`OnceCell`には`set`メソッドがあり、ここで初期化をすることができます。
この関数では内部で初期化されているかを調べて、されていなかったら初期化するという単純な処理をしています。

----

これだけのことにこんな大げさにwrapしないといけないのは、Rustが不変参照での変更を認めていないことで静的な保証をしているからです。`OnceCell`はこの不変性の破壊を内部でwrapしてくれます。不変性の破壊が許されるのは、一度しか初期化されないと定義して、それ以外は`Err`で返すようにしているからです。

----

# `OnceCell`の使い道

----

## `static`の制限

----

さて、Rustにおいて設定などの情報を使い回すとき、主に

- 一番上の関数で初期化して、呼び出す関数に伝播させて参照や`Arc`として持ちまわす。
- staticに入れてしまう。

の二通りがあると思います。
このうち二番目の方法でよくぶつかるのがstaticの制限になります。

----

Rustの`static`には他の言語とくらべ制限が多いです。
まず可変な`static mut`はunsafeです。それはRustがスコープで所有権や可変性などを解析するうえでグローバルスコープな`static`はどこで変更されるかを保証できないからです。
また定数で初期化する必要があります。
これは`static`の変数は入れ物であって、例えば動的に値を入れるとなったときどのタイミングで初期化の処理が走るかを制御する必要がでるのですが、それを言語的に一つに決めるのはできないからだと思われます。なので静的(コンパイル時)に値が決まるようにしてあります。

----

## `static`と`OnceCell`

----

先ほどの制限で定数で初期化することが難しいのは初期化のタイミングの制御を言語的には決めれないからでした。なのでユーザーが決めるためには最初に場所だけ確保して後で値を入れてあげればいいです。つまり`OnceCell`を使えばいいのです。
初期化タイミングをユーザーが好きなタイミングで`set`してやればいいのです。
更に`OnceCell::set`は不変参照でも初期化するようにしてあるので`static`の制限を受けなくて済みます。

----

## `LazyCell`

----

ユーザーがわざわざ初期化タイミングを指定する必要がなくて、最初にアクセスしたときに初期化されていればいい場合があります。その時には`std::cell::LazyCell`があります。これは内部的に`OnceCell`を抱えて、値がなかったら握っている関数で勝手に初期化するという仕組みです。ただこれは1.70.0では安定化されないです…。デザイン上の問題としてgenericsの型をどうするかという問題があるのでそれさえ解消されれば安定化されるはずでしょう。
この型は`once_cell`crateにはいるのでそちらを使っている人も多いと思います。

----

# まとめ

- `OnceCell`は一回だけ初期化されるということを利用して不変参照でも初期化できるよ。
- `static`と相性がいいよ。
- 今回安定化されない`LazyCell`も便利だよ。
WSLで構築したUbuntuにpostgresSQLをインストールする方法と初期設定

postgresSQLをUbuntuに入れる方法に少してこずったので、備忘録として記載します。
あまり技術力は高くないので、お手柔らかに:persevere:
分かりやすく、読みやすくを目指します！

## 前提条件
* WSL上にUbuntuをインストールしている
* Windows11

それでは行きましょう！

## rootパスワードを設定していない場合
設定していない場合、まずはrootパスワードを設定しておきましょう。
WSLのUbuntuを起動します。
rootユーザにスイッチ
    
    sudo su

以下のコマンドでパスワードを設定

    passwd

システムが新しいパスワードを二回求めます。二回とも同じパスワードを入力してください。
パスワードを設定したら、以下のコマンドを入力してrootユーザーから元のユーザーに戻ります。

    exit

## インストール
サーバーのローカルパッケージインデックスを最新に更新します。

    sudo apt update

追加のユーティリティと機能をいくつか追加する-contribパッケージとともにPostgresパッケージをインストールします。

    sudo apt install postgresql postgresql-contrib

これでインストールはできたはずです。

## 起動
postgresSQLを起動するには以下のコマンドを実行してください。
  
    sudo service postgresql start

起動しているか確認するには、以下のコマンドを実行してください。

    sudo service postgresql status

## 設定の前準備
まずはデフォルトで作成されているpostgresユーザでpostgresにログイン

    sudo -u postgres psql

Ubuntuのユーザに権限を与えます。

    CREATE ROLE ユーザ名 LOGIN CREATEDB;

ここで、CREATE ROLEは新たなロールを作成するコマンド、LOGINはそのロールがデータベースにログインできることを指定、CREATEDBはそのロールが新たなデータベースを作成できることを指定しています。

以下のコマンドでpostgresSQLを終了します。Ubuntuに戻ります。

    /q

今度はUbuntuのユーザでpostgresSQLにログインします。

    psql -d postgres

これでUbuntuのユーザでpostgresSQLのテーブル作成や操作ができます。

## おまけ：ターミナルプロンプトの違い
psqlコマンドラインツールでは、プロンプトがpostgres=#かpostgres=>かで、現在のユーザーの権限を示しています。

* postgres=#：現在スーパーユーザーまたは特権を持つユーザー（例えば、データベースの所有者）としてログインしています。このユーザーは、データベースの作成、削除、ユーザーの追加など、全ての操作を実行できます。
* postgres=>：現在一般ユーザーとしてログインしています。このユーザーは限定的な権限しか持っておらず、主にデータの参照や更新を行います。

なお、これらのプロンプトはデフォルトの設定であり、設定により変更することも可能です。それぞれのプロンプトがどのような権限を示しているかは、現在のデータベースやユーザーの設定に依存します。


## 参考
https://www.digitalocean.com/community/tutorials/how-to-install-postgresql-on-ubuntu-20-04-quickstart-ja#1-postgresql
高精度点測定532nm緑色レーザーダイオードモジュール

ユーザーにとって高精度な距離の点合わせを行うのに適した作業は何ですか? 近距離や遠距離、その他の高照度の作業機会などに関係なく、緑色レーザーダイオードモジュールの高輝度デバイスを適用するのは常に簡単です。 高度な 532nm 緑色 DPSS レーザー技術と、耐久時間の長い金属製ハウジング チューブ内の認定ガラス コーティング レンズに基づいて、最高品質の緑色 レーザー光源の発光とさまざまな作業面への高レベルの精度の緑色 点投影を常に可能にします。
AC/DCアダプターの使用により、アルカリ電池交換に余分な時間を費やすことなく、532nm緑色レーザーダイオードモジュールの純正使用により、常にかなり長時間動作します。 高度な 532nm 緑色 DPSS レーザー技術を適用しており、5mW ～ 100mW の広範囲の出力を実現します。 100V～240Vの広範囲の電流を受け入れる場合、5V、9V 1000mA DC電源を正しく変換した後、この緑色点レーザーは常に良好に動作し、数マイル離れた場所でも一定の緑色レーザービームを放射します。
https://www.berlinlasers.com/ja/532nm-green-laser-diode-module
さらに、太陽光を使用せずに高照度で長距離の動作下でも、適切な出力パワーで作られた 532nm 緑色レーザー ダイオード モジュールは、常に視認性の高い緑色レーザー ビームを数マイル先まで投影します。 耐久性の高い陽極酸化アルミニウム合金ハウジングチューブの内側に、認定されたガラスコーティングされたレンズとガラスウィンドウを適用します。 広範囲の動作温度で動作する場合や、機械の移動や衝撃などの過酷な作業環境でも、これらの緑色 点 レーザーは、信頼性の高いパフォーマンスと非常に鮮明な緑色 点投影で、さまざまな原材料加工作業に適しています。 
![532nm-green-laser-diode-module-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2584281/4d58056e-8d6d-d590-cb9a-4041f85942eb.jpeg)

APC、ACC駆動回路基板に基づいて、どのような出力電力が選択されても、532nm緑色レーザーダイオードモジュールは一定の出力電力と電流供給で良好に動作します。 過熱や過電流の影響を受けず、チューブの焼損や破損の可能性が低くなります。 どのような種類の作業面を指していても、ユーザーが強力な緑色レーザー放射と熱エネルギーが目を痛めることを認識し、正しい 532nm 波長を防止するレーザー安全メガネを着用している場合にのみ、この工業用アライメントレーザーはユーザーに高度な安全性と正確な点表示を提供します。 産業分野とハイテク分野の両方。
タスク定義の環境変数をParameter Storeで管理する

## はじめに
ECS on Fargateの学習の為、サンプルアプリをデプロイしました。今回はタスク定義で設定している環境変数の値をParameter Storeで管理できるように設定していきます。

### サンプルアプリの構成
Rails(コンテナ)、Vue(S3)、MySQL(RDS)、Nginx(コンテナ)
CI/CDパイプラインは使用せず、手動で各種設定、デプロイを行います。

## やること
1. Parameter Storeで環境変数を設定
1. 新規のタスクロールを作成(Parameter Storeにアクセスできる)
1. タスク定義の更新
1. サービスの更新

## 現在のタスク定義の環境変数
タスク定義ではコンテナの環境変数が定義できます。DBに関する値をキーに直接値で設定しています。あまりセキュアとは言えません。**※画像の値はフェイクです。**

![スクリーンショット 2023-05-22 16.45.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/80af29cb-5ffd-2d62-15d9-a5a14f22899b.png)

## Parameter Storeで環境変数を設定
今回は機密情報であるDB_USERNAME、DB_HOST、DB_PASSWORDを設定します。
コンソールから「Systems Manager > パラメータストア > パラメータを作成」の順に選択します。
画像では、DB_USERNAMEを設定しています。値には改行やスペースが入らないように気をつけてください。
![スクリーンショット 2023-05-22 17.02.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/079ac2b8-c9bd-c8e2-7247-344d8b993e9c.png)


## タスク実行ロールにParameter Storeにアクセスできるポリシーを追加
現時点のタスク実行ロール(ecsTaskExecutionRole)にはParameter Storeにアクセスするポリシーがありません。新しいロールを作成し、ecsTaskExecutionRoleで設定されてるポリシー(AmazonECSTaskExecutionRolePolicy)とParameter Storeにアクセスできるポリシーを追加します。

### Parameter Storeにアクセスできるポリシーを作成
「ポリシーを作成」を選択してください。
1.サービスを選択
Systems Managerを検索して選択します。
![スクリーンショット 2023-05-22 17.34.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/247c94fc-256b-f009-af46-f09e1e73b6eb.png)


2.アクション 許可
GetParametersを検索して選択します。 ※**GetParameterではありません**
![スクリーンショット 2023-05-22 17.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/3856bcb1-112d-2360-faad-3e60a275f1fd.png)

3.ARAの追加(青太文字)
使用するアカウントとリージョンを指定したら、ARNを設定します。(Parameter Storeのパラメータ名)
DB_USERNAME、DB_HOST、DB_PASSWORDの3つのARNを追加しました。
![スクリーンショット 2023-05-22 17.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/a06ab181-f4f3-b202-61b7-25bb86522d69.png)


4.名前
今回は「ecs-systems-manager-policy」に命名しました。これでポリシーは完成です。

### ロールの作成
「ロールを作成」を選択してください
1. ユースケース
「他の AWS のサービスのユースケース:」から「Elastic Container Service」検索して「Elastic Container Service Task」を選択します。
![スクリーンショット 2023-05-22 18.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/b34b5fb3-0598-7f75-4ea3-00e67b255ca5.png)


2.許可を追加
作成したポリシーとAmazonECSTaskExecutionRolePolicyをポリシーを選択します。

3.名前
今回は「task-execution-role」に命名しました。これでロールは完成です。

## タスク定義の更新
1.環境変数の修正
値のタイプを「valuefrom」、値をParameter Storで設定したパラメータに変更します。
![スクリーンショット 2023-05-22 18.31.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485354/3eead0eb-8b6d-4519-030a-b4be097bebb8.png)

2.タスク実行ロールの変更
タスク実行ロールを作成したロールに変更します。これでタスク定義を更新しました。


## サービスの更新
新しいリビジョンを選択します。これで作業は終了です。
やんわり現場メモ#2【Oracle編】

## はじめに
初心者エンジニアということで優しい目で見てください。
（間違っていたら直したいので教えてください）
今回は参画先現場でSQLを使用する際に、新たな関数や注意点についてになります。

## 目次
<dl>
  <dt>●初めて見たやつ</dt>
<dd>・DECODE</dd>
<dd>・列名 IN (1,2,3,...)</dd>
<dd>・ROWNUM</dd>
<dd>・LPAD(列名 ,桁数 ,追加する文字)</dd>
<dt>●勘違い/混同していたこと</dt>
  <dd>・CASE文の書き方</dd>
  <dd>・SUBSTRの文字指定</dd>
  <dd>・= NULLではなく、IS NULL</dd>
</dl>

## 初めて見たやつ

##### DECODE
条件分岐に使用する。
現場ではDECODEにしてくださいと一度指示が出たが、処理速度の問題でCASE文に変更になった。
```sql:構文/例文
-- 構文
DEOCDE(列名,'比較対象1','返す値1','比較対象2','返す値2',....'その他')

-- 例文
DECCODE(sample.color,'red','赤','blue','青','緑')
-- sampleテーブルのcolor列が、「red」なら「赤」、「blue」なら「青」、その他なら「緑」を返す。
```

##### 列名 IN (1,2,3,...)
条件を絞るときに使う。
特定の列で多くの値を指定する際に楽。
```sql:例文
SELECT * FROM sample WHERE key_no IN ('1','2','3');
-- sampleテーブルのkey_no列が、「1」「2」「3」のレコードを取得する。
```

##### ROWNUM
勝手にレコードに採番してくれてるやつ
単体テストの際、データが数千レコードあったが100レコードの確認でよかったので使った。
```sql:例文
SELECT * FROM sample WHERE ROWNUM <= 100;
-- sampleテーブルのレコードを100行取得する。
```
order by で並び替えてから採番させたい場合サブクエリで並び替えたレコードを取得してからROWNUMで絞り込むと指定した順番通りで出力される
```sql:例文
SELECT * FROM (SELECT * FROM sample ORDER BY key_no;) WHERE ROWNUM <= 100;
-- sampleテーブルのレコードをkey_noの順番で100行取得する。
```

##### LPAD(列名 ,桁数 ,追加する文字)
左側に指定した文字を指定した桁数追加する。
レコードによって桁が違っているものをそろえるのに使った。
```sql:例文
SELECT LPAD(branch_no,4,0) FROM sample;
-- sampleテーブルのbranch_no列が、4桁になるように左側に「0」を追加してbranch_no列を取得する。
```

## 勘違い/混同していたこと

##### CASE文の書き方
間違えではなかったけど、めんどくさい書き方になっていた。
```sql:例文
-- 自分
CASE
    WHEN sample.color = 'red' THEN '赤'
    WHEN sample.color = 'blue' THEN '青'
    ELSE '緑'
END;
-- 簡単に
CASE sample.color
    WHEN 'red' THEN '赤'
    WHEN 'blue' THEN '青'
    ELSE '緑'
END;
```

##### SUBSTRの文字指定
全体の文字数目~全体の文字数目という書き方で間違えてしまっていた
```sql:構文/例文
-- 構文
SUBSTR('文字列','全体の何文字目から','何文字目まで切り抜くか')

-- defを切り抜きたい場合
-- 誤
SUBSTR('abcdef','4','6') 
-- 正
SUBSTR('abcdef','4','3') 
```

##### = NULLではなく、IS NULL
普通に勘違いしてた
```sql:例文
-- 誤
CASE
    WHEN sample.flg = NULL THEN '無'
    ELSE '有'
END;
-- 正
CASE
    WHEN sample.flg IS NULL THEN '無'
    ELSE '有'
END;
```
[小ネタ] NewRelic ドキュメントの折りたたまれている部分を全部表示する


# 環境
- Chrome: 113.0.5672.126
- Tampermonkey: 4.18.1

# ドキュメントが折り畳まれていて俯瞰しにくい

特にリファレンス系は項目単位で以下のように折りたたまれているため、
上からざっと目を通したい場合に、ひとつひとつポチポチやるのがものすごくシンドい・・・

https://docs.newrelic.com/jp/docs/apm/agents/java-agent/configuration/java-agent-configuration-config-file/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97890/eef49b94-ec6c-d127-fbf5-5c4b3c818192.png)

NewRelic についてググっているとき、公式ドキュメントが表示された瞬間に `Ctrl + F` でキーワード検索しようとすると、DOM の非表示になっている部分のテキストが検索に反応しないのも不便です。

# Tampermonkey の UserScript で無理やり全部開く

[Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja) の UserScript で無理やり開くように設定します。

`setTimeout` にしているのは、NewRelic 本家が仕込んだ DOMContentLoaded のハンドラが動いて div をゴニョゴニョしてるっぽいからです。
(即適用すると、本家 JavaScript に上書きされて全部の要素が閉じてしまう)

更新タイミングがうまく噛み合わない場合は `@run-at context-menu` にして、任意適用にしても良いかもしれません。

```js:expand_newrelic_doc_accordion_blocks.js
// ==UserScript==
// @name         Expands NewRelic document accordion blocks
// @namespace    https://github.com/takeyoda/
// @version      0.1
// @description  Expands NewRelic document accordion blocks
// @author       takeyoda
// @match        https://docs.newrelic.com/*
// @grant        none
// @run-at       document-idle
// ==/UserScript==

(function() {
  'use strict';
  setTimeout(() => {
    document.querySelectorAll('div[aria-hidden=true]').forEach(c => c.parentElement.style.height = '');
  }, 1000);
})();
```

# 追記
少し待っていると、本家の JavaScript によって `Ctrl + F` に反応してすべての要素が visible になるようなイベントハンドラが組み込まれる模様。
全部開きたければ `Ctrl + F` してねって感じなのかな？
「パッと開いて検索して、マッチしなければブラウザバック」って感じだから、遅いんだよね。
(setTimeout しているから、その点ではこの UserScript も同類だけど)
ネットワーク～お役立ちサイト～

# はじめに
エンジニアとして調べものする機会はどの技術分野でもあるかと思いますが、
今回はネットワークの設計・構築やら運用で、活用しているサイトを紹介したいと思います。

# サブネットマスク早見表
論理設計におけるセグメント割当範囲の確認、ホスト数算出だったりで
サブネットの切り方がすぐに計算できるサイトがありますので紹介します。

* __サブネットマスク計算（IPv4)__
https://note.cman.jp/network/subnetmask.cgi

下記は、サイト活用例です。
（1）IPアドレスに「10.10.10.10」を入力
（2）サブネットマスク「/17」を選択
（3）サブネット計算実行

![サブネット速水.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537417/06abd138-38e8-50e1-5a9c-357d2107b072.png)

計算結果には、
ネットワークアドレスやブロードキャストアドレス、ホストアドレスの範囲・アドレス数が表示されます。

* 頭で計算するより早い
* プレフィックス長とサブネットマスクの紐づけがわかる（/17は255.255.128.0ね！とか）
* NWをサブネット化する際に、範囲被ってないよね確認ができる
* NW機器へのIP設定やACL設定でセグメントやサブネット間違ってないよね確認ができる
という理由でよくよく使っています。

# サブネットマスク・ワイルドカードマスクの対応表
ワイルドカードを使う機会は限られているんですが、パッと確認したい。
その際に活用しているサイトを紹介します。

* __サブネットマスク・ワイルドカードマスクの対応表と説明__
https://infrastructure-engineer.com/tcpip-basic-0003/

下記は、サイト内の対応表です。

![wild.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537417/690c3e4f-72f7-a3d6-40d7-4eb3fe648ada.png)

NW機器のACL設定やACL制御状況（セグメント）を確認する際に使っています。
省エネセルフチェック用です。

# 電源計算
これは電源設計のたびに毎度確認しているサイトです。
NW機器の電源仕様から計算。（V＝ボルト、A＝アンペア、W＝ワット）

* __[電気ガイド](https://www.tepco.co.jp/ep/private/guide/detail/volt.html#:~:text=%E9%9B%BB%E5%8A%9B%EF%BC%88W%EF%BC%89%EF%BC%9D%E9%9B%BB%E5%9C%A7%EF%BC%88,%E5%8D%98%E4%BD%8D%E3%81%8C%E3%83%AF%E3%83%83%E3%83%88%E3%82%A2%E3%83%AF%E3%83%BC%E3%81%A7%E3%81%99%E3%80%82 "電気ガイド")__


手配した電源容量を超えないようにNW機器を設置・配置するために使っています。

# NW技術・用語系
分からないことはまずネットで調べる！でよく見るサイトです。
機器固有の機能仕様とかはメーカサイトが一番ですが、ざっくり知りたいときに使います。

* __「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典__
https://wa3.i-3-i.info/word12194.html
![piyo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537417/6b1ef5e2-65fe-8ee1-c84b-506b5f8e8537.png)


* __3分間ネットワーキング（3Minutes NetWorking）__
http://www5e.biglobe.ne.jp/~aji/3min/
![route.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537417/2eb8604a-5651-f129-61a0-fda7cdf9b425.png)

どちらのサイトも緩い感じで説明してくれるので、用語が頭に入りやすいです。
3分間ネットワークキングは日経ネットワークでも連載しているようです。

* __ネットワークエンジニアとして__
https://www.infraexpert.com/
![LB2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/537417/9b7593ab-a7ce-0961-bb53-76510c6a6431.png)


NW技術に特化したサイトです。L2～L3、L7で使われる技術が載っています。
Cisco系の情報は多いですが、他メーカのFWとかLBとかも載っています。
機器を設定する時の参考や、機能理解に役立ちます。



以上、お役立ちサイトの紹介でした。
ではまたの機会に。m(_ _"m)
C#で別EXEをパラメータ渡しで実行する

# 1. はじめに
* C#で別ソリューションのEXEを起動したい
* 起動する時にパラメータ渡しで必要な情報を連携したい

# 2. 開発環境
* C#
* .NET 6
* Visual Studio 2022
* Windows 11

# 3. ソースコード
```Csharp
// 外部EXEを起動する
private void Button1_Click(object sender, EventArgs e)
{
    // 外部EXEを起動する
    var info = new ProcessStartInfo("notepad")
    {
        // コマンドラインパラメータを指定する
        ArgumentList =
        {
            @"C:\\tmuninst.ini"
        }
     };
     Process? p = Process.Start(info);

     if (p != null)
     {
          // 別EXEが終了するまで待つ場合
          p.WaitForExit();
          MessageBox.Show("メモ帳が終了しました" + "\r\n" +
               "StartTime：" + "\r\n" + p.StartTime + "\r\n" +
               "DateTime" + p.ExitTime + "\r\n" +
               "TotalProcessorTime:" + p.TotalProcessorTime
          );

          // 別EXEを強制終了する場合
          // System.Threading.Thread.Sleep(5000);
          // p.Kill();

           // 別EXEからプログラムの終了コードを受け取る場合
           int code = p.ExitCode;
     }
}
```

# 4. 参考文献

https://www.sejuku.net/blog/101552

https://resanaplaza.com/%E3%80%90%E3%82%B3%E3%83%94%E3%83%9A%E3%81%A7%E5%AE%8C%E4%BA%86%E3%80%91c%E3%81%8B%E3%82%89process%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%A4%96%E9%83%A8%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0/
github actionsをローカルで実行 act



## 使うメリット

ローカルで実行できるのでトライ＆エラーしやすい


### インストール方法

```
brew install act
```
※dockerもインストールされていること
GitHub CLI 拡張としてのインストールもできるらしい


### ワークフローの一覧表示

```
act -l
```

### イベント指定

pull_requestイベントをトリガーとしたい場合は以下のように引数を与える。

```
$ act pull_request
```

### 使い方具体例



### ワークフローを直接指定

```
act -W .github/workflows/helloworld.yaml pull_request
```

### 特定のジョブのみ実行

-j

```
act -j cherry-pick -s secrets=PAT
```


### シークレットを渡す

-s

```
act -s MY_SECRET=somevalue
act -s secrets=PAT
```


### ジョブ実行後コンテナを消したくない時

-rでreuseできる＝コンテナが消えない
```
act -r -j cherry-pick
```


### ドライラン

-n

イベントも練り込むことができる

### 「-e」または「--eventpath」
act -W .github/workflows/helloworld.yaml pull_request -e pull_request.json
たとえば、、、下記のようなことがyamlに書いてあったら上のコマンドでjson用意しておけば、架空のイベントも練り込める

```
if:github.event.pull_request.merged == true
```

```
pull_request.json
{
  "pull_request": {
    "merged": true
  }
```


手動でパラメータを渡すこともできる
```
act --input NAME=somevalue-入力somevalueの値として使用しますNAME。
act --input-file my.input-my.inputファイルから入力値を読み込みます。
```



参考資料

https://zenn.dev/yumemi_inc/articles/203779a4eba922
公式ドキュメント
https://github.com/nektos/act
RFI・LFIとは何だろうか

## はじめに
おはこんばんにちは。キティちゃんです。最近暑くなったり寒くなったりと天気に左右されています。今回はRFIとLFIについて書いていきたいと思います。

## きっかけ
RFIとLFIの脆弱性について学ぶ機会があったためです。

## RFI・LFIとは
RFIはリモートファイルインクルージョン（Remote File Inclusion）の略で、主に外部で用意したスクリプトファイルを攻撃対象サイトに読み込ませ実行させるといった攻撃となります。

LFIはローカルファイルインクルージョン（Local File Inclusion）の略で、攻撃対象サーバー内のファイルを閲覧するためにファイルパス（例：..etc/passwd)をリクエストのパラメータに挿入して送信し、対象ファイルを表示させる攻撃となります。

## どういった影響があるのか
外部のファイルを実行できてしまう場合、情報の漏洩、サイト改ざん、不正な機能実行、踏み台として利用され他サイトへの攻撃といったことに繋がります。

## 対策
1.外部からファイル名を指定する仕様を避ける
2.ファイル名を英数字に限定する
また、保険的対策として、PHPでは現在の最新ではデフォルトで禁止となっていますが、「allow_url_include = Off」と「Off」になっているかを確認することを推奨します。

## まとめ
今回はRFI・LFIについて書いてみました。RFI・LFIはPHPなどのスクリプト言語でスクリプトのソースの一部を別ファイルから読み込む機能を利用して起こりうる脆弱性となります。PHPなどのスクリプト言語を使用して開発される際は上記脆弱性に気を付けて実装してください。今回はここで筆をおきます。ありがとうございました。

## 参考
・『体系的に学ぶ 安全なWebアプリケーションの作り方 第2版』　著者：徳丸浩様
【Paiza問題集】標準出力メニュー/【文字列の出力】入力された10個の文字列の出力

# Paiza問題集
Pythonで回答

## 標準出力メニュー/【文字列の出力】入力された10個の文字列の出力

### Step01 1つの文字列を出力
```Python
"""
1つの文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__string_output_step1
"""

# paizaと出力
print('paiza')
```

### Step02 2つの文字列を出力
```Python
"""
2つの文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__string_output_step2
"""

# paiza learningと1行で出力
print('paiza learning')
```

### Step03 入力された2つの文字列を出力
```Python
"""
入力された2つの文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__string_output_step3
"""

# 文字列を受け取る
str1 = input()
str2 = input()

# 文字列を表示
print(str1)
print(str2)
```

### Step04 入力された10個の文字列を表示
```Python
"""
入力された10個の文字列を表示
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__string_output_step4
"""

# 配列を作成
strings = []

# 文字列を受け取り配列に追加
for i in range(10):
    string = input()
    strings.append(string)

# 文字列を表示
for i in range(10):
    if i != 9:
        print(strings[i], end=' ')
    else:
        print(strings[i])
```

### Final問題 【文字列の出力】入力された10個の文字列を出力
```Python
"""
【文字列の出力】入力された10個の文字列を出力
https://paiza.jp/works/mondai/stdout_primer/stdout_primer__string_output_boss
"""

# 文字列を受け取る
strings = input().split(' ')

# 文字列を表示
for i in strings:
    print(i)
```
【Express】Node.js Webアプリケーションフレームワーク 基本

ルーティングは`app.get`で行う
`res.render('ファイル名')`とすることで定したビューファイルをブラウザに表示可能
`req`：リクエスト
`res`：レスポンス

```app.js
const express = require('express');
const app = express();

// トップ画面を表示するルーティング
app.get('/top', (req, res) => {
  res.render('top.ejs');
});
app.listen(3000);
```

* `ミドルウェア関数`：入力値が空かどうかをチェックする
* パスワードのハッシュ化：ユーザーの入力した普通の文字列のパスワードと、データベース上のハッシュ化されたパスワードを比較するにはbcryptパッケージのcompareメソッドを使う
GitHub Actionsを用いて日報の更新をSlackに通知する

## はじめに
この記事では、日常的に行なっている日々の業務報告・日報をGitHub Actionsを用いてSlackに通知する方法を解説します。チームで業務効率化を図りたい、いち早くpushした内容を把握したい方に読んで頂きたいです。

## 対象とする読者
- GitHubを日常的に使用している方
- Slackをチームコミュニケーションツールとして使用している方
- GitHub Actionsを用いた自動化に興味がある方

## やりたいこと
- githubの **"特定のディレクトリ下"** にpushした日報をslackに通知したい。
- 今回は全ての変更(新規作成、変更等)をトリガーとしたい。

## やってみる

### Webhookを取得する
まずはSlackからWebhook URLを取得します。これはGitHub ActionsからSlackに通知を送る際に必要となります。

1. [Slack API](https://api.slack.com/apps)のページを開きます。
2. Create New Appをクリックします。
3. アプリ名とSlackのワークスペースを選択します。
4. Create Appをクリックします。
5. 左のナビゲーションメニューからIncoming Webhooksを選択します。
6. Activate Incoming Webhooksをオンにします。
7. Add New Webhook to Workspaceをクリックします。
8. 投稿したいチャンネルを選択します。
9. Authorizeボタンをクリックします。
10. 生成されたWebhook URLをコピーして保存します。

### GitHubActionsの設定
次にGitHubに戻り、GitHub Actionsで用いるシークレットを設定します。これは先ほど取得したWebhook URLをGitHub Actionsで利用するためです。

1. GitHubのリポジトリページに移動します。
2. Settingsタブをクリックします。
3. 左側のメニューからSecrets and variables下のActionsを選択します。
4. New repository secretをクリックします。
5. Nameには`SLACK_WEBHOOK`と入力し、Valueには先ほどコピーしたWebhook URLを貼り付けます。

### ymlファイルの作成
最後にGitHub Actionsのワークフローを定義します。リポジトリ内の`.github/workflows`ディレクトリにYAML形式のファイルを作成します。無ければローカルで作成してpushしてあげてください。
`paths:`にはpush先のディレクトリを指定します。このディレクトリ下へのpushが今回のトリガーとなります。

```yaml
name: Slack Notification

on:
  push:
    paths:
      - "daily-report/2023/**"

jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Notify Slack
        env:
          SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
        run: |
          CHANGED_FILES=$(git diff-tree --no-commit-id --name-status -r ${GITHUB_SHA} HEAD~1)
          echo "CHANGED_FILES: ${CHANGED_FILES}"
          FILE_LINKS=""
          while read -r status file; do
            if [[ $file == "daily-report/2023/"* ]]; then
              FILE_LINKS+="https://github.com/${GITHUB_REPOSITORY}/blob/${GITHUB_SHA}/${file}\\n"
            fi
          done <<< "$CHANGED_FILES"
          if [ ! -z "$FILE_LINKS" ]; then
            PAYLOAD=$(printf '{"text": "【日報】〇〇 〇〇\\n%s"}' "${FILE_LINKS}")
            curl -X POST -H 'Content-type: application/json' --data "${PAYLOAD}" $SLACK_WEBHOOK
          fi

```

### リモートリポジトリにPushしてみる
動作確認をしてみます。GitHubの`daily-report/2023/**`に対して日報をPushした結果、以下のようにリンクが表示されたら完成です。
```
【日報】〇〇 〇〇
https://github.com/*****/*****/blob/*****/daily-report/2023/〇〇/〇〇.md
```

## まとめ
以上がGitHub ActionsとSlackを連携させて日報の更新を自動通知する手順でした。これにより、日報の更新を手動でSlackに貼り付ける手間がなくなります。さらに、日報の更新がすぐにチーム全体に伝わるため、コミュニケーションの効率化にもつながると思います。

## おわりに
今回は、GitHub Actionsというツールの使い方の一例として書いてみましたが、業務ではCI/CDを実現するためにも使われているようです。CI/CD自体まだ触ったことがないので、そちらの理解が深められたら追加で作ってみたいですね！

ではでは、今回はこのへんで👋
[AIX Tips] sys0 の ghostdev=3 の機能追加

#### はじめに


筐体移行の際などによく参照する Technote ["Changing the VGID of rootvg and PVIDs of rootvg disks with ghostdev"](https://www.ibm.com/support/pages/changing-vgid-rootvg-and-pvids-rootvg-disks-ghostdev) に記載がある ghostdev =3 の説明は、以前は **"undefined"** という表記でしたが、説明が加わっていることに気づきました。

https://www.ibm.com/support/pages/changing-vgid-rootvg-and-pvids-rootvg-disks-ghostdev


なお、ghostdev は AIX rootvg の PVID や VGID を変更する際に設定する値です。
参考：[rootvg の PVID および VGID の変更](https://www.ibm.com/docs/ja/aix/7.3?topic=manager-changing-pvid-vgid-rootvg)


---

#### ghostdev=3 に追加された記載内容

(抜粋)
ghostdev=3 skips reading all disks during ipl_varyon when some rootvg disks are unreadable.
During boot time, ipl_varyon attempts to read every disk in rootvg.  If any of the reads fail, it reads every disk visible to the LPAR looking for a valid rootvg disk. These read operations can cause boot to take considerable time, especially when the system has many disks that take some time to complete the read.  With the ghostdev attribute set to 3, ipl_varyon skips the step of reading of all the disks in the system.  This setting can cause ipl_valyon to fail in finding a suitable disk to boot from in some cases.  Setting ghostdev=3 is an exclusive option and cannot be used with other ghostdev values.


(翻訳)
ghostdev=3は、rootvgのディスクが読めない場合、ipl_varyonの間にすべてのディスクを読み込むのをスキップします。
ブート時に、ipl_varyon は rootvg 内のすべてのディスクの読み取りを試みます。 読み取りに失敗すると、LPAR から見えるすべてのディスクを読み取り、有効な rootvg ディスクを探します。これらの読み取り操作により、特にシステムに多くのディスクがあり、読み取りを完了するのに時間がかかる場合、起動にかなりの時間がかかることがあります。 ghostdev 属性を 3 に設定すると、ipl_varyon はシステム内のすべてのディスクの読み取りステップをスキップします。 この設定は、場合によっては、ipl_valyonがブートするのに適したディスクを見つけるのに失敗する原因となることがあります。 ghostdev=3 の設定は排他的なオプションであり、他の ghostdev 値と一緒に使用することはできません。


---

#### 関連APAR

おそらくこのAPARの対応として追加されたものと推測。

・[IJ38778: IPL_VARYON BOOT HANGS AT LED 551 FOR VERY LONG TIME APPLIES TO AIX 7200-05](https://www.ibm.com/support/pages/apar/IJ38778)

ミラーリングされたSANブートのディスクがあり、多数のSANディスクが接続している場合に該当するケースがある様子です。

---


ご参考まで、以上です。
ChatGPTプラグインの「Webpilot」と「Show me」の組み合わせが最強

ChatGPTのプラグインが開放されてから色々と試したところ、「Webpilot」と「Show me」の組み合わせが最強と気が付いたので、紹介します！

おすすめのプラグインは以下のページで解説しています！

https://generativeinfo365.com/?p=369

また、ChatGPTを使ってエンジニアの生産性を上げるChatGPTの活用方法とプロンプト例は以下の記事で紹介しているので、こちらも併せてご覧ください。

https://generativeinfo365.com/?p=631


## ChatGPTプラグインとは
ChatGPTプラグインは、ChatGPTをサードパーティのアプリケーションと連携させるツールです。

これは、GoogleスプレッドシートのアドオンやGoogle Chromeの拡張機能と同様に、公式だけでなく第三者の開発者が作成した機能をChatGPTに追加することで機能を拡充できるものとなっています。

具体的には、プラグインを利用することで、ChatGPTに以下のような機能を追加できるようになります。

- リアルタイムの情報を取得：スポーツのスコアや株価、最新のニュースなどを確認
- ナレッジベースの情報を取得：企業の文書や個人のメモなどを閲覧
- ユーザーの代わりにアクションを実行：フライトの予約や食事の注文などを行う

また、複数のプラグインを有効にしておくと、プロンプトに応じて複数のプラグインを組み合わせて使ってくれます。

:::note warn
注意
- プラグインはChatGPT Plus（有料版）ユーザーのみ利用可能です
- プラグインは順次公開されているので、ChatGPT Plus（有料版）ユーザーでもまだ利用できない可能性があります。
:::

## 「Webpilot」と「Show me」のプラグインの組み合わせが最強
![スクリーンショット 2023-05-22 18.43.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/16f203b0-388b-abe5-7a6e-8c30ad14af63.png)

現在利用可能なプラグインの中で、プログラミングを行う際に特におすすめなのは、「Webpilot」と「Show me」の二つの組み合わせです。

この組み合わせを活用すれば、ChatGPTにインターネット上に存在するコードを読み込ませることで、それを　わかりやすい図解として提示してくれるのです。

そして何よりも驚くべき点は、「Webpilot」がGitHubのページも読み込む能力を持っていることです。これにより、GitHubにアップロードされているコードをベースに具体的な指示を出すことが可能となります。
## 人が書いたコードを図示して解説してもらう
まず、一番有用な使い方としては人が書いたコードを図示してもらうことです。

今回は例として「ProbSpace 花粉飛散量予測コンペ」の1位の方のコードがGitに公開されてるので、こちらのコードの一部を解説してもらいます。

https://comp.probspace.com/competitions/pollen_counts

https://github.com/cczouk/probspace_pollen/blob/main/pred_catb_0.1.py


やり方は簡単で、ChatGPTのプラグインで「Webpilot」と「Show me」の両方を有効にしたチャット内で、gitのurlを共有してコードの流れを解説してもらうだけです。

以下が実行結果です。
コードがどういう流れなのかを視覚的に把握できるので、初めて見るコードでもコード理解が簡単にできますね！

![FireShot Capture 016 - Code Flow Visualization - chat.openai.comのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/d522e0f7-d72e-f75f-f177-805c0e64df40.png)

## コードを比較してもらう
もう一つの使い方としては、2つのコードの比較をして、その違いを図示してもらうことです。

例えば、上で紹介したコンペでは、入賞された方の何名かがコードを公開しているので、同じ問題に対してそれぞれがどうアプローチしたのかを見ることもできます。

リファクタリング前後で比較したりすることもできますね！

![FireShot Capture 016 - Code Flow Visualization - chat.openai.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3356814/d2cd29c3-7103-9bd8-65c0-57630a26a0a4.png)

## おまけ

最後に宣伝です！

データサイエンティストのために、CahtGPTをはじめとした生成AIを使ってデータ分析を効率化する情報をまとめたサイトを運営しています！

生成AI×データ分析に興味がある人はぜひこちらも覗いてもらえると嬉しいです！！

https://generativeinfo365.com/
皆様「VOLTA」ご存知ですか？



![スクリーンショット 2021-07-26 17.05.41 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/bcd683a6-f58d-50b6-f01d-aaa652744208.png)


過去、別の媒体で行った投稿です、、、、
## VOLTA について

突然ですが皆様、Nodeのバージョン管理には何を使われていますでしょうか？

実は技術研究の方で「VOLTA」を使わせていただいておりまして、かなりイケてるのではと思い勝手に紹介させていただきます。

公式では、

> *Voltaとは、JavaScript ツールマネージャーです。*
>
> *タイトルでは Node.js のバージョン管理としていますが、 npm・yarn のバージョン管理も行うことができます。*

とかなりあっさり書かれていますが、僕が思う一番の便利な点としては

**node や npm,yarn のバージョンをプロジェクト毎に固定できる**

点にであると思います。

package.json の内容を読み、自動でバージョン切り替えを行うため`volta pin`というコマンドを使うことで、簡単にプロジェクトメンバーの Node.js や npm のバージョンを揃えることができます。

> *Ensure everyone in your project has the same tools—without interfering with their workflow.
> （ワークフローを妨げることなく、プロジェクトに参加する全員が同じツールを使えるようにする。）*

**Windows・Mac・Linux。どの OS でも動作可能**と書かれていますが、VOLTAの恩恵を受けるにはプロジェクトメンバー全員が使用していることが条件となりそうですね、、

## ⁠実際に使う

```インストール
curl https://get.volta.sh | bash
```

特定のNode、npmのバージョンをインストールし、プロジェクトで使用する。

```特定のバージョンインストール
$ volta install node@14.15.5
```

```14系の安定板のインストール
$ volta install node@14　
```

```Nodeのバージョンをプロジェクトで固定
$ volta pin node@14.17
```

**この「pin」コマンドこそがVOLTA最大の恩恵ですね、**

VOLTA内で利用可能なNode,npmなどのバージョンを確認するには

```
$ volta list all
```

で確認可能です。

下記画像のように、利用可能なバージョンが表示されます。

![スクリーンショット 2022-08-08 11.39.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/15c4845a-f296-f6e1-4a69-d0aca9fa7194.png)


### 22/09/14 追記

voltaのアンインストール　（技術研究でも使用しなくなったので削除します、、また会おうなvoltaちゃん、、、、）

```
rm -rf ~/.volta
```

その後、僕はzshだったので、

```
open .zshrc
```

でVOLTAについてのpathを２行を削除しました。

これにて完了！！

## ⁠感想

とにかくシンプル、そして使いやすい、、、

バージョンの切り替えを明示的に行う必要がないのチーム開発においてかなり便利ではないでしょうか、バージョンが原因によって起こる各々のエラーがなくなりそうですね！

JavaScriptをメインに開発されている方は是非とも導入をご検討ください！
【GPT】スプレッドシート編


下画像みたいに、GPTとの対話をシートに残しておきたい時に便利です！！！

![スクリーンショット 2023-04-14 17.00.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/7c0fc0ed-0487-bf81-181b-e54ac096edbd.png)


## 1　拡張機能→アドオン→アドオンを取得を選択

![スクリーンショット 2023-04-14 16.50.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/9b637d94-7df0-ecf4-d48d-f907446018c4.png)


## 2 「GPT」と検索し、ChatGPT in Google Sheets™ and Docsをインストール

![スクリーンショット 2023-04-14 16.52.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/44849b1a-c129-6849-e33e-791a8647291f.png)
↑一番左端のものです。

## ３Launch sidebarを開く

![スクリーンショット 2023-04-14 16.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/5a279299-aff3-849f-13f2-f11f2593e465.png)

下の画像が右端に出てくるはず
![スクリーンショット 2023-04-14 16.55.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/40118263-5f37-c71d-238d-09c4b8e6789a.png)


## 4 例のごとくOpen AIのAPI keyを入力

https://platform.openai.com/account/api-keys

↑のリンクからアカウント作成、もしくはログインしてkeyを作成してください。

![スクリーンショット 2023-04-14 16.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/e848151e-d10e-c501-bd3d-6127e98a6599.png)




Next押す　→ 次はI understand押す（スクショ撮り忘れました）

## ⁠実際に使う
![スクリーンショット 2023-04-14 16.59.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/9cc40115-bd07-4923-8091-42cf8f22e93b.png)

上画像のようにスプシでの関数は「=GPT()」が基本です。

B列に共通関数を持たせて自動で出力されるようにすればもう立派なノートになりそうですね。

今回も雑な説明すみません！！

使わない理由はないです！！
LINEbotとOpenAIのAPIを用いて、好きなジャンルでストーリーを作成する「ストーリーメイカーAI」を開発しました！！

<h1> 目次</h1>

<p>１.はじめに</p>
<p>2.LINEbotの概要</p>
<p>3.実行環境</p>
<p>4.開発の流れ</p>
<p>5.苦労した点、気づいたこと</p>
<p>6.最後に</p>


<h2>１.はじめに</h2>
<p>私がこのLINEbotを開発しようと思った動機は、「LINEbotでできるエンタメってなんだろうと考えた時に一番面白そうだった」からです。LINEbotでのサービスを近年たくさん出ていますが、かなり便利なものが多い気がします。今回のような楽しめるサービスはOpenAIとの相性的にもあまりない印象でした。今回はその機能の概要とやり方を軽く説明していきます。</p>

<p>こちらから友達追加できます。</p>

![468emhek.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3445338/08476e87-e1fb-7ce4-aeb5-a11c9299aa5d.png)



<h2>2.LINEbotの概要</h2>
<p>今回私が開発した「ストーリーメイカーAI」は次のような流れで利用できます。</p>

①好きなストーリージャンルを選択する。
②AIが作成したストーリーでの行動を選択する。

<p>たったこれだけです。しかも、同じジャンルでも毎回お話が違うので何回でも遊ぶ事ができます。</p>

<p>では実際に見ていきましょう。まず好きなジャンルを選択します。ジャンルの種類は全部で8種類です。</p>

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3445338/bfe06e14-8731-9e41-6b56-66bfd38a3fbd.jpeg">

<p>ストーリーが作成されると、ユーザーに行動の選択肢が与えられます。この選択によってストーリーが変わっていきます。数回選択すると物語が終了します。</p>

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3445338/31f03a24-fb35-cb59-a948-bcfcffd6adfe.jpeg">


<h2>3.実行環境</h2>
<ul>
<li>Python3.9</li>
<li>AWS(Lambda、DynamoDB使用)</li>
</ul>

<h2>4.開発の流れ</h2>
①LINE Developersに登録する（プロバイダーを作成)<br>
②Open AIのAPI作成(APIkeyの発行）<br>
③AWSの設定(アカウント作成後にLambda関数とDynamoDBを使用)

<p>以下の記事を参考にしました！</p>

https://itc.tokyo/gas/gas-line-bot-with-chatgpt/

https://qiita.com/sasao3/items/2960642fd0b329be4846

<h2>5.苦労した点、気づいたこと</h2>
<p>
・プロンプト文の提案<br>
今回OpenAIと組み合わせたLINEbotの開発をしてみて、AIと対話する際のプロンプト文の提案はすごく時間が掛かりました。例えば今回のストーリーを５回に分けるようにする際には、1回で質問を全て出すのではなく、会話の中でストーリーを展開することがうまくいきませんでした。そこでプロンプト文の最後に例をあげることでうまく実装することができました。ここから何も分からない人が見ても分かるくらいの明確で具体的な指示ができるかがとても大切だと実感しました。今回、chatGPT4のAPIを利用しましたが、chatGPT-3.5のAPIだとこのbotはうまくいかなかったので、そこも学びがありました。

・パラメーター調整
また、パラメータ調整の重要性も感じました。temperatureを変更することで出力にちらばりを発生させるなどができるのは、ユーザー体験が飽きづらくなるのかもしれないと思いました。

</p>


<h2>6.最後に</h2>
<p>このLINEbotアカウントは、私のインターン先での業務の一環として開発しました。一つ目に作成した「AI英会話くん」よりはスムーズに作成することができ、成長を実感できました。このbotはAWSやOpenAPIを利用した事がないところから学び始め、１ヶ月ほどで完成する事ができました！今後もインターンでの活動や個人開発での学びなどを発信していくのでフォロー、いいね、保存よろしくお願い致します。</p>
【GPT】VSCode 拡張機能編

## １ChatGPT - Genie AI拡張機能をインストール

[⁠こちらからでも](https://marketplace.visualstudio.com/items?itemName=genieai.chatgpt-vscode)
![スクリーンショット 2023-04-14 16.23.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/9ad7752f-ea68-2d77-e550-8abe0c9c8a56.png)

## ２API keyを作成

こちらのURLから↓

https://platform.openai.com/account/api-keys

（Open AIアカウントを作成する必要あり）

＊既にある方は、ログイン後作成してください。

作成したAPIキーをコピーします。

## 3 VS CodeでChatGPT - Genie AIを開きAPI keyを入力しenter

![スクリーンショット 2023-04-14 16.35.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/013438e4-c72a-6219-7952-f0e1b22dcd2a.png)


これで利用開始できます。

## 4 拡張機能の設定から、日本語を設定しておく。

![スクリーンショット 2023-04-14 16.40.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/e8467cb6-2b92-df87-e674-5e38c3c90c3b.png)

![スクリーンショット 2023-04-14 16.41.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/398760f4-e3f8-0aaa-dae4-6603dce83f9e.png)

こうすることで、コードを選択しダブルクリックし、

![スクリーンショット 2023-04-14 16.42.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/5d5a3140-52c1-b801-7003-fd6d41d833a5.png)


![スクリーンショット 2023-04-14 16.44.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/aa764eb4-8603-8493-50d4-990bfd181d04.png)


今回は、Explainを押した際に、質問が日本語で出るためGPTも日本語で解答してくれます。

![スクリーンショット 2023-04-14 16.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705538/57f4a6bd-30c6-4ad6-fd5d-8de312a0e743.png)


雑な説明ですみませんが、使われる方は是非！！
Hexabase TypeScript SDKを使ってファイルをアップロードする

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業においても安心して利用できるBaaS（Backend as a Service）を提供しています。多くのBaaSがそうであるように、主にフロントエンド開発者に利用してもらいたいと考えています。そこで現在、TypeScript SDKの開発が進められています。

この記事ではHexabase TypeScript SDKのインストールと、ファイルアップロードを行う方法を解説します。

## インストール

インストールはnpmやyarnを使って行います。

```
# npmの場合
npm install @hexabase/hexabase-js

# yarnの場合
yarn add @hexabase/hexabase-js
```

## インポート

インポートすると、 `HexabaseClient` というオブジェクトが取得できます。

```jsx
import { HexabaseClient } from "@hexabase/hexabase-js";
```

## 初期化

HexabaseClientを初期化します。

```jsx
const client = new HexabaseClient();
```

### 認証

Hexabaseでは業務利用を想定しているため、利用する際に認証情報が必須になります。最初はメールアドレスとパスワードで認証し、その後はトークンを使ってGraphQLにアクセスします。 `client` を使って処理します。

初回の認証は次のようになります。emailとパスワード、またはトークンが必須です。

```jsx
await client.login({email, password, token});
```

後はこの `client` に対して処理を行います。

## プロジェクトを取得する

データレポートはプロジェクトに紐付きます。そこで、まず利用するプロジェクトを取得します。

### 現在のワークスペースを取得する

ログインした時点でHexabaseClientのcurrentWorkspaceが現在のワークスペースオブジェクトになっています。

```jsx
client.currentWorkspace
```

ワークスペースを切り替える場合には、 `setWorkspace` メソッドを使います。

```jsx
client.setWorkspace(newWorkspaceId);
```

そのワークスペースに紐付いているプロジェクトを取得します。

```jsx
const project = await client.currentWorkspace.projects(projectId);
```

## データストアへのアクセス時に必要な情報について

データストアへアクセスする際には以下の情報が必要です。

- データストアID `datastoreId`
- （オプション） プロジェクトID `projectId`

さらにデータ取得を行う際の情報（ページ数、取得件数など） `params` が指定できます。以下がアクセス例です。

```tsx
const project = client.currentWorkspace.project(projectId);
const datastore = project.datastore(datastoreId);
const items = await datastore.items();
const item = items[0];
```

## ファイルを作成する

ファイルは `item.file()` を使って、FileObjectのインスタンスを取得します。そして、 `name` と `data` を指定します。

```tsx
const file = item.file();
const blob = new Blob(['Hello world'], { type: 'text/plain' });
file
  .set('name', 'test_file.txt')
  .set('data', blob);
```

アイテムと紐付ける際には、 `set` メソッドを使います。この時、フィールドは管理画面で添付ファイル型として指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/c97bd0bd-31b1-1808-c5ff-caa5d2dcd547.png)


```tsx
await item
  .set('test_file', [file])
  .save();
```

添付ファイルは複数指定できます。単数ではないので注意してください。

## ファイルを取得する

ファイルを取得する際には、 `get` メソッドを使います。FileObjectの配列が返ってきます。

```tsx
const files = item.get('test_file') as FileObject[];
```

## 実データを取得する

実データを取得する際には `download` メソッドを使ってください。 Blob型でデータが取得できます。

```tsx
const data = await files[0].download() as Blob;
```

取得した内容は `data` にもセットされています。初回は必ず `download` を実行してください。

```tsx
const data = files[0].get('data') as Blob;
```

## ファイルを追加する

既存のデータに添付ファイルを追加する場合には、 `add` メソッドを使ってください。

```tsx
const file = item.file();
const blob = new Blob(['Hello world'], { type: 'text/plain' });
file
  .set('name', 'test_file.txt')
  .set('data', blob);
await item
	.add('test_file', blob)
  .save();
```

## まとめ

ファイルアップロード、ダウンロード機能を使えば、データに紐付いたファイルを登録できます。画像やドキュメントなど自由にアップロードできますので、利用してください。

[株式会社 Hexabaseー法人向けクラウドシステム『Hexabase』ー](https://www.hexabase.com/)
Laravel 「Intervention Image」チートシート

案件にて、S３に格納されている「png」や「jpg」画像をwebp画像に変換するタスクがありました。

君にそんな能力あったんかい！？

「Intervention Image」です。バックエンドで画像処理（S3への格納など）をされてるプロジェクトではかなりメジャーなモジュールだと思われます。

> このパッケージは、Laravel フレームワークと開発者向けの優れたエクスペリエンスを提供するように設計されており、GD または Imagick の内部的な動作に依存することなく、アプリケーションが必要とするすべての機能を提供します。

## インストールと基本的な使い方

### ⁠インストール

Composerを通じてインストール。

```
composer require intervention/image
```

### ⁠画像の読み込み

```ファイルパスから画像を読み込む
 $image = Image::make('app/public');
```

```URLから画像を読み込む
 $image = Image::make('http://example.com/image.jpg');
```

```⁠具体例
use Image;

class CheckController extends Controller
{
    public function index(Request $request)
    {
        $img = Image::make($request->file('image'));
    }
}
```

## ⁠基本的なメソッド一覧

```⁠画像ファイル化
$img = Image::make('public/sample.jpg');

//URLからも画像ファイル化は可能です。
```

```⁠保存
$path = storage_path('app/sample.jpg');
$img->save($path);

//引数で画質指定できる（0~100）
$img->save($path,100);

//デフォルトでは３０
```

＊ここでの保存はLaravelのstrage/app配下に保存してます

```⁠サイズ

// 比率無視
$img->resize(100, 100);
$img->resize(100, null);
$img->resize(null, 100);

// 比率維持 幅は指定、高さは自動
$img->resize(100, null, function($constraint){
    // 比率を維持
    $constraint->aspectRatio();
});
```

## 少しオモローなメソッド

```⁠モザイク
//引数の数値はモザイクの大きさを表す
$img->pixelate(10)
```

```⁠回転
//引数は回転する度数を表す
⁠$img->rotate(-45);

//背景色を与えることも可能
$img->rotate(-45, '#f44336');
```

```⁠明るさ
//0~100で明るさの指定
// 暗い
$img->blur(0);
// 明るい
$img->blur(100);
```

```⁠色調
//(red,green,blue)の順で1~100の引数を与える
$img->colorize(30,50,90)⁠;
```

```⁠コントラスト
//-100~100で度合いを与える
$img->contrast(-50);
```

```⁠拡張子変換
//jpg、png、gif、tif、bmp、ico、psd、webp、data-urlに対応
$ipg_img = $img->encode('jpg');
```

## ⁠取得系

```⁠幅
$value = $img->width();
```

```⁠高さ
$value = $img->height();
```

```⁠ファイルサイズ
$value = $img->filesize();
```

```マイムタイプ（拡張子情報）
$value = $img->mime();
```

## ⁠最後に

上記は一部なので、[公式](https://image.intervention.io/v2)サイトで是非他のメソットも見てみてください。

（正直コントラストかけたりすることあるんか？とも思いますが）便利な子ですね。

現案件では、S3への保存前にサムネイルを作成するためにリサイズの処理を行なっています。このように画像サイズが規格外の場合や、拡張子の変換、または非公開用のモザイク処理など保存前の調整として重宝できそうです。そして何と言っても使いやすすぎる。機会があれば是非利用してみてください！！

それでは！！
DockerをつかてRubyからSQLを発行してPostgreSQLを利用する

# 今回やることの詳細
1. Docker-composeを使ってRubyとPostgreSQLの二つのコンテナを作成してネットワークで繋ぎます。
2. RubyスクリプトからSQLを発行して取得内容をコンソールに表示します。
## 説明すること
- Docker-composeの使い方
- rubyでPostreSQLにアクセスする方法
## 説明しないこと
- Dockerのインストール方法
- Linuxの基本コマンド
- rubyの基本
- SQL
# 今回使用するファイル
### RubyのDockerfile

```docker
FROM ruby:3.2.2

WORKDIR /home/

COPY ./Gemfile /home/

# vendor/bundleに依存関係をインストールするよう設定する
RUN bundle config set --local path 'vendor/bundle' && \
    bundle install && \
    echo 'alias b="bundle exec"' >> ~/.bashrc

```


### Gemfile

```ruby
# frozen_string_literal: true

source "https://rubygems.org"

gem 'pg'

```

### PostgreSQLのDockerfile

```docker
FROM postgres:15.2

ENV POSTGRES_USER=root
ENV POSTGRES_PASSWORD=pass
ENV POSTGRES_DB=test
```

### docker-compose.yml

```docker
version: "3.8"
services:
  ap:
    build: ./src/ruby
    image: ruby:1.0
    container_name: ruby
    stdin_open: true
    tty: true
    volumes:
      - ./src/ruby/script:/home/ruby
    networks:
      - my_network
  db:
    build: ./src/postgres
    image: postgres:1.0
    container_name: postgres
    volumes:
      - ./src/postgres/data:/var/lib/postgresql/data
      - ./src/postgres/sql:/home/postgres
    networks:
      - my_network
networks:
  my_network:
```

### test_postgresql.rb
```
require 'pg'

conn = PG.connect(
  host: 'postgres', # docker-composeで作成したPostgreSQLサービスのコンテナ名を指定します。
  port: 5432, # PostgreSQLのデフォルトポート番号です
  # Gemfileで指定したDBの名前とユーザー名とパスワードです
  dbname: 'test',# 
  user: 'root',
  password: 'pass'
)

# テーブルを作成します。
conn.exec("CREATE TABLE IF NOT EXISTS test1(
               id SERIAL PRIMARY KEY,
             name VARCHAR(100));"
)
#サンプルデータを1つ作成します。
conn.exec("INSERT INTO test1 VALUES (1, 'test_name') ON CONFLICT (id) DO NOTHING;")
#全てのデータを取得します。
result = conn.exec("SELECT * FROM test1;")
# 表示します。
result.each do |row|
    puts "ID: #{row['id']}, Name: #{row['name']}"
end
conn.close
```
## ディレクトリ構成
![スクリーンショット 2023-05-22 18.13.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3340022/5c8aa49b-f459-0a43-0fdc-e4b8508c5238.png)
docker-dompose.ymlとsrcが同じディレクトリの中にあり、srcの中にrubyとpostgreSQLのディレクトリがあります。
## 作業手順
1. docker-compose.ymlがあるフォルダに移動します
2. `docker compose build`
3. `docker compose up -d`
4. `docker exec -it ruby /bin/bash`
5. `bundle exec ruby ruby/test_postgresql.rb`
無事テストデータが取得できれば完了です。お疲れ様でした。
cmakeプロジェクトにGoogleTestを最小限の手間で導入する

C++のプロジェクトにGoogleTestを導入する最小限の手順を紹介する。
GoogleTestでは凝ったことをやり始めるといくらでも複雑なことができるが、この記事では「小規模なcmakeプロジェクトに最小限の手間で導入する」ことを目指す。

参考: http://google.github.io/googletest/quickstart-cmake.html

# cmakeプロジェクトの設定

以下のような雛形から始めるのが良い。

```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 3.14)
project(my_project)

# GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)

include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/03597a01ee50ed33e9dfd640b249b4be3799d395.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
```

- C++14以降は必須
- `FetchContent_Declare(...)` `FetchContent_MakeAvailable(googletest)`で指定したURLから依存パッケージをダウンロードし利用可能にする。事前にgoogleTestをインストールする必要はない。

# ユニットテストコードの実装

以下のように`hello_test.cpp`を実装。

```cpp:hello_test.cpp
#include <gtest/gtest.h>

// Demonstrate some basic assertions.
TEST(HelloTest, BasicAssertions) {
  // Expect two strings not to be equal.
  EXPECT_STRNE("hello", "world");
  // Expect equality.
  EXPECT_EQ(7 * 6, 42);
}
```

このテストをビルドするために、`CMakeLists.txt`に以下のように追記。

```cmake:CMakeLists.txt
add_executable(
  hello_test
  hello_test.cpp
)
target_link_libraries(
  hello_test
  GTest::gtest_main
)
add_test(NAME hello_test COMMAND hello_test)

enable_testing()
```

- `hello_test.cpp`の中にメイン関数は書いてはいけない。`TEST(...)`マクロの中にテストコードを書いていく。
- `gtest_main`の中にメイン関数が含まれている。これとリンクすると、実行可能なファイルができる。

# 実行

ビルドして実行すればテストが行われる。

```shell
cd build
cmake ..
make
./hello_test
```

`CMakeLists.txt` に `add_test(...)` と `enable_testing` を追加した場合は、`ctest`というコマンドで一括実行できる。

```shell
cd build
ctest
```

# 利用可能なASSERT,EXPECTマクロ

こちらに利用可能なマクロのリストがある。
http://google.github.io/googletest/reference/assertions.html

主要なものをまとめておく。
ちなみに`EXPECT_`,`ASSERT_`の２種類が大きく分けて存在する。
`EXPECT_`は値が正しいことをチェックし、正しくなくても処理を続行する。`ASSERT_`の場合は処理を止める。

- EXPECT_TRUE(condition)
    - `val1 == true`
- EXPECT_EQ(val1,val2)
    - `val1 == val2`
- EXPECT_NE(val1,val2)
    - `val1 != val2`
- EXPECT_LT(val1,val2), EXPECT_LE(val1,val2), EXPECT_GT(val1,val2), EXPECT_GE(val1,val2)
    - `val1 < val2`, `val1 <= val2`, `val1 > val2`, `val1 >= val2`
- EXPECT_NEAR(val1,val2,abs_error)
    - `std::abs(val1-val2) < abs_error`
Laravelでページネーションを実装したときページネーターの解像度がおかしい件について

# ページネーションとは


ウェブページやアプリケーションの長い一覧やコンテンツを複数のページに分割して表示するためのナビゲーションシステムです。通常、大量のデータやコンテンツを持つページでは、すべてのコンテンツを一度に表示することは適切ではありません。その代わりに、ページネーションを使用してコンテンツを複数のページに分割し、ユーザーが必要な情報に素早くアクセスできるようにします。

## 実装時のLaravelバージョン

フレームワークバージョン：10.11.0

## ページネーション実装時におこったこと

ページネーションを実装すると、ページ下にリンクと矢印が用意されますが
次のように矢印の解像度が大きく表示されました

![スクリーンショット 2023-05-22 17.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/8c5fc4c2-9a47-2655-c52e-d30d80e7f46c.png)

## 改善に実行したこと

参考リンク
https://noauto-nolife.com/post/laravel8-paginator-svg/


Laravelのプロジェクトディレクトリに存在する以下のファイルを開く`app/Providers/AppServiceProvider.php`

開いたファイルのコードを次のコードで`全て上書き`します。

```php:AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;


use Illuminate\Pagination\Paginator;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Paginator::useBootstrap();
    }
}
```

## ブラウザを更新する

コードを修正したことにより、解像度が大きすぎた矢印はなくなり
正常なページネーションが表示されました

![スクリーンショット 2023-05-22 17.57.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/f8217ac1-357a-6927-9c92-a59f4ca1f220.png)