<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DavidSGale.com</title>
	<atom:link href="https://davidsgale.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://davidsgale.com</link>
	<description>Creator of WriteTrack.cloud</description>
	<lastBuildDate>Mon, 05 Jan 2026 15:29:28 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>On Best Practices</title>
		<link>https://davidsgale.com/on-best-practices/</link>
					<comments>https://davidsgale.com/on-best-practices/#respond</comments>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Mon, 22 Sep 2025 15:25:00 +0000</pubDate>
				<category><![CDATA[Life Musings]]></category>
		<guid isPermaLink="false">https://davidsgale.com/?p=2015</guid>

					<description><![CDATA[A coworker asked me this morning about database design best practices&#8211;specifically, is it better to A) ensure important primary key values are consistent across environments (dev, test, prod) and store those values in constants, or B) to ensure that those rows are sufficiently unique so that the application can query the primary key values as&#8230;&#160;<a href="https://davidsgale.com/on-best-practices/" class="" rel="bookmark">Read More &#187;<span class="screen-reader-text">On Best Practices</span></a>]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="1021" height="574" src="https://davidsgale.com/wp-content/uploads/2026/01/1758574013569.png" alt="" class="wp-image-2016" srcset="https://davidsgale.com/wp-content/uploads/2026/01/1758574013569.png 1021w, https://davidsgale.com/wp-content/uploads/2026/01/1758574013569-300x169.png 300w, https://davidsgale.com/wp-content/uploads/2026/01/1758574013569-768x432.png 768w" sizes="(max-width: 1021px) 100vw, 1021px" /></figure>



<p class="wp-block-paragraph" id="ember644">A coworker asked me this morning about database design best practices&#8211;specifically, is it better to A) ensure important primary key values are consistent across environments (dev, test, prod) and store those values in constants, or B) to ensure that those rows are sufficiently unique so that the application can query the primary key values as necessary. My immediate reaction was that option A was a bad idea, because I don&#8217;t like hard-coding values, but as we talked, I agreed that it would be more performant than option B, since it avoids extra queries. I ended up suggesting a third option&#8211;make the values sufficiently unique, as in option B, but have a post-deployment process that queries the primary key values and stores them for faster retrieval when necessary.</p>



<p class="wp-block-paragraph" id="ember645">However, this discussion got me thinking about the nature of best practices, and how frequently there are additional considerations beyond the simple &#8220;always do this&#8221; that many people apply to them. The more familiar you are with a system or process, the more likely you are to find situations where the best option&#8211;note, of course, that what constitutes best varies&#8211;involves a &#8220;violation&#8221; of the best practice.</p>



<p class="wp-block-paragraph" id="ember646">In this case, the best practice is to never hard-code values. But if it&#8217;s a value that&#8217;s being referenced ten thousand times a day, then it&#8217;s very possible that hard-coding will have a significant, noticeable performance benefit.</p>



<p class="wp-block-paragraph" id="ember647">Similarly, Appian best practices (these days) are to use synched records instead of custom data types (CDTs). There are many benefits for this, which I won&#8217;t go into since I don&#8217;t intend this article to be a commercial for the company I work for. But I was talking with a coworker a few weeks ago about a problem he was trying to work around; the answer was to use a CDT, but he was jumping through many extra hoops to avoid that, since &#8220;CDTs aren&#8217;t best practice any more&#8221; (paraphrasing).</p>



<p class="wp-block-paragraph" id="ember648">Of course, this is something we run into in many aspects of our lives. In Scouting, we teach the proper procedure for handing a bladed weapon to someone else&#8211;eye contact, handle first, don&#8217;t let go until there&#8217;s a verbal confirmation, etc. But if I&#8217;m working in a tight space and I hold my hand out for a tool, I may not be able to make eye contact. Similarly, driver&#8217;s ed classes emphasize following the speed limit&#8211;but there are roads where traffic regularly goes notably faster, and actually holding yourself to the limit can make you into a hazard. And parents teach their children many things that are true&#8211;up until they&#8217;re not. Examples will, of course, vary by household; in ours, for instance, best practice for doing the dishes includes that the person who cooked isn&#8217;t responsible for cleanup&#8211;but that can change for a variety of reasons.</p>



<p class="wp-block-paragraph" id="ember649">So, best practices are there to teach us how something should be done, <em>the vast majority of the time</em>. However, it&#8217;s important to recognize that the more familiar you are with a system, they more you&#8217;re going to know when it&#8217;s appropriate to do something else. The tricky part, really, is understanding when you&#8217;ve hit that point&#8211;where you know for certain that the best option is to go against the best practices. My rule of thumb for this&#8211;my best practice, if you will&#8211;is that if you have any doubt, you&#8217;re not there yet.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://davidsgale.com/on-best-practices/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>My Thoughts on NaNoWriMo and AI</title>
		<link>https://davidsgale.com/my-thoughts-on-nanowrimo/</link>
					<comments>https://davidsgale.com/my-thoughts-on-nanowrimo/#respond</comments>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Thu, 05 Sep 2024 16:23:02 +0000</pubDate>
				<category><![CDATA[WriteTrack]]></category>
		<category><![CDATA[Artificial Intelligence]]></category>
		<guid isPermaLink="false">https://davidsgale.com/?p=2008</guid>

					<description><![CDATA[NaNoWriMo was wrong to call protests against "AI" "classist and ableist".]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">I haven&#8217;t paid much attention to NaNoWriMo&#8211;the organization behind National Novel Writing Month, aka &#8220;write 50,000 words of a novel in the month of November&#8221;&#8211;for several years. My wife participated in 2003, and I followed her in 2009; our experiences have grown into <a href="https://writetrack.cloud/">WriteTrack</a>, though I&#8217;ve expanded it to support any size writing goal and user-defined start and end dates. I believe the last time I did anything with NaNoWriMo&#8217;s website was several years ago, when I found out that they had removed the API that allowed WriteTrack to automatically pull your word counts.</p>



<p class="wp-block-paragraph">This week, I&#8217;ve noticed a surge of people registering for WriteTrack, many stating that they&#8217;re &#8220;Looking for a NaNoWriMo alternative&#8221;. This has been caused by the release of a statement by the NaNoWriMo staff condemning people who condemn AI, stating that <em>&#8220;to categorically condemn AI would be to ignore classist and ableist issues&#8221;</em>. They&#8217;ve <a href="https://web.archive.org/web/20240905095311/https://nanowrimo.zendesk.com/hc/en-us/articles/29933455931412-What-is-NaNoWriMo-s-position-on-Artificial-Intelligence-AI" target="_blank" rel="noreferrer noopener nofollow">updated the statement</a>, but honestly, the update doesn&#8217;t really seem to help much, largely (in my opinion) because they don&#8217;t give any indication when they think the use of AI <em>&#8220;conflict[s] with [their] values&#8221;</em>, leaving the general impression that they are supportive of the use of AI for writing, with maybe one or two small exceptions.</p>



<p class="wp-block-paragraph">My opinion: <strong>Modern generative text tools, like ChatGPT, are not &#8220;intelligent&#8221;, and authors should not ask them to write their books for them.</strong> This is not ableist or classist; this is a sober judgement from a career computer scientist. Large language models (LLMs) are effectively statistical machines, predicting what the &#8220;best&#8221; next word would be based on all of the writings they have been trained on. While their abilities to understand requests and generate well-written outputs are frequently impressive, they don&#8217;t actually understand the world the way we do. <em>Note: Because I believe that LLMs are not intelligent, I try not to use the term &#8220;AI&#8221; when describing them.</em></p>



<p class="wp-block-paragraph"><strong>Lack of Intelligence:</strong> There have been many demonstrations of the fact that LLMs aren&#8217;t applying any actual intelligence to their outputs. One example is asking &#8220;<em>how many R&#8217;s are there in the word &#8216;strawberry&#8217;?</em>&#8220;; ChatGPT&#8217;s default answer is that there are two. While there&#8217;s a charitable explanation (generally, people ask this sort of question when they&#8217;re not sure if they should use one or two of a letter), it&#8217;s at best lacking. More significantly, however, are the many examples of &#8220;jailbreaking&#8221; LLMs to get them to generate content that their creators don&#8217;t want them to. The simplest jailbreaks have the LLM &#8220;mask&#8221; their outputs, which make it clear that the LLM itself is often able to generate the output, but that there&#8217;s a secondary system which scans the generated output for inappropriate content which needs to be blocked. A truly intelligent system would not have that vulnerability. Finally, truly intelligent systems would not have the issues with &#8220;hallucinations&#8221; that LLMs are notorious for (such as the lawyers who have been sanctioned for citing non-existent cases in briefs that were, in large part, generated via LLM).</p>



<p class="wp-block-paragraph"><strong>Training:</strong> A huge problem, when thinking about using LLMs for writing, is that the outputs they generate are based on the texts they&#8217;ve been trained on. This is different from the old &#8220;in order to write well, you should read as much as possible&#8221; advice, because while a human who reads extensively develops a sense of good writing, understanding of allegory, and determines for themselves what is beautiful, LLMs simply know what words are most commonly used together. LLMs can be &#8220;tuned&#8221; by tweaking their learning sets, but their very nature leads to the conclusion that they are ultimately just really powerful plagiarism engines. I know that&#8217;s a sweeping, controversial statement, but LLMs generate their text based on many sources, without the ability to show attribution. And that&#8217;s before we even get into the fact that many, if not all, LLMs are trained on texts without the original authors&#8217; express permissions, including from pirated eBooks, scraping websites, and so on.</p>



<p class="wp-block-paragraph"><strong>Acceptable use for LLMs:</strong> Given the above, you might think that I&#8217;m totally opposed to using LLMs. And the answer is, not really. There are use cases for them; as I noted above, their ability to understand questions and generate reasonable outputs is often impressive. In my day job, we use an LLM to extract data from large documents, note patterns in data, and, yes, create a first draft of communications. I&#8217;m proud of the fact, however, that our company emphasizes a &#8220;human hands on the steering wheel&#8221; approach&#8211;while the LLM makes suggestions, a human reviews, revises, and fixes the output. I&#8217;d recommend a similar approach to applying a LLM to writing: work with an LLM to flesh out a general story outline; pose problems from your story to the LLM and ask it to suggest a list of possible solutions; ask an LLM to suggest reasons your main character has a specific flaw. Then take those outputs, think about them, and take your story in a direction that speaks to you. But don&#8217;t ask the LLM to write a scene for you&#8211;that&#8217;s not going to be your work, and won&#8217;t reflect you as a writer.</p>



<p class="wp-block-paragraph">Having gone through NaNoWriMo, I can attest that the challenge of putting as many words on paper as I could each day forced me to turn off my internal editor, freeing my creative side. There were genuine moments where I paused and said, &#8220;I don&#8217;t know where that came from, but I like it.&#8221; Using an LLM would prevent that from happening. Is this ableist or classist? Hardly! It&#8217;s not a question of are you able to write without an LLM; the only thing that using an LLM would help with is your ability to write a specific number of words in a given timeframe. There&#8217;s nothing magical about &#8220;50,000 words in 30 days&#8221;; some people need a lower (or higher) target, and they need to find what works for them to push the internal editor out of the way. And NaNoWriMo&#8217;s &#8220;classism&#8221; argument seems to be aimed at the review/editing process, rather than the <em>writing</em> process, which is really odd given that NaNoWriMo&#8217;s focus is supposed to be on, well, writing. (Incidentally, the statement that some communities would need to pay someone &#8220;for feedback and review&#8221; is striking; do they assume that there are communities where no one is able or willing to read a friend&#8217;s work for free?) </p>



<p class="wp-block-paragraph">In summary: NaNoWriMo was wrong to call protests against &#8220;AI&#8221; <em>&#8220;classist and ableist&#8221;</em>. Large Language Models can be useful, but are no substitute for the creative genius that a human can provide when they turn off their inner editor. Letting a LLM write entire scenes (or more!) for you is not very different from plagiarism, and should <strong>not</strong> be encouraged by an organization aimed at encouraging everyone to write.</p>



<p class="wp-block-paragraph"><em><strong>Edit:</strong> Since the time of my post, they updated the statement again, so I&#8217;ve updated the link to an archived copy for context. I feel that the <a href="https://nanowrimo.zendesk.com/hc/en-us/articles/29933455931412-What-is-NaNoWriMo-s-position-on-Artificial-Intelligence-AI" data-type="link" data-id="https://nanowrimo.zendesk.com/hc/en-us/articles/29933455931412-What-is-NaNoWriMo-s-position-on-Artificial-Intelligence-AI" target="_blank" rel="noreferrer noopener nofollow">newly updated statement</a> is as weak as you can get&#8211;&#8220;AI is simply too big and too varied to categorically support or condemn&#8221;&#8230;.&#8221;We made mistakes in our initial expression of this position&#8221;, with no boundaries or examples at all. There&#8217;s also an undated &#8220;<a href="https://nanowrimo.org/a-note-to-our-community-about-our-comments-on-ai-september-2024/" target="_blank" rel="noreferrer noopener nofollow">letter to our community</a>&#8221; that tries to walk back much of what they said, including the language about ableism and classism, but I find it unimpressive and unpersuasive. You can judge for yourself, of course.  </em></p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://davidsgale.com/my-thoughts-on-nanowrimo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>April App Progress Update</title>
		<link>https://davidsgale.com/april-app-progress-update/</link>
					<comments>https://davidsgale.com/april-app-progress-update/#respond</comments>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Mon, 04 Apr 2022 21:30:39 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://davidsgale.com/?p=2004</guid>

					<description><![CDATA[Well, it&#8217;s been a few months since I started working on building out the WriteTrack app. It&#8217;s been a bit slower than I&#8217;d like getting started, but I do hope that I&#8217;ll pick up speed as I get more used to the language that I&#8217;m working in. Current working features include logging in to your&#8230;&#160;<a href="https://davidsgale.com/april-app-progress-update/" class="" rel="bookmark">Read More &#187;<span class="screen-reader-text">April App Progress Update</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Well, it&#8217;s been a few months since I started working on building out the WriteTrack app. It&#8217;s been a bit slower than I&#8217;d like getting started, but I do hope that I&#8217;ll pick up speed as I get more used to the language that I&#8217;m working in. Current working features include logging in to your <a rel="noreferrer noopener" href="http://WriteTrack.cloud" data-type="URL" data-id="WriteTrack.cloud" target="_blank">WriteTrack</a> account and remembering your login information across sessions; my next step is displaying the list of challenges to select from, and then I&#8217;ll get to the really fun part of being able to edit dates, put in current word counts, and so on.</p>



<p class="wp-block-paragraph">I&#8217;m learning a lot through this, and again, hope to be able to go faster as I become more familiar with everything. Each problem that I solve is a lesson learned!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://davidsgale.com/april-app-progress-update/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>January 2022 Update</title>
		<link>https://davidsgale.com/january-2022-update/</link>
					<comments>https://davidsgale.com/january-2022-update/#respond</comments>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Fri, 21 Jan 2022 21:56:00 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[WriteTrack]]></category>
		<guid isPermaLink="false">https://davidsgale.com/?p=2001</guid>

					<description><![CDATA[Just a quick update today. One thing I&#8217;ve been wanting to do for a few years now is to build a mobile app for WriteTrack. Unfortunately, to make an iPhone app, you need to have an Apple computer. As I&#8217;m not willing to abandon (potentially) half of my users, this has been a blocker for&#8230;&#160;<a href="https://davidsgale.com/january-2022-update/" class="" rel="bookmark">Read More &#187;<span class="screen-reader-text">January 2022 Update</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Just a quick update today. One thing I&#8217;ve been wanting to do for a few years now is to build a mobile app for <a rel="noreferrer noopener" href="https://writetrack.cloud/" target="_blank">WriteTrack</a>. Unfortunately, to make an iPhone app, you need to have an Apple computer. As I&#8217;m not willing to abandon (potentially) half of my users, this has been a blocker for me&#8211;until now. This month, I finally purchased a MacBook specifically to enable me to build hybrid mobile apps.</p>



<p class="wp-block-paragraph">Now I just need to learn how to do that. But that&#8217;s programming, rather than finances, which is much easier for me to deal with. So I&#8217;m making my goal public: I&#8217;m hoping to have a WriteTrack mobile app developed by NaNoWriMo this year.</p>



<p class="wp-block-paragraph">It may not be as full-featured as the website (and probably won&#8217;t, in all honesty), but my minimum viable product will have these features, at least:</p>



<ol class="wp-block-list"><li>The ability to log into your <a rel="noreferrer noopener" href="https://writetrack.cloud/" target="_blank">WriteTrack.cloud</a> account, or register a new account</li><li>The ability to create a challenge or access your existing challenges</li><li>The ability to adjust calendar weights and track progress</li><li>Daily notifications of your adjusted targets</li></ol>



<p class="wp-block-paragraph">Thanks to everyone who has donated to WriteTrack over the years; this simply wouldn&#8217;t be possible without your support!</p>



<form action="https://www.paypal.com/donate" method="post" target="_top">
<input type="hidden" name="hosted_button_id" value="PVH7HFPQ47DDC">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" title="PayPal - The safer, easier way to pay online!" alt="Donate with PayPal button">
<img decoding="async" alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
]]></content:encoded>
					
					<wfw:commentRss>https://davidsgale.com/january-2022-update/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Hello, and Welcome!</title>
		<link>https://davidsgale.com/hello-and-welcome/</link>
					<comments>https://davidsgale.com/hello-and-welcome/#comments</comments>
		
		<dc:creator><![CDATA[David]]></dc:creator>
		<pubDate>Thu, 02 Sep 2021 19:55:07 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://davidsgale.com/?p=16</guid>

					<description><![CDATA[Well, things are looking a little bit bare around here. I recently decided to change web hosts, and in the process decided to start with a clean slate, since I hadn&#8217;t actually maintained my blog in about four years&#8211;and most of the content that was there wasn&#8217;t particularly relevant to me anymore. My apologies if&#8230;&#160;<a href="https://davidsgale.com/hello-and-welcome/" class="" rel="bookmark">Read More &#187;<span class="screen-reader-text">Hello, and Welcome!</span></a>]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Well, things are looking a little bit bare around here.</p>



<p class="wp-block-paragraph">I recently decided to change web hosts, and in the process decided to start with a clean slate, since I hadn&#8217;t actually maintained my blog in about four years&#8211;and most of the content that was there wasn&#8217;t particularly relevant to me anymore. My apologies if you&#8217;re looking for some of my old content on Oracle APEX; rest assured, most of it is out of date now, and you should be looking for more recent content.</p>



<p class="wp-block-paragraph">My name is David. I&#8217;m a husband, father of three, outdoor enthusiast, and a programmer. This blog is for my own opinions, and does not reflect those of my employer (or anyone else).</p>



<div class="wp-block-image"><figure class="alignright size-full"><img decoding="async" width="512" height="512" src="http://davidsgale.com/wp-content/uploads/2021/09/WriteTrack512.png" alt="WriteTrack logo" class="wp-image-17" srcset="https://davidsgale.com/wp-content/uploads/2021/09/WriteTrack512.png 512w, https://davidsgale.com/wp-content/uploads/2021/09/WriteTrack512-300x300.png 300w, https://davidsgale.com/wp-content/uploads/2021/09/WriteTrack512-150x150.png 150w" sizes="(max-width: 512px) 100vw, 512px" /></figure></div>



<p class="wp-block-paragraph">I&#8217;m also the creator and maintainer for <a rel="noreferrer noopener" href="https://writetrack.cloud/" target="_blank">WriteTrack</a>, a free tool for authors to set goals and track their progress. What makes WriteTrack special is that it adjusts around your schedule&#8211;you set your goal and timeframe, and then adjust the days as needed. If there are days you can&#8217;t (or just don&#8217;t want to) write, set them to zero; if there are days where you want to write more, adjust those higher. WriteTrack then tells you how much you need to write each day to reach your goal. And it continues to adjust as you go, so if you get ahead of schedule, your daily goals will go down.</p>



<p class="wp-block-paragraph">I&#8217;ll be adding more as time passes, so please do feel free to check back!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://davidsgale.com/hello-and-welcome/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
