OmniAICreator/Qiita-1.07M huggingface dataset:
【初心者向け】Django Rest FrameworkでヘルスチェックAPIを実装しよう！

## ヘルスチェックとは？
システムが正常に稼働しているかどうかを確認することです
通常はALBからEC2またはECSへ向けてヘルスチェックを行います

## 実装してみよう！
今回は
- プロジェクトのurls.py
- アプリケーションのurls.py
- views.py

を編集し、`api/health`のエンドポイントを作成して実際にヘルスチェックを行う方法まで説明します

### プロジェクトのurls.py
プロジェクトにapi/のエンドポイントを作成します
```プロジェクト名/urls.py
from django.contrib import admin
from django.urls import path, include

from drf_spectacular.views import (
    SpectacularAPIView,
    SpectacularRedocView,
    SpectacularSwaggerView,
)

urlpatterns = [
    path("admin/", admin.site.urls),
    # api/のエンドポイントを作成
    path("api/", include("relationships.urls")),
    path("api/schema/", SpectacularAPIView.as_view(), name="schema"),
    # SwaggerUIの設定
    path(
        "api/docs/",
        SpectacularSwaggerView.as_view(url_name="schema"),
        name="swagger-ui",
    ),
    # Redocの設定
    path(
        "api/redoc/",
        SpectacularRedocView.as_view(url_name="schema"),
        name="redoc",
    ),
]
```

Swaggerの設定方法は下記の記事を参考にしてください

https://qiita.com/shun198/items/23c6baa450ba37a5fd66

### アプリケーションのurls.py
`health/`のエンドポイントを作成します
```アプリケーション名/urls.py
from django.urls import path
from アプリケーション名.views.health_check import health_check

urlpatterns = [
    path("health/", health_check, name="health"),
]
```

### views.py
今回は`api/health`へGETすると200を返すだけの簡単なヘルスチェックを作成します

```views.py
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import AllowAny
from django.http import JsonResponse


@api_view(['GET'])
@permission_classes([AllowAny])
def health_check(request):
    return JsonResponse(data={"msg":"pass"},status=200)
```

## Swaggerで動作を確認しよう！
上記の設定を行ったら`api/docs`へアクセスします
![スクリーンショット 2022-11-02 19.17.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/cc7c11d3-e469-0c5e-af32-027adfb8f591.png)

GETをすると設定したメッセージがresponseとして返ってくることが確認できました
![スクリーンショット 2022-11-02 19.18.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625980/8ab1fa10-5fe1-0124-6114-eb58f9be39e7.png)

## まとめ
ヘルスチェックに関しては全てのプロジェクトで行うのでテンプレート化してもいいかもですね
KCNA向け勉強メモ #4

#1, #2, #3に続いてKCNA(Kubernetes Cloud Native Associate)受験前の最後の見直しに使う資料として作成

https://qiita.com/y-vectorfield/items/e2a5d35b24e5d9871085

https://qiita.com/y-vectorfield/items/70692b43a7f73a74e5ec

https://qiita.com/y-vectorfield/items/27a9a6c1760f7fa254be

# クラスターでポッドのネットワーク通信が正常に行われない場合
* ネットワークポリシーの確認と修正

# ポッドが予期せず停止した場合、最初に行うべきアクション
* ポッドの状態をkubectl describeコマンドで確認する

# Serviceリソース
* 外部からクラスター内のサービスにアクセスするための方法を公開する
* クラスター内のポッドへのネットワークトラフィックのルーティングとロードバランシングを行う

# Podが正常に動作しない時
* kubectl describeコマンドで、ポッドが実行されているノードの情報を表示

# コントローラ
* ノードの追加や削除など、クラスターの構成変更を自動的に検知して反応する機能

# kube-scheduler
* ポッドのスケジュールが失敗した場合、新しいスケジュールを試みるコンポーネント

# ポッドの起動が遅れる場合
* ポッドの起動が遅れる場合、起動する為のリソース要求が足りない
* リソース要求を増やすことで、クラスター内のリソースの割り当てを増やし、ポッドの起動を早めることが出来る

# Namespace
* クラスター内のリソースを管理するために使用される

# ポッドのスケジューリングの失敗
* ポッドのコンテナイメージが見つからない

# ServiceMeshの目的
* 認証と承認

# StatefulSet
* ペアになるヘッドレスサービスが必要なサービス

# etcdのHA構成
* 最低3台以上で構成することが求められる
Kubernetes コマンド備忘録

## kubectlコマンド覚えられない問題
- Kubernetesを扱ううえで必要なkubectlコマンド、何回も叩いているのに毎回調べたりしていませんか？（しています）
- あちこちメモしたりしてるんですが覚えられないし、メモもいつもどこか行ってしまうので、ここでまとめてみます！
- 2024年7月の現時点では、AWS EKS + Kubernetes 1.29を主に利用した環境でのコマンドです
- とりあえずよく使うコマンドをざっと書き出してみます
    - 後日カテゴリーごとに分けてまとめようかな・・・（いや、やらなそうだな・・・）
- 随時更新予定です

## 個人的よく使うコマンド集
- Pod, Service, ReplicaSet, Deploymentをまとめて一覧表示
    `kubectl get po,svc,rs,deploy [-n namespace]`
- 稼働中のPodがどのコンテナイメージを使って動いているかを確認する
    - すべてのNameSpace
    `kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' | sort`
    
    - Namaspaceで絞り込み
    `kubectl get pods [-n namespace] -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' | sort`
    
- ローリングアップデート
    `kubectl rollout restart deployments/{deployment name}  [-n namespace]`
    
- .envファイルからConfigMapを作成する
    `kubectl create configmap {ConfigMapName} [-n namespace] --from-env-file={.env FileName}`

- 既存のConfigMapを.envファイルの内容で更新する
    `kubectl create configmap {ConfigMapName} [-n namespace] --from-env-file={.env FileName} --save-config --dry-run=client -o yaml | kubectl apply -f -`

- yamlファイルからsecretを作成
    `kubectl create secret generic {SecretName} -n namespace --from-file={Secret yaml FileName}`

- Deploymentで指定しているコンテナイメージを変更する
    `kubectl set image deployment/{DeploymentName} [-n namespace] {DeploymentName}={コンテナイメージリポジトリURL}:{タグ}`
    
## よく使うコマンド集（AWS EKS関連）
- EKS上のクラスターのkubeconfigファイル生成/更新
    `aws eks update-kubeconfig --region ap-northeast-1 --name {ClusterName} --verbose`
    
- ECR上に、指定されたタグが付いているコンテナイメージが存在するかを確認（あったらそのタグ名、なければnull）
    `aws ecr list-images --repository-name {RepositoryName} --query "imageIds[?imageTag=='{探したいタグ}'].imageTag|[0]" | sed -e 's/"//g'`
プロパティがundefinedのオブジェクトにundefinedyな値を格納する際の書き方

(`undefinedy`は私の造語です)

以下の型がある
```typescript
type UserInfo = {
  name: string;
  nickName?: string;
  age: number;
};
```

ここで、以下の`inputNickName`変数をプロパティ`nuckname`に当てはめた上でオブジェクト`newUserInfo`を作成したい。
```typescript
const inputNickName: string | undefined = undefined;
const newUserInfo: UserInfo = {
  name: "ユーザー",
  nickName: inputNickName,
  age: 20
}
```

しかし、これだと型エラーとなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177673/0b0e9cec-8179-eaa5-1ed0-84452fb86164.png)

※参考：

https://qiita.com/TomK/items/37b100195aa7142868c8

---

回避策として、例えば三項演算子で分岐させるとエラーは解消される。
```typescript
const newUserInfo: UserInfo = inputNickName ? {
  name: "ユーザー",
  nickName: inputNickName,
  age: 20,
} : {
  name: "ユーザー",
  age: 20,
}
```
しかし、これだとなんか冗長なのでいい感じの書き方ないかな～と探していたところ、以下のように書けるらしい。
```typescript
const newUserInfo: UserInfo = {
  name: "ユーザー",
  ...(inputNickName && { nickName: inputNickName }),
  age: 20
}
```
すごい構文だ...

以下のようなif文が良いのか、三項演算子やスプレット構文が良いのかは好みが分かれそうですね。
```typescript
let newUserInfo: UserInfo = {}

if (inputNickName) {
  newUserInfo = {
    name: "ユーザー",
    nickName: inputNickName,
    age: 20
  }
} else {
  newUserInfo = {
    name: "ユーザー",
    age: 20
  }
}
```

個人的にはスプレット構文が好みですね。
コードの縦の行数が減るので読みやすそうです。
勿論、初心者が見たら困惑しそうなな書き方だとは思うので配慮は必要だと思いますが...
【LinuC 101試験キャンペーン】 プログラミングスクール出身生が周囲と一歩差別化を図るならインフラの知識をつけよう！


:::note
本稿のすべての読者がLinuC 101, 102試験に合格できることを祈ってます
:::

## なぜLinuC？
私がLinuC Open Networkの人間だから、というのもあるにはあるんですが、

- Linux関連の試験でキャンペーンがある
- 好評だった勉強会の夏期講習が開催される

ということもあり、私も参加していたのですが非常によい学びの場になったな、と思ったので紹介です。

### LinuC 101試験を受けると何が嬉しいのか？（副業プログラマー目線から）
プログラミングスクールの講師をしていて思うのが、コマンドレベルやインフラの知識がないWebエンジニアが世に溢れているので、インフラも分かってますよ！とアピールするのに絶好です。
試験の難度的に、大体は実務経験相当の技術力を求められるものが多いのですが、LinuC101試験の内容は実務経験がなくても学べる内容で、個人の趣味レベルでありながら実務で必要な知識や技術がついている事を認められるのがLinuC 101試験の良さだと思っています。
特に「コマンドならわかる」人が増えていますが「サーバーの仕組みが分かる」人はまだまだ不足しているため、技術はいざ知らず知見はありますよ！と言えるだけでも価値は高いです。

実務経験としてサーバー管理者経験があるなら101,102試験レベルなら足りないかなぁ、とは思いますが実務経験がない場合は意義のある（選択肢として広げやすい）試験だと思います。
ITエンジニアを副業として考えている人が、周囲との差別化のために持つ事として意味のある事だと私は思います。
重要なのは「インフラの業務をやらない（やりたくない）としても、サーバーの知識や技術をある程度持っている」事を証明する事です。

### LinuC 101試験を受けるためにどうすれば良いか？ 教材は？
まずは勉強会が開催・公開されているので、そちらを見てみましょう。
どんな雰囲気で学習できるのか、無料体験もできます。

https://lpijapan.connpass.com/event/324431/

過去の回の様子を見る事もできます。

https://www.youtube.com/watch?v=1ngMAWPBumc

もちろん、いきなり教材を買って本を読み込むぞ！というモチベーションがある場合も、公認教材が出ていますのでそちらを買い求めてもらう事もできます。
私が思うに、IPAの試験並みに受験しやすい、また学習環境が整っているのがLPI Japanが開催している試験だと思っています。

### 落ちてしまっても再試験が無料になるキャンペーンも！
なんと！今回、LinuCがまたまた太っ腹なキャンペーンを打ち出してくれたようです。

https://linuc.org/campaign/202407.html?utm_source=linuc&utm_medium=display&utm_campaign=fr_2024

一発合格できたならそれはそれでおっけー、うまくいかなかった時にもう一回受けられるのはとても嬉しいですね！
期限も2025年4月30日までなので、この機会にぜひ挑戦してみてほしいです！

今回のキャンペーンのおかげで「とりあえず一回受けてみて、落ちちゃったら一年以内に勉強時間作れるからもう一度受けなおそう」という案内が出来るようになったのは講師として受講生に案内できるようになったのも嬉しい、というのがあります。

### さらに特典が！
LiONに参加して運営協力者になると、バウチャー（試験チケット）の割引特典も受けられます。
私が言うのもなんですが、LPI JapanやLinuC試験などで実績が多い団体ですが、コミュニティとしてはまだ発足したばかりです。
特にコミュニティ駆動開発に間近で関われるのは嬉しい事なので、試験の割引をきっかけにLiONにも興味を持ってくれたら嬉しいです。
PHPでX APIを利用してフォロー数、フォロワー数を取得

XのAPIが有料化されてから初めて触りました。
今となっては、なかなか使う機会もないけどメモ。

# ライブラリ
https://github.com/abraham/twitteroauth

```
composer require abraham/twitteroauth
```

## XのAPI関連キーが4つ必要
①APIキー
②API Key Secret
③Access Token
④Access Token Secret

## プログラム
```
$connection = new TwitterOAuth(①, ②, ③, ④);
$connection->setApiVersion('2');

$response = $connection->get('users/by/username/yu_takashina', [
  'user.fields' => 'profile_image_url,public_metrics',
]);

// フォロー数
$response->data->public_metrics->following_count;

// フォロワー数
$response->data->public_metrics->followers_count;
```

ユーザーが存在しなかったり、APIの制限に引っかかったら$response->dataが無くて、エラーになりました。
エラーチェックは適宜入れましょう。


## Wordpressでフォローワー数が多い順で並べた
この案件はWordpressだった。
```
update_post_meta($post->ID, 'following', $response->data->public_metrics->following_count);
update_post_meta($post->ID, 'followers', $response->data->public_metrics->followers_count);
wp_update_post($post);
```
上記で保存して
```
$args = [
    'orderby' => 'meta_value',
    'meta_key' => 'followers',
    'orderby' => 'DESC',
];
$wp_query = new WP_Query();
$wp_query->query($args);
```
では、期待通りの順番にならなかった。
文字列で保存されているので、
9, 88, 10000
のような順番になる。

保存時にゼロ埋めで桁合わせしてあげたらOKだった。
```
update_post_meta($post->ID, 'following', sprintf('%09d', $response->data->public_metrics->following_count));
update_post_meta($post->ID, 'followers', sprintf('%09d', $response->data->public_metrics->followers_count));
wp_update_post($post);
```
Shell作ってみる:Goバージョン

## 内容
- [この記事](https://blog.init-io.net/post/2018/07-01-go-unix-shell/#introduction)を参考に実施した
- Cの記事もあるので、今後そちらでも作成したいと思う


## 記事のコード(一部改変)
動かしたところ、EOFが無限に表示されてしまったため、一部変更した
また独自のコマンド`hello`を追加した
```go:main.go
package main

import (
	"bufio"
	"errors"
	"fmt"
	"os"
	"os/exec"
	"strings"
)

// learn-memo: メイン関数。プログラムのエントリーポイントとなり、ユーザーの入力を無限ループで処理する
func main() {
	fmt.Print("Golang Shell\n")
	reader := bufio.NewReader(os.Stdin)
	for {
		fmt.Print("> ")
		// learn-memo: キーボードからの入力を読み取る
		input, err := reader.ReadString('\n')
		if err != nil {
			fmt.Fprintln(os.Stderr, err)
		}

		// learn-memo: 入力から改行文字を削除
		input = strings.TrimSuffix(input, "\n")

		// learn-memo: 空の入力をスキップ
		if input == "" {
			continue
		}

		// learn-memo: 入力されたコマンドを実行
		if err = execInput(input); err != nil {
			fmt.Fprintln(os.Stderr, err)
		}
	}
}

// learn-memo: cdコマンドが引数なしで呼ばれた場合のエラー
var ErrNoPath = errors.New("path required")

// learn-memo: 入力されたコマンドを実行する関数
func execInput(input string) error {
	// learn-memo: 入力をコマンドと引数に分割
	args := strings.Split(input, " ")

	// learn-memo: ビルトインコマンドのチェック
	switch args[0] {
	case "cd":
		// learn-memo: cdコマンドの処理。引数が不足している場合はエラーを返す
		if len(args) < 2 {
			return ErrNoPath
		}
		// learn-memo: ディレクトリを変更
		return os.Chdir(args[1])
	case "exit":
		// learn-memo: プログラムを終了
		os.Exit(0)
	case "hello":
		fmt.Println("world")
		return nil
	}

	// learn-memo: 外部コマンドの実行準備
	cmd := exec.Command(args[0], args[1:]...)

	// learn-memo: 標準エラー出力と標準出力を設定
	cmd.Stderr = os.Stderr
	cmd.Stdout = os.Stdout

	// learn-memo: コマンドを実行し、エラーがあれば返す
	return cmd.Run()
}
```

## 感想
正直入力を無限ループで待機して、知っている引数であれば処理を行い、知らない引数は外部のコマンドを叩こうという形であるため、あまりshellを自作した実感はない

shellをゼロから構築するイメージだったため少し物足りないが、shellをラップしてbashなどができているので独自にカスタムしたshellを手軽に使いたいのであれば選択肢としてはありかなと思う。
Rails: パーシャルに渡す変数は、なるべく少ない方がいいというレビューを受けた話（haml記法）

## 読んで欲しい人

- モデルにアソシエーションがあるのに、パーシャルに渡す変数を複数個にしてる方へ
- 過去の自分

## 動作環境

- ruby 3.3.0
- Rails 7.1.3.3

## 前提

作っているもの
- ポスト詳細画面に表示する、コメント一覧のパーシャル

## レビュー内容とコード


### レビュー内容
```diff
-    = render 'posts/comments', comments: @comments, post: @post
+    = render 'posts/comments', comments: @comments
```
コメント

- モデル同士がお互いを知っているのであれば、渡す変数は1つの方がいい

### コード構成と内容

モデル：postとcommentは、1対多の関係性

```post.rb
has_many :posts, dependent: :destroy
```

```comment.rb
belongs_to :post
```

コントローラ

```posts_controller.rb
def show
  @post = Post.find(params[:id])
  # コメントを一覧を表示するためのインスタンス変数
  @comments = @post.comments.comments_order
end
```

ビュー

```diff_haml
# posts/show.html.hamlファイル

.post-container
  = @post.user.name
  = @post.user.content
.comment-container
-  = render 'posts/comments', comments: @comments, post: @post
+  = render 'posts/comments', comments: @comments
```

パーシャルビュー
```diff_haml
# posts/show.html.hamlファイル

%ul.list-group
  - comments.each do |comment|
    %li.list-group-item
      .comment
        = comment.content
        .d-flex
-          = link_to '編集', edit_post_comment_path(post, comment)
-          = button_to '削除', post_comment_path(post, comment)
+          = link_to '編集', edit_post_comment_path(comment.post, comment)
+          = button_to '削除', post_comment_path(comment.post, comment)

```

## パーシャルに渡す変数を少なくした方がいい理由

- パーシャルだけをパッと見た時に、postとcommetnsは関連性がないのかな？と思ってしまう
- インスタンス変数を変えたいとなった時に、シンプルに変える箇所が多くなる、保守性が低め
- コードが短くなる

## 感想、学んだこと

- コードを他の人が見たときに、どう思うのか？という視点が学べた
- 自分がどのモデルと紐づいているのかは、データ同士(今回の場合はpostとcomment)が一番知っている
- 関連が頭に入っていればこの間違えはなかったなぁ

以上
PythonコードでPDFドキュメントをExcelファイルに変換

PDFファイルは、一貫したフォーマットを異なるデバイスで維持できるため、コンテンツの保存や共有に一般的に使用されます。しかし、データの編集や分析には適していません。一方、Excelファイルはデータ分析や操作の豊富な機能で広く使用されています。PDFドキュメントをExcelファイルに変換することで、データの編集や分析が容易になります。さらに、強力なPython言語を使用することで、変換プロセスを自動化し、時間と労力を節約できます。

この記事では、**Pythonを使用してPDFドキュメントをExcelファイルに変換する方法**を示します。

- **[PythonでPDFドキュメントをExcelファイルに変換](#pythonでpdfドキュメントをexcelファイルに変換)**

この記事で使用する方法には、[Spire.PDF for Python](https://www.e-iceblue.com/Download/Spire-XLS-Python.html)が必要です。PyPIからインストールします: `pip install Spire.PDF`.

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)

## PythonでPDFドキュメントをExcelファイルに変換
このライブラリを使用すると、`PdfDocument.SaveToFile()`メソッドを利用してPDFドキュメントをExcelファイルに変換できます。変換の前に、`XlsxLineLayoutOptions`クラスのオブジェクトを作成して変換オプションを指定し、`PdfDocument.ConvertOptions.SetPdfToXlsxOptions()`メソッドで適用できます。`XlsxLineLayoutOptions`クラスのコンストラクタは次の5つのパラメータを受け取り、PDFドキュメントをExcelワークブックにどのように変換するかを制御します：

- `convertToMultipleSheet (bool)`: 各ページを同じExcelの異なるワークシートに変換するかどうかを指定します。Falseに設定すると、最初のページのみが変換されます。
- `rotatedText (bool)`: 回転したテキストを表示するかどうかを指定します。
- `splitCell (bool)`: PDFセル内のテキストを1つのExcelセルまたは複数のセルに変換するかどうかを指定します。
- `wrapText (bool)`: Excelセル内でテキストを折り返すかどうかを指定します。
- `overlapText (bool)`: 重なったテキストを表示するかどうかを指定します。

PDFドキュメントをExcelファイルに変換するための詳細な手順は次の通りです：

1. 必要なモジュールをインポートします。
2. `PdfDocument`クラスのインスタンスを作成します。
3. `PdfDocument.LoadFromFile()`メソッドを使用してPDFドキュメントを読み込みます。
4. `XlsxLineLayoutOptions`クラスのインスタンスを作成し、変換オプションを設定します。
5. `PdfDocument.ConvertOptions.SetPdfToXlsxOptions()`メソッドを使用して変換オプションを適用します。
6. `PdfDocument.SaveToFile()`メソッドを使用してPDFドキュメントをExcelファイルに保存します。
7. リソースを解放します。

コード例
```python
from spire.pdf.common import *
from spire.pdf import *

# PdfDocumentのインスタンスを作成
pdf = PdfDocument()

# PDFドキュメントを読み込む
pdf.LoadFromFile("Sample.pdf")

# XlsxLineLayoutOptionsオブジェクトを作成し、変換オプションを指定
# パラメータ: convertToMultipleSheet, rotatedText, splitCell, wrapText, overlapText
convertOptions = XlsxLineLayoutOptions(True, True, False, True, False)

# 変換オプションを設定
pdf.ConvertOptions.SetPdfToXlsxOptions(convertOptions)

# PDFドキュメントをExcel XLSX形式で保存
pdf.SaveToFile("PDFをExcelに変換.xlsx", FileFormat.XLSX)
pdf.Close()
```

変換結果
![PythonでPDFをExcelに変換](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/d6e370b5-61b5-afc9-9c0d-aa3c902fcdcb.png)

この記事では、Pythonを使用してPDFドキュメントをExcelファイルに変換する方法を示しました。

他のPDFファイル処理技術については、[Spire.PDF for Pythonのチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.XLS-for-Python/Program-Guide/Spire.XLS-for-Python-Program-Guide-Content.html)をご覧ください。
Djangoの構成についての覚え書き

# Djangoの構成についての覚え書き
Djangoを学び始めてはや一週間。テキストが一冊終了しました。
テキストのコードを模写しながら思ったことを記しておきます。
（記述した部分を中心に扱います。）
## Djangoの拡張性について
Laravel（PHP）とかFlask（Python）でWEBアプリを作ったことがあるが、最初からこんなに機能がついているとは...
しかも開発用のWEBサーバも用意してくれて用意周到すぎる
## アーキテクチャについて
LaravelではMVCモデルが採用されており、それとほぼ同じMTVモデルを採用。
- MVC：Model, View, Controller
- MTV: Model, Template, View
実は、それぞれのViewは同じ働きをしない（紛らわしい）
**※MTVモデルのViewは、MVCモデルで言うところのControllerに該当する。**

## Modelの役割
DBとのやり取りを行う。ModelファイルにDBの定義について記述しておき、マイグレーションでDBの定義を行うこともできる。
<details><summary>マイグレーションって何？</summary>
DBにテーブルを作成・削除する際、本来はDBにDB管理システム（PostgreSQLとか）で入って処理を行う必要がある。だが、マイグレーションを使う場合、Modelファイルにオブジェクトとしてテーブルを定義し、マイグレーションコマンドを実行することでDBにModelファイルの内容が反映される。
本来はDBのバージョンアップ＆ダウンをすることができる点が良い所らしい。（私はまだしたことない）
</details>

### マイグレーションの流れ

#### 1. Modelファイルにテーブルオブジェクトを記述
``` 
python manage.py makemigration [Modelファイルの親ディレクトリ]
```
これでマイグレーションファイルが作られる。
#### 2. マイグレーションを実行
```
python manage.py migrate
```
マイグレーションファイルの内容を確認してから実行するようにしましょう。
これでModelファイルのオブジェクトがテーブルとして作られる。

### レコードをオブジェクトとして扱うことができる
<details><summary>レコードってなんや？</summary>
レコード：テーブル内の１つのデータ（インスタンスとか言われる）
</details>
マイグレーションでも言及したが、テーブルをオブジェクトとしてとらえることができる。
例えばこんな感じ

```models.py
from django.db import models 
class [テーブル名（単数形）]
    name = models.CharField()
    [属性名] = models.[フィールド名]
```
こうすると、models.pyさえimportすればViewでもDB内のデータを扱える！
</details>



### Templateの役割
ここはUI（ユーザインタフェース）に関係しています。
Djangoの場合（フロントでフレームワークを使用しない場合）は以下のディレクトリ構成になりそう
```
templates
    - hello
        - index.html
        - show.html
        - ...
```
index.htmlなどのテンプレートファイルはDjangoのサーバから呼び出されるため、プロジェクト名と同じディレクトリを親ディレクトリとして、その配下にテンプレートファイルを配置する。

:::note info
フロントエンドをフレームワークで開発する場合
Djangoプロジェクトにはテンプレートファイルを置かず、フロンドエンドのファイルを参照するように設定を変更する。
:::

### Viewの役割
簡単に言うと、

なんかリクエスト来る
↓
（リクエスト内容をもとにDB操作）
↓
Templateに返す

例えばこんな感じ
```views.py
def index(request):
    params = {
        'title': 'Hello',
        'message': '',
    }
    return render(request, 'hello/index.html', params)
```

## ここまでできたらどうする
テキストを見ながら、簡単なオリジナルアプリを作ってみようかと思います。
あまり作りこまず、CRUD操作ができる程度の簡単なアプリです。

## 最後に
一週間、テキストを模写してみて、テンプレートファイルを書くのが面倒くさい！ってなりました。
あと、コードを書くだけだとデザインが壊滅的に...。
オリジナルアプリを開発するときは、デザインツールを使ってみようかなと思いました。
### 初心者の方へ
凄いアプリを作りたい！と思って、いきなり本格的なアプリを作り始めてしまいがちです。（私もそうでした）
ですが、そうも簡単にいかないです。段階を踏んで辛抱強く頑張りましょう。
私もまだ初心者ですので、しっかり段階を踏んで、本格的なアプリの開発に着手したいと思います。
G-14 Jerrydog アップデート、そして Scratch の弱点...

# G-14 Jerrydog Update

https://scratch.mit.edu/projects/1042567369

密かにアップデートしました。それに伴い、やはりというか、Scratch の弱点も...。前半はアップデート内容について、後半は弱点について。皆さんはどうされていますかね？

メモとクレジットに、**This game is a homage to After Burner from SEGA.** の文言を入れてみました。

しかし、公開 1 週間程度で参照数が 100 にはなった（これ自体、多いのか少ないのかよく分かんない）ものの、なかなかハートマーク :heart: とか星マーク :star: とかは押してもらえないものなのですね。気長に行きます。

## アップデート

### ① 1UP 追加

激しい銃撃戦でやられっぱなしはさすがにきつそうなので、以下の条件で 1UP させるようにしてみた。どうなんでしょう。ゲーム得意な人にとっては要らなかったかな。

* ステージクリアすると 1UP
* 50,000 点ごとに 1UP

ただし、最大で 10 機までです。

### ② Mobile Friendly - モバイルでも遊べるよ！

やはり今どきはモバイルで遊べないと、という意味で、モバイル対応してみました。とは言っても、マウス操作くらいしかできないので、何を操作させて何を操作させないかですね。今回は以下のようにしました。

1. 最初の <kbd>START</kbd> ボタンをマウス（または指）でタップすると、モバイルモードとして動作します。
    * オプションの変更などは、カーソルでもマウスでもどちらでも有効です。
    * 空母からの離陸もタップでします。
1. バルカンとホーミングミサイルは自動発射
    * ホーミングミサイルは照準が合うとすかさず発射されます
1. マウスタッチしているところに向かって移動
    * タッチしている間、タッチている場所に向かう
    * タッチを離すとその位置でホールド
    * ドラッグした場合、右→左とかするとローリングします
1. G-14 の機体をタップしたらアフターバーナー点火
    * この操作はかなり悩んだが、選択肢が限られているのでこの程度か
    * マウスの場合、マウスホイールを上向きに回すと点火します

既存のコードを壊してないか心配です。何か不具合っぽい挙動を見つけたらぜひご報告を！

### ③ 背景をリッチに - 任意オブジェクトをスクロールに合わせて描画

これは、百聞は一見に如かず。画面キャプチャだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/2daed3cf-fbbe-7627-52d0-40ec417a46a4.png)

おぉ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/286932c2-5c43-2e67-b43f-be917207a13c.png)

島が登場だ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/a2e9726b-311f-dc90-7528-fc125dc43060.png)

夕方も夜も！ついでにホーミングミサイルに追いかけられてる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579271/8b43edfe-9d27-d838-d203-5afcd4de5e2e.png)

荒野も森もいい塩梅に。ただ、秘密基地とのつなぎを合わせるのに苦労した。たぶんそんなに違和感ないレベルでできた気がする。森の面でのスコアが何だかおかしいのは、お察しください。

ちなみに雲の面は変えてないです。

## Scratch の弱点

さて、Scratch の弱点です。まぁ致し方ない面も多分にありますが、皆さんはどうされていますか？ベストプラクティスなどあれば共有いただけると嬉しいです。

### ① 公開後の修正

公開してしまうと、みんな触われるようになる（当たり前）。すると、修正している間の不安定な時にアクセスされてしまう危険性が。デバッグしている間のものをサンドボックス的に別扱いできないものか？

> ローカルにダウンロードして、修正後の動くものをスプライトとして書き出し、スプライト丸ごと入れ替える形で反映。他にいいアイデアはありますか？

### ② 既存コードの毀損問題

既存（←きそん、と読むのが正しいそうです）コードを毀損（きそん）してしまった場合、どうやって元に戻す？バックアップとかあるのだろうか。初心者なのでよくわからない＆見当たらなかった。

> ローカルに自分でバックアップ。そもそもオンラインでの修正は最低限でしかしない。皆さんはどうされてますか？

### ③ コードの差分チェック

Diff が使えん...。

> 解決策がない。どうするのが良い？そもそも、その程度のものと割り切る？

### ④ サーバがダウンしてる！

これは仕方ないか。しかし、修正後の保存が「できませんでした」となるのは焦る。

> 基本ローカルでしか修正しないことにした。反映させるのが面倒くさいけど。

---

他にもありそうですが、ひとまずここまで。

皆さんの持つ **ベストプラクティス** があれば、ぜひぜひコメントください。共有していただけると大変助かります。

ではまた。
[備忘録]　IT用語について分かったことをまとめた ~ver.1

# はじめに
こんにちは，Umamusume22です．たまにテック記事や論文などを読んでいるときに分からない用語と出会います．また，説明を求められたらどんなものか意外に説明出来ない用語もあります．そこで，今回は調べて分かったIT用語についてまとめます．

# 備忘録[1,2,3,4]


### ルータ
- ネットワークの中継機器
- あるネットワークと，あるネットワークを中継する機械のこと
- ネットワーク中のデータの中にあるIPアドレスを見て，行き先を振り分けてくれる機器

### API
- プログラムや機能に用意された「そいつと無関係なプログラムから，そいつにお仕事を依頼するための窓口」
- 機能にお仕事を依頼するための窓口
- Web APIはWebシステムの一機能を外部から使うための窓口
    - Webベースで提供されるAPI


### SSD
- ハードディスクと似たようなことができるメモリ
- ハードディスクと似ている
- フラッシュメモリを使っている
- データを入れておく箱
    - 振動に強い
    - 省電力
    - サイズが小さい
    - 読み書きが高速
    - 高価格

### メモリ
- 作業する机
- メモリの外観は緑色の長方形に黒い四角が何個かくっついた板
- 主記憶装置や一次記憶装置とも呼ぶ
- CPUと記憶装置の仲立ち
- メモリがCPUの指示を受ける
- 記憶装置の中身を預かる

# 最後に
備忘録の内容が短くて申し訳ありません．知っていて当然なIT用語シリーズでしたが意外に説明を求められたら答えられない用語です．(あくまで私の話です)
引き続きIT用語について分かったことをアウトプットしていきます
読んでいただきありがとございました!


※ウマ娘の声をフーリエ変換した記事や水栓の開閉判定をLineに通知する記事も書いています．suzuが私です．興味がある方はぜひご覧ください！
https://vigne-cla.com/31-1/#toc5

※noteも始めました．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!





# 参考文献
[1] "「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典"
https://wa3.i-3-i.info/word1393.html

[2]　"「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典"
https://wa3.i-3-i.info/word12428.html

[3] "「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典"
https://wa3.i-3-i.info/word11055.html

[4] "「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典"
https://wa3.i-3-i.info/word182.html
FigmaAI Waitlistへの参加方法

FigmaAI使ってみたいけど、WaitListどうやって参加すればいいのか分からなかったので、記事しました。
雑です。orz

1.Figmaのアプリケーションページにアクセスします。
2.以下の画像の通り右下の？をクリック

![スクリーンショット 2024-07-04 18.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550646/3e71b06e-4029-917b-90b5-1909f6b985fd.png)

3.ポップアップメニューがでてくるので、赤枠で囲ったWaitListへの参加ボタンを押す。
![スクリーンショット 2024-07-04 18.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3550646/752a9bde-67f7-d545-5abb-3715e0b2fdae.png)

終わり。楽しみに待ちましょう。
CentOS / Amazon Linux で OpenSSH のバージョンを確認する

# まずはOS情報を確認

`cat /etc/os-release`

# OpenSSHのバージョンを確認する

`yum info openssh`

こんな風にバージョンが表示される

```
Installed Packages
Name        : openssh
...
Version     : x.x.x
```

新しいアップデート対象バージョンがある場合はそれも表示される

```
Available Packages
Name        : openssh
...
Version     : y.y.y
```

# アップデート

まずはrootユーザーになっておく

```
sudo su -
```

そしてアップデートを実行

```
yum update openssh
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
ドキュメントを読むことの大切さ

エンジニアとして必要な能力は多岐にわたりますが、最近特に重要だと思うのは、ドキュメントを読む習慣を持つことだなーと思いました。

## 最近の体験
ChatGPTの登場により、わからないことがあればすぐにChatGPTに尋ねることが多くなりました。しかし、必ずしも正確な答えが返ってくるわけではありません。

### Pythonのibis-frameworkの例
直近の経験として、Pythonの新しいライブラリであるibis-frameworkを使って条件付きカウントを行いたい場合についての話です。ChatGPTから返ってきた答えは、フィルタしてカウントし、元のテーブルにジョインするというものでした。しかし、そのコードはパフォーマンスが非常に悪かったため、ドキュメントを確認したところ、`count`関数に`where`引数を入れられることがわかりました。

```python
# ChatGPTから返ってきたコードの例
filtered_table = table.filter(table.column == 'value')
counted_table = filtered_table.group_by(xxx).aggregate(cnt=_.count())
result_table = table.join(counted_table)

# ドキュメントを確認して改善したコード
count_result = table.group_by(xxx).aggregate(cnt=count(where=table.column == 'value'))
```

## ChatGPTの限界
これは、ChatGPTが使えないという話ではなく、例えばノウハウが溜まっていなかったり、破壊的な変更が起きたライブラリには弱いという実感を得た話です。このときに重要なのは、ドキュメントを読み、それを存分に活用できる人材であることだと感じました。

## 結論
結論として、ドキュメントはしっかりと読んで理解するべきだということです。これにより、最新の情報を得て効率的に問題を解決することができます。
特にノウハウがたまっていない事象に対する（今のところは）人間のアドバンテージなので、ドキュメントを読む習慣を持つだけで差別化できるとも言い換えられると思います。

## 追記
この文章を書きながら思ったのですが、ライブラリのドキュメントをChatGPTに読み込ませたら、もっと正確な答えが返ってくるかもしれませんね。今度試してみます。
Postman を使って Azure REST API を呼び出す

# はじめに

[前回の投稿](https://qiita.com/tetsuya-ooooo/items/7f9edea3a647f8dda0d8)で「Azure Log Analytics のサマリールール」を取り扱いました。

https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/summary-rules?wt.mc_id=AZ-MVP-5003113

執筆時点ではまだプレビューということもあり、サマリールールリソースに対する操作は REST API で行う必要がありました。

この投稿では、[Postman](https://www.postman.com/) を使って **Entra ID ユーザーアカウント** で Azure REST API を呼び出します。

※忘れてしまうので、備忘録として残しておく。


# アクセストークンを取得する

[Azure ポータル](https://portal.azure.com/)にサインインし、「Azure Cloud Shell」を開きます。

https://learn.microsoft.com/ja-jp/azure/cloud-shell/overview?wt.mc_id=AZ-MVP-5003113


## Azure PowerShell の場合

※[環境セレクター]で「PowerShell」に切り替えます。

```Get-AzAccessToken``` を実行します。

https://learn.microsoft.com/ja-jp/powershell/module/az.accounts/get-azaccesstoken?wt.mc_id=AZ-MVP-5003113

出力結果から ```Token``` の値をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/3226e876-c148-f792-588c-7ecae62e4b92.png)


## Azure CLI の場合

※[環境セレクター]で「Bush」に切り替えます。

```az account get-access-token``` を実行します。

https://learn.microsoft.com/ja-jp/cli/azure/account?wt.mc_id=AZ-MVP-5003113&view=azure-cli-latest#az-account-get-access-token

出力結果から ```accessToken``` の値をコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/178af954-e0ca-8885-39ba-eb8e8c55d3fc.png)


# Azure REST API を呼び出す

「[集計ルールを表示する](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/summary-rules?wt.mc_id=AZ-MVP-5003113&tabs=api#view-summary-rules)」に記載されている API を呼び出してみます。

## Postman から Azure REST API を呼び出す

Postman を開き、以下の値を入力して、[送信] ボタンをクリックします。

- 送信先

| 項目 | 設定値 (例) |
|:-|:-|
| メソッド | `GET` |
| URL | `https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourcegroup}/providers/Microsoft.OperationalInsights/workspaces/{workspace}/summarylogs?api-version=2023-01-01-preview`<br>※Log Analytics ワークスペース内のすべてのサマリールールの構成を取得<br>※ `{subscriptionId}`,`{resourcegroup}`,`{workspace}` は、環境に合わせて置換 |

- ヘッダー タブ

| キー | 設定値 (例) |
|:-|:-|
| Authorization | `Bearer {accessToken}`<br>※ `{accessToken}` は、[前述で取得したアクセストークン](#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)に置換 |
| Content-Type | `application/json` |

## レスポンスを確認する 

下図のとおり、すべてのサマリールールの構成が返ってきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230264/87a7e5fa-7201-d426-5a24-11424ee7fbe3.png)


# おわりに

以下の操作についても、同じように行うことができます。

- [集計ルールを停止して再起動する](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/summary-rules?wt.mc_id=AZ-MVP-5003113&tabs=api#stop-and-restart-a-summary-rule)
- [集計ルールを削除する](https://learn.microsoft.com/ja-jp/azure/azure-monitor/logs/summary-rules?wt.mc_id=AZ-MVP-5003113&tabs=api#delete-a-summary-rule)
Railsアプリケーションをサブディレクトリで公開する方法

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提
表題の通りですが、Railsアプリケーションで `example.com/ec-site` というようなサブディレクトリの形でRailsアプリケーションをリリースしたい時の設定になります。

環境は以下の通りです。

- Nginx
- Ruby on Rails：v7.1
- Ruby：3.2
- puma

:::note warn
この記事では便宜的にドメイン名を`example.com`、アプリケーション名を`ec-site`という名前にしています。
:::

# Nginxの設定
Nginxのファイルを以下のように設定してください。
ただし、`example.com`と`ec-site`に関しては、ご自身の環境に合わせて変更してください。

```nginx:rails.conf
client_max_body_size 2G;

upstream app_server {
  server unix:///var/www/ec-site/current/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name example.com;
  keepalive_timeout 5;
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  root /var/www/ec-site/current/public;

  location ^~ /ec-site/assets/ {
    gzip_static on;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @app_server;

  location /ec-site/ {
    proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;
  location = /500.html {
  }

  location = /sitemap.xml.gz {
  }

  location = /robots.txt {
  }

  location = /favicon.ico {
  }
}
```


## credentialsに以下の設定を追加
サブディレクトリを変更したいとなった際に、変更が面倒になるので以下のようにcredentialsにサブディレクトリを指定する。
※情報的にcredentialsじゃない方がいいかもしれないので、適宜読み替えてください。

```jsx
app:
  relative_url_root: /ec-site
```

## environmentsファイルへの設定反映
`environments/production.rb`と`environments/development.rb`に以下の設定を追加してください。

```rb:environments/production.rb、または、environments/development.rb
# ディレクトリのルートをサブディレクトリに指定
config.relative_url_root = Rails.application.credentials.dig(:app, :relative_url_root)

# assetsの場所をサブディレクトリに指定
config.assets.prefix = "#{Rails.application.credentials.dig(:app, :relative_url_root)}/assets"
```

## config.ruへの設定反映

`config.ru`を以下の内容に変更する

```rb:config.ru
# This file is used by Rack-based servers to start the application.

require_relative "config/environment"

RAILS_RELATIVE_URL_ROOT = Rails.application.credentials.dig(:app, :relative_url_root)

if RAILS_RELATIVE_URL_ROOT.present? then
  map RAILS_RELATIVE_URL_ROOT do
    run Rails.application
    Rails.application.load_server
  end
else
  run Rails.application
  Rails.application.load_server
end
```

これでサブディレクトリの設定ができたと思います。

ローカル環境では
`localhost:3000/ec-site`
というURLで開かれることになります。

# 参考文献（圧倒的感謝）

https://mgre.co.jp/blog/3518

https://qiita.com/61503891/items/732d9c123c39e35e97eb

https://www.ccbaxy.xyz/blog/2020/03/28/ruby35/
i9 13900kf不具合対策でBIOSアップデートをする

不具合の内容は「Intel Default Settings」でググってください
私のCPUはまだ元気に動くので対策で…

# 前提
* インテルの13th,14thのK付きCPU
* ProArt Z790-CREATOR WIFI
* Ubuntu22.04 

# マザーボードのBIOSをバージョンアップのUSBを作成

* 下記からBIOSをダウンロードする

https://www.asus.com/jp/motherboards-components/motherboards/proart/proart-z790-creator-wifi/helpdesk_bios?model2Name=ProArt-Z790-CREATOR-WIFI

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/3667df2d-0d01-2edb-2315-bf78234a95d8.png)

Intel Default Settingsが対応しているBIOSをダウンロード
（2024/7/4時点）


* USBメモリーをFAT32でフォーマット
    * ディスクを起動
    * USBメモリーを選択
    * 「ー」でパーティションを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/d3476abc-e72e-54e8-3828-7fa8f378be0d.png)
    * 「削除」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/e22b7d59-d468-edbf-ead1-b79fb09c7125.png)
    *　「+」でパーティションを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/50262c01-5d1a-7bd8-8590-e1964970f47e.png)
    * 　「次へ」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/f63342ca-e9df-483d-752c-96d538b0c6dd.png)
    * 「FAT」を選択して「作成」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/bbb609b0-f74a-5f97-78e6-b6b8a76d70f6.png)

* ダウンロードしたBIOSを展開するしてUSBメモリーにコピー
    * ProArt-Z790-CREATOR-WIFI-ASUS-2302.zipを右クリックで「ここに展開」を選択
    * 展開後の「ProArt-Z790-CREATOR-WIFI-ASUS-2302」のフォルダーに移動
    * 「ProArt-Z790-CREATOR-WIFI-ASUS-2302.CAP」をコピーする
    * USBメモリーの直下に「ProArt-Z790-CREATOR-WIFI-ASUS-2302.CAP」を貼り付け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/2a365c4c-4555-5345-172f-4c583c726a3e.png)

* Ubuntu22.04をシャットダウン
# BIOSのアップデート
* 電源を入れて「DEL」を連打
* BIOSが起動したら「詳細設定モード」をクリック
 ![P_20240704_120631.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/9bccb5f3-24f8-4830-b850-6fea071a7731.jpeg)
* 「ツール」タブから「ASUS EZ Flash 3　ユーティリティ」をクリック
![P_20240704_121944.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/46a591bd-710f-a5f7-34e2-52f1b0d29041.jpeg)

* USBメモリーを選択して「ProArt-Z790-CREATOR-WIFI-ASUS-2302.CAP」を選択　
![P_20240704_122024.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/78f0abeb-4b26-fcc6-77ef-5978aa99deed.jpeg)
　
![P_20240704_122059.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/f599c7d0-7cea-8036-77f8-7536b894d16b.jpeg)

* 「YES」を選択
![P_20240704_122115.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/6e56b294-9fc9-aaeb-1b54-16e0a53b158f.jpeg)
* 「YES」を選択
![P_20240704_122143.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/b160af98-fda3-c5c0-8862-f5a6335bf1fc.jpeg)
* 「YES」を選択
![P_20240704_122155.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/83fcd4b0-286c-3683-a349-9d9abe42cc67.jpeg)
何回か再起動するので待つ（結構時間がかかる）


# 確認
BIOSを起動し「詳細設定モード」の「Ai Tweaker」に「Intel Default Settings」が追加され選択されていれば完了

![p_20240704_124724.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295814/367f2d5b-f418-90d0-9bd6-0ce65a28564e.jpeg)
アンチパターンのWikiが思いのほか面白い

## はじめに
アンチパターンを調べたときにたまたまWikipediaを読みました。思いの外面白かったので紹介します。知らないアンチパターンばかりだったのと翻訳後の日本語が面白いので是非読んでみてください。

https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

## アンチパターンとは

アンチパターン（Anti-pattern）とは、ソフトウェア開発やシステム設計の領域において、一般的には悪い結果をもたらすと知られている設計、実装、行動、または管理の手法を指します。アンチパターンは、初めは良い解決策に見えることが多いですが、時間が経つにつれて問題を引き起こすことが多い。

## アンチパターンの特徴
・ 一見、効果的に見える
一見良いアイデアや解決策のように見えるが、詳細に検討したり、実際に適用してみると問題が発生する。

・ 長期的にみて悪影響が発生
短期的にはうまく機能するかもしれないが、長期的にはメンテナンス性の低下やパフォーマンス問題などの悪影響が現れる。

・ 経験不足や知識不足から発生
経験の浅い開発者や設計者が陥りやすく、適切な設計原則やベストプラクティスを知らないために発生することが多い。

## 個人的面白いアンチパターン名ランキング

### 5位 閻魔の組織管理
異議を許さない、独裁的な組織管理方法

### 4位 貧血ドメインモデル (Anemic domain model)
ビジネスロジックが欠けたドメインモデル。オブジェクトは属性と振る舞いを持たなければならないので、オブジェクト指向プログラミングではない

### 3位 神オブジェクト (God object)
設計の一部分（クラス）に、過剰に機能を集中させること

### 2位 暗室栽培 （mushroom management）
部下に情報を伝えなかったり、誤った情報を伝える(暗所で栽培する)

### 1位 システムのおんぼろ煙突化 (stovepipe system)
複雑に相互関連したコンポーネントからなる、メンテナンスが困難なシステム


## まとめ
言葉にしたくなるものばかりでセンスを見せつけられました。先人が見つけたアンチパターンを再現しないように意識したいです。何故かゼルダの伝説のボスを思い出しました。

https://gamepedia.jp/zelda-ocarina/archives/category/%E3%83%9C%E3%82%B9%E6%94%BB%E7%95%A5

## 最後に
私の働いている会社で経験の有無を問わず採用を行っています。
興味のある方は是非カジュアル面談から応募してみてください！

https://jambo-support.com/recruit_engineer/
[解決済み]syntax error, unexpected token "endif", expecting end of file

[解決しました](#解決20240705)

```:環境
PHP 8.3.7
Laravel 11.6.0
```

# 問題
どこにも`@endif`が欠けていないのに`syntax error, unexpected token "endif", expecting end of file`というエラーが出る。
```diff_php:profile-post.blade.php
<x-profile :sharedData="$sharedData" doctitle="{{$sharedData["username"]}}'s Profile">
  <div class="list-group">
    @foreach($posts as $post)
    <a href="/post/{{$post->id}}" class="list-group-item list-group-item-action">
      <img class="avatar-tiny" src="{{$post->user->avatar}}" />
      <strong>{{$post->title}}</strong> on {{$post->created_at->format("Y/n/j")}}
    </a>
-   @endforeach
  </div>
</x-profile>
```

# 試み
- GPTで全てのファイルを参照し`@endif`が欠けていないか確認
- 念の為目視でも確認
- 誤字脱字確認
- Laravelキャッシュクリア、Laravelの再起動
- `@isset`、`@foreach`なども欠けていないか確認
- [こちらの記事](https://qiita.com/takezone/items/7b953f2d62e5be32b398)に書いてあったような構文チェック

# 多分…
ページタイトルを自動で変えるようにissetを使っていたところ、個々のポストでは正常に動作したのだがプロフィールページを構ったらこのエラーが出てしまった。
なのでおそらく`profile.blade.php`もしくは`profile-post.blade.php`に問題があるんだと思う。
もっと頭を柔らかく考えれば切り分けができて特定もできるんだろうが、今は難しい…。

# ブログ
コードブロックの強調したい箇所やエラー箇所などに帯をつけるやつ、やってみたかったからできて嬉しい。

# 解決(2024/07/05)
シングルクォーテーションとダブルクォーテーションのミスだった。

`<x-profile :sharedData="$sharedData" doctitle="{{$sharedData['username']}}'s Profile">`
元は`"username"`(ダブル)としていたが、教材と見比べて`'username'`(シングル)にしたらエラー解消された。
なおそこ以外のクォーテーションは構っていない。
AWS 料金管理サービス&コスト最適化サービス

AWSでは従量課金制でサービスが提供されていますが、どれも複雑で手動で管理するのは困難です。そのためAWSでは料金管理サービスが提供されています。本記事では料金管理サービスとコスト最適化サービスについて説明していきます。
## AWS Billing and Cost Management
### AWS Cost Explorer
月額コスト予測分析ができるサービスです。無料で利用できます。
### AWS Budgets
予算を設定して越えそうになった場合アラートを受けることができるサービスです。複数の予算タイプ（コスト、使用量、RIの利用率、RIのカバー率）を監視する場合や、カスタムアラートを多く設定する場合に料金が発生します。
### AWS Cost and Usage Report (CUR)
AWS のコストと使用量に関する詳細なデータを提供するサービスです。無料で利用できます。
### AWS Cost Anomaly Detection
機械学習を使用して異常なコストのパターンを検出し、通知を送信するサービスです。無料で利用できます。
### AWS Pricing Calculator
AWS サービスのコストを見積もるためのツールです。無料で利用できます。
### Savings Plan
1年間または3年間の指定量のコンピューティング処理を使用すると引き換えに、オンデマンド料金を超える削減を提供するサービスです。無料で利用できます。
### Cost Optimization Hub
AWS請求情報とコスト管理機能で、AWSアカウントとAWSリージョン全体でコスト最適化のレコメンデーションを統合して優先順位を付けることで、コストパフォーマンスを最大にするためのサービスです。無料で利用できます。
### Cost Categories
コストカテゴリでは、コストを意味のあるカテゴリにグループ化するルールを作成し、請求情報を整理するサービスです。無料で利用できます。
## Trusted Advisor
コスト最適化、パフォーマンス、セキュリティ、フォールトトレランス、サービス制限に関する推奨事項を提供します。利用料金はありませんがサポートプランによって使用できる範囲が異なります。ビジネス、エンタープライズon-ramp、エンタープライズではすべての機能が利用できまが、ベーシック、開発プランでは一部しか利用できません。
## AWS Compute Optimizer
使用しているリソースが最適か教えてくれるサービスです。EC2、EBS、RDS、ECSのチェックに使用できます。無料で利用できます。
## AWS Data Exports
ベーシックSQLに料金管理情報を出力できるサービスです。サービス料金は出力先によって異なります。
## 参考文献
https://docs.aws.amazon.com/ja_jp/cost-management/latest/userguide/cost-optimization-hub.html
https://docs.aws.amazon.com/compute-optimizer/latest/ug/what-is-compute-optimizer.html
https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/billing-what-is.html
https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/manage-cost-categories.html
Datadogでシステムの遅延処理を判断したい

## 今回やりたいこと
特定画面のレスポンスの悪さに関する問合せが多く、
品質向上の１つとして、潜在化している遅延処理を洗い出してほしいと依頼がありました。
なので今回はDatadogを使って該当箇所を探す取組みについて
自分はインフラ担当では無いので、調べながらこの記事を書くことにしました。

## Datadogとは
インフラ監視、アプリケーションのモニタリング、ログ管理などによって
システム運用のトラブル調査、最適化するためのサービスのこと

## 遅い処理を判断する機能があるか
Datadogの公式Doc「遅いトレースやエンドポイントを調査する」

https://docs.datadoghq.com/ja/profiler/connect_traces_and_profiles/

`
本番環境においてアプリケーションのパフォーマンスに問題がある場合、
分散型トレーシングとプロファイリングによるコードスタックトレースのベンチマークを統合することで、
パフォーマンスのボトルネックを特定する強力な方法となります。
APM分散型トレーシングと Continuous Profiler の両方が有効になっているアプリケーションプロセスは、
自動的にリンクされます。
`
<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/c381d7d7-af2b-efc3-6598-e3c3d7fc11f0.png)

<br>

**claudeに解説してもらう**

>分散型トレーシング：アプリケーション内のリクエストの流れを追跡します。
>プロファイリング：コードの各部分の実行時間を測定します。
>これらを組み合わせると、パフォーマンスの問題がどこにあるかを正確に特定できます。
>Datadogでは、APM（アプリケーションパフォーマンスモニタリング）の分散型トレーシングと
>Continuous Profilerを有効にすると、自動的にこれらのデータがリンクされます。
>
>この方法を使うことで、開発者はアプリケーションの遅い部分を素早く見つけ出し、
>効率的に改善できるようになります。

要するに、
リクエストの流れの追跡と、実行時間の計測を、
DatadogのAPM分散型トレーシングと、Continuous Profilerを有効にすることで可視化できて
遅い処理を判断できるんだと思います（理解度30%）


## 実際にやってみる
APMのトレーシング？は既にAPM→Tracesから見れるようでした
（設定方法調べに来た人居たら申し訳ない…）

対象はAPIとSQL、外部API連携箇所
Durationを見ると１時間でかなりの数がありました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/efb742a0-5df3-495f-23c4-3e112af7bc66.png)


claudeにリスト化を依頼

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/fe3e5830-1e19-18f4-bf33-6ebc7b51c131.png)

API名が、80万件あるテーブル名を含んでいるものが多いので、
ここで挙げたAPIの中で、該当テーブルを参照するSQLのチューニングをやるべきだと考えました。
DB側での対応は難易度高いので一旦無し…（自分の技術力の低さ😇）

SQLでも同じく、時間の掛かっているものを一覧化します。
SQLはループで実行時間が遅くなる可能性もあるので、duration１秒以上を対象にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/dfd826e4-736f-9171-9013-7d524013fded.png)

## まとめ
APIとSQLともに同じようなものが遅くなっている様子です。
なので、今回はデータが非常に多いテーブルに対しての操作が時間掛かっていると想定して
該当API、該当SQLの調査・修正に入りたいと思います。
SQLチューニングであまり変わらない場合は、
画面側のデータの取得方法を変えたりなど検討します。

ちなみに、「Continuous Profilerを有効にする」について、有効になっていなかったのですが
トレーシングで、ある程度洗い出しできたので今回はやりませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760274/612ba7b8-5235-27b2-88d2-2f818ff3b93d.png)
【備忘録】OpenSSH9.8へのアップデート

脆弱性があったので9.8p1にアップデートします
https://security.sios.jp/vulnerability/openssh-security-vulnerability-20240701/

# 環境
rhel8.8
OpenSSH 9.6p1

# 手順

## ①サーバーのバックアップを取得
何かあっても戻せるようにしておきます

## ②sshdプロセス停止
```
systemctl stop sshd
systemctl status sshd
```
→停止を確認
## ③wgetインストール
```
yum install wget
```

## ④OpenSSHアップデート（今回は9.8へ）
以下サイトから必要なものを
https://rpmfind.net/linux/rpm2html/search.php?query=openssh&submit=Search+...&system=&arch=
https://rpmfind.net/linux/rpm2html/search.php?query=openssh-clients&submit=Search+...&system=&arch=
https://rpmfind.net/linux/rpm2html/search.php?query=openssh-server&submit=Search+...&system=&arch=

```
cd /home/ec2-user/openssh/OpenMandriva/openssh/
wget https://rpmfind.net/linux/openmandriva/cooker/repository/x86_64/main/release/openssh-9.8p1-1-omv2490.x86_64.rpm
wget https://rpmfind.net/linux/openmandriva/cooker/repository/x86_64/main/release/openssh-clients-9.8p1-1-omv2490.x86_64.rpm
wget https://rpmfind.net/linux/openmandriva/cooker/repository/x86_64/main/release/openssh-server-9.8p1-1-omv2490.x86_64.rpm
```
 ```
yum install openssh-9.8p1-1-omv2490.x86_64.rpm  openssh-clients-9.8p1-1-omv2490.x86_64.rpm  openssh-server-9.8p1-1-omv2490.x86_64.rpm
```

## ⑤sshd再起動
```
systemctl daemon-reload
systemctl start sshd
systemctl status sshd
```
→起動を確認
## ⑥バージョン確認
```
ssh -V
rpm -qa |grep openssh
```
→9.8であることを確認

## ⑦動作確認
・ サーバを再起動してSSH接続できること
・ 他のサーバに対してSSH接続できること
・ /etc/ssh/sshd_configファイルが変更されていないこと
flutter 入門

## 目的
* Flutterの開発環境を構築する
* 入門プロジェクトを作成して、起動する

## flutter の開発環境構築
1. Visual Studio Codeのインストール
1. Flutter SDKのインストール
  https://docs.flutter.dev/get-started/install/windows/mobile#141-tab-panel
  ※インストーラーではないので、任意の場所に展開してからPathを通しておく
  ↓VScodeにFlutterのプラグインを追加
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/eeeacd0b-f0d2-6bed-8674-5fab52e7c883.png)

1. Android Studioのインストール
  https://developer.android.com/studio?hl=ja#get-android-studio
1. Android Studioを起動して、SDK Managerから
  ↓「Android SDK Command-line Tools(latest)」をインストール
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/72ffd826-dbdb-305d-bb85-d80c7533f846.png)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/32b5ccb9-49a0-342f-599d-9a2152cd4cc3.png)
1. Visual Studio 2022（コミュニティ）のインストール
  https://visualstudio.microsoft.com/ja/thank-you-downloading-visual-studio/?sku=Community&channel=Release&version=VS2022&source=VSLandingPage&passive=false&cid=2030
  ↓「C++によるデスクトップ開発」を含める
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/85780dbf-4212-4b6f-c069-414d1b443e2c.png)
  ↓ただ、ひたすらに待つ
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/070fd859-bf5f-b774-1cd2-5e998acae764.png)





---

## 開発環境の確認
1. VScodeを起動
1. ターミナルを開く
1. ``` flutter doctor ```を実行
  ↓こんな感じになればOK（ダメな個所が有ったら、説明に従ってインストールし直す）
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/a5b635ce-48b6-cf83-5204-a7607a8ba0bf.png)

## プロジェクトを開始する
1. 任意のフォルダで``` flutter create [ProjectName] ```を実行
  ↓プロジェクト名は「test_app」とした。　注）使用できる文字は[a-z0-9_]のみ
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/38df3b6b-ad02-15ee-18c8-85b9758ea5e6.png)
1. ディレクトリの移動 ``` cd test_app ```
1. Windows版で起動 ``` flutter run -d windows```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/84ecd013-279a-f5b9-8268-82633f5b2df6.png)
  ↓こんな画面が表示されればOK
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/f4257de0-aec6-f6a0-d3eb-a5ca824f0f03.png)
1. Web-server版で起動 ``` flutter run -d web-server ```
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/3b5dfd03-9e6c-21be-bc86-158ace061da5.png)
  ↓コンソールに表示されている通り```  http://localhost:51468 ```にChromeでアクセス
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526027/cc898cff-cee9-e7e9-bc09-fe51e9d160b7.png)
GAS Webカメラの写真をDriveに保存する

GASでコードを作成し、Webアプリとしてデプロイする。
・カメラが起動する
・Take Photoを押すと、写真がグーグルドライブに保存される

```javascript:コード.gs
function doGet() {
  return HtmlService.createHtmlOutputFromFile('index')
      .setTitle('Webcam App');
}

function saveImage(imageData) {
  var decoded = Utilities.base64Decode(imageData.split(',')[1]);
  var blob = Utilities.newBlob(decoded, 'image/png', 'webcam_image.png');
  
  var folder = DriveApp.createFolder('Webcam Images');
  var file = folder.createFile(blob);
  
  return file.getUrl();
}
```

```HTML:index.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <title>Webcam App</title>
  </head>
  <body>
    <h1>Webcam App</h1>
    <div id="error-message" style="color: red;"></div>
    <video id="video" width="640" height="480" autoplay></video>
    <button id="snap">Take Photo</button>
    <canvas id="canvas" width="640" height="480"></canvas>
    <div id="save-message"></div>
    
    <script>
      const video = document.getElementById('video');
      const canvas = document.getElementById('canvas');
      const snap = document.getElementById('snap');
      const errorMessage = document.getElementById('error-message');
      const saveMessage = document.getElementById('save-message');
      const context = canvas.getContext('2d');

      function startWebcam() {
        navigator.mediaDevices.getUserMedia({ video: true })
          .then(function(stream) {
            video.srcObject = stream;
            errorMessage.textContent = '';
          })
          .catch(function(err) {
            console.error("An error occurred: " + err);
            errorMessage.textContent = "カメラにアクセスできません。権限を確認してください。";
          });
      }

      startWebcam();

      snap.addEventListener("click", function() {
        context.drawImage(video, 0, 0, 640, 480);
        const imageData = canvas.toDataURL('image/png');
        google.script.run
          .withSuccessHandler(function(url) {
            saveMessage.innerHTML = '画像が保存されました。<a href="' + url + '" target="_blank">こちら</a>から確認できます。';
          })
          .withFailureHandler(function(error) {
            saveMessage.textContent = '画像の保存に失敗しました: ' + error;
          })
          .saveImage(imageData);
      });
    </script>
  </body>
</html>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/846921cb-d999-0697-e4ff-0dcdcd6d000d.png)
UE5勉強日記 TObjectPtr

TObjectPtrは普通のpointerより安全でobjectのpointer管理できる。
Blueprintで使えない問題がるが、
下記のように使うことができる。
TObjectPtr<AActor> TOP;
Actor* Actor;
TOP = Actor;

blueprintからActor* Actorを送って、
C++でTObjectPtrデータを記録することができる
【Vket Cloud】2Dアクションゲームの作り方

::: note info
本記事は、VR法人HIKKYのorganization下のQiita/Zenn両方に投稿しております。

本記事に掲載されている情報はVketCloudSDK12.3.4のものです。
バージョンにより見た目や表示情報が変化する場合がございます。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/2f8e2502-4594-3bdd-dba5-8f55ebc5e89a.png)

VketCloudにおける2Dアクションゲームの作り方について一例を紹介したいと思います。

現在のVketCloud SDKでは3Dアバターの移動は移動とジャンプしかできず任意のアクションをさせることが難しいです。
そこで思いついたのが2Dゲームにして左右移動＋ジャンプのみにすれば下入力をアクションボタンとして使えるのでは？というところからスタートしました。

本ゲームでは[A][D]キーを左右移動、[W]キーをジャンプ、[S]キーを攻撃に割り当てています。

:::note warn
本作はすべてHeliScriptで開発しています。
本記事を参考にするにあたりHeliScriptおよび基本的なゲームプログラミングの知識が必要です。
:::

# キー入力判定方法

2Dアクションゲームを作るにあたってのポイントはどうやってキー入力判定を取得するかです。
現在のSDK（12.3.4）ではキー入力を直接取得することはできません。
そこで思いついたのは『3Dアバターの移動量を元にキー入力があったと判定する』ことです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/93c82bff-e4b1-8188-cb59-f3ba4465c4a9.png)

上記画像はUnityのシーンビューですが、2Dマップの下に広大な3Dアバターが移動する床があります。
2Dゲームでプレイヤーを操作している裏で3Dアバターはこのマップを延々と移動し続けているわけです。

具体的なキー入力の判定方法についてですが、
```
現在のX座標 > 前のフレームのX座標
```
というような条件となっており、条件が成立していれば右に入力があった、と判定しています。

キー入力さえ取得できてしまえばあとは自由です。
キー入力判定を元にプレイヤーのHEOオブジェクトを移動させる、という処理で2Dプレイヤーを移動させています。

自由の代償にプレイヤーの挙動はすべて自前で実装する必要があるので地味に大変ですが。

:::note warn
初期の想定ではWASDのほかにスペースキーも判定に使用したかったのですが、カメラ内に3Dアバターが映っていないとき3Dアバターはジャンプしない、というエンジン側の仕様によりスペースキーの入力判定が取得できず断念しました。
:::

# 2Dプレイヤーの当たり判定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/4e4b2148-8cf2-7533-a454-3201b7cac740.png)

特に苦労するのが2Dプレイヤーのマップとの当たり判定でしょうか。
3Dアバターの移動であればVketCloud側がすべて計算してくれます。
しかし自由を求めた代償によりその機能を使うことはできずすべて自分で実装するしかありません。

本ゲームではすべての当たり判定はシンプルに矩形によって行っています。
進んだ先に矩形あれば進まない、というごくごくシンプルなものです。
具体的なコードと考え方については下記の記事を参照するとよいかと思います。

https://2dgames.jp/hit-test-2d/ 

https://javascript-game.com/collision-basic/ 

地形との当たり判定だけではなく、プレイヤーと敵、プレイヤーの攻撃と敵などすべての当たり判定を同様に行っています。

# 2Dマップ
2Dマップは図のようにUnity上ですべて配置しています。
敵の配置なども視覚的にわかりやすようにざっと並べています。
赤枠は当たり判定用の自作コライダです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/0a359490-4c04-23eb-56c8-6749551dfbcf.png)
このマップを2Dプレイヤーの移動に合わせてカメラも移動させて画面スクロールしているように見せています。

# 2Dキャラのアニメーション

2Dキャラのアニメーションはスプライトシートを作り、一定時間ごとにUVのオフセット位置をずらすことでスプライトアニメーションをさせています。※GIFアニメと同じです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3763860/2974f46c-4ddb-237c-26f5-eb50bc29c4a5.png)

１モーションごとにHEOオブジェクトを作りSetShowで切り替えを行っています。

# まとめ

以上が2Dアクションゲームの作り方の一例となります。

2Dゲームはアクションボタンを設けることができるため非常に自由度が高いものが作れるようになります。
その反面、自作で補わなければならないことも多いので結構大変です。

しかし可能性は無限大なのでぜひ参考に2Dゲームを作ってみてもらえたらうれしいです。

## Vket Cloudについて

ブラウザからアクセスできる“Webメタバース”を作成するサービスです。 Vket Cloudで制作された空間は、アプリレスでWebブラウザから簡単にアクセスできるため、プラットフォームの制限の中で限られたユーザーにだけでなく、インターネットに存在するすべてのユーザーに対してオープンなコンテンツ・サービスを届けることが可能です。

https://cloud.vket.com/