Mac Applications and Utilities Banner

Mac Applications & Utilities

This is the working set of Mac applications I actually use, grouped by the job they do rather than by category of app. Most of these I have paid for at some point - the investment has usually been justified within a week. A handful are free and just happen to be best-in-class. For command-line tooling installed through Homebrew, see the companion Mac Homebrew Packages page. Legend: 🆓 Free - 💰 Paid or Freemium ...

April 4, 2026 · 3 min · James M
Data Engineering Courses

Data Engineering & Data Science Courses

How to Use This Guide This curated list covers courses from beginner to advanced levels across multiple platforms. Choose based on: Your role: Data Engineer, Data Analyst, or Data Scientist Learning style: Self-paced courses, specializations, or nanodegrees Timeline: Single courses (weeks) vs. comprehensive programs (months) Hands-on practice: Most include projects and real-world scenarios Cloud platform: AWS, GCP, Azure, or multi-cloud approaches Data Engineering Professional Certificates (Industry-Backed) Best for: Structured learning with recognized credentials ...

April 4, 2026 · 6 min · James M
Databricks CheatSheet

Databricks CheatSheet

Quick Start This cheatsheet covers essential Databricks notebook commands, SQL operations, PySpark transformations, and optimization techniques for the lakehouse platform. Databricks Notebook Commands Magic commands provide shortcuts for common operations in Databricks notebooks: Command Purpose Use Case %python Executes python code (default language) PySpark transformations, data processing %sql Executes SQL queries Querying tables and views %scala Executes scala code Spark API operations, JVM access %r Execute R code Statistical analysis and visualization %sh Shell commands on cluster nodes Git operations, system utilities %fs Databricks file system operations File management, DBFS interactions %md Markdown text formatting Documentation and cell titles %pip Install Python packages Adding Python dependencies %env Set environment variables Configuration and secrets %config Notebook configuration options Display settings, execution parameters %jobs Lists all running jobs Job monitoring %load Load external file contents Include external code %reload Reload Python modules Refresh imports %run Execute another notebook Code reuse and modularization %lsmagic List all available magic commands Discovery %who List variables in current scope Debugging and variable inspection %matplotlib Configure matplotlib backend Visualization setup Notebook Widgets # Create widgets dbutils.widgets.text("param_name", "default_value", "label") dbutils.widgets.dropdown("param_name", "default", ["option1", "option2"]) dbutils.widgets.multiselect("param_name", "default", ["option1", "option2"]) dbutils.widgets.combobox("param_name", "default", ["option1", "option2"]) # Get widget values param_value = dbutils.widgets.get("param_name") # Remove widget dbutils.widgets.remove("param_name") dbutils.widgets.removeAll() Secrets Management # Create secret scope dbutils.secrets.createScope("scope_name") # Store secret dbutils.secrets.put("scope_name", "secret_key", "secret_value") # Retrieve secret secret_value = dbutils.secrets.get("scope_name", "secret_key") # List secrets dbutils.secrets.list("scope_name") # Delete secret dbutils.secrets.delete("scope_name", "secret_key") Accessing Files /path/to/file (local) dbfs:/path/to/file (DBFS) file:/path/to/file (driver filesystem) s3://path/to/file (S3) /Volumes/catalog/schema/volume/path (Unity Catalog Volumes) Copying Files %fs cp file:/<path> /Volumes/<catalog>/<schema>/<volume>/<path> %python dbutils.fs.cp("file:/<path>", "/Volumes/<catalog>/<schema>/<volume>/<path>") %python dbutils.fs.cp("file:/databricks/driver/test", "dbfs:/repo", True) %sh cp /<path> /Volumes/<catalog>/<schema>/<volume>/<path> SQL Statements DDL - Data Definition Language (Schema & Table Operations) Create & Use Schema CREATE SCHEMA test; CREATE SCHEMA custom LOCATION 'dbfs:/custom'; USE SCHEMA test; Unity Catalog (UC) -- Create catalog CREATE CATALOG my_catalog COMMENT "Production catalog"; -- Create schema in UC CREATE SCHEMA my_catalog.my_schema; USE CATALOG my_catalog; USE SCHEMA my_schema; -- Create volume (for files) CREATE VOLUME my_catalog.my_schema.my_volume; ALTER VOLUME my_catalog.my_schema.my_volume OWNER TO `team@company.com`; -- List catalogs, schemas, volumes SHOW CATALOGS; SHOW SCHEMAS IN my_catalog; SHOW VOLUMES IN my_catalog.my_schema; -- Grant permissions GRANT USAGE ON CATALOG my_catalog TO `user@company.com`; GRANT READ_VOLUME ON VOLUME my_catalog.my_schema.my_volume TO `user@company.com`; Create Table CREATE TABLE test(col1 INT, col2 STRING, col3 STRING, col4 BIGINT, col5 INT, col6 FLOAT); CREATE TABLE test AS SELECT * EXCEPT (_rescued_data) FROM read_files('/repo/data/test.csv'); CREATE TABLE test USING CSV LOCATION '/repo/data/test.csv'; CREATE TABLE test USING CSV OPTIONS (header="true") LOCATION '/repo/data/test.csv'; CREATE TABLE test AS SELECT * EXCEPT (_rescued_data) FROM read_files('/repo/data/test.csv'); CREATE TABLE test AS ... CREATE TABLE test USING ... CREATE TABLE test(id INT, title STRING, col1 STRING, publish_time BIGINT, pages INT, price FLOAT) COMMENT 'This is comment for the table itself'; CREATE TABLE test AS SELECT * EXCEPT (_rescued_data) FROM read_files('/repo/data/test.json', format => 'json'); CREATE TABLE test_raw AS SELECT * EXCEPT (_rescued_data) FROM read_files('/repo/data/test.csv', sep => ';'); CREATE TABLE custom_table_test LOCATION 'dbfs:/custom-table' AS SELECT * EXCEPT (_rescued_data) FROM read_files('/repo/data/test.csv'); CREATE TABLE test PARTITIONED BY (col1) AS SELECT * EXCEPT (_rescued_data) FROM read_files('/repo/data/test.csv') CREATE TABLE users( firstname STRING, lastname STRING, full_name STRING GENERATED ALWAYS AS (concat(firstname, ' ', lastname)) ); CREATE OR REPLACE TABLE test AS SELECT * EXCEPT (_rescued_data) FROM read_files('/repo/data/test.csv'); CREATE OR REPLACE TABLE test AS SELECT * FROM json.`/repo/data/test.json`; CREATE OR REPLACE TABLE test AS SELECT * FROM read_files('/repo/data/test.csv'); Create View CREATE VIEW view_test AS SELECT * FROM test WHERE col1 = 'test'; CREATE VIEW view_test AS SELECT col1, col1 FROM test JOIN test2 ON test.col2 == test2.col2; CREATE TEMP VIEW temp_test AS SELECT * FROM test WHERE col1 = 'test'; CREATE TEMP VIEW temp_test AS SELECT * FROM read_files('/repo/data/test.csv'); CREATE GLOBAL TEMP VIEW view_test AS SELECT * FROM test WHERE col1 = 'test'; SELECT * FROM global_temp.view_test; CREATE TEMP VIEW jdbc_example USING JDBC OPTIONS ( url "<jdbc-url>", dbtable "<table-name>", user '<username>', password '<password>'); CREATE OR REPLACE TEMP VIEW test AS SELECT * FROM delta.`<logpath>`; CREATE VIEW event_log_raw AS SELECT * FROM event_log("<pipeline-id>"); CREATE OR REPLACE TEMP VIEW test_view AS SELECT test.col1 AS col1 FROM test_table WHERE col1 = 'value1' ORDER BY timestamp DESC LIMIT 1; Drop & Describe DROP TABLE test; SHOW TABLES; DESCRIBE EXTENDED test; DML - Data Manipulation Language (Data Operations) Select SELECT * FROM csv.`/repo/data/test.csv`; SELECT * FROM read_files('/repo/data/test.csv'); SELECT * FROM read_files('/repo/data/test.csv', format => 'csv', header => 'true', sep => ',') SELECT * FROM json.`/repo/data/test.json`; SELECT * FROM json.`/repo/data/*.json`; SELECT * FROM test WHERE year(from_unixtime(test_time)) > 1900; SELECT * FROM test WHERE title LIKE '%a%' SELECT * FROM test WHERE title LIKE 'a%' SELECT * FROM test WHERE title LIKE '%a' SELECT * FROM test TIMESTAMP AS OF '2024-01-01T00:00:00.000Z'; SELECT * FROM test VERSION AS OF 2; SELECT * FROM test@v2; SELECT * FROM event_log("<pipeline-id>"); SELECT count(*) FROM VALUES (NULL), (10), (10) AS example(col); SELECT count(col) FROM VALUES (NULL), (10), (10) AS example(col); SELECT count_if(col1 = 'test') FROM test; SELECT from_unixtime(test_time) FROM test; SELECT cast(test_time / 1 AS timestamp) FROM test; SELECT cast(cast(test_time AS BIGINT) AS timestamp) FROM test; SELECT element.sub_element FROM test; SELECT flatten(array(array(1, 2), array(3, 4))); SELECT * FROM ( SELECT col1, col2 FROM test ) PIVOT ( sum(col1) for col2 in ('item1','item2') ); SELECT *, CASE WHEN col1 > 10 THEN 'value1' ELSE 'value2' END FROM test; SELECT * FROM test ORDER BY (CASE WHEN col1 > 10 THEN col2 ELSE col3 END); WITH t(col1, col2) AS (SELECT 1, 2) SELECT * FROM t WHERE col1 = 1; SELECT details:flow_definition.output_dataset as output_dataset, details:flow_definition.input_datasets as input_dataset FROM event_log_raw, latest_update WHERE event_type = 'flow_definition' AND origin.update_id = latest_update.id; Insert INSERT OVERWRITE test SELECT * FROM read_files('/repo/data/test.csv'); INSERT INTO test(col1, col2) VALUES ('value1', 'value2'); Merge Into MERGE INTO test USING test_to_delete ON test.col1 = test_to_delete.col1 WHEN MATCHED THEN DELETE; MERGE INTO test USING test_to_update ON test.col1 = test_to_update.col1 WHEN MATCHED THEN UPDATE SET *; MERGE INTO test USING test_to_insert ON test.col1 = test_to_insert.col1 WHEN NOT MATCHED THEN INSERT *; Copy Into COPY INTO test FROM '/repo/data' FILEFORMAT = CSV FILES = ('test.csv') FORMAT_OPTIONS('header' = 'true', 'inferSchema' = 'true'); Spark DataFrame API PySpark is the Python API for Apache Spark, enabling distributed data processing on the Databricks platform. ...

April 4, 2026 · 9 min · James M
Artemis II breaking the human distance record beyond the lunar far side

Artemis II: Breaking the Distance Record

As the Orion spacecraft sweeps around the lunar far side, the four-person crew of Artemis II is doing more than just testing hardware - they are venturing further into the cosmos than any human being has ever traveled. Surpassing Apollo 13 For over five decades, the record for the farthest distance humans have traveled from Earth was held by the crew of Apollo 13. In April 1970, due to an emergency “free-return” trajectory, Jim Lovell, Jack Swigert, and Fred Haise reached a distance of approximately 400,171 kilometers (248,655 miles) from Earth. ...

April 4, 2026 · 2 min · James M
Native Instruments Formal Insolvency and MA

Native Instruments: From Preliminary Insolvency to M&A - What Comes Next

TL;DR Native Instruments has moved from preliminary to formal insolvency proceedings and is simultaneously in active M&A talks with multiple interested buyers - a controlled restructuring, not a death spiral The numbers: roughly €288 million in cumulative losses across 2023-2024 against looming debt maturities of about €262 million Operations continue - products ship, support runs - but CEO Nick Williams’ message is clear: the company needs a new ownership structure to survive The private equity chapter is where much of the community’s anger is justifiably directed - debt-loaded expansion strategy meeting a declining market What happens next depends on who buys and why; the hopeful scenario is a buyer who wants the instruments business, not just the assets When Native Instruments entered preliminary insolvency in late January, it felt like a seismic moment. Two months later, the picture has gotten clearer - and in some ways, more complex. The company has now moved into formal insolvency proceedings, and simultaneously revealed it’s in active merger and acquisition talks with multiple interested buyers. This isn’t a bankruptcy death spiral; it’s a controlled restructuring. But it raises harder questions about what went wrong, and what salvation might actually look like. ...

April 4, 2026 · 6 min · James M
Taste is the new scarcity - judgment in an age of AI abundance

Taste Is the New Scarcity

TL;DR When AI can generate thousands of solutions on demand, the bottleneck shifts from thinking capacity to judgment - knowing which answer is actually right Taste - the ability to recognise what is elegant, insightful, or truly worth building - becomes the primary skill rather than a secondary one layered on top of expertise Editing and curation become more valuable than creation; the ability to say “no” to a thousand options and hold out for the right one is rare and increasingly prized Experience still matters, but for a different reason - not to accumulate facts, but to develop the discernment that recognises quality when you see it In a world of abundant intelligence, wisdom - knowing not just what you can do but what you should do - becomes the most distinctly human and most valuable contribution If intelligence is becoming a commodity, then something else becomes precious. ...

April 4, 2026 · 6 min · James M
Polkadot 2026 From Infrastructure to Applications Banner

Polkadot 2026: From Infrastructure to Applications

TL;DR Polkadot’s 2026 story is a pivot from infrastructure to user-facing applications, backed by Polkadot 2.0’s three pillars (Asynchronous Backing, Agile Coretime, Elastic Scaling) now live - Moonbeam and Astar reported 3-5x throughput gains The March 2026 tokenomics overhaul introduced a hard cap of 2.1 billion DOT, dropping annual inflation from 7.2% to 3.1% in the first year Revive combines the RISC-V PolkaVM with a fully compliant EVM interpreter, so teams get Polkadot performance without abandoning Ethereum tooling The market has not caught up: as of April 2026, DOT trades around $1.24, roughly 97.9% below its all-time high, despite the protocol-level progress JAM (Polkadot 3.0) reached a near-final v0.8 specification in early 2026, with mainnet expected later in the year or beyond The Pivot Year: Polkadot’s Strategic Shift in 2026 Polkadot has undergone a fundamental transformation in 2025-2026. After years of building infrastructure layers, the ecosystem is making a decisive pivot toward user-facing applications. This isn’t just a narrative shift - it’s embedded in technical upgrades, tokenomics redesigns, and validator economics that reflect a maturing network ready to compete at the application layer. ...

April 4, 2026 · 5 min · James M
NASA Artemis II mission tracking dashboards and real-time resources

NASA Artemis II Tracking Dashboards

About NASA’s Artemis II mission represents a critical step in returning humans to the Moon. Real-time tracking dashboards provide the public with live updates on mission status, vehicle telemetry, and launch preparations. These dashboards showcase NASA’s commitment to transparency, allowing space enthusiasts and stakeholders to monitor every aspect of the mission as it unfolds. Official Resources Artemis II - NASA.gov - Official NASA information and resources for the Artemis II mission. ...

April 4, 2026 · 2 min · James M
Personal AI development stack

Personal AI Development Stack

This guide documents a highly productive, AI-driven development stack using cloud-based LLMs, terminal tools, IDEs, and mobile access. It is designed for developers who want persistent workflows, AI-powered coding assistance, and flexible access from multiple devices. TL;DR Primary IDE: Cursor AI for daily work, Claude Code CLI for multi-file refactors. Local completions: Ollama with Qwen 2.5 Coder or Llama 3.3 to keep latency low and costs at zero. Routing: OpenRouter as a single API gateway; LiteLLM if you want fallback chains. Persistence: tmux sessions survive disconnects; Tailscale makes your MacBook reachable from an iPhone without port forwarding. Total baseline: around $20/month (Cursor only) scaling to $40-50/month plus API usage for the full stack. Architecture Overview Hardware & Connectivity An iPhone connects over Tailscale VPN to a MacBook Air. The MacBook runs tmux or zellij for session persistence, alongside Lungo or Patterned as keep-awake utilities. ...

April 3, 2026 · 10 min · James M
Databricks Training and Certification

Databricks Training & Certification

Overview Databricks offers certification tracks aligned to common roles: Data Engineer, Data Analyst, Apache Spark Developer, Machine Learning Engineer, and Generative AI Engineer. All certifications: Validity: 2 years from pass date Cost: $200 per exam attempt Format: Multiple choice, proctored online Recent Updates (2026): Emphasis on Lakeflow Declarative Pipelines (the evolution of DLT), Unity Catalog, liquid clustering, predictive optimization, AUTO CDC, Lakehouse Federation, and serverless compute Choose a certification based on your: ...

April 3, 2026 · 4 min · James M