Carpe Diem

備忘録

LLMのプロンプト

概要 LLMにおけるプロンプトの構成要素を理解して扱うことで 期待通りの回答を得られる(精度が高くなる) なぜTemplateはこの書き方をするのかが分かる なぜagent_scratchpadのような変数がいるのかが分かる といったようになります。 プロンプト 構成要素 …

LlamaIndexでPDFに対してベクトル検索を行う

概要 LlamaIndexを使うと非常に簡単にRAG(Retrieval-Augmented Generation)を使った検索システムを作ることができます。 今回はLLMにない情報(PDF)をベクトル化して検索できる方法を紹介します。 環境 python 3.11.8 streamlit 1.31.1 llama-index 0.10.14…

VS CodeのPython環境をDev Containersで構築する

概要 PythonはGoと違ってライブラリのdeprecatedや破壊的変更が多いため、環境やライブラリバージョンの固定が非常に重要です。 Dev Containers poetry 仮想環境(venvなど、今回はpoetryのvirtualenv) を使うことで、それらを固定してチーム内で安定した開発…

GKE Ingressのヘルスチェック生成ルール

概要 GKE Ingressを使うとGCE LBのヘルスチェックが自動的に作成されますが、一定のルールがあります。 これらを理解していないと期待しないヘルスチェックが作成され、疎通ができなかったりするのでまとめておきます。 生成ルール GKE Ingressは次の流れで…

Function callingのJSON Schemaをpydanticで生成する

背景 Function callingでJSONを定義する際はJSON Schemaを用いますが、JSON Schemaは覚えることが多く不慣れだと非常に扱いにくいです。 pydnaticを使うとクラス定義から簡単にJSON Schemaを生成できるので、PythonでJSON Schemaを利用する際はおすすめです…

pyenvからインストールする際にSSLがないというエラー

背景 pyenvでpython 3.10.13をインストールしようとしたところ、次のようなエラーを受けました。 $ pyenv install 3.10.13 python-build: use openssl@1.1 from homebrew python-build: use readline from homebrew Downloading Python-3.10.13.tar.xz... ->…

tmuxでコピーモードを使った時にDeepLに渡されてしまう

背景 tmuxでコピーモードで範囲選択によるコピー機能をよく使っていますが、そこでコピーしたものがそのままDeepLの翻訳の方へ渡されてしまう問題に悩まされてました。 今は有料版なのでコピーしたものが学習データに使われることはありませんが、偶にDeepL…

ChatGPTのオプトアウト申請方法(2023/10以降版)

概要 WebコンソールのChatGPTでは入力したデータを学習させない方法として2種類のやり方が提供されています。 設定からChatの履歴を保持しないようにする フォームでオプトアウト申請を行う 前者は簡単にできる一方で、Chatの履歴が使えず不便になります。 …

Backstage でGitHub Orgを用いた認可を導入する

概要 christina04.hatenablog.com ではGitHubのIDを持っていればログインできる認証機能を追加しました。 今回は「そのGitHubアカウントが特定のGitHub Organizationに所属しているかどうか」を使ってページを閲覧できるかどうか認可する仕組みを導入します…

Backstage でGitHub認証を導入する

概要 Backstageに認証機能を導入します。 Backstageでは様々な認証方法を提供していますが、今回はGitHubを使った認証を実装します。 環境 backstage v1.21.1 認証 GitHub Authentication Provider | Backstage Software Catalog and Developer Platform に…

2023年買ってよかったものリスト

概要 年の瀬なので2023年に買ってよかったものを挙げてきます。 SESAMEタッチ & オープンセンサー 2021年買ってよかったものリスト - Carpe Diem でも紹介したスマートロックで 指紋認証 ICカード認証 に対応したデバイスがリリースされました。 【New】SESA…

Backstage をローカルで動かす

概要 前回紹介したBackstageをローカルで使うための説明です。 開発者ポータル Backstage とは - Carpe Diem 環境 backstage v1.21.1 yarn v1.22.19 Get Started とりあえず起動してみる アプリケーション作成 以下のコマンドでアプリケーションを作成できま…

VSZ, RSS(anonymous, file)の理解を深める

背景 KubernetesでPodがOOM Killされた際には以下のようなログが発生します。 Memory cgroup out of memory: Kill process 9130 (XXXX) score 1592 or sacrifice child Killed process 9130 (XXXX) total-vm:423008kB, anon-rss:122484kB, file-rss:33792kB,…

開発者ポータル Backstage とは

背景 開発チームが抱えるよくある課題として システムが変化する一方でドキュメントは更新されず腐る メンバーの流入出によって口伝でかろうじて継承された知見も失われる 検索性が良くないと過去のドキュメントが気づかれず、同じような内容のドキュメント…

二重サブミットを防ぐ方法

背景 支払い処理などで問題になりがちな二重サブミット問題(Double Posting Problem)ですが、主に以下のようなケースで発生します。 ボタンのダブルクリック ユーザが間違えて2回ボタンを触ってしまう(ときには遅さにイライラして何度もクリック) リク…

GraphQLのメリット

背景 GraphQLでよく挙がるメリットとして以下があります。 RESTful APIと違って都度UIに依存したAPI設計をする必要がない マルチデバイス対応サービスにおいて大きなメリット オーバーフェッチを避けることができる Switchなどデバイス制約が多いクライアン…

DockerでMySQLのクエリログを見れるようにする

背景 GraphQLでN+1になってないかを確認したいときに、スロークエリだけでなく全てのクエリログを見たくなったのでその設定方法を説明します。 Dockerコンテナの中に直接入って見る方法 Dockerログに吐き出す方法 の2通りで説明します。 環境 macOS 13.6 Do…

IngressとGCPロードバランサーの命名規則

背景 Kubernetes Ingressで作成されたGCPロードバランサー周りのコンポーネントは k8s2-um-xxx k8s2-rm-xxx k8s2-tp-xxx k8s-be-xxx など色々あり、どれが何を表しているのか分かりづらかったのでまとめます。 命名規則とコンポーネント 命名規則とコンポー…

BigQueryのパーティション分割テーブル、日付別テーブル

概要 BigQueryにおける分割テーブルは パーティション分割テーブル 大きな1つのテーブル 日付別テーブル(レガシー) 複数テーブル の大きく2種類あり、さらにパーティション分割テーブルは 取り込み時間による分割 時間単位カラムによる分割 整数範囲によ…

Node.jsでGraceful Shutdown

概要 christina04.hatenablog.com のNode.js版です。 環境 Node.js v18.18.0 TypeScript v5.2.2 Express v4.18.2 課題 次のようなアプリケーションコードがあった際に import type { Express, Request, Response } from "express"; import express from "exp…

IstioやEnvoyで発生するネットワーク系エラー

背景 マイクロサービス環境でIstio(Envoy sidecar)を使っていると、いくつかのエラーに遭遇します。 それぞれどういった状況で発生しているエラーなのかを区別できないと、適切な対応にならないため各種エラーをまとめます。 環境 Envoy 1.22.0 Go 1.21 構成…

ログで機密情報をマスキングする方法

背景 DBのconfigのように一部機密情報が含まれるものを環境変数(k8s Secret等)で注入することは多いです。 そしてその環境変数がちゃんと設定されているか起動時にログを吐きたいということもよくあります。 一方で type Config struct { Addr string Port i…

DeepLのChrome拡張機能を使ってるとGitHubのページ内検索で表示崩れが起きる

背景 最近GitHubでページ内検索を使ってると、たまに次のような表示崩れが発生します。 スクロールしても前のコードがずっとそこに残っています。 このときのコンソールログとしては決まって次のエラーで、 content.js:1 Uncaught DOMException: Failed to e…

KubernetesでPodを複数のZoneに分散させる

概要 Podの冗長化をする上でマルチゾーン構成にしたい場合 Pod Topology Spread Constraints | Kubernetes 上記のPod Topology Spread Constraintsを使うと実現できます。 環境 Kubernetes v1.24 Pod Topology Spread Constraints Pod Topology Spread Const…

http.ResponseWriterに書き込んだstatus codeを取得したい

Go

背景 5xx系エラーをbugsnagのようなエラー検知サービスに送信したい middleware層で網羅的に対応したい といった際に、 http.ResponseWriterに書き込まれたstatus codeは直接アクセスできない という問題があります。 今回はこの問題を解決する方法を紹介し…

go-redisのtimeoutで気をつけること

概要 Go言語でRedisを使う際に選択肢に挙がるのがgo-redisです。 今回はgo-redisでTimeoutを設定する際に注意すべきことをまとめました。 手前味噌ですがBlast Radius of Failureを最小にするためにTimeoutを短くすることを1つのテクニックとしても紹介して…

macOSでiptablesのように特定の通信をブロックする

概要 iptablesで特定のポートへのパケットをドロップしたい場合は次のようなコマンドを実行します。 $ sudo iptables -A INPUT -p tcp -d 127.0.0.1 --dport 8080 -j DROP しかしmacOSではiptablesは無いためこれができません。 なのでiptablesではなくpfを…

Go + Alpine でtzdataはapk addしなくていい

背景 Alpine Linuxはデフォルトではtzdataが含まれていないため、以下のような package main import ( "log" "time" ) func main() { loc, err := time.LoadLocation("Asia/Tokyo") if err != nil { log.Fatal("%w", err) } log.Printf("%v", loc) } time.Lo…

GoでYAMLファイルを読み込んだ時にデフォルト値を設定したい

背景 christina04.hatenablog.com のように設定ファイルをYAMLで管理するパターンは良くありますが、設定項目が増えるほど運用つらくなるので、あまり弄らない項目に対してはデフォルトを用意し、値がなければそれを設定したいケースがあります。 イメージと…

OpenTelemetry Collectorでデータを一元的に管理する

概要 OpenTelemetryでは直接ExportせずにCollectorと呼ばれるProxyを挟むことで以下のことが可能になります。 アプリケーションコードでExport先を意識しなくて済み、ベンダーロックインを避けることができる データを一元的に管理できる アプリケーションや…