<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by John Speck on Medium]]></title>
        <description><![CDATA[Stories by John Speck on Medium]]></description>
        <link>https://medium.com/@eltocino?source=rss-3010e9e2ff6------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*aaMH2S7NUbO9Vtw9.jpeg</url>
            <title>Stories by John Speck on Medium</title>
            <link>https://medium.com/@eltocino?source=rss-3010e9e2ff6------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 03:48:29 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@eltocino/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[changes on the window interface; a quirky conundrum of a front end dev]]></title>
            <link>https://medium.com/@eltocino/changes-on-the-window-interface-quirky-conundrums-of-a-front-end-dev-b63803ea3cd7?source=rss-3010e9e2ff6------2</link>
            <guid isPermaLink="false">https://medium.com/p/b63803ea3cd7</guid>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[css]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[dev]]></category>
            <dc:creator><![CDATA[John Speck]]></dc:creator>
            <pubDate>Fri, 06 Oct 2023 21:03:03 GMT</pubDate>
            <atom:updated>2023-10-06T21:06:15.461Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/612/1*PUpsci3dCU9GWfPs-RDEXg.jpeg" /><figcaption>glorious photo of an open window looking at a serene sky with stylized birds flying into the distance</figcaption></figure><p>In my current role, I do a lot of crawling around the front end of Ecommerce sites to improve UX and reduce friction. While developing a new feature, I found a bug had been introduce relating to the window object.</p><p>My code involved creating a checklist for the user as they worked through attribute selection for certain products. As the user worked through the checklist, a “make selection” Anchor tag would trigger some javascript to smoothly scroll the user to the next item they needed to select and allow them to work through their product order more smoothly.</p><p>The site is built using popular frontend framework that rhymes with “screw”(-y) and does some dynamic rendering as one interacts with the DOM. I found a bug in my treatment after a user cleared all options and started the selection process again. The curious thing was that the Javascript I had written was misfiring. I pinpointed the bug to this line:</p><pre>elDistanceToTop = <br>  window.pageYOffset + <br>  document.querySelector(`#ElementID`)?.getBoundingClientRect().top</pre><p>What I found was that when that element was re-rendered, window.pageYOffset was being reset to 0, and user would not be directed to the place where I need them to go.</p><p>After some non-trivial research, and some monkeying around with workarounds like utilizing the document object instead of the window object to calculate Y Offset, I came across a brilliant SO that elucidated yet another of the quirky mysteries of front end development. The bug was not the javascript at all, but the omnipresent and all powerful CSS:</p><p><a href="https://stackoverflow.com/questions/28050548/window-pageyoffset-is-always-0-with-overflow-x-hidden">window.pageYOffset is always 0 with overflow-x: hidden</a></p><p>My solution was a CSS one-liner, which I always value over a whole bunch of convoluted Vanilla Javscript:</p><pre>body<br>  overflow-x: unset;<br>  overflow-y: unsetbody;</pre><p>And *Bingo* the code was back to working as expected; window.pageYOffset was returning it’s magical pixel values to scroll the user where I needed them to go.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*O777aTZmkik7sWdyLL2WXQ.jpeg" /></figure><p>BTW- Here’s some more tangential learning that I came across for the 🤓 friends like me that suddenly became fascinated with “pageYOffset” property vs. “scrollTop” property.</p><p><a href="https://stackoverflow.com/questions/22727751/window-pageyoffset-vs-document-documentelement-scrolltop">window.pageYOffset vs document.documentElement.scrollTop</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b63803ea3cd7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Simple “Progress Bar”]]></title>
            <link>https://medium.com/@eltocino/a-simple-progress-bar-ad0c0ea64fa8?source=rss-3010e9e2ff6------2</link>
            <guid isPermaLink="false">https://medium.com/p/ad0c0ea64fa8</guid>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[components]]></category>
            <category><![CDATA[accessibility]]></category>
            <category><![CDATA[widget]]></category>
            <category><![CDATA[progress-bar]]></category>
            <dc:creator><![CDATA[John Speck]]></dc:creator>
            <pubDate>Mon, 29 Jun 2020 14:47:59 GMT</pubDate>
            <atom:updated>2020-06-29T14:47:59.229Z</atom:updated>
            <content:encoded><![CDATA[<h3>A Simple “Progress Bar” Widget</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*-0oRKDa4n9XPhREH3Fq_rA.png" /><figcaption>This, friends, is a Progress Bar Widget</figcaption></figure><p>I was recently given this exercise as a take home assignment for a code interview. I really enjoyed the interview at the company. It’s a cool, game-based educational training platform for healthcare.</p><p>The Lead Engineer has an “easy going” attitude that belies the rigorous C.S. background that he has. Furthermore, he seemed very supportive and proud of the community of developers they have created and a touted a cozy two building campus where everyone knows each other. My kind of place.</p><p>Needless to say, I was super excited to work on this project. When he described this as a widget, it threw me off a little bit. Coming from a Software Intensive that prides itself on placing “Software Engineers” in positions at well-known, high paying companies and whose attendees are often C.S. grads, there was not a lot of talk about “widgets”. It was much more highfalutin stuff like “performant, readable code” and “component architecture”.</p><p>Here’s the widget I was able to build. It’s not “exactly” what the mock up outlined, but I did my best given the time frame and lack of important key knowledge (like Typography). I’ve changed it slightly to make it more understandable for someone without the company context (and fixed a spelling error, happens to the best of us.)</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcodepen.io%2Fspeckworks%2Fembed%2Fpreview%2FVweMyvr%3Fheight%3D600%26slug-hash%3DVweMyvr%26default-tabs%3Dcss%2Cresult%26host%3Dhttps%3A%2F%2Fcodepen.io&amp;display_name=CodePen&amp;url=https%3A%2F%2Fcodepen.io%2Fspeckworks%2Fpen%2FVweMyvr&amp;image=https%3A%2F%2Fassets.codepen.io%2F3743393%2Finternal%2Fscreenshots%2Fpens%2FVweMyvr.default.png%3Fformat%3Dauto%26amp%3Bha%3Dfalse%26amp%3Bheight%3D400%26amp%3Bquality%3D75%26amp%3Bv%3D1%26amp%3Bversion%3D1593440933%26amp%3Bwidth%3D700&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=codepen" width="800" height="600" frameborder="0" scrolling="no"><a href="https://medium.com/media/0ba1e70906ed48f7f70f527cf279a935/href">https://medium.com/media/0ba1e70906ed48f7f70f527cf279a935/href</a></iframe><h4>Some key takeaways:</h4><ul><li>I used <strong>Semantic HTML</strong> in the code where possible to make this as accessible as possible.</li><li>The JavaScript here still needs to be tweaked a bit to make it <strong>programmatic</strong> and not “hard-coded”, but this was more of a “styling exercise” for me given the time constraints. I’ll probably fix that as soon as this blog is finished. 😅 #devdad life.</li><li>The layout is clean and easy to follow. The list of grades are displayed as “progress bar”-style components that are easy to identify and determine which students have the highest and/or lowest scores for the course.</li><li>The colors are muted and pastel. It is a little hard to distinguish between the second and third colors, (shades of green). As this list grows with the number of participants in the course, it’s imperative that the colors used be easy to differentiate and <strong>web-friendly colors</strong>.</li><li>The <strong>progress bar</strong> fill must be easy for the instructor to see, but it also must not obscure the 4 different measures the students are being graded on.</li><li><strong>Typography</strong> does make a big impression on the user. It’s important to have as much information from the original designer as possible. Identifying the correct typography of the design can be quite time consuming. (I’m certain the original designer would have some feedback for me, and I would be eager to hear it, btw.)</li><li>The design should be <strong>responsive</strong>. Instructors may be using tablets, mobile phones, desktops or laptops. It’s important that style rules maximize responsiveness of the design so it can be easily understood across various devices. I’ve done my best to use responsive measurements like “ems” and “vw” or “vh” whenever possible. This takes a bit more time, but is super important with the variety of devices being used these days.</li><li><strong>Accessibility</strong>: Utilizing semantic HTML is a good way to make it easy for screen readers and assistive devices to interpret text and content on a web page. ARIA tags can be used to supplement semantic HTML and assist in this effort.</li></ul><p>As always, reach out with any feedback and suggestions. I love to hear from friends. Happy Coding!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ad0c0ea64fa8" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Freshers Beware: Some Tech “Employment” Scams To Watch Out For]]></title>
            <link>https://medium.com/@eltocino/freshers-beware-some-tech-employment-scams-to-watch-out-for-e2c3df09685f?source=rss-3010e9e2ff6------2</link>
            <guid isPermaLink="false">https://medium.com/p/e2c3df09685f</guid>
            <category><![CDATA[freshers]]></category>
            <category><![CDATA[employment]]></category>
            <category><![CDATA[phishing]]></category>
            <category><![CDATA[training]]></category>
            <category><![CDATA[scams-to-avoid]]></category>
            <dc:creator><![CDATA[John Speck]]></dc:creator>
            <pubDate>Wed, 24 Jun 2020 15:42:16 GMT</pubDate>
            <atom:updated>2020-06-24T15:42:44.805Z</atom:updated>
            <content:encoded><![CDATA[<h3>Freshers Beware: Some Tech Employment Scams To Watch Out For</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/960/1*b36WZdhwkFk5lbrErSfF6Q.jpeg" /></figure><p>Transitioning to tech has been an awesome learning journey. More often than not, I’ve met total strangers that are encouraging, helpful and seem to be genuinely kind people. However, like anything involving commerce on the internet, there is a sketchy side. Here are a some scams that I have encountered and would like to share with other Junior Devs and Freshers that are looking for gainful income generating opportunities online:</p><p><strong>The Upwork Account Scam:</strong></p><p>Upwork is a platform much like Fiverr, where a Junior Dev can leverage their new skills to make some money, while continuing to practice their craft. From what I know, it is completely legit and they seem to have some pretty thorough Identity confirmation protocols to ensure there are not “bad actors” using the platform. Nonetheless, it seems one that International LinkedIn users are aware of and would like to leverage for their own personal gain.</p><p>Seemingly well-meaning professionals reach out with an intention to “network” and are excited to offer you a proposal. Here’s a few that I “red-flagged” early on (names have been removed to protect them as some may actually be well-intentioned):</p><ul><li><em>Hi, John. Nice to meet you. How are you doing? I looked at your profile and feel you are a good fit for my business idea. Are you interested in working with me?</em></li><li><em>I’d love to send you my proposal in a nut shell. The aim is to collaborate together and make money at the certain freelancing site. As a senior developer, I have many years of web development experience and I am familiar with such a workflow. You don’t need to put your time or effort from your end. If you don’t mind, you create a freelancer account and lend me to take cool projects matching my skills. I will handle all of the work and we will share profit based on determined percentage. I know it sounds odd and unfamiliar but I’d love to give you full understanding if you are a bit interested in my suggestion. Thanks.</em></li><li><em>I am a full stack developer and am looking for remote jobs on Upwork. I have an issue that need your help so if you don’t mind can I ask you favor? I will reward you.</em></li></ul><p>Now I have read the basic user agreement terms on Upwork, so I knew right away these are unethical use cases for the platform. I always respond politely, but firmly that I’m not interested in any arrangements that are outside of the user agreement I have signed.</p><p>If you have seen other scams, or are curious about the legality of different sorts of Upwork employment agreements, here is a link to some other common Scams: <a href="https://phoenixhwc.com/upwork-scams/">https://phoenixhwc.com/upwork-scams/</a></p><p><strong>“Free Training projects and Job Placement with H1B sponsorship”:</strong></p><p>There is one company that has contacted me a couple of times about a free training program. Upon closer inspection of the employment agreement, they upfront tell you that you are going to have to lie on your resume claiming you have 5+ years of .Net experience. Furthermore, there is a $6,000 charge for breaking any terms of their “free training”. In other words, if you don’t want to be placed in Wyoming writing code for “Random Joe and The Schmoes” locked in at $50,000 for your first 18 months (raise to $55k for top performers!), then you will have to pay $6,000.</p><p>Now this might actually Still be a legitimate opportunity for someone, especially considering the coveted H1B Sponsorship. However, any program that Requires you to lie on your resume about 5+ years experience with a technology that you have just learned, just reeks of sketchiness and I can only imagine what other sorts of unethical tactics one might find there.</p><p><strong>Make sure to Check Glassdoor and/or Google Reviews on any Organization offering you training or potential employment, and read carefully to try to get a balanced perspective on what you’re signing up for.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/1*BtGWoh3IWulpP8-_C0mf8w.jpeg" /><figcaption><a href="https://mytechdecisions.com/network-security/phishing-email-scam-texas/">https://mytechdecisions.com/network-security/phishing-email-scam-texas/</a></figcaption></figure><h4>Dice Job Offer:</h4><p>The latest one I received is a pretty elaborate scam, that again seems to be phishing for my identity, Address, Name, Sex, Bank Acct. etc. They offer an “ancillary role” that would pay $5,000 per month for 6–10 hours per week of my time. Pretty sweet, right? Wrong!</p><p>Now, this is a potential debt collector’s arrangement and I don’t doubt that there are positions that pay that kind of money for that “little effort” , however, they don’t come “out of the blue”, and the biggest red flag is that no one asks you to sign a contract for a job Before you have even spoken to someone on the phone or over videochat.</p><p>Here is the “official” job offer, in case someone approaches you via your Dice.com acct:</p><p><em>We are in need of a corporate representative in the United States and Canada to liaise with our existing customers and help strengthen our business operation in the North America region. NOTE.. (This position is open for any individual regardless of your areas of specialty and also does not involve any traveling within or outside current location of potential employee). [Company obscured to protect their business] will remotely guide potential employees through the processes involved in this role for effective discharge of duties. Like I said in my previous email your job will be a 1-year ancillary role with the possibilities of an extension.</em></p><p><em>Please find attached detailed information about the role for your review and feedback, We look forward to your quick reply.</em></p><p><em>Best regards.</em></p><p><em>N.P<br></em>Again, I have obscured the identity of the company supposedly being represented and the name of the person who sent it. Most likely it is a name that the actually “phisherman” has stolen from elsewhere on the internet and there is no need to further incriminate random people.</p><p>Needless to say, I have contact the masqueraded organization and informed them of this seemingly fraudulent business proposal. I will now reply to “N.P.” and inform them of that and ask them to cease and desist with harassing “job offer” emails.</p><p>For more info on Dice.com scams, I found this helpful thread on reddit: <a href="https://www.reddit.com/r/ITCareerQuestions/comments/en8irw/dice_job_offer_is_it_a_scam/">https://www.reddit.com/r/ITCareerQuestions/comments/en8irw/dice_job_offer_is_it_a_scam/</a></p><p>For more information on Phishing, here is a great website: <a href="https://www.phishing.org/common-phishing-scams">https://www.phishing.org/common-phishing-scams</a></p><p>Thanks for reading, good luck on your job search and let’s get back to what we are excited about: Software Development.</p><p>Happy Coding!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e2c3df09685f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Space Complexity for Newbs.]]></title>
            <link>https://medium.com/@eltocino/space-complexity-for-newbs-aef60b8fc700?source=rss-3010e9e2ff6------2</link>
            <guid isPermaLink="false">https://medium.com/p/aef60b8fc700</guid>
            <category><![CDATA[space-complexity]]></category>
            <category><![CDATA[newbie]]></category>
            <category><![CDATA[whiteboarding]]></category>
            <category><![CDATA[algorithms]]></category>
            <dc:creator><![CDATA[John Speck]]></dc:creator>
            <pubDate>Wed, 17 Jun 2020 14:04:02 GMT</pubDate>
            <atom:updated>2020-06-17T14:04:02.175Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CYKJK5-wyo1DwJPtNnmUGw.jpeg" /><figcaption>Phys.org</figcaption></figure><p>In my quest to be as prepared as possible for a serious tech role, I attended a workshop by a recruiter(who I’ll call Fred) who had worked with Facebook for about a year and had very good results successfully landing job work his candidates, with a rate of 60%.</p><p>Now I have no idea if that means Fred placed 3 people or 30 at FB, but I definitely paid close attention to what he had to say in the “mock interview” he set up for us.</p><p>Our “guinea pig” that evening was given an algorithm challenge to solve and Fred eagerly looked on to assess his coding skills. The code challenge only lasted about 10 minutes and then Fred moved on to the “comments” part of the chat stating, “Do you want to know why you failed?”.</p><p>Brutal?</p><p>Yes, but why mince words? We were all there to learn something and Fred was laying it down as straightforwardly as he could. First of all, Fred noted that the solution was a “brute force” solution. The interviewee had clearly seen the problem before and had an idea how to go about it by creating a nested “for loop” and actually got a solution, but it was O(n²), (which is only worse than an O(n!) solution).</p><p>“Space Complexity!” retorted Fred. You didn’t even talk about how much space your solution required. We all sat back and marveled “ahaaa”, like the newbs we were (and some of the people in the room had hard professional work experience on their resumes!). Such is life in the era of Zoom-meetups and coding workshops.</p><h3>Space Complexity</h3><p>“Space complexity is a measure of the amount of working storage an algorithm needs. That means how much memory, in the worst case, is needed at any point in the algorithm. As with time complexity, we’re mostly concerned with how the space needs grow, in big-Oh terms, as the size N of the input problem grows.” -Bluffer’s Guide to Space Complexity. Check it out here: <a href="https://courses.cs.northwestern.edu/311/html/space-complexity.html#:~:text=Space%20complexity%20is%20a%20measure,of%20the%20input%20problem%20grows."><em>https://courses.cs.northwestern.edu/311/html/space-complexity.html#:~:text=Space%20complexity%20is%20a%20measure,of%20the%20input%20problem%20grows.</em></a></p><p>Another great resource for Space Complexity concepts is Colt Steele’s JavaScript Algorithms and Data Structures on Udemy. His 6-minute portion of the course on Space Complexity is probably worth the discounted price of the whole course. Here are my chief takeaways:</p><ol><li><strong>Auxiliary Space Complexity </strong>— This is the space required by the algorithm Not including the space required by the inputs. We are talking about the space required by the algorithm as “n” grows arbitrarily large.</li><li><strong>Big O — </strong>We use the same formal language for Space complexity as we do for time complexity.</li><li><strong>Primitives — </strong>most primitives are constant space. (Booleans, Numbers, Null, Undefined)</li><li><strong>Strings </strong>— require O(n) space, where n is the number of characters in the string or “length of string”.</li><li><strong>Reference Types</strong> — are O(n), where n is the length of the Array, or the number of keys in the Object.</li></ol><p><strong>Some Examples:</strong></p><p>O(1):</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/6b278a9f94078711b4e5f39e6dcb9271/href">https://medium.com/media/6b278a9f94078711b4e5f39e6dcb9271/href</a></iframe><p>O(n):</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9e72774b17333acbffdb285483232473/href">https://medium.com/media/9e72774b17333acbffdb285483232473/href</a></iframe><p><em>and an aside, because programming is all about discovery and learning:</em></p><p><a href="https://en.wikipedia.org/wiki/Parity_of_zero#:~:text=Zero%20is%20an%20even%20number,2%2C%20specifically%200%20%C3%97%202.&amp;text=In%20this%20sense%2C%200%20is,most%20even%22%20number%20of%20all.">Parity of zero</a></p><p>O(n²):</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/3a7bbd0eb4acfc1389ff2fe24e5ecbb8/href">https://medium.com/media/3a7bbd0eb4acfc1389ff2fe24e5ecbb8/href</a></iframe><p>As always, <em>Please Call Me Out </em>if I did not understand the Space Complexity of any of these examples correctly or if there is anything else misleading in this blog.</p><p>Happy Coding!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=aef60b8fc700" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[“Minimum Swaps 2”, An Array Manipulation Algorithm in JavaScript]]></title>
            <link>https://medium.com/@eltocino/minimum-swaps-2-an-array-manipulation-algorithm-in-javascript-41ab4f9ce3ce?source=rss-3010e9e2ff6------2</link>
            <guid isPermaLink="false">https://medium.com/p/41ab4f9ce3ce</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[arrays]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[newbie]]></category>
            <category><![CDATA[code]]></category>
            <dc:creator><![CDATA[John Speck]]></dc:creator>
            <pubDate>Tue, 09 Jun 2020 21:52:14 GMT</pubDate>
            <atom:updated>2020-06-09T21:52:14.388Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/776/1*sAMeBde7zNmG7q5Fr-Tltw.jpeg" /></figure><p>This Algorithm is in the beginner/medium series level, but can get Overly- confusing if you look at the wrong tutorial.</p><p>The problem: Given an unsorted Array of consecutive integers, how do we find the minimum number of swaps to sort the Array.</p><p>To visualize that, consider:</p><p>arr =[1,3,2]</p><p>This clearly takes 1 Swap (swapping 3 and 2) and return</p><p>arr = [1,2,3]</p><p>As usual, that solution is very easy to see and reason through. However, when scaled for a larger array, (like test case arr = [7,2,3,4,6,2,5]) it quickly becomes overwhelming.</p><p>1.) One thing is certain, we are going to have to analyze every element in the given array to determine if it’s in the appropriate location. A simple for loop with an “if” statement will suffice.</p><p>Consider the pseudocode:</p><h4>for(let i = 0; i &lt; arr.length; i++) {</h4><h4>if (arr[i] != = i+1){</h4><h4>“do some jazz” to put the element in the correct spot.</h4><h4>}</h4><p>We can ignore elements in the correct place, because we don’t want to swap those. So our “if” statement allows us to look at each element in the array and compare it to “i+1”.</p><p><em>But why “i+1” you may ask? Well, Array’s are indexed from “0&quot;, while our elements in the Array is a set of numbers starting with the value “1”. So, when it’s sorted, the Array Element at index “0&quot; is going to be the same as our first element, (ie. arr[0] == 0+1)</em></p><p>2.) So what is “all that jazz”, and how do we count the quantity of swaps we need to “do”??</p><p>Why don’t we initialize a count? Say:</p><h4>“Count = 0;”</h4><p>and each time we make a swap, we can just add 1 to it:</p><h4>“Count++;”</h4><p>Done.</p><p>3.) Here’s where the logic begins to get a bit confusing. This is what we will do inside of the “if” statement when it evaluates to “!==”. We are going to need a variable, “temp”.</p><h4>a. “let temp = arr[i]”</h4><p>Whenever we find an element that is not where it should be, let’s assign it to to temp.</p><h4>b. “arr[i] = arr[temp -1]”</h4><p>We then subtract 1 from the value represented by temp and assign that to the spot we just removed the element from. Yeap! That’s our “count++”.</p><h4>c. “arr[temp -1] = temp”</h4><p>The third magical step is to take temp and put it in the place designated by “arr[temp -1]”.</p><p>Clear as mud, yes?</p><p>Basically this allows us to cycle through all the values that have been swapped and place them one place closer to where they should be, every time recording the swap. This, ultimately leads to a sorted array in the least swaps necessary.</p><p>The code:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/398/1*Qi1vq-R7AHf4ZIzBskvB1w.png" /></figure><p>Elegant, clean and ES6, baby! Voila!</p><p>Happy Coding!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=41ab4f9ce3ce" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Ransom Note — Hash Table Algorithm in JavaScript]]></title>
            <link>https://blog.devgenius.io/ransom-note-hash-table-algorithm-in-javascript-bf6171db87b9?source=rss-3010e9e2ff6------2</link>
            <guid isPermaLink="false">https://medium.com/p/bf6171db87b9</guid>
            <category><![CDATA[elegant-solutions]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[newbie]]></category>
            <category><![CDATA[coding]]></category>
            <category><![CDATA[hash-table]]></category>
            <dc:creator><![CDATA[John Speck]]></dc:creator>
            <pubDate>Wed, 03 Jun 2020 13:21:17 GMT</pubDate>
            <atom:updated>2020-06-08T21:03:47.976Z</atom:updated>
            <content:encoded><![CDATA[<h3>Ransom Note — Hash Table Algorithm in JavaScript</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/825/1*WYgfkgbR93SfsQPyh1tskA.jpeg" /></figure><p>The great thing about Hash tables is they have the coveted time complexity of O(1) for most operations.</p><p>In other words, it’s super easy to locate an item by it’s key and then update the value. No iterating through an entire array, no need to preform a binary search (which quickly eliminates things you have to search through but you still have to search through a bunch of things), you just find an item in the hash by key, and “do your Jazz”.</p><p>Check out this great resource for more info on time complexity: <a href="https://www.bigocheatsheet.com/">https://www.bigocheatsheet.com/</a></p><p>Also, I would be remiss to not mention that this solution came from our friend at “Web Dev Journey” <a href="https://www.youtube.com/watch?v=kzka2GbVTuU">https://www.youtube.com/watch?v=kzka2GbVTuU</a> , so be sure to check out his channel if you’re into this kind of elegant solution. (He even answers comments if you’re having issues debugging your code!!)</p><p>So first thing’s first: We’ve got two long strings and we need to compare the items of the “note” string to the items of the “magazine” string and only return true if a note can be constructed from the “magazine”. Yes this is case sensitive, so it has to be exact.</p><p>Here are the steps and the way I understand them from looking at this code:</p><ol><li>This .split() method in JavaScript is perfect method for putting our items into arrays that can then be compared.</li><li>We create our Hash “magazineObj” (just a Plain Old JavaScript Object or “POJO” as a wise man, my instructor Erik Kim called them. Miss you, buddy).</li><li>The “possible” variable is how we will output our solution in a boolean.</li><li>The next thing we do is iterate through our “magazine Array” and assign each word to a key in our object.</li><li>The elegance of this solution also applies to Space Complexity. All we have to do to find out “IF” we can create said note, is iterate through the “note array” of words and check if they are in the magazineObj. If we find a word, we remove it from our object with line 15, “magazineObj[word]- -”. I love how this is actually doing some garbage collection as a part of the process.</li><li>If our magazineObj[word] starts outputting negative values (line 16), then we know there are words in the note that cannot be found in the magazineString, otherwise, we output “True”.</li></ol><p>Here’s the code:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/451/1*5XRe1jylEgycWH3-mtnATQ.png" /><figcaption>Simple, elegant Hash Table Solution</figcaption></figure><p>The first “Edge Case”, I’ve noticed that this doesn’t account for is punctuation. If we have a comma behind a word, we could still technically cut out the same word and create a ransom note.</p><p>Anything else I’m missing here? I would love to hear your ideas for a refactor.</p><p>Happy Coding!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bf6171db87b9" width="1" height="1" alt=""><hr><p><a href="https://blog.devgenius.io/ransom-note-hash-table-algorithm-in-javascript-bf6171db87b9">Ransom Note — Hash Table Algorithm in JavaScript</a> was originally published in <a href="https://blog.devgenius.io/">Dev Genius</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The immutable ‘String’ in JavaScript]]></title>
            <link>https://medium.com/@eltocino/the-immutable-string-in-javascript-27ba8d440e2a?source=rss-3010e9e2ff6------2</link>
            <guid isPermaLink="false">https://medium.com/p/27ba8d440e2a</guid>
            <category><![CDATA[string]]></category>
            <category><![CDATA[bracket-notation]]></category>
            <category><![CDATA[coding-basics]]></category>
            <category><![CDATA[datatypes-in-javascript]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[John Speck]]></dc:creator>
            <pubDate>Thu, 28 May 2020 20:55:47 GMT</pubDate>
            <atom:updated>2020-05-28T20:55:47.986Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/293/1*MC2xHBdWAEwWuaZxlpewQw.png" /></figure><p>I’ve frequently started blogs and realized that the scope was far too large for the capacity of a dad of two young daughters in quarantine can accomplish in a week filled with other career services activities and Github commits. So this week, I’ll try to keep my focus a bit more “granular”. I’ll draw my attention to the immutable nature of ‘strings’ in JavaScript.</p><p>I need to add that this was brought to my attention by the Awesome email workshop series by Dan Abramov, “Just JavaScript”. (Reach out to dan@overreacted.io if you are interested in strengthening your JS fundamentals. This is an excellent resource.)</p><p>“Strings are immutable”- is one of the fundamentals of JavaScript. In fact, all “primitive” data types are immutable, but what does that mean?</p><p>Consider the following code:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/887/1*YwOP27fltdIGnAURT56flQ.png" /><figcaption>immutable hallelujah</figcaption></figure><p>So I’ve assigned the string “hallelujah” to the variable “immutable”. When I console.log(immutable), it passes the value assigned to the variable to our console.log() function and prints out the string in our console.</p><p>Furthermore, (as seen on line 3 above) one can use bracket notation to access an element of the string, (similar to with arrays) and console.log() immutable[1], which does as one would expect and returns the character at index 1 of the string “hallelujah”, which is the letter “a”.</p><p>So, one also might assume just as we can assign an item to an index in an Array with the Same bracket notation, we can assign a new char to a String, right? … Nope.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/1*VMwcupWgpRCLdNnHRmnUXQ.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/299/1*lLjVw8qPxaUaXH4pGcqJ8Q.png" /><figcaption>Assigning element to an Array.</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/323/1*z6XOjbkVZkTK4yjEvk7juA.png" /><figcaption>output from our console.log(arr)</figcaption></figure><h4>Stop!</h4><h4>Strings are immutable, remember!</h4><p>You cannot change a string once it has been assigned to memory.</p><p>Check the code, just to be sure:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/285/1*vthu1vGagU4G_C5Z0gCgRw.png" /><figcaption>trying to assign an element to a string with Bracket notation</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/128/1*EN4spAKbiLBGg2Iexs9wNg.png" /><figcaption>our current output</figcaption></figure><p>Just as Dan pointed out to me, JavaScript ignores the un-permitted character assignment, and outputs the original “hallelujah” string, unfazed.</p><h4>More Primitives:</h4><p>So what are the other primitives in JavaScript that we need to be mindful of?</p><p>There are seven of them in JavaScript:</p><p>string, number, bigint, boolean, symbol, null and undefined</p><p>and if you want to know what methods are available to each, here is an excellent resource. <a href="https://javascript.info/primitives-methods">https://javascript.info/primitives-methods</a> I’ll likely continue to explore these in the coming weeks as they are fundamental to a complete understanding of JavaScript.</p><p>Also, Here’s the repl.it, for this Blog:</p><p><a href="https://repl.it/join/vpcqdzid-johnspeck">Log In</a></p><p>(You will have to login to repl.it to access it, though. ) Please reach out if you discover anything new you want to share. As always,</p><p>HAPPY CODING!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=27ba8d440e2a" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My Tech Career Path]]></title>
            <link>https://medium.com/@eltocino/my-tech-career-path-9ba1b7702a36?source=rss-3010e9e2ff6------2</link>
            <guid isPermaLink="false">https://medium.com/p/9ba1b7702a36</guid>
            <category><![CDATA[strategies-for-success]]></category>
            <category><![CDATA[dadding]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[tech-career]]></category>
            <category><![CDATA[job-hunting]]></category>
            <dc:creator><![CDATA[John Speck]]></dc:creator>
            <pubDate>Sat, 23 May 2020 00:28:15 GMT</pubDate>
            <atom:updated>2020-05-23T00:32:09.518Z</atom:updated>
            <content:encoded><![CDATA[<h4>Some tips on landing a job with a non-traditional tech background.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jDVTH0jkToopNljMuVks8A.jpeg" /><figcaption>dad-deving in paradise; where are his socks?</figcaption></figure><p>This week I’ve had a number of great conversations with my extended network. These people are data engineers, senior and junior software engineers and my career coach.</p><p>I feel like I am in a great place based on several suggestions, tips and tidbits that they have given me. I want to jot some of these down so I have a future reference in case self-doubt creeps in again.</p><ul><li>A non-traditional Background is a strength not a weakness.</li><li>Previous Job experience is a major asset, because I’ve developed solid conflict resolution strategies from working in professional, high pressure capacities for several years.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/242/1*_qk8qKVLM7T-3EtV2Yxe1w.png" /><figcaption>conflict resolution is key</figcaption></figure><ul><li>I will likely not be the “rockstar” coder of the first team I join.</li><li>Having worked as a side-person for superstars, I have actually achieved my greatest successes in life in supporting roles. Side-people are the kind of team players that can facilitate organizational success.</li><li>I have internalized strategies for making the client shine, they are second nature.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/570/1*HkFDTJFKq_zqt57n0A2cfg.jpeg" /><figcaption>courtesy: Vickie WadE Fine Art</figcaption></figure><ul><li>Having a family is something that can make me a more dedicated employee, willing to commit significant time and effort in a new role.</li><li>I am a mature professional and will make an excellent solutions engineer, or some other role.</li><li>Having worked in parallel with an agile team, I understand the importance of iteration.</li><li>Documenting future plans and strategies, executing them, and analyzing results are all integral to success in developing any product.</li><li>Even some well-qualified candidates can be rejected from 99% of the roles they apply to.</li><li>White-boarding the structure of an application can be an important exercise. You should be able to make a diagram of how all the pieces of your project fit together.</li><li>Writing User Stories and understanding User Experience are essential to creating the architecture of any application.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/271/1*CktwQ5zy2oSOJ-_I8chKkw.jpeg" /></figure><ul><li>Having a portfolio of complete projects shows experience touching a variety of technologies.</li><li>Through my software intensive experience, I have learned methods to assimilate new technologies into my workflow easily.</li><li>I continue to get better at researching solutions.</li></ul><p>If you have any other suggestions or advice, I’m all ears. I’m always excited to discuss new technologies and strategies.</p><p>Happy Coding!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9ba1b7702a36" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Priority Queue O(log n) via Heap Sort]]></title>
            <link>https://medium.com/@eltocino/priority-queue-o-log-n-via-heap-sort-8987d52c21ca?source=rss-3010e9e2ff6------2</link>
            <guid isPermaLink="false">https://medium.com/p/8987d52c21ca</guid>
            <category><![CDATA[max-heap]]></category>
            <category><![CDATA[big-o-notation]]></category>
            <category><![CDATA[priority-queue]]></category>
            <category><![CDATA[algorithms]]></category>
            <dc:creator><![CDATA[John Speck]]></dc:creator>
            <pubDate>Fri, 15 May 2020 13:14:20 GMT</pubDate>
            <atom:updated>2020-05-15T13:14:20.133Z</atom:updated>
            <content:encoded><![CDATA[<p>So last week I dove deep into a priority queue algorithm without fully assessing the road map beforehand.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*9RPW0ftA7_B0Br1-Ei_yCw.jpeg" /><figcaption>Keep a map in your glove compartment.</figcaption></figure><p>I found a beautiful solution for a priority queue, but it was definitely the “Brute Force” solution. If it were an interview for a “Big 5” tech company, I would have “Failed” on the spot.</p><h4>The Time Complexity “Gotchas”</h4><p>In order to take an element and iterate through it with a simple “for loop”, we have to do n operations (where n is the number of elements in your Priority Queue). Furthermore, when we “.shift()” for our “dequeue” method, we have to reassign indexes of Every Single Item in that array in order to keep the next highest priority item right at the front of the array.</p><h4>Heaps to the Rescue</h4><p>A max or min heap is a “binary tree data structure” that makes it a lot less temporally complex to find things and operate on them.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/899/1*GTHKTockBozHNiCI6yKZfQ.png" /><figcaption>Max Heap <a href="http://www.btechsmartclass.com/data_structures/max-heap.html">http://www.btechsmartclass.com/data_structures/max-heap.html</a></figcaption></figure><p>Above we see a Max-Heap. Every node has a parent and two children. This allows us to much more easily traverse the data set. You can see from the tree structure, right off the bat we have split the number of nodes we have to search in two.</p><h4>O(1) or O(log n)</h4><p>The Max value is always at the Root of the Heap, so finding our Max priority element is super simple and has that coveted time complexity, Big O notation O(1).</p><p>Finding the minimum in a Max Heap is a bit more complex, but due to this clever structure, it is never worse than O(log n). This is because as you traverse the tree from “Root” to the “Leaves”, you quickly eliminate a lot of the nodes that you have to inspect.</p><p>Code coming soon…</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8987d52c21ca" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Priority Queue Algorithm in JavaScript — O(n)]]></title>
            <link>https://medium.com/@eltocino/priority-queue-algorithm-in-javascript-o-n-cc3381c88ca4?source=rss-3010e9e2ff6------2</link>
            <guid isPermaLink="false">https://medium.com/p/cc3381c88ca4</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[priority-queue]]></category>
            <category><![CDATA[for-loop]]></category>
            <category><![CDATA[time-complexity]]></category>
            <category><![CDATA[algorithms]]></category>
            <dc:creator><![CDATA[John Speck]]></dc:creator>
            <pubDate>Sat, 09 May 2020 17:38:43 GMT</pubDate>
            <atom:updated>2020-05-09T17:38:43.887Z</atom:updated>
            <content:encoded><![CDATA[<h3>Priority Queue Algorithm in JavaScript — O(n)</h3><p>Everybody has experienced a “queue” at some point in there lives.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/708/1*3XSMargU8F2sTXwfyGI82g.jpeg" /><figcaption>queue likely</figcaption></figure><p>Folks in the UK and abroad use the term liberally. In the US, it’s most often relegated to the “printer queue”.</p><p>Anyone who has accidentally fired off more than one print request while trying to troubleshoot your network configuration can attest:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/1*tM1Khf9SAWRAGd6pFksQ7g.png" /><figcaption>typical print queue</figcaption></figure><p>“<em>First in First Out</em>”</p><p>is the rule of the day. In other words, if you had 100 cat images spooled on your printer queue, you’re going to have to print every single one of them before your current print job.</p><p>A “priority queue” is an awesome data structure that can allow us to give a “priority” to any given element in a queue.</p><p>This way, we can push an element to the front of the line and “dequeue” it if it is of greater priority.</p><p>Other standard priority queue operations are as follows:</p><h4>Enqueue, Dequeu, front, isEmpty and printPQ</h4><p>//enqueue(item, priority)</p><p>When we add an Item to the rear of our queue.</p><p>// dequeue()</p><p>When that item is plucked off the front of the queue.</p><p>// front() rear()</p><p>What is the front element of our queue?</p><p>// isEmpty()</p><p>Are there any elements in our queue we should know about? This is a perfect helper method.</p><p>// printPQ()</p><p>Print the queue in order of “first in first out”.</p><h3>The Code:</h3><h4>enqueue(item, priority)</h4><ol><li>Create a new class for your Queue elements, that will allow you to create an object for every item in the Queue consisting of an element and it’s priority.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/545/1*hE_IJOnZu4m_6z63KAhOGg.png" /><figcaption>Create a QElement Class</figcaption></figure><p>2. Create a function that allows you to “Enqueue”an item with it’s priority by creating an instance of the QElement Class, “qElement”.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/574/1*T74W7X59QA3Hsdxf8UuoIQ.png" /><figcaption>enqueue function</figcaption></figure><p>Add a simple “for loop” and as you iterate over the Items Array, you compare the priority of an element to be added with the priority of each element in the Array already.</p><p>Use an “If” statement inside that “For Loop”, so that once you find the appropriate index in the array you can “splice()” the new item into the items Array representing our Queue.</p><p>The place where “(this.items[i].priority &gt; qElement.priority)” evaluates to “true”, is also where one can:</p><p>— assign value “true” to the “contain” variable</p><p>— “break” out of the “for loop”.</p><p>The “contain” variable is used with the “bang” operator in the final “if” statement, in order to allow items to be added to the queue when they have a higher priority than any other element in the array so far.</p><p>This final “if” statement simply will “.push()” the element into the Array in this case.</p><h4><strong>dequeue()</strong></h4><p>To remove an item from your queue were going to utilize native JavaScript “shift()” method.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/415/1*k6jZ8eQ538XWndvXyAaLhg.png" /><figcaption>shift() method defines “dequeue”</figcaption></figure><ol><li>We check to see if the Array is “empty” with our helper method:</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/471/1*HO203hu0xk9XdndZYAqGlQ.png" /><figcaption>“isEmpty” Method</figcaption></figure><p>2. We shift() said item from the priority queue. In a priority queue Array, higher priority items are shifted from the front of the array. The shift method removes the first item and returns it which is Exactly what dequeue is meant to do.</p><h4>front() rear()</h4><p>Front() and Rear() methods are super simple. The return first or last elements in the queue, respectively.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/510/1*Ws0p6MdAhK7Wmlju3PJLxA.png" /></figure><h4>printPQ()</h4><p>This one seems super straight forward. Print the Array, right? Well not quite.</p><p>First one must get the strings out and line ’em up. Then we can return them.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/480/1*5YYx1bekJhqikuRzHfA4-A.png" /></figure><p>A “for loop” should suffice.</p><h3>Output</h3><p>I slapped this in a quick repl. and it works fine. Feel free to peruse it: <a href="https://repl.it/join/uacotmwq-johnspeck">https://repl.it/join/uacotmwq-johnspeck</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/945/1*v50wYzUhcSSLjvas2CgfNg.png" /><figcaption>John’s Super Queue</figcaption></figure><h3>Time Complexity and Conclusion…</h3><p>So Cool. We did it. We’re done, right? Not quite.</p><h4>The whole point of Algorithms and Data Structures is to better understand the basic building blocks of code and minimize time and space complexity.</h4><p>The Time Complexity of this basic solution is not ideal. It utilizes simple “for loops” and we end up with time complexity of O(n). This is due to the need to iterate through all of the elements in our Array to perform methods.</p><p>Using a “Max Heap”or “Min Heap”, we can Get the time complexity down to O(1) for “search” (since we always have our Max or Min at the Root node and thus know Exactly where it is). We can get our “inserting” and “removing” down to O(Log n).</p><p>Awesome! Sounds like another Blog for another day… But I’ll get there. Here’s a link in case your already curious about using Binary Heaps for Priority Queues:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FJCt00vFoYmQ%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DJCt00vFoYmQ&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FJCt00vFoYmQ%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/7b098a1a8e3b91dc7eae9839dc421fde/href">https://medium.com/media/7b098a1a8e3b91dc7eae9839dc421fde/href</a></iframe><p>Happy Coding!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=cc3381c88ca4" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>