Files
log/my-blog/content/posts/2025-11-18-aicard.md
2025-11-19 06:39:10 +09:00

3.5 KiB
Raw Blame History

title, slug, date, tags, language, draft
title slug date tags language draft
claude code webを使い切った aicard 2025-11-18
react
ios
ja
en
false

11/18までの無料配布のtokenがあります。今回はギリギリ使い切れました。anthropicに感謝。

https://support.claude.com/en/articles/12690958-claude-code-promotion

claudeは性能劣化、limitの多発、突然動かなくなる現象が多発した時期があり、plan:maxでもほとんど使えない期間がありました。1ヶ月間、ほとんど使わなかったのにplan:maxは無駄だったという経験から、それ以降はplan:proに切り替えています。claudeが使えなくなった期間は他のサービスを使っていました。

今回は、特に印象的だったことを紹介。

色々作っていた

全部自分の手で書いていたものをベースにclaudeに書き直してもらったり、あるいは、一緒に最初から設計を考え直したりといった作業でした。

{
    "ai" : ["gpt", "shell", "os", "app", "bot", "card"]
}

aicard for ios

ai.card, つまり、aicard for iosに関しては、ueで書いていたものを全部作り直しました。

今回はreact + expoという構成ですが、あのままueで作り続けていたら、やばかった。

atproto oauth

  1. PKCE生成 → PAR → Authorization → Callback
  2. Token ExchangeDPoP nonce自動リトライ
  3. Profile取得DPoP + ath
  4. Session保存

Universal Links

{
  "applinks": {
    "apps": [],
    "details": [{
      "appID": "{apple-dev}.{id}",
      "paths": ["/oauth/callback"]
    }]
  }
}

1. ellipticへの移行

解決策: ES256署名をellipticライブラリで実装

import elliptic from 'elliptic';

const EC = elliptic.ec;
const ec = new EC('p256');
const key = ec.genKeyPair();

成功: DPoP proof JWTの生成に成功

2. DPoP nonce対応

問題: トークン交換時にuse_dpop_nonceエラー

解決策: 自動リトライロジック実装

// 1回目失敗 → DPoP-Nonceヘッダー取得 → 2回目成功
if (errorData.error === 'use_dpop_nonce') {
  const nonce = response.headers.get('DPoP-Nonce');
  // nonceを含めてリトライ
}

3. プロファイル取得エラー

問題: DPoP "ath" mismatchエラー

{"error":"invalid_dpop_proof","message":"DPoP \"ath\" mismatch"}

原因: プロファイル取得時のDPoPプルーフにaccess token hash (ath) が欠落

解決策: generateDPoPProofaccessTokenパラメータ追加

// アクセストークンのSHA-256ハッシュを計算
if (accessToken) {
  const tokenHash = await Crypto.digestStringAsync(
    Crypto.CryptoDigestAlgorithm.SHA256,
    accessToken,
    { encoding: Crypto.CryptoEncoding.BASE64 }
  );
  payload.ath = base64UrlEncode(tokenHash);
}

glb

結論から言うと、react-native-filamentを使います。

threeでやる通常の方法ではうまくテクスチャが表示されませんでした。

+ react-native-filament
- expo-three, expo-gl