OmniAICreator/Qiita-1.07M huggingface dataset:
AlmaLinux9環境にrbenv・ruby3をインストールする

## 環境
* AlmaLinux 9.3
* rbenv 1.2.0-83
* ruby 3.2.2

個人占有の開発環境のため、各アプリのユーザーが共用できるようにシステムワイドにインストールします。rbenv、rubyともにインストール・アップデートなどはrootユーザーで操作する想定です。

## rbenvインストール
```
# git clone https://github.com/rbenv/rbenv.git /usr/local/rbenv
```
git cloneで最新のrbenvをインストールします。

```
# echo 'export RBENV_ROOT=/usr/local/rbenv
export PATH="$PATH:$RBENV_ROOT/bin"
eval "$(rbenv init -)"' > /etc/profile.d/rbenv.sh
# source /etc/profile
# rbenv --version
> rbenv 1.2.0-83-g325abac
```
パスを通すなどの必要な処理を記述しますが、全ユーザーに一律適用させるために /etc/profile.d/rbenv.sh として保存しています。

## rbenvプラグインインストール
```
# mkdir -p ${RBENV_ROOT}/plugins && pushd $_
# git clone https://github.com/rbenv/ruby-build.git
# git clone https://github.com/rbenv/rbenv-default-gems.git
# git clone https://github.com/rkh/rbenv-update.git
# popd
# echo 'bundler' > ${RBENV_ROOT}/default-gems
```
* rbenv-default-gems: rbenv install後に指定のgemを自動でインストールしてくれる
* rbenv-update: rbenv updateコマンドでrbenv及びプラグインを全てgit pullしてくれる

## rubyインストール
```
# rbenv install --list
# rbenv install 3.2.2 && rbenv global 3.2.2 && rbenv rehash
==> Downloading ruby-3.2.2.tar.gz...
（省略）
BUILD FAILED (AlmaLinux 9.3 on x86_64 using ruby-build 20231211)
```
インストールを実施したところ失敗に終わりました。

インストールログを確認すると以下の記述が。
```
conftest.c:3:10: 致命的エラー: yaml.h: そのようなファイルやディレクトリはありません
```

## libyaml-develインストール
```
# dnf -y install --enablerepo=crb libyaml-devel
```
libyaml-develをインストールします。RHEL7系・8系におけるPowerToolsは、9系においてはCRBという名称に変更になっています。

## rubyインストール2
```
# rbenv install 3.2.2 && rbenv global 3.2.2 && rbenv rehash
# ruby --version
> ruby 3.2.2
# gem --version
> 3.4.10
# bundle --version
> Bundler version 2.5.1
```
改めてrubyをインストールします。

併せてbundlerもインストールされていることを確認します。
Spockまとめ（基本的な使い方）

## Spock概要
Groovy言語で書くことが出来る単体テストのテスティングフレームワーク。
私が約1,5年間単体テストでSpockとJUnitを使用してきたため備忘録的に残す。
単体テストのテスティングフレームワークで有名なJUnitと比べて個人的には使いやすい。

## Spockの基本的なルール
下記のブロックごとにテストコードを記述していく。
| ブロック | フェーズ | 概要 |
|:-:|:-:|:-:|
| setup/given  |セットアップ   |最初に記述するブロックで「前提対象を記述」   |
|when   |シミュレート   |「テスト対象の振る舞いを記述」thenと併用   |
|then   |アサーション   |whenの振る舞いの「アサーションを記述」|
|expect   |シミュレートアサーション   |when/thenをまとめたもの※あまり使わない   |
|cleanup   |クリーンアップ   |フィーチャー内でリソース解放などの「クリーンアップが必要な場合に記述」   |
|where   |-   |データドリブンテストを行うためのブロック(パラメタライズテスト)   |

## 参考コードを実際に書いてみる
前提：
下記のDTOクラスの各フィールド項目が取得できるかテストを行う。
◆DTOクラス
```java
public class dogDto {

        private Long dogId;
        private String DogName;
        private String DogBreed;
    }
```
◆テストコード
```groovy
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import spock.lang.Specification
import spock.lang.Unroll

@SpringBootTest
class dogDaoImplSTest extends Specification {

    @Autowired
    DogDaoImpl dao

    def selector = new DogDtoSelector()

    def setup() {
        selector.ownerId = 101L // setupで設定した項目は全てのテストに適用される
    }

    @Unroll
    // パラメタライズテストを行う際には@Unrollアノテーションを付与
    def "複数件取得 #testCase"() { // #の後にwhere区のパラメータを設定することでテスト名を動的に変化させることが出来る

        given: //spockSTestのみに反映される前提条件を記述
        selector.dogId = pDogId

        when: //テスト対象の振る舞いを記述、今回はdao層からselectメソッドを叩く
        def actual = dao.select(selector)

        then: // 上記のwhenで指定した振る舞いに対する結果をアサーション
        assert actual.size() == 2
        actual[pSize].with {
            assert dogId == eDogId
            assert dogName == eDogName
            assert dogBreed == eDogBreed
        }

        where: //ここでパラメタライズの設定を行う、今回は2テストパターンが実行される
        testCase             | pSize | pDogId || eDogId | eDogName | eDogBreed
        "ドッグIDが101の犬情報" | 0     | 1L     || 1L     | "moku"   | "pomeranian"
        "ドッグIDが102の犬情報" | 1     | 2L     || 2L     | "mugi"   | "pekingese"
    }
}

```

## メリット
・直感的でとても分かりやすい
・javaコードを書くことが出来る
・Assert機能が強力でエラー箇所の特定が容易
・Mock機能が標準搭載されており、記述方法が分かりやすい

## デメリット
・privateにもアクセスできてしまう

## まとめ
個人的にはJUnitよりも直感的で分かりやすいテストが書けると思っています。
分かりやすいほど撃ち漏らしが発生しにくいと考えているので今後自分でテスティングフレームワークを選定する際にはSpockを使用したい。
ですが、JUnitの方がSpringとの親和性が高いみたいなので要検討になりそうです。
他にもMockの方法等も記述したいですが今回はこれで閉じさせていただきます。

初めての投稿で、エンジニアとしても未熟なため未熟なため誤りがあればご指摘いただけますと幸いです。
今後ともよろしくお願いします。
日本語が含まれたディレクトリでdocker-compose upを実行すると、"project name must not be empty"になる

# はじめに

とある仕事でWebアプリをコンテナ化する作業中に`docker-compose up`コマンドを実行したら、`project name must not be empty`という見慣れないエラーが出てきた。

# 環境

- Mac Sonoma
- Rancher Desktop v1.11.0

注意：**Docker Desktopではありません**

# TL;DR

`docker-compose.yml`を配置する**ディレクトリの名称に日本語を含めるのはNG**らしい

# 事象

```bash
$ docker-compose up
project name must not be empty
```

`docker-compose up`が実行できない

# 原因

docker-compose.ymlを配置していたディレクトリのディレクトリ名に日本語が含まれていたことだった。

以下のようなディレクトリ構造

```
└── コンテナ化作業
    ├── Dockerfile
    └── docker-compose.yml
```

# 対処法

`docker-compose.yml`を配置するディレクトリの名称に日本語を含めない

# 教訓

ディレクトリ名どうするか悩んだ結果、適当に日本語にしたら痛い目にあった。こういう作業をするディレクトリの名称はアルファベットにしよう。
Docker Desktopでも同じことが起きるのかは分からない。
AWS CodeDeploy Agentを入れようとしたらAmazon Kinesis Agentが起動しなくなった話

## はじめに
この投稿は[アイスタイル Advent Calendar 2023](https://qiita.com/advent-calendar/2023/istyle) の25日目の記事です。
この投稿ではAWS CodeDeploy Agentを入れようとしたらAmazon Kinesis Agentが起動しなくなった話をしたいと思います。

## AWS CodeDeploy Agentとは
> AWS CodeDeploy エージェントソフトウェアパッケージをインスタンスにインストールして設定すると、そのインスタンスを CodeDeploy デプロイで使用できるようになります。

※AWSの[公式](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent.html)から拝借
EC2インスタンスに対してデプロイするために必要となっていくるパッケージです。

## Amazon Kinesis Agentとは
> Kinesis エージェントはスタンドアロンの Java ソフトウェアアプリケーションであり、データを収集して Kinesis Data Streams に送信する簡単な方法です。 このエージェントは一連のファイルを継続的に監視し、新しいデータをストリームに送信します。

※AWSの[公式](https://docs.aws.amazon.com/ja_jp/kinesis-agent-windows/latest/userguide/what-is-kinesis-agent-windows.html)から拝借
サーバ等からKinesis Data Streams に送信するために必要となっていくるパッケージです。

## 起きた事象
前提として、EC2インスタンスにはAmazon Kinesis Agentはすでに入っていてAWS CodeDeploy Agentを入れた時にAmazon Kinesis Agentが起動しなくなりました。

## 問題点
AWSの[公式](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html)にある、AWS CodeDeploy Agentのインストール手順に沿って進めていました。
```
sudo yum update
```
上記の公式手順に記載の、一番最初のステップであるyum updateが悪さをしていました。

## 解決策
問題点に記載されている、yum updateのステップを飛ばすことで解決。
無事、AWS CodeDeploy AgentとAmazon Kinesis Agentの両立が実現できました。
公式手順を闇雲に信じると、思わぬところで躓きますよ、のいい教訓となりました。
ちなみにこの問題点に関しては、AWSサポートにも入ってもらってもなかなか原因が究明できず、みたいな感じで結構な時間悩んでいましたが、まさかの灯台下暗しといった結末でした。
ネットでもこの手の記事が見あたらず、この記事が解決の一手になれば幸いです。

## 最後に
今回の投稿は弊社の[Rebornプロジェクト](https://note.com/istyle_tc/n/nde97c4849361)で起きた出来事です。
弊社ではオンプレミスのシステムをクラウドへ移行するプロジェクトを現在も絶賛進行中です。
他にも様々なプロジェクトが多角的に走っているので、ちょっとでも興味があるなって方はぜひ弊社の[採用ページ](https://recruit.istyle.co.jp/career/)にアクセスしていただければと思います。
機械学習で株価分析 06.個別の株価データの取得

# はじめに
本記事では、**PythonでYahooFinanceのデータベースから個別銘柄の株価情報を取得する方法**を紹介します。取得できるデータは、銘柄ごとの始値・高値・安値・終値・調整後終値・出来高です。

# 手順
### 1. yfinanceをインストール
以下のコードを実行してyfinanceをインストールします。実行環境はGoogle Colabを想定しています。
```python
!pip install yfinance
```

### 2. 必要なライブラリをインポート
以下のコードを実行して、必要なライブラリをインポートします。
```python
import yfinance as yf
yf.pdr_override()

import numpy  as np
import pandas as pd
from   pandas_datareader import data
import datetime
from   IPython.display   import display
```

### 3. データを取得する期間の指定
以下のコードを実行して、データを取得する期間を指定します。当日までのデータを取得するためには、終了日時に1日後を設定する必要があります。

```python
# データの取得開始日・取得終了日を設定
day_start = datetime.date(2021,1,1)
day_end   = datetime.date.today() + datetime.timedelta(days=1)
```


### 4. 株価データの取得と表示
以下のコードを実行して、株価データを取得し、コンソールに結果を表示します。銘柄名"4689.T"はLINEヤフーを表しています。これ以外でも、日本株の銘柄コードは株式コード末尾に".T"を追加すれば指定できます。

```python
# 銘柄名を変数に格納
stock_name  = ["4689.T"]

# 株価データを読み込み
df_stock = data.DataReader(stock_name, day_start, day_end, interval="1d")

# 結果をコンソールに表示
display(df_stock)
```

なお、以下のように記述すれば、当該株価の全期間のデータを取得できます。

```python
df_stock = data.DataReader(stock_name, period="max", interval="1d")
```

# ソースコード全文
以下にソースコード全文を示します。

```python
!pip install yfinance

# 必要なライブラリをインポート
import yfinance as yf
yf.pdr_override()
import numpy  as np
import pandas as pd
from   pandas_datareader import data
import datetime
from   IPython.display   import display

# データの取得開始日・取得終了日を設定
day_start = datetime.date(2021,1,1)
day_end   = datetime.date.today() + datetime.timedelta(days=1)

# 銘柄名を変数に格納
stocks  = ["4689.T"]

# 株価データを読み込み
df_stock = data.DataReader(stocks, day_start, day_end, interval="1d")

# 結果をコンソールに表示
display(df_stock)
```

プログラムを実行し、コンソール上に指定した期間の株価情報が表示されれば成功です。

# 目次へのリンク

https://qiita.com/ryo2_9393/items/2b1ada62c2537c901b6b
Vue3でよく使うパッケージまとめ

# はじめに
Vue3で使用頻度の高い(主観です)パッケージを列挙しています。
各パッケージの深い説明はありません。一言+githubのURLのみ記載しています。
Vite・VuetifyでSPA開発するときに使ったパッケージ群なので偏りがあるかと思います。他にもこういうのもあるよ！これ便利だよ！みたいのがあればコメントいただけると幸いです。

## アプリケーション関連
### Vue
説明不要と思います。
Vue3とVue2でgithubのサイトが異なるので見間違え注意。
https://github.com/vuejs/core
※Vue2だとhttps://github.com/vuejs/vue

### Vue Router
ルーティングを制御します。
Vue3の場合はVue Router4.xが対応します。
https://github.com/vuejs/router

### Pinia
状態管理を実現します。vuexの後継です。
https://github.com/vuejs/pinia

### Vue I18n
多言語化を実現します。(I18n = Internationalization)
https://kazupon.github.io/vue-i18n/

### Vite
ビルドツール。
Vue2で主流だったvue-cliよりも処理が早い。
https://github.com/vitejs/vite

## UI

### Vuetify
マテリアルデザインなUIライブラリ。
https://github.com/vuetifyjs/vuetify

### vite-plugin-vuetify
コンポーネントを自動インポートできる等のVuetify向けプラグイン。
https://github.com/vuetifyjs/vuetify-loader/tree/master/packages/vite-plugin

## 特化した機能を持つもの

### vue-chartjs
グラフ(チャート)を描画するライブラリであるchart.jsのVue向けラッパー。
https://github.com/apertureless/vue-chartjs

### VueUse
Vue向けの多彩なユーティリティ(200種類以上?)を持つライブラリ。
https://github.com/vueuse/vueuse

### Vue3 Pdf App
PDF.jsベースのVue向けPDFビューア。
https://github.com/stellR42/vue3-pdf-app

### Axios
HTTPクライアント。
https://github.com/axios/axios

## 単体テスト
### Vitest
Viteベースのテストフレームワーク。
https://github.com/vitest-dev/vitest

### Vue Test Utils
コンポーネントをテストするためのライブラリ。
https://github.com/vuejs/test-utils

### vue-router-mock
Vue Routerのモック。
https://github.com/posva/vue-router-mock

### axios-mock-adapter
Axiosを使うならモックはこれを使用します。
https://github.com/ctimmerm/axios-mock-adapter

## 静的解析

### eslint-plugin-vue
Vue向けのESLint。[ESLint](https://github.com/eslint/eslint)と合わせて使います。
https://github.com/vuejs/eslint-plugin-vue

## おまけ：パッケージではないですがよく使うツール類

### vue-devtools
chrome拡張のデバッグツール。
https://github.com/vuejs/devtools
[chromeウェブストア](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd)

### Vetur
VSCodeの拡張機能。シンタックスハイライト・インテリセンス等々多数の機能を持ちます。
https://github.com/vuejs/vetur

### Vue Peek
VSCodeの拡張機能。テンプレート内のタグ名から定義元のコンポーネントに移動する等、コーディング時のファイル移動を効率化します。
https://github.com/vuejs/vetur
【試験合格記】SAP-C02 && DAS-C01

お疲れさまです。
表題の試験を更新したため記録として残したいと思います。

# 受けた試験

- SAP-C02( AWS Certified Solutions Architect - Professional )
    - 受験日: 2023-12-08
    - 受験者スコア: 794/1000
- DAS-C01( AWS Certified Data Analytics - Specialty (Retiring April 9, 2024) )
    - 受験日: 2023-12-18
    - 受験者スコア: 842/1000

# 前回の受験記録

- [【試験合格記】AWS 認定ソリューションアーキテクト – プロフェッショナル(SAP-C01)](https://qiita.com/yastani/items/8293025e78ac7118f561)
    - 受験者スコア: 894
- [【試験合格記】AWS 認定 データアナリティクス – 専門知識(DAS-C01)](https://qiita.com/yastani/items/33a38ddf5d27189fa641)
    - 受験者スコア: 776

# 各試験の所感

- SAP-C02
    - 試験問題は前回出たような問題もそこそこ多かった気がする
    - EKSとかの問題が追加されてたりネットワーク系が減ってた印象
    - S3のストレージクラスに関する出題とかコスト削減に役立つサービスは多かったかも
    - CloudFormationとCDKはあまり見なかった気もする
    - 世に出回っている模擬試験だけで合格するには危うく、実務上の課題に挙げられるコスト管理やアラート周りの整備に関する知識が要求される
- DAS-C01
    - この試験は来年リタイアし、新たにData Engineer系の資格が増えるとか増えないとか
    - なのでメジャーバージョンは変わらず、内容も以前見たようなものがそのまま出ていた印象
    - Kinesis Firehose/Analytics や IoT に関する出題が多かった
    - あとはオンプレDBからAWSにマイグレーションする手法だったり、データ分析に使う用語やTB、PBクラスのデータを扱う方法など

# 受験者に向けたアドバイス

- いつの間にかAWS公式が主体となって試験対策のコンテンツを数多くリリースしてくれるようになったので、どんどん活用しよう
    - 試験ガイド
    - サンプル問題
    - 無料になった模擬試験
    - 試験対策コンテンツなど
- 学習時間はスコアに直結しやすいので計画的に学習をするのがよい
- 勉強を開始する前に試験の予約をしてしまえば勝手にやる気スイッチが入る…はず
- 触ったことのないサービスは率先してAWSコンソールから触ってみるのが大事、問題と記憶がリンクすれば答えも浮かびやすくなる
Shrink-fitting 第10章 薄肉圧力容器 基本例題10.09 p338「材料力学演習(20221021)」をsympyでやってみたい。(英:thin wall structure）

**パイソニスタの方へ**
・整数の丸めを教えて下さい。
-222.0 →　-222
278.0 →　278
# オリジナル
[基本例題10.09 p338](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=343)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
　　　　　　　　　　？？？タブレット等で、pdfを開く事ができないかも。？？？　

# sympyで
```python
from sympy import *
from decimal import Decimal, ROUND_HALF_UP

var('α2,ΔT,D,ΔD',real=True)
var('σt1,E1,t1' ,real=True)
var('σt2,E2,t2' ,real=True)
def myRound0(x):
    y = Decimal(str(x))
    a = y.quantize(Decimal('0'), rounding=ROUND_HALF_UP)
    return a

eq1=Eq(σt1,-E1/(1+E1*t1/(E2*t2))*ΔD/D)
eq2=Eq(σt2, E2/(1+E1*t1/(E2*t2))*ΔD*t1/ (D*t2)     )
rep={D:100,ΔD:0.25,t1:2.5,t2:2.0,E1:200*10**9,E2:200*10**9}  ;print("#",rep)
eq1=Eq(eq1.lhs,myRound0(eq1.rhs.subs(rep)/1000000))           ;print("#",eq1)
eq2=Eq(eq2.lhs,myRound0(eq2.rhs.subs(rep)/1000000))           ;print("#",eq2)
# {D: 100, ΔD: 0.25, t1: 2.5, t2: 2.0, E1: 200000000000, E2: 200000000000}
# Eq(σt1, -222.0)
# Eq(σt2, 278.0)
```

# いつもの? sympyの実行環境と 参考のおすすめです。
(テンプレート)

https://qiita.com/mrrclb48z/items/00dd08b0317069be9342

# いつもと違うおすすめです。

https://qiita.com/mrrclb48z/items/1ef7bb7b616c97698c40
YALMIPのインストールとSDP設定ガイド

YALMIPのインストールが、既存の記事では上手くできなかったため備忘録として記事にまとめました。
わかりにくい場合は申し訳ありません。

# YALMIPのインストールとSDP設定ガイド

このガイドでは、MATLAB用の最適化ツールキットであるYALMIPのインストールと、SDP（半正定値計画問題）を解くための環境設定について説明します。

## YALMIPのダウンロード

1. [YALMIPの公式サイト](https://yalmip.github.io/tutorial/installation/)にアクセスします。
2. ページにある[YALMIP-master.zip](https://github.com/yalmip/yalmip/archive/master.zip)のリンクをクリックし、ダウンロードします。

## SDPT3とSeDuMiのダウンロード

SDPを解くためには、SDPT3とSeDuMiという二つのソルバーが必要です。

1. [SDPT3のGitHub](https://github.com/sqlp/sdpt3)から`sdpt3-master.zip`をダウンロードします。
2. [SeDuMiのGitHub](https://github.com/sqlp/sedumi)から`sedumi-master.zip`をダウンロードします。

## ファイルの解凍と格納

ダウンロードしたzipファイルを適当なフォルダに解凍します。ここでは例として`Documents\MATLAB\`に格納します。

## ソルバーのインストール

### SDPT3のインストール

1. MATLABを起動します。
2. `sdpt3-master`ディレクトリに移動します。
3. MATLABコマンドウィンドウで`install_sdpt3`を実行します。

### SeDuMiのインストール

1. `sedumi-master`ディレクトリに移動します。
2. MATLABコマンドウィンドウで`install_sedumi`を実行します。

## MATLAB内でのパス設定

1. MATLABコマンドウィンドウで以下のコマンドを実行します。
   ```matlab
   addpath(genpath('C:\Users\<ユーザ名>\Documents\MATLAB\sedumi-master'))
   addpath(genpath('C:\Users\<ユーザ名>\Documents\MATLAB\sdpt3-master'))
   addpath(genpath('C:\Users\<ユーザ名>\Documents\MATLAB\YALMIP-master'))
   ```
2. 設定したパスを保存します。
   ```matlab
   savepath
   ```

## YALMIPのテスト

YALMIPが正常に動作しているかを確認するため、以下のコマンドを実行します。
```matlab
yalmiptest
```

### テスト結果の例

```plaintext
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|                                     Test|    Status|       Solver|
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|                     Core functionalities|   Success|             |
|                  Linear programming (LP)|    Failed|      LINPROG|
|               Quadratic programming (QP)|   Success|     QUADPROG|
|     Second-order cone programming (SOCP)|   Success|       SEDUMI|
|           Semidefinite programming (SDP)|   Success|       SEDUMI|
|               Geometric programming (GP)|   Success|      FMINCON|
|              Nonlinear programming (NLP)|   Success|      FMINCON|
|                    Nonlinear SDP (NLSDP)|   Success|      FMINCON|
|       Exponential cone programming (ECP)|   Success|      FMINCON|
|                  Mixed-integer LP (MIQP)|   Success|   INTLINPROG|
|                  Mixed-integer QP (MIQP)|   Success|          BNB|
|              Mixed-integer SOCP (MISOCP)|   Success|          BNB|
|   Global nonconvex quadratic programming|    Failed|       BMIBNB|
|             Global nonconvex programming|    Failed|       BMIBNB|
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
なぜそのプロダクトを使うのか？顧客理解を深める『社内勉強会』のすすめ

本記事は[リンクアンドモチベーションAdvent Calender2023](https://qiita.com/advent-calendar/2023/lmi) の20日目になります。

## はじめに

初めまして、リンクアンドモチベーションでプロダクトマネージャーを担っている粟田です。

プロダクトマネージャーの人なら誰でも、どうしたら 「 **顧客理解** 」ができるのかと考えるのではないでしょうか。

- 顧客理解をみんなでするための方法が何か一つでも知りたい
- プロダクトマネージャーで社内勉強会をやってみたいけど何も思いつかない

そんな悩みを持つ方に向けて、弊社でやってみた取り組みについて共有したいと思います。

## なぜやったのか

プロダクトマネージャーは複数名の体制をとっているのですが、PM歴・プロダクト経験歴がバラバラだったため、アドバイスをベテランに求めることが偏っていました。

そのため、もっとプロダクトマネージャーとしての知見を深めるために、何か共通テーマを決めてディスカッションしてみようぜとなりました。UIUXやインタビュースキル、仮説検証の方法など、いろんなテーマ案が出ましたが、その中でも最も全員にとって価値があり、スキルアップでのプロダクト還元が大きい「顧客理解」について深めることをテーマとして設定し、取り組むことにしました。

## 何をやったのか

具体的には、 **「なぜプロダクトを利用するお客様は、このプロダクトを使うのか」** について、議論しながら理解を深めるというものです。

それぞれが、以下3点の問いについて、事前に考え、MTGの中で共有・議論をする進め方で行いました。

問い

 **Q1. このプロダクトに期待することは何か・どんな課題を解決したいと考えているか**

 **Q2. その期待・課題があると考えたファクトは何か**

 **Q3. プロダクトを通してどんな価値が出せそうか**


弊社はtoBのサービスのため、

- 業界から、課題を推察する
- 統合報告書や決算資料などから、事業を理解する
- データから利用方法を調査する

などの方法を用いて、それぞれが課題/期待・価値ポイントを事前に検討し、議論を行いました。

## やってみてよかったポイント

実際にこの取り組みをやってみて、以下3点がよかったポイントとしてありました。

- 俯瞰的に顧客を理解できる
- シニアPMの顧客理解の方法が学べる
- 業務の中で、顧客が解決したい課題を再認識できる

### 俯瞰的に顧客を理解できる

通常の機能開発の場合、単機能のインタビューや利用状況のモニタリングなど、どうしても偏った顧客理解に留まってしまいます。

もちろんそれも重要ですが、俯瞰的に理解することで、プロダクトへの期待や出すべき価値などをより深く考える機会になりました。

### シニアPMの顧客理解の方法が学べる

いざこの取り組みをしてみると、

ジュニアPMはプロダクトの利用データを元に推察しているのに対して、シニアPMは業界情報から課題を推察し、顧客に降りていくという順序で考えているという差分が明確にありました。

シニアにとっては当たり前なことが、ジュニアにとっては当たり前ではないことはよくあるかとは思いますが、その事実を明確にできる、貴重な機会になりました。

### 業務の中で、顧客が解決したい課題を再認識できる

俯瞰的に顧客を理解できることの結果になりますが、やはり単機能について考えていると、プロダクト全体で解決したい課題については意識が薄れてしまっていきます。

その接続が弱いと、結果的に必要ない機能が生まれてしまう可能性が高まりますが、この機会で再認識することで、機能開発について検討しているときも、自然と大きな課題に意識が向くようになったと感じます。

## 最後に

顧客理解のためのアクションやプロダクトマネージャーの社内勉強会に迷っている方の一助になれば幸いです。

ぜひ、こんなこともやってみてよかった、などあればコメントにてご共有いただけると大変嬉しいです！
ホテル予約システムの設計

# はじめに
Laravelの学習を目的にホテル予約システムの作成をしました。これは設計段階の備忘録になります。


## 要件定義（管理画面）

ホテル予約システムに必要な要件を書き出します

### ユーザー管理（マスターアカウント）
- ユーザー情報を閲覧、追加、編集、削除できる機能（CRUD)
- ユーザーアカウントの権限設定（管理者、スタッフなど）

### 客室管理
- 客室情報の閲覧、追加、編集、削除できる機能（CRUD)
- 料金設定、利用可能数、部屋タイプなどの設定管理機能

### 予約管理
- 予約情報の一覧表示、予約詳細表示、変更、キャンセル（CRUD)

### 料金設定
- 料金プランの管理機能
- セット料金、割引、限定商品などの登録管理（CRUD）

### 通知機能
- 予約を実施した場合の通知
- ユーザーからキャンセルされた場合の通知

### セキュリティ
- システムを守るためのセキュリティ機能

## 詳細設計

### ユーザー画面

![スクリーンショット 2023-12-18 14.53.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/42f19390-063f-9675-8077-42e5b59c0835.png)

### 管理者画面
![スクリーンショット 2023-12-18 15.00.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/4b017755-cbd5-6e9e-3708-d59bacca5191.png)

それぞれCRUD機能を実装

![スクリーンショット 2023-12-18 15.01.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/a3b0657f-571f-ee2b-645a-b6d526694e97.png)


## データベース設計について

上記の機能に必要なテーブルを記述します

### users(ユーザー）テーブル
- ユーザーの基本情報を記述します
（ユーザーID,名前,メールアドレス,パスワードなど）
- ユーザーの権限
（管理ユーザー,一般ユーザーの役割を示すフィールド）

### rooms(客室）テーブル
- 客室に関する情報を記述します
（部屋ID,部屋タイプ,料金,設備,利用可能数など）
### reservations(予約）テーブル
- 予約に関する情報
（予約ID,ユーザーID,部屋,予約日,チェックイン,チェックアウト）

### reviews(レビュー）テーブル
- レビューや評価に関する情報
（レビューID,ユーザーID,部屋ID,評価,コメントなど）

## リレーション関係のテーブルについて

### users(ユーザー）と reservations(予約）
- 一般ユーザーアカウントと予約情報を関連付けます

### rooms(客室）と reservations(予約）
- 部屋と予約情報を関連付けします


## テーブルについて
### Users Table

| Column | Data Type | Description |
|--------|-----------|------|
| User ID | INT | ユーザーの一意の識別子 |
| Name | VARCHAR | ユーザーの名前 |
| Email | VARCHAR | ユーザーのメールアドレス |
| Password | VARCHAR | パスワードのハッシュまたは暗号化 |
| Role | VARCHAR | ユーザーの役割や権限を示すフィールド |

### Rooms Table

| Column | Data Type | Description |
|--------|-----------|------|
| Room ID | INT | 客室の一意の識別子 |
| Room Type | VARCHAR | 部屋の種類やタイプ |
| Price | DECIMAL | 部屋の料金 |
| Amenities | VARCHAR | 部屋の設備や提供されるもの |
| Available Count | INT | 利用可能な部屋の数 |

### Reservations Table

| Column | Data Type | Description |
|--------|-----------|------|
| Reservation ID | INT | 予約の一意の識別子 |
| User ID | INT | 予約をしたユーザーのID |
| Room ID | INT | 予約された部屋のID |
| Reservation Date | DATE | 予約が行われた日付 |
| Check-in Date | DATE | チェックインの日付 |
| Check-out Date | DATE | チェックアウトの日付 |
| Payment Info | VARCHAR | 支払いに関する情報 |

### Reviews Table

| Column | Data Type | Description |
|--------|-----------|------|
| Review ID | INT | レビューの一意の識別子 |
| User ID | INT | レビューをしたユーザーのID |
| Room ID | INT | レビュー対象の部屋のID |
| Rating | INT | レビューの評価 |
| Comment | TEXT | レビューのコメントや内容 |
Shrink-fitting 第10章 薄肉圧力容器 基本例題10.08 p338「材料力学演習(20221021)」をsympyでやってみたい。(英:thin wall structure）


# オリジナル
[基本例題10.08 p338](http://zairikiweb.starfree.jp/zai_enshuh/zai_enshuh_ver.3.3.pdf#page=348)＜[「材料力学演習(20221021)一括(ver.3.3)」を勉強したい。#sympy](https://qiita.com/mrrclb48z/items/c3274daf5f7a99cfe027#%E4%BD%9C%E6%A5%AD%E4%B8%AD%E7%A7%81%E3%81%AE%E8%A7%A3%E7%AD%94sympy)
　　　　　　　　　　？？？タブレット等で、pdfを開く事ができないかも。？？？　

# sympyで
```python
from sympy import *
var('α2,ΔT,D,ΔD',real=True)
eq=Eq(α2*ΔT*D,ΔD)
print("#",solve(eq,ΔT)[0])
# ΔD/(D*α2)
```

# いつもの? sympyの実行環境と 参考のおすすめです。
(テンプレート)

https://qiita.com/mrrclb48z/items/00dd08b0317069be9342

# いつもと違うおすすめです。

https://qiita.com/mrrclb48z/items/1ef7bb7b616c97698c40
2023アドカレ19:Figmaで両面印刷の16ページ折本を作る方法

# 何の記事？
これは、[ぐらだけアドカレ2023](https://qiita.com/advent-calendar/2023/c9h11o2)の19日目の記事です。

Figmaを使って、A4両面印刷でホチキス止めの16ページ折本を作る手順を書きました。

# 誰向け？ どんな役にたつ？
- Figmaで折本を作りたい人
- A4サイズで折本を作りたいが、8pだと足りない人
- 16p折本を片面印刷で作るにはページの大きさが小さい人

# あらすじ
よくA4両面印刷の16ページ折本をネットプリントに上げてくれているのですが、その作り方もあげていたので、これFigmaでも作れそうだな……？と作ってみることにしました。

# 参考にしたサイトなど
### イラストレーターでやる手順
イラレだとできるようなので、Figmaでも似たことはできそうかな、となりました。

https://note.com/nokiainoue/n/ne3e2399a45f3?sub_rt=share_h

### 16p折本についての折本
面付け配置や折り方、余白設定についてなどが書かれていて、とても参考になりました。

https://x.com/yue9/status/1735899143472824434?s=61&t=gxD7gnDC7wtnx8y6znBMyA

# 何をやったか
### 1. print for figma でA4 300dpiの設定を行う
Figmaプラグインの「print for figma」を使って、A4印刷用の枠組みを作ります。

![IMG_2909.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/a3eabcb9-c00e-2b19-884b-2c06ec4e0d65.jpeg)
![IMG_2910.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/e0b9a376-1b94-5e1d-7947-7bd7a6b7c68f.jpeg)

### 2. split shape で8分割する
できたフレームと同じサイズの四角を作って、プラグインで8分割を行います。
![IMG_2912.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/1269bd49-d9f8-ca2f-2c1b-4831cf2046d1.jpeg)
![IMG_2913.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/22aed854-0626-1ea1-e1c8-3d1659905ed8.jpeg)


### 3. 8分割サイズのコンポーネントを作る
右ページ・左ページのベースを作ります。
余白やテキスト領域、背景画像、フォントなどをここで設定しておくと、後はテキストをペーストするだけで同じ形式のページを作れます。
![IMG_2914.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/0014c8b1-f2f6-fe8b-6008-99e12b979bdf.jpeg)


### 4. 16ページの面付けをしたものを作る
両面コピー用に面付したベースを作っておきます。
先ほど8分割したページにページ番号を振っていきます。
右開き・左開きによって面付け順番が異なる為、ご注意ください。
![IMG_2915.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/8ed674ff-6ca3-1ba9-34a9-d38986f33dd4.jpeg)


### 5. 16ページの素体を作る
ページ毎にテキストやイラストなどを作ります。
面付したベースに後からページ毎に貼り付けを行います。
![IMG_2916.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/964152/303d1c51-b154-7ebe-70ff-3bca03a8bf08.jpeg)

### 6. 面付け部分に1ページずつ置いていく
各個ページができたら、面付をしたベースのところに貼付けを行います。
貼り付けたいページを選んで「貼り付けて置換」をするとスムーズです。

### 7. 印刷

# 結果
今回は以前、「書く習慣」に自分が上げたうちの子SSをサンプルテキストとして使いました。
いざ形にしようとしてみると背景画像やフォントなど、こだわりたくなってしまったので完成までは至りませんでしたが、自分の書いた文章があれば色々と形にしてみるとよいかと思います。
16ページもあれば1300文字位は入る印象でした。


# 応用
### 8ページ折本ツール
文章のみ＆8ページ折本であればこちらで作る方が手軽に作成できます。

https://sscard.monokakitools.net/orihon.html

### Canonおうちでつくる同人誌
こちらで折本テンプレートの説明がされている他、片面16ページ折本など、様々なテンプレートや同人誌印刷をサポートしてくださっているアカウントです。
折本以外にも、ネップリや自宅で印刷したいものがある方は参考に見てみてください。

https://twitter.com/Canon_doujin/status/1391325570617659393?lang=ja

# できなかったことなど
### 文章自動割り当て
何文字・何行……などでテキストを分割して、あとは貼り付け！……ができれば良いなと思ったのですが、思ったツールが見つかりませんでした。
今度はそういった変換ツールも探してみたいと思います。
日本語の改行をなんとかしたい！新しいテキスト系のCSSを簡単に試してみよう


こんにちは、はるまきです。
静岡アドベントカレンダーももしかして全部埋まるかも！？とワクワクしています！！
皆様のご登場に、感謝感謝です。来年もよろしくお願いいたします。

さて、今日は新しいテキスト系のCSSを簡単に試せるのを作ってみたので紹介します。

# なやみ

見出しのデザインをコーディングするときのあるある。

コーダー）できました！
デザイナ）改行がデザイン通りじゃないから直して
コーダー）直しました！
デザイナ）やっぱりiPhoneSEで確認したら違ったから直して
コーダー）直しました！
デザイナ）ありがとう！（やっとか...）
コーダー）（レスポンシブの事情がね...）

というわけで、キャッチコピーや見出しって、改行などにも意味があったりして、レスポンシブで表現するときになかなか難しかったり。
こんなやりとりに便利なCSSが今年はいろいろ出たんですよね〜


# 作る前に確認してみるのはいかが？

そんなわけで、作る前にちょっと確認できるツールを作ってみました。

<p class="codepen" data-height="1000" data-default-tab="result" data-slug-hash="KKJOJye" data-user="harumakiyukko" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/harumakiyukko/pen/KKJOJye">
  Untitled</a> by ゆっこ (<a href="https://codepen.io/harumakiyukko">@harumakiyukko</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

ウィンドウ幅を変えたい場合は、Codepenへ行くのが早いかも。
「Vue」ボタンを押してコードを表示させてから、中心線を左右に動かしてもらうのが簡単かな..
もしくはブラウザ自体を動かすか...

# 積み残し

- フォントサイズもレスポンシブ対応したい
- フォント種類とスタイルも変更できるようにしたい
- 画面幅を変えられるようにしたい

ここら辺対応しないと実用にはまだまだかな。
しかし力尽きたのでここまで。
もしニーズがあれば頑張ります...
デザイナーやプランナーなどの方々にも使ってもらえたらうれしいです。
NESMA試算法

# NESMA試算法

NESMA（Netherlands Software Metrics Association）が開発したFPカウント手法の1つ。

- NESMA概算法やIFPUG法と比べて、大雑把だけど手軽な見積もり手法。
- データファンクションとタイプを決定するだけで自動的にFPを算出できる。
- 開発初期段階で素早くシステム規模を見積もるために使用できる。

# 使用例

以下のようなユーザ要求について考えてみる。 

> 顧客データと、製品データを維持管理し、供給者データを参照することを要求している。

手順は至ってシンプル。

1. データファンクションを洗い出す
1. 各データファンクションのタイプ( ILF or EIF )を決定する
1. ILFなら35FP、EIFなら15FPとして計算する
1. 合計してシステム全体のFPを算出する

## 1. データファンクションを洗い出す

データファンクションとは、ユーザが認識できるデータのまとまり（定義） のこと。
- 設計でいうところの、エンティティやデータストア
- 実装でいうところの、テーブルやファイル

今回でいうと、顧客データ・製品データ・供給者データの3つが該当する。

## 2. 各データファンクションのタイプ( ILF or EIF )を決定する

- ILF : Internal Logical File
    - 対象システムで作成・更新・参照・削除を行うもの
- EIF : External Interface File
    - 他のシステムによって提供され、対象アプリケーションは参照だけするもの

今回のケースだと、顧客データ・製品データはILF、供給者データはEIFになる。

## 3. ILFなら35FP、EIFなら15FPとして計算する

顧客データ・製品データはILFなので35FP
供給者データはEIFなので15FP

## 4. 合計してシステム全体のFPを算出する

| データファンクション | タイプ | FP値 |
| - | - | - |
| 顧客データ | ILF | 35 |
| 製品データ | ILF | 35 |
| 供給者データ | EIF | 15 |
| 合計 |  | 85 |

今回のシステムの規模は、85FPという結果になった。

# 工数換算

85 (FP) ÷ 11.15 (FP/人月) ≒ 7.6 (人月) 

## FP/人月について

FPを工数に換算するためには、「1人月(人日・人時)あたりのFP」を事前に把握しておく必要がある。

基本的に過去プロジェクトの実績で算出するが、手元にデータがない場合は[ソフトウェア開発データ白書](https://www.ipa.go.jp/publish/wp-sd/download.html)などが参考になる。

今回使用した 11.15 FP/人月 という値は、上記白書から中央値(新規開発/400FP未満)を引用している。

# 参考

- [Early Function Point Counting 開発初期段階でのFPカウント方法](https://nesma.org/wp-content/uploads/2015/07/Early-Function-Point-Counting-Japanese.pdf) 
- [FPで測れるもの 測れないもの](http://www.jfpug.gr.jp/app-def/S-102/wp/wp-content/uploads/os2017spec3.pdf)
サーバの sshd とは別にもう一つ OpenSSH サーバを立てる

「OpenSSH の特定のバージョンをテストしたい」でも「いま動いている SSH サーバは OS のアップデートで管理したいので、置き換えたいわけではない」となることがありますよね。
そんなとき、いま port 22 で listen している sshd とは別に、OpenSSH サーバをソースからビルドして、別ポートでもう１つ sshd を立てるにはどうするのか、その手順をまとめてみます。

## 方針
- システムの openssh を上書きしない
  - /usr/local の下の別フォルダにインストールする
  - /etc/ssh は参照しない
- OS のユーザで認証する
- 常用するわけではないので systemctl の用意などはしない

## コンパイル
試した環境は、手元にあった AlmaLinux 9 です。
暗号ライブラリは元々入っている OpenSSL 3.0.1 を使用します。
```
$ rpm -q openssl
openssl-3.0.1-43.el9_0.x86_64
```
コンパイラや、コンパイルに必要なヘッダを入れます。
```
$ dnf install gcc zlib-devel openssl-devel pam-devel
```
OpenSSH 9.6 のソースを入手してコンパイルします。
```
$ wget https://cloudflare.cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.6p1.tar.gz
$ tar zxvf openssh-9.6p1.tar.gz
$ cd openssh-9.6p1
$ ./configure \
--prefix=/usr/local/openssh-9.6 \
--with-pam \
--with-ssl-engine
$ make
$ sudo make install
```
/usr/local/openssh-9.6/{bin,sbin,libexec,share,etc} にインストールされました。
また、make install の途中で /usr/local/openssh-9.6/etc にサーバホスト鍵が自動的に作成されたので、システムの /etc/ssh が参照されないこともわかります。

## 起動
先に firewall を空けておかないと外部から接続できません。
```
$ sudo firewall-cmd --add-port=2296/tcp --zone=public
```
sshd を起動します。設定変更は /usr/local/openssh-9.6/etc/sshd_config を編集してもいいですが、引数でも指定できます。
- `-d -d -d` オプションで debug3 ログまで出力します
- `-p` オプションでポート番号を指定します
```
$ sudo /usr/local/openssh-9.6/sbin/sshd -4 -d -d -d -e -p 2296
```
クライアントから接続して SSH が切断されると sshd は終了します。
Docker・Docker-composeで構築したpgAdminのインポート/エクスポート方法

# 概要
 表題の通り、`Docker`・`Docker-compose`で構築した`pgadmin`のインポート(`import`)/エクスポート(`export`)の実施方法を記載します。

# 構築環境
以下に、今回使用した環境を示す。

## ディレクトリー構造
```sh
.
├── db/
│   ├── conf/
│   │   └── .env
│   └── db_volume # ← コンテナー立ち上げ時に自動で生成
├── pgadmin/
│   ├── conf/
│   │   └── .env
│   └── pgadmin_volume # ← コンテナー立ち上げ時に自動で生成
└── compose.yml
```

## compose.yml
```compose.yml
version: "3.9"

services:
  db:
    image: postgres
    restart: always
    ports:
      - "5432:5432"
    volumes:
      - ./db/db_volume:/var/lib/postgresql/data
    env_file:
      - ./db/conf/.env

  pgadmin:
    image: dpage/pgadmin4
    restart: always
    volumes:
      - ./pgadmin/pgadmin_volume:/var/lib/pgadmin # ← 重要 
    env_file:
      - ./pgadmin/conf/.env
    ports:
      - 8080:80
    depends_on:
      - db
volumes:
  db_volume: {}
  pgadmin_volume: {}
```
## `.gitignore`ファイル
```.gitignore
db/db_volume
pgadmin/pgadmin_volume
```

## `env`ファイル
`db`ディレクトリー内に設置した`conf`ファイル
```.env
POSTGRES_DB=test_db
POSTGRES_USER=example
POSTGRES_PASSWORD=password
```

`pgadmin`ディレクトリー内に設置した`conf`ファイル
```.env
PGADMIN_DEFAULT_EMAIL=test@example.com
PGADMIN_DEFAULT_PASSWORD=hogehoge
```

# ファイルの設置または抽出されるディレクトリー
- エクスポートの場合は、下記のディレクトリ内に作成される
- インポートの場合は、下記のディレクトリ内にインポートしたいファイルを設置する

```sh
.
# 省略
├── pgadmin/
│   ├── conf
│   └── pgadmin_volume/
│       └── storage/
│           └── PGADMIN_DEFAULT_EMAILで設定した値 # ← このディレクトリー内にエクスポートファイルが生成される
# 省略
```

:::note warn
データー出力画面からもエクスポートは可能。その場合、『**ファイルに結果を保存**』のボタンを押下して行う。エクスポートしたファイルの出力先は、ブラウザーやPCの設定によるが上記で指定した以外の場所に保存される。
（例えば、デスクトップ画面、ダウンロードディレクトリー等に保存される）


![一覧画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664659/6bb975e4-5671-dd9c-66cf-16e211fc0ee7.png)
:::


 # 補足
 `pgadmin`の`import`では、`CSV`ファイルからデータを`import`をする事ができますが、上手く取り込めない事があります。その場合は、下記のサイトで`CSV`の中身を`insert`文に変換してから取り込むと上手くいくと思います。

- [無料のオンラインCSVからSQLへのコンバーター](https://bfotool.com/ja/csv-to-sql)

# 筆者が作成したディレクトリー

https://github.com/kengo-sk8/pgAdmin_test1

 # 参考資料
 - [[Docker hub]dpage/pgadmin4](https://hub.docker.com/r/dpage/pgadmin4/)
 - [Container Deployment](https://hub.docker.com/r/dpage/pgadmin4/)
CodePlanというリポジトリレベルのコード生成AIがあるらしいので、論文を読んでみた

## はじめに

この記事は[ディップ Advent Calendar 2023](https://qiita.com/advent-calendar/2023/dip-dev)の19日目の投稿です。

「生成AI」という言葉を聞かない日はないくらい有名になりましたね。
GitHub Copilotを使ってコードを書いているのですが、少し工夫するだけで期待通りのコードを提案してくれるので、ググりに行く回数が明らかに減りました。
(リモートワークで仕事をしているので、隣の席の人と会話しながらコードを書いているみたいな感覚になれるのも、かなりうれしいポイントですw)

Copilotを重宝している筆者なのですが、たまに「複数ファイルのコードを一気に生成してくれたらな」と思ってしまうときがあります。

今回は、そんな願いを叶えてくれるかもしれない、「[CodePlan: Repository-level Coding using LLMs and Planning](https://arxiv.org/abs/2309.12499)」という論文を読んでみました。
少し長い論文だったので、概要のみを紹介します。

## CodePlan

### 概要

CodePlanとは、Microsoft Researchの研究者たちが発表した、LLMを利用してリポジトリレベルのコーディング作業を解決するフレームワークです。

GitHub CopilotやAmazon Code Whispererなどは、周囲のコードのコンテキストからコードを編集を行えますが、適用範囲は行やメソッドなどの小さな範囲です。
CodePlanでは、新しいバージョンへの対応タスクのような、リポジトリ内の複数のファイルに渡る段階的な編集作業を行うことができます。

### 手法

CodePlanでは、グラフ理論とLLMを組み合わせた手法を用いているようです。

厳密には違いますが、ざっくりしたイメージだと、以下のサイクルを回して、大きな編集タスクを達成するという仕組みです。

1. LLMによるノード(小さな編集タスク)の実行
1. 依存関係と影響範囲の分析
1. 編集プランの修正

![スクリーンショット 2023-12-19 11.30.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3620647/b8cb3edb-e8ad-144b-b7dd-1c265997166a.png)

### 展望

今後の展望としては、機能強化、影響分析のさらなるカスタマイズなど挙げられていました。
現時点ではC#とPythonのみの実験なので、他の言語やフレームワークなどへの適用はこれからのようです。

## さいごに

今回、ざっくりと手法をまとめてみて、人間も近しい思考方法で大きなタスクを解決しているなと感じました。
2023年12月時点では、フレームワークを提案した論文のみなのですが、ぜひ製品化してほしいですね。
Microsoft Researchの研究者たちによる論文なので、GitHubやVSCodeなどとの連携が期待できそうです。

誤って理解しているところがあるかもしれません。
そのような箇所を見つけたら、教えていただけると幸いです。

## 参照

- [CodePlan: Repository-level Coding using LLMs and Planning](https://arxiv.org/abs/2309.12499)
アーキテクチャパターンについて

# はじめに
アーキテクチャパターンについて学んだので、備忘録的な感じで書いていきます。

# アーキテクチャとは
　アーキテクチャとは、一般的には、システムや構造の設計や構築に関する概念を指します。主に、ソフトウェアアーキテクチャと呼ばれることが多く、これはソフトウェアシステムの構造に関するパターンのことをいいます。
　適切なアーキテクチャを選択することで、システムの拡張性、保守性、性能、セキュリティなどの重要な品質属性を確保し、開発者や保守者が効果的に作業できるようにするために重要な役割を果たします。
以下が具体的にアーキテクチャが含んでいる主な要素です。
- コンポーネントとモジュール
- データ構造
- アーキテクチャパターン
- 通信プロトコル
- デプロイメントアーキテクチャ
- 品質属性

今回はこの中の「アーキテクチャパターン」について書いていきます。

# アーキテクチャパターンとは
　アーキテクチャパターンとは、ソフトウェアアーキテクチャにおける一般的な問題に対する解決策とされるテンプレートやベストプラクティスの集合になります。
　これらのパターンは、再利用可能で柔軟な設計の原則を提供し、ソフトウェアの保守性、拡張性、性能などの特性を向上させるのに役立ちます。

## アーキテクチャパターンの種類
　アーキテクチャパターンはたくさん種類がありますが、その中で代表的なものを上げていきます。
 ※画像は、イメージしやすそうなものを引っ張ってきました。
 
### モノリシックアーキテクチャ:

単一の大規模なアプリケーションで全ての機能が統合されており、
単純な開発とデプロイが可能ですが、保守性や拡張性に課題が発生することがあります。
以下はマイクロサービスアーキテクチャとの比較となる画像です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/7cdce6b1-84d4-ad48-c31a-6b4d53313468.png)

### マイクロサービスアーキテクチャ

アプリケーションを小さな独立したサービスに分割します。
各サービスは独自のデータベースやコードベースを持ち、独立してデプロイでき、
スケーラビリティや柔軟性が向上しますが、分散システムの管理が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/1f4b95c0-da77-fbf6-dbec-b0de3120b6ec.png)

### イベント駆動アーキテクチャ

イベントと呼ばれる状態変化をトリガーとして、異なるコンポーネントが非同期で連携します。
ローカルコンポーネント間の結合を緩和し、柔軟性や拡張性を提供します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/334f1d7b-0ab2-525f-3c52-4fad18c42de0.png)

## レイヤードアーキテクチャ

システムを機能や責務に基づいて複数の階層（レイヤー）に分割します。
各レイヤーは特定の責務を持ち、階層ごとに抽象化されたAPIを介して通信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/6715557d-d23c-61ff-6ce8-d5d4902c1489.png)

### パイプラインアーキテクチャ

データ処理やビジネスプロセスを連続的なステップ（パイプライン）に分割します。
各ステップは前のステップの結果を入力として受け取り、出力を生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2613586/34bbe7e0-b7ce-f3c3-f142-9ffc4970aeb2.png)

# まとめ
　今回はアーキテクチャパターンについて書きました。
 たくさん種類がありますが、プロジェクトの要件や目標に基づき、適切な設計や選択をすることが大切だなと感じました。

# 最後に
他にも色々な記事を書いているので、よければ読んでいってください、、、

https://qiita.com/hukuryo/items/97797a91d7e2ee0bcabc

https://qiita.com/hukuryo/items/2c07c52ff3386d5d75b9

https://qiita.com/hukuryo/items/ebeb26823f944f143b11
Enabling the Use of Unitree L1 LiDAR without rviz

# Introduction
I have developed a method to use the Unitree L1 LiDAR without relying on rviz.(on ROS)

# Repository
For detailed usage instructions, please refer to the README file in the repository published on [GitHub](https://github.com/keigo1110/unilidar_sdk).

# Issue
When attempting to display LiDAR data without using rviz, executing `run_without_rviz.launch` does not yield the same display as when using rviz. The following image is an example of this issue.

![Screenshot 2023-12-19 at 11.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346908/f4bd4cf6-cf70-94d0-adc2-83bf2fbaeece.png)

# Modification
To solve this problem, I added `unitree_lidar_ros_without_rviz.h`, which improved the display as shown in the image below.

![Screenshot 2023-12-19 at 11.05.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346908/14cd4ebb-fa82-3098-3b16-d117a0dc8418.png)

In rviz, point clouds are visualized by retaining them for a certain period. In our improvement, multiple point clouds are retained at the stage of publishing, and then published together.

To increase the number of point clouds, modify the numbers on lines 192 and 193 of `unitree_lidar_ros_without_rviz.h`. The relevant code is as follows:
```unitree_lidar_ros_without_rviz.h
      if(cloudQueue_.size() > 10) {
      	while(cloudQueue_.size() > 10) {
      	  cloudQueue_.pop_front();
      	}
      }
```

# Run
The Build process remains the same as before.

For Run, follow these steps:

- If using rviz:
```
source devel/setup.bash

roslaunch unitree_lidar_ros run.launch
```
- If not using rviz:
```
source devel/setup.bash

roslaunch unitree_lidar_ros run_without_rviz.launch.launch
```

# Conclusion
This improvement is compatible with ROS but not with ROS2 or unitree_lidar_sdk. Please refer to the provided code for reference and make appropriate modifications.

You can view the code here:

https://github.com/keigo1110/unilidar_sdk
AWS CISベンチマークv2.0.0：重要な変更 まとめ #STIG #PCI-DSS #CISベンチマーク

# AWS CISベンチマークの使い方

最新のAWS CISベンチマークに準拠したテストコードが用意されています。

https://github.com/mitre/aws-foundations-cis-baseline

`mitre`リポジトリ は、脆弱性で有名な**CVE**の管理をしている組織[MITRE Corporation](https://www.sompocybersecurity.com/column/glossary/mitre)がメンテナンスしています。
今回使用するもの以外にも、CISやSTIGに準拠した無料のテストコードを多数公開しています。フルリストは[こちら](https://saf.mitre.org/libs/validate)で確認できます。

上記テストコードの具体的な使い方については、以下の記事で説明されています。

https://www.chef-sec.com/stig_cis__benchmark_test/


CIS（Center for Internet Security）は、Amazon Web Services（AWS）Foundationsベンチマーク2.0バージョンをリリースしました。新しいセキュリティの推奨事項や古い項目の削除など、いくつかの重要な変更が含まれています。

## CISベンチマークについて

Center for Internet Securityは、サイバーセキュリティを向上させるための非営利組織です。CISはさまざまなステークホルダーと協力し、進化するセキュリティの脅威に対応するために、ベンチマークを継続的に更新しています。

## v2.0.0の変更点

CISベンチマークの更新には通常、検出および修復の改善といくつかの新しいセキュリティの推奨事項が含まれます。しかし、新しい2.0リリースは、驚くべき新しい11個の推奨事項を導入し、古い2つを削除しました。

## 削除された項目

既存のコントロール「Ensure all S3 buckets employ encryption-at-rest」は、ベンチマークから削除されました。2023年1月、AmazonはすべてのS3バケットが、デフォルトで安全に暗号化されることを発表しました。これはS3データセキュリティにとって素晴らしい進展であり、管理者によって修正される必要があった一般的なセキュリティの誤設定を完全に防ぎます。

## 追加項目：AWS CloudShellの使用制限

新しく追加された「AWS CloudShellの使用制限」は、リモートシェルの潜在的なリスクを制限することを目的としています。私のような方も心臓が一瞬止まるかもしれませんが、心配しないでください。CISはCloudShellへのアクセスを完全に無効にすることは提案していません。新しい推奨事項は、IAMポリシー「AWSCloudShellFullAccess」を無効にするだけです。

「AWSCloudShellFullAccess」権限は、CloudShellインスタンスを介してローカルシステムにファイルをアップロードおよびダウンロードするなど、AWSアカウントへの無制限のアクセスを提供します。このアクセスレベルを削除することにより、AWSアカウント内での重要なデータの流出リスクを防ぎます。

## 追加項目：EC2 Metadata ServiceによるIMDSv2の利用

大きな変更のもう一つは、「EC2 Metadata ServiceによるIMDSv2の利用」です。新しくより安全なインスタンスMetadata Serviceの使用を強制します。
IMDSv2は2019年に導入され、既存のインスタンスMetadata Serviceにおけるいくつかの主要な脆弱性を排除するために開発されました。
これらの脆弱性は、大規模なセキュリティ侵害を引き起こす原因となっていました。IMDSv2はセッション認証、低レベルTTL、およびHTTP PUTリクエストを使用しており、誤りのあるアプリケーションファイアウォール、ロードバランサー、またはNATアプライアンスを使用した場合に、インフラストラクチャ外のユーザーがインスタンスメタデータを要求するのを防ぎます。

これは明らかなセキュリティの向上のように思えるかもしれませんが、インスタンスを新しいバージョンにアップデートすることは時間がかかるうえ、構成管理システムなどのソフトウェアの更新が必要となるかもしれません。しかし、この新しい項目だけでも、CISベンチマークのバージョンアップの価値があります。

## その他の重要な変更

Amazon Web Services Foundations 2.0ベンチマークの大部分の変更は、既存の項目の内容を更新する形で行われています。リスクの説明が向上したほか、監査および修復手順が更新された11のベンチマークが含まれています。これらの変更の一部は、AWSの変更に対応するための微調整ですが、他の項目は、ユーザーがより迅速に解決するのに役立つ重要な改良です。

## Chef InSpecでAWSアカウントのCSPM：アカントセキュリティ

Progress Chef 社が提供するInSpecで、インスタンス、VM、コンテナとホストOSのセキュリティ監査に加えて、AWS、GCP、Azure のアカウントをセキュアに保ち、監視することができます。詳細は；

https://www.chef-sec.com/stig_cis__benchmark_test/

InSpec の技術サポートやライセンスの取得について[お問い合わせ](https://www.chef-sec.com/%e3%83%9b%e3%83%bc%e3%83%a0/%e3%81%8a%e5%95%8f%e3%81%84%e5%90%88%e3%82%8f%e3%81%9b/)ください。
PLCメモリ体系とデータの単位

現場の皆さんお疲れ様です！

自分の勉強のため、保存用として投稿いたします！

初めの投稿はPLCメモリとデータの単位になります。

では早速入ります！

----------------------------------

PLCの基本データ単位はBit(ビット)です。

このBitのデータ領域は 0 または 1が表現できます。
従ってポンプやファンに付いてるモーターがON・OFFになっているか表現できます。

場合の数が二つの時なら1Bitのデータの大きさで表現できます。

なら二つの以上の大き数を表現する場合は？

例えばモーターのRPM速度を表現するためには1Bitでは難しいですよね？

100RPMの場合も、101,102,103,104...など幅広い数を表現するには二つしか表現できない1Bitでは難しいでしょう。

この場合はBitを集めて大きな数を表現できます。

Bitより大きいデータの単位は以下になります。

1) 1 Bit(ビット)

2) 4 Bit = 1 Nibble(ニブル)

3) 8 Bit = 1 Byte(バイト)

4) 16 Bit = 2 Byte = 1 Word(ワード)

5) 32 Bit = 4 Byte = 2 Word = Double Word(ダブルワード)

6) 64 Bit = 8 Byte = 4 Word = Long Word(ロングワード)

各データの大きさが違い、各データで表現できる数の大きまも違うんですね？

もっと詳しく調べましょう

1) 1 Bit(ビット)
　二つの数を表現可能　数字0と1を表現できます。

2) 1 Nibble(ニブル)
　16の数を表現可能　0~15まで表現できます。

3) 1 Byte(バイト)
　256の数を表現可能 0~255まで表現できます。
　ただし、0~255の表現は符号がない0を含む自然数の時の領域で、符号を含む整数(負の整数と自然数両方)を表現したいときは
 -128~127まで表現できます。

4) 1 Word(ワード)
　65,536の数を表現可能　0~65,535まで表現できます。
 ただし、バイトと同じで符号を含む全体領域の整数表現は
 -32,768~32,767まで表現できます。

5) 1 Double Word(ダブルワード)
　4,294,967,296の数を表現可能　0~4,294,967,2985まで表現できます。
 バイトとワードと同じ、符号を含む全体領域の整数表現は
 -2,147,483,648~2,147,483,647まで表現できます。

6) 1 Long Word(ロングワード)
　ロングワードはあんま使わないですけど..
 表現可能ば数は-9,223,372,036,854,775,808 ～ 9,223,372,036,854,775,807まで表現できます。

 データ単位で表現できる値が決められた背景についてです。
‘パソコンは0と1しか知らない’っていう言葉を聞いたことがあると思います。

そうです。パソコンは2進数体系だけを理解してコントロールできます。
なのですべてのデータ単位の基本がBit(ビット)になるんです。

なら、バイトを例として表現可能な値を見てみましょう。

1Byteは上記の話したように256の数を表現でき、0~255まで表現できます。
1Byteは8Bit、つまり8個のBitです。

2進数 1 0 1 1 1 0 1 1なら

右から1番目は2の0乗
右から2番目は2の1乗
右から3番目は2の2乗になります。

![スクリーンショット 2023-12-19 113803.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639798/062ab9b3-22c3-36c1-32c2-ad442cbdea32.png)

PLCとPCでも同じです。
(1Byteは2の7乗まで、1Wordは2の15乗までの2進数になります)

従って、1ByteのデータはCPUが上のように認識するため
1Byte(8Bit)最大の数が255になります。

Word, Doble Word, Long Wordも同じです。

今まで調べた内容で私たちが普段使う10進数を変換したら以下になります。

10進数 = Decimal
16進数 = Hexadecimal
2進数 = Binary

![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/639798/f8f7b24d-a0ed-1b91-13bf-ec5f78b8b54e.png)

10進数の0から27までを1Byte 2進数で表せたところを見てください。

-------------------------------


今日はここまでで、時間があるときに少しずつ投稿しようと思っています。
演算子の&&を「かつ」で覚えていたため痛い目にあった

## この記事を書こうと思ったきっかけ
udemyでjsの勉強をしていて以下のような論理積演算子(AND)のコードで私が想像していた答えとは別の答えが帰ってきてその理由が意外な理由だったため忘れないため記事に残します。
```
const ok = `hello` && `hi`
console.log(ok)
```
私の最初の答えは&&＝「かつ」なので、okにはhelloとhi両方代入されていると考えたため、helloとhiの両方出力されるのではと思ったが、まさかの結果はhiのみの出力だった

## なぜ、hiのみが帰ってきたのか
結論、論理積演算子(AND)は<font color= "red" >左側がtrueなら右側を返し、左側の値がfalseだったら左側を返す</font>から

## 上記を踏まえて以下のコードを見てみる
```
const ok = false && true
console.log(ok)
```
このコードではfalseが出力される
理由は左側の値がfalseだったら左側を返すから
演算子の||を「または」で覚えていたため解けない問題があった

## この記事を書こうと思ったきっかけ
udemyでjsの勉強をしていて以下のようなOR演算子のコードで私はどちらを返すかがわからなかったのですが理由を聞いて納得したので記事に残します。
```
const ok = `hello` || `hi`
console.log(ok)
```
私の最初の答えは||＝「または」なので、そもそも私にはhelloまたはhiのどちらがかえってくるか検討もつきませんでしたが帰ってきたのはhelloでした

## なぜ、helloが帰ってきたのか
結論、OR演算子は<font color= "red" >左側がtrueなら左側の値を返し、右側の値がどうであれ無視する。逆に左側の値がfalseだったら右側の値を返す</font>から

## 上記を踏まえて以下のコードを見てみる
```
const ok = false || true
console.log(ok)
```
このコードではtrueが出力される
理由は左側の値がfalseなので右側の値を返すから
Unitree L1 LiDARをrviz以外でも使えるようにする

# はじめに
Unitree L1 LiDARをrvizを使用せずに使えるようにする方法を開発しました。(ROSのみ)

# リポジトリ
詳細な使い方については、[GitHub](https://github.com/keigo1110/unilidar_sdk)で公開しているREADMEを読んでください。

# 問題点
rvizを使用せずにLiDARデータを表示しようとすると、
```
run_without_rviz.launch
```
を実行しても、rvizで表示されるときのようにはなりません。
下記の画像はその一例です。

![Screenshot 2023-12-19 at 11.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346908/f4bd4cf6-cf70-94d0-adc2-83bf2fbaeece.png)

# 変更点
この問題を解決するために、`unitree_lidar_ros_without_rviz.h`を追加し、次の画像のように表示されるよう改善しました。

![Screenshot 2023-12-19 at 11.05.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3346908/14cd4ebb-fa82-3098-3b16-d117a0dc8418.png)

rvizでは点群を一定時間保持し可視化しています。そのため今回の改善では、点群をパブリッシュする段階で複数の点群を保持し、まとめてパブリッシュするように変更しました。

点群をさらに増やすには、`unitree_lidar_ros_without_rviz.h`の192行目と193行目の数字を増やしてください。対象のコードは以下の部分です。
```unitree_lidar_ros_without_rviz.h
      if(cloudQueue_.size() > 10) {
      	while(cloudQueue_.size() > 10) {
      	  cloudQueue_.pop_front();
      	}
      }
```

# 実行
ビルドまでの手順は変わりません。

実行は以下の通りにどちらも可能です。

- rvizを用いる場合：
```
source devel/setup.bash

roslaunch unitree_lidar_ros run.launch
```
- rvizを用いない場合：
```
source devel/setup.bash

roslaunch unitree_lidar_ros run_without_rviz.launch.launch
```

# おわりに
この改善はROSに対応していますが、ROS2やunitree_lidar_sdkには対応していません。提供しているコードを参考に、適宜変更を加えてください。

コードはこちら：

https://github.com/keigo1110/unilidar_sdk
[tips]Elasticsearchのハイライトが破損している時の対処法

Elasticsearchのハイライト機能を利用する際、ハイライトが破損した状態で返却してくることがあります。
一つの原因として考えられるのが、ハイライトのフラグメントを生成する際、サロゲートペアを1文字ではなく2文字としてカウントしてしまい、ハイライト生成の条件によってはサロゲートペアの文字コードの前半(上位サロゲート)のみを読み込んでしまうことです。
これは2019年にElasticsearchへ報告され、その後Luceneにtransferされましたが、いまだに修正されていません。

https://github.com/elastic/elasticsearch/issues/41556

https://github.com/apache/lucene/issues/9823

ただ、いくつか対策は存在するため、今回はそちらを紹介します。

## number_of_fragmentsを0にする

ハイライトには`number_of_fragments`というオプションが存在し、返却するハイライトの数を指定することができます。
しかし、これを0にすることでハイライトを返す場合本文全てを返すようになります。フラグメントに切る処理をしないのでサロゲートペア問題が発生しないというわけですね。
本文の長さがある程度短い場合はこちらを検討するのも良いでしょう。

## boundary_scannerをwordかsentenceにする

boundary_scannerというオプションはfragmentの切れ目を指定することが可能です。
`chars`、`word`、`sentence`の３オプションが存在します。
`chars`の場合はfragment_sizeに到達するとそこを切れ目にしますが、`word`や`sentence`にすることで切れ目を単語や文の終わりに調節することができます。
現在、`chars`だと先述のバグが発生してしまうため、こだわりがなければ`word`や`sentence`にすると良いでしょう。

### boundary_scannerで`chars`以外を設定する場合はboundary_scanner_localeを設定する

`boundary_scanner`を`word`や`sentence`にすることで、fragmentを単語や文の終わりで切ってくれますが、言語によって切る基準は異なるので指定してあげる必要があります。
この場合、boundary_scanner_localeオプションを使います。
日本語の場合は`ja-JP`、英語の場合は`en-US`を指定しましょう。

## まとめ
ハイライトはオプションが多くハイライターによってデフォルト値が異なったりするため、どのオプションがどう効くのか整理して適用してあげることが大切です。
Elasticsearchの場合、公式ドキュメントが相当親切で、注釈などに引っかかりポイントや設計の考え方を書いてくれているため、そちらもしっかり目を通して先人の知恵を有効活用していきましょう :muscle: 

## REF
https://www.elastic.co/guide/en/elasticsearch/reference/current/highlighting.html#highlighting-settings
Laravel で簡単なページ遷移をする

こちらと同じことを、Laravel で行います。
[Django で簡単なページ遷移をする](https://qiita.com/ekzemplaro/items/6038954d0ed672d1c887)

次の３つのページを遷移するサンプルです。

>http://127.0.0.1:8000/
>http://127.0.0.1:8000/app01/
>http://127.0.0.1:8000/app02/

<ol>
<li>プロジェクトの作成</li>

```bash
laravel new proj01
```

<li>routes/web.php の編集</li>

```php:routes/web.php
（省略）
（最後に加える）
Route::get('/app01', 'App\Http\Controllers\App01Controller@show');
Route::get('/app02', 'App\Http\Controllers\App02Controller@show');
```

<li>Controller の作成

```bash
php artisan make:controller App01Controller
php artisan make:controller App02Controller
```

```php:app/Http/Controllers/App01Controller.php
<?php

namespace App\Http\Controllers;

class SampleController extends Controller
{
  public function show()
  {
    error_log ("*** App01Controller@show *** start ***");
    error_log ("*** App01Controller@show *** end ***");
        
    return view('sample.app01');
  }
}
```

```php:app/Http/Controllers/App02Controller.php
<?php

namespace App\Http\Controllers;

class SampleController extends Controller
{
  public function show()
  {
    error_log ("*** App02Controller@show *** start ***");
    error_log ("*** App02Controller@show *** end ***");
        
    return view('sample.app02');
  }
}
```


<li>View の作成

```bash
mkdir resources/views/sample
```

```php:resources/views/sample/app01.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>app01</title>
</head>
<body>
<H2>App01</H2>
<a href="/">Return</a><br />
<p />
Dec/19/2023 AM 11:24<p />
</body>
</html>
```

```php:resources/views/sample/app02.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>app02</title>
</head>
<body>
<H2>App02</H2>
<a href="/">Return</a><br />
<p />
Dec/19/2023 AM 11:24<p />
</body>
</html>
```

<li>resources/views/welcome.blade.php の修正

```php:resources/views/welcome.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Laravel</title>
</head>
<body>
<h2>Welcome</h2>
<blockquote>
<a href="/app01">app01</a><br />
<a href="/app02">app02</a><br />
</blockquote>
Dec/19/2023<br />
</body>
</html>
```

<li>サーバーの起動</li>

```bash
php artisan serve
```

<li>ブラウザーで　http://127.0.0.1:8000/　にアクセス


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/f8239c40-c885-981e-c9e4-cfb55405d0d9.png)


## 確認したバージョン

```text
$ php artisan --version
Laravel Framework 10.37.3
```
Swiftのアクセス装飾子について理解する

# アクセス装飾子とは？
Swiftではアクセス装飾子を利用することができます。
装飾子を使用することにより、関数やクラスにアクセス制限を設けることができ、スコープ(使用する範囲)を明確にして定義することができます。
# アクセス装飾子の種類
### open
- 同じモジュール内だけでなく、別のモジュールからでもアクセスが可能
- 継承またはオーバーライドができる

:::note info
モジュールとは
importして読み込んで利用するFrameworkを作成するための仕組み。
:::

### public

- 同じモジュール内だけでなく、別のモジュールからでもアクセスが可能
- 継承やオーバーライドが不可能

### internal
- 同じモジュール内からのみアクセスできる
### fileprivate

- 同じファイル内からのアクセスのみ許可されている。

### private

- 装飾子を設けたそのクラスまたは構造体の中でのみアクセス可能（extension内でもアクセス可能）
- 一番制約の厳しい装飾子


:::note info
装飾子を何も付けなければ`internal`の扱いとなる
:::


# 装飾子をつけるメリット
1. チーム開発をしてる場合は、変数や関数に`private`をつけることで、クラス内部しか利用されていないことを、明示することができるのでコードレビューをしやすくなります
1. 外部でアクセスできないようにすると似ている変数名を誤って呼び出すこともなくなります。
1. `public`(どこからでもアクセス可能)をつけることでグローバル変数であること明示できるのでコードの読みやすさにつながります。

# アクセス装飾の使い分け
### アクセスレベルを特に意識しない場合
何もつけない or `internal`
### アクセスレベルを意識する場合
- `public`・・・別のモジュールからも使えるようにしたい
- `open`・・・別のモジュールからも使えて、継承やオーバーライドさせたい。
- `private`・・・実装を他からは隠したい。
- `fileprivate`・・・実装を他からは隠したいが、特定のコード間では共有したい。


# 参考記事
https://qiita.com/hironytic/items/6cc68ca93b428ba9194e

https://qiita.com/mototaji/items/d1ae68457a118df71458