読者です 読者をやめる 読者になる 読者になる

lr2irproxyでLR2上に擬似ライバル内ランキングを実現する

github.com

前回と同じ構造の記事になるけど、lr2irproxyを更新、exrivalプラグイン(とlptoolsにlr2files.py)を追加した。

その名の通りライバル機能の拡張で、exgradeと同様にlr2irproxyでDBを持ってライバルのスコアを管理する。

このプラグインの売りは、www.dream-pro.infoがlr2irproxyの構築するサーバに名前解決される場合(前々回くらいの記事参照)に 通常のIR取得処理を横取りしてライバル内ランキングへと書き換えることである。

参考画像(名前無許可使用ですごめんなさい) f:id:GNQG:20151224004928p:plain この曲のIR:http://www.dream-pro.info/~lavalse/LR2IR/search.cgi?mode=ranking&bmsid=192763

(asdasdは俺です。LR2.exeに表示される名前を使う)

exrivalの設定 f:id:GNQG:20151224010131j:plain

exrivalへのライバルの追加はexgradeの時と同じくLR2IR上で行えるようにしている。アクティブ機能も同様。

自分のスコアはLR2files/Database/Score/username.dbを見ているので最新、ライバルのスコアはサーバ起動時に取得したものとなる。また更新したスコアはLR2IRにきちんと送信される。あくまでもランキングを書き換えるだけ。

次やるとしたらマイページとか自分のライバル一覧からライバルのインポートする機能とかかな?

lr2irproxyを使っていろんな段位認定をLR2IRに表示する

github.com

いろいろ試行錯誤したけど結局リクエスト、レスポンスとか全部で判定してボディを弄るのが一番良いという結論に至った。

lr2irproxy.pyはもうあんまりいじらない、はず。

前回あたりからhtml/XMLパーサにlxmlを標準で使うようにしたので、動作にはこれが必要。

lxml - Processing XML and HTML with Python

本題。

上記リポジトリのplugins内に(確か前回から試験的に入ってた気もするけど)exgradeというプラグインを追加しました。

こいつは何ができるのかというと、

  • 第3者が作った段位認定をLR2IRに擬似的に登録可能(もちろんデータは自前DBに貯める)
  • ランキングとマイページにその段位認定を表示できる(発狂SP/DP段位の下に持っている奴の最高段を表示)

f:id:GNQG:20151219215044j:plainf:id:GNQG:20151219215052j:plain

段位の削除、編集機能はまだ作っていないけど、段位の追加、表示/非表示の変更はできるはず。

段位の追加はJSONを用いて行う。ファイル名をgrade.jsonとする。grade.jsonは以下の形式のJSONとする(余計なものが付いていてもまあ大丈夫)。

{
    "name" : "段位認定セットの名前",
    "order" : [
        [courseid(Integer), "段位の表示(例えば'◆01')"]],
        [次の段位(上と同様)],
        ...
        [最後の段位(最高位)]
    ]
}

例を兼ねて、主要なやつ(というか知ってるやつ)はgistに上げてある。参考にどうぞ。

JSONs for exgrade · GitHub

インポート方法はhttp://ほにゃらら/LR2IR/exgradeにアクセスして追加→JSONをアップロードするまたはJSONのURL指定でOK。俺のgistの場合は各ファイル名の欄の右端にあるRawのURLを指定することになる。

合格情報の手動更新はまだ。前回更新から1日以上経った段位は起動時に自動更新される。

もしよければ使ってみて欲しい。

書いていて思ったんだけど、grade["order"]の中身は2要素のリストじゃなくて辞書のほうが良さそうだなあ。タイトル、曲目とか追加すれば段位ページの表示にそのまま使えそうだし。

lr2irproxy

というクソ愚直な名前をとりあえずつけて、Githubに上げた。

github.com

ApacheやめてBaseHTTPServerにしたら思った以上にコンパクトになった。Pythonだけで纏まったし一応exe単体にもできるのかな?あまりその辺は詳しくない。

使うにあたり必要なものとしては

  • Python 2.7.x
  • hostsファイルに127.0.0.1 www.dream-pro.infoを追加
  • 従って127.0.0.1:80が使用中でないこと

だけやれば多分なんとかなるかなあ。

前記事にSSを貼った2機能(発狂&通常レベル追加,LN表タグ)だけとりあえず入れてある。

アイディアが尽きないかぎりはこれのmodを今後しばらくのネタにしようと思う。

LR2/LR2IR用のプロキシサーバのようなものを作っている

きっかけ

ランキング取得クソ重くてむかつきません?

構成

ブラウザから見るLR2IRを好き放題いじる分には適当にプロキシサーバ立ててプロキシ自動構成か何かするのが簡単だろうけど、俺はLR2body.exeの通信をどうにかしたかったのでそれは無し(ちょっと怪しいかもしれない)。

LR2は通信をhttpのPOSTで行っている。URLはプログラム内で固定されているため変更はできない(やろうと思えばできると思うけどバイナリそのものはあんまり触りたくない)。

そこで、パワープレイではあるけど名前解決の部分を上手く使うことにした。

LR2のhttp通信はWinsockを使用して行われているけど、gethostbyname関数でwww.dream-pro.infoを名前解決しているっぽい。 gethostbyname

  1. DNSキャッシュ
  2. hosts
  3. DNSサーバ

の順で問い合わせるらしい(普通そうだろうけど)ので、hostsに

aaa.bbb.ccc.ddd www.dream-pro.info

みたいに書いて、aaa.bbb.ccc.dddでリクエストを処理することを考える。

俺の取った方法としては、apache127.0.0.1:80で立てて

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/cgi-bin/rewrite\.cgi/(.*)$
RewriteRule ^/(.+)$ /cgi-bin/rewrite\.cgi/$1 [PT]

みたいに設定して、ルート以下のアクセスを/cgi-bin/rewrite.cgiに丸投げする。ちなみに[PT]を知らなくてかなり嵌った。

こう書くことでrewrite.cgiURIPATH_INFOとして渡されるので、あとはrewrite.cgi側で自由に書けばいい。

通常通りの処理をしたければ普通にwww.dream-pro.infoにリクエストを飛ばせばいいけど、hostsに書いてある設定が優先されるのでソケット通信で書く必要があった(俺は)。

あれこれあって書き終わって、一昨日辺りようやくまともに動くようになってくれた。

出来そうかつ需要がありそうな事としては

  1. LR2上でライバル内ランキングの実現(当初の目的, 通常のIRと併用不可)
  2. search.cgiブラウジング時の機能追加
  3. 選曲履歴の保存

くらいが簡単に思いつくかなあ。2.については軽くやっていて、

  1. 発狂BMS一覧ページに★25とか通常難易度表とかをちょっと追加 f:id:GNQG:20151205153810j:plain
  2. 特定タグ検索時に関連タグ(事前に指定)を挿入 f:id:GNQG:20151205153829j:plain

みたいなことをやってみた。

もう少しいろいろ試してみようと思う。公開とかはどうなんだろう。

20151006

技術者にある程度の人気があるということもあり、なんとなくhatenablogを始めた。 Markdownも使えるらしいし。

技術的なことを書くかもわからないし、どのくらい書くかとかも全く決めていないけど適当にやっていきたい。

軽い自己紹介

  • 名前:ginkgo(@)
  • 大学院生(数値解析学)。
  • BMSという音楽ゲームが好き(最近諸事情であまり多くやっていない)。段位はSP発狂皆伝。
  • BMSに関連したツール等の開発(あまり大規模なことはできない)に少し興味がある。例えば@bmsuploaderの運営をしている。
  • Python,C++あたりをよく使う。