<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Nathaniel Inman</title><link>https://nathanielinman.com/</link><description>Recent content on Nathaniel Inman</description><generator>Hugo -- 0.147.7</generator><language>en-us</language><copyright>Nathaniel Inman</copyright><lastBuildDate>Tue, 15 Aug 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://nathanielinman.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Atomic Design System In Context</title><link>https://nathanielinman.com/atomic-design-system-in-context/</link><pubDate>Tue, 15 Aug 2023 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/atomic-design-system-in-context/</guid><description>&lt;p>Brad Frost &lt;a href="https://atomicdesign.bradfrost.com/">created a design system&lt;/a> for thinking about developing for the web as a front-end specialist. Atomic Design System is essentially boiled down into 5 separate categories:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Atoms (Elements)&lt;/strong> - These are the smallest functional elements of a page, such as text labels, buttons, inputs or other HTML elements that can&amp;rsquo;t further be broken down.&lt;/li>
&lt;li>&lt;strong>Molecules (Components)&lt;/strong> - Simple compositions or groups of atoms that comprise a single unit. This may be an input box with a search button next to it and a label above it. Within Brad&amp;rsquo;s book he mentions these should follow the &amp;ldquo;S&amp;rdquo; in &amp;ldquo;&lt;a href="https://en.wikipedia.org/wiki/SOLID">SOLID&lt;/a>&amp;rdquo; from &lt;a href="https://en.wikipedia.org/wiki/Robert_C._Martin">Robert C. Martin&amp;rsquo;s&lt;/a> &lt;em>&lt;a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod">Principles of Object Oriented Design&lt;/a>&lt;/em> which stands for &lt;a href="https://en.wikipedia.org/wiki/Single-responsibility_principle">Single Responsibility Principle&lt;/a>. By this Brad implies that the molecule must only do one specific thing, not necessarily that it has only one reason to change. Brad refers to molecules near the end as &amp;ldquo;simple, functional, reusable components.&amp;rdquo;&lt;/li>
&lt;li>&lt;strong>Organisms (Widgets)&lt;/strong> - Comprised of potentially multiple molecules or atoms and molecules in conjunction to form a cohesive purpose. Here Brad specifically refers to organisms as &amp;ldquo;components&amp;rdquo; numerous times as well. In comparison, these may be more sophisticated components compared to molecules.&lt;/li>
&lt;li>&lt;strong>Templates&lt;/strong> - Templates are simply a collection of elements, components and widgets that when together build an entire page and lays it out without actual data. You can think of these as a Class in object oriented design.&lt;/li>
&lt;li>&lt;strong>Pages&lt;/strong> - Pages are instanced Templates, or Templates with actual data.&lt;/li>
&lt;/ol>
&lt;p>The actual benefit of the design system is in it&amp;rsquo;s name. Atomic Design System helps by putting an emphasis on breaking things down into their most atomic units and creating categories of complexity that are well-named to be able to refer to them.&lt;/p></description></item><item><title>Pihole On-top of UDM Pro</title><link>https://nathanielinman.com/pihole-on-top-of-udm-pro/</link><pubDate>Mon, 19 Dec 2022 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/pihole-on-top-of-udm-pro/</guid><description>&lt;p>Here are some concise steps on how to step-by-step block ads on your network with pihole&amp;rsquo;s DNS-level ad blocker.&lt;/p>
&lt;h2 id="enabling-ssh-on-udm-pro">Enabling SSH on UDM Pro&lt;/h2>
&lt;ol>
&lt;li>Go to 192.168.1.1 or wherever you&amp;rsquo;re hosting your UDM Pro&lt;/li>
&lt;li>Within &amp;ldquo;settings&amp;rdquo; cog, click on &amp;ldquo;system&amp;rdquo; tab&lt;/li>
&lt;li>Click &amp;ldquo;enabled&amp;rdquo; on SSH near the bottom&lt;/li>
&lt;li>Leverage &amp;ldquo;change password&amp;rdquo; button if you don&amp;rsquo;t remember it&lt;/li>
&lt;/ol>
&lt;h2 id="log-into-ssh--get-unifi-os-scripts">Log Into SSH &amp;amp; Get Unifi-OS Scripts&lt;/h2>
&lt;ol>
&lt;li>Open Terminal and &lt;code>ssh root@192.168.1.1 -o HostKeyAlgorithms=+ssh-rsa&lt;/code>&lt;/li>
&lt;li>Jump into Unifi shell with &lt;code>unifi-os shell&lt;/code>&lt;/li>
&lt;li>Download package &lt;code>curl -L https://udm-boot.boostchicken.dev -o udm-boot.deb&lt;/code>&lt;/li>
&lt;li>Install package &lt;code>dpkg -i udm-boot.deb&lt;/code>&lt;/li>
&lt;li>Enable boot script with &lt;code>systemctl enable udm-boot&lt;/code>&lt;/li>
&lt;li>Leave Unifi shell but stay within ssh with &lt;code>exit&lt;/code>&lt;/li>
&lt;/ol>
&lt;h2 id="create-network-within-udm-web-gui">Create Network Within UDM Web GUI&lt;/h2>
&lt;p>Create a pihole network with the following settings:&lt;/p></description></item><item><title>Announcing Credential Broker</title><link>https://nathanielinman.com/announcing-credential-broker/</link><pubDate>Wed, 07 Apr 2021 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/announcing-credential-broker/</guid><description>&lt;p>tl;dr: The utility is open-source, you can &lt;a href="https://github.com/NathanielInman/credential-broker">download, contribute or learn more on github here.&lt;/a>&lt;/p>
&lt;p>A credential broker service stores all sensitive information and has a command-line client which can act as a streaming pre-hook to initialize environment variables upon an application at runtime that does not store anything to disk. The broker service itself stores everything in encrypted format with the broker client having a key to unlock the data, provided the user is authenticated and has been authorized for the data requested. The server mimics an SSH authentication using &lt;a href="https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange">Diffie-Hellman&lt;/a> to establish encryption of traffic, performing a challenge to validate a user owns the private &lt;a href="https://en.wikipedia.org/wiki/Pretty_Good_Privacy#OpenPGP">OpenPGP&lt;/a> key to their account and a &lt;a href="https://en.wikipedia.org/wiki/Multi-factor_authentication">2FA&lt;/a> request at a configurable time period to ensure the user hasn&amp;rsquo;t been compromised. &lt;a href="https://en.wikipedia.org/wiki/Transport_Layer_Security">SSL&lt;/a> should be configured on the server to help prevent &lt;a href="https://en.wikipedia.org/wiki/Man-in-the-middle_attack">man-in the middle&lt;/a>.&lt;/p></description></item><item><title>Kepler452b Released</title><link>https://nathanielinman.com/kepler452b-released/</link><pubDate>Tue, 04 Aug 2020 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/kepler452b-released/</guid><description>&lt;p>Kepler452b is available for Windows, Linux &amp;amp; MacOS. Enjoy a roguelike with one of 8 classes, 5 unique worlds, beautiful graphics by Oryx, music by Scott Buckley &amp;amp; Sergey Cheremisinov, 28 unique enemies, 101 supervisors to modify your gameplay, a story and much more! Whether you prefer to sneak around and backstab with the assassin, use a flamethrower as a pyrotechnic or grapple enemies to you and poison them, there&amp;rsquo;s bound to be a play style you will enjoy!&lt;/p></description></item><item><title>XMLHttpRequest Security</title><link>https://nathanielinman.com/xmlhttprequest-security/</link><pubDate>Tue, 02 Jun 2020 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/xmlhttprequest-security/</guid><description>&lt;p>It&amp;rsquo;s possible to intercept, adjust and otherwise tamper with a XHR request with javascript in the browser. The most common way of doing this is simply making a pointer reference to the original &lt;code>XMLHttpRequest.prototype.send&lt;/code> function, overwriting that function with a new one that does the tampering and then calls the original send function once finished. Here&amp;rsquo;s an example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> XHR &lt;span style="color:#f92672">=&lt;/span> XMLHttpRequest,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> XHRopen &lt;span style="color:#f92672">=&lt;/span> XHR&lt;span style="color:#f92672">.&lt;/span>prototype&lt;span style="color:#f92672">.&lt;/span>open;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> XHR&lt;span style="color:#f92672">.&lt;/span>prototype&lt;span style="color:#f92672">.&lt;/span>open &lt;span style="color:#f92672">=&lt;/span> function() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> onFinish();
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> XHRopen&lt;span style="color:#f92672">.&lt;/span>apply(this, arguments);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> };
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="identifying-tampering">Identifying Tampering&lt;/h2>
&lt;p>It&amp;rsquo;s very straight forward to identify tampering of the function. Simply ensure that the &lt;code>XMLHttpRequest.prototype.open.toString() === 'function send() { [native code] }';&lt;/code> evaluates to true. The function should always be native code if it wasn&amp;rsquo;t corrupted or tampered with.&lt;/p></description></item><item><title>Kepler452b Coming 2020</title><link>https://nathanielinman.com/kepler452b-coming-2020/</link><pubDate>Tue, 03 Dec 2019 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/kepler452b-coming-2020/</guid><description>&lt;h2 id="august-4th-2020-update-v100-release">August 4th, 2020 Update: v1.0.0 Release&lt;/h2>
&lt;p>Official release page is &lt;a href="https://nathanielinman.com/kepler452b-released/">here&lt;/a>.&lt;/p>
&lt;p>You can submit bugs or request features &lt;a href="https://github.com/NathanielInman/kepler452b/issues">here&lt;/a>.&lt;/p>
&lt;h3 id="downloads--links">Downloads &amp;amp; Links&lt;/h3>
&lt;p>&lt;a href="https://github.com/NathanielInman/kepler452b/releases/download/v1.0.0/kepler452b.Setup.1.0.0.exe">Windows Download&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://github.com/NathanielInman/kepler452b/releases/download/v1.0.0/kepler452b-1.0.0.dmg">Mac Download&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://github.com/NathanielInman/kepler452b/releases/download/v1.0.0/kepler452b_1.0.0_amd64.snap">Linux Snapfile Download&lt;/a>&lt;/p>
&lt;p>&lt;a href="https://github.com/NathanielInman/kepler452b/releases/download/v1.0.0/kepler452b-1.0.0.AppImage">Linux App Image Download&lt;/a>&lt;/p>
&lt;h2 id="screenshots">Screenshots&lt;/h2>
&lt;p>&lt;img alt="Landing in from the heliopad atop Forward Operating Base, this pyromancer is ready to burn some AMP and chew bubble gum, but he&amp;rsquo;s all out of bubblegum." loading="lazy" src="https://nathanielinman.com/content/images/2020/02/Screen-Shot-2020-02-11-at-2.39.27-PM.png">
&lt;img alt="The 2nd area, Avery Center of Microbiology on the ground floor looks like a desolate Mars outside. Looks like a few colonists didn&amp;rsquo;t survive based on the tombstones." loading="lazy" src="https://nathanielinman.com/content/images/2020/02/Screen-Shot-2020-02-11-at-1.58.11-PM.png">
&lt;img alt="The 3rd area: GSU Atilla seems to be overrode by AMP infiltration. Will the assassin make it through undetected?" loading="lazy" src="https://nathanielinman.com/content/images/2020/02/Screen-Shot-2020-02-11-at-2.08.42-PM.png">
&lt;img alt="The 4th area, Planck Research at the very bottom in &amp;ldquo;The Pit&amp;rdquo;. Beware the acid!" loading="lazy" src="https://nathanielinman.com/content/images/2020/02/Screen-Shot-2020-02-11-at-1.56.51-PM.png">
&lt;img alt="The 5th and final area: Haldane Terminus. Here we see the doctor running for a terminal room to quickly upgrade their skills. It&amp;rsquo;s lucky to find a terminal; otherwise the captain needs to upgrade between games at the main menu." loading="lazy" src="https://nathanielinman.com/content/images/2020/02/Screen-Shot-2020-02-11-at-2.01.33-PM.png">
&lt;img alt="The bonus area: The Ruined Byond. Only one of the endings even allows getting to this point. No spoilers here! Needless to say, this area is significantly difficult!" loading="lazy" src="https://nathanielinman.com/content/images/2020/02/Screen-Shot-2020-02-11-at-2.06.33-PM.png">&lt;/p></description></item><item><title>Building a Modern Roguelike in 2019</title><link>https://nathanielinman.com/building-a-modern-roguelike-in-2019/</link><pubDate>Wed, 13 Nov 2019 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/building-a-modern-roguelike-in-2019/</guid><description>&lt;p>At numerous times I&amp;rsquo;ve created demos trying to figure out how to merge a traditional roguelike into a FPS without sacrificing it&amp;rsquo;s roots. &lt;a href="https://nathanielinman.com/building-a-modern-roguelike-in-2017/">Here&amp;rsquo;s an article I made in 2017.&lt;/a> Unlike many others I don&amp;rsquo;t feel like just random maps makes a roguelike, &lt;a href="https://nathanielinman.com/no-fps-is-a-roguelike/">I&amp;rsquo;ve even gone so far as saying no FPS is a roguelike.&lt;/a> In this experiment I&amp;rsquo;ve tried to merge those ascii characters into the map itself and dropped the textures. The code can be executed and ran or viewed in its entirety on Github &lt;a href="https://github.com/NathanielInman/experiments/tree/master/3d/generic-map-2">here.&lt;/a>&lt;/p></description></item><item><title>Mapping Genealogy in Neo4J</title><link>https://nathanielinman.com/mapping-genealogy-in-neo4j/</link><pubDate>Fri, 26 Jul 2019 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/mapping-genealogy-in-neo4j/</guid><description>&lt;p>This summer I&amp;rsquo;ve worked on a behavior and trait mapper in C++ that establishes entirely dynamic AI routines, allowing actors to propagate and interact with each other in unique ways. You can think of it as a super sophisticated &lt;code>Langton's Ant&lt;/code>, where the goal was to identify the reflective sociological impacts of personal traits from as minute and mundane as a &lt;code>vegan&lt;/code> to criminal desires like &lt;code>burglary&lt;/code>, sexual preferences like &lt;code>pansexual&lt;/code> or uncontrollable hunger desires of a &lt;code>cannibal&lt;/code>, etc. The graphing of the application was with Vis.js.&lt;/p></description></item><item><title>Runtime Pipeline Patterns</title><link>https://nathanielinman.com/runtime-pipeline-patterns/</link><pubDate>Mon, 25 Feb 2019 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/runtime-pipeline-patterns/</guid><description>&lt;h3 id="introduction">Introduction&lt;/h3>
&lt;p>&lt;a href="https://en.wikipedia.org/wiki/Pipeline_(software)">Pipeline patterns&lt;/a> are most commonly used for simple data workflows like general functional composition or user registration processes. After briefly describing the basics, this article focuses on a couple of &lt;a href="https://en.wikipedia.org/wiki/Behavioral_pattern">behavioral software design patterns&lt;/a> under the &lt;a href="https://en.wikipedia.org/wiki/Strategy_pattern">strategy pattern&lt;/a> we&amp;rsquo;ll refer to as &amp;ldquo;runtime patterns&amp;rdquo; for use with pipelines. Their power in modern applications is allowing pipelines to expand or contract dynamically. Whether it be through behavior modeling with ai, blueprint fulfilling or more basic conditional pipeline adaptation, the runtime patterns are helpful and with forethought can be simply understood and implemented.&lt;/p></description></item><item><title>Async Await Chaining</title><link>https://nathanielinman.com/async-await-chaining/</link><pubDate>Sun, 06 Jan 2019 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/async-await-chaining/</guid><description>&lt;p>Creating synchronously chained functions is straight forward. &lt;a href="https://codepen.io/NathanielInman/pen/f2c6f77986160188091575625ba1604b">&lt;strong>Codepen&lt;/strong>&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> UserCollectionSync &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> find(id&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> update(){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;2&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> save(){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;3&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>UserCollectionSync
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>find()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>update()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>save();
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>But when we decide to just throw some &amp;lsquo;async&amp;rsquo; &amp;lsquo;await&amp;rsquo; flags on those functions everything doesn&amp;rsquo;t work. &lt;strong>FOLLOWING CODE IS WRONG:&lt;/strong> &lt;a href="https://codepen.io/NathanielInman/pen/c8306ad8a473d6cfe79d26cf9fee1624">&lt;strong>Codepen&lt;/strong>&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">//&lt;/span> delay is used to represent some asynchronous work
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>function delay(ms){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> new Promise(resolve &lt;span style="color:#f92672">=&amp;gt;&lt;/span> setTimeout(resolve, ms));
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} &lt;span style="color:#f92672">//&lt;/span>end delay()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">const&lt;/span> UserCollectionAsync &lt;span style="color:#f92672">=&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> async find(id&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> await delay(&lt;span style="color:#ae81ff">1000&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;1&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> async updateFor(options&lt;span style="color:#f92672">=&lt;/span>{}){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> await delay(&lt;span style="color:#ae81ff">50&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;2&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> },
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> async save(){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> await delay(&lt;span style="color:#ae81ff">50&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> document&lt;span style="color:#f92672">.&lt;/span>writeln(&lt;span style="color:#e6db74">&amp;#39;3&amp;#39;&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> this;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>UserCollectionAsync
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>find()
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>updateFor(&lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">.&lt;/span>save();
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The reason it fails is because when the &amp;lsquo;find()&amp;rsquo; is called it returns a promise that hasn&amp;rsquo;t resolved instead of the &amp;lsquo;UserCollectionAsync&amp;rsquo; object (Factory pattern.) Therefor you can&amp;rsquo;t find a function &amp;lsquo;update()&amp;rsquo; on a promise. One common way of solving the issue is by allowing the factory to maintain a queue and force the user to add &amp;lsquo;done()&amp;rsquo; at the end of the chain: &lt;a href="https://codepen.io/NathanielInman/pen/cdb094f0c87a5a7673d2c67fb7f1a88f">&lt;strong>Codepen&lt;/strong>&lt;/a>.&lt;/p></description></item><item><title>Meander Algorithm</title><link>https://nathanielinman.com/meander-algorithm/</link><pubDate>Tue, 04 Sep 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/meander-algorithm/</guid><description>&lt;p>The meander algorithm is a combination of using mazes to allow a meandering with bresenhams line. Below you can see the actual algorithm in simplicity. Obviously you could use noise maps to created heighted terrain based on the river to make it look pretty.&lt;/p>
&lt;p>&lt;img alt="Screen-Shot-2018-09-04-at-11.56.46-AM" loading="lazy" src="https://nathanielinman.com/content/images/2019/01/Screen-Shot-2018-09-04-at-11.56.46-AM.png">&lt;/p>
&lt;ol>
&lt;li>Choose a starting map edge and ending map edge, acquire
the terminal points based on those edges. Usually this would be a random point on those edges. Maybe you&amp;rsquo;d want to weight it so it&amp;rsquo;s predominately in the center, or you could restrict it to a certain part.&lt;/li>
&lt;li>Create Bresenhams line between the terminal points. This is called the pathing vector.&lt;/li>
&lt;li>Break up the pathing vector into chunks of 9x9 where the pathing vector crosses the center. There may be left-over of the pathing vector.&lt;/li>
&lt;li>For each chunk, perform a recursive maze generation algorithm on the chunk. Repeat this step until there is a path from the start of the pathing vector within the chunk to the end of the pathing vector in the chunk. A* pathing algorithm can be used for the pathing.&lt;/li>
&lt;li>Merely use Bresenhams line to wrap up the extraneous pathing vector not covered by chunks, alternatively break up the remaining path into the largest odd number and chunk and process it similarly to the previous part of the algorithm to make it more consistent. Left overs in this optional way would still be filled in with bresenhams line.&lt;/li>
&lt;/ol>
&lt;p>Recursive Maze Generation:&lt;/p></description></item><item><title>Generating Exhumed River Channel</title><link>https://nathanielinman.com/generating-exhumed-river-channel/</link><pubDate>Mon, 06 Aug 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/generating-exhumed-river-channel/</guid><description>&lt;p>I recently did some work in generating rivers in a 2d game. Revisiting this work to create an exhumed river channel, I decided it might be fun to revisit how to generate it to make the channel look more realistic. Instead of using a drunken walker, this is a more expensive but interesting map generator:&lt;/p>
&lt;ul>
&lt;li>Start by generating 2d simplex noise where&lt;/li>
&lt;li>less &amp;lt;0.6 is floor&lt;/li>
&lt;li>rest is walls&lt;/li>
&lt;li>Generate terminal lines at each map exit (north, south, east, west). Shuffle those lines and randomly choose a start and end location for the river based on two of those lines.&lt;/li>
&lt;/ul>
&lt;p>Later you can add another line with terminal point to allow a split river channel&lt;/p></description></item><item><title>Generating Cliffs for 2d Game</title><link>https://nathanielinman.com/generating-cliffs-for-2d-game/</link><pubDate>Tue, 31 Jul 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/generating-cliffs-for-2d-game/</guid><description>&lt;p>Source code available on github &lt;a href="https://github.com/NathanielInman/experiments/tree/master/mapGeneration/cliff">here&lt;/a>.\n\nA recurring problem in 2d games is how to represent depth. In isometric games this is easily solved but in discretely top-down games it&amp;rsquo;s harder to solve. After doing a lot of research I fell onto a simple idea: do the best you can insinuating the depth and leave the rest to the imagination. Here&amp;rsquo;s the algorithm I used to create 2d top-down cliffs:&lt;/p>
&lt;ul>
&lt;li>Create a small map of perlin noise and a wide map of perlin noise. Add the two together and give the large map a weight of 3 with the small a weight of 1 and render the result with different breakpoints. This is ref map A.&lt;/li>
&lt;/ul>
&lt;p>Less than 0.01 on A is deep water&lt;/p></description></item><item><title>Generating 2d Rivers</title><link>https://nathanielinman.com/generating-2d-rivers/</link><pubDate>Wed, 11 Jul 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/generating-2d-rivers/</guid><description>&lt;p>Rivers are really hard to generate for 2d top-down games for multiple reasons:&lt;/p>
&lt;ul>
&lt;li>Rivers primarily form based on heightmaps which are hard to display in top-down&lt;/li>
&lt;li>Displaying fluidity when working with sectors or grid-based rendering can be complicated, bresenham&amp;rsquo;s line algorithm only goes so far to make things look smooth&lt;/li>
&lt;li>naturally occurring mechanisms of nature have numerous factors in play that caused them to exist. Simulating all of these factors isn&amp;rsquo;t reasonable.&lt;/li>
&lt;/ul>
&lt;p>I was able to make relatively decent 2d rivers using a few techniques.&lt;/p></description></item><item><title>Balancing Game Mechanics</title><link>https://nathanielinman.com/balancing-game-mechanics/</link><pubDate>Wed, 06 Jun 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/balancing-game-mechanics/</guid><description>&lt;p>Two of the most influential components to decreasing LOE in balancing game mechanics is &lt;strong>automating&lt;/strong> the most essential parts of testing those mechanics, and providing meaningful and easy to understand &lt;strong>graphs&lt;/strong>. Some meaningful questions to better lay the foundation of balancing and creating these components:&lt;/p>
&lt;ul>
&lt;li>What are the actual &amp;lsquo;core stat(s)&amp;rsquo; that identify survival? (Usually health)&lt;/li>
&lt;li>What are the &amp;lsquo;ancillary stat(s)&amp;rsquo; that help facilitate the increase or decrease that core? (damage, strength, dexterity, etc.) I&amp;rsquo;m assuming all actors here are equal and we aren&amp;rsquo;t comparing apples and oranges.&lt;/li>
&lt;li>What are the &amp;lsquo;supplemental stat(s)&amp;rsquo; that may contribute to the increase or decrease of the ancillary stats? (class, rank, level)&lt;/li>
&lt;li>What are the &amp;rsquo;extraneous stat(s)&amp;rsquo; that don&amp;rsquo;t affect the other stats already identified.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>I found that creating a tree by drawing lines connecting these identified stats provided incredible insight and direction.&lt;/p></description></item><item><title>Pigeon Hole Stepping v2</title><link>https://nathanielinman.com/pigeon-hole-stepping-v2/</link><pubDate>Tue, 08 May 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/pigeon-hole-stepping-v2/</guid><description>&lt;p>I had originally written an article on how to implement PHS. Having found the maps generated slightly redundant I decided to take another look. Here are the steps taken to successfully generate a more realistic &lt;code>town.&lt;/code> It&amp;rsquo;s essentially a drunken walker like &lt;a href="https://en.wikipedia.org/wiki/Diffusion-limited_aggregation">Diffusion Limited Aggregation&lt;/a> mixed with a hallway constraint that mimics the large part of PHS.&lt;/p>
&lt;ol>
&lt;li>Start somewhere in the middle, add this and all possible directions up to a certain dynamic length (I used a standard deviation of 1.4 with a mean of 5, ) as nodes: &lt;code>[{x,y,direction},...]&lt;/code>.&lt;/li>
&lt;li>We will be looping until all &lt;strong>nodes&lt;/strong> and &lt;strong>edges&lt;/strong> (we&amp;rsquo;ll describe that shortly,) are gone.&lt;/li>
&lt;li>When we have node then check to see if the path between it&amp;rsquo;s &amp;lsquo;x,y&amp;rsquo; and &amp;lsquo;x2,y2&amp;rsquo; (given the length and direction) is clear. If it is, then add the entire path minus the start and end as &lt;strong>edges&lt;/strong>, and add the end as a new node. Shuffle nodes after adding a new one. After building the path run through the path array randomly attempting to build a room in all directions. (this won&amp;rsquo;t be entirely possible and will leave negative space to fill with edges.)&lt;/li>
&lt;li>If there are no nodes, repeat step 3 except with edges (this helps fill the map negative space.)&lt;/li>
&lt;li>After all nodes and edges are gone then cover all cells adjacent to floors with walls if it&amp;rsquo;s empty.&lt;/li>
&lt;/ol>
&lt;p>I found it helpful to use this simple formula to generate hallway lengths with a mean and standard deviation constraint. Both the x and y would work fine, here we&amp;rsquo;re using the y only.&lt;/p></description></item><item><title>Generating Ancient Ruins</title><link>https://nathanielinman.com/generating-ancient-ruins/</link><pubDate>Thu, 03 May 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/generating-ancient-ruins/</guid><description>&lt;p>While creating algorithms for random continent generation, I came across an old algorithm I had worked with called &lt;a href="https://en.wikipedia.org/wiki/Coupled_map_lattice">Coupled Map Lattice&lt;/a>. Using that to create a continent was hard but I was able to accomplish it doing layers of filters:&lt;/p>
&lt;ul>
&lt;li>generate map with noise between -1 and 1&lt;/li>
&lt;li>apply CML using Spatiotemporal Intermittency settings&lt;/li>
&lt;/ul>
&lt;p>(a = 1.75, ε = 0.6)&lt;/p>
&lt;ul>
&lt;li>I found that using something too chaotic didn&amp;rsquo;t have a noticeable affect compared to just generating noise in general.&lt;/li>
&lt;/ul>
&lt;p>normalize values to between 0 and 255
apply a gaussian blur
normalize values to between 0 and 1
apply slight height restrictions based on distance to center of map&lt;/p></description></item><item><title>Ability Icon User Experience</title><link>https://nathanielinman.com/ability-icon-user-experience/</link><pubDate>Wed, 07 Mar 2018 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/ability-icon-user-experience/</guid><description>&lt;p>When using abilities within most games the user doesn&amp;rsquo;t have any time to look for an ability name so recalling an ability quickly by an image or icon that accurately represents it is incredibly beneficial. Similar to this idea, there are 4 basic requirements when creating ability icons. Below they are listed in priority order.&lt;/p>
&lt;ol>
&lt;li>It must be easily used (click/button press, etc.)&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>The user shouldn&amp;rsquo;t have to look around documentation to understand what button to press&lt;/li>
&lt;li>The user shouldn&amp;rsquo;t have to struggle to hold down multiple buttons just to use it&lt;/li>
&lt;li>Accessibility should be taken into account (screen readers, etc.)&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>It must be easy to interpret it&amp;rsquo;s purpose&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>The user can immediately see the icon and have a meta thought about what it means, and thereby understand the ability that is being represented intuitively.&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>It must be identifiably unique to other icons&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>Icons shouldn&amp;rsquo;t look exactly alike&lt;/li>
&lt;li>Sometimes its best to have certain icons look similar if they have similar functions, but how similar they look should not cause confusion&lt;/li>
&lt;/ul>
&lt;ol>
&lt;li>It must not be too distracting&lt;/li>
&lt;/ol>
&lt;ul>
&lt;li>The icon should be convenient to the user, not distracting from the gameplay.&lt;/li>
&lt;li>The icon must be appropriately sized&lt;/li>
&lt;li>The icon must be carefully colored&lt;/li>
&lt;li>The icon must have an appropriate amount of contrast&lt;/li>
&lt;/ul></description></item><item><title>Updating a SPA automatically without browser refresh</title><link>https://nathanielinman.com/updating-a-spa-automatically-without-browser-refresh/</link><pubDate>Tue, 11 Jul 2017 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/updating-a-spa-automatically-without-browser-refresh/</guid><description>&lt;p>I was asked a very interesting interview question today.&lt;/p>
&lt;blockquote>
&lt;p>Lets assume you have a single page application running on n users computers as a dashboard and you updated the application, how does all of the clients receive and manage the updated assets without incurring a browser refresh.&lt;/p>&lt;/blockquote>
&lt;p>The first problem to figure out is how do I know the application was updated?&lt;/p>
&lt;ol>
&lt;li>Polling the entry bundle asset&lt;/li>
&lt;li>Polling the Index.html and comparing hashes/versions&lt;/li>
&lt;li>Polling some custom tiny server text doc&lt;/li>
&lt;li>Dashboard websocket contains the version&lt;/li>
&lt;li>On acquisition of new data it contains version&lt;/li>
&lt;li>We don&amp;rsquo;t update until a change of route&lt;/li>
&lt;/ol>
&lt;p>Now we have a version, we distinguish that the server version is &amp;lsquo;greater&amp;rsquo; than ours. How do we acquire the new asset?&lt;/p></description></item><item><title>Angular was dead on arrival</title><link>https://nathanielinman.com/angular-was-dead-on-arrival/</link><pubDate>Mon, 10 Jul 2017 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/angular-was-dead-on-arrival/</guid><description>&lt;p>I&amp;rsquo;m commonly asked why more people don&amp;rsquo;t choose &lt;code>angular2&lt;/code> which in my head I correct to &lt;code>angular&lt;/code>. (we&amp;rsquo;re on angular 3 alread.. no, 4,&amp;hellip; no.) Quite simply, the answer is Typescript. Whether we like it or not the majority of javascript developers in our field are new or mediocre developers who don&amp;rsquo;t have the time or cognitive ease to attempt to &lt;em>learn another language.&lt;/em>&lt;/p>
&lt;p>It was a huge mistake for the team to release the library with the small amount of constantly outdated documentation entirely in Typescript. &lt;em>Most &lt;strong>stackoverflow&lt;/strong> searches for angular aren&amp;rsquo;t even relevant or accurate given the constantly changing api&lt;/em>. Without good documentation, and so much irrelevant or outdated answers on stackoverflow these developers lose hope, and angular lost potential users.&lt;/p></description></item><item><title>Zsh Theme For Pragmata Pro</title><link>https://nathanielinman.com/zsh-theme-for-pragmata-pro/</link><pubDate>Sun, 02 Apr 2017 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/zsh-theme-for-pragmata-pro/</guid><description>&lt;p>Having spent a lot of money on purchasing the &lt;code>Pragmata Pro&lt;/code> font (mostly to acquire a well-made set of glyphs for things like lambdas etc, I decided to allow this font to supplement my zsh theme. Here&amp;rsquo;s the results.&lt;/p>
&lt;p>This file is updated often and available on Github &lt;a href="https://raw.githubusercontent.com/NathanielInman/dot-files/master/pragmata.zsh-theme">here&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/usr/bin/env zsh
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>local LAMBDA&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%(?,%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[green]%}λ,%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[red]%}λ)&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#f92672">[[&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&lt;/span>$USER&lt;span style="color:#e6db74">&amp;#34;&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#e6db74">&amp;#34;root&amp;#34;&lt;/span> &lt;span style="color:#f92672">]]&lt;/span>; &lt;span style="color:#66d9ef">then&lt;/span> USERCOLOR&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;red&amp;#34;&lt;/span>; &lt;span style="color:#66d9ef">else&lt;/span> USERCOLOR&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;yellow&amp;#34;&lt;/span>; &lt;span style="color:#66d9ef">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Git sometimes goes into a detached head state. git_prompt_info doesn&amp;#39;t&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># return anything in this case. So wrap it in another function and check&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># for an empty string.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> check_git_prompt_info&lt;span style="color:#f92672">()&lt;/span> &lt;span style="color:#f92672">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> git rev-parse --git-dir &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; &lt;span style="color:#66d9ef">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> &lt;span style="color:#f92672">[[&lt;/span> -z &lt;span style="color:#66d9ef">$(&lt;/span>git_prompt_info&lt;span style="color:#66d9ef">)&lt;/span> &lt;span style="color:#f92672">]]&lt;/span>; &lt;span style="color:#66d9ef">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg&lt;span style="color:#e6db74">[blue]%}detached-head%{&lt;/span>$reset_color&lt;span style="color:#e6db74">%}) &lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>git_prompt_status&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">%{&lt;/span>$fg&lt;span style="color:#e6db74">[yellow]%}→ &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>git_prompt_info&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74"> &lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>git_prompt_status&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[cyan]%}→ &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[cyan]%}→ &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">function&lt;/span> get_right_prompt&lt;span style="color:#f92672">()&lt;/span> &lt;span style="color:#f92672">{&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">if&lt;/span> git rev-parse --git-dir &amp;gt; /dev/null 2&amp;gt;&amp;amp;1; &lt;span style="color:#66d9ef">then&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo -n &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>git_prompt_short_sha&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74">%{&lt;/span>$reset_color&lt;span style="color:#e6db74">%}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">else&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo -n &lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$reset_color&lt;span style="color:#e6db74">%}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">fi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>PROMPT&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">${LAMBDA}\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> %{$fg_bold[$USERCOLOR]%}%n\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> %{$fg_no_bold[magenta]%}[%3~]\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> $(check_git_prompt_info)\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">%{$reset_color%}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>RPROMPT&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#39;$(get_right_prompt)&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Format for git_prompt_info()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_PREFIX&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg&lt;span style="color:#e6db74">[blue]%}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_SUFFIX&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$reset_color&lt;span style="color:#e6db74">%}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_DIRTY&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[yellow]%} &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_CLEAN&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[green]%} &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Format for git_prompt_status()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_ADDED&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[green]%}⮹ &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_MODIFIED&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[blue]%}⭍&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_DELETED&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[red]%}⮾ &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_RENAMED&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[magenta]%}⭷ &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_UNMERGED&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[yellow]%}⮓ &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_UNTRACKED&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[cyan]%}⯑ &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Format for git_prompt_ahead()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_AHEAD&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[white]%}⮍ &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_BEHIND&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[white]%}⮏ &amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Format for git_prompt_long_sha() and git_prompt_short_sha()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_SHA_BEFORE&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34; %{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[white]%}[%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[blue]%}&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ZSH_THEME_GIT_PROMPT_SHA_AFTER&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;%{&lt;/span>$fg_bold&lt;span style="color:#e6db74">[white]%}]&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Responsive Game Interfaces</title><link>https://nathanielinman.com/responsive-game-interfaces/</link><pubDate>Fri, 24 Mar 2017 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/responsive-game-interfaces/</guid><description>&lt;p>&lt;img alt="game_interface" loading="lazy" src="https://nathanielinman.com/content/images/2022/11/game_interface.png">&lt;/p>
&lt;p>It&amp;rsquo;s abundantly clear that making interfaces for portals, single page applications, analytics or CRUD apps is &lt;strong>so&lt;/strong> much easier than creating applications for games. UX within games is much more complicated. Now add upon that complication a responsive design.&lt;/p>
&lt;p>It took the better part of 8 hours to get a design mock-up that worked on the smallest iphone device (man they&amp;rsquo;re tiny!) and that scales up to the largest phablet. I still need to work on detaching the pane and having a more &amp;lsquo;diablo-esque&amp;rsquo; two-pane character panel / inventory approach for desktop users.&lt;/p></description></item><item><title>Textures make a difference</title><link>https://nathanielinman.com/textures-make-a-difference/</link><pubDate>Wed, 22 Mar 2017 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/textures-make-a-difference/</guid><description>&lt;p>I&amp;rsquo;ve been playing around with textures in exploring the bleak to see how much of a difference it would make. Essentially I&amp;rsquo;m torn between two ideas:&lt;/p>
&lt;ol>
&lt;li>Make the floors all a plain color and glow them based on the environment color so as not to be too realistic and keep a more roguelike feel.&lt;/li>
&lt;li>Struggle with having textures that blend together between sectors so it has a more natural feel albeit simple in perspective to traditional 3d games.&lt;/li>
&lt;/ol>
&lt;p>At the moment I&amp;rsquo;m leaning towards number two, but I haven&amp;rsquo;t been able to reproduce a reliable glow postprocessing effect that I actually like and that feels natural. I&amp;rsquo;ll follow down both roads further before making a discrete decision.&lt;/p></description></item><item><title>No FPS is a Roguelike</title><link>https://nathanielinman.com/no-fps-is-a-roguelike/</link><pubDate>Fri, 10 Mar 2017 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/no-fps-is-a-roguelike/</guid><description>&lt;p>I&amp;rsquo;ve struggled with the concept of merging the roguelike turn-based system with a FPS. Having a turn based on when you fully leave a cell makes the monsters seem &lt;strong>jumpy&lt;/strong> which doesn&amp;rsquo;t make for very nice gameplay. Because I believe turn-based systems are core to roguelikes and first person shooters can&amp;rsquo;t be turned based in a cohesive way, I&amp;rsquo;ve dropped the FPS perspective altogether and pulled the camera above the player.&lt;/p></description></item><item><title>Building A Modern Roguelike in 2017</title><link>https://nathanielinman.com/building-a-modern-roguelike-in-2017/</link><pubDate>Wed, 08 Mar 2017 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/building-a-modern-roguelike-in-2017/</guid><description>&lt;p>Building games has become easier to do with the increase in quality of tooling and specialization software. The unfortunate side effect is the developer has to become more trained and specialized in a variety of facets in order to maintain competency in the field. Ergo building games is also harder.&lt;/p>
&lt;p>This year for the 7DRL competition I&amp;rsquo;ve been pretty lazy, which doesn&amp;rsquo;t help much to making deadlines. Setting aside &lt;em>playing&lt;/em> games for &lt;em>making&lt;/em> games I decided to finally venture into the competition whole heartedly.&lt;/p></description></item><item><title>Space Invaders Released</title><link>https://nathanielinman.com/space-invaders-released/</link><pubDate>Fri, 02 Dec 2016 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/space-invaders-released/</guid><description>&lt;p>So I&amp;rsquo;ve recently compiled a bunch of my libraries together into a collection I call &amp;lsquo;ion-cloud&amp;rsquo; available on &amp;rsquo;npm&amp;rsquo;. In order to best test these, I&amp;rsquo;ve recreated my own adaptation of &amp;lsquo;Space Invaders&amp;rsquo; available free to play here on my website by clicking the &lt;code>games&lt;/code> above or &lt;a href="https://theoestudio.github.io/space-invaders/">here&lt;/a> and &amp;lsquo;open source&amp;rsquo; on github &lt;a href="https://github.com/NathanielInman/space-invaders">here&lt;/a>.&lt;/p></description></item><item><title>Coterie Released</title><link>https://nathanielinman.com/coterie-released/</link><pubDate>Wed, 03 Aug 2016 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/coterie-released/</guid><description>&lt;p>(Aug 3, 2016 Update: Coterie is now playable on mobile or touch devices as well. &lt;a href="https://coterie.nathanielinman.com">Play Coterie&lt;/a>)&lt;/p>
&lt;p>Growing up I deeply enjoyed two specific cards games: &lt;em>Triple Triad&lt;/em> in Final Fantasy VIII and &lt;em>Tetra Master&lt;/em> in Final Fantasy IX. Having some extra time this past week I developed a simple card game variant called &lt;strong>Coterie&lt;/strong>. What started as an excuse to get more familiar with flexbox in css ended up actually being fun to play!&lt;/p></description></item><item><title>Cleaner complex IF Statements</title><link>https://nathanielinman.com/cleaner-complex-if-statements/</link><pubDate>Thu, 12 May 2016 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/cleaner-complex-if-statements/</guid><description>&lt;p>Writing clean code like Uncle Bob describes can be complicated sometimes. So you have this long if statement that&amp;rsquo;s relatively simple in design but ugly to the eyes and somewhat hard to read.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>if(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> x1&amp;gt;=img.left&amp;amp;&amp;amp;x1=img.top&amp;amp;&amp;amp;y1=img.left&amp;amp;&amp;amp;x2=img.top&amp;amp;&amp;amp;y2=lowerX&amp;amp;&amp;amp;x1=lowerY&amp;amp;&amp;amp;y1=lowerX&amp;amp;&amp;amp;x2=lowerY&amp;amp;&amp;amp;y2=a&amp;amp;&amp;amp;this=img.left&amp;amp;&amp;amp;x1=img.left&amp;amp;&amp;amp;x2=img.top&amp;amp;&amp;amp;y2=img.top&amp;amp;&amp;amp;y2r)){
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> img.scaling = Math.pow(x1-x2,2)+Math.pow(y1-y2,2);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>} //end if
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>At what point does sacrificing performance become worth it for code readability?&lt;/p></description></item><item><title>Pigeon Hole Stepping</title><link>https://nathanielinman.com/pigeon-hole-stepping/</link><pubDate>Tue, 08 Mar 2016 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/pigeon-hole-stepping/</guid><description>&lt;p>For &lt;a href="http://7drl.org/about/">7DRL&lt;/a> this year I developed a new map generation algorithm called &lt;strong>Pigeon Hole Stepping&lt;/strong>.&lt;/p>
&lt;h2 id="fill-the-map-with-walls">Fill the map with walls&lt;/h2>
&lt;p>This map generation algorithm relies on negative building techniques. This concept will make more sense as the later steps are explained.&lt;/p>
&lt;h3 id="dig-hallways">Dig Hallways&lt;/h3>
&lt;p>Essentially, we can assume that hallways that are parallel to each other are at least the length of a single room and up to two rooms apart in distance. Because of this assumption, we can make a random walker that will move around with this restriction in mind until map is filled completely.&lt;/p></description></item><item><title>NPM Module: Jugs</title><link>https://nathanielinman.com/npm-module-jugs/</link><pubDate>Sat, 30 Jan 2016 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/npm-module-jugs/</guid><description>&lt;p>App generator &lt;strong>jugs&lt;/strong> makes development fun again! You can view the source code &lt;a href="https://github.com/nathanielinman/jugs">here&lt;/a>.&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://github.com/vitejs/vite">Vite.js&lt;/a> : &lt;em>Performant Module bundler with&lt;/em> &lt;strong>tree-shaking&lt;/strong>, &lt;strong>hot module reloading&lt;/strong> &lt;em>&amp;amp;&lt;/em> &lt;strong>minification&lt;/strong>&lt;/li>
&lt;li>&lt;a href="https://github.com/babel/babel">Babel&lt;/a> : &lt;em>Transpile modern javascript, formerly called 6to5&lt;/em>&lt;/li>
&lt;li>&lt;a href="https://github.com/eslint/eslint">Eslint&lt;/a> : &lt;em>Lint your javascript in its modern format&lt;/em>&lt;/li>
&lt;li>&lt;a href="https://github.com/stylus/stylus">Stylus&lt;/a> : &lt;em>Powerful CSS Preprocessor with a beautiful syntax&lt;/em>&lt;/li>
&lt;li>&lt;a href="https://github.com/ion-cloud/ion-cloud">Ion-Cloud&lt;/a> : &lt;em>A micro library for animations &amp;amp; game development&lt;/em>&lt;/li>
&lt;/ul>
&lt;p>Simply install this app generator globally:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>npm i -g jugs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir appName
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd appName
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>jugs
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>File Structure:&lt;/strong>&lt;/p></description></item><item><title>Automata Generated Caverns</title><link>https://nathanielinman.com/automata-generated-caverns/</link><pubDate>Fri, 13 Nov 2015 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/automata-generated-caverns/</guid><description>&lt;p>Randomly generated dungeons are a lot of fun to program, but sometimes they can be pretty difficult to originally wrap your head around. For this years 7DRL I added Automata Generated Caverns as one of the algorithms I wanted to figure out completely. You can read more specifically on the theory &lt;a href="https://www.wikiwand.com/en/Automata_theory">here&lt;/a>.&lt;/p></description></item><item><title>.zshrc</title><link>https://nathanielinman.com/.zshrc/</link><pubDate>Sun, 09 Aug 2015 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/.zshrc/</guid><description>&lt;p>It all started one long rainy night after setting down my Archlinux laptop and picking up my macbook pro.. inevitably annoyed quickly by the ancient bash version. Switched to z shell. Downloaded oh-my-zsh for a prettiness template to start with.. customized my own theme, and have been hooked for a solid 3 months so far.&lt;/p>
&lt;p>(Many years later, it&amp;rsquo;s much more refined - 2019/01/28)&lt;/p>
&lt;p>You can alternatively view all my dotfiles on github &lt;a href="https://github.com/NathanielInman/dot-files">here&lt;/a>.&lt;/p></description></item><item><title>.vimrc</title><link>https://nathanielinman.com/.vimrc/</link><pubDate>Fri, 15 May 2015 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/.vimrc/</guid><description>&lt;p>I&amp;rsquo;ve decided to release my small &lt;code>.vimrc&lt;/code> file to others who are interested.&lt;/p>
&lt;p>You can also view all my dotfiles on github &lt;a href="https://github.com/NathanielInman/dot-files">here&lt;/a>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;----------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; Start general configurations&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;----------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set encoding&lt;span style="color:#f92672">=&lt;/span>utf&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">8&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set nocompatible &lt;span style="color:#e6db74">&amp;#34; don&amp;#39;t lose new vim features due to compatibility&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set ts&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span> sw&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span> et &lt;span style="color:#e6db74">&amp;#34; 2 space tabs (tabstop=2, shiftwidth=2, expandtab=true)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set autoindent &lt;span style="color:#e6db74">&amp;#34;Always autoindent&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set hlsearch &lt;span style="color:#e6db74">&amp;#34; highlight search terms&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set incsearch &lt;span style="color:#e6db74">&amp;#34; show search while typing it&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set smartcase &lt;span style="color:#e6db74">&amp;#34; ignore case if search is lc, sensitive otherwise&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set showmatch &lt;span style="color:#e6db74">&amp;#34; set show matching parenthesis&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set mouse&lt;span style="color:#f92672">=&lt;/span>a &lt;span style="color:#e6db74">&amp;#34; Allow mouse scrolling (peer programming)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set backspace&lt;span style="color:#f92672">=&lt;/span>indent,eol,start &lt;span style="color:#e6db74">&amp;#34; Allow backspace to work normally&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set number &lt;span style="color:#e6db74">&amp;#34; Turn on line numbers&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set relativenumber &lt;span style="color:#e6db74">&amp;#34; show relative line numbers&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set laststatus&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span> &lt;span style="color:#e6db74">&amp;#34; Always show statusline&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set list &lt;span style="color:#e6db74">&amp;#34;Show invisible characters, next line specifies characters&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set belloff&lt;span style="color:#f92672">=&lt;/span>all &lt;span style="color:#e6db74">&amp;#34;Turn off the annoying audible error bell&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set listchars&lt;span style="color:#f92672">=&lt;/span>eol:&lt;span style="color:#960050;background-color:#1e0010">¬&lt;/span>,nbsp:&lt;span style="color:#960050;background-color:#1e0010">¤&lt;/span>,space:&lt;span style="color:#960050;background-color:#1e0010">⋅&lt;/span>,trail:&lt;span style="color:#960050;background-color:#1e0010">•&lt;/span>,tab:&lt;span style="color:#960050;background-color:#1e0010">››&lt;/span>,&lt;span style="color:#66d9ef">extends&lt;/span>:&lt;span style="color:#960050;background-color:#1e0010">…&lt;/span>,precedes:&lt;span style="color:#960050;background-color:#1e0010">…&lt;/span>,conceal:&lt;span style="color:#960050;background-color:#1e0010">‡&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set rtp&lt;span style="color:#f92672">+=~/.&lt;/span>vim&lt;span style="color:#f92672">/&lt;/span>bundle&lt;span style="color:#f92672">/&lt;/span>Vundle&lt;span style="color:#f92672">.&lt;/span>vim&lt;span style="color:#f92672">/&lt;/span> &lt;span style="color:#e6db74">&amp;#34; set runtime path to use vundle for plugins&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;----------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; Start Vundle and loading plugins&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;----------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>call vundle&lt;span style="color:#75715e">#begin()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;VundleVim/Vundle.vim&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Best plugin management for vim&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;moll/vim-node&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Allows gf/gF on relative node paths&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;digitaltoad/vim-pug&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Jade/Pug templating for Node&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;wavded/vim-stylus&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Stylus preprocessor for css&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;airblade/vim-gitgutter&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;See git + / - / ~ in gutter&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;scrooloose/nerdtree&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;File management&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;Xuyuanp/nerdtree-git-plugin&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Shows modifications in nerdtree&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;itchyny/lightline.vim&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;pretty statusline&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;ctrlpvim/ctrlp.vim&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Fuzzy file finder&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;scrooloose/nerdcommenter&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Allows commenting of lines easier&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;ap/vim-buftabline&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Allows the buffers as tabs&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;easymotion/vim-easymotion&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Allows quick movement around vim&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;chr4/nginx.vim&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;nginx sytax support&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;arcticicestudio/nord-vim&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;color scheme&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;pangloss/vim-javascript&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;Better tabbing in javascript&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;posva/vim-vue&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;vue file syntax support&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Plugin &lt;span style="color:#e6db74">&amp;#39;junegunn/goyo.vim&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34;distraction-free centering of file&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>call vundle&lt;span style="color:#75715e">#end()&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>filetype plugin indent on &lt;span style="color:#e6db74">&amp;#34; Plugins default to indent&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;---------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; Reconfigure Plugin Options&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;---------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let g:NERDCustomDelimiters &lt;span style="color:#f92672">=&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;vue&amp;#39;&lt;/span>: {&lt;span style="color:#e6db74">&amp;#39;left&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;//&amp;#39;&lt;/span>}, &lt;span style="color:#e6db74">&amp;#39;javascript&amp;#39;&lt;/span>: {&lt;span style="color:#e6db74">&amp;#39;left&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;//&amp;#39;&lt;/span>}}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let g:vue_pre_processors &lt;span style="color:#f92672">=&lt;/span> [&lt;span style="color:#e6db74">&amp;#39;pug&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;stylus&amp;#39;&lt;/span>]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let g:lightline &lt;span style="color:#f92672">=&lt;/span> {&lt;span style="color:#e6db74">&amp;#39;colorscheme&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;nord&amp;#39;&lt;/span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let g:lightline&lt;span style="color:#f92672">.&lt;/span>separator &lt;span style="color:#f92672">=&lt;/span> { &lt;span style="color:#e6db74">&amp;#39;left&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;right&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let NERDTreeQuitOnOpen &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let g:gitgutter_sign_added&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;++&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let g:gitgutter_sign_modified&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;~~&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let g:gitgutter_sign_removed&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;--&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let g:gitgutter_max_signs&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">3000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let g:ctrlp_map &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34; ctrl+p starts plugin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let g:ctrlp_cmd &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;CtrlP&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let g:ctrlp_working_path_mode &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#39;ra&amp;#39;&lt;/span> &lt;span style="color:#e6db74">&amp;#34; start nearest search dir @ root .git&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;---------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; Keyboard mappings&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;---------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>let mapleader&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#ae81ff">\&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; Session management&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap s :ToggleWorkspace
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; Distraction-free editing&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap d :Goyo &lt;span style="color:#ae81ff">80&lt;/span>x75&lt;span style="color:#f92672">%&lt;/span>:set showtabline&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap v :Goyo&lt;span style="color:#f92672">!&lt;/span>:set showtabline&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; Open nerdtree and then open current file location in nerdtree&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap \ :NERDTreeToggle
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap \ :NERDTreeFind
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; New buffers, quitting buffers&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap T :enew
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap bl :bnext
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap bh :bprevious
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap bq :bp bd &lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap bs :ls
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap nj :rightbelow sb &lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap nk :leftabove sb &lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap nh :vert leftabove sb &lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap nl :vert rightbelow sb &lt;span style="color:#75715e">#&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; Indicate color code under cursor&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nmap z :echo &lt;span style="color:#e6db74">&amp;#34;hi trans lo&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; Selecting, making and resizing windows&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap j j
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap l l
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap h h
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap k k
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap mk K
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap mj Kr
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap mh H
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap ml Hr
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap sk :res &lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap sj :res &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap sh :vertical res &lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap sl :vertical res &lt;span style="color:#f92672">+&lt;/span>&lt;span style="color:#ae81ff">5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap j gj
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>nnoremap k gk
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;---------------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; Color scheme configuration&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34;---------------------------------------------&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>syntax on &lt;span style="color:#e6db74">&amp;#34;Make sure syntax highlighting is on&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>colorscheme nord
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hi BufTabLineCurrent ctermfg&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">16&lt;/span> ctermbg&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">6&lt;/span> cterm&lt;span style="color:#f92672">=&lt;/span>NONE
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hi BufTabLineHidden ctermfg&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">8&lt;/span> ctermbg&lt;span style="color:#f92672">=&lt;/span>NONE cterm&lt;span style="color:#f92672">=&lt;/span>NONE
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hi BufTabLineFill ctermfg&lt;span style="color:#f92672">=&lt;/span>NONE ctermbg&lt;span style="color:#f92672">=&lt;/span>NONE cterm&lt;span style="color:#f92672">=&lt;/span>NONE
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">&amp;#34; Color Fixes Caused by Plugins&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>hi link vueSurroundingTag htmlEndTag
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Versioning NPM packages</title><link>https://nathanielinman.com/versioning-npm-packages/</link><pubDate>Thu, 30 Apr 2015 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/versioning-npm-packages/</guid><description>&lt;p>A lot of people don&amp;rsquo;t know that it&amp;rsquo;s super simple to version npm packages. And have used things like &lt;code>gulp-bump&lt;/code> or other needless packages. &lt;code>man npm-version&lt;/code> shows us that it&amp;rsquo;s as simple as:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>npm version major
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm version minor
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>npm version patch
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Following semver, it will update the &lt;code>package.json&lt;/code> file automatically and apply a &lt;code>git&lt;/code> tag with the version. This allows you to duplicate annotated package versions on github with what&amp;rsquo;s been released in your packages through &lt;code>npm deploy&lt;/code>. Couldn&amp;rsquo;t be simpler!&lt;/p></description></item><item><title>Works</title><link>https://nathanielinman.com/works/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nathanielinman.com/works/</guid><description>Free and open-source games and projects</description></item></channel></rss>