2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

スリープ時でもGitHubに収集データを自動pushするアーキを作った話

Posted at

1. はじめに

どうも、趣味でデータ分析している猫背なエンジニアです。

いつもN-MAGIだったりKK-Adamでデータをcsvで蓄積して、そのデータを使用しているのですが、「データ保存」という観点でN-MAGIのアルゴにメス入れをしたので記録します。

2. N-MAGIの収集アーキと変更点の概要

■ 既存アーキについて
前提としてN-MAGIは、平日21時頃にNUMBERSの数字を予想するシステムです。フローとしては、みづほ銀行のNUMBERS3,4の当選番号公開情報をスクレイピング、収集したデータをcsvに保存。その後、MAGIに読み込ませて予測結果をXに投稿という流れになっています。
image.png

■ 変更点の概要
NUMBERSの当選番号をスクレイピングして、csvに保存する際にデータを上書きではなくバックアップという方法で毎日のデータを日付保管してました。

これはプロジェクトファイルの1部の写真ですが...続きの言葉はお任せします(笑)
正直言ってローカルで毎日の更新スライスを保存するなんてバグと思っています。 今回はこの部分を修正する過程で、以下の条件を加味して、githubを利用した自動保存アルゴを追加したいと思います。

2. 要件定義

以下に今回のアーキ変更で満たしたい要件を考えました。

1. 前日の収集結果は消す
これに関しては言うまでもなく将来性を考えたときにPCのディスクを圧迫してしまうので、マストで必須なことです。
N-MAGI開発を設計せずにコーディングしてた弊害ですね。設計の重要性が身に沁みます。
image.png

2. my_datasetというリポジトリで管理する
新たにmy_datasetというPublic (※) なリポジトリを作成しました。今後もデータセットを作成する可能性があるので、その中にファイルごとで管理するように追加しました。
※ Publicを強調した理由
publicを強調した理由として、みなさんにも収集したデータを使ってほしいという思いから公開することに決めました。個人サイトで収集した番号を公開されている方もいるのですが、私はセキュリティや更新頻度を含めて常に最新をモットーに公開するので、それを含めてぜひ利用してください。

3. git pushは自動更新する
これに関しては、恒例のめんどくさい病のひとりごと案件です。「あ~githubに自動でpushしてくれないかな~」から始まって、batポチっで動くものを作りたいと思ったためです。

image.png

それでは実際に開発していきましょう

3. 開発開発っ!

■ 1. 前日の収集結果を消す(リソース開放)
現状では垂れ流し状態で、フォルダ内に蓄積していたのですが、収集するpyファイルに以下のようなソースコードを追加することでリソース開放をしました。

リソース開放ソースコード
def merge_data():
    ...
    
    # 今日の日付を取得
    today = datetime.today()
    # 曜日を取得(0=月, 6=日)
    weekday = today.weekday()
    # 土曜日(5)の場合は2日前、日曜日(6)の場合は3日前の木曜日を削除対象 / 月曜日 (0) の場合は3日前の金曜日を削除対象
    if weekday == 5:
        target_date = today - timedelta(days=2)
    elif weekday == 6:
        target_date = today - timedelta(days=3)
    elif weekday == 0:
        target_date = today - timedelta(days=3)
    else:
        target_date = today - timedelta(days=1)
    # フォーマット済み文字列を作成(日付を取得(YYYYMMDD形式))
    today_str = target_date.strftime("%Y%m%d")
    base_path = "D:/01.開発/06Numbers3/numbers_19941007_to_{}.csv"
    csv_path = base_path.format(today_str)
    # --- 前日のCSVを削除 ---
    if os.path.exists(csv_path):
        try:
            os.remove(csv_path)
            print(f'前日のCSVファイルを削除しました: {csv_path}')
        except Exception as e:
            print(f'CSVファイルの削除中にエラーが発生しました: {e}')
    else:
        print(f'前日のCSVファイルは存在しません: {csv_path}')

■ 2. my_datasetというリポジトリで管理する
使用しているデータを開放するためにpublicでmy_datasetというリポジトリを作りました。こちらで今後も最新のNUMBERSの当選番号を管理していきます。
また、ほかにも収集したデータがありましたら随時更新するので、ぜひgitとQiitaアカウントのフォローをお願いします(笑)

■ 3. git pushは自動更新する
最終的なアーキは以下になりました。メインからpushでもよかったのですが、APIトークンなどもあったので、専用のgithubフォルダを作成し、batAからgithub用フォルダ内にあるbatBに指令($ call batB)を出して実行するタスクチェーンにしました。

ぶっちゃけここが一番時間がかかりました。
理由はスリープするとbat B内のプログラムが沈黙するからです(笑)。

3.1 基本的なbatで単体テスト
スリープなど使わない場合は以下のbatでgitにpushできます。しかし、これでは、wake時は通るもののsleepになると通らない。

git push1
@echo off
chcp 65001
:: フォルダへのフルパス
cd "D:\01.開発\98my_dataset\numbers"
git add .
:: 現在時刻を取得してコミットメッセージに使う
for /f %%i in ('powershell -command "Get-Date -Format yyyy-MM-dd_HH-mm-ss"') do set NOW=%%i
git commit -m "Auto update on %NOW%"
git push origin main
:: 完了メッセージ
echo 自動コミット&プッシュが完了しました。

3.2 SSHを使った方法
ある記事でgithubのssh認証をすることで、以降の認証(認証したPCに限る)をPASSできるというのを見ました。そこで、毎回認証をしているので、sleepでは通らない可能性があるという考えに至りました。
案の定、正解でした。 自動実行&スリープ状態でもpushできた時は感動しました。

- 手順1 : github準備&SSH登録/接続準備
こちらのサイトを参考に作成しました。
記事自体は1年前のものになっているのですが、非常に見やすく2025年7月31日時点でのUIでも問題なく設定を進めることができました。

- 手順2 : .sshフォルダを作成、コピーする
githubとPC間のSSH開通後にsshキーが提供されます。提供されたものをSYSTEMユーザ用にコピーし、自作プログラムでも使用できるようにします。そのために、管理者権限付きPowerShellコマンドで以下を実行して、SYSTEM制御用ディレクトリを作成しました。

SYSTEM用ディレクトリを作成(すでにある場合はスキップされます)
mkdir "C:\Windows\System32\config\systemprofile\.ssh"

作成したフォルダにid_rsaおよびid_rsa.pubをコピーする。
※id:各々で違った番号の場合もあるので、発行されたトークンを確認。

ファイルをコピー(管理者で実行すること)
copy "C:\Users\<USERNAME>\.ssh\id_rsa" "C:\Windows\System32\config\systemprofile\.ssh\id_rsa"
copy "C:\Users\<USERNAME>\.ssh\id_rsa.pub" "C:\Windows\System32\config\systemprofile\.ssh\id_rsa.pub"

コピーしたid_rsaのパーミッション(アクセス権)が広すぎるとsshは拒否されます。そのため、セキュリティ担保のためにも以下のおまじないをしておくことで、アクセス権を限定しておくと安心。id_rsaは各々変更してくださいね👍

アクセス権付与
icacls "C:\Windows\System32\config\systemprofile\.ssh\id_rsa" /inheritance:r /grant:r "SYSTEM:R"

- 手順3 : 開通確認
バッチファイル中で以下の環境変数がセットされているか確認し、タイムスケジューラやスリープ状態でbatを実行などして確認してみてください!

最終確認
set "HOME=C:\Windows\System32\config\systemprofile"
set "GIT_SSH_COMMAND=ssh -i %HOME%\.ssh\id_rsa"

- 修正したソースコード
3.1にスリープでも稼働するように修正を加えたものが以下になります。このbatをcsvが配置されているフォルダ内に置きます。私が仕事や旅行で自宅にいなくてもPCに電源を入れていたら自動でpush更新してくれているので、とても便利になりました。
※トークンやgit情報に関しては変更してください。

auto_push.bat
@echo off
chcp 65001
setlocal

:: --- 日時の整形(ファイル名やコミットメッセージ用) ---
for /f "tokens=1-4 delims=/ " %%a in ("%DATE%") do (
    set YYYY=%%a
    set MM=%%b
    set DD=%%c
)
for /f "tokens=1-2 delims=:. " %%a in ("%TIME%") do (
    set HH=%%a
    set MN=%%b
)
set NOW=%YYYY%-%MM%-%DD%_%HH%-%MN%

:: --- SSH環境変数設定 ---
set "HOME=C:\Users\<USERNAME>"
set "GIT_SSH_COMMAND=ssh -i %HOME%\.ssh\id_rsa"

:: --- Dドライブ確認(最大30秒待機) ---
set RETRY=0
:WAIT_LOOP
if exist D:\ (
    echo Dドライブが見つかりました。
) else (
    set /a RETRY+=1
    if %RETRY% GEQ 30 (
        echo Dドライブが見つかりません。中止します。
        exit /b 1
    )
    timeout /t 1 >nul
    goto WAIT_LOOP
)

:: --- Gitユーザー情報(SYSTEMユーザー向け) ---
"C:\Program Files\Git\cmd\git.exe" config --global user.name "<NAME>"
"C:\Program Files\Git\cmd\git.exe" config --global user.email "<EMAIL>"

REM 表示確認
echo --------------------------
"C:\Program Files\Git\cmd\git.exe" config --global user.name
"C:\Program Files\Git\cmd\git.exe" config --global user.email
echo --------------------------

echo --------------------------
echo SSH接続確認完了
ssh -i %HOME%\.ssh\id_rsa -T git@github.com >> D:\01.開発\06Numbers3\log.txt 2>&1
echo --------------------------

echo --------------------------
echo safe.directory設定
:: --- Git safe.directory 設定 ---
"C:\Program Files\Git\cmd\git.exe" config --global --add safe.directory D:/01.開発/98my_dataset
echo --------------------------

echo --------------------------
echo git操作
:: --- Git 操作 ---
"C:\Program Files\Git\cmd\git.exe" add numbers_dataset.csv
"C:\Program Files\Git\cmd\git.exe" commit -m "Auto update on %NOW%"
"C:\Program Files\Git\cmd\git.exe" push origin main
echo --------------------------

echo complete
endlocal

4. 開発完了👍

試行錯誤で悩みはしましたが、自動化は1段落しました。
今後はこのリソース削減版システムで実施していきたいと思います。最近パソコンの圧迫感がすごかったので、とりあえずは一安心ですね。
また、自動更新に関しても時間になったらやってくれているみたいです。以下に毎日更新している当選番号のデータを貼りますね。
いやぁ、どこにも書いていないプログラムだったので、gitのことも知れるいい勉強になったな~(笑)。

おわりに

■ そもそもこのデータってどこで使ってんの?
このデータはMAGI伝記と題して現在運用中のNUMBERS当選番号予測システムのデータとして使用しています。
今回はその前処理の修正・改良をしました。
本編に関しては、私のQiitaを参照していただければと思います。
また、予想結果はTwitter(X)で運用していますので、参考程度に当選番号を見てください!

参考資料

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?