🗺️集計と検索が中心のアプリでデータ層を Firestore から Postgres(Neon)へ移行した記録
地図上に文学作品を紐づけるアーカイブアプリのデータ層を、Firestore から Postgres(Neon)+ Drizzle へ移行した経緯を整理しました。読み取り課金で詰まった原因と、集計・ファセット・全文検索というワークロードの形から見た向き不向きについて書いています。
地図上に文学作品を紐づけるアーカイブアプリのデータ層を、Firestore から Postgres(Neon)+ Drizzle へ移行した経緯を整理しました。読み取り課金で詰まった原因と、集計・ファセット・全文検索というワークロードの形から見た向き不向きについて書いています。
Next.js (output: 'export') を Vercel から GitHub Pages にデプロイ先を移し、Vercel 側は vercel.json の redirects で全 URL を新ドメインに 308 転送して SEO 集約を狙った際、framework 自動検出と trailing slash 周りで複数回ハマった経緯と、最終的に動作した設定をまとめます
Next.js 16 + next-intl 構成の Web アプリで、本番ビルドのみ useRouter().push() が無音で no-op になり、検索ページの対話操作が一通り機能しなくなる事象を観測した記録。history.pushState + popstate による回避策と切り分けの過程をまとめます

S3互換ストレージ DDN EXAScaler Access S3 で、特定バケットへのアップロード専用の最小権限アクセスキーをバケットポリシーで用意した記録です。AWS とのポリシー書式の違いと、署名・権限まわりの切り分け手順をまとめました。

時代で変わる地名を結びつけ、世界中の歴史データを連携させる基盤 World Historical Gazetteer。中核となるデータ形式 Linked Places Format(GeoJSON-T)と、Wikidata/GeoNamesとの名寄せの仕組みを技術的な観点を中心に解説します。

古代ローマ帝国の交通網をネットワークとしてモデル化し、2地点間の移動を「時間・費用・距離」で計算する Stanford ORBIS。経路探索の仕組みと、季節の風を織り込んだ海路モデルを技術的な観点を中心に解説します。

戦争で拿捕された船から押収され、英国の文書館に眠っていたオランダ語の手紙。これを原文忠実翻刻と詳細メタデータで言語コーパス化した Sailing Letters / Brieven als Buit プロジェクトを、データ構築の技術的観点を中心に解説します。

ヴェネツィア共和国の公文書を機械学習で読み解き「過去のビッグデータ」を作ろうとした Venice Time Machine。スキャン・手書き文字認識・グラフ化という技術パイプラインと、2019年に表面化したデータ品質問題を、技術的な観点を中心に解説します。

Tropy 1.18.0-beta.1 のプロジェクトファイル (.tpy / .tropy) は実体が SQLite データベースで、内蔵 HTTP API も使えます。Node スクリプトから両方を網羅的に検証して、見つかった 2 つの不具合を upstream に PR / Issue として送るまでの記録です。
TEI/XML 形式の古典文書コーパスを対象としたベクター検索 RAG に、LLM が問いを見て道具を自動で選ぶ Router Agent を導入した記録。8 ツール構成の設計、構造化データとベクター検索の相補性、そして実装で踏んだ 5 つの罠 (Cloudflare Workers 3 MiB 上限・Azure OpenAI URL pattern・JSON_CONTAINS の盲点・reasoning モデルの multi-turn 問題・TPM ボトルネック) を記録します。

IIIF Presentation API 3.0 マニフェストの検証を、公式 presentation-validator と Python ライブラリ iiif-prezi3 の 2 つで実施し、両者の出力の違いと使い分けをまとめました。

Mirador 3向けに公開していたレイヤースライドショープラグインを、Mirador 4 に対応させました。nwb から Vite へのビルド移行や Material-UI v4 から MUI v7 への置き換えなどを行いました。

IIIFの動画に空間・時間の両方の注釈をつけられる Mirador 4 プラグイン Mirador Annotation Editor Video を、デモ環境を題材に、時間ターゲットの指定までハンズオンで解説します。

IIIF画像ビューア Mirador 4 に注釈の作成・編集機能を追加するプラグイン Mirador Annotation Editor を、デモ環境を題材に、注釈作成から書き出しまでハンズオンで解説します。
TEI/XML を扱うときに登場する ODD・XSLT・Processing Model の3つを、最小限の例で役割ごとに整理します。スキーマ定義・変換・描画宣言という別レイヤーの関係を初心者向けに説明します。
図書館の蔵書横断検索サービス「カーリル」が、search と polling の組み合わせで結果を段階的に取得していることを、公開されている unitrad-ui のソースコードを読んで確かめた記録です。

IIIF画像にW3C Web Annotation形式で意味的注釈をつけるオープンソースツールIMMARKUSを、東京大学デジタルアーカイブの百鬼夜行図を題材に、初回操作から標準形式での書き出しまでハンズオンで解説します。

Word文書のTEI/XML変換と、TEI/XMLファイルの可視化を、インストール不要・ブラウザだけで行えるツール「TEI Tools」を、サンプルファイルを使ったハンズオン形式で紹介します。
Mac App Store に提出した TEI Scanner が、審査を通過したのに App Store に表示されず『配信から削除されました』と出ていました。原因は配信地域(App Availability)が一度も設定されていなかったことです。App Store Connect API で症状を切り分け、v2 の appAvailabilities エンドポイントで配信地域を後追い設定するまでの記録です。
Developer ID 配布まで扱った macOS アプリ TEI Scanner を、Mac App Store にも提出して審査を通過させた記録です。App Store Connect API による .pkg アップロード、App Sandbox の有効化、APP_DESKTOP スクリーンショット、filter[platform]=MAC_OS など、iOS 向けの提出フローとの差分を中心にまとめます。

Dependabot のアラートをきっかけに、既知の CVE 対応だけでなく、maintainer 乗っ取り型のサプライチェーン攻撃まで意識した自動化設定を組み直しました。cooldown、Actions の SHA pin、npm overrides、ignore-scripts、security update のみ auto-merge までを 1 セットでまとめます。
IAM Identity Center (SSO) を採用しない環境で、aws-vault と macOS Keychain を使い ~/.aws/credentials の平文管理を避ける運用と、その実用性について整理します。
暫定ミラー codh-mirror について、前回記事では『認証・保存バックエンドは結局動かない』としていたところを、後から方針転換して Firebase 認証と JSONkeeper 互換 API (Cloudflare Workers + D1 / PythonAnywhere の二系統) を実際に動かすまでの記録です。Authorized domains 設定、FirebaseUI 3.x の signInFlow リダイレクト落とし穴、authFirebase.js の差し替え、Curation Manager の外部リンク相対化、5 箇所の curationJsonExportUrl 書き換えなど、codh-mirror リポジトリ側で行った変更を 1 本にまとめます。
IIIF Curation Viewer のキュレーション保存先である JSONkeeper を、もとの Flask 実装ではなく Cloudflare Workers + D1 で書き直した記録です。Hono + jose による Firebase ID トークンの検証 (Admin SDK 不要・サービスアカウント鍵不要)、D1 SQLite スキーマ設計、JSON-LD @id 書き換えのトップレベル+ネストノード対応、Activity Stream の最小実装、CORS と Viewer 互換ヘッダ、wrangler によるデプロイ runbook、そしてアップストリーム JSONkeeper との差分一覧までを 1 本にまとめています。
IIIF Curation Viewer の保存先 (JSONkeeper, Flask) を PythonAnywhere 無料プラン (Beginner) に自前で立てる手順記録です。ブラウザ操作はトークン発行とコンソールアタッチの 2 回だけに抑え、残りすべてを HTTP API + curl で完結させます。Flask 1.0 / apscheduler 3.5 の現代 Python 非互換、Firebase Admin SDK のサービスアカウント鍵運用、CPU 100 秒/日制約、CORS、Viewer 側 (codh-mirror) の差し替えまで一通り。
朝鮮司譯院刊『清語老乞大』巻之一・第一葉表を題材に、TEI 標準要素のみで縦書き版面(満州文字+ハングル音注+諺解の割書)を符号化し、XSLT 1.0 で HTML + SVG として可視化したデモを構築しました。データと可視化を分離した設計の考え方、列の切り出し方、満州文字の描画方法、影印・XML・HTML を 3 列で並べる対比ビューを記録します。

字幕も音声もないツール操作デモ動画に、画面のフレームを Claude Code に確認させて日本語字幕(SRT)を作成し、YouTube Data API の captions.insert で一括アップロードする手順をまとめます。

Hugo から Next.js (Cloudflare Workers + OpenNext) へ移行した個人技術ブログに、Stripe ベースのメンバーシップ機能を載せた際の構成・実装手順・ハマりどころを記録します。Workers Free plan の CPU 制限との戦い、Stripe SDK の Workers 対応、SSG と動的ゲーティングの両立、本番化フォームの日本固有項目など、公式ドキュメントには断片的にしか書かれていない部分を中心に整理しました。

自サイトに暫定ミラーした vdiff.js を、サイト内の他ページのデザインに揃える形で外側からカスタマイズした記録です。デフォルト比較モードを「左右スライダー」に変える際、JS でラジオボタンをクリックする方法は vdiff の初期化タイミングと競合したため、最終的にミニファイ済みバンドルへの 1 バイトパッチに落ち着きました。あわせて、フッタを画面内に保ったまま画像をクリップするレイアウト、ja/en 切替、ダークモード対応の CSS の組み立て方をまとめます。
ROIS-DS 人文学オープンデータ共同利用センター (CODH) のホームページが長期メンテナンス中(2026年2月16日夕方よりサービス停止、再開時期未定)の間、各種ツール (vdiff.js / IIIF Curation Viewer / そあん / 等) を Wayback Machine 等から復元し、独立した GitHub Pages リポジトリ (codh-mirror) として公開する手順と、その過程で踏んだいくつかの落とし穴 (とくに『そあん』の kuromoji 辞書欠落) をまとめます。あくまで CODH のサービス再開までの暫定対応です。
Nuxt 2 + target:'static' のサイトに、外部ツールのデモアプリ一式を `static/<ツール名>/index.html` として埋め込んだら、generate の crawler が 404 アプリシェルでそれを上書きする現象に遭遇しました。原因と回避策(generate.exclude)、そして同時に踏んだ旧 @nuxtjs/pwa 由来の Service Worker キャッシュ退役対応をまとめます。
ROIS-DS 人文学オープンデータ共同利用センター (CODH) のホームページが長期メンテナンス中(2026年2月16日夕方よりサービス停止、再開時期未定)で、デジタル源氏物語の「パタパタ顔比較」(CODH の vdiff.js を呼び出していた)が動かなくなっていたため、Wayback Machine から vdiff.js の配布物を取り出して自サイト側に暫定ミラーを置いた手順をまとめます。あくまで CODH のサービス再開までの暫定対応です。
macOS の Vision フレームワークで OCR をかけ、フォルダ内の複数画像から 1 つの TEI/XML を生成するデスクトップアプリ TEI Scanner を開発しました。SwiftUI 実装、xcodegen でのプロジェクト管理、App Store Connect API キーによる Notarization、GitHub Releases での .dmg 配布までを記録します。

JavaScriptで動く旧暦・潮汐計算ツールと、Pythonで動く漂流シミュレーションを、GeoJSONを介して接続する方法の記録。

NASA OSCARの月別気候値とNCEP/NCARの再解析風データを使い、奄美名瀬港沖からの漂流を月別にシミュレーションした記録。
IIIF 3D Viewer を IIIF 3D Technical Specification Group が公開している Presentation API 4 のドラフト形式 (Scene / PointSelector / WKTSelector / PerspectiveCamera) に揃えました。Presentation 3 + 独自 3DSelector / camPos 拡張で運用してきた既存マニフェストは、ランタイムで v4 に変換する converter を通すことで処理系全体を v4 のみに統一しています。差分の整理、変換ルール、実装の要点をまとめます。

TEI/XMLで構造化された翻刻テキストから、巻ごとのページ数・行数・文字数・和歌数を集計する統計ページを生成し、GitHub Actionsで再ビルド・再公開まで自動化する仕組みを紹介します。

researchmapには公式の書き込みAPIとCSV/JSON/JSONLインポート機能が用意されていますが、個人ユーザーから見るとそれぞれ制約があります。本記事では選択肢を整理した上で、完全自動化とPDF添付に対応するPlaywrightスクリプトの実装を紹介します。
複数のWebサイトに対する複数のオペレーション(デプロイ・再インデックス・バックアップ等)を、YAML 1ファイルで定義し、非エンジニアの作業者がブラウザから実行できる管理コンソールの設計を整理しました。
複数のデータベースサイトを運用する組織で、非エンジニアの作業者がデプロイ・データ更新を自分でトリガーできる管理コンソールを構築した記録です。GitHub App認証とCloudflare Access (Zero Trust) を組み合わせ、PATやOAuth Appとは何が違うのかを整理しました。
Drupal の Automatic Updates モジュールを入れていればセキュリティ更新が自動で当たると思い込んでいたら、cron 中の自動適用ポリシー Unattended background updates がデフォルトで無効になっていて何もしていませんでした。有効化して 10.6.3 から 10.6.7 への自動適用が動き出すまでと、その際に出る『公式サポート対象外』警告についての記録です。
Singapore Geo Block 適用後に HK/VN/ID/DE へ pivot された経緯と、Geo allowlist + Tencent/Alibaba ASN ベースの IPSet に切り替えた記録
ElevenLabs の Voice Cloning と v3 モデルを使い、自分の声を学習させた合成音声で日本語の技術記事を朗読させる実験を行いました。同一原稿で v2 / v3 を比較した A/B サンプルと、運用上の観察を記録します。
IIIF Presentation 3 で OCR テキストを `motivation: "supplementing"` のアノテーションとして配信したら、Annona など他の viewer では出るのに Mirador 4.0.0 (projectmirador.org/embed) の Annotations タブだけ空、という現象に遭遇しました。実際に配信されている Mirador bundle を読み解いた結果、`config.annotations.filteredMotivations` のリリース版デフォルトが `['oa:commenting', 'oa:tagging', 'sc:painting', 'commenting', 'tagging']` で `supplementing` を許可していないことが判明しました。`['commenting', 'supplementing']` の配列で両対応する方法と、関連する仕様・Cookbook recipe の正しい参照を整理します。
未公開 / 限定公開の歴史写真を、IIIF 規格に準拠した形でアクセス制御付きで配信するアーカイブシステムの構築記録。Cantaloupe(IIIF サーバ)+ S3 互換ストレージ + Elasticsearch(検索)+ Next.js(UI)+ Cloudflare Tunnel + Access という構成で、一般公開できない画像であっても IIIF の利点(規格準拠の高解像度ビューア / manifest 配信)を許可されたメンバー範囲内で享受できる仕組みを設計しました。外部システムからの相互運用には IIIF Auth API 2.0 への拡張が必要となる点も整理しています。
調整さん(chouseisan.com)の出欠回答を Playwright で自動入力し、◯/△/× の判定は Google カレンダーと照合して Claude Code(claude.ai Google Calendar MCP 経由)に任せる構成を作成した記録です。fetch / fill / submit の3段階に分け、判定ルールは CLAUDE.md に記述する形にしました。

酉蓮社(旧増上寺報恩蔵)所蔵の嘉興版大蔵経のうち『大般若波羅蜜多經』巻571〜575(IIIF経由で取得した105画像)に対して、国立国会図書館のNDL古典籍OCR-Liteと Cloud Vision API DOCUMENT_TEXT_DETECTION を並べて適用し、それぞれの出力に現れた誤りの傾向を観測した記録です。NDLは仮名混入の誤検出が12頁、VisionはカラースケールやIIIF添付要素(蔵書ラベル等)の混入が105頁全てで発生しました。

EC2上でDocker稼働させていたCantaloupeを、AWS Lambda + CloudFrontベースの serverless-iiif(Samvera)に移行した際の調査と作業の記録です。
Nuxt 2 + @nuxtjs/pwa で運用していた SPA を別フレームワークへ移行した直後に、返ってくる HTML が古いまま固まる事象に遭遇しました。原因は旧 Service Worker の cache-first 戦略で、kill-switch SW を同じ URL に上書き配信して退役させた手順をまとめます。
自分の管理外(外部組織)の DNS にあるサブドメインを Cloudflare Workers のカスタムドメインに割り当てたかったものの、Cloudflare Free プランは外部サブドメインを zone として受け入れない制約に行き当たり、最終的に AWS CloudFront + WAF を前段に挟む構成で解決した記録です。
運営する文化アーカイブ系サイトに対するボットスクレイピングを、AWS WAFのGeo block・IPset・JA3 fingerprint・UA blockを段階的に組み合わせて遮断した記録です。
Docker + Traefik で運用中の複数サービスを、無停止で CloudFront + WAF の保護下に移行した実装記録。オリジン分離用サブドメインの命名、共有 SG の落とし穴、WAF を COUNT モードから始める判断、SPARQL/API のキャッシュ設計など、よく出る論点を一通り整理しました。
科研費の研究者番号(8桁)の先頭に1000を付けるだけで、CiNii ArticlesのURLが生成できます。大学の教員情報システムへの入力にも応用できます。
mdx.jp 上で動かした vLLM を Cloudflare Tunnel 経由で外部公開し、OpenAI 互換 API として利用できるようにした手順と注意点
mdx.jp の A100 40GB x2 サーバで LLM-jp-4-32b-a3b-thinking 公式版を動かし、Transformers の OOM から vLLM サーブへ切り替えた記録
MacBook Pro M4 Max 128GBでLLM-jp-4 8Bをローカル実行し、OllamaのOpenAI互換APIから利用した際の構成と実測をまとめる
Cloudflare Zero TrustのAccess機能を使い、SSHポートを閉じたままサーバに安全に接続する方法
AWS CLI v2でS3互換ストレージにアップロードするとx-amz-content-sha256エラーが出る問題の原因と対処法
Cloudflare Tunnelを使って、インバウンドポートを一切開けずにElasticsearchやCantaloupe(IIIF)を安全に公開する方法
ネームサーバとDNSの違い、ドメインの所有とネームサーバの関係、NS委任やレジストラ・レジストリの役割について解説
約1,800件の日本語テキストデータに対して、Elasticsearch・Cloudflare D1・Static JSONの3方式で検索性能を比較しました。
Vercel Proプランで運用していた組織向けNext.jsアプリをCloudflare Pagesに移行し、Vercelを無料のHobbyプランにダウングレードした記録です。
Next.js製のAPIサーバーをAWS Amplify(+WAF)からCloudflare Pagesに移行し、月額約$23のコストを$0にした手順を記録します。
rclone CLIを使って、Google Drive共有ドライブのフォルダごとの容量を階層的に調査し、不要ファイルを特定・削除する方法を紹介します。
写真から作った Avaturn アバター(GLB)に Mixamo の歩行アニメーションを適用する方法を3段階で解説。Blender 5.0 CLI での変換、Node.js での比較検証、Three.js ランタイムでのブラウザ完結型リターゲットまで、試行錯誤の記録。
AWS EC2上のCantaloupe IIIF画像サーバーで初回タイル取得に8秒かかっていた問題を、ピラミッドタイルTIFF変換・JVMヒープ増加・CloudFront導入によって0.84秒に改善した記録。
Next.js + React Three Fiber の 3D ビューアを @react-three/xr v6 で Meta Quest 対応にした記録。CameraRig が XR カメラを横取りする問題、useXRControllerLocomotion の callback vs ref 形式の落とし穴、Quest 実機デバッグの工夫など、ハマりポイントと解決策をまとめました。
ExcelJSのデータバリデーション機能を使い、別シートのデータをドロップダウンの選択肢として参照できるExcelテンプレートをNext.js APIルートで動的生成する方法を紹介します。
Docker環境のOmeka Sをバックアップする際に必要な、ボリューム・データベース・カスタムアセットの取得手順をまとめます。
IIIF 対応画像を江戸町家の VR 空間に原寸大で配置し、ブラウザや VR ヘッドセットで閲覧できる WebXR ビューアの開発記録。A-Frame + THREE.js による三人称カメラ、VRM アバター、タイル LOD など、WebXR 開発で遭遇した問題と解決策をまとめました。
国立国会図書館が公開する日本語OCR「NDLOCR-Lite」をCLIではなくPythonスクリプトからimportして呼び出す方法と、その際のハマりどころをまとめます。
YOLOv5の学習済みモデル(best.pt)をHugging Face HubにアップロードしてModel Cardを設定し、Gradio製のデモをSpacesにデプロイするまでの手順と、発生したトラブルの解決策をまとめます。
古典籍OCRアプリKotenOCRのAndroid版をFlutterで開発し、Kotlin Nativeへ移行した記録。パフォーマンスベンチマーク、API修正による18倍高速化、AI開発でのフレームワーク選定について。

IIIF Physical Dimensions serviceを利用して、Mirador 4のビューア上に実寸スケールのルーラーを表示するプラグインを開発・公開しました。
Geminiを使って3つのiOSアプリアイコンをフラットデザインからモダンiOS風(グラデーション+ソフトグロー)にリデザインした実践記録。プロンプトの改善過程と、生成後のトリミング処理も紹介します。
Zennで公開していた記事を自前ブログに移行する際、Playwrightと非公式APIを使って508記事の本文を移転通知に一括置換した記録です。

PaperModテーマからTailwind CSS v4ベースの独自Hugoテーマへの移行と、Hugo公式テーマギャラリーへの登録までの過程を記録します。

App Store審査でリジェクトされた後のビルド差し替え・スクリーンショット更新・再提出の全工程をApp Store Connect APIで実行した記録
Gemini・DALL-E・Midjourney等のAI画像生成ツールで、Apple HIGに準拠したiOSアプリアイコンを生成するための再利用可能なプロンプトテンプレートです。
ユーザーデータを外部に送信せず、Apple標準ツールとOSSだけでiOSアプリのクラッシュ計測・アナリティクス・アップデート促進・レビュー促進を実現する方法を、実際のApp Store公開アプリでの運用経験をもとに解説します。

ジャパンサーチのWeb APIを使い、モチーフ検索・撮影画像での類似検索・位置情報連動などモバイル固有の機能を備えた文化資源探索アプリの開発記録
デジタル延喜式の開発で、TEI XMLのスタンドオフ注釈をVue.js向けにインライン化する際に遭遇した文書構造崩壊のバグと、DOM操作ベースの解決策についての記録

YouTube StudioでVTT形式の字幕ファイルを元言語・翻訳言語それぞれアップロードして公開する手順を、スクリーンショット付きで整理した
IIIF Image APIに対応した高解像度画像をARKitで床面に実寸配置し、カメラ距離に応じてタイルを動的に読み込むiOSアプリ「IIIF AR」の開発についての記録です。
ONNX Runtimeで6モデルを使うiOS OCRアプリ(KotenOCR)で発生したクラッシュ率6.7%の原因調査と修正内容の記録。
KotenOCRの近代OCRモード(NDLOCR-Lite)で検出結果が重複する問題を修正。NMSの追加とline_*クラスフィルタリングにより、本家ndlocr-liteと同等の検出精度を実現しました。

Universal Viewer 4.xで発生する「Unknown content type」エラーの原因と、ローカルホスティングで解決した記録。

YouTube Studioで日本語字幕が設定済みの動画に、英語のVTTファイルを追加アップロードする手順
App Store Connect Sales Reports APIの日次レポート反映時刻とYouTube Data API v3のクォータリセット時刻を実際に観測した記録です。

Claude Codeのマルチモーダル機能とffmpegのシーンチェンジ検出を組み合わせて、動画に多言語字幕を効率的に生成し、IIIF v3マニフェストで公開する方法

デジタル源氏物語の機能紹介動画に日英の二言語字幕を付与し、IIIF v3マニフェストとして公開するプロジェクトの紹介

KotenOCR v1.3.0で、既存の古典籍(くずし字)OCRに加えて近代活字OCR(NDLOCR-Lite)に対応しました。確認画面でのワンタップ切り替え、認識処理の並列化による高速化などの変更点をまとめます。

X投稿・RSS・GitHub APIから情報を自動収集し、AIで週間まとめ記事を生成するシステムの設計と実装

iOSアプリのOCRパイプラインで、withThrowingTaskGroupによる認識処理の並列化を行い、検出領域数に応じて1.4〜6.7倍の高速化を得た記録。

ジャパンサーチの画像AI検索機能の内部APIを調査し、3段階のフローで画像アップロード検索が実現されている構造を確認

NDL古典籍OCR-Liteモデルをスマートフォンに載せて、完全オフラインでくずし字を認識するiOSアプリ「KotenOCR」を開発しました。技術構成や開発の背景を紹介します。

Yahoo Newsの記事と動画をローカルに保存する5つの手段(SingleFile、Playwright PDF、ArchiveBox、WARC、yt-dlp)を実際に試し、保存形式・ファイルサイズ・用途の違いを比較した

XCUITestでシミュレータのスクリーンショットを撮影し、PythonのPillowでマーケティング画像を生成、App Store Connect APIでアップロードするまでの全工程をシェルスクリプト1本で自動化する方法を解説します。

国立国会図書館サーチAPIから書誌データを取得し、LoRAにより小型日本語LLMをファインチューニングすることで、書名のみからNDC(日本十進分類法)の第1次区分を推定するモデルを構築する実践的チュートリアル。

researchmapでは科研費と業績の紐付けをAPI・CSVインポートで行えないため、Playwrightでブラウザ操作を自動化するスクリプトを作成した

Cantaloupe IIIFサーバーのキャッシュ設定とパラメータチューニングにより、タイル配信速度を最大7.6倍高速化した手法と効果を共有します。

Contentfulで多言語サイト構築中にPublishボタンがグレーアウトする問題の原因特定と解決方法。Management APIを使った調査手法も紹介。

Claude Codeのworktree機能とagentを活用して、Nuxt.js製のTEIビューアプロジェクトの6件のGitHub Issueを並行して対応した記録です。

Google Search Console で「クロール済み - インデックス未登録」が大量発生。schema.org 構造化データ(JSON-LD)の導入で改善を図った実践記録です。

ハンブルク大学forTextLabが開発したWebベースのテキストアノテーション・分析プラットフォームCATMAの機能と活用方法を紹介します。

Datawrapperは、チャート・地図・表を簡単に作成できるデータ可視化ツールです。20種類以上のチャートタイプやコロプレスマップに対応し、レスポンシブかつアクセシブルなビジュアライゼーションを提供します。

Flourishは、レースチャートやアニメーション地図などのインタラクティブなデータ可視化を作成できるプラットフォームです。30以上のテンプレートを備え、BBCやGoogleでも採用されています。

歴史的文書のクラウドソーシング翻刻プラットフォームFromThePageの概要と、DHにおける活用方法を紹介します。

デスクトップ版Gephiのブラウザ版であるGephi Liteを使ったネットワーク可視化の方法と、デジタル・ヒューマニティーズにおける実践的な活用例を解説する。

Hypothes.isは、W3C Web Annotation標準に準拠したオープンソースのアノテーションツールです。あらゆるWebページにハイライトやコメントを付けられ、教育・研究・ジャーナリズムの分野で活用されています。

世界最大のデジタルアーカイブであるInternet Archiveの概要と、デジタル・ヒューマニティーズにおける活用方法を紹介します。

Uber が開発した大規模地理空間データ可視化ツール Kepler.gl の概要と、デジタルヒューマニティーズにおける活用方法を紹介します。

Stanford大学・Harvard大学が開発するIIIF画像ビューア Mirador の概要と、デジタルアーカイブにおける比較研究への活用方法を紹介します。

D3.js作者Mike Bostockが開発したデータ分析・可視化ノートブックプラットフォームObservableの紹介と、DHにおける活用方法を解説します。

図書館・博物館・大学向けのデジタルコレクション管理・オンライン展示プラットフォームOmekaの概要と、Omeka SのLinked Data対応を含む実践的な活用法を解説する。

スタンフォード大学Humanities+Design Labが開発したデータ可視化ツールPalladioの機能と活用方法を紹介します。

ブラウザ上でCSV/TSVデータを30種類以上のチャートに変換できるノーコード可視化ツールRAWGraphsの使い方と、デジタル・ヒューマニティーズにおける活用法を解説する。

ReplayWeb.pageは、WARC/WACZ形式のWebアーカイブをブラウザ上で再生できるツールです。Service Workerを活用したクライアントサイド処理により、サーバー不要で動作します。

Knight Labが開発したStoryMapJSで、地図上のポイントを辿りながらストーリーを語るインタラクティブコンテンツの作り方を解説します。

無料のオープンソース質的データ分析ツール Taguette の概要と、デジタルヒューマニティーズにおけるテキスト分析への活用方法を紹介します。

TEI XML のデジタルエディションを出版するためのプラットフォーム TEI Publisher の概要と、デジタルヒューマニティーズにおける活用方法を紹介します。

Knight Labが開発したTimelineJSを使って、Googleスプレッドシートからインタラクティブな年表を作成する方法を解説します。

100以上の言語に対応するAIベースの手書き文字認識プラットフォームTranskribusの概要と、歴史文書のテキスト化におけるDH研究での活用法を紹介する。

IIIF 準拠のマルチメディアビューア Universal Viewer の概要と、デジタルアーカイブにおける活用方法を紹介します。

ワードクラウド、KWIC、共起分析、トピックモデリングなど多彩なテキスト分析機能をブラウザ上で提供するVoyant Toolsの使い方とDH研究での活用法を紹介する。

Wikidataの1億件以上のデータをSPARQLで検索・可視化できるWikidata Query Serviceの使い方を解説します。

TEI/XMLサイトをVercelで高速デプロイ:XSLT変換をsaxon-jsで自動化する

TETRAS-IIIFプロジェクトが開発するMirador 4向けエコシステム。アノテーション編集、動画対応、マルチユーザー協調を実現するプラグイン群を紹介。

IIIFの地理参照拡張に対応したビューアの紹介。歴史地図や画像を地図上にオーバーレイ表示。

IIIFビューアMiradorの紹介。マルチウィンドウでの画像比較、アノテーション、プラグイン拡張など。

軽量で高速なIIIFビューアTifyの紹介。モバイル対応、全文検索、目次表示など。

IIIFビューアUniversal Viewerの紹介。画像だけでなく音声・動画・3D・PDFにも対応した汎用ビューア。

MapLibre GL JS の DOM ベースカスタムマーカー(maplibregl.Marker)がズーム・パン操作時に地図から遅れて追従する問題の原因と、GeoJSON ソース + Circle/Symbol レイヤーによる根本的な解決方法を解説する。

Claude Codeの並列エージェント機能を使い、882本の技術ブログ記事から2キャラクター掛け合い解説動画を自動生成。利用制限の上位2%に到達した実体験レポート。

App Store Connect REST APIを使い、iOSアプリのアップデート版をビルド・アップロードから審査提出までコマンドラインで完結させる手順を解説する。

StoreKit 2とApp Store Connect APIを使い、iOSアプリにチップ(Tip Jar)機能を実装し、商品登録・ローカライズ・価格設定・スクリーンショットアップロード・TestFlight配信までをコマンドラインから完了させる手順を解説する。
Astro 4 から 5 へのアップグレードで必要だった変更点のまとめ

Chrome Headless モードの --screenshot で HTML を画像化する際、画面下部に白い帯が出る原因と、確実な解決方法を紹介します。

TEI/XMLのXSLT変換をsaxon-jsで自動化し、Vercelで高速にデプロイする方法。Node.jsのXSLTライブラリ3種の比較も。

Three.js と @pixiv/three-vrm を使ってヘッドレス Chrome 上で VRM モデルをアニメーションさせ、VOICEVOX のリップシンクと組み合わせて VTuber 風解説動画を自動生成するパイプラインの実装メモ。
DTS 1-alpha から 1.0 への移行で必要だった変更点を整理。JSON-LD Context URL、Content-Type、パラメータバリデーション、和歌 Citation Tree 対応など。

DTS Viewer で複数 Citation Tree の tree パラメータ対応、ナビゲーション結果の階層テーブル表示、mediaType パラメータによる XML ブラウザ表示を実装。

歴史資料をAIで検索できるRAGアプリを作った技術スタック

App Store Connect REST APIを使い、メタデータ・スクリーンショット・年齢レーティング・ビルド紐付けなど審査提出に必要なほぼ全作業をコマンドラインから完了させる手順を解説する。

CETEIcean を使って、TEI/XML 変換結果をブラウザ上で視覚的に確認できるプレビュー機能を追加しました。
TEI XMLのデジタル・ヒューマニティーズプロジェクトで、npx xslt3(Saxon-JS)からJava Saxon-HEへ切り替えたところ、XSLTビルド時間が1分48秒から23秒に短縮された。

ethers.jsのエラーメッセージを多言語化するライブラリ「ethers-i18n」の紹介

IIIF画像の一部領域にAI生成動画を重ねて表示する「IIIF Animated Viewer」の開発過程を紹介します。

はてなブログのAtomPub APIを使って、公開済み記事を一括で実質非公開にする方法

TEI Garage APIを使って、DOCX → TEI/XML 変換ツールをブラウザだけで作った

Hypothes.is APIでWebアノテーションをエクスポートしてTEI/XMLに変換する

OpenITI mARkdownからTEI XMLへの自動変換ツール「oitei」を試す

GakuNin RDM APIをNode.jsで操作する — プロジェクト作成からGitHub+Vercel自動デプロイまで

ethers.js v6 の日本語チュートリアルを作った

Annotoriousの描画モードがproduction buildでだけ壊れる

GakuNin RDM Search API (`/api/v1/search/`) 調査メモ

Google Workspace 管理者権限なしで Google Groups のメンバーを API で一括管理する

Archivematica における非DCメタデータの登録検証 ── source-metadata.csv を使ったEADの組み込み

AtoM REST APIによるデジタルアーカイブ構築の検証

AtoMのREST APIを拡張するプラグインを開発した話

AlfrescoをDockerで起動し、REST APIでレコード管理のライフサイクルを体験する

IIIFマニフェストを用いたテキスト比較ツールの開発

Drupal の GitHub Webhook モジュールを改善しました。

Netlify CLIを使って不要なサイトを一括削除する

Drupal 10 の管理画面からモジュール更新とコアアップデートを行う

Mirador 4 で外部マニフェストのウィンドウタイトルだけを差し替える

Next.js 15 で発生する `localStorage.getItem is not a function` エラーの原因と対処法

SPARQL クライアントを Apache Jena Fuseki に対応させるときにハマった 3 つのこと

Snorql — 複数の SPARQL エンドポイントを手軽に探索できるブラウザ UI を公開しました

Mirador ビューア埋め込み設定

Omeka SのIIIF Serverモジュールで、PLYファイルがIIIFマニフェストのitemsに出力されない問題の調査

3D Gaussian Splatting Viewer の開発 - Spark.jsを使ったブラウザ実装

3D点群データの世界:PLY、ガウシアンスプラッティング、Potreeの関係を整理する

KAKEN OpenSearch API の使い方

Three.js + React Three Fiber で GLTF モデルのテクスチャが荒く表示される問題と解決策

Nuxt Content + trailingSlash設定で静的ファイルへのリンクが404になる問題と解決策

IIIF Georeference ViewerへのLinked Places Format対応

Mirador 4用回転プラグインの開発とnpm公開

静的サイトでIIIF Content Search APIを実現する - Service Workerによるクライアントサイド検索

JavaScriptの演算子優先順位の罠 - Vercelビルドエラーの原因を探る

Sketchfab APIでGLBファイルをダウンロード・表示するWebアプリを作る

ODD編集Tips:その1

Next Auth (Auth.js v5) の本番環境で AUTH_URL が必須な理由

YOLOv11xモデルをHugging Faceに公開する

IIIF画像をWeb Tile Map Serviceで配信する

Nuxt 3 プロジェクトのパッケージ更新まとめ

IIIF Georeference to XYZ Tiles

Azure OpenAI Whisper + Speech Services で動画に英語字幕・音声を自動生成する

Eclipse EDCを使ったデータスペース入門 - ローカル環境でデータ交換フローを体験する

@elastic/react-search-ui を React 19 + Next.js 15.5 で使う方法

GLBファイルのDraco圧縮 - 87%のサイズ削減と精度への影響

300万点超の点群データをブラウザで快適に表示する - Potree LODビューアの構築

mirador-annotations を Mirador 4.x へ移行した記録

mirador-rotation-plugin 機能拡張

Next.js + next-auth で GakuNin RDM と OAuth2 連携する

【AWS Amplify】さくらのドメインでカスタムドメイン設定時にハマったポイント

Dydra JSON-LDシリアライゼーションの挙動と回避策

GakuNin RDM Waterbutler API でアップロードしたファイルの詳細画面に遷移する方法

Pinata V3 API グループ機能の実装ガイド

さくらレンタルサーバー Drupal 更新手順

IIIF Manifestから各巻の冒頭ページを抽出するツールを作成しました

CloudFront + App Runner で 404 エラーが発生する問題の調査記録

Nuxt 4 SSGでローカルJSONファイルを正しく読み込む方法

MapLibre GL JS + れきちず で多言語対応の歴史地図を実装する

TEI ODDによるIIIF対応ファクシミリ記述の制約設計

ODD Chain チュートリアル

TEI古典籍ビューワをカスタマイズして判読不能箇所(gap)を表示する

Mirador 4で任意の領域をハイライト表示する方法

Mirador 4でキャンバス指定と検索語ハイライトを同時に実現する方法

RAWGraphs 2.0 の日本語化

Next.js + next-intl での言語切り替え実装ガイド

vipsによるピラミダルタイルTIFF作成と圧縮方式の比較

アノテーション表示のパフォーマンス改善

傾いた文字のアノテーションとIIIF画像切り出し

Elasticsearch/OpenSearch クラスタ間のデータ移行ガイド

Docker + GitHub Actions デプロイ設定

360度動画・写真から歪みのないサムネイル画像を作成する方法

Insta360動画ファイルからGPS情報の有無を機械的に判別する方法

Deep Zoom画像を完全復元:タイル画像からBigTIFFへの変換技術

BDRC Tibetan OCR:チベット語OCRツールの紹介と実装事例

Cesium 1.135.0におけるマーカー位置ズレ問題と解決方法

Protoweb:90年代のインターネットを体験できるタイムマシン

OCFLによる長期デジタル保存の実践 - 入門ガイド

MacでHexエディタを使うなら「HexEd.it」:HxDの代替ツールガイド

DROIDで見つける隠れたファイル形式の問題:デジタル保存の必須ツール

自動遷移機能を持つIIIF画像座標エディタの開発

Odeuropa Visualization: SKOS語彙とSPARQLを活用した香りデータの可視化プラットフォーム

Omeka Sで独立した作者データベースを構築する方法

Leaflet-IIIFでのアノテーション座標変換の完全ガイド

Omeka-S Docker環境を別サーバーに移行する完全ガイド

RDFSとSHACLの使い分け:rangeとpropertyShapeの関係を理解する

GakuNin RDMとDydraを連携したRDFメタデータ管理システムの開発

Odeuropa Explorer の語彙階層構造を調査する

DydraへのAPI経由でのRDFデータ登録ガイド

TEI Processing Modelで実現する宣言的なマルチフォーマット変換

Miradorの表示方向を外部から制御する方法

Odeuropa:歴史的文献から匂いを抽出するLinked Dataの世界

Omeka-SのMroongaSearchモジュールで日本語全文検索を実現する

Azure OpenAI GPT-4 vs Document Intelligence: 日本語縦書きOCRの比較検証

LLMによる原稿用紙OCR性能比較:縦書き日本語の認識精度検証

PDFの透明テキスト抽出における順序保持の課題と解決策

TEI/XMLファイルをGitHubで公開する手順書

TEI ODDファイルのカスタマイゼーション:NDL古典籍OCRの事例

TEI GarageのAPIを使用したODDからRNG/HTMLへの変換

Azure Container AppsでNDL古典籍OCR Liteを用いたスケーラブルOCR処理システム

Omeka SにPROV-Oオントロジーを登録する方法

画像コレクション管理ツール 技術アーキテクチャ解説

IIIF Georeference ViewerのMapLibre GL移行と機能改善

Omeka Sテーマの多言語化

Cantaloupeでdelegate scriptを使ってAzure Storage上のファイルパスを動的に変換する方法

RELAX NGとSchematronを組み合わせたTEI XMLスキーマの実装ガイド

Docker環境でDrupal 10にWDBモジュールをセットアップする手順

生成AIを用いてプロジェクトに特化したrngファイルを作成する

Omeka S Docker の紹介:デジタルコレクションのための最新かつセキュアなソリューション

IIIF 3D Viewerを試作しました。

「前近代日本-アジア関係資料デジタルアーカイブ」のビューアを試す

Next.js 15対応 多言語・ダークモード対応SSGテンプレート

Next.js 15 で output: 'export' 使用時の sitemap.ts 実装方法

IIIF認証API 2.0の動作確認

GitHub File History Analyzerの紹介:ファイル編集履歴をAIで分析するツール

Odeuropaに関連するツールを試す

AllegroGraphを使ってみる

DHConvalidatorにおける'ref'に関する不具合への対応

校異源氏物語テキストDBに対する検索を行うMCPサーバの構築

校異源氏物語テキストDBに対する検索を行うAPIサーバの構築

Minecraft Modでお城生成コマンドを作ってみた【Fabric 1.21 + Claude活用】

デジタル文化財管理システム(試行版)のNFT対応

ブロックチェーンとPinata IPFSを使用したデジタル文化財管理システムの試作

Omeka SのIIIF Serverモジュールを使用した階層構造を持つ目次の記述

IIIF Presentation API v2のIIIFコレクションで、ページネーションを使う

Drupalで管理者以外のユーザーにも設定画面へのアクセスを許可する方法

NDL古典籍OCR-Liteを用いたアノテーション付きIIIFマニフェストファイルとTEI/XMLファイルの作成

DrupalでJSON形式のFieldを扱うための「JSON Field」モジュールを使用する

TEI/XMLファイルをS3互換のオブジェクトストレージでホストする

校異源氏物語テキストDBのDTS(Distributed Text Services) APIの更新

Dockerによるディスク圧迫の調査と対処法【Ubuntu 22.04 運用事例】

Annotorious v2のpolygonツールを使って、polylineを作成する

Elasticsearch Search UIでの初期ソート順の指定方法

MDX.jpのオブジェクトストレージに対するIPアドレス制限の実装方法

Google Cloud Vision APIとGakuNin RDMを用いたTEI/XMLファイル作成アプリの試作

「れきちず x Next.js」サイトにルートの登録機能を追加しました。

Nuxt i18nのブラウザ言語検出を無効化する方法

Next.js 15 App Router で Tailwind CSS V4 を使用してダークモードを追加する方法

Error: Do not use <img>. Use Image from 'next/image' instead.への対応

Mirador 4で、初期読み込み時に、画像の回転や範囲指定を行う

mdx Iのオブジェクトストレージに対するproxyサーバの構築

Next.jsでUniversal Viewerのnpmパッケージを使用する

GakuNin RDMのAPIを用いて、連携したストレージのファイルを検索する

LEAF WriterとGakuNin RDMを用いたTEI/XMLファイルの編集環境の試作

GakuNin RDM(OSF)のAPIで、フィルタを使う

Nuxt Content: Cannot find name 'queryContent'.への対応

AWSのRoute 53で設定したレコードを、さくらレンタルサーバで使用する(共有SSL)

Miradorで画像を表示し、CETEIceanでテキストを表示するサンプルアプリ

AtoM(Access to Memory)のAPIを使って、オブジェクトを登録してみる

AtoM(Access to Memory)をDockerで起動する

ピラミッドTIFFの作成において、ImageMagickがうまく動作しないケースがある?

mdx.jpのオブジェクトストレージとIIP Image(IIIF Image Server)を使ってIIIF画像を配信する

Algolia における「a に x を含み、b に y を含む」部分一致検索の調査

WordファイルをTEI XMLに変換する方法:TEIgarage APIの活用ガイ

Next.js + CETEIcean + React TEI Routerを使ったビューア開発

Next.js for Drupal の BASE_PATH 問題と修正方法(patch-package活用)

DrupalのJSON:APIを用いて、ユーザ名とパスワードでデータ登録を行う

Next.jsで多言語対応の静的サイトを構築する

大きな画像から部分画像の座標を取得する方法

vttファイルからTEI/XMLを作成する

Mirador 3の mirador-annotations プラグインで、付与したアノテーションをダウンロードする

Algoliaでページネーションの上限を変更する

異体字リストを取得するためのAPIの試作

Next 15(React 19 を使用)で、@react-three/fiberとdreiを使う

校異源氏物語に対する類似テキスト検索アプリを作成しました。

Omeka SのImage ServerでのCORS対応

Alfrescoのファイルに対して、Archivematicaを使ってAIPを作成する

Alfresco Governance Services Community Editionを起動する

XSLTを使いながらTEI/XMLファイルを編集する

DataverseのデータをArchivematicaで処理する

VSCodeとXSLTを用いたTEI/XMLのリアルタイムプレビュー

校異源氏物語テキストDBのTEI/XMLからPDFを作成する

@sidebase/nuxt-authのローカル認証を試す

NextAuth.jsを使ってDrupalのOAuthを利用する

Azure Logic Appsを試す

Azure OpenAI Assistants APIを用いたアプリをGradioとNext.jsで作成する

Pythonを使ってOmeka Sにメディアをアップロードする方法

Sketchfabのアノテーションを試す

objファイルをgltf, glbファイルに変換する

aleph-r3fを試す

Cantaloupe: Microsoft Azure Blob Storageに格納した画像を配信する

Azureの仮想マシンを用いたNDLOCRのGradioアプリ構築

Nuxt3と@sidebase/nuxt-authを使って、GakuNin RDMの認証を行う

Azure OpenAIとLlamaIndexとGradioを用いたRAG型チャットの作成

「教科書の中の源氏物語LOD」を使ってみる

Peripleoを試す

インターネット上で公開されているCSVファイルのための簡易ビューアを開発しました

NDL古典籍OCR-Liteを用いたGradio Appを作成しました。

ジオコーディングのライブラリを試す

mdx.jpのオブジェクトストレージに保存したIIIFマニフェストファイルをNestJSから利用する

LLMに関するメモ

openai-assistants-quickstartの微修正

NextAuth.jsを使って、ORCID・The Open Science Framework・ GakuNin RDMの認証を行う

YOLOv11xと日本古典籍くずし字データセットを用いた文字の検出モデルの構築

mdx.jpを用いてYOLOv11のクラス分類(くずし字認識)の学習を試す

mdx.jpの1GPUパックとOllamaを使ってローカルLLMを実行する

Google Cloud Vision APIを用いて、単一ページから構成される透明テキスト付きPDFを作成する

ZoteroのAPIをNext.jsから使う

LEAF WriterのEditor Toolbarをカスタマイズする

GakuNin RDM APIをつかってみる

ShExCとShExJの違い

ShExとSHACLの違い

@samvera/rampビューアのFiles/Markersタブの使用方法

Omeka SのOAI-PMHリポジトリのresumptionTokenの不具合への対応

(非標準)Omeka SのOAI-PMH RepositoryモジュールでDeleteレコードを出力してみる

iiif-prezi3を使って、動画に目次を付与する

iiif-prezi3を使って、動画に字幕を設定する

iiif-prezi3を使って、動画にアノテーションを付与する

Next.jsでアンダースコアから始まるURLセグメントを利用する

@elastic/search-uiのsetFilterの不具合対応

rico-converterを試す

Hugging Face SpacesとYOLOv5モデル(顔コレデータセットで学習済み)を使った推論アプリの構築

ModuleNotFoundError: No module named 'huggingface_hub.utils._errors'対応

pythonを使ってcvatのデータを操作する

Omeka SでのCSRF: Value is required and can’t be emptyエラーへの対応

Drupalのカスタムモジュールで、カスタム権限を使用する

校異源氏物語テキストDBで公開するTEI/XMLファイルに対するDTS APIのGitHubリポジトリ

校異源氏物語テキストDBで公開するTEI/XMLファイルに対するDTS APIを作成する

DTS(Distributed Text Services)を使ってみる

MyCapytainライブラリを試す

Canonical Text Serviceを試す

IIIF Presentation API v3でsvgを使ったアノテーション記述

GUIE(Google Universal Image Embedding)の学習済みモデルを使用して類似画像検索を行う

Annotorious OpenSeadragon Pluginを使ったサンプルプログラム

Drupalでフィールド単位で公開・非公開を設定する

画像ファイルに対してGoogle Cloud Visionを適用して、IIIFマニフェストおよびTEI/XMLファイルを作成する

Omeka Sの更新

Pythonを使ってRDFデータをDydraに登録する

OpenAIでストレージ内のすべてのファイルを削除する

nuxt3-leafletで、指定したマーカーを前面に表示する

LEAF Writer: Miradorを追加する

concurrent.futures.process.BrokenProcessPoolへの対処

Node.jsを使って、JSON:APIに準拠しているかを検証する

virtual-museum-tour-threejsを試す

Omeka SのOaiPmhリポジトリモジュールにおいて、アイテムが公開されいているサイトページのURLを取得する

DrupalのREST APIを使って、複数のコンテンツを一括削除する

音声資料に関するIIIFマニフェストファイルに画像を追加する

IIIF Audio/Visual: 複数のvttファイルを記述する

ZoteroのAPIとStreamlitを使ったアプリ開発

字幕付きの音声ファイルをIIIFビューアで表示する

mdx.jpのオブジェクトストレージに複数ファイルをアップロードする

国立国会図書館 歴史的音源で公開されている音声をmp4に変換する

Rampをカスタマイズする

Rampをローカルで起動する

Mirador 3でScroll Viewを使う

Traefikでhttpsにリダイレクトさせる

Chromeでサイズが大きい動画が再生できない

Omeka SのSetEnv APPLICATION_ENVのproductionとdevelopmentの違い

TraefikでHTTPS化した複数コンテナを運用する

Omeka S GoogleAnalyticsモジュールの不具合対応

Amazon S3とRoute 53を使ってリダイレクトする

Docker版のOmeka SでCORS対応を行う

Omeka SのIIIF ServerモジュールでのCORSエラー

LEAF Writer:スキーマのカスタマイズ

Google スプレッドシート + GAS(Google Apps Script)でonEditが2回実行されてしまう

RDF、TurtleやJSON-LD、およびIIIFマニフェストファイルなどの関係を理解する

校異源氏物語・本文テキストデータリポジトリで公開しているTEI/XMLを一部更新しました。

カスタマイズしたMirador 4をnpmパッケージとして公開する

Mirador 4の拡大・縮小・回転の挙動を確認する

zenodoで資料を公開する

macOSでnbdev使用時のエラー対応

Linked Dataを使ったデータ記述の応用例

ズーム操作を無効化するMirador 3(4)向けプラグインの開発

prefix.ccを利用する

RDFデータの追加と可視化に関する備忘録

Content Negotiationを使って、PythonでURIからRDFを取得する

iiif-prezi3を試す

Archivematicaの日本語ファイル名変換を修正する

DHCフォーマットの中身を確認する

a3mを試す

さくらのVPSでSSH接続ができなくなった場合の対処法

docker-compose コマンドでコンテナを再起動すると同時にビルドも行う

StrapiのData transferを試す

@iiif/parserを試す

ndlocr_cli実行時の共有メモリ不足への対応ほか

Omeka Sで動画を公開する

ndlocr_cliをdockerでインストールした後の容量

プログラムを使ってDrupalにログインする

WordPress REST APIで非公開の投稿も含めて検索する

Drupalのイベントをトリガーとして、GitHub Actionsを起動する

YOLOv5モデル(文字領域検出)を使った推論アプリ

mdxでJupyter Labを起動する

Hugging Face SpacesとYOLOv5モデル(NDL-DocLデータセットで学習済み)を使った推論アプリの修正

ultralyticsplus: ValueError: Invalid CUDA 'device=0' requested...への対処

Japan Search利活用スキーマを使ったentity-lookupの試作

cwrcのwikidata-entity-lookupを試す

CWRC XML Validator APIを試す

RELAX NGとSchematron

Docker版のTEI Publisherを使用する

PythonでXML文字列を整形する

CMYKカラーの画像から色を反転させないconvertの方法

RDFストアのトリプル数を数える2: 共起頻度

RDFストアのトリプル数を数える

TEIGarageを試す

Input value "page" contains a non-scalar value.への対処

AWS CLIを使用したS3バケットの一括削除

「SAT大蔵経DB 2018」で公開されているテキストの分析例

Node.jsでXML文字列をパースする

LlamaIndex+GPT4+gradio

Editor.jsでインラインのマーカーツールで作成する

Editor.jsのmax-widthを変更する

Linuxシステムで特定のグループに所属しているユーザーを確認する

Omeka SのAdvanced Searchモジュールでの部分一致検索

Omeka Sで独自の検索ページを作成する

学習指導要領コード推薦アプリのAPIを使用する

学習指導要領コードの推薦アプリの試作

researchmapのapiを使う

TEI/XMLの可視化例:Leafletを用いた地図表示

Nuxt3でサイトマップを作成する

DrupalのSimple OAuthとPostmanを使ったOAuth認証の確認

METSFlaskを試す

Access to MemoryのRESTful APIを試す

ArchivesSpaceのRESTful APIを試す

ArchivesSpaceのOAI Repositoryを試す

Access to MemoryのOAI Repositoryを試す

sidebase/nuxt-authをproduction環境で使う際のTips

sphinxを用いた作成されたドキュメントサイトに日本語訳を追加する

GitHub ActionsとSCPを使って、さくらのレンタルサーバにビルド結果をコピーする

MariaDBでのmysqldump: not foundへの対応

Mirador 3でPresentation API v2のマニフェストが表示できない時の対処例

Omeka SのモジュールIIIF Viewersの更新

nginx-proxyでの 413 Request Entity Too Large エラーの対処法

Docker版Cantaloupeを使用して、S3バケットにアクセスしSSL通信を行う方法

File Information Tool Set (FITS)を試す

GitHub Actionsの処理結果をメールで通知する: Gmailの使用

デジタル源氏物語における校異源氏物語と現代語訳の対応づけ

ro-crate-pyを試す

GitHubのリポジトリをZenodoと連携する

Drupalのsimple_oauthモジュールを用いたRESTリソースのoauth2認証を試す

Postmanを使って、DrupalのRESTリソースのcookie認証を試す

Drupal JSON Web Token Authenticationモジュールを試す

さくらレンタルサーバ上のDrupalを更新する

lando start時のエラー対応

drushのコマンドの備忘録

Oxygen XML Editorのイメージマップエディタの使用例

Nuxt3 x Vuetify x Cesium

Nuxt 3とDecap CMSを試す

AttributeError: 'ImageDraw' object has no attribute 'textsize'への対応

Amazon SNSを用いたEC2上のVirtuosoの再起動

samでError: Running AWS SAM projects locally requires Docker...への対応

Nuxt 3 x Composition APIでLeaflet Marker Clusterを試す

Nuxt3 x Vuetify x Cytoscape

Cantaloupe: サービスとして実行する

Cantaloupe: Amazon S3に格納した画像を配信する

TEI Publisher: TEI Publisher Demo Collectionの可視化例①

Vue.js: Splitpanesを用いた際のiframeを含むpaneへの対処方法

Nuxt3でXMLをフォーマットしてシンタックスハイライト表示する

Visual Studio Code(VSCode)でVersioning Machine(VM5.0)を使用する

【Omeka S モジュール紹介】BulkExport:アイテムの詳細画面にエクスポート機能を追加する

Amazon OpenSearch ServiceでDisable autotuneを行う

EC2に立てたArchivematicaをHTTPS対応する

CantaloupeのAccess Controlを試す

Cantaloupeでinfo.jsonに値を追加する

Cantaloupeのoverlayを試す

EC2に立てたCantaloupeをHTTPS対応する

PyPIでtwo factor auth enabled...への対応

IIIFイメージサーバの一つであるCantaloupeをEC2で起動する

mdxでNDL古典籍OCRを実行する

Mirador2のPhysical Document Rulerを試す

Google Mapsの短縮URLから緯度経度を取得する際の備忘録

Mirador 3のmirador-annotationsプラグインとSimpleAnnotationServerを試す

【Omeka S モジュール紹介】Advanced Search adapter for Solr

macOS版のCyberduckを使って、AWS S3の特定のバケットにアクセスする

ブラウザの拡張機能を使って、GitHubの2FAに対応する

npx nuxi typecheck実行時のエラー

Virtuosoが停止した際の再起動のためのコマンド

Cultural JapanのRDFストアに格納されている展覧会情報の活用

Nuxt3でURLクエリの変更をwatchで監視する

Apache Solrのフィールドがどのようにインデックスされているか確認する方法

Omeka Classic IIIF Toolkitにデータを一括登録する

Mirador3プラグイン開発: ウインドウをコピーする

wikibase.cloudでQuickStatementsを試す

WikibaseSyncを試す

wikibaseのapiをつかってみる

Dataverseを試す

wikibase.cloudを使ってみる

onClose propを使用する

Mirador 3でビューポートが設定した制約を満たすようにズームを行う

Monaco EditorでLaTeXをハイライトする

Ace.jsでTeXをハイライトする

Github Actionsを使ってGithubからEC2までのDjangoのCICD環境構築(2023版)

django-simple-history: Djangoでモデルの編集履歴を記録する

Django Rest Framework (DRF)で部分一致フィルタを実装する

bagit-pythonを試す

DjangoのModelFormを使用してアップロードしたファイルのパスを取得する

DjangoとAWS OpenSearchを接続する

Django REST framework で一括登録する

djangoでJWTを使う(djangorestframework-simplejwt)

DrupalのJSON:APIにおけるcorsエラーへの対応

JSON:API関連のエラーへの対処方法

DrupalのJSON:APIの使用方法(includeと多言語対応)

Drupal Key authを用いたコンテンツの登録と多言語対応

Wagtailを試す

ArchivematicaでBrowseがうまくできない場合の原因と対応

Amazon ECRのリポジトリを一括削除する

Django REST framework JSON:API(DJA)に独自のモデルのビューをカスタマイズする

Django REST framework JSON:API(DJA)に独自のモデルを追加する

Django REST framework JSON:API(DJA)を試す

OpenAPIとAWS CDKを用いてREST APIを作成する(Opensearch接続・カスタムドメイン)

GitHubのGUIを使ったファイルアップロードおよびファイル更新の方法について

Omeka SのImage Serverの設定について

AWS CDK x CloudFront x S3 x Basic認証 x index.html対応 x 独自ドメイン

GoogleドライブとGoogle Apps Scriptを用いて匿名のファイルアップローダを作成する

Google スプレッドシートの更新をGitHubに通知する

Drupal: ネストされたフィールドを検索する一例

Strapi: 深くネストされたフィールドで結果をフィルタリングする方法

Drupal: カスタムモジュールを用いて、コンテンツタイプとフィールドを追加する

Drupal: カスタムRESTリソースを作成する

VueUseを用いたテキスト選択(Nuxt3)

Next.js for DrupalにおけるDrupal Search APIを用いた検索(ファセット検索など)

Contentfulの全文検索は2文字以上の検索語が必要?

Drupalのコンテンツの一括削除の方法

DrupalとAmazon OpenSearch Serviceを接続する

DrupalでGraphQLを試す

StrapiにGraphQLを追加する

Pythonを使ってDrupalのタクソノミーの登録とコンテンツへの追加

Pythonを使ってDrupalのコンテンツを更新・削除する

Pythonを使ってDrupalにコンテンツを追加する

Amazon LightsailでStrapiを動かす(SSL, 独自ドメイン)

ShExファイルを作成してみる

Nuxt3 x babylon.jsで.glbファイルをロードする

vue3とbabylon.jsの双方向のやりとり例

Hugging Face Spaceを用いたNDL古典籍OCRのウェブアプリ

NDL古典籍OCRをAmazon EC2のCPU環境で実行する

Nuxt.jsとNext.jsの比較

正規URLとは? (canonicalUrl)

Fuse.jsを使用した完全不一致検索(GPT-4による解説)

TEI/XMLファイルからrespStmtのnameの値を抽出する方法(GPT-4による解説)

Omeka Sのカスタムオントロジーを用いて作成した語彙を更新する

Nuxt 3でLeaflet Marker Clusterを試す

nbdevを使用する際の備忘録

Fuse.jsを使用した完全不一致検索の部分的な実現

Amazon SageMaker Studioを用いたNDL古典籍OCRの実行

【Babylon.js x Vue】click eventをvueにわたす

Babylon.jsでVueを使用するチュートリアルをNuxt3で試す

Amazon LightsailにArchivesSpaceを立てる

Next.jsでジャパンサーチのウェブパーツを使う

ArchivematicaのAPIを試す(Storage Service API)

Nuxt3のSSRをVercelでホスティングする(+ CORSの有効化)

Babylon.jsとNuxt3とVuetifyを組み合わせて使用する

IIIF Presentation Validatorのローカル環境で利用方法

Google Colabを用いたNDL

JPCOARスキーマを用いたxmlファイルのバリデーション

RELAX NGスキーマを操作するライブラリjingtrangを試す:rngファイルの作成編

RELAX NGスキーマを操作するライブラリjingtrangを試す:検証編

OpenSeaに画像を登録してみる

Romaを用いてカスタマイズしたrngファイルを作成する:使用するTEIタグを限定する

Nuxt3のssrでIIIF viewerを導入する

nuxt3をamazon lightsailで公開する:pm2の使用

TEI Boilerplateを試す

Omeka S 4.0.0 release candidateが公開されました。

Omeka SのAPIへのアクセス制限

EC2サーバセットアップ時のTODOメモ

Snorql for Japan Searchのカスタマイズ方法の調査

【Omeka S モジュール紹介】IIIF Searchモジュール

Google ColabでTesseractを動かす(日本語対応)

【Omeka S モジュール紹介】PDFファイルに対してOCRを行うモジュール「Extract Ocr」

Vertex AIのworkbenchを使用した際、HuggingFaceのTrainer()が開始されない事象への対処法

Mroonga search モジュールのインストール(※うまくいきませんでした。)

ResourceSyncのPythonライブラリを試す

iiif auth apiを試す

TEIテキストの作成支援ツール「FairCopy」の紹介

テキストマークアップツール「CATMA」の使い方

MediaWikiのTEI拡張を試す(結果:うまくいきませんでした。)

[TEI x JavaScript] Nuxt3で意図しないWhitespaceを削除する

ultralytics/yolov5でのAttributeErrorへの対応

Nuxt 3のserver/apiでjsonファイルを操作する方法の一例

Nuxt3をNetlifyおよびAWSにデプロイする方法の一例

TEI/XMLファイルを縦書きPDFに変換する方法の1例

選択したテキストに対するポップアップを表示するnpmパッケージを試作しました。

IIIFアイコンのドラッグ&ドロップ対応について

[備忘録] maptilerのlightおよびdarkテーマ

Swagger UIのデモで初期表示するspecificationをgetパラメータで指定する

Omeka S IIIF ServerのIIIFマニフェスト(version 2)の出力内容

BeautifulSoupでxml:id属性を与える方法

[Omeka S]Bulk Importの不具合対応(ソースコードからのインストール方法を含む)

コマンドラインから virtuoso を手動で再起動または停止する方法

VGG16を用いた類似画像検索

オートエンコーダ(自己符号化器)を用いた類似画像検索

[RDF] URIにアクセスしたらSnorqlの画面にリダイレクトさせる設定

Hugging Face SpacesでJSONを返却する

AWS EC2を用いたVirtuoso RDFストアの構築

Virtuoso RDFストアに対して、curlおよびpythonを用いてRDFファイルを登録・削除する方法

Hugging Face SpacesとYOLOv5モデル(NDL-DocLデータセットで学習済み)を使った推論アプリの構築

Elasticsearch 上のデータをローカルにダンプする

NDL-DocLデータセットとYOLOv5を用いたレイアウト抽出モデルを作成しました。

Google Colabを使って、パスからGoogle DriveのフォルダのIDを取得する

Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を実現する

Amazon Lightsailを用いたOmeka Classicサイトの構築(独自ドメイン+SSL化を含む)

Elastic Searchにおける異なるキーと値(ラベルとID)を持つアグリゲーション

Google Colabを用いたNDLOCRアプリの使い方の動画を作成しました。

AWS Copilotを用いたOmeka Sデータの定期バックアップ

Mirador 3にmirador-image-toolsプラグインを追加して、1つのjsファイルにまとめて配布する方法

ファイルのアップロード(python)とダウンロード(php)

python-docxを用いたMicrosoft Wordファイルの作成:テンプレート、int2kanjiの利用など

Google ColabからGoogle Spreadsheetのデータを取得するサンプルノートブック

【備忘録】sam deployを行う際のprofileの指定

AWS SAMを用いたローカル開発時におけるError building docker imageへの対応

gdriveを用いたOmeka Sの簡易バックアップ

Using gdrive in a LAMP environment started with Amazon Lightsail

Amazon Lightsailで起動したLAMP環境でgdriveを使用する

What to do when

「Google ドライブでエラーが発生しました。」が生じた時の対処方法:共有ドライブのゴミ箱を空にするスクリプト

Google Colabを用いたgcv2hocrの実行例:Google Vision APIを用いた透明テキスト付きPDFファイルの作成

Google Colabを用いたGoogle Drive上のファイルの削除方法

Google Colabを用いたNDLOCRアプリのVersion 2を作成しました。

Google Colabを用いたNDLOCRアプリの更新:Sigle input dir modeの追加

Google Colabを用いたNDLOCRの実行にかかる時間について

Google Colabを用いたndl-lab図表自動抽出プログラムの実行

Google Colabを用いたNDLOCRアプリの実行(Google Driveを用いた画像の入力と結果の保存)

Amazon Lightsailを用いたOmeka Sサイトの構築(独自ドメイン+SSL化を含む)

Google Cloud PlatformのCompute Engineを用いたNDLOCRアプリの実行

The New York Public LibraryのAPIを使ってみる

serverless-iiifで対応可能な画像サイズに関する実験

LeafletのVue3での使用例(座標範囲の取得を含む)

Vuetifyでダイアログを開いたときにダイアログ内にフォーカステキストフィールドを設定する

Nuxt.jsでstaticディレクトリなどもホットリロードの対象にする方法

IIIF Presentation APIのバリデーション方法とその実例の紹介ほか

GCP: AI Platform Notebooksの作成時のエラー対応

GCP Vertex AIの特徴量(featurestore)の削除方法

pyvipsの使い方とPyramid Tiled Tiffファイルの作り方

【備忘録】Maplatの使い方

カレンダー検索アプリを作成しました。

AWS Lambdaを用いた物体検出API(Flask + yolov5)の構築

【Omeka Sモジュール】Clean Urlの使い方

Omeka Classicのインストール

【まとめ記事】Omeka.net(Classic)の使い方

【Google Colab】はてなブログのAtomPub APIを用いた記事一覧の取得

Flaskを用いてyolo5モデルを公開するリポジトリのECRとAWS App Runnerでの使用方法

AWS App Runner + ECR 利用時におけるHealth check on port

【開発者向け】AWS x Nuxt.js x Elasticsearchを用いた検索アプリケーションの開発環境の構築

Bulk Importによるリソースクラスの登録方法・設定編集ほか

Google Drive内のファイルオーナーの一括更新プログラムを作成しました。

【備忘録】Googleドライブ上のフォルダ一括削除プログラム(例)を作成しました。

Omeka Sモジュールのインストール方法

Bulk ImportによるCSVファイルを用いたメタデータの一括更新

Omeka Sの日本語による全文検索の注意点とMroonga searchモジュール

Pythonを用いたTEI/XMLファイルの分析サンプルプログラムを作成しました。

IIIFマニフェストファイルからの画像一括ダウンロードプログラムを作成しました。

Omeka S XML Viewerモジュールの使い方

【固定した記事】デジタルアーカイブシステムの技術ブログへようこそ

Omeka S Mirador モジュールの使い方

Omeka Sに関する記事まとめ

gdownでエラーが出た場合の対処法

IIIFマニフェストファイルからTEIのfacsimile要素を作成するプログラムを作成しました。

JavaScriptのquerySelector()でxml:idに特定の値を持つ要素を取得する方法

【Omeka S・開発】Omeka Sにダミーデータを登録するためのCSVファイルを作成するプログラムを作成しました。

【Omeka S モジュール紹介】Mappingモジュールの使い方(特にCSVインポートモジュールを用いた一括登録)

【Omeka S モジュール開発】アイテムの詳細画面に各種エクスポートリンクを設置するモジュールを開発しました。
【Omeka S モジュール開発】IIIFマニフェストにIIIF Content Search APIのURIを追加するモジュールを開発しました。

【Omeka S モジュール情報共有】Clean Urlモジュールの不具合と暫定の修正方法

ジャパンナレッジで検索を行うChrome拡張機能を公開しました。

Mirador 3のimage tools(画像の回転など)を初期表示で有効にする方法

【Omeka S モジュール紹介】Omeka Sで利用可能なIIIF対応ビューア

【機能開発】Omeka SのIIIFモジュールで、目次を加える機能を追加しました。(その2:階層構造を持つ目次の登録)

【機能開発】Omeka SのIIIFモジュールで、目次を加える機能を追加しました。(その1:フラットな目次の登録)

【機能開発】Omeka SのIIIF Serverモジュールにおけるライセンスプロパティの不具合修正

【和訳】Omeka S IIIF Serverモジュールの目次情報の追加方法

Mirador 3をページ内の特定の領域に埋め込む方法

Oxygenの自動整形機能においてlbタグの前で改行する方法

Mirador 3をNuxt.jsで使用する方法を紹介するリポジトリを作成しました。

【Omeka S Tips】WindowsでBulkImportモジュールを使用する際の注意点

【Omeka S Tips】アイテムの新規登録における各サイトへの自動追加の設定について

【Omeka S モジュール紹介】Numeric Data Types:日付データに対する範囲検索を可能にする、など

Nuxt.jsでvis.jsを使用する方法を紹介するGitHubリポジトリを作成しました。

【Omeka S モジュール紹介】Metadata Browse:同じメタデータを持つアイテムを検索するリンクを付与する

【Omeka S モジュールカスタマイズ】OaiPmhRepository:独自語彙の作成

【FOSSメモ】CollectiveAccess

【Omeka S Tips】既存の標準語彙の追加方法

【アプリ紹介】IIIF pocketのご紹介

【Omeka S マニュアル和訳】リソース > アイテム

【Omeka S Tips】メタデータの言語属性の設定方法

【Omeka S モジュール紹介】Item Sets Tree

【Omeka Sモジュール紹介】IIIF Server / Image Server / Universal Viewer

Omeka Sの導入に関する参考資料

Cultural Japanで集約したIIIFマニフェストをまとめたIIIFコレクションのご紹介

Mirador 3をVueで使用する方法を紹介するリポジトリを作成しました。

【機能開発】Omeka SのIIIF ServerモジュールにおけるImage APIを使用しない設定の追加

「起絵図」のIIIF実装

透過光画像を使ったIIIFアプリケーション