Nik Kantar 2020-01-16T00:00:00Z Nik Kantar https://nkantar.com/ DogTown CrossFit Blog — Member Feature: Me! I lost a buttload of weight and got a cool shoutout on my gym's blog, and it's hard not to brag. https://nkantar.com/blog/dogtown-feature 2020-01-16T00:00:00Z <p>I lost a buttload of weight in 2019 (dedicated post forthcoming) and I got featured on my <a href="https://dogtowncrossfit.com/blog/2020/01/14/member-feature-nik-kantar/">gym's blog</a>, so I thought I'd brag a bit.</p> <p><img src="/static/media/2020/01/dogtown-feature.jpg" alt="Me"></p> Goals for 2020 Ahead of the curve this time, a look forward at what I'm hoping to accomplish professionally in 2020. https://nkantar.com/blog/goals-for-2020 2019-12-20T00:00:00Z <p>I've been publishing professional goals and review for four years now, and 2020 shall be no different.</p> <h2>1. Make <em>PyBeach</em> Happen</h2> <p>A reprise of the only <a href="/blog/goals-for-2018" title="Goals for 2018">2018</a> goal, this time for realsies! Check out <a href="https://2020.pybeach.org" title="PyBeach 2020"><em><strong>PyBeach.org</strong></em></a> for details!</p> <h2>2. Migrate My Projects</h2> <p>I have a few projects out in the wild and most of them need to be updated and migrated. I already wrote about <a href="/blog/simple-is-funner-than-complex" title="Simple Is Funner than Complex | Nik Kantar">how I plan on doing it</a> and <a href="https://github.com/nkantar/nkantar.com" title="nkantar/nkantar.co m">got started</a>, and should be able to complete it all by the end of the year. Fingers crossed!</p> <h2>3. <em>Actually</em> Start a Newsletter</h2> <p>This will probably come as a surprise to the vast majority reading this, but I actually have a <a href="/newsletter" title="Newsletter | Nik Kantar">newsletter</a>. Well, I have something you can sign up for—joining the eight fine individuals who already have—but I've never sent one, ever. Hey, at least you can't reasonably accuse me of spamming.</p> <p>Anyway, I'd like to get this thing off the ground this year. Now that I'm writing more in general, the reflext to compile content for it should come fairly easily. The aforementioned site rewrite might bring along a bit of tooling to help as well.</p> <h2>4. Complete a Hardware Project</h2> <p>I've built a fair bit of software at this point. A lot of it is dead (for various definitions of "dead"), much of it was for work (and thus proprietary), and I've got some living projects out in the wild. My <a href="https://github.com/nkantar/" title="nkantar on GitHub">GitHub profile</a> has some of the open source highlights and is constantly growing. But it has nothing about hardware whatsoever, predictably.</p> <p>I've gotten some <a href="https://circuitpython.org/" title="CircuitPython">CircuitPython</a> goodies from <a href="https://www.adafruit.com/" title="Adafruit Industries, Unique &amp; fun DIY electronics and kits">Adafruit</a> the last two PyCons, and they've been <a href="https://twitter.com/nkantar/status/1125178131172745216" title="nkantar on Twitter">a lot of fun</a> right from the start. I've had a number of ideas of varying degrees of silliness, but haven't followed through on any. 2020 is the year I build a thing—may the good FSM help us all…</p> <h2>5. Explore a New Sphere Within Software</h2> <p>In the past I've fairly explicitly defined what I wanted to learn:</p> <ul> <li>In <a href="/blog/goals-for-2016" title="Goals for 2016">2016</a> I wanted to pick up a new language, and it—accidentally!—<a href="/blog/goals-for-2016-in-review" title="Goals for 2016 in Review">ended up being Vimscript</a>.</li> <li>In <a href="/blog/goals-for-2017" title="Goals for 2017">2017</a> I decided to learn how to properly touch type, and that <a href="/blog/goals-for-2017-in-review" title="Goals for 2017 in Review">didn't really happen</a>.</li> <li>In 2017 I wanted to learn a new programming paradigm, but didn't get to it.</li> <li>In 2017 I also wanted to specifically significantly improve my Python skillset, and that I accomplished.</li> <li>In <a href="/blog/goals-for-2019" title="Goals for 2019">2019</a> I hoped to learn a useful amount of frontend, and that <a href="/blog/goals-for-2019-in-review" title="Goals for 2019 in Review">absolutely didn't happen</a>.</li> </ul> <p>For 2020 I want to be less specific, largely because nothing comes to mind as a particular to-do item. Sure, I could pick up one of the previous misses—except touch typing, which getting an <a href="https://ergodox-ez.com/" title="ErgoDox EZ: An Incredible Mechanical Ergonomic Keyboard">ErgoDox EZ</a> earlier this year solved—but where's the fun in that? I'd rather do something <em>fresh and exciting</em> instead.</p> <p>Perhaps this year I'll spend some time looking at this whole machine learning thing. Or maybe I'll end up becoming a cloud expert (likely thanks to <a href="https://www.sweetgreen.com/" title="sweetgreen | Inspiring healthier communities">work</a>). Or I might finally spend more than five minutes with <a href="https://www.rust-lang.org/" title="Rust Programming Language">Rust</a>, turning me into a low-level programmer out of nowhere. Or I may write a native mobile app. <em><del>The world</del> Software is my oyster.</em></p> <h2>In Conclusion</h2> <p>2020 is going to be a <em>great</em> year.</p> Goals for 2019 in Review 2019 is just about done—let's wrap it up. https://nkantar.com/blog/goals-for-2019-in-review 2019-12-17T00:00:00Z <p>I thought I'd mix things up for change by doing this <em>before</em> the year is over. After all, it's already December 17<sup>th</sup>, and little is likely to change at this point. You can find the original goals <a href="/blog/goals-for-2019" title="Goals for 2019">here</a>.</p> <p>First, the scorecard:</p> <ol> <li>Get Back into Open Source: &#x02713;</li> <li>Write More!: &#x02713;</li> <li>Read Some Tech Books: &#x02717;</li> <li>Learn a Useful Amount of Frontend: &#x02717;</li> <li>Give More Talks: &#x02713;</li> </ol> <p><em>Score: 3/5</em></p> <h2>1. Get Back into Open Source: &#x02713;</h2> <p>It happened!</p> <p>I didn't make quite as much progress as I had hoped I would, but some forward movement <em>did</em> occur:</p> <ul> <li><a href="https://github.com/nkantar/Parsenvy" title="nkantar/Parsenvy: Enviously Elegant Environment Variable Parsing">Parsenvy</a> got <a href="https://github.com/nkantar/Parsenvy/pull/9" title="Windows by nkantar · Pull Request #9 · nkantar/Parsenvy">Windows CI</a> and <a href="https://github.com/nkantar/Parsenvy/pull/11" title="v3 [WIP] by nkantar · Pull Request #11 · nkantar/Parsenvy">v3</a> is nearly done.</li> <li><a href="https://starminder.xyz/" title="Starminder">Starminder</a> v2 is in progress (I've started sketching out the redesigned flow, but have written no code yet.)</li> <li>I launched <a href="https://wendlerizer.com/" title="Wendlerizer">Wendlerizer</a>.</li> <li>I submitted some minor PRs to a few projects, but—somewhat notably—some of that work was done on my employer's dime. Hooray for <a href="https://www.sweetgreen.com/" title="sweetgreen | Inspiring healthier communities">sweetgreen</a>!</li> </ul> <p>It's not quite the mad flurry I was hoping—if not expecting—to achieve, but I'm glad to have completed something of consequence. Honestly, I'm perhaps most excited about having gotten to do some of it at work, starting to give back to the world on which I and all my employers have built so much.</p> <h2>2. Write More!: &#x02713;</h2> <p>Oh, this <em>definitely</em> happened!</p> <p>I've got at least one other post slated for publishing before the year is up. That will break past the previous record of ten in 2015, 2017, and 2018. I think they've been more worthwhile on average, too.</p> <p>I've also written elsewhere, namely in a journal I started keeping. It had been a long while since I last did something like that, so I thought I'd see if I can get the habit going, and whether I then care to continue it. Results were great at first, but I've lately fallen off the train. I think I'll get back to it, starting tonight.</p> <h2>3. Read Some Tech Books: &#x02717;</h2> <p>Nope. I even bought some (more).</p> <h2>4. Learn a Useful Amount of Frontend: &#x02717;</h2> <p>It should come as no surprise that this one went absolutely nowhere.</p> <p>In 2019 I made a mental switch from "web dev" to "software dev", which only pushed me further away from any notion of "full-stack" in the traditional web sense. With this disappeared much of my desire to keep up with frontend tech (i.e., the JS ecosystem), so this is no longer really a relevant goal.</p> <p>I expect I'll actually tick this box when I need it for a real project I truly care about, be it for work or otherwise.</p> <h2>5. Give More Talks: &#x02713;</h2> <p>We've come to the crown jewel of this year('s goals).</p> <p>In 2018, I gave one <a href="http://nkantar.com/talks" title="Talks | Nik Kantar">talk</a> at <a href="https://www.meetup.com/Write-the-Docs-LA/" title="Write the Docs Los Angeles (Los Angeles, CA) | Meetup">one meetup</a>. In 2019, I gave that same talk at <a href="https://socalpython.org/" title="SoCalPython.org">another meetup</a> and <a href="https://www.pyohio.org/2019/" title="PyOhio 2019">a conference</a>. I also gave a lightning talk at the same conference, totally on a whim (and bombing spectacularly). I'll share the links soon, I promise.</p> <h2>Past Years</h2> <ul> <li><a href="/blog/goals-for-2018" title="Goals for 2018">2018 goals</a>, <a href="/blog/goals-for-2018-in-review" title="Goals for 2018 in Review">2018 review</a>, score: 0/1</li> <li><a href="/blog/goals-for-2017" title="Goals for 2017">2017 goals</a>, <a href="/blog/goals-for-2017-in-review" title="Goals for 2017 in Review">2017 review</a>, score: 1/5</li> <li><a href="/blog/goals-for-2016" title="Goals for 2016">2016 goals</a>, <a href="/blog/goals-for-2016-in-review" title="Goals for 2016 in Review">2016 review</a>, score: 4/5</li> </ul> Simple Is Funner than Complex I think I've figured out why I've been having such a hard time starting to migrate my projects to the cloud. https://nkantar.com/blog/simple-is-funner-than-complex 2019-12-10T00:00:00Z <p>About half a decade ago, I distinctly remember wishing I had my own side projects that other people used. These days that's my reality, as I've got some tools and a few living deployed web applications out in the wild. Here are the ones relevent to this post:</p> <ul> <li><a href="https://nkantar.com/">nkantar.com</a> is my personal site</li> <li><a href="https://starminder.xyz/">Starminder</a> reminds you about your starred <a href="https://github.com/">GitHub</a> projects</li> <li><a href="https://www.sendotterlove.com/">SendOtterLove</a> brings otters and puns to your loved ones</li> <li><a href="https://pybeach.org/">PyBeach.org</a> is a redirect to the <a href="https://2020.pybeach.org/">PyBeach 2020</a> site</li> <li><a href="https://nik.pub/">nik.pub</a> is barely a URL shortener</li> </ul> <p>Since I'm <em>v. lazy</em>, these are all currently deployed on <a href="https://heroku.com/">Heroku</a>, which is a wonderful, exceedingly painless hosting service. It's also quite expensive for my particular use case.</p> <p>The above projects cost me a total of $42 per month:</p> <ul> <li>nkantar.com requires one web <a href="https://www.heroku.com/dynos">dyno</a> to run the <a href="https://www.palletsprojects.com/p/flask/">Flask</a> app</li> <li>Starminder requires two dynos—one for the Flask app, and one for the task runner</li> <li>SendOtterLove is a single-dyno <a href="https://www.djangoproject.com/">Django</a> app</li> <li>PyBeach.org is a single-dyno micro-app</li> <li>nik.pub is also a single-dyno Django app</li> </ul> <p>Heroku charges $7 per dyno per month for the base paid tier ("Hobby"), which is required for constant uptime (free dynos sleep 6 hours per day) and SSL (<em>https</em> is a hard requirement for some of the above apps, and I'm quite fond of it anyway). I find this to be a very reasonable pricing model, if you want to deploy things that, uhh, get used.</p> <p>But my projects don't really get all that much attention. Traffic on all of the above is nearly nonexistent, averaging less than one request per second:</p> <p><a href="/static/media/2019/12/heroku-stats.png" title="Heroku stats"><img src="/static/media/2019/12/heroku-stats.png" alt="Heroku stats" title="Heroku stats"></a></p> <p>But I like them all, and don't want them to go away. I'm also unwilling to compromise uptime or SSL to drop down to the free dyno tier.</p> <p>Given that the performance requirements for all of the above are also nearly nonexistent, I've always thought something as minimal as <a href="https://aws.amazon.com/lambda/">AWS Lambda</a> would make for a perfect hosting platform. Now that I use Lambda at work a fair bit, that belief has only been reinforced. Relatedly, I have some <a href="https://aws.amazon.com/">AWS</a> credit I'd like to use, especially as I'd wager that everything I have would fit into the free tier for most services I'd harness, giving me oodles of free hosting.</p> <p>So why, then, have I struggled <em>so much</em> to carve out the reasonably small amount of time and energy required to migrate these—or even just one of them—over?</p> <p>I think the answer is a bit deeper than the reflexive and superficial guess of "well, I <em>am</em> lazy" or "if it ain't broke, don't fix it".</p> <h2>Side Projects vs. Day Job</h2> <p>Software I write on my own time generally doesn't serve any work related purpose and isn't expected or even meant to get me paid directly. Most of it is <a href="https://github.com/nkantar">open source</a>, and it's a mix of web apps, libraries, and other miscellaneous stuff. It's all at least somewhat important to me.</p> <p>A side project is by necessity of lower priority than the work I do at my day job. I quite like said job and find the work itself very rewarding. While I'm unwilling to compromise my ability to write software on my own time, I don't subject my job to any negative effects that could have. In short, work always comes first.</p> <p><a href="https://www.sweetgreen.com/">sweetgreen</a> lives on AWS, so my work involves thinking through a lot of cloud related things. I'm no longer contributing to monoliths deployed on servers, but orchestrating services running on some combination of Lambda, containers, and managed services. Much of my job now is understanding the landscape of available tools and how to best glue them together to get the built-in advantages. I spend less time than ever actually writing application code.</p> <p>This isn't necessarily a bad thing at all. I enjoy systems design and architecture—it's very challenging and rewarding work. The benefits of the cloud approach are pretty stellar much of the time as well—AWS really provides an awful lot services I don't have to manage at all, and that's great. But it doesn't feel playful or simple just about ever. And I miss that.</p> <h2>Work vs. Play</h2> <p>Many moons ago, when I still very much called myself a web developer, I generally thought of myself as "full-stack". Even though I'd done enough SysAdmin work to get things up and running, this mostly referred to my ability and desire to write code for both the server and the client in the context of web apps. Depending on which one I was working with for the most part at my day job at any given time, I tended to play with the other after hours. This kept me engaged and fulfilled without feeling negatively about work, which may have slanted heavily on occasion.</p> <p>It's now been some time since I've thought of myself as a web dev, and much longer since I last used the phrase "full-stack" to describe what I do—or want to do. Lately I've invested energy into organizing events instead of writing software, which has left work as the only place where the engineering parts of my mind get a workout. I haven't felt like that in and of itself is a problem, but I do think that a different kind of separation is something I miss.</p> <p>With the <em>complexity</em> I already tackle daily, I think I may be craving <em>simplicity</em>.</p> <h2>Now What?</h2> <p>I bet this explains why I've been so reluctant to dive into migrating my projects to AWS: I don't really want to deal with the complexity of rearchitecting everything and then managing that over time. I just want to write some Python and share the results with other people. To paraphrase the third line of <a href="https://pep20.org#simple">my favorite PEP</a>, simple is <del>better</del> funner than complex.</p> <p>In light of this, I think I'm going to adopt an anti-cloud approach for these apps. I can probably rearchitect them all as fairly simple Django projects and deploy them on Lambda or <a href="https://aws.amazon.com/ecs/">ECS</a> (if it turns out to be simple enough), or even <a href="https://aws.amazon.com/ec2/">EC2s</a> (if it doesn't). Not flashy, cool, or full of new things to learn, no. But likely to be simple, enjoyable, and easy to maintain. Given that these are products that cost me time while netting very little in return, this feels like the correct trade-off.</p> <p>We'll see if I'm right soon enough.</p> <p><img src="/static/media/2019/12/computer-cat.jpg" alt="Computer cat" title="Computer cat"></p> <p><a href="https://www.pexels.com/photo/black-cat-holding-persons-arm-1049764/">"Black Cat Holding Persons Arm" by Ruca Souza on Pexels</a></p> Keynotes to Watch I think everyone should watch these two keynotes, but especially those of us working in tech. https://nkantar.com/blog/keynotes-to-watch 2019-11-11T00:00:00Z <p>I happen to think these two keynotes are something <em>everyone</em> should watch, and I don't make that claim lightly. Without exaggeration, I teared up during these at both PyCon and North Bay Python.</p> <p>Best enjoyed in order as delivered.</p> <h2>Shadeed "Sha" Wallace-Stepter — "From Prison to Python"</h2> <iframe style="display: block; margin: auto; max-width: 100%;" width="560" height="315" src="https://www.youtube.com/embed/jNBsrLzHVgM" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><h2>Jessica McKellar — "Mass Decarceration"</h2> <iframe style="display: block; margin: auto; max-width: 100%;" width="560" height="315" src="https://www.youtube.com/embed/hyd6MiWXSP4" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> Write More Write more. https://nkantar.com/blog/write-more 2019-10-09T00:00:00Z <p><a href="/static/media/2019/10/write-more1.jpg"><img src="/static/media/2019/10/write-more1.jpg" alt="Write more"></a></p> <p><a href="/static/media/2019/10/write-more2.jpg"><img src="/static/media/2019/10/write-more2.jpg" alt="Write more"></a></p> <p><a href="/static/media/2019/10/write-more3.jpg"><img src="/static/media/2019/10/write-more3.jpg" alt="Write more"></a></p> Free (from) Project Ideas I'm letting some domains expire because I have neither the time nor desire to build what I wanted, so here you go. https://nkantar.com/blog/free-from-project-ideas 2019-08-08T00:00:00Z <p>I've been <del>mildly</del> addicted to domain names for about a decade and a half at this point. For the better part of the last few years I've always had 15–20 registered, and next year that will drop to 10. Seeing as how I once already shared a <a href="/blog/free-project-startup-ideas" title="Free Project/Startup Ideas">list of free project/startup ideas</a>, I wanted to follow up in a sense.</p> <p>Some actual ideas:</p> <ul> <li><strong>armchairgp.com</strong> (expires 2/10/2020) — fantasy motorsport</li> <li><strong>feed.ist</strong> (expires 9/21/2019) — service for sharing feed subscriptions (newsfeeds, podcasts, etc.)</li> <li><strong>themixneverdies.com</strong> (expires 6/3/2020) — webapp for submitting continuous DJ mixes from Spotify for surfacing in a global playlist</li> <li><strong>vimfeed.org</strong> (expired 8/1/2019) — combined multifeed for Vim related blogs, akin to a <a href="https://en.wikipedia.org/wiki/Planet_(software)" title="Planet (software) - Wikipedia">Planet</a></li> </ul> <p>The remaining domains, which never had anything interesting attached to them even in theory:</p> <ul> <li><strong>404.ninja</strong> (expires 12/30/2019)</li> <li><strong>funatparti.es</strong> (expires 8/23/2019)</li> <li><strong>pyhelp.org</strong> (expires 4/29/2020)</li> <li><strong>snarkexchange.com</strong> (expires 6/7/2020)</li> <li><strong>typeislove.com</strong> (expires 4/19/2020)</li> </ul> <p>Have at it!</p> I'm Speaking at PyOhio 2019! Look, I'm just bragging… https://nkantar.com/blog/im-speaking-at-pyohio-2019 2019-06-12T00:00:00Z <p><em>My talk submission got accepted at PyOhio 2019, woohoo!</em></p> <p><img src="/static/media/2019/06/pyohio2019.jpg" alt="PyOhio 2019"></p> <p>OK, now that I've taken a deep breath, I should probably tell you it's the one I gave at <a href="https://github.com/nkantar/talks/tree/master/2018/10/wtdla/todo_add_comments" title="# TODO: add comments: 5 Tips for Winning at Code Comments | Write the Docs LA, October 2018">Write the Docs LA in October</a> and <a href="https://github.com/nkantar/talks/tree/master/2019/02/socalpython/todo_add_comments" title="# TODO: add comments: 5 Tips for Winning at Code Comments | SoCal Python, February 2019">SoCal Python in February</a>. I'll revise and expand it a bit to fill the time slot better, but it'll essentially be the same content.</p> <p>I'm obviously <em>v. excited</em> because of course I am. Also, I now have a <a href="https://www.pyohio.org/2019/speakers/251" title="PyOhio 2019 Speaker: Nik Kantar">speaker bio</a> and <a href="https://www.pyohio.org/2019/presentations/135" title="PyOhio 2019 Presentation: # TODO: Add Comments: 5 Tips for _Winning_ at Code Comments">talk page</a>.</p> <p>This edition will be recorded, which is great, since the slides themselves aren't as fun to peruse, and I occasionally want to share this with someone.</p> <p>If you plan on being at PyOhio, let me know!</p> See You at PyCon 2019 PyCon 2019 is here and so are we. https://nkantar.com/blog/see-you-at-pycon-2019 2019-05-01T00:00:00Z <p><a href="https://us.pycon.org/2019/" title="PyCon 2019">PyCon 2019</a> is here!</p> <p>Strictly speaking, it's already begun, but I'm only attending the talks this year again. I know, I know—I keep saying I'll attend the sprints and then don't.</p> <p>I'm flying into Cleveland tomorrow (Thursday) night, and flying out Monday morning.</p> <p>If you're reading this and are going, say hi via <a href="https://twitter.com/nkantar" title="nkantar on Twitter">Twitter</a> or <a href="mailto:nik@nkantar.com" title="nik@nkantar.com">email</a>!</p> <p>See you there! :]</p> Supporting Windows It's neither ethical nor smart to ignore about half of all Python users. https://nkantar.com/blog/supporting-windows 2019-02-15T00:00:00Z <p><img src="/static/media/2019/02/i-heart-windows.png" alt="I &lt;3 Windows"></p> <p>Last year I went to <a href="https://2018.northbaypython.org" title="North Bay Python 2018">North Bay Python 2018</a> and saw a lot of <a href="/blog/nbpy-2018-talks" title="North Bay Python 2018: Talks">really fantastic talks</a>. One of my favorites from the conference—and in general—was the very last, which closed out the weekend: Steve Dower's "<a href="https://2018.northbaypython.org/schedule/presentation/6/" title="Steve Dower: Python on Windows is Okay, Actually">Python on Windows is Okay, Actually</a>".</p> <p>In fact, I think it's so good and important that I'm going to embed it here, my anti-JS sentiment be damned:</p> <iframe style="display: block; margin: auto; max-width: 100%;" width="560" height="315" src="https://www.youtube.com/embed/0u04fm61LBc" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><p>There's also a <a href="https://talkpython.fm/episodes/show/191/python-s-journey-at-microsoft" title="Talk Python To Me Episode #191: Python&#39;s journey at Microsoft">Talk Python To Me episode</a> with him talking about some related things, and touching on the above in part. It's also very much worth listening, though it doesn't cover quite the same topic. I suggest you give it a chance, but the talk is more relevant to what I'm covering here.</p> <p>Now, I don't personally care about Windows. I haven't used it since XP was the main thing, and I'm perfectly fine with that. Back then I didn't do much development, and what I did was static sites and PHP, and even that usually via SFTP directly on a Linux server.</p> <p>I do, however, care about the Python community, because communities are made of <em>people.</em> And as we learned from Steve, quite a few of those people are using Windows. Trying to get them to switch is ridiculous both because it's patronizing and because it's impossible.</p> <p>I would instead much rather embrace them.</p> <p>Today I spent some time and made steps toward ensuring my two "serious" Python packages work on Windows. After some general cleanup, I added continuous integration on Windows to both, so now I get free test runs. It wasn't a lot of work, and it doesn't cost me a penny. Feel free to take a look at logs for both <a href="https://ci.appveyor.com/project/nkantar/Parsenvy/history" title="Parsenvy - AppVeyor">Parsenvy</a> and <a href="https://ci.appveyor.com/project/nkantar/Keysort/history" title="Keysort - AppVeyor">Keysort</a>.</p> <p>I was lucky enough that everything I did was already cross-platform, so tests passed right out of the box, but I was fully prepared to deal with whatever issues came up to get everything sorted out.</p> <p>Because I'm not comfortable writing software for only half the people who could theoretically use it. And you shouldn't be either.</p> <p>Steve, thank you for the motivation.</p>