<?xml version="1.0" encoding="UTF-8"?>
<rss version='2.0' xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Russ Bishop</title>
    <description>This blog represents my own personal opinion and is not endorsed by my employer.</description>
    <link>http://russbishop.net/feed</link>
    <atom:link href="http://russbishop.net/feed" rel="self" type="application/rss+xml"/>
    <category domain="russbishop.net">Content Management/Blog</category>
    <language>en-us</language>
      <pubDate>Fri, 13 Feb 2026 11:07:36 -0800</pubDate>
    <managingEditor>xenadu@gmail.com (Russ Bishop)</managingEditor>
      <item>
        <guid>http://russbishop.net/pile-of-lies#61438</guid>
          <pubDate>Fri, 13 Feb 2026 11:07:36 -0800</pubDate>
        <link>http://russbishop.net/pile-of-lies</link>
        <title>Machinist</title>
        <description></description>
        <content:encoded><![CDATA[<p>lathe piling chips<br>
fluffy and soft<br>
these are lies<br>
in the pile<br>
lies only regret</p>
]]></content:encoded>
      </item>
      <item>
        <guid>http://russbishop.net/no-such-thing-as-speed-of-light#61429</guid>
          <pubDate>Tue, 03 Feb 2026 11:34:50 -0800</pubDate>
        <link>http://russbishop.net/no-such-thing-as-speed-of-light</link>
        <title>No Such Thing as Speed of Light</title>
        <description></description>
        <content:encoded><![CDATA[<p>I&#39;m no <del>physicist</del> particle farmer so take this opinion for what it is worth. </p>

<p>Using the phrase &quot;Speed of Light&quot; is such a misnomer I believe it actively causes harm and makes some things in physics more difficult to understand than they otherwise would be. Why should light&#39;s chosen speed have anything to do with, well, anything at all? Why should time travel being impossible be related to light? Why should our ability to travel have anything to do with light? Why should time dilation give a fig about light?</p>

<p>The answer is none of those have anything to do with light or its speed. Whatsoever. Our universe has a <em>speed of causality</em>. The maximum speed at which changes in the fields that make up our spacetime can propagate from one quanta, one point, of spacetime to another. This is a physical property of the universe itself. Putting everything else aside if light did not exist all of those other effects would remain unchanged. The maximum speed anything with mass could travel would not change. The need to adjust the clocks of GPS satellites due to time dilation in a gravitation field would not change. Light has nothing to do with it.</p>

<p>Light travels at a maximum speed because having no mass the laws of physics require it to do so. <strong>Light speed is a side effect.</strong> It is not the cause or source of the things attributed to it.</p>

<p>I don&#39;t know if <em>Speed of Causality</em> is the right phrasing but we need a better one. Quantum physics is brain-breaking enough, no need to go confusing the matter by inferring that the speed at which light travels is the cause of other phenomena.</p>

<h1 id="a-further-aside">A further aside</h1>

<p>All metaphors, analogies, and simplifications are by necessity imperfect. Most people cannot understand anything without first grasping a simplified version of it (I certainly cannot). A proverbial hook on which to hang one&#39;s mental hat. The more abstract the concept the more concrete the path to understanding needs be.</p>

<p>Imagine our universe - our spacetime - is made up of an uncountable number of tiny quanta or points. There is no such thing as &quot;between&quot; these points. They are existence itself. Imagine further that each point can only transmit or receive changes in fields from its immediate neighbors at certain defined steps in time. In other words the clock ticks, everyone exchanges changes like white elephant gifts, then sits back down to process what they&#39;ve got and plan the next move. None of them can take or hand over anything until the next clock tick.</p>

<p>Thought of this way it makes complete sense there should be some maximum speed during which the current point applies the rules and the results are propagated to its neighbors during the next step. The total time it takes for these ticks to happen over some distance is the speed of causality over that distance. The maximum speed at which each neighbor can hand things to the next neighbor in a long bucket brigade.</p>

<p>Now does our universe actually work this way? I have no idea. Probably not. It is just an analogy. Hopefully someone with greater understanding will come up with a better one.</p>
]]></content:encoded>
      </item>
      <item>
        <guid>http://russbishop.net/string-interpolation#54152</guid>
          <pubDate>Thu, 06 Oct 2022 11:32:08 -0700</pubDate>
        <link>http://russbishop.net/string-interpolation</link>
        <title>String Interpolation</title>
        <description></description>
        <content:encoded><![CDATA[<p>Swift 5 added some nice improvements to string interpolation that many people may not be aware of.</p>

<p>The first is the ability to control interpolation into a custom type that adopts <code>ExpressibleByStringInterpolation</code>. This allows you to create types like <code>HTML</code> and drives the new OSLog string formatting (eg <code>log.debug(&quot;value \(x, privacy: .public)&quot;)</code>. Becca Royal-Gordon provided <a href="https://gist.github.com/beccadax/0b46ce25b7da1049e61b4669352094b6">some nice examples</a> of this in the <a href="https://github.com/apple/swift-evolution/blob/main/proposals/0228-fix-expressiblebystringinterpolation.md">SE-0228 proposal</a>.</p>

<p>As a side-effect <code>String</code> and <code>Substring</code> now use <code>DefaultStringInterpolation</code> giving us a convenient extension point to customize interpolation behavior.</p>

<h1 id="defaultstringinterpolation">DefaultStringInterpolation</h1>

<p>As an example let&#39;s say we want to represent file URLs as paths without the <code>file://</code> prefix. We can accomplish this easily:</p>
<div class="highlight"><pre><span></span>extension DefaultStringInterpolation {
    fileprivate mutating func appendInterpolation(_ url: URL) {
        if url.isFileURL {
            appendInterpolation(url.path)
        } else {
            // Careful, passing `url` here creates
            // an eternal loop that smashes the stack
            appendInterpolation(url.description)
        }
    }
}

let u = URL(fileURLWithPath: &quot;/private&quot;, isDirectory: true)
print(&quot;\(u)&quot;) //prints &quot;/private&quot; instead of &quot;file:///private&quot;
</pre></div>
<p>A good practice is to ensure that all paths in your <code>appendInterpolation</code> method ultimately pass a <code>StringProtocol</code> type onward to avoid accidental eternal loops <em>or</em> ensure your first parameter is named so your method is not chosen as a default overload.For framework authors you should consider any public <code>DefaultStringInterpolation</code> extensions very carefully.</p>

<p>For another example assume we&#39;d like to have a convenient way to format integers:</p>
<div class="highlight"><pre><span></span><span class="k">enum</span> <span class="n">IntegerStyle</span> {
    <span class="n">case</span> <span class="n">decimal</span>
    <span class="n">case</span> <span class="n">hexadecimal</span>
    <span class="n">case</span> <span class="n">octal</span>
}

<span class="n">fileprivate</span> <span class="k">enum</span> <span class="n">BinaryIntegerCategory</span> { <span class="n">case</span> <span class="n">signed</span>, <span class="n">unsigned</span> }

<span class="n">fileprivate</span> <span class="n">extension</span> <span class="n">BinaryInteger</span> {
    <span class="n">var</span> <span class="n">interpolationValue:</span> (<span class="n">BinaryIntegerCategory</span>, <span class="n">UInt64</span>) {
        <span class="k">return</span> (<span class="k">self</span> <span class="k">is</span> <span class="nb">any</span> <span class="n">SignedInteger</span>) ? 
            (.<span class="n">signed</span>, <span class="n">UInt64</span>(<span class="n">bitPattern:</span> <span class="n">Int64</span>(<span class="k">self</span>))) : 
            (.<span class="n">unsigned</span>, <span class="n">UInt64</span>(<span class="k">self</span>))
    }
}

<span class="n">extension</span> <span class="n">DefaultStringInterpolation</span> {
    <span class="n">mutating</span> <span class="n">func</span> <span class="n">appendInterpolation</span><span class="s">&lt;Value: BinaryInteger&gt;</span>(
        <span class="n">_</span> <span class="n">value:</span> <span class="n">Value</span>, 
        <span class="n">style:</span> <span class="n">IntegerStyle</span>
    ) {
        <span class="k">let</span> (<span class="k">category</span>, <span class="nb">value</span>) = <span class="nb">value</span>.<span class="n">interpolationValue</span>
        <span class="n">switch</span> <span class="n">style</span> {
            <span class="n">case</span> .<span class="n">decimal</span> <span class="k">where</span> <span class="k">category</span> == .<span class="n">signed:</span>
                <span class="n">appendInterpolation</span>(<span class="n">String</span>(<span class="n">format:</span> <span class="s">&quot;%lld&quot;</span>, <span class="nb">value</span>))
            <span class="n">case</span> .<span class="n">decimal:</span>
                <span class="n">appendInterpolation</span>(<span class="n">String</span>(<span class="n">format:</span> <span class="s">&quot;%llu&quot;</span>, <span class="nb">value</span>))
            <span class="n">case</span> .<span class="n">hexadecimal:</span>
                <span class="n">appendInterpolation</span>(<span class="n">String</span>(<span class="n">format:</span> <span class="s">&quot;0x%llx&quot;</span>, <span class="nb">value</span>))
            <span class="n">case</span> .<span class="n">octal:</span>
                <span class="n">appendInterpolation</span>(<span class="n">String</span>(<span class="n">format:</span> <span class="s">&quot;0o%llo&quot;</span>, <span class="nb">value</span>))
        }
    }
}
</pre></div>
<p>Values are promoted to 64-bit so our value is a <code>CVarArg</code> and we only need one size prefix in our format string. Signed decimal is the only special case but we only need to use the correct format character. All integer values are promoted to 64-bit when passed as varargs anyway and the underlying <code>printf</code> library will interpret those 64-bits entirely based on the <em>argument length modifier</em> and <em>conversion specifier</em>.</p>

<p>This example could be further extended to support floats, alignment, minimum widths, and various other features of printf-style formatting.</p>
]]></content:encoded>
      </item>
  </channel>
</rss>