OmniAICreator/Qiita-1.07M huggingface dataset:
未経験エンジニアが短縮URLが作れるクソアプリを作りました🤷‍♂️

<p class="codepen" data-height="600" data-default-tab="result" data-slug-hash="XWvLKxp" data-pen-title="クソ短縮URL" data-user="04" style="height: 600px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/04/pen/XWvLKxp">
  クソ短縮URL</a> by John Doe (<a href="https://codepen.io/04">@04</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# クソポイント1 ドス攻撃すると落ちる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3863976/42ec287b-a7f9-72ef-134a-5acd3ff06039.png)


# クソポイント2 ReactJSを使っていない

格下のVue.jsを使っている

# クソポイント3 UIに説明がない

どう使っていいかわからない

# まとめ

いかがでしょうか←クソ
YOLOXとZED SDK とを連動させてみた

## 主旨
StereoLabs のZE2カメラを使って、検出結果をZED SDKの点群との連動を可能にするコードを書いた。
その経緯を書いた。

## ZED SDK のCustom Detectorの状況
ZED SDKと物体検出との連動は、StereoLabsのユーザーのほとんどが願っていることだと思います。
また、その物体検出のライブラリが商業利用可能なライブラリであることを願っていると思います。
ただ、現時点でのcustom detectorにあるYoloはAGPL-3.0 License: です。
https://github.com/stereolabs/zed-sdk/tree/master/object%20detection/custom%20detector/python

そのため、それらのYOLOでは、商業利用ができないという制限が加わってしまいます。

## 対策
- そこで、MIT LICENSE であるYOLOX とのbinding を作成した。

## 開発手順
- CUDAの使えるマシンを確保する。
- Jetson AGX Orinを使用した。
- YOLOXをDocker環境で動作させた。
- pytorchのモデルファイルをTensorRTに変換する。
- 変換したTensorRTにモデルを使って推論するように書き換える。
- ZED SDKで取得した画像からYOLOXでの検出を動作させた。
- 参照するcustom detecorのpytorch_yolov8 を用意する。
- それをもとにpytorch_yolox を作る。
- それが動作するように修正する。
- ドキュメントを修正する。
- Docker環境を使わないで直接インストールしても動作するように改変する。

## 公開手順
- ドキュメントを英語に書き換える。
- 商用利用もできるライセンスで、StereoLabs のZED-SDKと整合性のよいライセンスを設定する。
- StereoLabsでZED SDKに含めやすいようにフォルダ構成などを修正する。

## 公開するメリット
- ZED SDK のバージョンが上がるたびに、自分で対応する必要がなくなる。
- OSS化してあれば、組織を移動しても自由に使える。
- 利用しているプラットフォーム、3Dカメラに着目する人が増える。
- 書き捨てじゃないちゃんとしたコードを書く訓練になる。

## 公開先
https://github.com/katsunori-waragai/yolox-zed-sdk


## もっと改善したいところ
- OpenGL での表示を有効化させたい。
freeglutのエラーが解読できていない。
- PyPI に登録されていないものをpip install でgit+https:でなんとかしたい。
Cognito で登録後に発火しS3にフォルダなどを作る方法

## やりたいこと
- cognitoで登録が終わった後にUserに対応するディレクトリを特定のS3に作成したい

## 方法

### cognito側の準備
cognitoでuser poolを作りたいように作成します。
ほかの方の解説も多いので割愛します。

`今回は、諸々の設定が面倒臭いのでHostedUIを利用します。`
特に自作の画面でも問題ないですが、自作の画面はうまく認証を通すのが難しいので今回はこれで、、、

HostedUIの設定方法です。
`作成したUserPool`＞`アプリケーションの統合`タブ＞`アプリクライアントと分析 (1) `
ここに、UserPoolを作成したときに作成したはずのアプリケーションがあります。

そこをクリックした画面を下がると、以下のようなものがあるはずです。
何も設定されていない場合は、適宜設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/8a2e215e-1014-1d0e-3e7b-6b8c08a4fc81.png)

また、好きなドメインも設定しておきましょう。お試しであればcognito ドメインを利用すれば問題ないはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/246a0b4f-32d2-7141-7ab6-8f6ed6968bc8.png)

### S3の準備

全部デフォルトでまずは作成します。

以上

### Lambdaの準備

```js:lambda
import { S3 } from '@aws-sdk/client-s3';

const s3 = new S3();
const CONTENT_BUCKET = process.env.CONTENT_BUCKET || 'test';

export const handler = async (event, context) => {
  try {
    await s3.putObject({
      Bucket: CONTENT_BUCKET,
      Key: `debug-logs/cognito-events/${Date.now()}.json`,
      Body: JSON.stringify(event, null, 2),
      ContentType: 'application/json'
    });

    console.log('Event logged successfully');
    return event;
  } catch (error) {
    console.error('Error:', error);
    return event;
  }
};
```

簡単にS3にデータを保存するだけのLambdaです。
とりあえず今はeventのものを全部入れて日付をファイル名にしています。

cognitoで生成されるユーザー名はuserNameに入っているので、実際のディレクトリ名などはそこからとる感じです。

**Lambdaのアクセス権の設定**

`作ったlambda`>`設定`>`アクセス権限`>`実行ロール`で実行しているロールをクリックできるのでロールに飛びましょう

そうするとロールがあるのですが、現状はS3に書き込む権限などが足りません。

`許可を追加`>`インラインポリシーを作成`をクリックして、ポリシーエディタに行きます。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::XXXXXXXXXXXXXXXXXXXXXXXX/*"
            ]
        }
    ]
}
```

とりあえずは、こちらで大丈夫ですが必要に応じて権限を絞るようにしてください。
取得など必要なかったら消してしまってください。

ここまで設定できればほとんど終了です。
元からLambdaでS3を操作したことがある人であれば見る必要もない部分でしたね、、、

### Cognitoのサインアップで発火するようにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/1a6918ff-68d0-fcb8-eac2-78742e6d2eb2.png)

cognitoのユーザープールのプロパティまで行くと、Lambdaトリガーがあるのでそれを利用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/ecbdc071-93e4-158e-071f-648747350a8e.png)

今回は、サインアップ後のトリガーを利用することで、サインアップが成功したタイミングでLambdaが発火するように設定できます。
もし複数のLambdaが発火する必要がある場合は、cognitoでは設定できないようなので工夫が必要そうです。

先ほど作成した関数を選択して保存すると設定は終了です。

### 試してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3125890/5ebce6fe-a859-d4b0-b1dc-5116d6863c2c.png)

ここまで行くと簡単にサインアップ画面に行くことができるので、サインアップを試してみましょう。
ホストされたUIを表示して、必要な情報を入力することでLambdaの発火が確認できるはずです。

うまくいかない場合は、クラウドウォッチなどを用いて確認してみてください。

## まとめ
100忘れる予感がしたので作成したが、誰かの助けになれば幸いです。
【Laravel】 ネストしたCollectionの複数条件によるsortByメソッドの使用

環境：Laravel11.3.1

# はじめに
ネストしたCollectionを複数条件でsortByする必要があり、少してこづったので備忘録としてまとめます。内容としては公式ドキュメントの内容をかみ砕いたものになります。

# 公式ドキュメント（Readoble）による実装方法
[Readoble：sortByメソッド](https://readouble.com/laravel/11.x/ja/collections.html#method-sortby "Readouble sortBy")

公式ドキュメント（Readoble）より抜粋
```php
$sorted = $collection->sortBy([
    fn (array $a, array $b) => $a['name'] <=> $b['name'],
    fn (array $a, array $b) => $b['age'] <=> $a['age'],
]);
```

ネストされたCollectionを複数条件で並び替えを行う際は上記のメソッドを柔軟に使用することで、複雑な条件でも並び替えが可能になる。

まずは、上記のメソッドについてもう少しかみ砕いてみます。
まずは、昇順と降順の理解から。

昇順で指定する場合は、以下`$a<=>$b`とする。
```php
    fn (array $a, array $b) => $a['name'] <=> $b['name'],
```
降順で指定する場合は、以下`$b<=>$a`とする。
```php
    fn (array $a, array $b) => $b['name'] <=> $a['name'],
```

なぜこの指定方法でいいのかは、`<=>`がキーとなる。
PHP7から宇宙船演算子`<=>`が導入され、だいたい以下のような意味の演算子である。
```php

if($a > $b){
    return 1
}elseif($b > $a){
    return -1
}else{
    return 0
}
```
詳しくはPHPの[公式ドキュメント](https://www.php.net/manual/ja/migration70.new-features.php#migration70.new-features.spaceship-op)へ


また、アロー関数が使用されているのでこちらについても少しだけまとめておきます。
アロー関数とは無名関数を短く記述するための記法の一つです。
特徴としては以下。
+ functionをfnと表記
+ useを使用する必要がない
+ returnを記載しない
+ 1行しかかけない

```php
    fn (array $a, array $b) => $a['name'] <=> $b['name'],
```
つまり、`=>`のさき`$a['name'] <=> $b['name']`が返り値となっています。

以上を組み合わせることで、ネストしたCollectionも複数条件で、また複雑な条件で並び替えを行うことができます。

# おわりに
機会があれば、コードベースでネストされたCollectionを並び替える処理を投稿できればと思います。
llm study AI(15)

# url
<!--- ~~https://curved-rambutan-a71.notion.site/2024-1a69d8f64c764e35a21b46cf2008a6f6~~--->

Datasets: elyza/ELYZA-tasks-100 
https://huggingface.co/datasets/elyza/ELYZA-tasks-100

Metaの「Llama 2」をベースとした商用利用可能な日本語LLM「ELYZA-japanese-Llama-2-7b」を公開しました
https://note.com/elyza/n/na405acaca130#89354701-66c3-477e-8404-d5ab18eb8ceb

Benchmark Data Contamination of Large Language Models: A Survey
Cheng Xu, Shuhao Guan, Derek Greene, M-Tahar Kechadi
https://arxiv.org/abs/2406.04244v1
https://qiita.com/kaizen_nagoya/items/5c0f5ec56d2cb2d1b4d2

Gemini
https://deepmind.google/technologies/gemini/

LLM講座/Wiki
https://matsuolab-geniac.notion.site/5c26a23bd80c45aa82a7ec3641b9e44a?v=2513065bf0734693ae3de73e39bc5d99

<!--- https://matsuokenllmcommunity.slack.com/archives/C05TFBHQTT3 -->
# huggingface

LLM-jp-3 Pre-trained Models
https://huggingface.co/collections/llm-jp/llm-jp-3-pre-trained-models-672c6096472b65839d76a1fa

google/gemma-2-2b 
https://huggingface.co/google/gemma-2-2b

google/gemma-2-9b 
https://huggingface.co/google/gemma-2-9b

google/gemma-2-27b 
https://huggingface.co/google/gemma-2-27b

google/gemma-2-2b-pytorch
 https://huggingface.co/google/gemma-2-2b-pytorch

google/gemma-2-9b-pytorch
https://huggingface.co/google/gemma-2-9b-pytorch

google/gemma-2-27b-pytorch
https://huggingface.co/google/gemma-2-27b-pytorch

## pytorch
pytorch foundation
https://pytorch.org

Pytorch Begginer Series
https://www.youtube.com/playlist?list=PL_lsbAsL_o2CTlGHgMxNrKhzP97BaG9ZN

dockerで機械学習(23) with anaconda(23)「Deep Learning with PyTorch」By Vishnu Subramanian
https://qiita.com/kaizen_nagoya/items/77d6ee15edd7d6d06470

dockerで機械学習(26) with anaconda(26)「Natural Language Processing with PyTorch」By Delip Rao
https://qiita.com/kaizen_nagoya/items/db46e0f162fa07ec4a30

色(11) いろいろ Countdown Calendar 2021 を満席にする5つの方法
https://qiita.com/kaizen_nagoya/items/8294b80c5fb8499298a9

「ゼロから作るDeepLearning2 自然言語処理編」読書会用資料を　ゼロから作る。現在参考文献確認中。
https://qiita.com/kaizen_nagoya/items/33fb2c66175a25e39559

深層学習五十論文 by 綿岡晃輝 単語帳 shell, awk, 英語(25) docker(101)
https://qiita.com/kaizen_nagoya/items/670d4d332e07fd2e5fc2

dockerで機械学習(30) with anaconda(30)「Advanced Deep Learning with Keras」 By Philippe Remy
https://qiita.com/kaizen_nagoya/items/50aadb404ea67abde623

「R Deep Learning Cookbook」 By Philippe Remy dockerで機械学習(79)AI(66)
https://qiita.com/kaizen_nagoya/items/4d6d4b5d9739bcffbf02



## 
<!--- https://forms.gle/n9e9WbDEyxjSu24D7 -->


# Service
##  google
colab
https://colab.google/?hl=ja

google form

google drive

## Haggin face
https://huggingface.co/
![hugging.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/2150ed49-b7cd-4b38-b3e9-3004e66621f6.png)

#### Website
Tasks
HuggingChat
Collections
Daipy Papers
Posts
Metrics
Languages
Organizations
#### Solutions
Enterprise Hub
Expert Support
Infoerence Endpoints
Hardware
#### Community
Blog Articles
Learn
Discord
Forum
Github


## omnicampus
https://edu.omnicamp.us

提出物管理

演習管理
jupyter notebook

bot


# technical term
LLM Large Language Model
エラー(未解決)　アラームアプリで音が鳴らない　Cloud Text-to-Speech APIにて

## はじめに
コメント付きのアラームアプリを作っています。
エラーは出ていないのですか時間になっても音が鳴らない状態です。

```app/views/alarms/index.html.erb
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>アラーム一覧</title>
  <style>
    body {
      font-family: Arial, sans-serif;
      margin: 20px;
    }
    .alarm-item {
      display: flex;
      justify-content: space-between;
      padding: 10px;
      border-bottom: 1px solid #ccc;
    }
    button {
      padding: 5px 10px;
      cursor: pointer;
    }
  </style>
</head>
<body>
  <h1>アラーム一覧</h1>
  <div id="alarmList">
    <!-- 動的にアラームを表示 -->
    <% @alarms.each do |alarm| %>
      <div class="alarm-item">
        <span><%= alarm.alarm_time.strftime('%Y-%m-%d %H:%M') %> - <%= alarm.comment %></span>
        <button onclick="setAlarm()">セット</button>
      </div>
    <% end %>
  </div>
  <button onclick="location.href='<%= new_alarm_path %>'">新しいアラームを追加</button>

<script>
  const alarms = [
    <% @alarms.each do |alarm| %>
      {
        time: "<%= alarm.alarm_time.strftime('%Y-%m-%d %H:%M:%S') %>",
        audioPath: "/alarm_<%= alarm.id %>.mp3",
        comment: "<%= alarm.comment %>"
      },
    <% end %>
  ];

  function checkAlarms() {
    const now = new Date().toISOString().slice(0, 19).replace('T', ' '); // 現在時刻をフォーマット
    alarms.forEach(alarm => {
      if (now === alarm.time) {
        const audio = new Audio(alarm.audioPath);
        audio.play();
        alert(alarm.comment); // 画面にコメントも表示
      }
    });
  }

  // 毎秒アラームをチェック
  setInterval(checkAlarms, 1000);
</script>
```

## おわりに
時間になったら音声で伝えてほしいのですが``Cloud Text-to-Speech API``を有効にして、そこから何をどうすればいいのかわからない状態です。明日も引き続き調べてみて進展させたいと思います。
常に比較対象をもったほうが良いという話

## 自分が使っているモノが正義だと思っていませんか？
"今つかっているモノが使いやすい。最高だ！”と思えるのは幸せです。が、それが本当に幸せなのか？を検証するには、比較対象が必要です！というポエムです。
## 競合するテクノロジーを使ってみましょう
例えば、macOS好きならWindowsを、iOS端末好きならAndroidを、AWS好きならAzureを日常的に使ってみませんか？

自分が好きなテクノロジーが最高！であってほしい気持ちは想像できます。しかし、自分の好きなテクノロジーが客観的にみて、最高なのか、他テクノロジーより劣っているのか、は、比較してみないとわかりません。

比較によって、自分の好きなテクノロジーの良さを再認識するケースもあるでしょうし、自分の好きなテクノロジーがあまりイケてないケースもあります。

イケてないケースの認識は自身の成長に繋がります。

常に比較対象をもったほうが良い！というのはそういうことです。
地域防災サイトを作成する記録（第２回）

# 今回実装する機能
ユーザー認証
目的：匿名での誤情報拡散を防ぐため、登録ユーザーのみが情報を投稿できるようにする。

# 1. Deviseのインストール
Gemfileに以下を追加してインストールします。
```ruby: ruby
gem 'devise'
```
その後、以下のコマンドを実行します。
```ruby: bash
bundle install
rails g devise:install
```
# 2 ユーザーモデルの作成
以下のコマンドでユーザーモデルを生成します。
```ruby: bash
rails g devise User
```
生成された `User` モデルは、すでにログインや認証の仕組みが含まれています。
これにより、以下のファイルが作成されます：
・`app/models/user.rb`
・`db/migrate/xxxxxx_devise_create_users.rb`
マイグレーションファイルを編集して、名前と住所フィールドを追加します。
```ruby: db/migrate/xxxxxx_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[6.1]
  def change
    create_table :users do |t|
      # Devise標準のカラム
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      # 追加するカラム
      t.string :name,               null: false
      t.string :address,              null: false

      t.timestamps null: false
    end

    add_index :users, :email, unique: true
  end
end
```
マイグレーションを実行します。
```ruby: bash
rails db:migrate
```
# 3.ユーザー管理画面の設定
`devise`が用意したビューをカスタマイズするために以下を実行します。
```ruby: bash
rails g devise:views
```
生成された`app/views/devise`ディレクトリ内のファイルを編集して、フォームに`name`と`address`を追加します。
```erb: app/views/devise/registrations/new.html.erb
<div class="field">
  <%= f.label :name %>
  <%= f.text_field :name, autofocus: true, required: true %>
</div>

<div class="field">
  <%= f.label :address %>
  <%= f.text_area :address, required: true %>
</div>
```
# 4.ユーザー情報編集機能
デフォルトでは、`Devise`は特定のフィールドのみ編集可能です。追加フィールド（`name`や`address`）を許可するために、**Strong Parameters**を設定します。
`app/controllers/application_controller.rb`に以下を追加します。
```ruby: app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name, :address])
    devise_parameter_sanitizer.permit(:account_update, keys: [:name, :address])
  end
end
```
# 5.管理者権限の追加
管理者フラグをモデルに追加します。
```ruby: bash
rails g migration AddAdminToUsers admin:boolean
```
マイグレーションファイルを編集して、デフォルト値を設定します。
```ruby: db/migrate/xxxxxx_add_admin_to_users.rb
class AddAdminToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :admin, :boolean, default: false
  end
end
```
マイグレーションを実行します。
```ruby: bash
rails db:migrate
```
管理者だけが特定の操作を行えるようにコントローラに条件を追加します。
```ruby: UsersController
class UsersController < ApplicationController
  before_action :authenticate_user!
  before_action :admin_only, only: [:destroy]
  
  def index
    @users = User.all
  end
  
  def destroy
    @user = User.find(params[:id])
    @user.destroy
    redirect_to users_path
  end
  
  private
  
  def admin_only
    redirect_to root_path, alert: "権限がありません" unless current_user.admin?
  end
end
```

以上で今回のユーザー認証の実装になります。



















# 参考文献

https://zenn.dev/m_ole0/articles/c6da054738d0bc

https://egghead.io/lessons/ruby-on-rails-add-custom-fields-to-a-devise-user-model-with-a-ruby-on-rails-migration

こちらは古いめ記事になりますが、参考にしたので、記載させていただきます。
【初心者向け】AWSとGCPの違いを徹底比較！どちらを選ぶべき？

クラウドサービスを選ぶ際、AWS（Amazon Web Services）とGCP（Google Cloud Platform）のどちらを選べばいいか悩む方も多いのではないでしょうか？  
この記事では、それぞれの特徴や違いをわかりやすく解説し、どちらを選ぶべきかの指針をお伝えします！



## 1. **市場シェアと歴史の違い**
- **AWS**：
  - 2006年にサービスを開始し、クラウド業界のパイオニア的存在。
  - 現在、最もシェアが高いクラウドサービスで、企業からスタートアップまで幅広く採用されています。

- **GCP**：
  - 2011年にスタートした後発のクラウドプロバイダー。
  - Googleの技術を活かし、データ分析や機械学習に強みを持つ。

**まとめ**：歴史やシェアの面ではAWSが先行していますが、GCPはAIやデータ分析で独自の地位を築いています。



## 2. **サービスの幅広さ**
- **AWS**：
  - 提供されるサービスの数は200以上と圧倒的に多く、ほぼすべての業界ニーズに対応可能。
  - 例）EC2（仮想サーバー）、S3（ストレージ）、Lambda（サーバーレス実行）など。

- **GCP**：
  - サービス数はAWSより少ないものの、シンプルで使いやすい。
  - 例）Compute Engine（仮想サーバー）、Cloud Storage（ストレージ）、BigQuery（データ分析）など。

**まとめ**：多機能で柔軟性を求めるならAWS、シンプルで効率的な構成が良ければGCP。


## 3. **強みの違い**
- **AWSの強み**：
  - **幅広い機能**：幅広い業界に対応するサービスを提供。
  - **成熟したエコシステム**：豊富なドキュメントやコミュニティサポート。
  - **ハイブリッドクラウド**：オンプレミスとクラウドを組み合わせるAWS Outpostsなど。

- **GCPの強み**：
  - **データ分析**：BigQueryを中心とした大規模データ処理が得意。
  - **AI/機械学習**：TensorFlowやAI Platformなど、GoogleのAI技術を活用。
  - **ネットワークの速さ**：Googleのグローバルネットワークを活かした高い通信速度。

**まとめ**：AIやデータ分析ならGCP、汎用性やエンタープライズ対応ならAWSが適しています。



## 4. **価格モデルの違い**
- **AWS**：
  - リソース使用量に応じた従量課金制が基本。
  - 一部のサービスには長期利用割引（Reserved Instances）やスポットインスタンス（余剰リソースの安価な利用）もあり。

- **GCP**：
  - 従量課金制を採用しつつ、「継続利用割引」という仕組みで長時間の利用が割安になる。
  - 請求はシンプルで分かりやすい。

**まとめ**：料金の透明性とシンプルさを求めるならGCP、柔軟な料金プランを活用したいならAWS。



## 5. **初心者向けの使いやすさ**
- **AWS**：
  - 初心者にはやや複雑に感じる場合もありますが、豊富なチュートリアルや公式ドキュメントが強力なサポートになります。

- **GCP**：
  - インターフェースがシンプルで直感的な操作が可能。データ分析やAIに特化しているため、特定分野に集中したい初心者には向いています。

**まとめ**：全般的な学習にはAWS、特定分野（AIやデータ分析）に集中したいならGCP。



## 6. **グローバルなデータセンターの分布**
- **AWS**：
  - 世界中に25のリージョンと80以上のアベイラビリティゾーン（AZ）を持ち、非常に広いカバレッジを提供。

- **GCP**：
  - AWSより少ないものの、Googleの強力なネットワークインフラを活用し、主要な地域で高品質なサービスを提供。

**まとめ**：地域にこだわる場合や広範囲なカバレッジが必要ならAWS、主要地域に絞って高性能を求めるならGCP。



## 7. **ユースケース別の選び方**
- **AWSが向いている場合**：
  - 幅広い業界ニーズに対応したクラウドインフラが必要
  - ハイブリッドクラウドやIoTなど、多機能なサービスを活用したい

- **GCPが向いている場合**：
  - データ分析やAIを中心にクラウドを活用したい
  - シンプルな料金体系と操作性を重視したい



## 結論：どちらを選ぶべき？
AWSとGCPはそれぞれに得意分野があり、どちらが良いかは利用目的によります。以下の指針を参考にしてください：
1. **幅広い機能と柔軟性** → AWS
2. **データ分析やAI、操作のシンプルさ** → GCP

最初はトライアル期間を活用して、両方のプラットフォームを試してみるのがおすすめです！
LeetCodeを1日1題解いてみる (day21)

21日目に取り組んだ問題はこちら！

# 108. Convert Sorted Array to Binary Search Tree

https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/

## 問題文
Given an integer array nums where the elements are sorted in ascending order, convert it to a height-balanced binary search tree.

## 僕の回答 (失敗作)
```py
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        mid = len(nums) // 2
        left_arr = nums[:mid]
        right_arr = nums[mid:]
        node = TreeNode(nums[mid])
        root = node     
```

## 回答例

```py
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        if not nums:
            return None
        
        def buildBST(left: int, right: int) -> Optional[TreeNode]:
            if left > right:
                return None
            mid = (left + right) // 2
            node = TreeNode(nums[mid])

            node.left = buildBST(left, mid - 1)
            node.right = buildBST(mid + 1, right)

            return node
        
        return buildBST(0, len(nums) - 1)
```

## コメント
こんな感じなのかな、というのは掴めるがそれを具体的にアルゴリズムとコードに落とし込むことが苦手です。

## 次の問題はこちら!
https://qiita.com/h_y_s_d/items/ecbbfa7368baf216de77
【初心者向け】GCPの主要サービスをやさしく解説！Googleのクラウドを学ぼう



GCP（Google Cloud Platform）は、Googleが提供するクラウドサービスのプラットフォームで、アプリやサービスの構築、運用を簡単にするためのさまざまなツールやリソースを提供しています。この記事では、GCPの主要なサービスをわかりやすく解説します！

---

## 1. **Compute Engine（コンピュートエンジン）** - 仮想サーバーを簡単に利用
**Compute Engine**は、仮想サーバー（VM: Virtual Machine）を利用できるサービスです。物理サーバーを用意する代わりに、GCP上で簡単にサーバーを作成してアプリを動かせます。

- **特徴**：
  - 高い性能の仮想サーバーをオンデマンドで利用可能
  - グローバルネットワークにより高速で安定した通信
- **用途例**：ウェブサイトのホスティング、データ処理、アプリケーション運用

---

## 2. **Cloud Functions（クラウドファンクションズ）** - サーバーレスでコード実行
**Cloud Functions**は、コード（プログラム）をサーバーを意識せずに実行できるサーバーレス環境です。

- **特徴**：
  - イベント駆動型で、特定の条件が発生するとコードが実行される
  - サーバーの設定や管理が不要
- **用途例**：リアルタイム処理、通知システムの構築

---

## 3. **Cloud Storage（クラウドストレージ）** - 大容量データの保存
**Cloud Storage**は、画像や動画、ログデータなどのファイルを安全に保管するためのオブジェクトストレージサービスです。

- **特徴**：
  - 非常に高い耐久性と可用性
  - 自動でバックアップを作成可能
- **用途例**：データのバックアップ、大容量データの共有、画像・動画配信

---

## 4. **Cloud SQL（クラウドSQL）** - データベースの管理を簡単に
**Cloud SQL**は、リレーショナルデータベース（MySQLやPostgreSQLなど）の管理を簡単にするサービスです。

- **特徴**：
  - Googleが自動でバックアップ、更新、スケーリングを管理
  - 高い可用性と信頼性
- **用途例**：アプリケーションの顧客情報管理、商品データベース

---

## 5. **Google Kubernetes Engine（GKE）** - コンテナのオーケストレーション
**GKE**は、コンテナ技術（Dockerなど）を使ったアプリケーションの管理や運用を自動化するサービスです。

- **特徴**：
  - Googleが開発したKubernetesを活用
  - コンテナのスケールアップやロールアウトを簡単に実行
- **用途例**：マイクロサービスアーキテクチャの管理

---

## 6. **BigQuery（ビッグクエリ）** - 大量データを高速で分析
**BigQuery**は、超高速で大規模データを分析できるサーバーレスのデータウェアハウスサービスです。

- **特徴**：
  - SQLを使った簡単なクエリで大規模データを分析可能
  - データのインポートやエクスポートも柔軟
- **用途例**：顧客データの分析、ビジネスレポートの作成

---

## 7. **Cloud Pub/Sub（クラウドパブサブ）** - メッセージ通信の管理
**Cloud Pub/Sub**は、データの送受信（メッセージ通信）を効率的に行うためのサービスです。特にリアルタイム処理や分散システムで活躍します。

- **特徴**：
  - 非同期でメッセージを送受信
  - 高いスループットでリアルタイム処理が可能
- **用途例**：チャットアプリ、IoTデバイスのデータ収集

---

## 8. **AI Platform（エーアイプラットフォーム）** - 機械学習のワークフローを簡単に
**AI Platform**は、Googleが提供するAI/機械学習モデルの作成・トレーニング・デプロイを一括管理できるサービスです。

- **特徴**：
  - TensorFlowなどの機械学習ライブラリに対応
  - モデルのトレーニングや予測を簡単に実行可能
- **用途例**：需要予測、画像認識

---

## 9. **Cloud Monitoring（クラウドモニタリング）** - システムの監視とアラート
**Cloud Monitoring**は、GCP上で動作するリソースやアプリケーションを監視し、問題が発生したら通知してくれるサービスです。

- **特徴**：
  - カスタマイズ可能なダッシュボード
  - アラート機能で迅速に問題を検知
- **用途例**：システムの安定運用、エラーの早期発見

---

## 10. **Cloud Spanner（クラウドスパナー）** - 分散型リレーショナルデータベース
**Cloud Spanner**は、グローバル規模でスケールする分散型のリレーショナルデータベースサービスです。

- **特徴**：
  - トランザクション（整合性）を保証しつつ、高い可用性を提供
  - データが増えても高速に動作
- **用途例**：大規模なオンラインサービスのバックエンド

---

## まとめ
これからクラウドを学びたい方は、まずは小さなプロジェクトからGCPのサービスを試してみるのがおすすめです！BigQueryやCloud Functionsのようなシンプルで便利なサービスから体験してみましょう！
【初心者向け】AWSの主要サービスをやさしく解説！これからクラウドを学ぶ人へ


AWS（Amazon Web Services）は、Amazonが提供するクラウドサービスのプラットフォームで、さまざまなITリソースをインターネット上で利用できるサービスの集合体です。この記事では、AWSの代表的なサービスを初心者向けにやさしく解説します。

---

## 1. **Amazon EC2（イーシーツー）** - 仮想サーバーのレンタル
**EC2**は、仮想サーバー（インターネット上のコンピューター）を貸してくれるサービスです。  
通常、ウェブサイトやアプリを動かすには物理的なサーバーが必要ですが、AWSではEC2を利用することでサーバーを自分で用意する必要がありません。

- **特徴**：
  - 必要なときにだけサーバーを起動
  - スケールアップ（サーバーの性能向上）も簡単
- **用途例**：ウェブサイトのホスティング、アプリケーションの実行環境

---

## 2. **AWS Lambda（ラムダ）** - サーバーを持たないコード実行
**Lambda**は、コードをサーバーなしで動かせるサービスです。通常、プログラムを動かすにはサーバーが必要ですが、LambdaではAWSがその管理を代行します。

- **特徴**：
  - イベント駆動でコードが実行される（例：ファイルがアップロードされたら通知を送る）
  - インフラの管理不要で開発に集中できる
- **用途例**：リアルタイム処理、自動メール送信

---

## 3. **Amazon S3（エススリー）** - ファイルの倉庫
**S3**は、写真、動画、文書などのファイルを保存するための「倉庫」です。インターネット上で大量のデータを安全に保管でき、必要に応じて取り出せます。

- **特徴**：
  - 高い耐久性
  - 費用対効果が高い
- **用途例**：バックアップ、データ共有、画像や動画の配信

---

## 4. **Amazon RDS（アールディーエス）** - データベースの管理
**RDS**は、データベースの管理を簡単にするサービスです。たとえば、顧客情報や商品情報を保存するためのデータベースを数クリックで作成できます。

- **特徴**：
  - AWSがバックアップやセキュリティを管理
  - MySQL、PostgreSQL、SQL Serverなど主要なデータベースに対応
- **用途例**：ECサイトの商品データ管理

---

## 5. **Amazon VPC（ブイピーシー）** - 仮想ネットワークの構築
**VPC**は、AWS上に自分専用のネットワーク空間を作れるサービスです。この空間内でリソース（サーバーやデータベース）を配置し、安全に通信できます。

- **特徴**：
  - 外部アクセスを制限可能
  - VPNを利用して社内ネットワークと接続も可能
- **用途例**：安全なデータ通信が必要なシステム

---

## 6. **AWS IAM（アイエーエム）** - アクセス管理
**IAM**は、AWSのリソースに対するアクセス権を設定するサービスです。たとえば、「AさんはS3にアクセスできるが、EC2は触れない」といった権限管理ができます。

- **特徴**：
  - ユーザーやグループごとに細かい権限設定が可能
  - セキュリティ強化のための多要素認証（MFA）に対応
- **用途例**：複数メンバーでのAWS利用

---

## 7. **Amazon CloudFront（クラウドフロント）** - コンテンツの配信
**CloudFront**は、ウェブページや動画を高速で配信するサービスです。世界中の拠点にデータをキャッシュして、エンドユーザーに近い場所から配信する仕組みです。

- **特徴**：
  - 配信スピードが速い
  - SSL/TLSでのセキュアな通信が可能
- **用途例**：動画ストリーミング、画像配信

---

## 8. **Amazon DynamoDB（ダイナモディービー）** - 高速なNoSQLデータベース
**DynamoDB**は、キー・バリュー型のデータを保存する高速データベースサービスです。特にスケーラブルで、大量のデータでも素早く処理できます。

- **特徴**：
  - 自動的にスケーリングするため管理が簡単
  - レイテンシ（遅延）が低い
- **用途例**：リアルタイムチャット、セッション管理

---

## 9. **Amazon CloudWatch（クラウドウォッチ）** - 監視とアラート
**CloudWatch**は、AWS上で稼働しているサービスを監視し、異常があれば通知してくれるサービスです。

- **特徴**：
  - システムのパフォーマンスを監視
  - アラート機能で異常時に即対応可能
- **用途例**：システムの安定運用

---

## 10. **Amazon SageMaker（セージメーカー）** - 機械学習の開発
**SageMaker**は、AIや機械学習のモデルを作成し、学習させて実用化するためのサービスです。

- **特徴**：
  - データ準備、モデルのトレーニング、デプロイを一貫して実行可能
  - 開発者がAIを簡単に利用できる環境を提供
- **用途例**：画像認識、予測モデルの作成


## まとめ
AWSのサービスは、初心者でも使いやすく設計されています。それぞれのサービスを理解し、必要に応じて使い分けることで、効率的にシステムを構築し、運用することができます。最初は小さなプロジェクトから始めて、少しずつクラウドに慣れていきましょう！
RDS Proxy 作成時に「リソースの制限が不十分」と出て失敗した

# はじめに

かなり特殊な状況での事象になりますが、
RDS Proxy 作成時にステータスが「リソースの制限が不足」と表示され作成に失敗しました。

結論から先に言うと、このときは対象のサブネット内の割り当て可能なIPアドレスが枯渇したのが要因でした。

この状況はかなり稀だとは思いますが、エラーメッセージが分かりにくくてハマってしまったので記事に残しておこうと思います。
もし同じような事象に遭遇した方のお役に立てれば幸いです。

# 再現

## 前提

- RDS クラスターは作成済みである
- VPC も作成済みである


## 1. サブネットを用意

アベイラビリティゾーン(AZ) の a, c にそれぞれ意図的に CIDR ブロックを狭く設定したサブネットを作成し、割り当て可能な IP アドレスを枯渇させます。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/e0db1167-dfa7-1b16-5f85-76ed3c712a53.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/de2f61e4-906f-76ea-bcb4-32d59084c49c.png)


## 2. RDS Proxy を作成

![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/e67bf634-8d82-b065-8e1c-75ab6d43dbea.png)
〜〜〜
![3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/dba0388e-c06f-1b84-fd77-0f7f43dfa9f6.png)

作成操作をするとステータスが作成中になるのでしばらく待ちます

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/09ed45ca-97a6-8c54-f6fa-ed458db24ee6.png)


## 3. 作成失敗

「リソースの制限が不十分」というエラーが出て失敗しました。

![5-error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/7aed1d90-9fa8-a855-4c8a-f5bac54f41d6.png)


# 調査方法と要因

最初は「リソースの制限が不十分」という言葉から、クォーター関連の何かに引っかかっている？とか思い、その辺を見てみましたが問題なさそうで、ググっても有用な情報にはたどり着けず少し時間を溶かしてしまいましたが、改めて公式ドキュメントを見たところドンピシャな内容ではなかったのですが、ニュアンスが似ているものがありました。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_Events.Messages.html#USER_Events.Messages.rds-proxy

`RDS-EVENT-0243` 

:::note info
サブネット name に十分な IP アドレスがないため、RDS はプロキシの容量をプロビジョニングできませんでした。この問題を解決するには、RDS プロキシのドキュメントで推奨されているように、サブネットの未使用の IP アドレスが最小限であることを確認してください。
:::

この内容の通りに、サブネットの IP アドレスに余裕を持たせて再度トライしたところ問題なく作成が完了しました。

# CloudTrail でも確認出来た

このエラーの内容は実は CloudTrail でも確認出来ました。
エラーの内容で判断出来なかったときに、はじめから CloudTrail を見ていればよかったです。。

CloudTrail のイベントのうち、RDS Proxy を作成したと思われるタイムスタンプ周辺の関連しそうイベントを１つ１つ見ていくと `errorMessage` にたどり着きしました。
`CreateVpcEndpoint` にそれはありました。 RDS Proxy 作成時に関連して作成されるリソースの VPC エンドポイント作成イベントですね。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/3294f28e-0c0e-95a9-ee71-52f080b82d04.png)


ちゃんと「サブネット内に割り当て可能なIPアドレスが不足している」旨記載されていますね。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2080620/00f9d4ef-b7bb-dbaa-c088-93f19910bfc0.png)


# まとめ

今回のまとめとしては、

- RDS Proxy 作成時に「リソースの制限が不十分」と出て失敗する要因のひとつとして、サブネット内の空きIPアドレス枯渇も考えられる
- 基本に立ち返り公式ドキュメントを確認しよう
- エラーメッセージが分かりづらいときは CloudTrail も見てみよう

となります。

# Ref
- [Amazon RDS イベントカテゴリとイベントメッセージ - RDS Proxy イベント](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_Events.Messages.html#USER_Events.Messages.rds-proxy)
[入門]CI/CDでコンテナ環境に自動デプロイする方法を簡単にまとめてみた

## 1. はじめに
本記事は`CI/CD`を学習で実際に手を動かす前の前提知識を簡単にまとめた記事となります。

:::note
注意: コードを書いたり、AWSのマネジメントコンソールを操作したりすることをまとめてはいません。
:::

## 2. 記事の対象読者
以下のような方を想定した記事になっています。

- `CI/CD`って何?
- `CI/CD`って聞いたことあるけど雰囲気しかわかっていない
- `CI/CD`きちんと学習してなかったけどそろそろきちんと学習・理解したい

## 3. CI/CDとは
:::note info
CI/CDの概要については以下の記事を引用しています。
:::
 
https://www.redhat.com/ja/topics/devops/what-is-ci-cd#ci/cd%E3%81%AE%E3%80%8Ccd%E3%80%8D%E3%81%A8%E3%81%AF
### CIとは
CIは`Continuos Integration`(継続的インテグレーション)の略称。
コード変更がマージされると自動化されたビルドやテストを実行する手法のこと。
> コード変更を共有ソースコードリポジトリに自動的かつ頻繁に取り込む手法


### CDとは
CDは`Continuos Delivery`(継続的デリバリー)または`Continuos Deployment`(継続的デリバリー)の略称。

#### 継続的デリバリー
> CI でのビルドおよびユニットテストと統合テストの自動化に続いて、検証済みコードのリポジトリへのリリース
引用: Red Hat様のCI/CD とは記事より

#### 継続的デプロイメント
> 継続的デプロイメントは継続的デリバリーを拡張したものであり、リポジトリから本番環境への開発者による変更のリリースを自動化し、顧客が使用できるようにする

### 継続的デリバリーと継続的デプロイメントはどう違う
> 時には同じ意味で使用されることもあります。どちらもパイプラインのさらなる段階の自動化に関するものですが、自動化の程度を示すために切り離して使用される

要は`継続的デリバリー`の段階だとユーザーからは確認できない段階で`継続的デプロイメント`の段階ではユーザーまでコード変更が提供されているということのようです。`CI/CD`全体を指す場合では意識しないでも良さそうですが、責務や範囲を意識しなければならないケースだと使い分ける必要がありそうです。

## 4. CI/CDに関わる主なサービス
### GitHub Actinons
https://github.co.jp/features/actions
> ワールドクラスのCI / CDですべてのソフトウェアワークフローを簡単に自動化できます。 GitHubから直接コードをビルド、テスト、デプロイでき、コードレビュー、ブランチ管理、問題のトリアージを希望どおりに機能させます。

言わずと知れ渡っているCI/CDのサービス。採用されている企業様も多いと思います。
ただ、CI/CDのみで完結することも可能ですが、`GitHub Actions` + `AWS`のサービスを組み合わせてCI/CDを環境を構築することでIAMにより権限を詳細に管理したいというニーズもあるようです。


### ECR (Amazon Elastic Container Registry)

https://aws.amazon.com/jp/codepipeline/features/

> Amazon Elastic Container Registry (Amazon ECR) は、ハイパフォーマンスホスティングを提供するフルマネージドコンテナレジストリであるため、アプリケーションイメージとアーティファクトをどこにでも確実にデプロイすることができます。

### ECS (Amazon Elastic Container Service)

https://aws.amazon.com/jp/ecs/
> Amazon Elastic Container Service (Amazon ECS) はフルマネージドコンテナオーケストレーションサービスであり、コンテナ化されたアプリケーションをより効率的にデプロイ、管理、スケールするのに役立ちます
引用元: Amazon ECS（Docker コンテナを実行および管理）| AWS -Amazon Web Services, Inc.

### Fargate

https://aws.amazon.com/jp/fargate/
> コンテナ向けサーバーレスコンピューティング
引用元: AWS Fargate（サーバーやクラスターの管理が不要なコンテナの使用）| AWS -Amazon Web Services, Inc.

:::note
今回のCI/CDで学習したorするサービスというだけで他にも様々なコンテナ向けサービスがあります。
:::


## 5. CI/CDの大まかな流れ
アーキテクチャ図でわかりやすいように整理してみるとこんな感じでしょうか？

![cicd_aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494944/c3a99989-535e-a094-b74a-d84fe8da12d7.png)

1. トリガーとなるイベントが検知される *`push`など
2. Docker Imageをビルドする
3. ビルドされたDocker ImageをAmazon ECRにプッシュする
4. AWS CLIでタスク定義を作成
5. タスク定義でサービスをデプロイ

## 6. 最後に
簡単にですが、手を動かす前にCI/CDの概要を調べてまとめました。
次の執筆予定の記事ではGitHub Actionsを利用してサービスをデプロイするところまで書きたいと思っています。
(アーキテクチャ図書くの難しい、でも書けるようになりたい。)
OpenTofuでProxmox VEのCT(Container)を起動して、Dockerをインストールする

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

以下の記事を書きました。

OpenTofuでProxmox VEのCT\(Container\)を起動する \#ProxmoxVE \- Qiita 
https://qiita.com/ynott/items/b6e72981d90564f982de

そうするとだんだん欲が出るもので、OpenTofuでプロビジョニングして、同時に何かインストールしてくれるといいんじゃない？

それに動かすのならDockerで動かせるとなお良いよね！って事で、以下のような対応をしました。

1. ProxmoxでCT(LXC Container)を動かす
1. このCTにDockerをインストールするために「非特権コンテナー」と「nested」にする
1. Dockerをremote-execでインストールする

# 1. ProxmoxでCT(LXC Container)を動かすOpenTofuファイル

```terraform:main.tf
terraform {
  required_providers {
    proxmox = {
      source = "telmate/proxmox"
      version = "2.9.11"
    }
  }
}

provider "proxmox" {
  pm_api_url = "https://proxmox.hogehoge.dev:8006/api2/json"
}

resource "proxmox_lxc" "ubuntu_container" {
  target_node  = "proxmox"
  hostname     = "ubuntu-22-04-lxc"
  ostemplate   = "local:vztmpl/ubuntu-22.04-standard_22.04-1_amd64.tar.zst"
  password     = "your-root-password"
  unprivileged = true

  features {
    nesting = true
  }

  // 基本設定
  cores  = 2
  memory = 2048
  swap   = 512
  onboot = true
  ssh_public_keys = <<-EOT
    ssh-ed25519 ＜公開鍵＞
  EOT

  // ストレージ
  rootfs {
    storage = "local-lvm"
    size    = "8G"
  }

  // ネットワーク
  network {
    name     = "eth0"
    bridge   = "vmbr0"
    ip       = "192.168.20.11/24"
    gw       = "192.168.20.1"
  }

  provisioner "remote-exec" {
    inline = [
      "apt-get update",
      "apt-get install -y docker.io",
      "systemctl enable docker",
      "systemctl start docker"
    ]
    connection {
      type     = "ssh"
      user     = "root"
      private_key = file("~/＜秘密鍵のファイルパス＞")
      host     = split("/", self.network[0].ip)[0]
    }
}
```

# 2. 非特権コンテナーでnestedにする

main.tfで以下の部分が、Dockerコンテナを動かすための指定部分です。

```terraform
  unprivileged = true

  features {
    nesting = true
  }
```

# 3. Dockerをremote-execでインストールする

以下の部分が、Containerが起動した後に外からdockerをインストールします。

```terraform
  provisioner "remote-exec" {
    inline = [
      "apt-get update",
      "apt-get install -y docker.io",
      "systemctl enable docker",
      "systemctl start docker"
    ]
    connection {
      type     = "ssh"
      user     = "root"
      private_key = file("~/＜秘密鍵のファイルパス＞")
      host     = split("/", self.network[0].ip)[0]
    }
```

# 4. 適用する

```
tofu init
```

```
tofu plan
```

```
tofu apply
```

すれば起動します。

# 5. まとめ

ProxmoxのCTは起動も早いので便利ですね。
これで、Dockerまで動くなんて最高でしょう。

# 6. 参照

TerraformからAnsibleのplaybookを実行する \#AWS \- Qiita 
https://qiita.com/hayaosato/items/ee0d6eabb7b3d0a22136#remote-exec
DiffServ(差別クラス・サービス)

### IntServは実際に導入されていない
>`フロー・ベース・アルゴリズムは一つ以上のフローに対し、高いサービス品質を提供できる`。それは、`ルート上で必要とされるあらゆるリソースを予約するため`である。しかし、欠点もある。各フローを構築するのに`前もって設定を行う必要`がある。これは数万から数百万のフローが存在する場合は、`スケーラビリティがない`。また、フローごとに内部状態を保持しなければならないので、`ルーターのクラッシュ`の原因になりやすい。最後に、ルーターのコードに要求される変更も多く、フロー設定のためにルータ間で複雑な情報交換を必要とする。結果として、`IntServの研究は進められているものの、実際に導入されている例はほとんどない`

* フロー・ベース・アルゴリズムとは？
* スケーラビリティとは?

https://www.idcf.jp/words/scalability.html

* IntServはルートの確保をしてフローを流す
* IntServは現実的でないのか

### DiffServとは
>`前もって設定が不要で、全体の経路情報を必要とせず、各ルーターでローカルに実行することが可能`な方法がある。この方法は、クラス・ベース(class-based)のサービス品質として知られている。IETFは`DiffServと呼ばれるクラス・ベースのサービス品質のためのアーキテクチャを規定`しており、RFC2474,RFC2475やその他で記述されている。

### IPv4,IPv6のパケットでDiffServフィールドで提供されている
>DiffServは管理ドメイン（例えばISPや地域電話会社）を形成するルーターの集合によって提供される。管理者は、対応する転送規則を備えたサービス・クラスの集合を定義する。もしユーザーがDiff Servの契約をした場合、そのドメインへ入ろうとするユーザーの`パケットは所属するクラスでマーク付け`される。この情報は`IPv4,IPv6のパケットのDiffServフィールドで提供`されている

### PHB(Per Hop Behavior:ホップごとの振る舞い)
>そのクラスはネットワーク全体にわたる保証ではなく、パケットがそれぞれのルーターで受ける処理に対応しているため、`PHB(Per Hop Behavior:ホップごとの振る舞い)`として定義される。プレミアム・サービスといった`特定のPHBを持つパケットは、通常のパケットよりも質の高いサービスを受ける`ことができる。一つのクラスのトラフィックは、ある特定の排出率を持つリーキー・バケツ・アルゴリズムのように、ある特定の形状（シェイプ）に従うようになっている


### 用途によってタグをつけ共有させる
>フロー・ベースのサービス品質とクラス・ベースのサービス品質をより名かうに区別するために、インターネット電話を例に取って考えてみよう。フロー・ベースの方法では、各電話それぞれがリソース保証を得る。クラス・ベースの方法では、`すべての通話は共同して電話クラスのためにリソースを予約`する。`パケットはこれらのリソースをWebブラウジングクラスや他のクラスから奪われることはない`が、個々の通話が自身のリソースを単独で予約するわけではない。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
【Chakra UI】Chakra UI v3でグラデーション背景の仕方

# はじめに
Chakra UI v3では、背景グラデーションの指定方法がv2から変更されました。本記事では、新しい実装方法について解説します。

:::note warn
***この記事は<font color="Red">個人的なアウトプット</font>を目的として作成したものです。そのため、誤った情報や不足している内容が含まれている可能性があります。もし間違いや気になる点がございましたら、ぜひご指摘いただけますと幸いです***。
:::

# 実装方法
## v2からの変更点
v2では、`bgGradient`でグラデーションの方向や色を一括で指定できました。
```react 
// v2
<Box bgGradient='linear(to-r, green.200, pink.500)' />
```
v3では、***グラデーションの方向***、***開始の色***、***終了の色***を個別に指定するよう変更されました。

```react
// v3
<Box bgGradient="to-tl" gradientTo="red.300" gradientVia="pink.200" gradientFrom="purple.200">
```

https://v2.chakra-ui.com/docs/styled-system/gradient

## v3の実装方法
新しい指定方法では、以下のプロパティを使用します。

1. bgGradient: グラデーションの方向を指定します。例として、上左（to-tl）方向のグラデーションを指定しています
1. gradientFrom: グラデーションの開始色
1. gradientTo: グラデーションの終了色
1. gradientVia: 中間に追加したい色（オプション）

```react
<Box bgGradient="to-tl" gradientTo="red.300" gradientVia="pink.200" gradientFrom="purple.200">
```
上記の指定で下記のようなグラデーションが作れます。

![スクリーンショット 2024-11-20 20.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3835217/441dbab7-278e-e2b7-ff2c-e93733d46116.png)

|Prop||
|---|---|
|bgGradient|グラデーションの方向の指定 例: to-tl|
|gradientTo|グラデーションの始まりの色|
|gradientFrom|グラデーションの終わりの色|
|gradientVia|グラデーションの中間の色|

https://www.chakra-ui.com/docs/styling/style-props/background

# 終わりに
Chakra UI v3ではグラデーション指定がより柔軟になり、色を細かく設定できるようになりました。ぜひ一度試してみてください！

# 参考

https://v2.chakra-ui.com/docs/styled-system/gradient

https://www.chakra-ui.com/docs/styling/style-props/background
Chromebookで開発をする

訳あって手元にChromebookしかなくて、仕方なくこいつで開発することになりました。
Celeronであるが故に性能も厳しいので、いかに快適さを維持しながら普段通りに開発を行えるか試行錯誤しました。

# 【はじめに】 ChromebookにはLinuxコンテナがある
`設定 > ChromeOSについて`を見ると、一番下に`Linux 開発環境`とありました。
ChromeOS自体はGentoo Linuxがベースなのですが、どうやらこの開発環境はDebian 12の仮想環境(コンテナ)を構築するみたいです。
普段Ubuntu Serverを触っているので、難なく操作できます。(デフォルトでvimも入っているので、vimmerもにっこり:smile:)


# エディタ
とりあえず私はVSCodeを使おうとしました。LinuxコンテナがあるのでそこにVSCodeのパッケージをダウンロードしてきて、dpkg -iなりすれば簡単に入りました。

:::note warn
Chromebookでは`ファイル`アプリからパッケージをクリックすると簡単にインストールが出来ますが、大抵まともに動きません。動く場合もありますが、大人しく`dpkg -i ファイル名.deb`を打ったほうが100倍早いです。
:::

あとはアプリ一覧に見慣れたVSCodeのアイコンが出るはずなので、押すだけ。
ですが**超**重いです。もともとの性能が低い上に仮想環境で動いているとなると相当の負荷がかかります。
これじゃまともにコーディングが出来ないです。

で、なんやかんやあって見つけたのが[code-server](https://github.com/coder/code-server)。
インストールはこのシェルスクリプトを叩くだけ:
```sh
curl -fsSL https://code-server.dev/install.sh | sh
```
あとは`code-server`してやると`localhost:8080`で立ち上がります。(`-p`オプションで番号も変えられます)
拡張機能も多少制限はあるもののほとんど入りますし、ターミナルも使えます。

:::note warn
VSCode MarketPlaceの規約により、VSCode以外でMicrosoftが提供するMarketPlaceは使えません。
そのため、code-serverでは[Open-VSX](https://open-vsx.org/)を使用しています。
拡張機能の量は劣りますが、ほとんどの拡張機能(特に、有名な拡張機能など)はOpen-VSXにも存在するのでほとんど困ることはないかと思われます。
:::

## Q. Web版のVSCodeじゃ駄目なの？
駄目です。拡張機能がほとんど非対応な上にターミナルも使えません。
あと、妙にcode-serverより負荷が高いです。

## Q. code-server以外に何かないの？Linuxコンテナが使えないなら何を選べばいいの？

Archetypeがおすすめです。Monacoがベースになっていて、VSCodeと少し操作感は違いますが十分使いやすいです。
Chrome Web Storeからダウンロードできます。
https://chromewebstore.google.com/detail/archetype-code-editor/kdkdfjfadjdgonjjkkfjimiachohndeb

# SSH
Linuxコンテナにアクセスする際に使う`ターミナル`アプリをそのまま使います。Terminusなんかも入れましたが起動が面倒ですし...

# Flags
`chrome://flags`で、以下の2つをEnabledにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529047/1457ba3f-3c93-1ef8-4580-7c4cbaa075c8.png)
## Allow Multiple Crostinit containers
Crostini(Linuxコンテナ)を複数個建てられるようになります。要は容量の許す限り気軽に作りまくってぶっ壊せます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529047/a1a9b598-6522-4fd5-7bf4-efe1225a548c.png)
まだじっくり触れていませんが、結構面白そうです。

## Crostini IME support for Qt applications
Qtで作られたアプリでのIMEサポート云々みたいなのらしいです。念の為有効化してますが実験的な機能なので下手に弄らないほうがよかったかもなぁと今思ったり。

# さいごに
正直Chromebookはパソコンと言い難い部分があったりもしますが、なんやかんやで使いこなせば楽しい端末です。
是非活用してみてください :sparkles: 

おわり！
ロジスティック回帰についてまとめてみました

ロジスティック回帰（Logistic Regression）は、統計学や機械学習において広く使われる分類モデルの一つで、特に二値分類（二つのクラスのどちらかに分類する問題）で使用されます。ロジスティック回帰は、名前に「回帰」とありますが、実際にはカテゴリ分類に適したモデルです。

## ロジスティック回帰の基本的な考え方

ロジスティック回帰は、目的変数 \( y \) が「0」または「1」の値を取る二値変数（例：スパムか非スパムか、病気か健康かなど）を予測するために用いられます。ロジスティック回帰では、次のような式を使用して、あるデータが特定のクラスに属する確率をモデル化します。

### シグモイド関数（ロジスティック関数）

ロジスティック回帰は、シグモイド関数（ロジスティック関数）を用いて、予測値を確率に変換します。この関数は次のように表されます：

```math
P(y = 1 | x) = \frac{1}{1 + e^{-(b_0 + b_1 x_1 + b_2 x_2 + \cdots + b_n x_n)}}
```

ここで、
- $\( P(y = 1 | x) \)$ は、クラス「1」に属する確率を示します。
- $\( b_0 \)$ は切片（バイアス）です。
- $\( b_1, b_2, \ldots, b_n \)$ は回帰係数で、それぞれの独立変数 $\( x_1, x_2, \ldots, x_n \)$ に対する重みを表します。
- $\( e \)$ は自然対数の底（約2.718）です。

シグモイド関数は、入力値を0から1の範囲にマッピングするため、確率の範囲に対応します。これにより、ロジスティック回帰は、データが特定のクラスに属する確率を出力します。

## ロジスティック回帰の学習方法

ロジスティック回帰では、最尤推定法（Maximum Likelihood Estimation, MLE）を用いてパラメータ $\( b_0, b_1, \ldots, b_n \)$ を推定します。これにより、予測された確率と実際のラベルとの誤差を最小化するようにパラメータが調整されます。

### 1. コスト関数
予測と実際の値の誤差を表すために、ロジスティック回帰では対数損失（log loss）を用いたコスト関数が一般的です。
### 2. 勾配降下法
最適なパラメータを見つけるために、勾配降下法を用いてコスト関数を最小化します。

## ロジスティック回帰の種類

### 1. 二項ロジスティック回帰
   クラスが2つ（例：「0」または「1」）の場合に使用します。これが基本的なロジスティック回帰です。

### 2. 多項ロジスティック回帰（マルチクラスロジスティック回帰）
   クラスが3つ以上ある場合に使用します。この場合は、ソフトマックス回帰と呼ばれる拡張が一般的です。

### 3. 順序ロジスティック回帰
   クラスが自然な順序を持つ場合（例：満足度が「低」「中」「高」など）に使用します。

## ロジスティック回帰の評価指標

ロジスティック回帰モデルを評価するための代表的な指標には、以下のようなものがあります：

### 1. 正解率（Accuracy）
   全体の予測が正しかった割合です。

### 2. ROC曲線とAUC
   ROC曲線は真陽性率と偽陽性率の関係を示す曲線で、AUCはその曲線の下の面積です。AUCが1に近いほど、分類性能が高いことを示します。

### 3. 混同行列
   予測の正解数と誤分類数を詳細に示します。

### 4. F1スコア
   精度（Precision）と再現率（Recall）の調和平均で、モデルのバランスの取れた評価を行います。

## ロジスティック回帰の仮定

ロジスティック回帰を適用するには、以下の仮定が成り立っていることが望ましいです。

### 1. 線形関係：
   独立変数と従属変数の間には、ロジット（logit）変換後に線形関係があると仮定します。

### 2. 独立性：
   観測値間に相互依存がないと仮定します。

### 3. 多重共線性がない：
   独立変数間に強い相関がないことが望ましいです。

## ロジスティック回帰の応用例

- **マーケティング**：顧客が購入するか否かの予測
- **医療**：患者が特定の病気になる確率の予測
- **金融**：ローンの返済が行われるかどうかの予測
- **スポーツ**：試合の勝敗予測

## まとめ

ロジスティック回帰は、分類問題における基本的かつ効果的な手法であり、特に二値分類問題に適しています。データが線形的に分離できる場合に最も効果を発揮しますが、モデルが過学習しにくく、解釈性が高いのも特徴です。実務でも多くの分野で応用されており、分類問題における重要な手法の一つです。
ここからはじめるWebエンジニアへの道

Qiita、1本目。
-
これからQiitaでは私がWebエンジニアになるまでを投稿していきます！

【自分の現在地】
-
* Webエンジニアを目指して、カリキュラムがあるSES企業に今年の5月に転職。
Webエンジニアへの案件のアサインは社内カリキュラムをすべて終了してからが条件です。

* 現状、業務としては最初にアサインされたところでテスターをしています。
カリキュラムを進めるものの6ヶ月経っても勉強してきたことへの自信がなく、どうすればいいかモヤモヤしながら日々を過ごしていました。


【エンジニアを目指したワケ】
-
Webエンジニアを目指す前は、会社の説明資料や営業資料、ホワイトペーパー、サービス概要資料などの資料作成をしていましたが、ふとキャリアを考えた時にこのままでいいのかと思い色々考えた結果、モノ作りには関わっていきたいという想いはあったのでWebエンジニアを目指すことに決めました。


【目標】
-
短期
* 中期、長期への土台づくり。Reactを中心としたスキルをしっかり身につける！

中期
* 個人開発でサービスリリース！

長期
* 上場企業、メガベンチャークラスの企業への転職！

# JISOUのメンバー募集中！
プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか？
興味のある方は、ぜひホームページをのぞいてみてくださ！
▼▼▼

https://projisou.jp
Mac nodeのバージョンを16.〇〇に下げる方法(2024/12/08更新)

# はじめに
homebrewを使用したnodeが11/2をもってnode 16.〇のバージョンの対応が終了したようなので、従来のやり方だとnodeのバージョンを16.〇〇に下げることができなくなってしまいました。
そこで試行錯誤してnodeのバージョンを16.〇〇に下げ、pushができたので共有します。
主にnodeのバージョンが22.〇〇になるMacユーザー向けの記事なので、windowsユーザーは見なくて大丈夫です。

# 環境
・Mac
・node22.〇〇
・herokuリリース(push)の際、 Error: error:0308010C:digital envelope routines::unsupported/ERROR in ./app/javascript/packs/application.jsで止まっている

# 解決策
#### 現在紐づいているインストール済みのバージョンを解除。
```terminal
brew unlink node
```
#### NVM のインストール 次のコマンドで nvm をインストールします
```terminal
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash
```

#### 以下を実行して nvm を有効化する
```terminal
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
```
#### nvm を使って Node.js のバージョンを指定してインストールする(今回node16)
```terminal
nvm install 16
```
#### Node.js 16 をデフォルトバージョンとして使用するため以下を記入
```terminal
nvm alias default 16
```
nodeのバージョンを確認
```terminal
node -v
```

ここで16.〇〇と表示されたら完了
<details><summary>出なければ引き続き下記をやる</summary>

#### NODE_OPTIONS 環境変数をリセットして、問題を解消
```terminal
unset NODE_OPTIONS
```
#### nodeのバージョンを確認
```terminal
node -v
```
</details>

## nodeのバージョンが16になったら
package.jsonファイルを編集する。以下を付け加える。このとき、先程確認したnodeとnpmのバージョンを指定する。
```package.json
"engines": {
    "node": "16.20.0",
    "npm": "8.19.4"
  }
```
これを下記のように追記しよう。enginesのすぐ上の　}　に" , "を付けないとエラーが出るよ！
```package.json
{
  "name": "webrender",
  "private": true,
  "dependencies": {
    "@rails/actioncable": "^6.0.0",
    "@rails/activestorage": "^6.0.0",
    "@rails/ujs": "^6.0.0",
    "@rails/webpacker": "5.4.3",
    "turbolinks": "^5.2.0",
    "webpack": "4.46.0",
    "webpack-cli": "3.3.12"
  },
  "version": "0.1.0",
  "devDependencies": {
    "@babel/plugin-proposal-private-methods": "^7.18.6",
    "@babel/plugin-proposal-private-property-in-object": "^7.21.0",
    "babel-loader": "^8.2.2",
    "webpack-dev-server": "3"
  },
  "engines": {
    "node": "16.20.0",
    "npm": "8.19.4"
  }
}

```
変更したファイルをステージングする。
```terminal
git add -A
```
ステージングされたファイルをコミットして、、
```terminal
git commit -m "package.json fix"
```
最後に、herokuへプッシュ！
```terminal
git push heroku master
```
IntServ（統合サービス）

>IETFは`ストリーミング・マルチメディアのためのアーキテクチャを考案`しようと四苦八苦していた。この作業をRFC2205〜RFC2212まで、２ダース以上のRFCを生み出す結果となった。この作業の一般的な名称はIntServ(Integrated Service:統合サービス）と呼ばれ、`ユニキャスト・アプリケーションとマルチキャストアプリケーションの双方のため`に作られた。

* ストリーミング・マルチメディアのためのアーキテクチャを考案しようとした作業のことかな

# IntServの主要な構成要素
>RFC205-2210で定義されている。このプロトコルは予約を行うために使われる。その他のプロトコルはデータを送信するために用いられる。RSVPは複数の送信者が複数の受信グループにデータを送ることを可能にし、それぞれの受信者が自由にチャネルを変えることを許し、同時に服装を排除して帯域を最適化する

# 帯域の予約
>通信効率を良くし、輻輳を排除するため、グループ内のどの受信者も予約メッセージをツリーの上流にいる送信者に送ることが考えられる。そのメッセージは以前説明した`逆方向経路転送アルゴリズムを使って転送`される。各ホップにおいて、`ルーターは予約があるかどうかを調べ、必要な帯域を予約`する。重み付き公平キューイングによるスケジューリングでこうした予約を行う方法を前項ですでに紹介した。もし`帯域が不足していれば、予約の失敗が報告`される。メッセージが送信元に返されると、`送信者から受信者へのスパニングツリーに沿った帯域を予約が完了`する。

### 指定に伴う情報を用いて帯域の最適化を行う
>予約を行うときに、`受信者は、（任意に）一つ以上の受信したソース（送信元）を指定`することができる。ソース指定が`予約期間中に固定であるかどうか、受信者が後でソースを変更できるかどうか`、なども指定できる。ルータは`この情報を帯域の最適化に利用`する。特に、送信元を変えないことに２つの受信者が同意すれば、それら`２者間で用いられる経路を共通の一つの経路にまとめて設定`できる

### 受信者が帯域を切り替えやすくなっている
>動的な場合にこの戦略を用いる理由は、`帯域の予約が送信元の選択から分離される`からである。`受信者は一度、帯域を予約すると、別の送信元にスイッチ`することもできるし、新しい送信元にスイッチする場合、`現在確保している経路の一部を新しい送信元へ経路として利用し続ける`こともできる。
>
>例えば複数のチャネルを持ったテレビ局のように、`ホスト２がリアルタイムで複数のビデオ信号を搬送している`場合、ホスト三は帯域の予約を変更することなく、自分の意思でそれらのビデオ信号の中から`好きなものを自由に選択`できる。すなわち`ルーターは受信者がどのプログラムを見ているかは関知`しない

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/

# 感想
* スパニングツリーを使っている
* 帯域を予約、切り替えがしやすくなっている
* 帯域に複数の信号があるとルーターは受信者がどの信号を使っているかわからない
* マルチキャストを利用する受信が帯域を使いやすくしていることがわかった
クラス、インスタンス、オブジェクト、メソッド、プロパティのつながり

### **はじめに**

JavaScriptにおける**オブジェクト指向プログラミング**に密接に関連している用語とそれぞれのつながりをまとめました。

---

### **1. クラス (Class)**

- **クラスとは**:
    - オブジェクトの**設計図**です。
    - プロパティ（データ）やメソッド（機能）を定義するためのひな形です。
    - 実際に使うためには、クラスから「インスタンス」を作成します。

**例**

```jsx
class Product {
    constructor(title, price) {
        this.title = title; // プロパティ
        this.price = price; // プロパティ
    }

    // メソッド
    displayInfo() {
        return `${this.title}: $${this.price}`;
    }
}
```

---

### **2. インスタンス (Instance)**

- **インスタンスとは**:
    - クラスをもとに作成された**具体的なオブジェクト**のことです。
    - インスタンスはクラスのプロパティやメソッドを引き継ぎます。
    - `new` キーワードを使って作成します。

**例**

```jsx
const product1 = new Product("Laptop", 1000); // クラスからインスタンスを作成
const product2 = new Product("Phone", 500); // 別のインスタンス
```

- **ポイント**:
    - `product1` と `product2` は、それぞれ `Product` クラスのインスタンスです。
    - `product1` と `product2` は同じクラスを基にしているが、異なるデータを持つ独立したオブジェクトです。

---

### **3. オブジェクト (Object)**

- **オブジェクトとは**:
    - **プロパティ（データ）** と **メソッド（機能）** を持つデータ構造のことです。
    - JavaScriptではほぼすべてがオブジェクトであり、クラスのインスタンスもオブジェクトの一種です。

**例**

```jsx
// クラスから作られたインスタンスはオブジェクト
console.log(product1 instanceof Object); // 出力: true

// 通常のオブジェクト
const obj = { key: "value" };
console.log(obj instanceof Object); // 出力: true
```

- **クラスとオブジェクトの違い**:
    - **クラス**はオブジェクトを作成するための「設計図」。
    - **オブジェクト**はクラスから作成された「実体」。

---

### **4. プロパティ (Property)**

- **プロパティとは**:
    - オブジェクトが持つ**データのこと**です。
    - クラスで定義されたプロパティは、インスタンスの中に保存されます。

**例**

```jsx
console.log(product1.title); // 出力: Laptop
console.log(product2.price); // 出力: 500
```

- **プロパティの特徴**:
    - クラス内で定義されると、各インスタンスが独自の値を持つことができます。

---

### **5. メソッド (Method)**

- **メソッドとは**:
    - オブジェクトに属する**関数**のことです。
    - クラス内で定義されたメソッドは、インスタンスを通じて呼び出すことができます。

**例**

```jsx
console.log(product1.displayInfo()); // 出力: Laptop: $1000
console.log(product2.displayInfo()); // 出力: Phone: $500
```

- **メソッドの特徴**:
    - メソッドはクラスやオブジェクトに関連した処理を定義します。
    - インスタンスごとにメソッドを使って異なるデータを処理できます。

---

### **全体のつながり**

1. **クラス**はオブジェクトを作成するための設計図です。
    - プロパティ（データ）とメソッド（機能）を定義します。
2. **インスタンス**はクラスをもとに作られた具体的なオブジェクトです。
    - 各インスタンスはクラスが定義するプロパティとメソッドを持ちます。
3. **プロパティ**はオブジェクトが持つデータで、インスタンスごとに異なる値を持つことができます。
4. **メソッド**はオブジェクトが持つ機能で、インスタンスごとにプロパティの値に基づいて異なる結果を返します。

---

### **まとめ**

以下の図でこれらの関係を示します：

```
クラス (設計図)
 └── プロパティ (title, price)
 └── メソッド (displayInfo)

↓ インスタンス化 (new)

インスタンス (具体例: product1)
 └── プロパティ (title: "Laptop", price: 1000)
 └── メソッド (displayInfo: "Laptop: $1000")

インスタンス (具体例: product2)
 └── プロパティ (title: "Phone", price: 500)
 └── メソッド (displayInfo: "Phone: $500")
```

このように、**クラス → インスタンス → オブジェクト** の関係性を理解することで、プロパティやメソッドを効果的に使えるようになります。
Revolutionizing Logistics: How Technology is Driving Efficiency and Innovation

The logistics industry has experienced a dramatic transformation in recent years, thanks to rapid advancements in technology. Automation and artificial intelligence (AI) are at the forefront of this evolution, enabling companies to streamline operations and reduce costs. Tools like warehouse robots and automated sorting systems ensure faster and more accurate handling of goods, minimizing human error. Additionally, predictive analytics, powered by AI, allows businesses to anticipate demand patterns and optimize inventory management, ensuring that products are in the right place at the right time.
Another game-changing innovation is the integration of Internet of Things (IoT) devices. Smart sensors on shipping containers and delivery vehicles provide real-time data on location, temperature, and other critical factors. This increased visibility enables businesses to monitor their supply chains more effectively and respond to potential disruptions instantly. For example, if a shipment is delayed, IoT data can trigger contingency plans, ensuring customers receive their goods on time. This transparency not only enhances operational efficiency but also builds trust with clients.
Moreover, technology has significantly improved customer experience in twenty47logistics.com which advanced tracking systems give clients up-to-the-minute updates on their shipments, enhancing satisfaction and reducing uncertainty. Digital platforms also facilitate seamless communication between logistics providers and customers, making processes more collaborative. Furthermore, emerging technologies like drone deliveries and autonomous vehicles are poised to revolutionize the last-mile delivery process, offering faster, more sustainable solutions. These advancements highlight how technology is not just transforming logistics but setting the stage for a more connected and efficient future.
docker compose で c言語を動かせる環境を作成してみた

docker、c言語の素人です、ググりながら環境を作成しましたのでご了承ください。

# docker の設定ファイルなど

```yml:docker-compose.yml
services:
  c_sandbox:
    build:
      context: .
      dockerfile: Dockerfile
    # ホストとゲストの work フォルダを同期
    volumes:
      - ./work:/work
    # 接続したときのデフォルトフォルダ
    working_dir: /work
    # コンテナを起動したままにする
    tty: true
```

```Dockerfile:Dockerfile
FROM ubuntu:22.04

# gcc コマンドを使うためにインストール
RUN apt update  && \
    apt install build-essential -y
```

```c:work/hello.c
#include <stdio.h>

int main()
{
  printf("Hello World\n");
  return 0;
}
```

# コンテナ実行

```bash
# ホストで実行すると、コンテナが起動
docker compose up -d
# ゲストに入る
docker compose exec c_sandbox bash

# ゲストで実行して動作確認できる
gcc ./hello.c -o ./hello && ./hello
Hello World
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/67235fed-ba72-849c-d1cd-a6b3e25e4842.png)