koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

厄日だったAWS Summit Japan 2025 1日目

AWS Summit自体は良いイベントでした。厄かったのは完全に個人の事情です。

去る2025年6月25日はAWS Summit Japan 2025の1日目だった。リモートワーク下で普段遠出をほとんどしない人間が2時間程度かけて幕張メッセに移動する一大イベントである。

しかしその日が厄かった。

やるせないので記事にして気晴らしする。

とは言え、出来事としては2つ。

  1. 何か携帯回線の速度制限されていた感がある
  2. 社用PCのディスプレイが割れた
  • 何か携帯回線の速度制限されていた感がある
  • 社用PCのディスプレイが割れた
  • 後日談
    • 回線
    • PC
続きを読む

生成AIに工数を入力させるのが局地的に流行っていた

生成AIにブラウジング結果を渡して入力してもらったり、生成AIにGoogleカレンダー予定を元に工数入力するツールを作ってもらったり、シンクロニシティという奴だろうか?

僕は勤怠ツールへの工数入力は前月分をまとめて月初に付けている。この作業は100%の集中力で行えば5~10分程度で済むのだけれど、まったく集中できないので毎月15~30分程度かかっている。

一般的にはこの工数入力は毎日実績を入れるものであると考えられるのだけれど、不思議なことに周囲には僕と同じように月初にまとめて入力している人が多い。これもまた不思議なことに集中できない人も多いようだ。

そんな状況下で「生成AIにGoogleカレンダー予定を元に工数入力するツールを作ってもらいました」とか言っている人がいた。

唐突に生えたリポジトリのREADME

自動化は便利だと思いつつ、僕はカレンダー予定すら破滅しているので使えない。

前々から一定の規則で工数入力するツールがあれば便利だと思ってはいたので「僕も生成AIに作ってもらうか」という気になって他の作業をしつつ2,3時間程度かけて作ってもらった。

GitHub Copilot Agentに作ってもらっている様子(Claude 3.7 Sonnet)

結果、これからは2分程度で工数入力できそう。ラッキー。

言語指定とかはしなかったけれど「まぁJavaScriptで生えるやろ」と思っていたら、実際そうなった。

一応、試す前に「APIちゃんと叩いてくれました?」「仕様を入力したら行けました」程度の会話はあった。気がする。

いずれにしても、Web上で公開されているAPI仕様のHTMLを保存してコンテキストに与えたら「APIちゃんと叩いてくれた」。これに関しては僕がAPIドキュメントを眺めて実装するより明らかに早い。すごい。

他にも生成AIに勤怠ツールをブラウジングした結果を渡して工数入力している動画がSlackに放流されている様子を観測もしているので「生成AIに工数を入力させるのが局地的に流行っているなぁ」と思った次第。

Laravel LighthouseのGraphQLをOpenTelemetryトレース

LaravelLighthouseを使ってGraphQLサーバをホスティングしている。

Mackerelでトレーシング機能が提供されてから「そのうちトレースしよう」と思っていたのだけれど、ついにやったとこ重い腰を上げてトレースを送った。

Laravel本体には自動計装ライブラリがあるが、Lighthouseにはないので何となくGraphQLの処理の具合を見られるようにしたのでメモっておく。

OpenTelemetryは色々従うべき仕様や推奨される実装があるっぽいが、その辺を読み込んでいると年が明けるので「何となくGraphQLの処理の具合を見られる」が満たされれば良しとした。

三者に提供するライブラリではない場合はこのくらいでよいのが気楽だ。

Lighthouseにはトレース用の仕組みが用意されているので、OpenTelemetryでのTrace用のSpanを構築するDriverを実装して使うようにした。

結果、何となくGraphQLの処理の具合を見られるようになった。

なんとなくトレースできてる様子


PHP、Laravelのトレースはできている前提で、LaravelがロードするService ProviderにNuwave\Lighthouse\Tracing\TracingServiceProvider::classを追加、config/lighthouse.phpに実装したDriverを使用するように設定すればよい。

lighthouse/src/lighthouse.php at d9fb0ee2f00c52dd7af0d3ecff073b9fb9c95d87 · nuwave/lighthouse · GitHub

<?php declare(strict_types=1);
// config/lighthouse.php にトレース向けのドライバを設定

return [
    // ~ 略 ~
    'tracing' => [
        'driver' => App\GraphQL\OTelTracing::class,
    ],
];

実装にあたっての参考はこの辺り。

※追記: Subscriptionを使っているとhandleStartRequestが呼ばれずにexecutionされるパスがあるようで、そうするとエラーするスニペットになっている(後で直すかも)

<?php

namespace App\GraphQL;

use Illuminate\Support\Carbon;
use Nuwave\Lighthouse\Events\BuildExtensionsResponse;
use Nuwave\Lighthouse\Events\StartExecution;
use Nuwave\Lighthouse\Events\StartRequest;
use Nuwave\Lighthouse\Execution\ExtensionsResponse;
use Nuwave\Lighthouse\Execution\ResolveInfo;
use Nuwave\Lighthouse\Tracing\Tracing;
use Nuwave\Lighthouse\Tracing\TracingUtilities;

use OpenTelemetry\API\Globals;
use OpenTelemetry\API\Trace\SpanInterface;
use OpenTelemetry\API\Trace\SpanKind;
use OpenTelemetry\API\Trace\TracerInterface;
use OpenTelemetry\SemConv\TraceAttributes;

class OTelTracing implements Tracing
{
    use TracingUtilities;
    private TracerInterface $tracer;
    private SpanInterface $rootSpan;
    private StartRequest $startRequest;
    private int|float $executionStartPrecise;
    private float $executionStartUnixtime;

    public function handleStartRequest(StartRequest $startRequest): void
    {
        $this->startRequest = $startRequest;
        $this->executionStartPrecise = $this->timestamp();
        $this->executionStartUnixtime = microtime(true);
        $tracerProvider = Globals::tracerProvider();
        $this->tracer = $tracerProvider->getTracer('graphql-server');
    }

    public function handleStartExecution(StartExecution $startExecution): void
    {
        $this->rootSpan = $this->tracer
            ->spanBuilder("GraphQL Execution")
            ->setSpanKind(SpanKind::KIND_INTERNAL)
            ->setAttributes([
                TraceAttributes::GRAPHQL_OPERATION_NAME => $startExecution->operationName,
                TraceAttributes::GRAPHQL_DOCUMENT => $this->startRequest->request->getContent(),
            ])
            ->startSpan();
    }

    public function handleBuildExtensionsResponse(BuildExtensionsResponse $buildExtensionsResponse): ?ExtensionsResponse
    {
        $this->rootSpan->end();
        return null;
    }

    public function record(ResolveInfo $resolveInfo, float|int $start, float|int $end): void
    {
        // 10ms以下は間引いておく
        if ($this->diffTimeInNanoseconds($start, $end) < 10 * 1000 + 1000) {
            return;
        }
        $this->tracer
            ->spanBuilder("GraphQL Resolver")
            ->addLink($this->rootSpan->getContext())
            ->setSpanKind(SpanKind::KIND_INTERNAL)
            ->setAttributes([
                'graphql.resolver' => $resolveInfo->parentType . '#' . $resolveInfo->fieldName,
            ])
            ->setStartTimestamp($this->toNano($this->executionStartUnixtime) + $this->diffTimeInNanoseconds($this->executionStartPrecise, $start))
            ->startSpan()
            ->end($this->toNano($this->executionStartUnixtime) + $this->diffTimeInNanoseconds($this->executionStartPrecise, $end));
    }

    private function toNano(float $value): int
    {
        return (int) ($value * 1000 * 1000 * 1000);
    }
}

増税のスピード感がマイブーム

ここ数日、自分の仕事がヌルいと感じたら「減税のスピード感になってないか? 増税で行け!」と発破をかけるムーブメントが発生している。

2025年初頭の日本では、減税の段取りはステークホルダーとの調整が遅々として進まないのに対して、増税のそれは爆速で進んでいる。スゴい。

自分の仕事と増税の仕事を比較してヌルいと感じるとマジでイラつくので、発破効果はかなり高い。

飽きるまでは増税のスピード感を意識して仕事をして行きたいと思っている。

なお、このことをチームの定例で喋ったらまあまあ呆れられた。それはそう。我ながらアホかと思う。多分来週には飽きてるんじゃないかな。しかし、万が一位には刺さる人がいるかも知れないので移動の暇つぶしに記事にした次第。

即断即決「増税のスピード感に勝つぞ!!」

CloudWatchメトリクスの歩き方

この記事は「はてなエンジニア Advent Calendar 2024」の33日目向けに書きました。

↓これ。

昨日は id:tkzwtks さんのNext.jsでNEXT_PUBLICプレフィクスの環境変数をできるだけ避ける - たきざわの日記でした。恐らくもうしばらく続くかと思います。

年末年始は体調を崩して寝ていたり、ゲームをしたり、プラモを組んだりしていて記事のネタを仕込む暇がなかったので、比較的最近いくつか困りやハマりどころがあったAWSAmazon CloudWatchのメトリクスの見方をまとめて年を明けることにした。これ自体はそのうち書こうと思っていたので丁度良いきっかけになったと思う。

AWSのマネージドサービスを使っていると、そのサービスの状況を知るのにCloudWatchのメトリクスを見ることを避けては通れない。普段はMackerelのAWSインテグレーションでメトリクスを眺めて過ごしているのだけれど、それでもまぁCloudWatchで見たい場面は出てくる。この際、どう見るべきだと捉えているか、どう見ているか、気をつけたい点をかえりみた。

  • メトリクスの見方
  • CloudWatchメトリクスの歩き方
  • 気をつけポイント
    • グラフの表示期間を広くした際のAverage, Sum, Count値の変化
    • 原点が0じゃないことがある
  • 軽く〆
続きを読む

DQ3HD2Dで最も気に入らない要素、冒険感の毀損

DQ3HD2Dへの不満点は多々あるのだけれど、リメイクに当たっての冒険感の毀損が最も気に入らない。

グラフィック、特にダンジョンの雰囲気は非常に良いのだけれど、そう言った良い要素を打ち消して有り余る体験の悪さがとにかく気に入らなかった。

冒険感の棄損は無数にあるけれど、その中でも特に気に入らないことを書き出すことで気晴らしにしたい。

  • まどろみから抜けた瞬間
  • ラーミア
  • 光の玉
  • アイテムのばら撒き、父の形見
  • まとめ
続きを読む