OmniAICreator/Qiita-1.07M huggingface dataset:
Homebrew Cask TapのテストをGitHub Actionsでする


この記事は [お題は不問！Qiita Engineer Festa 2023 で記事投稿！ - Qiita](https://qiita.com/official-events/4f3daca63fb78f16df0b) の参加記事です。

https://qiita.com/official-events/4f3daca63fb78f16df0b

## はじめに

最近、フォントをインストールするための Cask がほしいと思い、Homebrew Tap をつくりました。
そのときに Cask Tap のテストを GitHub Actions でやる方法を調べたので、その方法をまとめます。

## 実際に書いたもの

今回、GitHub Actions のテストで走らせたいものは以下です。

- `brew readall`
- `brew style`
- `brew audit`
- `brew install`

そして、実際に書いた workflow ファイルは以下です。

```yml:.github/workflows/test.yml
name: Test

on:
  pull_request:
    types:
      - opened
      - synchronize
      - reopened
  workflow_dispatch:

permissions:
  contents: read

defaults:
  run:
    shell: bash

jobs:
  test:
    runs-on: macos-latest
    timeout-minutes: 5
    strategy:
      matrix:
        tap:
          - "ohakutsu/sample-cask"
    steps:
      - name: Set up Homebrew
        id: set-up-homebrew
        uses: Homebrew/actions/setup-homebrew@master
        with:
          test-bot: false

      - name: Cache Homebrew Bundler RubyGems
        id: cache
        uses: actions/cache@v3
        with:
          path: ${{ steps.set-up-homebrew.outputs.gems-path }}
          key: ${{ runner.os }}-rubygems-${{ steps.set-up-homebrew.outputs.gems-hash }}
          restore-keys: ${{ runner.os }}-rubygems-

      - name: Install Homebrew Bundler RubyGems
        if: steps.cache.outputs.cache-hit != 'true'
        run: brew install-bundler-gems

      - run: brew readall '${{ matrix.tap }}'
      - run: brew style --cask '${{ matrix.tap }}'
      - run: brew audit --strict --cask --tap '${{ matrix.tap }}'
      - run: brew install --cask --verbose "$(echo '${{ matrix.tap }}' | awk -F '/' '{print $2}')"
```

主に、[Homebrew/homebrew-cask](https://github.com/Homebrew/homebrew-cask)の[`ci.yml`](https://github.com/Homebrew/homebrew-cask/blob/dac028992105c5384371200e5cb904651b5537e1/.github/workflows/ci.yml)をもとに書きました。

[`setup-homebrew`](https://github.com/Homebrew/actions/tree/master/setup-homebrew) Action はその名の通り、Homebrew をセットアップします。
`setup-homebrew` Action では、自動で Tap を追加してくれるようなので`brew tap`は不要です。

[`test-bot`](https://github.com/Homebrew/homebrew-test-bot)は、Homebrew のテストを実行するためのもののようです。Issue などをみた感じ Cask Tap のサポートはあまりしていないようなので、今回は使っていません。
→ [Also test Casks · Issue #523 · Homebrew/homebrew-test-bot](https://github.com/Homebrew/homebrew-test-bot/issues/523)

ただ、`brew test-bot`の[`--only-tap-syntax`](https://docs.brew.sh/Manpage#test-bot-options-formula)オプションを使うことで、`readall`, `style`, `audit`を実行することができるようです。（[`tap-new`](https://docs.brew.sh/Manpage#tap-new-options-userrepo)コマンドで生成されたテンプレートなどを参考に書いた）

`test-bot`を使う場合は以下のようになります。

```diff
-     - run: brew readall '${{ matrix.tap }}'
-     - run: brew style --cask '${{ matrix.tap }}'
-     - run: brew audit --strict --cask --tap '${{ matrix.tap }}'
+     - run: brew test-bot --only-cleanup-before
+     - run: brew test-bot --only-setup
+     - run: brew test-bot --only-tap-syntax
```

## 最後に

今回は、Homebrew Cask Tap のテストを GitHub Actions でやる方法をまとめました。
`test-bot`を使うと Formula のテストもできるようなので、次やることがあればそちらもやってみたいです。
TCP・IP超初心者入門（IP・TCP）

# IPの役割
　インターネットを介した通信では、いくつかのプロバイダのルータを経由して、受信側に届けられます。しかしプロバイダは独自の組織が運営しており、格プロバイダが背負う責任は自身の接続サービスに加入している利用者に対してだけになります。（他のプロバイダを利用している利用者に対してまでは責任を負わない）
　特にプロバイダによる伝送処理での転送処理は、通信をする際の最低限のものになります。つまり最適なルートを決定し、その方向にルーティング処理を行なっています= **転送する中身は配慮しません！**
![スクリーンショット 2023-07-01 20.41.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/f0312d20-6eca-0626-c136-283b56f01243.png)
そのためインターネットを介しパケットを送信元から宛先まで届けることは可能だが、情報が正しく送られているかどうかは分からないです。例えば以下のことができないことです。
**IPで対処できないこと**
* 伝送中にノイズの影響でパケットが損傷しても送信元には通知されない（宛先も損傷したまま受け取る）
* パケットの伝送順番が入れ替わって宛先に送られても受信側は気づけない
* 同じデータが送られても複数のデータとして受信側は誤認してしまう

そこで**インターネットを経由した通信で信頼性を上げるために**トランスポート層(TCPプロトコル)の機能で補強します。
* パケットを正しい状態で適切に届ける
正しく受信したか確認し、損傷したパケットがあれば再度送信する。
* 受け取ったパケットを正しい順序に並べ、元のデータを再構築する
順番通りに届かなくても正しい順序に並べる。同じパケットが送られてきても1つだけ採用し、それ以外を放棄する。
* 相手と確実に通信できるように確認する・通信の終了を確定する
通信可能であることを確認したのちにパケットを送信する。終了時も相手に伝えてから終了する。
今回は、サーバーとの通信をする際の相手と自身を一般的な表し方としてクライアント・サーバーと定義して図解します。
* サーバー：クライアントにサービスを提供するソフトウェアやコンピュータ
* クライアント：サーバーからサービスを受けるソフトウェアやコンピュータ
![スクリーンショット 2023-07-02 22.22.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/7b3cdb39-1fd0-59be-7e16-316407f58050.png)
![スクリーンショット 2023-07-02 22.22.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/c2a1b447-d838-e908-36cf-51caccc0cf2e.png)

# データの呼び方
　この章では、通信の仕組みに関する話ではなくTCP/IPのそれぞれの階層でのデータの呼び方をまとめていきたいと思います。データの呼び方をそれぞれの階層ごとに分けていくことで、どの層のデータの話をしているのかが分かりやすくなります。
| TCP/IP階層 | 代表的なプロトコル | TCP | UDP |
|:-----------------|:------------------|:----------------|:------|
| アプリケーション層(4層)          | HTTPS,SMTP,POP3 | メッセージ | メッセージ 
| トランスポート層（3層）            | TCP,UDP | セグメント  | データグラム |
| インターネット層（2層）            | IP | パケット | データグラム |
| ネットワークインターフェイス層（1層） | Ethernet,PPP | フレーム | フレーム |

実際にデータを並べてみた図を引用させていただきました。[TCP/IPとは？通信プロトコルの階層モデルを図解で解説]より。
![スクリーンショット 2023-07-01 21.39.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/7db63228-1494-05ed-44e3-e79dbb4fa828.png)
そしてそれぞれの層でのカプセル化の仕方は以下のようになります。送信側では各層で処理されるたびにプロトコルのヘッダが付加されて送信されて、受信側では、各階層でそのヘッダを取り除いています。
![スクリーンショット 2023-07-02 20.35.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1299864/3d46f2ef-eba1-ea9c-d54d-5327ade4c0af.png)


# 参考文献
[TCP/IPとは？通信プロトコルの階層モデルを図解で解説](https://www.itmanage.co.jp/column/tcp-ip-protocol/)
[TCP/IP](https://www.infraexpert.com/study/tcpip.html)
[仕組みが一目瞭然、インターネットを支えるTCPとUDPを完全図解](https://xtech.nikkei.com/atcl/nxt/column/18/00780/052700004/)
[【TCP】シーケンス番号とACK番号について解説](https://hirotanoblog.com/tcp-sequence/2044/)
Java/Spring Bootのおさらいメモ


## はじめに
最終目標：クライアントからもらったパラメータをサーバ側でDBに問い合わせて計算とかやってレスポンスするとこまで実装したい<br>
現状：Springスタータープロジェクトとやらを使って動かそうとしたらNo suitable driverとか出てきたので解決したところ<br>

## 環境設定<br>

<h6>環境情報</h6>
・Java:OpenJDK 17.0.7<br>
・DB:PostgreSQL 15.3<br>

<h6>applicationファイルにJDBC接続情報を設定</h6>
公式ドキュメントの情報が間違いないので迷ったら以下を参照<br>
<a href="https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html">applicationファイル公式ドキュメント</a><br>
<br>
ドライバが見つからないとのことなので、以下の設定を書き込む<br>
<br>
<br>
<div>

```yaml
spring:
    datasource:
        url: jdbc:postgresql://localhost:5432/TEST
        username: postgres
        password: root
        driverClassName: org.postgresql.Driver
```
<br>
※補足_各設定項目について<br>
url→接続先のDB情報を指定<br>
username→DBのユーザー名を指定<br>
password→パスワード<br>
driverClassName→クラスパスを設定したjarファイル(JDBCドライバ)のDriverクラスの名前空間を指定
</div>
<br>
※補足_propertiesとymlについて<br>
Spring Bootでは、applicationファイルからJDBC接続の設定などを行う。<br>
applicationファイルには「properties」と「yml」の2つの形式がある。<br>
どっちにするかはその場のルールや好みで決める。今回はymlを適用していく。<br>
<br>
以上でjdbcドライバの設定は完了。<br>
postgresを立ち上げ、実行したらうまくいくはず...<br>
実行！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494270/697f52de-0760-e0db-a63a-d3eba6d73816.png)
おぉっ！No suitableが表示されなくなったっ！！
ということで、環境構築引き続き頑張ります。
私の経験から考えるUiPathの実装ポイント3点

## はじめに

この記事は、RPA歴約5年の自分が、UiPathを中心に数々の案件を経験してきて得た知識やポイントについて自分なりにまとめてみました。
ほかの言語の実装でも活用できる...かは自分次第ですね。

①本記事は、2023年7月開催の「UiPathブログ 発信チャレンジサマー」の2日目のブログです。
ブログの詳細、参加方法については、以下のブログを参照ください。
https://note.com/shumpei_w/n/nd082bdf28853

②このブログ情報は、2023/7時点の情報です。

③この実装ポイントはあくまでも「筆者の経験」に基づくものです。
実装のルール(規定、開発標準)が決まっている場合は、そのルールに基づいて開発しましょう。

## RPAの実装は、物語を作成するイメージ？
多くの漫画や小説には「起承転結」というストーリーの枠組みがあると思うのですが、まずRPAの開発ではおおむね以下の枠組みを抑えていけばよいと思っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/9d59cfb0-f65d-13b6-41cb-204a81bbec2a.png)
※実際この大枠にTryCatchアクティビティがあって、Tryに上記の処理が入っていることが多いかなと。

ロボットを作成する際に、フレームワーク(処理を円滑にできるようにするための枠組み)があるというところもあれば、まっさらな状態から作成することもあるかと思います。
ただ、大体以下の流れは抑えたほうがよいです。

<b>初期処理：設定ファイルの読込、フォルダやファイルの有無、処理対象ファイルの中身を取得等
本処理：ファイルへ書込、削除、新規作成や使用するWebサイトへのアクセス&閲覧&取得等
終了処理：Webサイトへのログアウト&閉じる、ファイルを指定場所へ保存、不要ファイルの削除、メール送信等
</b>
## ポイント1 【初期処理】処理の最初で何をするか確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/7f8e795c-4de4-3496-bd1d-c2e967e7e4cb.png)

処理の最初には大体上記3点の設定、確認処理を実装することで本処理に向けた準備をします。
### ①設定ファイルの読込
処理に必要な項目や値は、基本「ハードコーディング(=xamlファイルに直接ファイル名を書く等)しない」というように教わった方もいるかと思います。
設定ファイルに記載する内容の例として、ファイルの名前やセルの位置にシート名、WebサイトのURL、Delayやタイムアウトの時間等、色々あります。
設定値を管理することでxamlの修正や改修の手間を最小限にします。
可変要素があるものは、あらかじめ設定ファイルに書いておきましょう。

### ②使用するフォルダ、ファイルの有無を確認
どの処理でも何らかのフォルダやファイルにアクセスすることは多いと思います。
その中で、こういったことは本処理前に検知できたら良いと思いませんか？
・フォルダ名やファイル名が知らない間にいじられていて、名前が変わっていた
・あるはずの場所にファイルがない
...etc

なので、「フォルダーの存在を確認(Folder Exists)」や「ファイルの存在を確認(File Exists)」、(クラシックアクティビティを使用する場合は「パスの存在を確認(Path Exists)」)といった処理を実装しておいて、なければエラーで処理する感じです。
フォルダやファイルがない→なければエラーが出る→フォルダやファイルの確認&セット→再実行等
になるかと思います。
エラー時はこうしますというのもあらかじめ決めておくことも大切です。


### ③値を変数に設定
設定ファイルの値を辞書型で設定して書いてもいいのですが、意外と長かったりで面倒...
なので、変数に設定しておけば長くならない！(筆者が見聞きし実装した感想です)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/ce8845fb-c419-2101-cd2d-db1c4afd4a8a.png)
よくあるExcelファイルの中身→データテーブル型への格納もこの段階でやっておきます。このほうが個人的にラクと思っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/1f2d7dcf-9dd3-4763-d55d-b3f9a81fccda.png)

## ポイント2 【本処理】パターンが決まってくる...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/20db5cf0-c282-0530-9aa6-08f3110db87f.png)
本処理はそのロボットの「<b>一番盛り上がる=主役の処理</b>」になってきます。
本処理は以下の傾向になってくるかと思います。
①フォルダやファイルの数分繰り返しで、ファイルの閲覧・更新を実行して別のフォルダに格納
②Webサイトへアクセスして、サイトの閲覧・取得を行う
③アプリケーション(SAPやSalesforce等)にアクセスして、各種設定や閲覧、更新作業を行う
④上記①や②、③を組み合わせた複雑な処理

繰り返しについては、
<b>
・繰り返す処理は一体何か、どういう順序で処理するのか？
・処理結果を格納する場合、どういう方法で結果を格納するのか？しない場合は本当に何もしなくてよいか？
・途中でNGの処理が出た場合、その時点で中断するor継続させるのか？
</b>
を考えておきましょう。
## ポイント3【終了処理】最後はどうするのか、決めておく
処理の最後には「結局どうしたい」、「こうなってありたい」というものは決めておくことがほとんどだと思います。
正常終了、異常終了に関係なく、処理終了時点で<b>「どういう状態であってほしいのか」</b>を設計時にきちんと決めておきましょう。
終了の通知有無・通知の手段：メールで通知、メッセージボックスを使用する、チャット機能で通知するとか
処理結果・出力したファイルの保管場所：フォルダが見つからない、ファイルが見つからないことのないようにしておく(ない場合はフォルダを新規で作成する処理を初期処理の段階で検討しておくことも大事です)
エラー時：ログは以上処理時だけ残す、スクリーンショットはどこで保管するか等

## 最後に
RPAをきっかけにIT業界に入った自分は、プログラミングやWebサイトの構築もしたことがなく手探りしながらここまでお仕事をすることができました。
もちろん企業のルールはそれぞれあると思いますので、まずはそのルールになれていただくのがベストだと思います。
この記事は一つのアドバイスとして、開発される皆様のお役に立てればと思います。
今後も精進してまいりますので、どうぞよろしくお願いいたします。。
ここまでお読みいただきありがとうございました。
【Xcode】補完を意図的に表示させる

# はじめに
Xcodeの補完を見たいのに消えちゃった、、、
補完で引数を全部見たい、、、

みたいなことよくありますよね

たまたま、補完を意図的に表示させる方法を見つけたので紹介します。

![tst49-0ikjj.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/32aa2435-487e-228f-3b37-f33b8c78b3d0.gif)

# やりかた
① 補完を表示させたい箇所にカーソルを合わせる
② 「esc」を押す

# おわり
もっと早く知りたかった、、
chatGPTとLINEを連結して、利用者からの質問に応答する【Qiita ✖️ Fast DOCTER】

# はじめに
2023/07/01~02にかけて、QiitaさんとFast DOCTORさんの合同ハッカソンに「[もいせん](https://moicen-forest.studio.site/ "moicen_")チーム」として参加してきました！ 医師、看護師、理学療法士、エンジニア、ショッピングセンター勤務者が本気で考えた、医療の課題を解決する成果物の一部を共有します！

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622645/1a5e6778-f139-ebf2-0c6b-448bc2f00e57.jpeg)

# 課題の背景
* 入院が決まった患者は不安
    * 説明されることが多い
    * 一回では理解できない
    * 聞き漏らしてしまった
    * 家に帰ったら「どうだったっけ？」と忘れる
* 医師や看護師
    * 何度も同じような質問をされる
    * その度に時間を割かなくてはならない
   
# 解決法
![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622645/57e11af1-0a35-b7bd-feed-5b4bdffe66d3.jpeg)

# 構成図
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622645/315c51f0-8688-2ff6-de94-27e4b7d3b38d.jpeg)

# 実際の挙動
[こちら](https://liff.line.me/1645278921-kWRPP32q/?accountId=158eghqn)からLINEの友達になれます。もいせんチームの医師、看護師、理学療法士が働く職場に特化した内容を答えてくれます！ぜひお試しあれ！！

# 期待できる効果
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1622645/e02fa912-980e-40ce-6d9f-99c67413a9be.jpeg)

# 感想
* 実際に作り、動くものできるの楽しい
* チーム内での共同開発だったので、メンバーの役割分担を明確にするのが大切
    * まとめ役、ファシリテーターの方がいてくれて助かりました
* 解決したい課題の解像度を高くする。解像度を高くする時間を早くできるようになりたい。
* 課題解決までの手段とそのインパクト、費用対効果を考える
* チーム内でのアイディアソンでの話し合いで濃い時間を過ごすことができて、楽しかった
* 楽しい時間を過ごさせてもらって、企画してくれたQiitaさんとFast DOCTORさんには大変感謝しております。ありがとうございました！
【App Store】レビューしてもらうためのURLの作り方

# はじめに
アプリをリリースしたら、ユーザーから評価をもらいたいですよね。この記事では、アプリをレビューしてもらうためのURLを用意する方法を紹介します。
まず、アプリのレビューをしてもらう方法には、2種類あります。

- レビューのダイアログを表示する
- App Storeのレビュー画面に遷移する

一つ目の方法は、アプリ内でレビューのダイアログを表示する方法です。この方法は、ダイアログを出す回数に制限があるため、ユーザーに能動的にレビューをしてもらう場合には向いていません。
二つ目の方法は、App Storeのレビュー画面に遷移する方法です。この方法は、ユーザーに能動的にレビューをしてもらう場合に向いています。
この記事では、二つ目の方法を紹介します。

# レビュー画面に遷移するURLの作り方
レビュー画面に遷移するURLは、以下のようになります。

```
https://itunes.apple.com/jp/app/id{アプリのID}?mt=8&action=write-review
```

## アプリのIDの調べ方
アプリのIDは、App Store Connectで確認できます。App Store Connectにログインして、以下の手順で確認してください。

- App Store Connectの「My Apps」を開く
- アプリの名前をクリックする
- 「App情報」をクリックする
- 「Apple ID」を確認する

## URLの例
```
https://apps.apple.com/jp/app/id1612933742?action=write-review
```

# SwiftUIでリンクを作る
SwiftUIでは、`Link`を使ってリンクを作ることができます。`Link`の引数にURLを渡すと、リンクを作ることができます。

```swift
Link("レビューを書く", destination: URL(string: "https://apps.apple.com/jp/app/id1612933742?action=write-review")!)
```

# まとめ
この記事では、アプリをレビューしてもらうためのURLを用意する方法を紹介しました。アプリをリリースしたら、ぜひこの方法を使って、ユーザーからレビューをもらいましょう。
DAY6~7

# DAY6
230701
DAy5は記事DAY4にあります　タイトルミスしました；
DAy4~5→　https://qiita.com/Sakura01/items/c42db74484adc7ec3d46

今日お休みの日なのでほんとはたくさん進めたかったんですが、
実家の犬の調子がよくないみたいで心配してしまってあまり進まなかったです。（言い訳）
実家に帰って会いたいんですが、仕事と手術の予定があるので帰るのは難しそうです。
最後に合ったのは1年半くらい前かな。
今17歳と半年ぐらいだからだいぶ長生きだと思う。

今日みたいに自分じゃコントロールが難しいことで進捗に影響が出ることが今後もありそうなので、そこも考えたいです。
今日みたいなこと以外にも風邪とか怪我とか法事とかもあると思うし。

# DAY7
230702
バイト終わってから昨日の分を含めて、本読み終わらせました。
なんとなーくhtmlとcssと少しだけjavascriptで行う、今っぽいウェブサイトの作り方がわかりました。
すでに進捗遅れている+退院したあと遠方の実家に帰る予定を入れたので、計画が1～2週間くらい遅れるかも。まあいっか。
今使っているキーボードが壊れてるので（同じキーが2回連続で押されたり、押しても反応しないキーがある）、早く買おうと思いました。
有線のものを買おうと思っています。
おすすめあったら教えてください。できれば白とかパステルカラーであんまり高くないものがいいです。
バッファローとかエレコムとかがいいのかな？違いが全然わからない:sweat:

めっちゃかわいいの見つけてしまったけど高いので見送り
Logicool G オーロラコレクション ゲーミングキーボード
<a href="https://www.amazon.co.jp/Logicool-%E3%82%AA%E3%83%BC%E3%83%AD%E3%83%A9%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3-%E3%82%B2%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89-LIGHTSYNC-G713-LN/dp/B0BF9R87DF?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&content-id=amzn1.sym.9753448b-089f-414e-a7a2-5fd10fd890d1%3Aamzn1.sym.9753448b-089f-414e-a7a2-5fd10fd890d1&crid=1ZQQOOTJ6RN9S&cv_ct_cx=%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%2B%E6%9C%89%E7%B7%9A&keywords=%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%2B%E6%9C%89%E7%B7%9A&pd_rd_i=B0BF9R87DF&pd_rd_r=2dc5f1b2-ee10-468f-84b9-d4c77e81563c&pd_rd_w=zYTRA&pd_rd_wg=TyI9a&pf_rd_p=9753448b-089f-414e-a7a2-5fd10fd890d1&pf_rd_r=724TQDQH7Y59P1TP64XV&qid=1688302030&sbo=RZvfv%2F%2FHxDF%2BO5021pAnSA%3D%3D&sprefix=%E3%82%AD%E3%83%BC%E3%83%9C%E3%83%BC%E3%83%89%2B%E6%9C%89%E7%B7%9A%2Caps%2C172&sr=1-1-9ad0563b-de06-426f-a1d3-3a92323660bd-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9zZWFyY2hfdGhlbWF0aWM&th=1&linkCode=li2&tag=sakura010e-22&linkId=9479d35564552934a2b38c2eb32f5119&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B0BF9R87DF&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=sakura010e-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=sakura010e-22&language=ja_JP&l=li2&o=9&a=B0BF9R87DF" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
3日くらい前からアフィリエイトリンクを覚えたので貼っちゃう
クリックしてくれたらうれしい:joy:
あとなぜかわからないけど、文字と画像が合体したリンク？を貼ると何も表示されないのはなんでなんだろ
今のところ文字だけか、画像だけしかここに貼れない（コード自体は貼れるけど表示されないｗなぜ）
ScriptableObjectとは

# 最初に
本記事は自分のチートシート用にまとめているため、端折っている部分が多々あります。
正確な情報をお求めの方は引用元のサイトをご覧ください。

# 概要
ゲームやアプリの中で変化せず、あちこちで共用するデータを格納する時に便利なクラス

たとえば、
・複数リスポーンする敵のパラメータ
・カードゲームのカードの名前、パワー、HP、スキル

個別のゲームオブジェクト等にアタッチはせず、都度アセットをロードして使用するため、<B>メモリの節約になる。</B>(これがメインの目的)
Scriptを生成したときに自動で継承される`MonoBehaviour`と同じ立ち位置

# 使い方
###### クラスの定義
```
using UnityEngine;

[CreateAssetMenu(menuName = "Card State")]　//このクラスのアセットをメニューから作成する際のパスの定義
public class TileState : ScriptableObject　
{
    public string name;
    public int power;
    public int hp;
}
```
:::note warn

Start()関数とUpdate()関数は消しておくこと。
これらはMonoBehaviourで定義されていることからScriptableObjectでは使用できない。
:::
###### 解説
`[CreateAssetMenu(menuName = "Card State")]`
このクラスのアセットをメニューから作成する際のパスを定義する
上記の例だとUnity画面の Assets > Create > Card State より選択できるようになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954716/d1088cbf-6dad-be55-5938-55442306f6bb.png)
`public class TileState : ScriptableObject`
クラスの継承元は、いつもの`MonoBehaviour`から`ScriptableObject`に変更する

あとは自由に定義するだけ


# 構造体やクラスじゃダメ？
冒頭に記載した通り、構造体やクラスだと生成するゲームオブジェクトごとにアタッチする必要があるのでメモリの無駄使い
静的（Static）にすればアタッチ不要になるけど、オブジェクト生成前からメモリを消費するので同じくメモリの無駄使い（カードゲームを例に挙げれば、何百種類のカードのデータを静的に保持してたら大変なことになる。。。）

ポケモンもUnityをベースに作ってると聞いたことがあるけど、キャラクターごとの名前やデザイン、ステータスなどはScriptableObjectで定義されてるのかなあ、知らんけど

### 参考にしたサイト

https://qiita.com/4_mio_11/items/a7d8967b853cef4385cd#%E6%9C%80%E5%88%9D%E3%81%AB

https://ekulabo.com/about-scriptable-object

https://tsubakit1.hateblo.jp/entry/2014/07/24/030607

https://kan-kikuchi.hatenablog.com/entry/What%27s_Scriptableobject

https://www.urablog.xyz/entry/2017/03/28/235739

https://ekulabo.com/scriptableobject-for-master-data
AWS上の不審な操作をSlackに通知する機能をTerraformで定義する

# 背景

勤めている企業でセキュリティ対策の担当になったこともあり、去年ぐらいからセキュリティ対策を強化するべく色々と試行錯誤して来ました。AWS Cloud Trailを活用して行きたいですが、ログを全て人間が目で確認するのはあまり現実的ではないです。

何か怪しい動きがあった時に自動でSlackに通知される仕組みがあれば、日々に運用が簡単になりますね。

AWSコンソールから手作業で作成しても良かったのですが、保守性と移植性を考えるとTerraformで定義した方が良いので、 `terraform apply` するだけで通知の仕組みが動くように実装しました。

# 機能＆効果

ユーザーがコンソールにログインした時と、ログインに失敗した時に通知されます。

(赤く隠された部分はクライアントのIPアドレスです。)

![Screenshot 2023-07-02 at 21.18.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468780/792adc0c-bf8d-1800-f6fc-650dd470d860.png)

ログインに成功した場合は 🟢 ログインに失敗した場合は ⚠️ という風に表示がわかれます。

ちなみに信頼できないIPアドレスからログインに成功した場合は 🔴 です。

![Screenshot 2023-07-02 at 21.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468780/3f1b2982-714c-e3ff-83db-d72edd172dea.png)

下記のようにフィルターを定義することで、任意の操作を通知させることが可能です。

```jsx
	consoleLogin: (record) => {
        const event = record.eventName
        const name = record.userIdentity.userName
        const ip = record.sourceIPAddress
        const error = record.errorMessage
        if (event !== 'ConsoleLogin') {
            return null
        } else if (error) {
            return `:warning: [${name}] Console login failed from ${ip}. Error: ${error}`
        } else if (config.TRUSTED_IPS.indexOf(ip) !== -1) {
            return `:large_green_circle: [${name || "ROOT"}] Console login from trusted IP(${ip}) detected.`
        } else {
            return `:red_circle: [${name || "ROOT"}] Console login from untrusted IP(${ip}) detected.`
        }
    }
```

Cloud Trail のログが record に渡されますので、返り値が null であれば、通知はされません。文字列であれば、その内容が Slack に通知される仕組みです。

# 構成

Cloud Trail のログを S3 に出力して、S3 のファイルアップロードをトリガーに Lambda が動作して Slack に通知するシンプルな仕組みです。

![Screenshot 2023-07-02 at 21.31.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468780/e8721b05-3871-804a-cbd2-bfba8b3e3c85.png)

# 実装

Terraformのコードは [GitHub](https://github.com/MOCA-ORG/cloudtrail-slack-notifier) 上に保存しています。Clone してから、設定を書き換えるだけで動作します。 `terraform apply` でLambdaの実装も一緒にデプロイされます。

## sample.tfbackend

Terraform の state ファイルを保存するための S3 バケット

```
bucket = バケット名(アクセス権限のあるバケット)
key    = stateファイル名(任意)
region = バケットを作成したリージョン
```

## sample.tfvars

システムの設定ファイル

```
ORG_NAME = 組織名、Terraformが作成するリソースの名前のプレフィックスに使用されます。

TRUSTED_IPS = 信頼できるIPをコンマ区切りで設定します。

SLACK_WEBHOOK_URL = 通知するためのSlack Webhook URL
```

# まとめ

EC2の終了や様々なリソースの削除など、危険な操作がたくさんありますので、時間があれば、フィルターをたくさん作って、付けたり外したりできるようにしようと考えてます。
SwiftでArrayとDictionaryのチートシート

## Array

#### 宣言

``` swift
// Arrayの定義
var array = [1, 2, 3, 4, 5]

// 要素の追加
array.append(6) // [1, 2, 3, 4, 5, 6]

// 指定した位置に要素を挿入
array.insert(0, at: 0) // [0, 1, 2, 3, 4, 5, 6]

// 要素の削除
array.remove(at: 0) // [1, 2, 3, 4, 5, 6]

// 指定した位置の要素のアクセス
let element = array[0] // 1

// 要素の変更
array[0] = 7 // [7, 2, 3, 4, 5, 6]

// 配列の長さを取得
let count = array.count // 6
```

## Dictionary

#### 宣言
``` swift
// Dictionaryの定義
var dictionary = ["Apple": 1, "Banana": 2, "Cherry": 3]

// 要素の追加
dictionary["Durian"] = 4 // ["Apple": 1, "Banana": 2, "Cherry": 3, "Durian": 4]

// 指定したキーの要素のアクセス
let value = dictionary["Apple"] // Optional(1)

// 要素の削除
dictionary["Apple"] = nil // ["Banana": 2, "Cherry": 3, "Durian": 4]

// 要素の変更
dictionary["Banana"] = 5 // ["Banana": 5, "Cherry": 3, "Durian": 4]

// 辞書の長さを取得
let count = dictionary.count // 3

// NSDictionary を Dictionary にキャスト
let userDetails = userInfo["user_details"] as? [String: Any]
```
【資格】Java Gold（Java SE 11 Programmer II (1Z0-816-JPN)）に受かりました

# はじめに
JavaSilverを取ったのは一年以上前ですが、なんとか合格できたので、備忘としても、記事にしたいと思います。

[Java SE 11 Programmer II (1Z0-816-JPN) 試験](https://www.oracle.com/jp/education/certification/1z0-816-jpn-31705-ja.html)

# きっかけ
経験少ないエンジニアとして日々業務をしていますが、Javaくらいある程度わからんとあかんだろう！と思い、取得を目指しました。開発経験なし＆Javaでの開発経験もゼロです。２０代半ばです。経験１年半ぐらい。
（なんの特徴もないエンジニアで申し訳ない。。。。）
これを気に開発に関われたら嬉しいな～とか思ったり、笑

# 勉強方法
勉強方法は基本的にはいわゆる「黒本」、「青本」の問題をひたすら解いていました。
#### 黒本
https://amzn.asia/d/fI9sUxX
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086650/32a6f234-08b4-5e5d-9212-698852347ab9.png)

#### 青本
https://amzn.asia/d/abTx8BY
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3086650/db688d9c-790e-9ffa-d6b6-b15a21384426.png)

ぷらすでオラクル公式のサンプル問題を解きました。
資格の種類がおそらく違いますが、問題が似ていたので３～４周ぐらいしました。

[Java SE 8 Programmer II (1Z0-809) サンプル問題](https://www.oracle.com/jp/education/certification/java-809a-3516143-ja.html)

[Upgrade to Java SE 8 Programmer (1Z0-810)、Upgrade to Java SE 8 OCP (1Z0-813)サンプル問題](https://www.oracle.com/jp/education/certification/ocjp-gold-se8-3305267-ja.html)

最後は仕上げにJavaの公式のドキュメントを見て、引数には何がはいるか、、、StreamApiでの戻り値はなにか、、、など覚えるようにしました。

# 勉強期間
だいたい３ヶ月ぐらい？
業務しつつ、休みの人土日に勉強していました。
平日は１時間～３時間。土日は６時間以上するように心がけていました。
Javaでの開発経験がないので、かなり時間がかかったほうですかね？
（早い人だとみなさんすぐ取っているような・・・）

# 対策
問題集の問題数から察せれると思いますが、StreamApiはマスターしておいたほうがいいです。
あとはラムダ式ですね。このあたりはJava8から追加された内容らしく、頻出問題です。
StreamApiは現場でもよく使いそうな便利な機能ですね。。。SteamApiはラムダ式の動きを理解できないと、なかなか難しいので、そこを抑えつつ、しっかり勉強すれば、合格できるかと思います！！

↓のページを見ていただくとよくわかりますが、
https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html

Streamのメソッドの量が多く、これに加えIntStreamやDoubleStreamなんてのもでてきます。
（最初はなにがにやらわからない。。。getterなんて当たり前のようにでてきますし、getterってなによ～ってなり、そこから見直したり。。。みなさんからしたら常識ですよね＾＾；）

ちなみに公式にはこんな感じでかかれています
([Java SE 11 Programmer II (1Z0-816-JPN) 試験](https://www.oracle.com/jp/education/certification/1z0-816-jpn-31705-ja.html)から引用)
```
■JavaストリームAPI
ストリーム・インタフェースとパイプラインについて説明する
ラムダ式とメソッド参照を使用する

■ストリームに対するラムダ演算
map、peekおよびflatMapメソッドを使用してストリーム・データを抽出する
findFirst、findAny、anyMatch、allMatchおよびnoneMatchメソッドによる検索を使用してストリーム・データを検索する
オプション・クラスを使用する
ストリームに対するcount、max、min、averageおよびsum演算を使用して計算を実行する
ラムダ式を使用してコレクションをソートする
ストリームに対してCollectorsを使用する（groupingByおよびpartitioningBy演算を含む）
```

Qiitaだと以下あたりは参考にしました。
- [入社１年目でJavaGold合格できたので勉強法について語っていく](https://qiita.com/ebichan_88/items/a2b526c3e206ed573ec4)
- [新卒１年生のJavaGold合格体験記](https://qiita.com/MxShun/items/bb321856f880eff12b0f)

みんな１年目でしゅごいよぉ～；；


# 終わりに
これで少しはJavaについての知識はマシになったかな？
実務が大事なので、そのあたりも頑張っていきたいです。
（早く開発案件にいれてくれ～！）

## 終わりの終わりに
下記も書いてるよ
[【資格】Oracle SQL Silver(1Z0-071-JPN) に受かりました](https://qiita.com/wanwan0000/items/cfe842870c99217b7b81)
【Spring】RESTful APIでEnumを入力パラメータとして使用する場合の入力チェックとエラー処理

# RESTful APIでEnumを入力パラメータとして使用する方法
まず、Enumを定義します。
```java
public enum Status {
    OPEN,
    CLOSED,
    PENDING
}
```
次に、RESTful APIのリクエストボディにEnumのフィールドを持つDTO（データ転送オブジェクト）クラスを作成します。
```java
public class MyRequestDTO {
    private Status status;

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }
}
```


そして、Enumの入力チェックを行うために、コントローラーのメソッド内でバリデーションを行います。
```java
@RestController
public class MyController {

    @PostMapping("/api/resource")
    public ResponseEntity<String> createResource(@Valid @RequestBody MyRequestDTO requestDTO) {
        // リクエストDTOのバリデーションが成功した場合の処理
        // ...
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<String> handleValidationException(MethodArgumentNotValidException ex) {
        // バリデーションエラーが発生した場合の処理
        // ...
    }
}
```
上記の例では、`@Valid`アノテーションを使用してリクエストDTOのバリデーションを有効にし、`MethodArgumentNotValidException`をキャッチすることでバリデーションエラーをハンドリングしています。

この設定により、クライアントからのリクエストの中で`status`フィールドがEnumとして定義された値であることが検証されます。もしEnumとして定義された値でない場合、バリデーションエラーが発生し、`handleValidationException`メソッドが呼び出されます。

`handleValidationException`メソッドは、バリデーションエラーが発生した場合に呼び出されるため、適切なエラーレスポンスを返すことが重要です。以下、`handleValidationException`メソッドのサンプルコードです。
```java
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {
        // エラーメッセージを取得
        List<String> errorMessages = ex.getBindingResult()
                .getAllErrors()
                .stream()
                .map(DefaultMessageSourceResolvable::getDefaultMessage)
                .collect(Collectors.toList());

        // エラーレスポンスを作成
        ErrorResponse errorResponse = new ErrorResponse("Validation Error", errorMessages);

        // エラーレスポンスを返す
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
    }
}
```
上記の例では、`MethodArgumentNotValidException`が発生した場合にこのメソッドが呼び出されます。メソッド内で、バリデーションエラーメッセージを取得し、エラーレスポンスを作成しています。

`ErrorResponse`クラスは、エラーレスポンスの構造を表すカスタムクラスです。以下サンプルコードです。
```java
public class ErrorResponse {
    private String message;
    private List<String> errors;

    public ErrorResponse(String message, List<String> errors) {
        this.message = message;
        this.errors = errors;
    }

    // getterとsetterは省略
}
```
エラーレスポンスでは、`message`フィールドにはエラーメッセージの概要を、`errors`フィールドには具体的なエラーメッセージのリストを格納しています。

上記のコードを使って、バリデーションエラーが発生した場合、クライアントにはHTTPステータスコード400（Bad Request）とともにエラーレスポンスが返されます。エラーレスポンスには、エラーメッセージの概要と具体的なエラーメッセージのリストが含まれます。

`@RestControllerAdvice`アノテーションを使用することで、グローバルな例外ハンドリングが可能になります。このアノテーションを使用する場合、グローバル例外ハンドラクラス内に`@ExceptionHandler`メソッドを定義することで、異なるコントローラー内で発生する例外を一元的に処理することができます。

# 最後に

以上が、SpringのRESTful APIにおけるEnumの入力チェックとエラー処理のサンプルコードです。必要に応じて、エラーメッセージや例外ハンドリングの詳細をカスタマイズすることも可能です。
Ubuntuを再インストールする方法

## 前提
wslの設定が上手くいかなかったときや内容を一度すべて消したい時などに、ubuntuをアンインストールすることがあるかと思います。
そのままアプリを消してしまうと、情報が残ってしまい再インストールが出来ません。
ここでかなり時間をくってしまったので、備忘録として残しておきます。

## 手順
### オプション機能の設定を変える
「設定」→「アプリ」→「オプション機能」→「Windowsのその他の機能」で、オプションの設定画面まで移動します。
ここで、以下の二つのチェックボックスを外しましょう。
- Linux用Windowsサブシステム
- 仮想マシン　プラットフォーム
変更後パソコンの再起動を行います。
### Ubuntuをアンインストールする
「設定」→「アプリ」→「インストールされているアプリ」を開きます。
ここでUbuntuを探しアンインストールをしましょう。
### 仮想マシンプラットフォームを有効化
「設定」→「アプリ」→「オプション機能」→「Windowsのその他の機能」から、再び「仮想マシンプラットフォーム」にチェックを入れます。
その後、再度パソコンの再起動を行います。
ここで有効化を行わないと、再インストール後に 0x80370114エラーが発生します。
このエラーが発生した場合は、仮想マシンプラットフォームの確認を行いましょう。
### ディストリビューションからUbuntuの登録を解除する
ここでアンインストールは完了しているのですが、履歴が残っていると再インストールしたUbuntuを正常に開くことが出来ません。
ディストリビューションからUbuntuの設定を解除しましょう。
Windows Powershellを起動し、以下のコマンドを打ち込み解除を行います。
```
wsl --unregister Ubuntu
```
### Ubuntuの再インストール
ここまででUbuntuを初めにインストールする前の状態に戻すことが出来ました。
それではUbuntuの再インストールを行います。
コマンドプロンプトを管理者で開き、以下のコマンドを入力します。
```
wsl --install
```
Ubuntuを開き、問題なく動作ができていれば成功です！
### 参考文献
- 【Windows 11】WSLを用いたUbuntuのインストール. ジコログ, 2022年11月2日, https://self-development.info/%e3%80%90windows-11%e3%80%91wsl%e3%82%92%e7%94%a8%e3%81%84%e3%81%9fubuntu%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab/.
- Windwos11のWSLインストール時に0x80370114エラーが出る問題. Zenn, 2022年11月25日, https://zenn.dev/ohno/articles/1cb49d190af1f4.
- 再インストール後に起動しなくなったWSLのUbuntuを修復する. 現役のプログラマーが書くプログラミング情報, 2023年6月9日, https://www.techgaku.com/fix-ubuntu-boot-error-on-wsl-after-reinstall/.
Chrome拡張 manifestV3でディレクトリ内の画像にアクセスする

# やり方
`manifest.json`で`web_accessible_resources`で使用する画像を設定する。

```json:manifest.json
{
    "web_accessible_resources": [{
        "resources": ["img/*"],
        "matches": ["<all_urls>"]
    }]
}
```

`content.js` (`manifest.json`にて`content_scripts`に指定しているjsなりtsなり)で`chrome.runtime.getURL("img/hoge.jpg");`をして取得。
```javascript:content.js
var image = document.createElement("img");
image.src = chrome.runtime.getURL("img/hoge.jpg");
```

おわり

# 軽く解説
## web_aacessible_resourcesについて
webから拡張機能内のリソースにアクセスできるようにしたいときに設定する。  
ここを設定していなければ、webからアクセスすることはできない。
v3から書き方もちょっと変わっているみたい。
詳しくは公式を見ると良さそう。

https://developer.chrome.com/docs/extensions/mv3/manifest/web_accessible_resources/
M1macでLaradockを使ったLaravel開発環境構築(M1mac,MYSQL5.7,PHP7.4,NGINX)

laradockでの環境構築の際に２日も無駄にしてしまったので備忘録として記載します。

# laradockのインストール
ご自身のパソコンにお好きな名前でフォルダを作成し、その中にlaradockを落としてください。
※事前にdocker,gitなどのインストールは済ませた状態です。

今回はデスクトップに新しいフォルダを作成しています。
ターミナルを開いてくださいコマンドを実行してください
今回TESTというフォルダを作成しTEST_APPという名前で作成します。
```
$ cd Desktop  
$ mkdir TEST  
$ cd TEST     
```
TESTフォルダにlaradockをローカル環境に落としてください

https://github.com/laradock/laradock
```.TEST
 $ git clone https://github.com/laradock/laradock.git
```

# 環境設定
laradockファイルの中のenv.exampleというファイルをコピーして.envというファイルを作成してください。
そして.envファイルの中の一部を開発環境に合わせて書き換えます。


```.env
APP_CODE_PATH_HOST=../TEST_APP

PHP_VERSION=7.4

PMA_USER=test
PMA_PASSWORD=test
PMA_ROOT_PASSWORD=test

MYSQL_VERSION=5.7
MYSQL_DATABASE=test
MYSQL_USER=test
MYSQL_PASSWORD=test
MYSQL_ROOT_PASSWORD=test
```
# dcokerの起動
:::note alert
dockerアプリを起動した状態で必ずlaradock直下で起動してください
:::
```.laradock
$ docker-compose build --no-cache mysql
```
起動しようとするとこのようなエラーが出ます。
```
ERROR [mysql internal] load metadata for docker.io/library/mysql:5.7      
```
mysqlのイメージ起動に失敗しています。
その場合は
#### ①
```
laradock
    ├── mysql
          ├── docker-entrypoint-initdb.d
          └── Dockerfile ←こちらを修正します。
          └── my.cnf
```
こちらのファイルの同様な記述が書いてある箇所を以下の内容に修正してください。
```.Dockerfile
　$ FROM --platform=linux/x86_64 mysql:${MYSQL_VERSION}
```
#### ②
```
laradock
    ├── .devcontainer
~~~~省略~~~~~~
    └── docker-compose.yml ←こちらを修正します。
```
```docker-compose.yml
### MySQL ################################################
mysql : 
 ├── build : 
 ├── platform : linux/x86_64 //buildと同じ階層にこの行を追加してください。
```

先ほどのmysqlイメージの起動コマンドを再実行してください。
そうしますと起動に成功しますので、以下のコマンドを実行してdockerを起動してください
```.laradock
$ docker-compose up -d nginx mysql phpmyadmin
```

# Laravelのインストール
以下のコマンドを実行して作業場所に移動します
```.laradock
$ docker-compose exec --user=laradock workspace bash
```
laravelインストールします。今回はversion８を用いたいと思います。
```
composer create-project laravel/laravel TEST_APP "8.*"
```
こちらの内容になっているか確認してください。
```
TEST
 ├── laradock
 └── TEST_APP
```
# Laravelの環境設定
laravelの.envファイルを修正していきます。
```
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=任意の値
DB_DATABASE=test
DB_USERNAME=test
DB_PASSWORD=test
```
確認できたら　localhostにアクセスして起動ができているか確認してください。(http://localhost/)
![laravel初期表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494264/a4108bb0-4b61-18b5-0c13-4e54c9f74912.png)
この画面が表示されていたら成功です。おめでとう。
続いてphpmyadminにアクセスします。
portの番号はご自身の設定を確認してアクセスしてください。
(http://localhost:任意のポート番号)
![phpmyadmin初期表示.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3494264/754f1737-09fc-189a-3324-8999efd23fbf.png)
この画面が表示されたら成功です。おめでとう
サーバ名：mysql
ユーザ名：test
パスワード:test
ログインまで試してみてください。
# あとがき
間違いなどがありましたら気軽にご指摘ください。
まだまだ未熟プログラマーですのでお手柔らかにお願いします。
RESTとREST APIについて

# はじめに
RESTとREST APIについて学んだことを簡単にまとめていきたいと思います。

# RESTについて
RESTは**RE**presentational **S**tate **T**ransferの略で、分散型システムにおける設計原則群(設計ルール)のことをいいます。
RESTにはREST原則と呼ばれる、下記6種類の原則があります。

- クライアント/サーバー制約
- ステートレス
- キャッシュ制御
- 統一インターフェース
- 階層化システム
- コードオンデマンド

これら6種類の原則について簡単に説明したいと思います。

## クライアント/サーバー制約
クライアントとサーバーが依存することなく、
互いに独立して影響し合わない構造にするという考え方です。
画面とデータで関心事が分離されるため、
どちらか一方が変更されても影響を受けにくくなります。
基本的には、クライアント側がトリガーとなり、サーバー側が受け身となります。

## ステートレス
クライアントのアプリケーション状態をサーバー側で持たないことを指します。
以前のリクエストやトランザクションとの関連性や依存関係を持たないため、
各リクエスト内に処理を完結させるのに必要な情報を全て保持させます。

## キャッシュ制御
クライアント側でのキャッシュ機能を利用し、
クライアントとサーバー間の通信のオーバーヘッドを減らすよう設計を行います。
キャッシュを有効活用することで、リソースを効率化することが出来ますが、
古いデータを使用する可能性があり、信頼性が低下する恐れもあります。

## 統一インターフェイス
リソース(Web上にあるデータ)へのアクセスには、一意なURIによってアクセスし、
リソースの操作に関してはHTTPプロトコルのメソッド(DELETE,PUT,POST,GET等)を用いて操作を行います。
システムアーキテクチャ全体が簡素化され、分かりやすくなるといったメリットがあります。

## 階層化システム
クライアントとサーバ間にロードバランサを設置して負荷分散をしたり、
プロキシを設置してアクセスを制限をする等して、階層構築するアーキテクチャスタイルです。
各システムごとに役割を決めて独立させることで、
変更や再利用しやするなるメリットがあります。

## コードオンデマンド
プログラムコードをサーバーからダウンロードして、
クライアント側で実行するアーキテクチャを指します。
ダウンロードしたブログラムをクライアント側で実行することで、新たな機能追加ができ、
サーバーの負荷も下げることもできます。

# REST APIについて
APIとは、**A**pplication **P**rogramming **I**nterfaceの略で、
機能やデータを外部から呼び出して利用できるよう定めた規約を指します。
REST APIは前述したREST原則に沿った形で設計されたAPIのことを表します。
シンプルかつ互換性に優れており、Web上のデータ取得の際によく用いられています。

# 参考文献
- [RESTful APIとは？概要や6つの原則についてご紹介](https://rainbow-engine.com/restful-api-six-principles/)
- [REST（レスト）とは何か？わかりやすくまとめました【WEBの勉強】](https://myantora.com/web/136/)
- [REST WebAPI サービス 設計](https://www.udemy.com/course/rest-webapi-development/)
Vue３で画面初期表示時に取得するコードの桁数を元に表示される、入力欄のサイズを調整する方法

～実装の考え方～
画面初期表示時に取得するコードの桁数を元に、テキストボックスのwidthを計算し、CSSで反映させるようにした

～コード～
Point:'document.getElementById'で該当項目のid属性を取得し、widthを上書きする

```
// コードの桁数を取得
this.disp.ketasuu = val[0].xxxcd.length;
let size = 30 + this.disp.ketasuu * 10;
var elem = document.getElementById("zzzz");

// 表示幅をコードに合わせて調整
elem.style.width = size + "px";
```
Fundamentals of Data Engineering (English Edition) 輪読会資料第2回分 2023/7/3開催

## 本記事の位置づけ
下記書籍を用いた輪読会の資料として作成しています。
https://amzn.asia/d/bC6DhKi

今回の対象範囲は、下記のとおりです。
I.Foundation and Building Blocks > 2.The Data Engineering Lifecycle? >
Transformation, Serving Data

## 本編
### Trasformation
- Trasformationとは、Downstreamのためにオリジナルからデータを変化させることである
- Ingestionの直後から、下記を実施する。
    - Ingestionされたデータの型変換（numeric, string etc）
    - 標準的なフォーマットにレコードを変換
    - 悪いレコード（bad one）を除去する
    - データスキーマをtransform
    - 標準化をする
- transformationを考える際、下記のような点を考慮すると良い
    - 投資によるリターンの（ROI）は？またビジネス上の価値は？
    - transformationはできる限りシンプルで、self-isolated(隔離)できるか？
    - どのビジネスルールをサポートするか？（よく意味が分からん）
- バッチや処理中(stream in flight)にtransformすることができる。バッチが圧倒的に人気だが、streaming dataの量の増加などを鑑みると今後streamが増加し、バッチ処理を完全に代替することになるだろう。
- Business logicがtransformationのメジャーなドライバーになる。
    - 例えば小売業だと、CFOが財務について分かりたい場合には、単価や合計金額の他に会計ルールを追加した方が良い）
- 特徴量化はまた違うtransformationの処理だろう。
    - 特徴量化とは、MLモデルの学習に役立つデータの特徴を抽出し、強化することを意図している。黒魔術(ドメイン知識とデータサイエンスの知識が融合する)ともいえる。
    - データサイエンティストが特徴量化の手法を決めれば、エンジニアが自動化する。
- transformationは深い。chap8で掘り下げる。

### Serving data
- it's time to "get value"
- クエリなどされていないデータは不活性化されるだけであり、データ虚栄プロジェクトは企業にとって大きなリスクである。
- データの活用に関して、人気な手法を列挙すると、分析、ML、リバース、ETLである。

- Analytics
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589618/191d8d8c-e4a6-ed1f-d4ce-38796f5f358c.png)
    - Business intelligence
        - BIは元のデータを処理するにはビジネスのロジックが必要
        - transformation時にもビジネスロジックは適用されるが、logic-on-read(データを読む際にロジックを使う？)もますます人気に
        - BIシステムは、data warehouseをクエリするために使用され、レポートやダッシュボードがビジネスロジックや定義のに沿うことができる。
        - 企業のデータが成熟してくると、アドホックな分析からセルフサービスへと移行し、データアクセスが民主化される。
        - ただし、セルフサービス化を実務的に成功させることは難しく、技術の不足などがしばしば障害になる。
    - Operational Analysis
        - オペレーションのきめ細かな詳細に焦点を当て、レポートのユーザーが即座に行動できるようなアクションを促進する。
        - 棚卸資産のライブビューや、websiteのリアルタイムダッシュボードなど。
        - BIとの違いは現在に焦点をあて、時系列のトレンドなどは必要ないこと。
    - Embedded analytics(組み込み分析)
        - レポートのリクエストとそれに対応する負荷が劇的に増加し、これがアクセスコントロールを複雑化させている（例えば会計ソフトでいうと、新しい仕訳が入ることにレポートviewを更新するから？）
        - アクセスコントロールの複雑化というのは、例えば他社のデータが見えてしまうと、信頼を著しく損ねる。
        - テナントやデータレベルでセキュリティを適用する必要がある。

    - Multitenancy(マルチテナント)
        - （ググった内容）マルチテナントとは、SaaSやASPサービスなどのように、同一のシステムやサービスを、無関係な複数のユーザー（企業や個人）で共有するモデルを指します。 
        - データ・エンジニアには、絶対的なデータ・セキュリティと分離を確実にするために、導入するシステムのマルチテナントの細かな点を理解する義務がある


## 学んだ単語
inert - 不活性な
overwhelmingly - 圧倒的に
ubiquitou - 遍在する、至る所［広くあちこち］に存在する
data wrangling - 簡単にデータにアクセスして分析できるように、乱雑で複雑なデータセットを整理して統合するプロセスのこと
we cannot do it justice - 正当に評価できない
delve - 掘り下げる
get tangled - 巻き込まれる、絡まる（ラプンツェルの英語名と同じ）
increasingly - ますます、だんだん
pull off - 成功させる
get in the way of - 障害になる
radius - 半径、範囲
unify - 統一する
incumbent - 義務としてかかっている
minutiae - 細かな点

おまけ leave on read - 既読スルー


## 分からなかったこと
### 英語面
- most data endeavors(analyticsの冒頭)ほとんどのデータ業務？
- logic-on-read
- silo(organization silo)
- burden - 負荷？
sqlserverでひとつのテーブル内でupsertを行う方法

SQL分のsampleは以下の通り

```sql:upsert文
MERGE INTO test_table AS A
    USING (SELECT 10 AS no,'太郎さん' AS name, 30 AS age ) AS B
    ON
    (
       A.no = B.no
    )
    WHEN MATCHED THEN
        UPDATE SET
             name = B.name
            ,age = B.age
    WHEN NOT MATCHED THEN
        INSERT (no,name,age)
        VALUES
        (
             B.no
            ,B.name
            ,B.age
        )
;
```
Point:
'10'などがparameterとして渡される値になる
Aはtest_table全体を指す、
Bはparameterの値をtest_tableの特定のカラムに設定したものになっている
Aに対してBで設定した値で条件検索することにより、抽出したいレコードを取得できる
お客さま案内をスムーズに！商品名を尋ねたらおおよその場所を教えてくれるLINEBot作成記録

## お客さま案内＆従業員の作業時間も短縮♪♪                                          小売業のドラえもん⁉作成への奮闘記録①

**小売業に従事していて掛け声ばかりで全く仕事がラクにならない体質に疲弊しております、日々業務にあたる中で感じた無理無駄ムラをデジタルで解決出来ないものか？？と考えております。**

まずは良くあるお客さまからの問い合わせの多い品群を返答してくれるものを作成してみようとチャレンジしました。

### 使用ツール

.<span style="color:blue">**Make**</span>
.Googlesheet
.LINE 

### 動機

*日々現場で働いているとお客さまから聞かれる「〇〇はどこにあるの？」従業員も夜間の学生アルバイトは毎年入れ替わるので*「どこにどの商品があるのか？」が簡単にわかってお客さま案内に活用出来るツールは出来ないものか、との思いからチャレンジ*

### できました :smile: 

動作確認画像

https://twitter.com/takefuji1252151/status/1678380513537720320?s=20

###### お客さまが店頭で商品を尋ねているシチュエーションを想定しています。

### Makeシナリオ
![シナリオ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467884/25a75611-8446-e436-051b-350c5592ed00.png)



### 手順


### <font color="red">GooglesheetsとLINEBotの連携

![連携.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467884/df42ddbb-b21d-efd7-1548-f85e456dd5c5.png)


### <font color="blue">A列の品名を入力するとB列の通路ナンバーが返ってくるようにしました。

**GoogleSheetを選択しSeachRowsを繋ぎます
SpreadSheetをファイル名称の「売場通路」
SheetNameをSheet名称の「品目と通路で設定**

### <font color="green">Googlesheetsの中身

![Googlesheets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467884/6a3784e1-c4d1-2835-3261-88e241dc93f2.png)


### <font color="blue">LINEBotの中身

**Send a Reply Messageを設定します
typeでtextを選択、textでGooglesheetsのB列を設定**　※画像を参照

![受け.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3467884/0509c762-7ed6-8f4e-c25b-de674bf741cd.png)


### 従業員ヒアリングと今後に向けて

実際に売場で運用を想定している従業員に聞いてみました！！
**「担当者以外の従業員が質問を受けた場合に非常に助かると思う」**
**「お客さまを待たせなくて済む」とおおむね好評でした。**
今後に向けてとしては補充陳列にも活用出来るようにより細かいカテゴリでの表記を実装したい
また画像も出てくるようにすることで、例えば買い物経験のない男子学生や外国人を雇用する場合でも早期なアジャストが可能となると考えます。
a5m2(sqlserver)でDBを切り替えるとエラーになった件

～概要～
sqlserverで新たに作成したDBをa5m2で接続しようとしても、
元々接続していたDBの情報が表示されてしまう
ひとつの接続情報の中でDBを切り替える方法で考えている
～詳細～
sqlserverで開発用のDBを作成しa5m2で接続していた
次に開発用のDBと同じ接続情報を持つ、テスト環境用のDBをsqlserverで作成した
「データベースの追加と削除」で「修正」を選択し、
「データベースの内容を登録」画面のデータベース名を
'開発用のDB→テスト用のDB'に切り替えた
しかし、表示されたテーブル情報は開発用のDBのままだった

～原因～
a5m2のバグ
新しい接続情報を作成しようとしたら
アドレス読み込み違反のダイアログメッセージが表示された
（私が原因解決をするために、sqlserverの管理画面でserverを切断したり起動していたりしていたのが影響してそう)

～解決方法～
タスクの終了でa5m2を一度閉じる
ひとつの接続情報の中でDBを切り替える方法ではなく、新規の接続情報を作成する方法にした
その方法で暫く使用しているが問題は起きていない

また、a5m2でアドレス読み込み違反のダイアログメッセージが表示された際はタスクの終了をするのが良いそうです
自分で調べたところアドレス読み込み違反のダイアログメッセージが表示されるのは、メモリ不足や接続情報が正確に読み込めないときに発生するそう
USJ行ったことある？

先に申し上げます。
### ポートフォリオの宣伝でございます。

皆様USJに来園されたことはございますでしょうか？？

関西圏にお住まいの方はあると答える方が多いと思いますが、

関東圏の方あまり来園されること少ないんではないでしょうか？


### 関東圏の方！ぜひ来園して見てください！楽しいよ！


### [MagicalUsj](https://magicalusj.herokuapp.com/)

・Usjに行きたいけど何をしたらいいかわかんないな...
・Usjってどんなアトラクションがあるの？
・Usjに行く際に準備するものとかってある？
などなど。

たくさんの不安要素があると思います。 (関西住まいの筆者は某夢の国に同じことを抱きまくっております。)

そんな皆様にぜひ使っていただきたいAPPになっております。

`アトラクションの種類`
`チケットの種類`
などの記事を取り揃えております。

とはいえまだ必要最低限しか実装していないで
記事は少ないし、
URLはheroku入ってるしで

`まだサービスとは言い難いのですが`

皆様からの意見を頼りに修正していきたいので使っていただけると幸いです。
podmanをwindowsにインストールする

以下のマークダウンを参考にインストールを行っていく
https://github.com/containers/podman/blob/main/docs/tutorials/podman-for-windows.md

### 1. Podman Windows インストーラーをダウンロードして実行
[Githubリリースページ](https://github.com/containers/podman/releases)からインストーラーを取得する。4.1以降のバージョンでないとWindowsではダメみたいです。`podman-v4.?.?.msi`をインストールして実行します。
これによってpowershellで`podman`コマンドが実行可能になるはずです。WSLでは実行できません。

### 2. podmanセットアップ
`podman machine init`でFedoraの最小限のインストールをインストールをして、podmanを動かすVMを作成します。私の環境では`fedora-podman-amd64-v37.0.44.tar.xz`がインストールされました。

### 3. 構築された環境の確認
この時点で`podman machine`と`WSL`がセットアップされます。
* `podman machine ls`を実行すると、`podman-machine-default`を確認できます。
* `wsl --list`を実行すると、`podman-machine-default`を確認できます。

これで`podman`がインストールできました！！
Good podman life!!

### etc. 既存のWSL環境からのアクセス(本記事ではできません)
既存のWSLインスタンス(Ubuntuとか)とpodmanのWSLインスタンス(podman-machine-default)があり、Ubuntu側でpodmanコマンドが使えたらいいなと思っていました。結論として、__できませんでした__。今後やっていきます。

以下は`apt-get install`しただけですが載せておきます。

podmanをインストールしようとすると以下のエラーが発生した。
```
~$ sudo apt-get install podman
eading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package podman
```
これについてはUbuntu 20.10以降のディストリビューションでないと利用不可なことが問題でした。自身の利用しているUbuntuバージョンは`lsb_release -a`で確認ができます。

Ubuntu 22.04を入れて試してみました。
```
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install podman
```
ですが、`podman machine ls`を行ってもマシーンが表示されない事から接続できていないことが分かります。

今回は以上です。
複数のPGソースファイルを検索する際、複数ある特定の項目が全て存在するファイルのみ抽出する方法

「Devas」というツールを使用することで検索ができるようになった

「Devas」の検索文字列に「^(?=.*apple)(?=.*orange).*$」等と入力して検索する
秀丸は行単位で同一のがあるかどうかチェックするため、ファイル単位の検索ができない
【DjangoのDB操作】ORM / querysetとは

## はじめに
Djangoでwebアプリケーションを作成する上でORMという単語を初めて知ったので意味を調べました。

## ORMとは
ORMは`Object-Relational-Mapping`の略で、オブジェクト指向型言語でRDBを扱う手法です。

### DjangoのORMでできること
- PythonのクラスをDBのテーブルに対応させる役割を果たすため、開発者はSQLを書かずにDBとのやり取り(CRUD)が可能
⇨ DB操作のためのコードの単純化、可読性の向上、エラーの減少

- `マイグレーション機能`により、コードでのDBのスキーマの変更の定義・DBへの適用が可能
⇨ DBのスキーマ変更が簡単に行える、チーム内でのスキーマ変更の共有が可能



## querysetとは
Djangoのメソッドを使用してDBからデータを取得するとき、データはQueryset型としてDBから取り出され、これらのデータはquerysetと言います。
[querysetの操作メソッド一覧](https://docs.djangoproject.com/en/4.2/ref/models/querysets/)

## 参考サイト
[querysetについて分かりやすく解説【具体例で説明します】](https://codor.co.jp/django/about-queryset)
[ORMとは？｜SQLAlchemy 概要と基本の使い方](https://zenn.dev/myuki/books/02fe236c7bc377/viewer/d2422a)
ソフトウェアアーキテクチャの基礎を読んでみて４

### コナーセンスについて

#### ３.２.５.1 静的なコナーセンス

コナーセンスとは静的コナーセンスと動的コナーセンスの２種類が存在する

#### 性的なコナーセンスとは
ソフトウェアの作り方に関する考え方の一つです。

##### 静的コナーセンスの考え方ではコードの結びつき方が重要でその結びつきが中心的か分散的なのか評価する。

##### 中心的な結びつき方を求心的な結合と呼ぶ。たくさんのコードが一つの中心に向かって結びついている状態です。

##### 分散的な結びつき方を延伸的な結合と呼びます。これはコードが分散して離れている状態です。


##### ソフトウェアの設計者はどちらの結びつきを使うかを決めることができる。そしてその結びつきがどのくらい強いのか、またどのくらい弱いのか評価することができる。

##### 例えば、求心的な結合の場合、たくさんのコードが密集しており、一緒に動くことが多いです。一方、遠心的な結合の場合、コード同士が離れており、あまり、一緒に動くことはないです。

##### つまり、静的なコナーセンスとはコード同士の結びつき方をみる考え方であり、ソフトウエアの設計の結び付きを評価するためのツールなのです。


#### 静的コナーセンスの種類と度合い

・名前のコナーセンス
・型のコナーセンス
・意味のコナーセンス
・位置のコナーセンス
・アルゴリズムのコナーセンス

#### 3.2.5.2 動的なコナーセンス

度合いと種類

##### ・タイミングのコナーセンス
複数のコンポーネントを実行するタイミングは重要だ。このタイプのコナーセンスのよくあるケースには２つのスレッドが同時に実行されることで引き起こされる競合状態がある。そうした競合状態は同期操作の結果に影響を与える。

スレッドとはコンピューターの中で同時に複数の処理を行うことができる仕組み。
例えば、一つのスレッドが動画を再生している間に別のスレッドが音楽を再生することができる。しかし、複数のスレッドが同じデータや
リソースにアクセスしようとすると問題が生じる。これが競合状態という。競合状態ではスレッド同士がお互いに邪魔し合って正しく動作しなくなること。
###### なのでタイミングのコナーセンスはスレッド同士の競合が起きないようにしよう


・値のコナーセンス
他のコナーセンスとは一つのものを使うと他のものに影響出ることを意味します。また分散システムではすべてのデータベースで変更するときにすべての値を一緒に変更するか、または変わらないようにする必要がある。→トランザクションをしっかり設計する

他のコナーセンスでは一つの変更が他の部分にも影響を与えることを考え、バランスをとる必要がある。


##### ・アイデンティティのコナーセンス

このコナーセンスは複数のコンポーネントがある、エンティティの特定のインスタンスに依存している時に発生する。２つのコンポーネントが分散キューのような共有のデータ構造を共有し、更新を共にしなければならない場合、動的コナーセンスを評価するにはツールがないから難しい。

##### ↓簡単にまとめると
アイデンティティのコナーセンスは複数の部分が依存し合って動く場合にお互い支え合うことを考える概念です。
その評価は難しいですが技術の進歩によって解決策が見つかるかもしれない。


リファクタリングの順番
静的
名前
 型
  意味 
  アルゴリズム
　　　　　　位置
　　
動的
　　　　　　実行順番
　　　　　　　タイミング
　　　　　　　　　値
　　　　　　　　　　アイデンティティ

上の順番でリファクタリングを行うべきで、できるだけ静的なコナーセンスを好むべきだ。



#### コナーセンス位置関係

コナーセンスの位置関係はコードの中でモジュール同士がどのくらい離れているか表している。
コードを書くときはコナーセンスが強い方がいい。つまり、関係の強いコードは一緒の場所にまとめた方がいい。
開発者はコードの位置も考えた方がいい。


#### コナーセンスの度合い
コナーセンスの度合いはその影響の大きさに関連する。


Page-jonseはシステムのモジュール性を向上さえるためのガイドラインを提供しています。

1 システムを小さいパーツに分けること(カプセル化)

2 カプセル化の境界を跨ぐ場合は影響を小さくする

3 カプセル化の境界内では度合い(影響を多くする)

以上です。ありがとうございます。
DB（sqlserver）に挿入できるデータの許容サイズ で調査する内容

新規でテーブルを作成する際、DB（sqlserver）に挿入できるデータの許容サイズを調査したい
その際、調査する内容についてまとめた

調査する項目は以下の通り
①最大許容列数
②各データ型の許容最大サイズ
　※使用される文字コードによってバイト数は異なるためPJで何の文字コードを使用するか確認する　文字コードの情報はテーブル設計規約に記載がある
AzureADアカウント を ローカルアカウント「Admin」に切り替える方法

OS:Windows11

～現象～
新しいPCの初期設定で、セキュリティーチェックシートで正確なmacアドレスを設定してもLandiskに入れない
pingは通っている

ログインユーザーがAzureADになっていたのが原因
ローカルカウント「admin」でログインすることが推奨されている

～解決策～
AzureADアカウントをローカルアカウントに切り替える 

①ユーザーの追加でローカルアカウント「Admin」を作成
②設定>アカウント>職場または学校にアクセスする　でAzureADアカウントの紐づけを切断する
③②をすると、AzureADアカウントでのログインが消えてしまう　
　②で新しいログイン情報を求められるので①で作成したログイン情報を入力する　ローカルアカウントでログインできる
WinMerge Excel比較時の文字化け　解決方法

最新のWinMergeをインストールし、Excelの比較を行うと文字化けした
解決方法を記載する

WinMergeの「比較」ボタンの右側にプルダウン選択ができることを発見
　MS-Excelを選択したところ、文字化けが解消した
言語によって、ファイルの命名にルールがあるのが面倒なのでまとめてみた


# はじめに
※プロジェクトによってのルールがある場合もあります
言語によってファイルの命名規則がちがい、何にどんな命名をすればいいのかわからなくなったので、一度まとめます。

## そもそもの命名について

| 命名規則     | 例          | 由来                              |
|--------------|-------------|-----------------------------------|
| キャメルケース | camelCase   | "ラクダ"のこぶに由来                  |
| パスカルケース | PascalCase  | "パスカル"というプログラミング言語に由来 |
| スネークケース | snake_case  | "蛇"が這うような形状に由来            |
| ケバブケース | kebab-case  | "ケバブ"の串刺しに見える形状に由来       |

## 各言語の命名規則表


|                                | ディレクトリ／ファイル  | 変数 | 関数 | 定数               | クラス           |
|------------------------|-------------------|-------------------|-------------------|-------------------|-------------------|
| JavaScript             | ケバブケース (`user-profile`)   | キャメルケース (`userName`) | キャメルケース (`getUserName()`) | 大文字スネークケース (`MAX_COUNT`) | パスカルケース (`UserProfile`) |
| Python                 | スネークケース (`user_profile`) | スネークケース (`user_name`) | スネークケース (`get_user_name()`) | 大文字スネークケース (`MAX_COUNT`) | パスカルケース (`UserProfile`) |
| Java                   | パスカルケース (`UserProfile`) | キャメルケース (`userName`) | キャメルケース (`getUserName()`) | 大文字スネークケース (`MAX_COUNT`) | パスカルケース (`UserProfile`) |
| Ruby                   | スネークケース (`user_profile`) | スネークケース (`user_name`) | スネークケース (`get_user_name()`) | 大文字スネークケース (`MAX_COUNT`) | パスカルケース (`UserProfile`) |
| PHP                    | パスカルケース (`UserProfile`) | スネークケース (`user_name`) | スネークケース (`get_user_name()`) | 大文字スネークケース (`MAX_COUNT`) | パスカルケース (`UserProfile`) |
| C#                      | パスカルケース (`UserProfile`) | キャメルケース (`userName`) | パスカルケース (`GetUserName()`) | 大文字スネークケース (`MAX_COUNT`) | パスカルケース (`UserProfile`) |

## JavaScriptフレームワークごとの命名規則表

| フレームワーク | ディレクトリ／ファイル | 変数 | 関数 | 定数 | クラス |
|---|---|---|---|---|---|
| JavaScript (Vanilla) | ケバブケース (`user-profile`) | キャメルケース (`userName`) | キャメルケース (`getUserName()`) | 大文字スネークケース (`MAX_COUNT`) | パスカルケース (`UserProfile`) |
| React.js | パスカルケース (`UserProfile`) | キャメルケース (`userName`) | キャメルケース (`getUserName()`) | 大文字スネークケース (`MAX_COUNT`) | パスカルケース (`UserProfile`) |
| Vue.js | パスカルケース (`UserProfile`) | キャメルケース (`userName`) | キャメルケース (`getUserName()`) | 大文字スネークケース (`MAX_COUNT`) | パスカルケース (`UserProfile`) |
| Angular | ケバブケース (`user-profile`) | キャメルケース (`userName`) | キャメルケース (`getUserName()`) | 大文字スネークケース (`MAX_COUNT`) | パスカルケース (`UserProfile`) |
| Ember.js | ケバブケース (`user-profile`) | キャメルケース (`userName`) | キャメルケース (`getUserName()`) | 大文字スネークケース (`MAX_COUNT`) | パスカルケース (`UserProfile`) |

:::note warn
注意
GPT4.0にて作成してます。正確な情報が欲しい場合は検索してください。
:::

# 最後に
迷ったら、この記事を見ます。
カスタムデータ属性について

###  初めて知ったカスタムデータ属性について

question_idを非同期通信にするために
jsファイルで取得できないだろうか
という時に使うのが

`カスタムデータ属性らしい。`

```
data-question-id="<%= @question.id %>
```
このようにすることでカスタムデータ属性が作成可能になる。

呼び出す時はjsファイル側で
`getAttribute`メソッドで呼び出すらしい

```
document.querySelector('h2[data-question-id]').getAttribute('data-question-id');
```
プログラミング　開発手順　記録用

PG 作業手順

①DBに項目登録
②ファイル作成
③を参考に実装する
④動作確認
⑤PGレビュー前確認


①DBに項目登録
xxx.xlsx
SSの[入出力]シートの項目を入力する
作成したInsert文をDBに登録する

②ファイル作成
　流用元画面のソースをコピペして新規ファイルを作成する
　まず、ファイルを全て作成する
　その次に、日付やプログラミングIDを変更する
　このタイミングで、プログラミングIDはちゃんと変更する

③PG実装を行う
　流用元画面と作成する画面のSSをWinMergeで見比べる
　WinMergeで確認できる差異部分に対して改修を行う
　基本的に実装が終わるまで動作確認はしない
　→動作確認するとその分時間がかかるため

　実装内容に不安を感じる場合は途中でも動作確認を行う

④動作確認
　画面を一通り動かしおかしくないか確かめる
　おかしい箇所があったら修正する

⑤PGレビュー前確認
　レビュー前に自己チェックを行う
　今までPGレビューで指摘を受けたことなどをまとめて、自分専用のPGで確認する項目リストを作っておくといい
(wrong number of arguments (given 3, expected 1..2)):

### (wrong number of arguments (given 3, expected 1..2)):
よく見るやつ。
引数があっていないやつ何だけと
```
   <%= f.search_field :title_or_body_cont, autocomplete_board_title_boards_path, class: 'form-control', placeholder: '検索ワード' %>
```
の` autocomplete_board_title_boards_path`

このまま記述してしまうと引数として扱われない。
だからエラーが出てしまった。

`pathを引数として扱うようにすればいい。`

`        <%= f.search_field :title_or_body_cont, placeholder: '検索ワード', class: 'form-control', data: { autocomplete_source: autocomplete_board_title_boards_path } %>`

autocomplete_sourceは、オートコンプリート機能において、`入力フィールドに表示する候補のデータソースを指定するためのメソッド`

こうすることによって引数として扱われるらしい。
ずっとエラーになっていたjquery-ui-rails について

### ずっとエラーになっていたjquery-ui-rails について
application.jsのrequireで
`//= require jquery-ui/widgets/autocomplete`
を読み込んでいたのだが、

`application.jsで読み込めへんやん`エラーが発生。

文面には
`  ActionView::Template::Error (couldn't find file 'jquery-ui/widgets/autocomplete' with type 'application/javascript'`

となっていた。

おかしな部分として

`application/javascript`

自分のjsファイルの読み込み場所と違っていた。
jquery-uiのgithubのページに行くと

```
In your Gemfile, add:

gem 'jquery-ui-rails'
```

と書いていた。
まずgemファイルに記述していないのに
jsファイルに読み込まれるわけがないよねというポンコツエラーでした。
a5m2のビューについての説明

ビューはマストデータ等のショートカットキーであるから、ビューのデータを変更したいときは参照元のデータを修正すればいい
理解しやすい方法はビューを作成するSQL「CREATE VIEW文」を見ればいい

```sql:ビュー定義
CREATE VIEW MathPointList (ID,Name,Class,数学)
         AS SELECT ID, Name, Class, Math FROM PointList;
```