[{"data":1,"prerenderedAt":873},["ShallowReactive",2],{"content-/nvda-earnings-summary-notification-2026-05-21":3,"all-pages-for-dir":871,"og-image-/nvda-earnings-summary-notification-2026-05-21":872},{"id":4,"title":5,"body":6,"category":853,"description":854,"extension":855,"meta":856,"navigation":770,"ogImage":857,"path":858,"project_name":859,"published":860,"publishedAt":861,"seo":862,"stem":863,"tags":864,"todo":857,"unpublished":860,"updatedAt":857,"__hash__":870},"pages/2026-05/2026-05-21/nvda-earnings-summary-notification.md","NVDA決算日にコンセンサスとビート率を比較するターミナル通知を組んだ",{"type":7,"value":8,"toc":841},"minimark",[9,22,25,29,32,39,42,45,49,56,76,82,356,366,370,373,404,407,411,426,429,451,469,473,484,491,608,618,622,629,648,651,654,716,719,756,759,815,818,837],[10,11,12,13,17,18,21],"p",{},"前日（2026-05-20）の ",[14,15,16],"code",{},"/check-earnings"," ジョブで、NVDA Q1 FY2027 の 8-K を SEC EDGAR から拾い、CFO Commentary のガイダンス6行を Turso の ",[14,19,20],{},"earnings_guidance"," テーブルに UPSERT 済みだった。今日はその続きで、決算日に Google Chat へ流す通知フォーマットを設計し、最終的にターミナル表示まで一気通貫で動かす作業に入った。",[10,23,24],{},"途中で「Webhook やめてターミナルに出せばいい」と方針が変わったり、コンソールが cp932 で絵文字を出せずに止まったり、コンセンサスデータプロバイダの実績取り込みが間に合わずに自前で press release を叩きに行く羽目になったりした。その過程をメモしておく。",[26,27,28],"h2",{"id":28},"やりたかったこと",[10,30,31],{},"「NVDA の決算が出たら、コンセンサス予想と実績を並べて、ビート率まで一目で読める通知を出したい」。これが今日の出発点だった。",[10,33,34,35,38],{},"既存の ",[14,36,37],{},"nvidia-guidance-watcher/main.py"," は SEC EDGAR を 30 分おきに叩いて 8-K を検出し、新規ファイリングがあれば Google Chat に「8-K が出ました」とだけ通知する作りになっていた。検出はできても、肝心の「予想と実績の比較」がない。決算速報をスマホで見るとき、Revenue / EPS / Gross Margin / OpEx / Tax Rate がコンセンサスにどれだけ勝った（負けた）かを真っ先に知りたいので、そこを埋める。",[10,40,41],{},"参考にしたのは Apple / NVIDIA の決算速報メッセージで流れてくるフォーマット。Revenue・EPS・Gross Margin・OpEx・Tax Rate の5行に加えて、次四半期ガイダンスも予想対比で並べる構成にした。",[10,43,44],{},"ユーザーからの指示は明確だった。「予想と実績を比較してビート率も入れて。ガイダンスのビート率の方が重要」。ガイダンスは決算そのものより株価への影響が大きいので、そこは譲れない。",[26,46,48],{"id":47},"設計純粋関数とioを切り分ける","設計：純粋関数とI/Oを切り分ける",[10,50,51,52,55],{},"最初に Claude Code に既存 ",[14,53,54],{},"main.py"," を読ませて、組み込み箇所を決めた。",[57,58,59,63,66,73],"ul",{},[60,61,62],"li",{},"既存の8-K検出ループはそのまま残す",[60,64,65],{},"新規8-K が「決算 (Q1/Q2/Q3/Q4) の8-K」だった場合のみ、サマリー組み立てフックを呼ぶ",[60,67,68,69,72],{},"フォーマット組み立ては純粋関数として ",[14,70,71],{},"earnings_summary.py"," に切り出す",[60,74,75],{},"Turso からの予想取得、press release からの実績取得は副作用関数として別ファイルに置く",[10,77,78,79,81],{},"CLAUDE.md に「ロジック（純粋計算）と副作用（外部とのやりとり）は混ぜない」と書いてあるので、その方針に従う。",[14,80,71],{}," は予想 dict と実績 dict を受け取って整形済み文字列を返すだけ。Turso にも HTTP にも触らない。",[83,84,89],"pre",{"className":85,"code":86,"language":87,"meta":88,"style":88},"language-python shiki shiki-themes vitesse-light vitesse-light","# earnings_summary.py（純粋関数のイメージ）\ndef build_earnings_summary(\n    ticker: str,\n    fiscal_period: str,\n    consensus: dict,    # 外部のコンセンサスデータプロバイダ由来\n    actual: dict,       # press release 由来\n    guidance: dict,\n) -> str:\n    revenue_line = format_beat_line(\"売上高\", actual[\"revenue\"], consensus[\"revenue\"])\n    eps_line = format_beat_line(\"EPS\", actual[\"eps\"], consensus[\"eps\"])\n    ...\n    return \"\\n\".join([header, revenue_line, eps_line, ...])\n","python","",[14,90,91,100,115,132,144,161,176,188,202,259,305,312],{"__ignoreMap":88},[92,93,96],"span",{"class":94,"line":95},"line",1,[92,97,99],{"class":98},"sxvE3","# earnings_summary.py（純粋関数のイメージ）\n",[92,101,103,107,111],{"class":94,"line":102},2,[92,104,106],{"class":105},"stQ0i","def",[92,108,110],{"class":109},"senZ8"," build_earnings_summary",[92,112,114],{"class":113},"shFtX","(\n",[92,116,118,122,125,129],{"class":94,"line":117},3,[92,119,121],{"class":120},"sG7-3","    ticker",[92,123,124],{"class":113},":",[92,126,128],{"class":127},"sz8Xr"," str",[92,130,131],{"class":113},",\n",[92,133,135,138,140,142],{"class":94,"line":134},4,[92,136,137],{"class":120},"    fiscal_period",[92,139,124],{"class":113},[92,141,128],{"class":127},[92,143,131],{"class":113},[92,145,147,150,152,155,158],{"class":94,"line":146},5,[92,148,149],{"class":120},"    consensus",[92,151,124],{"class":113},[92,153,154],{"class":127}," dict",[92,156,157],{"class":113},",",[92,159,160],{"class":98},"    # 外部のコンセンサスデータプロバイダ由来\n",[92,162,164,167,169,171,173],{"class":94,"line":163},6,[92,165,166],{"class":120},"    actual",[92,168,124],{"class":113},[92,170,154],{"class":127},[92,172,157],{"class":113},[92,174,175],{"class":98},"       # press release 由来\n",[92,177,179,182,184,186],{"class":94,"line":178},7,[92,180,181],{"class":120},"    guidance",[92,183,124],{"class":113},[92,185,154],{"class":127},[92,187,131],{"class":113},[92,189,191,194,197,199],{"class":94,"line":190},8,[92,192,193],{"class":113},")",[92,195,196],{"class":113}," ->",[92,198,128],{"class":127},[92,200,201],{"class":113},":\n",[92,203,205,208,211,214,217,221,225,227,229,232,235,237,240,242,245,248,250,252,254,256],{"class":94,"line":204},9,[92,206,207],{"class":120},"    revenue_line ",[92,209,210],{"class":113},"=",[92,212,213],{"class":120}," format_beat_line",[92,215,216],{"class":113},"(",[92,218,220],{"class":219},"sMJiu","\"",[92,222,224],{"class":223},"sdGka","売上高",[92,226,220],{"class":219},[92,228,157],{"class":113},[92,230,231],{"class":120}," actual",[92,233,234],{"class":113},"[",[92,236,220],{"class":219},[92,238,239],{"class":223},"revenue",[92,241,220],{"class":219},[92,243,244],{"class":113},"],",[92,246,247],{"class":120}," consensus",[92,249,234],{"class":113},[92,251,220],{"class":219},[92,253,239],{"class":223},[92,255,220],{"class":219},[92,257,258],{"class":113},"])\n",[92,260,262,265,267,269,271,273,276,278,280,282,284,286,289,291,293,295,297,299,301,303],{"class":94,"line":261},10,[92,263,264],{"class":120},"    eps_line ",[92,266,210],{"class":113},[92,268,213],{"class":120},[92,270,216],{"class":113},[92,272,220],{"class":219},[92,274,275],{"class":223},"EPS",[92,277,220],{"class":219},[92,279,157],{"class":113},[92,281,231],{"class":120},[92,283,234],{"class":113},[92,285,220],{"class":219},[92,287,288],{"class":223},"eps",[92,290,220],{"class":219},[92,292,244],{"class":113},[92,294,247],{"class":120},[92,296,234],{"class":113},[92,298,220],{"class":219},[92,300,288],{"class":223},[92,302,220],{"class":219},[92,304,258],{"class":113},[92,306,308],{"class":94,"line":307},11,[92,309,311],{"class":310},"snbK4","    ...\n",[92,313,315,319,322,325,327,330,333,336,339,341,344,346,349,351,354],{"class":94,"line":314},12,[92,316,318],{"class":317},"sHkkW","    return",[92,320,321],{"class":219}," \"",[92,323,324],{"class":310},"\\n",[92,326,220],{"class":219},[92,328,329],{"class":113},".",[92,331,332],{"class":120},"join",[92,334,335],{"class":113},"([",[92,337,338],{"class":120},"header",[92,340,157],{"class":113},[92,342,343],{"class":120}," revenue_line",[92,345,157],{"class":113},[92,347,348],{"class":120}," eps_line",[92,350,157],{"class":113},[92,352,353],{"class":310}," ...",[92,355,258],{"class":113},[10,357,358,361,362,365],{},[14,359,360],{},"format_beat_line"," は実績と予想を受け取って ",[14,363,364],{},"(実績) vs (予想) → ビート率 +x.x%"," の1行を返すだけの単純な関数。テストが書きやすい。",[26,367,369],{"id":368},"実装claude-code-に書かせた","実装：Claude Code に書かせた",[10,371,372],{},"設計が決まってからは Claude Code に実装させた。",[374,375,376,388,393],"ol",{},[60,377,378,380,381,384,385,387],{},[14,379,71],{}," を新規作成し、純粋関数として ",[14,382,383],{},"build_earnings_summary"," と ",[14,386,360],{}," を定義",[60,389,390,392],{},[14,391,54],{}," の8-K検出フックの直後に「決算ファイリングか判定 → 該当なら Turso から予想取得 → press release から実績取得 → サマリー組み立て → 通知」のフローを追加",[60,394,395,396,399,400,403],{},"NVDA press release から ",[14,397,398],{},"requests"," で実績を取得する ",[14,401,402],{},"fetch_nvda_actuals"," 関数を別モジュールに追加（HTML から Revenue / EPS / Gross Margin を抜き出す）",[10,405,406],{},"press release のスクレイピングは安定しないので、本来は外部のコンセンサスデータプロバイダ側に実績が取り込まれるのを待ちたい。ただし今回は決算当日にプロバイダ側の取り込みが間に合っておらず、自前で取りに行くしかなかった。プロバイダの取り込みが終わったら、そちらを正にする運用に切り替える前提でコメントを残した。",[26,408,410],{"id":409},"つまずき1コンソールが絵文字を出せない","つまずき1：コンソールが絵文字を出せない",[10,412,413,414,417,418,421,422,425],{},"ドライランで NVDA Q1 FY2027 の模擬データを流したら、Tursoからの予想取得は成功して値も帰ってきた。ところが ",[14,415,416],{},"print"," した瞬間に ",[14,419,420],{},"UnicodeEncodeError: 'cp932' codec can't encode character '\\U0001f4ca'"," で落ちた。Windows のデフォルトコンソールは cp932 なので、",[14,423,424],{},"📊"," のような絵文字を出力できない。",[10,427,428],{},"仕様としては正しい挙動だが、こちらは絵文字を含むフォーマットをそのまま Google Chat に乗せたい。エンコード変換で剥がすのは本末転倒なので、Python 側で UTF-8 を強制した。",[83,430,434],{"className":431,"code":432,"language":433,"meta":88,"style":88},"language-powershell shiki shiki-themes vitesse-light vitesse-light","# 実行時に標準出力を UTF-8 に固定\n$env:PYTHONIOENCODING = \"utf-8\"\npython -X utf8 -m nvidia_guidance_watcher.main\n","powershell",[14,435,436,441,446],{"__ignoreMap":88},[92,437,438],{"class":94,"line":95},[92,439,440],{},"# 実行時に標準出力を UTF-8 に固定\n",[92,442,443],{"class":94,"line":102},[92,444,445],{},"$env:PYTHONIOENCODING = \"utf-8\"\n",[92,447,448],{"class":94,"line":117},[92,449,450],{},"python -X utf8 -m nvidia_guidance_watcher.main\n",[10,452,453,454,456,457,460,461,464,465,468],{},"これで ",[14,455,424],{}," も ",[14,458,459],{},"🟢"," も問題なく出るようになった。本番（GitHub Actions）の Linux ランナーでは最初から UTF-8 なので問題にならないが、ローカル検証用に ",[14,462,463],{},"run.ps1"," 側で ",[14,466,467],{},"PYTHONIOENCODING=utf-8"," をセットする運用にした。",[26,470,472],{"id":471},"つまずき2webhook-やめてターミナル表示に切替","つまずき2：Webhook やめてターミナル表示に切替",[10,474,475,476,479,480,483],{},"Webhook URL を ",[14,477,478],{},"earnings-dynamics-poc"," 側のリポジトリから探したが見つからず、",[14,481,482],{},"nvidia-guidance-watcher"," の GitHub Secret に保存されていることがわかった。ローカルからは直接取れない。",[10,485,486,487,490],{},"ここでユーザーから方針変更が入った。「Webhook じゃなくてもいい。決算発表があった時だけターミナル上に表示してくれればいい」。確かに、最初に欲しいのは「フォーマットが意図通りに組まれているか」の確認であって、配信は後でいい。Google Chat への送信は Webhook を別途設定すれば後付けで足せる構造のままにして、まずは ",[14,488,489],{},"print_earnings_summary(notification)"," という関数を main.py に追加し、決算検知時のみコンソールに整形済みメッセージを出す形に変えた。",[83,492,494],{"className":85,"code":493,"language":87,"meta":88,"style":88},"# main.py 抜粋（決算検知時のみターミナル表示）\nif is_earnings_filing(filing):\n    consensus = fetch_consensus_from_turso(ticker, fiscal_period)\n    actual = fetch_nvda_actuals(filing.url)\n    summary = build_earnings_summary(ticker, fiscal_period, consensus, actual, guidance)\n    print_earnings_summary(summary)  # 標準出力に出すだけ\n",[14,495,496,501,517,540,561,593],{"__ignoreMap":88},[92,497,498],{"class":94,"line":95},[92,499,500],{"class":98},"# main.py 抜粋（決算検知時のみターミナル表示）\n",[92,502,503,506,509,511,514],{"class":94,"line":102},[92,504,505],{"class":317},"if",[92,507,508],{"class":120}," is_earnings_filing",[92,510,216],{"class":113},[92,512,513],{"class":120},"filing",[92,515,516],{"class":113},"):\n",[92,518,519,522,524,527,529,532,534,537],{"class":94,"line":117},[92,520,521],{"class":120},"    consensus ",[92,523,210],{"class":113},[92,525,526],{"class":120}," fetch_consensus_from_turso",[92,528,216],{"class":113},[92,530,531],{"class":120},"ticker",[92,533,157],{"class":113},[92,535,536],{"class":120}," fiscal_period",[92,538,539],{"class":113},")\n",[92,541,542,545,547,550,552,554,556,559],{"class":94,"line":134},[92,543,544],{"class":120},"    actual ",[92,546,210],{"class":113},[92,548,549],{"class":120}," fetch_nvda_actuals",[92,551,216],{"class":113},[92,553,513],{"class":120},[92,555,329],{"class":113},[92,557,558],{"class":120},"url",[92,560,539],{"class":113},[92,562,563,566,568,570,572,574,576,578,580,582,584,586,588,591],{"class":94,"line":146},[92,564,565],{"class":120},"    summary ",[92,567,210],{"class":113},[92,569,110],{"class":120},[92,571,216],{"class":113},[92,573,531],{"class":120},[92,575,157],{"class":113},[92,577,536],{"class":120},[92,579,157],{"class":113},[92,581,247],{"class":120},[92,583,157],{"class":113},[92,585,231],{"class":120},[92,587,157],{"class":113},[92,589,590],{"class":120}," guidance",[92,592,539],{"class":113},[92,594,595,598,600,603,605],{"class":94,"line":163},[92,596,597],{"class":120},"    print_earnings_summary",[92,599,216],{"class":113},[92,601,602],{"class":120},"summary",[92,604,193],{"class":113},[92,606,607],{"class":98},"  # 標準出力に出すだけ\n",[10,609,610,611,613,614,617],{},"Webhook 送信関数は残してあるので、本番投入時は ",[14,612,416],{}," を ",[14,615,616],{},"post_to_google_chat"," に差し替えるだけで済む。",[26,619,621],{"id":620},"統合テスト模擬-notification-dict-で動作確認","統合テスト：模擬 notification dict で動作確認",[10,623,624,625,628],{},"実装後、模擬の notification dict（8-K の URL とメタデータ）を ",[14,626,627],{},"print_earnings_summary"," に渡して動作確認した。",[57,630,631,634,640,645],{},[60,632,633],{},"Turso から Q1 FY2027 の予想5項目 + Q2 FY2027 のガイダンス予想を取得",[60,635,636,637,639],{},"NVDA IR ページに ",[14,638,398],{}," を投げて Q1 実績を取得",[60,641,642,644],{},[14,643,383],{}," で Revenue / EPS / Gross Margin / OpEx / Tax Rate と Q2 ガイダンスを並べた整形文字列を組み立て",[60,646,647],{},"UTF-8 強制したコンソールに出力",[10,649,650],{},"絵文字付きの「決算日サマリー」がきれいに表示された。Google Chat に貼り付けても問題なく表示される構造だ。今日の作業時点でフォーマットはこのまま本番メッセージとして使える状態になった。",[26,652,653],{"id":653},"試行錯誤の記録",[655,656,657,670],"table",{},[658,659,660],"thead",{},[661,662,663,667],"tr",{},[664,665,666],"th",{},"つまずき",[664,668,669],{},"対応",[671,672,673,682,695,706],"tbody",{},[661,674,675,679],{},[676,677,678],"td",{},"Webhook URL が GitHub Secret にあってローカルから取れない",[676,680,681],{},"Webhook 配信を後回しにし、まずターミナル表示で完成形を確認",[661,683,684,687],{},[676,685,686],{},"コンソールが cp932 で絵文字を出せない",[676,688,689,384,691,694],{},[14,690,467],{},[14,692,693],{},"-X utf8"," で UTF-8 強制",[661,696,697,700],{},[676,698,699],{},"外部のコンセンサスデータプロバイダに当日実績が間に合わない",[676,701,702,703,705],{},"press release から ",[14,704,398],{}," で直接取得する関数を追加",[661,707,708,711],{},[676,709,710],{},"純粋関数と副作用の混在を避けたい",[676,712,713,715],{},[14,714,71],{}," は dict in / str out のみ、I/O は別ファイル",[26,717,718],{"id":718},"学び",[57,720,721,728,737,750],{},[60,722,723,727],{},[724,725,726],"strong",{},"配信より先にフォーマットを完成させる","。Webhook 設定で詰まったときに「ターミナル表示でいい」に切り替えてもらえたのは正解だった。コアの価値はフォーマット組み立て側にあって、配信先は差し替え可能なI/Oに過ぎない",[60,729,730,733,734,736],{},[724,731,732],{},"純粋関数とI/Oを切り分けると、検証が圧倒的に楽","。",[14,735,383],{}," は dict を渡せば文字列が返るだけなので、Turso にも HTTP にも触らずに何度でも回せた。「実装が正しいか」を確認するのに本番データが要らない",[60,738,739,733,742,384,744,746,747,749],{},[724,740,741],{},"Windows コンソールの cp932 は絵文字で詰む",[14,743,467],{},[14,745,693],{}," の組み合わせを ",[14,748,463],{}," に固定するのが定石。ローカル検証で毎回踏むので、テンプレ化して二度と詰まないようにした",[60,751,752,755],{},[724,753,754],{},"外部のコンセンサスデータプロバイダが間に合わないケースはある","。今回は press release を直接叩いて埋めたが、本来はプロバイダの取り込みを待ちたい。実装の優先順位として「実績取得は最終手段としての自前スクレイピングを残しつつ、デフォルトはプロバイダ参照」にしておくのが安全",[26,757,758],{"id":758},"明日やること",[57,760,763,780,788,800,806],{"className":761},[762],"contains-task-list",[60,764,767,772,773,775,776,779],{"className":765},[766],"task-list-item",[768,769],"input",{"disabled":770,"type":771},true,"checkbox"," ",[14,774,627],{}," のテストを ",[14,777,778],{},"pytest"," で書く（dict in → str out の純粋関数だけテストすれば十分）",[60,781,783,772,785,787],{"className":782},[766],[768,784],{"disabled":770,"type":771},[14,786,402],{}," の HTML パース部分にスナップショットテストを足し、press release のフォーマット変更で壊れたら気づけるようにする",[60,789,791,772,793,795,796,799],{"className":790},[766],[768,792],{"disabled":770,"type":771},[14,794,463],{}," の冒頭に ",[14,797,798],{},"$env:PYTHONIOENCODING = \"utf-8\""," を固定で書き、cp932 で二度と詰まらないようにする",[60,801,803,805],{"className":802},[766],[768,804],{"disabled":770,"type":771}," 外部のコンセンサスデータプロバイダの「Q1 実績」取り込みタイミングをログから観測し、press release フォールバックをいつ切り替えられるか判断する",[60,807,809,811,812,814],{"className":808},[766],[768,810],{"disabled":770,"type":771}," Google Chat Webhook を ",[14,813,482],{}," の Secret 経由で本番投入する切替手順をメモする",[26,816,817],{"id":817},"関連",[57,819,820,829],{},[60,821,822,823,825,826,828],{},"前日：",[14,824,16],{}," で NVDA Q1 FY2027 8-K を SEC EDGAR から検出 → Turso ",[14,827,20],{}," に6行 UPSERT",[60,830,831,832,834,835],{},"関連プロジェクト：",[14,833,478],{}," / ",[14,836,482],{},[838,839,840],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .sG7-3, html code.shiki .sG7-3{--shiki-default:#393A34;--shiki-dark:#393A34}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":88,"searchDepth":102,"depth":102,"links":842},[843,844,845,846,847,848,849,850,851,852],{"id":28,"depth":102,"text":28},{"id":47,"depth":102,"text":48},{"id":368,"depth":102,"text":369},{"id":409,"depth":102,"text":410},{"id":471,"depth":102,"text":472},{"id":620,"depth":102,"text":621},{"id":653,"depth":102,"text":653},{"id":718,"depth":102,"text":718},{"id":758,"depth":102,"text":758},{"id":817,"depth":102,"text":817},"dev","8-K検出から決算サマリーまで一気通貫。Tursoの予想と press release の実績を突き合わせて、ビート率付きのフォーマットを純粋関数で組み立てた記録。","md",{},null,"/nvda-earnings-summary-notification-2026-05-21","nvidia-ces",false,"2026-05-21T00:00:00.000Z",{"title":5,"description":854},"2026-05/2026-05-21/nvda-earnings-summary-notification",[865,866,867,868,478,869],"NVDA","決算","Turso","Google Chat","純粋関数","ucY2fZ8gVWhOJoMa0NnMYjkGGqjidgxZ1LXD-H0qgYM",[],"https://log.eurekapu.com/og/blog/nvda-earnings-summary-notification-2026-05-21.png?v=2026-05-21T00%3A00%3A00.000Z&title=NVDA%E6%B1%BA%E7%AE%97%E6%97%A5%E3%81%AB%E3%82%B3%E3%83%B3%E3%82%BB%E3%83%B3%E3%82%B5%E3%82%B9%E3%81%A8%E3%83%93%E3%83%BC%E3%83%88%E7%8E%87%E3%82%92%E6%AF%94%E8%BC%83%E3%81%99%E3%82%8B%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E9%80%9A%E7%9F%A5%E3%82%92%E7%B5%84%E3%82%93%E3%81%A0&author=Kei%20Komatsu&sig=4e6249f1bb719a76",1782528840627]