<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eric Ahnell</title>
    <description>The latest articles on DEV Community by Eric Ahnell (@wrldwzrd89).</description>
    <link>https://dev.to/wrldwzrd89</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F204169%2F2cb67032-e2ea-4a6b-bea4-a02d184615c4.png</url>
      <title>DEV Community: Eric Ahnell</title>
      <link>https://dev.to/wrldwzrd89</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wrldwzrd89"/>
    <language>en</language>
    <item>
      <title>The Death of my GitHub Organizations... and my own rebirth as a DEV</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Sun, 13 Sep 2020 21:45:10 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/the-death-of-my-github-organizations-and-my-own-rebirth-as-a-dev-2pll</link>
      <guid>https://dev.to/wrldwzrd89/the-death-of-my-github-organizations-and-my-own-rebirth-as-a-dev-2pll</guid>
      <description>&lt;p&gt;If an igloo is set on fire... does it melt, or rise again like a phoenix?&lt;/p&gt;

&lt;p&gt;My two GitHub organization accounts are no more... but the number of personal repos I have is now almost 80 thanks to mass transfers. I therefore consider this a developer rebirth of sorts... onward to an even brighter future!&lt;/p&gt;

&lt;p&gt;I intend to start blogging here a lot more than I have been, now that I know how easy it is to start!&lt;/p&gt;

</description>
      <category>github</category>
    </item>
    <item>
      <title>Indie Game update: Engine Failure</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Fri, 29 May 2020 23:50:05 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/indie-game-update-engine-failure-2jl8</link>
      <guid>https://dev.to/wrldwzrd89/indie-game-update-engine-failure-2jl8</guid>
      <description>&lt;p&gt;Sometimes, you realize the path you are on is a dead end. This happened to me today - and the failure is in the very core, at the engine layer. Fortunately, it happened in the prototyping stage, which is exactly why I made a prototype. I have a new engine selected, which I now have to learn how to use. Thankfully, I've got no shortage of tutorials and samples to get me started.&lt;/p&gt;

&lt;p&gt;As for the game itself, it's conceptually unchanged, and the assets need only minor changes to use in the new engine. Thank the stars this happened early enough that it's not a tremendous burden to get right!&lt;/p&gt;

</description>
      <category>gamedev</category>
    </item>
    <item>
      <title>I don't know what you did to make DEV much more readable on iPad, but thanks!</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Wed, 27 May 2020 01:39:53 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/i-don-t-know-what-you-did-to-make-dev-much-more-readable-on-ipad-but-thanks-2k9k</link>
      <guid>https://dev.to/wrldwzrd89/i-don-t-know-what-you-did-to-make-dev-much-more-readable-on-ipad-but-thanks-2k9k</guid>
      <description>&lt;p&gt;The recent changes made the site so much more usable for people like me who interact with iPads more than other methods. Even the posting experience is better, albeit more indirectly as it has not been changed as much, if at all. Real shame Safari is the laggard on web standard support, or it would be better still. Excited for what updates the future brings!&lt;/p&gt;

&lt;p&gt;Major kudos to the developers for all the work! It shows!&lt;/p&gt;

</description>
      <category>a11y</category>
      <category>website</category>
    </item>
    <item>
      <title>Here goes nothing... my first ever commercial indie game project!</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Sun, 24 May 2020 18:49:42 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/here-goes-nothing-my-first-ever-commercial-indie-game-project-3p00</link>
      <guid>https://dev.to/wrldwzrd89/here-goes-nothing-my-first-ever-commercial-indie-game-project-3p00</guid>
      <description>&lt;p&gt;It’s about time I made a game intended to make a possible profit... I have chosen a hybrid of several genres, because game genres are silly and limiting. Funnily enough, that’s also a central part of the theme: breaking free. Making a prototype first with the tools I know. Then, I will make something for the app stores! Exciting times ahead.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Game Object Variance: Single and Multiple</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Sat, 11 Apr 2020 22:20:53 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/game-object-variance-single-and-multiple-3bof</link>
      <guid>https://dev.to/wrldwzrd89/game-object-variance-single-and-multiple-3bof</guid>
      <description>&lt;p&gt;I am working on updating my 2nd of 30 games: Mazer5D. I have decided to use image templates for various game objects, using two different systems: avatars, due to their 6 degrees of variability, using one, while objects use another scheme supporting only 1 degree. Objects that have 2 degrees of variability are stored as 2 images and assembled at runtime. I'm primarily supporting color variability, but the engine can also rotate images 90/180/270 degrees if needed. Doing so means I only need 260 raw input images, instead of &amp;gt;1000 for all the possible permutations. There is a performance penalty for doing this, but I mitigate it by precomposing all the common variants and caching them at startup.&lt;/p&gt;

</description>
      <category>java</category>
    </item>
    <item>
      <title>DEV Questions 4: L10N and I18N gotchas</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Fri, 28 Feb 2020 22:38:02 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/dev-questions-4-l10n-and-i18n-gotchas-3m9b</link>
      <guid>https://dev.to/wrldwzrd89/dev-questions-4-l10n-and-i18n-gotchas-3m9b</guid>
      <description>&lt;p&gt;Post 4 in an ongoing series...&lt;/p&gt;

&lt;p&gt;Localization (L10N for short) and Internationalization (I18N) are tricky to get right. Most developers who have done this know about text encoding, length differences affecting layout, and externalizing text. However, this is not enough... as with these three approaches alone, some languages cannot be supported properly.&lt;/p&gt;

&lt;p&gt;One common source of trouble is "dynamic" text - such as the English string "You have 2 items in your shopping cart". Clearly the 2 will need to be modified at runtime. However, not all languages use the singular or plural, that's it model English does. The most complex model I am aware of uses FIVE forms: None, one, few, some, and many are all treated differently. (Note that English does not distinguish between none, few, some, or many, treating them all as "plural".) This implies that "items" in the string above must be parameterized as well, and mapped to the language's plural rules - which, thankfully, Unicode has defined for us.&lt;/p&gt;

&lt;p&gt;Another thing that can lead to problems is differing word order between languages. For strings without any variables, this is easy enough to handle, but in the "dynamic" case mentioned above, the locations of the placeholders will have to be moved for the languages requiring it.&lt;/p&gt;

&lt;p&gt;Finally, there's the thorny subject of idioms... these almost never translate well into other languages. There are several ways to handle this: Remove all idioms from the "fallback/base" text before translating, or separate the "default" text from the "fallback/base" text that gets translated, taking idioms out of the second but leaving them in the first. Which approach to use depends on how important the idioms are for context in the original language, which will of course vary by use case.&lt;/p&gt;

&lt;p&gt;One more thing... in the event your code displays anything that varies by locale, such as dates, times, and currencies, those too must be adjusted to suit local expectations. It is FAR too easy to overlook these concerns, create low-effort translations, and have your application fare poorly outside its original market, due to lack of understanding. Don't be tempted!&lt;/p&gt;

&lt;p&gt;Now for you: What has made translation easy / hard for you and your code?&lt;/p&gt;

</description>
      <category>inclusion</category>
      <category>design</category>
    </item>
    <item>
      <title>DEV Questions 3: Immediate and retained mode GUI models</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Mon, 24 Feb 2020 00:50:59 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/dev-questions-3-immediate-and-retained-mode-gui-models-1cd2</link>
      <guid>https://dev.to/wrldwzrd89/dev-questions-3-immediate-and-retained-mode-gui-models-1cd2</guid>
      <description>&lt;p&gt;After doing some reading on this subject, I concluded that immediate mode is best within a game engine, whereas retained mode is the developers' favorite everywhere else. I have tried both - I have far more retained mode experience than immediate - but both clearly have their uses. Have you tried both modes?&lt;/p&gt;

&lt;p&gt;Finally, a point of personal curiosity: is it, or will it be possible to make immediate mode Web user interfaces with WebAssembly (or other bits of Web tech)?&lt;/p&gt;

</description>
      <category>design</category>
    </item>
    <item>
      <title>DEV Questions 2: Per-OS customization in cross-platform apps and games</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Sun, 16 Feb 2020 18:00:34 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/dev-questions-2-per-os-customization-in-cross-platform-apps-and-games-44pk</link>
      <guid>https://dev.to/wrldwzrd89/dev-questions-2-per-os-customization-in-cross-platform-apps-and-games-44pk</guid>
      <description>&lt;p&gt;Post 2 in a running series of questions for DEV!&lt;/p&gt;

&lt;p&gt;How do you tailor your native/web apps for quirks of each OS/browser they might run on? For native apps/games, shortcut conventions are different enough between OSes, so if you want to use the standards, you have to first figure out what OS you're on. (Notice that I didn't say "keyboard shortcuts", because of things like long-press on mobile OSes.) Likewise, browsers support a different set of web features differently, for which feature detection is usually used (in JS, anyway). What adaptations and/or techniques have I not thought of? What do YOU use personally?&lt;/p&gt;

</description>
      <category>design</category>
    </item>
    <item>
      <title>DEV Questions: Driving faster than the speed of sound in racing games</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Sun, 09 Feb 2020 13:41:01 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/dev-questions-driving-faster-than-the-speed-of-sound-in-racing-games-461</link>
      <guid>https://dev.to/wrldwzrd89/dev-questions-driving-faster-than-the-speed-of-sound-in-racing-games-461</guid>
      <description>&lt;p&gt;This is the first post of what will hopefully become a series.&lt;/p&gt;

&lt;p&gt;I was perusing YouTube this morning, and &lt;a href="https://www.youtube.com/watch?v=o9fllBtIEVQ"&gt;found&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=xwFjFQhRJcw"&gt;five&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=dnJJAItC63k"&gt;videos&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=Pu7DxQShpZs"&gt;showcasing&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=-osVzGGRDS8"&gt;what I mean&lt;/a&gt; in the Extreme-G series of games. All of these videos feature at least one point in the race where the player is moving at supersonic speeds, at which point the speedometer goes haywire, there is a "sonic boom" of sorts, and the music mostly drops out until back below the speed of sound. How would you implement this in a game? More specifically, what would be needed from the game and its engine to make the transition to supersonic racing semi-realistic?&lt;/p&gt;

&lt;p&gt;I can think of 3 things right off the top of my head:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ability to interrupt music at any time, perhaps just by playing two tracks and muting one, then switching as needed&lt;/li&gt;
&lt;li&gt;Dynamic volume control, so the transition does not sound abrupt&lt;/li&gt;
&lt;li&gt;Some sort of visual indicator, in the speedometer or otherwise, that your speed has hit a transition point&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anything else I forgot? Your thoughts welcome! &lt;/p&gt;

</description>
      <category>design</category>
    </item>
    <item>
      <title>Twitter coding quizzes and JavaScript infinite reach</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Mon, 03 Feb 2020 01:31:53 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/twitter-coding-quizzes-and-javascript-infinite-reach-51o5</link>
      <guid>https://dev.to/wrldwzrd89/twitter-coding-quizzes-and-javascript-infinite-reach-51o5</guid>
      <description>&lt;p&gt;One of those Twitter quizzes: If you're born in month X, you program in language Y for the rest of your life. For me, JavaScript was the resulting language. This got me thinking... JavaScript is technically an infinite-reach language, because Electron covers native wrappers, NodeJS covers servers, while browsers cover clients. That's everything, right?&lt;/p&gt;

&lt;p&gt;Silly analogy aside, it sure seems like I can truly reach just about anything anywhere with JS - whether it's a web game, a database-driven app, a single-page web app, a progressive web app, or even all four of those things in one - all the common modes of consumption are possible, if not easy, to cover! Perhaps this is why so many people are looking towards WebAssembly as the wave of the future, but there isn't exactly a NodeJS equivalent. Then again, is one really needed? You need a compiler to produce WebAssembly anyway, suggesting that native server code is only a small leap from there.&lt;/p&gt;

&lt;p&gt;Wow, does this mean the web is truly more universal than I ever realized, and only now did it occur to me? What have I missed out on all these years of being a desktop app developer? I have some serious catching up to do, it seems.&lt;/p&gt;

</description>
      <category>javascript</category>
    </item>
    <item>
      <title>My Experiences In Professional Python</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Fri, 31 Jan 2020 23:14:31 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/my-experiences-in-professional-python-kod</link>
      <guid>https://dev.to/wrldwzrd89/my-experiences-in-professional-python-kod</guid>
      <description>&lt;p&gt;Ah, Python. What a great language! I use it for number crunching and related data tasks professionally, as an easier to use (and often faster) alternative to VBA. To prove it, at least for my use cases, some stats are in order...&lt;/p&gt;

&lt;p&gt;First, a dashboard that I used to run monthly until the data source vanished took 2.5 days to run by hand. It was slow and productivity-sucking, so I automated it in VBA. This reduced the run time to 14 hours - better, but still slow. So I rewrote things again in Python. The run time now? 10 minutes! Talk about time saved...&lt;/p&gt;

&lt;p&gt;Secondly, another one of my more popular reports, analyzing usage of the various PDF publications we produce - originally, the controller script for this was in VBA, and it was SLOW, taking almost 3 days to run! Like the last one, it was rewritten in Python - however, one part of the processing step has ideal parallelism: I have to process a bunch of independent rows of data the same way, making it a perfect task to divide up among CPU cores with the &lt;code&gt;multiprocessing&lt;/code&gt; module. After additional tweaks and optimizations, the typical run time is just a smidge under 4 minutes; a fast-path, where the results of some of the processing can be loaded from a saved file, takes as little as 13 seconds!&lt;/p&gt;

&lt;p&gt;Finally, my most recent Python thing I have been doing is generating an HTML to-do list, so I can open it up in a browser and see, at a glance, what I have on my plate. This had a short-lived VBA version too - but performance wasn't the driving factor behind a rewrite. Rather, it was VBA lacking robust HTML and regular expression support. Later additions defined the structure of the data files used in object form, which enables both strict error checking and MUCH better error reporting. One of the data files is a CSV, which I update by hand, so it's easy to make errors like forgetting a comma or not quoting text with commas embedded in it. The script will detect these problems and tell you not only where it stopped parsing, but also what error it found. Examples of error messages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File 'data.csv', line 2, item 4: '2020-1-09' is not a valid ISO date!&lt;/li&gt;
&lt;li&gt;File 'data.csv', line 34: Found 21 items, expected 23!&lt;/li&gt;
&lt;li&gt;File 'data.csv', line 5, item 13: 'Highets' is not a valid priority!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes fixing the error easy, as I know exactly where to look. Contrast with the Python runtime's much less helpful errors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ValueError: '2020-1-09' could not be parsed as datetime&lt;/li&gt;
&lt;li&gt;TypeError: 'Highest' not valid for int() in base 10&lt;/li&gt;
&lt;li&gt;No error.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As for future work, I am looking into scientific Python libraries to further accelerate the heavy-duty data lifting work I do, in particular with the publication usage report, which has to ingest over 100 GB of raw data, and merge it with data from a second source to produce the final result. To some extent these can run concurrently, but they are still slow put together. Shame I can't speed up downloading the data files.&lt;/p&gt;

&lt;p&gt;Oh, and a shout-out to &lt;a class="comment-mentioned-user" href="https://dev.to/ronsoak"&gt;@ronsoak&lt;/a&gt;
 for inspiring me to write this!&lt;/p&gt;

</description>
      <category>python</category>
    </item>
    <item>
      <title>Moving the needle forward: mass-upgrading 30 Java games to JDK 11</title>
      <dc:creator>Eric Ahnell</dc:creator>
      <pubDate>Sun, 26 Jan 2020 23:32:21 +0000</pubDate>
      <link>https://dev.to/wrldwzrd89/moving-the-needle-forward-mass-upgrading-30-java-games-to-jdk-11-36dd</link>
      <guid>https://dev.to/wrldwzrd89/moving-the-needle-forward-mass-upgrading-30-java-games-to-jdk-11-36dd</guid>
      <description>&lt;p&gt;This has been a much larger undertaking than I thought it would be... I've completed the first 3 of the 7 phases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the SDK for all projects to JDK 11 [DONE]&lt;/li&gt;
&lt;li&gt;Migrate core dependencies to their Java 11 equivalents [DONE]&lt;/li&gt;
&lt;li&gt;Fix all compiler errors caused by the previous two phases [DONE]&lt;/li&gt;
&lt;li&gt;Make sure all projects declare a module and dependencies&lt;/li&gt;
&lt;li&gt;Migrate project-unique dependencies to Java 11&lt;/li&gt;
&lt;li&gt;Fix MORE compiler errors and various warnings left until now&lt;/li&gt;
&lt;li&gt;Test the results of the changes!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Making matters slightly harder is that the original projects were compiled in a number of different Java versions, exactly zero of which are 11. Also, some of the projects needed code specific to them upstreamed into the shared dependencies to work - this obviously benefits all the other projects too. More of this will happen when the project-unique stuff is tackled. The one bit of good news is that the required changes so far to make the code compile are highly similar across all 30 projects, turning that part into a copy/paste job. Love those. 😀&lt;/p&gt;

&lt;p&gt;You may be curious why I'm doing this now, in light of my LOVE2D efforts. The reason is that all of these games need to be rewritten in LOVE2D at some point, and doing that is a LOT easier if they're all first moved to a common baseline. As for the code itself... &lt;a href="https://github.com/wrldwzrd89/older-java-games"&gt;that's here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>java</category>
      <category>upgrade</category>
    </item>
  </channel>
</rss>
