<?xml version="1.0" encoding="UTF-8"?><rss 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" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[famularo.org]]></title><description><![CDATA[Medium-depth thoughts on software development, technology, and life]]></description><link>https://famularo.org/</link><image><url>https://famularo.org/favicon.png</url><title>famularo.org</title><link>https://famularo.org/</link></image><generator>Ghost 6.44</generator><lastBuildDate>Thu, 11 Jun 2026 11:19:14 GMT</lastBuildDate><atom:link href="https://famularo.org/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[2025 personal technology recap]]></title><description><![CDATA[<p>This post started out as an update on what software I&apos;m self-hosting. It&apos;s turned into a general year-end recap about notable technology I&apos;ve used or acquired. Let&apos;s jump in!</p>
<h2 id="computing-and-networking">Computing and networking</h2>
<h3 id="homelab-laptop">Homelab + laptop</h3>
<p>My little GEEKOM MiniAir 11 is still chugging</p>]]></description><link>https://famularo.org/2025-personal-technology-recap/</link><guid isPermaLink="false">6965a53cf0f16b0001502c28</guid><category><![CDATA[Self-Hosting]]></category><category><![CDATA[Recap]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Tue, 13 Jan 2026 01:59:32 GMT</pubDate><media:content url="https://famularo.org/content/images/2026/01/Quokka.png" medium="image"/><content:encoded><![CDATA[<img src="https://famularo.org/content/images/2026/01/Quokka.png" alt="2025 personal technology recap"><p>This post started out as an update on what software I&apos;m self-hosting. It&apos;s turned into a general year-end recap about notable technology I&apos;ve used or acquired. Let&apos;s jump in!</p>
<h2 id="computing-and-networking">Computing and networking</h2>
<h3 id="homelab-laptop">Homelab + laptop</h3>
<p>My little GEEKOM MiniAir 11 is still chugging along, serving up this page and <a href="https://famularo.org/a-self-hosting-journey/">a whole lot more</a> . I&apos;m still very enthused by self-hosting and owning my data. So what&apos;s changed on the little guy?</p>
<p>The server has been upgraded to Ubuntu 25.10 (aka Questing Quokka.) I&apos;ve decided to do the biannual update vs. waiting for the long-term release every two years. Mostly as an excuse to fiddle.</p>
<p>So what&apos;s a <a href="https://en.wikipedia.org/wiki/Quokka">quokka</a> exactly? It&apos;s a &quot;small macropod about the size of a domestic cat.&quot; Why is it questing? As a herbivore, it probably &quot;quests&quot; for food regularly. So what quest am I on?</p>
<p>I&apos;m not sure. I&apos;m not thrilled with the direction of Windows and making everything AI-enabled and Copilot this and that. I&apos;ve had a Surface Laptop 7 for 18 months now and I&apos;ve never once pressed the Copilot button. I eventually  disabled it and uninstalled Copilot. I have strong thoughts on AI that I should write down one day&#x2026;</p>
<p>I&apos;ve been impressed by the laptop&apos;s Qualcomm Snapdragon X Elite ARM processor. It&apos;s held up and the battery life is Mac-like. I&apos;ve not run into too many compatibility problems. Most non-game stuff is ARM native these days on Windows. That said, I&apos;m considering Linux for my next laptop. I love to tinker and what better way? The <a href="https://frame.work/">Framework laptops</a> are very appealing.</p>
<p>I also setup Cloudflare in front of my homelab to learn how that works and to hopefully secure it, or at least use the cache and give my poor little machine a break. I am not sure I am succeeding here yet.</p>
<h4 id="latest-software-im-self-hosting">Latest software I&apos;m self-hosting</h4>
<ul>
<li><a href="https://ghost.org/">Ghost</a> - Open source blogging (and newsletter) platform. Hosts this website. Now with <a href="https://famularo.org/finally-federating/">Fediverse</a> power!</li>
<li><a href="https://pi-hole.net/">Pi-Hole</a> - adblocking and DNS management for my home network. Hello <a href="https://pi-hole.net/blog/2025/02/18/introducing-pi-hole-v6/">v6</a>!</li>
<li><a href="https://nginxproxymanager.com/">Nginx Proxy Manager</a> - reverse proxy so my little server machine can host multiple websites.</li>
<li><a href="https://www.home-assistant.io/">Home Assistant</a> - the do-everything home automation system.
<ul>
<li><a href="https://mosquitto.org/">Eclipse Mosquitto</a> - let&apos;s other devices communicate easily with Home Assistant via the MQTT protocol.</li>
<li><a href="https://github.com/FlareSolverr/FlareSolverr">Flaresolvver</a> - A proxy server to bypass some Cloudflare protections so my GasBuddy integration on Home Assistant continues to work (and display on my Stream Deck.)</li>
</ul>
</li>
<li><a href="https://freshrss.org/">FreshRSS</a> - RSS is back baby! This is easily my favorite addition in 2025. I now self-host a Google Reader-esque service I can use in the browser and sync with various apps on my phone. The best part: I can filter feeds and mostly get rid of sponsored and affiliate posts.</li>
<li><a href="https://wallabag.org/">Wallabag</a> - with Pocket dying, I needed somewhere to stash links I meant to read but probably never will. This is the best self-hosted Pocket replacement.</li>
<li><a href="https://github.com/vrtmrz/obsidian-livesync">Obsidian Live Sync</a> (<a href="https://couchdb.apache.org/">Couch DB</a>) - let&apos;s me sync my Obsidian vault between my computers and phone.</li>
<li><a href="https://www.portainer.io/">Portainer</a> - Monitor and maintain Docker containers from a web interface. This came and went, and is currently back, so here it is.</li>
<li><a href="https://github.com/dani-garcia/vaultwarden">Vaultwarden</a> - Open source server compatible with Bitwarden. My passwords are only stored and available on my home network.</li>
<li><a href="https://www.wireguard.com/">Wireguard</a> - VPN server, allowing me to remote into my home network from afar. This may get replaced by Wireguard built into my router. We shall see.</li>
<li><a href="https://github.com/ServerContainers/samba">Samba</a> - network drive server for sharing content within my home.</li>
<li><a href="https://github.com/janeczku/calibre-web">Calibre-Web Automated</a> - web server to manage my <a href="https://calibre-ebook.com/">Calibre</a> library (and accessible remotely from my <a href="https://shop.boox.com/products/palma2pro">BOOX Palma 2 Pro</a>). Switched from <a href="https://github.com/janeczku/calibre-web">Calibre-Web</a> to the Automated fork this year. Why? I don&apos;t recall. I had a reason.</li>
</ul>
<h3 id="internet">Internet</h3>
<p>I got fiber internet at home a few years ago and paid for the half gig (500 Mbps) service via Metronet. T-Mobile recently bought them and dropped the price so 1 Gbps was only a penny more than I was paying for the slower service, so I jumped on that. Then T-Mobile offered a 10 year price guarantee on the 2 Gbps service so I jumped once again. My internet is now faster than my local network. I don&apos;t think that has been the case since I was living in the dorms with a 100 Mbps ethernet card.</p>
<p>I need to upgrade my router and a switch or two. My house is wired with CAT 5e so I should be good. I&apos;ll do that this year and report back.</p>
<h3 id="personal-computing">Personal  Computing</h3>
<p>I got into a bad habit of upgrading my phone each year by trading in the old one. I&apos;ve used Google Pixel phones and their predecessors, the Nexus line. I&apos;m mostly happy with Android, minus all the AI-everything that is being shoved into it.</p>
<p>I was planning on breaking the yearly upgrade cycle and skipping this year but my son wanted my Google Pixel 9 Pro, so I traded in his old phone and got the Pixel 10 Pro. I do plan on holding onto it for 2+ years. That is, if I can resist the siren call of a foldable phone. Mini review: it&apos;s the Pixel 9 Pro but with MagSafe--I mean Pixelsnap.</p>
<p>The phone came with &quot;free&quot; credit at the Google Store, so I picked up a Pixel Watch 4 to replace my Pixel Watch 2. It&apos;s easily the best smartwatch I&apos;ve used. I&apos;ve owned Motorola, Fossil, Pixel Watches before this. Battery life is pretty good!</p>
<p>I got a <a href="https://www.elgato.com/us/en/p/stream-deck-neo">Elgato Stream Deck Neo</a> to replace/supplement my Stream Deck Mini. Mini review: 8 buttons + 2 nav buttons &gt; 6 buttons. Definitely splurge for the Neo over the Mini.</p>
<h2 id="entertainment">Entertainment</h2>
<h3 id="switch-2">Switch 2</h3>
<p>I&apos;m considering a <a href="https://store.steampowered.com/sale/steammachine">Steam Machine</a> in 2026. I love my Steam Deck (although it sits unloved with the Switch 2 out&#x2014;not that I have a ton of time to play games). The Switch 2 feels like a phone upgrade. Clearly better, but not knock-your-socks-off that previous console generations have felt. I had similar feelings about the PS4 Pro to PS5 upgrade.</p>
<h3 id="boox-palma-2-pro">Boox Palma 2 Pro</h3>
<p>I broke my Boox Palma on a flight (pro-tip: don&apos;t put it uncased in the plane seat pocket). I hacked my Kindle for a few weeks (it was fine, not great) and then the <a href="https://shop.boox.com/products/palma2pro">Palma 2 Pro</a> came out and I snagged one. It&apos;s definitely faster but the lower res color screen took some getting used to. Plus it&apos;s not as clear as a black-and-white e-reader. Mini review: save some money and opt for the Palma 2 black-and-white instead.</p>
<h3 id="lego-game-boy">Lego Game Boy</h3>
<p>Technically entertainment, I got the <a href="https://www.lego.com/en-us/product/game-boy-72046">Lego Game Boy</a> for my birthday. It&apos;s so cool.</p>
<h3 id="noise-cancelling-headphones">Noise Cancelling Headphones</h3>
<p>I got a pair of <a href="https://electronics.sony.com/audio/headphones/headband/p/wh1000xm5-b">Sony WH-1000XM5 Premium Wireless Noise Canceling Headphones</a> (woof, what a name). The noise cancellation is good enough for my needs (loud kids or loud 3D printer). I&apos;ve reached the age where your hearing starts to go and it&apos;s been so annoying. These are much better than the desktop mic and speaker combo I was using before. And the Bluetooth actually works well with Windows?! Windows used to be a disaster when it came to BT audio.</p>
<h2 id="3d-printing">3D Printing</h2>
<p>I got into 3D printing in 2024. I started with an Ender 3 and upgraded to a <a href="https://bambulab.com/en-us/p1">Bambu P1S</a> (with AMS) later that year. Since I bought the P1S, I&apos;ve logged 2,300 hours of printing. My wife and I designed and printed trophies for students at her school as rewards for hitting various milestones. The kids love them!</p>
<h2 id="also-notable">Also Notable</h2>
<h3 id="obsidian">Obsidian</h3>
<p>I moved my notes and tasks over to <a href="https://obsidian.md/">Obsidian</a>. I love Markdown and always have lists and with a few key plugins, I&apos;m having a great time. In fact, I am writing this post in Obsidian.  I paid for the Catalyst license. Support software!</p>
<h3 id="kagi">Kagi</h3>
<p>Last but not least, I switch from Google to <a href="https://kagi.com">Kagi</a> as my search engine. As a paid search engine, you don&apos;t have to deal with the ads or AI jumping in your face (unless you want it). Mini-review: is paying for search worth it? I&apos;ve been happier and feel like I can find things faster than Google. Others say &quot;it&apos;s like Google used to be&quot; and that&apos;s so true. I also love the ability to downrank certain sites so they don&apos;t appear (or appear less.)</p>
<h2 id="wrap-up">Wrap-up</h2>
<p>Wow, that was a lot. It was a good year tech-wise and fun to write. I&apos;ll try to keep better notes this year so the 2026 edition is easier to write.</p>
<p>Have a great 2026!</p>
]]></content:encoded></item><item><title><![CDATA[Finally federating]]></title><description><![CDATA[<p>I&apos;m tired of services I use disappearing, so I ultimately decided to self-host this blog with <a href="https://ghost.org/">Ghost</a>.  One of the new features in <a href="https://ghost.org/changelog/6/">version 6</a> is the ability to federate the content of this blog via <a href="https://en.wikipedia.org/wiki/ActivityPub">ActivityPub</a>.</p>
<p>In short, you can read this blog three different ways:</p>
<ol>
<li>Via</li></ol>]]></description><link>https://famularo.org/finally-federating/</link><guid isPermaLink="false">68c574f73d13d2000121069e</guid><category><![CDATA[Self-Hosting]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Sat, 13 Sep 2025 13:54:29 GMT</pubDate><content:encoded><![CDATA[<p>I&apos;m tired of services I use disappearing, so I ultimately decided to self-host this blog with <a href="https://ghost.org/">Ghost</a>.  One of the new features in <a href="https://ghost.org/changelog/6/">version 6</a> is the ability to federate the content of this blog via <a href="https://en.wikipedia.org/wiki/ActivityPub">ActivityPub</a>.</p>
<p>In short, you can read this blog three different ways:</p>
<ol>
<li>Via a web browser @ <a href="https://famularo.org/">https://famularo.org</a></li>
<li>Via <a href="https://en.wikipedia.org/wiki/RSS">RSS</a> in the reader of your choice @ <a href="https://famularo.org/rss/">https://famularo.org/rss/</a></li>
<li>Via social web client of your choice
<ul>
<li>ActivityPub (Mastodon, many others): @blog@famularo.org</li>
<li>Bluesky: @blog.famularo.org.ap.brid.gy</li>
</ul>
</li>
</ol>
<p>Will this cause me to post more stuff? Probably not &#x1F605;</p>
]]></content:encoded></item><item><title><![CDATA[A self-hosting journey]]></title><description><![CDATA[<h2 id="christmas-pi">Christmas Pi</h2><p>For Christmas of 2021, my wife gifted me a <a href="https://www.raspberrypi.com/" rel="noreferrer">Raspberry Pi</a> 4. At first, I didn&apos;t know what I wanted to use it for. Initially I made it an <a href="https://retropie.org.uk/" rel="noreferrer">emulation machine</a>, but eventually tried out <a href="https://pi-hole.net/" rel="noreferrer">Pi-hole</a>. I&apos;ve always dabbled in running small Linux servers</p>]]></description><link>https://famularo.org/a-self-hosting-journey/</link><guid isPermaLink="false">66d52a775893490001958d67</guid><category><![CDATA[Blogging]]></category><category><![CDATA[Self-Hosting]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Sat, 07 Sep 2024 17:54:47 GMT</pubDate><media:content url="https://famularo.org/content/images/2024/09/PXL_20240907_174650718.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="christmas-pi">Christmas Pi</h2><img src="https://famularo.org/content/images/2024/09/PXL_20240907_174650718.jpg" alt="A self-hosting journey"><p>For Christmas of 2021, my wife gifted me a <a href="https://www.raspberrypi.com/" rel="noreferrer">Raspberry Pi</a> 4. At first, I didn&apos;t know what I wanted to use it for. Initially I made it an <a href="https://retropie.org.uk/" rel="noreferrer">emulation machine</a>, but eventually tried out <a href="https://pi-hole.net/" rel="noreferrer">Pi-hole</a>. I&apos;ve always dabbled in running small Linux servers at home, but this time was different&#x2014;I was hooked on self-hosting. The key ingredient was containerization via <a href="https://www.docker.com/" rel="noreferrer">Docker</a>. </p><h2 id="docker">Docker</h2><p>The ability to spin up and try out new systems without going through extensive configuration (and misconfiguration) directly on the host OS proved crucial on my journey. <a href="https://docs.docker.com/compose/" rel="noreferrer">Docker Compose</a> allows for defining your containers in a <a href="https://yaml.org/" rel="noreferrer">YAML files</a> that you can save, commit to version control, or use to build complex multi-container systems. It&apos;s a lot easier and more repeatable than trying to remember the docker command line syntax. Or what you did to set up your server and where all the configuration for the servers it hosts are kept.</p><h2 id="self-hosting">Self-hosting</h2><p>Once I had Docker and my machine running, I tried out all sorts of containers, most notably <a href="https://www.home-assistant.io/" rel="noreferrer">Home Assistant</a>. After a few years, I outgrew my Raspberry Pi and upgraded to a GEEKOM MiniAir 11, running an Intel Celeron N5095 with 8GB RAM. It&apos;s nothing fancy, but about four times more powerful than the Raspberry Pi 4. I installed <a href="https://ubuntu.com/server" rel="noreferrer">Ubuntu Server</a> on it and restored all my Docker containers and their data (definitions were saved in YAML and easy to restore via source control) and it was off and running.</p><p>Today, I&apos;m running a handful of containers. Here&apos;s what&apos;s currently running on the little server:</p><ul><li><a href="https://pi-hole.net/" rel="noreferrer">Pi-Hole</a> - adblocking and DNS management for my home network.</li><li><a href="https://nginxproxymanager.com/" rel="noreferrer">Nginx Proxy Manager</a> - reverse proxy so my little server machine can host multiple websites.</li><li><a href="https://www.home-assistant.io/" rel="noreferrer">Home Assistant</a> - the do-everything home automation system.</li><li><a href="https://mosquitto.org/" rel="noreferrer">Eclipse Mosquitto</a> - let&apos;s other devices communicate easily with Home Assistant via the MQTT protocol.</li><li><a href="https://github.com/mrlt8/docker-wyze-bridge" rel="noreferrer">Wyze Bridge</a> - exposes my Wyze cameras to Home Assistant.</li><li><a href="https://www.portainer.io/" rel="noreferrer">Portainer</a> - Monitor and maintain Docker containers from a web interface.</li><li><a href="https://github.com/dani-garcia/vaultwarden" rel="noreferrer">Vaultwarden</a> - Open source server compatible with Bitwarden. My passwords are only stored and available on my home network.</li><li><a href="https://www.wireguard.com/" rel="noreferrer">Wireguard</a> - VPN server, allowing me to remote into my home network from afar.</li><li><a href="https://github.com/ServerContainers/samba" rel="noreferrer">Samba</a> - network drive server for sharing content within my home.</li><li><a href="https://github.com/janeczku/calibre-web" rel="noreferrer">calibre-web</a> - web server to manage my <a href="https://calibre-ebook.com/" rel="noreferrer">Calibre</a> library (and accessible remotely from my <a href="https://shop.boox.com/products/palma" rel="noreferrer">BOOX Palma</a>!)</li><li><a href="https://hub.docker.com/_/registry" rel="noreferrer">Registry</a> - Docker container host, as I sometimes host small containers for personal and work projects.</li><li><a href="https://hub.docker.com/r/itzg/minecraft-server" rel="noreferrer">Minecraft Server</a> - not running all the time, but let&apos;s the kids play Minecraft with each other and friends. We found a great mod that really reduces the burden on the server.</li><li><a href="https://ghost.org/" rel="noreferrer">Ghost</a> - Open source blogging (and newsletter) platform. Hosts this website &#x1F604;</li></ul><h2 id="ghost">Ghost</h2><p><a href="https://ghost.org/" rel="noreferrer">Ghost</a> is a newer blogging and newsletter platform. Over the years, I&apos;ve hosted famularo.org and my blog on everything from shared hosting, hosted virtual machines, WordPress, tumblr, svbtle, Azure websites, GitHub pages, and finally, self-hosted at home with Ghost. That&apos;s a lot! I may just like setting things up.</p><p>So why Ghost? First, it was easy to set up and configure. While I love building websites, I don&apos;t need to friction if I&apos;m going to pretend to keep up on blogging. Plus, it&apos;s more professional looking and feeling than what I could make.</p><h2 id="fediverse">Fediverse</h2><p>During this self-hosting journey, Twitter got bought, became X, and I decided I needed a new home. <a href="https://mastodon.social/" rel="noreferrer">Mastodon</a> and the <a href="https://en.wikipedia.org/wiki/Fediverse" rel="noreferrer">fediverse</a> seemed like the natural fit for someone technically minded like me. I <a href="https://mastodon.social/@jfam" rel="noreferrer">created my account</a>, lurked as I always do, and slowly learned what the &quot;fediverse&quot; offered: a way to tie content together and not be under one server/company/owner and their whims.</p><p>I messed with <a href="https://github.com/dahlia/hollo" rel="noreferrer">Hollo </a>a bit and it was close to what I wanted: a self-hostable way to own my content and federate it back to the fediverse. I don&apos;t write many micro-posts, so feeding a blog post into it seemed a little much. Plus, its web component is not the project&apos;s primary focus. So, I settled on Ghost and the <a href="https://activitypub.ghost.org/" rel="noreferrer">promise of fediverse support</a>. Even if it doesn&apos;t come to fruition, I&apos;m happy with what Ghost offers.</p><h2 id="final-thoughts">Final Thoughts</h2><p>If you&apos;re reading this, congratulations, you found my blog! This page came to you from that tiny computer sitting in my office, next to the printer. I had a lot of fun setting it up and maintaining it over the years. One day I will probably buy a bigger server or get a second one as my needs and desires grow. I&apos;ll eventually get bored and redo all this again. But playing around, learning new things, and getting it set up is the fun part and why stop learning and having fun?</p><p></p>]]></content:encoded></item><item><title><![CDATA[Different Oh My Posh color scheme per day]]></title><description><![CDATA[<h2 id="briefly-what-is-oh-my-posh">Briefly: what is Oh My Posh</h2>
<p><a href="https://ohmyposh.dev/">Oh My Posh</a> describes itself as &quot;a prompt theme engine for any shell.&quot; Basically, your prompt, or the line that shows up in your terminal/console/shell/etc that you type commands into, is very customizable. Instead of just showing your current</p>]]></description><link>https://famularo.org/different-oh-my-posh-color-scheme-per-day/</link><guid isPermaLink="false">66d3b0cc108fed0001bdfb09</guid><category><![CDATA[Oh My Posh]]></category><category><![CDATA[Terminal]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Tue, 31 Jan 2023 05:00:00 GMT</pubDate><media:content url="https://famularo.org/content/images/2024/09/ubuntu-color-schemes-1.png" medium="image"/><content:encoded><![CDATA[<h2 id="briefly-what-is-oh-my-posh">Briefly: what is Oh My Posh</h2>
<img src="https://famularo.org/content/images/2024/09/ubuntu-color-schemes-1.png" alt="Different Oh My Posh color scheme per day"><p><a href="https://ohmyposh.dev/">Oh My Posh</a> describes itself as &quot;a prompt theme engine for any shell.&quot; Basically, your prompt, or the line that shows up in your terminal/console/shell/etc that you type commands into, is very customizable. Instead of just showing your current path, or maybe your username and path, you can leverage Oh My Posh (and many other engines like it) to make things both colorful and informative.</p>
<p>I&apos;ve chosen Oh My Posh over others because of its flexibility, features and it gives me a consistent prompt on Windows, Mac, and Linux.</p>
<h2 id="themes">Themes!</h2>
<p>Oh My Posh has <a href="https://ohmyposh.dev/docs/themes">many themes</a> showcasing a variety of  colors and <a href="https://ohmyposh.dev/docs/segments/path">segments</a> (the parts of your prompt, such as path, git status, battery level, and so forth).</p>
<p>I personally started by copying the <a href="https://github.com/JanDeDobbeleer/oh-my-posh/blob/main/themes/paradox.omp.json">Paradox theme</a> and customizing it. Recently, I decided to re-color my theme based on the Highway color scheme on the <a href="https://gogh-co.github.io/Gogh/">Gogh website</a>. Gogh has many great color schemes and I kept experimenting and thought: what if I used multiple colors schemes and rotated per day...</p>
<h2 id="different-color-scheme-per-day-or-hourminutesecond">Different color scheme per day (or hour/minute/second)</h2>
<p>Using the <a href="https://ohmyposh.dev/docs/configuration/templates">Go templates</a> within Oh My Posh themes, we can have a bit of logic and <a href="https://ohmyposh.dev/docs/configuration/colors#palettes">choose a color palette dynamically</a>.</p>
<p>Here&apos;s the logic related to palettes that choose a different palette each day. I&apos;ve included 6 that rotate.</p>
<pre><code class="language-javascript">{
 &quot;palettes&quot;: {
    &quot;template&quot;: &quot;{{ $factor := mod (now.YearDay | int) 6 }}{{ if eq $factor 0 }}theme1{{ else if eq $factor 1 }}theme2{{ else if eq $factor 2 }}theme3{{ else if eq $factor 3 }}theme4{{ else if eq $factor 4 }}theme5{{else}}theme6{{ end }}&quot;,
    &quot;list&quot;: {
      &quot;theme1&quot;: {},
      &quot;theme2&quot;: {},
      &quot;theme3&quot;: {},
      &quot;theme4&quot;: {},
      &quot;theme5&quot;: {},
      &quot;theme6&quot;: {}
    }
  }
}
</code></pre>
<p>Throughout the day, your prompt will now change like this:</p>
<p><img src="https://famularo.org/content/images/2024/09/windows-color-schemes.png" alt="Different Oh My Posh color scheme per day" loading="lazy"></p>
<p>Or if Linux is your thing:</p>
<p><img src="https://famularo.org/content/images/2024/09/ubuntu-color-schemes.png" alt="Different Oh My Posh color scheme per day" loading="lazy"></p>
<p>(Note: the background color is set in my terminal. I don&apos;t believe you can control that directly in Oh My Posh)</p>
<p>The trick is to use <a href="https://ohmyposh.dev/docs/configuration/colors#palette">palette references</a>, which will let you style changes the bare the colors in one place and have them show up throughout the theme. Check out the source to my theme in the last section.</p>
<h2 id="blast-mode">Blast mode</h2>
<p>Every day not often enough for you? Change <code>now.YearDay</code> to <code>now.Hour</code>, or for the impatient <code>now.Minute</code> (or even <code>now.Second</code>).</p>
<p>Example:</p>
<pre><code class="language-javascript">&quot;template&quot;: &quot;{{ $factor := mod (now.Minute | int) 6 }}{{ if eq $factor 0 }}theme1{{ else if eq $factor 1 }}theme2{{ else if eq $factor 2 }}theme3{{ else if eq $factor 3 }}theme4{{ else if eq $factor 4 }}theme5{{else}}theme6{{ end }}&quot;
</code></pre>
<h2 id="its-5-oclock-somewhere">It&apos;s 5 o&apos;clock somewhere</h2>
<p>Perhaps you want something a little something to remind you it&apos;s after 5pm and problably time to wrap up your day. Here&apos;s the logic to change your prompt after 5pm.</p>
<pre><code class="language-javascript">&quot;template&quot;: &quot;{{ if gt (now.Hour | int) 17 }}day_theme{{ else }}night_theme{{ end }}&quot;
</code></pre>
<h2 id="my-theme">My theme</h2>
<p>My full theme can be found as a <a href="https://gist.github.com/Fammy/cfc685f7cbd3dabfb0d41ca7729ea530">gist on GitHub</a> and is embedded below. The palette logic is at the bottom.</p>
<p>If you have any questions, feel free to reach out to me.</p>
<script src="https://gist.github.com/Fammy/cfc685f7cbd3dabfb0d41ca7729ea530.js"></script>]]></content:encoded></item><item><title><![CDATA[Get your jam on]]></title><description><![CDATA[<h2 id="jam-time">Jam time</h2>
<p>Every year GitHub sponsors a <a href="https://en.wikipedia.org/wiki/Game_jam">game jam</a> during the month of November: <a href="https://github.blog/2022-11-01-game-off-2022-theme-announcement/">GitHub Game Off</a>. I&apos;ve dabbled with making games my whole life and I&apos;ve found excuses to not to participate in the jam in previous years.</p>
<p>I made a commitment to myself to</p>]]></description><link>https://famularo.org/get-your-jam-on/</link><guid isPermaLink="false">66d3b7d3108fed0001bdfb4e</guid><category><![CDATA[Game Development]]></category><category><![CDATA[Pico-8]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Mon, 21 Nov 2022 05:00:00 GMT</pubDate><media:content url="https://famularo.org/content/images/2024/09/death-and-taxes-1.png" medium="image"/><content:encoded><![CDATA[<h2 id="jam-time">Jam time</h2>
<img src="https://famularo.org/content/images/2024/09/death-and-taxes-1.png" alt="Get your jam on"><p>Every year GitHub sponsors a <a href="https://en.wikipedia.org/wiki/Game_jam">game jam</a> during the month of November: <a href="https://github.blog/2022-11-01-game-off-2022-theme-announcement/">GitHub Game Off</a>. I&apos;ve dabbled with making games my whole life and I&apos;ve found excuses to not to participate in the jam in previous years.</p>
<p>I made a commitment to myself to start <em>and finish</em> and I did so, in about 2 weeks (I realized that traveling and visiting family for Thanksgiving was going to not leave me with much time the second half of the month).</p>
<h2 id="the-tech">The tech</h2>
<p>From past experience, I knew that making a game from scratch would be difficult in a short time period (anyone who does a game jam in a weekend is a wizard). I took at peek at <a href="https://godotengine.org/">Godot</a>, but I quickly realized that I&apos;d spend a lot more time learning the tool than I wanted too.</p>
<p>I spied <a href="https://www.lexaloffle.com/pico-8.php">Pico-8</a> on the list of suggested tools. I&apos;d messed with it some in the past and it&apos;s really straight forward. I had a small sprite up and running (well, gliding) after a few minutes and it all started to click. The tool had been chosen. Now time to make a game.</p>
<h2 id="theme">Theme</h2>
<p>Each year the game jam has a theme. This year the theme is &quot;clich&#xE9;&quot;. I scanned the list of clich&#xE9;s&#x2014;over 4000&#x2014;for inspiration and settled on &quot;the only thing certain in life is death and taxes&quot; as my theme. I wasn&apos;t sure yet what type of game I was going to make.</p>
<p>I converted my sprite into a horrible looking accountant and had him gliding across the screen. I made a gold coin&#x2014;because 8x8 sprites only let you have so much detail&#x2014;and had it chase my accountant and an idea was born.</p>
<h2 id="surviving">Surviving</h2>
<p>I&apos;ve played a lot of <a href="https://poncle.itch.io/vampire-survivors">Vampire Survivors</a> lately (check out the <a href="https://store.steampowered.com/app/1794680/Vampire_Survivors/">Steam</a> version) and it&apos;s a really simple concept: you are a character who shoots their weapons automatically. You slowly grow more powerful over time, which is good because thousands of enemies are seeking you out. The game is also weird, pure fun, and totally awesome.</p>
<p>I titled my game &quot;Death and Taxes: Survivor&quot;. I made a skull enemy to go with my coin (death and taxes, respectively). I gave the accountant 3 health hearts and the ability to shoot and I had something that was playable.</p>
<h2 id="iterating">Iterating</h2>
<p>To make my seed of a game into something more, I played with things, logic and did a lot of googling. The Pico-8 community has a lot of resources and had answers to all my beginning questions.</p>
<p>I improved my accountant sprite, added two more enemy types, music, and sound effects. I made a simple title screen, and little intros before each act. I even wrote a little backstory.</p>
<p>I had the basic game up and running after a few days and spent a week adding polish. That&apos;s the part of any game project that can take forever, so I made it &quot;good enough&quot; and let it be.</p>
<h2 id="play-now">Play now!</h2>
<p>While I could have worked on this little game forever, I knew I mentally needed the win of releasing. I think it&apos;s entertaining for a few games at least.</p>
<p>Head on over to <a href="https://fammy.itch.io/death-and-taxes-survivors">itch.io</a> and play now in the browser. If you want to see the source, that&apos;s on <a href="https://github.com/Fammy/death-and-taxes">GitHub</a>.</p>
<p><img src="https://famularo.org/content/images/2024/09/taxgrunt.png" alt="Get your jam on" loading="lazy"></p>
]]></content:encoded></item><item><title><![CDATA[About this mess (2022)]]></title><description><![CDATA[<h2 id="here-we-go-again">Here we go again</h2>
<p>Every so many years I look at my blog or <a href="https://famularo.org/">personal website</a> and get that urge to tinker with it and try something new. And that time was recently, as I&apos;ve moved my blog from <a href="https://svbtle.com">Svbtle</a> to <a href="https://jekyllrb.com/">Jekyll</a> hosted on <a href="https://pages.github.com/">GitHub Pages</a>. It all</p>]]></description><link>https://famularo.org/about-this-mess/</link><guid isPermaLink="false">66d3bce8108fed0001bdfb6d</guid><category><![CDATA[Blogging]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Thu, 17 Nov 2022 05:00:00 GMT</pubDate><content:encoded><![CDATA[<h2 id="here-we-go-again">Here we go again</h2>
<p>Every so many years I look at my blog or <a href="https://famularo.org/">personal website</a> and get that urge to tinker with it and try something new. And that time was recently, as I&apos;ve moved my blog from <a href="https://svbtle.com">Svbtle</a> to <a href="https://jekyllrb.com/">Jekyll</a> hosted on <a href="https://pages.github.com/">GitHub Pages</a>. It all started when I tried to update Svbtle to use the newer Google Analytics setup, but found it was not supported. From that problem, I got <a href="https://www.youtube.com/watch?v=B-_oeTTQIH4">squirreled</a> and ended up moving to a new blog host.</p>
<h2 id="why-jekyll">Why Jekyll?</h2>
<p>Jekyll may not be the hot new thing, and as I get older&#x2014;I mean more experienced&#x2014;I realize that the latest thing isn&apos;t always best in the long term. Instead of basing things on a technology, I&apos;m basing them on a format: <a href="https://en.wikipedia.org/wiki/Markdown">Markdown</a>.</p>
<p>Svbtle already used Markdown, so that part was (mostly) painless. I did end up using <a href="https://github.com/bwhaley/svbtle-jekyll">svbtle-jekyll</a>, a small Python tool that extracts Svbtle posts and puts them in Jeykll format (from what I can tell is <a href="https://kramdown.gettalong.org/">kramdown</a> + a header). svbtle-jekyll required a few tweaks to get it to read the HTML correctly (it is 7 years old&#x2014;it almost worked out-of-the-box!)</p>
<p>Now that my blog posts are in Markdown and stored in a <a href="http://github.com/Fammy/blog">git repo I own</a>, it should be easy to move them elsewhere if&#x2014;and when&#x2014;I decide to move to a new platform.</p>
<p>Jekyll also made it easy to keep the same URLs for my posts so I don&apos;t have to mess with <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/301">HTTP 301</a> redirects.</p>
<h2 id="theming">Theming</h2>
<p>In looking for Jekyll themes, I quickly found <a href="https://github.com/mmistakes/minimal-mistakes">Minimal Mistakes</a>, which is a very popular&#x2014;if not most popular&#x2014;theme for Jekyll. Once I made it through setup and dependencies, I was off and running. So now I am running on a static website that is free to host and doesn&apos;t look half bad.</p>
<h2 id="whats-next">What&apos;s next?</h2>
<p>Am I going to (re)commit to blogging more? No, but I&apos;ll try. At a minimum something new will come along in a few years and I may be tempted to switch to that. &#x1F609;</p>
]]></content:encoded></item><item><title><![CDATA[Why developers don't explain every last bug fix in release notes]]></title><description><![CDATA[<p>I&apos;ve seen a lot of frustration by smartphone users when app release notes are vague about what&apos;s actually being updated. We&apos;ve all seen the dreaded &quot;bug fixes and performance enhancements&quot;. We fall in love with our apps, love to see updates, but</p>]]></description><link>https://famularo.org/why-developers-dont-explain-every-last-bug-fix-in-release-notes/</link><guid isPermaLink="false">66d3bd40108fed0001bdfb79</guid><category><![CDATA[Software Development]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Wed, 28 Oct 2015 04:00:00 GMT</pubDate><content:encoded><![CDATA[<p>I&apos;ve seen a lot of frustration by smartphone users when app release notes are vague about what&apos;s actually being updated. We&apos;ve all seen the dreaded &quot;bug fixes and performance enhancements&quot;. We fall in love with our apps, love to see updates, but developers aren&apos;t spending the time to explain every last nuanced update. What&apos;s up with that? Power users thrive on this information. So why don&apos;t developers detail the entire set of changes?</p>
<p>As a power user, I feel this frustration too. I really do want to know what is being updated. There may be a particular annoying bug that I&apos;m waiting to get fixed. Maybe it&apos;s a new feature that I might not know about otherwise. But as a developer, I have a second set of concerns that sometimes conflicts with what users want. So here&apos;s why developers don&apos;t (always) explain every last bug fix in release notes:</p>
<h2 id="time">Time</h2>
<p>Often, release notes are an afterthought, something that&apos;s done quickly as an app approaches release. Developers, or someone on the team, is given the assignment to write release notes. The team wants to see what updates in the store just as much as you do, and equally as soon. Release notes are an (important) task that gets ignored until it has to be done. And when time is short, shortcuts get taken.</p>
<h2 id="embarrassment">Embarrassment</h2>
<p>No software is perfect. No app is bug free. Developers are not coding ninjas (regardless of what recruiters think). The developer may feel that certain bugs reflect poorly on their skills. Writing quality software is difficult, and everyone makes mistakes. Sometimes those mistakes are extremely dumb and best swept under the rug, right?</p>
<h2 id="security">Security</h2>
<p>Some fixes are security related. It&apos;s not always wise to announce all the security problems your app had. Users may not update, and installing old versions of apps is not hard. If you announce your security problems, you potentially make it easier to exploit the app.</p>
<p>I&apos;m not saying this is the correct way to handle security issues. I&apos;m saying this way of thinking easily enters your mind. No one wants their app to be &quot;hacked&quot; or exploited.</p>
<h2 id="limited-space">Limited space</h2>
<p>Did you know that Google only allows for 500 characters in the release notes field? That&apos;s stupid short. And it&apos;s also not enough to list all the bug fixes that occur in a single app release. More important features will get the majority of the space in the release notes and bug fixes get lumped together, if mentioned at all.</p>
<p>Apple is more generous and gives 4000 characters. That&apos;s almost enough space to write four <a href="http://js1k.com/2014-dragons/demos">JavaScript demos</a>.</p>
<h2 id="laziness">Laziness</h2>
<p>Stop me if you&apos;ve heard this before: developers are lazy. We work hard at being lazy. It&apos;s an overused trope, but has some truth. The last thing a developer wants to do is write release notes. Most of us like writing software. When preparing a set of release notes, it can be very time consuming to review every last issue that was fixed. It&apos;s just easier to say &quot;yo, we fixed some bugs&quot; and actually go and fix some more bugs.</p>
<h2 id="the-middle-ground">The middle ground</h2>
<p>I&apos;m not saying I agree with all the reasons above. I think there is a middle ground. Something between the spartan &quot;bug fixes and performance enhancements&quot; and a full copy of the commit log.</p>
<p>My personal strategy is to put the following in the release notes.</p>
<ul>
<li>New features</li>
<li>Major enhancements and changes</li>
<li>Significant bug fixes, especially if users have been reporting the issue</li>
</ul>
<p>Users, I understand your frustration. I want to see good release notes. Hopefully it gets better. Especially frustrating are especially terse notes:</p>
<pre><code>Bug fixes
</code></pre>
<p>(Google, I&apos;m looking at you again &#xCA0;_&#xCA0;)</p>
]]></content:encoded></item><item><title><![CDATA[The customer may not always be right, but they're still our customer]]></title><description><![CDATA[<p>One summer in high school, I had a mandate from my parents to get a job. If I was going to work thirty-plus hours a week, I wanted more than minimum wage. Growing up in Orlando, Disney World was an attractive place for teenagers to work during the summer. They</p>]]></description><link>https://famularo.org/the-customer-may-not-always-be-right-but-theyre-still-our-customer/</link><guid isPermaLink="false">66d3be41108fed0001bdfb86</guid><category><![CDATA[Software Development]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Mon, 02 Mar 2015 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p>One summer in high school, I had a mandate from my parents to get a job. If I was going to work thirty-plus hours a week, I wanted more than minimum wage. Growing up in Orlando, Disney World was an attractive place for teenagers to work during the summer. They paid a whole $1.10 over minimum wage ($4.25 at the time, for a whopping $5.35).</p>
<p>In the end, my illustrious career working for The Mouse didn&apos;t last long. I quit after four days (that&apos;s a story for another time). But during that time I learned two valuable lessons:</p>
<ol>
<li>Some days your boss is The Mouse, some days your boss is &quot;The Rat&quot;. (I had The Rat unfortunately).</li>
<li>The customer may not always be right, but they&apos;re still our customer.</li>
</ol>
<h2 id="software-customers">Software customers</h2>
<p>Working in software development, there is always a customer. Sometimes it is an actual paying customer, other times it&apos;s another department within the company. Both types of customers, while different in many aspects, share one commonality: they don&apos;t do software development full time. At best, the customer has utilized your services in the past, and understands the process. At worst, they&apos;ve never interacted with software development before and have movie-link expectations.</p>
<p>I&apos;ve often found that the customer thinks they know what the want. As a consultant, customers would come to my company and ask us to create a solution to help them solve a problem. They have nebulous needs such as &quot;we need a website to accept applications&quot; and &quot;we need an app to reconcile our accounts payable and receivable&quot;. The solutions to these problems can vary greatly, depending on what is truly needed.</p>
<h2 id="the-true-need">The true need</h2>
<p>And that&apos;s the hard part. Finding out the true need from the customer. The customer has spent some time thinking about what they need, and has an idea of how that might come to fruition. &quot;Build a website, something something yada yada, applications processed&quot;. As software developers (and business analysts, QA engineers, project managers, and so on), we&apos;ve been on this ride before. We know what&apos;s coming. It&apos;s the eternal battle of expectations versus a true understanding of what&apos;s needed. It&apos;s usually a trying journey. The customer is likely wrong, and it&apos;s our job to make things right.</p>
<h2 id="saying-no">Saying no</h2>
<p>So, in the name of quality software, we tell our customers &quot;no&quot;. We explain to them why they&apos;re wrong, or slightly off-path. We put them on a better path. Sometimes we do it without even telling them. &quot;They&apos;ll thank us later&quot;, we tell ourselves. We&apos;ve taken some moral high ground that allows us to do the opposite of what the customer wants &#x2014; I mean &#x2014; thinks they want.</p>
<h2 id="two-endings">Two endings</h2>
<p>This usually ends one of two ways (and depends on how you treat the customer). In the happy ending, we&apos;ve helped the customer to see why their original plan wasn&apos;t quite right, assisted them in coming up with a better solution. One that both parties have worked together to achieve. The customer has been a part of the process. They have learned. They&apos;re thankful. They&apos;ll enlist the magic of software development again, and have an even better experience the next time.</p>
<p>Or they won&apos;t get what they want. They&apos;ll be told they&apos;re wrong constantly along the way. They&apos;ll go along with (almost) anything you say, believing that you, as the expert, know how to sail the confusing ship that is software development. In the end, they&apos;ll have a solution that, according to the new direction you&apos;ve set the project on, works as agreed. And they&apos;ll be confused, bitter, but contractually satisfied.</p>
<h2 id="becoming-the-rat">Becoming &quot;The Rat&quot;</h2>
<p>So how did you become &quot;The Rat&quot;? How did the journey to this perfect solution end horribly? Why didn&apos;t you see this before?</p>
<p>I don&apos;t know if there are any easy answers to how to fix this problem. You&apos;ve taken the relationship between you and your client for granted. They gave you trust, as the expert, and you used that trust to steer them away from what they needed. Or perhaps to you did deliver what they needed, but through some of the most treacherous waters they&apos;ll ever travel.</p>
<p>The best advice is to take preventative action. To see the situation before it happens, and to fix you (and not the customer). This is hard advice to follow until you&apos;ve made the mistake. But there are warning signs. If you are resenting you customer at any point, especially the beginning, you&apos;ve probably set yourself up to be The Rat.</p>
<p>Communicate regularly. Let the customer know what you&apos;re thinking, why you&apos;re thinking it, and what you&apos;ve seen happen in similar situations. Help them to discover the answer. Getting the answers for free deprives the customer an opportunity to learn and grow. As tempting &quot;just trust me, we need to do it this way&quot; is, that confines the result to some mystery the customer can&apos;t explain.</p>
<p>You won&apos;t be able to be The Mouse every day, with every client. But put yourself in their shoes. Try to understand how they feel and what the gaps in their understanding are. Build the bridge with them, not for them.</p>
]]></content:encoded></item><item><title><![CDATA[Errors of omission]]></title><description><![CDATA[<p>I&apos;ve long maintained that the hardest errors to find in a software application are those of omission. Omissions can be many things, but ultimately are missing data that was not noticed or changes in functionality that did not occur. Depending on your application, missing data or functionality can</p>]]></description><link>https://famularo.org/errors-of-omission/</link><guid isPermaLink="false">66d3cc9e108fed0001bdfbf8</guid><category><![CDATA[Software Development]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Sat, 17 Jan 2015 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p>I&apos;ve long maintained that the hardest errors to find in a software application are those of omission. Omissions can be many things, but ultimately are missing data that was not noticed or changes in functionality that did not occur. Depending on your application, missing data or functionality can be annoying, costly, or worse.</p>
<h2 id="if-it-doesnt-happen-its-not-an-error-right">If it doesn&apos;t happen, it&apos;s not an error, right?</h2>
<p>When determining how to test an application, you often test based on what you expect the application to do. It&apos;s a very reasonable approach, right? Given some input A, expect result B. You&apos;re happy and move on. But what about C? It doesn&apos;t always occur &#x2014; should it have occurred when B occurred? How can you be sure? In fact, there are probably conditions when C should not occur. This just got complicated.</p>
<h2 id="how-do-you-find-something-thats-not-there">How do you find something that&apos;s not there?</h2>
<p>Sometimes the volume of data is overwhelming. Imagine verifying that a 40 page document isn&apos;t missing a word. That&apos;s not trivial. A previous project of mine was to ensure a six volume set of laws got printed correctly. Not only did it have to look right and contain all the new content, but we had to make sure none of the old content didn&apos;t get changed by accident.</p>
<p>Never mind the small fact that the law of the land needed to be represented accurately, replacing a volume within that set was very costly. It can be costly to your organization to make errors. (As an aside, corrections where done as single page replacements when possible. Stick the new over the old, and go about your business.)</p>
<h2 id="controlled-testing">Controlled testing</h2>
<p>The system we replaced on that project consisted of a mainframe application and lots of human input and proofreading. The proofreaders checked not only the content that changed (added, edited, or deleted), but the surrounded content as well. Although an inefficient use of human resources, it does provide a simple solution: testing against a known state.</p>
<p>The only way to keep your sanity when doing these large checks was to check against a known, or controlled, source. You can simulate this in your acceptance testing or even your unit or integration testing. Be sure that the source data you are verifying against is accurate, and the authoritative source.</p>
<h2 id="only-test-affected-functionality-and-data">Only test affected functionality and data</h2>
<p>Six volumes takes a long time to read, let alone proofread. How does one ensure that content doesn&apos;t go missing or changed by accident? Each book was broken into chapters. On average, 10% of the chapters changed each year. It was mostly safe to proof only the chapters that changed (and even then, sections within those chapters). There was a chance that a chapter or section could be omitted, but safeguards where in place to ensure they were still there. The moral of this example is to work smarter, not harder. Only test what you have to. You can test more, but never less.</p>
<h2 id="knowing-half-the-battle">Knowing, half the battle</h2>
<p>The key is to know when to look for errors of omission. The first step (for everything, it seems) is to admit you have a problem. Once you know to look for errors of omission, you can test for them as well. Be sure to limit what you test intelligently, and test against the authoritative  source. In time, you&apos;ll get better at spotting the circumstances in which an omission can occur.</p>
]]></content:encoded></item><item><title><![CDATA[Story of the utility developer]]></title><description><![CDATA[<p>A few years into my career, I noticed I was only working with the (even then) outdated &quot;classic&quot; ASP. I certainly did not want to work with ASP forever. This .NET thing was new and cool, and it seemed to fix 90% of my complaints with classic ASP.</p>]]></description><link>https://famularo.org/story-of-the-utility-developer/</link><guid isPermaLink="false">66d3bf67108fed0001bdfb90</guid><category><![CDATA[Software Development]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Sat, 17 Jan 2015 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p>A few years into my career, I noticed I was only working with the (even then) outdated &quot;classic&quot; ASP. I certainly did not want to work with ASP forever. This .NET thing was new and cool, and it seemed to fix 90% of my complaints with classic ASP. My company had various projects underway. One was a rather large (and important) Java project. I pulled a few strings and got put on the project.<br>I few things I should note: I would have preferred a .NET project at the time, but the company didn&apos;t have one (I don&apos;t recall if there wasn&apos;t one, or just one that I could be placed on). I had done some work with Java back in college, yet I was worried it wouldn&apos;t be smooth transition. I had worked exclusively with ASP and Visual Basic 6 (VB6) since college, and felt comfortable with those languages. In addition, .NET had VB.Net, the successor to VB6. Taking up Java at this time seemed a little crazy. Maybe it spoke to how much I wanted to do something other than ASP.</p><p><br>I arrived at my new assignment and promptly setup my development environment on my workstation. I was placed on a small sub-team with three others, led by a newer hire that knew Java very well. Even though I was nervous, I felt good about my situation. I had been in a similar situation on my first project while I was learning ASP. Even better, I now had a few years of professional experience. The non-programming parts of software development wouldn&apos;t be as foreign to me as it had been just out of college.<br>As expected, much of Java looked foreign. The language itself was familiar, but the projects and applications were structured nothing like I was used to. On top of that, we were using a bunch of weird middleware products I&apos;d never heard of (and would never come across again after this project). I was having a hard time getting a handle on everything. There was so much to learn, and that was just my small little sub-team.</p><p><br>I plodded along in my assignments, turning out what I thought was decent code given the circumstances. I knew what I wrote six months down the road would be a lot better, but that was the best I could do at the time. I interacted with a few of the other sub-teams, ensuring our work integrated with theirs. All the sub-teams were growing, and quite a few new developers joined us on the project. All of them had more Java experience than I did. I was now the odd man out. The Microsoft guy on the Java team.</p><p><br>A quick aside &#x2014; I enjoy helping people, especially helping others learn to code (or learn to code better). I am very grateful for the mentors and coworkers I&apos;ve had over the years that have taken time to help me be a better me. The least I can do is give back.</p><p><br>Given my nature, I found myself working with another developer on a different sub-team. I don&apos;t recall how we got on the subject, but he was struggling to create the code for the UI in the design documents (a UI that only corporate apps can dream up). This developer had been working on Java his whole career, and our careers were similar in length (2-4 years).</p><p><br>As I helped him, I had a one of the more important revelations of my career: It didn&apos;t matter what the language was, the core concepts and patterns used where universal. While the language might change, the same things I&apos;d done in ASP where just as applicable in Java.</p><p><br>I found myself in this situation a handful of times. For the first time on the team, I felt like I was adding significant value. And I wasn&apos;t even working on my assignments half the time. The project lead was a friend, and I found myself talking to him in his office (usually after hours when he wasn&apos;t in his endless meetings). I kept him briefed on what I was doing and how I was assisting the team.</p><p><br>A few weeks later, the lead called me into his office. &quot;Jason, I have a new assignment for you.&quot;</p><p><br>Great, I thought. I finally found my groove and now things would be changing. I prepared myself for something new, but not quite what he had in store.<br>&quot;I want you to be a utility developer.&quot;</p><p><br>What&apos;s a utility developer, I thought. That sounds weird. I wasn&apos;t sure I wanted to be a utility developer, whatever it was.</p><p><br>&quot;We&apos;re going to take you off your [sub-]team and have you assist everyone on the project, as needed. You won&apos;t have any tasks on the project plan. Just help anyone who needs it and keep the project moving forward.&quot;</p><p><br>My mind was blown. On the positive side, this was high praise. I was helping people and that provided more value than working on tasks directly. On the other hand, I was going to have to learn, at least at a high level, all the various technologies and parts of the whole system. I cautiously accepted my new assignment and got to work.</p><p><br>Over the next few weeks, I helped all the teams, as needed. I learned more technology in those weeks than I had on the project to date. I got to talk to everyone, learn from everyone, and generally grow myself more than I had in a long while. I continued to learn that I could tackle any problem (except for being on time for the 8:30 AM daily meeting).</p><p><br>Unfortunately, the role of utility developer didn&apos;t last forever. I don&apos;t recall exactly how it ended. I did leave the project before it was completed (only to return later, it was large and long project). Perhaps I was needed in classic ASP land again. Whatever the reason, I left the project with more confidence than I had had at any point in my career up to then.</p><p><br>Soon after, I started to be the team/project lead on many of my projects. I&apos;m thanking for the time I spent as the utility developer, doing a little bit of everything, but most importantly, making sure the project moved forward.</p>]]></content:encoded></item><item><title><![CDATA[Quickly switch to a "Presentation Mode" in Visual Studio]]></title><description><![CDATA[<p>As I prepared to give a <a href="http://www.meetup.com/TechnologyGrows/events/199648072/">presentation</a> tomorrow night, I stumbled upon a <a href="http://blogs.msdn.com/b/pstubbs/archive/2010/06/16/presentation-mode-in-visual-studio.aspx">great article</a> explaining how to setup Visual Studio for a &quot;presentation mode.&quot; Presentation Mode are the font sizes required so the folks sitting in the back row don&apos;t repeatedly say &quot;can you</p>]]></description><link>https://famularo.org/quickly-switch-to-a-presentation-mode-in-visual-studio/</link><guid isPermaLink="false">66d3c13e108fed0001bdfb9e</guid><category><![CDATA[Visual Studio]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Wed, 13 Aug 2014 04:00:00 GMT</pubDate><content:encoded><![CDATA[<p>As I prepared to give a <a href="http://www.meetup.com/TechnologyGrows/events/199648072/">presentation</a> tomorrow night, I stumbled upon a <a href="http://blogs.msdn.com/b/pstubbs/archive/2010/06/16/presentation-mode-in-visual-studio.aspx">great article</a> explaining how to setup Visual Studio for a &quot;presentation mode.&quot; Presentation Mode are the font sizes required so the folks sitting in the back row don&apos;t repeatedly say &quot;can you zoom in a little?&quot;</p>
<p>I&apos;ve <a href="https://famularo.org/presentation-considerations">written</a> about presentations before, but failed to go into any detail about configuring your IDE of choice. Mine for tomorrow will be Visual Studio. Since it&apos;s been a while since I&apos;ve presented, I didn&apos;t quite remember the required settings to change the fonts. And Visual Studio has a lot of settings:</p>
<p><img src="https://famularo.org/content/images/2024/09/i8khh6mxukafma.png" alt="Visual Studio options dialog, with the Fonts and Colors section visible" loading="lazy"></p>
<p>Thankfully, I found the article I mentioned above, and saved myself a small fortune of time trying to find and toggle all the correct settings. I&apos;ve perfected the following quick process for my presentations.</p>
<h2 id="4-simple-steps-to-a-better-presentation">4 simple steps to a better presentation</h2>
<p>Step 1: <a href="https://raw.githubusercontent.com/Fammy/vs-presentation-mode/master/presentationmode.vssettings">Download</a> this Visual Studio settings files</p>
<p>Step 2: Import into Visual Studio via the Tools-&gt;Import and Export Settings menu item</p>
<ul>
<li>Select &quot;Import selected environment settings&quot; and click &quot;Next&quot;</li>
<li>Select &quot;Yes, save my current settings&quot;. Do this so you can revert back after your presentation. Type in a name, I called mine &quot;dev.vssettings&quot;, and pick a folder to store them in. Click &quot;Next&quot;</li>
<li>Click &quot;Browse...&quot; and find presentationmode.vssettings. Click &quot;Next&quot;</li>
<li>Leave all the defaults, and click &quot;Finish&quot;</li>
</ul>
<p>Step 3: Give your presentation with fonts the back row can read</p>
<p><img src="https://famularo.org/content/images/2024/09/2gqazflstjuceg.png" alt="Visual Studio in the Light theme, with larger fonts" loading="lazy"></p>
<p>Wow, such big</p>
<p><img src="https://famularo.org/content/images/2024/09/shibe.jpg" alt="Shibe meme dog" loading="lazy"></p>
<p>Step 4: Revert back to your original settings by repeating Step 2 and choosing your saved settings (you did save them, right?!)</p>
]]></content:encoded></item><item><title><![CDATA[The cult of the one-★ review]]></title><description><![CDATA[<h2 id="playing-the-game">Playing the game</h2>
<p>The supposedly fair system of user reviews is horribly broken. The process was ripe for gaming. And gamed it has been. Companies optimize their apps and websites to get you to leave &#x2605;&#x2605;&#x2605;&#x2605;&#x2605; reviews. EA, with their Dungeon Keeper on mobile platforms has</p>]]></description><link>https://famularo.org/the-cult-of-the-one-star-review/</link><guid isPermaLink="false">66d3c1eb108fed0001bdfbb2</guid><category><![CDATA[Mobile Development]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Sat, 22 Mar 2014 04:00:00 GMT</pubDate><content:encoded><![CDATA[<h2 id="playing-the-game">Playing the game</h2>
<p>The supposedly fair system of user reviews is horribly broken. The process was ripe for gaming. And gamed it has been. Companies optimize their apps and websites to get you to leave &#x2605;&#x2605;&#x2605;&#x2605;&#x2605; reviews. EA, with their Dungeon Keeper on mobile platforms has optimized this to the extreme:</p>
<p><img src="https://famularo.org/content/images/2024/09/auqjryi3ljl4na.png" alt="Rate Your Experience dialog from mobile game" loading="lazy"></p>
<p>Clicking &quot;5 Stars&quot; takes you to the store to give that &#x2605;&#x2605;&#x2605;&#x2605;&#x2605; rating. While clicking &quot;1-4 Stars&quot;...</p>
<p><img src="https://famularo.org/content/images/2024/09/q5xk1pcy1xcgtg.png" alt="In-game feedback dialog" loading="lazy"></p>
<p>Emails, as far as I know, don&apos;t show up as app store reviews. Instead, you get ushered away from app store to some back room where no one knows what was said. That, in theory, leads to more &#x2605;&#x2605;&#x2605;&#x2605;&#x2605; reviews and a higher score. EA&apos;s tactic may have gone unnoticed if it wasn&apos;t for <a href="http://www.independent.co.uk/life-style/gadgets-and-tech/dungeon-keeper-mobile-remake-deemed-unplayable-due-to-inapp-purchases-9119140.html">other issues</a> with the game.</p>
<h2 id="beating-the-system">&quot;Beating&quot; the system</h2>
<p>Less than satisfied users on the other hand, in response to all the &#x2605;&#x2605;&#x2605;&#x2605;&#x2605; reviews, or perhaps just in anger and spite, leave &#x2605; reviews and scathing comments. &quot;I&apos;d give it no stars if that was possible!&quot; raves one review. &quot;Doesn&apos;t support feature <em>X</em>, thus &#x2605;.&quot; says another.</p>
<p>In response to EA, the masses gathered to &quot;correct&quot; the injustice: an unfair playing field. Their response, &#x2605; reviews. This behavior is called <a href="http://en.wikipedia.org/wiki/Griefer">Griefing</a>.</p>
<h2 id="the-test">The test</h2>
<p>Go to <a href="http://www.amazon.com/">Amazon</a>, or <a href="http://www.bestbuy.com/">Best Buy</a>, or the <a href="https://itunes.apple.com/us/genre/ios/id36?mt=8">App Store</a> or <a href="https://play.google.com/store/apps">Google Play</a> and read a few reviews. Play close attention to the &#x2605; reviews.</p>
<h2 id="results">Results</h2>
<p>What did you find? I went to the Apple App Store (which is hard to navigate from a browser, but I digress) and looked at the first app in the first category: <a href="https://itunes.apple.com/us/app/ibooks/id364709193?mt=8">iBooks</a>.</p>
<p>Here are the three reviews I saw:</p>
<p><img src="https://famularo.org/content/images/2024/09/iqrametknyu3w.png" alt="Three customer reviews: four-star that starts with, &quot;I love this app BUT!!!&quot;; one-star review that has the title &quot;New design is utterly terrible&quot; and a five-star review that is reasonable" loading="lazy"></p>
<p>Pay special attention to the middle review. Other than a thirst for violence, what sticks out? To me, it&apos;s the desire to get a single thing changed (the new UI design to match iOS 7&apos;s massive overhaul). So does this ruin the experience? I don&apos;t know, I&apos;m not the review&apos;s author, shr00mie. Only shr00mie knows how shr00mie feels. And if we take shr00mie at his or her word, the app is ruined. Reading books is ruined.</p>
<p>The review has an agenda. The agenda is to get something changed. And the way the user has decided is to attempt griefing with a &#x2605; review. This behavior exists anywhere a user can leave a review. Let&apos;s check the Google Play store. Maybe it&apos;s just Apple zealots, right?</p>
<p>This comes from the first app the store shows, <a href="https://play.google.com/store/apps/details?id=com.ncaa.mmlive.app">NCAA&#xAE; March Madness</a> (so glad they got that &#xAE; mark in there. I was totally going to steal their mark!)</p>
<p><img src="https://famularo.org/content/images/2024/09/5exhgq0lucfk8a.png" alt="One star review complaining you can&apos;t watch women&apos;s college basketball in the app" loading="lazy"></p>
<p>This was the first review of the app. In a way, the reviewer is correct, if the user only installed the app to watch women&apos;s basketball, and it only shows men&apos;s basketball, then it&apos;s useless, and worthy of a &#x2605; review. But the app&apos;s description states that it allows &quot;unlimited access to live streaming video of all 67 games of the 2014 NCAA&#xAE; Division I Men&#x2019;s Basketball Tournament&quot;. I&apos;ll let you be the judge.</p>
<h2 id="how-i-handle-user-reviews">How I handle user reviews</h2>
<p>Honestly, I&apos;ve had my fair share of &quot;does not support move to SD&quot; reviews (on Android, the ability to run an app from an SD Card vs. internal memory). Does the app deserve a &#x2605; review because you have too many apps installed on your phone?</p>
<p>I no longer trust review scores. Between the &quot;I ran this app for 2 minutes and it looks awesome &#x2605;&#x2605;&#x2605;&#x2605;&#x2605;&quot; and the obvious attempts at review griefing, the signal to noise ratio is much too low for me.</p>
]]></content:encoded></item><item><title><![CDATA[Technical debt: now or never]]></title><description><![CDATA[<p>I started a new project at work a few months ago. Literally, a new project, as in File -&gt; New Project. It was very liberating (and scary) to not worry about the company&apos;s main code base that was 10+ years old. While in decent shape, nothing that</p>]]></description><link>https://famularo.org/technical-debt-now-or-never/</link><guid isPermaLink="false">66d3cb18108fed0001bdfbc9</guid><category><![CDATA[Software Development]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Wed, 26 Feb 2014 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p>I started a new project at work a few months ago. Literally, a new project, as in File -&gt; New Project. It was very liberating (and scary) to not worry about the company&apos;s main code base that was 10+ years old. While in decent shape, nothing that old is going to be without problems. I call those problems <a href="http://en.wikipedia.org/wiki/Technical_debt">technical debt</a>. (You also don&apos;t get all the niceties and helpers that someone else has spent 10 years perfecting, but I digress).</p>
<p>Like any project, my new project started accruing technical debt. I was faced with the decision that every project is: pay back the debt or build shippable (and thus profitable) features. Most projects choose the latter. That&apos;s probably the right decision in some cases. But being scared that one day the new project would be the old project, I couldn&apos;t live with the decisions made weeks earlier. They didn&apos;t sit right with me.</p>
<p>The other developer and I decided to fix them. It was now or never. Once we got out of the &quot;build a thing that compiles and does the first thing&quot; and into production, there wasn&apos;t going to be a lot of time to circle back around. We&apos;d be any other project at that point. Always enhancing, always maintaining. As we found the nasty regions in the code, we tore them out and replaced them with something better.</p>
<p>Technical debt is said to accrue interest. The longer it sits around, the more code that gets piled on top of it that makes it harder to change and fix. That&apos;s one reason why we were able to pay so much back. The cost to do so was not yet high.</p>
<p>I&apos;m not saying you can&apos;t go back and pay back your technical debt at some point in the future. I think you should. Business needs in general don&apos;t allow development teams the time they need to fix everything. We sometimes settle for what&apos;s the worst code, or what&apos;s easiest to fix. Slow and steady in those cases.</p>
<p>If you get a chance to pay back your debts, do so. The sooner you pay them back, the easier it&apos;ll be. And you&apos;ll feel a lot better about the code you leave behind.</p>
]]></content:encoded></item><item><title><![CDATA[Two Factor Authentication with the same email address]]></title><description><![CDATA[<h2 id="update">Update</h2>
<p>Google Authenticator now handles this situation correctly, and this article is less useful than it once was.</p>
<h2 id="original-article">Original Article</h2>
<p>Microsoft recently added two factor authentication. You should add this to your account. It&apos;s a good thing.</p>
<p>I recently tried on my Android phone to scan the barcode,</p>]]></description><link>https://famularo.org/two-factor-authentication-with-the-same-email-address/</link><guid isPermaLink="false">66d3cb71108fed0001bdfbd3</guid><category><![CDATA[Tech Support]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Thu, 09 May 2013 04:00:00 GMT</pubDate><content:encoded><![CDATA[<h2 id="update">Update</h2>
<p>Google Authenticator now handles this situation correctly, and this article is less useful than it once was.</p>
<h2 id="original-article">Original Article</h2>
<p>Microsoft recently added two factor authentication. You should add this to your account. It&apos;s a good thing.</p>
<p>I recently tried on my Android phone to scan the barcode, but it wasn&apos;t working. My co-workers and I figured out that the Google accounts we already had setup on the Android authenticator app shared the same email address. Both Google and Microsoft were using that for their account name, so the second account wasn&apos;t being added.</p>
<p>To get around this, I manually added the account and gave it a name other than my email address. I now have <a href="mailto:notmyrealemail@gmail.com">notmyrealemail@gmail.com</a>&quot; for Google and &quot;Microsoft&quot; for Microsoft.</p>
]]></content:encoded></item><item><title><![CDATA[Integrating TortoiseHg with Visual Studio]]></title><description><![CDATA[<p>If you use Visual Studio, you don&apos;t get integration with version control unless you use Team Foundation Server or install a plugin.<br>
This is an adaptation of this fantastic <a href="http://tortoisesvn.net/visualstudio.html">guide</a>, originally written for TortoiseSVN. This guide also works for git (or any version control system), just change the</p>]]></description><link>https://famularo.org/integrating-tortoisehg-with-visual-studio/</link><guid isPermaLink="false">66d3cbcd108fed0001bdfbe0</guid><category><![CDATA[Visual Studio]]></category><dc:creator><![CDATA[Jason Famularo]]></dc:creator><pubDate>Tue, 22 Jan 2013 05:00:00 GMT</pubDate><content:encoded><![CDATA[<p>If you use Visual Studio, you don&apos;t get integration with version control unless you use Team Foundation Server or install a plugin.<br>
This is an adaptation of this fantastic <a href="http://tortoisesvn.net/visualstudio.html">guide</a>, originally written for TortoiseSVN. This guide also works for git (or any version control system), just change the commands.</p>
<h2 id="creating-external-tool-entries">Creating External Tool entries</h2>
<p>The first step to setting up the integration is to create external tool entries for the various commands you&apos;d like to launch from Visual Studio. Using the following steps, you&apos;ll have one or more hg commands at your disposal.</p>
<ol>
<li>Go to &quot;Tools -&gt; External Tools&quot; menu item.</li>
<li>Click &quot;Add&quot;.</li>
<li>Name the tool in the &quot;Title&quot; textbox. I&apos;ve chosen &quot;hg annotate&quot;, &quot;hg diff&quot;, and &quot;hg log&quot;.</li>
<li>In the &quot;Command&quot; textbox, put the path to TortoiseHg, typically &quot;C:\Program Files\TortoiseHg\thg.exe&quot;</li>
<li>Fill out the proper arguments. The $(ItemPath) variable points to the current file. It&apos;s good practice to surround  the item in quotes, as you may have spaces in your path. Here are the various agruments for the commands I use:
<ol>
<li>Annotate: annotate -n $(CurLine) &quot;$(ItemPath)&quot;</li>
<li>Diff: vdiff &quot;$(ItemPath)&quot;</li>
<li>Log: log &quot;$(ItemPath)&quot;</li>
</ol>
</li>
<li>Within &quot;Initial Directory&quot;, put a path within your repository. I&apos;ve chosen $(ItemDir) for simplicity. You can also use $(SolutionDir) or one of the others.</li>
<li>Check &quot;Close on exit&quot;, or you&apos;ll end up with a pesky Command window left open.</li>
<li>Note the position of your entry in the list (8th, etc). You&apos;ll need to use it later.</li>
<li>Repeat steps 2 through 7 for the various commands, and click &quot;OK&quot; to save.</li>
</ol>
<h2 id="adding-context-menu-items">Adding context menu items</h2>
<p>While you can use the entries in External Tools as is (Tools -&gt; hg log), it&apos;s useful to have them in the various context menus in the system.<br>
Some of the commands are dependent on the type of file open, so open a code file before you start.</p>
<ol>
<li>Go to &quot;Tools -&gt; Customize&quot; menu item.</li>
<li>Click the &quot;Commands&quot; tab.</li>
<li>Click the &quot;Context menu&quot; radio button.</li>
<li>Choose an appropriate menu item from the &quot;Context menu&quot; dropdown:
<ol>
<li>&quot;Editor Context Menus | Code Window&quot; adds it to the right-click menu of the code window.</li>
<li>&quot;Other Context Menus | Easy MDI Document Window&quot; adds it to the right-click of the document tab.</li>
<li>&quot;Project and Solution Context Menus | Item&quot; adds it to the right-click menu of the files in the Solution Explorer.</li>
</ol>
</li>
<li>Click the &quot;Add Command...&quot; button.</li>
<li>Select &quot;Tools&quot; from the &quot;Categories&quot; listbox.</li>
<li>Now the fun part. Select &quot;External Command x&quot;, where x is the position in the External Tools entries. You remembered to remember that, didn&apos;t you?</li>
</ol>
<h2 id="bonus">Bonus</h2>
<p>As an added bonus, this guide also works in SQL Server Management Studio.</p>
]]></content:encoded></item></channel></rss>