← Extractions

Gregorian Calendar — Norbert Wójtowicz at wroclove.rb 2025

Norbert Wójtowicz walks through 13,000 years of calendar history to build intuition about CPU performance, deploying breaking changes, and when to rewrite systems. He uses Pope Gregory's reform as a case study in patch-based breaking changes, and C++'s Chrono library (by Howard Hinnant) as an example of rewriting on new principles.

Model
claude-opus-4-7
Ingestion
26ea61f9
Input tokens
293,885
fresh
131,429
cached
143,337
cache write
19,119
Output tokens
11,824
Duration
189.9s
Roundtrips
7
Tool calls
15
Cost
$0.00
Nodes/edges extracted
23 / 34
Read set (nodes/edges)
89 / 2

Nodes (23)

update Gregorian Calendar talk
attrs {"type" => "talk"} {"date" => "2025-03-14", "type" => "talk"}
description Talk at wroclove.rb 2025. Norbert Wójtowicz's wroclove.rb 2025 single-speaker talk titled 'Practice What You Preach: Time, the Gregorian Calend...
short_description Talk at wroclove.rb 2025. Norbert Wójtowicz's wroclove.rb 2025 talk using calendar history to teach performance, breaking changes, and rewrites.
create Howard Hinnant person
kind (empty) person
name (empty) Howard Hinnant
slug (empty) howard-hinnant
description (empty) C++ expert who designed the Chrono date/time library. Went through four C++ committee cycles to get progressively mor...
short_description (empty) C++ expert and author of the Chrono date/time library.
create Chrono tool
kind (empty) tool
name (empty) Chrono
slug (empty) chrono
attrs (empty) {"category" => "library", "language" => "C++"}
description (empty) C++ library written by Howard Hinnant, merged into the C++ standard over four committee cycles. Separates three conce...
short_description (empty) C++ standard library for type-safe durations, time points, and calendars.
create Neri–Schneider algorithm concept
kind (empty) concept
name (empty) Neri–Schneider algorithm
slug (empty) neri-schneider-algorithm
attrs (empty) {"category" => "practice"}
description (empty) Algorithm published in a white paper roughly two years before 2025 that computes civil dates from an epoch without an...
short_description (empty) Bleeding-edge branch-free algorithm for epoch-to-date conversion.
create Computus concept
kind (empty) concept
name (empty) Computus
slug (empty) computus
attrs (empty) {"category" => "pattern"}
description (empty) The algorithm to calculate the date of Easter every year. The word is the etymological root of 'computer' and 'comput...
short_description (empty) Algorithm to calculate the date of Easter; etymological root of 'computer'.
create Branch Prediction concept
kind (empty) concept
name (empty) Branch Prediction
slug (empty) branch-prediction
attrs (empty) {"category" => "architecture"}
description (empty) Modern CPUs cannot run faster per core due to physics limits, so they parallelize by speculating past branch instruct...
short_description (empty) Modern-CPU optimization that speculatively executes instructions past a branch.
create Memory Latency concept
kind (empty) concept
name (empty) Memory Latency
slug (empty) memory-latency
attrs (empty) {"category" => "architecture"}
description (empty) On modern multi-core CPUs, memory has become progressively slower relative to the CPU. Even without a cache miss, a p...
short_description (empty) CPU cache / memory access is slow relative to computation on modern hardware.
create Computational Calendar concept
kind (empty) concept
name (empty) Computational Calendar
slug (empty) computational-calendar
attrs (empty) {"category" => "pattern"}
description (empty) Christian Zeller's 1882 reformulation of the calendar: move the start of the year to March so that February — the mon...
short_description (empty) Zeller's 1882 trick of shifting the year start to March so February sits at the end.
create Christian Zeller person
kind (empty) person
name (empty) Christian Zeller
slug (empty) christian-zeller
description (empty) Mathematician who in 1882 published the computational calendar reformulation that shifts the year start to March, mak...
short_description (empty) 19th-century mathematician who introduced the computational calendar in 1882.
create Julian Calendar concept
kind (empty) concept
name (empty) Julian Calendar
slug (empty) julian-calendar
attrs (empty) {"category" => "practice"}
description (empty) Calendar introduced under Julius Caesar in 45 BC (actually finalized by Augustus), based on the Egyptian 365-day sola...
short_description (empty) Calendar reform introduced by Julius Caesar in 45 BC with a 4-year leap rule.
create Gregorian Calendar Reform concept
kind (empty) concept
name (empty) Gregorian Calendar Reform
slug (empty) gregorian-calendar-reform
attrs (empty) {"category" => "practice"}
description (empty) 1582 reform by Pope Gregory XIII. Patched the Julian leap rule by adding 'except divisible by 100, unless also divisi...
short_description (empty) 1582 papal reform patching the Julian leap rule with divisible-by-100/400 exceptions.
create Proleptic Calendar concept
kind (empty) concept
name (empty) Proleptic Calendar
slug (empty) proleptic-calendar
attrs (empty) {"category" => "practice"}
description (empty) A calendar where the modern rule set (typically Gregorian) is applied backwards beyond its historical adoption. How m...
short_description (empty) Applying modern calendar rules backwards in time for convenience.
create Bede person
kind (empty) person
name (empty) Bede
slug (empty) bede
description (empty) Developer-priest-scientist around 725 CE. Figured out the Metonic cycle (235 synodic months = 19 tropical years) and ...
short_description (empty) 8th-century priest-scientist who hand-computed 532 years of Easter dates.
create Hyrum's Law concept
kind (empty) concept
name (empty) Hyrum's Law
slug (empty) hyrum-s-law
attrs (empty) {"category" => "pattern"}
description (empty) Adage invoked in the talk: the way a system actually works is the specification, regardless of what the documentation...
short_description (empty) With enough users, every observable behavior of an API becomes part of its contract.
create Norbert's Golden Rule of Rewriting takeaway
kind (empty) takeaway
name (empty) Norbert's Golden Rule of Rewriting
slug (empty) norbert-s-golden-rule-of-rewriting
attrs (empty) {"type" => "recommendation"}
description (empty) Wójtowicz's rule: rewrite if and only if you want to build on different principles. Principles here means well-define...
short_description (empty) Rewrite if and only if you want to build on different principles.
create Always Measure, Never Assume takeaway
kind (empty) takeaway
name (empty) Always Measure, Never Assume
slug (empty) always-measure-never-assume
attrs (empty) {"type" => "recommendation"}
description (empty) Closing performance lesson: any intuition about what is fast or slow on a CPU will be wrong in 5–10 years as architec...
short_description (empty) Performance intuition is wrong by definition; benchmark with hypothesis before and after.
create Learn to Rephrase Problems takeaway
kind (empty) takeaway
name (empty) Learn to Rephrase Problems
slug (empty) learn-to-rephrase-problems
attrs (empty) {"type" => "recommendation"}
description (empty) Just as school math taught switching between polar and Cartesian coordinates, performance and domain problems become ...
short_description (empty) Switch coordinate systems / abstractions to make hard problems easy.
create Patch Instead of Rewrite Breaking Changes takeaway
kind (empty) takeaway
name (empty) Patch Instead of Rewrite Breaking Changes
slug (empty) patch-instead-of-rewrite-breaking-changes
attrs (empty) {"type" => "recommendation"}
description (empty) Lesson drawn from Pope Gregory's handling of a 1600-year-old customer base. Ship simple and clear patch instructions ...
short_description (empty) Deploy breaking changes as patches on the old rule with a multi-year adoption window.
create Don't Vibe-Code Critical Thinking takeaway
kind (empty) takeaway
name (empty) Don't Vibe-Code Critical Thinking
slug (empty) don-t-vibe-code-critical-thinking
attrs (empty) {"type" => "warning"}
description (empty) Closing warning in 2025: don't vibe-code critical thinking. An LLM cannot solve any of the performance, breaking-chan...
short_description (empty) LLMs can't solve deep performance or domain-modeling problems for you.
create Study The Past takeaway
kind (empty) takeaway
name (empty) Study The Past
slug (empty) study-the-past
attrs (empty) {"type" => "recommendation"}
description (empty) Recurring takeaway: decisions from thousands of years ago still dictate everyday programming, and new research is oft...
short_description (empty) Re-read old papers — compute has caught up with ideas from decades ago.
create Sunday-On-Or-After-Saturday Trick takeaway
kind (empty) takeaway
name (empty) Sunday-On-Or-After-Saturday Trick
slug (empty) sunday-on-or-after-saturday-trick
attrs (empty) {"type" => "recommendation"}
description (empty) When a spec says 'first Sunday after the vernal equinox' (or similar), immediately rewrite it to 'Sunday on or after ...
short_description (empty) Rephrase 'first Sunday after X' as 'Sunday on or after X+1' to eliminate edge cases.
create Don't Auto-Convert Calendar Units takeaway
kind (empty) takeaway
name (empty) Don't Auto-Convert Calendar Units
slug (empty) don-t-auto-convert-calendar-units
attrs (empty) {"type" => "recommendation"}
description (empty) Most calendar libraries silently convert '31 January + 1 month' into 28 February, 1 March, 3 March, February 31, or a...
short_description (empty) Libraries must not pick an answer for '31 January + 1 month' — the domain decides.
create Port Chrono Ideas To Ruby takeaway
kind (empty) takeaway
name (empty) Port Chrono Ideas To Ruby
slug (empty) port-chrono-ideas-to-ruby
attrs (empty) {"type" => "recommendation"}
description (empty) Closing cross-pollination call: even though Chrono is C++ and much of its compile-time machinery is language-specific...
short_description (empty) Take Chrono's abstractions and build an idiomatic Ruby version.

Edges (34)

create Gregorian CalendaraboutMemory Latency
context (empty) Days-in-month quiz teaches memory-latency and L1-cache trade-offs.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) 5e0db792-fa86-4d42-b901-5e745a96bc68
update Norbert WójtowiczauthoredGregorian Calendar
context (empty) Delivered the talk as a single speaker at wroclove.rb 2025.
update Gregorian Calendarpresented_atwroclove.rb 2025
context (empty) Main-stage talk at wroclove.rb 2025.
create Norbert Wójtowiczattendedwroclove.rb 2025
context (empty) Speaker at the conference.
relation (empty) attended
source_node_id (empty) f59530fe-fad2-4834-aaa3-bf68e355fdde
target_node_id (empty) 4a9688cf-482e-48ac-a0b5-de88900bdb2b
create Gregorian CalendaraboutC++
context (empty) Code examples throughout the talk are in C++, including the Chrono walkthrough.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) a4ae6f60-52e5-4262-a674-c64c17968d28
create Gregorian CalendaraboutChrono
context (empty) Chrono is the talk's headline example of rewriting on new principles.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) becb8b08-e7cd-403a-9959-1851aebb7eac
create Gregorian CalendaraboutComputus
context (empty) Talk covers the computus as the original big-data problem and origin of 'computer'.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) 4cc76f18-b744-425f-9f55-b70d7906bf54
create Gregorian CalendaraboutJulian Calendar
context (empty) Julian reform is a central historical beat of the talk.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) dbe9514a-b196-43ad-aa53-dd3c74f5f35d
create Gregorian CalendaraboutGregorian Calendar Reform
context (empty) Pope Gregory's reform is the case study for deploying breaking changes.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) ba437e2e-adda-4602-9fd3-6c12fc632e1a
create Gregorian CalendaraboutBranch Prediction
context (empty) First performance quiz uses leap-year functions to teach branch prediction.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) 3a8f7ad5-9fc4-44d0-b7d4-2a8bc3d99cc9
create Gregorian CalendaraboutNeri–Schneider algorithm
context (empty) Presented as the 4× faster branch-free epoch-to-date algorithm now in .NET 7 and GCC.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) fca55842-416c-4a93-bef0-5cdf9b9f93ad
create Gregorian CalendaraboutComputational Calendar
context (empty) Zeller's 1882 trick is introduced as an example of rephrasing problems.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) cca434e1-78f0-4f2b-ac42-c09ed09466c2
create Gregorian CalendaraboutProleptic Calendar
context (empty) Explains why calendar apps showing ancient dates are proleptic and thus meaningless.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) 42473c5e-55e3-4ac0-8218-61e0a2c9e4a0
create Gregorian CalendaraboutHyrum's Law
context (empty) Invoked when arguing V1 observable behavior becomes the real contract.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) 0a5d05eb-e55c-47c2-a626-4e14379d0d83
create Gregorian Calendarabout.NET
context (empty) Compares .NET 6 and .NET 7 days-from-epoch implementations to illustrate Neri–Schneider's impact.
relation (empty) about
source_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
target_node_id (empty) 6adabc22-a7e5-4b0d-942a-21d5d22737e1
create Christian ZellerauthoredComputational Calendar
context (empty) Introduced the computational calendar reformulation in 1882.
relation (empty) authored
source_node_id (empty) 936b79c3-e035-4e8c-af90-f00443a1a9ce
target_node_id (empty) cca434e1-78f0-4f2b-ac42-c09ed09466c2
create Howard Hinnantworks_onChrono
attrs (empty) {"role" => "author"}
context (empty) Designed Chrono and shepherded it through four C++ committee cycles.
relation (empty) works_on
source_node_id (empty) 5a9fef96-e0a5-4d13-8cc6-d2e5c28ca196
target_node_id (empty) becb8b08-e7cd-403a-9959-1851aebb7eac
create Bedeworks_onComputus
context (empty) Hand-computed 532 years of Easter dates around 725 CE.
relation (empty) works_on
source_node_id (empty) 1ea74f52-5bf4-4d97-8f38-5f218b960b85
target_node_id (empty) 4cc76f18-b744-425f-9f55-b70d7906bf54
create Norbert's Golden Rule of Rewritingfrom_talkGregorian Calendar
context (empty) Articulated in the rewrites section of the talk.
relation (empty) from_talk
source_node_id (empty) 19637a33-e6f3-422b-9e16-bfcf7086a43b
target_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
create Always Measure, Never Assumefrom_talkGregorian Calendar
context (empty) Closing performance lesson.
relation (empty) from_talk
source_node_id (empty) ef041aeb-76b6-45b2-b51f-1776cf0f4ee8
target_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
create Learn to Rephrase Problemsfrom_talkGregorian Calendar
context (empty) Meta-lesson spanning the performance and Chrono sections.
relation (empty) from_talk
source_node_id (empty) 79b775cc-d0c6-41fe-912a-b81acd1f04fb
target_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
create Patch Instead of Rewrite Breaking Changesfrom_talkGregorian Calendar
context (empty) Lesson extracted from Pope Gregory's handling of 1600 years of Julian users.
relation (empty) from_talk
source_node_id (empty) 88661847-e90f-41bd-b416-14d72e1aa41a
target_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
create Don't Vibe-Code Critical Thinkingfrom_talkGregorian Calendar
context (empty) Closing warning about LLM limits in 2025.
relation (empty) from_talk
source_node_id (empty) 84f4c6d5-51a4-450b-b0a1-5f492a3d4e1e
target_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
create Study The Pastfrom_talkGregorian Calendar
context (empty) Closing recommendation to read old papers.
relation (empty) from_talk
source_node_id (empty) eb9bc6b6-5081-48da-bdec-2d7d66aff033
target_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
create Sunday-On-Or-After-Saturday Trickfrom_talkGregorian Calendar
context (empty) Side-lesson from the computus section.
relation (empty) from_talk
source_node_id (empty) 9f2630df-3296-418a-a19b-d80b1e856770
target_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
create Don't Auto-Convert Calendar Unitsfrom_talkGregorian Calendar
context (empty) Extracted from the Chrono walkthrough on '31 January + 1 month'.
relation (empty) from_talk
source_node_id (empty) a3a95102-3e00-4ecd-973c-d98eb999f767
target_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
create Port Chrono Ideas To Rubyfrom_talkGregorian Calendar
context (empty) Closing cross-community recommendation.
relation (empty) from_talk
source_node_id (empty) e1d6ffe8-9e5f-423d-904f-fc03cc54a194
target_node_id (empty) 11d44998-bfe6-4cfb-8ff5-37d5e33400de
create Norbert's Golden Rule of RewritingaboutChrono
context (empty) Chrono is presented as the exemplary rewrite-on-new-principles.
relation (empty) about
source_node_id (empty) 19637a33-e6f3-422b-9e16-bfcf7086a43b
target_node_id (empty) becb8b08-e7cd-403a-9959-1851aebb7eac
create Don't Auto-Convert Calendar UnitsaboutChrono
context (empty) Chrono's refusal to answer '31 January + 1 month' is the reference design.
relation (empty) about
source_node_id (empty) a3a95102-3e00-4ecd-973c-d98eb999f767
target_node_id (empty) becb8b08-e7cd-403a-9959-1851aebb7eac
create Neri–Schneider algorithmrelated_toComputational Calendar
context (empty) Uses Zeller's March-starts-year reformulation as one of its building blocks.
relation (empty) related_to
source_node_id (empty) fca55842-416c-4a93-bef0-5cdf9b9f93ad
target_node_id (empty) cca434e1-78f0-4f2b-ac42-c09ed09466c2
create Gregorian Calendar Reformrelated_toJulian Calendar
context (empty) Gregorian rules patch Julian rules with divisible-by-100/400 exceptions.
relation (empty) related_to
source_node_id (empty) ba437e2e-adda-4602-9fd3-6c12fc632e1a
target_node_id (empty) dbe9514a-b196-43ad-aa53-dd3c74f5f35d
create Chronorelated_toC++
context (empty) Chrono is a C++ standard-library component.
relation (empty) related_to
source_node_id (empty) becb8b08-e7cd-403a-9959-1851aebb7eac
target_node_id (empty) a4ae6f60-52e5-4262-a674-c64c17968d28
create Norbert WójtowiczrecommendsChrono
context (empty) Explicitly recommends studying Chrono and porting its ideas to Ruby.
relation (empty) recommends
source_node_id (empty) f59530fe-fad2-4834-aaa3-bf68e355fdde
target_node_id (empty) becb8b08-e7cd-403a-9959-1851aebb7eac
create Norbert WójtowiczrecommendsStudy The Past
context (empty) Explicit closing recommendation.
relation (empty) recommends
source_node_id (empty) f59530fe-fad2-4834-aaa3-bf68e355fdde
target_node_id (empty) eb9bc6b6-5081-48da-bdec-2d7d66aff033

Read set

89 nodes

talk Gregorian Calendar search_nodes+get_node_edges takeaway Time Travel Superpower search_nodes concept Domain Object Structured Logging search_nodes concept Retrieval Augmented Generation search_nodes resource Falsehoods Programmers Believe About Time search_nodes concept Logux Time-Shift Ordering search_nodes concept Vector Embeddings search_nodes takeaway Name Things To Find Their Properties search_nodes takeaway Port Python Libraries With ChatGPT search_nodes concept Vector Database search_nodes takeaway Balance Lab And Library Time search_nodes question Is time travel the only way to test Time.current? search_nodes concept Time.current Testing Trap search_nodes tool langchainrb search_nodes tool ChatGPT search_nodes resource awesome-ddd search_nodes tool Rust search_nodes concept AI Agent search_nodes takeaway Be kind and build useful things search_nodes tool llama.cpp search_nodes concept Rubber Duck Debugging search_nodes person Norbert Wójtowicz search_nodes company Planuj Wesele search_nodes tool Speaker Deck search_nodes person Michał Bronikowski search_nodes talk Next Token! search_nodes talk Lightning Talk on Email Leaks and Senior Developer Titles search_nodes person Adam Okoń search_nodes talk How to Be Top 10% in Ruby Lightning Talk search_nodes talk Debug like a scientist search_nodes person Jakub Rodzik search_nodes event wroclove.rb 2025 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2018 search_nodes talk Performance Panel wroclove.rb 2024 search_nodes talk Fix Production Bugs 20x Faster search_nodes project Petri Nets Performance Prediction Gem search_nodes concept Loop Unrolling search_nodes concept Performance SLA search_nodes concept Time-Boxed Performance Exploration search_nodes question How to triage performance problems? search_nodes concept Performance Time Budget search_nodes question When should performance optimization end? search_nodes concept Premature optimization search_nodes question What's the most complex performance problem you've solved? search_nodes takeaway Buy Faster Hardware search_nodes takeaway Refactor with clear business merit search_nodes question Phrases to avoid in code review search_nodes takeaway Treat users' rewrites as a loud red flag search_nodes takeaway Prefer conventions over custom code search_nodes concept Commit Transformations search_nodes question Move transformation vs refactoring when tests change search_nodes takeaway Be conservative with breaking changes in mature frameworks search_nodes talk To Refine or Not to Refine search_nodes resource 99 Bottles of OOP search_nodes concept Single Responsibility Principle search_nodes concept GraphQL max_depth search_nodes tool Apollo GraphQL Platform search_nodes project Check search_nodes tool GraphQL search_nodes tool pganalyze search_nodes talk Events events events search_nodes concept Punch Card Programming search_nodes tool C++ search_nodes concept Reactive Programming search_nodes concept Exploratory Programming search_nodes tool LLVM search_nodes tool Wolfram Language search_nodes tool TypeScript search_nodes concept Aspect-Oriented Programming search_nodes tool .NET search_nodes concept Application Logic vs Business Logic search_nodes concept Crossing the Chasm search_nodes concept Account Sharing search_nodes concept Protocol Thinking search_nodes concept Structural Physics of Software search_nodes talk Adventures in durable execution search_nodes takeaway Eventual Consistency Trade-off search_nodes concept Comfort With Layers search_nodes concept Noisy Neighbor Problem search_nodes question Avoiding model duplication across engines search_nodes concept Compiler Pipeline search_nodes tool Babel search_nodes tool Yacc search_nodes tool core-js search_nodes

2 edges