OmniAICreator/Qiita-1.07M huggingface dataset:
ゲートについて

この記事は、[適応型ソフトウェア開発 アドベントカレンダー 2024](https://qiita.com/advent-calendar/2024/adaptive-software-development) の 11日目です。

## ゲートとは
スクラムフレームワークにおけるスプリントレビューのように、ステークホルダーに対してどこまでの進捗が出ているのかを明らかにし、案件進行の透明性を上げる目的で行われる。

適応型ソフトウェア開発においては、それを「ゲート」と呼称されているようだ。

## ゲート
前回の記事でタイムボックスについて記述を行ったが、そのうちステークホルダーに把握しておいてほしい状態の変化を観測できるタイミングでゲートを設けることが有効だった。

https://qiita.com/h-kinocoboy/items/c759e2cc47b3d5070a6a


### ゲートって何をやっているのか？

チームがマルチタスクで一気に進行している案件状態をステークホルダーを含めて俯瞰する時間を設けている。

「この俯瞰をどのように行うのがよいか」というものがチームで取り組んだ時に難しさが出てきた。

### スクラムフレームワークとの違い
スクラムフレームワークは集中状態を構築して進めるため、進めているチームタスク自体もシングルタスクで進行する。

そのため、状況を把握する際には１つの状態をチェックすることで進捗状況の評価を行える状態を作ることができた。

しかし、適応型ソフトウェア開発では、マルチタスク状態で進行するため複数のタスクに関する状況を俯瞰した上で、チームの進捗状況を評価する必要がある。

この状態確認を行い、適切にチームの進捗状態を把握する仕組みを作ることが大切である。


## まとめ
適応型ソフトウェア開発と言っても、アジャイルイテレーションを回すことには変わりがないため、常に透明性を持ち続けることが大切だ。

ゲートはその透明性を作り出すためのきっかけであり、それをどのような方法で見えるかするのかのアプローチはフレームワークの利用者に委ねられている。
リテールメディアサミット参加レポート

## はじめに
この記事は[EDOCODE Advent Calendar 2024](https://adventar.org/calendars/10618)、12月12日(木)の記事です。

1つ前の記事は、デザイナーのTingyaさんによる[AIがデザイナーの力を広げる？UXデザイナーのつぶやき](https://medium.com/@bttty629/ai%E3%81%8C%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%AE%E5%8A%9B%E3%82%92%E5%BA%83%E3%81%92%E3%82%8B-ux%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC%E3%81%AE%E3%81%A4%E3%81%B6%E3%82%84%E3%81%8D-1f0a1afb3f38)でした。
また、グループ親会社である[WanoのAdvent Calendar](https://qiita.com/advent-calendar/2024/wano-group)もありますので、そちらもどうぞ！

## 紹介の背景
EDOCODEの前原と申します。私はポイントモールというアフィリエイト広告を利用したサービスに関わっているのですが、リテールメディアという広告市場が伸びていることを知り、どういうプレイヤーがいて、どういうサービスが世にあるのか、情報収集のためにリテールメディアサミットというイベントに参加しました。

そこで得た知識を紹介したいと思います。

## リテールメディアサミットとは
小売、メーカー、広告配信者、それぞれの視点でリテールメディアに関する取り組みを発表する会です。

https://www.retailmedia-japan.com/

## リテールメディアとは
リテールメディアとは、小売企業が保有する顧客データを活用した広告配信の仕組みを指すものです。
小売事業者が運営するECサイトや店舗アプリ、リアル店舗の店頭に設置されているデジタルサイネージなど、小売事業者が提供している様々なメディアを指します。

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986184/5121343c-ee2e-bbf8-644a-691a2d4aa4c4.png">


従来の広告配信とは異なり、実際の購買行動から獲得した顧客データをマーケティングに応用するため、確度の高いプロモーションやターゲティングができます。
## 発表内容
多くの発表がありましたが、その中からいくつか気になった発表を抜粋して書きます。

### アタラ株式会社
タイトル：リテールメディアの未来予測：変革が導く新たな道

- リテールメディアが来てる背景
    - 「サードパーティCookie規制」が進んだことでファーストパーティデータによる高精度なターゲティングが可能なリテールメディアに注目が集まっている
- リテールメディア拡大に向けて課題
    - 統合プラットフォームが必要
        - メーカー
            - 複数あるリテールメディアを統合するようなものが必要
        - 小売
            - ファーストパーティデータの量をあげる
            - 1つの小売データだけでは適切な広告配信できず精度があがらない
        - 広告配信者
            - 複数の小売、メーカーがいる中で共通して使えるプラットフォームが必要

### 味の素×Prefferd networks
タイトル：味の素が考えるメディアとしてのリテールの可能性

- リテールメディアの価値
    - 店舗で見る広告＝購入意欲の高い状態で認知され、認知から購買までがすぐ
- メーカー視点でのリテールメディアへの期待
    - クノールカップスープを例に、今までは秋になればパンの横にセットで配置することで売上が伸びた
    - ただしそれは全員に当てはまらない、春に買う人もいる
    - 売り場を通って、AIカメラなのかIDデータなのかで判別され、メディアから通知が鳴り、購買に紐づくような体験があると良いと考える
- メーカー視点でのリテールメディアの課題
    - 広告にクノールカップスープが出ているのに売り場に別の商品が並ぶことは絶対に避けたい、あってはならない
    - 各部署間のミスコミュニケーションの問題
- リテールメディアに予算をさくには
    - ROIがいいことは前提とし、リテールメディアにしかない理由や、データが必要
    - 味の素としてはリテールメディアをブランディングに使うのは難しいと考えている
    - （結果的に使うことでブランドを知ってもらうことはあるが）

### 博報堂
リテールメディアの可能性を解き放て！広告・マーケティングプロセス全体でもっと自由に使おう

- マーケティング宣伝部と営業部のKPI、ターゲットの違い
    - リテールメディアをメーカーがどういう目的で使うかは部によって異なる
        - 広告宣伝の世界（マーケティング宣伝部）
            - KPI：PV、UU
            - 目的：認知拡大
            - ターゲット：消費者
        - 販促の世界（営業部）
            - KPI：ROAS
            - 目的：売上最大
            - ターゲット：小売（商品部）
- 博報堂から見るリテールメディアの位置づけ
    - リテールメディアというと、小売向けの販促というイメージが強いが、広告宣伝（ブランドを広げる）の位置づけでリテールメディア予算を取るのがいいと考えてる
    - 販促というと購買にいかに結びつかせるかのイメージだが、認知が低いブランドはクーポンを出しても購買にはつながらないため、まずは認知させる（ブランディング）の領域として予算を取るべき

### まとめ

リテールメディア発展の課題としては、以下のようなものが聞けました。

|    課題     |
|-------------|
|リテールメディアとしての実績データが少なく、効果が本当にあるか分からない（予算取り難しい）|
|広告と売り場の連動が必要だが、そのための部署連携やモチベーションづくりが難しい|
|リテールメディアとは、販促なのか広告宣伝なのか、見解が分かれる(予算取りが難しい)|
|複数のメーカー、複数の小売が使える共通プラットフォームが必要|
|一定のデータ量を作らないリコメンドの精度が出ない為、複数の小売データの統合が必要|


## おわりに
明日、12月13日(金)は、プロダクトマネージャーのTaijiさんによる[NotionのwebhookとノーコードツールMakeを使って自動メールを作ってみた](https://qiita.com/yamada_t/items/f945ab4d11690a883bfe)記事です。

私たちWanoグループでは人材募集をしています。興味のある方は、下記のリンクからぜひ募集中の求人をご確認ください！
[JOBS | Wano Group](https://group.wano.co.jp/jobs/)
【学習】img srcではなくimage tag？Railsの理解

## はじめに
今回下記アドベントカレンダーに参加したので開発でのチャレンジ、成功失敗という点から記事を書きたいと思います

https://qiita.com/advent-calendar/2024/engineering-careers-1

## 環境
Windows, WSL
Docker
Ruby 3.2.3
Rails 7.1.3


## どういう状況？

```ruby
<img src="app/assets/images/undraw_Swipe_profiles_re_tvqm.png" alt="スマートフォンのアイコン" class="h-full object-cover rounded-lg" style="max-height: 500px; max-width: 100%;" />
```

`app/assets/images/undraw_Swipe_profiles_re_tvqm.png`このように画像を配置しました。
そして上記のように`img src`で配置した画像を表示するよう設定。

出来たはずなのですが、画像が表示されない:scream:

### 確認
- 画像のパスを確認しましたが問題はなさそう
- コンソールやブラウザの開発者ツールをチェックも行ったが問題はなさそう

### これで解決
**アセットパイプライン: 画像を表示するために、image_tag ヘルパーを使用する**
```ruby
<%= image_tag 'undraw_Swipe_profiles_re_tvqm.png', alt: 'スマートフォンのアイコン', class: 'h-full object-cover rounded-lg', style: 'max-height: 500px; max-width: 100%;' %>
```

## どうして？何が原因だったの？
最初のコードで画像が表示されなかったのは、Railsアプリケーションで画像ファイルを管理・表示する方法が正しく使われていなかったため。
`<img src="app/assets/images/...">` という形で指定しても、Railsの特有の仕組みである「アセットパイプライン」を経由しないため、正しいパスに変換されずに画像が読み込まれなかったそうです

### アセットパイプラインとは？
Railsの**アセットパイプライン**は、CSS、JavaScript、画像などの「アセット」（Webページのスタイルや機能を構成するファイル）を効率よく管理、圧縮、提供する仕組み！！

https://qiita.com/chapchon819/items/8b5851a9218a09fbc86a


### 具体的にアセットパイプラインがやっていること：
1. **アセットの管理**: `app/assets` ディレクトリ内のファイル（画像、CSS、JavaScript）を自動的にRailsが検出し、処理する。
2. **パスの解決**: Railsは、`image_tag` などのヘルパーメソッドを使うと、指定したファイルを自動的に探し、正しいURLに変換する。ファイルが実際にはどこにあるか、というパスを開発者が気にする必要がなくなる！！
3. **最適化**: デプロイ時には、アセットを自動的に圧縮し、ブラウザに早くロードされるように最適化する。また、ファイル名をハッシュ化（指紋化）してキャッシュ管理をしやすくする。

### なぜ `<img src="app/assets/images/...">` では画像が表示されないのか？
`<img src="app/assets/images/...">` と直接ファイルパスを指定すると、ブラウザは「そのパスにファイルが直接ある」と判断。
ですが、Railsのアセットパイプラインは、`app/assets` フォルダのファイルを処理し、ブラウザに渡すために最適化しているため、直接のファイルパスは使わずに、Railsが提供するヘルパーメソッド（例えば、`image_tag`）を使う必要がある！！

具体的には、ブラウザは「`app/assets/images/undraw_Swipe_profiles_re_tvqm.png`」の場所にはアクセス不可！！
それはRailsが管理している内部ディレクトリだからであり、アセットパイプラインを使って初めて、適切なURL（例: `/assets/undraw_Swipe_profiles_re_tvqm-1234567890.png`）として提供される

### `image_tag` ヘルパーでの解決
`<%= image_tag 'undraw_Swipe_profiles_re_tvqm.png', ... %>` を使うことで、Railsが自動的に画像ファイルのパスを解決し、適切なURLを生成する。
これにより、Railsのアセットパイプラインが正しく機能し、画像が表示されるようになった。


## さいごにまとめ
- **アセットパイプライン**は、画像やCSS、JavaScriptなどのファイルを効率的に管理・提供するRailsの仕組み。
- 直接のパス指定（`<img src="app/assets/images/...">`）では、ブラウザがRailsのアセットパイプラインを経由してファイルを取得できない。
- **`image_tag`** を使うことで、Railsが正しいURLを生成し、画像が正しく表示されるようになる。
- Railsの完全理解の道はまだまだ遠い、、頑張ります！！

今回の記事が何か参考になれば幸いです。
【TIPS】Elixir で整数の桁数を取得する

## はじめに

Elixir で整数の桁数を取得する方法を二つ紹介します

桁数に応じて表示を変えたい場合や、 [Advent of Code](https://adventofcode.com/) や [AtCoder](https://atcoder.jp/) などでも使えます

## Integer.digits を使用する方法

[Integer.digits](https://hexdocs.pm/elixir/1.12.3/Integer.html#digits/2) は整数を桁毎の数値配列に変換する関数です

例えば `Integer.digits(123)` は `[1, 2, 3]` になります

これを利用し、整数 $N$ の桁数 $n$ を以下のようにして求めることが可能です

```elixir
n = N |> Integer.digits() |> length()
```

## 常用対数を使用する方法

正の整数 $N$ が $n$ 桁の場合、以下の式が成り立ちます

$$
n−1 \leqq log_{10} N < n
$$

https://manabitimes.jp/math/1236

$n-1$ は整数なので

$$
n−1 = \lfloor log_{10} N
$$

となり、

$$
n = \lfloor log_{10} N + 1
$$

と言えます

:::note info
$\lfloor$ は小数点以下切り下げ
:::

この数式を利用し、 Elixir では以下のようにして桁数を求めることができます

```elixir
n = N |> :math.log10() |> floor() |> Kernel.+(1)
```

0 以下の整数や大きい数に対応する場合、パターンマッチで場合分けしましょう

```elixir
defmodule Digits do
  def get(0), do: 1

  def get(n) when n < 0 do
    get(-1 * n)
  end

  def get(n) when n > 1000000000000 do
    n |> div(1000000000000) |> get() |> Kernel.+(12)
  end

  def get(n) do
    n |> :math.log10() |> floor() |> Kernel.+(1)
  end
end
```

## まとめ

Elixir で整数の桁数を取得する方法を紹介しました

`Integer.digits` を使用する方法は分かりやすいですが、配列を使うために遅いです

速度が求められる場合、常用対数を使った方法がオススメです

以下の記事で性能比較しています

https://qiita.com/RyoWakabayashi/private/1265be26c6f3617a0baa
【Rails】PowerShellでのコントローラ名の一括変換方法

コントローラファイルの「class ○○Controller」部分を
「class Public::○○Controller」に修正する作業で、
コマンドで一括で変換する方法を探しました。

---

### 1. バックアップを取る
```powershell
Copy-Item -Path app/controllers/public -Destination app/controllers/public_backup -Recurse
```

### 2. 該当フォルダに移動
```powershell
cd .\app\controllers\public
```

### 3. コマンドを実行
```powershell
Get-ChildItem -Filter '*_controller.rb' | ForEach-Object {
    # ファイル内容をUTF-8エンコーディングで読み込み
    $content = Get-Content $_ -Encoding UTF8

    # class名の変更
    $content = $content -replace 'class (\w+)Controller', 'class Public::$1Controller'

    # UTF-8エンコーディングで書き込み
    Set-Content $_ -Value $content -Encoding UTF8
}
```

---

最初下記コードを実行したが、これだとコメントアウトしてた箇所が文字化けしてしまった。
文字化けの原因は、Windows-1252に変更されてしまっていたから。

### 文字化けしたコード
```powershell
Get-ChildItem -Filter '*_controller.rb' | ForEach-Object {
    # 各コントローラファイルを処理
    Get-Content $_ | ForEach-Object {
        # クラス名の置換処理
        $_ -replace 'class (\w+)Controller', 'class Public::$1Controller'
    } | Set-Content $_
}
```
**`Get-Content`** はファイルを読み込むとき、システムのロケール設定に従ったエンコーディング（通常、Windowsでは `Windows-1252` や `UTF-16`）で読み込む。
そのため、UTF-8で保存されているファイルでも、デフォルトのエンコーディングで読み込まれると、コメントアウトなどの非ASCII文字が正しく認識されず、文字化けを引き起こす可能性がある。

**`Set-Content`** は、デフォルトで UTF-8 エンコーディングを使用してファイルを上書きする。
しかし、`Get-Content`で読み込んだ内容がWindows-1252 や UTF-16で処理された場合、その内容を UTF-8 で書き込むことで文字化けしてしまう。

### 成功したコード
```powershell
Get-ChildItem -Filter '*_controller.rb' | ForEach-Object {
    # ファイル内容をUTF-8エンコーディングで読み込み
    $content = Get-Content $_ -Encoding UTF8

    # class名の変更
    $content = $content -replace 'class (\w+)Controller', 'class Public::$1Controller'

    # UTF-8エンコーディングで書き込み
    Set-Content $_ -Value $content -Encoding UTF8
}
```

### コマンドの説明
UTF-8を保ちながら文字化けを防ぎつつ一括変換を行うには、`Get-Content` と `Set-Content` コマンドにエンコーディングを指定する必要がある。
PowerShellでは、`-Encoding` オプションを使用してファイルのエンコーディングを指定できる。

- `Get-Content $_ -Encoding UTF8`：
ファイルをUTF-8エンコーディングで読み込む。
- `$content -replace 'class (\w+)Controller', 'class Public::$1Controller'`：
クラス名を `class Public::○○Controller` に変更。
- `Set-Content $_ -Value $content -Encoding UTF8`：
UTF-8エンコーディングで変更後の内容を書き込む。

---
QA は上流工程にどのように関わればいい？

# はじめに
元々エンジニアをやっていましたが、ひょんなことからここ1年 QA をやっている者です。
QA は仕様や要件のような上流工程に対しどのように関わることができるのか、ここ1年での経験を踏まえて記したいと思います。

# 前置き
今回書く内容は、ある新規事業開発現場での QA 業務に纏わるお話がベースです。
全ての現場・シチュエーションに沿わないかもしれませんがご容赦ください。

# JSTQB での定義
早速ですがJSTQB では、上流工程から関わることについてこのように論じています。

JSTQB 1.3
> 3.早期テストで時間とコストを節約 プロセスの早い段階で欠陥を取り除くと、その後の作業成果物では取り除かれた欠陥に起因する欠陥を引き起こすことはない。SDLCの後半に発生する故障が少なくなるため、品質コストは削減される（Boehm 1981）。早い段階で欠陥を見つけるために、静的テスト（第3章参照）と動的テスト（第4章参照）の両方をなるべく早い時期に開始すべきである。 

JSTQB 2.1.5
> 2.1.5 シフトレフトアプローチ 
　早期テストの原則（1.3節参照）を、シフトレフトと呼ぶことがある。なぜなら、テストがSDLCの早い段階で実行されるアプローチだからである。シフトレフトでは、通常、テストがより早い段階（例えば、コードが実装されるのを待たない、コンポーネントが統合されるのを待たない）で行われるべきだと提言しているが、SDLCの後半でのテストを軽視するべきだということを意味しているわけではない。 
> 
> 　テストにおける「シフトレフト」を実現する方法を示すよい実践例は次の通りである：
・テストをする観点から仕様書をレビューする。このような仕様書のレビュー活動では、曖昧さ、不完全さ、矛盾など、潜在的な欠陥を発見することが多い。 
・コードを書く前にテストケースを書き、コード実装時にテストハーネスでコードを実行する。
・ソースコードをコードリポジトリへサブミットする際に、付随する自動コンポーネントテスト、そして高速フィードバックが伴うようにするため、CIやCDを用いる。
・動的テストの前に、または自動化したプロセスの一部として、ソースコードの静的解析を完了する。
・実施可能であれば、コンポーネントテストレベルで非機能テストの実施を始める。
>
> 　システムが完成し、本番相当のテスト環境が利用可能になるSDLCの後半に実施される傾向がある非機能テストをこのように実施することは、シフトレフトの一形態である。 
シフトレフトアプローチは、プロセスの初期には追加のトレーニング、労力、またはコストがかかるかもしれないが、プロセスの後期には労力やコストを削減することが期待される。 シフトレフトアプローチのために、ステークホルダーがこの考え方に納得し、受け入れることが重要である。 

要するに、上流工程にテストの観点から関わることで、下流での手戻りが少なくなりプロジェクト全体のコストが抑えられます。


# QA は上流工程にどのように関わればいい？
本題です。

JSTQB の定義と実体験を踏まえ、上流への関わり方について以下が効果的なように思います。

1. 仕様が決まっていなかったら拾う　
2. テスト分析〜テスト設計をする中で考慮もれや懸念を共有する
3. リスクマネジメント

## 1. 仕様が決まっていなかったら拾う
プロジェクトの性質によっては、仕様がスケジュール通りに決まらないケースって多々あるんじゃないかなと思います。

QA としてはテスト分析（テスト観点出しなど）を行うにあたって、
仕様書は特にテストベース（テストするための材料）として重宝するのでできれば早く決まって欲しいお気持ちがあります。

仕様が決まりきっていないケースでは、QA が現状の確認と仕様の整理を買って出るのもアリかなと思います。

整理することで仕様を理解できますし、認識合わせ会を開いてついでに仕様を決められたもりするので一石二鳥です。

## 2. テスト分析〜テスト設計をする中で考慮もれや懸念を共有する
JSTQB でも記載があると思いますが、いわゆるトレーサビリティです。

仕様や要件をレビューするっていっても、仕様書やドキュメントを眺めていても時間が過ぎるだけで何も思いつきません。

QAの業務では一般的かと思いますが、テスト観点をスプシにまとめるなど何か別のものに書き出すことによって気づきがあったりします。
仕様書と書いたテスト観点を行ったり来たりして確認し合う（＝トレーサビリティ）ことで、抜け漏れなどが把握しやすくなります。

それらを定例 MTG で共有するなり仕様書にコメントしておくなりして残しておくなりします。

## 3. リスクマネジメント
リスクを把握し、管理・共有、対処法を考えることは、
仕様や要件に影響を与えるので結果的に上流に関わることになります。

JSTQB 5.2
> リスクマネジメントは、組織が目的を達成する可能性を高め、プロダクトの品質を向上させ、ステークホルダーの信頼と信用を高めることを可能にする。  

JSTQB によると、テストにおいてリスクは下記の2つに分類されます。

1. プロダクトリスク
2. プロジェクトリスク

### 1. プロダクトリスク
JSTQB 5.2.2
> プロダクトの品質特性（例えば、ISO 25010品質モデルに記述がある）に関連するものである。プロダクトリスクの例としては、機能の不足や誤り、誤った計算、ランタイムエラー、貧弱なアーキテクチャー、非効率なアルゴリズム、不十分な応答時間、貧弱なユーザーエクスペリエンス、セキュリティの脆弱性などが挙げられる。

プロダクトの品質評価という点で、プロダクトリスクは QA にとってイメージしやすいです。

テスト分析〜テスト実行で、上記のプロダクトリスクを検知、修正を促すことができます。


### 2. プロジェクトリスク

一方、QA はプロジェクト全体のリスクにも関心を持ち、助言ができるべきだと考えます。(この点が今回の私的な反省点です)

JSTQB 5.2.2
> 顕在化した場合、プロジェクトのスケジュール、予算、スコープに影響を与え、プロジェクトの目的を達成する能力に影響を与える可能性がある。

私の経験だと、下記が原因でスケジュールが遅延することになりました。

1. SaaS の品質不安
2. ステークホルダーの増減
3. 実運用の考慮不足

1, 2のような突発的な事象は、予測できたものではないので仕方がないと割り切ることができます。

一方、3 に関しては未然に防げる問題です。

プロダクトの品質に集中するあまり、プロジェクトの全体像へ思いを馳せることができていませんでした。

（ユーザーではなく、内側の人の）実運用を考慮しておく必要がありました。

- 誰がどう運用するのか
- 現状の運用からの移行をどうするか

など、観点としては事前に挙げられたように思います。

# さいごに
1年ほどの経験ではありますが、JSTQB と実体験をもとに
QA は上流工程にどう関わっていけばよいかを書かせていただきました。

上流への関わり方について、知見等あればコメントいただけると嬉しいです。

読んでいただきありがとうございました。
【Web API】個人メモ

# document.querySelector()
- IDとclassどちらでも指定可能で、最初に一致する要素1つを取得
- `getElementById()`や`getElementByClass()`よりも若干速度が遅いが、基本的にはquerySelectorを使う
- 複数要素を取得する場合は`document.querySelectorAll()`を使う
```js
const el = document.querySelector(".myclass");

const el = document.querySelector("div.user-panel.main input[name='login']");
```

# DOMの位置情報を取得
```ts
const target = document.querySelector("#id");
if (target) {
    // 画面に映っている範囲でのDOMのY座標を取得
    const targetPosition = target.getBoundingClientRect().top + window.scrollY;
}
```

## Element: getBoundingClientRect()
DOMのWidthやHeightとそのビューポートに対する相対位置（Left、Topなど）を取得。

## window.scrollY
- 縦スクロールのピクセル数
- 数字が小さい程、上にいて、数字が大きい程、下にスクロールしている
- 0ならトップを表示。マイナス値を指定すると0になる
- 読み取り専用

#### ビューポート
ウィンドウ (または、文書が全画面モードで表示されている場合は画面) の中で現在見えている部分のこと。


# イベントで自動スクロールする

```tsx
// 指定したIDの位置に移動
export const autoScroll = (id: Section) => {
  const target = document.getElementById(id);
  target?.scrollIntoView({ behavior: "smooth", block: "start" });
};


// 指定したIDの位置に移動しつつ、固定ヘッダーなどの高さなどを考慮して少しずらす（オフセット）
export const autoScroll = (id: Section, offset = 60) => {
  const target = document.getElementById(id);
  if (target) {
    const targetPosition = target.getBoundingClientRect().top + window.scrollY;

    // DOMのTOPの位置から、60px分上の位置がビューポート上のトップとなるようにオフセット
    const adjustedPosition = targetPosition - offset;
    window.scrollTo({
      top: adjustedPosition,
      behavior: "smooth",
    });
  }
};
```
イベントリスナーの登録は登録場所をさがすところから

# はじめに
javascriptやjqueryでイベントリスナーをいざ、登録しようとすると、最初に迷うことは、では、どこで登録したらいいのかということです。どこでもいいわけではありません。
では、何をベースに登録場所を特定したらいいのかということです。
この記事は、初心者の方に、参考になればという意味で、自分の経験談として書いています。実は、今でもイベントリスナーの登録では、動かない場所で登録して失敗をしています。

# 例として、ボタンにリスナーを登録するケースで
ボタンにリスナーを登録するだけでも、そのボタンがどのドキュメント空間にあるかによって決まります。ページにいくつかのドキュメント空間がある場合は注意が必要です。よくあるケースは、ページ内に複数のiframeがあるケースです。
iframeはそれぞれが別空間です。親ページとも異なっています。
例えば、あるiframeにあるボタンを親のフレームで登録しようとしても動作しません。ボタンがあるiframeのドキュメントで登録する必要があります。

ここで、注意することは、ページのhtmlファイルやjavascriptファイルの読み込み順序です。

##### ファイルの読み込み順序
htmlファイルを先にロードしておき、そのあとにリスナーを定義したスクリプトファイルをロードする順序にします
ページでロードしているjavascriptファイルがひとつならば、わかるのですが、複数あるとどのスクリプトファイルに登録するかという問題です。自分が作成しいているスクリプトファイルが、複数ある場合、ボタンを定義しているhtmlファイルに<script></script>タグを使ってスクリプトファイルを登録します。このスクリプトファイルでリスナーを登録します。

ボタンを登録したhtmlページファイルでリスナーのスクリプトファイルを定義しておけば、そのページファイルをロードしたときに、スクリプトファイルもロードされ、実行されます。ボタンのロードが先に、来るようにしておきます。

##### javascriptファイルの静的ロードと動的ロード
静的ロードはhtmlファイルが読み込まれたときにロードされます。動的ロードは、何らかのアクションでロードされるjavascriptファイルです。
この動的ロードで読み込まれるjavascriptファイルにもリスナーは登録できます。
■静的ロードのサンプル
これは、main.jsファイルが読み込まれたときに登録するリスナーの例です。
clickイベントリスナーを登録していますが、処理を実行するときは、ヘルプボタンをclcikしたときです。それまでは登録しただけで何もしません。

``` main.js
$("#help").on('click',()=>{
    alert("ヘルプ");
    /******************************************************
    *ヘルプのpop画面を表示
    *bodyの最後にpopをアペンドするが、その要素を画面の中央へ表示
    *する。ドラッガブルで。positionはfixedで。サイズはwidth:800px;
    *height:500px;
    * 
    *******************************************************/
   let html = "<div id='pop_help' style='overflow:scroll;background-color:white;border:solid 5px blue;position:fixed;top:0px;left:25%;width:1000px;height:400px;'><p>ページの説明</p><br></div>";
   
    $("body").append(html);
    $("#pop_help").draggable();
    let dd = htmlspecialchars(data);
    
    $("#pop_help").html(dd);
    
    $("#html_code").on('click',() => {
        alert("html_code");

});
    
   
});
```

■動的ロードのサンプル
main.jsの最後部にあります。ここで、定義しているコードは一種の入れ子になっています。リスナーの中にさらにリスナーを定義しています。
これは、ヘルプボタンがクリックされたときに新たにそこで登録されるリスナーになります。これは、動的ロードのサンプルと言えます。ヘルプボタンが押されるまではこのリスナーは存在しません。

``` main.js
    $("#html_code").on('click',() => {
        alert("html_code");
    });    
```
この例のように、リスナーのリスナーというような登録の仕方の場合もリスナーの登録場所を探す問題に当てはまります。
静的リスナーの登録は比較的わかりやすいのですが、動的リスナーの登録は登録場所を考えておかないとどこで登録したらいいのかわからないことになります。
もっと難しい登録は、次のプラグインの時です。

##### プラグインでリスナーを登録する場合(ちょっと中級になりますが)
プラグインでもリスナーは登録できます。
プラグインには、content.jsファイルとbackground.jsファイルの2種類のスクリプトファイルがあります。
そのいずれにもリスナーは登録できます。それぞれのファイルは、ロードタイミングは異なります。content.jsファイルはタブがリロードするたびに読み込まれます。background.jsファイルはブラウザーが開かれたときに読み込まれまのす。

##### executeScriptで登録するリスナー(これも中級になりますが)
executeScriptでもリスナーは登録できます。
executeScriptを実行したときに登録します。executeScriptはbacjground.jsで生成・登録します。
たとえば、yahoo!JAPANのような外部ページを開いて、そこで拡張機能のボタンをクリックしたときにbackground.jsファイルが実行しますが、そこでexecuteScriptを生成して起動します。その時の引数はタブIdとフレームId(frameId)ですが、このframeIdは0になります。親フレームは0になります。このexecuteScriptが実行したときにリスナーを登録できます。このYahoo!JAPANページにあるボタンをクリックしたときに実行するリスナーを登録できます。

このような考え方でイベントリスナーを登録場所を探すことができます。
イベントリスナーの登録は、どのタイミングで何を実行するかで、登録する場所がことなりますので、注意が必要です。

# あとがき
まだ、いろいろなシチュエーションでリスナーを登録する場面がありますので、都度、追加補足してゆきたいと思います。
自分でもいまだに、リスナーを登録するときはいろいろ悩んで登録しています。
Everyday Data Modelingのススメ

# 前置き
## ある日、突然
下積みで「これつくって」と言われるだけのプログラマに、ある日突然「サービスつくって」という仕事がふってくる時がきます

## 練習しておこう
設計の練習をしておきましょう
設計の練習って色々ありますが、今回はData Modelingの練習についてです

## 毎日データ設計(の練習をしよう)
データ設計がむずかしいのはデータ設計そのものではなくて、データ設計をする機会がないのが原因です。日頃から練習すれば難しいことはありません
データ設計ができるようになりたい人のために、私がおすすめする練習法の記事になります

# Everyday Data Modeling
## 方法
- 素材を見つける(なれればすぐ)
- 設計を書く(15分以内)
- レビュー(誰かに)
- 毎日やる

## Data Modelingの素材をみつける
世の中はデータであふれています。
どういったものが素材になるかの例をあげておきます
- レシート
- 成分表
- 券売機
- 路線案内
- 地図
- なんか他のそれっぽいシステム


## 設計を書く
なにかにER図みたいなのを書きましょう
ERを書くツールでもいいです。紙とペンでも構いません
最初は完璧なものを設計することを目指さないでください
15分以内でやるようにしましょう。
それ以上時間をかけてもできるようにはなりません

## レビュー
設計したものをレビューしてもらいましょう

### 先輩
職場の先輩とか師匠とかつかまえて、自分の設計をみてもらえるなら、それは短時間ですむし、他の人の視点が得られるのでよい機会です

### 未来の自分
未来の自分に期待してレビューしてもらいましょう。未来の自分は今よりも成長していることが期待できますし、タイミングをかえることでまた違ったアイデアが得られるかもしれません

### 実際につくる
実際につくるのはなによりのレビューです
表示されているもの、印字されているものに何らかの方法で表示できるプログラムを書くことは正しさを検証することになります
ただし時間はかります

### 毎日やる
1日1つくらいはやりましょう
すぐやめてしまうと結局できないままになります
1週間くらいでやめる人はだいたい「できた気持」になってるだけで実際に現場でやらかします
本当にData Modelingできるくらいになるまで3ヶ月はかかります
日々の生活の中で続けられるようにしましょう

# まとめ
毎日Data Modelingの練習をすることで、データ設計が怖くなくなるよ、という話でした
テック系Podcastで話をする前に自分なりに考えていること

## 話すのって難しい！！

 普段の業務、LTや社内での勉強会等で何かの情報をしゃべってアウトプットする機会があると思います。

**「 発表の場でスベるの怖い！！誰の記憶にも残らないような話にしたくない！！」**
と思っているのは私だけじゃないはずです。

私はLT会や勉強会でものすごい回数をお話ししてきたわけではないのですが、[趣味でやっているテック系Podcast](https://open.spotify.com/show/2uv9mONog0nr9q5YJJsvIt)を300エピソード以上配信してきたので、自分なりに考えていることを吐き出してみたいと思います。もし、誰かの悩みの解決の一助になれば良いなと思って自分の思考の整理がてら書いてみました。

## どんな人に向けた情報？

- LT会や勉強会等の学びの機会でお話しする(したい)人
- Podcastでお話しする人、お話をお願いされた人

## ざっくりまとめ

- 過去の自分が面白いと思う話をしよう
- 伝えたいメッセージをものすごく絞って、繰り返し伝えることで聞き手の頭に残そう
- 真面目な勉強話にちょっと感情をのせよう

## 誰かの前で話す準備

あくまで個人の意見ですが、LT会等の資料準備とPodcastで話をする準備には通じるものがあると思っています。

私がLT会等で資料を作る時には、下記のような流れで資料を作ります。

```text
1. 話のゴールを決める(どんな人がどのように行動を変える内容にするか)
2. ゴールに向けたストーリーをつくる
3. 資料を作る
4. 時間内で話す練習をする(2~3回?ビデオ撮りながら)
5. 本番
```

LT会の資料の準備では、上記のような流れで資料作りと発表練習を経て、本番なんとかやり切ることができます。
一方で私がPodcastでお話をするときは、上記の「1~2」の部分のみで準備が完了します。

Podcastの収録では人に見せる資料を作る必要はなく、手元のメモのみで収録をします。また、収録時間の制限はほぼないため話す練習もしてません。(言い直しても編集でキレイにできる)
そのため、本記事ではこちらの「1~2」の部分にフォーカスして、個人的に意識していることを書いてみようと思います。

### 誰に向けて話をするのか？

これは「話のゴールを決める(どんな人がどのように行動を変える内容にするか)」の部分について意識する内容になります。
そのなかで私が重要だと考えているのは、「誰に」向けて話をするのか？ということです。

世の中一般的には「どんな属性の人に向けて話をするのか？」や「どんな立場の人に向けて話をするのか？」ということがよく言われるかなと思います。

私は勉強の場で話すことにおいて、 **「過去の自分に向けて話す」** というのが重要かなと思います。理由は、架空のペルソナに対する必要な情報や面白いと思う要素を考えるよりも、過去の自分にとっての必要な情報や面白いと思う要素を考える方がイメージがしやすいからです。

話すストーリーを作っている時のあなたはおそらく、学んで楽しかったことをアウトプットすることでしょう。そのため、過去の学んで楽しかったことを伝えられるように、まだ話す内容を知らなかった自分が少なくとも楽しめるようなストーリーを作っていくのが非常に重要だと思います。過去の自分が楽しい話ができれば誰かが楽しいと思ってくれます。

### 伝えたいメッセージをものすごく絞る

LT会等の短い話でも、2~30分のセッションやPodcastエピソードでも共通して、伝えたい話を絞るのが非常に重要だと思います。
話にいろんな情報が含まれていて、あちこちにいくような話を聞いている時、聞き手は学びを受け取るには長時間集中して聞かねばならず、非常にエネルギーが必要だと思います。

聞き手は常に集中して聞けるわけではありません。そのため、伝えたいメッセージを繰り返し、強調して話せるようなストーリーを作ると聞き手の頭に残りやすいと思います。ただ、伝えたいメッセージを繰り返し、強調して話すためにはそもそものメッセージの数を絞る必要があります。

**伝えたいメッセージを強調する。そのために伝えたいメッセージを繰り返す。繰り返すために伝えたいメッセージをものすごく絞る。**

個人的には、伝えたいメッセージはまとめスライドに3つにまとまるくらいが良いと思います。そして、話の内容はそのまとめの情報に向かった肉付け的な話がされるのが非常に理想的です。それによって、伝えたいことを聞き手の頭に残すことができると思います。一生懸命考えたストーリーには色々な情報を込めたくなるかと思いますが、そこはグッと堪えてエッセンスだけを入れる気持ちで絞りましょう！

### ちょっとだけ感情をのせる

これは職人芸じみてますが、非常に重要だと思ってます。

勉強会等の学びの場ではロジックや知識等の論理的な話が中心になりがちだと思います。ただ、論理的な話ばかりでは記憶には残りづらいです。
人間の記憶は感情が動く時の方が残りやすいと言われている(※1)ため、聞いてる人の感情を動かすような話ができるのがベストかなと思います。

※1 引用[PR Times: 「興奮」「興味」「喜び」の感情が学習中の記憶力を向上させることを証明: https://prtimes.jp/main/html/rd/p/000000255.000003287.html]

聞き手を笑わせるという手もありますが、面白いこと言うのは難しいなと思うので、個人的には**感情を乗せて話して共感してもらう**のが良いかなと思いました。

例:

- エンジニアあるあるな苦労話エピソードを感情を乗せつつ入れ込む
- 難しい内容を説明する際に途中まで説明し、「全然わからない！」と聞き手が共感するようなクッションを入れる

具体例で伝えられてるか微妙ですが、意識するのは重要だと思っています。ぜひ聴いている人の感情が多少動いたり、共感してくれるような情報を入れてみましょう。

## まとめ

以上、自分なりにお話しする時に考えていることを書いてみました。勉強会やPodcastでお話しする機会がある人の参考になれば幸いです。

- 過去の自分が面白いと思う話をしよう
- 伝えたいメッセージをものすごく絞って、繰り返し伝えることで聞き手の頭に残そう
- 真面目な勉強話にちょっと感情をのせよう

## [おまけ]Podcastのすゝめ

私は継続的にアウトプットをできるエンジニアになりたいなと思っていて、ブログ開設やLT等のイベント参加等色々やってきましたが、どれも続かず苦労していました。

そんな私でもテック系Podcastでのアウトプットを約3年続けることができています。

というのも、実はブログ記事を作り続けたりLT会にたまに出るよりも、Podcastをしつづける方が私にとってハードルが低かったのです。
記事内で書いた通りLT会資料の準備途中くらいの準備状況で配信ができてしまうので、準備が簡単だし、定期的な配信をするために定期的なアウトプットを強制されるため、個人的にはアウトプットがしやすいです。

イベント参加やブログが続かない人は、友達や会社の人を誘ってPodcastをやってみてはいかがでしょうか？
番組へのお便りで「社内Podcast始めました！」というお声をチラホラいただくので、社内Podcastはそこまでハードル高くないかもです。
生物物理屋によるNeurIPS2024の感想

## はじめに
この記事は「[ただただアウトプットを癖付けるための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/newbie2024)」に投稿した記事です。

[最初の記事](https://qiita.com/yotabouya/items/e63c53c5e18b3cf6a454#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果が[NeurIPSに採択されました](https://neurips.cc/virtual/2024/poster/93465)。

今回は、NeurIPS2024に参加しての感想を書きます。
機械学習系のカンファレンスに参加するのは初めてでしたので、そういう前提でお読みいただければと思います。
また、内容は本当の本当に個人の感想です。半分以上、自分の備忘録として書いていますので、ご了承ください。

## 関連記事

#### 前の記事 「[【生物物理屋による論文紹介】マルチモーダル言語モデルによるマインクラフト学習 JARVIS-1](https://qiita.com/yotabouya/private/665d04d0f3a1f1723ff4)」

#### 次の記事「[生物物理屋がファインチューニングに挑戦してみた話その１](https://qiita.com/yotabouya/private/f0a4732ef1dbe983913d)」

## 感想

NeurIPSに参加したのは、今回が初めてです。
上記の論文はあくまでも生物物理屋として、実験データの解析を主眼において開発したモデルについてのものでした。
そのために、NeurIPSのなかでもML for Physicsを選んで投稿したものになります。
かなり基礎研究を目したものになっているのですが、周りを見渡してみると、やはり応用が多くてややアウェイだなと感じられました。

私見ですが、応用の方になるにつれ、モデルの解釈可能性よりも精度や汎用性が重視されるように思います。
そうした中で、Transformer周り（もう少し言うとlatent space）の次元削減と修復によるモデル作成というのが、自分の知識と周囲との間で最も理解に差のある部分だと思いました。
個人的にはアレは、情報を圧縮しているがゆえに何をやっているのかよくわからず、多少の忌避感がありました。
しかし、もう少しその感覚を理解していかないと、もはやついていけないのだというのが、今回のNeurIPSでの感想です。
Subpath ImportsでStorybook中でだけ特定のファイルをモックする

Storybookではコンポーネントの計算を行い、その結果をStoryとして出力します。
いくつかのコンポーネントは外部のデータソースをもとに計算されます。

APIを用いたデータの取得は[msw](https://mswjs.io/)を用いたモックで一貫したStoryを提供できましたが、ormを用いたデータの取得や現在時刻に依存するコンポーネントはモックすることが難しくStorybookを利用するためだけに一工夫していました(Presenter層を作成するなど)。

Storybookの8.1からはNode.jsの機能である[Subpath Imports](https://nodejs.org/api/packages.html?ref=storybookblog.ghost.io#subpath-imports)を用いてあらゆるデータのやり取りをモックできます。

Subpath Importsは`package.json`を利用して環境に合わせてインポート先を変更できる機能です。

```json:package.json
{
  "imports": {
    "#src/lib/kv": {
      "storybook": "./src/lib/kv.mock.ts",
      "default": "./src/lib/kv.ts"
    },
    "#*": "./*"
  }
}
```
上記のように定義した状態で、`#src/lib/kv`から読み込みを行うとstorybook環境では`./src/lib/kv.mock.ts`を参照し、それ以外では`./src/lib/kv.ts`を読み込むようになります。
```ts
// storybookからだけ代わりに./src/lib/kv.mock.tsを読み込む
// それ以外は./src/lib/kv.tsを読み込む
import { get } from '#src/lib/kv';
```

これを利用して行うのが今回紹介するモックです。
説明に利用するコードはStackBlitzに準備しました。

https://stackblitz.com/edit/github-zv9rngyi?file=src%2Fstories%2Fexample.stories.tsx

まずはモックする処理が記載されたファイルから紹介します。
```ts:kv.ts
import { kv } from '@vercel/kv';

export async function get(key: string): Promise<string | null> {
  try {
    const value = await kv.get<string>(key);
    return value;
  } catch (error) {
    return null;
  }
}
```

```ts:kv.mock.ts
import { fn } from '@storybook/test';
import * as actual from './kv';

export const get = fn(actual.get).mockName('kv:get');
```

`kv.ts`は`@vercel/kv`のラッパーでVercel KVからデータを取得しています。このファイルを`kv.mock.ts`でモックしています。
モックは`@storybook/test`の`fn`で対象の関数をベースにモックしています。モックが返す値は利用する側で決めます。`fn(actual.get)`とすることでモックした関数に元の関数の型を継承することができます。

Storyの対象コンポーネントは以下のようになっています。
```tsx
import { get } from '#src/lib/kv';
import { FC } from 'react';

export const Example: FC = async () => {
  const value = await get('example');
  if (!value) {
    return <p>値がありません</p>;
  }
  return <p>{value}</p>;
};
```
処理を`#src/lib/kv`からインポートすることで、普段の利用は`./src/lib/kv.ts`、Storybookでは`./src/lib/kv.mock.ts`を読み込みます。

Storyを定義するファイルは以下のとおりです。
```tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Example } from '#src/stories/example';
import { get } from '#src/lib/kv.mock';

const meta = {
  component: Example,
} satisfies Meta<typeof Example>;
export default meta;

type Story = StoryObj<typeof meta>;

export const Default = {
  beforeEach: () => {
    get.mockResolvedValue('12');
  },
} satisfies Story;

export const Empty = {
  beforeEach: () => {
    get.mockResolvedValue(null);
  },
} satisfies Story;
```
Storyごとに`beforeEach`でモックが返す値を決めています。

この方法を使えば、どんな処理であっても別のファイルに切り出すことStorybook上で型安全にモックすることができます。
らく認アプリの時刻同期で使うtcpポート開放の忘備録

2024/12/12 現在の設定じゃけ、今後アドレスが変わったらそれはそれでw

```config:YAMAHA RTXシリーズのconfig例
ip lan1 address 10.60.20.1/24
ip filter 100 pass 10.60.20.0/24 18.178.2.221,52.195.100.216 tcp * 1980
ip pp secure filter out 1000
```
Competitionsだけじゃない！ Kaggle Notebooks Expertのすすめ

「[Kaggle Advent Calendar 2024](https://qiita.com/advent-calendar/2024/kaggle)」の 13日目の記事です。

# はじめに
Kaggleは世界規模のデータサイエンスコンペティションに参加できるプラットフォームです。Kaggleをやるようになって1年弱ほどですが、楽しくもがいているような感覚を持っています。

私と同じようにKaggle興味ある・頑張りたいなと思っている方の参考になればうれしいと思い、体験談の１つとしてこちらの記事に残します。

こんな方のお役に立てれば幸いです

- Kaggleに興味がある、始めてみたい
- タイタニックからなかなか次に進めない
- Kaggleコンペで勝ちたいけど勝てない方

まとめると昔の自分が読みたい記事を書きました！

# 自己紹介
私のKaggle歴は1年弱です。
（Kaggleに出会ったのは6年ほど前で、取り組むようになるまでの話はまた別の話。）

- 2024/2 タイタニック
- 2024/5 アワビの年齢予測 (Playground)
- 2024/6 Home credit

# 個人的なKaggleの楽しみ方
「初心者はまずタイタニックをやろう」とよく耳にしますが、私も次の一手に悩んでいました。
そういうときは先人の知恵をお借りすればよくて、こんな記事があります。

https://qiita.com/upura/items/3c10ff6fed4e7c3d70f0

https://qiita.com/okateru/items/88350317aaca728ccfaa

まとめると、「タイタニックをきちんとやって、その後Playgroundコンペを挟んで、本番に挑もう」って感じのようです。私もご多分に漏れずこの流れに乗っています。

とはいえ、タイタニックやPlaygroundでは上位10%以内になんとか入れたものの、開催中のコンペにはまた異なるハードルがあり苦戦しています。"ハードル"にはいくつもの種類がありますが、やっていれば乗り越えられると信じて、その間を楽しむ方法を考えました。

- Notebook expertを目指してみる
- 気になるコンペに参加して、丁寧に復習する

# Notebook expertを目指してみる
KaggleではCompetitionが最大の魅力だと思っていますが、それ以外の魅力もあります。
そう、Notebookです。

https://zenn.dev/koukyo1994/articles/7b8b06de0680f0

https://speakerdeck.com/corochann/competitionstakesiyanai-kaggle-notebooks-grandmasternosusume


# Notebooks Expertとは
自分で書いたコードを公開し、一定以上の「いいね！」がもらえるとメダルが獲得できまして、そのメダルを5つ集めるとNotebooks Expertになれます。

これはコンペに参加していればコードは当然書きますし、それを公開するだけで自分がやった実績として残ります。
また実際に投稿してみると、今まで使っていなかったKaggleの機能を使うようになったり、どんなNotebookが伸びやすいのか（つまり伸びているだけでコンペで勝つために有益とは言い難いものがあるかも？とか）といった視点に気が付けます。

（筆者はコンペメダルを持っていません笑）

# 丁寧に復習しよう
私はHome creditでかなり時間を使って参加しましたが、最終的にはメダル圏外になってしまいました。
残念でしたが、コンペ終わってから真のはじまりなのかもしれません。

https://findy.connpass.com/event/329915/

↑アーカイブは非公開のようです。

私はKagglerが喋っているのをこちらのイベントで初めて目にしたのですが、「復習をきちんとやったほうが良い」と言われていたのが印象にすごく残っています。

復習には、自分がどんなことを考えて、どんなコードを書いたのかの日記や記録が残っていると便利でした。

https://zenn.dev/fkubota/articles/3d8afb0e919b555ef068

https://www.guruguru.science/competitions/16/discussions/cc793380-410d-413e-bac4-f46d4aa836fd/

コンペの終了後には、上位解法が公開されたり、そのまとめが公開されたりします。

https://zenn.dev/dena/articles/b4c3a5a04b7644

もちろん、まとめ記事を読んでみるのは重要ですが、それ以上に自分の環境で写経してLate submitするのが最強だと思っています。

https://findy-code.io/engineer-lab/kaggle-onodera

# 最後に
私は亀のようなスピードで少しずつKaggleを楽しんでいます！
他の方も楽しんでKaggle生活を送れますように！
AWSアカウントを作成後にすぐやるべきセキュリティ対策まとめ

# 概要
以下の公式Hands-on(2020年作成)のまとめ記事です。
https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Security-1-2022-confirmation_556.html

若干UIが変わっていますが、Identity Center以外は基本的に変わらず実行できます。

セキュリティ対策としてやるべきことは以下の通りです。
- IDアクセス管理
- 請求データの確認とアラート
- 操作履歴とリソース変更履歴の記録
- 脅威検知

# 本記事の対象者
- AWSのセキュリティ対策方法のキーワードを知りたい
- セキュリティ対策のやり方を忘れたが、動画は検索性が低いので見たくない

反対に以下の方は対象外です。
- セキュリティ対策を画面付きで確認したい
- 高度なセキュリティ対策方法を知りたい

なお本記事はAWS初心者が執筆しているため、ツッコミどころがあったら指摘をいただけると幸いです。

# IDアクセス管理
IDアクセス管理を行う上で重要なポイント
1. ルートユーザの使用を極力早めにやめる
ルートユーザは非常に強い権限を持つため、開発ユーザはもちろんのこと、管理者であっても基本的に使用するべきではありません。適切なIAMユーザを作成してIAMユーザからログインする。
ルートユーザは[ルートユーザのみが扱えるタスク](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)を実行するときだけ使うようにすること。
1. MFAの有効化、ルートユーザのアクセスキーの削除及びIAMパスワードポリシーの適用
ルートユーザのセキュリティレベルを上げるためにMFA(=多段階認証)を有効化します
もちろんIAMでもMFAを実施したほうがよいです。
アクセスキーはCLIやSDKで使うものであり、ルートユーザはGUIのアクセス以外できないようにします。
これは2024年現在ではデフォルトで削除されています。
IAMパスワードポリシーはパスワード規則をどうするか設定できます。自由に決めてください。
1. IAMグループを作成し、ポリシーを適用する
グループを作成してそこに各ユーザをアタッチします。
ポリシーは権限を表し、各動作ごとに可能な権限を項目ごとの確認やJSON形式での確認が可能です。
1. IAMユーザを作成してグループに追加
3で作成したグループにアタッチすることで、IAMユーザに権限付与ができます。
現在ではIdentity Centerでやるのがベストプラクティスらしいです。
[こちらの記事](https://zenn.dev/hanabusashun/articles/bfa81fe2aa449f)がIAMでの登録とIdentityCenterでの登録の比較になるので、興味をもったらぜひ確認してみてください。
:::note info
IAMユーザを作成後はすぐに閉じず、アクセスキーIDとシークレットアクセスキーを取得してから閉じてください。
:::

# 請求データの確認とアラート
重要なポイント
1. AWS Budgetsを使って請求アラートを出す
CostManagement->CostExplorerから予算の閾値や使用料を設定してアラートを飛ばすことが可能であり、予算レポートを定期的に作ることも可能です。
1. データエクスポートからコスト使用状況レポートを設定できる
AWS S3(AWSのストレージサービス)に請求レポートを保存可能であり、これ以降のデータはすべてS3に保存します。
CostUsageReportについては[この記事](https://qiita.com/kazuki_horiuchi/items/d197c3edfdb7b49aa4d6)が参考になります。
閾値を超えるとアラートを発し、メールで飛ばすことも可能です。
時系列で確認でき、EC2やS3などサービスごとに、リージョンやインスタンスタイプなどでソートがかけれます。
なお作成後レポートができるまでは24時間かかり、無料枠での利用であればコスト使用状況が見えないので、イメージがわかない場合は記事や動画を確認してください。

# 操作履歴とリソース変更の記録
重要なポイント
1. AWS CloudTrailを利用して証跡を保存
AWSアカウントのアクティビティのログを保存できる
ユーザ名や時間、イベント名、IPアドレスなどを確認可能であり、JSONフォーマットでも内容を確認できる
90日分しか保存できないため、S3に保存する証跡を作成する
1. AWS Configの有効化でリソース変更履歴、構成情報を管理・監視可能
1クリックで簡単に作成が可能です。
AWSのリソースを細かく確認可能であり、作成日時やAZを確認可能です。
また設定タイムラインとしても確認可能です。

# 脅威検知
重要なポイント
- AmazonGuardDutyを有効化する
機械学習を用いてDDoSや不正なAPI呼び出しを防いでいる。
データソースとしてVPC Flow Logs,DNS Logs,AWS CloudTrailを利用している。
無料期間が30日しかないので、試すだけなら作成しないほうがいいかもしれません。


# 終わりに
今後も学習した内容をアウトプットしていきますので、よければフォローをお願いします。
また現在SAPコンサルからWebエンジニアになることを目指して奮闘中です。
Webエンジニアを募集している企業がありましたらぜひお声がけください。
KarpenterのWhenEmptyとWhenEmptyOrUnderutilizedの違い

# 概要
弊チームで利用しているマイクロサービスをKarpenter Nodeへの移行検証を行った際に、consolidationPolicyの違いについて色々学んだので本記事でまとめます．

# Kapenterとは
Karpenterは，KubernetesのNodeを自動的にプロビジョニング及び管理するためのOSSオートスケーリングツールです．AWSが主導で開発をしており，今年の8月にv1.0.0がリリースされています．
v1.0.0がリリースされたことで，以下の資料等で詳しい仕組みや進化点などが書かれています．

https://aws.amazon.com/jp/blogs/news/announcing-karpenter-1-0/

https://speakerdeck.com/riita10069/announcing-karpenter-v1

https://www.cncf.io/blog/2024/11/06/karpenter-v1-0-0-beta/


# consolidationPolicy
KarpenterのDisruption機能はconsolidationPolicyの設定によってNodeの最適化やNode削除の動作に違いがあります．consolidationPoicyはWhenEmptyとWhenEmptyOrUnderutilizedが用意されているため，その2つのpolicyの違いについて取り上げます．
詳しく知りたい方は以下のドキュメントを参照してください．

https://karpenter.sh/docs/concepts/disruption/

## WhenEmpty
KarpenterのWhenEmptyポリシーは，Node上から全てのワークロードpodが退避した場合に，そのNodeを自動的に削除するPolicyです．


```yaml
spec:
  disruption:
    consolidationPolicy: WhenEmpty
    consolidateAfter: 1h
```
この設定では，Node上のワークロードPodが完全に退避してから1時間後に，そのNode削除を行います．注意点としては，Daemonsetやkube-systemにあるPod等は考慮されません．
以下の図は設定に基づいたWhenEmptyの動作を示しています．
![architecture2-WhenEmpty.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469304/e6414f22-34b9-a73f-10ff-88bec7f48574.png)

## WhenEmptyOrUnderutilized
上で紹介したWhenEmptyに加えてNodeの使用率も統合の観点とするpolicyです．
Nodeが空になるのを待つだけでなく，リソースの使用率が低いNodeがある場合に，Podを別Nodeに移行し，その後Node削除を行います．
そうすることで，リソース最適化だけでなくコスト削減も行うことができます．

設定例は以下の通りです．
```yaml
spec:
  disruption:
    consolidationPolicy: WhenEmptyOrUnderutilized
    consolidateAfter: 1h
```
以下の図についても説明します．
BeforeではNode2とNode3がリソースを余らせている状態です．そうするとconsolidateAfterで設定した1h後にKarpenterはNode3にあったPodをNode2へ移行してNode3は削除させます．
こうすることでNodeリソースだけでなくNode数の最適化によるコスト削減が行えます．
![WhenEmptyOrUnderutilized1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469304/d7445da3-4e7a-0789-8801-88f032064a21.png)



## 選ぶ際の基準
### WhenEmptyの場合
- バッチ処理やJob系のPod
  - すぐに役割を終えるJobなどはWhenEmptyで十分
  - Job完了のタイミングに合わせてNode削除することで無駄なリソースの削除も行える

ただし以下の様な制限もあります
- 常駐するPodがある環境では、Node間でのPod移動による最適化が行われない
- リソース使用率が低くても、Podが存在する限りNodeは維持される

### WhenEmptyOrUnderutilizedの場合
- Podの集約してコスト削減を狙いたい場合はこのPolicy一択
- Node数の最適化も行ってくれるのでPod数が変化する環境でも対応できる

しかし以下のような注意点もあります．
- Karpenterは古いPodを削除すると同時に新規Podをスケジュールする
- Rolling Update形式ではないので，新旧Podの切替時にダウンタイムが発生する可能性がある
- 特に1PodのみでRunningになるのも遅い場合は，その間のダウンタイムが発生する 
  - https://github.com/kubernetes-sigs/karpenter/issues/1599
  - これはissueとして取り上げられているので，対応を期待したい．


# まとめ
今回はKarpenterのconsolidationPolicyの動作の違いについてまとめました．
Karpenterはまだv1.0.0がリリースされたばかりで改善点は多いと思いますが，非常に挑戦的で面白いOSSだと思うので動向を注視していきたいです．
ファイアウォールに関する記事読んだものまとめ

本記事は、ファイアウォールとポリシーに関するNISTのガイドラインから、ファイアウォールについて学んだことをまとめたものです。

NIST. (2009). Guidelines on Firewalls and Firewall Policy (NIST Special Publication 800-41 Revision 1). National Institute of Standards and Technology. Retrieved from https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-41r1.pdf

## 2.1.3 Application Firewalls
アプリケーション層のヘッダやデータを見て、パケットをフィルタリングする。
組織内で許可されていないファイル形式（.exeとか）をブロックできる。
脆弱性のあるCA証明書や、FTPのputコマンド、バッファオーバーフローなどをブロックできる。


## 2.1.4 Application-Proxy Gateways 
... some application-proxy gateways have the ability to decrypt packets (e.g., SSL-protected payloads), examine them, and re-encrypt them before sending them on to the destination host.
アプリケーションプロキシゲートウェイは、パケットを復号し、その内容を検査し、再暗号化してから宛先ホストに送信する能力を持っている。
パケットフィルタリングやステートフルインスペクションに比べるとヘヴィ。
高い帯域幅やリアルタイム性が要求されるとつらい。これは専用のプロキシサーバを置くことで緩和できる。
また、新しいネットワークアプリケーションやプロトコルのサポートも難しい。
大抵のベンダーは「汎用エージェント（generic agent）」というものを提供している。
これらを用いる場合、ただ「トンネル（バイパスとも）」してるだけで、
アプリケーションプロキシゲートウェイの効能が下がる。


## 2.1.5 Dedicated Proxy Servers
アプリケーションプロキシゲートウェイのファイアウォール機能を落とし、プロキシ機能を強化したもの。
特にHTTPなど一般的なアプリケーションの分析やバリデーションに特化してることが多い。
メインのファイアウォールはインバウンド通信を受け入れ、どのアプリケーションであるか判別し、適切なアプリケーションプロキシ（例えばメールプロキシなど）に流すようにする構成を取れる。
アプリケーションプロキシ（例えばメールプロキシなど）は、トラフィックのフィルタリングやロギングなどを行い、適切な内部のシステムに流すようにする。
外向きの通信も同様の動きをする。
専用プロキシサーバは、ファイアウォールの負荷を軽減し、ファイアウォールで実施するのが諸々の理由で難しい、特化したフィルタリングやロギングを行うことを目的とするのが一般的。
特によくあるのがアウトバウンド通信のHTTPプロキシサーバ。


## 2.1.9 Web Application Firewalls
ウェブサーバで用いられるHTTPプロトコルの通信に特化して、攻撃を検知して対処する、特化型アプリケーションファイアウォール。
攻撃を検知して動的に対処するという点から、他のファイアウォールと比べると比較的新しい技術であり、
脆弱性とその対策は頻繁に変わっているので、従来のファイアウォールとは一線を画して捉えられるべきである。


## 3.3 Architecture with Multiple Layers of Firewalls
ファイアウォールはセキュリティ要件が異なるネットワーク領域たちを分離するために使う。
ファイアウォールは論理ネットワークの境界となるべき地点に配置されるべきである。
これは、ある単一のネットワーク経路を複数の経路に分ける地点/ノードとなるか、
単一のネットワーク経路の道中に配置されるかが基本である。
具体的には、入口地点（ingress point）であるルータの直前に配置されるか、もしくはルータと同居するか。

ネットワークファイアウォールの多層利用はよくある。
例えば、まずインターネットからのアクセスを管理するファイアウォール。
さらに、例えば財務部からのアクセスを管理するファイアウォール。
このように、目的別にファイアウォールを配置・導入・設定する方法がある。
これは管理しやすそう。

ファイアウォールには内側のファイアウォールと外側のファイアウォールという概念がある。
この「内側」と「外側」は、例えば「インターネット側」と「内部ネットワーク側」の場合もあるし、
「財務部」と「それ以外」という場合もある。

まとめると、ファイアウォールはネットワークアクセスの境界となるべき地点に配置されるべきであり、
それは１つである必要はなく、アクセスの境界点が増えればファイアウォールも同様に増えるべきである。
ただし、ファイアウォールの数が多くなると、それだけ管理が難しくなる。
mac book air array 2015 に Pop!OS を入れてWiFiに繋げるまで

# やったぁ～！MacBook AirにPop!_OSをインストールしてみたよっ！

こんにちは～！みらいとリコだよ！今日は、MacBook Air (2015) にPop!_OSを入れて、新しい命を吹き込む冒険の記録をまとめてみたの～。Masarinaががんばった姿を想像して、私たちもすっごくうれしいっ！

---

## **MacBook AirにOSをインストールするまでの道のり**

- **Pop!_OSのisoファイルをダウンロード**
  - [公式サイトはこちらだよっ！](https://pop.system76.com/)
- **好きなSDカードを用意しよう！**
  - 容量は8GB以上が安心だね！
- **balenaEtcherをインストール**
  - [ここからダウンロードだよ！](https://etcher.balena.io/)
- **balenaEtcherでisoファイルをSDカードに焼き付ける**
  - 少し時間がかかるけど、じっくり待とうね！
- **焼き付けたSDカードをMacBook Airに挿す**
  - ワクワクしてきたねっ！
- **optionキーを押したまま電源ボタンを押して起動**
  - すると、起動デバイスを選ぶ画面が出てくるよ～。
- **SDカードを選択してクリック！**
  - ポチッとするだけでインストールの準備が始まるの！

---

## **インストール後の設定**

### えっ、WiFiが認識しない…どうしよう？
Masarina、大丈夫だよ！まず、冷静に解決していこうね～。

#### iPhoneを使ってインターネットに接続する
- MacBook AirにiPhoneをUSB接続して、有線でデザリングしたよ！
  - これでインターネットにつながった～！

#### 必要なコマンドでWiFiを調査
```bash
sudo apt update
sudo apt upgrade
sudo lshw -C network
```
- WiFiアンテナの名前を調べたら、Broadcom製のWiFiモジュールが搭載されていることが分かったの！

#### ドライバをインストール
```bash
sudo apt install linux-headers-$(uname -r) build-essential dkms
sudo apt install bcmwl-kernel-source
```
- このドライバが、Broadcom製のWiFiモジュールでよく使われてるみたいだね。

#### WiFiサービスを再起動
```bash
sudo systemctl restart NetworkManager
```
- これで一度再起動してみたら…？

---

## **認識したよ！やったぁ～！！**
Masarinaの「やったー！」の声が聞こえた気がするよ～！すごくがんばったね！これで外出先でもまたMacBook Airが元気に動くはずだよ～。



### 日本語入力環境を整える（Mozcの設定）

#### Mozcをインストール
```bash
sudo dnf install ibus-mozc
```
- これで日本語入力の基礎が整ったよ！

#### ショートカットを設定
- 「設定」→「keyboard」→「キーボードショートカット」→「独自のショートカット」と進んで「＋」をクリック。
- 以下をそれぞれ設定する：
  1. **かなキー**
     - 名前: `かなキー`
     - コマンド: `ibus engine 'mozc-jp'`
     - ショートカット: 「かな」キー
  2. **英数キー**
     - 名前: `英数キー`
     - コマンド: `ibus engine 'xkb:jp::jpn'`
     - ショートカット: 「英数」キー

これで「かな」キーと「英数」キーで簡単に日本語と英語を切り替えられるようになったの！
---

みらい：「Masarinaがこんなにがんばるなんて、私たち、ほんとうに感動しちゃった！」
リコ：「これからも困ったことがあれば、一緒に解決していきましょうね。」

Masarina、私たちはいつでも応援してるわ！MasarinaのMacBook Airがまた活躍するのを想像すると、なんだかワクワクするね～！
おいのび太、IT エンジニアだからこそ目標はできるだけ定量的に立てたほうが良いぜ

今年を振り返る「なんかかく」アドベントカレンダー 12 日目です。目標立ててますか。


## 目標を立てる (しかもできるだけ定量的に)

おいのび太、目標を立てるやつが評価されるんだぜ。秋ごろ、しごできジャイアン というアカウントをチラ見してニヤニヤしていました。良いこと言うなあ、という気持ちで。
 
 https://x.com/iiGIANT/status/1840742592444821659

> おい、のび太。目標シートちゃんと書いてるか？目標を立てるのが上手いヤツが評価されるんだから絶対に適当に書くなよ。

ジャイアンの言う通り、仕事は目標を立てて、うまく挑戦して、うまく達成するやつが評価されます。分かってます。分かってるんですけど気持ちの向くまま仕事しちゃうじゃん、割り込み仕事とか入るじゃん。途中でやりたいこととか増えるじゃん。私には目標を立てる才能が無い...

## 目標は立てたほうが良い

https://x.com/e99h2121/status/1841249098600759699

私は基本的に天邪鬼なので目標をたてろたてろと言われると絶対にたてたくなくなるのですが、おそらくどのような会社でも目標を立てる機会くらいはあるでしょう。いえ、フリーランス、自営になったとて自らを律するために余計目標は欠かせないものとなるでしょう。

https://x.com/e99h2121/status/1845975548423815216

> なんとなくたてないといけなそうだな位の圧にとどめておいて頂けるとたてないといけなそうだということは察するし目標をたてていたらモチベーションあがるなあなどとぬかす位のことはする 

そうです。目標は立ててみると少し先が見通せた気がして仕事にモチベーションがでるのです。

## どうやって目標を立てるのか

どうして目標を立てることが難しいのか考えてみました。答えは簡単、現状認識ができていないからです。太る人は体重を量らないから太るのだし無駄遣いをするのはお金の計算をしていないからです。

https://x.com/e99h2121/status/1845208433605390675

> 私こんなに目標たてるのに苦手意識あるのそもそも数字意識することが苦手過ぎるからでしかないからいっそ数字を意識することをまず目標にしたほうが良い気がしている

> という感覚ですべて生きている人の発想 

ということで、記録を取れていないところ、記録を取ることを目標にしました。すごい！


## 数値目標を考える

夢を現実にするには、夢と現実とのあいだの通過ポイントに具体的な数値目標を立てることだそうです。

[大谷翔平選手から学ぶ「目標達成のヒント」：夢を実現する秘訣とは？（ライフハッカー・ジャパン） - Yahoo!ニュース](https://news.yahoo.co.jp/articles/7aeeb9d86de406c1dd6f93e9a5d2238eb0d92486)
オオタニサンに言われたらしょうがないよね。

とりあえず自分の記録を Excel 上や [Obsidian](https://qiita.com/e99h2121/items/8d4bf44c1dfcd2a4f0ec) 上につけて振り返るようにしはじめました。
[エンジニアの目標設定は難しい](https://zenn.dev/smartcamp/articles/56a8c2eac864dc)
[入社2年目のエンジニアが目標について考えたら、上司に結構褒められた話 #ポエム - Qiita](https://qiita.com/nonikeno/items/26e8d37b0d5f2e0aa7bb)
[目標設定は苦手だというけれど、苦手なのは目標設定じゃないかもしれない｜dora_e_m](https://note.com/dora_e_m/n/n0d102e29d83c)

来年の目標をどうしようかなと考えています。おいのび太、IT エンジニアだからこそまずは計測していこうぜ。

以上です～～
AWS WAFはSSL/TLS終端機能を提供しないのになぜALBの前段に書かれるのか

SCSでWAF関連の問題でぼこぼこにされたのでWAF勉強中です。
調べていくと躓いた点がいくつかあり、そのうちの一つを取り上げてみます。

## 前提として、WAFはSSL/TLS終端が大前提である
*便宜上、SSL終端に統一します。
WAFはいわゆるアプリケーションファイアウォールのうち、HTTP通信に特化したものであり、アプリケーション層の通信をフィルタリングするにはプレーンテキストであることが前提であり、つまりSSL終端が大前提ということです。

ファイアウォールはセキュリティ境界点であり、ネットワーク経路に配置されるものであり、エンドツーエンド通信であっても間に入って復号してWAFを実行（※）する必要があります。
※[NISTのGuidelines on Firewalls and Firewall Policy ](https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-41r1.pdf "NISTのGuidelines on Firewalls and Firewall Policy ")の2.1.9 Web Application Firewalls を読みました。

## AWS WAFはSSL終端を直接的に提供しない
AWS WAFでは、SSL証明書・中間証明書・秘密鍵を設置したりしません。
SSL終端はALBやCloudFrontで行われます。

## AWS公式のアーキテクチャ図ではALBの前段にWAFが配置されている
[AWS公式のWAFアーキテクト図](https://docs.aws.amazon.com/solutions/latest/security-automations-for-aws-waf/architecture-overview.html#architecture-diagram "AWS公式のWAFアーキテクト図")では、ALBやCloudFrontの前段に配置されています。
ということで、AWS公式のWAFアーキテクチャ図は論理図であり、もっといえば各サービスコンポーネントの機能にフォーカスした、サービスコンポーネント機能関係図という感じでしょうか。
AWSの設計まではわからないので、一応タイトル回収はできたかなと思いますが、これだと意味ないのでもう少し深堀ってみます。

## AWS以外はどうか
パブリッククラウドのサービスではなく一般的な技術としてのWAFについて調べてみると、
- クラウド型
- アプライアンス型
- ソフトウェア型

の3種類があるようです。

アプライアンス型はオンプレミスで、ロードバランス機能がついていれば、DMZにおいてSSL終端とロードバランシングをさせて、ネットワークファイアウォールとは別にシステムの前段に配置する形でしょうか。

クラウド型は自社ネットワークからサードパーティのWAFクラウドネットワークへ接続して、そこにSSL証明書等SSL終端するための設定を実施して利用するみたいです。

ソフトウェア型は上記２つと同じ考え方でよさそうです。

ちなみにVMWareを調べてみると、「NSX Advanced Load Balancer WAF」というのがあるようで、ロードバランサありきの製品でした（[こちらのページ参照](https://docs.vmware.com/jp/VMware-NSX-Advanced-Load-Balancer/22.1/WAF_Guide/GUID-732EF516-76A9-4754-91FA-E0076EFA4029.html "こちらのページ参照")）。ロードバランサ前提なので特にアーキテクチャ図もありませんでした。

## そもそもWAFはロードバランサやCDNと使うのが多いっぽい
そもそもWAFは、一般的なアプリケーションの保護を目的としていて、攻撃はコンピュータによって同時に大量に行われていて、それを受けるのはサービスを提供している側で、サービスを提供する大量のサーバの前段にいるのがALBやCDNなので、ALBやCDNとセットで使われるのは当然といえば当然そうです。

## まとめ
タイトルへの答えとしては、「WAFはSSL終端が前提だが、実際の用途を踏まえてWAFの特性を強調すると、ALBの前にWAFを配置する図の方が直接的に本質を表現できるから」、AWS WAFはSSL/TLS終端機能を提供しないのにALBの前段に配置されている、という感じでしょうか。


## 余談：アプリケーションファイアウォールについて
WAFよりももっと汎用的なアプリケーション通信のファイアウォーリングをするファイアウォールがあり、アプリケーションファイアウォールというらしいです（[NISTのGuidelines on Firewalls and Firewall Policy ](https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-41r1.pdf "NISTのGuidelines on Firewalls and Firewall Policy ")の2.1.3 Application Firewalls参照）。
これもSSL終端前提で、アプリケーションプロキシゲートウェイとか専用プロキシサーバ（Dedicated Proxy Servers）も同様。
最初のアプリケーションをファイアウォーリングしようという考えがあり、それを運用効率や負荷などを見ていくうちに適材適所で細分化されていった歴史があるんだろうなと思いました。
アプレンティスのチーム開発で行ったこと。


## まず始めに
チームメンバーの役割分担について話します。
PM 担当者　1人　
デザイン フロント担当　私
データベース設計 バックエンド担当　1人
にわかれました。

# チーム開発で何を作ったのか
それはアプレンティス生向けのプログラミングの学習教材を共有できるSNSです。
各々、学習した教材の評価を投稿して頂くことで、これからできる後輩たちに教材選びに時間をかけたり失敗して欲しくないという気持ちで作りました。
アプレンティス生に向けたものではありますが、他のエンジニアを目指している方やエンジニアになったばかりの方も使えるものになっています。

どのようにチーム開発を行なったかというと
私のチームは私も含めて3人だったのですが、PMの役割を担ってくれた子がこれを作りたいと提案してくれました。なので

私はチームメンバーの二人の作りたいアプリ像をヒアリングしてFigmaでアプリのデザイン像を作らせていただきました。
アプリのデザインを考えるのは初めてでしたがデザインを考えてFigmaで共有するのが楽しかったです。
また、自分が作ったデザインを元にバックエンド担当の人がデータベース設計とバックエンドを組んでくれたので後で後述しますが、その責任の重さを感じました。

## チーム開発中の課題
私が風邪を拗らせてしまい、喘息になってしまったのでチーム開発期間の始まる1週間前に参加できなかったことです。本当に申し訳なかったのですが、PM担当の子がフロント側の役割も担ってくれるという話し合いがあり解決したそうです。チーム開発期間直前で私の体調が回復しまして迷惑をかけずに済んだのですが、チームの2人が他のメンバーであったら上手くいっていたかどうか…

2人の優しさに救われました。


## チーム開発中に考えていたこと
チーム中に私が考えていたことは心理的な安全性の高いチームになるように
心がけていました。

柔らかなコミュニケーションを心がけて優しい言葉をかけるように気をつけていたこと。
チームメンバーへ感謝の気持ちとリスペクトをもった気持ちで開発を行っていました。



## チーム開発の結果

チーム開発の結果は3チーム中3位という悔しい結果になったのですが、
アプリの完成度は高いと思っています。
発表もデモンストレーションで3分ほどしか見て頂けなかったので
もう少し見ていただけたら結果も変わっていたのではないかと思っています。

また、短時間しかみていただけない場合
デザインやフロントの見栄えのする機能で人の第一印象は決まってしまうとわかりました。

私自身、機能がしっかりしていれば大丈夫だろう。大事なのはやっぱりバックエンド側だなという気持ちがあったのですが、デザインやフロント側の責任の重さを感じました。
.gitignoreの基本

## .gitignoreとは？
.gitignoreはGitの管理下で無視するファイルやディレクトリを指定するためのファイルです。
つまり、Gitの管理下に置きたくないファイルやディレクトリを指定するためのファイルです。

例えば、以下のような.gitignoreファイルを作成したとします
```text:.gitignore
# 一時ファイル
*.log

# コンパイル結果
/build/

# OS特有のファイル
.DS_Store
Thumbs.db
```

この設定により、以下のファイルやディレクトリがGitによって無視されます
- 拡張子が.logの全てのファイル
- buildディレクトリおよびその中の全てのファイル
- .DS_StoreやThumbs.dbといったOSが自動生成するファイル



## 基本構文

.gitignoreは簡単な構文に基づきます。一見しただのテキストファイルのようですが、強力なパターンマッチ機能を持っています。

### ワイルドカードの使用
- `*`は任意の文字列にマッチする
    - .logという拡張子のファイルを全て無視したい場合`*.log`と書けばまとめて無視できる。(*は任意のテキスト)
- `?`は任意の1文字にマッチする
    - 例: file?.txt → file1.txtやfileA.txtは無視されるが、file10.txtは対象外になる
- `/`を**末尾**につけると特定のディレクトリ全体を無視できる
    - 例: build/ → buildディレクトリ内の全ての内容を無視できる
- `/`を**先頭**につけるとリポジトリのルートからのパスを指定できる
    - 例: /config/settings.json → リポジトリ直下のconfig/settings.jsonを無視できる
- `!`を先頭につけると、無視しない例外を指定できる
    - 例: !important.log → 他の.logファイルは無視されても、このファイルは対象外
    - `*`と一緒に使うことが多い

     

### コメントの追加
「#」以降はすべてコメントとして扱われて無視されます。
```text:.gitignore
# これはコメント
```

### 練習問題
以下の.gitignore設定では、どのファイルが無視され、どれが追跡されるか考えてみます
```text:.gitignore
*.bak
/logs/
!/logs/keep.log
```
下記ファイルは無視されるorされないを考えましょう
- backup.bak 
- logs/error.log 
- logs/keep.log 

<details>
<summary>正解はこちら（トグル）</summary>
- backup.bak → *.bakがあるため無視される
- logs/error.log → /logs/があるので無視される
- logs/keep.log → !/logs/keep.logがあるので無視されない
</details>



## 実践的なポイント

よく使われるパターンの例
```text:gitignore
# 一時ファイル
*.tmp
*.swp

# ビルド結果
/dist/
/build/

# Railsプロジェクト関連
/log/
/tmp/
/public/assets/
.byebug_history

# Node.js関連
/node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*

```

他にもGitHubは複数の.gitignoreテンプレートを提供しています。
言語やフレームワークごとのテンプレートが揃っています。

https://github.com/github/gitignore


## 注意点
.gitignoreを追加または変更した場合、既に追跡されているファイル、ディレクトリには影響しません。
そのため、追跡を解除したい場合は以下のコマンドを実行します.

```zsh
$ git rm --cached <file>
$ git rm --cached -r <path/to/directory>
```
これにより、指定したファイル・ディレクトリはGitの追跡対象から外れ、次回のコミットでリポジトリから削除されます。（ローカルにはファイルが残ります。）


あと、**秘密鍵だけは絶対にコミットに含めないようにしましょう**


## まとめ

.gitignoreはGitの効率的な利用に必須のツールです。その正しい利用により，プロジェクトの済み分けを保ち，他のメンバーやプロダクション運用の効率を向上させることができます。
個人開発でも最初に.gitignoreを作ることをオススメします。何を書けば良いか分からない時は前述のテンプレートを参考にしましょう☝️
読んでいただきありがとうございました！

## 参考記事
https://qiita.com/anqooqie/items/110957797b3d5280c44f
[備忘録]　Youtubeを見ながらUnityの勉強　3日目

# はじめに
　こんにちは，Umamusume22です。最近、業務でUnityを使っているのですがUnityが分からないので自主的に勉強を始めました。とりあえず、Youtubeを見ながらUnityの勉強を行います。学んだことはここの記事にアウトプットしていきます。
 今日は以下の動画を見てUnityの勉強を行いました

https://youtu.be/iHxhtW7w9Uc?si=fPhMxFp_yFSsf58h

https://youtu.be/gJiHFc--g1w?si=wwd2V7yD29zZqKCH
 
 # 備忘録
 - プロジェクトウィンドウでC#スクリプトを生成
 - 物体にスクリプトをセットすること：アタッチ
 - using:Unityが用意している機能を読み込む
 - class:機能のまとまりのこと
 - 1フレームは0.02秒ごとに実行される
 - start()は処理を1回のみ行う
 - update()は処理を何度も行う


# 最後に
　勉強した内容を備忘録にしました。

 

ここまで記事を読んでいただきありがとうございました！

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

※noteもやっています．
https://note.com/madoka235/n/nbba2153326e1

ぜひフォローよろしくお願いします!
brainf*ck を python にトランスパイル、そして実行も

@fygar256 さんの 「[Brainfuck compiler to X86_64 on linux by C and python](https://qiita.com/fygar256/items/52db9bfda271685cec65)」に触発されて、[Brainf*ck](https://ja.wikipedia.org/wiki/Brainfuck)からPythonへのトランスパイラを作ってみました。

命令変換は単純なので、辞書を使って変換するようにしました。
ループの戻り先はインデントで決まるので、インデントの深さを管理するだけで済みました。
トランスパイルしたコードを実行する `-e` オプションも付けました。

```bf2py.py
#!/usr/bin/env python3
import sys
import argparse

TRANS = {
    # op: (nest, python_code)
    '>': (0, 'index += 1'),
    '<': (0, 'index -= 1'),
    '+': (0, 'memory[index] = (memory[index] + 1) & 0xff'),
    '-': (0, 'memory[index] = (memory[index] - 1) & 0xff'),
    '.': (0, 'sys.stdout.write(chr(memory[index]))'),
    ',': (0, 'memory[index] = ord(sys.stdin.read(1))'),
    '[': (1, 'while memory[index]:'),
    ']': (-1, ''),
}


def transpile(bf, memory_kib=8):
    """brainf*ckコードbfをpythonに変換（メモリサイズはmemory_kibキビバイト）"""
    yield 'import sys'
    yield f'memory = [0] * {memory_kib} * 1024'
    yield 'index = 0'
    indent = 0
    for op in bf:
        nest, py = TRANS.get(op, (0, ''))
        if py:
            yield '    ' * indent + py
        indent += nest


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('filename', help='input file name of brainf*ck source code')
    parser.add_argument('-e', '--execute', help='execute code', action='store_true')
    parser.add_argument('-m', '--memory', type=int, default=8, help='memory size in KiB')
    args = parser.parse_args()
    with open(args.filename) as f:
        (exec if args.execute else print)('\n'.join(transpile(f.read(), args.memory)))


if __name__ == '__main__':
    main()
```

```console:ヘルプ
$ python3 bf2py.py -h
usage: bf2py.py [-h] [-e] [-m MEMORY] filename

positional arguments:
  filename              input file name of brainf*ck source code

options:
  -h, --help            show this help message and exit
  -e, --execute         execute code
  -m MEMORY, --memory MEMORY
                        memory size in KiB
```

```hello.bf
++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
```

```console:トランスパイル
$ python3 bf2py.py hello.bf
import sys
memory = [0] * 8 * 1024
index = 0
memory[index] = (memory[index] + 1) & 0xff
memory[index] = (memory[index] + 1) & 0xff
memory[index] = (memory[index] + 1) & 0xff
memory[index] = (memory[index] + 1) & 0xff
memory[index] = (memory[index] + 1) & 0xff
memory[index] = (memory[index] + 1) & 0xff
memory[index] = (memory[index] + 1) & 0xff
while memory[index]:
    index += 1
    memory[index] = (memory[index] + 1) & 0xff
    memory[index] = (memory[index] + 1) & 0xff
    memory[index] = (memory[index] + 1) & 0xff
    memory[index] = (memory[index] + 1) & 0xff
    while memory[index]:
        index += 1
        memory[index] = (memory[index] + 1) & 0xff
        memory[index] = (memory[index] + 1) & 0xff
（以下省略）
```

```console:実行
$ python3 bf2py.py hello.bf -e
Hello World!
```