The classic programming puzzle, tackled a few different ways.
Test and lint:
pip install -r requirements.txt
black --check .
flake8 *.py| from typing import Optional | |
| import pandas as pd | |
| from prefect.client.orchestration import get_client | |
| from pydantic import BaseModel | |
| columns = { | |
| "flow_name": "Flow", | |
| "deployment_name": "Deployment", | |
| "schedule": "Schedule", |
| # In IPython: | |
| from prefect.client.orchestration import get_client | |
| from prefect.server.schemas.filters import FlowRunFilter, FlowRunFilterState, FlowRunFilterStateName, FlowRunFilterStartTime, FlowFilterName, FlowFilter, FlowFilterId | |
| async with get_client() as client: | |
| flow = await client.read_flow_by_name("flow-name") | |
| async with get_client() as client: | |
| flow_runs = await client.read_flow_runs( |
Garmin watches can broadcast heartrate over ant+ eg. forerunner 235
Wahoo units can receive heartrate data from ant+. See.
See also:
| #!/bin/bash | |
| function log_error() { | |
| msg=$1 | |
| echo $msg >&2 | |
| } | |
| function bump() { | |
| target_version=$1 |
| #!/usr/bin/env python3 | |
| """Utility to produce the hash of a collection of file and directory paths. | |
| Usage:: | |
| ./hash_paths.py --help | |
| """ | |
| import argparse | |
| import hashlib | |
| import io |
| """ | |
| """ | |
| from argparse import ArgumentParser | |
| from artifacts_keyring import CredentialProvider # type: ignore | |
| def get_artifact_token(organization: str, feed: str) -> str: | |
| """Get credentials for an azure artifacts feed.""" | |
| provider = CredentialProvider() |
| """ | |
| Utilities for weighted means on DataFrames. | |
| """ | |
| from functools import partial | |
| from typing import Callable | |
| import pandas as pd | |
| def weighted_mean(frame: pd.DataFrame, value_col: str, weight_col: str) -> float: |
| """An example of table reflection with SQLAlchemy. | |
| Test with Python 3.10 & SQLAlchemy 2.0. | |
| See: https://stackoverflow.com/a/75389730/4244912 | |
| """ | |
| from sqlalchemy import Table, create_engine, text | |
| from sqlalchemy.orm import DeclarativeBase, Session | |
| # Create a SQLAlchemy engine connected to an in-memory SQLite3 DB: |
I bought Into the Breach on Galaxy of Gaming for linux on release. In July 2022, Subset games released Into the Breach Advanced Edition, [(1)][1] a free expansion of the original. This article details how I upgraded and moved my save game files across to the latest version of the game.
Game save data is stored in files with the names in the foramt: profile_{Name}. [(2)][2]
The first version I installed was GOG v1.0.10 (2-28-2018). This version was run via wine [(3)][3], and installed to ~/.wine/dosdevices/c:/GOG Games/Into the Breach/. The save game files (eg. profile_Alpha) were saved in the top level of this directory.
I installed the latest version of Into the Breach from GOG as of Feb 2023: v. 1.2.86 (10-10-2022). The installer prompted for an install location, with a default of ~/GOG Games/Into the Breach. I chose the default location and let the intaller create a desktop file etc. On install, it was clearly quite different to the old version