<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Leon Adato</title>
    <description>The latest articles on DEV Community by Leon Adato (@leonadato).</description>
    <link>https://dev.to/leonadato</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F830558%2F63535160-bcf9-44d2-9565-f6b2891fd757.jpg</url>
      <title>DEV Community: Leon Adato</title>
      <link>https://dev.to/leonadato</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leonadato"/>
    <language>en</language>
    <item>
      <title>Time Data Series: Written In Our Stars</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Wed, 08 Jul 2026 13:49:37 +0000</pubDate>
      <link>https://dev.to/leonadato/time-data-series-written-in-our-stars-2jhi</link>
      <guid>https://dev.to/leonadato/time-data-series-written-in-our-stars-2jhi</guid>
      <description>&lt;p&gt;&lt;a href="https://www.adatosystems.com/2024/10/07/time-data-series-the-rest-of-the-story/" rel="noopener noreferrer"&gt;Once upon a time&lt;/a&gt;&amp;nbsp;(i.e. way back in October 2024) I wrapped up a blog in&amp;nbsp;&lt;a href="https://www.adatosystems.com/?s=time+data+series" rel="noopener noreferrer"&gt;this series&lt;/a&gt;&amp;nbsp;with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Believe it or not, there’s still more to cover. In the&amp;nbsp;coming weeks&amp;nbsp;whenever I get to it, I’d like to cover ways to leverage the built-in astronomy functions for time calculations. Believe it or not, it can really matter in terms of having truly accurate times for things like the start and end of Shabbat and holidays, along with other observances.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And here we are in 2025, when it’s finally time for me to fulfill that promise, and talk about how the&amp;nbsp;&lt;a href="https://github.com/KosherJava/zmanim" rel="noopener noreferrer"&gt;KosherJava library&lt;/a&gt;&amp;nbsp;(and by extension, the&amp;nbsp;&lt;a href="https://github.com/zachweix/PhpZmanim" rel="noopener noreferrer"&gt;PHP Zmanim port&lt;/a&gt;&amp;nbsp;I’ll be using in this blog) can help you calculate and display what amount to straight astronomy in your application or web page.&lt;/p&gt;

&lt;p&gt;Once again I need to begin by expressing my deep gratitude to Zachary Weixelbaum and Eliyahu Hershfeld, who both continue to answer so many of my persistent (and often basic) questions with patience, care, and good humor.&lt;/p&gt;

&lt;h2&gt;
  
  
  The House of the Rising Sun
&lt;/h2&gt;

&lt;p&gt;The core aspect of what I’m showing is fairly simple: For a specific location (latitude/longitude, plus timezone) and date, find the time of day that the sun will be at a given elevation point.&lt;/p&gt;

&lt;p&gt;Or to be even more specific: At what time will the sun be at 20 degrees above the horizon on June 10, 2025 in Cleveland? So let’s break down the key elements of PHP Zmanim we’ll be focusing on today.&lt;/p&gt;

&lt;p&gt;These two lines load the parts of the PHP library we’ll be using.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpZmanim\Geo\GeoLocation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpZmanim\Calendar\ComplexZmanimCalendar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we set up a location object (using variables for location name, latitude, longitude, elevation, and time zone); and a calendar object (using the location object we just instantiated along with the year, month, and day):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GeoLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$locname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$long&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$elev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$tz&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$zmanim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ComplexZmanimCalendar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$getyear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$getmonth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$getday&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, the code that calculates and displays the results:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$sunrise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$zmanim&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getsunrise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$twenty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$zmanim&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getSunriseOffsetByDegrees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"sunrise: &lt;/span&gt;&lt;span class="nv"&gt;$sunrise&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;20 degrees: &lt;/span&gt;&lt;span class="nv"&gt;$twenty&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If playing along at home, I should explain that I grabbed both the regular sunrise simply as a reference to the time at which the sun is 20 degrees up in the sky.&lt;/p&gt;

&lt;p&gt;I also need to explain that yes, I know that&amp;nbsp;&lt;code&gt;70&lt;/code&gt;&amp;nbsp;is not&amp;nbsp;&lt;code&gt;20&lt;/code&gt;, so how does THAT work out? The &lt;code&gt;getSunriseOffsetByDegrees&lt;/code&gt; function “thinks” of the sun as being at 0 degrees when it’s at its zenith, and 90 degrees at the horizon line. So for the purposes of this function going up (higher in the sky) causes the degree value to go down.&lt;/p&gt;

&lt;p&gt;The full code looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpZmanim\Zmanim&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Carbon\Carbon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpZmanim\Calendar\ComplexZmanimCalendar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;PhpZmanim\Geo\GeoLocation&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;# Set variables:&lt;/span&gt;
&lt;span class="c1"&gt;#41.4939407, -81.516709;&lt;/span&gt;
&lt;span class="nv"&gt;$locname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Beit Knesset Chochmat Shlomo, Beachwood, OH"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$lat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;41.4939407&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$long&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;81.516709&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$elev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$tz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'America/New_York'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$getyear&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2025"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$getmonth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"06"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$getday&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"10"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GeoLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$locname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$long&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$elev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$tz&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$zmanim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ComplexZmanimCalendar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$getyear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$getmonth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$getday&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$sunrise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$zmanim&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getsunrise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$twenty&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$zmanim&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getSunriseOffsetByDegrees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"sunrise: &lt;/span&gt;&lt;span class="nv"&gt;$sunrise&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;20 degrees: &lt;/span&gt;&lt;span class="nv"&gt;$twenty&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When the Night Has Come, and the Land is Dark…
&lt;/h2&gt;

&lt;p&gt;I’m sure there are useful reasons to know the time when the sun is at a certain point in the sky during the day, but from a religious perspective, there are far more reasons to want to know when the sun is below the horizon line. I say “religious” because I can think of at least two that care about the time of the sun’s position before sunrise: Judaism and Islam.&lt;/p&gt;

&lt;p&gt;Both have a concept of dawn that indicates the very first visible lightening of the sky in the east. This time is known as&amp;nbsp;&lt;em&gt;fajr&lt;/em&gt;&amp;nbsp;in Islam and&amp;nbsp;&lt;em&gt;alot hashachar&lt;/em&gt;&amp;nbsp;in Judaism.&lt;/p&gt;

&lt;p&gt;Because we’re talking about a matter of perception, it can be ferociously difficult to nail down, a matter not made any easier by the constant shifting of the sun over the year, and the differences due to latitude.&lt;/p&gt;

&lt;p&gt;However – and bypassing a huge swath of religious debate – let’s accept the opinion that the first light is visible by perceptive humans on a clear day when the sun is 18&lt;br&gt;&lt;br&gt;
degrees below the horizon. How can we calculate that?&lt;/p&gt;

&lt;p&gt;Honestly, it’s not hard now that you know the basic structure. In fact, we just have to change one thing:&lt;br&gt;&lt;br&gt;
&lt;code&gt;$dawn = $zmanim-&amp;gt;getSunriseOffsetByDegrees(90+18);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Yes, I could have just typed&amp;nbsp;&lt;code&gt;108&lt;/code&gt;&amp;nbsp;but I wanted to make it explicit that we’re calculating 18 degrees before sunrise (90 degrees from the zenith).&lt;/p&gt;
&lt;h2&gt;
  
  
  Get Me to the&amp;nbsp;Church&amp;nbsp;Synagogue on Time…
&lt;/h2&gt;

&lt;p&gt;To offer a more involved – not to mention specific – example of how this can be used, I’d like to explain one method of finding the time for “Tzeit haKochavim” (“nightfall”, which is more poetically described as the time when it’s dark enough to see 3 large stars in the sky). For this particular method, the following series of calculations are used:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Select the date of the equinox (spring or fall)&lt;/li&gt;
&lt;li&gt; Get the time for sunset&lt;/li&gt;
&lt;li&gt; Get the time when the sun is 3.86 degrees below the horizon (after sunset)&lt;/li&gt;
&lt;li&gt; Get the difference in minutes between those 2 times&lt;/li&gt;
&lt;li&gt; Select the current date&lt;/li&gt;
&lt;li&gt; Calculate “seasonal minutes” – an even division of daylight
6.1) Subtract sunset from sunrise to get the total amount of daylight
6.2) Divide that time into 12 even “seasonal hours”
6.3) Divide 1 seasonal hour into 60 even “seasonal minutes”&lt;/li&gt;
&lt;li&gt; multiply the clock minutes you got from the equinox day calculations and multiply them by seasonal minutes.&lt;/li&gt;
&lt;li&gt; And finally, add THAT number of minutes to sunset, to get the time of “nightfall” / “Tzeit haKochavim”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Confused? Yep, me too. It took me a while to wrap my head around this. But here’s what it looks like in code:&lt;/p&gt;

&lt;p&gt;First, let’s set our location and today’s date:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$locname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Beit Knesset Chochmat Shlomo, Beachwood, OH"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$lat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;41.4939407&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$long&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;81.516709&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$elev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$tz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'America/New_York'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$getdate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y-m-d'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$getyear&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$getdate&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nv"&gt;$getmonth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'m'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$getdate&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nv"&gt;$getday&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'d'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$getdate&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we’re going to create a location object, and use that location object to create a calendar object set to an equinox day (in this case March 20).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GeoLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$locname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$lat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$long&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$elev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$tz&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="nv"&gt;$eqzmanim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ComplexZmanimCalendar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$getyear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'3'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'20'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get sunset for that day, along with the time the sun is 3.86 degrees below the horizon&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$eqsunset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$eqzmanim&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getsunset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$eqtzeit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$eqzmanim&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getSunsetOffsetByDegrees&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mf"&gt;3.86&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get the number of minutes between sunset and 3.86 degrees after sunset.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$tzeitmin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;number_format&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)((&lt;/span&gt;&lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$eqtzeit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$eqsunset&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OK, now it’s time to get some calculations for TODAY’S date. We’ll create a new calendar object and grab sunrise and sunset:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$todayzmanim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ComplexZmanimCalendar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$getyear&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$getmonth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$getday&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$sunrise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$todayzmanim&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getsunrise&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nv"&gt;$sunset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$todayzmanim&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getsunset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we’ll divide the time between sunrise and sunset into 12 equal parts (a “sha’ah” in Hebrew), and then divide one sha’ah into 60 even parts. That will effectively give us the ratio of seasonal minutes to clock minutes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$stdshaamin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;number_format&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)((&lt;/span&gt;&lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$sunset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$sunrise&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;$stdzmaniot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$stdshaamin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we multiply the number of minutes from our equinox day times the seasonal minute ratio.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$tzeitadjustment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$tzeitmin&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nv"&gt;$stdzmaniot&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And finally, we add that adjustment to today’s sundown (also note we have to multiply the adjustment * 60 to make the clock math work out).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$todaytzeit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y-m-d G:i:s'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$sunset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$tzeitadjustment&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And let’s output it to see what we get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"sundown: &lt;/span&gt;&lt;span class="nv"&gt;$sunset&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;tzeit: &lt;/span&gt;&lt;span class="nv"&gt;$todaytzeit&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;adjustment: &lt;/span&gt;&lt;span class="nv"&gt;$tzeitadjustment&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For June 10, 2025, the output would look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sundown: 2025-06-10 20:59:34
tzeit: 2025-06-10 21:19:59
adjustment: 20.4228
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Good Night, My Someone
&lt;/h2&gt;

&lt;p&gt;Believe it or not, we’re reached the end of my “Time Data Series”. I will, of course, keep adding things as I learn them myself. But – unless you have something specific you’d like to see (which, by all means, please tell me about in the comments), I’m going to turn out the lights, take a moment to admire the stars both for their beauty and the breathtaking wonder at the complexity of their movements, and head to bed.&lt;/p&gt;

&lt;p&gt;Thank you for coming along on this ride with me.&lt;/p&gt;

</description>
      <category>java</category>
      <category>opensource</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>HOW TO DEVREL: Fuel for Your Creativity</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Fri, 04 Jul 2025 01:54:58 +0000</pubDate>
      <link>https://dev.to/leonadato/how-to-devrel-fuel-for-your-creativity-1jia</link>
      <guid>https://dev.to/leonadato/how-to-devrel-fuel-for-your-creativity-1jia</guid>
      <description>&lt;p&gt;&lt;em&gt;DISCLAIMER: No, I don’t believe I’m the universe’s gift to DevRel. I don’t have all the answers, all the skills, or even all the Pokemon. What I have is my experiences, collected over the 11 years I’ve been doing this work. That – my experiences and observations – are what I’m sharing&amp;nbsp;&lt;a href="https://www.adatosystems.com/category/how-to-devrel/" rel="noopener noreferrer"&gt;in this series&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.adatosystems.com/2025/03/31/how-to-devrel-what-i-learned-from-spider-man-the-musical/" rel="noopener noreferrer"&gt;In my last post&lt;/a&gt; I talked about re-factoring your content from one form into another (blog to video, video to conference talk, conference talk to podcast, etc.). Which is good as far as that idea goes, but there is so much more you can do.&lt;/p&gt;

&lt;p&gt;In fact, let’s do a thought exercise:&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea Engine Challenge
&lt;/h2&gt;

&lt;p&gt;Challenge #1: Put 1 minute on the timer, take your hands off your keyboard / phone (meaning: NO INTERNET!) and then:&lt;br&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;name 10 (or more) sports teams&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;How many did you get? How many more could you have come up with if you had more time? How many could you have gotten if you could have used the internet?&lt;/p&gt;

&lt;p&gt;Challenge #2: Put 3 minutes on the timer, take your hands off the internet, and then:&lt;br&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;List 25 (or more) songs with the word “love” in the title&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Good work! Once again, take a moment to reflect: How many more could you have done with more time, with the internet, or if you could have worked with a partner.&lt;/p&gt;

&lt;p&gt;Challenge #3: Put 5 minutes on the timer, once again no internet, and then:&lt;br&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;List 50 (or more) recipes – just the name/title, not the ingredients&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And for the last time, take time to think about how many more you could have done with help (internet, friends, more time).&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Challenge
&lt;/h2&gt;

&lt;p&gt;Now give yourself a luxurious 10 minutes on the clock. You’re allowed to use the internet, or phone a friend, or whatever else you want. And see if you can:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;List 100 content ideas&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;OK, stop (whether it’s been 10 minutes, or 1 minute, or no minutes at all). If you’re like most folks, that challenge felt distinctly different, and not in a good way. If so, the first thing to understand is that it’s totally normal. Coming up with content ideas isn’t the same as coming up with city names or sports teams or song titles.&lt;/p&gt;

&lt;p&gt;The second thing to consider: Why? What was so different about coming up with content ideas versus songs or recipes? Likely, one of the primary reasons is that, whether consciously or not, you had a system in place for the first 3. You probably started listing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Sports teams from places where I’ve lived&lt;/li&gt;
&lt;li&gt;  Pop songs from high school (or some other significant period of your life)&lt;/li&gt;
&lt;li&gt;  Recipes I know how to make&lt;/li&gt;
&lt;li&gt;  …etc…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BUT… your brain, if it’s anything like mine, gave no such immediate framing when it came to the challenge for content. Again, if you’re like me, reading that question felt like opening a door onto a vast barren, featureless wasteland where there was very little to latch onto, to connect the dots with, to even build a series of ideas around.&lt;/p&gt;

&lt;h2&gt;
  
  
  Framework is the Key
&lt;/h2&gt;

&lt;p&gt;That is the brilliant observation behind Melanie Deziel’s book, “&lt;a href="https://www.melaniedeziel.com/the-content-fuel-framework" rel="noopener noreferrer"&gt;The Content Fuel Framework&lt;/a&gt;“. In the book, she outlines a few central issues with content creation, and then offers a single conceptual solution which is simple, repeatable, and effective.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i0.wp.com/www.adatosystems.com/wp-content/uploads/2025/03/Content-Fuel-Framework-cover.jpg?ssl=1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv23k9m3lsvsptq5szl22.jpg" width="302" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m going to stop here and ask you to at least click the link and consider buying the book. I believe it’s that good. In fact, if you plan to buy the ebook or audiobook version, then your time will be better spent reading THAT instead of THIS. But if you’re still on the fence, by all means keep reading so that I hopefully convince you by the end of this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Format Follows Focus
&lt;/h2&gt;

&lt;p&gt;“I NEED AN 800-WORD BLOG POST ON ______!”&lt;/p&gt;

&lt;p&gt;These words, uttered by far too many of my managers over the years, are as frustratingly vague as they are common. I’ve taken to muttering (usually under my breath and after ensuring my zoom call is on mute) “Would you like fries with that?” When I’m feeling slightly less snarky I try to get some details. “OK, so you want 800 words on Kubernetes and IOT. Anything specific ABOUT kubernetes and IOT?”&lt;/p&gt;

&lt;p&gt;“Nope!” Chirps this (only slightly fictionalized) manager, “The SEO is trending on those two terms, so I just need you to, you know…” (and then they waggle their fingers at the computer screen as if casting a spell.)&lt;/p&gt;

&lt;p&gt;Ignoring the whole “SEO-term-driven content management strategy of doom” for a moment, a deeper issue is the belief that CONTENT == BLOG. Content can, obviously, take many forms. But equally problematic is when we are asked to “make me a video on ______”, or “Can you whip up a podcast episode about _______”.&lt;/p&gt;

&lt;p&gt;The issue, Ms. Deziel points out, isn’t the fact that they are asking for content, it’s that they (and we) are starting with the format, and working backward to a topic. Worst of all is that a distinct framing, or point of view, isn’t even part of the consideration.&lt;/p&gt;

&lt;p&gt;First and foremost, “The Content Fuel Framework” advises, we need to start with the FOCUS of the content piece.&lt;/p&gt;

&lt;p&gt;What do I (and more importantly, Ms. Deziel) mean by “focus”? It’s not the topic. Your topic can be kubernetes, or IOT, or mainframes, or kubernetes mainframes running on IOT, or whatever.&lt;/p&gt;

&lt;p&gt;Your Focus is&amp;nbsp;&lt;em&gt;“…the approach we take to sharing [our message].”&lt;/em&gt;&amp;nbsp;If you feel like that description is unhelpfully abstract, let me offer some examples. Your focus might be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Basics&lt;/li&gt;
&lt;li&gt;  Details&lt;/li&gt;
&lt;li&gt;  People&lt;/li&gt;
&lt;li&gt;  History&lt;/li&gt;
&lt;li&gt;  Opinion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first two are the easiest types of focus to understand. For “Basics”, just think of a content piece titled “Getting started with _____”. Meanwhile “Details” is the grown-up cousin of Basics. Imagine a title like “Everything you need to know about _____” or “A S]Step by Step Guide to _____.”&lt;/p&gt;

&lt;p&gt;But the other focus examples above are less obvious. “People” might include a title like “What led John Smith to invent the mainframe?” or “A profile of the top 3 movers and shakers in the world of kubernetes today”.&lt;/p&gt;

&lt;p&gt;In her book, the author shares 10 focus areas, with detailed descriptions of how they work. My goal today is to give you a sense of how a “focus” works, but not to outline them all.&lt;/p&gt;

&lt;p&gt;Once a focus is chosen, then (and, I’d argue, ONLY then) can you consider the &lt;strong&gt;&lt;em&gt;format&lt;/em&gt;&lt;/strong&gt;. Some of the formats are obvious – writing, audio, and video. Some might not have leapt to your mind but make sense once you see them – Infographic, timeline, Quiz. Others require explanation to fully understand, like “Tool” and “Map”.&lt;/p&gt;

&lt;p&gt;Again, my goal here isn’t to list or describe them all, but to indicate that as content creators, our habit of always reaching for the same old formats doesn’t serve us well. Expanding our range of options allows us to find new angles to tell familiar stories; and to find formats that better suit those stories rather than shoehorning everything into a blog or a stare-at-the-camera-and-talk style video.&lt;/p&gt;

&lt;h2&gt;
  
  
  Greater Than The Sum of It’s Parts
&lt;/h2&gt;

&lt;p&gt;“The Content Fuel Framework” offers 10 focuses (focii?), and 10 formats. These are somewhat interchangeable, meaning you could start with a “People” focus and create a blog, AND a video, AND a podcast, AND an image gallery, AND…&lt;/p&gt;

&lt;p&gt;I’m no Alfred Einstein when it comes to math, but I’m pretty sure that 10 x 10 gives us, theoretically, a single topic (Kubernetes and IOT) with 100 content pieces.&lt;/p&gt;

&lt;p&gt;Realistically, you’re not going to do that. Some focuses simply lend themselves to certain formats better than others. More importantly some core topics will more readily lend themselves to certain focuses than others.&lt;/p&gt;

&lt;p&gt;But having explained The Content Fuel Framework, I’d now ask you to scroll back and consider the challenge I set before you at the start of this blog: 100 content ideas in 10 minutes. As you think about how far you could get before the buzzer sounds, it’s my sincere hope that you feel better, if not equal to the challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Through Structure, Freedom
&lt;/h2&gt;

&lt;p&gt;It turns out that having a framework – a set of rules, guidelines, even limitations – can create clarity by eliminating ambiguity.&lt;/p&gt;

&lt;p&gt;I’m not implying that this is the only way, or even the One True Way to create content. “The Content Fuel Framework” is just one way to break out of a rut and find a new way to approach what is, for most of us, a significant part of the day to day work of DevRel. There are, of course, many others ways (feel free to share them in the comments).&lt;/p&gt;

&lt;p&gt;More importantly, your newfound confidence (however you got it) in generating ideas, angles, and implementations for content will translate to an improved ability to collaborate with the teams at work: First, you hopefully now have a structure you can use to teach &lt;strong&gt;&lt;em&gt;them&lt;/em&gt;&lt;/strong&gt; that there’s more to DevRel than writing a blog; and from there you have ways to help them tell the best possible stories. Stories that reach, help, and resonate with the greatest number of people.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>creativity</category>
      <category>contentwriting</category>
    </item>
    <item>
      <title>HOW TO DEVREL: What I Learned From "Spider-Man, The Musical"</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Fri, 04 Jul 2025 01:53:33 +0000</pubDate>
      <link>https://dev.to/leonadato/how-to-devrel-what-i-learned-from-spider-man-the-musical-lh5</link>
      <guid>https://dev.to/leonadato/how-to-devrel-what-i-learned-from-spider-man-the-musical-lh5</guid>
      <description>&lt;p&gt;&lt;em&gt;DISCLAIMER: No, I don’t believe I’m the universe’s gift to DevRel. I don’t have all the answers, all the skills, or even all the Pokemon. What I have is my experiences, collected over the 11 years I’ve been doing this work. That – my experiences and observations – are what I’m sharing&amp;nbsp;&lt;a href="https://www.adatosystems.com/category/how-to-devrel/" rel="noopener noreferrer"&gt;in this series&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You wrote a blog. You’re happy with it. Proud of it, even. You like the way you captured your voice and style in the written form. You also like what the blog says – what it teaches the reader. It’s a good little blog. In your imagination, you give it an affectionate little pat on the head. You click “Post” and make sure it shows up on the public-facing site. Maybe you even give it one more little read-through.&lt;/p&gt;

&lt;p&gt;OR… you deliver a conference talk. The slides keep people’s attention, your delivery and timing is spot-on. You get laughs at just the right moments, and there are plenty of questions for you at the end. As the applause ends and people head for the next session, you take a deep breath, unplug your equipment, and close the slide deck.&lt;/p&gt;

&lt;p&gt;OR… you created a video. Again, you’re happy with it – maybe even a little proud – for all the same reasons as I mentioned previously. You give it one more watch, then click “Publish”.&lt;/p&gt;

&lt;p&gt;Time to move on, right?&lt;/p&gt;

&lt;p&gt;Then you get a message. It might be from someone in the company, it might be a contact on social medial. Heck, it might even be your Mom. But the message says “You should turn this into a blog/video/conference talk!” Meaning, take it from the form it’s in now, and turn it into one of the other forms (or any one of a few different options that I’ll get to shortly).&lt;/p&gt;

&lt;p&gt;Should you though? I mean, you just SAID everything you have to say. Why say it again? Why water down the power, effectiveness, and presence of the initial form by creating a derivative work?&lt;/p&gt;

&lt;h2&gt;
  
  
  An Intertwining Web of Tales
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i0.wp.com/www.adatosystems.com/wp-content/uploads/2025/03/Spider-Man_musical.jpg?ssl=1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqc3vhegnwxzk9zgv46m.jpg" alt="Poster for the Broadway musical " width="234" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the dilemma we (creative folks in general, and technical content creators in particular) face when we consider the idea of “re-use”. And I’ll tell you why you should do it. Or at least strongly consider doing it: Because “Spider-Man, The Musical” exists.&lt;/p&gt;

&lt;p&gt;Here’s tl;dr of what I mean: the story of “Spider-Man” exists in many many forms. But each format works in it’s own unique way that is complimentary to, but separate from, the others.&lt;/p&gt;

&lt;p&gt;Spider-Man, of course, began his life on the printed page. But even there, a single comic book series wasn’t enough. Since it’s inception in 1962 there have been more than 60 different serialized Spider-Man story-lines, with multiple series running simultaneously for much of that time.&lt;/p&gt;

&lt;p&gt;Then came the&amp;nbsp;&lt;a href="https://www.youtube.com/watch?v=4o29VoxtsFk" rel="noopener noreferrer"&gt;Saturday morning cartoon&lt;/a&gt;. It wasn’t better OR worse than the comic. It was DIFFERENT. It was able to do things the pulp fiction version couldn’t. And of course, there were things the paper version could do that could never make the translation to animation. Likewise the&amp;nbsp;&lt;a href="https://www.youtube.com/watch?v=gjgaf1sNz8E" rel="noopener noreferrer"&gt;1977 live-action tv series&lt;/a&gt;&amp;nbsp;was able to present things that were missing in both the printed and animated stories.&lt;/p&gt;

&lt;p&gt;And so it goes – from print to animated tv to live tv to live movies to animated moves and around and around, like a spider spinning it’s web – each form able to highlight and even elevate some aspects, but unable to depict others.&lt;/p&gt;

&lt;p&gt;I would continue this entire analogy to the musical, but in reality “Spider-Man: Turn Off the Dark” struggled in just about every way. So I’m going to pivot to a different story to continue my point&lt;/p&gt;

&lt;h2&gt;
  
  
  The Circle of Creative Content
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i0.wp.com/www.adatosystems.com/wp-content/uploads/2025/03/thelionking.jpg?ssl=1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff4zcunzbmb1x9xy6yxha.jpg" alt="Disney's " width="540" height="810"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Lion King was an award winning movie, a magical experience for those who were a certain age in 1994 when it came out. When the musical was announced in 1997, I was skeptical. How could a live action portrayal of Simba’s journey ever capture the sweeping majesty and raw power of the movie? And of course, my skepticism was utterly unfounded. The musical took such a different, and equally majestic form that it captured imaginations in a way the movie could not.&lt;/p&gt;

&lt;p&gt;Pivoting further away from wall-crawling web-heads, there are plenty of other cases where an original creative work was transformed – either in it’s entirety or in it’s essence – to a different form that could arguably be said was as strong as, if not stronger, than the original. Just one such example is when Eric Clapton transformed the&amp;nbsp;&lt;a href="https://www.youtube.com/watch?v=DzdbAD-3a9c" rel="noopener noreferrer"&gt;wailing rock song “Laylla”&lt;/a&gt;&amp;nbsp;into a&amp;nbsp;&lt;a href="https://www.youtube.com/watch?v=Mm7GWGppDgg" rel="noopener noreferrer"&gt;jazzy and almost haunting acoustic version&lt;/a&gt;&amp;nbsp;for MTV’s “Unplugged”.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revisiting the Question
&lt;/h2&gt;

&lt;p&gt;Coming back to the initial dilemma: Should you take your original content and transform it to a different format? My answer should be obvious: of course. Taking a video and blog-ifying; taking a video and blogging it; taking a conference talk and recording it; each of these modulations from one format to another will allow you to elevate, highlight, and showcase aspects of the core narrative in ways that the original delivery could not.&lt;/p&gt;

&lt;p&gt;Moreover, the work of transforming it will force you to consider things from an entirely different point of view, and this might shine a light on elements or ideas that you completely overlooked during your first pass – either because the original format couldn’t support it or because the very act of translation requires re-evaluation.&lt;/p&gt;

&lt;p&gt;Far from being watered down, you may discover that your story – whatever form it’s in – becomes stronger, more cohesive, more well-defined as a result.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>contentwriting</category>
      <category>content</category>
      <category>creativity</category>
    </item>
    <item>
      <title>HOW TO DEVREL: The Texas Sharpshooter</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Thu, 03 Jul 2025 19:49:22 +0000</pubDate>
      <link>https://dev.to/leonadato/how-to-devrel-the-texas-sharpshooter-41p5</link>
      <guid>https://dev.to/leonadato/how-to-devrel-the-texas-sharpshooter-41p5</guid>
      <description>&lt;p&gt;&lt;em&gt;DISCLAIMER: I do not believe that I’m the universe’s gift to DevRel. I don’t have all the answers, all the experiences, all the skills, or even all the Pokemon. What I do have is my experiences, collected over 11 years of doing this work. That’s what I’m sharing&amp;nbsp;&lt;a href="https://www.adatosystems.com/category/how-to-devrel/" rel="noopener noreferrer"&gt;in this series&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Work at a software vendor (or really any group that creates features for a set of consumers – whether those consumers are internal users or external customers) for any length of time and inevitably you experience a moment when a new feature, module, or capability is released to the public, and the response is the human equivalent of this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i0.wp.com/www.adatosystems.com/wp-content/uploads/2025/03/dex-ezekiel-fg8tdcxrkrA-unsplash-scaled.jpg?ssl=1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F84m272t50c7frlm0g1tq.jpg" width="640" height="984"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It becomes clear that the intended audience has no idea what the new feature is, why it’s there, or – most critically – what problem or use-case it addresses.&lt;/p&gt;

&lt;p&gt;This is not (or at least not always) because the feature is badly designed, ill conceived, or poorly executed. Sometimes, the response from users is because the problem hasn’t been socialized well enough. Nobody understands the nature of the disease, and therefore they can’t understand the importance of the cure.&lt;/p&gt;

&lt;p&gt;As a DevRel, almost as important as our work helping folks understand HOW (to install, to use, to extend) is explaining WHY: Why this capability is necessary? Why we decided to create this instead of 6 other things on our backlog? Why this feature provides an optimal way to solve a particular problem.&lt;/p&gt;

&lt;p&gt;But I’ll be honest: Explaining HOW is relatively easy. Explaining WHY can be a lot of work.&lt;/p&gt;

&lt;p&gt;One of the techniques I use that makes explaining WHY easier is a variation of the&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Texas_sharpshooter_fallacy" rel="noopener noreferrer"&gt;Texas Sharpshooter story&lt;/a&gt;. While this is normally categorized as a logical fallacy (and, when used in data analysis or debate, it is), for Developer Relations Advocates it is actually a fairly useful technique.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Man, the Myth, the Legend
&lt;/h2&gt;

&lt;p&gt;I’ll start with the colorful story behind the evocative name:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Once there was a prince who was also an accomplished marksman, who was traveling through the land. Along the road he stopped at a village to rest his mount. He sat down under a tree—and right there in front of him was the side of a big barn. He couldn’t believe his eyes. That whole side of the barn was covered with little circles, drawn with chalk, and in the center of each circle was a bullet hole! He jumped up in amazement. Who is this sharpshooter around here who never misses? Maybe they could have a little contest while he was here.&lt;/p&gt;

&lt;p&gt;So he knocked on the door of the farmhouse and asked if they knew who the marksman was. Yes, they did. They brought him a barefoot boy of about twelve. ‘Here he is, Your Excellency, our son the sharpshooter!’ Of course, the prince was surprised. He asked the boy, ‘Tell me, young fellow, how do you manage to hit the bullseye all the time? Here, look at all these medals. I’ve just finished five years of training and even I couldn’t hit the target every single time.’&lt;/p&gt;

&lt;p&gt;‘Oh,’ said the boy, ‘there’s nothing to it. I just like to shoot. So I shoot at the side of the barn and then I take a piece of chalk and draw a circle around the hole.’&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Context Matters
&lt;/h2&gt;

&lt;p&gt;Shooting the bullet and then drawing the target later makes for a bad-faith argument, but it turns out it’s perfect for content-planning.&lt;/p&gt;

&lt;p&gt;When you work “inside”, meaning you are working with the developers of a product, you are actually existing weeks or even months in the future. What I mean is, your day to day thoughts and internal discussions are about a future version: how it will work, the problems it solves, etc. Whereas the users of the product only know about the features and capabilities they have today.&lt;/p&gt;

&lt;p&gt;It’s often a challenge to remember that your context – the problem you’ve been working on for weeks, the one that will be solved with this next release – is completely unknown and unexpected by the majority of users. They haven’t been pondering the complexities of the use case. THEY haven’t been investigating ways to remove friction, toil, or error.&lt;/p&gt;

&lt;p&gt;Your v-dot-now is their v-dot-next.&lt;/p&gt;

&lt;p&gt;The mistake many organizations (and the DevRel’s right along with them) make is releasing the new version with the expectation that everything – the problems, use cases, and purpose of the new version – will be intuitively obvious because, duh, we’ve been talking about it FOREVER, right?&lt;/p&gt;

&lt;p&gt;That’s how you get the German shepherd look when you do the big reveal.&lt;/p&gt;

&lt;p&gt;YOU know what the feature is going to do, what problems it will solve, what improvements it will bring. BUT… you also know it won’t be ready for a little while. Talking about it now, when features could slip, deadlines might be missed, priorities re-arranged… heck, when entire teams could be re-assigned… promoting the solution now would be asking for problems when things don’t go as planned.&lt;/p&gt;

&lt;p&gt;But you also can’t talk about nothing. And that’s where the Texas Sharpshooter technique comes in.&lt;/p&gt;

&lt;p&gt;The new feature is the metaphorical bullet. It’s already been shot, in the sense that development work is already happening. You know where it hit, so to speak. Despite the fact that nobody but your internal team can see it, the landing point is there, on the wall. You’re job right now is to draw a circle around that spot by socializing the problem. You draw attention to the problem, the point where the bullet WILL appear, by drawing a big old bull’s eye on that spot.&lt;/p&gt;

&lt;p&gt;In blogs, opinion pieces, panel conversations, videos, or whatever, your job as a DevRel is to talk up the challenge, cost, and toil of the issue – what it is, why it’s a problem, how much damage it does, and the current (imperfect, complex, kludge-y) solutions that exist.&lt;/p&gt;

&lt;p&gt;Period. That’s it. No parting of heavenly clouds, no angelic choir. Just you and the audience bonding over your shared experiences. You give a knowing look that says “Life in tech, amirite?”&lt;/p&gt;

&lt;p&gt;By doing this, you establish the context for the eventual unveiling.&lt;/p&gt;

&lt;h2&gt;
  
  
  TAMO (then a miracle occurred)
&lt;/h2&gt;

&lt;p&gt;The best part of this technique is that you can have multiple threads like this going at the same time. Because let’s face it, we’re in tech and we looooove to complain. And show off. And complain about showing off. And show of how we compla…. never mind. You get it.&lt;/p&gt;

&lt;p&gt;My point is that the companies where we typical work as DevRel Advocates usually have multiple new features, modules, and improvements in the pipeline at any given time. Maybe only a couple will hit GA soon, but we can get ahead of the curve by socializing those problems and fostering the online discussions, debates, counterpoints, etc long before the release date.&lt;/p&gt;

&lt;p&gt;More than just being a clever marketing ploy, the sharpshooter concept also allows the business to understand how customers and the community will ultimately react to the new release. By gauging the audience’s overall understanding of the technologies and techniques, the organization can have improved documentation documentation or educational resources ready to go. By listening to the specifics of the dialogue about the problem itself, adjustments (or even UX/UI sessions) can be added to the timeline.&lt;/p&gt;

&lt;p&gt;When used thoughtfully, this technique allows for a better overall product as well as a better overall release.&lt;/p&gt;

</description>
      <category>devrel</category>
      <category>contentwriting</category>
    </item>
    <item>
      <title>HOW TO DEVREL: It Might Not Be New, but It's Yours</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Thu, 03 Jul 2025 19:47:08 +0000</pubDate>
      <link>https://dev.to/leonadato/how-to-devrel-it-might-not-be-new-but-its-yours-1m5d</link>
      <guid>https://dev.to/leonadato/how-to-devrel-it-might-not-be-new-but-its-yours-1m5d</guid>
      <description>&lt;p&gt;Lately, I’ve had several conversations about “how to DevRel”. Some of that is absolutely related to my current job search. But it’s also been a topic that comes regularly even when I’m settled into a company: When meeting folks at a conference who want to understand what my title (which has fluctuated between “DevRel Advocate”, “Technical Evangelist”, and even “Head Geek”) means; Or discussing specific techniques with other DevRels on our&amp;nbsp;&lt;a href="https://devrelcollective.fun/" rel="noopener noreferrer"&gt;super secret slack channel&lt;/a&gt;; Or justifying my existence internally because, even though&amp;nbsp;&lt;a href="https://en.wikipedia.org/wiki/Developer_relations" rel="noopener noreferrer"&gt;the role has existed since 1980&lt;/a&gt;&amp;nbsp;half the company still doesn’t know what the frak it is, nor what it involves.&lt;/p&gt;

&lt;p&gt;Although that last part is more due to the fact that “Developer Relations” is one of those five-jobs-in-a-trench-coat types of roles, so it’s understandable.&lt;/p&gt;

&lt;p&gt;In any case, I’ve been mulling over not just what DevRel&amp;nbsp;&lt;em&gt;IS&lt;/em&gt;, but also the ways I approach the work of DevRel, from writing to video to community to speaking to demos and onward. And I thought I’d blog about it for a bit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DISCLAIMER&lt;/strong&gt;: I do not believe, for a moment, that I am the universe’s gift to DevRel. I don’t have all the answers, all the experiences, all the skills, or even all the Pokemon. What I do have is MY experiences, and while they aren’t the last word in DevRel, they are uniquely MY word about DevRel, collected over 11 years of doing this work. That’s what I plan to share.&lt;/p&gt;

&lt;p&gt;We’ll call this my “How To DevRel” series, and see where it takes us. Today I want to address a common concern among content creators of all stripes, which is the fear that the thing you’re creating has already been created in some form by someone else, and who am I to take another swing at that topic now?&lt;/p&gt;

&lt;h2&gt;
  
  
  Nothing New Under the Sun
&lt;/h2&gt;

&lt;p&gt;I’ll start by selectively cut-quoting Marianne Williamson (you can read&amp;nbsp;&lt;a href="https://www.goodreads.com/quotes/928-our-deepest-fear-is-not-that-we-are-inadequate-our" rel="noopener noreferrer"&gt;the full quote here&lt;/a&gt;)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We ask ourselves, ‘Who am I to be brilliant, gorgeous, talented, fabulous?’ Actually, who are you not to be? […] Your playing small does not serve the world. There is nothing enlightened about shrinking so that other people won’t feel insecure around you. We are all meant to shine, as children do.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You’re afraid you’ll say something that has been said before? That you’ll demonstrate a tool or technique that’s been covered a dozen (or a hundred, or a thousand) times by the original inventor, and by someone from the inventor’s company, and by 6 different IT luminaries, (and so on, all the way down to the inventor’s dog)?&lt;/p&gt;

&lt;p&gt;Let me put that worry into a different context to see if it still holds water:&lt;/p&gt;

&lt;p&gt;Do you remember when you heard the song “&lt;a href="https://www.youtube.com/watch?v=GJ36gbGlm8Y" rel="noopener noreferrer"&gt;White Christmas&lt;/a&gt;” that one time, and of course you never had to listen to it again, because you heard it already? How about the fact that Bing Crosby sang it just once, because he didn’t want to “be derivative”? And of course, nobody has ever sung “White Christmas” ever since, because of course Bing sang it and so it’s been sung and that’s all there is to it.&lt;/p&gt;

&lt;p&gt;Of course not. The premise that we experience art once, that the first rendition is the only authentic one, is ridiculous.&lt;/p&gt;

&lt;p&gt;Not only do we listen to the same recording over and over, many folks go out of their way to see the same performer sing the exact same song (or set of songs) multiple times. We go to hear cover bands play the exact same set but of course, with their own personal twist on things. We go to multiple renditions of a play or musical when they show up in our town.&lt;/p&gt;

&lt;p&gt;In short, a story (whether it’s written or spoken or sung or danced or painted) becomes more powerful, not less, when we hear it through the lens of a different person’s experience and style.&lt;/p&gt;

&lt;h2&gt;
  
  
  Imitation is…
&lt;/h2&gt;

&lt;p&gt;Yeah yeah, we all know &lt;a href="https://www.goodreads.com/quotes/558084-imitation-is-the-sincerest-form-of-flattery-that-mediocrity-can" rel="noopener noreferrer"&gt;that quote&lt;/a&gt;. And also the one &lt;a href="https://www.goodreads.com/quotes/629531-good-artists-copy-great-artists-steal" rel="noopener noreferrer"&gt;Picasso said about stealing&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;But here’s something important to understand: &lt;strong&gt;&lt;em&gt;Imitation&lt;/em&gt;&lt;/strong&gt; is when you do something that someone else has already done in the same way they did, without adding anything of your own, with the expressed intent of doing it that way BECAUSE the other person did it that way.&lt;/p&gt;

&lt;p&gt;For creative folks, pure imitation is actually really REALLY difficult. It’s nearly impossible NOT to add our own spin on something. Even comedians who do impressions of other people understand that the real humor lies in “doing” the other person with just enough of a twist that it’s not just different for the sake of being different, it’s different in a small, subtle, and unexpected way. That’s what makes it funny.&lt;/p&gt;

&lt;p&gt;On the other hand, even creations that were themselves inspired by other creations bring something new. “&lt;a href="https://www.youtube.com/watch?v=wh6yOC3rFes" rel="noopener noreferrer"&gt;It Ain’t Me Babe&lt;/a&gt;” by Bob Dylan was inspired by The Beatles “&lt;a href="https://www.youtube.com/watch?v=S302kF8MJ-I" rel="noopener noreferrer"&gt;She Loves You&lt;/a&gt;“. Sheryl Crow’s “&lt;a href="https://www.youtube.com/watch?v=ClbmWkbocoY" rel="noopener noreferrer"&gt;All I Wanna Do&lt;/a&gt;” was inspired by Wyn Cooper’s poem “&lt;a href="https://genius.com/Wyn-cooper-fun-annotated" rel="noopener noreferrer"&gt;Fun&lt;/a&gt;“. Claude Monet’s “&lt;a href="https://www.connaissancedesarts.com/musees/musee-orsay/le-dejeuner-sur-lherbe-de-monet-focus-sur-un-chef-doeuvre-11136978/" rel="noopener noreferrer"&gt;Déjeuner sur L’Herbe&lt;/a&gt;” was inspired by Edouard Manet’s &lt;a href="https://commons.wikimedia.org/wiki/File:Edouard_Manet_-_Le_D%C3%A9jeuner_sur_l%27herbe_%2852257507870%29.jpg" rel="noopener noreferrer"&gt;painting of the same name&lt;/a&gt;. To go a little further afield, the Broadway musical “&lt;a href="https://playbill.com/production/sunday-in-the-park-with-george-booth-theatre-vault-0000001686" rel="noopener noreferrer"&gt;Sunday in the Park with George&lt;/a&gt;” was, of course, inspired by the Seurat painting “&lt;a href="https://www.artic.edu/artworks/27992/a-sunday-on-la-grande-jatte-1884" rel="noopener noreferrer"&gt;Un dimanche après-midi à l’Île de la Grande Jatte&lt;/a&gt;” (A Sunday Afternoon on the Island of La Grande Jatte) .&lt;/p&gt;

&lt;p&gt;It’s OK to find inspiration and insight in the work of others, to build your story out of something you saw, read, or heard. Of course give credit where it’s due, but also trust that your creation is going to have it’s own new elements that make it fresh, valuable, and uniquely yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Saying it With Your Voice Adds Power
&lt;/h2&gt;

&lt;p&gt;When you write (or make a video, or talk at a conference) about a new technique, technology, or experience – one that’s not NEW-new, but rather new-to-you – you open the door not only to folks who, like you, haven’t known about it but also you allow people who were already familiar with it the chance to see it through your eyes. Your excitement, curiosity, and enthusiasm cast the well-known into a new light. You also create the opportunity to review and re-think that topic, to reconsider it’s value or application today.&lt;/p&gt;

&lt;p&gt;I believe in this idea so strongly, I took one of my conference talks – “&lt;a href="https://www.youtube.com/watch?v=TPzrdHNsvGE&amp;amp;list=PL3xK3UeH8dybSKLkbS8SXqkLIrJgYWVEY&amp;amp;index=10" rel="noopener noreferrer"&gt;Looking Back at a Lifetime of Poor Technical Choices&lt;/a&gt;“, and made it open source. I realized that even using the exact same format and structure, everyone’s journey and choices would come out so differently, and resonate so powerfully, that you could do 5 of the same talk in the row and they would all be interesting, compelling, entertaining, and informative. You can find it (and download it, and make it your own) &lt;a href="https://github.com/LeonAdato/os_poor-tech-choices" rel="noopener noreferrer"&gt;here on my github repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So… If you find yourself asking, “Who am I to give this demo? To write about this topic? To host this podcast? To be on this panel?” then, to paraphrase Ms. Williamson, “…Who are you NOT to?”&lt;/p&gt;

&lt;p&gt;She continues, powerfully,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“As we let our own light shine, we unconsciously give other people permission to do the same. As we are liberated from our own fear, our presence automatically liberates others.”&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devrel</category>
      <category>creativity</category>
      <category>content</category>
    </item>
    <item>
      <title>OTel Me Why</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Mon, 07 Apr 2025 04:00:00 +0000</pubDate>
      <link>https://dev.to/leonadato/otel-me-why-15ma</link>
      <guid>https://dev.to/leonadato/otel-me-why-15ma</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LIMITED TIME OFFER! I’m ready for my next adventure as a DevRel advocate / Technical Evangelist / IT Talespinner. If that sounds like something you need, drop me a line &lt;a href="//leon@adatosystems.com"&gt;in email&lt;/a&gt; or on &lt;a href="https://www.linkedin.com/in/leonadato/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;My &lt;a href="https://www.adatosystems.com/2025/02/10/who-the-hell-is-going-to-pay-for-this/" rel="noopener noreferrer"&gt;blog on pricing&lt;/a&gt; from the other day caught the attention of the folks over at &lt;a href="https://www.metricfire.com/" rel="noopener noreferrer"&gt;MetricFire&lt;/a&gt;, and we struck up a conversation about some of the ideas, ideals, and challenges swirling around monitoring, observability, and its place in the broader IT landscape.&lt;/p&gt;

&lt;p&gt;At one point, JJ, the lead engineer, asked, “&lt;a href="https://www.adatosystems.com/2025/02/04/o-can-you-tel-me-how-to-get/" rel="noopener noreferrer"&gt;You blogged&lt;/a&gt; about gearing up to get a &lt;a href="https://www.cncf.io/training/certification/otca/" rel="noopener noreferrer"&gt;certification in Open Telemetry&lt;/a&gt;. What is it about OTel that has you so excited?”&lt;/p&gt;

&lt;p&gt;I gave a quick answer, but JJ’s question got me thinking, and I wanted to put some of those ideas down here.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;OTel is the best thing since…&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let me start by answering JJ’s question directly: I find Open Telemetry exciting because it’s the biggest change in the way monitoring and observability are done since Traces (which came out around 2000, but wasn’t widely used until 2010-ish).&lt;/p&gt;

&lt;p&gt;And Traces were the biggest change since… ever. Let me explain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXfP_QCEf4eBjgeHwg5gZtVr-5KX0BfvmeoHEp8EW7Boiru8KnzeUCpqnY0Ju-WnbN0GG22XvtAZn0MjCaMrF-Hus0nxtP6u6yv0tzSoXUk-dtSx-1sfKnVyTiL4M0nKWajw3ZvJTQ%3Fkey%3D4O3ZOMrIzdQ7qurGP2BDsCsk" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXfP_QCEf4eBjgeHwg5gZtVr-5KX0BfvmeoHEp8EW7Boiru8KnzeUCpqnY0Ju-WnbN0GG22XvtAZn0MjCaMrF-Hus0nxtP6u6yv0tzSoXUk-dtSx-1sfKnVyTiL4M0nKWajw3ZvJTQ%3Fkey%3D4O3ZOMrIzdQ7qurGP2BDsCsk" width="760" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See this picture? This was what it was like to use monitoring to understand your environment back when I started almost 30 years ago. What we wanted was to know what was happening in that boat. But that was never an option.&lt;/p&gt;

&lt;p&gt;We could scrape metrics together from network and OS commands, we could build some scripts and db queries that gave me a little bit more insight. We could collect and (with a lot of work) aggregate log messages together to spot trends across multiple systems. All of that would give us an idea of how the infrastructure was running, and infer the things that might be happening topside. But we never really knew.&lt;/p&gt;

&lt;p&gt;Tracing changed all that. All of a sudden we could get hard data (and get it in real time) about what users were doing, and what was happening in the application when they did it.&lt;/p&gt;

&lt;p&gt;It was a complete sea change (pun intended) for how we worked and what we monitored. Even so, tracing didn’t remove the need for metrics and logs. And famous (or infamous) “three pillars” of observability.&lt;/p&gt;

&lt;p&gt;Recently I started working through the book &lt;a href="https://learningopentelemetry.com/" rel="noopener noreferrer"&gt;“Learning OpenTelemetry”&lt;/a&gt; and one of the comments that struck me was that these aren’t “three pillars” in the sense that they don’t combine to hold up a unified whole. Authors &lt;a href="https://github.com/tedsuo" rel="noopener noreferrer"&gt;Ted Young&lt;/a&gt; and &lt;a href="https://aparker.io/" rel="noopener noreferrer"&gt;Austin Parker&lt;/a&gt; re-framed the combination of Metrics, Logs, and Traces as “The three browser tabs of observability” because many tools put the effort back on the user to to flip between screens and put it all together by sight.&lt;/p&gt;

&lt;p&gt;On the other hand, OTel outputs is able to present all 3 streams of data as a single “braid”&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i0.wp.com/www.adatosystems.com/wp-content/uploads/2025/02/OTel_braid.png?ssl=1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7rdxuxvjw5lqfjjyhotp.png" alt="3 lines labeled tracing, metrics, and logs with the lines interweaving to form a braid. " width="600" height="135"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;From Learning OpenTelemetry, by Ted Young and Austin Parker, Copyright © 2024. Published by O’Reilly Media, Inc. Used with permission.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It should be noted that despite OTel’s ability to combine and correlate this information, the authors of the book point out later that many tools still lack the ability to present it that way.&lt;/p&gt;

&lt;p&gt;Despite it being a work in progress (but what, in the world of IT, isn’t?) I still feel that OTel has already proven its potential to change the face of monitoring and observability.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;OTel is the&lt;/strong&gt; &lt;a href="https://en.wikipedia.org/wiki/Esperanto" rel="noopener noreferrer"&gt;&lt;strong&gt;Esperanto&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;of Monitoring&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Almost every vendor will jump at the chance to get you to send all your data to them. They insist that theirs is the One True Observability Tool.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i0.wp.com/www.adatosystems.com/wp-content/uploads/2025/02/OTel_Ring.png?ssl=1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi46v0ivbraif0lp5mnbt.png" alt="Image of the One Ring from the Lord of the Rings, with words superimposed saying " width="640" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In fact, let’s get this out in the open: There simply isn’t a singular “best” monitoring tool out there any more than there’s one singular “best” programming language, or car model, or pizza style.&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt; There isn’t a single tool which will cover 100% of your needs in every single use case.&lt;/p&gt;

&lt;p&gt;And for the larger tools, even the use cases that aren’t part of their absolute sweet spot are going to cost you (in terms of hours or dollars) to get right.&lt;/p&gt;

&lt;p&gt;So you’re going to have multiple tools. It goes without saying (or at least it should) that you’re not going to ship a full copy of all your data to multiple vendors. Therefore a big part of your work as a monitoring engineer (or team of engineers) is to map your telemetry to the use cases they support, and thus to the tools you need to employ in those use cases.&lt;/p&gt;

&lt;p&gt;That’s not actually a hard problem. Sure, it’s complex, but once you have the mapping, making it happen is relatively easy. But, as I like to say, it’s not the cost to buy the puppy that is the problem, it’s the cost to keep feeding it.&lt;/p&gt;

&lt;p&gt;Because the tools you have today are going to change down the road. That’s when things get CRAZY hard. You have to hope things are documented well enough to understand all those telemetry-to-use-case mappings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;(Narrator: they will not, in fact, have it documented well enough)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then you have to also hope your instrumentation is documented and understood well enough to know how to de-couple tool x and instrument tool y such that you maintain the same capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;(Narrator: this is not how it will go down.)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But OTel solves both the “buying the puppy” and the “feeding the puppy” problem. My friend Matt Macdonald-Wallace (Solutions Architect at Grafana) put it like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;OTEL does solve a lot of the problems around ‘Oh great! now we’re trapped with vendor x and it’s going to cost us millions to refactor all this code’ as opposed to ‘Oh, we’re switching vendors? Cool, let me just update my endpoint…’&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not only that, but OTels ability to create pipelines (for those who are not up to speed on that concept, it’s the ability to identify, filter, sample, and transform a stream of data before sending it to a specific destination) means you can send the same data stream to multiple locations selectively. Meaning your security team can get their raw unfiltered syslog while it’s still on-premises. Some of the data – traces, logs, and/or metrics – can go to one or more vendors.&lt;/p&gt;

&lt;p&gt;Which is why I say: OTel is the esperanto of observability.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;OTel’s Secret Sauce isn’t OTLP&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;…it’s standardization.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Before I explain why the real benefit to Otel is not OTLP, I should take a second to explain what OTLP is:&lt;/p&gt;

&lt;p&gt;If you look up “What is Open Telemetry Line Protocol?” you’ll probably find some variation of &lt;em&gt;“…a set of standards, rules, and/or conventions that specify how OTel elements send data from the thing that created it to a destination”&lt;/em&gt;. This is technically true, but also not very helpful.&lt;/p&gt;

&lt;p&gt;Functionally, OTLP is the magic box that takes metrics, logs, or traces and sends them where they need to go. It’s not as low level as, say, TCP, but in terms of how it changes a monitoring engineer’s day, it may as well be. We don’t &lt;em&gt;use&lt;/em&gt; OTLP so much as we &lt;em&gt;indicate&lt;/em&gt; it should be used.&lt;/p&gt;

&lt;p&gt;Just to be clear, OTLP is amazingly cool and important. It’s just not (in my opinion) AS important as some other aspects.&lt;/p&gt;

&lt;p&gt;No, there are (at least) two things that, in my opinion, make OTel such an evolutionary shift in monitoring:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Collectors&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;First, it standardizes the model of having a 3-tier, collector (not agent) in the middle, architecture. For us old-timers in the monitoring space, the idea of a collector is nothing new. In the bygone era of everything-on-prem, you couldn’t get away with a thousand (or even a hundred) agents all talking to some remote destination. The shift to cloud architecture changed all that, but it’s still not the best idea.&lt;/p&gt;

&lt;p&gt;Having a single (or small number) of load-balanced systems that take all the data from multiple targets – with the added benefit of being able to then process that data, filtering, sampling, combining, etc – before sending it forward is not just A Good Idea™, it can have a direct impact on your bottom line by only sending the data you WANT (and in the form you want it) out the egress port that racks up such a big part of your monthly bill.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Semantics&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Look, I’ll be the first to tell you that I’m not the world’s best developer. So the issue of semantic terminology doesn’t usually keep me up at night. What &lt;em&gt;DOES&lt;/em&gt; keep me up is the inability to get at a piece of data that I know should be there, but isn’t.&lt;/p&gt;

&lt;p&gt;What I mean is that it’s fairly common that the same data point – say bandwidth – is referred to by a completely different name and location on devices from two different vendors. And maybe that doesn’t seem so weird.&lt;/p&gt;

&lt;p&gt;But how about the same data point being different on two different types of devices from the same vendor? Still not weird?&lt;/p&gt;

&lt;p&gt;Let’s talk about the same data point being different on the same device type from the same vendor, but two different models? Getting weird, right (not to mention annoying).&lt;/p&gt;

&lt;p&gt;But the real kicker is when the same data point is different on two different parts of the same DEVICE.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXd73GRG-yw2aUQPAHsZFBKWhv7TLCsS9eXGXKDu91zHUwEJqRmX5Oi008nLSWRyXr2OgLU-m024Kv74qjaZq0mX0yN45eTFTQLqVg1cZMMa8KW77wT60iSm13Ucf9V4ytUg5gZt2Q%3Fkey%3D4O3ZOMrIzdQ7qurGP2BDsCsk" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXd73GRG-yw2aUQPAHsZFBKWhv7TLCsS9eXGXKDu91zHUwEJqRmX5Oi008nLSWRyXr2OgLU-m024Kv74qjaZq0mX0yN45eTFTQLqVg1cZMMa8KW77wT60iSm13Ucf9V4ytUg5gZt2Q%3Fkey%3D4O3ZOMrIzdQ7qurGP2BDsCsk" width="360" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you’ve run down that particular rabbit whole, you have a whole different appreciation for semantic naming. If I’m looking for CPU or bandwidth or latency or whatever, I would really REALLY like for it to be called the same thing and be found in the semantically same location.&lt;/p&gt;

&lt;p&gt;OTel does this, and does it as a core aspect of the platform. I’m not the only one to have noticed it, either.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Several years ago, during a meeting between the maintainers of Prometheus and OpenTelemetry, an unnamed Prometheus maintainer quipped, “You know, I’m not sure about the rest of this, but these semantic conventions are the most valuable thing I’ve seen in a while.” It may sound a bit silly, but it’s also true.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;From Learning OpenTelemetry, by Ted Young and Austin Parker, Copyright © 2024. Published by O’Reilly Media, Inc. Used with permission.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Summarizing the Data&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I’ll admit that OpenTelemetry is still very (VERY) shiny for me.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXdDX52vz277JrKyj84h-VQNk3th_iZ_svwHnXeiv2BLo8VVFiC1WmWhJyvZ-BleRCXCoQYfp7Oo-v_vTrVBC2ftp-JMjoaVdbZqyEWoDjv0_qmJ5tC-d0M9Gm08mTbewVGYP-PZUQ%3Fkey%3D4O3ZOMrIzdQ7qurGP2BDsCsk" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXdDX52vz277JrKyj84h-VQNk3th_iZ_svwHnXeiv2BLo8VVFiC1WmWhJyvZ-BleRCXCoQYfp7Oo-v_vTrVBC2ftp-JMjoaVdbZqyEWoDjv0_qmJ5tC-d0M9Gm08mTbewVGYP-PZUQ%3Fkey%3D4O3ZOMrIzdQ7qurGP2BDsCsk" width="500" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But I’ll also admit that the more I dig into it, the more I find to like. Hopefully this blog has given you some reasons to check out OTel, too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;* OK, I lied. 1) Perl 2) The 1967 Ford Mustang 390 GT/A and 3) deep dish from Tel Aviv Kosher Pizza in Chicago&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>opentelemetry</category>
      <category>monitoring</category>
      <category>observability</category>
      <category>programming</category>
    </item>
    <item>
      <title>What happened isn't the point. How you respond is.</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Mon, 31 Mar 2025 04:00:00 +0000</pubDate>
      <link>https://dev.to/leonadato/what-happened-isnt-the-point-how-you-respond-is-29ip</link>
      <guid>https://dev.to/leonadato/what-happened-isnt-the-point-how-you-respond-is-29ip</guid>
      <description>&lt;p&gt;The first thing to be clear about is that “it” can happen to anybody, and it can happen at any time. The fact that it happens isn’t what you need to focus on. The details of what happened, and even how it played out, isn’t important. The truly important part is this:&lt;/p&gt;

&lt;p&gt;How will you respond?&lt;/p&gt;

&lt;p&gt;You may be thinking, “Why? Why would that matter? That sounds patronizing and trite.”&lt;/p&gt;

&lt;p&gt;I don’t think so (then again, of course I don’t, I’m the one writing about it. &lt;a href="https://www.adatosystems.com/2017/06/21/its-not-about-what-happened/" rel="noopener noreferrer"&gt;In fact, I’ve written about it before.&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Throughout our life, things – good, bad, and somewhere in the middle – are going to happen. They’re going to happen to us, near us, and around us. There’s literally nothing anyone can do to stop things from happening. On the other hand, what is completely within our control is how we handle those things.&lt;/p&gt;

&lt;p&gt;Aside from that, or perhaps closely related to that, is the truth that nothing about what happens reflects on who we are. But how we react and respond absolutely does.&lt;/p&gt;

&lt;p&gt;(As a side note, remember that when you’re looking at something happening to someone else and consider making a judgement. THEY probably didn’t didn’t choose it either. But how are they responding? That’s a choice they’re making.)&lt;/p&gt;

&lt;p&gt;A famous story present across multiple cultures tells of a queen who asks her advisors for a totem, a phrase that can give her both hope in hard times, but also keep her humble at the height of her success. It needed to be short, she added, so it could be inscribed on a ring so she could wear it and keep it in her field of vision. The advisors came back with&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This, too, shall pass.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I think about that a lot when I’m going through low points (or high points) in my life. I’m thinking about it a lot, right now. What happened to me, today, to inspire this particular blog isn’t important. Curiously, how I responded also doesn’t matter. I’m happy to share it (and will share it, just like&amp;nbsp;&lt;a href="https://www.adatosystems.com/2023/11/13/lessons-from-a-6-month-job-search/" rel="noopener noreferrer"&gt;I did the last time&lt;/a&gt;&amp;nbsp;but that’s not the point today.&lt;/p&gt;

&lt;p&gt;Today, I want you to sit for a minute and imagine you get the call, and your job is over. What would you do? What would be your first, second, third step?&lt;/p&gt;

&lt;p&gt;More interestingly, what would you do if you KNEW it was coming? Maybe you wouldn’t have done anything differently, but it’s worth considering. As I like to remind people, “There’s never a bad time to look around the airplane and make sure you know where the exits are.”&lt;/p&gt;

&lt;p&gt;On the other hand, maybe you don’t have to imagine. Maybe that’s your lived reality right now. I’m VERY sympathetic to you, as it turns out.&lt;/p&gt;

&lt;p&gt;In which case my advice is to skip the “what would you do” question. It’s nothing but armchair quarterbacking. The moment has passed. Sure, at some point (probably later), you can reflect on what you did, and in light of what happened, think about what you might have done differently.&lt;/p&gt;

&lt;p&gt;But that’s for another day. Today, our job – yours and mine – is to focus on how we’re going to respond.&lt;/p&gt;

</description>
      <category>hiring</category>
      <category>career</category>
      <category>unexpected</category>
    </item>
    <item>
      <title>It Costs That Much Because it Takes Me F***ing Hours</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Mon, 24 Mar 2025 04:00:00 +0000</pubDate>
      <link>https://dev.to/leonadato/it-costs-that-much-because-it-takes-me-fing-hours-51hn</link>
      <guid>https://dev.to/leonadato/it-costs-that-much-because-it-takes-me-fing-hours-51hn</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LIMITED TIME OFFER! I’m ready for my next adventure as a DevRel advocate / Technical Evangelist / IT Talespinner. If that sounds like something you need, drop me a line &lt;a href="//leon@adatosystems.com"&gt;in email&lt;/a&gt; or on &lt;a href="https://www.linkedin.com/in/leonadato/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Today’s blog title is inspired &lt;a href="https://www.youtube.com/watch?v=NGR20B2cEBQ" rel="noopener noreferrer"&gt;by this song&lt;/a&gt;. My daughter started singing it regularly after she opened &lt;a href="https://loveplusflour.com/" rel="noopener noreferrer"&gt;her bakery&lt;/a&gt;. Read on for details on that story, and how it relates to observability.&lt;/p&gt;

&lt;p&gt;I thought of it, and my daughter’s reasons for singing it, after a few responses to &lt;a href="https://www.adatosystems.com/2025/02/10/who-the-hell-is-going-to-pay-for-this/" rel="noopener noreferrer"&gt;last week’s blog post&lt;/a&gt;.&amp;nbsp;It touched a nerve, which was nice to see. This is an important, nuanced, and complex conversation. I believe that getting folks involved in this conversation is better for everyone.&lt;/p&gt;

&lt;p&gt;Some of the thoughtful responses included this one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/posts/marc-robinson-1648ad_who-the-hell-is-going-to-pay-for-this-activity-7294864246641721345-DNGE" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXcOrnolWXjquE1ySgnKBWNsRqhySozDCDDXZDss3uggBTeM-Sp1EOskhuRfUg-VgZCi54z3orvCCOi7zVTnY2V7DtEr2QYunF7TN94m5nT8QwNlWlNSlp446sgoUyyjn2n4rOqmbw%3Fkey%3DEfy8l_hMi4BlDr65-rNzGduz" width="528" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And this one&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/posts/aminastaneh_saas-startups-softwareengineering-activity-7293362919759581184-yQwl" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnae8i5nceijodhnq5nhw.png" width="531" height="229"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(NOTE: click each image to read the original post)&lt;/em&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;But apparently for some folks it touched the WRONG nerve. People misunderstood the point I was trying to make. Some people (and I’m not linking to those posts) took it as a reason to bash vendors for charging anything at all. To posit that all software (and especially all monitoring software) should be free.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;I wasn’t saying that monitoring tools should be free. I wasn’t even saying that vendors are charging too much. I was saying that &lt;em&gt;if there’s no plan for the observability data we collect, ANY cost seems like too much&lt;/em&gt;. The problem is in our lack of clear goals, not the cost of services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;If there’s no plan, you can’t manage (or even estimate) the costs.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me explain by going back to the title of the blog, and &lt;a href="https://www.youtube.com/watch?v=NGR20B2cEBQ" rel="noopener noreferrer"&gt;the song that inspired it.&lt;/a&gt; My daughter tends to sing the catchy little ditty after one of the (unfortunately many) calls with a prospective customer, who tells her – with all the confidence of someone who’s baking expertise extends only as far as opening a box of Duncan Hines cake mix – that &lt;a href="https://loveplusflour.com/cakes/" rel="noopener noreferrer"&gt;her cakes&lt;/a&gt; are way too expensive, because, and I quote: “anyone could make them.”&lt;/p&gt;

&lt;p&gt;To her credit, my daughter (who’s run &lt;a href="https://loveplusflour.com/" rel="noopener noreferrer"&gt;Love Plus Flour Bakery&lt;/a&gt; for 8 years) remains professional (and calm, which is more than I would have managed).&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;“Free” isn’t (always) the right answer&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Monitoring and observability are ferociously difficult to get right, and the people who devote their time (and sometimes careers) to making it work – to say nothing about making it better – deserve all of our respect.&lt;/p&gt;

&lt;p&gt;They also deserve to be paid for their efforts.&lt;/p&gt;

&lt;p&gt;Like those folks who call my daughter’s bakery, you know who typically thinks they shouldn’t have to pay for observability? People who have only the most tenuous idea of what goes into it and how it works.&lt;/p&gt;

&lt;p&gt;For folks at the forefront of observability, like Liz, this is nothing new.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bsky.app/profile/lizthegrey.com/post/3lhc7obmq3s2f" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXdA4yLTg744DA2ZVZeCbXx3NIy1rGOfhGnxeNBePS27at0rXe-_PTBy0Ad3wBdde4EZGXoMGACxhCLR831j8FGk0vV6Epes2AYAvHbJ4TM6GDjPYETE7TWngcP9zc-a45TFFAGR0A%3Fkey%3DEfy8l_hMi4BlDr65-rNzGduz" width="581" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are those who will be quick to say, “But Leon, open source tools like Grafana are free! Why doesn’t everyone else do that?”&lt;/p&gt;



&lt;p&gt;OK, but hear me out. While the phrase “Linux is only free if your time has no value” is far less true than when &lt;a href="http://nomad.uk.net/articles/is-linux-is-only-free-if-your-time-has-no-value-still-valid.html" rel="noopener noreferrer"&gt;Jamie Zawinski wrote it back in 1998&lt;/a&gt;, the spirit of it still holds. A thing is only as free as the real total cost of it – inclusive of time, effort, and money.&lt;/p&gt;

&lt;p&gt;Lest you think I’m working my way toward the old “Car Triangle” conundrum&lt;/p&gt;

&lt;p&gt;&lt;a href="https://commons.wikimedia.org/wiki/File:Project_car_triangle.jpg" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnar323m9hpqgjmmeyc6n.png" width="640" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;…that’s NOT actually my point. It actually IS possible to have all three. My daughter can throw together a cake, or a loaf of challah, or a batch of cookies faster, better, and cheaper than she can buy them.&lt;/p&gt;

&lt;p&gt;But of course, that’s only if you discount all the time it took her to get to this point. I won’t waste your time sharing that complete (&lt;a href="https://calvincorreli.com/blog/1397-knowing-which-screw-to-turn" rel="noopener noreferrer"&gt;and oft-repeated&lt;/a&gt;) story of the itemized $10,000 repair bill which read&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Breakdown of Charges:&lt;br&gt;&lt;br&gt;
Turning the screw: $1&lt;br&gt;&lt;br&gt;
Knowing which screw to turn: $9,999&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The point stands – the only cheat code for the car triangle dilemma is if you place yourself in the middle of it, bridging the gaps.&lt;/p&gt;

&lt;p&gt;As the late 90’s commercial says, “For everything else, there’s MasterCard.”&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Not All Observability Data is Equal&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;So back to my original point – my post last week was not trying to say observability should be free, or that vendors are charging too much. Re-iterating my main point: if there isn’t a meaningful plan for the observability data you collect, any cost is too high. The corollary is that if you DO have a meaningful plan, you will also know what it’s worth to you to collect, process, and store it.&lt;/p&gt;

&lt;p&gt;But nothing in our lives as IT practitioners is ever as easy as coming up with a single plan for all our data and calling it a day. Different data types have different value propositions, and some of those value profiles are themselves variable based on outside factors like time of year (i.e. Black Friday).&lt;/p&gt;

&lt;p&gt;Or what has just happened. &lt;a href="https://cribl.io/blog/why-the-world-needs-cribl/" rel="noopener noreferrer"&gt;Cribl understood this all the way back in 2022&lt;/a&gt;, when they framed this idea succinctly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“As it happens, all of this high-fidelity data is completely worthless until it comes time for forensics, where it turns out to be invaluable. You have absolutely no need for such a high level of detail until the exact moment when you do need it – and you actually can’t do anything without it.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To expand on that idea a little: I don’t think the nice folks at Cribl are saying that lo-fi data is fine for daily ops monitoring and observability, and you only need high-fi data until you’re in the middle of a retro. Instead, I think it’s akin to something my friend Alec Isaacson, Solutions Architect at Grafana, once said:&amp;nbsp;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;em&gt;“Murphy’s law requires that you’re probably not collecting the data you need.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Unless, of course, you are.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Cognitive (Data) Dissonance&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We don’t need all the data, until we do, and in that liminal moment it goes from worthless to desperately important. We don’t want to pay anything to collect, process, or store the data. Until there’s a crisis, at which point we’re willing to spare no expense.&lt;/p&gt;

&lt;p&gt;For the poor beleaguered monitoring engineer (and yes, I will die on the hill that this is a real job. Or should be.) this may feel like our professional Kobiyashi Maru scenario.&lt;/p&gt;

&lt;p&gt;But it’s not. I believe there’s a way to thread this needle, and in the next blog I’m going to explore exactly that, along with how OTel fits into all of this.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>observability</category>
      <category>opentelemetry</category>
      <category>cost</category>
    </item>
    <item>
      <title>Who the Hell is Going to Pay For This?</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Mon, 17 Mar 2025 04:00:00 +0000</pubDate>
      <link>https://dev.to/leonadato/who-the-hell-is-going-to-pay-for-this-428l</link>
      <guid>https://dev.to/leonadato/who-the-hell-is-going-to-pay-for-this-428l</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LIMITED TIME OFFER! I’m ready for my next adventure as a DevRel advocate / Technical Evangelist / IT Talespinner. If that sounds like something you need, drop me a line &lt;a href="//leon@adatosystems.com"&gt;in email&lt;/a&gt; or on &lt;a href="https://www.linkedin.com/in/leonadato/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I’ve specialized in monitoring and observability for 27 years now, and I’ve seen a lot of tools and techniques come and go (RMon, anyone?); and more than a few come and stay (Rumors of the death of SNMP have been – and continue to be – greatly exaggerated.). Lately I’ve been exploring one of the more recent improvements in the space – OpenTelemetry (which I’m abbreviating to “OTel” for the remainder of this blog). &lt;a href="https://www.adatosystems.com/2025/02/04/o-can-you-tel-me-how-to-get/" rel="noopener noreferrer"&gt;I wrote about my decision to dive into OTel recently&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the most part, I’m enjoying the journey. But there’s a problem that has existed with observability for a while now, and it’s something OTel is not helping. The title of this post hints at the issue, but I want to be more explicit. Let’s start with some comparison shopping.&lt;/p&gt;

&lt;p&gt;Before I piss off every vendor in town, I want to be clear that these are broad, rough, high level numbers. I’ve linked to the pricing pages if you want to check the details, and I acknowledge what you see below isn’t necessarily indicative of the price you might actually pay after getting a quote on a real production environment.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  New Relic &lt;a href="https://newrelic.com/pricing" rel="noopener noreferrer"&gt;charges&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;  35¢ per GB for any data you send them.&lt;/li&gt;
&lt;li&gt;  …although &lt;a href="https://newrelic.com/pricing" rel="noopener noreferrer"&gt;the pricing page&lt;/a&gt; doesn’t make this particularly clear&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Datadog has a veritable laundry list of options, but at a high level, they &lt;a href="https://www.datadoghq.com/pricing/list/" rel="noopener noreferrer"&gt;charge&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;  $15-$34 per host&lt;/li&gt;
&lt;li&gt;  60¢ – $1.22 per million netflow records&lt;/li&gt;
&lt;li&gt;  $1.06-$3.75 per million log records&lt;/li&gt;
&lt;li&gt;  $1.27-$3.75 per million spans&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Dynatrace’s &lt;a href="https://www.dynatrace.com/pricing/rate-card/" rel="noopener noreferrer"&gt;pricing page&lt;/a&gt; sports a list almost as long as Datadog’s but some key items:

&lt;ul&gt;
&lt;li&gt;  15¢ per 100,00 metrics

&lt;ul&gt;
&lt;li&gt;  plus .07¢ per Gig per day for retention&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  2¢ per gig for logs

&lt;ul&gt;
&lt;li&gt;  plus .07¢- per gig per day to retain them&lt;/li&gt;
&lt;li&gt;  plus .035¢ per gig queried&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Events have the same rate as logs&lt;/li&gt;

&lt;li&gt;  .014¢ per 1,000 spans&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;  Grafana, which – it must be noted – is open source and effectively gives you everything for free if you’re willing to do the heavy lifting of installing and hosting. But their &lt;a href="https://grafana.com/pricing/" rel="noopener noreferrer"&gt;pricing can be summed up as&lt;/a&gt;:

&lt;ul&gt;
&lt;li&gt;  $8.00 for 1k metrics, (up to 1/minute)&lt;/li&gt;
&lt;li&gt;  50¢ per gig for logs and traces them, with 30 days retention&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This list is neither exhaustive nor complete. I’ve left off a lot of vendors, not because they also don’t have consumption based pricing but because it would just be more of the same. Even with the ones above, the details here aren’t complete. Some companies not only charge for consumption (ingest), they also charge to store the data, and charge again to query the data (looking at you, New Relic). Some companies push you to pick a tier of service, and if you don’t they’ll charge you an estimated rate based on the 99th percentile of usage for the month (&lt;a href="https://www.finout.io/blog/part-2-the-magic-that-is-datadog-pricing" rel="noopener noreferrer"&gt;looking at you, Datadog&lt;/a&gt;).&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXe8amRnzkBd34-vH1DU5ND_y0mFqfDVJA7eMVRdszt9veAlJ9PNxVVrGNHfzha-6BMbd8DY_9QG4XDEya0_oGaekVwloZc5QZtfN0YGrfuypX9fEIHpl366iltw2D9FugOnKE-b-Q%3Fkey%3DTZQJWeH5l2y4O27w6DqF2hNl" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh7-rt.googleusercontent.com%2Fdocsz%2FAD_4nXe8amRnzkBd34-vH1DU5ND_y0mFqfDVJA7eMVRdszt9veAlJ9PNxVVrGNHfzha-6BMbd8DY_9QG4XDEya0_oGaekVwloZc5QZtfN0YGrfuypX9fEIHpl366iltw2D9FugOnKE-b-Q%3Fkey%3DTZQJWeH5l2y4O27w6DqF2hNl" width="666" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It should surprise nobody that what appears on their pricing page isn’t even the final word. Some of these companies are, even now, looking at redefining their interpretation of the “consumption based pricing” concept that might make things even more opaque (looking at you AGAIN, New Relic).&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Even with all of that said, I’m going out on a limb and stating for the record that each and every one of those price points is so low that even the word “trivial” is too big.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;That is, until the production workloads meet the pricing sheet. At that point those itty bitty numbers add up to real money, and quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Plural of Anecdote
&lt;/h2&gt;

&lt;p&gt;I put this question out to some friends, asking if they had real-world sticker-shock experiences. As always, my friends did not disappoint.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“I did a detailed price comparison of New Relic with Datadog a couple years ago with Fargate as the main usage. New Relic was significantly cheaper until you started shipping logs and then Datadog was suddenly 30-40% cheaper even with apm. [But] their per host cost also factors in and makes APM rather unattractive unless you’re doing something serverless. We wanted to use it on kubernetes but it was so expensive, management refused to believe the costs with services on Fargate so I was usually showing my numbers every 2-3 months.”&lt;/em&gt;&lt;em&gt;– Evelyn Osman, Head of Platform at enmacc&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“All I got is the memory of the CFOs face when he saw the bill.”&lt;/em&gt;&lt;em&gt;– someone who prefers to remain anonymous, even though that quote is freaking epic.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;And of course there’s the (now infamous, in observability circles) whodunit mystery of the &lt;a href="https://blog.pragmaticengineer.com/datadog-65m-year-customer-mystery/" rel="noopener noreferrer"&gt;$65 million Datadog bill&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The First Step is Admitting You Have a Problem
&lt;/h2&gt;

&lt;p&gt;Once upon a time (by which I mean the early 2000’s), the challenge with monitoring (observability wasn’t a term we used yet) was how to identify the data we needed, and then get the systems to give up that data, and then store that data in a way that made it possible (let alone efficient) to use in queries, displays, alerts, and such.&lt;/p&gt;

&lt;p&gt;That was where almost all the cost rested. The systems themselves were on-premises and, once the hardware was bought, effectively “free”. The result was that the accepted practice was to collect as much as possible and keep it forever. And despite the change in technology, many organizations reasoning has remained the same.&lt;/p&gt;

&lt;p&gt;Grafana Solutions Architect Alec Isaacson points out his conversations with customers sometimes go like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“I collect CDM metrics from my most critical systems every 5 seconds because once, a long time ago, someone got yelled at when the system was slow and the metrics didn’t tell them why.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Today, collecting monitoring and observability data (“telemetry”) is comparatively easy, but – both as individuals and organizations – we haven’t changed our framing of the problem. So we continue to grab every piece of data available to us. We instrument our code with every tag and span we can think of; if there’s a log message, we ship it; hardware metrics? Better grab it because it’ll provide context; If there’s network telemetry (NetFlow, VPC Flow logs, Streaming Telemetry) we suck that up too.&lt;/p&gt;

&lt;p&gt;But we never take the time to think about what we’re going to do with it. Ms. Osman’s experience illustrates the result:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“[They] had no idea what they were doing with monitoring […] all the instrumentation and logging was enabled then there was lengthy retention “just in case”. So they were just burning ridiculous amounts of money”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To connect it to another bad behavior that we’ve (more or less) broken ourselves of: Back in the early days of “lift and shift” (often more accurately described as “lift and shit”) to the cloud, we not only moved applications wholesale; we moved it onto the biggest systems the platform offered. Why? Because in the old on-prem context you could only ask for a server once, and therefore you asked for the biggest thing you could get, in order to future-proof your investment. This decision turned out not only to be amusingly naive, it was horrifically expensive and it took everyone a few years to understand how “elastic compute” worked and to retool their applications for the new paradigm.&lt;/p&gt;

&lt;p&gt;Likewise, it’s high time we recognize and acknowledge that we cannot afford to collect every piece of telemetry data available to us, and moreover, that we don’t have a plan for that data even if money was no object.&lt;/p&gt;

&lt;h2&gt;
  
  
  Admit it: Your Problem Also Has a Problem
&lt;/h2&gt;

&lt;p&gt;Let me pivot to OTel for a moment. One of the key reasons – possibly THE key reason – to move to it is to remove, forever and always, the pain of vendor lock-in. This is something I explored &lt;a href="https://www.adatosystems.com/2025/02/04/o-can-you-tel-me-how-to-get/" rel="noopener noreferrer"&gt;in my last blog post&lt;/a&gt; and was echoed recently by a friend of mine:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;OTel does solve a lot of the problems around “Oh great! now we’re trapped with vendor x and it’s going to cost us millions to refactor all this code”&lt;br&gt;&lt;br&gt;
as opposed to “Oh, we’re switching vendors? Cool, let me just update my endpoint…”&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;– Matt Macdonald-Wallace, Solutions Architect, Grafana Labs&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To be very clear, OTel does an amazing job at solving this problem, which is incredible in its own right. BUT… there’s a downside to OTel that people don’t notice right away, if they notice it at all. That problem makes the previous problem even worse.&lt;/p&gt;

&lt;p&gt;OTel takes all of your data (metrics, logs, traces, and the rest), collects it up, and sends it wherever you want it to go. But OTel doesn’t always do it EFFICIENTLY.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 1: log messages
&lt;/h3&gt;

&lt;p&gt;Let’s take the log message below, which comes straight out of&amp;nbsp; syslog. Yes, good old RFC 5424. Born in the 80’s, standardized in 2009, and the undisputed “chatty kathy” of network message protocols. I’ve seen modestly-sized networks generate upwards of 4 million syslog messages per hour. Most of it was absolutely useless drivel, mind you. But those messages had to go somewhere and be processed (or dropped) by some system along the way. It’s one of the reasons I’ve suggested a syslog and trap “filtration system” &lt;a href="https://www.adatosystems.com/2017/05/29/logfile-monitoring-i-do-not-think-it-means-what-you-think-it-means/" rel="noopener noreferrer"&gt;since basically forever&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nit picking about message volume aside, there’s value in some of those messages, to some IT practitioners, some of the time. And so we have to consider (and collect) them too.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;134&amp;gt;1 2018-12-13T14:17:40.000Z myserver myapp 10 - [http_method="GET"; http_uri="/example"; http_version="1.1"; http_status="200"; client_addr="127.0.0.1"; http_user_agent="my.service/1.0.0"] HTTP request processed successfully
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As-is that log message is 228 bytes – barely even a drop in the bucket of telemetry you collect every minute, let alone every day. But for what I’m about to do, I want a real apples-to-apples comparison, so here’s what it would look like if I JSON-ified it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
&amp;nbsp;&amp;nbsp;"pri": 134,
&amp;nbsp;&amp;nbsp;"version": 1,
&amp;nbsp;&amp;nbsp;"timestamp": "2018-12-13T14:17:40.000Z",
&amp;nbsp;&amp;nbsp;"hostname": "myserver",
&amp;nbsp;&amp;nbsp;"appname": "myapp",
&amp;nbsp;&amp;nbsp;"procid": 10,
&amp;nbsp;&amp;nbsp;"msgid": "-",
&amp;nbsp;&amp;nbsp;"structuredData": {
      "http_method": "GET",
      "http_uri": "/example",
      "http_version": "1.1",
      "http_status": "200",
      "client_addr": "127.0.0.1",
      "http_user_agent": "my.service/1.0.0"
      &amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp;"message": "HTTP request processed successfully"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That bumps the payload up to 336 bytes without whitespace, or 415 bytes with. Now, for comparison, here’s a sample OTLP Log message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
   "resource": {
      "service.name": "myapp",
      "service.instance.id": "10",
      "host.name": "myserver"
      },
   "instrumentationLibrary": {
      "name": "myapp",
      "version": "1.0.0"
      },
   "severityText": "INFO",
 &amp;nbsp;&amp;nbsp;"timestamp": "2018-12-13T14:17:40.000Z",
 &amp;nbsp;&amp;nbsp;"body": {
      "text": "HTTP request processed successfully"
     &amp;nbsp;&amp;nbsp;},
&amp;nbsp;&amp;nbsp; "attributes": {
      "http_method": "GET",
      "http_uri": "/example",
      "http_version": "1.1",
      "http_status": "200",
      "client_addr": "127.0.0.1",
      "http_user_agent": "my.service/1.0.0"
     &amp;nbsp;&amp;nbsp;}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That (generic, minimal) message weighs in at 420 bytes (without whitespace; it’s 520 bytes all-inclusive). It’s still tiny, but even so the OTel version with whitespace is 25% bigger than the JSON-ified message (with whitespace), and more than twice as large as the original log message.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Once we start applying real-world data, things balloon even more. My point here is this: If OTel does that to every log message, these tiny costs add up quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 2: Prometheus
&lt;/h3&gt;

&lt;p&gt;It turns out that modern methods of metric management are just as susceptible to inflation.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  A typical prometheus metric, formatted in JSON, is 291 bytes.&lt;/li&gt;
&lt;li&gt;  But that same metric converted to OTLP metrics format weighs in at 751 bytes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s true, OTLP has a batching function that mitigates this, but that only helps with transfer over the wire. Once it arrives at the destination, many (not all, but most) vendors unbatch before storing, so it goes back to being 2.5x larger than the original message. As my buddy Josh Biggley has said,&amp;nbsp;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“2.5x metrics ingest better have a fucking amazing story to tell about context to justify that cost.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  It’s Not You, OTel, It’s Us. (But It’s Also You)
&lt;/h2&gt;

&lt;p&gt;If this all feels a little hyper-critical of OTel, then please give me a chance to explain. I honestly believe that OTel is an amazing advancement and anybody who’s serious about monitoring and observability needs to adopt it as a standard – that goes for users as well as vendors. The ability to emit the braid of logs, metrics, traces while maintaining its context, regardless of destination, is invaluable.&lt;/p&gt;

&lt;p&gt;(But…) OTel was designed by (and for) software engineers. It originated in that bygone era (by which I mean “2016”) when we were still more concerned about the difficulty of getting the data than the cost of moving, processing, and storing it. OTel is, by design, biased to volume.&lt;/p&gt;

&lt;p&gt;The joke of this section’s title notwithstanding, the problem really isn’t OTel. We really are at fault. Specifically our unhealthy relationship with telemetry. If we insist on collecting and transmitting every single data point, we have nobody to blame but ourselves for the sky-high bills we receive at the end of the month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does This Data Bring You Joy?
&lt;/h2&gt;

&lt;p&gt;It’s easy to let your observability solution do the heavy lifting and shunt every byte of data into a unified interface. It’s easy to do if you’re a software engineer who (nominally at least) owns the monitoring and observability solutions.&lt;/p&gt;

&lt;p&gt;It’s even easier if you’re a mere consumer of those services, an innocent bystander. Folks who fall into this category include those closely tied to a particular silo (database, storage, network, etc); or helpdesk and NOC teams who receive the tickets and provide support but aren’t involved in the instrumentation nor the tools the instrumentation is connected to; or teams with more specialized needs that nevertheless overlap with monitoring and observability, like information security.&lt;/p&gt;

&lt;p&gt;But let’s be honest, if you’re a security engineer, how can you justify paying twice cost to ingest logs or metrics, versus the perfectly good standards that already exist and have served well for years? Does that mean you might be using more than one tool? Yes. But as I have pointed out (&lt;a href="https://www.adatosystems.com/2023/06/21/how-to-overcome-data-silos-in-open-source-server-monitoring/" rel="noopener noreferrer"&gt;time&lt;/a&gt; and &lt;a href="https://www.adatosystems.com/2021/11/01/four-ways-your-network-could-change-in-four-years/" rel="noopener noreferrer"&gt;time&lt;/a&gt; and &lt;a href="https://www.adatosystems.com/2020/12/14/distributed-computing-when-everyone-is-working-from-home/" rel="noopener noreferrer"&gt;time&lt;/a&gt; and &lt;a href="https://www.adatosystems.com/2019/08/13/icymi-why-do-we-put-up-with-monitoring-solutions-that-hurt-2/" rel="noopener noreferrer"&gt;time&lt;/a&gt; and &lt;a href="https://www.adatosystems.com/2019/03/13/icymi-monitoring-and-automation-its-easier-than-you-think/" rel="noopener noreferrer"&gt;time&lt;/a&gt; and &lt;a href="https://www.adatosystems.com/2019/03/06/icymi-the-cost-of-monitoring-with-the-wrong-tool/" rel="noopener noreferrer"&gt;time&lt;/a&gt; again) there is not (and never has been, and never will be) a one-size-fits-all solution. And in most situations there’s not even a one-size-fits-MOST solution. Monitoring and observability has always been about heterogeneous implementations. The sooner you embrace that ideal, the sooner you will begin building observability ecosystems that serve the needs of you, your team, and your business.&lt;/p&gt;

&lt;p&gt;To that end there’s a serious ROI discussion to be had before you go all in on OTel or any observability solution.&lt;/p&gt;

&lt;h2&gt;
  
  
   (for now)
&lt;/h2&gt;

&lt;p&gt;We’ve seen the move from per seat (or interface, or chassis, or CPU) pricing to a consumption model in the marketplace in the past. And we’ve also seen technologies move back (like the way cell service moved from per-minute or per-text to unlimited data with a per-month charge). I suspect we may see a similar pendulum swing back with monitoring and observability at some time in the future. But for now, we have to contend with both the prevailing pricing system as it exists today; and with our own compulsion – born at a different point in the history of monitoring – to collect, transmit, and store every bit (and byte) of telemetry that passes beneath our nose.&lt;/p&gt;

&lt;p&gt;Of course, cost isn’t the only factor. Performance, risk, (and more) need to be considered. But at the heart of it all is the very real need for us to start asking ourselves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  What will I do with this data?&lt;/li&gt;
&lt;li&gt;  Who will use it?&lt;/li&gt;
&lt;li&gt;  How long do I need to store it?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And of course, &lt;strong&gt;Who the hell is going to pay for it?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>observability</category>
      <category>monitoring</category>
      <category>opentelemetry</category>
      <category>cost</category>
    </item>
    <item>
      <title>O can you TEL me how to get…</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Mon, 10 Mar 2025 17:44:42 +0000</pubDate>
      <link>https://dev.to/leonadato/o-can-you-tel-me-how-to-get-3cgl</link>
      <guid>https://dev.to/leonadato/o-can-you-tel-me-how-to-get-3cgl</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LIMITED TIME OFFER! I’m ready for my next adventure as a DevRel advocate / Technical Evangelist / IT Talespinner. If that sounds like something you need, drop me a line &lt;a href="//leon@adatosystems.com"&gt;in email&lt;/a&gt; or on &lt;a href="https://www.linkedin.com/in/leonadato/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Someone (I don’t remember who. If it was you, feel free to take credit in the comments) once told me,&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“If you want to break a habit, don’t tell anyone. If you want to build a habit or achieve a goal, tell everyone.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So here we are.&lt;/p&gt;

&lt;p&gt;After more than&amp;nbsp; 25 years of using monitoring tools – using everything from Tivoli, Openview, Nagios, and janky Perl scripts (which is kind of another way of saying “Tivoli”); to SolarWinds, New Relic, Kentik, and Grafana – I’ve decided to forego the toes-dipping and just dive headfirst into the world of OpenTelemetry (which I’m abbreviating to just “OTel” for the rest of this post).&lt;/p&gt;

&lt;p&gt;I’ve bought &lt;a href="https://learningopentelemetry.com/" rel="noopener noreferrer"&gt;a couple&lt;/a&gt; of &lt;a href="https://www.wiley.com/en-us/Mastering+OpenTelemetry+and+Observability%3A+Enhancing+Application+and+Infrastructure+Performance+and+Avoiding+Outages-p-9781394253135" rel="noopener noreferrer"&gt;really great&lt;/a&gt; ) books* and I’m working my way through &lt;a href="https://trainingportal.linuxfoundation.org/courses/getting-started-with-opentelemetry-lfs148" rel="noopener noreferrer"&gt;Getting Started with OpenTelemetry&lt;/a&gt; from the Linux Foundation. All of this with the goal of adding the shiny new &lt;a href="https://www.cncf.io/training/certification/otca/" rel="noopener noreferrer"&gt;OTCA certification&lt;/a&gt; to the alphabet soup of certs I’ve gathered over 3 decades in tech.&lt;/p&gt;

&lt;p&gt;An obvious (if somewhat simplistic) question may be “why?”. The answers are (to me at least) equally obvious:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  OTel is not only new (&lt;a href="https://www.stack.io/blog/a-history-of-monitoring-and-opentelemetry" rel="noopener noreferrer"&gt;or at least new-ish&lt;/a&gt;. 2019 wasn’t THAT long ago) and cool, it’s proven not only that it has staying power, but also utility.&lt;/li&gt;
&lt;li&gt;  Charity Majors and Honeycomb said it best: &lt;a href="https://i0.wp.com/charity.wtf/wp-content/uploads/2024/08/newpix-44.jpeg?resize=300%2C279&amp;amp;ssl=1" rel="noopener noreferrer"&gt;“The Three Pillars of Observability are Metrics, Logs, Traces, and DRAMA”&lt;/a&gt;, and OTel has survived A LOT of that drama.&lt;/li&gt;
&lt;li&gt;  Slinging SNMP is great and all, but it’s not the whole story.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://i0.wp.com/www.adatosystems.com/wp-content/uploads/2025/02/honeycomb.jpeg?ssl=1" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F529cj5t9h0fkwu1inqwm.jpeg" width="423" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bombastic hyperbole aside, there’s another very real reason I want to dig into OTel: vendor lock-in is exhausting.&lt;/p&gt;

&lt;p&gt;Obviously, it’s exhausting for customers, who have to do the heavy lifting of implementing a new observability tool and all that implies. It’s exhausting in those first few months, separating engineering fact from sales fiction, and stumbling through the process of applying in ways that both replace or enhance the previous solution, and also serve the business needs. And even after that, there’s the exhausting toll of constantly questioning the choice – whether it was really worth the functionality you got versus the missing features you needed, wondering if it’s too late to change, or if that feeling is really just &lt;a href="https://www.adatosystems.com/2019/03/31/dollar-auction/" rel="noopener noreferrer"&gt;the sunk cost fallacy&lt;/a&gt; at play.&lt;/p&gt;

&lt;p&gt;But, believe it or not, it’s also exhausting for the vendors. Nobody will say it out loud (at least not where C-level executives can hear), but no solution can do it all. Not only is there not a “one-size-fits-all”, there’s not even a “one-size-fits-MOST”! So vendors have to dance around indelicate truth. Some hand-wave away any gaps (“Most customers come to realize they don’t really need that.”), some kick it down the road (“Let’s get the main installation out of the way, then we can revisit this.”), and the worst ones flat-out gaslight (“That wasn’t part of our original conversation.”)&lt;/p&gt;

&lt;p&gt;Of course, &lt;em&gt;good&lt;/em&gt; observability vendors – and there are a few – avoid those tactics and are honest about what they do and don’t cover. But even that can be exhausting, because even as you feel good about being up-front and honest, you also have to cope with the existential dread of a prospect walking away when your solution doesn’t measure up to their (often impossible) laundry list of desired features.&lt;/p&gt;

&lt;p&gt;Into this fraught environment, in the misty distant bygone era of 2019, arrived OTel. It came with a completely different paradigm: Take whatever data you have – be it metrics, logs, or traces; shoot it through a home-grown collector; and send it anywhere you need – whether an equally home-grown database, or one vendor, or three. And do it all for free**.&lt;/p&gt;

&lt;p&gt;Even as I noted that the technology itself was still in its early stages, I recognized an ethos I can respect, a mission I can get behind, and a story I’d enjoy telling.&lt;/p&gt;

&lt;p&gt;Since 2019, both OTel and I have been growing – in OTel’s case it has been both a matter of adoption and the natural maturation that any open source project goes through. In my case, it was building familiarity and skills beyond my sysadmin and network engineer roots – going from macro maven and script kiddie to… if not a full fledged developer, then at least a coder of modest skill. Because OTel is first and foremost a tool for developers to understand how their application is performing; and second how their app infrastructure (meaning containers, microservices, and the cloud) is holding up. “Real” infrastructure – the things that live in layers 1-4 of the OSI model are a distant third in terms of OTel priority.&lt;/p&gt;

&lt;p&gt;Therefore I had to raise my awareness through those layers in equal measure, finally wrapping my head around spans and traces and the instrumentation that enable them.&lt;/p&gt;

&lt;p&gt;Just to be clear, I’m not abandoning my humble beginnings. You’re going to read about my attempts (quixotic though they might be) to get good old SNMP, WMI, and other “traditional” hardware metrics into the OTel pipeline. You might even see me try to instrument a janky Perl script or two. Because an important part of growing your skills is finding ways to integrate them with what you already know.&lt;/p&gt;

&lt;p&gt;That’s where I’m at now, and why I’m starting this series. It’s a way of both documenting my journey and leaving breadcrumbs for others to follow. It’s not that I think I’m blazing a trail that is particularly new or novel. It’s that for people with my background – who haven’t been programming since they were nine; or who remember when IPv6 was both new and critically necessary (and why); or whose experience with monitoring involves 3 janky Perl scripts in a trenchcoat – for all those folks, the current world of modern observability can seem opaque, if not inscrutable.&lt;/p&gt;

&lt;p&gt;I hope you’ll join me on this journey.&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&amp;nbsp;* shout out to &lt;a href="https://github.com/tedsuo" rel="noopener noreferrer"&gt;Ted Young&lt;/a&gt; and &lt;a href="https://aparker.io/" rel="noopener noreferrer"&gt;Austin Parker&lt;/a&gt; for &lt;a href="https://learningopentelemetry.com/" rel="noopener noreferrer"&gt;“Learning OpenTelemetry”&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&amp;nbsp; &amp;nbsp; and &lt;a href="https://www.linkedin.com/in/steveflanders/" rel="noopener noreferrer"&gt;Steve Flanders&lt;/a&gt; for &lt;a href="https://www.wiley.com/en-us/Mastering+OpenTelemetry+and+Observability%3A+Enhancing+Application+and+Infrastructure+Performance+and+Avoiding+Outages-p-9781394253135" rel="noopener noreferrer"&gt;“Mastering OpenTelemetry and Observability”&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&amp;nbsp;** Well, except the last part. The folks at Grafana, Honeycomb, Data Dog, and the rest all gotta eat.&lt;/p&gt;

</description>
      <category>observability</category>
      <category>monitoring</category>
      <category>opentelemetry</category>
    </item>
    <item>
      <title>Announcing Zmanim WP: My New WordPress Plugin</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Tue, 04 Mar 2025 03:22:39 +0000</pubDate>
      <link>https://dev.to/leonadato/announcing-zmanim-wp-my-new-wordpress-plugin-2ino</link>
      <guid>https://dev.to/leonadato/announcing-zmanim-wp-my-new-wordpress-plugin-2ino</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LIMITED TIME OFFER! I’m ready for my next adventure as a DevRel advocate / Technical Evangelist / IT Talespinner. If that sounds like something you need, drop me a line &lt;a href="//leon@adatosystems.com"&gt;in email&lt;/a&gt; or on &lt;a href="https://www.linkedin.com/in/leonadato/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you’ve been following this blog, you know I’ve had a&amp;nbsp;&lt;a href="https://www.adatosystems.com/?s=%22data+series%22" rel="noopener noreferrer"&gt;running series&lt;/a&gt;&amp;nbsp;on implementing&amp;nbsp;&lt;a href="https://github.com/zachweix/PhpZmanim" rel="noopener noreferrer"&gt;PHP Zmanim&lt;/a&gt;, the library based on&amp;nbsp;&lt;a href="https://github.com/KosherJava/zmanim" rel="noopener noreferrer"&gt;Kosher Java&lt;/a&gt;&amp;nbsp;that simplifies the work needed to calculate times related to Jewish religious observance. (If you need a full explanation of what that is, check out&amp;nbsp;&lt;a href="https://www.adatosystems.com/2024/02/26/time-data-series-getting-started-with-php-zmanim/" rel="noopener noreferrer"&gt;the first blog in the series&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;While the work of understanding and implementing PHP Zmanim has been fun for it’s own sake, I was working on a larger goal behind the scenes: A&amp;nbsp;&lt;a href="https://wordpress.org/plugins/zmanim-wp/" rel="noopener noreferrer"&gt;WordPress plugin&lt;/a&gt;&amp;nbsp;that implemented the library in a way that non-programmers could use on their (WordPress-based) websites.&lt;/p&gt;

&lt;p&gt;Today, I’m thrilled to announce the plugin is&amp;nbsp;&lt;a href="https://wordpress.org/plugins/zmanim-wp/" rel="noopener noreferrer"&gt;available for download&lt;/a&gt;. My wife is equally excited because it means I’ll (hopefully) go back to more consistently remember to eat, bath, and come to bed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://wordpress.org/plugins/zmanim-wp/" rel="noopener noreferrer"&gt;Zmanim WP&lt;/a&gt;&amp;nbsp;is free* and can be download from within your WordPress environment (go to Plugins, Add a New Plugin, and search for “Zmanim WP” or even just “zmanim”).&lt;/p&gt;

&lt;p&gt;Like the upcoming movie “The Thunderbolts*”, the splat (or “asterisk” for youngsters and pedantic linguists) is doing a bit of heavy lifting. Zmanim WP is actually “freemium”, meaning that some features are available and free to you forever, and other capabilities are only open if you buy a license.&lt;/p&gt;

&lt;p&gt;Before you fire up the torches, grab anti-capitalist pitchforks, and head to my luxurious mansion in Cleveland with arson in your heart, note that all the proceeds are going to charity. The initial charity will be&amp;nbsp;&lt;a href="https://bkcscle.com/" rel="noopener noreferrer"&gt;my synagogue&lt;/a&gt;&amp;nbsp;because:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; The Rabbi is my cousin and he’s an amazing guy
…but more importantly,&lt;/li&gt;
&lt;li&gt; they’ve been alpha testing this for over 2 years, and had to suffer all my false starts, mistakes, bad time calculations, and questions. And did so with patience, equanimity, and good humor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With all that said, I’d like to talk about how the plugin works overall, and then I’ll explain what’s in the free version versus what I’ve held back in exchange for some filthy lucre.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Zmanim WP works
&lt;/h2&gt;

&lt;p&gt;In its simplest form, the day-to-day use (I’ll get to the initial setup in a minute) of this plugin involves shortcodes, that might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[zman_sunset]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[zman_shema]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[zman_misheyakir]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Basically it’s a set of brackets (&lt;code&gt;[...]&lt;/code&gt;) with the word “zman_” followed by a specific type of time. When a visitor comes to your live (WordPress based) website and views a page, post, or widget with that shortcode, it will display the corresponding time.&lt;/p&gt;

&lt;p&gt;For example, I have it running on THIS website, with the location set to Disneyland in California (Lat: 33.8120918, Long: -117.9215545). By using the shortcode [ zman_sunset ] you will see TODAY’S sunset for that location, no matter which day you view this page: &lt;strong&gt;&lt;em&gt;5:49 pm&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you don’t include any other options, it will show the time for the current day, in a standard&amp;nbsp;&lt;code&gt;_hh:mm am/pm_&lt;/code&gt;&amp;nbsp;format.&lt;/p&gt;

&lt;p&gt;But the fact is that you CAN include options – a lot of them. For example (and this is just a sample. For the full list of options you should check out the&amp;nbsp;&lt;a href="https://www.adatosystems.com/zmanim-wp/" rel="noopener noreferrer"&gt;Zmanim WP documentation&lt;/a&gt;&amp;nbsp;on AdatoSystems.com) you can include a date option&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  “tomorrow” will show the day after the one when the page is viewed.

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;[ zman_alot date="tomorrow" ]&lt;/code&gt;&amp;nbsp;(which, again, is set for “the happiest place on earth” would be 4:17 am)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  “sunday” (or monday, tuesday, etc) will show the next upcoming day of that name. So if it’s currently Monday, the following code will show sunset for the upcoming Wednesday:

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;[ zman_sunset date="Wednesday" ]&lt;/code&gt;&amp;nbsp;(which results in 5:51 pm)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  (an actual date) will show the time for the specified date.

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;[ zman_alot date="2025-01-10" ]&lt;/code&gt;&amp;nbsp;(that gives you 4:57 am)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;You can also include a time offset. Let’s say that Mincha starts 20 minutes before sunset every day. You could automatically display that time using the code:&lt;br&gt;&lt;br&gt;
&lt;code&gt;[ zman_sunset offset=-20 ]&lt;/code&gt;&amp;nbsp;(resulting in 5:29 pm)&lt;/p&gt;

&lt;p&gt;You can also change the time formatting. This gets a little more into the weeds, as it leverages PHP’s built-in datetime formatting (&lt;a href="https://www.tutorialrepublic.com/php-tutorial/php-date-and-time.php" rel="noopener noreferrer"&gt;Here’s a nice tutorial&lt;/a&gt;&amp;nbsp;on how those formatting codes work.). Thus, if I wanted to get the date information along with the time (including seconds) for sunset, I could use this:&lt;br&gt;&lt;br&gt;
&lt;code&gt;[ zman_sunset dateformat="m-d-Y h:i:s a" ]&lt;/code&gt;&amp;nbsp;(that would be: 03-02-2025 05:49:24 pm)&lt;/p&gt;

&lt;p&gt;And just to be super clear about things, you can use all of those codes together if you want.&lt;/p&gt;

&lt;p&gt;There are also some options that don’t work across the board. For example “lang” will let you specify hebrew or english for some output like the Torah Portion or the Date. But it wouldn’t work for sunset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fall Back: Setting Up Zmanim WP
&lt;/h2&gt;

&lt;p&gt;I said I would get to this part. To be honest, the setup isn’t all THAT involved. Once you install the plugin, you’ll get a new menu in the WordPress Admin portal. Clicking on the top level menu takes you to the main options page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4mhmbeqygjgoyi9i6wis.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4mhmbeqygjgoyi9i6wis.png" alt="Zmanim WordPress Main Options" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you set the location (using latitude and longitude), the time zone, and a few other cosmetic elements.&lt;/p&gt;

&lt;p&gt;However, the main work of configuration happens on the Standard Zmanim Settings page.&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdeqpuc1g3sauwnp6cktc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdeqpuc1g3sauwnp6cktc.png" alt="Standard time options" width="800" height="817"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where you select the method of calculating each zman from dropdowns populated with a wide range of halachic opinions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free Features
&lt;/h2&gt;

&lt;p&gt;The shortcodes that are available to all users are:&lt;/p&gt;

&lt;h3&gt;
  
  
  Location and Reference
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  zman_location – Displays the location, as defined on the admin page.&lt;/li&gt;
&lt;li&gt;  zman_lat – Shows the latitude, as defined on the admin page.&lt;/li&gt;
&lt;li&gt;  zman_long – Shows the longitude, as defined on the admin page.&lt;/li&gt;
&lt;li&gt;  zman_tzone – Shows the Time Zone, as defined on the admin page.&lt;/li&gt;
&lt;li&gt;  Special Dates and Days&lt;/li&gt;
&lt;li&gt;  zman_shaah – A halachic hour, or 1/12 of the available daylight, as calculated based on the shita selected in the drop-down on the admin page.&lt;/li&gt;
&lt;li&gt;  zman_parsha – Provides the Torah reading for that week&lt;/li&gt;
&lt;li&gt;  zman_zmandate – Provides the date&lt;/li&gt;
&lt;li&gt;  zman_chodesh – The day(s) for the indicated Rosh Chodesh. If the date indicated is “today” or “next”, text ONLY be visible if this week/next week is Rosh Chodesh.&lt;/li&gt;
&lt;li&gt;  zman_molad – The day/time for the indicated Molad. If the date indicated is “today” or “next”, text ONLY be visible if this week/next week is the Molad.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Standard Zmanim
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  zman_sunrise – Netz haChachma (nautical sunrise, without elevation).&lt;/li&gt;
&lt;li&gt;  zman_sunset – Shkia (nautical sunset, without elevation).&lt;/li&gt;
&lt;li&gt;  zman_candles – The time for Shabbat candles, which is sunset/shkia minus the number of minutes indicated on the admin page.&lt;/li&gt;
&lt;li&gt;  zman_alot – Alot haShachar (earliest time for tallit &amp;amp; tefillin).&lt;/li&gt;
&lt;li&gt;  zman_misheyakir – Misheyakir (earliest time for tefillot).&lt;/li&gt;
&lt;li&gt;  zman_shema – Sof Zman Kriat Shema (latest time to say Shema)&lt;/li&gt;
&lt;li&gt;  zman_tefilla – Sof Zman Tefilla (latest time to say Shacharit)&lt;/li&gt;
&lt;li&gt;  zman_gedola – Mincha Gedola&lt;/li&gt;
&lt;li&gt;  zman_ketana – Mincha Ketana&lt;/li&gt;
&lt;li&gt;  zman_plag – Plag haMincha&lt;/li&gt;
&lt;li&gt;  zman_bain – B’ain haShmashot (time between sunset/shkia and tzeit haKochavim).&lt;/li&gt;
&lt;li&gt;  zman_tzait – Tzait haKochavim (the time 3 stars are visible in the night sky).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Paid Features
&lt;/h2&gt;

&lt;p&gt;The following shortcodes are only available in the paid version of the Zmanim WP plugin. Along with the shortcodes you see below, there are additional configuration screens to set up key options and elements of the codes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  zman_earlyshkia -Displays the earliest shkia time for the week (Sunday – Thursday) in which the provided date occurs.

&lt;ul&gt;
&lt;li&gt;  Example 1: show earliest shkia for this week:

&lt;ul&gt;
&lt;li&gt;  5:49 pm&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  Example 2: show earliest shkia for next week:

&lt;ul&gt;
&lt;li&gt;  6:55 pm&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;  zman_lateshkia – Displays the latest shkia time for the week (Sunday – Thursday) in which the provided date given&lt;/li&gt;

&lt;li&gt;  zman_fullyear* – as described in the “Full Year Display” section above, this displays a grid of times for a complete year.&lt;/li&gt;

&lt;li&gt;  zman_early_shabbat_1* through zman_early_shabbat_4* – As described in the “Early Shabbat Options” section above, each of these will display one of two shortcode outputs for early/regular Shabbat.&lt;/li&gt;

&lt;li&gt;  zman_misheyakirweekly – provide an array of times for misheyakir, either for this week or next week. Specific times are accessed by using the “daynum” option.&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Last Word (for now)
&lt;/h2&gt;

&lt;p&gt;Going all the way back to&amp;nbsp;&lt;a href="https://www.adatosystems.com/2024/02/26/time-data-series-getting-started-with-php-zmanim/" rel="noopener noreferrer"&gt;my first “Time Data Series” post&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What time will afternoon prayers (Mincha) be this week?” is a deceptively complex question. It’s deceptive because “afternoon prayers” seems to be self-explanatory, but (as with so many things related to Jewish religious rules (halacha) there’s a vast amount of background, commentary, and specificity required.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If answering this question has stymied you, the Zmanim WP plugin might just be able to help. For more details, including how to download, install, and upgrade to the paid version of the plugin, check out the&amp;nbsp;&lt;a href="https://www.adatosystems.com/zmanim-wp/" rel="noopener noreferrer"&gt;Zmanim WP documentation&lt;/a&gt;&amp;nbsp;on AdatoSystems.com&lt;/p&gt;

</description>
      <category>php</category>
      <category>jewish</category>
      <category>time</category>
    </item>
    <item>
      <title>Time Data Series: It’s Not What You Said It’s How You Said It</title>
      <dc:creator>Leon Adato</dc:creator>
      <pubDate>Thu, 27 Feb 2025 17:12:28 +0000</pubDate>
      <link>https://dev.to/leonadato/time-data-series-its-not-what-you-said-its-how-you-said-it-5g4f</link>
      <guid>https://dev.to/leonadato/time-data-series-its-not-what-you-said-its-how-you-said-it-5g4f</guid>
      <description>&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LIMITED TIME OFFER! I’m ready for my next adventure as a DevRel advocate / Technical Evangelist / IT Talespinner. If that sounds like something you need, drop me a line &lt;a href="//leon@adatosystems.com"&gt;in email&lt;/a&gt; or on &lt;a href="https://www.linkedin.com/in/leonadato/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;
&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In my &lt;a href="https://www.adatosystems.com/2024/10/07/time-data-series-the-rest-of-the-story/" rel="noopener noreferrer"&gt;last post on PHP Zmanim&lt;/a&gt;, I said the next thing I’d write about were astronomy calculations. I still plan to do that, but something came up recently that caught my attention, so I’m going to talk about that instead. I still plan to get to the astronomy stuff.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sephardi vs Ashkenazi
&lt;/h2&gt;

&lt;p&gt;No, not kitniyot. No, not how to hang your mezuzzah. No, not whether you have to use water challah or if egg challah is ok. I’m talking about the “T” sound in certain words.&lt;/p&gt;

&lt;p&gt;Consider:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bereshis&lt;/th&gt;
&lt;th&gt;Bereshit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ki Seitzei&lt;/td&gt;
&lt;td&gt;Ki Teitzei&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Teves&lt;/td&gt;
&lt;td&gt;Tevet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There are more, but (if you read/speak Hebrew, or have been part of orthodox Jewish communities for any length of time) you get the point. These two traditions have different ways of pronouncing certain sounds, and therefore the English transliteration changes. And like any tradition, those who adhere to one or the other can be passionate about insisting on the “correct” usage.&lt;/p&gt;

&lt;p&gt;PHP Zmanim, on it’s own, is “coded” using Ashkenazi style transliterations. But that doesn’t mean you can’t change that, and do so fairly easily. In the next few sections I’m going to show you how to take the pre-existing transliterations for dates, holidays, and Torah Portion titles and convert them so that they appear in whatever way YOU want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Create Your Map
&lt;/h2&gt;

&lt;p&gt;For month names, Torah portion titles, holidays, and more, PHP Zmanim has a map of values. Let’s start with the easiest one – Months.&lt;/p&gt;

&lt;p&gt;This is just a simple array of values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;transliteratedMonths = ["Nissan", "Iyar", "Sivan", "Tammuz", "Av", "Elul", "Tishrei", "Cheshvan","Kislev", "Teves", "Shevat", "Adar", "Adar II", "Adar I"];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In order to “fix” this and use the transliteration you want (in this case, it’s probably only “Teves” that has to change), you’d first re-create the array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$transliteratedMonths = ["Nissan", "Iyar", "Sivan", "Tammuz", "Av", "Elul", "Tishrei", "Cheshvan","Kislev", "Tevet", "Shevat", "Adar", "Adar II", "Adar I"];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Set Up Your Calendar
&lt;/h2&gt;

&lt;p&gt;For holidays, you’ll use that the jewishCalendar object (which we covered in &lt;a href="https://www.adatosystems.com/2024/10/07/time-data-series-the-rest-of-the-story/" rel="noopener noreferrer"&gt;the previous blog post&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;First we set the year, month, and day variables and create a Jewish calendar object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$year = 2025;
$month = 1;
$day = 10;
$jewishCalendar = Zmanim::jewishCalendar(Carbon::createFromDate($theyear, $themonth, $theday));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Put it All together
&lt;/h2&gt;

&lt;p&gt;Next we initialize the PHP ZManim format and then push the new transliterated months into PHP Zmanim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$format = Zmanim::format();
$format-&amp;gt;setTransliteratedMonthList($transliteratedMonths);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, we take that output that format to a variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$zmandate = json_decode('"' . $format-&amp;gt;format($jewishCalendar) . '"');
return $zmandate;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result would be&lt;br&gt;&lt;br&gt;
&lt;code&gt;10 Tevet 5785&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And yes, if you are wondering, in 2025, the day numbers (1, 2, 3, etc) in the month of Tevet and the month of January match up.&lt;/p&gt;
&lt;h2&gt;
  
  
  Happy Holidays!
&lt;/h2&gt;

&lt;p&gt;Holiday transliterations are handled similarly, even if there are a few minor differences.&lt;/p&gt;

&lt;p&gt;Start off with the same initial setup of the date and calendar object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$year = 2025;
$month = 1;
$day = 10;
$jewishCalendar = Zmanim::jewishCalendar(Carbon::createFromDate($theyear, $themonth, $theday));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we’ll set the holiday transliterations the same way we did for months::&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$transliteratedHolidays = ["Erev Pesach", "Pesach", "Chol Hamoed Pesach", "Pesach Sheni", "Erev Shavuot", "Shavuot", "Shiva Asar B'Tammuz", "Tisha B'Av", "Tu B'Av", "Erev Rosh Hashana", "Rosh Hashana", "Tzom Gedalyah", "Erev Yom Kippur", "Yom Kippur", "Erev Succot", "Succot", "Chol Hamoed Succot", "Hoshana Rabba", "Shemini Atzeret", "Simchat Torah", "Erev Chanukah", "Chanukah", "Tenth of Tevet", "Tu Bishvat", "Taanit Esther", "Purim", "Shushan Purim", "Purim Katan", "Rosh Chodesh", "Yom HaShoah", "Yom Hazikaron", "Yom Ha'atzmaut", "Yom Yerushalayim", "Lag B'Omer","Shushan Purim Katan", "Isru Chag"];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we initialize the PHP ZManim format and then push the new transliterated months into PHP Zmanim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$format = Zmanim::format();
$format-$format-&amp;gt;setTransliteratedHolidayList($transliteratedHolidays);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, we use the calendar information and (if it’s a holiday) get the output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$zmanholiday = $format-&amp;gt;formatYomTov($jewishCalendar);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Echoing&amp;nbsp;&lt;code&gt;$zmanholiday&lt;/code&gt;&amp;nbsp;would look like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tenth of Tevet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;NOTE: For those who aren’t familiar, “The Tenth of Tevet” (or “Asarah B’Tevet”) is fast day, and has it’s own special set of observances.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s in a Name?
&lt;/h2&gt;

&lt;p&gt;Our last example deals with the transliteration of Torah portion names – whether one renders the first portion in Torah “Bereshis” or “Beresheet”. For this, PHP Zmanim uses an array of key-value pairs, where all you need to do is change the value, and leave the key alone. Here’s what it looks like unchanged:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$this-&amp;gt;transliteratedParshaMap = [
Parsha::NONE =&amp;gt; "",
Parsha::BERESHIS =&amp;gt; "Bereshis",
Parsha::NOACH =&amp;gt; "Noach",
Parsha::LECH_LECHA =&amp;gt; "Lech Lecha",
Parsha::VAYERA =&amp;gt; "Vayera",
Parsha::CHAYEI_SARA =&amp;gt; "Chayei Sara",
Parsha::TOLDOS =&amp;gt; "Toldos",
(and so on. I'm not printing the full list here)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(And here’s the edits I’m making for my (Sephardic) synagogue:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$transliteratedParshaMap = [
Parsha::NONE =&amp;gt; "",
Parsha::BERESHIS =&amp;gt; "Beresheet",
Parsha::NOACH =&amp;gt; "Noach",
Parsha::LECH_LECHA =&amp;gt; "Lech Lecha",
Parsha::VAYERA =&amp;gt; "Vayera",
Parsha::CHAYEI_SARA =&amp;gt; "Chayei Sara",
Parsha::TOLDOS =&amp;gt; "Toldot",
(etc)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using this within your code follows the same pattern we’ve established with dates and holidays.&lt;/p&gt;

&lt;p&gt;Before we start coding, it’s important to note that you have to ensure the “Parsha” class is being used by your code:&lt;br&gt;&lt;br&gt;
&lt;code&gt;use PhpZmanim\HebrewCalendar\Parsha;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It’s also important for you to know that PHP Zmanim will only output a Torah Portion if the date given is a Saturday, so you might need to take any given date and find the upcoming (or previous) Saturday in order to get the right result.&lt;/p&gt;

&lt;p&gt;Once those items are handled, you start by establishing the calendar object as with our other examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$getyear = 2024;
$getday = 26;
$getmonth = 10;
$jewishCalendar = Zmanim::jewishCalendar(Carbon::createFromDate($theyear, $themonth, $theday));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the new transliteration variable (note that this is only partially rendered. You can find the full key-value array at (as of the time of this writing)&amp;nbsp;&lt;a href="https://github.com/zachweix/PhpZmanim/blob/68474a7430d05122b5f49bd858f833257b6cced3/src/HebrewCalendar/HebrewDateFormatter.php#L169" rel="noopener noreferrer"&gt;line 169 in the PHP Zmanim github repo&lt;/a&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$transliteratedParshaMap = [
Parsha::NONE =&amp;gt; "",
Parsha::BERESHIS =&amp;gt; "Beresheet",
Parsha::NOACH =&amp;gt; "Noach",
Parsha::LECH_LECHA =&amp;gt; "Lech Lecha",
Parsha::VAYERA =&amp;gt; "Vayera",
Parsha::CHAYEI_SARA =&amp;gt; "Chayei Sara",
Parsha::TOLDOS =&amp;gt; "Toldot",
(etc)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next we initialize the format and then push the new transliterated array:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$format = Zmanim::format();
$format-&amp;gt;setTransliteratedParshiosList($transliteratedParshaMap);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, we use the calendar information to grab the correct Torah potion transliterated the way we want it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$output = json_decode('"' . $format-&amp;gt;formatParsha($jewishCalendar) . '"');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Echo-ing the output would give us:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beresheet&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What More is There to Say?
&lt;/h2&gt;

&lt;p&gt;For some, this all might seem like an un-necessary amount of work for a few spelling differences. For folks who haven’t spent a lot of time in groups where different Jewish cultures mix, it can be jarring to find out just how passionate people feel about these things.&lt;/p&gt;

&lt;p&gt;Now, remind me again about the “proper” way to pronounce GIF?&lt;/p&gt;

</description>
      <category>time</category>
      <category>judaism</category>
      <category>php</category>
    </item>
  </channel>
</rss>
