OmniAICreator/Qiita-1.07M huggingface dataset:
pytest + motoを使ってLambdaのモックテストをやってみる

# はじめに
Lambdaの単体テストを実行したい際に、実際のAWSリソースを使用せずにローカルで確認をしたい場合があります。本記事では、`pytest`、`moto`、`boto3`を使用してローカル環境でAWS Lambdaの動作テストを本記事では実装します。

# ゴール
- AWS LambdaからDynamoDBのテーブルに対して、データを読み書きする処理をローカルでテストしたい
- モックを使って簡単にUTしたい


# 環境構築
```
pip install pytest moto boto3
```

:::note info

上記のパッケージがすでにインストールされているか確認したい場合は下記のコマンドになります。

```
pip list | findstr "boto3 moto pytest"
```

:::

# Lambdaのモックを作成

テストの対象となるLambdaのスクリプトを準備します。
環境変数も使用せず、処理の流れも `DBにデータを書き込み⇒書き込んだデータを取得する` だけのシンプルなものです。

```python
import json
import boto3

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('test-table')

def lambda_handler(event, context):    
    item = {
        'id': event['id'],
        'name': event['name']
    }
    # DynamoDBに接続してデータを書き込み
    table.put_item(Item=item)
    
    # 書き込んだデータを取得
    response = table.get_item(Key={'id': event['id']})
    return {
        'statusCode': 200,
        'body': json.dumps(response['Item'])
    }
```


# テストコードを作成

```python
import json
import boto3
import pytest
from moto import mock_aws
from lambda_function import lambda_handler


# DynamoDBのモックテーブル作成
dynamodb = boto3.resource('dynamodb')


@mock_aws
def test_lambda_function():
    table = dynamodb.create_table(
        TableName='test-table',
        KeySchema=[{'AttributeName': 'id', 'KeyType': 'HASH'}],
        AttributeDefinitions=[{'AttributeName': 'id', 'AttributeType': 'S'}],
        BillingMode='PAY_PER_REQUEST'
    )
    
    # Lambdaに渡すテストデータ
    event = {
        'id': '1',
        'name': 'test'
    }
    
    # テストデータでLambda関数実行
    result = lambda_handler(event, None)
    
    # statusCodeが200か評価
    assert result['statusCode'] == 200
    
    body = json.loads(result['body'])
    # テーブルから取得した値（name）が'test'か評価
    assert body['name'] == 'test'
```


# 動作確認

動作確認のためテストを実行します。

```bash
# 詳細情報を表示して実行
pytest test_lambda_function.py -v
```


テストが成功すれば下記のように出力されます。

```
=================================================== test session starts ====================================================
～～～～
test_lambda_function.py::test_lambda_function PASSED                                                                  [100%]

==================================================== 1 passed in 0.62s ===================================================== 
```

カバレッジを出力したい場合は、`pytest-cov` を使用するとカバレッジを出せます。

https://pypi.org/project/pytest-cov/
ピアノメーカーの違いによる曲の雰囲気を比較

# Chopin "Sonata in B minor, Op. 58" のピアノメーカーの違いによる曲の雰囲気を比較

|メーカー|特徴|
|-|-|
|Steinway|音が華やかで高音が綺麗|
|FAZIOLI|低音の響きが素晴らしい(音の華やかさもある)|
|YAMAHA|カツカツした音で有名|
|ShigeruKAWAI|音が安定していて響く|
|Erard|別枠、趣があって良き|

\* Chopinと言えばErardくらいには有名。気に入った方は古楽器バージョンのショパンコンクールへGO！

Steinway
https://youtu.be/KIFNr2f8fEs
https://youtu.be/Mk4tQxC4tOE

FAZIOLI
https://youtu.be/_LtmeGgtJNA
https://youtu.be/cf62Kk_KJ14

YAMAHA
https://youtu.be/e6cv_rOpeO8
https://youtu.be/C-4H_57BW_o

ShigeruKAWAI
https://youtu.be/Dbu0qC17znk

Erard
https://youtu.be/MeF3QKD-S1w


\* ソースは本記事の執筆者自身であり、記載内容は個人の感想のため、エビデンスは存在しません
フロントエンド開発者必見！CSSフレームワーク＆ツール徹底ガイド

### フロントエンド開発者必見！CSSフレームワーク＆ツール徹底ガイド


現代のフロントエンド開発において、効率的で美しいWebデザインを実現するには、CSSフレームワークとツールの活用が欠かせません。本記事では、初心者から経験者まで役立つCSSフレームワークとツールを徹底解説し、選び方や活用方法を具体的にご紹介します。


Python、CSS,JavaScript その他のトピックについて知りたい場合は、私のサイトをご覧ください。https://cdramaking1.blogspot.com/

---

#### CSSフレームワークの重要性とは？


CSSフレームワークは、あらかじめスタイルが組み込まれたテンプレートを提供するツールです。これにより、以下のようなメリットを享受できます：

- **開発時間の短縮**  
  煩雑なCSSの手書きを省き、必要なスタイルを簡単に実装可能。
  
- **デザインの一貫性**  
  プロジェクト全体で統一感のあるビジュアルを実現。
  
- **レスポンシブ対応**  
  モバイルデバイスでも適切に表示されるデザインを簡単に構築。



#### おすすめCSSフレームワーク一覧

1. **Bootstrap**  
   最もポピュラーなCSSフレームワーク。簡単なクラス追加で高度なデザインが可能。
   - 公式サイト: [https:// getbootstrap .com/](https:// getbootstrap .com/)
   - 特徴: グリッドシステム、豊富なUIコンポーネント、柔軟なカスタマイズ性。

2. **Tailwind CSS**  
   ユーティリティファーストなアプローチで自由度の高いデザインを実現。
   - 公式サイト: [https:// tailwindcss .com/](https:// tailwindcss .com/)
   - 特徴: 必要なスタイルだけを指定するシンプルな設計。

3. **Bulma**  
   シンプルで直感的な設計のモダンなCSSフレームワーク。
   - 公式サイト: [https:// bulma .io/](https:// bulma .io/)
   - 特徴: シンプルな構文、モジュールベースのデザイン。

---

#### CSSツールでさらに効率化

CSSフレームワークと併用すると便利なツールも紹介します。

1. **Sass (Syntactically Awesome Stylesheets)**  
   CSSの拡張機能で、変数やネストを活用可能。
   ```scss
   $primary-color: #3498db;

   body {
     background-color: $primary-color;
   }
   ```
   - 公式サイト: [https://sass-lang.com/](https://sass-lang.com/)

2. **PostCSS**  
   CSSをプログラム的に操作できるツール。
   - プラグインを活用して、自動最適化やベンダープレフィックスを追加。

3. **CSS Grid Generator**  
   グリッドレイアウトのCSSコードを自動生成。
   - サイト: [https:// cssgrid-generator.netlify.app/](https://cssgrid-generator.netlify.app/)

---

#### 実践：Tailwind CSSを使った基本デザイン

以下は、Tailwind CSSを使ったシンプルなレスポンシブデザインの例です。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Tailwind CSSの例</title>
  <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 text-gray-800">
  <header class="bg-blue-500 text-white p-4 text-center">
    <h1>フロントエンド開発の未来へ</h1>
  </header>
  <main class="p-4">
    <section class="grid grid-cols-1 md:grid-cols-2 gap-4">
      <div class="p-4 bg-white shadow rounded">
        <h2 class="text-xl font-bold">学びのポイント</h2>
        <p>CSSフレームワークで効率的なデザインを実現しましょう。</p>
      </div>
      <div class="p-4 bg-white shadow rounded">
        <h2 class="text-xl font-bold">ツール活用のコツ</h2>
        <p>PostCSSやSassでさらに開発を効率化できます。</p>
      </div>
    </section>
  </main>
  <footer class="bg-gray-800 text-white p-4 text-center">
    <p>© 2024 Frontend Hub</p>
  </footer>
</body>
</html>
```

---

#### 適切なフレームワーク＆ツールを選ぶポイント

1. **プロジェクトの規模**  
   大規模なプロジェクトにはBootstrap、小規模なプロジェクトにはTailwindがおすすめ。
   
2. **カスタマイズ性**  
   独自デザインが必要な場合はTailwind、簡単なデフォルトデザインが必要ならBulma。

3. **学習コスト**  
   初心者には公式ドキュメントやチュートリアルが充実したものを選ぶと良い。



#### まとめ

CSSフレームワークとツールは、フロントエンド開発の効率化と品質向上に欠かせない存在です。本記事で紹介したフレームワークやツールを活用し、効率的かつ魅力的なWebデザインを実現しましょう。最初は簡単なプロジェクトから始めて、実践を通じて知識を深めていくことをおすすめします。



この投稿が気に入っていただけたら、ぜひ私のサイトもご覧ください。https://cdramaking1.blogspot.com/ 私のサイトでは、CSS、Python、JavaScript に関するさまざまな記事を書いています。さらに詳しく知りたい場合は、ぜひご覧ください。
初心

1記事目は「初心忘るべからず」を目的とした内容にしたいと思う。

記事執筆時点、自分は理系の院2年。
「飛行機の世界に理系側から関わりたい」と考えた故に大学に進学し、結果的に院進もした。

しかし、自分自身が大学入学までに得意としてきた学問(教科)はほぼ文系科目であった。

得意科目は日本史、現代文、生物。日本史ではトップを譲ったことがない。
苦手科目は数学と物理。両方とも赤点の常連。

誰がどう見ても生粋のド文系。

その自分が何故ここまで何とか留年や退学と無縁でいられたのか。
運に恵まれた、と言われれば間違いではない。

ただ、最もそれらしい要因は「進路を自分で決めた」ことだと思っている。

先述した通り、自分は自他共に認めるド文系。
「理系に進みたい」と伝えて賛成してくれた大人は当時一切なかった。
それでも自分は院生として今を生きているし、なんなら今までの人生の中で1番生活を謳歌している。「非合理の極み」「コスパ最悪」ともいえる進路選択をしたのにも関わらず。

「自分で決めた」という心持が、辛いときや苦しいときに精神を支えてきてくれたし、何より知識を習得した時・業界人のウラ話を聞いている時の充実感をもたらしてくれたのだと実感している。

もし文系を選択していれば、苦労は少なかったかもしれないが後悔していたと思っているし、後悔していなかったとしても、「買ってでも苦労はしろ」ということを経験できなかっただろう。
所謂「やらない後悔より…」というやつかもしれない。

何事もコスパ重視と揶揄されるZ世代に分類される自分ではあるが、人生の選択においてコスパを最優先にすることは少し危険なのかもしれない。

学生生活も残すところあと3か月。
「後悔」のないよう過ごしたい。
[Shell]ディレクトリのあるファイル名の先頭がEP802で始まるプロパティファイルの特定のキーだけを順番に取得して表示

```EP802_test.properties
SEND_URL=http://localhost:8080/keys
TIMEOUT=1000
```

```EP802_test2.properties
SEND_URL=http://localhost:8080/keys
TIMEOUT=1000
```

```test3.sh
#!/bin/bash

# 設定
TARGET_DIR="./" # 検索するディレクトリ
PREFIX="EP802"  # ファイル名の先頭
KEY="SEND_URL" # 取得するキー

# ディレクトリ内の対象ファイルを順に処理
for file in "$TARGET_DIR"/$PREFIX*.properties; do
  # ファイルが存在しない場合の処理
  if [ ! -f "$file" ]; then
    echo "No files found with prefix $PREFIX in $TARGET_DIR"
    exit 1
  fi

  # プロパティファイルからキーの値を取得
  VALUE=$(grep "^$KEY=" "$file" | cut -d'=' -f2)

  # キーが見つからなかった場合
  if [ -z "$VALUE" ]; then
    echo "Key $KEY not found in $file"
    continue
  fi

  # 結果を表示
  echo "File: $file, Key: $KEY, Value: $VALUE"
done
```

```sh
$ chmod +x test3.sh
$ ./test3.sh

File: .//EP802_test.properties, Key: SEND_URL, Value: http://localhost:8080/keys
File: .//EP802_test2.properties, Key: SEND_URL, Value: http://localhost:8080/keys2
```
Filet-O-Fishの怪に挑む 〜第1話〜

## 雨の日はフィレオフィッシュが売れる
[Filet-O-Fishの自己紹介](https://www.mcdonalds.co.jp/products/1110/) 　引用：マクドナルドホームページ

#### みなさんはこの都市伝説をご存知だろうか？
過去に「水曜日のダウンタウン」でも取り上げられたことがある怪奇現象である。マクドナルドの広報もその事実を認めつつ、その理由については、雨の日は寒いから蒸したバンズを使った製品や揚げ物が好まれるとか、説明がいまいちしっくりこない。
斯くいう私も、学生時代の4年間をマクドナルドに捧げ、この怪奇現象に何度も遭遇した経験を持つ。マネージャーの時には雨の日にフィレオフィッシュポーションの在庫を切らす失態まで経験済みである。

#### 怪奇現象へのデータアプローチから最高のフィレオフィッシュへ
現在、データに関わる仕事をしていることもあり、ふと、このフィレオフィッシュの怪奇現象について、もう少しデータで分析するべきではないかと思い始めた。しかし、分析といっても、私はもはやエンジニアではない。遠い過去に、ネットワークエンジニアとしてpingを撃った経験がある程度である。
しかし、そそり立った好奇心は抑えられず、非エンジニアとして、非力ながら、このフィレオフィッシュの怪奇現象の真相に迫りたいと思う。
そして、雨の日に最高のフィレオフィッシュを喰らうのだ。

まずは、フィレオフィッシュが売れる「雨の日」という漠然とした表現をデータにしてみたいと思った。
フリーで気象データを提供してくれるところはないかと調べたところ、[OpenWeather](https://openweathermap.org/)という気象データをAPIで提供してくれるオンラインサービスを発見。現在の天候や予測履歴を含む各種気象データの無料APIを提供してくれる、かなりイカしたサービスだ。このAPI、晴れとか雨とかのお天気だけでなく、雲、風速、気圧、降水量などのデータを含む天気予報をJSON、XML、HTML形式で提供してくれるらしい。形式ってCSVぐらいしか知らない私には「JSON、XML、HTML形式」ってのがよくわからないけど、まーやってみよう、フィレオフィッシュのために。
データ分析ツールは、仕事で絡みのあるsplunkの無償版を自分のMacにインストールしてみた。splunkにはAppという無償ツールがあり、OpenWeatherのAPIと連携してくれるツール[OpenWeather Current Add-on](https://splunkbase.splunk.com/app/5702)も提供してくれてる。嬉しい。

#### 第2時ベビーブーマーのおじさんには辛い・・・
splunkのインストールやOpenWeatherのAPI Keyの取得など、ネットにある情報を見ながら見よう見まねで、なんとなく完了。
splunkに、OpenWeather用のデータの入れ物(index)とか、APIに天気情報を取得したい場所の緯度経度とか取得時間の間隔とか設定。おじさん、猛烈に脳が疲れた・・・

OpenWeatherのサイトでAPI Keyの取得...
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935944/a9ec48cc-d3b8-3a11-0b13-e8dfddb6b513.png">
splunkにデータが入ってきた！！！
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935944/f5f4a271-1f79-0174-0c2a-65ee681e050b.png">
splunkで抽出したフィールドを見てみたら、なんか、すごいたくさんデータが入ってる。UVI指標（夜のデータなので０だけど）とか、露点、Feels likeという実際の温度に比べて何度ぐらいに感じるとかのデータもある。３時間毎の予測のデータとかも。一回のAPIコールに、50項目ぐらいのデータが入ってる。
しゅごしゅぎる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3935944/929862b8-dce1-b93a-5a4d-8cafac7fdc5b.png)

#### 第2話へ
なんかデータいっぱいあるし、ちょっと疲れたし、第1話はこのくらいにしておいてやろう。
今後は取得したデータをグラフにして雨の日の状態を視覚的に見えるようにしてみようか。ゆくゆくは、先日手に入れたFitbitで、私個人のバイタルデータも合わせて、最高のコンディションを見極めて至極のフィレオフィッシュを喰らいたい。

#### 追伸
近くのマクドナルドの店舗からフィレオフィッシュの販売データもらえないかなぁ　笑
VercelでさっとPythonをデプロイする

## はじめに

Pythonを普段使っていないのですが、さっと使いたいライブラリがあったので、デプロイ先を探していました。
VercelがNext.jsのデプロイに使っていることもあり、手軽で良さそうだったので使ってみます。


https://vercel.com/docs/functions/runtimes/python

インフラ周りはほぼCloudflareで揃えているのですが、Beta版でほぼ標準ライブラリのみという制限があったので、今回は保留しました。
Beta版が外れたらこちらも触ってみたいです。

https://developers.cloudflare.com/workers/languages/python/

---

## 手順

下記のような簡単なサンプルを用意しました。
処理を行うpythonファイルを用意し、vercel.jsonでbuids/routesを定義します。
その後Githubへリポジトリを作成しPushします。

```
project/
├── api/
│   └── hello.py
└── vercel.json
```

```python:hello.py 
from http.server import BaseHTTPRequestHandler

class handler(BaseHTTPRequestHandler):
    def do_GET(self):
        # レスポンスの設定
        self.send_response(200)
        self.send_header('Content-type', 'text/plain')
        self.end_headers()

        # レスポンス本文
        self.wfile.write(b"Hello, World!")
```

```json:vercel.json
{
  "version": 2,
  "builds": [
    { "src": "api/*.py", "use": "@vercel/python" }
  ],
  "routes": [
    { "src": "/.*", "dest": "api/hello.py" }
  ]
}
```

Vercelのダッシュボードへ移動し、作成したRepositoryをImportします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/007323f2-e4a9-47e5-0697-e23b487a8fb2.png)

Next.jsなどとは違ってFrameworkなどはないので、OtherのままDeployします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3589058/fa01db4c-0fca-ba83-f050-db140976bdfa.png)


Deployが完了後、表示されるUrlにapi/helloを追加することで、実装した画面が表示されるはずです。


1リポジトリを用意するだけで、簡単にpythonのAPIをネットに公開することができるので、ぜひ皆さんも試してみたください。
リバースプロキシを作って学ぶ認証の仕組み ①リバースプロキシとは

## これは何?

リバースプロキシを建てて，認証の仕組みを学ぼう第一回です。
本記事ではリバースプロキシとはなんぞやということを解説します。

---

## リバースプロキシとは

[Cloudflare リバースプロキシとは?](https://www.cloudflare.com/ja-jp/learning/cdn/glossary/reverse-proxy/)

リバースプロキシに厳密な定義はないと思うので，出処が信用できそうでわかりやすい記事を貼っておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/0c8cf0cf-3d1c-70ef-b503-0dfa73392681.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3718390/63a7a1b8-3082-d6e6-8eda-1b2647480888.png)

図も同サイトから引用


> リバースプロキシは、Webサーバーの前にあり、クライアント（Webブラウザーなど）のリクエストをそれらのWebサーバーに転送するサーバーです。通常、リバースプロキシは、セキュリティ、パフォーマンス、および信頼性を向上させるために実装されます。

> フォワードプロキシとリバースプロキシの違いはわずかですが、重要です。簡単にまとめると、フォワードプロキシはクライアントの前にあり、配信元サーバーがその特定のクライアントと直接通信することはないということです。一方、リバースプロキシは配信元サーバーの前にあり、クライアントがその配信元サーバーと直接通信しないようにします。

長いので一旦，リバースプロキシとは，外部からのリクエストを中継してサーバに適切に転送するものくらいに思っておけば良さそうだと思います。AWSでいうところのALBとかに近い概念なのかなと。

## リバースプロキシの用途

> 以下に、リバースプロキシの利点の一部を示しています：
> - 負荷分散 - 毎日何百万人ものユーザーを獲得する人気のあるWebサイトでは、単一の配信元サーバーですべての着信サイトトラフィックを処理できない場合があります。代わりに、サイトを異なるサーバーのプールに分散し、すべてが同じサイトのリクエストを処理できます。この場合、リバースプロキシは、単一サーバーが過負荷になるのを防止するために、着信トラフィックを異なるサーバー間で均等に分散する負荷分散ソリューションを提供できます。サーバーで完全に障害が発生した場合、他のサーバーがステップアップしてトラフィックを処理できます。
> - 攻撃からの保護 - リバースプロキシを配置すると、Webサイトまたはサービスは、配信元サーバーのIPアドレスを明らかにする必要がなくなります。これにより、攻撃者がDDoS攻撃などの標的型攻撃を利用することがはるかに困難になります。代わりに、攻撃者はCloudflareのCDNなどのリバースプロキシのみを標的にできるようになります。これにより、セキュリティが強化され、サイバー攻撃を防ぐためのリソースが増えます。
> - グローバルサーバー負荷分散（GSLB）この形式の負荷分散では、Webサイトを世界中の複数のサーバーに分散でき、リバースプロキシはクライアントを地理的に最も近いサーバーに送信します。これにより、リクエストと応答が移動する必要がある距離が短縮され、読み込み時間が最小限に抑えられます。
> - キャッシング - リバースプロキシもコンテンツをキャッシュできるため、パフォーマンスが向上します。たとえば、パリのユーザーがロサンゼルスのWebサーバーで逆プロキシされたWebサイトにアクセスすると、ユーザーは実際にパリのローカルリバースプロキシサーバーに接続し、LAの配信元サーバーと通信する必要があります。その後、応答データをキャッシュ（または一時的に保存）できます。その後、サイトを閲覧するパリのユーザーは、パリのリバースプロキシサーバーからローカルにキャッシュされたバージョンを取得するため、パフォーマンスが大幅に向上します。
> - SSL暗号化 - 各クライアントのSSL（またはTLS）通信の暗号化と暗号化解除は、配信元サーバーにとって計算コストが高くなる可能性があります。リバースプロキシを構成して、すべての着信リクエストを復号化し、すべての発信応答を暗号化して、配信元サーバー上の貴重なリソースを解放できます。

### メルカリでの使用例

https://engineering.mercari.com/blog/entry/2015-09-09-163007/



### 漫画村での使用

せっかくなので若干特殊な用途ですが，漫画村事件にも触れておきます。

[漫画村事件](https://www.hanketsu.jiii.or.jp/hanketsu/jsp/hatumeisi/hyou/202201hyou.pdf)でもリバースプロキシが登場しています。
- サイト運営者はリバースプロキシだけを管理し，漫画データをキャッシングしない
- 漫画データは第三者が公開しているものを使用し，リバースプロキシを使って漫画データにアクセスできるようにする
の2点により法律の抜け穴を狙ったものになります(結局有罪になってしまいましたが)。

---

## 具体的にどう実装するか

インターネットを見ているとNginxかApacheを使った実装が多そうです。
次回はNginx(Openresty)を使ってリバースプロキシを建てるにあたって調べたことをまとめています。
↓

https://qiita.com/sigma_devsecops/items/79d243ac5354c4991d88
【ML初心者アドベントカレンダー】教師あり学習、教師なし学習、強化学習


つよい学習 よわい学習 そんなの ひとのかって

# この記事の目的

教師あり学習、教師なし学習、強化学習について、それぞれ説明できるようになる。

# 教師あり学習（Supervised Learning）

「データ」と「正解」のセットを与えて学習させること。
人間が与えた回答を基に繰り返し学習することで、「データ」と「正解」の間にある関係性を見出すことができるようになる。


以下のようなタスクへ対処するときに使用される。

## 分類問題

分類という名前通り、データが所属しているカテゴリを推定する。
カテゴリという「選択肢」が決まっている場合にはこちらが使用できる。
（究極○か×で判断できるかどうか）

例えば…

 * 受信したメールがスパムかそれ以外かを判別する
 * 動物の画像を見て犬なのか猫なのかを判別する

## 回帰問題

過去の記録を基に、連続値を予測したいときに使う。
予測する答えが数値であるときに使用できる。

例えば…

 * 株価の予想
 * 明日の気温

---

### 関連単語

---

#### ロジスティック回帰

回帰という名前のくせに**分類問題**
その名前の理由は「何かが起こる確率」という数値を計算して、その結果をもとにどのグループに分類するかを決めるから。回帰の側面もあるんだね…？



# 教師なし学習（Unsupervised Learning）

「データ」のみ与えて、機械に自らパターンや類似性を見つけてもらう方法。データを整理したり、隠れた特徴やパターンを発見するのが得意。
「何も教えられないけど、似ているものをまとめてね」と言われるイメージ。いやな上司みたいだ…。


以下のようなタスクへ対処するときに使用される。

## クラスタリング

似たもの同士をグループ分けする方法。分類問題と似ているので混ざらないように注意。

例えば…

 * 買い物をする時間帯や買ったものの金額を基に、顧客をクラス分けする

### K-means

クラスタリングの代表的な手法。
データを事前に指定した数（K個）のクラスに分ける。
クラスの中心を定め、データをその中心に最も近いクラスに割り当てていく。
たとえばK=3のときはあらかじめ3個のクラスを設定しておく。
最終的にまるいグラフになる。

## 次元削減

判断材料がたくさんあると複雑になってしまうので、データを圧縮してシンプルにすることで重要な情報を目立たせる方法。

例えば…

 * 偏差値を求めるとき、十教科のテストの結果があるが、偏差値に関係のない科目を除いて五教科にする

### 主成分分析

データの分散が最も大きい方向を見つけて、新しい軸（主成分）を作り、その軸にデータを投影する方法。
重要な部分だけを抜き出して、少ない特徴で表現するのが目的。

## 異常検知

普通ではないデータを見つける方法。0点ばかりののび太くんがある日急に100点を取ったら「道具使っただろ！」って疑われるのと同じ。

例えば…

 * クレジットカードの不正利用を見つける
 * 工場などに配置されているセンサーの異常動作を見つける

# 強化学習（Reinforcement Learning）

試行錯誤しながら、自分の行動によって得られる「報酬」を最大化する方法を学んでいくこと。報酬は人間が与える。
例えば車の自動運転（試行錯誤を繰り返し、安全な運転と道を学んでいく）などに用いられる。

# ざっくりまとめ

**教師あり学習**
「これが問題で、これが答え」と教えられて勉強する。

**教師なし学習**
自分でデータを見て、似たものをグループ分けする。

**強化学習**
試行錯誤を繰り返して、一番良い方法を見つける。
Pythonでアルファベット26文字のリストを作る

## 組み込み関数 `chr(i)`

Unicodeを渡すと対応する文字列を返してくれる。
英大文字の`A`は Unicodeの10進数で65なので

```python
>>> chr(65)
'A'
```
となる。

`chr()`に渡すUnicodeを26文字分ループしてあげれば、アルファベットのリストが作れる

```python
>>> [chr(i+65) for i in range(26)]
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
```

英小文字`a`は97なので、同様に

```python
>>> [chr(i+97) for i in range(26)]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
```

## 組み込み関数 `ord(c)`

文字列からUnicodeを検索してくれる組み込み関数もある。渡す文字列は1文字のみ。（いわゆるchar）

こうなる

```python
>>> ord('A')
65
```

Emojiを渡してもよい🤞

```python
>>> ord('🤞')
129310
```
## Unicodeを検索で調べるときの注意

「Unicode A」などでググってUnicodeを調べることもあるかもしれない。


https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7

例えばWikipediaの[このページ](https://ja.wikipedia.org/wiki/%E5%9F%BA%E6%9C%AC%E3%83%A9%E3%83%86%E3%83%B3%E6%96%87%E5%AD%97_(Unicode%E3%81%AE%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF))を見ると、

| コード | 文字 | 文字名（英語） | 説明 |
|:-:|:-:|:-:|:-:|
| U+0041  | A  | Latin Capital letter A  | ラテン文字の大文字のA  |

と書かれている。

`U+0041`...?? 65じゃなかったのか!?
と戸惑うが、単に16進数表記されているだけなのでどちらも正しい。

```python
>>> hex(65)
'0x41'
>>> chr(0x41)
'A'
```

ちなみに"U+"は文章中にUnicodeを記載するための表記法で、値には関係ない。
難解なコードを見た時にまず何を考えるか

## 難解なコード、迷宮となった設計
古今東西、難解なコードというものがあります。
6重・7重にもなるネスト、一体何が引数として渡されてきているのかもわからないメソッド、泣きたくなるような構造の中に組み込まれた業務要件…

これらをどうリファクタリングするか、そもそもリファクタリングをしなくて済むようにどのように設計するか、というのはエンジニアがすべき仕事のひとつです。そのような設計ができるよう、多かれ少なかれエンジニアは学習を続けていく責任があると私は思っています。プロダクトに責任を持つ、壊れにくく、障害が発生するリスクを抑え、開発および改修コストを可能な限り下げて最適化する。技術力に差異はあれ、そのサイクルを適切に繰り返していければ、理論上はシステムは綺麗に保たれるものでしょう。

しかしながら、一回こっきりのチャンスで難解なコードを読み解き、開発や改修を行わなければならないシーンもあります。私がこのような難解なコードや迷宮となってしまった設計にメスを入れて改修を行わなければならない時、何を考えて手を入れているのか、この機会にアウトプットしてみようと思います。

## 難解なコードを見た時に考えたこと・行ったこと
- まず、目の前のシステムは一旦置いておいて、通常そのアプリケーションがどのようなアプリケーションであるか・どのようなフレームワークを使用しているかを把握・理解する 
    - 基礎を迅速にキャッチアップ・思い返した上でコードに挑む
    - 目にするコードおよび設計とは別に、きれいな設計をまず頭に浮かべておく
        - 理想的な目指すべき方向が自分の中にあってはじめて、難解なものが難解であることに気付ける
        - こういうタイミングの時のために、日頃から設計について考えるようにする
- 具体的にどの実装がどの方向に理想的なアーキテクチャからずれているのかを把握する
    - 子細に把握しすぎると時間が溶けるので、必要十分な把握で
    - この部分がこの方向にこれだけずれている、というのを把握した上で、改修に着手する
- 業務要件の書かれたドキュメントを読み込んだり、前任者や関係者に業務要件について確認したりして、これから作ろうとしているものの形を脳内で形成する
    - これをいかにずれている箇所に綺麗に入れ込むか、というところ

## 逆に、行わないようにしていること
- 動いているコードは動いているままにして、必要以上に触らない
    - 筆者は以前、よかれと思ってコードを触ったところ、予期せぬ変数が入ってきて痛い目を見たことがあります…
    - 特定の条件になるとNULLが入ってくる仕様となっており、結構信じがたいことだったのですが、信じがたいコードが埋まっていることもあると学びました
        - 寝るコードは起こさず
        - もちろん、計画的にリファクタリングを行うのは非常に有用なことだと思います
        - あくまで、臨時で一回こっきりの改修しか行うことができないという場面においての対策です
- 冗長なコードから無理に部分をメソッドに切り出すこと
    - これも上記と同じで、信じがたい値が予期せぬルートからやってくることがあるため
    - じゃあ渡されてくる変数を戻って辿ればいいじゃん、と思うかもしれませんが、このようなシステムは大概渡されてくる前の前の段階で予期せぬものに化けていたりするので、怖いです
- 一部分だけ綺麗にしようと、理想的なアーキテクチャに沿った実装として新しくクラスやコンポーネントを増やすこと
    - これは、A・B・Cと同じようなずれ方をしているものがある場所にDという要素を増やすとき、Dが理想的にある箇所はここだから、といってDのみ別の場所に置かない、といったようなことです
    - Dだけ別の場所に新設すると、自分から迷宮を増設することになると私は思っています
    - なので、不本意を感じつつ、全体の統一を優先してA・B・Cと同じ個所にDも増設するようにしています
        - 繰り返すようですが、どこかのタイミングでこれらに切り込めることが望ましいことが前提です


## まとめ
短文ではありますが、個人的に難解なコードに直面した時にまず何を考え、何を行っているかについて書き出してみました。人によって思想や設計のスタンスは違うことは前提として、参考になりましたら幸いです。


## 🔗参考Link

心掛けよう、SOLID原則

https://qiita.com/baby-degu/items/d058a62f145235a0f007

関数・メソッドあたりの行数
私は尊敬しているエンジニアの方から「1メソッドは一画面に収まる量までにして」と教わりました

https://qiita.com/kamykn/items/d827c17c849bd111d272

https://atmarkit.itmedia.co.jp/bbs/phpBB/viewtopic.php?topic=5105&forum=12

UNIX哲学

https://qiita.com/e99h2121/items/10e80990f68031e58b97

https://www.reddit.com/r/linux/comments/mjmfd1/how_does_the_unix_philosophy_matter_in_modern/?rdt=64810

https://klarasystems.com/articles/unix-philosophy-a-quick-look-at-the-ideas-that-made-unix/


### 余談
最後に「まとめ」を書くと技術記事としてまとまりが出ると気付きました。
本記事は[はじめてのひとりアドカレ2024 by hayami Advent Calendar 2024](https://qiita.com/advent-calendar/2024/adcale-hayami)の3日目の記事ですが、4日目以降も「まとめ」を取り入れていこうと思います。

https://buildersbox.corp-sansan.com/

https://techblog.lycorp.co.jp/ja

<br>
いろいろな日付に関する概念について

# はじめに

今回は、GMTたら、UTCたら、JSTたら、プログラムを触っていると必ず出てくる日時の概念についてまとめてみようと思います。

何となく理解してしまっている部分があるのでこれを機会にまとめていきたいと思います。

# GMT (Greenwich Mean Time)

かつて、世界の標準時として使用されていた時間です。

日本語では「グリニッジ標準時」と呼ばれます。

天体観測に基づいているようです。

# UTC (Coordinated Universal Time)

1982 年から GMT に変わり採用されてものです。

日本語では「協定世界時」と呼ばれます。

また、今の世界で標準時として使用されている時間です。

GMT とは違い、セシウム原子の振動数に基づいているため、 GMT よりも高精度なようです。

## 実用上の違い

実際の時刻表示では、UTC と GMT はほぼ同じ時刻を示します（多少の誤差はあれど）。

そのため、コンピュータの世界では特にGMTとUTCの違いを気にする必要はなさそうです。

# JST (Japan Standard Time)

日本語では「日本標準時」と呼ばれます。

JST は UTC に9時間足した値です。

`UTC+9` や `UTC+09:00` などと表されます。`GMT+9` と表される場合もありますが、上述したように UTC を用いたものと同義だと考えても大丈夫です。

例えば、UTC で 2:57 であれば、JSTは 11:57 となります。

# UNIX時間 (エポック秒)

これは時間の表現方法です。

どのような表現方法かというと、

UTC で 1970 年 1 月 1 日 00:00:00 を基準にして、そこからの経過秒数で日時を表現します。（この基準時間を UNIX エポックと言います。）

エポック秒 (epoch seconds) とも呼ばれるようです。

`1671294278` というような10桁の整数で表現されます。エポックミリ秒の場合は13桁になります。

あくまで UTC であるということには注意が必要です。

UNIX時間を日本時間に変える方法をざっくりで説明すると以下のようになりまs。

- UNIX エポックに UNIX 時間を足す
- 上記の結果に9時間を足す

# ISO8601

日付と時刻を表現する国際標準規格のことです。

よくある形式には以下のような形式があります。

- 年月日と時分秒を合わせた形式：`YYYY-MM-DDThh:mm:ss`
- タイムゾーンを含めることが可能：`YYYY-MM-DDThh:mm:ss+hh:mm`
- UTC時刻を表す場合は末尾に ‘Z’ をつけます：`YYYY-MM-DDThh:mm:ssZ`

# タイムゾーン (time zone)

地域ごとの時差を表す概念のことです。

日本は `UTC+9` で、韓国や北朝鮮、インドネシアなどが同じ時間帯のようです。

`Asia/Tokyo` といったようなものもコンピュータの世界では出てくると思いますが、これは IANA (Internet Assigned Numbers Authority) というところが、世界中のタイムゾーン情報を統一的に管理しています。

Time Zone Database (tz database) に情報が収録されています。

`Asia/Tokyo` というように 大陸/都市 という命名規則が採用されています。

タイムゾーン情報を持つ識別子ということができそうです。

# まとめ

いろいろと小難しい言葉が多くありましたが、最も重要なのは GMT と UTC は日本時間より 9 時間前の時間であるということ、JST を基準に見るなら、JST は GMT と UTC の 9 時間後の時間であるということかなと思いました。

曖昧だった知識が少し深まった気がします。

# 参考文献

https://zenn.dev/yu_undefined/articles/15f9944273b3f1

https://zenn.dev/yass97/articles/2b5dcd5499ab07

https://zenn.dev/murnana/articles/iso-8601-date-time

https://wa3.i-3-i.info/word18474.html

https://wa3.i-3-i.info/word11831.html
初心者でも簡単！Pythonで始める効率的なデータ操作


こんにちは、今日はPythonを使ったデータ操作の効率的な方法についてお話しします。データ分析や機械学習の基礎として、Pythonは非常に強力なツールですが、初心者には難しそうに見えることもあります。この記事では、Pythonの基礎を押さえながら、pandasライブラリを活用して効率的にデータを操作する方法を解説します。

追加のヒントについては私のウェブサイトをご覧ください:-https://cdramaking1.blogspot.com

## pandasとは？

pandasは、データ操作や分析のためのPythonライブラリです。特に、以下のような場面で役立ちます：
- CSVやExcelなどのデータファイルを簡単に読み込み・書き込み
- データのフィルタリングやグループ化
- 欠損値の処理やデータのクリーニング

---

## 実践：pandasを使った基本操作

### 1. pandasのインストール
まずは、pandasをインストールしましょう。以下のコマンドをターミナルで実行します：

```bash
pip install pandas
```

### 2. CSVデータの読み込み
CSVファイルを読み込む方法は非常に簡単です。以下のコードで、データをpandasのDataFrameとして扱えます：

```python
import pandas as pd

# CSVファイルの読み込み
df = pd.read_csv('data.csv')

# データの確認
print(df.head())
```

### 3. データのフィルタリング
次に、特定の条件でデータをフィルタリングする例を見てみましょう：

```python
# 条件に基づくフィルタリング
filtered_df = df[df['age'] > 30]

print(filtered_df)
```

### 4. グループ化と集計
データをグループ化して集計する操作も非常に簡単です：

```python
# 'category'列でグループ化し、'sales'の平均を計算
grouped_df = df.groupby('category')['sales'].mean()

print(grouped_df)
```

---

## 実践でのヒント
pandasは機能が豊富なので、最初は基本操作に集中するのが良いでしょう。公式ドキュメントやチュートリアルを活用し、少しずつスキルを高めていくことをお勧めします。



## まとめ
pandasは、データ操作を効率的かつ簡単にするための強力なツールです。初めて使う方でも、基本操作をマスターすればすぐに実務に活用できるでしょう。次回は、もう少し高度なデータビジュアライゼーションについて解説する予定です。

この記事が皆さんの学習に役立てば幸いです！コメントやフィードバックもお待ちしています。
ゼロから始めるプログラム学習（C#）_007

##    はじめに

 プログラミング言語 __<font color="blue">　【C#『シーシャープ』】</font>__ を使用して
 プログラムを最初から学習するための記載。 


　　　前回：ゼロから始めるプログラム学習（C#）_006
　　　https://qiita.com/nekoozi/items/caddc226f36b99b1dad1


## <font color="green">LINQ(リンク)を使ったデータ操作の基本</font>
　LINQ（Language Integrated Query）は、
　コレクションや配列、データベースなどのデータを
　直感的かつ簡潔に操作できるC#の強力な機能です。

　主な特徴

　データ検索：
　コレクション内から条件に一致する要素を取得します。

　フィルタリング：
　指定した条件で要素を絞り込みます。

　並べ替え：
　データを昇順または降順でソートします。

### 1･･･ <font color="blue">クエリ式</font>
>SQLに似た構文で直感的に記述できます。


```C#
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5, 6 };

        // クエリ式
        var evenNumbers = from number in numbers
                          where number % 2 == 0
                          select number;

        Console.WriteLine("偶数リスト:");
        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }
}

````

　説明

　from：
　コレクションから要素を取り出します。

　where：
　条件に一致する要素を絞り込みます。

　select：
　絞り込まれた要素を返します。


### 2･･･ <font color="blue">メソッド式</font>
>メソッドチェーンを使用して記述します。よりプログラム的な表現が可能です。

```C#
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5, 6 };

        // メソッド式
        var evenNumbers = numbers.Where(IsEven);

        Console.WriteLine("偶数リスト:");
        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }

    private static bool IsEven(int num)
    {
        return num % 2 == 0;
    }
}

````

　説明
　numbers.Where：
　numbersの中から、条件に一致する要素を絞り込みます。

　IsEvenメソッド：
　入力値が偶数かどうかを判定する関数です。

　ラムダ式使い、偶数である条件を簡潔に記述したい場合は
  以下の記載が可能。

```C#
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5, 6 };

        // メソッド式
        var evenNumbers = numbers.Where(num => num % 2 == 0);

        Console.WriteLine("偶数リスト:");
        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }
}


````

　説明

　num => num % 2 == 0：
　ラムダ式を使い、偶数である条件を記述しています。

　　num =>：
　　　これは「入力numに対して」という意味です。

　　num % 2 == 0：
　　　これは「numが2で割り切れる場合」という意味です。

--------------------------------------------------------------

　　　次回：作成中



## 参考文献

C#関連情報サイト様

https://ufcpp.net/study/csharp/sp3_expression.html#google_vignette

https://ufcpp.net/study/csharp/sp3_linq.html
そのtoString()のOverride大丈夫？


:::note info
この記事は、[ラクス Advent Calendar 2024](https://qiita.com/advent-calendar/2024/rakus)の4日目の記事です。昨日は、@R_1112 の[単体テストの構造パターン](https://qiita.com/R_1112/items/dccd4ffafe80c73ca63d)の記事でした。
:::

JavaのtoString()で「ちょっと怖いな」という使い方をしているケース見かけたので注意喚起として書いておきます。

### toString()とは

toString()はObjectクラスで定義されているメソッドです。Objectクラスは全てのクラスのスーパークラスなので、全てのクラスでtoString()はOverrideできます。

デフォルトでは「`クラス名@ハッシュ値`」となっていますが、一般的には以下のように各フィールドの値をそのまま出力する形でOverrideすることが多いと思います。

```java
public class Name {
    public String lastName;
    public String firstName;

    略

    @Override
    public String toString() {
        // 例: lastName=田中, firsName=太郎
        return "lastName=" + lastName + ", firstName=" + firstName; 
    }
}
```

```java
public class Money {
    public BigDecimal value;

    略

    @Override
    public String toString() {
        // 例: 12345.6789
        return value.toPlainString()
    }
}
```

### toString()はさまざまなライブラリから呼び出される

toString()は明示的に呼び出すこともできますが、標準ライブラリやその他のライブラリの内部で呼ばれるケースがあります。

例えば、`System.out.println()`の内部でもtoString()が呼ばれており、任意のクラスを引数に取ってもよしなに文字列表示してくれるようになっています。

```java
Name name = new Name("田中", "太郎");
System.out.println(name); // lastName=田中, firsName=太郎

Money money = new Money(new BigDecimal("12345.6789"));
System.out.println(money); // 12345.6789
```

他にも各種ログライブラリ[^1]や[Thymeleaf](https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf_ja.html)、[Apache Commons CSV](https://commons.apache.org/proper/commons-csv/)のような、主要ライブラリも様々なクラスをtoString()で一律文字列出力してくれます。

```java
printer.printRecord(name, money); // "lastName=田中, firsName=太郎","12345.6789"
```

### toString()をOverrideすべきか？

さまざまなライブラリがよしなにtoString()を読んでくれるので「toString()をOverrideすればいいじゃん」となりがちですが、それは本当にtoString()をOverrideすべきなのでしょうか？以下にいくつか微妙な例を挙げていきます

#### 1. toString()に外部仕様が混ざる

Apache Commons CSVの例のようにCSV出力したいケースを考えてみましょう。

たとえば、`Name`クラスの場合、CSVでは姓名を結合した「`田中 太郎`」や「`田中　太郎`」形式で出力したくなりそうです。同様に、`Money`クラスでは金額に通貨単位の付与やカンマ区切りをして「`12,345.68円`」のようにフォーマットを整えて出力したくなりそうです。

toString()はメソッド名通りただ文字列化するだけのメソッドのはずなので、流石にやりすぎですよね。[^2]

文字列化以外の処理をする場合は、専用の別メソッドを用意して呼び出すようにしましょう。

```java
printer.printRecord(name.toFullName(), money.toFormat(formatter)); // "田中太郎","12,345円"
```

#### 2. ログに必要な情報が取得できない／出してはいけない情報が出る

先に記載したようにtoString()はログ出力時にも呼び出されます。

アプリの用途に合わせて過度に情報を整形してしまうと、ログの調査時に必要な情報が取得できず困ることにもつながります。例えばNameを姓名繋ぎで出力していた場合、どこまが姓でどこからが名なのかわかりません。姓名ならだいたい推測もつくと思いますが、もっと複雑なクラスの場合、出力されているのが何の項目かわからないと困ります。

また、シンプルなtoString()だったとしても困るケースがあります。それはクレジットカード情報やパスワードなどの機微な情報の時です。機微な情報はログ出力すべきでないですが、ライブラリなどで勝手にログ出力されてしまい、セキュリティ問題になる可能性があります。

#### 3. 影響範囲調査が難しい

みなさん実装を修正する際はgrepやIDEの機能でクラスやメソッドの利用個所を調査すると思いますが、toString()の調査は難しいです。
他のクラスでOverrideされているtoString()がノイズになったり、先に記載したようにライブラリがよしなに使っている場合は特定不能です。

自動テストを書いていればテストの失敗などで気づけるケースはあると思いますが、自前で作成したメソッドであれば影響は限定的なので調査は楽になります。

### まとめ

* toString()はメソッド名の通り、オブジェクトを文字列化するだけのメソッド
* toString()は意図せず呼びだされる可能性があるので、文字列化する内容は慎重に
* 意味ある文字列を出力する場合は、専用メソッドなどで自前で文字列化する

[^1]: ログライブラリについての別の方の記事 https://zenn.dev/yyamada12/articles/860701683ada37
[^2]: Nameの姓名つなぎはギリ許容ラインかもしれない
2024年の挑戦を振り返る

こんばんは！
[トラストバンクアドベントカレンダー](https://qiita.com/advent-calendar/2024/trustbank)の7日目を担当します
@takapon21という者です。今後もよろしくお願いいたします:spy:


2024年もあっという間ですね！
トラストバンクに入社して半年が経過しました。
少しだけ今年を振り返り、来年の抱負中心に記載していきたいと思います。



## takapon21の挑戦まとめ
- AWS SAA-C03に合格するぞ！
- なんかイイカンジな開発チームを作り上げるぞ！



### AWS SAA-C03に合格するぞ！🖊️
おおよそ、2024年1月ごろから学習を開始しました。
業務ではECSやCloudWatchを見たり、S3から画像取得して描画したり、極稀にterraformチラ見するくらいの経験値でした。
構築なんてやったことありません。
「今後も開発リーダーを継続していきたいなら、インフラの知識は必要だね」と前職の上司に言われたものですので、興味はあったこともあり、「どうせやるなら資格取りますか」くらいの意気込みで始めました。
その話は[こちら](https://zenn.dev/takapon21/articles/3d77a6e6392826)に詳しく書いておりますので今回は割愛します
**結論、2024年10月下旬に合格しました！** 🎊
年始からやっていた目標としては、「達成」ですね。嬉しい限りです。


### なんかイイカンジな開発チームを作り上げるぞ！👥
今の環境が悪く、どうにかしないといけない！！！
という訳ではなく、「一緒に働くなら楽しい方がいいじゃん！」という考えから
今年少しだけチームビルディングにチャレンジしてみたことを振り返ってみたいと思います


#### 会議の顔出しをしてみた
週一回のレトロスペクティブのみ、**顔出しの会議**にしてみました
当社はリモートで働いている方が多く、顔を見たことがない方が大半です
そこで、少しでもコミュニケーションの機会になればと思い「顔出し推奨」の会議を設定しました。
成果はどうでしょう...？これを機にちょっとした雑談が発生しているので悪くはない施策かなと感じています。


#### バックエンド全員で設計をしてみた
miroやスプレッドシートを活用し、バックエンドみんなで設計に携わることで「全員がリーダー」の環境を作っています。これは自分の設計力に自信がないことが発端ではありますが、全員がPrjの全貌を把握していることで、全員が前衛的なチームに出来ます。
また、メンバーも設計を経て一緒に成長していくことで、今後の開発がよりスムーズになる期待値もあります。
自分が勘違いしていたこと・見落としていたことを本当によく拾ってくれるので、メンバーには大変感謝です。
自分ももっと成長しないといけません。


#### お問い合わせ対応にみんなで取り組んでみた
当社は週一回、ご利用者様からの問い合わせに対応する当番があります。
基本は「当番になった人」が調べて対応するのですが、「1人より2人だ！」の精神から
1. 問い合わせが来たらスレッドを立てる
2. 対応できる人は集まり、知っている情報や考えていることを何でも発言する

この様に、みんなで解決する体制にしました。
体感値ですが、バックエンド・フロント・QAの多方面からヒントが貰えるので
一人で調査するよりずっと早く解決できています。


#### ペアプロをしてみた
自身も初めての体験でした。
開発は「自分が考える正解を作り上げてレビューしてもらうもの」という考えがあり、ペアプロには否定的だったのですが、やってみると案外良いものです。
結局レビューで指摘しますし、開発者側の意図もその場で理解することができ、トータルでレビューの時間が削減できます。
また「自分に質問しやすくすること」の環境作りも大事ですね。
相談されなかったらそもそもできません


#### とりあえず何にでも首を突っ込んでみた
これは上述の「自分へのコミュニケーションのハードルを下げること」を意識した行動です。
自分が苦労する分には何も辛くありません。みんなが働きやすい環境を作ることで...色々なステップを経て...結果自然とみんなの自主性を上げることを目指しました。
首を突っ込みすぎて情報の整理に困っていますが、それでもみんなとコミュニケーションする時間が増えて自分は勝手に楽しんでいます。
ちなみに自分はリーダーではありません。自称リーダーです。（いつかリーダーになれる様頑張ります）
その情報整理と正しい舵取りがまだまだ課題だらけです。今後も精進します。

### 振り返りをまとめて
入りたての人間が、いかに早く会社に溶け込み、バリューを出せるか...
自分の性格上、少し無理した部分もありましたが、現時点で良いチーム作りはできてきているかなと感じています。
引き続き試行錯誤しながら、ですが、今後も色々とチームビルディングにチャレンジしていきます！
今はチームビルディング中心に改善活動を続けてきましたが、来年は技術面でもチャレンジしていきたいです。
自分のチームが会社から信頼されるチームになれる様、開発面・ソフト面まだまだ頑張っていきます!!
ESLintに追加されたCSSのプラグイン

## はじめに
2024年11月26日に[@eslint/css](https://github.com/eslint/css)が誕生しました。

この記事ではこのプラグイン(v0.1.0時点)で設定可能なルールを紹介します。

:::note
v0.1.0の`@eslint/css`を利用するには、ESLintのv9.6.0以上でFlat Configを利用する必要があります
:::

## Rules
`@eslint/css`には`no-duplicate-imports`と`no-empty-blocks`、`no-invalid-at-rules`、`no-invalid-properties`の4つのルールがあります。
`recommended`を設定することで、すべてのルールが`error`として設定されます。
各ルールに細かな設定はないので特定のルールをどうしてもoffにしたい場合以外は`recommended`を利用するで問題ないと考えています。

```js:eslint.config.js
import css from "@eslint/css";

export default [
	{
		files: ["**/*.css"],
		language: "css/css",
		...css.configs.recommended,
	},
];
```

以後各ルールについて紹介しますが、それぞれの動作は[stackbiltzで作成した検証環境](https://stackblitz.com/edit/github-d1geg2-uwgaqk?file=test.css)を用いて確認しました。

### no-duplicate-imports
[`@import`](https://drafts.csswg.org/css-cascade-5/#at-import)の重複を禁止するルールです。

```css
@import "xxx.css";
@import "yyy.css";
@import "zzz.css";

/* 🙅Invalid🙅 */
@import "xxx.css";
/* 🙅Invalid🙅 */
@import url(yyy.css);
/* 🙅Invalid🙅 */
@import url("zzz.css");
```
[`<string>`](https://drafts.csswg.org/css-values-4/#string-value)だけではなく、[`<url>`](https://drafts.csswg.org/css-values-4/#url-value)で記述されていた場合の重複も確認してくれます。

### no-empty-blocks
中括弧に記述される宣言が空であることを禁止するルールです。

```css
/* 🙅Invalid🙅 */
* {}

/* 🙅Invalid🙅 */
div {
  
}

/* 🙅Invalid🙅 */
#block {
}

/* 🙅Invalid🙅 */
.block {
  /* comment */
}

/* 🙅Invalid🙅 */
@supports (display: grid) {
}
```
コメントを含めてブロック内にコンテンツの宣言がない場合にエラーとなります。

### no-invalid-at-rules
無効な[アットルール](https://drafts.csswg.org/css-syntax-3/#at-rule)を宣言することを禁止するルールです。

```css
/* 🙅Invalid🙅 */
@importt "aaa.css";
/* 🙅Invalid🙅 */
@property primary-color {
	syntax: "<color>";
	inherits: false;
	initial-value: #f766e;
}
/* 🙅Invalid🙅 */
@property --primary-color {
	syntax: "<color>";
	inherits: false;
	value: #f766e;
}
/* 🙅Invalid🙅 */
@property --primary-color {
	syntax: #f766e;
}
```
- 1つ目のブロックはアットルールとして存在しない`@importt`を利用している
- 2つ目のブロックは`prelude`の中身の`#fff`が`<scope-start>`の型に一致しない
- 3つ目のブロックは`@property`に定義されていない`value`が記述されている
- 4つ目のブロックは`@property`が持つ`syntax`にCSS型以外の値を渡している

上記の理由でサンプルコードではエラーが起きています。このルールは以上の4種類のエラーを検知でき、抽象化すると以下のとおりです。

- 存在しないアットルール
- 無効な`prelude`
- アットルールに対する存在しないプロパティ
- アットルールのプロパティに対する無効な値

### no-invalid-properties
無効なコンテンツの宣言を禁止するルールです。

```css
/* 🙅Invalid🙅 */
main {
  /* bgは存在しないプロパティ */
  bg: #fff;
  /* colorは<color>を値として受け取る <length>は受け取れない */
  color: 14px;
}

```
コンテンツのキーが有効であることはもちろん、値が定められた型じゃない場合でもエラーになります。

## おわりに
公式に追加されたESLintのCSSについてのプラグインを確認しました。
スペルミスやリファクタリング時の調整漏れ、誤ったCSSの記述などを正してくれる優れたプラグインだと感じました。
エンジニアリングマネージャー入門を読んだ所感

# サマリー

マネージャーではないが、チームリーダーとして仕事することが多いので、エンジニアリングマネジメントについて以下の点を、この本を通して得たいと思う。

- 自分のエンジニアリングマネジメントが、どの程度合っているのか
- 自分のエンジニアリングマネジメントを高めることができる考え方や手法

:::note info
TODO: まだ読み切ってないので、読み終わったらサマリーを更新する。
:::

## 自分のチーム

### エンジニアリングマネジメントの心構え

>エンジニアリングマネジメントでは、権力の不均衡や組織構造の理解、また、特定のプロジェクトではなく、それをとりまく戦略の検討が求められます。

エンジニアリングマネジメントについて大事なことがまとまっている一文のように思えた。
「特定のプロジェクトではなく、それをとりまく戦略」というのが、自分のチームや組織だけを考えていたので良いというわけではないと改めて思った。

>自分が良いマネジャーではないと心配していること自体が、良いマネジャーになるための大事な要素なのです

この本を読んでいると、なんだか覚えのある経験や考えが書かれていて、なんだか自分だけではないんだとホッとした。上記の文も、自分にはマネジメントが向いてない、良いマネジメントができていないと悩むことが多いので、同じように悩むことや悩むこと自体が大切なんだと思った。

>思いやりは、この仕事をうまくやるために不可欠なのです。

非常に共感した。マネジメントをしていると、仕事の時間の大半をチームメンバーが円滑に仕事を行うために費やしているし、チームメンバのことばかり考えている。
自分の仕事もしないといけないし、忙しくなったりすると、ついつい失念やできていないことがあるけど、毎度反省してしまう。以前よりも難しさは増してきたけど、今後も大事にしていきたい。

### 価値観、信頼、弱さ

>価値観は何かを解決したり、取るべき行動を提示してくれたりするわけではありません。価値観は、なぜ、何が起こっているのかを深く理解させてくれるものなのです。
>中略
>価値観の共有は、チーム内の信頼関係を醸成し、弱さをさらけ出せる環境をつくるという副作用をもたらすこともあります。

ここ数年で大事だと分かってきたことで、価値観をチーム内で共有するのに四苦八苦している。
初めてのチームであれば、チームビルディングを、このためにやりたいと思っている。
あと、価値観は変化していくと思うし、チームの価値観も時に合わせて変化していくべきだと思うので、定期的にチーム内で価値観を再共有するのは大事だと思う。
本の中でも出てくるが、定期的なミーティング(堅苦しいものではなく)を行うことは、価値観の再共有や理解を深めるのに効果がある。

メンバーの価値観だけでなく、自分やチームの価値観というのも大事というのも書かれており、チームの価値観を明文化したことはないので、今後は実施していきたいと思った。また、自分の価値観というのが、リーダーとしての個性を出すところだが、自分の価値観を明確にするのが難しいなぁ。

>私が、マネジャーとしての仕事を明確に表すなら、「周りのみんなが自分の力を出し尽くせるようにすること、それも共に」となります。

会社全体を見て、チームの仕事にも反映していくという点が十分できているかが、いつも悩ましい。
会社の利益や将来のために、どのような仕事や能力を身に着けていってもらうべきなのか、よく考える。

>リーダーとしてあなたが最初に行動しないといけません。

信頼と弱さについての記載があり、心理的安全性に類する内容となっているが、特に上記の文に大きな共感を得た。
技術的な知識がないから恥ずかしいと思ったりして質問が出なかったり、議論が活発にならなかったりすることが多いので、率先して自分が知らないことを質問したり、率直に意見を述べるようにしている。
リーダーが弱さを見せるのは、メンバーに安心感を与えやすいし効果を感じる。まぁ、相手(チームメンバー以外の)によっては笑われたり、呆れられることもあるけど、慣れると気にならない。

>同僚や上司と会議で決定したことに対してあなた自身が賛成でない場合でも、「彼らが（自分は賛成ではない何かを）決めたんです」とは言ってはいけません。あなたはそこにいたのですから、理想論的に言えばあなたもその決定に加わっていたはずです。

心に刺さる。注意していても心の弱さから、そう言ってしまうことが度々ある。
でも何の意味もないんだよなぁ。リーダーに聞いてもしょうがないとか、やらされてる感が出てくるだけで生産性が上がらない。
組織で働いている以上は、決定に従うしかない場面もあるが、その決定に不服があっても、どれだけ真摯に向き合えるかが大事だと思う。

>間違えない人なんていません！　マネジメントは困難なこともあり、いつも完璧でいるなんて不可能です。私自身もたくさん失敗してきました。失敗を自分や他人を叩く棒と考えるのではなく、より良い職場環境を促進するために必要な、今後できるだけ注意深くなるための教訓と捉えてください。

この著者は本当に優しい。自分を責めることが多いが、そんな暇なんてないのだ。改善のために前進あるのみ。

>内発的動機づけと外発的動機づけ

内発的動機づけは、チームリーダーレベルでは中々難しいけど、非常に大事だと思う。自分自身も、内発的動機づけで仕事をしているときは、時間も疲れてフロー状態になってる。
あと、内的報酬も大事だと思う。感謝や称賛を与えることは、非常に重要で、今回初めて知ったがロサダ係数というのがあるぐらいだ。

## コラボレーション

## 参考文献
[エンジニアリングが好きな私たちのための　エンジニアリングマネジャー入門](#https://amzn.asia/d/be3C4FJ)
【Rustのまほう2】#5 Asepriteの画像を表示する

# Aseprite

2Dゲームでは、まず間違いなく画像を表示することになると思います。私はドット絵の作成に Aseprite というツールを使っています。今なら30%オフで1,435円！

https://store.steampowered.com/app/431730/Aseprite/?l=japanese

実際にドット絵を描いている様子はこんな感じです。フリー/有償含めドット絵のアセットはいろいろ公開されていますが、どうせ足りないものは自分で描くことになりますし、いたずらにクオリティの高いアセットを使ってしまうと自分の下手なドット絵とクオリティにバラつきが出てしまうので、もうぜんぶ自分で描いてしまうことにしました。

![スクリーンショット 2024-12-04 001517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64695/c2a0e9b2-5923-fc91-961d-edae2130ab07.png)

ドット絵は生成AI使えば？などと思う人もいるかもですが、生成AIの出力した絵を選別している時間は本当に虚無なので今回は使っていません。それに生成AIで描いた絵を眺めているとなんか自分の頭の中のイメージがそれに汚染されていきますし、クリエイティビティを破壊されてる気がします。大変ではありますが、自分で描いたほうが楽しいですしね。





# bevy_aseprite_ultra

Asepriteは最近までUIが日本語に対応していなかったからか日本語圏ではややマイナーですが、世界的には最もメジャーなツールのひとつだと思います。そのためライブラリなどでのサポートされていることが多くて、Bevyでは[bevy_aseprite](https://github.com/mdenchev/bevy_aseprite)や[bevy_aseprite_ultra](https://github.com/Lommix/bevy_aseprite_ultra)というライブラリ(Rust用語ではcrate)を使えば、いちいち`png`にエクスポートしなくても直接Aepriteのプロジェクトファイルを読み込むことができて便利です。私はbevy_aseprite_ultraのほうを使っています。 

https://github.com/Lommix/bevy_aseprite_ultra

Asepriteはスライスという機能があって、これを使うと一枚のドット絵に複数のスプライトを含めて同時に編集することができます。bevy_aseprite_ultraはこのスライスの読み込みに対応しています。`AseSpriteSlice`というコンポーネントにスライス名`name`とAsepriteプロジェクトファイルのハンドル`aseprite0`を渡して生成し、それを`commands.spawn`に渡せば、Asepriteの画像が表示されます。簡単ですね。（Bevyの`AssetServer`の機能はまだ説明していないですが、あまり気にしないでください）

```rs
fn spawn_demo_static_slice(mut cmd : Commands, server : Res<Assetserver>){
    cmd.spawn((
        AseSpriteSlice {
            name: "ghost_red".into(),
            aseprite: server.load("ball.aseprite"),
        },
    ));
}
```

上のコードは公式のサンプルコードです。せっかくなので私が実際に書いたコードを紹介しようと思ったのですが、まだ `0.14` のバージョンの古い書き方なのでやめました。また、bevy_aseprite_ultraはAsepriteのアニメーションの再生もできますが、ぜんぶ説明していたらひとりアドベントカレンダーを完走できないので割愛させて頂きます。
[pi24]ラズパイでADS-Bレーダーを作成してFlightradar24のビジネスプランを無料で運用する

## はじめに
ITソルーション室 Advent Calendar 2024 4日目の投稿です。
Qiita初投稿になります。静岡大学情報学部のITソルーション室で2024年度副室長を務めているaraakiです。よろしくお願いします。
さて、フライトレーダーを見るのって楽しいですよね。世界地図の上に無数に飛ぶ飛行機を眺めているといつの間にか時間がたってしまっています。
また、航空機の位置は重要な公開情報なので、OSINT活動などにも活用しています。(Flightrader24ではあまり軍用機は表示されませんが...)
## 作ろうと思ったきっかけ
そんなFlightrader24は基本無料で使うことができますが、無料プランだと様々な制限があります。特に自分が不便だと感じたのが"飛行記録を7日前までしか遡れない"ということです。それが最上位のビジネスプランでは3年間の飛行記録を閲覧することができます。ただ、年$499.99かかるので(執筆時点)学生には痛い...
そんな感じでどうしようかと考えていたところ、とある情報を目にしました。どうやらADS-B受信機を作ってそれをFlightrader24にフィードするとビジネスプランが無料でもらえるらしいとのこと。
こんな感じで自分の家にレーダーを置けてドヤれる上にビジネスプランが無料になるという理由から作成することを決めました。
## ADS-Bとは
ADS-B（Automatic Dependent Surveillance - Broadcast：放送型自動位置情報伝送・監視）というもので、航空機がGPSを利用して自身の位置情報をリアルタイムで地上局や他の航空機に送信するシステムです。"ADS-B Out"で位置情報を送信し、"ADS-B In"で他の航空機や地上局からの情報を受信します。
近年ではサンタクロースのソリにもADS-Bが搭載されていて、クリスマスになるとレーダーにSANTA1として表示されるみたいですよ。
## 必要なもの
- Raspberry pi (3 model B以降)
  - 今回は家に転がっていた3 model Bを使用
  - 購入の際にはKSYさんを利用するのが便利だと思います

https://raspberry-pi.ksyic.com/
  
- ADS-B受信機
    - 今回はこちらを使用 

https://www.amazon.co.jp/gp/product/B00P2UOU72/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1
## 構築
### 1.ADS-B受信機とラズパイを接続
今回使用した受信機はUSB TypeAなので3 model Bなら直接接続することが可能です。
### 2.受信機と付属のアンテナを接続
受信機に接続するところがあるのでそこに付属アンテナを接続
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824089/34852e91-ee6c-76e8-dd9c-326920bc4e06.jpeg">
接続したらこんな感じ
### 3.OSをインストールする
[Flightrader24の公式サイト](https://www.flightradar24.com/build-your-own)にセットアップ済みのイメージとドキュメントが置いてあるのでそれをみながらOSをインストールします。
### 4.アンテナを電波を受信しやすい場所に設置する
屋外がベストですが屋内であっても窓際などであれば割と拾います。
### 5.公式サイトから受信機の登録
受信機と同じネットワークにいるPCで先ほどOSイメージをインストールしたページにアクセスし、following linkのところを押してページにアクセス。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3824089/9507e478-3b84-9d99-58df-c5151b761949.png">
正常に疎通が取れていればここに受信機のIPアドレスなどが表示されるので、"Activate"をクリック。その後、設置位置の登録のため、アンテナのおおよその座標と高度を入力します。
すると、受信機の位置がFlightrader24に登録され、認証キーとFeeder番号が割り当てられます。
登録からしばらくすると、自分のアカウントのプランがビジネスプランになるはずです。

## 参考サイト
https://qiita.com/ktsutsum/items/d9d0cfe1aa06e40d59d4
https://makoro.hatenablog.jp/entry/2017/11/29/170251
https://www.soumu.go.jp/main_sosiki/joho_tsusin/policyreports/joho_tsusin/koukuu_musen/pdf/070718_1_s2.pdf
【Advent Calendar 2024 #3日目】AWS学習〜生成AI/ML編〜 Amazon Bedrock

# はじめに

本記事は、「初めての一人アドベンドカレンダー2024 by hohe」の3日目の記事となります。
Advent Calendar 期間中は、AWSの生成AI/ML関連を中心に記事を投稿していきます。
3日目はAmazon Bedrockについてまとめます。

# Amazon Bedrockとは
Amazon Bedrock は、単一のAPIを介して大手AI企業からの高性能な基盤モデル(FM)を選択できるフルマネージドサービスで、セキュリティ、プライバシー、責任あるAIを備えた生成AIアプリケーションを構築するために必要な幅広い機能を提供します。

https://aws.amazon.com/jp/bedrock/

### 使用可能な基盤モデル(2024/12/1現在)
AWSでは以下のモデルが使用可能となっております。なお全モデルが提供されているのは米国東部(バージニア北部)および米国西部(オレゴン)であり、アジアパシフィック(東京)は一部モデルのみが提供されています。
- AI21 Labs(Jurassic)
- Anthropic(Claude)
- Mistral AI(Mistral、Mixtral)
- Cohere(Command、Embed)
- Meta(Llama)
- Stability AI(SDXL)
- Amazon(Titan)

https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/models-regions.html

### モデルのカスタマイズ

#### Fine Tuning (微調整)
ラベル付きデータを新たに学習して特定のタスクの精度を⾼める⼿法

#### Continued Pre-training (継続的な事前トレーニング)
⼤量のラベル無しデータを⽤いてモデルに新たなドメイン知識を習得させる⼿法

https://aws.amazon.com/jp/blogs/news/customize-models-in-amazon-bedrock-with-your-own-data-using-fine-tuning-and-continued-pre-training/

### モデルの評価
Bedrockでは「自動評価」「人間ベースの評価」「AWSマネージド評価」の3種類の評価方法が選択できる。
その後、タスクタイプを選択し、評価メトリックを選択する。

https://aws.amazon.com/jp/blogs/news/amazon-bedrock-model-evaluation-is-now-generally-available/
NetSuiteにおける変更履歴「システム・ノート」

これは🎄🎁🎅[Oracle NetSuite Advent Calendar 2024](https://qiita.com/advent-calendar/2024/netsuite)🤶🎁🎄の5日目の投稿です。

[Oracle NetSuite](https://www.netsuite.co.jp/)を使っていて、顧客や商品等のマスターや、商談や購買等のトランザクションの「変更履歴」を見たくなることがあります。ERP/CRMのような基幹システムでは、変更履歴はとても重要な情報で、メーカー問わず機能が実装されています。SAPなら変更履歴 (Change Document/CDHDR、CDPOS) オブジェクト、Salesforceでも変更履歴 (History) の機能があります。

# NetSuiteにおける「システム・ノート」
NetSuiteの場合は、ちょっと変わった名前「**システム・ノート (System Note)**」という名前がついています。システム・ノートはNetSuiteのレコードに対してかけられる変更を追跡、記録する仕組みです。

>**変更日時、変更したユーザー、変更した手段(インターフェイス)、変更されたフィールド名、変更の種類、新旧の値**

が記録されます。システム・ノートに記録された情報はシステム管理者、スクリプト、アプリが改変することはできません。標準のレコードの場合、カスタムレコードの場合とも記録されます。「**監査証跡 (Audit Trail)**」 の詳細情報を提供することが主な目的です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197689/d205d8fb-5d8e-3263-dd58-0c872c6cb013.png)

システム・ノートには以下の2種類があります。

* **システム・ノート**:従来のバージョンのシステム・ノート
* **システム・ノート v2**: サブリスト情報などの詳細な変更をキャプチャし、高レベルのアクションで変更をグループ化します。削除されたトランザクションとレコードの情報が保持されます。以下のレコードでのみ利用可能です。

>Authorization Consent、Custom Transaction Types、Expense Report Policy、Imported Employee Expense、Manage Roles、Netting Statement

# システム・ノートを閲覧できる場所

ユーザーのロールや目的により、以下の2か所から閲覧できます。

## 1. 「システム・ノート」サブタブ or セクション

通常のロールのユーザーは自分が関係する特定のマスター/トランザクション情報の変更履歴が気になることが多いでしょう。その場合、該当するレコードを開いて、フォームの「システム情報 (Sytem Information」サブタブの中にある「システム・ノート」サブタブを見つけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197689/6076c919-1221-564e-c77e-a06109de5454.png)

フォームがカスタマイズされている場合、サブタブでなくてセクションの中にあったり、ロールによっては「システム・ノート」サブタブが表示されないフォームが使われている場合もあります。その場合は、適切なフォームの場所、または適切なロールを使って閲覧します。

## 2. レポート > 新規検索 > システム・ノート

主にシステム管理者向け (他のロールでも検索機能は使える) ですが、システム横断で、たとえば特定期間のすべての変更箇所を抜き出したい場合などに、レポートからの検索を使うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197689/e15cd3ae-38ea-bc48-b51d-2b74428be99b.png)

# 計算式でも「システム・ノート」を参照できる

「システム・ノート」内のフィールドは、`{systemnotes.field_name}`という形式で、「計算式 (数値)」と「計算式 (テキスト)」などから参照できます。これを使って、たとえば注文承認にかかる時間の計算を行うことが可能になります。

トランザクション検索において、フィルターの「条件」として以下を設定:
```
「種類」は「Sales Order」である
「メイン・ライン」は「真(true)」である
「System Notes : Field」は「Document Status」である
「System Notes : New Value」は「Pending Fulfillment」である
```
そして、「計算式(数値)」列を追加して、

```
{‌systemnotes.date}-{datecreated}
```
と指定することで、注文承認にかかる時間が計算されます。
Haskellでラムダ計算:チャーチ数

ここで関数の作用数をチャーチ数をに変換する関数を定義します。

$$\lambda n.n(\lambda z.z+1)0$$

真ん中のラムダ式は整数を$1$増加させるのオペレータです。
チャーチ数$s(s(z))$などを自然数$2$などに変換する関数について考えてみます。
Haskellの式では、`churchToInt n = n (+1) 0`となります。

例えば、$\textbf{2}=\lambda sz.s(s(z))$なので、これにチャーチ数から自然数を求める関数を適用すると
$(\lambda n.n(\lambda z.z+1)0)\textbf{2}
\rightarrow(\lambda n.n(\lambda z.z+1)0)(\lambda sz.s(s(z)))$
$\rightarrow(\lambda z.z+1)((\lambda z.z+1)(0))
\rightarrow(\lambda z.z+1)(1)
\rightarrow 2$
つまり$2$となります。

Haskellで$\textbf{0},\textbf{1},\textbf{2},\textbf{3}$を検証します。
前の記事の[算術編１](https://qiita.com/Trubetzkoy/items/10a960c806b11702337f)で紹介したsuccessor関数$\textbf{S}$を用いた$\textbf{S0},\textbf{S1},\textbf{S2},\textbf{S3}$もHaskellでもう一度検証します。きちんと$1$増加した値になっていますね。

```
zero s z = z
one s z = s(z)
two s z = s(s(z))
three s z = s(s(s(z)))
-- チャーチ数を通常の整数に変換
churchToInt n = n (+1) 0

succ' n a b = a (n a b)

main = do
    print $ "zero  = " ++ show (churchToInt zero)
    print $ "one   = " ++ show (churchToInt one)
    print $ "two   = " ++ show (churchToInt two)
    print $ "three = " ++ show (churchToInt three)
    print $ "succ' zero = " ++ show (churchToInt (succ' zero))
    print $ "succ' one  = " ++ show (churchToInt (succ' one))
    print $ "succ' two  = " ++ show (churchToInt (succ' two))
    print $ "succ' three =" ++ show (churchToInt (succ' three))

*Main> main
"zero  = 0"
"one   = 1"
"two   = 2"
"three = 3"
"succ' zero = 1"
"succ' one  = 2"
"succ' two  = 3"
"succ' three =4"
```
[Shell]指定のプロパティファイルから特定キーの値を取得

## コマンド実行

```test.properties
SEND_URL=http://localhost:8080/keys
TIMEOUT=1000
```
```sh
$ grep "SEND_URL" test.properties | cut -d'=' -f2

http://localhost:8080/keys
```
## shellファイル化

```test.sh
#!/bin/bash

# プロパティファイル
PROPERTY_FILE="test.properties"

# キーを指定
KEY="SEND_URL"

# 値を取得
VALUE=$(grep "^$KEY=" $PROPERTY_FILE | cut -d'=' -f2)

# 値を表示
echo "$VALUE"
```

```sh
$ chmod 755 test.sh
$ ./test.sh

http://localhost:8080/keys
```

## 外部ファイルと引数を組み合わせる

```config.env
# 外部設定ファイル (config.env)
PROPERTY_FILE="/home/sano2/dkwork3/test.properties"
TARGET_KEY="SEND_URL"
```

```test2.sh
#!/bin/bash

# 外部設定ファイルの読み込み
CONFIG_FILE="config.env"
if [ -f "$CONFIG_FILE" ]; then
  source "$CONFIG_FILE"
fi

# 引数で上書き
PROPERTY_FILE=${1:-$PROPERTY_FILE}
TARGET_KEY=${2:-$TARGET_KEY}

# 引数またはデフォルト値の確認
if [ -z "$PROPERTY_FILE" ] || [ -z "$TARGET_KEY" ]; then
  echo "Usage: $0 [property_file] [key]"
  exit 1
fi

# プロパティファイルからキーの値を取得
VALUE=$(grep "^$TARGET_KEY=" "$PROPERTY_FILE" | cut -d'=' -f2)
if [ -z "$VALUE" ]; then
  echo "Key $TARGET_KEY not found in $PROPERTY_FILE"
  exit 1
fi

# 結果を表示
echo "$VALUE"
```

```sh
$ chmod 755 test2.sh

# プロパティパス＋ファイル名とプロパティのキーはconfig.envのデフォルト値を使用
$ ./test2.sh

http://localhost:8080/keys

# プロパティパス＋ファイル名はconfig.envのデフォルト値、プロパティのキーは引数で指定されたものを使用
$ ./test2.sh "" "TIIMEOUT"

1000
```
VMWare Workstation Pro を久しぶりに触る④

## 前回のおさらい
5年ぶりぐらいに触る人間が、何分で構築できるのか、
というテーマで環境構築を進めてまいります。
前回はゲストOS(AlmaLinux)インストールに成功したところまで。

### 4.ゲストOSのネットワーク設定
ホストOSから接続するために、ゲストOSのネットワーク設定をしていきます。
まずはifconfigで設定確認から。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/0864440b-870b-c108-8ab3-057bd50bfa5f.png)


このままでもいいかなーと思いますが、念のためIPアドレスに変更します。
nmcliコマンドで設定していきます。
```
nmcli connection modify ens160 ipv4.addresses 192.168.40.170/24
nmcli connection down ens160; nmcli connection up ens160
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/5536f5ae-d5b0-70e5-76ab-278edc19bb9b.png)

おぉ、変わりましたね。
引き続き、dnsとipアドレス固定設定に変更します。
```
nmcli connection modify ens160 ipv4.dns 8.8.8.8
nmcli connection modify ens160 ipv4.method manual
nmcli connection down ens160; nmcli connection up ens160
```

これで最低限の設定ができたので、ホストOSよりつなぎたいと思います。
コマンドプロンプトより、以下のコマンドを実行
```
ssh almauser@192.168.40.170
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/5b0e5121-77fa-6f5f-f722-14a733777b96.png)

間違えないか聞かれるので、yesを入力。
パスワードを入力したら、無事ログイン完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3826192/f5ba8e3a-b46e-1cf9-ee21-1c445397b130.png)

思いの外、サクサク進みました。

次回は、Dokerをインストールし、何かしらのコンテナを起動してまいります。
生成AI時代だからこそラバーダックデバッグをお勧めしたい

# はじめに

ここ数年で、CursorやChatGPTなどのAIを利用してコーディングすることが増えたが、

それと同時に生成されたコードをコピーペーストするだけでそのまま動いてしまうこともあり、

頭で考えずに、コーディングすることも多くなった。

そのため、AIを使用したコードの理解や説明できていないなぁと思う場面もある。

この課題を解決するために最近、ラバーダックデバッグを取り入れている。🐤

ただ、無心でAI使っていたころよりは、理解が深まったような気がするのでおすすめしたい。


# ラバーダックデバッグとは🪿🐥

ソフトウェア開発におけるデバッグ手法の一つで「人に説明するようにコードを一行ずつ声に出して説明する」ことで、バグを発見しやすくするというものです。

* なぜアヒルなのか？(github.blogより)

https://github.blog/jp/2024-10-23-whats-with-all-the-ducks/

```
この話の始まりは1999年、アンドリュー・ハントによって出版された書籍 The Pragmatic Programmer に遡ります。そこには、あるコンピュータープログラマーが、ある日おもちゃのアヒル（ラバーダック）を目の前に置き、自分のコードを一行一行説明したというエピソードが書かれていました。
コードを声に出して説明するプロセスが、その開発者に自分のコードをより理解させ、洞察を深める助けになったのです。なぜなら、ラバーダックは決して口を挟まないからです！
この技法は広まりました。今では「ラバーダックデバッグ」や「ラバーダッキング」と呼ばれています。
```

# 生成AI時代のラバーダックデバッグのメリット

(下記は、個人の感想です。)

* ラバーダックデバッグするために、無心で生成AIの結果をコピペすることが減り、説明できるくらいまで調査することが増えた。
* ラバーダックデバッグを行うことで、生成AIが出力したコードやテキスト、その他のデータを一つずつ丁寧に説明する過程で、コード、ロジックへの理解や言語化する力が伸びた。
* 理解度、説明力が上がることで、「生成AIに依存し過ぎている感」が減った。
* 生成AIの出力結果の微妙な誤りやミスに気づくことが多くなった。
* 説明力も付くので、入力プロンプトする質も向上して、意図した回答を得れるようになった。

# おわりに

まだ、取り入れて数か月程度だが、

口を動かし、声に出すことで、コードが記憶にも残りやすくなった気がする。

実際、業務でコードの質問を受けても、今までは言語化するのに、

つまる場面もあったが、以前と比較して改善してきたように思える。💪


筆者の愛用にアヒル

![生成AI時代だからこそラバーダックデバッグをお勧めしたい_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777149/455bce13-d89d-7791-e7cc-8324c9de94ba.jpeg)


(在宅は大丈夫ですが、オフィスなど周囲に人がいてラバーダックデバッグすると

フィギュアに話しかける不思議ちゃん😇になるので、気をつけてください)