OmniAICreator/Qiita-1.07M huggingface dataset:
フロントエンドエンジニアにとって必須の知識を厳選してQ＆A形式でまとめてみる①

フロントエンドエンジニアは単にサイトの見た目を作るだけではなく、以下のような幅広い知識が求められます。

・HTML,CSS,Javascriptに関する知識
・React.js,Anglar.js,Vue.jsなどのフレームワークに関する知識
・オブジェクト指向に関する知識
・SEOに関する基本的な知識
・テストやデバッグの知識
・クロスブラウザの互換性、バージョン管理、非同期処理などに関する知識
・リクエストハンドラに関する知識

当記事では一部ですがフロントエンドの知識を習得するために、質問形式で知識を整理してみます。

## cookiesとsession storageとlocal strageはどのように使い分けるべきか

Cookies: 認証情報やトラッキングデータなど、サーバーと共有する必要がある情報を保存する場合に使用する。

Session Storage: ブラウザを閉じると不要になる短期間のデータ（例: ページ間の一時的な状態）を保存する場合に使用する。

Local Storage: ユーザー設定やキャッシュなど、長期間保存するデータを扱う場合に使用する。


 | 項目               | Cookies               | Session Storage            | Local Storage              |
|--------------------|-----------------------|----------------------------|----------------------------|
| データの保存場所    | クライアント + サーバー | クライアントのみ            | クライアントのみ            |
| サイズ制限          | 約4KB                | 5MB程度                    | 5MB程度                    |
| 有効期限            | 設定次第| セッション（タブを閉じるまで）| 永続的                     |
| HTTPリクエストとの関係 | リクエストごとに送信  | 送信されない                | 送信されない                |
| 用途               | 認証情報、トラッキング | 一時的なデータ保存          | 永続的なデータ保存          |

## RESTとRESTの代替とは何か
RESTは、ネットワークを通じてデータをやり取りするための設計スタイルのこと。(Web APIを設計する際によく使われる)RESTはHTTP(web通信の基本プロトコル)を活用して、クライアント（例：ブラウザやアプリ）とサーバーがやり取りを行う。
RESTの特徴
	1.	ステートレス（状態を持たない）通信
	2.	データがリソースとして扱われる
	3.	HTTPメソッドを使用
	4.	JSONやXMLなどデータ形式が多様
	5.	フロントエンドとバックエンドを独立して操作することができる

REST以外にAPI設計やデータ通信に使われる技術の例
	1.	GraphQL
	•	Facebookが開発したAPIクエリ言語。クライアントが必要なデータだけを取得できる。
	•	例: GitHub APIで採用。
	2.	Webhooks
	•	特定のイベントが発生したとき、リアルタイムで通知を送る仕組み。
	•	例: Sendgrid（メール送信ステータス通知）。
	3.	gRPC
	•	Googleが開発した高速通信プロトコル。軽量でリアルタイム性が高い。
	•	例: Google Cloudの内部通信。

 ## Webサイトの動きが遅い場合、どのような改善策があるか
 サイトの読み込み速度が遅い原因は多岐にわたる。
 改善例として以下のようなものが挙げられる。
 	1.	クライアント側とサーバー側でキャッシュを有効にする
	2.	プラグインやアドオンを削除する
	3.	画像サイズを最適化する
	4.	コードを最小化する（不要なスペースやコメントを削除）
	5.	コンテンツ配信ネットワーク（CDN）を使用する

診断ツールとして、Google PageSpeed InsightsやGoogle Tag Managerを利用すると良い

 ## ブラウザごとのスタイルの互換性の問題にどのように対処するか
 ブラウザ互換性の問題を解決する最も簡単な方法は、HTMLのheadタグに条件付きステートメント（conditional statement）を追加することです。

1.コードのバリデーション
コード（HTMLやCSS）が正しく記述されているかを検証すること。

2.デザインの簡素化
複雑なデザインを避け、シンプルなレイアウトを採用すること。

3.コンポーネントの再利用
再利用可能なコンポーネントを作成して、コードの重複や複雑さを減らすこと。

4.開発中のリアルタイムテスト
開発中に異なるブラウザで動作や表示をリアルタイムでテストすること。

5.Modernizrを用いたブラウザ検出の置き換え
ユーザーのブラウザで利用可能な機能を検出するために、Modernizr（機能検出ライブラリ）を使用すること。

6.ベンダー固有の関数の追加
特定のブラウザで必要なベンダープリフィックスや関数を追加すること。

 ## Webpackとはなにか
 Webpackは、JavaScriptアプリケーションのモジュールバンドラー（Module Bundler）です。主に、プロジェクト内の複数のファイル（JavaScript、CSS、画像など）を1つまたは複数のバンドル（bundle）にまとめるために使用されます。

 ## deferとasyncの違いは
 
 1. 共通点
どちらも非同期にスクリプトを読み込む
通常のスクリプトの場合、読み込みと実行が同期的に行われ、HTMLパースが一時停止しますが、deferやasyncを使用するとこれを回避できます。

 2.違い
defer: スクリプトをHTML全体のパースが終わった後に順序通りに実行。
async: スクリプトを読み込み次第、順序に関係なく即座に実行。
Docker Compose を使用して Go で Hello World

今回は Docker Compose で Hello World を出力する簡単な Go アプリケーションを起動する方法について説明します。

# アプリケーションコード

シンプルな main 関数を用意します。

```main.go
package main

func main() {
	println("Hello World!")
}
```

# Dockerfile

この Dockerfile を後述の Compose ファイルで指定します。

```Dockerfile
FROM golang:1.23.4

WORKDIR /usr/src/app

COPY . .

CMD ["go", "run", "main.go"]
```

## Docker image
golang 1.23.4 の image を使用します。

https://hub.docker.com/layers/library/golang/1.23.4/images/sha256-5c3223fcb23efeccf495739c9fd9bbfe76cee51caea90591860395057eab3113

## WORKDIR

[golang image の説明](https://hub.docker.com/_/golang) のサンプルで `/usr/src/app` を WORKDIR として指定しているので参考にして同様にしています。

# Docker Compose

```compose.yaml
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./:/usr/src/app
    ports:
      - "8080:8080"
```

# 起動

`docker compose up` で起動します。

起動すると `Hello World!` が出力された上で、app service が終了することを確認できます。
以下は実行結果の抜粋です。

```shell
app-1  | Hello World!
app-1 exited with code 0
```
自動で類似ワード群を作成しフラグ化する(SPSS Modeler データ加工逆引き13-3)

# 自動で類似ワード群（カテゴリ）を作成しフラグ化する

![スクリーンショット 2024-12-18 16.34.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/74204bfb-8e47-dbab-cec4-94d19470255b.png)

この記事はSPSS Modeler Premium Ver18.6から追加された日本語テキスト機能を利用して書いています。SPSS Modeler Professionalをお使いの方はアップグレードするかPython連携を用いて実現します。

Python連携を紹介する記事はこちら

https://qiita.com/harrowharrow16/items/248ff8fe3879b63e7ae3

## 1.想定される利用目的

・コンタクトセンターの応答ログから解約に影響する単語の探索
・営業日報のコメントから成約予測モデルの説明変数を作成
・アンケート自由回答データからブランドと評価のポジショニングマップを作成
   
## 2.ストリームとデータのダウンロード

ストリーム

https://github.com/yoichiro0903n/blue/raw/78963e9a852b74b72fc5f78eac02a9559c0e24ea/concept2category.str

データ

https://github.com/yoichiro0903n/blue/blob/b02b11130c8c35ff26b8f2336d1aa8001374316a/comments2024_mac.csv

## 3.サンプルストリームの説明

![スクリーンショット 2024-12-18 16.36.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6b938973-9d9a-661b-6590-ad3680b98270.png)

a.入力データは以下の通りです。[comment]列の文章から頻出ワード群を自動作成してフラグ化します。

![スクリーンショット 2024-12-13 10.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/5e740adc-dfde-7dfd-f7b6-6a51676d053c.png)

b.[テキストマイニング]ノードを編集します。[IDフィールド]と[テキストフィールド]を以下の通り選択します。

![スクリーンショット 2024-12-18 10.04.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/609a7ddc-efbd-b432-79e7-25a97ce54674.png)

[モデル]タブを以下の通り設定して[実行]します。

![スクリーンショット 2024-12-18 10.14.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a7d4b7f3-5a9d-a6b7-7372-50e280083346.png)

以下のインタラクティブウインドウが表示されます。左下の領域に多頻度ワード（コンセプト）が列挙されます。類似ワード群（カテゴリ）を作るため[作成]ボタンを押します。

![スクリーンショット 2024-12-18 10.17.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/3058463d-689d-0078-b23a-16b8431a18af.png)

カテゴリが右上に自動的に作成されました。[スコア]ボタンを押します。

![スクリーンショット 2024-12-18 10.18.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/626cbf5a-d5e2-907b-d066-c6b224944c23.png)

[表示]ボタンを押します。４つの領域にアイテム（コンセプト、カテゴリ、棒グラフ、原文）が表示されているのを確認してから[生成]メニューから[モデルを生成]を選択するとcが生成されます。

![スクリーンショット 2024-12-18 16.36.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/7fc7fa66-7db4-e33b-38b6-84af90c571dc.png)

c.[テキストマイニング]ナゲットを編集します。

![スクリーンショット 2024-12-18 16.37.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/247b4d24-9a4f-9993-e009-b3f5c3cb7ed3.png)

[テーブル]を実行します。

![スクリーンショット 2024-12-18 16.38.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d7dcf398-d6cc-d81b-381a-8d93559f43b0.png)


#### 注意事項

本来定性的な情報（原文）から定量情報を抽出するには目的があり、自動で集約されたカテゴリは丁寧に手動で再構成する必要があります。あくまで初動を効率化するための機能と捉えることをお勧めします。

## 4.参考情報

#### Python連携によるテキストマイニング

https://qiita.com/harrowharrow16/items/248ff8fe3879b63e7ae3

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008
ユニークな名前の一時ファイル/ディレクトリを作成するmktempコマンド

20年以上前から存在するmktempコマンドですが、周りではあまり使われていなかったのでまとめました

## 概要

* mktempはLinuxやUnix系OSにおいて、一時ファイルや一時ディレクトリを作成するためのコマンドです
* 作成するファイル名/ディレクトリ名は任意の名前、接尾語(拡張子)をつけることができます
ただし、少なくとも3文字のランダムな英数字が付与されます
指定しない場合は「tmp.」に続いて10文字のランダムな英数字が付与されます
* ファイル/ディレクトリは任意のディレクトリ配下に作成できます
指定しない場合は環境変数TMPDIRが設定されているディレクトリに作成されます
環境変数TMPDIRが設定されていない場合は/tmpに作成されます
* 作成されるファイル/ディレクトリは実行したユーザーが所有者で、パーミッション600で作成されます
* 従来採用されることの多かったのPIDを接尾辞とする方法に比べて予測困難な名称となり安全です

## 利用方法
```
mktemp [オプション] [ファイル/ディレクトリ名]
```
ファイル/ディレクトリ名は少なくとも3文字以上連続した「X」を含める必要があります
Xはランダムな英数字に置換されます

## オプション

|オプション|説明|
|:---|:---|
|-d|ファイルではなくディレクトリを作成する|
|-p ディレクトリ|指定したディレクトリに作成する|
|-u|実際にはファイル/ディレクトリを作成せずに画面出力のみ実施|
|--suffix=接尾語|任意の接尾語をつける|

## コマンドと作成されるファイル/ディレクトリの例

### 名前や場所は指定せずに一時ファイル/ディレクトリが作りたい場合

※環境変数TMPDIRが設定されている場合は、下記の/tmpはTMPDIRの設定値になります

```mktemp```
→　/tmp/tmp.Xu8s2zjMcO

```mktemp -d```
→　/tmp/tmp.l2s3WkSInx/

### カレントディレクトリに指定した名称で作りたい場合

```mktemp anyname.XXX```
→　anyname.GYM

### 指定したディレクトリに指定した名称で作りたい場合

```mktemp -p /work anyname.XXXXX```
→　/work/anyname.zW4LX

### 指定したディレクトリに指定した名称、拡張子で作りたい場合

```mktemp -p /work --suffix=.txt anyname.XXXXXXX```
→　/work/anyname.uTDjDkX.txt

## 古いバージョンのmktempの動作（version 1.5で確認）

* 環境変数TMPDIRが設定されている場合、-pオプションより優先される
* ランダムな文字列を含まないディレクトリ/ファイルを作成可能
AtCoder練習記録#2

# 二分探索について学ぶ
## 二分探索とは
二分探索はその名の通り，「二分する」，つまり候補を半分にしながら探索していくアルゴリズムです．自分は院試で勉強済みなのでここでの解説は省略。
[詳しくはこちらを参考](https://qiita.com/Pro_ktmr/items/8946723fe08ba29a977c)
## 今回解く問題
[こちら](https://atcoder.jp/contests/abc365/tasks/abc365_c)
## 自分が初めに提出したコード
```py:自分が考えたやつ
n,m = map(int,input().split())
a = list(map(int,input().split()))

if sum(a) <= m:
  print("infinite")
else:
  for i in range(max(a)-1,0,-1):
    if sum(min(i,x) for x in a) <= m:
      print(i)
      break
```
### 結果
時間超過によって0点!!!

ということで二分探索を使って解いていきましょう。

```py:二分探索バージョン
n,m = map(int,input().split())
a = list(map(int,input().split()))

def binary_search(n,m,a):
  if sum(a) <= m:
    return "infinite"

  # 二分探索
  left,right = 0,max(a)
  result = 0
  while left<=right:
    mid = (left + right) // 2
    total = sum(min(mid,ai) for ai in a)

    if total <= m:
      result = mid
      left = mid +1
    else:
      right = mid - 1
  return result

print(binary_search(n,m,a))
```
### 結果
行けました。二分探索は実装も簡単なので次解くときは秒殺できるように頑張ります。
「論文に出る遺伝子　デルジーン300」を便利に使うChrome拡張機能を作成した

## 概要
このChrome拡張機能は、羊土社の「[論文に出る遺伝子デルジーン300](https://www.yodosha.co.jp/yodobook/book/9784758122771/)」に登場する遺伝子を、ボタン一つで検索・ハイライトすることができます。
デルジーンに掲載されている遺伝子を、論文やウェブサイト上から簡単にピックアップすることができるので、学習の効率がアップする気がします。掲載されていると思ってデルジーンを調べたら実は掲載されていなかった、といった落胆もなくなります。

（使用例）

![testimage](https://github.com/user-attachments/assets/b0cc5487-a335-40ec-b9bc-1b5c51ff66b9)


Ohno, T., Akase, T., Kono, S. et al. Biallelic and gene-wide genomic substitution for endogenous intron and retroelement mutagenesis in human cells. Nat Commun 13, 4219 (2022). https://doi.org/10.1038/s41467-022-31982-1 より引用・改変

:::note info
私は「論文に出る遺伝子　デルジーン300」とは無関係です。ただの読者です。
:::

## Code
中身は以下のリポジトリから閲覧・ダウンロードすることができます。本記事はreadmeに書いてあることと同じです。

https://github.com/Hinata-Hashimoto/DelGeneHighlighter_ChromeExtension/tree/main


## Install方法
1. リポジトリからダウンロードする（<>Code▽ → Download ZIP）。
2. Chromeの右上にある3点メニュー（︙）をクリックする。
3. 「拡張機能」→「拡張機能を管理」をクリックする。
4. 拡張機能ページ右上の「デベロッパーモード」をオンにする。
5. 「パッケージ化されていない拡張機能を読み込む」をクリックし、ダウンロードした「v1.0」フォルダをアップロードする。
6. 「すべての拡張機能」に追加されていれば成功。

## 使い方
1. 適当なサイトに行き、右上の拡張機能ボタンをクリックする。
2. DelGene Highlighterをクリックする。
3. 「論文に出る遺伝子 デルジーン300」に掲載されている遺伝子名が青色でハイライトされる。

「拡張機能を管理」ページ内の「キーボードショートカット」から、拡張機能の起動に好きなショートカットキーを割り当てることができる。そうすれば、ショートカットキーの操作だけでハイライトができる。
ちなみに私はこの拡張機能に「option+F」を割り当てて使っている。

:::note warn
この拡張機能に用いた遺伝子名のリストは、**2024年12月20日時点**でのgene2pubmedデータを用いています（https://ftp.ncbi.nlm.nih.gov/gene/DATA/ ）。
「論文に出る遺伝子　デルジーン300」では**2023年12月31日時点**でのデータをもとに作成されているため、本と拡張機能に若干の差があります。**そのため、偽陽性・偽陰性がありうることをご承知おきください。**
より正確にするには、「keywords.csv」を書き換えてください（というか誰かやってくれると嬉しいです）。
:::

## 謝辞
この度は、素晴らしい本を執筆していただき、誠にありがとうございます。論文を読むときや、解析で知らない遺伝子が出てきたときのお供として、大変重宝しております。読み物としても完成度が高く、ついパラパラと読んで時間が溶けてしまいます。
編者の坊農先生をはじめ、著者の皆様、羊土社様にこの場を借りて感謝申し上げます。
SSRに関する自分なりの理解

普段は主にWebAPIサーバーの開発を行なっているため、フロントエンド開発について、SPA(CSR)で知識が止まっていました…。最近近くでRemixを使うプロジェクトも立ち上がってきたので、ベース知識として必要なSSR、SGについて調べたときのメモです。

# SSRが出てきた背景

いわゆるSPA(Single Page Application)では、レンダリングはすべてクライアントサイド(CSR)で行われます。サーバーにアクセスした時にブラウザが受け取るHTMLはほぼ空っぽで、ブラウザ内のJavaScriptの処理によって画面がレンダリングされて、初めて意味のあるページになります。

この方式は、ブラウザで初期画面の表示が完了するまでに時間がかかる、検索エンジンにページのほんの一部の情報しか伝わらず、SEO（検索エンジン最適化）ができない、といった問題がありました。

クライアントサイドのレンダリングはReactに代表されるJavaScriptで実装されたライブラリによって行われます。一方、サーバーサイドにもNode.jsというJavaScriptの実行環境があります。だったら、Reactによるレンダリング処理をサーバー側でやらせても良いのではないか。このアイデアを実装したのがSSRという認識です。

当然、ユーザとのインタラクションで画面の表示要素が変わるような動的な部品のレンダリングはクライアントで行う必要があります。しかし、それ以外のもの、つまり１回画面が表示されたあとは変更されないような部品のレンダリングはサーバーサイドで行っても問題ありません。また、動的な部品であっても初期値でのレンダリングは行っておいても良さそうです。そうすれば、ブラウザには、動的な部品以外は出来上がった状態の画面がダウンロードされてくる形となります。その分だけ、クライアントサイドレンダリングの時間は短縮されますし、検索エンジンに渡せる情報も増えます。

# Next.jsにおけるSSR

Next.jsにおけるSSRの処理を下記のUdemyのコンテンツで学びました。いろいろなサイトの説明を読みましたがこのUdemyの説明はSSRの仕組みにフォーカスして、シンプルな例でNext.jsの動作が説明されており、とてもわかりやすかったです。

https://www.udemy.com/course/react-complete-guide/?couponCode=24T7MT123024

従来のReacdtのCSRのレンダリングでは、ブラウザのJavaScriptランタイム上でReactが動作します。ReactがJSXファイルを評価して仮想DOMを構成し、その結果をブラウザのリアルDOMに反映することで画面が出来上がっていました。

Next.jsによるSSRの場合、Node.js上でReactが動作します。サーバーサイドにはブラウザのリアルDOMは存在しないため、仮想ROMからHTMLを出力し、その結果をブラウザにHTTPレスポンスとして応答します。

Next.jsではReactコンポーネント単位でCSRとSSRを選択できます。どちらを選んだ場合でも、最初にサーバーサイドでのレンダリング処理が行われて、その結果のHTMLがブラウザに渡ります。CSRを指定されたコンポーネントの場合、このHTMLに対して追加でクライアントサイドでのレンダリング処理が行われます。これはHydrationと呼ばれ、サーバサイドでレンダリングされたHTMLをReactの仮想DOMと同期します。これにより、useStateやuseEffectによる動的な更新が可能になります。

## 従来のSPAによるCSRの処理

1.ブラウザがサーバからHTML、JavaScript、CSSをダウンロードします
2.ブラウザがHTMLからDOMを構成します
3.ブラウザがJavaScriptを実行し、Reactランタイムが仮想DOMを構成します
4.Reactランタイムが仮想DOMをリアルDOMに反映します

![SPA.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/fc1b6493-9298-3778-f46a-c52c7f477c1f.png)


## Next.jsのSSRの処理

1.サーバーがJavaScriptを実行し、Next.jsがReactの仮想DOMを構成します
2.Next.jsがReactの仮想DOMからHTMLを出力します
3.ブラウザがサーバーからHTML、JavaScript、CSSをダウンロードします
4.ブラウザがHTMLからDOMを構成します

## Next.jsのCSRの処理

CSR対象のコンポーネントの場合、SSRの処理の後に追加で下記の処理を実行します。

5.ブラウザがJavaScriptを実行し、Next.jsがHydration処理を行います

Hydration処理により、仮想DOMの構築とリアルDOMとの同期が行われます。
useStateやuseEffectの処理が有効になり、インタラクティブな動作ができるようになります。

![Nextjs.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126781/c2cb6a8f-9916-2bba-71a6-1787e073146d.png)
ショートカットファイルを実行したい

# ショートカットファイルを実行したい

windows11でクイックランチが使えなくなったのでクイックランチもどきを作ろうかとショートカットを実行するアプリを作る事にしました。

## ショートカットファイルからアプリを実行する

ちょっと雑なコードですが、ざっくり解説します。
UseShellExecuteをtrueに設定することにより、オペレーティングシステムのシェルにより、指定されたリンクが適切なアプリケーションで開かれることになります（たとえば、URLであれば、既定のウェブブラウザで開かれます）
通常であれば、ExecuteLink(@"X:\path\to\shortcut.lnk")でリンクを開けます。
```C#
void ExecuteLink(string Link) {
    var P = new Process();
    P.StartInfo.FileName = Link;
    P.StartInfo.UseShellExecute = true;
    P.Start();
}
```

## 何故かファイルが見つからない

上記コードを実行しても、「ファイルが見つからない」というエラーに場合がある。
ショートカットファイルのパスが誤っているわけでも、ショートカット先のアプリが削除されているわけでもない。
その場合に試して欲しいのは、コンパイルオプションです。
私もこんな罠があると思ってなかったです。

## 結論

３２ビットを選ぶ（VisualStudio 2019の場合）のチェックを外す
※新しい（？）バージョンの場合は、「32ビットを優先」の場合があるかもです。

![CompileOptionSS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3322199/0a686b28-2f88-f786-6f63-45e6358cb8bc.png)

フォールバック的な動作を期待していましたがどうやらそういう訳ではないのでしょう。
３２ビットに拘っているわけではないプロジェクトなので、一旦チェックを外してするめる事にしました。
GitHub + scrutinizer-ciでcomposerがエラーを出すときの対応

## scrutinizer-ciとGitHubの連携によるCI

[scrutinizer-ci.com](https://scrutinizer-ci.com/)は、GitHubのpublicなリポジトリだったら無料でCIを回してくれます。これがコードの品質を維持するのによいのですが、とあるプロジェクトでcomposerがうまくいかなくてエラーを出し続ける自体に遭遇しました。

## composerのinstallでエラー

```bash
You are using Composer 1 which is deprecated. You should upgrade to Composer 2, see https://blog.packagist.com/deprecating-composer-1-support/
Loading composer repositories with package information
Warning from https://repo.packagist.org: Support for Composer 1 will be shutdown on August 1st 2025. You should upgrade to Composer 2. See https://blog.packagist.com/shutting-down-packagist-org-support-for-composer-1-x/
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
```

「composerのバージョンが古い」ということなんですが、手元で使っているものは当然1系ではないですし、scrutinizerのなかでcomposerの1系をinstallしようとしている問題でしょ？……と、思うのですが、ハマってしまいました。

ほかにもcomposerの入ったプロジェクトでscrutinizer-ciを使わせてもらっていたことがあるんですが、同様の事態に遭遇したこともありませんでした。

## scrutinizer.yml

こういうときには設定変更かしらと、最小限構成のYAMLを突っ込んだところ、エラーがでなくなりました。

```yaml
checks:
  php: true

build:
  dependencies:
    override: true
  nodes:
    analysis:
      tests:
        override: [php-scrutinizer-run]

filter:
  paths: ["src/*"]
```

## 本当の解決

上記をやってscrutinizer-ciをかけてわかったのですが、composerのinstallをスキップすると、`use Vendor\Class;`みたい依存をチェックできなくなるのですね。結果、`bug`の誤検知がたくさん出てしまいました。

本当の解決としては、「`composer.lock`を`.gitignore`に加えないで、commitする」でした（つまり`composer.lock`もGitHubのリポジトリに加える）。

これで依存関係込みでチェックをしてくれるようになりました。
【ChatGPT】に仮説検証思考してもらうためのPromptです。


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

　今回は、ChatGPTに仮説検証思考してもらうためのPromptです。

:::note info
本記事は、ChatGPT（Plus版）
で行なっております。
画像はありません。あしからず。
:::
　ChatGPT等の動作状況を知らせる
　　OpenAIのステータスページ。
　　　[OpenAIステータス](https://status.openai.com/)
***
　SoraのPlus/Teamユーザーへの
　　クリスマスプレゼント🎁は
　　　現在も有効ですよ😸

　どんどん動画生成しましょうね。
***
　さっそく、【本題】です。

　今回は、
　　生成AIに
　　　仮説検証思考してもらうための
　　　　Promptです。

　すぐるさんのポストを
　　参考にしました。
　　　[すぐるさんポスト](https://x.com/SuguruKun_ai/status/1873329862603321436?t=IV49F7gYmqosmRPyzRhZtQ&s=19)

　仮説検証思考とはなんなのか？
　　ChatGPTさんに尋ねてみました。
***
***ChatGPT***
**仮説検証思考**とは、物事を効果的に解決したり、新しいアイデアを検討したりするためのアプローチで、以下のプロセスに基づいています：

1. **仮説の設定**  
   問題や目標に基づいて、解決策や原因、結果に関する仮説（仮の答えや予測）を立てます。この仮説は具体的かつ検証可能である必要があります。

   例：売上が伸びない原因は「商品の認知度が低い」からではないか。

2. **仮説の検証計画の立案**  
   仮説を検証するための方法やデータ収集の計画を立てます。この際、具体的な指標やデータソースを明確にします。

   例：アンケート調査を実施し、商品の認知度を測定する。

3. **データ収集と分析**  
   実際にデータを収集し、分析を行います。この段階では、仮説が正しいかどうかを判断する客観的な証拠を探します。

   例：調査結果を集計し、顧客の認知度が低いことを確認。

4. **結論の導出と行動の決定**  
   仮説が正しい場合は、それに基づいて具体的な行動を計画・実行します。仮説が誤っていた場合は、原因を再考し、新たな仮説を立てます。

   例：認知度向上のために広告キャンペーンを展開する。

5. **フィードバックと改善**  
   行動の結果を再評価し、改善を続けることで、より効果的な解決策を見つけていきます。


### 特徴とメリット
- 問題解決を論理的かつ効率的に進めることができる。
- 不確実性を減らし、データに基づいた意思決定を可能にする。
- 試行錯誤を体系的に進めることで、リスクを最小限に抑える。

### 使用場面
- ビジネス（マーケティング戦略の立案、新製品の開発など）
- 学術研究
- 個人的な目標達成や問題解決

仮説検証思考は特に、データや事実に基づいて物事を進める必要がある分野で重要なスキルとなります。
***

　簡単にいうと、
　　仮説を立てて、
　　　それをデータや実験で検証し、
　　　　その結果に基づいて
　　　　　行動や改善を進める方法
　　　　　　ということですね。

　それはともかく、
　　Promptをどうぞ。

　このPromptは
　　一般的な問いかけ文言のあとに
　　　記述してください。

　一度、一般的な問いかけ文言を
　　出してからの方が、いいかも
　　　しれませんね。
　　　　差がわかりやすいです。
```Text:仮説検証思考Prompt
仮説検証思考で考えて下さい。
```

　例えば、
　　「小説家として必要な能力を考えてください。」
　　　とかのあとに追記します。

　追記しないと
　　ふつうの回答になります。

　追記すると
　　仮説を立てて、
　　　仮説の理由、検証、結果を
　　　　章立てて、出力してくれます。

　アイディアよりも
　　基本的なことを
　　　教えてもらえたように
　　　　感じました。

　もちろん、
　　出力を得たあと、
　　　ChatGPTとやり取りして、
　　　　欲しい回答を得ることも
　　　　　できます。

　　むしろ、
　　　やり取りのための
　　　　ネタを提供してもらった、と
　　　　　考えれば、いいのかも。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
ゼロから始めるAIシステム開発 #09 「Bedrockの機能・AWSサービスとの連携」

## Bedrockの機能
**Amazon Bedrock 生成AIアプリ開発入門 ［AWS深掘りガイド］**
https://amzn.asia/d/co7MB5S
入門書6章はBedrockの機能について、7章はAWSサービスとの連携について書かれているのでそれらをまとめてみる。（どちらもハンズオンはなし。）
### ファインチューニング
**カスタムモデル**機能の一つ。Bedrockで提供されている生成AIモデルは自前のデータを使ってカスタマイズできる。RAGと比較して大量のデータが必要になるので、まずはやりたいことがRAGで可能かどうかを検討する必要がある。**ファインチューニング**は特定のタスクの精度向上のために**ラベル付きデータ**（正解となる情報が付与されたデータ）を用いて微調整すること。トレーニング用のデータはJSONL形式でS3バケットに配置し微調整ジョブを実行することでファインチューニングを行う。必要なデータの件数は数百件以上が目安。
### 継続的な事前トレーニング
モデルに特定分野の知識を与える目的で利用する。ファインチューニングとは違い**ラベルのないデータ**を用いて継続的な事前トレーニングジョブを実行する。こちらもJSONL形式でデータを用意し、ファインチューニングよりはるかに**大量のデータが必要**。10億トークン以上が目安。
### カスタムモデルインポート
Bedrock以外の環境でカスタマイズしたモデルをAPI経由でサーバーレスに利用できる機能。現在はプレビューとして提供されている。
### ウォーターマーク検出
**セーフガード**の一つでAIによって生成された画像を識別するための機能。Amazon提供のTitanでは透かしが追加されるため、透かし検出機能を利用することでAI生成画像であることが確認できる。現在はプレビューとして提供。
### ガードレール
望ましくないコンテンツの入出力を回避する機能。以下4つのポリシーを用いて安全装置を設定できる。
- コンテンツフィルター
決められたカテゴリ（性的・暴力など）ごとに閾値を設定し、フィルタリングできる
- 拒否されたトピック
望ましくないトピックを自然言語で指定し入出力しないようにできる
- 単語フィルター
ブロックしたい単語セットを定義できる
- 機密情報フィルター
個人情報を識別してブロックやマスクができる
### モデル評価
自身の用途に最適なモデルを選択するために定量評価する機能。以下の**モデル評価ジョブ**を作成して評価レポートを作成する。
- 自動評価
AWS側が用意したデータor自前のデータで定量評価する
- 人間ベース評価
利用者が自分たちのチームメンバーで評価する
- AWSマネージド評価
AWSのエキスパートチームに評価を依頼する

データセットを自前で用意する場合はS3バケットにJSONL形式で配置する。モデル評価の指標については毒性（不適切な言葉が含まれていないか）・精度（正確にタスクを実行できるか）・頑健性（テキストの微差に惑わされず同じ意味の単語として理解できるか）などがある。
### バッチ推論
推論処理を非同期で大量に実行できる機能。S3バケットに保存したJSONL形式のデータを入力し、APIからリクエスト実行できる。最新ではなく専用バージョンのPython等をインストールする必要がある。現状ではプレビューとして提供。
### Bedrock Studio
組織内の開発者向けにWebベースの試作開発環境を提供するサービス。ワークスペースという開発環境を作成することで組織内の開発者に権限を付与できる。これにアクセスすると専用のWebコンソール内でプロジェクトを作成してGUIからローコードでアプリを作成できる。権限を付与されたユーザーしか利用できないので組織全体のガバナンスを保つことができる。現在はプレビューとして提供。
## AWSサービスとの連携
AWSにはBedrockと連携することでより便利に生成AIを活用できる機能がある。以下にまとめる。
### Amazon CloudWatch
AWSのリソースやアプリケーションの監視を行うためのサービス。
- CloudWatch Metrics
Bedrockのメトリクス（指標）情報を自動的に収集する。API操作のリクエスト数やモデルの実行時間、スロットリング（超過）回数などのデータがある。スロットリング等が多発しないようにアラートを設定する等に利用できる。
- CloudWatch Logs
InvokeModel API等のログを出力できる。デフォルトではオフになっているので利用には設定が必要。大量のデータの場合などはオプションでS3バケットに出力することも可能。
### Amazon CloudTrail
AWSの呼び出し履歴を記録するサービス。履歴には**管理イベント**と**データイベント**の2種があり、APIごとに記録されるイベントが異なる。管理イベントはリソースの操作に対して行われるイベントであり、データイベントはリソースの中に対するイベントである。
### Amazon PrivateLink
VPCの内部から外部にあるサービスにプライベート接続するサービス。
### AWS CloudFromation
https://qiita.com/shominai2024/items/151732c18ef55987f894

以前まとめたので割愛。
### その他のAWSサービス
- Amazon Aurora
BedrockやSageMaker等の機械学習系サービスとの連携に対応。SQLを発行できる。
- Amazon CodeCatalyst
アプリ開発を複数人で行う際に使用するコラボレーションサービス。
- Amazon Lex
アレクサのような音声を使った会話形式インターフェースを持ったアプリを構築するサービス。
- Amazon Transcribe
音声を文字に変換するサービス。
- Amazon Connect
会話の感情やトレンドをリアルタイム分析する機能、会話を要約する機能がある。
## おわりに
次回は8章、**AWS Step Functions**を使ってローコードで生成AIアプリを開発する予定。
年の瀬ですね。総括としてはとりあえず、4ヵ月ほどやって入門書1冊終わらないとは…。エンジニア素養がなくPython知識がないのも原因としてあるけど、入門書のカタカナひとつひとつにつまづきがちなのも地味に遅滞する要因だった。（メトリクスやらエンドポイントやらを「指標」「端末」と表記してほしい。）まあある程度慣れてきたので来年はもう少しスピードアップしたい。では来年もよろしくお願いします。よいお年を。
AtCoder練習3～bit全探索～

## bit全探索

　bit全探索について、コレまでに利用したことがあるが、pythonでの実装の際にプログラムをどのように書いたら良いのかで躓いてしまったので備忘録として書いておく。

 ### 基本的なpythonのコード
 #### まず、`5 >> 2 & 1`を理解しよう！

　まず、基本的な演算から押さえていきます。まずは、`5 >> 2`が何をしているのか。
 1．`5`という数字を、二進数`101`に変換する。
 2．`>> 2`は、2進数に変換された数字を、2bit分右にずらすことを意味しているので、`101→1.01`。小数点以下は切り捨てるので、`1`になる。
 3．最後に、2進数の`1`を10進数にもどして、`1`を出力。コレまでをまとめると、`5 >> 2 → 1`の変換を行っている。

　次に、ビット論理積（AND）演算子`＆`について。
- こちらは、2つの数を2進数にしたときの各桁の論理積を出力します。
- 例）
　　 **11001010 (202) & 10111001 (185)　→  10001000 (136)**


　最後に、`5 >> 2 & 1`について。
 - コレは、`5`という数字を2進数に変換したときの、下`2+1`桁目のbitが1かどうかを判定してくれるものです。

ということで、bit全探索を行っていきたいと思います。

### bit全探索（n=4）
　n=4のときの探索を行いたいと思います。全部で、2^4通りあります。以下。
 ```python
n = 4
for bit in range(1 << n):
    print(bin(bit)[2:])
# output
# 0
# 1
# 10
# 11
# 100
# 101
# 110
# 111
# 1000
# 1001
# 1010
# 1011
# 1100
# 1101
# 1110
# 1111
 ```
- 例えば、`1011`の場合は`[操作あり, 操作なし, 操作あり, 操作あり]`といったことを後々行いたいわけです。

では、今のような場合はどうしたらいいのでしょうか。
```python

```
[Rails] Active Storage の概要と要件

# Active Storageの概要
`Amazon S3`、`Google Cloud Storage`、`Microsoft Azure Storage`などのクラウドストレージサービスへのファイルのアップロードや、ファイルを`Active Record`オブジェクトにアタッチする機能を提供します。

**特徴**
- `development`と`test`環境向けのローカルディスクベースのサービスを利用できます
- アップロードした画像の変形処理
- `PDF`や動画などの画像以外のアップロードファイルの内容を代表する画像の生成

# サードパーティソフトへの依存
`Active Storage`の機能は、サードパーティソフトウェアに依存しているため、別途インストールが必要

- `libvips`画像解析や画像変形用
- `ffmpeg` 動画プレビュー、ffprobeによる動画/音声解析
- `poppler`または`muPDF`: PDFプレビュー
- `image_processing` 画像分析や画像加工のため

# テーブル構成
`Active Storage`は3つのテーブルを利用します。

| テーブル名                       | 目的                                                                                                                                                          |
|----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `active_storage_blobs` ⠀ ⠀ ⠀ ⠀ ⠀ ⠀⠀⠀⠀⠀⠀ ⠀ ⠀ ⠀ ⠀ ⠀ ⠀ ⠀ ⠀          | アップロードされたファイルに関するデータ（ファイル名、`Content-Type`など）を保存                                                                                       |
| `active_storage_attachments`     | モデルを`blobs`に接続するポリモーフィックなジョインテーブル。<br>※モデルのクラス名が変更された場合、このテーブルでマイグレーションを実行し、`record_type`を新しいクラス名に更新する必要がある。 |
| `active_storage_variant_records` | バリアントトラッキングが有効な場合、生成された各バリアント（アップロードされた画像に対する加工処理）に関するレコードを保存する。|

## テーブルの詳細

### `active_storage_blobs`
- ファイルのメタデータ（例: ファイル名、`Content-Type`、サイズなど）を管理
- 主要カラム:
  - `id`: 一意の識別子
  - `key`: ファイルの一意キー
  - `filename`: 元のファイル名
  - `content_type`: MIMEタイプ
  - `metadata`: ファイルに関する追加情報
  - `byte_size`: ファイルサイズ
  - `checksum`: ファイルのチェックサム

### `active_storage_attachments`
- `Active Record`モデルと`active_storage_blobs`を関連付けるためのポリモーフィックなジョインテーブル
- 主要カラム:
  - `id`: 一意の識別子
  - `name`: アタッチメントの名前（例: `avatar`）
  - `record_type`: 関連付けられるモデルのクラス名
  - `record_id`: 関連付けられるモデルのID
  - `blob_id`: 関連付けられる`active_storage_blob`のID

### `active_storage_variant_records`
- 画像のバリアント（リサイズやトリミング...）に関する情報を保存
- 主要カラム:
  - `id`: 一意の識別子
  - `blob_id`: 関連付けられる`active_storage_blob.id`
  - `variation_digest`: バリアントの変更内容を示すダイジェスト

# セットアップ

Active Storageをセットアップする際に必要なコマンドは以下の通りです。

```bash
$ bin/rails active_storage:install
$ bin/rails db:migrate
```

これにより、上記の3つのテーブルがデータベースに作成され、Active Storageの機能を利用できるようになります。

# まとめ

以上です。
詳細は以下の公式ガイドをご確認ください🙏

https://railsguides.jp/active_storage_overview.html
【AWS】AWS-DVA最短合格！

## 保有資格
・Java-Silver
・LPIC Level2
・AWS-SAA,SOA

## 使用した書籍やサイト
・Web問題集：CloudTech（永久会員）

https://kws-cloud-tech.com/

・書籍：AWS-DVAポケットスタディ

https://www.amazon.co.jp/%E3%83%9D%E3%82%B1%E3%83%83%E3%83%88%E3%82%B9%E3%82%BF%E3%83%87%E3%82%A3-AWS%E8%AA%8D%E5%AE%9A%E3%83%87%E3%83%99%E3%83%AD%E3%83%83%E3%83%91%E3%83%BC%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%EF%BC%BBDVA-C02%E5%AF%BE%E5%BF%9C%EF%BC%BD-%E5%B1%B1%E4%B8%8B%E5%85%89%E6%B4%8B/dp/4798070696/ref=pd_lpo_d_sccl_1/356-0302245-2289874?pd_rd_w=81mxZ&content-id=amzn1.sym.855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_p=855d8f70-df76-4181-80b0-56e48ae3bb9b&pf_rd_r=QT5QJKBD0J36E7C86MHX&pd_rd_wg=RuX34&pd_rd_r=8bf448ec-f0aa-4ec4-a379-a8e4135355da&pd_rd_i=4798070696&psc=1

## 受験までの期間
・約１か月（１日：約３時間の勉強ペース）

## 試験までの流れ
１．CloudTechのAWS資格演習対策講座のDVAを10問単位で、1~100まで解いてみる。

２．100問解いたら、ブックマーク機能を使用し、間違えた問題を再度解く。

３．１と２の作業を全問題一周するまでやってみる。

４．引き続き、CloudTechの演習問題２周目
　（この付近で、10問の回答率が8割超えるようになってくる。）

５．peasonVUEで受験予約

６．書籍のポケットスタディの問題を解きつつ、解説ページでさらに知識の定着化を図る。

７．試験

## 受験してみての感想
　私は、インフラ経験のみでしたので、初期の勉強中は、DVAの問題内容が分からなさ過ぎて、挫けそうになりましたが、一つ一つの用語をかみ砕いて理解することで、勉強を進めていきました(;'∀')
 
　実際の試験では、Cloudtechの資格演習で出題された問題と同じもしくは類似した問題が6割程度出題されていました。
　
　それ以外の問題についても、書籍のポケットスタディを活用し、各用語の根本の理解をしておいたので、落ち着いて回答できました。

是非、受験を考えている方の参考になれば嬉しいです。
2024年の振り返り

# 今年取り組んだこと

- GithubActionsに取り組めた
前から気になってた技術に取り組めてよかった。
単純なCI/CDの実装までできただけでなく、速度改善まで取り組めてい流のがよかったと思う。

- rubyのコーディング規約めっちゃ勉強した
最初は全く知識がないことでも、時間かけて色々資料に目を通せば、ある程度できるようになってくるということを実感した笑
いろいろな書き方を勉強できてよかった。

- reactに取り組めた
フロントのテストコードも久々にかけてよかった。

- Sentryの仕組みを入れた
エラー監視ツールの本格的な導入と運用で、保守を効率化できた気がする。

# 技術以外

- コミュニティ参加してみた
前々から何か参加してみようかと思っていたけど、ようやく参加。
来年はもうちょっと活動に参加する頻度を増やしていきたい

- ちゃんとキャリアの相談とかができた
たまたま自分と近い立場にいる方にキャリアとかの相談ができた。
これから取り組むことが定まってよかった。（エンジニアといっても色々な技術やポジションで働いている人がいて、自分や将来の目標に近い人に相談できないとあんまり意味がないかなって思ってる笑）

- 技術イベント積極的に参加
去年よりも色々なイベントに顔を出してみる機会が増えた。聴講するだけならハードルが低いので、そういうところからはじめていった感じ。
交流会とかは全然参加しなかったけど笑
来年は発信もできたらいいかも。

# 来年の目標

- 通常業務を効率化したい
まだまだ普段の業務で問い合わせ対応やデータ修正にかかる時間が多く感じる。
もう少し時間を短縮して開発に集中する時間を増やしたいイメージ。
なんかいい案が思いうかべばいいな。

- 来年に新しく取り組むことを考える
今年はGithubActionsに取り組めたので。
また何か新しいことを取り組みたいと思うけど、今のところちょうど良さそうなのが見つからないのでそれを見つけるところから笑

- 仕事以外の活動を活発化
フットワークが重い方なので。

* * *

今年は色々充実してた。仕事や技術に割ける時間は限りがあるけど、来年も頑張ろうと思う。
あと、久々に記事を書いてみて全然書き方が思い浮かばなかった笑
来年は人の記事をちゃんと読む癖をつけたい笑
SvelteをVercelでデプロイする

前回作ったTodoアプリをVercelでデプロイしてみます。

https://qiita.com/ucan-lab/items/6922967a529901ef9b0d

## 公式

- https://svelte.dev/docs/kit/adapter-vercel
  - 日本語翻訳: https://kit.svelte.jp/docs/adapter-vercel

## デプロイ設定

```
$ bun install -d @sveltejs/adapter-vercel
```

```diff:svelte.config.js
-import adapter from '@sveltejs/adapter-auto';
+import adapter from '@sveltejs/adapter-vercel';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';

/** @type {import('@sveltejs/kit').Config} */
const config = {
  // Consult https://svelte.dev/docs/kit/integrations
  // for more information about preprocessors
  preprocess: vitePreprocess(),

  kit: {
    // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
    // If your environment is not supported, or you settled on a specific environment, switch out the adapter.
    // See https://svelte.dev/docs/kit/adapters for more information about adapters.
    adapter: adapter()
  }
};

export default config;
```

## ローカルで動作確認

```shell
$ bun run build
$ bun run preview
```

http://localhost:4173

![ScreenShot 2024-12-30 10.30.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/1bc4c296-9a67-4783-f7e0-c98d7e2f0d25.png)

エラーが出てないことを確認しておきます。

## プロジェクトの作成

![ScreenShot 2024-12-30 10.11.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/b3918f3e-4272-e771-7d93-12000d190b8f.png)

Framework Presetでは `SvelteKit (v1)` を選択します。

![ScreenShot 2024-12-30 10.11.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/430d6b7d-b599-231e-8f3a-747839d7af3c.png)

- Root Directory: `./`
- Build Command: `bun run build`
- Output Directory: `static`
- Install Command: `bun install`

今回は Envinronment Variables で指定したいものないのでスキップ

![ScreenShot 2024-12-30 10.14.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/e3c5c63d-7d54-879f-cbac-d9f7c0bbd45a.png)

デプロイします。

![ScreenShot 2024-12-30 10.59.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/d7820269-eeb0-220e-0435-d0cf1495265f.png)

![ScreenShot 2024-12-30 11.00.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/51db604d-c10f-3508-54b9-f7eae1afc709.png)

デプロイ成功しました。

https://svelte-todo-app-hjta.vercel.app

デプロイしたページにアクセスします。

![ScreenShot 2024-12-30 11.03.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/b4b2614f-72d7-57cf-0c2e-ec9486ecafce.png)

問題なくデプロイできたのでokです。
めちゃくちゃ簡単でした✌️
[VRChat] UdonSharpで身長が変更できるボタンを作る

こんにちは。
メモ用にVRChatで実装出来るプレイヤーの身長を変更出来るボタンの作り方を書いておきます。

## もくじ
- [UdonSharpBehaviourの作り方](#UdonSharpBehaviourの作り方)
- [コード](#コード)
- [使い方](#使い方)
- [コード解説](#コード解説)

## UdonSharpBehaviourの作り方
1. Projectタブで右クリック
2. [Create] -> [U# Script]
3. 名前を入れて作成 (今回はAvatarHeightChanger)

## コード
``` c#:AvatarHeightChanger.cs
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;

[RequireComponent(typeof(Collider))]
[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class AvatarHeightChanger : UdonSharpBehaviour
{
    [SerializeField] float height = 1.3f;

    public override void Interact()
    {
        Networking.LocalPlayer.SetAvatarEyeHeightByMeters(height);
    }
}
```

## 使い方
1. Unity上部のタブから [GameObject] -> [3D Object] -> [Cube] でCubeを作成する
2. Box ColliderのIs TriggerをONにしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973756/015ff418-9a47-b96e-de6d-7a84b243b401.png)

3. Add ComponentからAvatarHeightChangerを検索してアタッチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973756/47840817-541a-4835-1e2d-c5c77d14eaa5.png)

4. [Height]を好きなメートルにする (初期値1.3は130cm)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973756/64759c3b-82c4-dc7e-955e-6d12bcc47027.png)

5. VRChat内でインタラクトして確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3973756/a67bb9b5-608c-c0fa-0004-480c5f9072b4.png)


## コード解説
ColliderがついているGameObjectのみに使えるスクリプトって記述 
(BoxColliderやMeshCollider等)
``` C#
[RequireComponent(typeof(Collider))]
```

UdonSharp限定のAttribute。
同期しないことを記述
``` C#
[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
```

[[SerializeField]](https://docs.unity3d.com/ja/2020.2/ScriptReference/SerializeField.html) はUnityのInspectorで編集出来るようにするもの。
対応されているtypeのみ編集可能になります。他にも保存するときとかに使います。
``` C#
[SerializeField] 
```

UdonSharp限定の関数です。VRChat内でオブジェクトをインタラクトした際に呼ばれる関数です。
``` C#
public override void Interact()
```

Networking.LocalPlayer内の、SetAvatarEyeHeightByMetersという関数を呼んで身長を変更してます。
Networking.LocalPlayerは自分自身のVRCPlayerApiクラスのインスタンスを返します
``` C#
Networking.LocalPlayer.SetAvatarEyeHeightByMeters(height);
```
データレイク、データベース、データウェアハウス、データマートの違いをわかりやすく解説！

データがあふれる現代、企業が成功するためにはそのデータを適切に保存し活用することが求められます。しかし、「データレイク」「データベース」「データウェアハウス」「データマート」という言葉を耳にすると、何が違うのか混乱してしまうこともあるでしょう。

今回は、これらの用語について具体例を交えながら、中学生でもわかるようにわかりやすく解説します！

---

## データレイク：なんでもためる大きな湖

### 特徴
データレイクは、大量のデータを**整理せずそのまま保存**する場所です。名前の通り、「湖」のようにいろんな種類のデータが一箇所に集められます。写真や動画、テキスト、センサーの記録など、形式を問わず保存できるのが特徴です。

### 具体例
例えば、アパレル会社が「購入履歴」「SNSの口コミ」「商品の画像や動画」などを将来活用するためにとりあえず全部保存しておく場所がデータレイクです。

### 使いどころ
- データをまだ整理する段階ではないが、とりあえず保存しておきたいとき。
- AIや機械学習のトレーニング用に、大量のデータを保持したいとき。

---

## データベース：毎日の業務用の整理された本棚

### 特徴
データベースは、日々の業務で使うデータを**きっちり整理して保存**する場所です。特定の目的やアプリケーションで利用するため、データは検索や更新が簡単にできるように整えられています。

### 具体例
レストランチェーンでは、店舗ごとの売上や在庫を記録するためにデータベースを使用します。「今日の売上」や「在庫の残り」など、すぐに確認できます。

### 使いどころ
- 日々の業務で必要なデータを管理するとき。
- 顧客情報、売上情報、商品情報などを正確に記録したいとき。

---

## データウェアハウス：経営分析用の大型倉庫

### 特徴
データウェアハウスは、経営戦略や意思決定のために使われる**分析用のデータを保存する倉庫**です。保存前にデータをきちんと整理しておくため、大量のデータを効率的に分析できます。

### 具体例
eコマース企業が全国の顧客の購入履歴を集めて「月ごとの売上推移」や「地域別の人気商品」を分析するために利用するのがデータウェアハウスです。

### 使いどころ
- 大量のデータを一元管理して効率的に分析したいとき。
- 過去のデータを活用してビジネス戦略を立てたいとき。

---

## データマート：特定部門用の小さな専門店

### 特徴
データマートは、データウェアハウスの中から**特定の部門やチーム用に必要なデータだけを切り出したもの**です。特定の目的に絞られているため、使いやすくなっています。

### 具体例
マーケティング部門が「SNS広告の効果」や「テレビCMの効果」を比較するために、広告関連のデータだけを抽出して利用するのがデータマートです。

### 使いどころ
- 部門やチームが特定のデータを分析しやすくするため。
- 必要なデータを効率的に取り出して活用したいとき。

---

## ビジネスでの違いを表にまとめる

| 用語              | イメージ                         | データの整理 | 主な用途                      | 具体例 |
|-------------------|---------------------------------|-------------|-----------------------------|-----------------------------|
| **データレイク**   | なんでもためる湖                | 必要なし    | あらゆるデータを保存する         | SNS口コミ、購入履歴、カメラ映像をまとめて保存 |
| **データベース**   | 整理された本棚                  | 必須        | 日々の業務で使う情報管理         | 店舗ごとの売上管理、商品在庫管理 |
| **データウェアハウス** | 分析用の大型倉庫                | 必須        | 大量のデータを分析する         | 全国の売上データから「人気商品」を分析 |
| **データマート**   | 部門専用の小さな専門店           | 必須        | 特定の部門のデータ分析用         | マーケティング部門が広告効果を分析 |

---

## まとめ

1. **データレイク**は、あらゆるデータを整理せずに保存するスタート地点。
2. **データベース**は、毎日の業務で必要なデータを管理するための場所。
3. **データウェアハウス**は、経営分析や戦略立案のためにデータを一元管理する大型倉庫。
4. **データマート**は、特定の部門が使いやすいようにデータを小分けした専門店。

それぞれの仕組みを正しく理解し、ビジネスで効果的に活用することが成功への第一歩です。ぜひ、自分のビジネスに最適な方法を見つけてみてください！
オフラインならではの駆け出しエンジニア教育

最小限の操作で目的を達成する。
PC操作を高速にできるようにする。

- vim使ってながらカーソルキー使ってたりしないよね
    - 基本jk wb で移動しなはれ
- Google検索するのにGoogleのサイトに移動してたりしないよね
    - ctl+t で新規タブを開いたその手で検索しなはれ
- 日本語でググってないよね
    - 「ルビー」とかってワードでググってないよね
- タスクスイッチをマウス使ってないよね
    - WindowsもMacもタスクスイッチのキーボードショートカットで全面のタスクは切り替えれるよ
- フルパス入力してないよね
    - タブで補完してね。全部入力すると間違っちゃうから
- レファレンスググろうとしてアフィリエイト記事読んでないよね
    - アフィリエイト記事の情報の少なさは人生を無駄にしている
- ググったあとに同じタブで検索結果開いてないよね
    - 新規タブで重要そうな検索結果を上位３つを開いてください
- 長いページをじっくり上から読んでないよね
    - ページ内検索して検索ワード周辺をまずはみましょうね
- そもそもページの長さ把握してね
    - スクロールバーの高さをみましょうね

ホワイトカラーの成果物はドキュメントベースなんだけど、鍛えるべきは手と目。手と目の動きを早い段階でフォームを固める必要がある。
ゲームボーイ RGBDS 開発メモ 第3回 チュートリアルを読んでいく(2)

### header

`ds $150 - @, 0` を0でうめたのは、ゲームボーイのROMでは必ずヘッダーが必要で、rgbfix でそのヘッダー情報を埋めている。必ず作法として必要なんですね。

そして最後

```
Done:
	jp Done
```
で永久ループしています。

### Operations & flags

なんとゲームボーイのCPUは掛け算ありません（笑）高級言語しかさわったことのない自分にとっては驚きです。

inc, dec が インクリメント、デクリメント add と sub が足して代入、引いて代入ですね。

```
add a, 5
```
は a += 5; です。

```
cp 144
jp c, WaitVBlank
```

cp はa - 144 の結果がフラグに反映される（値は変化しない）。ここでは a が144より小さければCのフラグ(オーバーフロー、アンダーフロー）がたち WaitVBlankにもどる。ということで、144になるまで待つという処理になる。

つまり if (c < 144) goto WaitVBlank; ってことですね！
等しいことを検証したい場合は z,nz フラグを使うと。

### Jumps

条件付きジャンプです。今実行中のアドレスがPC(プログラムカウンタ)に入っており、これが変更される。

call（サブルーチン)があるらしい。あとで調べる。

```
    ; Copy the tile data
    ld de, Tiles
    ld hl, $9000
    ld bc, TilesEnd - Tiles
CopyTiles:
    ld a, [de]
    ld [hli], a
    inc de
    dec bc
    ld a, b
    or a, c
    jp nz, CopyTiles
```
de に Tilesのアドレスを格納、hlには定数$9000を格納して、bcには
TilesEnd - Tiles （これはアセンブラが計算してくれる？）はデータの長さになり、これをbcに格納する。

CopyTilesは deにあるデータをaに格納、このaをhlのアドレスに格納たあとhlをインクリメント([hli]でインクリメントできる）de （コピー中のアドレス）をインクリメント、bc （コピーすべき残りの長さ）をデクリメント、a に bcの上位ビットをいれて c と or をとることによってどちらかが0でないと、nzがたつので CopyTiles に戻って繰り返す。

if (bc != 0) goto CopyTiles; ですね。orをつかってbcが0であるか判定しています。

ゲームボーイの画面は8x8のタイルを定義して、それをタイルマップで配置します。こちらはタイルのデータをVRAM($9000から)にコピーしています。

```
CopyTilemap:
	ld a, [de]
	ld [hli], a
	inc de
	dec bc
	ld a, b
	or a, c
	jp nz, CopyTilemap
 ```

 こちらはタイルマップの場合($9800からはじまる）で同様ですね。

 ループが難しい！慣れるとイディオムのように使えるのかもしれません。

### 次回

いよいよデバッガつかってトレースです。たのしみ！
18資格を6ヶ月で突破！私の学習スケジュール公開

## はじめに

2024年6月から12月の半年間で、18の資格試験に合格しました。本記事では、どのような資格を取得したのか、それぞれの学習方法やスケジュール管理、試験対策のポイントについてお話しします。

## 合格した資格一覧

以下は、この半年間で取得した資格の一覧です。

| **受験日**    | **合格日**    | **資格名**                                          |
| ---------- | ---------- | ------------------------------------------------ |
| 2024/06/10 | 2024/06/10 | Python 3 エンジニア認定基礎試験                             |
| 2024/06/16 | 2024/06/16 | PythonZen & PEP 8 検定試験                           |
| 2024/06/17 | 2024/06/17 | Python 3 エンジニア認定データ分析試験                          |
| 2024/06/24 | 2024/06/24 | Python 3 エンジニア認定実践試験                             |
| 2024/07/01 | 2024/07/01 | ビジネス数学検定1級                                       |
| 2024/07/06 | 2024/07/06 | G検定                                              |
| 2024/07/16 | 2024/07/16 | データサイエンス数学ストラテジスト中級                              |
| 2024/07/16 | 2024/07/16 | データサイエンス数学ストラテジスト上級                              |
| 2024/07/15 | 2024/07/15 | 統計検定 4級（202006版）                                 |
| 2024/08/15 | 2024/08/15 | ITパスポート                                          |
| 2024/08/05 | 2024/09/13 | 情報セキュリティマネジメント試験                                 |
| 2024/09/25 | 2024/09/25 | CBASシチズン・データサイエンティスト級                            |
| 2024/10/05 | 2024/10/05 | 数学検定準２級                                          |
| 2024/10/09 | 2024/10/09 | AWS Certified Solutions Architect - Professional |
| 2024/09/26 | 2024/10/15 | 基本情報技術者試験                                        |
| 2024/10/20 | 2024/10/20 | ビジネス統計スペシャリスト エクセル分析ベーシック                        |
| 2024/11/15 | 2024/11/15 | 生成AIパスポート                                        |
| 2024/10/13 | 2024/12/26 | 応用情報技術者試験                                        |

## 学習スケジュールと戦略

### **1. 目的の明確化**

資格取得を通じて知識を体系的に身につけたいという目標を設定しました。特に、Pythonやデータ分析、IT関連資格を重点的に選びました。

### **2. 効率的なスケジュール管理**

試験日を基準に、逆算して学習計画を立てました。勉強期間に関しては、応用情報は2週間で、それ以外は1週間で計画しました。逆に1週間で合格しないものは、受験しないという割り切りをしました。

### **3. 使った教材とツール**

- **Python資格**: 公式の学習教材やオンライン模試を活用。
- **数学系資格**: 書籍。
- **AI系資格**: 公式テキスト。
- **AWS資格**: オンライン問題集。
- **ITパスポートや情報処理技術者試験**: 過去問道場やオンライン講座（UdemyやYouTube）を活用。

### **4. 学習時間の確保**

平日は仕事があるため、1日6時間程度の学習を確保し、土日は集中的に12時間学習しました。

## 各試験の振り返り

### Python 3 エンジニア認定試験

Python基礎からデータ分析、実践まで、4種類の資格を取得しました。学習範囲が重なるため、一連の流れで短期間で合格することができました。

### G検定

AIの知識を学びたいという動機で受験。公式テキストを重点的に学習しました。

### 基本情報技術者試験 & 応用情報技術者試験

ITの基礎知識を再確認する目的で受験。

### AWS Certified Solutions Architect - Professional

AWSの実務経験があるため、実践的な知識を活かしながら学習。また、問題が長文であるため、問題文から解答をどうやって導くかを意識して学習しました。

## 結果として得られたもの

- 資格取得を通じて、幅広い知識とスキルを習得。
- 短期間で集中して学ぶ力が向上。
- 業務における問題解決能力の向上。

## 最後に

半年で18資格に合格するという挑戦は、計画的な学習とモチベーションの維持が鍵でした。同じように資格取得を目指している方の参考になれば幸いです。
【Raylib】rlights.hを追加する

Raylibのshadersのサンプルコードを見ていると、rlights.hというのがあると思います。これは、普通にraylibをインストールしているだけだと、実行時にrlights.hが見つからないというエラーが起こります。なので、忘れないように、追加方法をここに書こうと思います。(Windows向けです)

まず。https://github.com/raysan5/raylib/blob/master/examples/shaders/rlights.h にアクセスしてください。そしたら、右上の...をクリックし、Downloadをクリック。rlights.hがダウンロードされるので、エクスプローラーのダウンロードフォルダーに移動し、rlights.hをワンクリックし、Ctrl+Xで切り取ってください。そしたら C:\raylib\raylib\src に移動して。Ctrl+Vを押すだけです。

これで完了です。
laravel delete()だとエラーにならずtruncate()だとエラーになる処理

## 概要

laravelのとあるDBのデータ削除処理にて`delete()`だとエラーは出ず、`truncate()`だとエラーが出るので原因を調査してみた。

## 前提

DBはMySQL

エラーが出る状態のコードを下記に記載する。
トランケート対象テーブル名はhogesでモデルクラス名はHogeである。
hogesテーブルに外部キー制約は無い。
トランケートを選んだ理由は「パフォーマンス良い」「中身が消せればいい」程度。

```php
try {
    DB::beginTransaction();

    // その他の処理

    Hoge::truncate();

    DB::commit();
} catch (\Exception $e) {
    DB::rollBack();
    throw $e;
}
```

上記の処理を実行すると下記のエラーがでる。

>There is no active transaction （意訳：「アクティブなトランザクションが無い」）

## 解消方法

下記の様に`truncate()`ではなく`delete()`を利用する。

```php
try {
    DB::beginTransaction();

    // その他の処理

    Hoge::query()->delete;

    DB::commit();
} catch (\Exception $e) {
    DB::rollBack();
    throw $e;
}
```

もしくはトランザクションを使わず`truncate()`を利用する。

## エラーの原因

下記の記事でまとめたように`truncate()`はSQLの`TRUNCATE TABLE`句を実行している。

https://qiita.com/miriwo/items/3cc770682e00faf46b25

そしてMySQLの場合の`TRUNCATE TABLE`句は内部で暗黙的にトランザクションとコミットを行っておりロールバック非対応だ。

https://qiita.com/miriwo/items/86874952db7e641875f5

あくまで予想であるが今回自身が意図定期にtry catchの中で`DB::beginTransaction();`を宣言しトランザクションを開いたが、`truncate()`が実行した`TRUNCATE TABLE`句によってこのトランザクションが閉じられ、`DB::commit();`で閉じるトランザクションが見当たらなかったのではないか。

実際にlaravelのエラー画面でも`DB::commit();`でエラーが出ていることがわかる。

![CleanShot 2024-12-27 at 20.21.44@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b65fbfa2-9517-88e2-0e6d-8f416ea92813.png)

## 参考文献

https://qiita.com/miriwo/items/86874952db7e641875f5

https://qiita.com/miriwo/items/3cc770682e00faf46b25

https://laravel.com/docs/11.x/queries#delete-statements
便利なオンランHTMLタグ入れ子チェックシート

## 概要

HTMLの親と子タグの制限はあるが、それを全て覚えるのは辛そうで、忘れることがよくある。
フロントエンドエンジニアはマークアップする時に、そのタグを子タグで良いか疑問があった時に、オンラインチェックシートがあると非常に便利である。

## 詳細

オンラインチェックシートURL：

https://yoshikawaweb.com/element/
javascriptのキャメールケース・スネークケース変換ライブラリ

## 概要
BE側のAPIレスポンスはsnake_caseだが、FE側のJavaScript/TypeScriptはcamcelCaseが相応しい。それのあなを埋めるために通信部で自動的に変換したほうがらくである。

## キャメールケース変換Library：camelcase-keys

https://github.com/sindresorhus/camelcase-keys

選ぶ理由：軽量、サイズが小さい

```
Unpacked Size
12.9 kB
```

```ts
camelcaseKeys({'foo_bar': true});
//=> {fooBar: true}
```

## スネークケースLibrary：decamelize-keys

https://github.com/sindresorhus/decamelize-keys

選ぶ理由：軽量、サイズが小さい、camelcase-keysと同じ人の作品

```
Unpacked Size
8.5 kB
```

```ts
// Convert an array of objects
decamelizeKeys([{fooBar: true}, {barFoo: false}]);
//=> [{foo_bar: true}, {bar_foo: false}]
```
女性フリーランスエンジニアの性被害の防止（SNSよりはエージェントを使う）

# 性被害問題は芸能界などの特殊な世界だけの話ではない

2023-2024年、有名な芸人やアイドルが性加害をしたニュースがテレビやネットで取り上げられていました。普通によくない話だとみんな考えていると思います。一方で、自分は、芸能界とか特別な状況でしか起こらないのかなと思っていました。

先日、IT業界の人が集うイベントで女性のフリーランスエンジニアの人と話す機会がありました。そのとき、前述のような性被害、または、未遂みたいなことが多いですよと教えてもらいました。
思い返すと、別の機会に話した女性フリーランスエンジニアの人も同じような話をしていました。

この手の話は女性フリーランスの人にとっては結構ある話らしく、ネットでもこうした投稿や記事がありました。

https://x.com/makiemaki50/status/1382517841086205959

IT業界は比較的おとなし目の人が多いから、こうした被害とかもないのかなと勝手に思っていました。でも、何人かの女性フリーランスエンジニアの人が被害にあったり、未遂だったがそれらしい誘いを受けたと直接聞くとどんな業界でもあるんだなと感じました。

# フリーランスという不安定な地位

2018年（平成30年）の「副業元年」以来、フリーランスの人口は増えています。

https://www.freee.co.jp/kb/kb-fukugyou/sidejob_since_when/#:~:text=2018%E5%B9%B4%EF%BC%88%E5%B9%B3%E6%88%9030%E5%B9%B4,%E3%81%93%E3%81%A8%E3%81%8C%E8%83%8C%E6%99%AF%E3%81%AB%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82

https://freelancechance.tech/freelance-jinko/

フリーランスのITエンジニアも比例して増えています。比較的、高単価になるという触れ込みもあり、フリーランスエンジニアになる人もいると思います。

https://cellpromote.biz/column/free_lance_engineer_unit_price/

ただ、案件終了になることは不可避ではなく、未来永劫、高単価が保証されているわけではないです。
フリーランスは、あくまでも期限ごとの契約によって案件がもらえますので、契約をしてもらえなければそこで仕事は終わりになります。

つまり、正社員よりもお金をもらうのは不安定だと言えます。
自分は20年弱フリーランスに近い働き方をしていますが、突然、ごそっと人が現場からいなくなるのもみたことがあります。
あくまでも、期限付きの契約であり、顧客企業の財政状況が悪くなったら切られてしまうところに、フリーランスエンジニアの不安定さがあります。

# SNSを通じた案件獲得の危なさ

前述のとおり、フリーランスエンジニアの中には、案件の切れ目がある人もいます。
こうしたときに、XやLINEグループなどのSNSを通じて、案件を獲得しているフリーランスの人もいるようです。

SNSをつかった案件獲得が必ずしもよくないとは言えませんが、個人的な経験からすると、トラブルが多い印象です。もちろん、よいご縁ができた話もきいたことがありますが、問題があるのもまた事実です。

女性フリーランスエンジニアの人たちも、営業をしないといけないと考えて、SNSで声をかけた企業の人に面会するそうですが、そうしたときにホテルのラウンジとか、明らかに怪しい場所を指定したりする人がいるそうです。

SNSを通じた案件獲得は、性被害だけでなくその他のトラブルもあるので、個人的にはエージェント経由、または、自分が信頼できる人からのリファラルの方が良いと思います。

https://freenance.net/media/legal/1625/

# すでに取引があるところからのハラスメント

SNSではなく、企業と取引をしていても発注者側が足元をみて、不当な要求をしてくるという話もあります。これについては、性被害に限らずフリーランス新法もありますので、こうした法令をちゃんと遵守している企業と付き合いをするのがよいと思います。

https://biz.moneyforward.com/contract/basic/14215/


# フリーランス新法を遵守したフリーランスエージェントを利用するのがよいのでは？

女性のフリーランスエンジニアは男性エンジニアでは遭遇しにくいトラブルに直面することがあります。
フリーランスという不安定な地位を利用した不当な要求をする人たちが社会には存在しています。

こうした被害を回避するには、SNSでの案件獲得は避けた方がよいと感じます。今は、フリーランスエージェントがありますので、エージェントを利用するのがよいと思います。

フリーランス新法により、フリーランスエージェントに対してもフリーランスの権利を守る責務があるといわれています。逆に言うと、こうした対策をしているエージェントを利用するのがよいと考えます。

> 2024年11月施行のフリーランス新法は、エージェントに対してフリーランスの権利をきちんと守ることを求めています。

> フリーランスエージェントには、フリーランスとクライアント企業との間に立つ仲介企業としての責任があります。クライアントがフリーランスに対して不当な要求や差別的な扱いを行った場合、結果として発生するトラブルがエージェントに波及することも少なくありません。こうした事態に対処するために、エージェントはハラスメント防止策の強化を図る必要がありますが、社内での対応だけでは限界があるのが現実です。そこで、外部相談窓口が重要な役割を果たします。

https://support-mental-health.co.jp/blogs/free_lance07/

フリーランスの場合、一人で問題を抱えがちですが、こうした相談を受け付ける窓口もあるようです。

https://note.com/webko/n/n469f2402d2c0


# さいごに

フリーランスエンジニアの足元をみた卑劣な行為をすること自体が理解しかねますが、実際に、世の中にはそうしたことをする輩も存在するようです。

ただ、それを回避する方法もあると思います。

社会的な風潮としては、いろいろなハラスメントを抑止しようとしていてよいと思います。一方で、フリーランスの人は自由がゆえに、情報は自ら取得する必要があり、知らないとトラブルに巻き込まれる可能性が高いです。

フリーランスだからなんでも頑張らないといけないと思い、いろいろな営業をするのは理解できます。ただ、今は、トラブルを回避しながら案件獲得をすることもできるので、フリーランスになる人はこうしたポイントを押さえて案件獲得をしていくのがよいと思います。

別の記事でも書きましたが、フォロワー数が多くインフルエンサーぽいから良い人かというと必ずしもそうではないようなので、SNSは情報を得たりするのに使うぐらいがよい気がします。

https://qiita.com/SFITB/items/acd9336ccedd68d3e1ed
【MySQL】Amazon Linux 2023にMySQLをインストールする

Amazon Linux 2が2025年6月30日をもってサポートを終了すると聞いたため、
Amazon Linux 2023にMySQLをインストールしようとした際になかなか苦戦しました。

この記事ではAmazon Linux 2023へMySQL8.0をインストールするやり方についてご紹介します。

# やり方
## EC2インスタンスを作成する
EC2のマネジメントコンソールよりEC2インスタンスを作成します
このときAMIはAmazon Linux 2023を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/b66ef97b-4cd3-f341-cb36-adc9b6dcf77c.png)


## RDSインスタンスを作成する
RDSのマネジメントコンソールよりRDSインスタンスを作成します
このときDBMSはMySQLのバージョン8系の最新版を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/2bf18af7-fa6a-c7fe-085b-6d1f722dc8a4.png)

## EC2インスタンスにSSH接続する
```bash
$ ssh -i <アクセスキーのパス> ec2-user@<パブリックIPアドレス>
```

## dnfをインストールする
```bash
sudo dnf update -y
```

## MySQLクライアントをインストールする
```bash
$ sudo dnf install mariadb105
```

## MySQLインスタンスに接続する
```bash
$ mysql -h <RDSインスタンスのエンドポイント> -P 3306 -u <ユーザー名> -p
```

接続後、以下のメッセージが表示されればインストール&接続完了です。
```
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 8.0.40 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>
```

# 参考

https://aws.amazon.com/jp/amazon-linux-2/faqs/#:~:text=Amazon%20Linux%202%20%E3%81%A8%20Amazon%20Linux%20AMI%20%E3%81%AE%E4%B8%BB%E3%81%AA,%E5%8F%97%E3%81%91%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82


https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL.html#CHAP_GettingStarted.Connecting.MySQL
Kongでhttpとhttps通信の両方を許可する

# はじめに
Kongで`http://localhost:8000`とか`https://localhost:8000`とかの記述があって、httpとhttpsの違いはどこでやっているんだろうと調べた自分用メモ。docker-composeで調べたが、他の実装も同じ想定。
Kongのマニュアルをちゃんと読めば書いているかもしれない。

# docker-compose.ymlの設定
githubからKongのインストール資材を入手
https://github.com/Kong/docker-kong

docker-compose.ymlでkong使っての通信はhttpのみ許可する設定。

```docker-compose.yml
  kong:
    image: "${KONG_DOCKER_TAG:-kong:latest}"
    user: "${KONG_USER:-kong}"
    environment:
      <<: *kong-env
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ERROR_LOG: /dev/stderr

      #### これがProxyを介した通信の設定
      KONG_PROXY_LISTEN: "${KONG_PROXY_LISTEN:-0.0.0.0:8000}"

      KONG_ADMIN_LISTEN: "${KONG_ADMIN_LISTEN:-0.0.0.0:8001}"
〜以下省略〜
```
`KONG_PROXY_LISTEN`の横に色々書かれているが、`KONG_PROXY_LISTEN`が設定されていなければ`0.0.0.0:8000`を使えということらしい。

変数の設定は
- `[IPアドレス]:[port]`ならhttp通信
- `[IPアドレス]:[port] ssl`ならhttps通信

とのこと。

# httpsの通信設定


https通信の場合、単にsslをつけるだけでssl通信になる。
```docker-compose.yml
...
      #### 8000番ポートがhttp通信の設定
      #### KONG_PROXY_LISTEN: "${KONG_PROXY_LISTEN:-0.0.0.0:8000}"

    　↓以下に変更
    
      #### これで8000番ポートをhttps通信の設定になる
      KONG_PROXY_LISTEN: "${KONG_PROXY_LISTEN:-0.0.0.0:8000} ssl"
```

8000ポートはhttp通信みたいな記述がネットにあったが単に定義の仕方だけの話だった。
`https://localhost:8000`と8000番ポートでもhttpsで使うよう設定すうることはできる。

# http通信とhttps通信の両方をKongで受ける

httpとhttpsの両方を受け付ける場合は並べて記載する。
変数未定義時のデフォルト値の書き方だが、パラメータが複数ある場合の記述方法が分からなかったためベタ書き。

```docker-compose.yml
      ### httpを8000ポートで、httpsを8443で受ける場合
      KONG_PROXY_LISTEN: "0.0.0.0:8000, 0.0.0.0:8443 ssl" 
```

これでhttpの場合は`http://localhost:8000`で、httpsの場合は`https://localhost:8443`で通信できるようになる。
TypeScript型のtips

### 空オブジェクト

```ts
export type EmptyObject = Record<string, never>;
```

### Anyオブジェクト

```ts
export type AnyObject = Record<string, unknown>;
```

### オブジェクトのvalueのunion type

 ```ts
 /**
  * @example
  * type Obj =  {
  *   x: string;
  *   y: number;
  * };
  * ValuesType<Obj>; // string | number
  */
export type ValuesType<T extends AnyObject> = T[keyof T];
```

### Arrayのelementの型

```ts
/**
 * @example
 * type Element = ArrayElement<string[]>;
 * // string
 */
export type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends readonly (infer ElementType)[]
  ? ElementType
  : never;
```

### 配列の要素かどうかを判定する

```ts
export const isArrayElement = <T>(array: T[], value: any): value is T => {
  return array.includes(value);
};
```

### オブジェクトであるか

```ts
export const isObject = (value: unknown): value is Record<string, unknown> => {
  return Object.prototype.toString.call(value).slice(8, -1) === 'Object';
};
```

### keyがobjのキーであるか

```ts
/**
 *
 * @example
 * const obj =  {
 *   x: 1;
 *   y: 2;
 * } as const;
 * const key: string = '';
 * if (isKeyOf(key, obj)) {
 *   // key is "x" | "y"
 * }
 * // key is string
 */
export const isKeyOf = <T extends object>(key: keyof any, obj: T): key is keyof T => {
  return key in obj;
};
```

### オブジェクトのキーを取得する

```ts
export const getKeys = <T extends Record<string, unknown>>(obj: T): (keyof T)[] => {
  return Object.keys(obj);
};
```

### 一部プロパティをオプショナルに変更する

```ts
export type MarkOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
```

### 全てのプロパティをNullableに変更する

```ts
export type NonNullableProperties<T> = {
  [K in keyof T]: NonNullable<T[K]>;
};
```

### 一部のプロパティをNullableに変更する

```ts
export type MarkNonNullable<T, K extends keyof T> = Omit<T, K> & NonNullableProperties<Pick<T, K>>;
```

## 参考記事

- [TypeScript：空オブジェクト用の型をつくりたい](https://qiita.com/malillu/items/992b0c6bcec8ffc74347)
- [inferで情報を取得する](https://tech-blog.rakus.co.jp/entry/20240125/typescript)