OmniAICreator/Qiita-1.07M huggingface dataset:
アクセサメソッド

# アクセサメソッドとは
>`インスタンス変数の値を読み書きするメソッドのことをアクセサメソッド`と呼びます（他の言語では「ゲッターメソッド」や「セッターメソッド」と呼ぶこともあります）。Rubyの場合、単純にインスタンス変数の内容を外部から読み書きするのであれば、`attr_accessor`というメソッドを使って退屈なメソッド定義を省略できます。

### 読み書き両方できるattr_accessor
```rb
irb(main):001* class User
irb(main):002*   attr_accessor :name
irb(main):003*
irb(main):004*   def initialize(name)
irb(main):005*     @name = name
irb(main):006*   end
irb(main):007> end
=> :initialize
irb(main):008> user = User.new("Alice")
=> #<User:0x000000010c1a6870 @name="Alice">
irb(main):009> user.name
=> "Alice"
irb(main):010> user.name = "Bob"
=> "Bob"
irb(main):011> user.name
=> "Bob"
```
### 読み専用 attr_reader
```rb
irb(main):012* class User2
irb(main):013*   attr_reader :name
irb(main):014*
irb(main):015*   def initialize(name)
irb(main):016*     @name = name
irb(main):017*   end
irb(main):018> end
=> :initialize
irb(main):019> user = User2.new("Alice")
=> #<User2:0x000000010fa7ff98 @name="Alice">
irb(main):020> user.name
=> "Alice"
irb(main):021> user.name="Bob"
(irb):21:in `<main>': undefined method `name=' for #<User2:0x000000010fa7ff98 @name="Alice"> (NoMethodError)

user.name="Bob"
    ^^^^^^
Did you mean?  name
```

### 書き込み専用 attr_writer
```rb
irb(main):022* class User3
irb(main):023*   attr_writer :name
irb(main):024*
irb(main):025*   def initialize(name)
irb(main):026*     @name = name
irb(main):027*   end
irb(main):028> end
=> :initialize
irb(main):029> user = User3.new("Alice")
=> #<User3:0x000000010c16e600 @name="Alice">
irb(main):030> user.name
(irb):30:in `<main>': undefined method `name' for #<User3:0x000000010c16e600 @name="Alice"> (NoMethodError)

user.name
    ^^^^^
Did you mean?  name=
...
irb(main):031> user.name="Bob"
=> "Bob"
```
### 複数指定も可
```rb
irb(main):042* class User5
irb(main):043*   attr_accessor :name, :age
irb(main):044*
irb(main):045*   def initialize(name,age)
irb(main):046*     @name = name
irb(main):047*     @age = age
irb(main):048*   end
irb(main):049> end
=> :initialize
irb(main):050> user = User5.new("Alice", 30)
=> #<User5:0x000000010c12f4a0 @age=30, @name="Alice">
irb(main):051> user.name
=> "Alice"
irb(main):052> user.age
=> 30
irb(main):053> user.age = 40
=> 40
irb(main):054> user.age
=> 40
```
https://gihyo.jp/book/2017/978-4-7741-9397-7
# 感想
こういうメソッドがあるからrailsも簡単に操作できるようになってるんだな
KinoProgressBar で Livebook 上にプログレスバーを表示する

## はじめに

KinoProgressBar を使うと、 Livebook 上にプログレスバーを表示することができます

https://gitlab.com/abstract-binary/kino_progress_bar

本記事では KinoProgressBar の使い方を紹介します

実装したノートブックはこちら

https://github.com/RyoWakabayashi/elixir-learning/blob/main/livebooks/kino/kino_progress_bar.livemd

## セットアップ

まずセットアップセルで KinoProgressBar をインストールします

```elixir
Mix.install([
  {:kino_progress_bar, "~> 0.1"}
])
```

## 基本的な使用方法

以下のように書くと、実行結果としてプログレスバーが表示されます

```elixir
progress_bar = KinoProgressBar.new("PROGRESS")
````

実行結果

![スクリーンショット 2024-11-12 18.22.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/7cd2ffbd-c143-d896-88f6-f372c411004a.png)

`set_current` で値を更新します

```elixir
KinoProgressBar.set_current(progress_bar, 20)
```

![スクリーンショット 2024-11-12 18.23.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/e7becc0f-968d-f89c-44df-9c3883d292b9.png)

## パラメーター

プログレスバーの作成時、パラメーターを指定することができます

```elixir
red_bar = KinoProgressBar.new(
  "Red",
  color: :red,
  width: 800,
  range: {0, 1000},
  current: 500,
  format_current: fn index -> "#{index} 回" end,
  throttle: 100
)
```

- `color`: プログレスバーの色（伸びていく部分の背景色）
- `width`: プログレスバーの幅（`px` 単位）
- `range`: `{最小値, 最大値}` で範囲を指定
- `current`: 初期値
- `format_current`: プログレスバー上に表示する文字の形式
- `throttle`: 画面表示の更新間隔（ms 単位、デフォルトは 500 ms）

実行結果

![スクリーンショット 2024-11-12 18.28.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/d4b485a9-7889-2794-7187-97ef0c70ecab.png)

プログレスバーが動くところを見てみましょう

```elixir
0..1000
|> Enum.each(fn index ->
  Process.sleep(2)
  KinoProgressBar.set_current(red_bar, index)
end)
```

![progress_bar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/6fe354a6-d854-debf-26fc-94ac4450dbd9.gif)

## まとめ

KinoProgressBar を使うことで、簡単にプログレスバーを表示することができました

時間のかかる処理で使いましょう
日本語で何月なの？矯正プログラム


## 何月だよ

アクセスログやコメントログなどの日付が英語で書かれていることがある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/f4726b82-45cb-cb8f-f5ad-0fc80549a20a.png)

迫真英語苦手部の私にはこれが何月なのか全く分からず逐一ググっている。

これは非常に非効率なので矯正したい。

## という訳で作った

https://mogamoga1024.github.io/nangatu/

## 最後に

英単語を覚えて、快適な日付ライフを！
JetsonNano起動時に自動でJupyter-Labを立ち上げる

# はじめに
　AIラジコンカー界隈で流行りの自動運転ミニカーのモデル，「JetRacer」を製作するにあたって役立ったことを備忘録として残します．ここでは，JetsonNanoを外部のPCで作業するための「Jupyter Lab」について書きます．

# JetsonNanoにJupyter-Labからアクセス
　今まではラズパイ一筋でやってきたのでJetsonNanoについては何もわからない...．色々調べていると，どうやらJupyterを使って別のPC環境で作業するのが主流らしい，ということで，実際にJetsonNanoにJupyter Notebookをインストールして，ラップトップPC（Windows11）．以下の記事がわかりやすく，参考にさせていただきました．

 https://qiita.com/TakeoChan/items/ae56d322f611dc9374f4

 # Jetson起動時に自動でJupyter-Labを立ち上げる
　JupyterLabで接続できるようになったのはいいものの，毎回ディスプレイとマウスとキーボードをつなぐのは面倒なので，JetsonのUbuntuでサービスを作りました．良かったら実装してみてください．

手順①：ファイルの作成
 ```service:terminal
 sudo gedit /etc/systemd/system/jupyter_lab.service
```
 

手順②：以下のスクリプトを貼り付けて保存
 ```ini:jupyter_lab.service
[Unit]
Description=Jupyter Lab
After=network.target

[Service]
Type=simple
User=megken
ExecStart=/home/megken/.local/bin/jupyter-lab --notebook-dir=/home/megken --ip=0.0.0.0 --no-browser --allow-root　--port=8888
WorkingDirectory=/home/megken
Restart=always
Environment="PATH=/home/megken/.local/bin:/usr/bin:/bin"

[Install]
WantedBy=multi-user.target

```
ここで，「megken」はユーザネームなので変更してください．また，ExecStartにはjupyter-labのパスを入れてください．確認の方法は以下のコマンドです．
```service:terminal
 which jupyter-lab
```
手順③：サービスのリロード
```service:terminal
 sudo systemctl daemon-reload
```

手順④：サービスの有効化と起動
```service:terminal
　sudo systemctl enable jupyter_lab.service
　sudo systemctl start jupyter_lab.service
```

これでわざわざディスプレイをつないぎターミナルを開いて，手動でJupyter-Labを開くことなくアクセスできるようになりました．
[Udemy]ガチ勢が語るSE向けUdemyBusiness：おすすめ５選

# アドベントカレンダー2日目
2日目はUdemyです。
この記事はかなり自信がありますよ。
ではどうぞ。

# はじめに
**Udemy**にはとてもお世話になっています。
会社と提携した**Udemy Business**のハードユーザーです。
しっかりと個人用も持っており、そちらでも講座をいくつか買わせていただいております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3296700/6a288d59-44d4-96e3-9137-80ace98fdcc7.png)


# Udemyのいいところ
- 0から１を学ぶツールとしてとても便利なツール
- 業務で従事しているプログラム言語を学べる
- 電車の通勤中にもオフラインで動画を見ることができる
(私は通勤中にWordPressとPHPと統計検定について学べる
- IT以外の会計、営業、コミュニケーションスキルについて学べる

# Udemyの直してほしいところ
- プレビュー機能は存在するが、自分のレベルにあっている教材かどうかを判断するのが難しい

# Udemyのおすすめ講座5選
それ以外には、**Udemy**で不便に感じたことはありません。
そのため、今から下に**SE**として必要であり、見ることによって考え方が変わる素晴らしい講座を紹介していきます。

<strong>1. ロジカルシンキング

https://www.udemy.com/course/mruuklnu/?kw=%E4%BA%BA%E6%B0%97%E8%AC%9B%E5%B8%AB&src=sac&couponCode=ST20MT111124B

この伊庭先生の動画はすべて見るべきだとは思いますが、SEとして必要とされるロジカルシンキングについてわかりやすくまとめられています。
最近上司に<strong>根拠は？なんで？</strong>と言われた方、視聴してしてはいかがでしょう。

<strong>2. SQLの高速化

https://www.udemy.com/course/sqlserver-index/?kw=SQLSERVER&src=sac&couponCode=ST20MT111124B

ピーコック　アンダーソンの動画シリーズの中で、これを上げさせていただきました。
ドメイン駆動開発の動画も素晴らしいのですが。。。
SQLはマスターしたと思っている中級者の方にお勧めしたいです。
この教材では、INDEXを張ることにより、どの程度高速化したのかわかります。
SQL SERVERを用いているので、必要としない方はお勧めしないです。

<strong>3. VBA

https://www.udemy.com/course/vba5-class-started/?couponCode=ST20MT111124B

初級者にはお勧めできませんが、かなり難しいVBAまで実装することができるようになります。
とにかくVBAを学んでクラスや関数について理解した人にお勧めしたいです。
レガシーなシステムを用いている技術者必見です。


<strong>4. WordPress

https://www.udemy.com/course/wordpress-swell/?couponCode=ST20MT111124B

WordPressを用いてホームページを作成しようとしている方必見です。
Xサーバーというサーバーを使用し、WordPressを簡単にインストールすることができます。
約1万円で1年契約できるため、フロント・バックエンド言語を学ぶことができます。
具体的にいうとHTML,CSS,javaScript,PHPが簡単にインストールできるので、環境構築が苦手な初心者にとっては友てよい教材です。
しかし、Xサーバーの画面構成が多少変わってしまっているので、ボタンを探すのに少し苦労しました。

こんな感じでWEBサイトを作れます。

https://www.dxsolutionshub.com/

<strong>5. ストレスコーピングについて

https://www.udemy.com/course/sdidksxi/?couponCode=ST20MT111124B

また、伊庭さんか。と思われてしまう気持ちはわかります。
しかし、SEにとって一番大切なのは、ストレスとの向き合い方だと思います。
様々なストレスが存在します。納期、品質、顧客との折衝などなど。
しかし、ストレスというのは受け止め方次第なんです。
例えば、<strong>あなた声低いんだね</strong>言われたとします。
これには、賛否あると思いますが、声が低いのを気にしている人以外からすると、
<strong>そうかな？</strong>で終わる話です。
しかし、声が低いのを気にしている人からするとこれは**ストレス**に変わります。
では、なぜそのような違いが起こるのでしょうか。
そのキーワードは**バイアス**です。

# 最後に
Udemyでは時々セールを行っていて、1万円以上のコースが1500円で買えてしまうバグみたいなことが起こります。
セールなども行っているみたいなので、ぜひご視聴してみてはいかがでしょうか。
ではでは、2日目も終了ですー。
TS×React 画面をスクロールすると表示され、クリックするとページ先頭に移動するボタンの実装

# 投稿目的
<ul>
<li>よりよい方法をご教授いただきたい</li>
</ul>

# 本題
個人開発(TypeScript × React)の中で、一覧を表示させる画面を作成しました。
一覧に表示させる配列の`length`が大きくなってくると、ページの一番上まで戻るのが大変になってきます。
そのため、よくある「ワンクリックでページ先頭に戻る」ボタンを作成したいと思いました。

# 実装してみる
<a href="https://stackblitz.com/edit/vitejs-vite-rvhnx7?file=src%2Fpages%2FaboutScrollTop%2FAboutScrollTop.tsx,src%2Fpages%2FaboutScrollTop%2Fcomponents%2FScrollTopButton.tsx,src%2FRouter.tsx,src%2FApp.tsx" target="_blank">Stack Blitz(外部)</a>

```ScrollTopButton.tsx
import { FC, memo, useEffect, useState } from "react";

export const ScrollTopButton: FC = memo(() => {
  const [windowTop, setWindowTop] = useState<number>(0);

  const handleScroll = () => setWindowTop(window.scrollY);

  useEffect(() => {
    // mount時に実行
    window.addEventListener("scroll", () => handleScroll());
    // unmount時に実行
    return window.removeEventListener("scroll", () => handleScroll());
}, []);

  return (
     <button
      className={`mx-4 normal-case btn btn-outline btn-sm bottom-1 right-1 fixed${windowTop > 100 ? " visible" : " invisible"}`}
      onClick={() => window.scrollTo({ top: 0, behavior: 'smooth' })}
    >
      <span>画面TOPへ戻る</span>
    </button>
  );
});
```
![Videotogif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3519885/153782e8-c240-9f4f-4081-4f5b8e74f7e4.gif)

いい感じですね。
GIFだと粗いですが、以下のような挙動を示しています。
>・画面が下にスクロールされ、`window.scrollY`が`100`以上になると「画面TOPへ戻る」ボタンが表示される
>・「画面TOPへ戻る」ボタンを押下すると、画面が一番上までスクロールされる
>・画面が一番上までスクロールされると、「画面TOPへ戻る」ボタンは非表示となる

個人開発では、`<button>`に`transition: visibility 0.25s` のスタイルも当ててみました。

# 最後に
結構簡単に実装できました。
素のJavascriptで実装する方法などは結構見つかりましたが、Reactで実装する方法はなかなか出ず...
本記事が助けになれば幸いです。
3Dプリンターは今後どうなっていくのでしょうか？

技術の進歩により、3Dプリンティング技術は医療や航空、消費財などの分野に広がりつつあり、今後さらに応用範囲が拡大していくと予想されます。では、未来の3Dプリンティングにはどのような発展の可能性があるのでしょうか？

### 1. 材料の多様化と強度の向上

現在、3Dプリンティングの材料は主にプラスチックと金属ですが、今後は生分解性の環境に優しい素材や、高温に耐えられる複合材料、生体模倣材料などが加わるでしょう。これらの新しい材料は、製品の多様化を実現し、さまざまな環境での使用ニーズに応えます。これにより、個別にカスタマイズされた医療機器や消費財、産業製品の製造が促進されます。
![2afdaaa850fa69ec671c8ff639929ea5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/c08cb08f-a68f-e39d-a9c2-6bfb618c5343.png)



### 2. 微細加工と精度の向上

将来、3Dプリンティング技術の精度は、現在のミクロンレベルからナノレベルに向かって進化するでしょう。この微細な精度は、3Dプリンティングをマイクロエレクトロニクスや小型センサーの製造において有利にし、さらに微細な手術器具や体内センサーの製造にも役立ちます。また、精度が向上することで、特定の業界が求める高水準の細部まで再現可能になります。
![ba4835e1cc482f53662e9ebba2f3724f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/e1ce89a1-654f-18bb-fba3-9ed5771b811f.png)


### 3. 3Dスキャニングとプリンティングの融合

将来、3Dスキャナー技術と3Dプリンティングの融合がさらに強化され、特にカスタマイズ製品やリバースエンジニアリングにおいて大きな役割を果たすでしょう。3Dスキャニングにより人体部位や物体の表面データを正確に取得し、専用の医療器具やパーソナライズされた消費財を制作できます。この組み合わせは効率性を高めるだけでなく、3Dプリンティング製品の精密さも向上させます。例えば、オーダーメイドの3Dプリント義肢は、使用者の身体のニーズにより適合するようになります。
![8cfc375d2609c68652ebf55d5389c139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824290/b0995f10-1f25-e174-fe1c-bfca84e33f65.png)

https://www.revopoint3d.com/pages/standalone-3d-scanner-miraco
### 4. 医療と臓器プリンティング

3Dプリンティングは、医療分野での応用の可能性が非常に高いです。バイオ3Dプリンティングは、現在人体組織のプリントを実現しつつあり、将来的には臓器の代替プリントも可能になると考えられ、移植の供給不足を緩和するでしょう。さらに、個別にカスタマイズされた医療機器、例えば義歯や矯正器具、義肢なども普及していくと予想されます。3Dプリンティングによる個別対応の医療製品は、治療効果を高めるだけでなく、快適さと機能性も向上させます。

### 5. 環境保護と持続可能な製造

今後、3Dプリンティング技術の発展は、環境保護にも焦点を当て、リサイクル可能な材料や分散型製造の導入により、製造過程での廃棄物や輸送による二酸化炭素排出を削減します。分散型製造により、製品の需要地で直接プリントが可能になり、物流や在庫のコストが削減され、環境にも優しくなります。

### 結論

総じて、今後の3Dプリンティング技術は、材料の多様化、精度の向上、3Dスキャナーとの融合など、多くの面で製造業の発展を後押しします。日常生活での個別カスタマイズ製品から、医療、環境保護の分野での応用まで、3Dプリンティングは製造業に新たな可能性をもたらし、さらに多くの革新を生み出すでしょう。
GCPで外部メールサーバーを利用する手順

# 背景
WebアプリをGCPでホストしていますが、メールサーバーは先方指定のものを使わなければならなくなりました。その際に行った手順を解説します。

### ステップ①：権威DNSを設定する
ドメイン取得会社(今回はお名前ドットコム)の「他のネームサーバーを使用」から権威DNSを指定します。
ここでGCP指定のDNS, `ns-cloud-d1.googledomains.com`~`ns-cloud-d5.googledomains.com` を指定します。
複数のDNSを登録するのは、一つが対応できなくなったときに他のDNSがカバーするためです。

### ステップ②： DNSレコードの設定
GCPの「DNS Cloud」にて権威DNSのレコード設定を行います。
今回指定するレコードは、`MX`, `TXT(DKIM)`, `SPF`です。
|DNS名 | 種類 | 情報| 
| -- | -- | -- |
| example.com | MX | mail.server.com |
| default._domainkey.example.com | TXT |"v=DKIM1; k=rsa; p=MIIBIjANBgkqhki....|
| example.com | SPF |"v=spf1 +mx +a +ipx.x.x.x ~all" |

- `MX`は、メールをメールサーバーに送信するためのものです。ここで、Aレコードでも同じホスト名にIPアドレスを割り当てていますが、衝突は起こりません。メールの場合はsmtp, webの場合はhttp, httpsという異なるプロトコルを使っているからという理解です。
- `SPF`は、ドメイン(example.com)の送信するメッセージが、リストされたサーバーから送信されたものであることを検証します。
「リストされたサーバー」とは、`+mx`(MXレコードで指定したサーバー), `+a`(Aレコードで指定されたIPアドレス)などを指します。
逆にリストされてないサーバーから送られていると不正なものである可能性が高いと言うことです。
- `DKIM`は、RSA暗号を用いて送信者の認証とメッセージが改ざんされていないかを検証します。Cloud DNSで情報を入れる場合は少し注意が必要で下記のように、文字列を分割する必要があります。
```
"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCBQ8AMIIBCgKCAQEAraC3pqvqTkAfXhUn7Kn3JUNMwDkZ65ftwXH58anno/bElnTDAd/idk8kWpslrQIMsvVKAe+mvmBEnpXzJL+0LgTNVTQctUujyilWvcONRd/z37I34y6WUIbFn4ytkzkdoVmeTt32f5LxegfYP4P/w7QGN1mOcnE2Qd5SKIZv3Ia1p9d6uCaVGI8brE/7zM5c/" "zMthVPE2WZKA28+QomQDH7ludLGhXGxpc7kZZCoB5lQiP0o07Ful33fcED73BS9Bt1SNhnrs5v7oq1pIab0LEtHsFHAZmGJDjybPA7OWWaV3L814r/JfU2NK1eNu9xYJwA8YW7WosL45CSkyp4QeQIDAQAB"
```
### ステップ③：メールを送信してみる
Flask-Mailでメールを送信してみます。
```python
def send_mail():
    msg = Message(
        subject="Hello from Flask-Mail",
        recipients=["hello@hello.com"],
        body="This is a test email sent from a Flask app using Flask-Mail."
    )
    
    mail.send(msg)
    return "Successful"
```
届きました↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3933005/4dae7030-d60e-fb03-6b9b-2aafc97524bf.png)

**終わり**
F - Xor Minimizationの再帰関数が2^30でTLEしない理由

解法を見て、なぜ再帰関数でTLEしないのか疑問に思った。この再帰関数はDPみたいに状態をまとめているわけではないから、一番最下層(一番下の桁を見ているときを最下層と表す)まで行ったら、今再帰関数が見ている頂点的な区間は、その最下層の頂点的な区間ごとに今まで選んできた0,1は違うわけで、そうなったら最下層は2^30通りあると考えられるためそれを再帰関数で見たらTLEすると思った。
しかしここでNを見てみると10^5とある(1.5は省略)。これを最下層に当てはめてみると、 **10^5を2^30個の区間に分けるの無理じゃね？** となる。だから最下層だとしても最大10^5個の区間を表す頂点しかなくて、それは上の階層でも最大10^5のため、マージソートのように計算量を考えると、O(層*存在する頂点数)みたいに見積もれて、層は2^30なので30であり、存在する頂点はどの層でも最大10^5なのだから、O(30*10^5)くらいに見積もれてTLEせずACできる。
なお、解説放送のACコードにおいてサイズが0だとしても掘るコードを書くとTLEする、そもそもmaxになりうる方を再帰関数で掘っていくので、サイズが0の方を掘るのは解法としておかしいのでWAになるのだが...
【Python】複数のバージョンのPythonを切り替えて使う方法

## はじめに

Pythonのパッケージを使う際、`Python 3.9 - 3.11`といったようにPythonのバージョンが指定されていることが多々あります。特定のバージョンのPythonを使わないと、パッケージがうまく動作しない事は、機械学習のパッケージを使う時などによくある事です。

もし、別のバージョンのPythonが必要となった際、再インストールするのは面倒です。こんな時の問題を解決してくれる主要なツールとして`pyenv`があります。

今回は、`pyenv`を使用して安全に複数のバージョンのPythonをインストールし、コマンドで簡単にPythonのバージョンを切り替える方法について解説します。

## 動作環境
- M1 Mac
- Python 3.9.6

## pyenvとは
`pyenv`は、Pythonの主要なバージョン管理ツールで、複数のバージョンのPythonをインストールし、異なるバージョンのPythonを簡単に切り替えて使用する事を可能とするツールです。これにより、プロジェクト毎に異なるバージョンのPythonを使う必要がある場合でも、簡単に切り替えて使うことができます。

## pyenvのインストール

```shell
brew install pyenv
```
[こちらのページ](https://github.com/pyenv/pyenv?tab=readme-ov-file#installation)に、Windows、Linuxのインストール方法も載っています。

## Pathを通す

pyenvを使用するにはPathを通す必要があります。
まず、使っているシェルを確認します。

```bash
echo $SHELL
/usr/local/bin/zsh # <- zsh使ってる
```

zshの場合は`.zshrc`、bashの場合は`.bashrc`の末尾に以下のコードを追加します。

```bash
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

ファイルを保存したら、シェルの設定を反映します。

```bash
source ~/.zshrc
```

## バージョン確認

```
pyenv --version
```
以上で、pyenvを利用できるようになります。

## 異なるバージョンのPythonインストール

インストール可能なバージョンを確認できるコマンドを実行します。

```shell
pyenv install --list
```

試しに、Python 3.11をインストールしてみます。
（時間がかかるので辛抱強く待ちます・・）

```shell
pyenv install 3.11.10
```

インストール済みのPythonのバージョンを確認します。
出力結果より、`system`と`3.11.10`のバージョンがインストールされており、`*`がついている`system`がアクティベートされています。

```shell
pyenv versions

# 出力
* system (set by /Users/hoge/.pyenv/version)
  3.11.10
```
先ほどインストールした`3.11.10`をアクティベートします。
以下のコマンドで、アクディベートするPythonを切り替えます。

```shell
pyenv global 3.11.10
```
バージョンが切り替わっているか確認します。

```shell
pyenv versions

# 出力
  system
* 3.11.10 (set by /Users/hoge/.pyenv/version)
```
最後に、pipを更新しておきます。

```shell
pip install --upgrade pip
```
これで、Python 3.11.10を使えるようになります。`system`のPythonではないので、パッケージの依存関係などで困ってしまったときも、Pythonを簡単に入れ直すことができます。

Pythonを安全に利用するために、よく`venv`を使用することがありますが、私の場合は`pyenv`を使えば簡単にPythonを入れ直せるので、`venv`は使わず直接パッケージをインストールして使っています。

最後に、pyenvでインストールしたPythonをアンインストールする方法を示します。
以下のコマンドを使用します。

```shell
pyenv uninstall 3.11.10
```
## おわりに

今回は、Windows、Intel Mac、Apple Silicon Mac(M1,M2)に対応し、高速でUbuntuのVMを構築できるソフトウェアとして、Multipassを紹介しました。基本的な操作方法について、この記事を参照していただき、細かい操作についてはGoogle検索やhelpコマンドを確認してみてください。この記事が、少しでも多くの方にとって有益になれば幸いです。

今回は、複数のバージョンのPythonをインストール・切り替えるバージョン管理ツールとしてpyenvを紹介しました。基本的な操作方法について、この記事を参照していただき、細かい操作についてはGoogle検索やhelpコマンドを確認してみてください。この記事が、少しでも多くの方にとって有益になれば幸いです。
Distrolessについて調べてみた

:::note warn
WIPです。
distrolessについて調ベてまとめて行っています
:::
## Distrolessとは
https://github.com/GoogleContainerTools/distroless

自分自身がいれたアプリケーションやそのランタイムのみが含まれている
パッケージマネージャーやシェルなど、標準的なLinuxディストリビューションに含まれるようなプログラムは含まれていないとのこと。

## 何が良いのか

* 使用しないプログラムに対して、脆弱性を考慮する必要がなくなる
* 最終的なイメージが軽量になる
  * READMEにも書いてありましたが、`gcr.io/distroless/static-debian12`は2MiBととても軽量でした
  * `gcr.io/distroless/base`についても2MBほどでした


## 実際に使ってみる

/, /bin, /usr/bin配下について出力してみる
```
/
/.dockerenv
/app
/bin
/boot
/dev
/etc
/home
/lib
/proc
/root
/run
/sbin
/sys
/tmp
/usr
/var
/bin/
/usr/bin/
```
/bin, /usr/bin配下については何もない、

## 使い道

現状は`gcr.io/distroless/base`しか使っていないが、簡単なバッチ処理などを走らせる際に使用するのは良さそう。
内部に入れないのは何かあった時に心配がある、、、
ソフトバンク光のBBユニットの利用意義

光BBユニットはソフトバンク光が提供する無線LANルーターで、IPv6高速ハイブリッド接続などに対応。自身のルーターがある場合は光BBユニットは必須ではないが、使用しないとIPv6高速通信は利用不可。スマートフォンがSoftBankまたはY!mobileであればセット割があり、オプションパックに加入するメリットがある。

代理店選びのポイント 新規契約の場合はSTORYが最もキャッシュバック額が高くお得。転用・事業者変更の場合、Yahoo!BBがキャッシュバック減額がなくおすすめ。

https://hikarikaisen-compass.com/
Laravel11のAPIでもセッションクッキーによる認証を行う

Laravel10以前の頃のように、app/Http/Kernel.phpファイルは存在しないので、bootstrap/app.phpにミドルウェア関連の登録を行う。


```bootstrap/app.php
<?php

use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;

return Application::configure(basePath: dirname(__DIR__))
    ->withRouting(
        web: __DIR__.'/../routes/web.php',
        commands: __DIR__.'/../routes/console.php',
        health: '/up',
    )
    ->withMiddleware(function (Middleware $middleware) {
        // 以下を追記
        $middleware->group('api', [
            \Illuminate\Cookie\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            // \Illuminate\Routing\Middleware\ThrottleRequests::class, // Rate Limit
            \Illuminate\Foundation\Http\Middleware\ValidateCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ]);
    })
    ->withExceptions(function (Exceptions $exceptions) {
        //
    })->create();
```
SE→データサイエンティストになりたい


# はじめてのアドベントカレンダー
今回完走を目指して頑張りたいと思います。
やるからには全力で、25日埋めたいと思います。
どうぞよろしくお願いします。


# はじめに
今、目標として、データサイエンティストになりたいと思いました。
具体的な理由は２つあります。
- 統計学をもとにデータ分析を行うことが好きなため
- BIツールを扱っていると時間を忘れてしまうため


データサイエンティストになるためにはどのようなスキルが必要なのでしょうか。
以下、Microsoft Copilot様にお伺いしたスキル７選です。


<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>データサイエンティストに必要なスキル</title>
</head>
<body>
    <h1>データサイエンティストに必要なスキル</h1>
    <ol>
        <li><strong>プログラミング</strong>
            <ul>
                <li>PythonやR</li>
            </ul>
        </li>
        <li><strong>データベース管理</strong>
            <ul>
                <li>SQLを用いたデータベース操作</li>
            </ul>
        </li>
        <li><strong>統計学と数学</strong>
            <ul>
                <li>統計学、微分積分、線形代数</li>
            </ul>
        </li>
        <li><strong>機械学習</strong>
            <ul>
                <li>機械学習アルゴリズムの理解(大学レベルで止まっている)</li>
            </ul>
        </li>
        <li><strong>データ可視化</strong>
            <ul>
                <li>Tableau, PowerBI</li>
            </ul>
        </li>
        <li><strong>ビジネス理解</strong>
            <ul>
                <li>データ分析の結果をビジネスの文脈で解釈し、意思決定に役立てる論理力</li>
            </ul>
        </li>
        <li><strong>コミュニケーション</strong>
            <ul>
                <li>分析結果をわかりやすく伝えるためのコミュニケーションスキル</li>
            </ul>
        </li>
    </ol>
    <h1>現状課題</h1>
    <ol>
        <li><strong>プログラミング</strong>
            <ul>
                <li　style="color: red;">PythonやR (1年未満)</li>
            </ul>
        </li>
        <li><strong>データベース管理</strong>
            <ul>
                <li>SQLを用いたデータベース操作(まだ中級者程度)</li>
            </ul>
        </li>
        <li><strong>機械学習</strong>
            <ul>
                <li>機械学習アルゴリズムの理解</li>
            </ul>
        </li>
        <li><strong>データ可視化</strong>
            <ul>
                <li>Tableauの製品をより深く理解する</li>
            </ul>
        </li>
    </ol>
</body>
</html>

# 最後に
- アドベントカレンダー中にpythonや機械学習に触れる
- データ可視化のTableauに力を入れる

これをテーマに２５日間戦っていきたいと思います。
Arduinoで、ロボット操縦

こんにちは、ロボットテクノ部です。
今回は、Arduinoで、ロボット操縦をしました。

ロボット:4WD Mobile Robot Platform Kits for Education
Arduinoの種類:Arduino Due
開発環境:Arduino IDE

![DSC_0176.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3914799/e06e943f-0cbe-a66e-5f99-019f0d14dc3b.jpeg)
streamlitのインストールで詰まったお話

# streamlitのインストールで詰まった話
### 初めに
私はPython初心者であるため、もしかすると初歩的な質問や内容になることがあるかもしれませんが、ご容赦いただければ幸いです。

Pythonで簡単にWebアプリケーションの開発がしたいと思っていた矢先、便利そうなフレームワーク streamlit を発見した。早速、自分の環境で動かしてみようと思いインストールしたが詰まってしまった。原因と対象人ついて備忘録のために書いておこうと思う。
# streamlitのインストール
```
pip install streamlit
```
# エラー文
```
Collecting streamlit
＜略＞
  ERROR: Failed building wheel for pyarrow
Failed to build pyarrow
ERROR: Could not build wheels for pyarrow which use PEP 517 and cannot be installed directly
```
# 対処1
## chatGPTにエラー丸投げ -> chatGPTの指示に従う
### chatGPT様の提案
```
このエラーは、pyarrowパッケージをインストールする際に必要なビルドツールである「cmake」がインストールされていないために発生しています。pyarrowはビルドの過程でcmakeを使用するため、これがないとエラーが出ます。

解決策
cmakeのインストール:

MacOSでHomebrewを使用している場合は、次のコマンドでcmakeをインストールできます。
bash
コードをコピーする
brew install cmake
もしAnacondaを使用している場合は、以下のコマンドでcmakeをインストールできます。
bash
コードをコピーする
conda install -c conda-forge cmake
再度インストールを試みる: cmakeがインストールできたら、以下のコマンドで再度pyarrowをインストールしてください。

bash
コードをコピーする
pip install pyarrow
これで解決できるはずです。もし他にもエラーが発生した場合は、お知らせください。
```
### → 解決できず

# 対処2
## pipのバージョンが違う説
「pip　インストールできないとき」とブラウザで検索をして他の対処法を調べた。すると、pipのバージョンが違う場合にフレームワークをインストールできないことがあるらしい。そこでpipのバージョンを最新にしてみた。
### 実行したコード
```
pip install -U pip
```

### → 上手く行った？
```
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
spyder 5.1.5 requires pyqt5<5.13, which is not installed.
spyder 5.1.5 requires pyqtwebengine<5.13, which is not installed.
Successfully installed altair-5.4.1 blinker-1.9.0 gitdb-4.0.11 gitpython-3.1.43 markdown-it-py-3.0.0 mdurl-0.1.2 narwhals-1.13.3 protobuf-5.28.3 pyarrow-18.0.0 pydeck-0.9.1 pygments-2.18.0 rich-13.9.4 smmap-5.0.1 streamlit-1.40.1 tenacity-9.0.0 typing-extensions-4.12.2
```
エラーがなんか出ているが、streamlitのインストールはうまく行っている模様。

# 新たな問題発生！
vscodeでいざstreamlitを使ってみようとするも、エラーが出てくる。
エラーの概要はなんか、Pythonのバージョンが古いって感じのエラーだった
そこでPython3のバージョンをアップデートを行った。
```
brew upgrade python3
```
# 問題解決！！！
上記、アップデートで無事streamlitが使えるようになりました:relaxed:
![スクリーンショット 2024-11-12 17.13.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557805/bd940fa3-5c79-6da3-0f8b-a888a5a10fe4.png)

# 学び
### ChatGPTを信用しすぎないこと
ChatGPTに聞いたことをやる　→ うまくいかない　→ 諦める
ではなく、
ChatGPTに聞いたことをやる　→ うまくいかない　→ ChatGPTはバカだった　→ 自力で調べる（公式ドキュメントやQiitaなど）
くらいのマインドで対処したほうがいいかも。
ChatGPTに聞いて、回答が的を得ていない感じだったら自力で調べたほうが効率いい気がする。
【AWS】Lambdaから固定IPで他システムをアクセスする

AWS Lambdaから他システムにアクセスしたいが、相手側がホワイトリストやACLをかける場合、AWS LambdaのIPを固定しないといけません。ここではその設定方法をまとめてみます。

# 概要
完成図は以下になります。

![vpc.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/2d3f66f2-8e6f-0d10-da4b-ba00030e7f25.png)

# 用語
1. [VPC(Virtual Private Cloud)](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-subnet-basics.html)
AWS専用の仮想ネットワーク。
1. [インターネットゲートウェイ](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Internet_Gateway.html)
VPCをインターネット接続できるようにする機能です。
1. [ルートテーブル](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Route_Tables.html)
サブネット内の通信がどの宛先のネットワークに対して、どのコンポーネント（IGWとかEC2とか）に転送されて欲しいかを設定します。
1. Elastic IP(固定IP)
1. [NATゲートウェイ](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html)
アドレス変換を行うためのコンポーネントです。
パブリックサブネットに設置し、プライベートサブネットから外部への通信ができるようにNATする時に使用します。

# 前提
Lambdaが作成されていること

# 手順
1. VPC作成
1. インターネットゲートウェイ作成
1. public/privateサブネット作成
1. ルートテーブル作成(publicとprivate)
1. publicルートテーブル編集
1. NATゲートウェイ作成(固定IPを割り当て)
1. privateルートテーブル編集
1. セキュリティーグループ作成
1. Lambda CloudFormationの編集

## VPCの作成
VPC Console画面のメニューからVPCを作成する
![スクリーンショット 2024-11-12 15.55.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/3370a947-79e3-4910-9836-d001ea86a2f5.png)

## インターネットゲートウェイ作成
Console画面からインターネットゲートウェイを作成する
![スクリーンショット 2024-11-12 16.28.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/b938cea0-e3a5-9628-bcfd-d98a9e118e98.png)
先ほど作ったVPCにアタッチ
![スクリーンショット 2024-11-12 16.30.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/72c069b0-dd93-8ffe-697d-305da485572e.png)

## public/privateサブネット作成
![スクリーンショット 2024-11-12 16.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/2ed51623-8d98-5942-d7e1-c50cffd97850.png)

## ルートテーブル作成(publicとprivate)
publicとprivateのルートテーブルを作成する
![スクリーンショット 2024-11-12 16.45.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/1d863a85-3d56-330c-ff2b-35a477983932.png)

## publicルートテーブル編集
対象ルートテーブルを選択し、「ルートを編集」ボタンを押して編集し、インターネットゲートウェイのルートを追加する
![スクリーンショット 2024-11-12 17.03.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/adc1a8f4-d057-980a-6005-f72c9168fc29.png)
![スクリーンショット 2024-11-12 17.02.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/e080e9ef-5785-1ba7-3b11-2aef871fa4c0.png)


## NATゲートウェイ作成(固定IPを割り当て)
![スクリーンショット 2024-11-12 16.55.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/fab923d9-82fc-c279-9922-657bf219f799.png)

## privateルートテーブル編集
先ほど作ったNATゲートウェイをprivateルートテーブルに追加
![スクリーンショット 2024-11-12 17.00.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491433/ee45961f-76c3-bc14-089d-8e26a80d31de.png)

## セキュリティーグループ作成
Console画面から対象VPCのセキュリティーグループを作成する。
インバウンドルールは作成した後に追加（セキュリティグループID必要ため）

## Lambda CloudFormationの編集
対象LambdaのCloudFormationにVpcConfigの属性を追加
```json
VpcConfig: {	
  "SubnetIds": [	
    "subnet-000000000"	// private subnet
  ],	
  "SecurityGroupIds": [	
    "sg-00000000000"	
  ]	
},	
```
Plots パッケージがインストールできない

Chromebook にインストールした Julia 1.11.1 で，Plots パッケージを `pkg > add Plots` しようとしたら，なんと，6時間以上かかって挙句の果てにプリコンパイルできないというエラーメッセージを吐くという大惨事が発生した。

Plot のバージョンは最新の 1.40.8 なので，ダウングレードしようと 1.40.7 を試みるも同じ。それにしても，今どきのコンピュータで，実行時間が1時間超というのは，尋常ではない。

ちなみに，PyCall, SymPy などはちゃんと使えるようになっている。

色々試行錯誤の結果，とりあえず以下のようにすれば，なんとか Plots が使えるようになった。

1. `$ juliaup add 1.10.6` で，julia 自体をダウングレード（Julia 1.11.1 が消えるわけではない）
1. `pkg> add Plots` でパッケージを追加
1. Plots は `$ julia +1.10.6` で起動した Julia で使う。julia 1.11.1 では使えない（add Plots していない/できない　ので当然）

なにか，根本的な問題があるのかもしれません。ご指導ください。
Tableau定義の属人化への手当

Tableauユーザーの中には、システム開発の経験が少ない方も多いと思います。システムのコンサルタント出身者として、属人化リスクを軽減するための取り組みを紹介します。他のシステムにおいても属人化の問題は頻繁に発生しており、私も可視化ツールを開発してユーザーに展開する中で属人化防止策を模索してきた経験があるため、参考になれば幸いです。

## 属人化へのリスクヘッジのアプローチ

Tableauでの属人化を防ぐためのアプローチを以下にまとめました。特に後継者への引き継ぎを意識し、理解しやすく、保守しやすい定義を作成することが重要です。

### アプローチ１：難しく作らない

- **概要**: 詳しくなるほど複雑で特殊な方法を使いたくなるかもしれませんが、後継者には負担となりがちです。目的達成に必要な**最短ルートでの実装**を意識することが大切です。
- **特に重要な点**: Tableau Prepの工程は複雑化しやすいため、可能であれば事前にデータマートなどで処理し、SQLなど一般的な言語で加工するほうが、対応できる人が増えます。この方法で属人化を防ぎやすくなります。
- **メリット**: シンプルで理解しやすく、後継者が引き継ぎやすいVizの作成が可能になります。
- **留意点**: 複雑な実装は避けるべきですが、単純化しすぎると必要な機能が実装できないこともあるため、バランスが重要です。

### アプローチ２：資料に残す

- **概要**: データカタログや仕様書などの形で、データソースやTableau定義を文書として残すことが重要です。定義の背景も補足し、**後継者が変更の是非を判断しやすくする**ことがポイントです。
- **実施例**: 使用したデータフィールドの意味、設定の意図、ビジネスルールなどをドキュメント化することで、後から見直しがしやすくなります。
- **メリット**: 資料として残すことで、後任者がVizの意図や背景を把握しやすく、属人化の防止に繋がります。
- **留意点**: 資料の更新が滞ると、かえって混乱を招くことがあるため、定期的に見直しや更新を行う体制が必要です。

### アプローチ３：リファクタリングを行う

- **概要**: Tableauで定義を作る際には試行錯誤が発生しがちで、Vizが複雑になる場合が多いため、一度作成したVizを見直し、**リファクタリングすること**が保守性を高めます。
- **実施例**: 最初はCSVをデータソースとして使用しプロトタイプを作成し、効果が確認できた段階でデータマートに切り替えると、保守が容易になります。
- **メリット**: Vizが整理され、後から内容を修正したり、追加変更する際の負担が軽減されます。
- **留意点**: 最初のViz作成時にリファクタリングも見越しておくと、後での見直しがスムーズに進みます。

## 最も重要なポイント

最も大切なのは **アプローチ１「難しく作らないこと」** です。どれだけ丁寧に資料を残し、リファクタリングしても、複雑で理解しづらいVizは後継者にとって負担となりがちです。後任者が安心して引き継げる、簡潔で明確な定義を心がけましょう。属人化を防ぐためにも、シンプルで実用的なTableau設定を目指してください。
Udemy講座のハンズオンをやってみた

## はじめに
AWSの認定資格の学習をするにあたって、Udemyの講座を活用する方はとても多いと思います。

私も今回AWS SAAの学習をするにあたり、Udemyの講座を活用しました。
その中で初めてハンズオンに取り組んでみたのでその感想を書いていこうと思います。


今回利用したUdemyの講座は
・[【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/share/101WKk3@TdEwHPXHk3oCj-1dVSiYXilwwC9IbGgKjqn51Jz5aoVNBA2myL7UmpaXrxkIh24Upw==/)（ハンズオンあり）
・[【SAA-C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/share/101rfM3@ZStbDhKi67AxuANi_04PodSuAoYW3W030RrsfpCzsePydGKOmUMU_OLFQOPGwnhaYg==/)（ハンズオンなし）

です。セール中であればどちらも2000円前後で購入できると思います。

## 現状
私の状況は、
・10月からほそぼそと学習を始める
・10月末にUdemyの模擬試験6回分の講座を購入し、ひたすら解きまくる
・11月に入り行き詰ってきたため、ハンズオンがある講座を購入

という感じです。
模擬試験は初見の場合65～70%の正答率で横ばいでした。

いまいち頭が整理できていない感もあり、触ったことのないサービスの機能が理解できていない部分もあったので、ハンズオンに取り組んでみようと思い立ちました。


## 感想
#### 良かった点
* 触ったことのないサービスや機能の細かい部分を実体験しながら理解できる
* 設定後の挙動を確認できるのでただ覚えるだけより記憶に残りやすい
* 講師の方による動画での解説部分も講座に含まれているため、文字で解説を読むより理解が進む
* （問題を解くだけよりも息抜きになる）


テキストや模擬試験問題の解説で「こうなります」って書いてあるものを読むだけよりも、「実際自分でこうしたらこうなった」という体験があるほうが確実に記憶に残ると思います。

また各ハンズオンの前にあるサービスや機能を簡単に説明してくれる動画も復習としてとても役に立ちました。

#### ビミョーだった点
* 時間がかかる
* 操作するのが楽しくて知っているような基本的なサービスも触ってしまった

これは私の活用の仕方が悪かっただけで、講座の内容が悪いという話ではありません。

まず、ハンズオンをすべて実施するには相当な時間がかかると思います。
基本的なサービスとなっているS3の項目を終わらせるのに10時間くらいかかったと思います。
自分に必要なハンズオンを選んで取り組むことが重要だと思いました。
（私はこれに気付くのが遅れて結構時間を取られました。。）

また、やはりただ勉強しているだけよりも手を動かしていろいろと操作するほうが楽しいです。
でも楽しすぎてしまって、理解していない部分のハンズオンよりも楽しそうなハンズオンに取り組んでしまうことがありました。
やはり時間がかかるので、誘惑に負けず、理解が弱いサービスに絞ってハンズオンに取り組めると有効活用になるかと思います。

## さいごに
学習においてあれこれいろいろな教材に手を出すのはよくないといわれていますね。
時間を有効活用して学習を進められるよう、各教材の「いいとこどり」ができるとよいのかなと感じました。

ちなみにハンズオンに取り組んだ後の模擬試験の正答率は75%くらいになりました。（少し良くなったかな？）
KwickBit - Non-custodial Payment Gateway

KwickBit is a non-custodial payment gateway that helps eCommerce platforms and websites accept cryptocurrency payments, focusing on stablecoins like USDT and USDC. It integrates with platforms like Shopify, WooCommerce, and SquareSpace, offering automated invoicing and tools for tax declarations, including VAT collection. Our solution is ideal for businesses in regions with unstable currencies or companies looking to accept payments in stablecoins.

Contact us using the information below:
Website: https://kwickbit.com/
Twitter: https://x.com/kwickbit
LinkedIn: https://www.linkedin.com/company/kwickbit
Email: contact@kwickbit.com
Address: Telliskivi tn 60a/5, 10412 Tallinn, Estonia
Tel: (434) 546-4356
Map: https://maps.app.goo.gl/ZWb5dnpKLGHgSQYK6
PostgresでDB内にある全てのテーブルサイズを知りたい時に使うクエリ

豆知識、というか備忘録。

```sql
SELECT 
    schemaname AS schema,
    relname AS table_name,
    pg_size_pretty(pg_total_relation_size(relid)) AS total_size
FROM 
    pg_catalog.pg_statio_user_tables
ORDER BY 
    pg_total_relation_size(relid) DESC;
```

これでテーブルサイズがわかります。

出力はこんな感じ。

| schema	| table_name	| total_size |
|:-:|:-:|:-:|
| public	| large_table	| 152 MB |
| public	| medium_table | 	30 MB |
| public	| small_table	| 5 MB |

サイズの単位いらん！っていう場合はpg_size_prettyを使わなければOK。

```sql
SELECT 
    schemaname AS schema,
    relname AS table_name,
    pg_size_pretty(pg_total_relation_size(relid)) AS total_size,
    pg_total_relation_size(relid) AS total_size_row
FROM 
    pg_catalog.pg_statio_user_tables
ORDER BY 
    pg_total_relation_size(relid) DESC;
```
[更新中] [golang] 基本的な知識

# スライス
https://qiita.com/ShiroatoHiro/items/7bf048b164673e19251a

https://qiita.com/ShiroatoHiro/items/480bd0de74ed941d672f

https://qiita.com/ShiroatoHiro/items/5f2eb821f1c5f44847b8

https://qiita.com/ShiroatoHiro/items/878e5b4394e42c847883

# map 
https://qiita.com/ShiroatoHiro/items/e5bada1d1cce57d7fe09

https://qiita.com/ShiroatoHiro/items/b571dce622f1cd6e45cc

https://qiita.com/ShiroatoHiro/items/bf4dc1a20610d2c13064


# 文字列
https://qiita.com/ShiroatoHiro/items/2a746a043b6fd21c896b

https://qiita.com/ShiroatoHiro/items/2d9a9c20e22a1b605dc4

https://qiita.com/ShiroatoHiro/items/b8fbe65abdfcd9bf359c

https://qiita.com/ShiroatoHiro/items/cfb869683d73353e70a0

# 制御構造
https://qiita.com/ShiroatoHiro/items/f13c777121cf79b5fe23

https://qiita.com/ShiroatoHiro/items/337d73ce5b59017a4715

https://qiita.com/ShiroatoHiro/items/daeecc64e5585813046c

# 外部ファイル
https://qiita.com/ShiroatoHiro/items/fcd7d04d7ec7e9db6596

# テスト
https://qiita.com/ShiroatoHiro/items/a1c1727f3eac4e0466c4

# メモリ

https://qiita.com/ShiroatoHiro/items/10ca12575b2343632ffd

https://qiita.com/ShiroatoHiro/items/bcd4312e33f862a904e2

https://qiita.com/ShiroatoHiro/items/cd19e2905efc886230ca

https://qiita.com/ShiroatoHiro/items/1bae8bd95d12acf9b586

https://qiita.com/ShiroatoHiro/items/95b7c34b92d8d9420084

https://qiita.com/ShiroatoHiro/items/b6bd07d64360adc60403

https://qiita.com/ShiroatoHiro/items/eb48ede6bf59615d5872

# 評価タイミング

https://qiita.com/ShiroatoHiro/items/4524691785f947fe79b9
インスタンス変数の参照

# インスタンス変数とは？
>クラス内部ではインスタンス変数を使うことができます。インスタンス変数は同じインスタンス（同じオブジェクト）内部で共有される変数です。インスタンス変数の変数名は必ず@で始めます。

# ローカル変数
> ローカル変数はアルファベットの小文字、またはアンダースコアで始めます

# ローカル変数に代入されていないとエラーになる
```rb
irb(main):189* class User4
irb(main):190*
irb(main):191*   def initialize(name)
irb(main):192*     @name = name
irb(main):193*   end
irb(main):194*
irb(main):195*   def hello
irb(main):196*     # shuffled_name = @name.chars.shuffle.join
irb(main):197*     "Hello, I am #{shuffled_name}."
irb(main):198*   end
irb(main):199> end
=> :hello
irb(main):200> user = User.new('Alice')
(irb):54:in `initialize': wrong number of arguments (given 1, expected 3) (ArgumentError)
...
irb(main):201> user = User4.new('Alice')
=> #<User4:0x000000010ae9d710 @name="Alice">
irb(main):202> user.hello
(irb):197:in `hello': undefined local variable or method `shuffled_name' for #<User4:0x000000010ae9d710 @name="Alice"> (NameError)

    "Hello, I am #{shuffled_name}."
                   ^^^^^^^^^^^^^
```
# インスタンス変数が代入されなくてもエラーにならない
```rb
irb(main):217* class User6
irb(main):218*
irb(main):219*   def initialize(name)
irb(main):220*     # @name = name
irb(main):221*   end
irb(main):222*
irb(main):223*   def hello
irb(main):224*     # shuffled_name = @name.chars.shuffle.join
irb(main):225*     "Hello, I am #{@name}."
irb(main):226*   end
irb(main):227> end
=> :hello
irb(main):228> user = User6.new("Alice")
=> #<User6:0x000000010755cdc0>
irb(main):229> user.hello
=> "Hello, I am ."
```
# クラス外からのインスタンス変数の参照、書き換え
```rb
irb(main):275* class User7
irb(main):276*   def initialize(name)
irb(main):277*     @name = name
irb(main):278*   end
irb(main):279*
irb(main):280*   def name
irb(main):281*     @name
irb(main):282*   end
irb(main):283*
irb(main):284*   def name=(value)
irb(main):285*     @name = value
irb(main):286*   end
irb(main):287> end
=> :name=
irb(main):288> user = User7.new("Alice")
=> #<User7:0x0000000107417898 @name="Alice">
irb(main):289> user.name
=> "Alice"
irb(main):290> user.name="Bob"
=> "Bob"
irb(main):291> user.name
=> "Bob"
irb(main):292>
```
https://gihyo.jp/book/2017/978-4-7741-9397-7

* 普段railsで行っている`user.name`や`user.name="Bob"`はクラスの中でこういう処理をしてくれているおかげなのか

# 感想
インスタンス変数の書き間違え、代入をするとおかしな結果になる
ローカル変数は必ず代入して処理をする
俺のAndroid™ スマートフォンで大規模言語AIモデルを動かせる？（引言）

## 引言
なぜスマートフォンでAIモデルを動かしたいのか？
    
皆さん、こんにちは！ようです:sunny:。

最近、ITの世界がますます賢くなっているのを感じませんか？そう、AI の進化のおかげです。特に、大規模言語モデル（LLM）と呼ばれる超スマートな AI が登場して、私たちの日常生活を変えつつあります。

GPT や BERT といった名前を聞いたことがある人もいるでしょう。これらは、人間のように文章を理解し生成できる驚くべき AI モデルです。でも、ちょっと待ってください。なぜこんな話をしているのかって？実は、このすごい AI を私たちのポケットに入れて持ち歩けるかもしれないんです！そう、あなたの Android スマートフォンで動かせるかもしれないんです。

「えっ、そんなことできるの？」と思った人も多いはず。確かに、ちょっと信じられないかもしれません。でも、考えてみてください。外出先でネットに接続できないときでも、AI アシスタントが使えたら便利じゃないですか？プライバシーを気にせず、自分の端末だけで完結する AI 機能があったら素敵じゃないでしょうか？

実は、最近の調査によると、多くのスマートフォンユーザーが、プライバシーを守りつつ、いつでもどこでも AI の力を借りたいと考えているそうです。特に、個人情報を大切にしたい人や、オフラインでも使える便利なツールを求めている人たちの間で、この需要が高まっているんです。

さあ、これからの章では、この夢のような「ポケット AI」の可能性を探っていきましょう。大規模言語モデルって実際どれくらい「大規模」なのか、そしてそれをスマートフォンで動かすためにはどんな工夫が必要なのか。技術的なチャレンジあり、驚きの解決策あり、未来への期待ありの、わくわくする AI 冒険に出発です！

準備はいいですか？それでは、あなたの Android スマートフォンを、最先端の AI マシンに変身させる方法を一緒に探っていきましょう！
Java経験者向けKotlin入門ガイド

**KotlinはJavaをベースに開発されたモダンなプログラミング言語です。Javaと完全な互換性を持ち、Android開発など多くの分野で人気が高まっています。このガイドでは、Javaの経験を活かしながら、Kotlinの基礎を学べるように解説していきます。**

# Kotlinの基本的な特徴

**簡潔性**: KotlinのコードはJavaに比べて短く、読みやすくなります。

**Null安全**: KotlinはNullPointerExceptionを防ぐための仕組みを備えており、Null安全を保証します。

**相互運用性**: Javaと完全に互換性があり、同じプロジェクト内でJavaとKotlinを共存させることが可能です。

# 基本的な構文の違い

**変数の宣言**

**Kotlinでは、変数をval（不変）またはvar（可変）で宣言します。**

Java:
```Java
String name = "John";
int age = 25;
```

Kotlin:
```Java
val name: String = "John"  // 不変（変更不可）
var age: Int = 25           // 可変（変更可能）
```

**Kotlinは型推論が可能なので、明示的に型を指定しなくてもOKです:**
```Java
val name = "John"
var age = 25
```

**関数の定義**

Kotlinでは関数をfunキーワードで定義します。

Java:
```Java
public String greet(String name) {
    return "Hello, " + name;
}
```

**Kotlin:**
```Java
fun greet(name: String): String {
    return "Hello, $name"
}
```

**さらに、Kotlinではシングルエクスプレッション関数として簡潔に書くこともできます:**
```Java
fun greet(name: String) = "Hello, $name"
```

**Null安全**

Kotlinではデフォルトで変数にnullを許容しません。Nullを許容する場合は、型の後ろに?を付けます。

Java:
```Java
String name = null;  // Nullを許容
```

**Kotlin:**
```Java
val name: String? = null  // Nullを許容するには`?`を付ける
```

Null安全を保つために、安全呼び出し演算子?.やエルビス演算子?:を使用します。

val length = name?.length ?: 0  // nameがnullの場合、lengthは0

**クラスの定義**

**Kotlinではクラスの定義がより簡潔です。**

Java:
```Java
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
```

**Kotlin:**
```Java
class Person(val name: String, val age: Int)
```

Kotlinでは、getterやsetterは自動的に生成されます。また、data classを使えば、toStringやequals、hashCodeも自動生成されます。

data class User(val name: String, val age: Int)

**コレクションの操作**

**Kotlinではコレクションの操作も簡潔です。**
Java:
```Java
List<String> items = Arrays.asList("apple", "banana", "cherry");
for (String item : items) {
    System.out.println(item);
}
```
Kotlin
```Java

val items = listOf("apple", "banana", "cherry")
for (item in items) {
    println(item)
}
```

**ラムダ式を使うことでさらに簡潔に書くことができます:**

```items.forEach { item -> println(item) }```

KotlinとJavaの相互運用性

KotlinはJavaとの完全な互換性を持っており、Javaのクラスやメソッドをそのまま呼び出すことができます。

```Kotlin:
val list = ArrayList<String>()
list.add("Kotlin")
println(list[0])
```

Javaで書かれたコードも簡単にKotlinに取り込むことができるため、既存のJavaプロジェクトへの移行も容易です。

# まとめ

KotlinはJavaの経験を活かしながら、より効率的で安全な開発を可能にするモダンなプログラミング言語です。その簡潔な構文と強力な機能により、開発者の生産性を向上させることができます。Javaに慣れている方も、Kotlinを学ぶことで新たな視点を得て、さらに楽しいプログラミング体験ができるでしょう。ぜひ、Kotlinを活用して新しいプロジェクトに挑戦してみてください！

**最後までよんでいただきありがとうございます。
@y-t0910をフォロー,いいねしていただけると嬉しいです！**
【フロントエンド】アトミックデザインの限界を感じた話

## はじめに

個人開発のWebアプリケーションプロジェクトで、アトミックデザインを採用した経験について共有したいと思います。特に、実践の中で感じた課題や限界について、簡単にまとめていきたいと思います。

## アトミックデザイン導入までの流れ

私がアトミックデザインを導入するまでの経緯は、典型的な「無秩序から秩序へ」の流れでした。当初は、フロントエンドのアーキテクチャに関する深い知識がないまま、直感的にコードを書いていました。その結果、ほとんどのコンポーネントが単一のフォルダに詰め込まれ、管理が困難な状況に陥っていました。

その後、StoryBookを使用する過程で、アトミックデザインという方法論と出会いました。コンポーネントの整理に関する明確な基準を提供してくれるこの手法に、大きな可能性を感じました。個人開発という特性を活かし、コンポーネントの分割粒度は開発を進めながら徐々に決めていこうと考えました。

## 直面した課題：定義のブレ

しかし、実際の開発を進める中で、アトミックデザインの重要な注意点を軽視していたことに気付きました。事前にわかっていたことではありますが、アトミックデザインにおけるコンポーネントの定義は、個人や組織によって大きく異なり得ます。

特に苦心したのは、以下のようなコンポーネントの分類でした：

- 単独で再利用したいボタンコンポーネント
- 定数として定義すべき要素
- 特定の用途に特化した汎用性の低いコンポーネント

これらの要素を適切なレベル（アトム、モレキュール、オーガニズム）に分類しようとすると、理論上の「正しい配置」と、実用的な「コンポーネントのまとまり」が相反することがありました。

:::note warn
コンポーネントの切り方が最低効かされていないだけかもしれません。
:::


## 得られた教訓

この経験から、アトミックデザインを導入する際の重要な学びが得られました。たとえ個人開発であっても、コンポーネントの定義と分類に関する明確なガイドラインを、できるだけ早い段階で確立することが重要です。

また、アトミックデザインは優れた設計手法ですが、すべてのコンポーネントを厳密にその枠組みに当てはめようとすることには限界があると感じました。時には、プロジェクトの実情に応じて柔軟な解釈や適用が必要になることを、身をもって理解しました。

## まとめ

アトミックデザインは使いやすいと感じましたが、シンプルであるために運用者の実力が試されます。優秀な先駆者がいる場合は良いですが、そうでない場合は事前に要件を定義するほうが良いでしょう。
ネットワークを繋げているプロトコルたち

# マエガキ
走り書きのメモです。今なんとなくネットワークの全体像について理解できた気がするのでメモに残しておきます。各プロトコル単体の動きは知っていたのだけれども、それぞれがどのように絡み合っているのかをちょっと理解できた気がする。。。

# ホンダイ
デバイスAからローカルネットワーク内のデバイスBとリモートネットワーク（インターネットワーク）上のデバイスCに対してデータを送信することを考える。

まずデータをTCP (Transmission Control Protocol) や UDP (User Data Protocol) などによってヘッダを添付される。今回はTCPでの通信を考えることとする。

>TCPは送られたか確認したり、データが順番に再構築出来ているかなどを確認するため、信頼性は高いが時間が掛かるプロトコル。 
>UDPは送りっぱなしでデータが上手く送れたかどうかなどは気にしないため早いが信頼性にかけるプロトコル。

そしてTCPヘッダを付けられたデータ（TCPセグメント）にIP (Internet Protocol) に沿ったヘッダを付ける。TCPヘッダを付けられた状態のデータにIPヘッダを付けた状態のことをIPパケットと呼ぶ。
TCPセグメントをIPパケットにカプセル化する、などと言うらしい。
このIPヘッダには送信元のIPアドレスや送信先のIPアドレス、パケットの大きさなどの情報が入っている

>新しいヘッダ部を付与し、新しいパケットにすることをカプセル化する、と言うらしい

そのIPパケットをさらにイーサネットでカプセル化する。イーサネットヘッダを付けるとイーサネットフレームと呼ばれる状態のデータになる。
パケットやフレームなど言い方が変わるが、これはOSI参照モデルでの各層によるデータの単位の言い方が違うのでパケットやフレームなどとなっているが、意味としては一つの小さな単位である。

イーサネットヘッダには、送信元のMACアドレスや送信先のMACアドレスが書かれている。

こうして作成されたイーサネットフレームを送信元のデバイスAがデバイスBやデバイスCに送信される。

# ソウシン
まずはローカルネットワーク内での通信について考える。
送信元のデバイスAが先ほど作成したイーサネットフレームを用いて、デバイスBに送信される。イーサネットフレームはローカルネットワーク内で、スイッチを通じて送信先のデバイスBに届く。
この際イーサネットヘッダに付けられた送信先BのMACアドレスをもとに送信される。

それをデバイスBが受け取り、イーサネットヘッダが捨てられる。

そして、次にIPヘッダを参照し、正しいIPアドレスに届いているかを確かめる。Bのデバイスの中にも複数のIPアドレスがある場合などもあるので、本当に正しいIPアドレスかどうかをIPヘッダで確認する。

IPヘッダを捨てる。

最後にTCPヘッダを用いてデータの順序のチェックやエラーがないかなどを確認しながら、データを再構築する。（このような流れのデータがデバイスBに沢山送られてくるので、この小さいデータたちを大きい、デバイスAが送信したかった元のデータに復元する）

これにより、ローカルネットワーク内での通信が完了する。


次に、インターネットワーク上でのデータの通信について考える。

先ほどと同様にデバイスAでイーサネットフレームにカプセル化されたデータを作る。
このイーサネットヘッダによってローカルネットワーク内でルータにイーサネットフレームが送信される。

ルータでは受け取ったイーサネットフレームをデカプセル化（一番上のヘッダを捨てること。今回だとイーサネットヘッダ）して、IPパケットを取り出す。

それを次のルータのインターフェースの形に合うように再度イーサネットヘッダを添付してカプセル化する。そのイーサネットフレームを次のルータに送信する。
この時各ルータではIPヘッダを利用して、次のホップ（ルータ）を決定し、イーサネットヘッダによって再度カプセル化している。

これを繰り返していくと最終的に送信先のデバイスCがあるルータに辿り着き、そのルータで再度でカプセル化して、IPヘッダを利用してカプセル化する。それをデバイスCに送信する。

デバイスCではイーサネットフレームを受信して、それをでカプセル化して、IPヘッダを確認し、自分へのデータなのかを確認する。（先ほどと同様に複数のIPアドレスがある場合などもここで確認する）

そして、TCPによりデータを取り出す。という流れだ。

# カンソウ

それぞれのプロトコルが何か、ということはなんとなく知っているつもりだったが、それらをどのように利用して送信しているのか、について理解が曖昧だったので再度確認できてよかった。ちょっと雑な内容になっているが、自分の理解のためなので許して下さい😭。

それぞれの題名がカタカナ4文字ですが、僕の好きなニセコイという漫画の各話の題名がカタカナ4文字だったのでそれをパクらせてもらいました。最近たまたま読み直す機会があって、やっぱりいいな、、と思うので、ぜひ読んでみて下さい！
【Drupal】DDEVを使ってローカル環境にDrupal11をインストールする

2024年8月にオープンソースのCMS「Drupal」の最新バージョン11.0.0がリリースされました。
ここではローカル環境にDrupal11をインストールする手順についてご紹介します。

# Docker for Desktop

環境はDocker上にコンテナを作成し、その上でDrupal11を動かします。
そこでまずはご利用の環境にDockerをインストールします。
すでにDockerがインストールされている場合はスキップして構いません。

Dockerの公式サイトよりお使いのOSに合わせて最新版をインストールします。

https://docs.docker.com/get-started/get-docker/


# DDEV

コンテナ上にDrupalをインストールするためにDDEVと呼ばれるツールを使用します。
Docker同様にインストールしていなければ公式サイトからインストールします。


https://ddev.readthedocs.io/en/stable/users/install/ddev-installation/

上記のリンクで紹介されている以下のコマンドでもインストール可能です（mac OSの場合）

```
# Download and run the install script
curl -fsSL https://ddev.com/install.sh | bash
```


# Drupal11

最後にいよいよDrupal11をインストールします。
DDEV公式にもDrupal11の手順について紹介されていますのでこれに沿ってインストールします。

https://ddev.readthedocs.io/en/stable/users/quickstart/#drupal

最後にddev launchでDrupal11を起動していますが以下のコマンドだとブラウザ立ち上げまでやってくれます。

```
ddev launch $(ddev drush uli)
```


サイトの状態でDrupalのバージョンが11であることを確認して完了です！
※トップページ > Reports > Status Reports

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622183/ef9ae516-1d38-483c-c60e-185694b221ef.png)
CloudFront Functionを使用したリダイレクト機能の実装

Webサイトでドメイン変更を行った際、旧ドメインを新ドメインにリダイレクトさせたいと思うことがありました。そのリダイレクト処理をCloudFrontの関数を使用すれば簡単に実装できるのでその設定方法を記します。
## 前提条件
- S3 + CloudFrontの静的webサイトホスティングを使用している
- 旧ドメイン、新ドメイン共にCloudFront Distributionが作成されている

## 実現したいこと
- 旧ドメインにアクセスした際、新ドメインにリダイレクトさせる
- 但し、パスに「/test/」までの指定があった場合はリダイレクトせず旧ドメインを使用する

| 旧ドメイン | 新ドメイン |
|:-:|:-:|
| before.example.com | after.example.com |

|ケース|想定される動作|入力されるURL|リダイレクト先URL|
|:-|:-|:-|:-|
|パスに「/test/」までの指定がされている場合|旧ドメインのままリダイレクトしない|https://before.example.com/test/xxxxx|https://before.example.com/test/xxxxx|
|パスが「/test/」以外でアクセスされた場合|新ドメインにリダイレクトされる|https://before.example.com/|https://after.example.com/|

## CloudFrontの設定
1\. CloudFrontにアクセスし、左のタブから「関数」を選択する

2\. 「関数を作成」ボタンを押下し、名前と説明を入力する(何でもOK)

3\. RuntimeはCloudFront-js-2.0を選択し、関数を作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885947/6b3f7ed7-825d-e45f-01aa-b3693c27e837.png)

4\. 作成した関数から構築の関数コードの部分に下記コードを貼って変更を保存する

```javascript:redirect.js
function handler(event) {
    var request = event.request;
    var uri = request.uri;

    // リダイレクトを行う関数
    function redirectTo(newUri) {
        return {
            statusCode: 301,
            statusDescription: 'Moved Permanently',
            headers: {
                location: { value: newUri }
            }
        };
    }

    if (uri.startsWith('/test')) {
        // リダイレクト不要の場合はそのままリクエストを返す
        return request;
    }

    return redirectTo('https://after.example.com/');
}
```

5\. 発行から「関数の発行」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885947/9595cbd6-0ada-3088-91a2-adccd3c6706c.png)

6\. 関連付けられているディストリビューションから「関連付けを追加」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885947/422198d5-64e9-5e5c-715e-a1532554050c.png)

7\. 適用させるディストリビューション、イベントタイプ、キャッシュビヘイビアを選択する
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3885947/56b2e53a-a48c-7380-1f8a-42fb793447ed.png" width=60%>
- ディストリビューション...対象のディストリビューション
- イベントタイプ...Viewer repuest
- キャッシュビヘイビア...Default
で「関連付けを追加」ボタンを押下する

以上です。

## まとめ
今回初めてCloudFrontFunctionsを使用しましたが、JavaScriptが書ける人であればもっと複雑なリダイレクト処理等も問題なく行えそうな感じがありました。設定も手軽にできるので、S3 + CloudFrontでWebサイトを公開しているのであれば積極的に使用していきたいです。
ロードバランサーであるALB、NLB、GWLBの使い分け

# NLB (Network Load Balancer)
### 用途
・L4 (Transport Layer) レベルの負荷分散

### 特徴
・「**TCP**」 と 「**UDP**」 トラフィックの負荷分散に最適
・高いスループットと低レイテンシが求められるアプリケーション向け
・接続の耐障害性が高い (可用性が高い)
・「**IPアドレスベース**」の負荷分散が可能（クライアントのIPアドレスが保持される）
・固定IPを使用可能（Elastic IPとして）
・TLS/SSLオフロードはサポートされていない（直接、ターゲットに暗号化されたトラフィックが送信されます）

### 適用例
・高トラフィックなゲームサーバー、IoT、リアルタイム通信アプリケーション
・サーバーへの直接的なトラフィックが必要な場合（例えば、バックエンドでスピーディな応答が求められる場合）

### 典型的なユースケース
ゲームサーバー、リアルタイム通信、IoTデバイス、VPNゲートウェイ、UDP対応

# ALB (Application Load Balancer)
### 用途
・L7 (Application Layer) レベルの負荷分散

### 特徴
・HTTP、HTTPS（Webトラフィック）の負荷分散に最適
・リクエスト内容（URLパスやホスト名など）に基づいたルーティングが可能
・「**WebSocket**」のサポート
・SSL/TLSオフロード機能
・詳細なヘルスチェックが可能（HTTP/HTTPSステータスコードに基づく）
・コンテナ（ECS、EKS）のサービスとの連携が得意

### 適用例
・Webアプリケーション（HTTP/HTTPS）向けの負荷分散
・サービスごとのルーティングが必要な場合（例：異なるパスやホスト名に基づく処理）
・マイクロサービスアーキテクチャでのサービス間通信

### 典型的なユースケース
ECサイト、コンテナアーキテクチャ、SSL/TLSオフロード、WebSocket対応

# GWLB (Gateway Load Balancer)
### 用途
・セキュリティ機器やサービスの負荷分散

### 特徴
・L3（Network Layer）で動作し、ターゲットとして仮想アプライアンスを使用
・通常、ファイアウォール、IDS/IPS、アンチウイルス、VPNゲートウェイなどのセキュリティアプライアンスの前に配置される
・トラフィックを仮想アプライアンスに転送するため、特にセキュリティ監視や処理を行う
・ターゲットとしてインスタンス、NATゲートウェイ、VPN接続などが利用可能

### 適用例
・セキュリティ関連の処理を行う必要があるシナリオ（例：ファイアウォール、IDS/IPSなどの前で使用）
・トラフィックが流れる先がネットワークレベルでの監視や処理を要求する場合

### 典型的なユースケース
ファイアウォール、IDS/IPS、VPNゲートウェイ、DDoS対策

# 参考サイト
https://www.softbank.jp/biz/blog/cloud-technology/articles/202207/aws-loadbalancer/

https://zenn.dev/ano/articles/37444018a6b86d

https://ameblo.jp/bakery-diary/entry-12799464665.html