From 61edb5cb197e6cd3bab1c38f03383c529d7ce1f4 Mon Sep 17 00:00:00 2001 From: wygud Date: Wed, 1 Oct 2025 09:26:18 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=9F=A2=20config/conf.toml=20for=20updated?= =?UTF-8?q?=20UI=20font=20size=20and=20graphics=20throttle=20=F0=9F=9B=A0?= =?UTF-8?q?=EF=B8=8F=20piker/cli/=5F=5Finit=5F=5F.py=20->=20Changed=20tran?= =?UTF-8?q?sport=20from=20UDP=20to=20TCP=20in=20service=20manager=20?= =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20piker/data/=5Fsymcache.py=20->=20Added?= =?UTF-8?q?=20recursive=20dict=20cleaning=20for=20TOML=20serialization=20?= =?UTF-8?q?=F0=9F=9B=A0=EF=B8=8F=20piker/fsp/=5Fapi.py=20->=20Hash-based?= =?UTF-8?q?=20key=20for=20shared=20memory=20buffers=20(macOS=20compatibili?= =?UTF-8?q?ty)=20=F0=9F=9B=A0=EF=B8=8F=20piker/tsp/=5F=5Finit=5F=5F.py=20-?= =?UTF-8?q?>=20Hash-based=20key=20for=20history=20buffers=20for=20macOS=20?= =?UTF-8?q?compatibility=20=F0=9F=9B=A0=EF=B8=8F=20piker/ui/=5Fdisplay.py?= =?UTF-8?q?=20->=20Modified=20SHM=20name=20assertion=20for=20macOS=20compa?= =?UTF-8?q?tibility?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/conf.toml | 6 ++++-- piker.sh | 20 ++++++++++++++++++++ piker/cli/__init__.py | 4 ++-- piker/data/_symcache.py | 13 ++++++++++++- piker/fsp/_api.py | 8 ++++++-- piker/tsp/__init__.py | 8 ++++++-- piker/ui/_display.py | 4 +++- pikerd.sh | 20 ++++++++++++++++++++ 8 files changed, 73 insertions(+), 10 deletions(-) create mode 100755 piker.sh create mode 100755 pikerd.sh diff --git a/config/conf.toml b/config/conf.toml index a14f6bdd..ca70121d 100644 --- a/config/conf.toml +++ b/config/conf.toml @@ -4,9 +4,11 @@ tsdb.host = 'localhost' tsdb.grpc_port = 5995 [ui] -# set custom font + size which will scale entire UI +# set custom font + size which will scale entire UI~ # font_size = 16 +# font_size = 32 # font_name = 'Monospaced' # colorscheme = 'default' # UNUSED -# graphics.update_throttle = 60 # Hz # TODO +# graphics.update_throttle = 120 # Hz #PENDING TODO + diff --git a/piker.sh b/piker.sh new file mode 100755 index 00000000..a16a32c0 --- /dev/null +++ b/piker.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# macOS wrapper for piker to handle missing XDG_RUNTIME_DIR + +# Set up runtime directory for macOS if not already set +if [ -z "$XDG_RUNTIME_DIR" ]; then + # Use macOS standard temp directory with user-specific subdirectory + export XDG_RUNTIME_DIR="/tmp/piker-runtime-$(id -u)" + + # Create the directory if it doesn't exist + if [ ! -d "$XDG_RUNTIME_DIR" ]; then + mkdir -p "$XDG_RUNTIME_DIR" + # Set proper permissions (only user can access) + chmod 700 "$XDG_RUNTIME_DIR" + fi + + echo "Set XDG_RUNTIME_DIR to: $XDG_RUNTIME_DIR" +fi + +# Run piker with all passed arguments +exec uv run piker "$@" \ No newline at end of file diff --git a/piker/cli/__init__.py b/piker/cli/__init__.py index 4fefaae6..fdecb818 100644 --- a/piker/cli/__init__.py +++ b/piker/cli/__init__.py @@ -183,8 +183,8 @@ def pikerd( registry_addrs=regaddrs, loglevel=loglevel, debug_mode=pdb, - enable_transports=['uds'], - # enable_transports=['tcp'], + # enable_transports=['uds'], + enable_transports=['tcp'], ) as service_mngr, ): assert service_mngr diff --git a/piker/data/_symcache.py b/piker/data/_symcache.py index fc1057a0..cbdf05ca 100644 --- a/piker/data/_symcache.py +++ b/piker/data/_symcache.py @@ -92,6 +92,15 @@ class SymbologyCache(Struct): def write_config(self) -> None: + def clean_dict_for_toml(d): + '''Remove None values from dict recursively for TOML serialization''' + if isinstance(d, dict): + return {k: clean_dict_for_toml(v) for k, v in d.items() if v is not None} + elif isinstance(d, list): + return [clean_dict_for_toml(item) for item in d if item is not None] + else: + return d + # put the backend's pair-struct type ref at the top # of file if possible. cachedict: dict[str, Any] = { @@ -112,7 +121,9 @@ class SymbologyCache(Struct): dct = cachedict[key] = {} for key, struct in table.items(): - dct[key] = struct.to_dict(include_non_members=False) + raw_dict = struct.to_dict(include_non_members=False) + # Clean None values for TOML compatibility + dct[key] = clean_dict_for_toml(raw_dict) try: with self.fp.open(mode='wb') as fp: diff --git a/piker/fsp/_api.py b/piker/fsp/_api.py index 92f8f271..bb2dea50 100644 --- a/piker/fsp/_api.py +++ b/piker/fsp/_api.py @@ -200,9 +200,13 @@ def maybe_mk_fsp_shm( ) # (attempt to) uniquely key the fsp shm buffers + # Use hash for macOS compatibility (31 char limit) + import hashlib actor_name, uuid = tractor.current_actor().uid - uuid_snip: str = uuid[:16] - key: str = f'piker.{actor_name}[{uuid_snip}].{sym}.{target.name}' + # Create short hash of sym and target name + content = f'{sym}.{target.name}' + content_hash = hashlib.md5(content.encode()).hexdigest()[:8] + key: str = f'{uuid[:8]}_{content_hash}.fsp' shm, opened = maybe_open_shm_array( key, diff --git a/piker/tsp/__init__.py b/piker/tsp/__init__.py index 121fcbb7..830e8aba 100644 --- a/piker/tsp/__init__.py +++ b/piker/tsp/__init__.py @@ -1257,13 +1257,17 @@ async def manage_history( service: str = name.rstrip(f'.{mod.name}') fqme: str = mkt.get_fqme(delim_char='') + # Create a short hash of the fqme for macOS compatibility + import hashlib + fqme_hash = hashlib.md5(fqme.encode()).hexdigest()[:8] + # (maybe) allocate shm array for this broker/symbol which will # be used for fast near-term history capture and processing. hist_shm, opened = maybe_open_shm_array( size=_default_hist_size, append_start_index=_hist_buffer_start, - key=f'piker.{service}[{uuid[:16]}].{fqme}.hist', + key=f'{uuid[:8]}_{fqme_hash}.h', # use any broker defined ohlc dtype: dtype=getattr(mod, '_ohlc_dtype', def_iohlcv_fields), @@ -1282,7 +1286,7 @@ async def manage_history( rt_shm, opened = maybe_open_shm_array( size=_default_rt_size, append_start_index=_rt_buffer_start, - key=f'piker.{service}[{uuid[:16]}].{fqme}.rt', + key=f'{uuid[:8]}_{fqme_hash}.r', # use any broker defined ohlc dtype: dtype=getattr(mod, '_ohlc_dtype', def_iohlcv_fields), diff --git a/piker/ui/_display.py b/piker/ui/_display.py index 690bfb18..514a5850 100644 --- a/piker/ui/_display.py +++ b/piker/ui/_display.py @@ -212,7 +212,9 @@ async def increment_history_view( hist_chart: ChartPlotWidget = ds.hist_chart hist_viz: Viz = ds.hist_viz # viz: Viz = ds.viz - assert 'hist' in hist_viz.shm.token['shm_name'] + # NOTE: Changed for macOS compatibility with shortened shm names + # assert 'hist' in hist_viz.shm.token['shm_name'] + assert hist_viz.shm.token['shm_name'].endswith('.h') # name: str = hist_viz.name # TODO: seems this is more reliable at keeping the slow diff --git a/pikerd.sh b/pikerd.sh new file mode 100755 index 00000000..447e1370 --- /dev/null +++ b/pikerd.sh @@ -0,0 +1,20 @@ +#!/usr/bin/env bash +# macOS wrapper for pikerd to handle missing XDG_RUNTIME_DIR + +# Set up runtime directory for macOS if not already set +if [ -z "$XDG_RUNTIME_DIR" ]; then + # Use macOS standard temp directory with user-specific subdirectory + export XDG_RUNTIME_DIR="/tmp/piker-runtime-$(id -u)" + + # Create the directory if it doesn't exist + if [ ! -d "$XDG_RUNTIME_DIR" ]; then + mkdir -p "$XDG_RUNTIME_DIR" + # Set proper permissions (only user can access) + chmod 700 "$XDG_RUNTIME_DIR" + fi + + echo "Set XDG_RUNTIME_DIR to: $XDG_RUNTIME_DIR" +fi + +# Run pikerd with all passed arguments +exec uv run pikerd "$@" \ No newline at end of file