bagpack/poe2-merchant-history: PoE2 Chrome extension that stores league-based merchant history locally and visualizes sales trends with charts and tables. 購入履歴の表示に対応しました。 購入履歴を取得するAPIが見つからなかったので、トレードサイトのトレードボタンを押した商品を記録する方式です。

bagpack/poe2-merchant-history: PoE2 Chrome extension that stores league-based merchant history locally and visualizes sales trends with charts and tables. 購入履歴の表示に対応しました。 購入履歴を取得するAPIが見つからなかったので、トレードサイトのトレードボタンを押した商品を記録する方式です。

Path of Exile 2を遊んでいると、公式トレードサイトのタブを大量に開いて、どのタブが何のトレードだったのかわからなくなる現象が多発します。整理下手なので……。 それを解決するために、公式trade検索URLをwatchとして保存・整理するChrome拡張「PoE2 My Watch」を作りました。

popupでは一覧からwatchを選び、元の公式検索を開いたり、watch名を編集したりできます。 watch名をタブタイトルに反映させることもできるのでタブも探しやすくなります。
watchを保存すると、価格も保存できます。
popupでは直近の中央値の推移を、ダッシュボードではmin、p10、中央値、p90、maxの価格分布を確認できます。表示通貨はwatchごとに自動、Exalted、Divine、Chaos、Mirrorから選べます。
ただし、これは市場全体の統計ではありません。ユーザーが公式トレードサイトで見ていた、その時点の表示中の内容を記録したものです。

以下からインストールできます。
Path of Exile 2 のトレード結果から、Path of Building 2(Create Custom)に貼り付けられる 「アイテム全文テキスト」をワンクリックでコピーできるChrome拡張を作りました。 非英語サイトで閲覧していても、英語データを裏で取得してPoB互換のテキストを用意します。
https://pathofexile.com/trade2/search/poe2poe2-pob-copy-button-dist.zip をダウンロード
chrome://extensions/ を開く
Path of Exile 2 の Merchant History は公式サイトでは最新の100件しか取得できません。
そこで、履歴をローカルに保存して可視化するChrome拡張を作りました。
公式のmerchant historyはで取得できるのが「最新の100件程度」だけです。
「あとから振り返りたい」「リーグ単位で推移を見たい」と思ったときに、公式だけだと手元に残らない。
それなら定期的に取得してローカルに保存できる仕組みが欲しい、というのが出発点でした。
Chrome拡張として、履歴をリーグ単位で保存・可視化できるツールを作りました。
主な機能は以下です。
ポイント
公式APIの100件制限を補うため、定期的に更新して保存しておくことを前提にしています。

X(旧Twitter)の検索結果に、ミュートやブロックしたアカウントの投稿が混ざるという現象に長年悩まされており、なんなんこれと思っておりました。
調べてみると、もっと見る > プラバシーと安全 > 検索設定 > ブロックしているアカウントとミュートしているアカウントを除外するにチェックを入れると検索結果から除外できるということなのですが、私の環境だと効果がない。
そこでXの検索結果からミュート/ブロックを消すChrome拡張を作りました。
拡張は大きく3つの役割に分かれています。
背景で動くサービスワーカーが、XのGraphQL API(MutedAccounts / BlockedAccountsAll)を叩いて一覧を取得します。
ポイントはAPIのIDや機能フラグを自動で拾うことです。Xが内部で呼んでいるGraphQLのリクエストを監視して、必要なIDやfeaturesを保存しておきます。
さらに、認証用のBearerトークンやct0(CSRFトークン)も取得し、chrome.storage.localに保存して利用します。
結果として、ログイン中のセッションから「今のXが要求する形式」で一覧を取得できるようになっています。
検索ページにだけ content script を注入し、DOMを監視します。
article[data-testid="tweet"]と[data-testid="UserCell"]を走査して、ミュート/ブロック一覧に含まれるアカウントの投稿をdisplay: noneで隠します。
ページ遷移や無限スクロールで新しい要素が追加された場合も、MutationObserverで即時反映する仕組みです。
X上でミュート/ブロックを行ったとき、ページ内のfetch/XMLHttpRequestをフックして該当APIのレスポンスからscreen_nameを取得します。
取得したハンドルは拡張側に送信し、保存済みの一覧を更新することで他の画面で操作したミュート/ブロック操作を反映を実現しています。
https://x.com/search?...)を開くchrome.storage.local)に保存されます個人的に使うために作った拡張ですが、同じ悩みを持つ人の参考になれば幸いです。
AtCoder Biginner Contestの001から007までやってみて学んだことを覚えている限り
いもす法というシンプルですごいアルゴリズムを知った。
蟻本を買った当時はまだ生まれていなかったアルゴリズムというのもエモい。
最長増加部分列( Longest Increasing Subsequence)というアルゴリズムを知った。
桁DPというアルゴリズムを知った。
ここまでJavaScriptで解答してきたが、JavaScriptで表現できる整数が53bitまでという問題があり、Kotlinに切り替えた(AtCoderのNodeのバージョンではBigIntegerは使用できない)。
積本の中に蟻本があるのを見つけたところ、急に競技プログラミングをやってみたくなった。
日本にはAtCoderというプログラミングコンテストサイトがあり、競技プログラミングの練習ができるという。
(蟻本を買ったのは2010年頃だったが当時はなかったかと思う)
親切なことに「AtCoderに登録したけど何をしていいか分からない・・・!」という人に向けて作られた、初心者向け問題集の AtCoder Beginners Selection が用意されている。
さっそく解いてみたところつまづいた。
ABC049C - 白昼夢 / Daydream で解法はあっているはずと思っていても、一部のテストケースがさっぱり通らない。 諦めて他の人の解法を見ても、やはり間違っていない。
最終的には入力値をtrimすることですべてのテストケースが通るようになった。 行末が改行で終わっているテストケースとそうでないテストケースがあるのだろうか。
ABC086C - Traveling も解法については問題ないはずだが、まったくテストケースが通らない。 公開されているサンプルのテストケースすら通らない。
1日経って気がついた。
求められている出力値は Yes あるいは No だが、 YES NO で出力しているのが問題だった。
言い訳させていただくと、一つ前の問題で求められている出力値が YES NO だったから……。