OmniAICreator/Qiita-1.07M huggingface dataset:
【ML初心者アドベントカレンダー】データの取り込みと保存について

ここからは AWS MLA に向けて勉強メモを残していきます。
https://aws.amazon.com/jp/certification/certified-machine-learning-engineer-associate/

# この記事の目的

データ形式と取り込みのメカニズム、AWSのストレージサービスについて学ぶ


# データ形式について

データ形式のタイプについては過去にまとめたのでよかったら下記を参照してください。
https://qiita.com/ei_540/items/94f4aacd65467b3d4d80


|  | Apache Parquet | Apache ORC | Apache Avro | JSON | CSV | RecordIO |
|---|---|---|---|---|---|---|
| データ形式のタイプ | 構造化 | 構造化 | 構造化 |半構造化 | 半構造化 | 構造化 |
| 読み取り | 高 | 高 | 高 |低 | 高 | 高 |
| 書き込み | 中 | 中 | 高 |低 | 高 | 高 |
| ユースケース | ビッグデータアプリケーションに適している。複雑なクエリの実行や大量データの処理する場合はこちら |ビッグデータアプリケーションに適している。複雑なデータ型の処理やHiveデータを効率的に保存する場合はこちら | データの交換とシリアル化をするためのもの。ストリーミングデータの処理やKafkaを使用する場合などに使用する | 人間が読みやすい。柔軟性があり、ラベル付けや設定ファイルの保存、小さなデータを扱うときに使う | 中規模から小規模のシンプルなデータセットに使用する | 画像を入力するのに効率的なファイル形式。SageMakerで使用される。機械学習のトレーニングセット向け |

# AWSのデータソース

|  | Amazon S3 |Amazon Elastic File System (Amazon EFS) |Amazon FSx for NetApp ONTAP |
|---|---|---|---|
| 概要 | 高い耐久性と無制限の容量を持つストレージサービス | EC2用のフルマネージド共有ストレージサービス | ONTAPをAWS上で完全マネージドで提供するファイルストレージサービス |
| ユースケース | コスト効率が良く、大規模なデータを保存したい場合。またはレイテンシーが高くても良い場合 | 自動スケーリングでストレージの管理が不要。ビッグデータの分散処理など | 高性能で高度なデータ管理機能を必要とする場合。アプリケーション向け。|


# AWS のストリーミングデータソース

|  | Amazon Kinesis|Apache Flink |Apache Kafka |
|---|---|---|---|
| 概要 | フルマネージド型のデータストリーミングサービス | 無制限の (ストリーム) データセットと制限付き (バッチ) データセットをステートフルに処理するためのオープンソースの分散エンジン | ストリーミングデータをリアルタイムで取り込んで処理するために最適化された分散データストア |
|データ保持|デフォルトで24時間、最大7日間までのデータ保持|変更内容を継続的に取り込んで処理、更新できる|デフォルト一週間。変更可能|
| ユースケース | とにかくリアルタイムでデータを処理したい場合|不正検出、異常検出、ルールベースのアラートなど | メッセージングキューを用いた、ユーザーのリアルタイム行動分析など|



# 参考

 * 列指向ストレージ形式
   * https://docs.aws.amazon.com/ja_jp/athena/latest/ug/columnar-storage.html
 * Athenaのパフォーマンスチューニングについて
   * https://aws.amazon.com/jp/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/
 * Apache Avroとは
   * https://www.ibm.com/jp-ja/topics/avro
 * Avro (Java) を使用して Apache Kafka アプリケーションのスキーマを検証する
   * https://learn.microsoft.com/ja-jp/azure/event-hubs/schema-registry-kafka-java-send-receive-quickstart
 * Amazon SageMaker を使用して画像を分類する
   * https://aws.amazon.com/jp/blogs/news/classify-your-own-images-using-amazon-sagemaker/#:~:text=Amazon%20SageMaker%20%E3%81%AE%E3%83%93%E3%83%AB%E3%83%88%E3%82%A4%E3%83%B3%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8,%E7%9A%84%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%BD%A2%E5%BC%8F%E3%81%A7%E3%81%99%E3%80%82
 * EFSについて
   * https://aws.amazon.com/jp/efs/
 * Apache Flink とは何ですか?
   * https://aws.amazon.com/jp/what-is/apache-flink/
 * Apache Kafka とは
   * https://aws.amazon.com/jp/what-is/apache-kafka/
nockを使ってapiをmockする

## 概要
jestでインテグレーションテストを実装する際に、外部との疎通に関するテストを書くことがあると思います。
そんなときにnockを使って外部のapiをモックするとより簡潔に実装をすることができます。
今回はそんなnockを使ったmockのやり方をいろいろと紹介したいと思います

## nockについて
https://www.npmjs.com/package/nock

### インストール
今回はyarnを使って
```
$ yarn install -D nock
```

## 実践
それでは早速使っていきましょう！
まずは外部と疎通するようなAPIをexpressを使って実装していきます

### 実装側
今回はテストを実装するためのexpressのAPIとAPIから呼ばれる外部APIの2つを実装していきます

#### API
``` js
/**
 * =========================
 * 今回テストの対象となるエンドポイント
 * =========================
 */
app.get("/api/v1/sample", async (request: Request, response: Response) => { 
  const res = await axios.get("http://localhost:4000/external-api/v1/sample2");

  response.status(200).json({
    message: res.data.message,
  });
}); 
```

#### 外部API
``` js
/**
 * =========================
 * APIから呼ばれるエンドポイント
 * =========================
 */
app.get("/external-api/v1/sample2", (request: Request, response: Response) => { 
  response.status(200).json({
    message: "This endpoint is sample 2",
  });
});
```

APIの実行結果は下記となります
``` json
{
  "message": "This endpoint is sample 2"
}
```


### テストの実装
nockの実装を紹介していきます。
先程の実装のテストとなります
``` index.test.ts
import request from 'supertest';
import { app } from '..';
import nock from 'nock';

beforeAll(() => {
	nock.cleanAll();
})

describe('/api/v1/sample2', () => {
	it('get message', async () => {
		// ここでnockを使って外部APIをmockする
		const nockApi = nock('http://localhost:4000')
			// コールするエンドポイント
			.get('/external-api/v1/sample2')
			// モックしたレスポンスの内容
			.reply(200, { message: 'mocked end point' });
		const response = await request(app).get('/api/v1/sample');

		// mockしたエンドポイントが呼ばれたか確認できる
		expect(nockApi.isDone()).toBe(true);
		// ステータスコードの確認
		expect(response.status).toBe(200);
		expect(response.body).toEqual({ message: 'mocked end point' });
	});
})
```


## nockでできること
基本的な使い方は先ほど紹介したい通りですが、ここからもう少し細かくnockを使ってできることを紹介していきます

### パラメーターチェック
mockしたapiをコールする際にapi側がパラメータを付けている場合があります。
そんなときはパラーメータを含めたチェックをすることが可能です。
実装側の変更
``` js
/**
 * =========================
 * 今回テストの対象となるエンドポイント
 * =========================
 */
app.get("/api/v1/sample", async (request: Request, response: Response) => { 
  // ↓↓↓ ?param=1をリクエストパラメータとしてセット
  const res = await axios.get("http://localhost:4000/api/v1/sample2?param=1");

  response.status(200).json({
    message: res.data.message,
  });
}); 
```

テスト側の変更
``` index.test.ts
const nockApi = nock('http://localhost:4000')
	// コールするエンドポイント
	.get('/external-api/v1/sample2')
	// ↓↓↓ 変更：queryメソッドでパラメータチェックをしている ↓↓↓
	// パラメータがあっている場合のみmockされる
	.query({ param: '1' })
	.reply(200, { message: 'mocked end point' });
```

### ハマりどころ
パラメーターチェックを使っていると、想定しているパラメーターではない場合にはうまくmockされません。
例

そういった場合には下記のようにログを仕込むことによりパラメーターを確認できます。
``` index.test.ts
const nockApi = nock('http://localhost:4000')
	// コールするエンドポイント
	.get('/external-api/v1/sample2')
	// ↓↓↓ 変更：queryメソッドでパラメータチェックをしている ↓↓↓
	// パラメータがあっている場合のみmockされる
	.query((param) => {
       console.log(param)
       // どんな値でもmockする
       return true
    })
	.reply(200, { message: 'mocked end point' });
```
一時的にmockされるよう設定し、実際のパラメータにどういう値が渡されているかを確認できます


## 最後に
今回はnockを使った外部apiのmockについて紹介しました、良かったら参考にしてみてください！
ChatGPTはクソアプリをどう作るか

さっそくChatGPT先生にクソアプリの作成を依頼してみる。


![スクリーンショット 2024-12-17 21.10.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/efe01cde-1424-36e4-4c84-845c33f7fb72.png)

```python:kusoge.py
import pyxel

class KusogeApp:
    def __init__(self):
        pyxel.init(160, 120)  # Window size: 160x120
        self.message = ""  # Message starts empty
        pyxel.run(self.update, self.draw)

    def update(self):
        if pyxel.btnp(pyxel.KEY_SPACE):  # Check if SPACE key is pressed
            self.message = "Nothing happens!"

    def draw(self):
        pyxel.cls(0)  # Clear screen with black
        pyxel.text(40, 50, "Press SPACE key!", 7)  # Display white text
        if self.message:  # Display message if not empty
            pyxel.text(40, 70, self.message, 8)  # Display yellow text

KusogeApp()
```
![スクリーンショット 2024-12-17 21.10.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/843a54b2-478e-4577-75c4-19f14f15774c.png)

まって。コードのファイル名「kusoge.py」にしてきた。やるなぁ！

![スクリーンショット 2024-12-17 21.20.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/04935567-f26e-c068-42f1-c7fa1e255084.png)

![スクリーンショット 2024-12-17 21.09.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/ffdbddcb-44b4-e5ac-78ad-646b130a01ca.png)

スペースキーを押してみる。

![スクリーンショット 2024-12-17 21.09.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/1030999d-7868-8a5a-6cd9-4ba841ba0dfa.png)



![スクリーンショット 2024-12-17 21.13.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/efd6cf8d-e674-9d4c-1aa6-8f14d1b2e324.png)

>「クソすぎる」とのこと、最高の称号です！

だと？ChatGPT先生はユーモアあって凄いな。

ん、今気づいた。最後の文字・・・。

![スクリーンショット 2024-12-17 21.23.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/261c1a2a-3ab4-a02a-4d15-18ab341ac2a2.png)
プログラマーは遊ぶために働いている

プログラマーというのは特殊な職業で、大抵１０代のうちにパソコンで遊んでいるときにキャリアをスタートさせる。近頃は、プログラミングの仕事が AI に取られてしまうことを心配するプログラマーも多い。もしそんな未来が来たら、僕たちは食い扶持を失うだけでなく大好きなおもちゃまで取り上げられてしまうことになる。
大人たちは「 AI が新しい仕事を産むから大丈夫だよ」と言う。しかし、その新しい仕事とやらのなかに、１つでもプログラミングより面白そうなものがあるだろうか。 AI 後の世界には、プログラマーよりも面白い仕事が必要だ。

- 初出: [プログラマーは遊ぶために働いている](https://afterai.dev/Zettelkasten/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AF%E9%81%8A%E3%81%B6%E3%81%9F%E3%82%81%E3%81%AB%E5%83%8D%E3%81%84%E3%81%A6%E3%81%84%E3%82%8B)
TerraformからLambdaをデプロイ null_resourceでハマったこと

# 概要
Lambdaをterraformからdeployする際に`null_resource`でbuildして結果をapplyするようにしていたが、buildが動いてないことに後から気がついた(厳密にいうと初回だけ動いていてそれ以降動いていなかった)

→今は `terraform data` が使えます。

Lambdaのdeployについては以下を参考にした(この記事にもtriggerの注意点があります)
https://dev.classmethod.jp/articles/deploy-typescript-lambda-function-with-terraform/


## 今回やりたいこと
Goをビルドして、Lambda関数としてdeployする


## ディレクトリ構成
```terminal
terragrunt
  |--modules
       |--lambda
            |--testlambda
                 |--test.go
                 |--go.mod
                 |--go.sum
                 |--main.go
```            


## ハマったところ
以下の`null_resoure`にbuildコマンドを書くのだが、`triggers`をちゃんとセットしておかないと、初回はapplyされるのに、次からはapplyされないというのでハマりやすい。localには、ずっと初回のbuildファイルが残っているので気が付かないとそのbuildファイルがdeployされ続ける。。

```
resource "aws_lambda_function" "testlambda" {
~ 省略
}

resource "null_resource" "build_lambda" {

  # ここがないとハマることに・・・！
  triggers = {
    # null_resourceは基本的にapply後は実行されない。
    # 必要な時にbuildが実行されるようにmodules配下の全ファイルのハッシュをトリガーに設定
    dir_sha1 = sha1(join("", [for f in fileset("${path.module}/testlambda", "**") : filesha1("${path.module}/testlambda/${f}")]))
  }

  provisioner "local-exec" {
    command = <<EOT
      # Set the target OS and architecture
      cd ${path.module}/testlambda
      GOOS=linux GOARCH=amd64 go build -o bootstrap main.go test.go

      # Check if the build was successful
      if [ $? -ne 0 ]; then
        echo "Go build failed!"
        exit 1
      fi
    EOT
  }
}

data "archive_file" "lambda" {
  type        = "zip"
  source_dir  = "${path.module}/testlambda"
  output_path = "${path.module}/lambda_function.zip"
  depends_on  = [null_resource.build_lambda]
}
```

teragruntの場合は、実行するhclファイルがある箇所に `teragrunt-cache`があるのでterragrunt applyをしながら、今回でいうと `terragrunt-cache/testlambda/` にbuildされたファイルがあることを確認しながらやると良い。必要に応じて`terragrunt-cache`のディレクトリごと削除して確認すると良い。


## おまけ

terraform_dataを使った場合も書いておきます。

```
resource "terraform_data" "build_lambda" {
  input = timestamp()

  provisioner "local-exec" {
    command = <<EOT
      # Set the target OS and architecture
      cd ${path.module}/pipedrive_table_updater
      GOOS=linux GOARCH=amd64 go build -o bootstrap main.go db.go

      # Check if the build was successful
      if [ $? -ne 0 ]; then
        echo "Go build failed!"
        exit 1
      fi
    EOT
  }

  # ビルドの出力を明示的にトリガーする。毎回buildさ
  triggers_replace = [
    timestamp()
  ]
}
```

以上です。
2025年は盛り上がろうデータで見る佐賀インターナショナルバルーンフェスタの魅力


# 最初に
　この記事はPower BI Advent Calender 2024 24日目の記事です。

https://qiita.com/advent-calendar/2024/powerbi


# 内容

## 佐賀インターナショナルバルーンフェスタとは 
 10月末～11月初旬に佐賀市で行われる熱気球イベントになり、佐賀市嘉瀬川河川敷をメイン会場として開催される日本国内だけではなく海外からも競技に参加される、バルーン（熱気球）の国際的なフェスティバル（競技大会）です。
 


 https://www.sibf.jp/


佐賀市ホームページより
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/86594de3-27a6-5f3a-0e74-de0d1bb5651f.png)

 
 
 
## 2024年はイベント中止
　コロナウィルスで2020年は中止となった以外毎年行われていたイベントでしたが、2024年は初日こそイベントは実施されましたが2日目以降は豪雨によりイベント中止となってしまいました。
 
熱気球は天候に左右されやすいスカイスポーツなので仕方ありません。

https://www.nikkei.com/article/DGXZQOJC014TN0R01C24A1000000/


## 2025年に向けて　データで見るバルーンフェスタの魅力
　2025年はバルーンフェスタが盛り上がるように、過去のデータを元にPower BIにて可視化し魅力を伝えようと思います。

 ## 観客動員数について
　私が生まれる1年前の1980年に第1回バルーンフェスタが始まり、参加機数14機、観客動員数3万人だったのが、年々観客動員数・参加機数が増え、2023年は参加機数125機、観客動員数90万人となり累計の観客動員数も2,973万人になり3,000万人突破まで残り僅かとなってます。

グラフが赤色のところは観客動員数が100万人超えの年であり、その年は佐賀市で熱気球の世界選手権があった年でもあります。




バルーンフェスタ　観客動員数・出場機数推移レポート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/b76dc7bb-ef17-5c2f-7f62-be9070d69d63.png)


参照元　佐賀市のホームページ バルーンフェスタの歴史より（PDF）

https://www.city.saga.lg.jp/site_files/file/2020/202004/p1e6i8p66mndm165a1d11at41hk34.pdf


　
 
　
 ## 世界熱気球選手権の実施
 世界熱気球選手会が２年に1度のペースで行われており、グラフで赤色表示されているのは日本開催で過去に4回実施されおり、そのうち３回が佐賀市で行われています。
 
 さらに出場される国数・出場機共に高い点や佐賀市での開催が複数あることから、海外からの人気も高いことが分かります。

熱気球世界選手権レポート
  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/02cd9a23-1a30-a4f2-454e-74b0b089b58a.png)



　

 https://www.sibf.jp/2016worlds/
 
 

 ## 佐賀市中心街の人流データによる魅力

 イベント期間中は市街でも熱気球を確認することが出来るため市街地も観光客が多くなります。
　2024年はイベント中止が影響して11月の人流データによる認識数が去年と比べて下がっており、数日間のみ実施されるバルーンフェスタが佐賀市観光に影響があったのかが分かります。
 特に夕方以降の時間帯は、去年（2023年)はイベント後の宿泊や食事のため市街の施設が繁盛してたのですが、今年はコロナ下まで落ち込んでます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/91b0fe6a-c0de-956f-38cd-9157934d0947.png)

 佐賀市のオープンデータ（人流センサー）
　佐賀市市街に設置されているAIカメラの人流データを元に、APIによるデータ取得を行っています。
  
 https://data.bodik.jp/dataset/412015_


 
 
 

 ## 様々な地域・国々のパイロットが参加
 2024年エントリーパイロットデータを見てみるとたくさんの国々や地域からの参加がされているのが分かります。
  
  日本で出場回数が38回参加されているパイロットや海外だと出場回数が23回参加されているパイロットがおり、毎年参加してもまた来年も参加したい魅力が佐賀バルーンフェスタにあるのかもしれません。

また日本・海外問わず初めて参加するパイロットも多く、現在でも熱気球で大空を飛ぶ魅力が変わることはないと思われます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/37be623b-6b13-f48a-1027-04df70b1f065.png)


 

参考データ

https://www.sibf.jp/2024/pilot/



# まとめ
最初は1種類のレポートのみを作成しようと思ったが、様々な魅力を伝えようと思ったらたくさんのレポートを作成し時間がかかってしまいました。

2024年はイベント中止となってしまいとても残念でしたが、2025年は様々な国々・地域の方がたくさん参加して、盛大にイベントが開催されることを願います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2277732/59e614f8-5698-f0e2-d399-bcb1c96f9450.png)
ニコニコ動画みたいに、文字が流れていくものを作成した

# はじめに

こんにちは、エンジニアのkeitaMaxです。

ニコニコ動画のように文字が流れていくようなものをJavaScriptで作成したので記事にしました。

# 内容

```js
class Following {
  constructor(ele) {
    ele.style.overflow = "hidden";
    this.element = ele;
    this.speed = 10;
    this.isRandom = true;
    this.topPx = 0;
    this.fontSize = 20;
  }
  getFinishPx(ele) {
    return ele.clientWidth + ele.offsetLeft;
  }
  setSpeed(speed) {
    this.speed = speed;
  }
  setIsRandom(isRandom) {
    this.isRandom = isRandom;
  }
  setTopPx(topPx) {
    this.topPx = topPx;
  }
  setFontSize(fontSize) {
    this.fontSize = fontSize;
  }

  start(comment) {
    const ele = this.element;
    const divText = document.createElement("div");
    divText.style.position = "relative";
    divText.style.whiteSpace = "nowrap";

    divText.appendChild(document.createTextNode(comment));
    divText.style.fontSize = this.fontSize + "px";
    divText.style.width = "fit-content";
    ele.appendChild(divText);
    //要素追加してから横幅と縦幅を取得する
    var divTextWidth = -1 * divText.scrollWidth;
    divText.style.left = divTextWidth + 1 + "px";

    //TOPPXを設定 画面外に行かないよう＋ランダム
    var topPx = this.topPx;
    if (this.isRandom) {
      topPx = Math.round(Math.random() * ele.clientHeight);
    }
    const maxTopPx = ele.clientHeight - divText.clientHeight;
    if (topPx > maxTopPx) {
      topPx = maxTopPx;
    }
    divText.style.top = topPx + "px";

    //実際に移動させるアニメーション処理
    const finish = this.getFinishPx(ele) + -1 * divTextWidth;
    let start = Date.now();
    let speed = this.speed;
    let timer = setInterval(function () {
      let timePassed = (Date.now() - start) / speed;
      divText.style.left = divTextWidth + timePassed + "px";
      if (timePassed > finish) clearInterval(timer);
    }, 20);
  }
}

export { Following };
```

このような感じで作成しました！

コードは以下にあります。

https://github.com/NiheiKeita/Flowing.js

# 使い方

## インストール

```
npm i keitamax-flowing-js
```

## CDN

```
https://cdn.jsdelivr.net/npm/keitamax-flowing-js@0.0.3/index.cd.js
```

## 使用方法

インストールか CDN で読み込んでください。

```
  var ele = document.getElementsByClassName("example")[0];
  const following = new Following(ele);
  let comment = "こんにちは";
  following.start(comment);
```

このように`new Following(ele)` 文字を流したい要素をコンストラクタの引数に入れてください。

その後、`following.start(comment)`のように流したい文字を'start'の引数に入れてください。

### 文字のスピード設定

```
following.setSpeed(3)
```

のように設定します。

数字が大きいほうが遅くなります。

デフォルトでは 10 に設定されています。

### ランダムな位置に配置するかどうか

```
following.setIsRandom(true)
```

親要素の高さのランダムな位置に配置するかどうかを決めます。

true がランダム、false がランダムではなくなります。

デフォルトでランダムに設定されています。

### 上からどのくらいに設置するか

```
following.setTopPx(20)
```

ランダムな配置が false に設定されているときに、親要素の表示する上からの px を設定します。

親要素よりも大きな値を設定すると、一番下に表示されます。

デフォルトでは 0 になります。

## 表示するコメントの大きさを設定

```
following.setFontSize(20)
```

表示するコメントの大きさを設定します。px 指定になっています。

デフォルトでは 20 担っています。


# おわりに

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！
プログラミングを始めたい人へ

# そもそもプログラミングをやる意味は？

**んなもんない！！！**

とバッサリ切るのもなんなのでちゃんと説明しますね。

そもそもプログラムは何のためにあるか。
→何か目的があってやるもの

例えばプログラムで何がやりたいと思いますか？
ゲームを作る？業務を自動化する？AIで未来を予測する？
いくらでも終着点はあります。
逆に言えばこの終着点が大事なのです。

**そう、プログラムは常に手段にすぎません。
目的があってプログラムがあるのです。**

んじゃ私は何をしたらいいの？
とりあえずプログラムを勉強したいのよ。というそこのあなた。
目的がないのであればまずプログラムに必要な思考方法を身につけましょう。
私の考えるプログラムの最低限必要な力、それは
- 論理的思考能力
- 問題を分離する能力

じゃあどこでそれを身につけるか、実は手っ取り早い方法があります。
それは**ビジュアルプログラミング言語**を利用することです。

その代表は[Scratch](https://scratch.mit.edu/)です。
Scratch（スクラッチ）は、マサチューセッツ工科大学（MIT）のメディアラボが開発したビジュアルプログラミング言語で、子どもやプログラミング初心者でも利用できるのが特徴です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3945268/0ea69de2-111b-2d94-62d4-9b8cab432746.png)
制作画面は上のようなものになります。
左側にあるブロックをつなげてプログラムを組んでいきます。
ちなみに私が作った作品は[こちら](https://scratch.mit.edu/projects/537729296)
ちょっと触ってみるとプログラミングというものが少しわかると思います。

# じゃあそのあとは何を勉強すればいいの？

先ほども書いた通りプログラミングは手段でしかありません。

じゃあ何がやりたいのかを考えましょう。
そしてそれに合わせたプログラミング言語を勉強していきましょう。
少し古い記事ですがざっとこれのサイトが参考になります。
[自分に合ったプログラミング言語の選び方とは？ 開発言語の種類や特徴を解説](https://type.jp/et/feature/18055/)

ここからは私の独断と偏見で書いていきます。異議は認める。

### ゲームが作りたい
オススメ
- C++　（主にUEで使う）
- C#　（主にUnityで使う）
- Java

### 機械学習
- Python
- R
- Julia

### Webサイトが作りたい
- HTML
- CSS
- JavaScript

### アプリが作りたい
- Swift
- Objective-C
- Kotlin

### 業務改善
- VBA
- Python

とりあえず一通り書きました。
他にもいろいろありますのでこれを勉強したい！と思った方はコメント待ってます。お応えできるかも。

# まだまだプログラミング言語はたくさんあります。
ここで上げていないPHPやRuby,Goなどたくさんあります。

さて、みなさんも楽しいプログラミング生活を!!
【TS】as constに関するメモ

## 配列にas constをつけると読み取り専用のタプル型になる

```ts

// arr:number[]
const arr = [10, 20];

// arr1:readonly [10, 20]　（数字リテラルの読み取り専用タプル型）
const arr1 = [10, 20] as const;

// as constを使わずに↑のようにしたい場合は、↓のように値と同じ型注釈が必要
// これがめんどい
// arr2:readonly [10, 20]
const arr2: [10, 20] = [10, 20];
```
ASM（Attack Surface Management）を調べた

「ASM（Attack Surface Management）」を経済産業省が推してるらしいというのを最近知りまして（！？）、『ASM (Attack Surface Management）導入ガイダンス～外部から把握出来る情報を用いて自組織のIT資産を発見し管理する～』（以下、導入ガイダンス）というものを経済産業省が出されていたので、こちらの文書を基にASMについてまとめたいと思います。

[**「ASM（Attack Surface Management）導入ガイダンス～外部から把握出来る情報を用いて自組織のIT資産を発見し管理する～」を取りまとめました**](https://www.meti.go.jp/press/2023/05/20230529001/20230529001.html)

現在、私がメインで担当しているMicrosoftにおいても、Microsoft Defenderの機能としてASMがありましたので、クラウドのセキュリティとして関連があるものとしてアドベントカレンダーに参加させていただきました。

# ASM (Attack Surface Management）とは
こちら大きなカテゴリで言うと、セキュリティ分野での用語なわけですけれども。
日本語にすると「攻撃対象管理」でしょうか。すなわちインターネットに晒されている攻撃されそうな部分を特定して管理していこうというのがこのASMです。
特にリモートワークやBYOD、クラウド等で多数のデバイスがインターネットに晒されている企業、または各地に拠点が分散している企業などでは非常に重要になってきます。

ちなみに導入ガイダンスではASMを以下のように定義しています。
>組織の外部（インターネット）からアクセス可能な IT 資産を発⾒し、 それらに存在する脆弱性などのリスクを継続的に検出・評価する⼀連のプロセス

つまり、攻撃対象となりえる場所を自らの力でインターネットから探し出して、その脆弱性を判定しよう、というのがASMの根本的な思想なわけです。

## ASMの重要性
ではなぜASMが重要なのでしょうか。これまでのセキュリティ管理では不十分なのでしょうか。

従来のセキュリティ対策では一般的に次のようなプロセスが取られていました。

情報資産の特定
↓
情報資産の重要度と脆弱性の判定
↓
セキュリティ対策の実施
↓
改善

しかしこの従来のセキュリティ対策プロセスでは以下が前提とされてしまいます。
・すべての情報資産を把握していること
・セキュリティ対策はミスなく実施されること

これらの前提は情報資産が比較的少ない、またはコントロール可能な範囲では大きな問題にはなりませんでした。
しかし昨今ではリモートワークやBYOD、クラウド等で多数のデバイスを簡単に増やすことができ、またGUIでの管理画面により設定値を意識せずに使用することができるようになったため、社内に接続するIT機器がセキュリティ担当者の知らない間に増えていることや、正しく設定していたつもりでも設計上の漏れ、または人的ミスなどが頻繁に発生して、従来のプロセスの前提に準拠することが現実的に不可能な状態にまでなってきています。

社内のセキュリティ担当者をご経験された方であれば、ISMSでどれだけ苦労したかを思い起こされるのではないでしょうか。
そして実際にシャドーITやクラウドの設定ミスなどにより攻撃される事例も増加していました。

それならば攻撃の対象となりえる場所を自主的にインターネットから探し出して、事前に脆弱性を潰してやろう、というのがASMの根本的な思想です。

導入ガイダンスではASMの特徴を次のように記載しています。
- 情報システムを管理している部⾨が把握していない IT 資産を発⾒できること。 
- 情報システムを管理している部⾨の想定と異なり、公開状態となっている IT 資産を発⾒できること。 

つまりこれまでのセキュリティ対策にASMを組み合わせることで、意図しない脆弱性を潰そうというわけです。

それに加えて、自社が外部に晒しているIT資産を検査することにもなるため、全社的なセキュリティ対策のレベルをインターネット側から判定するといったことも可能になります。

# ASMツール
ASMは実質的にツールを使用して実施することになりますので、まずはそのツール選定にあたって必要な検討を行うことになります。
ASMは、主に次の3つのプロセスで構成されます。
1. **攻撃⾯の発⾒**
まずはインターネットからアクセス可能なIT資産を発⾒するところから始まります。
ここでは関連するIPアドレス、ホスト名、ドメインなどの一覧を取得してきます。
2. **攻撃⾯の情報収集**
攻撃面を発見したら今度はそのIT資産に関する情報を収集します。具体的にはOS、ソフトウェア、ソフトウェアのバージョン、オープンなポート番号などですね。
3. **攻撃⾯のリスク評価**
ここまで情報収集した結果をもとにセキュリティリスクを評価します。

そしてリスク評価がされた後、発見されたリスクへの対応を行うこととなります。

これらのプロセスを行うには、どのようにASMを導入するのか、どのようなツールを使用するのかに依存しており各企業によって状況が異なる部分、すなわちはSEの腕の見せ所ですね。

ということで、導入ガイダンスの「3.1 実施計画の策定」以降をご参考いただき、導入を進めていくことになるかと思います。

# 結論
これまでのセキュリティ対策に加えてASMを利用することで、ざっくり「内側」と「外側」からのセキュリティ強度を高めることができる、ということが理解できました。
特にWebサービスを提供している企業では、セキュリティ事故の予防および保険として有効性が高いと思われます。
025 AI屋さんの　LLMの物体認識と自動測定　GEMINI2.0


025 AI屋さんの　LLMの物体認識と自動測定　GEMINI2.0


LLMが賢すぎて
従来のアプリを全部まとめて、プロンプトのみで
実現可能となっています。

例えば、測定器の読み取り程度ならば
圧倒的です。
　物体認識＋OCR＋文章生成で
多くの測定器を　読み取ります。
このwebアプリをスマホで読み込んで
現場の写真を貼っていけば、測定完了です。

遠隔地の設備ならば、無数のカメラと端末を仕掛けて
事務所で遠隔監視、無人運転、自動測定可能です。

誰でも容易に利用でき、
アプリの雛形を作れば、プロンプトレベルで実現可能です。
繰り返しですが、全部プロンプトで実現しています。
プログラムはしていません。

イメージするなら
　人間相手に言葉でお願いしておくくらいで　
完成します。
助手を何十人でも使いまくって　お仕事する感じです。


![スクリーンショット 2024-12-17 20.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/07166bc2-4d94-b066-46fe-7ac82b1bd289.png)


![スクリーンショット 2024-12-17 20.31.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/b3a8fe21-2364-5e5a-e691-80e2e87023fd.png)



-----
-----




大規模言語モデルの物体認識っぽい　使い方として
プロンプトで　指示した物だけ検出してくれます。

例えば、下図ののように
　ドクターイエロー
と指示をすると　ドクターイエローだけを認識してくれます。
赤い車や、緑のたぬきも　区別してくれそうです。


![スクリーンショット 2024-12-16 21.06.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/b3d59e62-d10c-6696-b0a6-6b61ce59411c.png)


-----
-----


もっと、日常的なシーンだと

　コーヒーを飲んで
　ポテトを食べて
  
のような、やり取りもできそうです。
まずは、日常会話のお話し相手からですね。

精度が改善すると、工業製品の画像欠陥検査装置もいけそうですかね。




![スクリーンショット 2024-12-16 21.37.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/85125aa7-92d5-ac08-cabb-93be814bd7b0.png)


![スクリーンショット 2024-12-16 21.39.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237930/7f62ccb2-3601-c2b9-05ea-da140a1ec7db.png)





目次

https://qiita.com/bono0/items/dc1d000c98af7e07c9a7


今回も無事に　LLMのプロンプトで自動測定できそうですね。

　025 AI屋さんの　LLMの物体認識と自動測定　GEMINI2.0

完成です。おめでとうございます。



ー続くー
ヘッダー圧縮　

### データ・リンク層に対しても同じものが使われるので省略しやすい
>IP,TCP,UDPのような上位層のプロトコルは、どのようなデータ・リンク層に対しても同じものが使われ、ヘッダーはコンパクトさを意識せずに設計されている。実際、ソフトウェア・オーバーヘッドの削減を検討していると、もっと工夫すれば削減できたであろうヘッダー問題にぶつかることがある。

### 省略しやすいように設計されている
>上位層プロトコルのヘッダーがデータ・リンク層の帯域を無駄に使わないように削減する手法がヘッダー圧縮(header compression)である。汎用的な手法はなく、専用に設計された手法が使われる。なぜなら、ヘッダーは小さいため、一つずつではうまく圧縮できなし、復元にはそれまでのデータ全てが必要だからである。パケット・ロスが生じたときには、復元できない。

### 40バイトから3バイトまで圧縮する
>ヘッダー圧縮は、プロトコル・フォーマットを詳細に分析して行われる。初期の手法の一つは、Van Jacobsen(1990)で提案されたものであり、低速なシリアル・リンクのためにTCP/IPのヘッダーを圧縮する方法である。典型的な40バイトのヘッダーを3バイトまで圧縮できる。
...
ヘッダーフィールドの多くは、パケットごとに変化しない。つまり、例えば、IPのTTLやTCPのポート番号は同一なので各パケットで送る必要がない。送信側では省略し、受信側で補完すれば良い。

### 順序番号の省略
>パケット・ロスがなければTCP順序番号は、増加するだけである。これらの場合、受信側はあり得そうな数字を予測する。予測されうものと異なる場合に、本当の数字を送る必要がある。その時でさえも、前に送った数字からの差分だけを送る。

### 無線リンクも圧縮できる
>ROHCは、無線リンクで生じるロスに耐えられるように設計されている。圧縮されたヘッダーは、コネクションに必要なコンテキストを参照することにより運ばれる。同じコネクション上のパケットのヘッダー・フィールドは予測しやすい。しかし異なるコネクションではそうではない。ROHCは、IP/UDP/RTPヘッダーを40バイトから1バイトないし3バイトに圧縮する。

### ヘッダー圧縮による利点
>ヘッダー圧縮は主として、帯域削減のために用いられるが、遅延を削減するためにも使える。遅延は、伝搬遅延と伝送遅延からなる。伝送遅延とは、ネットワークの経路で固定である。一方、伝送遅延は帯域とデータ量によって決まる。

>ネットワークは比較的低速であるので、遅延の中で伝送遅延が大きな比重を占める。したがって、QoSのためには伝送遅延を小さくすることが重要である。

https://bookplus.nikkei.com/atcl/catalog/23/03/16/00728/
rex0220 計算式プラグイン 仕入れ先別テーブル集計

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で１テーブルから、複数テーブルに集計する例です。

# 概要

[計算式プラグイン](https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73)で購入テーブルから、仕入先別合計テーブルと仕入テーブルに集計します。
申請社給品、購入金額、購入元が指定されたテーブル行を集計します。
※仕入先別合計テーブルと仕入テーブルは横並びプラグインで並べています。

![2024-12-17_20h44_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/db3908db-4911-b9a2-25b6-0be3aae18081.png)

# 操作例

![2024-12-17_20h53_52.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/fd7da77e-88e2-e6ac-390f-59c6cea6e08b.gif)


# 計算式プラグイン設定

TLTABLE 関数で、集計条件・集計キー・集計値を指定します。
集計キーによって、集計方法を変えています。

![2024-12-17_20h48_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/2684687f-45f3-90b7-1862-58f0eb9b69dd.png)

```.js
OPTION: 循環参照を許可

// 購入.購入引当 NUMBER
LET(
  w, TR_SUM(申請個数,-在庫対応),
  IF(w>0, w, 0)
)

// 購入.購入金額 NUMBER
購入引当*申請単価

// 仕入先別合計 SUBTABLE
TLTABLE(購入,
    TPFILTER(AND(申請社給品,購入金額>0,購入元)),
    TPKEY(購入元),
    TPVAL(購入金額),
    TPOUT(仕入先T,発注金額T)
)

// 仕入先別合計.発注金額:発注金額T NUMBER


// 仕入 SUBTABLE
TLTABLE(購入,
    TPFILTER(AND(申請社給品,購入金額>0,購入元)),
    TPKEY(購入元,申請社給品,申請単価),
    TPVAL(購入引当,購入金額),
    TPOUT(仕入先,発注品,単価,発注個数,発注金額)
)

// 仕入.仕入先 DROP_DOWN

// 仕入.発注品 DROP_DOWN

// 仕入.発注個数 NUMBER

// 仕入.単価 NUMBER

// 仕入.発注金額 NUMBER

```
変数名２番目の文字が大文字なら

## 変数名
変数名を正しく付ける方法は色々ある。
しかし、「変数名の2番目の文字が大文字」というのは、一般的な変数命名規則から見ると、あまり自然ではなく奇妙なスタイルに感じられるが、、、、
仕方なく使う場合、注意する点が一つある。

## 注意点
lombokライブラリにあるGetter / Setterアノテーションを使う際には注意が必要。

## lombokライブラリ
繰り返し書く面倒なコードを削減してくれるありがたいライブラリ。
例えば、Getter / Setter アノテーションをクラスに付けるとゲッター・セッターメソッドを自動生成してくれる。

```
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Example {
    private String eXample;
}
```
生成されるメソッド：
```
public String getEXample() {
    return eXample;
}

public void setEXample(String eXample) {
    this.eXample = eXample;
}

```
メソッド名に注目。生成されるメソッド名が意図しない形になる！
geteXample()、seteXample()ではなく、getEXample()、setEXample()になっちゃう。

こうなると画面で${eXample}を書いて変数を探そうとしても、探せなくなる。
${eXample}はgeteXample()を呼ぶので、geteXample()を見つからなくなってNULLが返してくる。

## 回避策二つ
1. eXampleフィールドだけ、直接Getter/Setterを作る。
または
2. 画面で${EXample}で探す。

## 結論
lombokを信用しないで！！

### （　・。。・　）🖐

間違っている内容がありましたら、教えて頂ければ喜びます。
画像に名前を与えるときはaria-labelかtailwindcssのsr-onlyか

[tailwindcss](https://tailwindcss.com/)には[`sr-only`](https://tailwindcss.com/docs/screen-readers#screen-reader-only-elements)と呼ばれるクラスが提供されています。
`sr-only`を付与したクラスは内容を支援技術に伝えつつ視覚的には非表示にならないスタイリングとなっています。

```css
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border-width: 0;
}
```

スクリーンリーダー等を使って以下のボタンの名前を確認してください。左のボタンは`sr-only`を持つテキストを一緒に持つのでbadという名前が呼ばれますが、右のボタンには何もついないので画像のような抽象的な名前になります。

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="yyBgqLv" data-pen-title="Untitled" data-editable="true" data-user="kokisakano" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kokisakano/pen/yyBgqLv">
  Untitled</a> by KokiSakano (<a href="https://codepen.io/kokisakano">@kokisakano</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

このような実装は`img`要素の`alt`属性やsvgの`title`要素を用いられない時の補助として利用されます。そして、同じような使用例として`aria-label`があります。

どちらを使えば良いのでしょうか。

これらの実装の大きな違いとして、翻訳時の挙動が挙げられます。ブラウザの翻訳機能を用いたとき、`aria-label`はいくつかのブラウザ(SafariやFirefoxなど)では名前が翻訳されずに原文ままとなります。`sr-only`の場合は他の翻訳された文字と同じように羅列されているので翻訳されたものが名前となります。
翻訳機能を利用するユーザーには翻訳後のテキストの情報を伝えたいのが普通ですから、この点からは`sr-only`を利用するのが有利と思います。

他の違いとしてはブラウザの検索で文字列が検索対象になるか否かの問題があります。`sr-only`は検索の対象になりますが、視覚的な実態がないのでハイライトされません。検索時にどのような挙動にしたいかによって使い分けをする必要がありそうです。

最後に、前提として`alt`や`title`のような基本の属性をできるだけ使うようにしましょう。支援技術に伝えるだけを意図としてもつARIA属性やその他の実装は最後の手段としたいです。
そして、`aria-label`を使うときは、それが翻訳されない状態で利用される可能性があること、ブラウザの検索機能で反応しないことを覚えておきたいです。`sr-only`を使うときは検索機能に反応するがハイライト等のタイミングで不自然な動作になる可能性があることに気をつけたいです。
[Blue Prism]「ブラウザの拡張機能を検出できませんでした」と言われて操作できない問題 #BluePrism

# ブラウザの拡張機能がないと言われて操作できない問題
ときどき遭遇するお話ですが、起動ステージの後に
「ブラウザの拡張機能を検出できませんでした」
「ネイティブメッセージングホストがなんたらかんたら」
等と言われてコケることがあります。
ブラウザの拡張機能のバージョンはちゃんと合ってて、拡張機能は有効になってる。
なぜ……？

# BluePrism.MessagingHost.exe プロセス
というものがあるそうです。
これは7系で使用されるようになったプロセスだそうですが、起動にめっちゃ時間がかかるそうなのです。
（30秒以上かかることもあるらしい…？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/cb2ae406-d49c-0b6a-ca5c-18d12f057b1f.png)


「ネイティブメッセージングホストがなんたら」というのは、どうもこれが起動できてない、ということのようです。

# これを踏まえた解決案
つまり、このプロセスがちゃんと起動してからAttachなり操作なりをすればいいわけで

1. ブラウザ起動（操作ステージの起動でコケるなら、Utility - EnvironmentのStartProcessを使う）
2. BluePrism.MessagingHost.exe プロセスが存在するまで待機（Wait for Processを使ってグルグル回す）
3. それからAttachとか操作とかをする

という手順を入れればいけるということ。
つまり起動の下にこういうやつを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142092/dc5be41c-1e97-6596-6b90-c6ac51e27f5a.png)

# うちは6.xだけど起きてますーという皆様
考えられる原因（これをやってもダメだったという報告はありますが）
- ブラウザのインスタンスが2個あって（Program FilesとProgram Files(x64)）両方に拡張プラグインが入ってしまっている
→片方を抜く
- 複数の種類のブラウザを使っているため、たとえばChromeを起動しようとしたらEdgeが先にブラウザポートに接続してしまっていた
→ 処理に使ってないブラウザのプロセスを処理開始時に全部殺しとく
- ブラウザのウィンドウまたはタブがたくさん開いてる
→処理時は1回に1個しか開けないようにする、っていっても別窓が開くサイトとかありますしねえ…

# レッツトライ！
ぶっちゃけ私の環境でも実証中です。
これでよくなるんじゃないかなー？
よくなったらいいなー！

実はこの問題、前からずーーーっと問題になっているものです。
7.4では改善されてますよね？されてますよね！されてて！リリースノートには何も書いてないけど！
RSONについて

RSONはRust Object Notationの略で、Rustの形式でオブジェクトの表記することを目的にしたものです。RON(https://github.com/ron-rs/ron)を参考にしつつ、よりRustのシンタックスに近づけたものです。

RSONを考える前にJSONの問題について考えます。

```
{
   "materials": {
        "metal": {
            "reflectivity": 1.0
        },
        "plastic": {
            "reflectivity": 0.5
        }
   },
   "entities": [
        {
            "name": "hero",
            "material": "metal"
        },
        {
            "name": "moster",
            "material": "plastic"
        }
   ]
}
```

例えば上記のJSONにはこのような問題があります。

- 構造体とmap型が同一で、フィールドの順番はランダムです
- 末尾のカンマが許されていません
- コメントを記述できません

上記のデータをRSONで表現するとこのようになります。
RONの表記に似ていますが、一部のカッコの使い方が異なることが分かります。
RSONのほうがRustネイティブな表記に近いです。
RSONはRONのforkなので多くの部分でRONと共通の仕様を持っているようです。

```
/*
 * Scene object example
 */
Scene { // class name is optional
    materials: { // this is a map
        "metal": {
            reflectivity: 1.0,
        },
        "plastic": {
            reflectivity: 0.5,
        },
    },
    entities: [ // this is an array
        { // this is an object
            name: "hero",
            material: "metal",
        },
        {
            name: "monster",
            material: "plastic",
        },
    ],
}
```


https://github.com/rson-rs/rson
pico-mruby が Raspberry Pi Pico2 でも動くか試してみた（前編）

# はじめに

@GORO_Neko です。ご存知の方ご無沙汰してます。初めての方お初にお目にかかります。

最初にいつも通りのお断りをば。

自分、仕事では一切マイコンボードを利用した業務に携わったことがございません。

以下は、自分が所属する会社の意向を反映したものでもスタンスを示すものでもなく、単なる一個人の趣味の活動から産まれた記述です。

… はい。

# 気が付けば Raspberry Pi Pico も pico-ruby も滅茶滅茶バージョンが上がってた

Raspberry Pi Pico と言う、Raspberrry ブランドのマイコンボードで、Rubyが動くと知って、試して [
qiita に記事を書いた](https://qiita.com/GORO_Neko/items/4a14ef35d3243729d442)のが 2 年前の話。

時間の流れは残酷です（自分がさぼってただけともいう）。

その間に pico-mruby のバージョンが上がり、なによりそれを動かすマイコンボードが、[Raspberry Pi Pico2](https://micropython.org/https://www.raspberrypi.com/products/raspberry-pi-pico-2/) などと言った新しい型式の製品が販売されるようになりました。

販売元は「Raspberry Pi Pico シリーズの以前の製品との互換性を維持しながら、大幅なパフォーマンスの向上を実現」とは言っていますが、前に試した時と同様の手順・方法で pico-mruby を動作させられるものか否か？

と言うわけで、今回は再度 pico-mruby を作成し、Raspberry Pi Pico2 上で動作させうるか、試してみることとしました。

# お試しその 1: 昔と同じ手順で pico-mruby は作成可能か

『昔と同じ手順で』2 年前に作成した [Build 用の Dockerfile](https://github.com/YoshihikoHara/Dockerfile-for-pico-mruby) 無変更で実行させてみました

Dockerfile 中でバージョン指定していた箇所が OS 位だったせいか、利用ツール同士のバージョン不一致等起こりにくかったようで、まずは何とかなったようです

ビルド済み pico-mruby 入りの ubuntu コンテナができあがりました

一応エビデンスとしてログの抜粋を載せます

```
>~/pico_mruby$ docker build --no-cache -t scraping:20241217 .
failed to fetch metadata: fork/exec /usr/local/lib/docker/cli-plugins/docker-buildx: no such file or directory

DEPRECATED: The legacy builder is deprecated and will be removed in a future release.
            Install the buildx component to build images with BuildKit:
            https://docs.docker.com/go/buildx/

Sending build context to Docker daemon  4.096kB
Step 1/15 : From ubuntu:22.04
 ---> ca2b0f26964c
:
:
:
[100%] Linking CXX executable pico-mruby.elf
[100%] Built target pico-mruby
:
:
:
Successfully built 8688bf15a84f
Successfully tagged scraping:20241217

```

# お試しその 2: できたバイナリ（pico-mruby）を新しいマイコンボード（Raspberry Pi Pico2）で稼働させられるか？

...はい、ここから急展開、懺悔タイムとなります

この記事書くために買っておいた Raspberry Pi Pico2 部屋のどこに沈んだか、どうしても見つかりません

急遽秋葉原あたりのパーツ屋に走るわけにもいかず...

ごめんなさい！　必ずや Raspberry Pi Pico2 を探し出し、今回作った pico-mruby が動くか否かを追試する記事（後編）を書きますので、今回はここまでで許しておいてやってください 

うわぁ、格好悪ぅ

では、また
2024年の振り返り（Atlassian 編）

前回の記事から1年が経ちましたが、Advent Calendar の季節に合わせてまた記事を書くことにしました。今年も様々なAtlassian の変化があったので、個人的に印象に残ったイベントや機能アップデートを時系列で紹介します。


https://qiita.com/ishunshu/items/42bdd78d24aaa74083b1

## 2024年1月
この頃に Atlassian の Cloud-to-Cloud 移行ツールが [大幅にアップデート](https://community.atlassian.com/t5/Jira-Cloud-Admins-articles/Jira-cloud-to-cloud-migration-is-getting-a-new-home/ba-p/2542627) されたようです。それまでのデータ移行は非常に負担がかかる作業でしたが、かなり軽減されるようになりました。MIXI でもいくつかのプロダクトのデータを新しいサイトへ移行しました。サイトを分けることで当然柔軟性が増えます。個別にアドオン契約やゲスト招待ができ、製品管理者に権限を渡すことで、一定のカスタマイズが可能になりました。

## 2024年2月
この時期に Atlassian Cloud の日本リージョンが新規に登場したようです。これまではデータレジデンシーをアジア太平洋（シンガポール）リージョンで運用していましたが、この変更によりさらにレスポンスの向上やメンテナンス時間の最適化が期待されました。しかし、「予想ダウンタイム時間：24時間以上」と表示され、MIXI では変更を断念しました。土日を含めて稼働している事業が多く、1日以上使えなくなることは厳しい状況でした。代わりに、新規で作成するサイトは日本リージョンで固定しています。


## 2024年5月
ラスベガスで開催された Atlassian の年次カンファレンス「Team'24」に参加しました。久しぶりの海外出張と言語の壁で不安はありましたが、現地で他の参加者や企業との交流のおかげで有意義な時間を過ごせました。日本にいてもある程度の情報は入手できますが、実際の利用者や企業の熱量を直に感じ取るにはこういったイベントに直接参加するのが最も効果的だと思います。

https://note.com/ishunshu/n/n0f09afabd2b3

## 2024年6月
会社で利用している Jira/Confluence の一部サイトで Atlassian Intelligence 機能を有効にしました。このAI機能は2023年から提供されていましたが、社内の法務審査や利用ガイドラインの調整に時間がかかり、利用開始がこの時期になりました。社内でも注目されており、業務効率化を図りたいと考えている部門からの相談もありました。有効化直後は利用者が多かったものの、執筆時点でのMAUは全体の1割未満であり、利用の定着や促進に課題が残っています。

## 2024年7月
ACE Tokyo のイベントには過去に何度も参加しましたが、ホスト企業としてイベントを主催したのは初めてです。スポンサー企業や社内メンバーの協力もあり、当日に30名ほどの来訪者をスムーズに迎え入れることができました。アフターコロナでイベントが活性化しており、自社開催を通じてノウハウを得られたのは良い経験となりました。

https://note.com/ishunshu/n/nd8b6a61de4ae

## 2024年9月
Atlassian と Okta 連携特有の不具合として、漢字氏名が逆に表示される問題がありました。SCIMプロビジョニングで正しいユーザー情報をマッピングしているにもかかわらず、SSOログイン時に逆転してしまうという悲しいバグでしたが、[対策](https://jira.atlassian.com/browse/ACCESS-747) が可能になりました。手順に従ってOkta側の情報を更新する "Force sync" を実行したところ、Atlassian側のレートリミット制限が発生し、一部のユーザーが更新できなかったため、複数回の対応が必要でした。


## 2024年10月
「[Atlassian Rovo](https://www.atlassian.com/software/rovo)」についての情報が増え、話題になりました。MIXI でも代理店から機能紹介やデモンストレーションを受けました。サードパーティ SaaS も含めた情報の横断検索機能は便利ですが、検索の精度や重み付けなど、Atlassian側でどのように情報をインデックス化しているのかが今後の追加情報に期待しています。

## 2024年11月
Atlassian Cloud Enterprise に作成できるサイト数に150の上限が設定されました。この変更自体は2023年10月頃に行われたようですが、私がその変更を知ったのはしばらく後で、改めてAtlassian側に公式な説明を求めたのがこの時期です。Atlassianも営利企業なのでこういった方針転換も一定理解できますが、無制限のサイト作成ができることもCloud Enterpriseに移行した判断ポイントの一つだったため、MIXIとしては運用方法を変えなくてはならない点が残念です。

## 2024年12月
リックソフト主催、アトラシアン社協賛の『アトラシアンクラウドへの移行-AIで加速するクラウドの未来を体験-』イベントで登壇し、MIXIの Atlassian Cloud 移行事例を紹介させていただきました。

当社では Cloud 移行してからもうすぐ3年が経とうとしています。移行ネタをいつまで擦ってよいか悩みましたが、まだまだ Cloud 移行の需要は多いようで、参加者からも多くのポジティブな反応をいただけました。いつか Cloud 移行した企業の担当者で座談会を開くのを楽しみにしています。


https://speakerdeck.com/mixi_engineers/behind-mixis-migration-to-atlassian-cloud



## そして、2025年
来年はどのような変化があるのか楽しみです。それでは皆さん、良いお年を！
ネットで見つけた”3Dグラフ”コンポーネント

この投稿は Delphi Advent Calendar 2024 の22日目の記事です。

# はじめに

何年か前に受けた案件で３Ｄグラフ表示する必要があり見つけたものです。
当初、TChartの製品版を購入し使用と思ったのですが、ActiveXとなっているようなので、ちょっとどうしようかと探していたら見つけました。
できれば、Ｅｘｅに組み込んだ形で実装できないかとネットで調べていたら見つけたものです。
英語オンリーのサイトで、日本語しかできない身としては大変だったのですがＷｅｂの翻訳機能を駆使しながら発注し使用しました。
コンポーネント使用のサンプルのコードも付属し、使いやすかったので紹介したいとおもいます。
価格もTChart Proと同程度です。

# サイト

サイトはこちらになります
http://www.lohninger.com/sdlindex.html

こちらで3Dグラフのサンプルが落とせます。
http://www.lohninger.com/plot3d.html

# Delphi新バージョンへの対応
QuickReport製品版のように、Delphiのバージョンが上がる都度、対応したパッケージをダウンロードできるようにしてくれています。

こちらのページにも、「私たちは一般に、ソフトウェア開発者には顧客をサポートする義務があると考えています。したがって、当社は開発製品 (SDL Component Suite Standard Plus Edition および SDL Component Suite Professional Edition) の全存続期間中、無制限のアップデートを提供します。」と書かれています。

http://www.lohninger.com/updatepol.html

もちろん、Delphi12対応版もダウンロードできています。

# おわりに

3Dグラフしか使用したことはまだないですが、ほかにも面白うそうなコンポーネントがあるようです。
英語であればメールのやりとりもできます（実績あり）
Ethereumのガス代について調べてみる

# はじめに

この記事は、Ethereum Advent Calendar 2024 の7日目の記事となります。

先日、実験中にウォレットのEthereumが不足しており、一連のトランザクションの途中までのガス代５０００円近くが一瞬で消える事案が発生しまして、あちゃーめちゃ高いじゃん・・、となりました。
そこでEthereumのガス代について調べてみる、初心者の記事です。

# ChatGPT先生に聞いてみる

![スクリーンショット 2024-12-17 20.19.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/99ff451d-aaa7-09ee-fe8b-1ab6b20bac36.png)

![スクリーンショット 2024-12-17 20.19.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/a9babd0d-bcd3-8143-b4c0-269c7d24ed7f.png)

https://ethereum.org/ja/gas/

>イーサリアムのネットワーク手数料は、ガスと呼ばれます。
>ガスは、イーサリアムを動かす燃料です。
・・・
>北米が眠っている時間帯にイーサリアムを使用すると一般的に安くなります。
・・・
>ガス価格は、イーサリアムの混雑状況に応じて12秒ごとに変動します。 
>ガス価格が高い場合、トランザクションを行う前にほんの数分待つだけで、支払う金額が大幅に下がることがあります。

そうだったのか！

>![スクリーンショット 2024-12-17 20.28.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/e2d3e719-b718-fc9d-b5a0-8b54629eab58.png)

スワップはやっぱり高価だったんだ。

https://www.cryptact.com/blog/ETH-gas-price

>![スクリーンショット 2024-12-17 20.30.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/c52b85ac-1964-9b01-2fc6-544eb43b665c.png)

>![スクリーンショット 2024-12-17 20.31.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/f22d4ae9-6cc8-025c-1ba4-a4d2117c3326.png)

土日は比較的安いのかな？

https://beaconcha.in/gasnow

![スクリーンショット 2024-12-17 20.35.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1032713/61169082-3b08-3542-13e2-90d797fb853a.png)

636って安い時の30倍以上じゃ・・怖。

実験は土日の日本時間の昼間ねらいということでしょうかね。
有識者の方々コメントいただけると嬉しいです。

以上、Ethereumのガス代について調べてみるでした。
初心者向け！ネットワーク接続方式の特徴まとめ


#### はじめに

ネットワーク接続方式には「イーサネット」や「Wi-Fi」「4G／5G」など様々ありますが、いざ「それって何なの？」と聞かれると上手に説明できない・・・、なんてことありませんか？

そこで、私たちが目にすることの多いネットワーク接続方式の特徴をかなりざっくり箇条書きでまとめましたので、これを見て分かったつもりになってもらえたら・・・またこれを更なる学習のきっかけにしてもらえると嬉しいです！

#### ネットワーク接続方式の説明　

#### ①イーサネット(Ethernet)

  - 用途: 主にローカルエリアネットワーク（LAN）で使用される有線接続【脚注1】
  - 特徴:
    - 高速・安定したデータ転送
    - 信頼性が高く、ビジネス環境に最適
    - 不正アクセスのリスクが低く、安全性が高い
  - デメリット:
    - 有線なので移動範囲が制限される
    - ケーブルの劣化に注意が必要
  - セキュリティ:
    - 物理的な接続ポートへの不正アクセスの可能性あり
    - LANケーブルの改造にも注意が必要

#### ②Wi-Fi【脚注2】

  - 用途: 家庭、オフィス、公共の場所でワイヤレス接続
  - 特徴:
    - ケーブル不要でネットワークに接続
    - 複数デバイスを同時に接続可能
    - 柔軟性とモビリティを提供
  - デメリット:
    - 障害物や信号干渉で速度が遅くなる
    - イーサネットより信頼性が低い
  - セキュリティ:
    - Wi-Fiオープンネットワーク【脚注3】では通信の暗号化がされていないことが多い
    - 公共Wi-Fiに接続する際はVPN利用を推奨

#### ③Bluetooth

  - 用途: 周辺機器（ヘッドフォン、イヤホン、キーボードなど）との接続
  - 特徴:
    - 通信距離は機器の性能や環境によって大きく異なる（一般的な使用で数m～数十m程度）【脚注4】
    - ケーブルなしでデバイス間接続
    - 大規模ネットワークには向かず、個人用デバイス間の通信に最適
  - デメリット:
    - 有線に比べ通信が不安定で、通信距離が短い
  - セキュリティ:
    - 誰でも簡単に接続可能、他ユーザー等による意図しない接続のリスクあり
    - 使用しない場合はOFFにし、デバイス名に個人情報を含めない

#### ④光ファイバー

  - 用途: 長距離通信、インターネットバックボーン、データセンター接続
  - 特徴:
    - 超高速で高信頼性の通信
    - 光信号でデータを送信、銅線よりも信頼性が高い
  - デメリット:
    - 実装コストが高い
  - セキュリティ:
    - 特別な対策は不要だが、一般的なインターネット接続と同様のセキュリティ対策が必要

#### ⑤セルラー接続 (4G/5G)

  - 用途: モバイルデバイス（スマートフォン）でインターネット接続
  - 特徴:
    - どこからでもインターネットアクセス可能
    - 4G/5Gで高速通信
  - デメリット:
    - ネットワークカバレッジにより速度や信頼性が異なる
  - セキュリティ:
    - インターネット接続と同様のリスクあり
    - アンチウィルスソフトやデバイス認証機能で不正アクセスを防止

#### 最後に

今回かなりざっくりと特徴をまとめているため、例えば「イーサネットはLANで使われる通信規格の一つで他にはTCP/IPがうんぬんかんぬん・・・」みたいな詳しいことは書いておりません。何となく特徴が分かってもらえたら幸いです。
また冒頭でも話しましたが、これを機にそれぞれの通信の仕組みなども調べてみると「なるほど、こうなってたのか～」とまた一つ詳しくなれて面白いと思います！！ではまた！！



**【脚注1】** LAN (Local Area Network): 地理的に限定されたエリア（家庭やオフィスなど）内で接続できるネットワーク。
**【脚注2】** Wi-Fi: 「IEEE 802.11」規格を満たす無線LANのこと。家庭やオフィスなどで利用される一般的なワイヤレス通信技術。
**【脚注3】** Wi-Fiオープンネットワーク: 空港やカフェ、駅や図書館などで無料でアカウントの登録も要せずに誰でも利用できるWi-Fiのことです。
**【脚注4】** Bluetoothの通信距離: Bluetoothには送信出力の強さによって複数の種類（Class）があり、使用する機器同士の性能や環境条件（壁や障害物の有無など）によって実際の通信距離は大きく変わります。
SBOMレポーティングサービス始めました！？

## はじめに

[SRA Advent Calendar 2024](https://qiita.com/advent-calendar/2024/sra)の19日目です。  
関西事業部の南部です。

毎年毎年くどいですが、可能な限り誕生日の本日(12/19)に記事を書くようにして8年。48歳になりました。  
今回は、SBOMレポーティングサービスなるものを始められそうになってきたので、プロモーションも兼ねて記事を書いてみました。  

## SBOMとは

[昨年の記事](https://qiita.com/buta_suneo/items/38e10e280be523251f5b)にもあるとおり、Software Bill of Materialsの頭文字をとったもので、ソフトウェア部品表を意味し、ソフトウェアを構成するコンポーネントやそれらの依存関係、ライセンス情報などを含めた一覧表になります。  
よく食料品におけるどんな原材料で構成されているか表した食品の原材料表示に例えられますし、弊社ウェビナーでもそういう説明をしています。  

ChatGPTに聞くと、  

> SBOM（Software Bill of Materials）は、ソフトウェア製品に含まれるすべてのコンポーネント、ライブラリ、モジュール、依存関係などの詳細をリストアップしたものです。SBOMは、ソフトウェア開発や運用において次のような目的で使用されます。   
    1. **透明性の向上**: ソフトウェアに含まれるすべてのコンポーネントを明確にすることで、透明性を確保します。  
    2. **セキュリティの向上**: 使用されているコンポーネントの脆弱性を特定し、迅速に対応することができます。  
    3. **コンプライアンス**: ライセンスや法的な要件を遵守するために必要な情報を提供します。  
    4. **メンテナンスの効率化**: ソフトウェアの更新やバグ修正を行う際に、影響を受ける可能性のあるコンポーネントを特定するのに役立ちます。  
  SBOMは、ソフトウェア開発者、運用担当者、セキュリティ専門家など、さまざまなステークホルダーにとって重要なツールです。例えば、あるソフトウェアに脆弱性が発見された場合、SBOMを使って影響を受けるコンポーネントを特定し、迅速に対策を講じることができます。

と当たり障りのない回答でした。

## なぜ、SBOMを作成するのか？  

SBOM作成は脆弱性対応の第一歩、入口だと考えます。  
Log4jの時のように脆弱性が検出されたOSSが自分達が作ったソフトウェアの中にあるかないかを迅速に見つけだすためにもOSS、コンポーネントがまとまっているSBOMは非常に役に立つと思います。  
ましてや、EUサイバー・レジリエンス法（CRA）では、脆弱性が発見された場合、24時間以内に報告する必要があります。  
OSを含んだ製品の場合、OSに含まれる何百ものOSS、コンポーネントの中から対象があるのか確認が必要になるため、日頃からSBOMを最新化し、OSS、コンポーネントを把握して迅速に対応出来るようにしておく必要があると考えます。

## SBOMを作成する範囲は？

弊社ウェビナー参加者との打合せの中で、よく聞かれる質問が"SBOMを作成する範囲"があります。  
経産省の手引きでもあまり明確にどの範囲まで作成することが必要との記載がなく、明確化しなさいよとあるため、いろいろ悩むかと思いますが、私はSBOMを作成する範囲＝責任を持たないといけない範囲だと考えています。  
例えば、Windows上で動くソフトウェアを作成した場合は、そのパッケージを対象としたSBOMを準備しておけばいいと思いますし、OSを含んだ製品を製造した場合は、製品に含まれているソフトウェア(OS含む)を対象としたSBOMの準備が必要だと考えます。  

## そしてサービス化へ

私がSBOM管理環境構築に携わったところでも、OSを含んだ製品を製造するため、OS部分のSBOMを作成しようと取り組みました。  
そのため、OSに含まれているOSSの一覧を作成し、SCAツールでスキャンするためソースコードを集めようとしました。
しかし、ソースコードの収集はものすごく大変でした。また、ソースコードが見つからないものもありました。
そのため、ソースコードの収集は断念。代わりにOSのパッケージ管理情報からSBOMを作成出来ないかと考え、そのSBOM作成環境を構築することが出来ました。  
その経験を活かし、他にも同じ苦労している人がいれば、お役に立てないか(~~儲かるのでは~~)と考え、昨年度から事業部内にワーキンググループを発足。今年度も活動を継続する中で、ツールを作成し、サービスとして提供できる下地を作成するに至りました。

## おわりに

ようやく形が見えてきたばかりのサービスで、これからの方向性も模索状態なサービスです。  
これからの活動の中で、成長していければと思っています。  
乞うご期待ください。

## 参考URL

- [SBOM管理に取り組んでみた](https://qiita.com/buta_suneo/items/38e10e280be523251f5b)
- [SBOMの専門家から見た いま時点のSBOM](https://qiita.com/AyumiWatanabe/items/d2124e2588882930288c)
- [サイバー攻撃への備えを！「SBOM」（ソフトウェア部品構成表）を活用してソフトウェアの脆弱性を管理する具体的手法についての改訂手引を策定しました](https://www.meti.go.jp/press/2024/08/20240829001/20240829001.html)
- [SRA SBOMセミナー](https://www2.sra.co.jp/event_seminar/seminar2024/240729.html)
DjangoでHello Wolrdを表示するまで

前回の作業

https://qiita.com/ruruchan_nanodesu/items/c8077a0d32a2768b5684

---

### 1. 前提条件

カレントディレクトリがyourprojectであること、画像のようなファイル構成であることを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1386677/cf378bda-c1e0-47bf-8d62-9bc9f90f347c.png)

### 2.アプリを作成する

terminalで以下のコマンドを入力します。
なおyourappには任意のアプリ名を入れていください。

```
python manage.py startapp yourapp
```

下の画像のようにyourappというフォルダが作成されたことを確認してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1386677/0ad7c9ff-0d0c-918a-f170-d9ca850c9b04.png)

### 3.作成したアプリをプロジェクトに紐づける

プロジェクトファイルの中からsettings.pyをしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1386677/17db12c7-0da7-2d5b-3957-7f13ead59787.png)
32行目のINSTALLED_APPSに先ほど作成したアプリ名を追加します。

```
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'yourapp'   #追加部分
]
```

次に、おなじくプロジェクトフォルダからurls.pyを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1386677/474dacdb-e94a-4be8-495e-4fd6dbc360db.png)

下のようにコードを追加してください。
また、現時点ではyourapp.urlsに警告が表示される場合もありますが無視してください。

```python
from django.contrib import admin
from django.urls import path, include #追加部分

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('yourapp.urls')),  #追加部分
]
```

アプリフォルダにurls.pyというファイルを新しく作成してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1386677/64d4da10-6e52-c47e-9dfa-ad89cbb5089d.png)

urls.pyファイルに下の内容を追加してください。

```pytho:yourapp\urls.py
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
```

最後に、Hello Worldを表示する画面を作ります。
まず、views.pyを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1386677/a4bee2a0-bc5d-d808-fa91-1a879fee3bac.png)

以下のようにコードを追加します。

```python:views.py
from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello, world.")
```

---
次の作業

https://qiita.com/ruruchan_nanodesu/items/2ea694c7f37623dd285a
GitLabとAmazon Q Developer連携がすごい！AWS re:Invent 2024で発表された開発者体験の革新的な進化をまとめてみた

# GitLabとAmazon Q Developer連携がすごい！AWS re:Invent 2024で発表された開発者体験の革新的な進化をまとめてみた

https://youtu.be/zmdDgkL2pzI

https://youtu.be/I4-gMXA3Pa4

AWS re:Invent 2024のセッション「GitLab & Amazon Q Developer for a next-level developer experience」と「GitLab Duo with Amazon Q: AI-driven DevSecOps for your SDLC」を見たので、革新的だと感じた内容をまとめてみました。

## そもそもなぜこの連携が必要なのか

最近の開発現場って本当に大変ですよね。Gartnerの調査によると、開発者が実際にコードを書いている時間って1日1時間もないんだそう。週に4-5時間程度しかコーディングできていないって衝撃的です。

さらに驚いたのが、開発者の54%が14個以上のツールを使っているという調査結果。これは本当に身につまされます。自分も日々いろんなツールを行ったり来たりしていて、本来の開発作業に集中できていないなぁと感じていたところでした。

## Amazon Q DeveloperとGitLabの連携で何ができるようになるの？

GitLabのSelf-managed UltimateかDedicatedを使っているユーザーなら、以下の3つの機能が使えるようになります：

### 1. Feature Dev Agent
これが個人的に一番ワクワクする機能です。GitLabのイシューで `/q dev` って打つだけで、AIが理解して実装までやってくれます。

実際のデモを見てたんですが、例えばサインアップフォームを作って欲しいってイシューを書くと、プロジェクトの文脈を理解した上でコードを生成してくれるんです。しかも、インラインでコメントを書けば、その場で修正もしてくれる。

コードにオープンソースのものが含まれてたら、ちゃんと教えてくれるのも良いですね。安全面でも安心です。

### 2. Transformation Agent - これは地味に便利かも
古いJavaプロジェクトのアップグレードって、誰もやりたがらない作業ですよね。でも `/q transform` って打つだけで、Java 8/11からJava 17への移行を自動でやってくれます。

特に面白かったのが、大規模なプロジェクトでも非同期で処理してくれて、変換計画も事前に見せてくれるところ。.NETにも対応予定とのことで、レガシーコード改善の救世主になりそうな予感。

### 3. AIコードレビュー
これまでのAIコードレビューとちょっと違うなと感じたのが、GitLabの文脈を完全に理解した上でレビューしてくれる点。`/q review` でレビューを始めて、問題があったら `/q fix` で修正案まで出してくれます。

## 実際どうなの？

デモを見ていて印象的だったのが、これらの機能がGitLabの既存のワークフローにすごく自然に統合されている点です。無理やりAIを押し込んだ感じがなくて、普段の開発フローがより効率的になった感じ。

特に良いなと思ったのが：
- イシューからマージリクエストまでの一貫性
- チーム全員で文脈が共有できる
- 変更履歴が完全に追跡可能
- セキュリティチェックもちゃんとしている

## まとめ

正直、見ていて「これは開発の仕方が変わるな」と思いました。特に若手エンジニアにとっては、どんどん効率的に開発できるようになりそうです。

現時点ではプレビュー版なので、完璧とは言えないかもしれませんが、GitLab Self-managed UltimateかDedicatedを使っているチームなら、試してみる価値は絶対にあると思います。

個人的には、この手のAI機能って「本当に使えるのかな？」って懐疑的だったんですが、実際のデモを見てかなり印象が変わりました。これ、本気で開発者の生産性上がりそうです。

みなさんも使ってみたら、感想教えてください！

---

※この記事は AWS re:Invent 2024 のセッションを視聴してまとめたものです。実際の使用感については、プレビュー版がリリースされ次第、詳しくレポートしたいと思います。
【supabase auth】ログイン時にエラーページに飛ばされる

# はじめに
以下のハンズオンでNext.js環境でのsupabase authを試していたところエラーが出たので記事にします。

https://youtu.be/Z_9EpoGXH8k?si=KxRB3ezHu5thaMWu

# 問題
supabase authでログイン時にエラーページに飛ばされる。
コンソールにエラーログ出してみると以下が表示される。
```
Error [AuthApiError]: Email not confirmed
```


# 原因
認証のemailを使い捨てのメアド作成サイトで作っていたのですが、そこでsignupした後にアドレスの確認(?)をしていなかったみたいでそれでエラーが出てたみたいです。作成したアドレスでsignupした際に「Confirm Your Signup」という通知が来るのでそこから確認すればなおるはずです。

https://sute.jp/inbox

(ただログイン時に303のエラー(?)コードが出ているので後ほど調べてみます)

# おわりに
参考にしていた動画と異なりturbopackでプロジェクトを作っていたのでディレクトリ構成が問題なのかと色々いじっていて解決に時間がかかってしまいました。最初にコンソールでエラーログ出して確認するべきでした。