<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Badmatt</title>
		<description>Matthew J. Collins personal blog</description>
		<link>http://mjcollin.github.io</link>
		<atom:link href="http://mjcollin.github.io/feed.xml" rel="self" type="application/rss+xml" />
		
			<item>
				<title>Radeon 9070 XT on Ubuntu 24.04 with ZFS</title>
				<description>&lt;h1 id=&quot;radeon-9070-xt-on-ubuntu-2404-with-zfs&quot;&gt;Radeon 9070 XT on Ubuntu 24.04 with ZFS&lt;/h1&gt;

&lt;p&gt;I rarely update my desktop but when I do I like to buy the latest things right when they come out.
This can lead to some issues with Linux and drivers and most recently I bought a Radeon 9070 XT which the kernel AMD driver does not support in Ubuntu’s 6.8 kernel. I also use ZFS for much of my storage so I needed to have the kernel modules for that as well. The lates Mesa version and some addition GRUB command line settings are needed to prevent Steam from crashing.&lt;/p&gt;

&lt;p&gt;(I briefly tried AMD’s proprietary driver and Steam would crash while running that with the default 6.8 kernel. I decided to go with the kernel driver since that seemed like a more documented path.)&lt;/p&gt;

&lt;h2 id=&quot;1-updating-the-kernel&quot;&gt;1. Updating the Kernel&lt;/h2&gt;

&lt;p&gt;This &lt;a href=&quot;https://idroot.us/install-amd-radeon-driver-ubuntu-24-04/&quot;&gt;blog post&lt;/a&gt; summarizes the options for drivers, however the Linux kernel drivers only support the Radeon 9070 XT &lt;a href=&quot;https://www.phoronix.com/review/amd-radeon-rx9070-linux&quot;&gt;after 6.12&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The latest kernels are readily built and distributed by Ubutu from the &lt;a href=&quot;https://kernel.ubuntu.com/mainline/&quot;&gt;Mainline server&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;11-installing-from-mainline&quot;&gt;1.1. Installing from Mainline&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Download all &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.deb&lt;/code&gt; packages from a version and arch directory of your choice. For example, &lt;a href=&quot;https://kernel.ubuntu.com/mainline/v6.14.8/amd64/&quot;&gt;v6.14.8/amd64&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Install them all with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt install ./*.deb&lt;/code&gt;. 
(Note the path specifier &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./&lt;/code&gt; which will make &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt&lt;/code&gt; look for files instead of package names.)&lt;/li&gt;
  &lt;li&gt;Reboot and verify the running kernel with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uname -a&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But, make sure you don’t depend on ZFS for anything because you don’t have kernel modules for this kernel verison yet.&lt;/p&gt;

&lt;h2 id=&quot;2-installing-the-latest-openzfs&quot;&gt;2. Installing the Latest OpenZFS&lt;/h2&gt;

&lt;p&gt;OpenZFS doesn’t support kernel 6.14 until &lt;a href=&quot;https://github.com/openzfs/zfs/releases/tag/zfs-2.3.2&quot;&gt;version 2.3.2&lt;/a&gt; so trying to use Ubuntu’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zfs-dkms&lt;/code&gt; package to build kernel drivers for the default version 2.2.2 won’t work.
Now you’ll need to update ZFS to the latest release.
They have nice support for &lt;a href=&quot;https://openzfs.github.io/openzfs-docs/Developer%20Resources/Custom%20Packages.html#dkms&quot;&gt;building Debian DKMS packages&lt;/a&gt; though.
However, because the mainline kernels are built with gcc-14, you will also need to install that compiler in order to build kernel modules for it.&lt;/p&gt;

&lt;h3 id=&quot;21-remove-default-ubuntu-zfs-packages&quot;&gt;2.1 Remove Default Ubuntu ZFS Packages&lt;/h3&gt;

&lt;p&gt;First the old version of ZFS has to go:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt remove zfs-zed zfsutils-linux zfs-dkms libzfs4linux&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt auto-remove&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;22-installing-gcc-14&quot;&gt;2.2 Installing gcc-14&lt;/h3&gt;

&lt;p&gt;OpenZFS has a &lt;a href=&quot;https://github.com/openzfs/zfs/issues/10832&quot;&gt;history of having a misleading error message&lt;/a&gt; for when the compiler does not match the one used to build the running kernel.
If you see this error when trying to build OpenZFS:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;*** This kernel does not include the required loadable module
*** support!
***
*** To build OpenZFS as a loadable Linux kernel module
*** enable loadable module support by setting
*** `CONFIG_MODULES=y` in the kernel configuration and run
*** `make modules_prepare` in the Linux source tree.
***
*** If you don&apos;t intend to enable loadable kernel module
*** support, please compile OpenZFS as a Linux kernel built-in.
***
*** Prepare the Linux source tree by running `make prepare`,
*** use the OpenZFS `--enable-linux-builtin` configure option,
*** copy the OpenZFS sources into the Linux source tree using
*** `./copy-builtin &amp;lt;linux source directory&amp;gt;`,
*** set `CONFIG_ZFS=y` in the kernel configuration and compile
*** kernel as usual.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then check the build log in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;build/build.log.configure&lt;/code&gt; for a real error message.
Chances are you do not have gcc-14 installed.
Fortunately, that’s &lt;a href=&quot;https://www.baeldung.com/linux/gnu-compiler-collection-ubuntu-installation&quot;&gt;availible from Universe&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Verify you have Universe enabled by looking for “universe” in the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Components&lt;/code&gt; line in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/apt/sources.list.d/ubuntu.sources&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Install with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt install gcc-14&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;22-building-openzfs-dkms-packages-and-installing&quot;&gt;2.2 Building OpenZFS DKMS Packages and Installing&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Install needed packages with
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt install build-essential autoconf automake libtool gawk alien fakeroot dkms libblkid-dev uuid-dev libudev-dev libssl-dev zlib1g-dev libaio-dev libattr1-dev libelf-dev linux-headers-generic python3 python3-dev python3-setuptools python3-cffi libffi-dev python3-packaging debhelper-compat dh-python po-debconf python3-all-dev python3-sphinx libpam0g-dev dh-dkms libtirpc-dev libcurl4-openssl-dev&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Download OpenZFS source tarball from a release, EG &lt;a href=&quot;https://github.com/openzfs/zfs/releases/tag/zfs-2.3.2&quot;&gt;v2.3.2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Extract with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tar -xf zfs*.tar.gz&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Change to the zfs directory with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cd zfs&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;While running the new kernel, configure with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;./configure&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Compile with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;make native-deb-utils&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;In the directory above &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zfs&lt;/code&gt;, there will now be a bunch of packages.
Delete an uneeded one with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rm openzfs-zfs-dracut_2.3.2-1_all.deb&lt;/code&gt; and install the rest with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt install ./*.deb&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can now check with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zfs&lt;/code&gt; or &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zpool&lt;/code&gt; commands to verify that the kernel module is finding your existing volumes.&lt;/p&gt;

&lt;p&gt;After rebooting, you will need to run &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zpool import -a&lt;/code&gt; to re-import pools.&lt;/p&gt;

&lt;h2 id=&quot;3-installing-the-latest-mesa-packages&quot;&gt;3. Installing the Latest Mesa Packages&lt;/h2&gt;

&lt;p&gt;The latest version of Mesa (25) is needed as well.
A kind person runs a &lt;a href=&quot;https://launchpad.net/~kisak/+archive/ubuntu/kisak-mesa&quot;&gt;PPA with the latest Mesa packages&lt;/a&gt;.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;add-apt-repository ppa:kisak/kisak-mesa&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt update&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt upgrade&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;4-adding-grub-command-line-setting-to-disable-split-lock&quot;&gt;4. Adding GRUB Command Line Setting to Disable &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;split-lock&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;This seems to be a common recommendation for performance and stability with Steam and gaming.
There’s a &lt;a href=&quot;https://lwn.net/Articles/911219/&quot;&gt;long opinionated article&lt;/a&gt; on it, but I just disabled it and Steam stopped crashing.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Edit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/etc/default/grub&lt;/code&gt; and add &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;split_lock_detect=off&lt;/code&gt; to the command line.&lt;/li&gt;
  &lt;li&gt;Reboot and verify with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;cat /proc/cmdline&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;4-bonus-overclocking-and-monitoring&quot;&gt;4. Bonus: Overclocking and Monitoring&lt;/h2&gt;

&lt;p&gt;Of course you want a handy control panel for managing the card with status monitoring:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/ilya-zlobintsev/LACT&quot;&gt;LACT&lt;/a&gt;&lt;/p&gt;
</description>
				<pubDate>Thu, 22 May 2025 17:00:00 +0000</pubDate>
				<link>http://mjcollin.github.io/2025/05/ubuntu-9070xt-zfs</link>
				<guid isPermaLink="true">http://mjcollin.github.io/2025/05/ubuntu-9070xt-zfs</guid>
			</item>
		
			<item>
				<title>Pi Frame</title>
				<description>&lt;h1 id=&quot;raspberry-pi-picture-frame&quot;&gt;Raspberry Pi Picture Frame&lt;/h1&gt;

&lt;p&gt;My digital picture frame passed on to its reward and I was very dissapointed in the available options on the market.
The resolutions seemed terrible and they were all 16:9 aspect ratio.
As is typical no days, most also wanted to connect to some cloud service to get their pictures as well, although they would read an SD card too.&lt;/p&gt;

&lt;p&gt;I had my first LCD monitor still, actually one of a pair as I’d given away the other years before.
It is a 15” 1024x768 but excellent (for 2002) color and contrast.
I also had an original Pi that I paid a friend 0.2 BTC for back when Bitcoin was $100 that was collecting dust.
So, I put things together by making a VESA mount case out of some epoxy-filled oak I had lying around as well:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/unassembled.png&quot; alt=&quot;Unassembled Case&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/detail.png&quot; alt=&quot;Detail of Case&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/monitor_back.png&quot; alt=&quot;Back View&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/monitor_front.png&quot; alt=&quot;Front View&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;materials&quot;&gt;Materials&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.eizoglobal.com/support/db/products/model/L365&quot;&gt;Eizo Flexscan L365 15” LCD monitor&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.raspberrypi.com/news/raspberry-pi-1-model-b-units-brought-back-to-life-for-charity/&quot;&gt;Raspberry Pi B&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.edimax.com/edimax/merchandise/merchandise_detail/data/edimax/global/wireless_adapters_n150/ew-7811un/&quot;&gt;Edimax USB WiFi adapter&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;DVI to HDMI adapter&lt;/li&gt;
  &lt;li&gt;1’ HDMI cable&lt;/li&gt;
  &lt;li&gt;USB A to micro-USB cable&lt;/li&gt;
  &lt;li&gt;USB power supply&lt;/li&gt;
  &lt;li&gt;Standard computer power cable&lt;/li&gt;
  &lt;li&gt;Scrap of oak&lt;/li&gt;
  &lt;li&gt;Purple epoxy&lt;/li&gt;
  &lt;li&gt;Varnish&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;programming&quot;&gt;Programming&lt;/h2&gt;

&lt;p&gt;I wanted to only power the monitor from 7:00 am to 5:00 pm when I’m in my office to see it.
Conveniently, there is a Pi command to have the video core put the monitor into standby mode which consumes less than 1W.
I wrote a simple BASH script to show a random image from a folder every 4 hours and put it in a cron job that runs every minute.
Not terribly efficient but the Pi doesn’t have anything else to do.&lt;/p&gt;
&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/bin/bash&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;hour&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;date&lt;/span&gt; +&lt;span class=&quot;s2&quot;&gt;&quot;%H&quot;&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$hour&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-ge&lt;/span&gt; 19 &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$hour&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-le&lt;/span&gt; 7 &lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
        &lt;/span&gt;killall &lt;span class=&quot;nt&quot;&gt;-q&lt;/span&gt; fbi
        vcgencmd display_power 0 &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class=&quot;k&quot;&gt;elif&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt; pgrep &lt;span class=&quot;nt&quot;&gt;-x&lt;/span&gt; fbi &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null  &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;then
        &lt;/span&gt;vcgencmd display_power 1 &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null
        killall &lt;span class=&quot;nt&quot;&gt;-q&lt;/span&gt; fbi
        &lt;span class=&quot;nv&quot;&gt;images&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;$(&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt; /home/pi/frame/images/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;si&quot;&gt;)&lt;/span&gt;
        fbi &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--noverbose&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-T&lt;/span&gt; 1 &lt;span class=&quot;nt&quot;&gt;-t&lt;/span&gt; 14400 &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-1&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$images&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; /dev/null
&lt;span class=&quot;k&quot;&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
				<pubDate>Sun, 31 Jul 2022 17:00:00 +0000</pubDate>
				<link>http://mjcollin.github.io/2022/07/pi-frame</link>
				<guid isPermaLink="true">http://mjcollin.github.io/2022/07/pi-frame</guid>
			</item>
		
			<item>
				<title>Budget Castle</title>
				<description>&lt;h1 id=&quot;my-motivations-behind-tracking-spending&quot;&gt;My motivations behind tracking spending&lt;/h1&gt;

&lt;p&gt;Over the years I found myself having two feelings about spending: first, that I can’t afford what I want so I will spend hours pining away thinking about whatever it is and second, simply buying what I want and feeling unsure about whether I will be able to afford it. Coincidentally the oversaving from the first has off-set the overspending from the second. However I was left with perpetual uncertainty about how my choices to buy something now affected what I could buy later and whether I was buying what I truly wanted.&lt;/p&gt;

&lt;p&gt;Around 2014 I read All Your Worth and made a better effort to really separate out the money I put towards things that I needed, things I wanted, and savings for the future. After doing so for a little while I decided there was a second dimension to spending money besides what you spend it on and that is when you make the decision to spend it.&lt;/p&gt;

&lt;p&gt;Most of the needs and savings spending ends up being decided at one time, often rationally with a spreadsheet, and that decision is perpetuated through automatic tools. Examples are picking a payroll deduction percentage for a 401k retirement plan, signing a lease on an apartment with a fixed rent and setting up automatic payments, and even utility bills and cell phone bills are mostly fixed in that you can figure out a monthly average with historical data and consider that amount to be your spending.&lt;/p&gt;

&lt;p&gt;After figuring out the needs and saving categories of my budget, I was left with the wants. I quickly figured out that signing up for Netflix, eating out for a restaurant, and buying a new woodworking tool all feel very different even though they are all in the want category. Using the same strategy as I did with my needs and savings, I listed out all the things I had already decided to spend money on like haircuts, streaming media, and house cleaners and considered that part of my wants budget already spent. What was left with was money I was going to decide how to spend on a daily basis. This is the money I needed to manage emotionally.&lt;/p&gt;

&lt;p&gt;I needed help managing how I felt about small daily treats like eating out and major hobby purchases that did require some saving. I wanted a way to be conscious in my choices about them instead of continuing to just spend and hope everything worked out. What I wanted was to control small impulsive spending and have that restraint enable me to feel that larger purchases were ok to make. I wanted both discipline and permission to be part of my spending. An obvious strategy would be to use only cash for this spending but cash can’t be used with modern spending like Amazon or Steam and most credit cards give rewards you would miss out on by not using them.&lt;/p&gt;

&lt;p&gt;Enter the budget castle. I decided to imitate cash by using plastic poker chips. I would set out a fixed amount each week and when I purchased things, I would take them away to leave me with a physical representation of the money I had left. Of course, being a woodworker, I used a Forstner bit to put some holes in a board to keep the chips stacked and set the board on a spare fabric box to hold discarded chips.
I later made a proper one for a friend out of southern yellow pine and its appearance led me to dub it the budget castle because the sections that hold the chips look like the outline of a castle turret and the bin for the chips looks like a moat. I made a run of four of them out of ½” plywood for myself.&lt;/p&gt;

&lt;p&gt;Initially I did budgeting monthly but I decided later to do it on an interval of 4 weeks since that gave me a consistent day (Sunday for me) to lay out my next round of spending. This requires a bit more spreadsheet work since a lot of spending is set up to be monthly and it must be converted to weekly when figuring out your initial budget.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/budget_castle.png&quot; alt=&quot;budget castle&quot; /&gt;&lt;/p&gt;

&lt;h1 id=&quot;using-the-budget-castle&quot;&gt;Using the Budget Castle&lt;/h1&gt;

&lt;p&gt;The goal of the budget castle is to bring the tangibleness of cash to budgeting and spending decisions without needing to use actual cash or a data-stealing phone app. By not using cash, you can use and manage credit cards with rewards, points in app stores and other ways of spending that are more convenient or give you perks for using them. The compromise is that you have a physical thing you have to remember to update, the budget castle’s chips, but the act of doing that is what adds deliberateness to the act of spending.&lt;/p&gt;

&lt;p&gt;The castle also provides a tangible representation of how much you have decided it is ok to spend. This means you can trade off current spending against future spending by making conscious decisions. As an example, you might choose to skip eating out during a cycle and collect leftover chips in order to use them on a vacation in a few months.&lt;/p&gt;

&lt;p&gt;However, the castle is not a cash flow tool. The timing of your spending is not considered in the process so you must have the savings available to support that. If you already have several months of spending in a cash account, you can safely use this process. If you do not, you may need to greatly reduce your budget (below) and carefully manage your cash flow for a few months until you do.&lt;/p&gt;

&lt;h2 id=&quot;selecting-a-budget&quot;&gt;Selecting a budget&lt;/h2&gt;

&lt;p&gt;The castle helps with making decisions about your priorities for spending your money. As such, the most important part of the process is selecting the amount of money you want help with making decisions about on a daily basis. The budget you pick should be the part of your income that you have a choice in how you spend it. Warren suggests dividing budgets into needs, wants, and savings in her book All Your Worth. You can further divide the wants category into those you have decided in advance to pay for, like an upgraded cable package or a spa membership, and those you make decisions about on a daily basis. It is these daily wants decisions that the budget castle is used for tracking.&lt;/p&gt;

&lt;p&gt;To select a weekly budget:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Calculate an average weekly income for yourself.&lt;/li&gt;
  &lt;li&gt;Calculate all your needs and savings categories on a weekly basis and subtract them.&lt;/li&gt;
  &lt;li&gt;Calculate any wants that you have that you regularly pay for on a weekly basis and subtract them.&lt;/li&gt;
  &lt;li&gt;The remaining value is the amount you should be free to spend on discretionary wants.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;what-things-to-track&quot;&gt;What things to track&lt;/h2&gt;

&lt;p&gt;Picking what purchases count when tracking is the key to the castle working for you. Pick things you feel you have a choice about because that is what the castle is for: letting you feel good about your spending. We don’t feel good about being forced to do things so all your required spending should be subtracted upfront when picking a budget to represent with the castle.&lt;/p&gt;

&lt;h1 id=&quot;the-budget-cycle&quot;&gt;The budget cycle&lt;/h1&gt;

&lt;p&gt;A spending cycle for the castle is four weeks. This means that the budgeting doesn’t line up with months but using weeks means you have a consistent day, like Sundays, on which to evaluate your week and reset the cycle if it is time.&lt;/p&gt;

&lt;p&gt;The weekly time scale is also easy to think about when making decisions and seeing their effects because we often end up on a weekly cycle of spending eg dining out on Fridays, shopping on Saturdays, etc.&lt;/p&gt;

&lt;h2 id=&quot;the-main-cycle&quot;&gt;The main cycle&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Begin the cycle at the end of a Sunday by loading each column of the castle with chips that represent your weekly budget. You can define the denominations for the chips and the number of each denomination as you like. To start, try white = $5, red = $10 or $20, blue = $20 or $50.&lt;/li&gt;
  &lt;li&gt;Starting Monday, each day that you spend money on your wants during the week, round the amounts to the nearest $5 and remove chips from the first week’s column and drop them into the bin. You can make change from the bin if you need to.&lt;/li&gt;
  &lt;li&gt;For the next four weeks, continue to track your spending from the next column. You might have chips left over in a week, but leave them and start removing chips from the next week’s column on Mondays.&lt;/li&gt;
  &lt;li&gt;At the end of the cycle, write down how much you have not spent. This can be spent in the future and can represent a long-term savings fund.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;advanced-things&quot;&gt;Advanced things&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;You can borrow chips from another week, typically left over chips from prior weeks but you can use future weeks, if you find yourself spending a lot in one week. Examples might be a large hobby purchase or special dinner. Or if you are spending prior weeks’ chips, your past decisions are enabling you to spend now. This borrowing makes it clear that you are choosing to spend this money now but that has an effect on what you can spend in the future.&lt;/li&gt;
  &lt;li&gt;You don’t have to have the same budget every week. You might find that you like to spend more at the beginning of the calendar month. When loading your castle, you can transfer more chips to that column so you don’t have to do so much borrowing.&lt;/li&gt;
  &lt;li&gt;Instead of saving your leftover chips separately you can roll them forward and add them to a future cycle. If you don’t have a long term saving goal, you can just distribute leftover chips onto the next cycle and spend them as you want in following weeks. You can also do both saving and rolling over.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: I don’t have experience with these practices without enough of a cash cushion that the timing of spending does not matter. In my case that means that all my spending comes off an account that has several months of spending in cash sitting in it. Be very aware that just following these practices won’t necessarily help you avoid carrying a credit card balance or overdrawing your account.&lt;/p&gt;
</description>
				<pubDate>Mon, 23 May 2022 00:00:00 +0000</pubDate>
				<link>http://mjcollin.github.io/2022/05/budget-castle</link>
				<guid isPermaLink="true">http://mjcollin.github.io/2022/05/budget-castle</guid>
			</item>
		
			<item>
				<title>No</title>
				<description>&lt;p&gt;I’m not interested in privacy tips right now, DuckDuckGo.&lt;/p&gt;

&lt;p&gt;Zoom, I appreciate the offer to take your post attendee survey but I’d rather use that browser tab for something else right now.&lt;/p&gt;

&lt;p&gt;No Confluence, I do not want to tell you how my publishing experience was. I guess I have to click an “X” to tell you that to get my screen real estate back from your question dialog now. Thank you for letting me know that you meet my minimum expectations by publishing my page when I told you to though.&lt;/p&gt;

&lt;p&gt;I agree that the ability to block people in Google Drive is pretty important but I’m disappointed that I have to lose half an inch of screen until I click an “X” to be told about something that should have been part of the original system design.&lt;/p&gt;

&lt;p&gt;Docker Desktop, your cash grab and r/assholedesign is now legendary. I look forward to my daily choice between clicking “Snooze” instead of “Skip this update” and killing all my Docker containers and losing my working context.&lt;/p&gt;

&lt;p&gt;I genuinely thank you Chrome for your replacement of the options menu with the word “Update” in soft red without taking away any functionality or using any significant space. I really appreciate your thoughtful and non-invasive prompt. This is a rare example of asking me to do something without inserting yourself between me and the work I am trying to do right now.&lt;/p&gt;

&lt;p&gt;Among the many things I have to decide today, I don’t think the choice of upgrading a wiki page to the new editor warrants an unclosable strobing purple and green circle in the footer during the entire time I’m making changes to a Confluence page.&lt;/p&gt;

&lt;p&gt;It is also my pleasure to inform Apple that they have managed to construct the least reliable computer I have touched since my Windows NT 4 dual Pentium III workstation from 2000. At least when it reboots itself every other week, as it did this morning, it restores all its windows mostly correctly instead of just turning blue and saying “IRQL NOT LESS OR EQUAL”.&lt;/p&gt;

&lt;p&gt;Lever, I’m sure the fact that I have not integrated my email and calendar with your service is lowering someone’s KPIs but an undismissable overlay on every page is not a great way to make me care.&lt;/p&gt;

&lt;p&gt;And, as a special bonus, thank you Google for the modal “Getting Started” pop-up you showed me as I was collecting my notes to write this post. It is great that you replaced the perfectly adequate Hangouts with some other, probably also perfectly adequate but Totally New, thing that I have to spend time clicking through cheery screens to learn about.&lt;/p&gt;

&lt;p&gt;For a week I kept track of all the things that appeared and forced me to deal with them before I could return to work. Somewhere in the past few years I feels like my computer changed from doing work for me to asking me to do work for it.&lt;/p&gt;

&lt;p&gt;And in case you don’t see yourself mentioned by name, I’d like to tell you from the very bottom of my heart that I will &lt;em&gt;never&lt;/em&gt; want your newsletter.&lt;/p&gt;
</description>
				<pubDate>Mon, 23 Aug 2021 22:26:00 +0000</pubDate>
				<link>http://mjcollin.github.io/2021/08/no</link>
				<guid isPermaLink="true">http://mjcollin.github.io/2021/08/no</guid>
			</item>
		
			<item>
				<title>Red Light Runners</title>
				<description>&lt;p&gt;Since moving, my commute is along Gainesville’s back streets running perpendicular to
main roads. It’s quiet if a bit ponderous but there are an enormous number of people
who run red lights at the cross streets. Cellphoners, lemon sqeezers, delivery people,
I see at least 2 a week and I only make 10 trips to and from work.&lt;/p&gt;

&lt;p&gt;So I bought a dash cam and installed it this weekend. For your entertainment this 
Tuesday (note it took 2 days to capture my first) here is today’s red light runner.&lt;/p&gt;

&lt;p&gt;I’ll work in putting up a gallery :)&lt;/p&gt;

&lt;p&gt;@GainesvillePD&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/dashcam/2018_0325_18014_scene00690_sm.png&quot; alt=&quot;red light 1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;First frame when the light turned green and they’re barely even at the stop line and
traveling full speed.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/dashcam/2018_0325_18014_scene01260_sm.png&quot; alt=&quot;red light 2&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Finally exiting the intersection 3 seconds later.&lt;/p&gt;
</description>
				<pubDate>Wed, 28 Mar 2018 00:00:00 +0000</pubDate>
				<link>http://mjcollin.github.io/2018/03/red-light-runners</link>
				<guid isPermaLink="true">http://mjcollin.github.io/2018/03/red-light-runners</guid>
			</item>
		
			<item>
				<title>Evacuation of South Florida Due to Irma, on a Traffic Cam</title>
				<description>&lt;p&gt;Hurricane Irma was forcast to hit Miami and work it’s way up the whole state. A lot of people decided to leave and there wasn’t really any place to go except north. I live in Gainesville, right on one of the two north-south interstates in the state - I75. Our city runs traffic cameras and the make current images available on a &lt;a href=&quot;http://gac-smartraffic.com/&quot;&gt;SmartTraffic&lt;/a&gt; site. A few months ago I wrote a script to pull all the images once a minute so I have a history of all the “current” images.&lt;/p&gt;

&lt;p&gt;I thought it would be fun to stich them together to make a time-lapse video of the interstate. I started it around Sept 1 so you can see normal traffic, the evacuation rush starts around 9/6, and it runs up until the traffic system crashed at 1:45 am on Monday morning which is about 15 minutes after the peak winds were forcast to hit.&lt;/p&gt;

&lt;p&gt;Video on Youtube:&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/u1P1jwD-Hts&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Some details about how this was made:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The I75 cameras are movable with 4 pre-programmed positions. They take one picture per minute so there’s one image about every 4 minutes. You’ll also see some times when the camera didn’t properly return to it’s pre-programmed position.&lt;/li&gt;
  &lt;li&gt;The orientation of the camera isn’t saved in the image metadata (who would have thought that would be useful!) but it is displayed in the image. I OCR’ed the orientation from a crop in the image with pyocr and tesseract. It was pretty good but you’ll see some stray images from other positions where the OCR messed up. I’m not a tesseract wizard.&lt;/li&gt;
  &lt;li&gt;There are gaps in the images for a number of reasons. Sometimes the camera goes out. Sometimes the images are partial downloads since I’m pulling a jpg off a web server every minute and they’re uploading to the same file name every minute. I get about 5% corrupt or partial files.&lt;/li&gt;
  &lt;li&gt;The final image is just the last image uploaded off the camera before it died. It just happened to be in the right orientation so for the last 2 days I was pulling the same image of their web site. Its all a hack.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So far I have download ~40 cameras worth of data since February 2017 every minute for a total of about 750 GB and 16 million images. Not sure what else I’ll do with them.&lt;/p&gt;
</description>
				<pubDate>Thu, 14 Sep 2017 02:00:00 +0000</pubDate>
				<link>http://mjcollin.github.io/2017/09/irma-evacuation</link>
				<guid isPermaLink="true">http://mjcollin.github.io/2017/09/irma-evacuation</guid>
			</item>
		
			<item>
				<title>Finally Graduated</title>
				<description>&lt;p&gt;And here it is almost a year since my last post but I now have something 
worthwhile again. Below is my application essay for the Industrial and Systems 
Engineering department’s Patterson award at UF. I felt it was a good
summary of what I’ve done over the course of my studies at the 
University of Florida on my way to finishing my Masters’s in Industrial
Engineering.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;As a non-traditional student, the Industrial Engineering Master’s program at the University of Florida has been a transformative experience. I took classes part time for three years and the longer time scale provided me with an opportunity to relate each class in turn to my career. It allowed time for my connection to the UF community to become much stronger by providing more opportunity to interact with multiple cohorts of students across many semesters. My degree, and the experiences it represents, have given me new opportunities in my current job and will allow me to direct my career towards my goal of doing open data science research with the biodiversity community in the future.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;The Industrial Engineering master’s degree program at UF offers flexibility. After I found a new interest in data science during the operations research course, I was able to take related courses in the Computer and Information Science and Engineering department. The courses in Algorithmic Economics and Bioinformatics provided specific applications of the mathematics and statistics from the core Industrial Engineering courses. During my final semester I completed a Special Projects class supervised by Dr. Panos Pardalos. I presented my project titled “Towards Mining Whole Museum Collections Datasets for Expanding Understanding of Natural History Collections” to an audience of industrial engineering graduate students and biodiversity professionals. I truly enjoy bringing together diverse groups and helping them find where their interests overlap.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;The most significant contribution I made to the UF community was helping to found the Data Science and Informatics student organization (DSI). My role in DSI has been a blend of both student-learner and advisor. My knowledge and enthusiasm towards data science was similar to the other student members and we learned as peers during workshops and joint projects. I have also been able to bring my computing, managerial, and institutional knowledge to the group in an advisory capacity. While the student officers picked the direction of the group, I provided them with techniques for hosting great events, technical infrastructure, and faculty participants for their events. Along with everyone else’s enthusiasm and hard work, my contributions have been critical to building a wildly successful data science community which has grown to more than 500 members in just one year.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;After graduating this spring, I will be continuing in my current position at the Advanced Computing and Information Systems Lab in the Electrical and Computer Engineering department. After discussions with the lab’s director, I am now responsible for producing collaborations that tie the research done within our lab to research done in other domains. One of the first examples of this will be extending my final project to include collaborators from the biodiversity informatics community. We are expecting to present a platform that allows biologists to use big data analytics tools like Apache Spark on museum collections data at conferences in Berlin and Costa Rica later this year.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is documentation of me presenting my final project titled &lt;a href=&quot;https://github.com/mjcollin/2016spr&quot;&gt;“Towards Mining Whole Museum Collections Datasets for Expanding Understanding of Natural History Collections”&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/proj_pres.jpg&quot; alt=&quot;Final Presentation&quot; /&gt;&lt;/p&gt;
</description>
				<pubDate>Wed, 27 Apr 2016 22:21:00 +0000</pubDate>
				<link>http://mjcollin.github.io/2016/04/masters-grad</link>
				<guid isPermaLink="true">http://mjcollin.github.io/2016/04/masters-grad</guid>
			</item>
		
			<item>
				<title>Why a Software Carpentry Instructor</title>
				<description>&lt;p&gt;The University of Vermont’s &lt;a href=&quot;https://www.uvm.edu/~rgweb/catalogue/9394cat_ug.pdf&quot;&gt;1993-94 undergraduate catalogue&lt;/a&gt;
lists CS 011 &lt;em&gt;Computer Programming I&lt;/em&gt; as a first semester course for freshman in the
civil engineering bachelor’s program. I however entered UVM in the fall of 1993 as an
environmental studies major so I did not take it. When I switched to civil engineering
the next year, the recommended programming course &lt;a href=&quot;https://www.uvm.edu/~rgweb/catalogue/9495cat_ug.pdf&quot;&gt;had changed&lt;/a&gt;
to CS 016 &lt;em&gt;Programming in MATLAB&lt;/em&gt; and as Frost said, that has made all the difference.&lt;/p&gt;

&lt;p&gt;That course was a new addition taught for the first time by &lt;a href=&quot;http://www.cs.uvm.edu/~meppstei/&quot;&gt;Maggie Eppstein&lt;/a&gt;.
She was a lecturer in 1994 but is now the UVM computer science department chair.
This was my first experiance programming and it was a revelation. I fell in love 
with the act of creating something that worked just the way I wanted using a langage
that was completely logical. Every programming concept Maggie introduced just
seemed obvious and natural. I don’t remember ever studying or reviewing anything
after lectures, I just did the programming homework in a couple hours and aced
all the exams.&lt;/p&gt;

&lt;p&gt;I got an A+ in the class (nerd!) and enjoyed it so much that I signed up to be a TA
the next semster. For 5 to 10 hours a week I sat in office hours working through 
homeworks with struggling students and ran around in the hands-on labs trying to keep
everyone caught up with Maggie who would be scrawling code on the whiteboard. I kept 
TA’ing that course for 5 semesters until I graduated. It was the first job that I 
chose to persue myself - no parents involved.&lt;/p&gt;

&lt;p&gt;I have been thinking about my experiance for two reasons: first because I read 
&lt;a href=&quot;http://www.uvm.edu/~cems/cs/?Page=news&amp;amp;storyID=20711&amp;amp;category=cemscs&quot;&gt;this article&lt;/a&gt;
in the Spring 2015 UVM College of Engineering and Mathmatical Sciences Summit 
newsletter. The protagonist, Caitlyn Bishop, is a former biology major at UVM who 
took the same course nearly 20 years later as an elective and also fell in love 
with programming. She ended up switching to math and computer science as a result 
of her acidental discovery. I was supprised by how coincidently similar her 
discovery of programming was and I started wondering how often this happens.&lt;/p&gt;

&lt;p&gt;The second is that I just went through the &lt;a href=&quot;https://software-carpentry.org/&quot;&gt;Software Carpentry&lt;/a&gt;
instructor training program. In our final conference call, &lt;a href=&quot;http://www.third-bit.com/&quot;&gt;Greg Wilson&lt;/a&gt;
said something along the lines of “Congratulations on completing your training,
now let’s get you signed up to teach some workshops.” This was the moment where
I started to wonder “Wait, what did I just volunteer for?”&lt;/p&gt;

&lt;p&gt;The answer to that is that I volunteered to help people decide if programming is
for them. That is really what I enjoyed about TA’ing MATLAB and that is what I
want to have an opportunity to do again.&lt;/p&gt;

&lt;p&gt;And maybe like Caitlyn, some SwC students can find out early what they are
truely interested in to make the most their time in college or early careers.
I haven’t designed a beam in 20 years and I’m still catching up on basic math 
and computer science concepts because I didn’t follow the programming road on
to where I should have: computer science.&lt;/p&gt;

&lt;h3 id=&quot;some-more-fun-college-computing-stories&quot;&gt;Some more fun college computing stories:&lt;/h3&gt;

&lt;p&gt;When came for my orientation, the engineering school made a big deal about how they
had just finished upgrading the 386’s in the main computer lab with DX co-processors 
so they could use the new 3-D drafting appliations.&lt;/p&gt;

&lt;p&gt;Sophomore year was the first year UVM offered wired network connections in dorm rooms.
But they blocked IPX networking which DOOM used for multi-player so we bought thin-net 
coax network cards (no expensive hub required!) and ran cables down the halls to
network our computers together.&lt;/p&gt;

&lt;p&gt;The day I got my computer in my dorm room hooked up to the Internet, one of my 
friends cam over and started showing me gopher and FTP sites. Some time during that
session I started wondering if I could some how limit my paper topics to just 
subjects that I could find references for on FTP sites so I wouldn’t have to go
to the library ever again. I don’t think I ever checked out a book in my 4 years
at UVM.&lt;/p&gt;

&lt;p&gt;At the start of what must have been the second mid-term in Maggie’s MATLAB class,
she walked in with a pillow case half filled with Halloween candy. Apparently she
had some sort of disciplinary issue with her kids and they had their candy 
confiscated. She brought it in for us since she couldn’t eat it all. To this 
day I always feel just a touch let down when I walk in to an exam and there is 
no candy.&lt;/p&gt;

</description>
				<pubDate>Sat, 30 May 2015 19:15:00 +0000</pubDate>
				<link>http://mjcollin.github.io/2015/05/swc-instructor</link>
				<guid isPermaLink="true">http://mjcollin.github.io/2015/05/swc-instructor</guid>
			</item>
		
			<item>
				<title>Bus Factor Valuation</title>
				<description>&lt;p&gt;Probably most IT folks are familiar with the “&lt;a href=&quot;http://en.wikipedia.org/wiki/Bus_factor&quot;&gt;bus factor&lt;/a&gt;”
or “the lottery factor” if you prefer to think of good things happening to your
coworkers. It’s the number of people who can get hit by a bus (or retire to a 
Carribean Island) before a project is doomed because no one knows how anything
works.&lt;/p&gt;

&lt;p&gt;The question is, what is a good bus factor? For really small projects it’s 
simply going to be 1 and that is just the way it is. Hiring two people who both
have complete knowlege of one job is just too expensive and the project simply
won’t happen. For a larger project, how do you know whether 3 or 5 or 10 is 
appropriate?&lt;/p&gt;

&lt;p&gt;Enter the &lt;strong&gt;Bus Factor Valuation Formula&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://arachnoid.com/latex/?equ=%5Ctext%7Bactual%20value%7D%20%3D%20%5Ctext%7Bdesired%20value%7D%5Ctimes(1%20-%20%5Cfrac%7B1%7D%7Bbus%20factor%7D)%0A&quot;&gt;&lt;img src=&quot;/images/bus_factor_valuation_eq.png&quot; alt=&quot;actual value = desired value * (1 - 1/bus factor)&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From a graph of that last term you can see that this is a pretty harsh 
function for small teams:&lt;/p&gt;

&lt;p&gt;[&lt;img src=&quot;/images/bus_factor_valuation_graph.png&quot; alt=&quot;Bus Factor Valuation graph&quot; /&gt;]
(https://www.desmos.com/calculator)&lt;/p&gt;

&lt;p&gt;If only one person knows how everything works, your project is worth nothing.
Even with 2 people knowing how your project works, your project is really
only worth half of what you want it to be. Past 4 or 5 people the value 
flattens out fast. If you want to get more than 80% of what you think your
project is worth, you need to start thinking about redundant teams, not
redundant people.&lt;/p&gt;

&lt;p&gt;I won’t make any statements about the fact that this equation imples every
project is &lt;a href=&quot;http://finance.yahoo.com/echarts?s=^NDX+Interactive#{&amp;quot;range&amp;quot;%3A&amp;quot;max&amp;quot;%2C&amp;quot;scale&amp;quot;%3A&amp;quot;linear&amp;quot;}&quot;&gt;worth less than anyone thinks it is&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here is my coworkers’ take on this idea:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/bus_factor_whiteboard.jpg&quot; alt=&quot;Bus Factor Whiteboard&quot; /&gt;&lt;/p&gt;

</description>
				<pubDate>Thu, 30 Apr 2015 01:15:00 +0000</pubDate>
				<link>http://mjcollin.github.io/2015/04/bus-factor-valuation</link>
				<guid isPermaLink="true">http://mjcollin.github.io/2015/04/bus-factor-valuation</guid>
			</item>
		
	</channel>
</rss>
