OmniAICreator/Qiita-1.07M huggingface dataset:
ESP32でPiascore対応フットスイッチを自作したよ

## はじめに
この記事は[DENSO Advent Calendar 2024](https://qiita.com/advent-calendar/2024/denso)の8日目の記事です。

## 概要
Piascoreで楽譜をめくるためのフットスイッチをESP32を使って自作しました！  
Bluetooth接続でiPadに接続し、スイッチを踏むだけで楽譜をめくることができます。  
この記事では、作成の過程を解説します。

## 動機・背景
- 楽譜をめくるためにフットスイッチが必要になった。
- 市販のフットスイッチは高価（4000~7000円）だった。
- 余っていたESP32を有効活用したかった。

## 必要な部品とツール

### ハードウェア
- **ESP32-WROOM-32D**
- **タクトスイッチ x 2**
- **ブレッドボード**
- **ジャンパワイヤ**
- **ケース**（3Dプリンターで作成）

### ソフトウェア
- **VSCode + PlatformIO**
- **ESP32-BLE-Keyboardライブラリ**

## Piascoreのショートカットについて
### 譜送り
右送り：右 or 下矢印キー
左送り：左 or 上矢印キー

ということで、ESP32でBluetoothキーボードを作成し、左右キーに対応したボタンを配置したらよさそう

## ソフトウェア(ESP32)の実装

1. 開発環境の準備
    i. VSCodeのインストール
    ii. PlatformIOの拡張機能をインポート
    iii. 必要に応じて、ESP32の[ドライバー](https://www.silabs.com/search#q=cp210x_universal_windows_driver&t=All&sort=relevancy)をインストール

参考：https://zenn.dev/kotaproj/articles/esp32_vscode_pio
2. 参考コード
    以下のようなコードをESP32に書き込み、4, 5番ピンにスイッチをつなげば完成！
    
``` cpp 
#include <Arduino.h>
#include <BleKeyboard.h>

BleKeyboard bleKeyboard("ESP32 Keyboard", "ESP32", 100);

const int upButtonPin = 4;
const int downButtonPin = 5;
bool upButtonPressed = false;
bool downButtonPressed = false;

void setup() {
    pinMode(upButtonPin, INPUT_PULLUP);
    pinMode(downButtonPin, INPUT_PULLUP);
    bleKeyboard.begin();
}

void loop() {
    if (bleKeyboard.isConnected()) {
        if (digitalRead(upButtonPin) == LOW && !upButtonPressed) {
            bleKeyboard.press(KEY_UP_ARROW);
            delay(100);
            bleKeyboard.release(KEY_UP_ARROW);
            upButtonPressed = true;
        } else if (digitalRead(upButtonPin) == HIGH) {
            upButtonPressed = false;
        }

        if (digitalRead(downButtonPin) == LOW && !downButtonPressed) {
            bleKeyboard.press(KEY_DOWN_ARROW);
            delay(100);
            bleKeyboard.release(KEY_DOWN_ARROW);
            downButtonPressed = true;
        } else if (digitalRead(downButtonPin) == HIGH) {
            downButtonPressed = false;
        }
    }
    delay(10);
}
```

## ケースの作成
3Dプリンターを使って、フットスイッチを作成することにした！
ペダルの形をしたかっこいいスイッチを作りたかったが、3Dモデルを作ることができず、簡単な形で妥協しました。
中央のくぼみにブレッドボード+ESP32をはめ込みます。
![背面の図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629889/1bc9f798-5e00-5fd1-2892-e0962f7bdb2b.png)
![中の図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629889/a0e5a8b1-1d30-3f53-ac95-edd187983abd.png)


## 組み立て
モデルを3Dプリンターで出力し、組み立てて完成！
![完成品](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629889/c185b5e2-55fb-21df-ebd4-3a30f61f2eae.jpeg)


## 実際に使ってみる
1. iPadにペアリングしてみる
![ペアリングの画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629889/b58dad6d-7b02-7dc9-0412-a9040c4e1dc3.png)

1. Piascoreで使ってみる
無事にスイッチを押すことで楽譜をめくることができた！

## まとめ・感想
- ESP32でBluetooth キーボードを作成し、Piascoreで譜捲りが行えるフットスイッチを作成しました。
- ライブラリが充実しており、思っていたよりも簡単に作成することができました。
- 3Dモデルを作成するスキルが足らず、フットスイッチ感がない見た目になってしまったので、ペダル版をリベンジしたい！
- 機能としては理想通りのものが作れたので満足！

## 参考にしたもの

https://zenn.dev/kotaproj/articles/esp32_vscode_pio
OANDAのAPIを使用して検証やトレードを自動化するためのコード

まずはAPIを取得してください。
OANDAを使用する場合はマイページにログインしてからAPIの管理というページを開いてください。

https://www.oanda.jp/trade/web/settings/api

以下のURLにAPIを取得してデータを弄るためのコードやアイディアがあります。全部試してみましたが、environmentで引っかかりやすいと思います。
デモ口座を使用するのであれば、以下のURLにあるコードをそのまま使えば良いですが、本番講座を使うのであればenvironmentはliveとしてください。

https://www.oanda.jp/lab-education/api/

```
import numpy as np
import oandapyV20

API_KEY = 'APIトークンを入力'
ACCOUNT_ID = 'アカウント情報を入力'

from oandapyV20 import API
import oandapyV20.endpoints.trades as trades
import json
client= API(access_token=API_KEY,environment="live")

r = trades.TradesList(ACCOUNT_ID)
print("REQUEST:{}".format(r))
rv = client.request(r)
print("RESPONSE:\n{}".format(json.dumps(rv, indent=2)))
from oandapyV20.endpoints.pricing import PricingStream
from oandapyV20 import API
```

これでAPIを取得することができると思います。

```
# APIトークンの定義
account_id = ACCOUNT_ID
access_token = API_KEY

# パラメータの設定
params = {
"instruments": "USD_JPY"
}

# API用のクラスを定義
client = API(access_token=access_token, environment="live")

# 為替データを取得
r = PricingStream(accountID=account_id, params=params)
client.request(r)
print(r.response)
import oandapyV20.endpoints.instruments as instruments
from oandapyV20 import API

# APIトークンの定義
api_token = API_KEY
# パラメータの設定
params = {
"granularity": "M5", # ローソク足の間隔
"count": 5000, # 取得する足数
"price": "M", # B: Bid, A:Ask, M:Mid
}

# 通貨ペアの設定
instrument = "USD_JPY"

# API用のクラスを定義
client = API(access_token=API_KEY, environment="live")

# 為替データを取得
r = instruments.InstrumentsCandles(instrument=instrument, params=params)
client.request(r)
print(r.response)
dict_trade = r.response

# json形式で出力
with open("M5data","w") as f:
json.dump(dict_trade, f)
import pandas as pd

# 為替データを格納するためのリストを定義
price_data = []

# データを1つずつ取り出してprice_dataに格納する
for row in r.response["candles"]:

# 辞書を定義
data = {}

# dataに格納する
data["datetime"] = row["time"]
data.update(row["mid"])
data["volume"] = row["volume"]

# price_dataに追加する
price_data.append(data)

# DataFrameに変換する
df = pd.DataFrame(price_data)

# カラム名の定義
columns = {
"o": "open",
"h": "high",
"l": "low",
"c": "close"
}

# カラム名の変更
df.rename(columns=columns, inplace=True)
df.head()
```

上のコードではjson形式でデータを出力したり、pythonで処理しやすいようにデータフレーム形式にすることもできます。

また、ローソク足の時間軸の表記にも作法があるので、上のURLを参照してください。
Web上からアップロードした画像のメタデータをサーバー側で取得する方法


はじめまして、H-kunと申します。
A-kun ひとり Advent Calender 8日目です。
今回の話題は、Web上からアップロードした画像の撮影時刻・GPS情報を取得する方法について、解説します。

## やったこと

下記がExif情報を取得するモジュールです。exif_utils.pyとして保存します。
```python
import streamlit as st
from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS

def get_exif_data(image):
    """Extract Exif data from an image."""
    exif_data = {}
    info = image._getexif()
    if info:
        for tag, value in info.items():
            tag_name = TAGS.get(tag, tag)
            exif_data[tag_name] = value
    return exif_data

def get_geotagging(exif_data):
    """Extract GPS data from Exif."""
    if "GPSInfo" not in exif_data:
        return None
    
    gps_data = {}
    for tag, value in exif_data["GPSInfo"].items():
        tag_name = GPSTAGS.get(tag, tag)
        gps_data[tag_name] = value
    return gps_data

def get_decimal_coordinates(gps_data):
    """Convert GPS coordinates to decimal format."""
    def convert_to_decimal(coord, ref):
        degrees, minutes, seconds = coord
        decimal = degrees + (minutes / 60.0) + (seconds / 3600.0)
        if ref in ['S', 'W']:
            decimal = -decimal
        return decimal

    if gps_data:
        latitude = gps_data.get("GPSLatitude")
        latitude_ref = gps_data.get("GPSLatitudeRef")
        longitude = gps_data.get("GPSLongitude")
        longitude_ref = gps_data.get("GPSLongitudeRef")

        if latitude and latitude_ref and longitude and longitude_ref:
            return (
                convert_to_decimal(latitude, latitude_ref),
                convert_to_decimal(longitude, longitude_ref)
            )
    return None

def display_exif_info(uploaded_file):
    """Process and display Exif info from an uploaded image."""
    image = Image.open(uploaded_file)
    exif_data = get_exif_data(image)

    # 撮影時刻を取得
    datetime = exif_data.get("DateTimeOriginal", "情報なし")
    st.write(f"撮影時刻: {datetime}")

    # GPS情報を取得
    gps_data = get_geotagging(exif_data)
    if gps_data:
        coordinates = get_decimal_coordinates(gps_data)
        if coordinates:
            st.write(f"緯度: {coordinates[0]}")
            st.write(f"経度: {coordinates[1]}")
        else:
            st.write("GPS情報が見つかりませんでした。")
    else:
        st.write("GPS情報が見つかりませんでした。")
```

これをstreamlitで公開するコードが、下記になります。

```python
# FILE: view.py
import streamlit as st
from exif_utils import display_exif_info

# Streamlitアプリの構築
st.title("Exif情報取得アプリ")
st.write("画像をアップロードして、Exif情報を確認してください。")

uploaded_file = st.file_uploader("画像をアップロードしてください", type=["jpg", "jpeg", "png"])

if uploaded_file:
    display_exif_info(uploaded_file)
```

## Exifデータが取得できるか確認

確認したところ、条件によってはブラウザ側でExif情報が削除されてしまうことがわかりました。

動作検証端末

iPhone XR (iOS 17.6.1) 
- Chrome 121.0.6167.66 -> OK
- Safari -> OK

Android (Android 15)
- Chrome 131.0.6778.104 -> NG

## （代替策）Google Formを利用する

いくつか試してみたところ、Google Formを利用することで、Exif情報がついたままま画像のアップロードが可能であることがわかりました。
そこで、アップロードされた画像をGoogleDriveの特定のフォルダに保存し、定期的にそのフォルダの内容を監視することで、Exif情報を取得することができると考えられます。これはまた次回の課題としたいと思います。
type-challenges の easy 問題をスムーズに解くための基礎知識

トグルホールディングス株式会社でプロダクトエンジニアとして働いている原口です！

最近、TypeScript の型システムやユーティリティ型への理解を深めるために、[type-challenges](https://github.com/type-challenges/type-challenges) に毎日少しずつ取り組んでいます。  
今回は、その中でも初級レベル (easy) の問題をすべて解いてみました。ここでは解答の解説ではなく、「事前に知っておくとスムーズに解ける TypeScript の知識」を中心にまとめています。

# type-challenges とは
type-challenges は、TypeScript の型システムを駆使して様々な型を実装する練習問題集です。問題は easy（とはいえ慣れていないと難しいものも多い）から extreme まで幅広く、一般的なユーティリティ型 (Pick、Readonly、Exclude など) の再実装から、型推論や条件型を活用しなければ解けない複雑な問題まで、様々な問題が用意されています。

これらに取り組むことで、TypeScript の型に対する理解が深まります。

# 難しかったポイント

## [Distributive Conditional Types](https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types) について

[Exclude](https://github.com/type-challenges/type-challenges/blob/main/questions/00043-easy-exclude/README.ja.md) の問題では、条件型（`T extends U ? X : Y`）を用いて要素ごとに型をフィルタリングする処理が必要です。

TypeScript の条件型は、ユニオン型に対して「分配」が行われるという仕様があります。  
以下は、任意の型を受け取って、その型を配列にして返す `ToArray` の例です。

```ts
type ToArray<Type> = Type extends any ? Type[] : never;
type StrArrOrNumArr = ToArray<string | number>;
```

`ToArray` は `string` と `number` に対してそれぞれ適用され、  
`ToArray<string> | ToArray<number>` となり、結果として `string[] | number[]` という型が得られます。

この性質を利用することで、`Exclude` 型などを実装できます。

## infer キーワードによる型推論

[Parameters](https://github.com/type-challenges/type-challenges/blob/main/questions/03312-easy-parameters/README.ja.md) や [Awaited](https://github.com/type-challenges/type-challenges/blob/main/questions/00189-easy-awaited/README.ja.md) などの問題では、`infer` キーワードを用いた一部の型抽出のテクニックが必要となります。`infer` は条件型の中で使用でき、推論結果を変数のように扱うことが出来ます。

特に [Awaited](https://github.com/type-challenges/type-challenges/blob/main/questions/00189-easy-awaited/README.ja.md) の問題では、再帰的に Promise をアンラップしていく必要があり、`infer` と条件型を組み合わせた再帰的な型定義を理解する良い練習になりました。

## 配列型への理解

[TupleToObject](https://github.com/type-challenges/type-challenges/blob/main/questions/00011-easy-tuple-to-object/README.ja.md) や [Length of Tuple](https://github.com/type-challenges/type-challenges/blob/main/questions/00018-easy-tuple-length/README.ja.md)、[Push](https://github.com/type-challenges/type-challenges/blob/main/questions/03057-easy-push/README.ja.md) のような配列を操作する問題では、TypeScript における配列型の特性を知っておくとスムーズに解けます。
たとえば `T['length']` で配列の長さが型レベルで取り出せる点や、スプレッド構文（`...T`）を使った配列同士の結合などがキーポイントになります。

## PromiseLike について

[Awaited](https://github.com/type-challenges/type-challenges/blob/main/questions/00189-easy-awaited/README.ja.md) の解答例では、[PromiseLike](https://github.com/microsoft/TypeScript/blob/421f5c5458d09dad601604e6eff8765283aef14e/src/lib/es5.d.ts#L1512-L1520) という型が登場します。  
`PromiseLike` は `then` メソッドを持つ「thenable」なオブジェクトを表すためのインターフェースです。
これは完全な `Promise` 実装ではなく、`then` メソッドを介して `Promise` と似た挙動を実現する型になります。  
自分は全くなじみが無かったのですが、TypeScript の定義ファイルを参照することで理解を深めることができました。

# まとめ

easy レベルの type-challenges に取り組むことで、以下のような知識が得られました。

- Distributive Conditional Types：条件型がユニオン型に対して分配的に適用される特性
- infer キーワード：条件型内部で型推論・再帰的型展開を行うテクニック
- 配列型の特性：`T['length']` による長さ取得、スプレッド構文による型操作
- PromiseLike の理解：`Promise` のようなオブジェクト型への対応

これらを事前に押さえておくと、type-challenges に取り組む際のハードルを下げることができ、実際に問題に挑戦する際にはより本質的な部分にフォーカス出来ると思います。
また、これらの知識は実務でも役立つと思いますので、興味があればぜひ挑戦してみてください！
毎週バージョンを上げられていないプロダクト、EOLが切れているプロダクト、俺ガチで危機感持った方がいいと思う🚿

この記事は [ex-crowdworks Advent Calendar 2024](https://qiita.com/advent-calendar/2024/ex-cw)の9日目の記事です。

# はじめに
今年、株式会社クラウドワークスを退職したエンジニアコーチの@nisyuuです。使用しているランニングシューズは[GEL-KAYANO 31](https://www.asics.com/jp/ja-jp/mk/running/kayano)です。
エンジニアとしてクラウドワークステック（旧クラウドテック）というフリーランスと企業をマッチングするエージェントサービスを開発していました。

クラウドワークステック開発チームでは、ライブラリを1週間おきと定期的にアップデートする取り組みや、EOLの事前アップデートに取り組んでいます。
定期的にバージョンアップをすることで、現行バージョンのサポート切れで想定される障害や、最新の機能を利用できる環境にしておくことでシステムをより良いものにすることが可能です。

日本にあるエンジニア組織で、ここまでの取り組みができている組織はほとんどないと思うため、今回はテック開発チームがどのようにライブラリのアップデートに取り組んでいるかを紹介します。

# 1週間おきにライブラリアップデート

テック開発チームのライブラリアップデートには、[Dependabot](https://docs.github.com/ja/code-security/dependabot)というプロジェクトで使用されるライブラリをチェックし、脆弱性の検知やバージョンアップ用のPRを自動で作成するボットを活用しています。

Dependabotの設定はyamlファイルで実装することができます。
詳細はこちらをご覧ください。

https://docs.github.com/ja/code-security/dependabot

使用しているライブラリは日々頻繁に更新されます。
そのため、1週間という短い時間スパンで更新をしていました。
バージョンアップ用のPRは休日に作られるため、次の週に担当者がバージョンアップの内容確認と動作確認をして対応していました。
アップデートは当番制で、エンジニア間で担当していました。

# EOLの事前検知

EOLはこちらのサイトで確認していました。

https://endoflife.date/

EOLは頻繁に訪れるものではないため、週1で対応する必要はありませんでしたが、上記サイトがAPIを提供しており定期的にGASを通してSlackへ検知結果を通知するようにしていました。
さらに、通知内容をライブラリアップデートの当番が確認する運用を導入していました。
EOLの対応はボランティア活動のようになってしまっており、属人化していることが問題にもなっていたため、自動化と当番チェックの掛け合わせで効率よく属人化を防げるようになりました。

# おわりに

気づいたらEOLが...といったことや、使っているライブラリに脆弱性があるけどメジャーバージョンを2つぐらい上げないといけなくすぐに対応できない...といったことにならないように、バージョンはこまめにチェックしてアップデートしておきましょう。

達成よろしく！
【備忘録】ADサーバの基礎


# はじめに
Azure上でADサーバ構築をする機会があったのですが、
ADサーバ自体の理解度が低かったので調べた際の備忘です。
構築手順などは一切なく、概念の理解が中心となります。

# Active Directory

コンピュータ1台1台にユーザIDとパスワードを設定していくと、だんだん管理がめんどうになってきます。
例1：ID/PASSを変えたい時に対象のコンピュータ全台の設定を変える
例2：新人が来た時のIDを対象のコンピュータ全台にIDを追加する

そこで登場したのがActive Directory（以下AD)です。
Kerberos認証と呼ばれる認証方式で上記のめんどくささを解決してくれます。

例1：ADで設定を一元管理
例2：新人の情報をADに追加すれば他のコンピュータへの設定変更が不要

# 前提条件

以下のような環境が必要です。

1. AD用のサーバを１つ準備　※WindowsServerさえあれば、あとは「サーバーマネージャー＞管理＞役割と機能の追加」より機能を追加すると使えます
AzureのVM上で機能を追加することも可能です

2. 管理したいコンピュータからアクセスできるネットワーク環境

# 用語

#### ①ADサーバ
名称が非常に色々あります。
1. AD
1. ADDS
1. ドメインコントローラー
1. ドメコン

など。
ADの中にDNSの機能を持たせることができるため「DNSサーバ」と言う人もいるかもしれません。

#### ②ドメイン

管理したいコンピュータとユーザ群のこととです
ドメインには名称があり、通常は「○○○○.com」や「○○○○.local」などになります。
※オンプレでドメインをたてる場合は名称に制限はありませんが、Azure上に立てる場合は「.local」などは使えないため名称に制限があります。

このドメインに参加することで、ドメインコントローラーが管理できるようになります。
#### ③OU

ドメインに属しているユーザやコンピュータをグループわけすることができます。
その分けたグループのことをOUと言います。

例えば部署毎にOUを作ってあげたりします。

#### ④ドメインツリー

ドメインが複数連なって、お互いの情報を連携させる仕組みがあります。
ドメインツリーはそういった連携させた状態を俯瞰して全ての連係情報のことを言います。

さらにドメインツリーが複数連携（信頼関係を結ぶ）とフォレストという名称になります。

# 細かい制御をするには

ADサーバの機能の一つに「グループポリシー」というものがあります。

例えば以下のような設定が可能です。
1. 全ての端末のUSB使用禁止
1. 全ての端末へ共有フォルダのマウント
1. 全ての端末のデスクトップにショートカット配布
1. 全ての端末のパスワードのポリシー設定（〇文字以上など）

「全ての」の記載していますが、グループポリシーは、コンピュータ、ドメイン、OUなどの単位ごとに適用できます。

また、グループポリシーの設定はコンピュータ用とユーザ用の大きく２種類に分かれており適切に適用してあげる必要があります。

公式ドキュメントは下記あたりです

https://learn.microsoft.com/ja-jp/windows-server/identity/ad-ds/manage/group-policy/group-policy-overview?source=recommendations
【CodeDeploy】デプロイステータスとライフサイクルの関係性についてまとめてみた

[Japan AWS Jr. Champions Advent Calendar 2024](https://qiita.com/advent-calendar/2024/japan-aws-jr-champions) 8日目の記事です。

# はじめに
みなさんはCodeDeployを利用しているでしょうか？
CodeDeploy は、「Amazon EC2 インスタンス、オンプレミスインスタンス、サーバーレス Lambda 関数、または Amazon ECS サービスへのアプリケーションのデプロイを自動化するデプロイサービスです」。
私はCodeDeployのLambdaフックという機能を使って、デプロイ時にLambda処理を追加することを行ったときに悩んだデプロイステータスとライフサイクルの関係性について記載します。

# 前提
・CodeDeployを使ってECSへのデプロイを行う
・CodePipelineのデプロイステージでCodeDeployを利用する(ソースステージはCodeCommit、ビルドステージはCodeBuild)

# 内容
「はじめに」にも記載しましたが、CodeDeployのデプロイステータスとライフサイクルの関係性がわかりませんでした。デプロイステータスはマネジメントコンソール上に表示され、ステップ1~4があります。

【デプロイステータス】
- ステップ1:置き換えタスクセットのデプロイ
- ステップ2:本稼働トラフィックを置き換えタスクセットに再ルーティング中
- ステップ3:ロールバックの待機
- ステップ4:元のタスクセットの終了

ライフサイクルイベントはAWSのサイトにも記載されている通り、以下の通りです。
【ライフサイクルイベント】
(start)→BeforeInstall→(install)→AfterInstall→(AllowTestTraffic)→AfterAllowTestTraffic→BeforeAllowTraffic→(AllowTraffic)→AfterAllowTraffic

あまり調べてもこれといったサイトが出てこなく、これらの関係性について調べたり、問い合わせたりした結果、以下のことが分かりました。
結論、ステップ1とInstall、ステップ2とAllowTrafficが同じ意味だそうです。

(start)→BeforeInstall→(install)/ステップ1→AfterInstall→(AllowTestTraffic)/ステップ2→AfterAllowTestTraffic→BeforeAllowTraffic→(AllowTraffic)→AfterAllowTraffic→ステップ3→ステップ4

# まとめ
CodeDeployのデプロイステータスとライフサイクルイベントの関係性について参考になったでしょうか。
ステップ1とInstall、ステップ2とAllowTrafficが同じ意味と理解していただければと思います。
少しでも参考になったら幸いです。
※マネコンの表示がなく、申し訳ございません。後ほど追加いたします。

# 参考サイト
- [AppSpec 「フック」セクション](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html)
画像、音声、書庫等を再圧縮

画像や音声file等、作ったらそのままの状態で使ったりまき散らしていませんか? そういうfileは概ね贅肉まみれのデブです。体脂肪率100%以上です。
今まで大量のweb素材をかき集めてきた経験から言って、ほとんどの画像は超肥満です。しかし幸いな事に、こういった連中を叩き直してくれるものがあるので紹介します。世にはびこる肥満fileどもを減量させるのだ!
* [iLoveIMG](https://www.iloveimg.com/)<p>browser上で画像を加工したり再圧縮したりできる
	* [compress-image](https://www.iloveimg.com/ja/compress-image)
* [FileOptimizer](https://sourceforge.net/projects/nikkhokkho/files/FileOptimizer)<p>書庫、画像、音声、動画等を無劣化で再圧縮する。使い勝手が良いし性能も抜群。ただし最強設定にすると死ぬ程遅い
* [AdvanceCOMP](https://www.advancemame.it/download)<p>ZIP、GZ、PNG等の再圧縮
	* [The sources for GNU/Linux, Mac OS X, DOS and Windows](https://github.com/amadvance/advancecomp/releases/download/v2.6/advancecomp-2.6.tar.gz)
	* [Windows binary for x86](https://github.com/amadvance/advancecomp/releases/download/v2.6/advancecomp-2.6-windows-x86.zip)
	* [Windows binary for x64](https://github.com/amadvance/advancecomp/releases/download/v2.6/advancecomp-2.6-windows-x64.zip)
* [Super Compression - useful programs](https://supercompression.org/)<p>書庫、画像、音声、動画等を無劣化で再圧縮するprogramを多く公開している所。downloadが曲者で、面倒臭い操作を要する場合がある
	* [Archive(7z,rar,zip) optimizer](https://supercompression.org/ultra7z-archive-optimizer/)
	* [RAR optimizer](https://supercompression.org/ultra7z-rar-optimizer/)
	* [ZIP optimizer](https://supercompression.org/ultra7z-zip-optimizer/)
	* [FreeArc Optimizer](https://supercompression.org/ultra7z-freearc-optimizer/)
	* [FLAC Music Lossless Optimizer](https://supercompression.org/ultra7z-flac-music-lossless-optimizer/)
	* [MP3 Music Lossless Optimizer](https://supercompression.org/ultra7z-mp3-music-lossless-optimizer/)
	* [JPG/JPEG Photo Lossless/Lossy Optimizer](https://supercompression.org/ultra7z-jpeg-photo-lossless-optimizer/)
	* [PNG Picture Lossless Optimizer](https://supercompression.org/ultra7z-png-picture-lossless-optimizer/)
	* [PDF Lossless Optimizer/Compressor](https://supercompression.org/ultra7z-pdf-lossless-optimizer-compressor/)
* [Efficient Compression Tool](https://github.com/fhanau/Efficient-Compression-Tool)<p>zopfliより高速に高圧縮のPNG、JPEG、GZIP、ZIPを生成する

まだまだ沢山ありますが、各自で調べてみて下さい
現役エンジニアの私がフロントエンドエンジニアになるために学んだ講座

久しぶりにQiitaで記事を書きます、ちーずです。
私がフロントエンドエンジニアを目指していた頃、Udemyでたくさんの講座を購入し、受講していました。
その経験が少しでも誰かの役に立てばと思い、このアドベントカレンダーに記事を書こうと思いました。

購入したUdemyの講座は約20個くらいで、そのうち半分がフロントエンド関連の講座です。
他にもFlutterや機械学習など、さまざまな分野の講座を購入しました。

その中でも、特に実務に役立つ知識が詰まっていると私が感じた講座を2つ紹介します。

:::note warn
最終更新日が2024年以降の講座のみをピックアップしましたが、ほとんどの講座は私が2020年に購入・受講したものであり、内容が古くなっている可能性があります。ご了承ください。
:::

## 自己紹介

* 2019年4月〜: 事業会社(toC)のデザイナー
    * ほぼコーダーのようなポジションで、書けるのはせいぜいjQueryを利用したDOM操作まで
    * 2021年から、VueやReactなどを利用したサービスのフロントエンド開発に携わる
* 2022年9月〜: 事業会社(toB SaaS)の**フロントエンジニア**
    * Reactメインの基盤プロダクトの開発に携わる

## 1. ガチで学びたい人のためのJavaScriptメカニズム
https://www.udemy.com/course/javascript-essence/


### どのような人におすすめしたいのか
* 「なんとなくJavaScriptを書く」をやめたい人
* ブラウザ上でどのようにJavaScriptが動くかを知りたい人

:::note warn
論理やメカニズムの説明が多いため、手を動かしながら学ぶことを重視する人にはあまり向いていないかもしれません。
:::

### なぜこの講座をおすすめしたいのか

#### メカニズムから学べるため、知識が応用しやすい
表題の通り、この講座はJavaScriptのメカニズムを学べる内容です。
ただ記法を覚えるだけでなく、どのような原理でそのロジックが動くのかもしっかり理解できます。

(スコープの話に1時間以上費やす講座は、Udemyではなかなか見かけません。貴重です!)

こうしたメカニズムを学ぶことで、バグに直面したときに「なぜ動かなくなったのか」をより正確に理解し、コードの修正がしやすくなります。

#### デバッグ力も一緒に身に付く
メカニズムを解説する中で、コールスタックやブレークポイント、debuggerの使い方についても触れられているので、実践的なデバッグスキルも一緒に身につけることができます。

## 2. 超TypeScript 完全ガイド

https://www.udemy.com/course/typescript-complete

### どのような人におすすめしたいのか
* TypeScriptをとにかく幅広く学びたい人
* 実践を通してTypeScriptを学びたい人

実践の講座では、ReactやVueなどのフレームワークは使われていないため、成果物のコードが現場でよく見るコードに近いかというと少し疑問です。
ただし、学べる知識は現場でも活かせるものなので、十分に挑戦する価値はあると思います！

### なぜこの講座をおすすめしたいのか
#### ほとんどの現場でTypeScriptが使われている
最近のIT系の会社では、TypeScriptが当たり前のように使われています。
しかし、ReactやVueの講座でTypeScriptを扱うことは少なく、むしろ発展的な内容として触れられることが多いです。

そのため、フレームワークやライブラリを学ぶ前に、TypeScriptをしっかり学んでおくと良いと思います。

#### 網羅的にTypeScriptを学べる
TypeScriptの書き方を学ぶだけでなく、コンパイラの設定方法や、JavaScriptライブラリをTypeScriptで使う方法まで幅広くカバーされています。そのため、実際に役立つ知識がしっかり詰め込まれています。

(コンパイラの設定の話に1時間以上費やす講座は、Udemyではなかなか見かけません。貴重です!)

さらに、ボーナスセッションではReactでTypeScriptを使う方法も紹介されており、Reactを使っている現場でもすぐに活かせる内容になっています。

## さいごに

どちらの講座もボリューム満点ですが、この2つの講座で得た知識は今でも役立っていると感じています。
ぜひ購入を検討してみてください！(Udemyではセール時に購入するのがおすすめです。)

学習方法は人それぞれですが、個人的にはUdemyのような動画講座で学び始め、
その後に本やドキュメントを読んだり、実際に開発をして理解を深める方法が好きです。
もしよければ、この学習の進め方も参考にしてみてください。
【初心者の覚書】ニューラルネットワークとは

CPUについてわからず調べていたところ、「TPU」に遭遇し、TPUのTにあたる「テンソル(≒多次元データ)」、「NPU」とその関係性、NPUのNにあたる「neural」、「neural network」など自分にとって未知な事柄にぶつかり合った。
今回、TPUを理解するために必要な「ニューラルネットワーク」について調べたことを書き記したい。
きびだんご持っていくのを忘れた世界線の桃太郎はこんな感じなんだろうなと感じた。

# ニューラルネットワークとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/e2859690-f15f-33d3-a437-c124b86cab24.png)
画像参照：[「ニューラルネットワーク」、zero2one](https://zero2one.jp/ai-word/neural-network/)

ニューラルネットワークとは、"人間の脳内の神経細胞同士の繋がりを繋がりを再現した数理モデル"のこと。

「ニューラル」という字のごとく、人間の神経細胞(脳)にヒントを得たアルゴリズムの一種とのこと。

> ニューラルネットワークは、ニューロンと呼ばれる相互接続されたノードで構成される。
各ノードとの学習プロセスにより予測とパターン認識が可能となり、画像認識、自然言語処理、機械翻訳などのさまざまな応用分野で幅広く採用されています。
[「ニューラル ネットワークとは」、GoogleCloud](https://cloud.google.com/discover/what-is-a-neural-network?hl=ja)


## ニューラルとは
Neural networkの"neural"とは、"neuron"の形容詞形で、「神経(系)の」と言う意味を持つ。(参照：[neuralとは 意味・読み方・使い方](https://ejje.weblio.jp/content/neural)）


## シナプスとは

神経系といえば、シナプス。
あれ？シナプスって触手の部分だっけ？根っこの部分だっけ？とわからなくなったので記録。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/4b3dce6c-9a35-1098-b024-d575b011973a.png)
画像：[Synapses and Neurotransmission](https://www.lecturio.com/concepts/synapses-and-neurotransmission/)

シナプスはヒゲ根のような部分。一つではなくて複数。

## 機械学習・ニューラルネットワーク・ディープラーニング?

ここまでで、「ニューラルネットワーク」とは、人間の脳を数理化した学習アルゴリズム的な存在であるとはわかった。
しかし、この「ニューラルネットワーク」がどこを目指しているのか、どこに位置づけられるのか調べて、震撼した。
これはAIにおける機械学習、ディープラーニングと密接に関わっていたのだ。

下記の図をお借りした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/594b8eaa-02e4-a394-aad7-881215a7ee74.png)
[「機械学習とニューラルネットワークの違いをわかりやすく解説！」、AInow](https://ainow.ai/2022/06/09/265777/#i-17)


# まとめ

CPUについて調べていたはずなのに、AIの機械学習に着地するとは思いもしなかった。
また、今回は概要だけにしか触れていないのだが、「ニューラルネットワーク」は脳を模している通り脳に前頭前野、右脳、左脳などの役割があるように、ニューラルネットワークが指し示すネットワークも一つではないことがわかった。
下記に借用した画像の表にある通り、「ニューラルネットワーク」には複数のカテゴリ？分類があり、「CNN」「RNN」「ANN」などがある。
そこを紐解いていくことも、「NPU」「TPU」を理解する一助になるのだと感じた。

しかし、ざっとした見解としては「ニューラルネットワーク」と言う脳を模した宇宙が存在しているということだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2867756/78d48cbc-f95b-fe42-3046-283a2e845c94.png)
画像参照：[「ANN vs CNN vs RNN: Neural Networks Guide」、LEVITY](https://levity.ai/blog/neural-networks-cnn-ann-rnn)

# 参考にした記事

https://aismiley.co.jp/ai_news/neural-network/

https://zero2one.jp/ai-word/neural-network/

https://ainow.ai/2022/06/09/265777/#i-3

https://cloud.google.com/discover/what-is-a-neural-network?hl=ja

https://levity.ai/blog/neural-networks-cnn-ann-rnn
UbuntuにVisual Studio Codeをインストールする方法【2024年12月時点】

# 概要
Ubuntu PCにVSCodeをインストールしたので、インストール方法を備忘録として投稿します。
# 目次
- [実行環境](#実行環境)
- Ubuntu 22.04
- [環境構築](#環境構築)
1\. パッケージのインストール
```bash
sudo apt update
sudo apt install software-properties-common apt-transport-https wget
```
2\. Microsoft の GPG キーを追加
GPGの役割は、ダウンロードするパッケージが正規に提供されているか信頼性を確認するために実行します。
```bash
wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -

```
3\. リポジトリを追加
レポジトリの役割は、パッケージの提供元を登録します。
```bash
sudo add-apt-repository "deb [arch=amd64] https://packages.microsoft.com/repos/code stable main"
```
4\. VSCodeのインストール
```bash
sudo apt update
sudo apt install code
```
5\. VSCodeの起動
```bash
code
```
- [おわりに](#おわりに)
- 無事にUbuntu PC上にインストールできました。
【イベント開催レポート】『2024年を振り返ろう！若手エンジニアのための交流LTナイト』に参加・登壇しました


# はじめに
2024/12/04に開催された『2024年を振り返ろう！若手エンジニアのための交流LTナイト』というイベントに参加してきましたので、そちらの参加レポートを書きます！

![event.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614347/7ceae612-cde3-638c-9e56-566137662812.jpeg)

↓イベントURLはこちら
https://buysell-technologies.connpass.com/event/335378/

# 概要
こちらのイベントは、主に新卒1~3年目のエンジニアを対象として、1年の振り返りをお話しする会でした。
10名のエンジニアの方が登壇をし、その後交流会をするといった形式でした。

一般登壇者も募集していたので、私もせっかくなので発表してみようと思い応募したところ、なんと登壇できることになりました。

個人的にも参加して良かったな〜と思った点がいくつもあり、振り返ろうと思います。

当日のイベントの実況中継は、以下のハッシュタグでXにてコメントがたくさん載っているので、良かったら検索してみてください！
[#若手エンジニア交流LT](https://x.com/search?q=%23%E8%8B%A5%E6%89%8B%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E4%BA%A4%E6%B5%81LT&src=typed_query&f=top)

# 会場
まず、会場が、BuySell Technologiesさん本社でしたが、そこは私の古巣でもありました。新卒で入社し、内定者インターンの頃からおよそ2年ほどお世話になっていました。
会場に着くや否や、「お久しぶり！」と色々な方と挨拶することができ、転職後も良い関係でいられることに感謝です！

ちなみに、以前バイセルで同じチームだった24卒の方が当日司会進行していました。当時私がメンターとしてオンボーディングを担当していたので、「成長したな〜」と勝手に嬉しくなっていました！

私も1年前、バイセルの会場でゆめみさんと合同で若手イベントを主催してことがあったので、1年越しの機会になんだか懐かしい感情になりました。

その際のイベントレポートはこちらです！
https://tech.buysell-technologies.com/entry/2024/02/22/170000

# 登壇

今回のイベントでは、10名のエンジニアの方がそれぞれ5分の発表をしました。色々な角度からの発表がありましたが、主にWeb系の若手ならではの話が多く、たくさん共感することができました。
例えば、AIとどのように向き合うか？であったり、うまく質問するにはどうするか？のような話が出ていました。

私も、登壇させてもらえることになったので、1ヶ月ほど前からスライドを少しずつ作っていました。
私も今年のトピックとしては、転職活動だったので、それにまつわる話を発表してきました。
内容としては、新しい現場で早くキャッチアップするために、事前学習と分報を工夫して取り入れてみた振り返りになります。

登壇スライドはこちらになります。
<script async class="speakerdeck-embed" data-id="b879a88a070f472e9b07759c5221c8eb" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

# 交流会
登壇の時間が終わったらしばらく会場で交流会の時間がありました。
以前の同僚と近況について話したり、具体的な技術のトピックについて話したり、それぞれの会社の事業について様々にお話しすることができました。

もう一つ良い出会いがあったな〜と思う出来事もありました。
私は今「らくしふ」というシフト管理サービスを開発しているのですが、なんとそのユーザーさんと偶然遭遇したのです！
その方は、現在学生で長期インターンでエンジニアをされていて、別の場所でもバイトをしておりそこで利用しているそうです。
スマホで実際に利用しているところの画面を見せたいただき、利用してみてどうだったか？についてお話しすることができました。
SaaSを作っていると、偶然エンドユーザーの方とも出会うことがあるんだなと思ったのと、実際に開発しているプロダクトが使ってもらえているんだなとも思い、
とてもやりがいを感じる瞬間でした。

# まとめ
若手対象のイベントで、同世代の方々とお話しすることができ、とても楽しい時間でした。
個人的にも、古巣に久しぶりに伺うことができ、懐かしい感情になりました。

振り返りついで登壇することができ、貴重な機会になりました。登壇できる場って意外と少ないんですよね。実は、これが初めての外部登壇でした。
また、今開発しているSaaSのエンドユーザーの方と偶然出会うことができたのも、とても嬉しい瞬間でした。

引き続き、様々な出会いや機会を大事に、今後も活動していきたいと思います！
Qiitaのアドベントカレンダーは読者離れが起きている

アドベントカレンダーは書けば読まれるか

## アドベントカレンダーの年次推移が知りたい
アドベントカレンダーはクリスマスまでのカウントダウンを楽しむためのカレンダーで、通常12月1日~25日までの窓に日数分のお菓子などが入っています。

技術記事のアドベントカレンダーはこれにならったイベントで同様にクリスマスまで毎日技術記事を投稿/閲覧することで楽しむお祭りです。

Qiitaにおいても2011年からアドベントカレンダーが開催されていますが一方で最近は読者離れが起きているという話も聞きました。雰囲気でなくデータで知りたかったので推移を可視化してみます。

## メインの系列の購読者数を人力で集計
Qiitaのアドベントカレンダーは各年ごとに `https://qiita.com/advent-calendar/<西暦>` のページが存在します。

[APIドキュメント](https://qiita.com/api/v2/docs)もあるようですが、**アドベントカレンダー特化のAPIはなさそうなので人力で集計します**。

リストページから辿れるのは最も古いもので2011年ですが2011年時点ではProgramming Langs、Web Technologiesといった大分類はないようですね。導入は2015年からでしょうか。

購読機能も2011年時点ではなく2015年から登場。アドベントカレンダーに投稿した人ならわかると思うのですが投稿するとデフォルトで購読するようになっています。

2020年までは特定のトピック例えばGoについてアドベントカレンダーが埋まってしまうとGo 2、Go 3、Go 4と別のアドベントカレンダーを作っていました。2021年から同じGoの中にSeries 1、Series 2と系列を作れるようになっています。

この辺りの形式の年次変化をどう統一した視点で見るのかは難しいところですが、系列が導入される年度まで**該当トピックに興味はある人は一番最初のカレンダーには最低でも購読すると仮定**することにします。

後から別系列の独立したカレンダーができた時は気付きづらいので該当トピックのカレンダー全部ウォッチしたい人もゆるーく購読した人も系列1つ目相当のアドベントカレンダーは購読しているだろうと仮定します。購読者数ベースになるので2015年から集計。

## 2020年からアドベントカレンダーの購読者数は減少傾向
割合購読者数の多いプログラミング言語のアドベントカレンダーが年次推移を見るにはよさそうなのでいくつかピックアップしてデータをとってみます。2015年からの推移を見たいのでその時点でなかった言語は最低でも対象外。

以下が結果です。言語別と単純に合計したもので出力しています。

![2024-12-06_advent_calendar_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/56b8de86-3581-1ea6-712b-729992834178.png)

![2024-12-06_advent_calendar_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103496/d027a163-9965-2b73-6217-846896d3b146.png)

言語別だとTypeScriptが2018年に急に人気が出たり、Rustの人気が近年上がっている点、(おそらくAIブーム由来で)Pythonが比較的安定して人気なことがわかります。

全体的な傾向として2020年から購読者数が年々減ってきているようです。

Qiita自体の人気の推移をアドベントカレンダー特有の要素から除外できてはいないんですが、少なくとも組み合わせとして **Qiitaのアドベントカレンダーは読者離れが起きている** は事実であるとは言えそうです。

## アドベントカレンダーが衰退した理由
アドベントカレンダーが衰退した理由について考察してみたいと思います。例えばですが

* コロナ禍でのコンテンツの飽和
* Zennなどの競合の登場
* 技術系YouTuber(TikToker)、ポッドキャストの台頭
* 企業アドベントカレンダーの増加によるエンゲージメントの低下

などがあげられると思います。

2020年から如実に購読者数が減っていますが、2020年はちょうどコロナが大きく報道された年で、感染拡大防止の観点から**リモートワークが普段し外に出ない状況だとネットで情報を見る機会が増え、アドベントカレンダーでの情報の新規性が減った**ようにも思います。

またZennがリリースされた年でもあり、個人ブログを持たない人にとって書く場所がQiitaとZennで二分化したのもあるかもしれないですね。

おうち時間が増えた関係で普通の人もYouTuberはじめる人が増えました。技術系YouTuber、TikTokerも増え単なる技術記事はリッチメディアに比べると理解しやすさで負けた部分はあるかもしれません。

採用広報で企業でアドベントカレンダーをやる企業も増えたので、そっちで書いてしまうと特定トピックのカレンダーには趣味では書かないという人もいるかもしれないですね。

## アドベントカレンダーを復興するには
**アドベントカレンダーを復興するにはを論じたいところですが、そもそも戦わないは一つの作戦**かもしれません。

実際、QiitaでもQiita Engineer Festaと称し夏にも投稿イベントをやっていますし、企業技術ブログでもアドベントカレンダーやるのやめました、12月は情報が飽和して読んでもらえないので別の時期に連続投稿しているというパターンも見ます。そういう意味でスプリング、サマー、オータムごとにカレンダーあってもいいかもしれない。

スポンサー付きの景品付きアドベントカレンダーは一つの呼び子ですが、万能ではないです。

また、もしかすると系列機能は一見独自運用部分を公式化したのでよい改修にも見えますが、読み手側の心情としては読み疲れを起こしてしまっているかもしれないですね。

特定のトピックの記事全て吸収してやるというバーサーカーみたいな人もいるにはいるかもしれないですが、**1日1個くらいが読み物として適量という人もいるかもしれない**。そういう意味でA/Bテストしたわけではないですが、系列限定の購読機能とかあってもいいかもしれません。
適当に作るロボコン用マイコンボード

# もくじ

1.[はじめに](#はじめに)
2.[要件定義](#要件定義)
3.[使うもの](#使うもの)
4.[完成](#完成)

# はじめに
当記事はロボコンで使える?かもしれない感じのマイコンボードの作り方を適当に書きなぐる記事です。
ちょうど全ロボ用に名刺基盤を作ろうとしていたので名刺基盤かつ汎用インジケータ基盤として使えるボードを作っていきたいと思います。
 <br>
 当記事は高専ロボコン Advent Calendar 2024の8日目担当です！
 
 https://adventar.org/calendars/10303
 
# 要件定義
さっそく要件定義をしていきます。
名刺基盤のついでといえど、まあまあ使えるインジケータ用ボードにしたいです。
既にオフシーズンなのでできれば新しい部品を使わず既存部品、またはROHM様に提供してもらった部品を使いたいです。
というわけで以下の用に定義しました
### インターフェース
・CAN...ロボット内部での通信用。CANから信号を受け取った値をインジケートする。
・USB-TypeC...PCに繋いでVCPとして使用する。
・SWD...STMマイコンの書き込み用として使用する。
### 表示系
・7セグLED...数字がデカく見えると便利なのでつける
・RGBLED...ピカピカ光るとかっこいいし色に意味をもたせると使いやすい説があるのでつける。
・SSD1306のディスプレイ...I2Cで動くディスプレイ。かっこいいのでつける

以上を要件として頑張って設計します。

# 使うもの
CAN、I2C、VCP、SWD、GPIO大量...を扱うのでできるだけ強くて大きいマイコンがほしい感じです。
部室に余っているので「STM32F405RG6」を使います。
CANトランシーバにはROHM様に提供していただいた「BD41041FJ-C」
RGBLEDはROHM様に提供していただいた「SMLVN6RGB1U1」
7セグLEDはROHM様に提供していただいた「LB-603VP」
を使用します。
CAN、電源、SWDはいい感じにXHコネクタを使います。
ROHM様本当に毎年ありがとうございます🙇🙇🙇
USB-TypeCは秋月の商品名で「USB Type-Cコネクター 基板用」として発売されているもの使用します。
使うものは決まったのであとは設計するだけです。
※部品のパッケージ、ピン番号だけは絶対に間違えないように頑張る
※各部品の使い方はデータシート読んで頑張って頑張る

# 完成

できた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052827/5c9b3665-9287-0950-51e4-bc812cfcba4d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052827/21e713f7-b2b8-26f3-f787-031d53156128.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052827/361252cf-326b-8d3f-5833-42eff6ee9a3f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052827/95d95be4-9f53-70f1-1fd5-9dd0ce600399.png)

ガーバーはKiCadのプラグインのJLCPCB用のものを使って出しました。
製造依頼していまは到着待ちですwktk

というわけでマイコンボードを作る一連の流れでした
【TIPS】Kino.Text で等幅フォント（文字が同じ幅になるフォント）を使う

## はじめに

[Advent of Code](https://adventofcode.com/) のパズルを解いているとき、よく出てくるのが以下のような文字列による地図です

```text
......
.#..#.
..XX..
.#..#.
......
```

Elixir でこれを普通に文字列として読み込んで Livebook に表示すると、以下のようになります

```elixir
"......\n.#..#.\n..XX..\n.#..#.\n......\n"
```

これでは人間が地図として認識するのが難しいです

どうにかできないものでしょうか

使用例のノートブックはこちら

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

## 通常の Kino.Text による表示

`Kino.Text` を使って文字列を表示すると、以下のような表示になります

![スクリーンショット 2024-12-08 23.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/4e19c666-7766-73c9-4e27-1711838c19d6.png)

改行はされましたが、文字の幅が統一されていないため、列が崩れて表示されてしまいます

## `terminal: true` による等幅フォント表示

`Kino.Text` の第 2 引数に `terminal: true` を渡すと、以下のように表示されます

![スクリーンショット 2024-12-08 23.12.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/514427a7-6640-5ba3-c760-c0e8ead93a97.png)

ブラウザの開発者モードで出力箇所を見てみると、エディター内と同じ、以下のクラスが適用されていることが分かります

```css
.font-editor {
    font-family: JetBrains Mono, Droid Sans Mono, "monospace";
    font-variant-ligatures: none;
    font-size: 14px;
}
```

この `Mono` や `monospace` は[等幅フォント](https://ja.wikipedia.org/wiki/%E7%AD%89%E5%B9%85%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88)（とうはばフォント）を表しており、これによって文字の幅が揃えられています

痒いところに手が届く機能ですね

## まとめ

やはり Livebook は何にでも応えてくれますね

いざとなれば機能を追加すればよいし、、、
[TypeScript] Unionから消したいタイプだけ消せるExcludeについて

Unionを使うとNumberやStringみたいに型全体でなくても、特定の文字列などの集合で型を作れて便利ですよね。

例えば以下のようなケースがあります。Number型ではなく、ステータスコードだけのための型を作ることができます。

``` ts
type HttpStatus = 200 | 201 | 400 | 401 | 403 | 404 | 500;
```

しかし、このような時に特定のコードだけを受け付ける型がほしい場合、以下のように定義する必要が出てきます。

``` ts
type SuccessStatus = 200 | 201;
```

もちろん以下のように最初から分けて定義をしていたら良いのですが、仕事をする中でなるべく多くの影響範囲は作りたくないものです。
``` ts
type SuccessStatus = 200 | 201;
type ClientStatus = 400 | 401 | 403 | 404;
type ServerStatus = 500;
type HttpStatus = SuccessStatus | ClientStatus | ServerStatus;
```

## Exclude
そんな時に使えるユーティリティ型がExcludeです。

https://www.typescriptlang.org/docs/handbook/utility-types.html

以下のような書き方で書くことができます。

``` ts
type HttpStatus = 200 | 201 | 400 | 401 | 403 | 404 | 500;

type SuccessStatus = Exclude<HttpStatus, 400 | 401 | 403 | 404 | 500>;
// 200 | 201

function handleSuccess(status: SuccessStatus) {
  // 200か201のケースのみを処理
}
```

## ソースコード
TypeScriptのソースコードを見てみるとExcludeはこのようなロジックで構成されています。
`extends`を用いての実装なんですね
``` ts
/**
 * Exclude from T those types that are assignable to U
 */
type Exclude<T, U> = T extends U ? never : T;
```

https://github.com/microsoft/TypeScript/blob/421f5c5458d09dad601604e6eff8765283aef14e/src/lib/es5.d.ts#L1592-L1595
【Figma Plugins】Figma PluginsでAnnotationの取得・作成を行う

## はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390720/9727d20c-68b0-7b2b-8078-0283f5b57e69.png)
FigmaのPluginを開発する際、Figma PluginsでAnnotationを取得・作成したいと思ったことはありますか？
この記事では、Figma PluginsでAnnotationの取得・作成する方法を解説します。


Annotationを作成を作成するには、`annotations` を利用することで、Annotationが作成されます。

https://www.figma.com/plugin-docs/api/Annotation/

```ts
interface Annotation {
  readonly label?: string
  readonly labelMarkdown?: string
  readonly properties?: ReadonlyArray<AnnotationProperty>
}
```

+ **label**：プレーン テキスト
+ **labelMarkdown**：markdownテキスト
+ **properties**：プロパティ
    + サポートされているプロパティはこちらを参考にしてください
    + [参考：AnnotationProperty](https://www.figma.com/plugin-docs/api/AnnotationProperty/)

## Annotationを取得する
### ① Annotationを作成する選択したフレームを取得する
選択したフレームの最初のノードを取得します。

```ts
const node = figma.currentPage.selection[0];
```

### ② Annotationを取得する

```ts
const node = figma.currentPage.selection[0];

// labelを取得する
const label = node.annotation.label
console.label(label) //出力: Main product navigation

// labelMarkdownを取得する
const labelMarkdown = node.annotation.labelMarkdown
console.label(labelMarkdown) //出力: ## Main product navigation

// propertiesを取得する
const properties = node.annotation.properties
console.label(properties) //出力: [0: {type: 'fills'}, 1: {type: 'width'}]

```


## Annotationを作成する
### ① Annotationを作成する選択したフレームを取得する
選択したフレームの最初のノードを取得します。

```ts
const node = figma.currentPage.selection[0];
```

### ② Annotationを作成する
```ts
const node = figma.currentPage.selection[0];
node.annotation = [{
  label: 'annotation label',
  labelMarkdown: '# annotation markdown label',
  properties: [
    {type: 'fills'},
    {type: 'width'}
  ]
}]
```

## まとめ
この記事では、Figma PluginsでAnnotationの取得・作成する方法を解説しました。
この記事を参考にFigma PluginsでAnnotationの取得・作成してみてください！

---

最後まで読んでくださってありがとうございます！

普段はデザインやフロントエンドを中心にQiitaで記事を投稿しているので、ぜひQiitaのフォローとX(Twitter)のフォローをお願いします。

https://twitter.com/degudegu2510
【Python】エラーの種類の確認方法

## 概要
- Pythonにおける`try-except`・`raise`・`assert`の学習の際、左記3つの文を記載するには「エラーの種類」も併せて記載することが多いですが、「実際にどのようなエラーがあるか」が全く分かりませんでした。
- とりあえず「どのようなエラーがあるかの確認方法」をChatGPTに聞いたので、そちらの内容をまとめたものをメモとして記載します。
- Pythonの理解が深まったら、適宜修正・追記する予定です🙏

## エラーの種類の確認方法

### 例外クラスを一覧で確認する方法
**Pythonドキュメントを参照**
- Python公式ドキュメントには、組み込み例外の一覧が掲載されています。
- [組み込み例外のドキュメント (Python 公式)](https://docs.python.org/ja/3/library/exceptions.html)

**組み込みの例外クラスを動的に取得**
- 実行中のPython環境で、例外クラスを一覧として取得することができます。
```python
import builtins

# 組み込み例外だけをリストアップ
exceptions = [obj for obj in dir(builtins) if isinstance(getattr(builtins, obj), type) and issubclass(getattr(builtins, obj), BaseException)]
print(exceptions)
```
```python
## 出力例
['ArithmeticError', 'AssertionError', 'AttributeError', 'EOFError', 'Exception', 'FileNotFoundError', 'ImportError', 'IndexError', 'KeyError', 'KeyboardInterrupt', 'MemoryError', 'NameError', 'NotImplementedError', 'OSError', 'OverflowError', 'RuntimeError', 'StopIteration', 'SyntaxError', 'TypeError', 'ValueError', 'ZeroDivisionError']
```

**エラーの階層構造を確認**

- 例外クラスには階層があります。すべての例外は`BaseException`クラスを基底クラスとして継承しています。
- 以下コマンドにより、例外の階層や詳細な説明が出力されます。

```python
help("exceptions")
```

---

### 手軽にエラーの種類を把握する方法

**開発中にエラーを試してみる**
- エラーが発生した場合、その例外クラスがメッセージに表示されます。
- 例えば、以下のように試すとどのエラーが発生するか確認できます。

```python
try:
    x = 1 / 0  # ZeroDivisionError
except Exception as e:
    print(f"例外の種類: {type(e).__name__}")  # 'ZeroDivisionError'
```

**IDEの補助機能を活用** 
- `PyCharm`や`VS Code`などのIDEを使うと、`except`を入力したときに候補としてよく使われる例外が表示されることがあります。

**よく使われる例外の理解** 
- 以下は、よく使われる例外のリストです

```
ValueError: 不正な値が渡された場合
TypeError: 型が間違っている場合
ZeroDivisionError: ゼロ除算が発生した場合
IndexError: リストやタプルの範囲外のインデックスをアクセス
KeyError: 辞書に存在しないキーをアクセス
FileNotFoundError: ファイルが存在しない場合
ImportError: モジュールが見つからない場合
```

---

### エラー候補をプログラムで一覧表示
- 以下のコードで、組み込み例外の名前と説明をリスト化して確認できます。

```python
import builtins

# エラー名と説明を表示
for name in dir(builtins):
    obj = getattr(builtins, name)
    if isinstance(obj, type) and issubclass(obj, BaseException):
        print(f"{name}: {obj.__doc__}")
```

---

### 自動補完を活用する方法
**例外を知らない場合**
- 最初は`except Exception:`のように、汎用的な`Exception`で捕捉しておき、実行時に実際に発生するエラーを確認する。

**デバッグ後に特定の例外に変更**
- 捕捉されたエラーを調べて、`except ZeroDivisionError:`や`except FileNotFoundError:`のように特化していく。
ドローンを飛ばして能登半島の地学調査にチャレンジ

## 行ったこと
24.‎ ‎11/29 ~ 12/1にかけて石川の能登半島の支援活動を行った。 <! 空白文字あり>
12/1に地学調査を行い、人足で調査しにくいような岩場をドローンで調査した。



## 場所

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954871/4d681d62-c9ec-6c2b-2f1e-1c2e5c2dd3f6.png)

石川県輪島市門前町七浦地区の海岸一帯のうち、皆月湾から岬を一つ越えた外浦海岸で調査を行った。
この周辺は 2024/01/01 の震災時に最も隆起した場所となり、著しく海岸線が変化した。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954871/18cde77d-7509-c955-be69-ced739a5d7cf.png)




## 目的

海岸沿いを撮影し、構成している地質を推測すること。
徒歩で侵入できた場所が、北東側が砂岩、南西側が泥岩に切り替わっているところであった。南西側の先を撮影し、どこまで泥岩で構成されているかを推測する。




## 使用したドローン

HolystoneのHS155を使用して調査をした。

これを用いた理由は、

- 100g未満のトイドローンだから、基本的に飛行許可などが不要なこと
- 持ち運びに優れているため、徒歩による緊急展開機材として利用可能なこと
- GPS、ジャイロ搭載なので、屋外でも安心だから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954871/988a80c4-aba3-7be7-2c1a-4592d2a54a7b.png)




## 12/1の天候

アメダスによる15:00 ~ 17:00の輪島の天候
天気 - 曇り
気温 - 10℃前後
降水量 - 0.0mm
風向 - 北北東
風速 - 3~4m/s




## 成果

 北東側
 ![20241201162447 - frame at 1m39s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954871/e7009135-4501-41c3-b915-76ff043f3c28.jpeg)


南西側の撮影は失敗


しかし、赤線を境に、左側に泥岩、右側に砂岩と分かれているのが少しだけ映っている
![25.3.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954871/787d5f1b-970c-49d8-9f7f-5ac32d00ab09.png)


左の泥岩は黒く、右の砂岩(裏側)は少し明るい色をしている
![IMG_20250316_002249930_PORTRAIT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954871/be96264e-9deb-43a1-a9ec-2acb40611160.jpeg)


砂岩の表側は白いものが付着しており、それは隆起した際に岩が陸上に露出し、その岩にくっついていた藻や微生物が白いものの正体。
![IMG_20250316_002304255_PORTRAIT.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3954871/9b425d67-eeff-4baa-a92c-a7baaaee886e.jpeg)



### 評価

今回のドローン撮影は以下のことから失敗。

1. 飛行時の撮影に失敗していた。途中で途切れていて短時間の動画しか録画できていなかった
2. 離陸させてすぐは、前後左右にはしっかり動いたが、ある程度の位置から前進しなくなった




## 失敗した原因をたしかめる
25.‎ ‎3/15に、川の上で飛行させ、原因をたしかめた。 <! 空白文字あり>

1. は、3/15撮影した動画は、スマホに送信されたファイルは途切れていたが、ドローンに装着するTFカード内のファイルはうまく撮影できていたので、
12/1の動画はおそらくTFカード内のファイルを見落としたと思っていたが、TFカード内は確認したと父が言っているので、ちょっとわかんない
‎<! 空白文字あり>
2. は、初心者モードを解除したつもりができておらず、思い込んでいたと推測。
(HS155の操縦は、初心者モードがデフォルトで有効になっており、30mまでしか飛ばせない。解除したら150mまで飛ばすことができる。)




## これから
このドローンは、なにかあった際の緊急展開用に使ったり、このような地学調査に活用することが多くなると思うので、これからもドローンの練習などを頑張りたい。
"伝える"と"伝わる"

こんにちわ、@takz2001 です。
この記事は[ARIアドベントカレンダー](https://qiita.com/advent-calendar/2024/ari-group)の９日目の記事です。

少し前に会社の上長とコミュニケーションの取り方の難しさについて話すことがあり、その時に"伝える"と"伝わる"は違うという話になりました。
たしかにその通りで気をつけねばと思いました。

そんなことをぼんやりと覚えていたところ、先日サッカー番組のFOOT×BRAINで"伝わる技術"という企画をやってました。

番組には"バナナの魅力を100文字で伝えてください"の著者 柿内尚文さんと元日本代表の槙野智章さん(神奈川県社会人リーグの品川CC横浜の監督)が出演。
槙野監督のチームを指導方法をお手本に紹介されていました。
出てきたキーワードを以下に記載します。

「伝える」ではなく「伝わる」が大切
伝える→自分ベース
伝わる→相手ベース

伝わる技術の７つの要素
１．ゴール設定　⇒　何のために
２．納得感　⇒　理解する、腑に落ちる
３．相手ベース　⇒　相手の納得感を得る
４．見える化　⇒　相手の頭の中に見える化
５．聞く力　⇒　お返し、お礼の法則
６．親近感　⇒　相手に話を聞いてみようと思わせる
７．信頼感　⇒　この人が言うなら信頼できる

ベンチ外になった選手への声掛け
→相手ベースに立って何故ベンチ外になったかを伝える
　タイミングも大事で、すぐに伝えることが大事

選手に対する問いかけ
　→５の聞く力、お礼の法則「相手が話を聞いてくれたから自分も聞こう」
 
 試合中にミスした選手に対して
 →トラップをミスりカウンターでゴールを奪われた
 　「それをするな、だから言っただろう」は信頼感が無い／関係性ができていない場合は禁句
  試合後のフォロー、「鉄は熱いうちにうて」、失敗した直後に

比較の法則
→良いことだけ言っても伝わらないが、悪いことを言って良いことを言うと伝わりやすい
　どこが問題ないのポイントが明確になる
  
数字の法則（数字を具体的に使う）
→具体的に目標など数字で示すことで伝わり易くなる（間をとれ　or 2～3ｍ距離をとれ）
　７つの要素のうち納得感、見える化に当てはまる
→本のタイトルによく見れる「７つの法則」など
実験班紹介

# 挨拶
初めまして！実験班の班長です。
Physics Lab. の班紹介の最後を務めさせていただきます。

# 実験班とは
東京大学理学部物理学科の学部生が参加するPhysics Lab. では毎年五月祭でポスター発表や講演などをしていますが、その中のメインイベントといえばやはり演示実験かと思います。年によっていろいろな実験をしていて、コッククロフト・ウォルトン型加速器やレーザー冷却など様々な実験がされてきました。
物理学科の学生が五月祭で実験をするというのは実はかなり昔から行われています。「物理の道しるべ」という本でたまたま見つけたのですが、1965年に東京大学を卒業された藤川和男先生は3年生と4年生の時の五月祭でメスバウアー効果の実験とチューリング計算機の模擬運転をされたそうです。また、1976年に東京大学を卒業された宮下精二先生は確率過程の問題の計算機シミュレーションをされたそうです。
ちなみにこの「物理の道しるべ」という本は物理学者になられた先生が学部や大学院、助手時代などをどのように過ごしたかなどを書いたのを集めたもので、面白いし、また自分の進路の参考にもなりうるので、おすすめです。
今年はまだ決定したわけではないですが、小さなサイクロトロンを製作したり、超流動の実験をしたりなど様々なアイディアが出ていて、実現を目指して準備を進めています。

# 実験の楽しさについて
(ここからは私個人の意見になります)
皆さんは物理学実験と聞いてどのようなイメージを持つでしょうか。
これを読んでいる人で、東大の前期課程にいる人もいるかと思います。前期課程でも理系の人は物理学実験の授業をとる人が多いかと思います。
私の個人的な感想ですが、前期の物理実験はそれほど楽しいものではなかったと記憶しています。それは内容も基本的なもので、また、授業内容も与えられた実験課題をこなして考察を書くだけで特に実験を工夫するとかそういうことがなかったからだと思います。
これを読んでいる前期課程の人も現にそのような感想を持っているかもしれません。また、東大の前期課程の学生でなくても、実験というとそれほど面白さを感じられないという人も多いかもしれません。
しかし、私が声を大にしていいたいのは、実験というのは本来はもっと楽しいものだということです。私もまだ研究をしているわけではない、ただの学部三年生なので、実験研究の楽しさを知っているわけではありません。
ただ、今年の夏休みにKEK(高エネルギー加速器研究機構)の主催している「サマーチャレンジ」に参加したり、物理学科3年Aセメスターに行われる「物理学ゼミナール」の授業で素粒子実験に関連する論文の輪読をしたりするなかで、実験というのは自分で主体的に考えて行えば非常に楽しいということを感じました。
「サマーチャレンジ」では比例計数管を自作して宇宙線の角度分布を調べるという実験をしました。この実験自体は「あるある」の実験で原理を自分で考え出す必要があるわけでわないですが、実際にどのようなセッティングで実験を行えばよいか、どうすればノイズを減らせるか、どうすれば今ある実験装置でもっと面白い実験ができるかなどを考えて実験するのはとても楽しいと感じました。
「物理学ゼミナール」での素粒子実験に関連する論文の輪読では、よくこんな実験を思いつくなーと思うような、工夫された実験をたくさん知り、自分で新しい実験を考えて実験できればとても楽しいだろうなということを感じました。
この２つの経験で感じたことは、実験というのは自分の頭でいろいろと考えて行って初めて本当の楽しさを感じられるものだということです。逆に言えば、例えば東大の前期の実験で私が楽しさを感じられなかったのも当然だということです。実験は手順書を見てやっただけですし、どうやったらもっとよい他の実験ができるかなどを考えたわけでもなかったのですから。
ですから、皆さんが学生実験などで実験を面白く感じることができなくても、自分の頭で考えて実験をすればもっと楽しいかもしれません。その楽しさに気づく人がもっと多くなればと思います。


# 結びに
今年の五月祭の内容は現時点ではまだ固まっていないことも多いですが、きっと一般の方から高校生、大学生まで、皆さんが楽しめる内容になると思います。
内容が決まり次第Xなどで広報を行うと思いますので、チェックして、五月祭に来られた際にはぜひPhysics Lab. を、そして実験を楽しんでください！
【競技プログラミング】AtCoder Beginner Contest 261_E問題

# 問題

https://atcoder.jp/contests/abc261/tasks/abc261_e

## 要約

1. 変数X：初期値Cで初期化される整数値

2. N種類の操作：
   - 操作1 (T_i = 1): X = X and A_i
   - 操作2 (T_i = 2): X = X or A_i
   - 操作3 (T_i = 3): X = X xor A_i

3. 実行手順：
   a) 操作1を実行し、結果を出力
   b) 操作1、2を順に実行し、結果を出力
   c) 操作1、2、3を順に実行し、結果を出力
   d) 最終的に、操作1から操作Nまでを順に実行し、結果を出力

4. 変数情報：
   - X: 操作対象の整数値
   - N: 操作の総数
   - T_i: i番目の操作の種類 (1, 2, または 3)
   - A_i: i番目の操作で使用される整数値
   - C: Xの初期値

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)


# アプローチ

ビット演算の性質を利用して、各ビットの状態を追跡する。
0と1の状態を別々に管理し、最終的な結果を合成する。


# 解法手順

1. 入力値Nと初期値Cを読み取り、変数Xを初期化する。

2. 0のビットマスク（zero）と1のビットマスク（one）を初期化する。
   - zeroは全ビット0で初期化
   - oneは全ビット1（~0）で初期化

3. N回のループを実行し、各操作を処理する。
   a. 操作の種類（T_i）と値（A_i）を読み取る。
   b. 操作の種類に応じてzeroとoneを更新する。
      - AND操作（T_i = 1）の場合：zero &= A_i, one &= A_i
      - OR操作（T_i = 2）の場合：zero |= A_i, one |= A_i
      - XOR操作（T_i = 3）の場合：zero ^= A_i, one ^= A_i
   c. 更新されたzeroとoneを使用してXの値を計算する。
      X = (one & X) | (zero & ~X)
   d. 現在のXの値を出力する。

4. ループが終了したら、最終的なXの値が得られる。


# ACコード
```python:ac.py

def io_func():
    # 入力値Nと初期値Cを読み取る
    n, c = map(int, input().split())
    return n, c

def solve(n, c):
    # 変数Xを初期化
    x = c

    # 0のビットマスク（zero）と1のビットマスク（one）を初期化
    zero = 0  # 全ビット0で初期化
    one = ~0  # 全ビット1（~0）で初期化

    # N回のループを実行し、各操作を処理
    for _ in range(n):
        # 操作の種類（T_i）と値（A_i）を読み取る
        t, a = map(int, input().split())

        # 操作の種類に応じてzeroとoneを更新
        if t == 1:  # AND操作
            zero &= a
            one &= a
        elif t == 2:  # OR操作
            zero |= a
            one |= a
        else:  # XOR操作
            zero ^= a
            one ^= a

        # 更新されたzeroとoneを使用してXの値を計算
        x = (one & x) | (zero & ~x)

        # 現在のXの値を出力
        print(x)

if __name__=="__main__":
    # メイン処理
    n, c = io_func()
    solve(n, c)

#############################################
# 変数の意味:
# n: 操作の回数
# c: 初期値
# x: 現在の値
# zero: 0のビットマスク
# one: 1のビットマスク
# t: 操作の種類
# a: 操作の値

# 1. io_func関数:
#    - 標準入力から操作回数nと初期値cを読み取る
#    - 読み取った値を返す
#
# 2. solve関数:
#    - 引数としてnとcを受け取る
#    - xをcで初期化
#    - zeroを0、oneを全ビット1で初期化
#    - n回のループを実行:
#      - 各操作のtとaを読み取る
#      - tに応じてzeroとoneを更新
#      - 新しいxの値を計算
#      - xの値を出力
#
# 3. メイン処理:
#    - io_func関数を呼び出してnとcを取得
#    - solve関数を呼び出して主な処理を実行


```
【AWS re:Invent】Amazon SageMakerが大幅アップデート！データレイクハウス基盤でAI開発を加速

誤りなどがありましたら随時修正していく予定です。

## この記事で伝えたいこと（ポイント）

次世代の Amazon SageMaker は、データ、分析、AI を統合したプラットフォームです。データレイクハウスを基盤とし、SageMaker Lakehouse、SageMaker Data and AI Governance などの新機能により、データサイエンティストやアナリストは単一の環境でデータ分析から AI アプリケーション構築まで、より効率的に作業を進められます。

次世代の Amazon SageMaker は、以下の主要な機能を備えています。

* **SageMaker Lakehouse**: データレイクとデータウェアハウスの境界を取り払い、単一のデータを複製や移動することなくデータ分析と AI/ML アプリケーションの構築を可能にするサービスです。
* **SageMaker Data and AI Governance**: Amazon DataZone を基盤として構築された Amazon SageMaker Catalog を含み、ユーザーがデータと AI ワークフローを安全に発見、管理、共同作業できるようにします。
* **統合されたスタジオ環境**: データエンジニアリング、アナリティクス、生成 AI を統合したスタジオ環境を提供し、データサイエンティストやアナリストは、データの所在を気にすることなく、単一の環境で作業を行うことができます。

## はじめに
Amazon SageMaker は、機械学習モデルの構築、トレーニング、デプロイを容易にするためのフルマネージドサービスとして広く利用されてきました。今回、AWS は Amazon SageMaker をさらに進化させ、データ、分析、AI を統合したプラットフォームとして生まれ変わらせました。この記事では、次世代の Amazon SageMaker の概要、新機能、ユースケース、そしてそれがもたらすメリットについて解説します。

## サービスの説明
次世代の Amazon SageMaker は、データレイクハウスを中心としたアーキテクチャを採用し、データエンジニアリング、アナリティクス、生成 AI を合理化されたスタジオに統合したプラットフォームです。これにより、データサイエンティストやアナリストは、データの所在を気にすることなく、単一の統合環境でデータへのアクセス、分析、AI モデルの構築、トレーニング、デプロイを行うことができます。

- [参考：Introducing the next generation of Amazon SageMaker: The center for all your data, analytics, and AI](https://aws.amazon.com/jp/blogs/aws/introducing-the-next-generation-of-amazon-sagemaker-the-center-for-all-your-data-analytics-and-ai/)


### SageMaker Lakehouse
SageMaker Lakehouse は、データレイクとデータウェアハウスの境界を取り払い、単一のデータを複製や移動することなくデータ分析と AI/ML アプリケーションの構築を可能にするサービスです。Apache Iceberg と互換性のあるツールやエンジンを使用してデータにアクセスし、クエリを実行することができます。

### SageMaker Data and AI Governance
SageMaker Data and AI Governance は、Amazon DataZone を基盤として構築された Amazon SageMaker Catalog を含み、ユーザーがデータと AI ワークフローを安全に発見、管理、共同作業できるようにします。

## どんな時に利用できるか
次世代の Amazon SageMaker は、以下のようなユースケースで特に効果を発揮します。


### 機械学習モデルの開発
データの準備からモデルのトレーニング、デプロイまで、機械学習モデル開発の全プロセスを統合環境で効率的に行うことができます。

### データ分析
データレイクハウスに統合されたデータに、様々なツールやエンジンを使ってアクセスし、分析することができます。

### 生成 AI の活用
生成 AI を活用したアプリケーション開発を、データ分析や機械学習のワークフローと統合して行うことができます。


## どんなサービスと連携できるか

次世代の Amazon SageMaker は、既存の AWS サービスと連携して、より強力なデータ分析・AI プラットフォームを構築することができます。

### Amazon S3
Amazon S3 は、データレイクの基盤となるオブジェクトストレージサービスです。SageMaker Lakehouse は、S3 に格納されたデータに直接アクセスし、分析することができます。

### Amazon Redshift
Amazon Redshift は、データウェアハウスサービスです。SageMaker Lakehouse は、Redshift に格納されたデータにもアクセスし、分析することができます。

### AWS Glue
AWS Glue は、データ統合サービスです。SageMaker Lakehouse は、Glue を使用して、様々なデータソースからデータを収集し、データレイクに統合することができます。

### Amazon Athena
Amazon Athena は、サーバーレスのクエリサービスです。SageMaker Lakehouse は、Athena を使用して、データレイクに格納されたデータに対してクエリを実行することができます。


## まとめ

次世代の Amazon SageMaker は、データ、分析、AI を統合したプラットフォームとして、データサイエンティストやアナリストの生産性を向上させ、より迅速なイノベーションを促進します。データレイクハウスを中心としたアーキテクチャ、統合されたスタジオ環境、そして生成 AI の活用により、企業はデータからより多くの価値を引き出すことができるようになります。

- [参考：Next generation Amazon SageMaker](https://aws.amazon.com/jp/about-aws/whats-new/2024/12/next-generation-amazon-sagemaker/)
- [参考：Introducing the next generation of Amazon SageMaker: The center for all your data, analytics, and AI](https://aws.amazon.com/jp/blogs/aws/introducing-the-next-generation-of-amazon-sagemaker-the-center-for-all-your-data-analytics-and-ai/)

## おわり
AWS CLIのaws s3 lsで、Could not connect to the endpoint URL: "https://s3.ap-northeast.amazonaws.com/"が出た

S3の権限を付与したのに、以下の表示が出るのはおかしいなと。
Could not connect to the endpoint URL: "https://s3.ap-northeast.amazonaws.com/"

よく調べてみると、
aws configureで設定したリージョン名がタイプミスしていました。

なので、aws configureコマンドで上書き設定をしました。

基本ですが、手打ちは何かと問題を起こすからナンセンスだなと。
リージョン名を正しく ap-northeast-1に直すと、
正しく、登録済みのバケット名が表示されました。