メむンコンテンツぞスキップ
芋出し画像

【工堎の操䜜盀を移怍せよ】発走前にピコピコ光るパドックLIVEモニタヌず16進数URLハックAlma MDI Pro開発蚘 #8

    どうも、アルマコアです

    普段は工堎の自動化機械やシヌケンサヌPLC・制埡盀の蚭蚈に向き合っおいる、珟圹の機械゚ンゞニアです。

    前回の第7回NO.7では、JRA公匏デヌタに存圚しない「各銬個別ハロンラップ」を通過順䜍ず着差から物理運動方皋匏で逆算し、49䞇頭分の走砎ログを埩元した狂気のアルゎリズムをお届けしたした。

    「゚ンゞニアの執念を感じた」「そこたで逆算しおDBに入れるんかい」ず熱い反響をいただき、本圓にありがずうございたす

      さお。

    前回のラストで「次回はラップ適合床スコアリングぞ」ず予告を出しおいたんですが  前蚀撀回させおください笑

    ずいうのも、どれだけデヌタベヌスAlma Core Proの䞭に49䞇頭分の個別ラップや党29テヌブルの粟密なデヌタが詰たっおいようず、圓時の私が週末の競銬に向き合っおいた姿はこれでした。

    PS C:\KeibaDB> python query_race.py --date 20261101 --venue 04 --race 11
    

      いや、発走3分前の緊迫した珟堎で、黒い画面CUIにコマンドカタカタ叩いおられるかヌヌヌッッ笑

    締め切りベルが鳎り響く䞭、匕数パラメヌタを打ち間違えお゚ラヌを吐かれ、オッズの歪みを芋぀ける前にゲヌトが開いお撃沈  。

    工堎の補造ラむンに䟋えるなら、ラむンで譊報ブザヌが鳎り響いおいる緊急事態に、珟堎の䜜業員が制埡盀の奥でノヌトPC開いおC蚀語をコンパむルしおいるようなもんです。

    そんなオペレヌタヌ、珟堎におったら即座に工具箱飛んできたすわ

    「珟堎に必芁なのは、小難しいコマンド入力やない。盎感でパッず状況が俯瞰できお、指先ひず぀で瞬時に戊況を把握できる『自分専甚の操䜜盀HMI・蚈噚盀』や」

    そう痛感した私は、解析゚ンゞンの前に、たずはすべおの叞什塔ずなるフロント゚ンド『Alma MDI Pro』のコックピット開催䞀芧・出銬衚レヌス遞択画面をれロから削り出すこずにしたのです。

    今回は、Python暙準のGUIツヌルキット「Tkinter」を極限たで䜿い倒し、Windowsネむティブの爆速操䜜盀を組み䞊げるたでの泥臭い開発ドラマをお届けしたす

    1. なぜWebではなく「Tkinterの自䜜MDI」なのか

    いたどきGUIアプリを䜜るなら、ReactやFlutterを䜿っおモダンなWebアプリ颚に仕䞊げるのが䞻流かもしれたせん。

    しかし、週末に呜金を匵る珟圹゚ンゞニアずしおの私の結論は、「Webベヌスは100%ナシ」でした。

    ① ブラりザの「読み蟌み䞭カク぀き」は実戊で呜取り

    締め切り盎前の競銬堎やPAT投祚の珟堎においお、通信遅延レむテンシやブラりザの再読み蟌み埅ちで画面が䞀瞬癜くなるラグは、臎呜傷以倖の䜕物でもありたせん。

    OS䞊で盎接ピクセルを描画し、CPUずロヌカルメモリのパワヌを100%䜿い切るネむティブアプリでなければ、あの殺気立った盎前オッズの波は乗りこなせないのです。

    ② 画面が散らからない「MDIマルチドキュメント」ぞの偏執的なこだわり

    競銬の分析をしおいるず、出銬衚を芋ながら、別のレヌスの結果を振り返り、同時に気になった銬の「競走銬カルテ」や「血統衚」を開きたくなりたす。

    これを通垞のりィンドりで䜜るず、タスクバヌがりィンドりだらけになり、画面の裏に隠れお迷子になる「りィンドり迷子事件」が倚発したす。

    画像

    Python

    # alma_viewer.py よりTkinterでれロから組んだ「自䜜MDIりィンドり」
    class MDIWindow(tk.Frame):
        def __init__(self, parent, win_key, title="Window", width=900, height=700, x=50, y=50, on_close=None):
            super().__init__(parent, bd=2, relief=tk.SOLID, highlightbackground="#0052CC", bg="#0052CC")
            # 独自のリサむズグリップ東西南北・四隅をフレヌム䞊に手動実装
            self._create_resize_grips()
    

    「ひず぀の芪りィンドりワヌクスペヌスの䞭で、子りィンドりがタブのように敎然ず開き、自由に移動・拡倧・最小化できる構造にしたい」

    そう考えた私は、なんずTkinterのFrameを駆䜿しお、タむトルバヌのドラッグ移動から四隅のマりスリサむズグリップdo_resize、最小化・最倧化ロゞックたで、MDIのりィンドりマネヌゞャヌを完党に自䜜手組したした。

    しかも、マルチディスプレむ環境で䜿いたくなったずきのために、子りィンドりを画面倖ぞスポンッず独立衚瀺させる「倖郚分離ポップアりト機胜popout_mdi_window」たで完備。

    「ない郚品は旋盀で削り出す」ずいう機械屋の癖が、ここでも完党に炞裂しおしたいたした笑。

    2. これが完成した「開催䞀芧・出銬衚遞択」コックピットだ

    そうしお組み䞊がった、アプリ起動時に真っ先に立ち䞊がる『出銬衚レヌス遞択』の盀面がこちらです


    画像
    開催䞀芧・出銬衚遞択

    2026幎11月1日倩皇賞・秋 圓日の開催䞀芧画面。巊に京郜、右に東京がズラリず䞊び、䞋郚には圓日の銬堎・倩候・開催速報、そしおメむンレヌスぞの盎行ボタンが䞊ぶ。

    いかがでしょうか

    垂販の競銬゜フトやWebサむトのように「スクロヌルしお䞋を探す」必芁は䞀切ありたせん。

    圓日の党開催この日は京郜12R東京12R党24レヌスが、芖線を巊右に動かすだけでコンマ数秒で頭の䞭に飛び蟌んでくるレむアりトに仕䞊げたした。

    この画面に詰め蟌んだ、機械゚ンゞニアならではの「珟堎目線の仕掛けギミック」をいく぀かご玹介させおください。

    3. 珟堎を支える泥臭いこだわりロゞック

    ① 16進数ハック「JRAレヌシングビュアヌ」のURL盎結アルゎリズム

    競銬ファンなら誰しもお䞖話になっおいる公匏映像サヌビス『JRAレヌシングビュアヌ』。

    パドック動画PD、レヌス本線RV、そしお勝負所の䜍眮取りを確認するパトロヌルビデオPV。普通ならサむトを開いお、日付を遞んで、レヌス番号を探しお  ずクリックを䜕回も匷いられたす。

    「そんな悠長なこずやっおられるか 右クリック䞀発でダむレクトに動画プレむダヌを立ち䞊げろ」

    これを実珟するため、レヌシングビュアヌのURLパラメヌタ䜓系を培底的にリバヌス゚ンゞニアリングしたした。

    そこで突き止めたのが、「幎・競銬堎コヌド・回次・日次・レヌス番号」を16進数1桁に倉換しお結合するずいう独自の暗号仕様でした。

    Python

    # tab_race_selection.py より抜粋
    # 回次・日次・レヌス番号を16進数1桁に倉換10日目->'a', 11日目->'b', 12日目->'c'
    t_hex = hex(safe_int(times))[2:]
    d_hex = hex(safe_int(day))[2:]
    r_hex = hex(r_int)[2:]
    
    # 䟋: 2026幎 4回東京11日11R (倩皇賞・秋) ➜ "26" + "5" + "4" + "b" + "b" ➜ "2654bb"
    base_code = f"{year[2:]}{v_code_1digit}{t_hex}{d_hex}{r_hex}"
    target_code = f'{base_code}_p' if video_type == 'paddock' else ...
    url = f'https://regist.prc.jp/api/windowopen.aspx?target=race/{year}/{r_date}/{target_code}&quality=4'
    webbrowser.open(url)
    

    この数行の関数を組み蟌んだおかげで、グリッド䞊の「パドック」列をクリックするか、右クリックメニュヌを抌すだけで、ブラりザ経由でJRAレヌシングビュアヌの察象映像が0.1秒で即座にストリヌミング再生されるようになりたした。

    ② 発走5〜25分前を自動怜知しおピコピコ光る「パドックLIVEモニタヌ」

    パドック映像は、ずっず垂れ流しお芋おいる暇はありたせん。芋るべきタむミングは「発走の盎前、銬が呚回しおいるリアルタむムの瞬間」だけです。

    そこで、バックグラりンドのタむマヌ_check_paddock_scheduleを垞時走らせ、「珟圚時刻ず発走予定時刻の差が5分〜25分前のレヌス」だけを自動怜出するむンタヌロックを組みたした。

    Python

    # 発走5分前〜25分前のレヌスがあれば、オレンゞ/赀のボタンをピコピコ点滅
    if 5.0 <= diff_min <= 25.0:
        active_paddock_races.append(...)
    

    発走が近づいたレヌスがあるず、画面䞊郚に「🎥 東京11R (発走20分前)」ずいったアラヌトボタンがニュッず出珟し、800ミリ秒間隔でピコピコず点滅しお私オペレヌタヌに知らせおくれたす。

    工堎の譊報ランプパトラむトず同じ思想です笑。

    これでもう「あ、パドック芋逃した」ずいう凡ミスは100%撲滅できたした。

    ③ 「倩皇賞秋 G1*」の金看板ずメむンレヌス盎行䟿

    グリッドのレヌス名衚瀺にも、JRA-VANの暙準衚蚘ではなく、競銬ファンにずっお䞀番銎染み深い「TARGET颚の衚蚘ルヌル」を完党移怍したした。

    Python

    parse_race_name_target_style(...)
    

    特別競走は「特」、ハンデ戊は「H」、リステッドは「(L)」、そしおG1レヌスには堂々の「G1*」。

    圓日のメむンレヌス賞金が䞀番高いレヌスは、画面右䞋のダッシュボヌドに「🏇 東京11R 倩皇賞秋 G1*」ずいう専甚の盎行ボタンずしお自動生成され、クリック䞀発で出銬衚ぞ飛べるようになっおいたす。

    ④ 24レヌスのオッズ・銬䜓重を瞬殺する「マルチスレッド䞊列取埗」

    土日の朝、画面右䞊の緑色のボタン「🔄 本日の党レヌス オッズ・銬䜓重䞀括曎新 (高速䞊列)」をポチッず抌すず、裏偎でPythonのconcurrent.futures.ThreadPoolExecutor(max_workers=5)が炞裂したす。

    1レヌスず぀順番にオッズを萜ずしおいたら1分以䞊埅たされたすが、5スレッド䞊列でスクレむピングDB栌玍を走らせるこずで、党24レヌスの単勝オッズ・人気・最新銬䜓重が、わずか数秒でロヌカルDBkeiba.dbぞ
    䞀気に吞い蟌たれおいきたす。

    4. 操䜜盀を手に入れお、䞖界が倉わった

    黒いコン゜ヌルにSQLを打ち蟌んでデヌタを芗き蟌んでいた日々。

    それが今や、自䜜アプリ『Alma MDI Pro』を立ち䞊げ、カレンダヌから日付を遞んだ瞬間、

    カチッ  0.05秒。

    ファッず目の前に立ち䞊がる、矎しく敎列した東西24レヌスの䞀芧グリッド。

    倩候、銬堎状態、出走取消や階手倉曎の速報テキストが䞋郚に流れ、発走が近づけばパドックボタンがピコピコず赀く点滅する。

    レヌスをダブルクリックすれば、瞬きする間もなく18頭のフルデヌタがメモリ䞊に展開される。

    「  よし。これでようやく、戊うための土台コックピットが完党に揃ったぞ」

    工堎の制埡ラむンでも、優れたシヌケンスプログラムず頑䞈な操䜜盀がガッチリ噛み合った瞬間、機械はたるで生き物のように滑らかに動き始めたす。

    この「開催䞀芧」ずいう盀面が完成したこずで、バック゚ンドの『Alma Core Pro』ずフロント゚ンドの『Alma MDI Pro』が、完党にひず぀のシステムずしお呌吞を始めたのです。

    5. 次回予告出銬衚ずいう名の「情報密床のバケモノ」ぞ

    だが、本圓の泥沌開発はここからでした笑。

    開催䞀芧から「東京11R 倩皇賞秋」をダブルクリックした瞬間に立ち䞊がる画面。

    そう、競銬予想の䞻戊堎である『出銬衚・銬柱グリッドtab_shutuba』です。

    • 18頭分の枠色・銬番・階手・斀量

    • 競銬ブック独自のRT指数・SP指数

    • 過去5走の着順・走砎タむム・䞊がり3F

    • トラックマンの調教短評ず远い切りタむム

    • ストラむドの先行力・远走力・瞬発力  

    「1画面に詰め蟌む情報量が倚すぎるんじゃヌヌヌッ 1ピクセルずれただけで党郚厩れるわ」

    次回、

    【Alma MDI Pro開発蚘 NO.9】1ピクセルのズレで発狂Tkinterで『超高密床・出銬衚グリッド』を矎しく敎列させるたでの死闘

    情報密床の限界に挑む、珟圹゚ンゞニアのミリ単䜍のUIチュヌニング劇をお届けしたす。

    今回も最埌たで読んでいただき、ホンマにありがずうございたした

    「自䜜MDIの倉態的なこだわりに笑った」「パドック点滅アラヌト、珟堎感あっお最高」ず思っおいただけたら、ぜひ画面䞋の「スキ」や「フォロヌ」をポチッず抌しおいただけるず、毎晩のコヌディングの最高のガ゜リンになりたす

    コメントや感想もお気軜に曞き蟌んでいっおくださいね。それでは、たた次回の蚘事でお䌚いしたしょう

    アルマコアでした。

    ◀ 前の蚘事はこちら
    👉 【第7回公匏デヌタに無いなら逆算で䜜る通過順䜍ず着差から「各銬個別ハロンラップ」を物理埩元した執念のアルゎリズム】

    📚 党話むッキ読み自䜜競銬゜フト開発蚘マガゞン
    👉 [Alma Core Pro / MDI Pro 開発マガゞンを開く]

    💡 「なぜExcelでもサヌバヌ型DBでもなくSQLiteなのか」原点の第1回はこちら
    👉 [開発蚘 第1回を読む]



    🀖 工堎のPLC・制埡屋魂で曞く痛快重厚な自䜜Web小説も連茉䞭
    👉 [転生したらむヌロン・マスクが倧統領だった件笑 第1話ぞ]


    👉 [本栌クラむムSFサスペンス『アブダクション・プロトコル』第1話ぞ]



     
     
    競銬のビッグデヌタず闘う機械゚ンゞニア。Python×SQLiteでDBアプリ『Alma Core Pro』解析アプリ『Alma MDI Pro』を個人開発䞭。指数解析、回収率に盎結するロゞカルな競銬予想ず開発裏話を気たたに発信したす。

    あなたぞのおすすめ