OmniAICreator/Qiita-1.07M huggingface dataset:
キャッシュとクッキーの違い

あまり違いを把握できていなかったのでメモ

## キャッシュ(cache)とは
低速な装置のデータを高速なデータの装置に保存しておいて、同じデータが必要とされる場合は高速な装置から読み出すこと。一時的にデータを保存する技術で、再利用を目的としている。
Webブラウザが、一度入手しておいたデータをディスクに保存しておいて、後から同じデータが必要となった場合に、ディスクに保存しておいたデータを表示する。
#### なぜcahceがあるのか
Webブラウザは、遠く離れたWebサーバーからネットワークを経由して、データを入手して表示するため、サイズの大きな画像ファイルなどを表示するには、かなり時間がかかる。こういった問題を対処するためにcacheがある。
## クッキー(Cookie)とは
Webサイトがユーザーのブラウザに小さなデータファイルを保存するための技術。
これにより、Webサイトはユーザーの情報（ログイン情報、ショッピングカートのアイテム、ユーザー設定など）を覚えておくことが可能になる。
Cookieを用いることで、再度ユーザーがWebサイトにアクセスした時に、そのWebサイトがユーザーを記憶することを助けることができる。
## 両者の違いは
キャッシュはWebページの読み込み速度を向上させるために使用する技術
クッキーはWebサイトの使いやすさを向上させるために使用する技術

## セッションとは
ユーザーがウェブサイトにアクセスした時にサーバー側で保存される情報のセット。セッションは通常、一時的な情報（例えば、特定の操作のための一時的な設定や、一連のページのユーザーの操作など）を追跡するために使用される。セッションIDは通常、クッキーを介してユーザーのブラウザに保存される。

## クッキーとセッションの違いは
クッキーはクライアント側（ユーザーのブラウザ）でデータを保存し、セッションはサーバー側でデータを保存する。また、クッキーは永続的（クッキーが削除されるまで）であり、セッションは一時的（ユーザーがウェブサイトを離れるか、一定時間が経過すると終了）。
Chroma(ChromaDB)で Azure OpenAI の embedding に対応する

# 概要
ベクトルーデータベースの一つに Chroma(ChromaDB) がある。
Embedding する際のベクトル化で Azure OpenAI の API を利用するとエラーが発生する。

```
packages\openai\api_resources\abstract\engine_api_resource.py", line 37, in class_url       
    raise error.InvalidRequestError(
          ^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: InvalidRequestError.__init__() missing 1 required positional argument: 'param'
```

ドキュメントの手順を指定しても同様だった。
https://docs.trychroma.com/embeddings#openai
> openai_ef = embedding_functions.OpenAIEmbeddingFunction(
                api_key="YOUR_API_KEY",
                api_base="YOUR_API_BASE_PATH",
                api_type="azure",
                model_name="text-embedding-ada-002"
            )

# 対応方法
環境変数 `OPENAI_API_VERSION` に Azure OpenAI のバージョンを指定する。
スクリプト内の指定例は以下。
```python
os.environ['OPENAI_API_VERSION'] = '2023-05-15'
```
スクリプトを実行するシェルでももちろん OK。
pipenv などを使っている場合は `.env` ファイルなどでも。
gitコマンド忘却禄

-git基礎コマンド
　branch確認
```
git branch 
```
```
git checkout -b 名前
```
　新しいbranch作成して移動

```
git remote add origin git@github.com:xxx/DataPractice.git
```
リモートリポジトリに "origin" という名前を設定
以降、"origin" を使用してリモートリポジトリを参照
```
git fetch origin
```
リモートリポジトリの最新情報がローカルに取得

```
リモートリポジトリから目的のブランチをローカルに作成する
git checkout --track origin/<branch-name>
リモートリポジトリからすべてのブランチをローカルに作成する
git checkout --track origin/*
```


-ローカルからgithubに反映
![GitHub-cheat-sheet-graphic-v1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329706/c40843b8-010b-dc97-bf3a-9f64b8db9b78.jpeg)
git status
　作業ディレクトリのワーキングエリアの状態とステージングエリアの状態を表示
```
git add .
　変更したファイルをすべてステージングエリアに追加
git add ファイル名
　ファイルをステージングエリアに追加
git reset ファイル名
　ファイルをステージングエリアから戻す
git reset HEAD [file-path]
　一部のファイルだけ選択するには、ファイルのパスを記載
```
```
git commit -m "first commit"
　　ステージエリアに追加されたファイルを
　　ローカルエリアに”first commit”というコメント付きでコミット

git push origin ブランチ名
　ローカルエリアからリモートエリア(github)に共有して更新
```





-リモートエリア(github)からローカルエリアに反映
![GitHub-cheat-sheet-graphic-v1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329706/c40843b8-010b-dc97-bf3a-9f64b8db9b78.jpeg)
```
作業ディレクトリを作成
作業ディレクトリに入る

git init
ls 

git clone リポジトリURL
　リモートリポジトリに存在する全てのファイル群の複製をローカルエリアに作成
　URL末尾名(リポジトリ名)のディレクトリと「.git」ファイルが作成

リモートリポジトリのファイル群を全て複製するコマンド
引数にはリポジトリURL
実行後「リポジトリ名のディレクトリ」と「.git」ファイルが作成
既に同名のディレクトリがある場合は使用不可
非公開設定のリポジトリの場合はユーザー名とパスが必要
一番最初のみ実行するコマンド
```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329706/9b905ac3-c158-8687-7232-130b505eb50c.png)

```
git clone -b [指定したいブランチ名] [リポジトリパス]
 git cloneコマンドは指定がない場合mainブランチを取得するが、
特定のブランチを指定したい場合は-bオプションを使用

git pull リモートリポジトリ名　ブランチ名

git pull origin master
git pull origin feature
　リモートリポジトリの更新されているファイルのみを上書き
引数にはリモートリポジトリ名とブランチ名
既に同名のディレクトリがある場合でも使用可能
非公開設定のリポジトリの場合はユーザー名とパスが必要
2回目以降の更新時に実行するコマンド

git clone -b [指定したいブランチ名] [リポジトリパス]
```
```
-ブランチ削除
ローカルのブランチを削除する場合
git branch -d localBranchName

リモートのブランチを削除する場合
git push origin --delete remoteBranchName

ローカルリポジトリを削除
rm -rf .git
```
```
push前のcommit実行を戻す
git logで<commitId>　を確認
git reset --hard ^ 一つ前
git reset --hard <commitId>
```
DB型サイトの大量生成されるページはnoindexにすべきかcanonicalで親に向けるべきか問題

様々なサイトを見てきたが、DBサイトにおける大量生成されるページの地理扱いについては未だ正解がわからない。

noindexにするのが鉄板ではあるものの、特定のクエリで上位表示をしているサイトは逆にnoindexせずにcanonical設定を親記事に向けているということもあった。

検索エンジンルール的に好まれるのは圧倒的に前者であるとは思うものの、後者のサイトはレッドオーシャンジャンルにおいて猛威を振るっているため、この点における好まれる好まれないと、上位化というのは全く切り離して考えるべきか…

たとえばこのサイト<div id="EmbedContentsPage-react-component-6dbaa19b-a2ac-4a18-8538-ccdbeb3551fb"><a href="https://www.pvjapan.org/" target="_blank" class="style-1lmziu0"><div class="style-19midj6"><div class="style-gmr6hp">不用品回収</div></a></div></div>は、細かい市区町村ページまでしっかりと対策し順位も取っていて、不用品回収業界ではとても有力なサイトとして知られている。
※余談だがサービスも良さげ

しかし一方で、各地域の回収業者をカードとしてサイトに登録し、全てnoindexにしていて上位化しているサイトもあるので、その辺のアルゴリズムは中々わからないものである。

記録終わり
sqlを軽く復習する

## データベース作成
既に存在する場合でも問題ない。
```sql
create database if not exists LESSON;
```
## データベース使用
```sql
use LESSON;
```

## テーブル作成
```sql
create table LESSON_2023(LESSON_ID int auto_increment, LESSON_NAME text, ACCEPTED_GRADE int, PRIMARY KEY (LESSON_ID));
```

## データの挿入
```sql
insert into LESSON_2023(LESSON_NAME,ACCEPTED_GRADE)VALUES("国語",1);
```

## テーブル内全閲覧
```sql
select * from LESSON_2025;
```

## 指定したカラム内容を取得
```sql
select LESSON_NAME(カラム名) FROM LESSON_2025(テーブル名);
```
枯れたマシン(古のOS[XP]が入ったPC)で動かせるソフトウェア[ベスト3]

# はじめに
ちゃみんと申します。
今回は枯れたマシンで動かすことのできるソフトウェアを紹介できたらなと思います！
よろしくお願いいたします!
早速ですが紹介の方に入りたいと思います。

# 目次

<!-- タイトルとアンカー名を編集 -->
1. JavaGPT
1. もふきー
1. xp_activate32.exe
1. 最後に

# JavaGPT
こちらのソフトはWindowsXPで動かせるChatGPTでございます。
今現在、セキュリティ等の諸問題でXPはブラウザからアクセスできるサイトが限られております。
ですがこちらのソフトはJavaで動かすインストール型のアプリケーションとなっており、XPでも
動かすことのできるアプリとなっております。
残念ながらx86用のJavaは同梱されていませんが、もし、x86用のJavaをお持ちの方でXPでChatGPT
を動かしてみたいと思われた方はぜひDLしてみてはいかがでしょうか？
##### DLリンク
https://github.com/FrankCYB/JavaGPT
##### 概要(英文)
https://www.windowscentral.com/software-apps/javagpt-brings-chatgpt-to-support-ancient-versions-of-windows
# もふきー
もふきーはWindowsXPで動かすことのできるMisskeyクライアントです。
Misskeyといってもピンとこない方いらっしゃると思うのでざっくり説明しますと、
GitHubでプログラムが公開されているSNSとなっております。
TwitterのようなSNSでスキルがあればだれでも管理者になれるSNSです。
ワードプレスのSNS版といった方がわかりやすいでしょうか？
当然こちらのSNSもブラウザからだと基本アクセスできないのですがこちらのアプリを使うことによって
投稿できるようになります。
現在開発中のもので開発者は日本人です。
今の段階では機能面が限られているのですが、今後様々な機能を追加する予定だということなので、
URLの方シェアしていただけると僕のみならず開発者の方が喜ぶと思うので興味がある方、
よろしくお願いいたします。
##### リンク
http://blog.livedoor.jp/blackwingcat/archives/2031805.html
##### 開発者のMisskeyアカウント
https://misskey.io/@blackwingcat
# xp_activate32.exe
こちらのソフト、紹介するか迷ったのですが紹介させていただきます。
こちらのソフトはWindowsXPのアクティベーションロックを突破するためのソフトとなっております。
今現在、XPを正規な方法でアクティベーションすることは非常に困難となっており、
当時のキーをお持ちでない方についてはXPマシンを扱うことが基本できなくなっております。
そこでこちらのソフトをメインPCにDLし実行、出てきたコードをXPの電話認証ページにあるコード記入欄に打ち込むだけでアクティベーションできてしまうといったものとなっております。
##### ※Windows10,11などの現在サポートされているOSで使うことはできません。
##### アクティベーションできるPCは32bitのXPのみとなっております。
リンクに関してなのですが、コンプライアンス上載せることができないので自己責任でお調べください。








# 最後に
ここまでざっとお話して参りましたが、基本的に古のOSを使う上でありとあらゆる
リスクがあると思います。
サポートが終了してしまったOSを使い続けることに関しては基本的にメーカー側は意図してないので、
何度も申し上げますが、自己責任でお願いします。



Twitter、GitHubなどで情報発信中です。
フォローの方、していただけるとめちゃくちゃ喜ぶのでよろしくお願いします。
- [Twitter](https://twitter.com/Chamin_VRC)
- [GitHub](https://github.com/Chamin-programmer)
Next.js v13 App route で Web Crypto API が undefined

## TL;DR

以下の形でインポートする。

```typescript
import { webcrypto as crypto } from "crypto";
```

または、 Node.js を v19 以降にアップグレードする。

## 問題：Next.js App Route で Web Crypto API が使えない

Next.js v13 にて、 App Route を使っていた。  
Web Crypto API、特に `SubtleCrypto` を使用したコードを書いたところ、以下のように `undefined` とエラーが出た。

```
TypeError: Cannot read properties of undefined (reading 'digest')
     92|   const hash = await crypto.subtle.digest("SHA-1", arr);
```

## 原因：Node バージョンまたは Next.js ランタイムの違い

v19 以前の Node.js では Web Crypto API は実験機能であり、明示的に有効化しない限りグローバル this には含まれないらしい。

また、 Next.js [リポジトリ内の issue](https://github.com/vercel/next.js/issues/46852) と [App Router のドキュメント](https://nextjs.org/docs/app/building-your-application/rendering/edge-and-nodejs-runtimes) によると、 App Route ではデフォルトで Node.js ランタイムが使われるとのこと。


## 解決：明示的にインポートする

issue では Next.js のランタイムを `"edge"` に指定することで Web Crypto API を使用可能にしていた。  
しかし、上で挙げた App Router のドキュメントにあるとおり、 Edge ランタイムはパフォーマンスや利用可能な Node.js API に違いがある。

また、 `globalThis.crypto` の存在を確認して代入する方法も紹介されているが、今回は一つの TS ファイル内で使えれば良かったので、そこまでしなくても良かった。

```ts
import crypto from "node:crypto"
globalThis.crypto ??= crypto.webcrypto
```

そこで、上記のコードを参考にし、 `crypto.webcrypto` そのものを単にインポートすることにした。

```ts
import { webcrypto as crypto } from "crypto";
```

### Node.js のバージョンをあげることでも解決可能

先述の通り Node.js 19+ では標準で Web Crypto API を使用可能なので、 Node.js を v19 以降にアップグレードすることでも解決可能。
エンジニアになりたい３１歳

はじめまして。
MIEです。
自分自身を変えたくて、エンジニアにチャレンジしてます。

経歴はこちら↓
31歳/高卒
コンシューマゲームのデバッグ　5年
飲食店のＷＥＢマーケティング　2年
事務職　4年

学習実績↓
HTML/CSS　1年
Python　6か月
Swift　6か月

paizaで、ひたすらプログラミングをしつつ
麻雀関連のアプリ開発をしています。

年内に転職を決めたいです。
よろしくお願いします！
プログラマーへの道 #35 今までの動画の知識でメモ帳アプリを作る #16（プログラミング入門）のメモ

# 参考にした動画
https://youtu.be/f4tFOnx1xJg

https://youtu.be/BRPeQH8EGqM

# 学んだこと
・innerTextと改行文字"\n"を使って改行する。
・innerHTMLと改行タグ<br>を使って改行する。

# innerTextと改行文字"\n"を使って改行する。
・動画の5：00〜ぐらいからモーダルのエラー表示を改行するという制御についてですが、実験してみたら改行文字"\n"を使って改行できた！
・改行文字"\n"は文字として
扱われというのを思い出してシンプルにerrorMessage.innerTextに'+'を付けて改行文字"\n"を文字連結すればモーダルのエラー表示を改行できそうと思ったらできた。
```javascript
const errorMessage = document.getElementById("id-validation-error-in-add-modal")
// titleは1文字以下と100文字以上はだめ
if(1 > title.length || title.length > 30){
    errorMessage.innerText = "タイトルの文字は1文字以上30文字以内にしてください。"
}
// 本文の文字数が1文字未満100文字以上であればエラー分を出力する。
const bodyErrorMessage = document.getElementById("id-body-validation-error-in-add-modal")
if(1 > body.length || body.length > 100){
    errorMessage.innerText = errorMessage.innerText + "\n" + "本文の文字は1文字以上100文字以内にしてください。"
}
// errorMessageのinnerTextが0文字以上であればエラーを出力しない
if(errorMessage.innerText.length > 0){
    errorMessage.style.display = ""
    return
}
```
<b>ブラウザ</b>
![スクリーンショット 2023-07-03 13.51.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/c3d6c518-d67f-ec43-e968-4c631785d6e5.png)

# innerHTMLと改行タグ```<br>```を使って改行する。
```js
const errorMessage = document.getElementById("id-validation-error-in-add-modal")
// エラー文が出力後、エラー文の内容で訂正したら該当のエラー文が消える
errorMessage.innerHTML = ""
// titleは1文字以下と100文字以上はだめ
if(1 > title.length || title.length > 30){
    errorMessage.innerHTML = "タイトルの文字は1文字以上30文字以内にしてください。<br>"
}
// 本文の文字数が1文字未満100文字以上であればエラー文を出力する。
if(1 > body.length || body.length > 100){
    errorMessage.innerHTML = errorMessage.innerHTML + "本文の文字は1文字以上100文字以内にしてください。<br>"
}
// errorMessageのinnerTextが0文字以上であればエラーを出力しない
if(errorMessage.innerHTML.length > 0){
    errorMessage.style.display = ""
    return
}
```
<b>ブラウザ</b>
![スクリーンショット 2023-07-03 14.27.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823837/18ec7dba-9e08-18e5-83bb-5fa6ba86261f.png)
Grafana の dashboard を CLI で json export したかった走り書き

# 背景

Grafana の運用を開始していい感じの dashboard もいくつかできてきたところで、
「この dashboard 設定まるごと吹き飛んだら泣いちゃうな・・・」となった。
しかしながら、Grafana から dashboard を JSON Export しようとすると、各 dashbaord にアクセスしてポチポチ export するしかない。
手動でそんなことはやりたくないので API 叩いてなんとかした。

# 成果物と雑な解説

```shell:backup.sh
#!/bin/bash

each_jq(){
        jq -c '.[]'
}

cd /path/to/backup_folder
source ./grafana_token

folders=$(curl -X GET -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ${GRAFANA_TOKEN}" http://localhost:3000/api/folders)

echo $folders | each_jq | while read -r folder
do
        id=$(echo $folder | jq .id)
        name=$(echo $folder | jq -r .title)
        base="grafana_dashboards/$name"
        mkdir -p $base
        dashboards=$(curl -X GET -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ${GRAFANA_TOKEN}" "http://localhost:3000/api/search?folderIds=$id")
        echo $dashboards | each_jq | while read -r dashboard
        do
                uid=$(echo $dashboard | jq -r .uid)
                name=$(echo $dashboard | jq -r .title)
                path="${base}/${name}.json"
                d=$(curl -X GET -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ${GRAFANA_TOKEN}" http://localhost:3000/api/dashboards/uid/$uid | jq .dashboard)
                echo $d > "$path"
        done
done
```

`GRAFANA_TOKEN` に dashboard アクセス可能な token が入るようにして実行すれば、各フォルダ内の dashboard を逐次取得して `grafana_dashboards/[folder name]/[dashboard name].json` に保存される。

`/api/dashboards/uid/$uid` API の結果をまるごと保存すると情報も含まれてしまうため、response.dashboard の内容が JSON Export された内容と一致していたので、そこを採用した。

このスクリプトだと `General` フォルダの dashboard が入ってこないので、`General` は sandbox 的な場所とする、という社内ルールを策定した。（`General` はバックアップされない前提）
また、たぶん `!` とか `?` とか `"` とか入ると死ぬので、フォルダ・グラフ名にはそれらの記号をつけてはいけないという社内ルールを策定した。

取得後は適当に git push する cron を回している。

Grafana API に dashboard の一覧を返すやつがあればこんなにグルグルループしなくて済むんだが・・・。
EntityFramework Toolsのno-buildオプション

## はじめに
EntityFramework Coreを触っていると、マイグレーションを少し戻したり作り直したりするのに `dotnet ef` から始まるコマンドラインツールをよく利用します。ただこのコマンド、毎回プロジェクトのビルドが挟まる関係で、、、重い。

特にマイグレーションを一つ戻すために、マイグレーションの一覧表示（list）→データベースの更新（update）->マイグレーションの削除（remove）→マイグレーションの作作成（add）をする場合に毎回ビルドが挟まると都度作業が止まってストレスが溜まります。念のため作業の開始時（一覧表示）にビルドは走ってもいいけれど、それ以降は一連の流れなんだから毎回ビルドは走ってほしくない。そんな時はno-buildオプションを使いましょう。

https://learn.microsoft.com/ja-jp/ef/core/cli/dotnet#common-options

## 使い方

ビルドが不要なステップでは`--no-build`をつけるとビルドが不要になります。

```sh
> dotnet ef migrations list --no-build
20230703100000_first
20230703110000_second
20230703120000_third

> dotnet ef migrations update 20230703110000_second --no-build
Done.

> dotnet ef migrations remove --no-build
Removing migration '20230703110000_second'.
Reverting the model snapshot.
Done.

> dotnet ef migrations add 20230703120000_third
Build started...
Build succeeded.
Done. To undo this action, use 'ef migrations remove'

> dotnet ef database update
Build started...
Build succeeded.
Done.
```

## 注意

remove → （同じ名前で）addする場合は、ビルドした後でないと、すでにマイグレーションが存在するエラーになります。

```
> dotnet ef migrations remove --no-build
Removing migration '20230703110000_second'.
Reverting the model snapshot.
Done.

> dotnet ef migrations add 20230703120000_third --no-build
The name 'third' is used by an existing migration.
```

また、追加したマイグレーションスクリプトをもとにデータベースを更新する場合エラーは発生しませんが、ビルドを行わないと最新の（ビルドしていない）マイグレーションはデータベースに反映されません。

## おわりに

実際に追加したマイグレーションスクリプトとビルド後のアセンブリが同期していないと怖い動作（addやupdate）はビルドしたほうがよさそうですね。
利用するGoogleDriveアカウントをメールアドレスで指定する

## 対象
GoogleDriveを複数アカウントでログインしており、URLやブックマークでアカウントを変更したい人など。

## 本題
GoogleDriveのURLはおおむねこのような構造をしている
```url
https://drive.google.com/drive/u/0/my-drive
```
この時、indexの値(`0`となっている箇所)を変えるとアカウントが変更できる。
```url
https://drive.google.com/drive/u/0/my-drive
https://drive.google.com/drive/u/1/my-drive
```
上の場合では二つ以上のアカウントがログイン状態の場合、それぞれ別のアカウントのmy-driveが表示される。

ここで、**indexの値が入る場所にメールアドレスを入れることで指定したメールアドレスのアカウントへ切り替えができる。**
```url
https://drive.google.com/drive/u/akira@example.com/my-drive
https://drive.google.com/drive/u/kaori@example.com/my-drive
```
一見するとあまり恩恵を感じないように見えるが、**ログイン情報を一度消してしまい、indexがバラバラになってしまった場合など**に対応することができるという利点がある。

### 注意点
GoogleDriveにログインしていないアドレスで行うと**404エラー**が返ってくる。
例えば`sato@example.com`がGoogleDriveにログインしていない状態で以下のURLにアクセスを行うと404エラーが返ってくる。
(ログイン画面に飛ばしてくれたらありがたいんだけどなぁ)
```url
https://drive.google.com/drive/u/sato@example.com/my-drive
```

## 発展
使う機会があるかはわからないが、ブックマークレットを作ることでmy-driveに戻らずに現在のフォルダを維持したままアカウントが変更できる。
```js
javascript:(function(user_address){const old_url=location.href,tail_data=old_url.replace(/^.+folders\//,""),new_url=`https://drive.google.com/drive/u/${user_address}/folders/${tail_data}`;location.href=new_url;})(prompt("email address or index"));
```
Laravel 10のアプリケーションをrenderでデプロイするときのつまずきポイント

# はじめに

社内で自作アプリをデプロイするイベントがあり、Laravelで簡単なアプリを作りました。
デプロイをミスっても誰にも迷惑をかけないナイスなイベントです。
デプロイにあたって躓いた点を紹介します。

# 技術選定
案件でLaravelを使っていたのでLaravelを採用しました。
デプロイ先はrenderを使いました。
renderはLaravelでも使えると公式ページに記載されていたので採用しました。

https://render.com/docs/deploy-php-laravel-docker

無料で使えますがデータベースの利用には制限があります。

https://render.com/docs/free

90日しか使えないので継続的なサービスには使えなさそうです。

ちなみにHerokuを推すサイトが多かったのですが、有料になっていたので避けました。

# つまづき
主にrenderでデプロイする際に躓きました。

## dockerfileはrender専用のものを使う必要がある
公式ホームページに掲載されている[dockefile](https://github.com/render-examples/php-laravel-docker/commit/c4bc0ccc7b72554135fed30eb676c37e86a40e87#diff-3254677a7917c6c01f55212f86c57fbf)を使いましょう。
ローカルで開発している際には、Laravel SailでDockerコンテナ上でLaravelを立ち上げていました。
Sailはdocker-composerを利用してDockerコンテナを起動しています。
デプロイもdecker-composerでできればよかったのですがやり方がわからず…とりあえずデプロイしたかったため公式サイトのdockerfileをRootに置いてデプロイさせました。
## データベースに関する失敗
renderでも何でもいいのですがデータベースを用意する必要があります。renderはデプロイすると自動でデータベースまで用意してくれると勘違いしていました。
公式ページにも書いてありましたね＾＾;
> Create a new PostgreSQL database on Render and copy the internal DB URL to use below.

また、renderで使用できるデータベースはPostgreSQLのみです。LaravelはMYSQLでインストールしてしまったのでPostgreSQLに変える手間が発生しました。
新規にLaravel開発をするときにPostgreSQLにしておけばよかったです。

## フロントエンドのビルド標準が変わった
Laravel 9からフロントエンドのデフォルトがLaravel MixからViteになりました。

https://laravel-news.com/vite-is-the-default-frontend-asset-bundler-for-laravel-applications

ドキュメントによってはLravel Mixを参考にしたままなので適宜読み替える必要があります。
今回は[プロフェッショナルWebプログラミングLaravel](https://books.mdn.co.jp/books/3221303041/)という本を参考にしていたのですが、この本がまさにLaravel Mixを前提に解説していたので読み替えに苦労しました。
ログ出力の必要性

# 記事を書くきっかけ
個人開発しているアプリで、エラー処理時にはとりあえず`console.log`でエラー出力をするようにしていた。
フロントエンドのテストコードを書いて、ログ出力についてテストコードを書いていたがふと疑問。
テストケースとしてやるべきか、だけでなくそもそもログ出力の必要性、出力内容について深く考えてなかったのでこれを機に調べることにした。

# 結論
- 出力する主なケース
    - プログラムに例外が発生した場合
    - データベースに存在すべき適切なデータがなかった場合
    - セキュリティ保護の観点から、必要な情報のやり取りが行われたとき（顧客情報など）
- 出力内容
    - 出力された理由（どこで出力されたかなど）
    - 例外時に出力されるログの場合は対応につながる情報

# ログレベルについて
適切なログレベルを設定することができれば、「開発者」や「運用者」を意識してログを出力させることができる。

### 一般的な例
- Fatal→システムの継続が不可能になるレベルのトラブルが起こった場合
- Error→システムのある機能の実行ができない状態になる場合
- Warn→システムのトラブルの中でも、想定内かつ軽微なもので、復帰が可能な場合
##### 以下は運用者も閲覧可能なログとする。
- Info→システム処理が正常に行われているのを確認する場合（起動情報、ユーザーID）
##### 以下は開発環境や、検証環境においてデバックのために使う。
- Debug→デバッグするために使用（セッション内部の情報やユーザーHTTPリクエスト、レスポンス情報）
- Trace→メソッドに渡された引数等、アプリの開発時のデバッグ情報

#### 優先度
```
Fatal > Error > Warn > Info > Debug > Trace
```

# ログに必要な情報

**問題が起きた時にその問題を特定するために必要な情報**
- 問題が起きた個所
- **受け付けた情報(リクエスト、プログラム引数)**
- 変数(オブジェクトが持つメンバ/フィールド、できればローカル変数も)
- 関数(メソッド)の引数
- 外部連携の要求と結果(DBのクエリログや外部通信のリクエスト/レスポンス)

問題が起きた箇所自体ではなく、原因は他にあったりすることもよくあるため本来は関係しうる導線上全てでログを出すべきかもしれないが、さすがに量が多すぎて現実的ではない気がする。

# 所感
運用するうえでは、対応が求められるレベルの例外発生時のログだけでもよいような気がする。
ただし、セキュリティの観点から、異常アクセスやデータの持ち出し時のログやログインした人のユーザー情報などは出力するようにしておくべきと感じた。

また、ログの内容については、保守側が適切な対応をできるような情報を厳選して盛り込む必要があり、当該アプリの性質やチームの習熟度などから総合的に判断すべきと感じた。
瞬時に問題の大枠を予想し、対応ができないのであれば、ログ出力する意味がないと思うからである。

# 参考
http://www.code-magagine.com/?p=2215
https://ryozi.hatenadiary.jp/entry/20150201/1422727151
これはWindows 11の公式リリースと、OpenAIのGPT-4をベースにしたCoPilot機能が完全に統合されたというニュースです。基本的な情報と関連するステップは以下のとおりです。


これはWindows 11の公式リリースと、OpenAIのGPT-4をベースにしたCoPilot機能が完全に統合されたというニュースです。基本的な情報と関連するステップは以下のとおりです。
![01_o.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/d6f7c5ce-1c16-e77a-b4c8-6d5514ee2cf0.jpeg)


Windows 11 の最新バージョンをダウンロードします。
```
https://www.microsoft.com/ja-jp/software-download/windows11
```
VMware 17.0 Proをダウンロードします。
```
https://www.vmware.com/jp/worldwide.html
```
最新バージョンのEdgeブラウザをダウンロードします。
```
https://www.microsoft.com/ja-jp/edge/download/insider?form=MA13FJ
```
ViVeTool v0.3.3 をダウンロードします。
```
https://github.com/thebookisclosed/ViVe/releases/tag/v0.3.3
```
ViVeToolを用いて、一連のコマンドを入力し、特定の機能やサービスを有効にします。
そして、具体的な情報は以下のとおりです：

vivetool /enable /id:44774629
vivetool /enable /id:44850061
vivetool /enable /id:44776738
vivetool /enable /id:42105254
vivetool /enable /id:41655236

背景：
![windows.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997148/63b9c5d2-c580-3c89-0711-1a68ba0358cb.jpeg)

この更新により、Microsoft の Windows システムと OpenAI の ChatGPT がより密に統合されました。CoPilot は GPT-4 に基づく自動プログラミングアシスタントで、現在 Windows 11 に完全に統合されています。

※開発者プレビュー版でCoPilotを使用するためには、開発者チャネルでWindows Build 23493以上をインストールし、Microsoft Edge 115.0.1901.150以上をインストールする必要があります。

この更新は非常に重要なもので、人工知能を日常の報酬システムにより深く統合することで、私たちの生産性と作業効率を大幅に向上させることが期待されます。
OCIブロック・ボリュームのバックアップ時間帯を指定する方法

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに
OCIのブロック・ボリュームを毎日指定した時間帯で自動バックアップを取るのは、一般的な要件です。

<strong>ユーザー定義バックアップ・ポリシー</strong>を活用いただければ、<strong>任意の時間帯</strong>で自動バックアップが取れますので、この利用方法を紹介したいと思います。

OCIは、以下の２つバックアップ・ポリシーがあります。既存の「Oracle定義バックアップ・ポリシー」は、時間帯の変更ができないが、それらを<strong>複製・編集</strong>して、或いは「ユーザー定義バックアップ・ポリシー」を<strong>新規</strong>作成していただければ、時間帯の指定ができるようになります。
|タイプ|バックアップ時間帯|コメント|
|:--|:--|:--|
|<strong>Oracle定義</strong>バックアップ・ポリシー (Gold, Silver, Bronzeの3種類)|UTC 0時|時間帯の変更ができないが、複製・編集は可能。|
|<strong>ユーザー定義</strong>バックアップ・ポリシー|UTC、或いはリージョンの<strong>ローカル</strong>時間|任意時間帯を指定できる|

__ステップ__
- [1. ユーザー定義バックアップ・ポリシーの作成](#1-ユーザー定義バックアップポリシーの作成)
- [2. スケジュールの追加・編集](#2-スケジュールの追加編集)
- [3. バックアップ・ポリシーの選択](#3-バックアップポリシーの選択)

# 1. ユーザー定義バックアップ・ポリシーの作成
OCIメニュー → ストレージ → ブロック・ストレージ → バックアップ・ポリシー

「バックアップ・ポリシーの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/8fcb0061-7214-c7c5-1402-f3a9f3494e65.png)

ポリシーの名前を適当に入力し、作成ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/53036154-ae9b-b8ef-83f0-817ce0536e77.png)

# 2. スケジュールの追加・編集
作成したポリシーの詳細画面で、「スケジュールの追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c1252b76-485b-cb21-ea59-a41bf6abf03f.png)

<strong>デフォルト</strong>のタイム・ゾーンは、<strong>UTC</strong>ですが、ローカル・タイム・ゾーンへの切り替えは可能です。ご希望の時間帯を指定して、「追加」ボタンをクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3268a6b3-2c58-0001-bb0f-7937b11092f4.png", width="350">

追加後、以下となります。マウスを<strong>インフォメーションのマーク</strong>に移動すると、「次の３回のバックアップ予定時間」を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/edee55d0-7d1f-6fcc-9e4e-369a242f4b9e.png)

スケジュールの編集も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a100cabd-172d-fe46-3a6e-755d5af10583.png)

# 3. バックアップ・ポリシーの選択
既存のブロック・ボリュームを選択し、<strong>編集</strong>ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/aea92cee-2028-19ea-36cc-4ef6bfb6d0fc.png)

作成したユーザー定義ポリシーを選択して、変更を保存します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/02f76f3b-8607-af70-7fec-c6267f2a7cc1.png", width="450">

変更後、次のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/680a4395-49cc-86f3-1b6c-fff66e098ff7.png)

以上です。

----
__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)

__ドキュメント__
[ポリシーベースのバックアップ](https://docs.oracle.com/ja-jp/iaas/Content/Block/Tasks/schedulingvolumebackups.htm)
オンラインでComputer Scienceの学位取得を目指す　～University of the Peopleとは～

# はじめに
**完全オンラインでComputer Scienceの学位が取得できるUniversity of the People**について紹介します。

# University of the Peopleとは
完全オンラインで学位（経営、コンピュータサイエンス、健康科学、教育）を取得できるアメリカの大学で、2009年に設立されました。教育の機会を広く世界中の多くの人々に提供するという理念の下、学費が非常に安いのが特徴です。

https://www.uopeople.edu/

# University of the Peopleに入学した理由
理系ながら情報系ではない私は、ITについて体系的に勉強したいと思っていました。
せっかくなので英語で勉強できたらいいなと思い調べていると、オンラインでもコンピュータサイエンスの学位が取れる海外の大学をいくつか見つけました。
その中でもUniversity of the Peopleは
- **単位認定制度がある**
日本の大学で取得した単位も、指定の手続きを踏めば単位認定可能。
- **学費が安い**
卒業までに$4,860 ≒ 70万円程度（2023年7月3日現在）
単位認定し、取得する科目が減ればその分安くなる。
- **自分のペースで進められる**
リアルタイムでの授業はない。
1週間のサイクルで課題の提出期限が決められているため、それに向けてスケジュールを立てられる。

の点で他の大学よりも良さそうだなと感じました。


自分でお金を払って大学で勉強することで、学習習慣も自然と身につくのではないかという思いもあり、社会人2年目（2021年4月）に入学を決めました。

# Computer Science学部の科目
Computer Science学部では、ITの基礎からプログラミング、数学統計学、機械学習、英語、その他一般教養科目を履修することができます。
## 科目例
- プログラミング基礎（Python、Java）
- Webプログラミング
- データベース
- OS
- 数学・統計学
- 機械学習
- 英語ライティング

https://www.uopeople.edu/programs/online-bachelors/computer-science/

# 授業の進め方
年間5学期あり、1学期（9週間）で1~3科目を履修することができます。
1学期での取得可能科目数はGPAによって決まるため、複数科目を履修するためには一定以上GPAを維持する必要があります。
授業は基本的に**講義形式ではなく**、毎週与えられた資料や動画から知識を得たり、自分で調べたりしながら課題に取り組んでいきます。科目の最終評価には講師だけでなく、生徒同士の相互評価が反映される課題もあります。

## ウィークリータスク（1~8週目）
1~8週目は、以下のようなタスクがあります。

- **Reading Assignment**
毎週のテーマに沿った資料が用意されています。後々提出する課題に関わる内容のため、きちんと確認する必要があります。

- **Discussion Forum**
与えられたテーマについて自分の意見をまとめて、掲示板に投稿します。
投稿後、他の生徒の意見に3回以上コメントし、ディスカッションを行います。

- **Writing Assignment (Programming Assignment)**
与えられたテーマについてのエッセイや、プログラミングの課題を提出します。
翌週、生徒同士で評価を行います。

- **Learning Journal**
今週学んだことを自分の文章でまとめたり、与えられた課題についてエッセイを書いたりします。

- **Graded Quiz**
科目内で2回程度、中間テストがあります。試験監督はありません。

科目の難易度や知識レベルにもよりますが、今まで受講してきて1科目週10-20時間程度必要かなと思っています。
大学の公式のアナウンスでは、1科目週15時間以上の学習時間が必要と言われています。

## 期末テスト（9週目）
9週目は期末テストです。テスト期間内であれば、自分の好きな時間にテストを受けることができます。
科目によっては、遠隔で監視されながらテストを受けることもあります。

# 学士号取得要件
学士号の取得要件を主要なもののみ記載します。
- 必修科目を含め120単位（40科目）以上を取得していること。
別大学で取得した単位の認定制度あり。
- 50学期以内にすべての必要要件を満たす。

# 入学のために必要なこと
- 英語能力証明
一定の英語力があることを証明するために、大学指定の検定・テストのスコアを提示する必要があります。
私は自宅で受験できる[**Duolingo English Test**](https://englishtest.duolingo.com/applicants)を受験しました。
スコアを持っていない場合、最初の1学期に英語のクラスを受講し基準を満たせば、入学が認められます。

- 入学申込金（$60）
- 学費は不要（科目の評価を受ける時に$120を支払う）
- 入学時期は任意

# 2年経過しての感想
2021年4月に入学したので、入学してから2年が経ちました。毎週の課題は資料を読み込んだり、ある程度の分量の文章を書いたりと、気合を入れて取り組む必要があると感じています。無理せず仕事との両立を図るため、基本的に1学期1科目ずつ受講しています。

Javaやデータベースの科目は直接業務にかかわる内容だったため、現場でも非常に役立ちました。ただ、今まで様々な科目を受講してきて一番成長を感じているのは、英語で説明するスキルです。毎週エッセイの課題をこなし、他の生徒と意見交換をすることで、分かりやすく論理的に書くトレーニングをする機会が嫌というほどあるおかげだと思います。講師からも課題のフィードバックをもらえるので、反省点を次に生かすことができています。

また、相互評価の課題ではいろいろな国の生徒とのやり取りがあり、個性や説明の仕方、英語の使い方などに違いがみられて面白いです。エッセイの書き方が上手だなという人とコミュニケーションをとったり、やり方を参考にしたりしています。相互評価でポジティブなメッセージがもらえるとやはり嬉しく励みになります。

# まとめ
完全オンラインで学位が取得できる大学、University of the PeopleのComputer Science学部について簡単に紹介しました。基礎から学びたい方、英語で学びたい方、学習習慣を身に着けたい方におすすめです。
Githubで管理しててよかった....(体験談)

最近お仕事でコードをいじいじしているのですが、ある日パソコンを開いたらいつものファイルどころかフォルダがない!?<br>
でもGithubでソースコードを管理していたのですぐに復旧できました(ホントヨカッタ)<br>
```
git clone "クローンしたいリポジトリ"
```
## まとめ
これからもソースコードの管理はしっかりしようと思いました。<br>そもそもこんなことにならないようにしなくては...
Linuxを基本からまとめてみた【基本的なコマンド15選】

##### 1. ls: ディレクトリ内のファイルとディレクトリの一覧を表示
    
```
ls
```
    
##### 2. cd: ディレクトリを変更
    
```
cd ディレクトリのパス
```
    
##### 3. pwd: 現在の作業ディレクトリのパスを表示
    
```
pwd
```
    
##### 4. mkdir: 新しいディレクトリを作成
    
```
mkdir 新しいディレクトリ名
```
    
##### 5. rm: ファイルやディレクトリを削除
    
```
rm ファイル名
```
    
##### 6. cp: ファイルやディレクトリをコピー
    
```
cp コピー元ファイル コピー先ディレクトリ
```

##### 7. mv: ファイルやディレクトリを移動させたり名前を変更
    
```
mv 移動元ファイル 移動先ディレクトリ
```
    
##### 8. cat: ファイルの内容を表示
    
```
cat ファイル名
```
    
##### 9. grep: テキストファイル内で指定したパターンに一致する行を検索
    
```
grep パターン ファイル名
```
    
##### 10. man: コマンドのマニュアルページを表示
    
```
man コマンド名
```
    
##### 11. chmod: ファイルやディレクトリのパーミッション（アクセス権）を変更
    
```
chmod パーミッション ファイル名
```
    
##### 12. sudo: 管理者権限でコマンドを実行
    
 ```
 sudo コマンド名
 ```
    
##### 13. df: ディスク使用状況を表示
    
```
df
```
    
##### 14. tail: ファイルの末尾から指定された行数の内容を表示します。デフォルトでは末尾の10行が表示されます。※ logファイルを見るときによく使います。

```
tail -n 行数 ファイル名
```

##### 15. find: 指定したディレクトリ以下で、条件に一致するファイルやディレクトリを検索
    
```
find ディレクトリ -name "検索条件"
```


## 参考サイト
[【エンジニア未経験】忙しい人必見!! 最低限身に付けるべき技術5選](https://www.youtube.com/watch?v=z6FBrAnv2WQ&t=364s)
Tarraformを使ってAWSにWebサーバを構築 #5 ~セキュリティグループ(ファイアウォール)を設定する~

## 目的
EC2にNginxがインストールされた状態を作り出し、ブラウザからデフォルトページが確認できることをゴールとする。
インフラ構築はTerraformでコード化することで再現性、再利用性、速度などが手作業に比べると高い。
[GitHubリンク](https://github.com/keitasato/terraform-nginx)

### 手順
1. [TerraformからAWSリソースを操作できるように設定する](https://qiita.com/kekkepy/items/4185a621e5d3cc75016b)
1. [Terraformをインストールする](https://qiita.com/kekkepy/items/1b3f4f14bbc2d2dc2c9b)
1. [TerraformでEC2サーバを立ち上げてみる](https://qiita.com/kekkepy/items/8b84fc0c39313267a078)
1. [ネットワークを整える(VPC, サブネット, ルーティングテーブル,インターネットゲートウェイ)](https://qiita.com/kekkepy/items/c941c00536af57bae163)
1. [セキュリティグループ(ファイアウォール)を設定する](https://qiita.com/kekkepy/items/47dcda4d9a7a2064382f)
1. [Webサーバ用EC2を立ち上げる](https://qiita.com/kekkepy/items/81bfa5d542c9160d430b)
1. [Webサーバが立ち上がる際にWebサーバソフトをインストールするように設定する](https://qiita.com/kekkepy/items/209f7ddb29fb5af65a6e)

#### 今回の到達点
セキュリティグループ(ファイアウォール)を設定する

#### Webサーバを立てる準備
- ネットワークを構築する
- ネットワークに許可する通信を設定する **←今回はここ**
- EC2をプライベートネットワークに所属させて外部からアクセスできるようにする
- EC2にWebサーバソフト(今回はNginx)をインストールする

##### Step1. security_group.tfの作成
セキュリティグループに関する設定をするファイルを作成する。
SSH, HTTP, HTTPSのインバウンド、HTTP,HTTPSのアウトバウンドを許可するような設定をする。
SSHインバウンドは管理のため。
HTTPとHTTPSのインバウンドはブラウザから閲覧するため。
HTTPとHTTPSのアウトバウンドはNginxをインストールするため。
C:\Users\[ユーザ名]\Documents\MyProject\terraform\security_group.tf
```terraform:security_group.tf
# Web server security group
resource "aws_security_group" "web_sg" {
  name        = "${var.project}-${var.environment}-web-sg"
  description = "web server nginx security group"
  vpc_id      = aws_vpc.vpc.id

  tags = {
    Name    = "${var.project}-${var.environment}-web-sg"
    Project = "${var.project}"
    Env     = "${var.environment}"
  }
}

resource "aws_security_group_rule" "web_in_http" {
  security_group_id = aws_security_group.web_sg.id
  type              = "ingress"
  protocol          = "tcp"
  from_port         = 80
  to_port           = 80
  cidr_blocks       = ["0.0.0.0/0"]
}

resource "aws_security_group_rule" "web_in_https" {
  security_group_id = aws_security_group.web_sg.id
  type              = "ingress"
  protocol          = "tcp"
  from_port         = 443
  to_port           = 443
  cidr_blocks       = ["0.0.0.0/0"]
}

resource "aws_security_group_rule" "web_out_http" {
  security_group_id = aws_security_group.web_sg.id
  type              = "egress"
  protocol          = "tcp"
  from_port         = 80
  to_port           = 80
  cidr_blocks       = ["0.0.0.0/0"]
}

resource "aws_security_group_rule" "web_out_https" {
  security_group_id = aws_security_group.web_sg.id
  type              = "egress"
  protocol          = "tcp"
  from_port         = 443
  to_port           = 443
  cidr_blocks       = ["0.0.0.0/0"]
}

resource "aws_security_group_rule" "web_in_ssh" {
  security_group_id = aws_security_group.web_sg.id
  type              = "ingress"
  protocol          = "tcp"
  from_port         = 22
  to_port           = 22
  cidr_blocks       = ["0.0.0.0/0"]
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1221536/a86e9622-0c34-6b64-fc9b-1c84742cf804.png)
【Rails】Rackとは？Unicornとは？Pumaとは？

いまいち理解できていない言葉やツール、システムについて調べています。
今回はRack、Unicorn、Pumaなどについて調べたので、メモとして残しておきます。

# Rackとは？
- Rackとはアプリケーションサーバーである。
- Rubyのフレームワークを繋ぐためのアプリケーションサーバーである。
- Rubyのフレームワークとはすなわち、Ruby on RailsやSinatraの事である。

また、Rackについてこちらの説明がしっくりきて分かりやすかったです。
```
Rackというアプリケーションサーバーという土台があり、
その上にRuby on RailsやSinatraが乗っていると思ってください。
概念的にはRack = Ruby on Railsと思っていただいて構いません。
```
引用：　https://autovice.jp/articles/146

# Unicornとは？

```
UnicornとはRackアプリケーション用のWebサーバーです。
```
引用：　https://autovice.jp/articles/146


# Pumaとは？
- Pumaも、Webサーバーである。
- 「ピューマ」と読む
- RailsでWebアプリケーションを作成する際に利用する。
- Gemfileに記述してインストールする

# RubyのフレームワークはRailsだけじゃない
- Rubyを使った開発に使用するフレームワークは、Ruby on Railsだけではない。
- RubyのフレームワークとしてSinatraというものもある。


# なぜ Webサーバーが複数必要なの？
```
UnicornなどのRack専用のWebサーバーの弱点を補うのがNginxです。
Nginxは低速クライアントをバッファリングします。
NginxとUnicornの間の接続は非常に高速なため、
Unicornが低速なクライアントのリクエストを受信することがなくなります。
```
引用：https://autovice.jp/articles/146


# Webサーバーとアプリケーションサーバーの違い
```
Webサーバーとアプリケーションサーバーの違いとは？ 
Webサーバーが単にWebサイトに含まれるHTMLページ、画像ファイル、動画ファイルなどの静的コンテンツをデリバリするのに対し、
アプリケーションサーバーは動的コンテンツを生成してユーザーのWebブラウザにデリバリします。
```
引用： https://www.nginx.co.jp/learn/app-server/

# 最後に

全体像を把握する事で、開発に対する理解が深まると思います。
まだまだ未熟ですが、これからもキャッチアップしていきます。

pumaのことを「プーマ」と呼んでいましたwww


# 参考記事
https://autovice.jp/articles/146

https://www.nginx.co.jp/learn/app-server/
Sentryに独自のユーザ情報を追加して誰がバグを踏んだのかを一瞬で特定する

バックエンド（Ruby on Rails）とフロントエンド（Vue.js）にSentryを仕込んで例外をキャッチをしています。ですが、利用するユーザに関わらずURLが同一なので、どのユーザが例外を踏んだのか瞬時に特定することができず、影響判断に時間がかかってました。それを解決する方法です
[![Image from Gyazo](https://i.gyazo.com/ce4593ed69934884607a2ef50095f5e3.png)](https://gyazo.com/ce4593ed69934884607a2ef50095f5e3)

# setUserを使う

## Ruby on Rails編
SentryにsetUserという機能がありますのでそれを使います。以下のQiita記事を参考にしてください

https://qiita.com/ita-k/items/57cf9b6a18cecdcef61a#%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E8%A8%AD%E5%AE%9A


```ruby
Sentry.set_user(id: current_user.id)
```
この部分はid以外に独自のパラメータを設定できます。例えば
```ruby
Sentry.set_user(client_name: current_user.name)
```
こんなこともできます。

## Vue.js編

同様にsetUserを呼び出します。私のプロジェクトではヘッダにログイン者情報を出していたので、そこを表示するときにセットするようにしました。

```javascript
// header.vue
import * as Sentry from "@sentry/vue";

watch(current_user, () => {
  Sentry.setUser({ client_name: current_user.client_name });
})
```

## 結果
[![Image from Gyazo](https://i.gyazo.com/83fe3e4d3fc7b9369594cec032344221.png)](https://gyazo.com/83fe3e4d3fc7b9369594cec032344221)



これで、通知が来てすぐに誰が踏んだのか分かります。setUser知らなかったので、URLに何かしら埋め込むしかないかなぁーと思ってました。社内のメンバーが見つけてくれて解決してくれたのでメチャ感謝です。その功績を（許可貰って）記事にしました(笑)
nginxのコネクション数制限(limit_conn)で複数プロトコルに対応する

nginxでは同時アクセス数制限のためにlimit_connディレクティブが使用できるが、httpとhttps両方でサービスを公開している場合、コネクション数を合計でカウントするか個別でカウントするかによって設定方法が異なる。

参考:  
http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html  
http://nginx.org/en/docs/http/ngx_http_core_module.html

## HTTPとHTTPSの合計でリクエスト数制限を行う場合

limit_conn_zoneで`$request_uri`そのものをキーとするのでHTTPとHTTPSを区別せずにリクエストをカウントする。

```
http {

    limit_conn_zone $request_uri zone=zonename:10m;
    limit_conn zonename 4;

    ...

    server {
        listen       8080;
        ...
    }
    server {
        listen       8443 ssl;
        ...
    }
}
```

## HTTPとHTTPSのそれぞれでリクエスト数制限を行う場合

HTTPとHTTPSを区別したいので、`$request_uri`の手前に`$scheme`を繋げた文字列をキーに設定する。

```
http {

    limit_conn_zone ${scheme}_${request_uri} zone=zonename:10m;

    ...

    server {
        listen       8080;
        limit_conn zonename 4;  # 接続上限は別々の数を指定可能
        ...
    }
    server {
        listen       8443 ssl;
        limit_conn zonename 4;
        ...
    }
}
```
糖衣構文（Syntax Sugar）でよりスマートなコーディングをしてみよう！

今日は**糖衣構文**ってヤツについて書いてみようかと。普段コードを書いてるときに遭遇する、あれやこれやのパターン表現が、実はこの糖衣構文のおかげだったりするんだぜ。じゃあ何なんだろう糖衣構文って？ なんでそんなに大事なの？ ってことで、Pythonを使って詳しく見ていくぜ。

## 糖衣構文って何？

**糖衣構文**ってのはさ、プログラムの機能そのものを変えるわけじゃないけど、コードを**読みやすく**、**書きやすい**形にするためのプログラミングの手法なんだよ。まさに、"糖衣"（甘いコーティング）を施したコードってわけだな。

この考え方は、1960年代に**Peter John Landin**って人が提唱したんだ。彼は**人間がコードを理解しやすい形**で書けるように、もっと自由に表現できる方法を考えたんだよ。これが、我々がプログラムを読んだり、書いたり、デバッグしたりする際の労力を軽くする一歩となったわけだ。

## Pythonでの糖衣構文の例

Pythonでは糖衣構文の活用例が盛りだくさんだよ。知ってたかい？ ここでは、リスト内包表記とラムダ式、デコレータを例に挙げてみるぜ。

1. **リスト内包表記**

普通のループでリストを作るとこんな感じだよな。

```python
numbers = [1, 2, 3, 4, 5]
squares = []

for n in numbers:
    squares.append(n**2)

print(squares)  # prints: [1, 4, 9, 16, 25]
```

でもこれをリスト内包表記で書き換えると、一行でサクッと書けちまうんだ。

```python
numbers = [1, 2, 3, 4, 5]
squares = [n**2 for n in numbers]

print(squares)  # prints: [1, 4, 9, 16, 25]
```

2. **ラムダ式**

関数の定義と呼び出しも普通にやるとこんな感じ

だろ？

```python
def multiply(x, y):
    return x * y

result = multiply(2, 3)
print(result)  # prints: 6
```

でもこれをラムダ式で書き換えると、やっぱり一行でバッチリだ。

```python
multiply = lambda x, y: x * y

result = multiply(2, 3)
print(result)  # prints: 6
```

3. **デコレータ**

デコレータってのは、既存の関数に新たな機能を付け足すための糖衣構文だ。以下の例では、関数の実行時間を計測するデコレータを作ってみたぜ。

```python
import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Time: {end_time - start_time} seconds")
        return result
    return wrapper

@timer_decorator
def my_function(n):
    sum = 0
    for i in range(n):
        sum += i
    return sum

print(my_function(100000))  
```

どうだい、これらは馴染みのあるってやつもいたんじゃないか？

## 糖衣構文の利点・欠点

### 利点

1. **コードの可読性向上**: 糖衣構文を使うとコードが短く、明確になるから、他の開発者がそのコードを理解しやすくなるんだよ。

2. **効率的なコーディング**: よく使うパターンをさくっと書くのに糖衣構文は超便利だぜ。

### 欠点

1. **初学者にはハードルが高い**: 糖衣構文は熟練者にとっては便利だけど、初心者にはややこしいかもな。

2. **言語間で使えるかどうかは微妙**: 糖衣構文はその言語特有のものだから、他の言語に移るときには困ったりすることもあるだろう。

## 開発チームでの使いどころ

### 柔軟性が高いチームの場合

新しいことにオープンで、柔軟性が高いチームなら、糖衣構文を活用すれば効率的なコーディングと読みやすさが実現できるぜ。例えば、チームメンバー全員がPythonのリスト内包表記やラムダ式、デコレータに慣れてるなら、それらを使ってコードを書くことで生産性がアップすること請け合いだよ。

### 柔軟性が低いチームの場合

もしチームがPythonを新たに導入したばかりで、まだ構文に慣れていない場合や、新しいことに抵抗感を持つメンバーがいるなら、糖衣構文を使うと混乱のもとになるかもな。そんなときはまず基本的な構文をマスターして、徐々に糖衣構文を導入していくといいんじゃないかな。

## まとめ

糖衣構文はプログラミングの世界を人間にとって理解しやすいものに変え、開発者の労力を減らしてくれるんだ。
ただし、活かせるかはチームの状況や経験、そしてメンバーのメンタリティ次第だ。適切な知識と理解を持って使えば、糖衣構文はコードの美しさと効率性を大幅に向上させることができる。
むしろ、無闇に糖衣構文を使いまくると、コードの可読性が下がることもあるから注意が必要だ。また、特定の言語に依存しすぎると、他の言語への移行が難しくなる恐れもあるから注意だ。
だから、糖衣構文はチームの状況や経験、プロジェクトの要件に応じて上手に使うことが大事だ。糖衣構文はツールの一部だ！自分たちの状況に合わせて、うまく扱うことが求められるんだぜ。


--
P.S. この記事はGPT4を用いて表現を「だぜ口調」へ変換した文書です。中には不快に感じられる方もいらっしゃるかと思いますが、ご容赦ください。技法への関心と、組織体で取り扱う際の注意が伝わると幸いです。それでは良いコーディングを！
【ChatGPT無】性格判断Promptです

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　今回は、
　　性格判断をお願いしました。
　　　まぁ、遊び半分です。

　何かの参考になれば、
　　と思い、アップします。
```Text:性格判断Prompt
# 目的
人間の性格を判断して欲しいです。
一般的な判断で構いません。

# 処理手順
性格判断に必要な質問を必要なだけしてください。
ただし、質問は一度にひとつです。
必要な質問が終わったら、その答えから性格判断を行なってください。

以上のことが理解できましたならば、最初の質問をして、答えを待ってください。

理解できない場合は、その箇所を指摘してください。
```

　次が、
　　途中の質疑応答と結果です。

```Text:性格判断経過と結果
ChatGPT
了解しました。人間の性格を判断するために、質問を一度にひとつずつ行い、その答えから性格判断を行います。では、最初の質問をします。

質問：あなたは新しい環境や未知のことに対してどのように感じますか？興味を持ちますか、それとも不安を感じますか？





User
興味は感じる。でも一歩引いて、対処を考える

ChatGPT
ありがとうございます。あなたは新しい環境や未知のことに興味を持ちつつも、一歩引いて対処策を考える傾向があるようですね。

次の質問です。

質問：他人と協力することやチームでの作業に対して、どのような態度を持ちますか？積極的に関わりますか、それとも自分のペースを大切にしますか？





User
正直、煩わしい。しかし、できるだけ協力しようとする。それでも積極的といえるかどうか。

ChatGPT
ありがとうございます。あなたは他人との協力やチームでの作業に対しては煩わしさを感じるものの、できるだけ協力しようと努力する姿勢を持っています。積極的とまでは言い難いかもしれませんが、協力の意思があることが分かります。

次の質問です。

質問：ストレスや困難な状況に直面した場合、どのように対処しますか？冷静に考えて解決策を見つけることが多いですか、それとも感情的になりがちですか？





User
そのストレスから逃げられるなら逃げる。でも、難しいならば、感傷的にならぬように、解決策を見つけようとする、かな。

ChatGPT
ありがとうございます。あなたはストレスや困難な状況に直面した場合、できるだけ逃げるような選択肢を選ぶ傾向があります。しかし、逃げることが難しい場合には感傷的にならず、解決策を見つけるよう努力するようですね。

次の質問です。

質問：新しいアイデアや変化に対して、どのような反応を示しますか？素直に受け入れますか、それとも慎重になりますか？





User
基本的には、その変化を受け入れるかな

ChatGPT
ありがとうございます。あなたは新しいアイデアや変化に対して基本的には受け入れる姿勢を持っているようですね。

次の質問です。

質問：他人との意見の相違や対立が生じた場合、どのようなアプローチを取りますか？議論を重ねて解決を図ることが多いですか、それとも妥協を選ぶことが多いですか？





User
どちらが証拠や理論を提示できるかで、押すか引くか、決める。

ChatGPT
ありがとうございます。あなたは他人との意見の相違や対立が生じた場合、証拠や理論の提示を基準にして押すか引くかを決めるようですね。議論や妥協ではなく、論拠や論理的な根拠に重きを置くアプローチを取るようです。

次の質問です。

質問：他人との関係を築く際、どのような特徴や資質を重視しますか？例えば、信頼性や共感力などです。





User
まずは、会話します。
100点満点で、50点を最初に設定。
会話を続けていき、その点をアップダウンさせて、判断する。

ChatGPT
ありがとうございます。あなたは他人との関係を築く際に、まずは会話を通じて相手との接触を重視するようですね。そして、初めに50点という基準を設定し、会話を続ける中でその点数を上げたり下げたりしながら、相手との関係性を判断するアプローチを取るようです。

質問：他人との会話において、どのような要素や要点に注目して点数を上げたり下げたりしますか？具体的な特徴や資質を教えてください。





User
話題が合うかどうかとか、興味深い話題かどうか。

ChatGPT
ありがとうございます。他人との会話において、話題の合致や興味深さが重要な要素となるようですね。具体的には、話題が自分と相手の関心や共通の興味に合っているかどうかを注目し、興味深い話題を提供することで点数を上げることができるでしょう。

これで質問は終わりです。あなたの性格判断を行います。

あなたは新しい環境や未知のことに興味を持ちつつも、一歩引いて対処策を考える傾向があります。他人との協力やチームでの作業には煩わしさを感じつつも、できるだけ協力しようとする姿勢を持っています。ストレスや困難な状況に直面した際には、逃げる選択肢を選びつつも感傷的にならず、解決策を見つけようと努力します。新しいアイデアや変化には基本的に受け入れる姿勢を持ちます。他人との意見の相違や対立が生じた場合には、証拠や理論の提示を重視し、押すか引くかを判断します。他人との関係を築く際には、まずは会話を通じて接触し、点数を上げたり下げたりすることで関係性を判断します。話題の合致や興味深さが重要な要素となります。

以上の情報から、あなたは好奇心旺盛で冷静な判断力を持ちつつも、煩わしい状況から逃げずに解決策を模索しようとする、柔軟性のある性格を持っていると判断されます。また、他人との関係を慎重に築きながら、興味深い話題や共通の関心事に重点を置くことで、コミュニケーションを深めることができるでしょう。

ただし、性格は複雑で多様な要素から成り立っており、この判断は一般的な指標に基づいて行われたものです。個人の経験や状況によっても異なる場合がありますので、あくまで参考程度にご覧ください。
```

　ふむ、
　　やはり、
　　　期待しないでよかったわw
【MDAV】ウイルススキャン時のCPU使用率をGPOで制限する方法

Microsoft Defender ウイルス対策（以下MDAV）のウイルススキャン時のCPU使用率をGPOで制限することがあったため、
備忘録で記事にします。（2023年7月現在）

○結論
以下のGPOでウイルススキャン時のCPU使用率制限は可能です。
コンピューターの構成 - 管理用テンプレート - Windows コンポーネント - Microsoft Defender ウイルス対策 - スキャン
A：スキャン中の最大CPU使用率を指定する：有効
B：CPU調整の種類：無効
※BはWindows11用のADMXにのみ存在するGPO
・Windows11用ADMXのダウンロードURL
https://www.microsoft.com/en-us/download/details.aspx?id=104593
・対象ADMXファイル
「WindowsDefender.admx」

○注意点
AのGPOのみではスケジュールスキャン（自動スキャン）時のみCPU使用率制限がされるため、
オンデマンドスキャン（手動スキャン）時にもCPU使用率制限をかけたい場合は、A、BのGPOをどちらも設定する必要があります。
※タスクスケジューラーでウイルススキャンのバッチを実行する際もオンデマンドスキャンと判断されます。

○検証
※コマンドでのウイルススキャン方法は以下を参照ください。
https://learn.microsoft.com/ja-jp/microsoft-365/security/defender-endpoint/command-line-arguments-microsoft-defender-antivirus?view=o365-21vianet

①GPO設定前
(1)ディレクトリの移動
![①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156884/0ec551d8-908c-3065-410e-abaf6e1873a0.png)
(2)ウイルススキャン（フルスキャン）の開始
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156884/bc1a12ba-7a86-22e4-5ff5-1e2505aa7c16.png)
(3)CPU使用率が上昇
※100%近くに張り付いた状態が続くこともあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156884/2a1685d6-4ca2-e2ac-6173-3149de5a984a.png)

②GPOの設定-1（AのGPOのみ設定）
(1)A：スキャン中の最大CPU使用率を指定する：有効
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156884/d083af3b-605e-fe13-ee65-c5616e7f6c5b.png)
(2)B：CPU調整の種類：未構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156884/ca8dbc7e-1889-e1c0-9e6e-27adb67f48b5.png)
(3)GPO適用確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156884/b05921a2-44cd-c681-9888-5ff93cc6da9a.png)
「MDAV_GPO」が適用されていることを確認。

(4)ウイルススキャン（フルスキャン）開始、CPU使用率確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156884/f0804c94-00cb-232d-2761-beea84ccad9a.png)
AのGPOを設定しただけではオンデマンドスキャン（手動スキャン）時にはCPU使用率制限はされないことを確認。

③GPOの設定-2（BのGPOも設定）
(1)A：スキャン中の最大CPU使用率を指定する：有効
　 B：CPU調整の種類：無効
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156884/fc1938b5-75d1-f6a1-30be-0e739d1830b2.png)
(2)GPOの適用を更新し、ウイルススキャン（フルスキャン）開始

AのGPOで設定したCPU使用率30%以下で動作していることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1156884/d8e1cf86-c129-821e-ea4a-e9fd81f04355.png)

p.s.
初めての記事のため、読みにくい点などもあるかもしれませんが、参考になりましたら幸いです。
今後も参考になりそうなものがありましたら、記事に残そうと思います。
【Snowflake】SnowPro Core の模擬試験の正解は何なのか

# 結論

[SnowPro Core認定資格](https://www.snowflake.com/certifications/?lang=ja)に関して、第三者が提供する模擬試験の解答に自信がなかったら、ここを見るのがおすすめ。

- [EXAMTOPICS](https://www.examtopics.com/)
    - [SNOWFLAKE DISCUSSIONS](https://www.examtopics.com/discussions/snowflake/)


素晴らしい。

ネットで拾える情報(偽の解答例含む)と立ち向かうかのごとく、コメント欄でいろんな議論がなされている。

例 : https://www.examtopics.com/discussions/snowflake/view/91809-exam-snowpro-core-topic-1-question-302-discussion/

誰が言ったかわからないが、一応「正しい」とされる解答。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/11c7a8ac-9546-1482-97b1-b3b95740b704.png)

一方、これに対するみんなの意見がこちら。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3475867/1b73016a-d137-63a2-2989-cf4a921bbd07.png)

割れてますなぁ。真っ向対立やん...

とはいえ[一次情報](https://docs.snowflake.com/ja)が神なので、そちらから関連情報を見ながら総合的に自分の中で腑に落ちるように噛み砕く必要がある。


# 背景

Snowflake公式の認定試験として、[SnowPro Core認定資格](https://www.snowflake.com/certifications/?lang=ja)
があり、ネットにいろんな例題や模擬試験(mock test)が出回っているが、見比べると解答例がまばらになっている。

これは、有料コンテンツであっても例外ではない。

学習コンテンツ販売サイトがいくつも存在し、模擬試験200問、テスト何回分みたいなWebテストやPDFを購入できるが、そんなサイトが提供する内容でさえも、今ひとつ不安定な気がする。

え？そうなの？ということがよく起こる。

残念ながら公式ドキュメントですら時に誤る、あるいは明言しないことがあるこのご時世。

何が正しいのか。何を信じればいいのか。

実際に動かしてみる、が最も正しいんだろうけど。
全てにおいてそうはいかないのが現実ではなかろうか...。

そんなことを思う最中、ちょうどよさそうな、みんなの意見が反映されたディスカッションを見つけた。

# ぼやき

Snowflake勉強がてら、認定試験があるとの事で取ってみようかなと。
しかし進めていくと早速...情報が非常に不安定すぎじゃね？とむしゃくしゃしていた。

結論のところに貼った参考URLとキャプチャに載せた例題で引っかかって、ディスカッション内容を見ているとやっぱそうだよなぁ...と思っている。

(他にもいろんなところで引っ掛かっているのだが)

##### 例題(サマリ)

- ステージに10個のファイルがある
- 以下の COPY INTO を実行して、うまく取り込めた
    - `COPY INTO my_table FROM @my_stage;`
- 翌日新たに10個のファイルが追加された
- さて、この状態で全く同じ COPY INTO を実行したらどうなる？

##### 例題の解答

A. ステージ上のすべてのファイルのすべてのデータがテーブルに追加される

へー、これが答えなのか。

##### Snowflake公式 : [COPY INTO <テーブル>](https://docs.snowflake.com/ja/sql-reference/sql/copy-into-table)

> コピーオプションの1つとして明示的に FORCE = TRUE を指定しない限り、コマンドは既にテーブルにロードされたステージングされたデータファイルを無視します。データを再ロードするには、 FORCE = TRUE を指定するか、ファイルを変更して再度ステージングする必要があります。これにより、新しいチェックサムが生成されます。

ふむふむ...ん？

> 既にテーブルにロードされたステージングされたデータファイルを無視します

解答例違くね？

##### みんなの意見

D. 新しく追加されたファイルからのデータのみがテーブルに追加される

まあそうだわな...

こんなことが多い。多すぎる。みんな、気をつけて...!


# おまけ

根深い話

https://www.examtopics.com/discussions/snowflake/view/69939-exam-snowpro-core-topic-1-question-123-discussion/

- 問 : リーダーアカウントは、Snowflake 外で使用するために共有データオブジェクトからデータを抽出できる
    - True or False

2択問題なのにこんなにも揉めることになるなんて...

公式ドキュメント : [リーダーアカウントで制限/許可されているもの](https://docs.snowflake.com/ja/user-guide/data-sharing-reader-create#what-is-restricted-allowed-in-a-reader-account)

> ストレージ統合を使用したデータのアンロード。ただし、接続認証情報を指定して COPY INTO <場所> コマンドを使用すると、データをクラウドストレージの場所にアンロードできます。

できないけど、やりようはある、みたいな。
できるってことでOK？

ディスカッションでのとある[コメント](https://www.examtopics.com/discussions/snowflake/view/69939-exam-snowpro-core-topic-1-question-123-discussion/#:~:text=This%20is%20a%20tricky%20one%20because%20currently%20Snowflake%20documentation%20does%20not%20spell%20out%20the%20answer%20to%20this%20clear.)

> 現在、Snowflake のドキュメントにはこの明確な答えが詳しく記載されていないため、これは難しい問題です。

あら...
一次情報(公式ドキュメント)もうまく解釈してあげないと厳しい。
例題で問われている内容とマッチする箇所を一次情報から見つけ出すのも難しい。

まぁ、気にしない、こだわりすぎないのも重要だということで。
その1問だけで全てが決まるわけではない。そう割り切ろう。
【Three.js】LightProbeでライティングする

Three.jsで`LightProbe`を使う方法について解説します。
[LightProbe – three\.js docs](https://threejs.org/docs/index.html?q=lightprobe#api/en/lights/LightProbe)

デモ: https://aadebdeb.github.io/three-lightprobe-demo/
ソースコード: https://github.com/aadebdeb/three-lightprobe-demo
![LightProbe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/c96d9af7-794d-93a7-bdab-44370bb05cfb.png)
検証に使用したThree.jsのバージョンはr154です。

`LightProbe`は球面調和関数を用いて少ない数の係数で環境マップを表現し、ライティングを行います。私も理論部分を全然理解できていないですが、`AmbientLight`(`HemisphereLight`)と同じようなライティングを環境マップを用いてよりいい感じにできるという認識です。
[球面調和関数変換の理論と実装 \- Qiita](https://qiita.com/KionIm/items/315d4b68bab39ad8d786)
[docs/CGのための球面調和関数\.pdf at master · mebiusbox/docs · GitHub](https://github.com/mebiusbox/docs/blob/master/CG%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%90%83%E9%9D%A2%E8%AA%BF%E5%92%8C%E9%96%A2%E6%95%B0.pdf)

`LightProbe`は`LightProbeGenerator`を使って環境マップから作成できます。
[LightProbeGenerator – three\.js docs](https://threejs.org/docs/index.html#examples/en/lights/LightProbeGenerator)

Equirectangular形式の全天球画像から`LightProbe`を生成すると以下のようになります。

```javascript
// Equirectangular形式の全天球画像をTextureとして読み込む
const texture = await new TextureLoader().loadAsync('/environment.jpg')
texture.colorSpace = SRGBColorSpace
// TextureをWebGLCubeRenderTargetに変換する
const cube = new WebGLCubeRenderTarget(256).fromEquirectangularTexture(renderer, texture)
// WebGLCubeRenderTargetからLightProbeを生成する
const lightProbe = LightProbeGenerator.fromCubeRenderTarget(renderer, cube)
// LightProbeをSceneに追加する
scene.add(lightProbe)
```

`LightProbe`は毎回クライアント側で全天球画像から生成する必要はなく、変換した結果の係数をコピペして`SphericalHarmonics3`を直接作れば生成の負荷を減らすことができます。

```javascript
// 全天球画像から生成したLightProbeから係数をコピペする
console.log(originalLightProbe.sh.toArray())

// コピペした係数からLightProbeを生成する
const lightProbe = new LightProbe(new SphericalHarmonics3().fromArray([
  0.8857463624727963, 0.6460947316933959, 0.8268657476568466,
  ...
  0.15054100688032032, 0.03475026485176827, -0.05928848411398983
]))
scene.add(lightProbe)
```
2023年7月 AIOps 定点観測

# 概要
AIOps の動向や学習のため、Google で AIOps を検索した結果を記録している記事です。

# 2023年7月3日の検索結果 (リスティング広告)

![20230703_AIOps_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/c3b06091-d992-d7fb-ff78-b60ed7d883bc.png)

* Splunk
* PureStorage
* Dynatrace
* Ricoh

今月は Splunk がトップです。 PureStorage と Dynatrace が続いています。Ricoh が初登場です。

先月の結果はこちら --> [2023年6月 AIOps 定点観測](https://qiita.com/mkodera/items/6bcda024c046983908c7)

# 2023年7月3日の検索結果 (広告以外)

![20230703_AIOps_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2345504/699193e3-c0cf-5ca3-188c-2580e3c97227.png)

* HPE
* Splunk
* IBM
* 日立製作所
* ServiceNow


広告以外では HPE が強調スニペットでトップに表示されています。 その後に Splunk、IBM が続いています。1～5番目まで先月と全く同じです。

先月の結果はこちら --> [2023年6月 AIOps 定点観測](https://qiita.com/mkodera/items/6bcda024c046983908c7)