<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

 <title>CodegazeRants</title>
 <link href="https://codegazerants.com/atom.xml" rel="self"/>
 <link href="https://codegazerants.com"/>
 <updated>2026-03-10T12:35:16+00:00</updated>
 <id>https://codegazerants.com</id>
 <author>
   <name>Thanos Kolovos</name>
   <email>thanos@codegazerants.com </email>
 </author>
 
 <entry>
   <title>Twenty Twenty-Five</title>
   <link href="https://codegazerants.com/2025/12/30/twenty-twentyfive/"/>
   <updated>2025-12-30T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2025/12/30/twenty-twentyfive/"><![CDATA[
    &lt;img src=&#34;/assets/img/2025.svg&#34; alt=&#34;2025 Review - Codegazerants.com&#34; width=&#34;100%&#34;&gt;
&lt;p&gt;The last time I did one of these I couldn&#39;t outsource a visual aid to LLMs. I didn&#39;t do that either this time, since it takes a bit of the fun! So I made this in Figma because some traditions die hard, even when they&#39;re inefficient.&lt;/p&gt;
&lt;p&gt;But getting into our purpose of gathering today, without any ramble. 2025 was interesting. It was a year of change.&lt;/p&gt;
&lt;p&gt;Last January, after 8 and a half years I left Transifex. I loved my time there as a leader. Difficult decision but change was inevitable. I had the urge to join a team with different challenges. Scaling, diversity and overall meeting new people.&lt;/p&gt;
&lt;h2&gt;On Changing work&lt;/h2&gt;
&lt;p&gt;When changing work these are some common patterns showing up. You&#39;ve either heard about them or you&#39;re living them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Newbie.&lt;/strong&gt; That&#39;s right. You get into a new building and you have no idea even where the bathroom is. Everything is new although so familiar from years of experience. Which makes it even more annoying. You mixup Lisa with Liza and you called twice George as Michael.&lt;/p&gt;
&lt;p&gt;If you felt comfortable you would ask the junior engineer to tell you how to tie your laces in this company. You don&#39;t know where the bodies are buried. You can make assumptions, but taking action with assumptions only will make you look like a fool.&lt;/p&gt;
&lt;p&gt;Take a breath, stand up. Shake this thing off. Moment of truth.&lt;/p&gt;
&lt;p&gt;The first 90 days is not just a cliche. You need at least three months to understand how the &lt;a href=&#34;/2025/10/19/show-them-the-kitchen/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;kitchen is built&lt;/a&gt;. Up until then, do something silly that might help people. Ask to contribute to something that makes sense. No one is expecting to be your full self in day 1 or day 10. If they do that might be a first &amp;quot;code smell&amp;quot;. Maybe things to refactor in the future.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Lack of Rapport&lt;/strong&gt;. A few months ago, if the CSO said something unorthodox, you had options. You could raise your hand respectfully. Or you&#39;d catch your manager&#39;s eye across the table and they&#39;d handle it. In an emergency, you&#39;d exchange sanity checks with your peers, maybe have an internal chuckle, without others noticing, if someone makes a joke about it.&lt;/p&gt;
&lt;p&gt;Now you&#39;re in a meeting and someone says something that lands wrong. You don&#39;t move. You can&#39;t raise your hand because you don&#39;t have the context yet. Your manager isn&#39;t going to help because you don&#39;t have that history. Your peers are still peers, not allies.&lt;/p&gt;
&lt;p&gt;So you sit with it. You take the note. You move on.&lt;/p&gt;
&lt;p&gt;You can&#39;t be yourself yet. You have to be careful. Measured. You&#39;re negotiating every interaction instead of living in ones you&#39;ve already built trust in.&lt;/p&gt;
&lt;p&gt;Sounds a bit heavy. You can&#39;t hold back forever waiting for comfort. And you can&#39;t blindly trust everyone. The middle ground is doing something slightly silly and seeing who laughs with you instead of at you or something totally dumb and see who will have the guts to save you from embarrassment. &amp;quot;You got something in your team&amp;quot; moment. That&#39;s how rapport actually starts. Not through careful professionalism. Through small risks.&lt;/p&gt;
&lt;p&gt;It comes. Not on day one. But it comes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Overload.&lt;/strong&gt; There&#39;s a conundrum nobody mentions. Either the company has good onboarding and you&#39;re drowning in information at 1000mph, keeping maybe 1/100 of what you hear. Or the onboarding is a lunch and learn and you&#39;re supposedly ready to go. Either way, you&#39;re overloaded.&lt;/p&gt;
&lt;p&gt;I heard someone describe it once as &amp;quot;being fed with a hose.&amp;quot; That&#39;s accurate.&lt;/p&gt;
&lt;p&gt;You&#39;re in meetings where you have no idea what&#39;s happening. Three acronyms you don&#39;t know. A reference to a decision from six months ago. Someone asks your opinion on something that matters and you freeze because you don&#39;t have the context to have an opinion.&lt;/p&gt;
&lt;p&gt;This is where people make mistakes. They try to sound smart. They make calls they shouldn&#39;t make. They nod along to things that don&#39;t make sense.&lt;/p&gt;
&lt;p&gt;Here&#39;s what I learned. Say no. Or not no, but respectfully push back. &amp;quot;I don&#39;t have enough context yet&amp;quot; is a complete sentence. People will respect you more for admitting it than for pretending.&lt;/p&gt;
&lt;p&gt;Keep notes. Especially acronyms. The same thing gets described five different ways by five different people and it&#39;ll make you insane if you don&#39;t track what they&#39;re actually talking about.&lt;/p&gt;
&lt;p&gt;And when you meet someone, be present. Fully. You won&#39;t remember what they said, but you&#39;ll remember if you were actually there or just physically present.&lt;/p&gt;
&lt;p&gt;It takes time. The 90 days cliche. You&#39;re not supposed to have it figured out by week one. Anyone who expects that is signaling something about the culture. Pay attention to that.&lt;/p&gt;
&lt;h2&gt;On Writing&lt;/h2&gt;
&lt;p&gt;Oh my! Back to releases every two weeks&lt;em&gt;ish&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I started publishing again and at the same time I did something that I haven&#39;t done in the past. I started having a schedule. A better cadence. I was always more on the path of &amp;quot;when it&#39;s time, inspiration will come&amp;quot; or &amp;quot;it&#39;s ready when it&#39;s ready&amp;quot;.&lt;/p&gt;
&lt;p&gt;This time I pivoted. I moved more into, don&#39;t wait for ideas to be perfect. You have something you like. Publish. Don&#39;t stress about making mistakes.&lt;/p&gt;
&lt;p&gt;Why? Because I had the thoughts, I was adding them on paper. And they were sitting there, waiting for the perfect timing that never came. Or I was always busy. It&#39;s best to say, it was just time to do it.&lt;/p&gt;
&lt;p&gt;The Manager Problem Problem was sitting in my drafts for way too much. Once I read it after much time, I repurpose and rewrote it, and although I knew it wasn&#39;t perfect I published it. It had mistakes, I got feedback. I updated it. No one was harmed.&lt;/p&gt;
&lt;p&gt;Now these are the articles I published. Ten whole since August...ish. Five for leadership, two for career and three about software. This work gets me to my happy place. Take a look if you haven&#39;t you might see something you like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/2025/12/15/the-manager-problem-problem/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;The Manager Problem Problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2025/11/30/no-fireworks-leadership/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;No Fireworks Leadership&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2025/11/16/the-ratio/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;The Ratio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2025/10/30/the-safety-of-busyness/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;The Safety Of Busyness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2025/10/19/show-them-the-kitchen/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Show Them The Kitchen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2025/09/30/you-dont-have-to-like-jack-overcoming-bias-to-become-a-better-manager/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;You Don&#39;t Have To Like Jack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2025/09/14/exits-entries-and-the-background-check-in-between/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Exits, Entries, and the Background Check in Between&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2025/08/30/why-engineering-work-isnt-done-until-its-actually-done/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Why Engineering Work Isn&#39;t Done Until It&#39;s Actually Done&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2025/08/15/the-complexity-paradox-why-fixing-windows-got-harder-when-everything-got-better/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;The Complexity Paradox: Why Fixing Windows Got Harder When Everything Got Better&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2025/08/02/moved-to-eleventy-after-ten-years-with-jekyll/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Moved to Eleventy After Ten Years With Jekyll&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Scale&lt;/h2&gt;
&lt;p&gt;What can I say about this year? Where does it fall on the scale?&lt;/p&gt;
&lt;p&gt;On good. I wanted to start over on something new. This has a toll. You pay it and it can work or not. In the end it did. Most of the times it does one way or another. It might take time, but it will.&lt;/p&gt;
&lt;p&gt;So starting over, as hard as it is, is sometimes the only way to actually move forward. The work ahead is the same as the work behind: show up, stay consistent, write the thing, and the bathroom is third door on the left.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>The Manager Problem Problem</title>
   <link href="https://codegazerants.com/2025/12/15/the-manager-problem-problem/"/>
   <updated>2025-12-15T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2025/12/15/the-manager-problem-problem/"><![CDATA[
    &lt;p&gt;It&#39;s Monday. You&#39;re sitting across from your manager in the 1:1 you rescheduled twice.&lt;/p&gt;
&lt;p&gt;You&#39;ve prepared for this. Careful words. Not accusatory. Just the facts. The pattern. How it&#39;s affecting you.&lt;/p&gt;
&lt;p&gt;&amp;quot;Last week in the leadership meeting, you presented the scaling analysis that I prepared and my contribution wasn&#39;t mentioned. This has happened a few times now. And I notice I&#39;m becoming hesitant to bring my best thinking forward&amp;quot;.&lt;/p&gt;
&lt;p&gt;They listen. Actually listen. They nod at the right moments. They ask clarifying questions like they&#39;re trying to understand. Halfway through, they say &amp;quot;I hear you. That&#39;s not my intent.&amp;quot;.&lt;/p&gt;
&lt;p&gt;You believe them. Or you want to. Either way, a relief comes with this. Finally they get it.&lt;/p&gt;
&lt;p&gt;They suggest a few things. They will be more careful. They&#39;ll make sure to credit the team. You&#39;ll check in more often. Nothing earth-shattering but it feels real. You write it down. They seem to take it seriously.&lt;/p&gt;
&lt;p&gt;And the meeting ends. You leave feeling lighter than you have in weeks.&lt;/p&gt;
&lt;p&gt;Friday, you&#39;re in the all-hands. Your manager presents a project update. It&#39;s work your team did. They talk about the problem you identified, the approach you designed, how it solved the scaling issue. They never mention your name. They took ownership. The audience congratulates them.&lt;/p&gt;
&lt;p&gt;You wait for the pit in your stomach to show up. It does. Then it hits you. Not anger. Something worse.&lt;/p&gt;
&lt;p&gt;Clarity.&lt;/p&gt;
&lt;p&gt;The conversation on Monday didn&#39;t happen. You had it. But they didn&#39;t. They nodded. They agreed. But they&#39;re already operating like the conversation never existed.&lt;/p&gt;
&lt;p&gt;If they&#39;re operating inside the rules this way, they know exactly what they&#39;re doing. And more than that, they know you can&#39;t prove they&#39;re not. You can&#39;t point at this all-hands and say &amp;quot;you promised&amp;quot;. They were careful about attribution. They mentioned the team. But they framed it in a way that made it sound like their insight. Their implementation.&lt;/p&gt;
&lt;p&gt;Technically, they didn&#39;t lie.&lt;/p&gt;
&lt;p&gt;But you both know what happened. And there&#39;s nothing concrete enough to report, nothing clear enough to escalate, nothing that would make you sound like anything other than someone with a problem.&lt;/p&gt;
&lt;p&gt;That&#39;s when you realize. This isn&#39;t a bad manager. This is someone who learned how to operate inside the rules in ways the system will never catch.&lt;/p&gt;
&lt;p&gt;And these are two problems really.&lt;/p&gt;
&lt;p&gt;The first is that someone is making your life miserable at work. The second is that the person you are supposed to talk to... They are the problem.&lt;/p&gt;
&lt;p&gt;My condolences. You have a Manager Problem Problem.&lt;/p&gt;
&lt;h2&gt;The Manager Scale&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;/assets/img/manager-scale-graph.png&#34; target=&#34;_blank&#34;&gt;&lt;img src=&#34;/assets/img/manager-scale-graph.png&#34; alt=&#34;The manager problem problem - Codegazerants.com&#34; width=&#34;100%&#34; style=&#34;padding: 40px 0&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The thing is that most managers fall into categories you can actually do something about.&lt;/p&gt;
&lt;p&gt;Inspiring, Good or Ok managers can be talked through. You explain the impact. They reflect. They adjust. It&#39;s a bit awkward but fixable.&lt;/p&gt;
&lt;p&gt;Bad managers either don&#39;t do the work or can&#39;t. If you have tenure and credibility, you escalate through reviews or skip-levels. You can move teams. It&#39;s hard but solvable.&lt;/p&gt;
&lt;p&gt;Toxic managers are a whole different case. They break rules explicitly. They cross lines that are clear and documentable. HR has a playbook. Legal gets involved. There&#39;s a process, even if the organization is slow to use it. The stakes are high.&lt;/p&gt;
&lt;p&gt;But there&#39;s another type. The one sitting across from you in that 1:1. They listen when you confront them. They nod. They agree.&lt;/p&gt;
&lt;p&gt;The manipulative manager operates inside the rules in ways the system was never designed to catch. They don&#39;t break policy. They exploit the space between what&#39;s policed and what&#39;s possible. They hear your concern and acknowledge it. Then they operate exactly like you never said anything because nothing they do is technically wrong.&lt;/p&gt;
&lt;p&gt;When you confront them carefully, they listen. They ask questions. They make small commitments. But in practice, the conversation evaporates. They&#39;re not gaslighting you deliberately. They&#39;re just already moving on to the next thing, and the promise was never written down, never formalized, never part of the actual system.&lt;/p&gt;
&lt;p&gt;You think about escalating. But escalate what? They didn&#39;t say anything reportable. You don&#39;t have evidence because evidence requires a violation, and they never violated anything. They&#39;re good at this.&lt;/p&gt;
&lt;p&gt;They throw people under the bus, but only when it matters and only behind closed doors. They befriend people who help them and ignore people who don&#39;t. They usually &lt;a href=&#34;/2025/10/19/show-them-the-kitchen/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;show you how to cook&lt;/a&gt; and at the same time they use chaos as cover, proposing half-baked frameworks as solutions while the team does the actual work. They&#39;re relentless about outcomes and invisible about methods.&lt;/p&gt;
&lt;p&gt;When you report them, you sound emotional. Unreasonable. Like you&#39;re the problem because you&#39;re pointing out the problem.&lt;/p&gt;
&lt;p&gt;That&#39;s the loophole. That&#39;s the cunning type.&lt;/p&gt;
&lt;h2&gt;Why The System Can&#39;t Catch Them&lt;/h2&gt;
&lt;p&gt;Here&#39;s the brutal part. Every organization is perfectly designed to get the results it gets.&lt;/p&gt;
&lt;p&gt;Most systems work fine. They catch obvious crises. They escalate law-breaking. They support good managers who make mistakes.&lt;/p&gt;
&lt;p&gt;But the system fails to diagnose these cases because it was never designed to catch subtle, invisible problems. It measures outputs. Metrics are usually high. Deliverables are predictable because the team compensates. The system sees success and stops looking.&lt;/p&gt;
&lt;p&gt;Organizations measure what breaks, not what was prevented from breaking. They track who fixes fires, &lt;a href=&#34;2025/11/30/no-fireworks-leadership/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;not who prevents them&lt;/a&gt;. So the person who operates inside the rules and delivers numbers looks fine. The fact that the team is burning out, that people are quietly leaving, that work that should take three months takes six because someone&#39;s taking credit and creating bottlenecks... that&#39;s invisible until it manifests as attrition.&lt;/p&gt;
&lt;p&gt;By then, the math has already been done.&lt;/p&gt;
&lt;p&gt;Leadership might know. They see exit interviews. They notice quiet migration. They hear whispers. But they make a calculation. A manager who delivers is valuable. The cost of replacing them is concrete. The cost of keeping them is hidden. It only shows up when people burn out or quit. And by then, there&#39;s plausible deniability. People leave for lots of reasons.&lt;/p&gt;
&lt;p&gt;The business optimizes for continuity, not for your sanity. And from their perspective, the invisible labor holding everything together is just how work happens.&lt;/p&gt;
&lt;p&gt;So sometimes, even with the best intentions, the truth is this. They know. They calculated. They decided to keep the manager anyway.&lt;/p&gt;
&lt;h2&gt;What Actually Happens When You Try&lt;/h2&gt;
&lt;p&gt;You already know this part. You lived it on Monday and Friday.&lt;/p&gt;
&lt;p&gt;You confront. They agree. Nothing changes. The conversation didn&#39;t happen because conversations aren&#39;t policy. So they can agree on Monday and operate differently by Friday without technically breaking anything.&lt;/p&gt;
&lt;p&gt;You think about escalating. But to who? You don&#39;t have concrete evidence. You can&#39;t quote them saying something reportable. You have a pattern, a feeling and the knowledge that they&#39;re smart enough to never leave a trail.&lt;/p&gt;
&lt;p&gt;If you push too hard, you become the problem. Not because you&#39;re wrong but because you&#39;re making noise about something that exists in the space between what the system measures and what actually matters.&lt;/p&gt;
&lt;h2&gt;The Odds&lt;/h2&gt;
&lt;p&gt;You are in a tough spot. That&#39;s the ugly hard truth.&lt;/p&gt;
&lt;p&gt;If your manager falls into the Good or Toxic categories, you know what to do. Use your 1:1s. Use 360 reviews. When things get serious, escalate through HR. The framework exists, even if it&#39;s not perfect. It was built for these situations.&lt;/p&gt;
&lt;p&gt;But if you&#39;re dealing with a Manipulative manager operating in this space, the standard frameworks don&#39;t help you. They weren&#39;t designed for this.&lt;/p&gt;
&lt;p&gt;First, stop expecting things to change. If you&#39;re in this situation, this is the hardest part and the most important. You keep hoping they&#39;ll see what they&#39;re doing. You keep thinking if you just explain it better, document it more clearly, find the right words, something will click. It won&#39;t. If they&#39;re operating this way, they know exactly what they&#39;re doing. Nothing you do will fix this.&lt;/p&gt;
&lt;p&gt;Once you accept that, you can think clearly about what comes next.&lt;/p&gt;
&lt;p&gt;While you&#39;re still there, protect yourself. Set boundaries. Stop volunteering for their half-baked projects. Stop hoping the next 1:1 will be different. Compartmentalize work so it doesn&#39;t bleed into your life. Document conversations not because you&#39;re building a case, but because you&#39;ll need reality checks. When they rewrite history, you&#39;ll want proof that you&#39;re not losing your mind. When they try to blame you for something, you&#39;ll want receipts.&lt;/p&gt;
&lt;p&gt;Find your people. You need to stay sane. You need to decompress. Talk to peers who see what you see. Build relationships with other managers. You need allies who can confirm you&#39;re not imagining this.&lt;/p&gt;
&lt;p&gt;If skip-levels exist and you trust the person above your manager, test the waters carefully. Sometimes there&#39;s a path to switching teams or reporting lines. But be realistic. Most organizations won&#39;t move you away from a &amp;quot;high-performing&amp;quot; manager just because you&#39;re unhappy. And if you push too hard, you become the problem.&lt;/p&gt;
&lt;p&gt;Those are the things you can try. But here&#39;s what you really need to decide because it affects your life.&lt;/p&gt;
&lt;p&gt;Are you staying or leaving?&lt;/p&gt;
&lt;p&gt;If you&#39;re staying, make peace with it. Maybe the rest of the job is worth it. Maybe you can&#39;t leave right now for financial or personal reasons. Maybe you&#39;re waiting for them to move on first. That&#39;s fine, but be honest with yourself about what you&#39;re choosing. Stop fighting battles you can&#39;t win. Protect your energy. Do your work. Collect your paycheck. Plan for when things change.&lt;/p&gt;
&lt;p&gt;I&#39;ve seen people stay longer, outlast their manipulative manager. Because sometimes the manager moves on, the culture shifts, someone above them finally acts. It happens. Not often. But it happens. And if you&#39;re still there when it does, you&#39;ll understand how fragile the whole thing was.&lt;/p&gt;
&lt;p&gt;The truth is you probably won&#39;t be there six months from now. Because things break. And you&#39;ll finally accept that you&#39;re not the thing breaking.&lt;/p&gt;
&lt;p&gt;So, If you&#39;re leaving, start now. Not in six months when you&#39;ve documented enough or tried one more escalation. Now. Update your resume. Talk to recruiters. Reach out to your network. Life is too short and your career is too valuable to let it stagnate under someone who uses you to advance themselves.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>No Fireworks Leadership</title>
   <link href="https://codegazerants.com/2025/11/30/no-fireworks-leadership/"/>
   <updated>2025-11-30T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2025/11/30/no-fireworks-leadership/"><![CDATA[
    &lt;p&gt;Third time in two months we had an incident. Five minutes of downtime. Two engineers at 8 PM trying to magic it back to life. The fix wasn&#39;t clear. Reverting to the previous deployment was faster. If we were lucky, everyone would keep living their evening and we could figure out what actually happened next morning.&lt;/p&gt;
&lt;p&gt;So we reverted. Seven minutes down.&lt;/p&gt;
&lt;p&gt;One of the engineers sent a message to the channel. People sent their emojis. The CEO sent his own message thanking the two of them for their response.&lt;/p&gt;
&lt;p&gt;I also sent my congratulations to the team. These were some good reflexes. Having the product down for longer would have been a hit for our SLAs and our customers. We managed to fix it before getting a user report so they indeed were the heroes of the day on that Wednesday.&lt;/p&gt;
&lt;p&gt;I meant every word. They stayed calm. They made good decisions under pressure. They deserved the recognition.&lt;/p&gt;
&lt;p&gt;But something still didn&#39;t sit right with me.&lt;/p&gt;
&lt;h2&gt;The Work That Never Happened&lt;/h2&gt;
&lt;p&gt;Our industry loves heroes. The engineer who stays up late to solve the bug. The firefighter who responds to chaos with clarity. We build these stories. We celebrate them. We promote on them.&lt;/p&gt;
&lt;p&gt;But I was also watching two people get celebrated for being excellent at something that should never have needed to happen.&lt;/p&gt;
&lt;p&gt;There was another team somewhere in your org. Quieter. No emergency channels lit up at night. No all-hands messages. No CEO shout-outs. Stable complex deliverables. The deployments are smooth. Six months ago, an engineer anticipated a scaling problem and redesigned the data flow. Not flashy work. Nobody ran it as a project. It just works. So there&#39;s nothing to solve. There&#39;s no story.&lt;/p&gt;
&lt;p&gt;That team is doing the work.&lt;/p&gt;
&lt;p&gt;They prevent crises. And nobody&#39;s going to thank them for it because the world kept running like it should.&lt;/p&gt;
&lt;h2&gt;Prevention Work&lt;/h2&gt;
&lt;p&gt;This pattern doesn&#39;t just apply to engineers. It shows up everywhere the work actually matters.&lt;/p&gt;
&lt;p&gt;A manager notices someone has gone quiet in meetings. Ask better questions in a one-on-one. The person admits they&#39;ve been thinking about leaving. Nobody else knew. Leadership didn&#39;t know. But the manager noticed the shift and asked. They figure out it&#39;s not the work, it&#39;s feeling unseen. They make space for them to lead the next project. Three months later they&#39;re engaged again. They never actually leave.&lt;/p&gt;
&lt;p&gt;Another team lead sees tension building between two people. It hasn&#39;t blown up into conflict yet. But they feel it. They have separate conversations with each of them. They reframe how they work together. The conflict never becomes a crisis because they caught it before it needed to be a crisis. They help their function work.&lt;/p&gt;
&lt;p&gt;A security engineer reviews the codebase for patterns that could become vulnerabilities later. She flags an auth flow that works now but has architectural debt. Nobody&#39;s exploiting it. There&#39;s no incident. But she catches it before it becomes a problem. She works with the team to fix it quietly. Nothing breaks because nothing was broken yet.&lt;/p&gt;
&lt;p&gt;In all three cases, the result is quiet. No incident report. No resolution story. No tickets. No metrics. Just the thing that didn&#39;t happen.&lt;/p&gt;
&lt;p&gt;And quiet work disappears. You are still preventing. And prevention looks like nothing happening. No fireworks around it.&lt;/p&gt;
&lt;h2&gt;Why The System Can&#39;t See This&lt;/h2&gt;
&lt;p&gt;This is where both things converge into the same structural problem.&lt;/p&gt;
&lt;p&gt;You can see the heroes. They make noise, generate data, strategically talk to the right people. The engineer who responds to incidents creates incident tickets, response times, resolution stories. The manager who handles a crisis creates escalations, decisions, visible outcomes. These are measurable. Reportable. Concrete.&lt;/p&gt;
&lt;p&gt;Prevention work generates nothing. No tickets because nothing broke. No metrics because nothing failed. No story because the thing that could have happened didn&#39;t happen. In any system that measures what breaks and who fixes it, prevention work is invisible by default.&lt;/p&gt;
&lt;p&gt;At small scale, this is manageable. A manager knows their team. They see prevention work happening. But as organizations grow, you need metrics and dashboards to track performance across multiple teams. And those dashboards measure incidents, not prevented incidents. Response times, not problems avoided. So the system reinforces itself. The things you can measure get resources and attention. The things you can&#39;t measure get squeezed out.&lt;/p&gt;
&lt;p&gt;Add promotion systems on top of that. Career growth is tied to impact. Impact is tied to what&#39;s measurable. So people optimize for measurable work. Reactive work. Firefighting. Because that&#39;s what generates the data that gets you promoted.&lt;/p&gt;
&lt;p&gt;This isn&#39;t malicious. It&#39;s structural. Organizations didn&#39;t sit down and decide &amp;quot;let&#39;s only value reactive excellence.&amp;quot; They built systems to measure and manage performance. Those systems naturally gravitate toward what&#39;s visible. And prevention work, by definition, isn&#39;t visible.&lt;/p&gt;
&lt;p&gt;This is how stable systems become unstable. Not because people stop caring about prevention. But because the org architecture makes prevention work invisible and reactive work visible. So over time, the people who would do prevention work either adapt and start firefighting instead, or they leave for somewhere that values what they actually do.&lt;/p&gt;
&lt;h2&gt;What Leaders Actually Do&lt;/h2&gt;
&lt;p&gt;At some point you realize the system isn’t malfunctioning. It’s doing exactly what it was built to do. It measures what breaks. It rewards who fixes. It celebrates visible outcomes because visible outcomes are easy to quantify.&lt;/p&gt;
&lt;p&gt;And if you’re a leader inside that system, you don’t get to wish it behaved differently. You have to lead inside the reality you’ve got.&lt;/p&gt;
&lt;p&gt;Start where your reach actually matters. In your one-on-ones, ask a simple question: &amp;quot;What did you stop from happening this week?&amp;quot;.&lt;/p&gt;
&lt;p&gt;Write it down. Because prevention evaporates faster than anybody thinks. It looks like nothing. It feels like nothing. And unless someone captures it, it gets treated like nothing.&lt;/p&gt;
&lt;p&gt;Bring those notes to performance conversations. Read them back.&lt;br&gt;
“You redesigned the data layer and stopped three scaling issues before they existed.”&lt;br&gt;
Say it clearly. Because the default conversation is always about who sprinted into the fire. Someone has to speak for the people who built a world where the fire never started.&lt;/p&gt;
&lt;p&gt;If you manage managers, make them do the same. When a team has zero major incidents, pause the room. Ask why. Make them say the names. Because if they don’t, the system will treat stability like luck. And luck doesn’t get rewarded.&lt;/p&gt;
&lt;p&gt;Push upstream where you can. If you have the authority to question what the company measures, do it. Audit your dashboards. Ask why you’re tracking reaction time but not resilience. Ask why you can tell me how many things broke last quarter but not how many were avoided.&lt;/p&gt;
&lt;p&gt;This is the part that feels like fighting dragons with a broomstick. You’ll lose fights. You’ll annoy people. You’ll get the quiet &amp;quot;is this really worth it?” look from the folks who love their dashboards exactly as they are.&lt;/p&gt;
&lt;p&gt;That’s fine. This isn’t about winning. It’s about signaling that prevention counts, even if the machinery wasn’t built to see it.&lt;/p&gt;
&lt;h2&gt;Why it matters more than you think&lt;/h2&gt;
&lt;p&gt;Somewhere on your team is a quiet expert. The person who sees failure modes before everyone else. The one who redesigns something small and invisible and in doing so prevents the thing that would have kept ten people up at night.&lt;/p&gt;
&lt;p&gt;If that person watches enough firefighters get promoted while their own work disappears into silence, they’ll leave. Or they’ll stop doing the prevention work that makes everything easier and start chasing visible chaos instead. Humans adapt to incentives. Even the wise ones.&lt;/p&gt;
&lt;p&gt;You can’t rewrite the entire org. You can’t force people to value what they can’t see. But you can slow the decay. You can make sure at least one corner of the building knows the difference between foresight and adrenaline.&lt;/p&gt;
&lt;p&gt;That’s not revolution. It’s maintenance of values. The unglamorous kind.&lt;/p&gt;
&lt;h2&gt;The small victory that still matters&lt;/h2&gt;
&lt;p&gt;When you make prevention visible, when you insist that quiet excellence counts, you’re not trying to save the whole system. You’re modeling a different one.&lt;/p&gt;
&lt;p&gt;Maybe the org never changes. Maybe your best people still leave. But they’ll leave knowing what it feels like to work somewhere that recognizes the difference between stability and luck. They’ll know what to build when they get the chance. They’ll know what to defend when the incentives turn against them.&lt;/p&gt;
&lt;p&gt;That’s not a grand win. It’s not a fix.&lt;br&gt;
It’s choosing to lead with your values when outcomes won’t cooperate.&lt;/p&gt;
&lt;p&gt;And sometimes that’s the only real power you get, and the one that ends up mattering the most.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>The Ratio</title>
   <link href="https://codegazerants.com/2025/11/16/the-ratio/"/>
   <updated>2025-11-16T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2025/11/16/the-ratio/"><![CDATA[
    &lt;p&gt;You raised some real money. Now you can finally hire people who&#39;ve actually done this before.&lt;/p&gt;
&lt;p&gt;The engineer who built infrastructure at scale. The sales leader with zero to $50M on their resume. The award-winning designer. The product person who shipped hits at two unicorns. The marketing exec with a proven playbook.&lt;/p&gt;
&lt;p&gt;These people will boost efficiency. Solve the hard problems. Ship faster.&lt;/p&gt;
&lt;p&gt;You hire five of them. If each one is truly 10x better than average, simple math says you should get 50x output. That&#39;s the theory anyway. Even if you&#39;re conservative and they&#39;re only 3x better, you should get 15x.&lt;/p&gt;
&lt;p&gt;Six months later you&#39;re getting maybe 12x. On a good week, 30x.&lt;/p&gt;
&lt;p&gt;Where did the other 20x go?&lt;/p&gt;
&lt;p&gt;Nobody tells you this when you&#39;re hiring. But there&#39;s a tax. An invisible one. And it&#39;s expensive.&lt;/p&gt;
&lt;img src=&#34;/assets/img/the-ratio-graph.png&#34; alt=&#34;The ratio - Codegazerants.com&#34; width=&#34;100%&#34; style=&#34;padding: 40px 0&#34;&gt;
&lt;h2&gt;Tax One: The Speed Paradox&lt;/h2&gt;
&lt;p&gt;Someone on your team ships in a weekend what takes everyone else a month. That person is fast. Really fast. You hired them because of that speed.&lt;/p&gt;
&lt;p&gt;Then you realize nobody else can touch what they built.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The project works perfectly.&lt;/strong&gt; Solves the problem. Clean implementation. But it&#39;s a black box. The rest of the team can&#39;t modify it. Can&#39;t debug it. Can&#39;t extend it. Only one person knows how it works.&lt;/p&gt;
&lt;p&gt;You just turned speed into a bottleneck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The handoff attempt.&lt;/strong&gt; Three-hour meeting to explain a two-hour build. The person receiving it still doesn&#39;t get it. They&#39;ll ping on Slack. Ask follow-up questions. Schedule another meeting. The speed advantage evaporated in the knowledge transfer.&lt;/p&gt;
&lt;p&gt;Fast people skip steps. They don&#39;t document. They don&#39;t explain their reasoning. They assume context that others don&#39;t have. They&#39;re three steps ahead while everyone else is still processing step one.&lt;/p&gt;
&lt;p&gt;This works when they&#39;re working alone. It breaks when they&#39;re working with others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now multiply this by five.&lt;/strong&gt; Five people building things only they understand. Five sets of dependencies only they can resolve. Five bottlenecks disguised as productivity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Worse, you keep picking them for every important project.&lt;/strong&gt; They&#39;re the only ones who can ship fast, so they&#39;re the only ones you trust with deadlines. The rest of the team handles maintenance and bug fixes while the fast people take on everything critical.&lt;/p&gt;
&lt;p&gt;Now the fast people are overloaded. They&#39;re context-switching between projects. They&#39;re the bottleneck on five different workstreams. And nobody else is learning the systems because they never get to touch the important work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The team splits.&lt;/strong&gt; Fast people on one side doing everything that matters. Everyone else on the other side waiting for the fast people to have time. Nobody&#39;s actually fast anymore.&lt;/p&gt;
&lt;p&gt;You hire more people to help. They ramp slowly because the systems are sophisticated and the documentation is sparse. The fast people are too busy to explain things properly. The knowledge stays siloed.&lt;/p&gt;
&lt;p&gt;Individual speed creates system slowness. That&#39;s the paradox.&lt;/p&gt;
&lt;h2&gt;Tax Two: The Impact Conflict&lt;/h2&gt;
&lt;p&gt;You probably have a performance review process. People asked for a process and you delivered. And that process almost certainly weights impact heavily. Show the hard problem you solved. Demonstrate the revenue you drove. Prove the thing you built that moved the needle.&lt;/p&gt;
&lt;p&gt;This makes sense for evaluating individuals. It creates a problem when you put five high performers in a room.&lt;/p&gt;
&lt;p&gt;Everyone needs impact for their next promotion. Needs to point to the thing they drove. They&#39;re competing for the same finite set of important problems. Some probably left their last company because all the high-impact work went to someone else. Or they spent six months debating whether a button should be on the left or right.&lt;/p&gt;
&lt;p&gt;So the meeting isn&#39;t just about what&#39;s the right decision. It&#39;s about whose solution wins. Whose judgment was correct. Who gets one more item for their brag document. Doesn&#39;t happen in every meeting, but it happens.&lt;/p&gt;
&lt;p&gt;Nobody says this out loud. But everyone feels it. One person&#39;s pushing for technical soundness. Another for user impact. Another for speed to market. All valid. All competing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;They&#39;re not being difficult. They&#39;re optimizing for what gets rewarded.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is slow. Much slower than a team where one person decides and everyone else executes.&lt;/p&gt;
&lt;p&gt;High performers need visible wins. When you have five of them, they&#39;re competing for those wins whether they realize it or not.&lt;/p&gt;
&lt;p&gt;That competition shows up everywhere. Including how they approach problems.&lt;/p&gt;
&lt;h2&gt;Tax Three: Framework Collision&lt;/h2&gt;
&lt;p&gt;High performers have frameworks. That&#39;s how they got good. They&#39;ve seen the pattern before. They know what worked at the last company. They have a mental model for how these problems get solved.&lt;/p&gt;
&lt;p&gt;One framework per team works fine. Five frameworks per team creates a different problem.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The database debate takes three days.&lt;/strong&gt; One person&#39;s framework says build for scale from day one. They&#39;ve lived through the painful migration. Another person&#39;s framework says ship fast and migrate later. They&#39;ve seen companies over-engineer for growth that never came. Both frameworks are based on real scars. Both people are trying to help you avoid mistakes they&#39;ve already made.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The ICP debate takes a week.&lt;/strong&gt; Go deep in one vertical versus serve multiple industries versus follow the revenue. One person&#39;s framework says vertical specialization builds expertise and referrals. Another says diversification reduces risk. A third says customer-fit matters more than industry. All three have worked. At different companies. In different contexts. For different markets. Which one applies here? The meeting becomes a comparison of past experiences instead of an evaluation of current reality.&lt;/p&gt;
&lt;p&gt;They&#39;re not debating the decision. They&#39;re debating which past is most relevant to this future.&lt;/p&gt;
&lt;p&gt;The infrastructure engineer has patterns from scale. The product person has frameworks from consumer apps. The sales leader has playbooks from enterprise deals. Each toolkit is good. Each one has been proven right. None of them are obviously wrong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;That&#39;s the problem.&lt;/strong&gt; You don&#39;t have one way forward. You have five ways forward. And you spend your time deciding which framework to follow instead of just following one.&lt;/p&gt;
&lt;p&gt;Five frameworks means you need someone to pick one. Except nobody can. Or rather, nobody can without telling four other high performers their judgment doesn&#39;t count. That&#39;s the real problem.&lt;/p&gt;
&lt;h2&gt;Tax Four: The Decider Problem&lt;/h2&gt;
&lt;p&gt;There&#39;s always someone in the room who makes the call. On a normal team, it&#39;s obvious who that person is. The senior engineer decides the architecture. The sales director decides the pricing. The person with the most context makes the decision and everyone else executes.&lt;/p&gt;
&lt;p&gt;High performers are used to being that person.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;They didn&#39;t become high performers by deferring.&lt;/strong&gt; They got here by having good judgment. By being right when it mattered. By seeing the path forward and taking it. That&#39;s the skill that got developed. That&#39;s what got rewarded.&lt;/p&gt;
&lt;p&gt;Now you have five of them in a room. Five people who are used to making the call. Five people whose judgment has been validated by results. Five people who aren&#39;t wired to defer.&lt;/p&gt;
&lt;p&gt;Nobody wants to override the others. That means telling four people their judgment doesn&#39;t matter this time. Nobody wants to defer. That means admitting someone else&#39;s judgment is better than yours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So you seek consensus.&lt;/strong&gt; Can&#39;t pick one person&#39;s approach without dismissing the others. Can&#39;t ask people to defer when they&#39;re all equally senior. The only option is to find something everyone can live with.&lt;/p&gt;
&lt;p&gt;Not because you value collaboration. Because it&#39;s the only way forward without someone losing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here&#39;s what this looks like.&lt;/strong&gt; Product strategy meeting. Five people. Four different approaches on the table. Each one has merit. Each person can articulate why their approach is right and the others are risky.&lt;/p&gt;
&lt;p&gt;One person could just decide. But which one? They&#39;re all senior. They all have track records. There&#39;s no obvious decider.&lt;/p&gt;
&lt;p&gt;So you gather more data. Schedule a follow-up. Try to find an approach that works for everyone. Three meetings later you have a decision that&#39;s acceptable to all five people and optimal for none of them.&lt;/p&gt;
&lt;p&gt;A team with one expert and four people who trust that expert decides in an hour. A team with five experts decides in a week. Same decision. Different cost.&lt;/p&gt;
&lt;p&gt;This isn&#39;t ego. It&#39;s structural. You hired people whose judgment has been proven right. Then you asked them to sit in rooms with other people whose judgment has also been proven right. And you expected them to defer to each other.&lt;/p&gt;
&lt;p&gt;They can&#39;t. That&#39;s not the skill that made them successful.&lt;/p&gt;
&lt;p&gt;And while all this is happening, something else breaks down.&lt;/p&gt;
&lt;h2&gt;Tax Five: The Boring Work Gap&lt;/h2&gt;
&lt;p&gt;High performers got high-performing by solving hard problems. That&#39;s the skill that got developed. That&#39;s what got rewarded. That&#39;s what led to promotion.&lt;/p&gt;
&lt;p&gt;Take a complex problem, go deep, figure it out. Build the thing nobody else could build. Close the deal nobody else could close. Design the experience nobody else thought of. Ship the feature that moved the metric.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Now you have five people who all want to solve the hard problem.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Except you don&#39;t have five hard problems. You have maybe two. And a bunch of boring work that nobody wants to do.&lt;/p&gt;
&lt;p&gt;Who&#39;s updating the roadmap? Who&#39;s making sure the three parallel workstreams don&#39;t conflict? Who&#39;s writing the runbook? Who&#39;s doing the stakeholder communication? Who&#39;s managing the cross-functional dependencies?&lt;/p&gt;
&lt;p&gt;Not the high performers. They&#39;re competing for the two interesting problems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The boring work either doesn&#39;t happen or it becomes a resentment tax.&lt;/strong&gt; Someone does it but they&#39;re frustrated because it&#39;s not what they were hired for. It&#39;s not what they&#39;re good at. It&#39;s not what gets them promoted. They&#39;re a staff engineer writing documentation. They&#39;re a principal designer doing redlines. They&#39;re overqualified and underutilized.&lt;/p&gt;
&lt;p&gt;Or it doesn&#39;t happen and things slowly break. Miscommunication. Misalignment. Duplicated work. Conflicting decisions made in parallel.&lt;/p&gt;
&lt;p&gt;The high performers are fighting over the two interesting problems. The boring work that makes those solutions actually work together is missing. And nobody wants to do it because it won&#39;t get them to the next level.&lt;/p&gt;
&lt;p&gt;You end up hiring program managers and chiefs of staff just to do the coordination that nobody else will touch. That&#39;s expensive overhead for a structural problem.&lt;/p&gt;
&lt;p&gt;Five taxes. Five ways the math breaks down. The overhead is invisible when you&#39;re hiring. You&#39;re thinking about what each person can do. Not what happens when they all try to do it together.&lt;/p&gt;
&lt;h2&gt;The Tipping Point&lt;/h2&gt;
&lt;p&gt;You hired five high performers for a team of five. The overhead hurts, but you&#39;re still getting 30x output. Better than average.&lt;/p&gt;
&lt;p&gt;Now change the ratio.&lt;/p&gt;
&lt;p&gt;Three staff engineers on a team of four. Five principal engineers on a team of six. A leadership team that&#39;s all VPs with no directors or managers.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://twin-cities.umn.edu/news-events/star-employees-and-high-performers-positively-impact-peers-point&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Research&lt;/a&gt; on team performance found the optimal mix is around 25% high performers and 75% average performers. Beyond that ratio, too many stars on one team turns their positive impact negative.&lt;/p&gt;
&lt;p&gt;You&#39;re not paying 20x overhead anymore. You&#39;re paying 60x. Maybe 80x. The taxes compound because there&#39;s nobody left to absorb them. Nobody to defer. Nobody to do the boring work. Nobody to build the simple version. Nobody to just make the call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;When high performers become the majority, the overhead becomes the work.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is when companies hire &amp;quot;glue people&amp;quot; just to make the team functional. Program managers. Chiefs of staff. Engineering managers who don&#39;t code. People whose entire job is coordination because the high performers won&#39;t do it.&lt;/p&gt;
&lt;p&gt;That&#39;s not scale. That&#39;s a broken ratio.&lt;/p&gt;
&lt;h2&gt;What This Means&lt;/h2&gt;
&lt;p&gt;Hire great people. They&#39;re valuable. One high performer on a team of average people is a force multiplier. Two working together is still good.&lt;/p&gt;
&lt;p&gt;Three is where it gets complicated. Five is where the overhead eats your returns.&lt;/p&gt;
&lt;p&gt;This isn&#39;t about ego or personality conflicts. It&#39;s structural. Put multiple people who are used to being right in the same system and they create friction. High performance characteristics that work individually don&#39;t combine the way you think.&lt;/p&gt;
&lt;p&gt;The taxes are real. The speed paradox. Impact conflict. Framework collision. The decider problem. The boring work gap. They exist whether you believe the math or not.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You can pay these taxes.&lt;/strong&gt; Sometimes it&#39;s worth it. The 30x you get from five high performers beats the 5x you&#39;d get from five average people. But you&#39;re paying 20x in overhead for that difference.&lt;/p&gt;
&lt;p&gt;That&#39;s the deal.&lt;/p&gt;
&lt;p&gt;Nobody tells you this when you&#39;re hiring. You&#39;re thinking about talent density and capability and what these people can do. Not thinking about the ratio. Not about what happens when they&#39;re all in the same room trying to work together.&lt;/p&gt;
&lt;p&gt;The research says 25% high performers, 75% average. That ratio exists for a reason.&lt;/p&gt;
&lt;p&gt;Now you know.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>The Safety Of Busyness</title>
   <link href="https://codegazerants.com/2025/10/30/the-safety-of-busyness/"/>
   <updated>2025-10-30T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2025/10/30/the-safety-of-busyness/"><![CDATA[
    &lt;p&gt;Your manager asks what you accomplished in the last quarter. You start listing things. Helped ship three features. Stayed late and unblocked two projects and fixed countless bugs.&lt;/p&gt;
&lt;p&gt;She nods. Then asks, &amp;quot;But what did you solve?&amp;quot;.&lt;/p&gt;
&lt;p&gt;You stop and think. You realize you don&#39;t have an answer.&lt;/p&gt;
&lt;p&gt;You&#39;ve been around a lot of building. You&#39;ve supported it, kept it moving. But you haven&#39;t solved a hard problem or pushed a new idea forward. And you didn&#39;t notice until someone asked.&lt;/p&gt;
&lt;h2&gt;The Choice You Keep Making&lt;/h2&gt;
&lt;p&gt;Monday morning. You open your laptop planning to finally dig into that auth system redesign. The one that&#39;s been bothering you for months. The one where you know the current approach is wrong but fixing it means three days of thinking and another week of convincing people.&lt;/p&gt;
&lt;p&gt;Slack lights up. Someone needs help with the build. You help. Another message. Question about the API you wrote last year. You answer. A meeting invite for this afternoon. You accept.&lt;/p&gt;
&lt;p&gt;By lunch you&#39;ve been helpful to six people and haven&#39;t touched the auth system. Tomorrow, you tell yourself. Tomorrow you&#39;ll have time. You&#39;ve been telling yourself that for three weeks.&lt;/p&gt;
&lt;p&gt;But you are also kind of relieved.&lt;/p&gt;
&lt;p&gt;You&#39;re relieved you didn&#39;t have to open that blank document and stare at it. Relieved you didn&#39;t have to expose what you don&#39;t know. Relieved you could spend the day doing things you&#39;re already good at instead of things that might prove you&#39;re not as capable as everyone thinks.&lt;/p&gt;
&lt;p&gt;The requests are real. The interruptions are real. But so is the quiet comfort of letting them fill your day. One yes at a time, you&#39;re choosing safety over growth. And you&#39;re calling it being helpful.&lt;/p&gt;
&lt;h2&gt;Why You Keep Choosing Safety&lt;/h2&gt;
&lt;p&gt;You know this is happening. You feel the weight of unsolved problems in the back of your mind. That auth system. The flaky builds. The performance issue nobody wants to touch. So why don&#39;t you just do the work?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sitting down to do it makes you feel stupid.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You open the auth system file. Start tracing backwards. Fifteen minutes in you have ten files open and you&#39;ve forgotten where you started. The next file is two thousand lines written by someone who left the company two years ago. The comments are sparse. The variable names made sense to someone, but not to you.&lt;/p&gt;
&lt;p&gt;An hour in, John pings. Bug in production. You jump on it. Relief washes over you. You get to stop feeling stupid and do something you know how to handle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Proposing something real makes you vulnerable.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You spend three days on that refactoring proposal. Six months of work, mapped out. You pitch it to your team. They probe your thinking. Push back on the approach. That&#39;s what they&#39;re there for. But every question feels like evidence you missed something obvious.&lt;/p&gt;
&lt;p&gt;You don&#39;t fight for it. Better to let it die in the meeting than defend something that might be wrong.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Failure would prove something you don&#39;t want to know.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What if you push that proposal through and three months into implementation you discover you missed something fundamental? What if the whole thing crumbles? Better to have a small failure now that nobody notices than a big public one later.&lt;/p&gt;
&lt;p&gt;What if you&#39;re not as capable as you think you are? That&#39;s the real question. And you&#39;d rather not answer it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Success creates pressure you&#39;re not sure you can sustain.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If your proposal works, you need to see it through. The actual implementation. The migration plan. Months of work that come after. And if you succeed, the expectations change. Can you keep delivering at this level? What if this was your one good idea?&lt;/p&gt;
&lt;p&gt;Safer to stay where you are, doing work that doesn&#39;t raise the bar.&lt;/p&gt;
&lt;h2&gt;What You&#39;re Really Trading Away&lt;/h2&gt;
&lt;p&gt;Every week you spend answering the same questions is a week you&#39;re not building new capabilities. Every day you patch instead of fix is a day you&#39;re staying exactly as capable as you were yesterday. You&#39;re not learning. You&#39;re not growing. You&#39;re running in place and calling it progress.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But the cost is deeper than that.&lt;/strong&gt; You&#39;re trading away your sense of yourself as someone who solves hard problems.&lt;/p&gt;
&lt;p&gt;Two years ago you would have jumped at that auth system redesign. You would have been excited by the challenge. Now you avoid it. Not because you&#39;re busier. You&#39;re more afraid. Afraid of not being as sharp as you used to be. Afraid that if you actually tried, you&#39;d discover you&#39;re just average.&lt;/p&gt;
&lt;p&gt;So you stay busy. You rack up replies in Slack. You show up to every meeting. And slowly, quietly, you become someone whose main skill is being available.&lt;/p&gt;
&lt;p&gt;Then you notice newer engineers tackling problems you&#39;ve been avoiding. Because they haven&#39;t learned yet that being helpful is safer than being wrong.&lt;/p&gt;
&lt;h2&gt;The Work of Facing It&lt;/h2&gt;
&lt;p&gt;So how do you actually stop choosing safety? Not with calendar blocks or productivity hacks. With harder work than that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You have to sit with the discomfort.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Thursday afternoon. Architecture review. You&#39;re about to pitch that auth redesign. The one you&#39;ve been thinking about for weeks but only actually worked on for six hours total because you kept finding reasons not to.&lt;/p&gt;
&lt;p&gt;You have slides. Sort of. Three diagrams that explain the new approach. But there&#39;s a gap in slide four you couldn&#39;t figure out how to solve. You thought about it for an hour yesterday and got nowhere. So you left it vague.&lt;/p&gt;
&lt;p&gt;You could cancel this meeting. Say you need another week. Nobody would question it. Your hand moves toward the calendar. You stop.&lt;/p&gt;
&lt;p&gt;You start the presentation.&lt;/p&gt;
&lt;p&gt;Slide one goes fine. The problem statement. Everyone nods. They know the current system is broken. Slide two, your proposed fix. A few questions but nothing hard. You&#39;re feeling okay. Maybe this won&#39;t be bad.&lt;/p&gt;
&lt;p&gt;Slide three. Someone asks how one part of the system works. You explain it. They push back. Point out a potential problem. You thought about this. You have an answer. They nod.&lt;/p&gt;
&lt;p&gt;You&#39;re feeling better now. You can do this.&lt;/p&gt;
&lt;p&gt;Slide four. The part you don&#39;t understand yet. You put up the diagram. You explain what you know. Then you hit the gap. You could bullshit here. Make something up that sounds reasonable. Nobody would know.&lt;/p&gt;
&lt;p&gt;Instead you say, &amp;quot;I don&#39;t know how to handle that part yet&amp;quot;.&lt;/p&gt;
&lt;p&gt;The room gets quiet. Not a bad quiet. Just quiet. Mike speaks up with a suggestion. You hadn&#39;t thought of that. You say so. &amp;quot;I hadn&#39;t thought of that. Would that cause other problems?&amp;quot;. Now you&#39;re having a conversation. Not defending a complete idea. Working through an incomplete one.&lt;/p&gt;
&lt;p&gt;Ten minutes later you have three potential approaches. None of them are yours. All of them are better than what you walked in with.&lt;/p&gt;
&lt;p&gt;This is what it looks like. Not having all the answers. Saying &amp;quot;I don&#39;t know&amp;quot; in a room full of people. Letting your incomplete idea get better through exposure. The discomfort of that moment when you said &amp;quot;I don&#39;t know how to handle that part yet&amp;quot; was real. You felt it in your chest.&lt;/p&gt;
&lt;p&gt;But you didn&#39;t die. The idea didn&#39;t die. It got better.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You have to expose what you don&#39;t know.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ask the questions that make you look stupid. &amp;quot;Wait, why do we do it this way?&amp;quot;. &amp;quot;I don&#39;t understand this part of the system&amp;quot;. &amp;quot;Can you explain the decision behind this?&amp;quot;.&lt;/p&gt;
&lt;p&gt;Every question feels like evidence of inadequacy. But it&#39;s actually learning. The engineers who grow fastest aren&#39;t the ones who already know everything. They&#39;re the ones willing to look dumb in the short term to understand something real.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You have to defend ideas before they&#39;re perfect.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pitch the half-formed proposal. The redesign that still has gaps. The fix you&#39;re only 70% sure about. Put it in front of people knowing they&#39;ll find problems. Let them poke holes. Learn from what breaks.&lt;/p&gt;
&lt;p&gt;You&#39;re not protecting quality by waiting until you&#39;re certain. You&#39;re protecting yourself from feedback. The work gets better through exposure, not isolation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You have to accept that you might fail.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sometimes you&#39;ll dig into a problem for three days and realize your approach is wrong. Sometimes you&#39;ll propose something that gets shot down. Sometimes you&#39;ll try and discover you&#39;re not as far ahead as you thought.&lt;/p&gt;
&lt;p&gt;That&#39;s not evidence of inadequacy. That&#39;s what growth looks like. The engineers who solve hard problems aren&#39;t the ones who never fail. They&#39;re the ones willing to be wrong in public.&lt;/p&gt;
&lt;h2&gt;The Question That Matters&lt;/h2&gt;
&lt;p&gt;Tomorrow the messages will start again. The requests won&#39;t stop. You&#39;ll respond, help your team, stay busy. That&#39;s part of the job.&lt;/p&gt;
&lt;p&gt;But that auth system is still broken. The performance issue is still there. You know it. You feel it.&lt;/p&gt;
&lt;p&gt;You have two choices. Keep choosing comfort and slowly become someone whose main skill is being available. Or face the discomfort and become someone who solves things that matter.&lt;/p&gt;
&lt;p&gt;So what did you solve last week?&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Show Them The Kitchen</title>
   <link href="https://codegazerants.com/2025/10/19/show-them-the-kitchen/"/>
   <updated>2025-10-19T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2025/10/19/show-them-the-kitchen/"><![CDATA[
    &lt;p&gt;Rachel left after less than a year. It wasn&#39;t her fault.&lt;/p&gt;
&lt;p&gt;She joined a growing company as a senior leader with a track record of building teams and delivering results. The company had momentum. The team was shipping. Leadership seemed aligned.&lt;/p&gt;
&lt;p&gt;Her first week was two orientation meetings and one product walkthrough. Standard stuff. Then came her first real assignment, a strategic initiative that cut across the organization. She asked for context. What had been tried before? Who were the key stakeholders? What were the political landmines? What were the pitfalls to avoid?&lt;/p&gt;
&lt;p&gt;She got vague answers. &amp;quot;Just dive in and see what you find&amp;quot;. &amp;quot;The team will help you figure it out&amp;quot;. &amp;quot;We hired you because you can handle ambiguity&amp;quot;.&lt;/p&gt;
&lt;p&gt;So she dove in. She spent hours piecing together information from Slack threads and old documents. She scheduled meetings to understand team dynamics and power structures. She made assumptions, tested them, course-corrected when they were wrong. She figured it out because that&#39;s what capable people do.&lt;/p&gt;
&lt;p&gt;Meanwhile, her manager focused on the small stuff. The format of her status updates. The structure of her project plans. Whether she was using the right template for her presentations. Detailed feedback on execution, zero guidance on strategy.&lt;/p&gt;
&lt;p&gt;When Rachel asked why the CFO seemed skeptical about the initiative, she got a shrug. When she asked about the technical decisions that seemed odd, she was told &amp;quot;that&#39;s just how we do things here&amp;quot;. When she asked about team dynamics that felt tense, she was told not to worry about it.&lt;/p&gt;
&lt;p&gt;Her manager probably didn&#39;t set out to make Rachel&#39;s job harder. They were likely overwhelmed themselves, unsure how to translate their messy understanding of organizational politics into useful guidance. It&#39;s easier to review a status update than to explain why the CFO&#39;s skepticism isn&#39;t really about this project. It&#39;s easier to check presentation formatting than to articulate the unwritten rules about how decisions actually get made.&lt;/p&gt;
&lt;p&gt;So they focused on what felt concrete. What they knew how to do. And they hoped Rachel would figure out the rest, the way they had figured it out years ago. What they didn&#39;t realize was that every shrug, every &amp;quot;you&#39;ll understand eventually&amp;quot;, was teaching Rachel something. Not resilience. Not independence. Just that her manager didn&#39;t trust her with the information she needed.&lt;/p&gt;
&lt;p&gt;A few months in, Rachel was delivering. The initiative was moving forward. Leadership seemed pleased. But Rachel was exhausted. Not from the work itself but from navigating blindfolded. Every decision required detective work. Every interaction required guessing at unspoken rules.&lt;/p&gt;
&lt;p&gt;A few months later, she gave her three months notice.&lt;/p&gt;
&lt;p&gt;Maybe you&#39;ve been Rachel. Maybe you&#39;ve been her manager. Maybe you&#39;ve been both.&lt;/p&gt;
&lt;p&gt;If you&#39;ve been Rachel, you remember the exhaustion and the feeling that everyone else knows something you don&#39;t. The slow realization that your manager isn&#39;t protecting you from complexity, they&#39;re just not trusting you with information.&lt;/p&gt;
&lt;p&gt;If you&#39;ve been the manager, you remember the moment someone asked for real context and you deflected. You remember why. It wasn&#39;t cruelty. It was easier to talk about typos than to admit you don&#39;t fully understand the politics yourself. Easier to say &amp;quot;figure it out&amp;quot; than to reveal how messy and uncertain everything actually is. Easier to test their resilience than to risk them questioning whether this project should even exist.&lt;/p&gt;
&lt;p&gt;Both sides feel justified. Both sides are exhausting. And the pattern continues.&lt;/p&gt;
&lt;p&gt;Rachel was an experienced leader, but this pattern plays out at every level. Leaders withhold context and then wonder why people struggle. But there is a way.&lt;/p&gt;
&lt;h2&gt;The Two Kitchens&lt;/h2&gt;
&lt;p&gt;If you hire a chef, you don&#39;t need to show them how to chop an onion or make a sauce. They already know that. You do need to show them where the knives are. Which ones actually cut. Which burner runs hotter than the rest. Which cutting board has a crack that will catch the blade. Where the floor is slippery.&lt;/p&gt;
&lt;p&gt;Some managers hand you the keys and say &amp;quot;figure it out&amp;quot;. They think this tests your capability. They think withholding context builds resilience. They think if you&#39;re truly talented, you&#39;ll figure out the landscape on your own.&lt;/p&gt;
&lt;p&gt;Other managers walk you through the kitchen on day one. Here&#39;s where things are. Here&#39;s what works and what doesn&#39;t. Here&#39;s the history you need to understand why things are the way they are. Here&#39;s the context that will help you make good decisions.&lt;/p&gt;
&lt;p&gt;Both chefs can cook. One will be tired and resentful. The other will be effective and engaged.&lt;/p&gt;
&lt;p&gt;The difference isn&#39;t the chef. It&#39;s the environment you created.&lt;/p&gt;
&lt;h2&gt;What They&#39;re Missing&lt;/h2&gt;
&lt;p&gt;Context isn&#39;t about systems or tools. You can read the documentation for that. Context is about people, patterns, and the unwritten rules that shape how work actually gets done.&lt;/p&gt;
&lt;p&gt;The peer who pushes back hard in meetings isn&#39;t being difficult. They watched two projects fail because people were too polite to surface problems early. Now they question assumptions aggressively. When you know that, you can work with them effectively instead of taking it personally.&lt;/p&gt;
&lt;p&gt;The project everyone&#39;s working on was supposed to ship last quarter. Scope tripled quietly, no one pushed back, and now everyone&#39;s stressed and working overtime to hit the new deadline. Without knowing that history, you just see a burnt-out team. With it, you understand why morale is low and can adjust your approach.&lt;/p&gt;
&lt;p&gt;Last month the platform went down during a critical demo. Leadership is still jumpy about it, which is why almost every bug in production makes everyone feel like the sky is falling. Know that, and you frame your proposals differently from day one.&lt;/p&gt;
&lt;p&gt;These aren&#39;t minor details. These are the things that determine whether your work succeeds or fails. And when leaders withhold them, they&#39;re not testing you. They&#39;re just making your job harder for no reason.&lt;/p&gt;
&lt;p&gt;So if context is the key to success, why do we fail to provide it?&lt;/p&gt;
&lt;h2&gt;Why Smart Leaders Fail at This&lt;/h2&gt;
&lt;p&gt;Most leaders don&#39;t do this maliciously. They do it for reasons that feel logical in the moment but produce terrible outcomes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;They think you&#39;ll figure it out.&lt;/strong&gt; They did. They learned the hard way, navigating politics and landmines until they built their mental map. If they could do it, you can too. This sounds reasonable until you realize it wastes months of someone&#39;s time and burns goodwill. The new hire who proposes the exact project that failed last year doesn&#39;t look strategic. They look uninformed. You just made them look uninformed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;They think withholding context builds character.&lt;/strong&gt; Some version of &amp;quot;I don&#39;t want to hand-hold&amp;quot; or &amp;quot;let&#39;s see how they handle ambiguity&amp;quot;. This isn&#39;t leadership development. This is hazing. You&#39;re not teaching people to navigate complexity. You&#39;re teaching them that you don&#39;t trust them with information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;They don&#39;t know how to guide.&lt;/strong&gt; Most managers got promoted for execution, not for teaching. They can tell when a status update is formatted wrong. They can&#39;t articulate the strategic context that would help you write a better one. So they default to what they know. Control the details. Hope you figure out the rest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;They&#39;re protecting themselves.&lt;/strong&gt; If you understand the full context, you might question their decisions. You might see that the strategy isn&#39;t as solid as it seems. You might realize the project is doomed and push back. Better to keep you focused on execution and insulated from the messy reality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The organization makes it hard.&lt;/strong&gt; In larger companies, information becomes political currency. Teams hoard context because it gives them leverage. Leaders can&#39;t share what they don&#39;t know, and the people with context aren&#39;t always the people doing the managing. The systems fragment information across silos and nobody takes responsibility for connecting the dots.&lt;/p&gt;
&lt;p&gt;None of these reasons justify leaving people in the dark. But they explain why this pattern is so common.&lt;/p&gt;
&lt;h2&gt;Every Shrug Is a Choice&lt;/h2&gt;
&lt;p&gt;Think about the last time someone on your team asked for context. Not technical details, but the real context. Why is leadership skeptical? What&#39;s the history here? Who do I need to know about?&lt;/p&gt;
&lt;p&gt;What did you give them?&lt;/p&gt;
&lt;p&gt;If you&#39;re honest, you might have given them a version of what Rachel&#39;s manager gave her. A shrug. A &amp;quot;figure it out&amp;quot;. A redirect to focus on something more concrete. Not because you wanted to make their job harder. But because explaining the messy reality felt harder than just fixing their status update.&lt;/p&gt;
&lt;p&gt;Point out the wobbly table. Flag the slippery floor. Tell them about the knives that are dull and can hurt them. Show them which burner runs too hot. Not gossip. Not drama. Just the information they need to do good work.&lt;/p&gt;
&lt;p&gt;Your experienced people are making decisions in partial darkness too. They&#39;ve gotten better at guessing, but they&#39;re still missing context you could give them.&lt;/p&gt;
&lt;p&gt;When you share context, capable people don&#39;t just survive. They thrive. They make better decisions. They move faster. They feel trusted instead of tested. And they stick around because they&#39;re not exhausted from navigating blindfolded.&lt;/p&gt;
&lt;p&gt;Tomorrow someone will ask you for context. The CFO&#39;s concerns. The political dynamics. The history that matters.&lt;/p&gt;
&lt;p&gt;You&#39;ll have a choice. Give them a shrug, or show them the kitchen.&lt;/p&gt;
&lt;p&gt;The craft is theirs. The environment is yours.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>You Don&#39;t Have To Like Jack</title>
   <link href="https://codegazerants.com/2025/09/30/you-dont-have-to-like-jack-overcoming-bias-to-become-a-better-manager/"/>
   <updated>2025-09-30T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2025/09/30/you-dont-have-to-like-jack-overcoming-bias-to-become-a-better-manager/"><![CDATA[
    &lt;p&gt;Jack is one of the brightest engineers on the team. He delivers when others can&#39;t. He goes the extra mile. Other engineers look up to him and executives seem to love him. There&#39;s just one problem... You don&#39;t like Jack.&lt;/p&gt;
&lt;p&gt;And it really doesn&#39;t matter why.&lt;/p&gt;
&lt;p&gt;Here is the truth. As a manager you will spend time with people you don&#39;t really click with beyond simple work interactions. These people could be peers, but these people could also be humans that you are responsible for. You are their manager. Your work isn&#39;t to like them, and for that matter they don&#39;t need to like you either. Your work is to help them do their best work while being respectful. Yes, you need to click with someone, be able to make a joke, go out for a beer, and in the best case scenario meet some people you consider friends after a while. This is not the end goal though. This is a random happy accident.&lt;/p&gt;
&lt;p&gt;But Jack&#39;s case is not the happy accident kind.&lt;/p&gt;
&lt;p&gt;Your first instinct is to distance yourself from Jack and maybe delegate communication to other people. Then your 1:1s become a bit stiffer and if you have too much work, you prefer to reschedule, which you never do as a rule, or finish the 1:1 earlier for too many times in a row.&lt;/p&gt;
&lt;p&gt;But that&#39;s just you protecting yourself, not doing your job. Your job is to show up anyway.&lt;/p&gt;
&lt;p&gt;Unless you&#39;re a master of leadership from day one, you are going to make these mistakes, repeat them, and then figure out what really is going on. Let&#39;s try to save you some time and bad weekends.&lt;/p&gt;
&lt;h2&gt;The Work&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Admit it.&lt;/strong&gt; In order to understand and address something, you need to acknowledge it. You need to stop pretending it doesn&#39;t exist or completely ignoring it.&lt;/p&gt;
&lt;p&gt;Maybe it happened slowly, with one comment or interaction, or maybe it was immediate. It doesn&#39;t matter. You are human. You are not a bad manager because you don&#39;t really click with someone. You might be a bad manager though if this is affecting your decisions.&lt;/p&gt;
&lt;p&gt;So, admit it. Write it down in your notes. Maybe speak with your manager if you are comfortable with that, or share it with a trusted peer. Don&#39;t let it sit unaddressed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Separate personal feelings from professional reality.&lt;/strong&gt; Your feelings are valid. But your feelings are also irrelevant to Jack&#39;s growth in the company or getting the feedback he needs to move forward.&lt;/p&gt;
&lt;p&gt;Your job isn&#39;t to manage people you like. Your job is to manage people.&lt;/p&gt;
&lt;p&gt;That separation is a muscle you build. Every time you catch yourself making a decision based on how you feel about Jack and not his work, course correct. The more you do it the better you become. If the answer to &amp;quot;Would I do it differently if it was a different person?&amp;quot; is a yes, then you probably know what to do.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Build systems that don&#39;t care about feelings.&lt;/strong&gt; Create the schedule and stick to your 1:1s. Document the discussions, ideas, and decisions. When time comes for that promotion for Jack, Helen, or Emily, you will have clear data and a framework to support any one of them and also your decision.&lt;/p&gt;
&lt;p&gt;Systems are proof of fairness. Documentation is your defense against your own bias.&lt;/p&gt;
&lt;p&gt;This might take time to organize, but it is time well spent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Look past your irritation.&lt;/strong&gt; Jack is a great engineer and you know it. But when you&#39;re annoyed by someone, your brain collects evidence to support that annoyance. You miss things. The quality of his work. His influence on the team. The ways he makes everyone around him better.&lt;/p&gt;
&lt;p&gt;This isn&#39;t about forcing yourself to like Jack. This is about seeing Jack clearly. You need to actively disrupt that pattern. It won&#39;t make you magically like Jack better, but you will be able to navigate through your bias and see his value more clearly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reflect on your triggers.&lt;/strong&gt; This is the difficult and awkward step. Why don&#39;t you like Jack? Really. Dig deeper.&lt;/p&gt;
&lt;p&gt;Is it about some quirk he has? Is he disrespectful to people, condescending, or creating a hostile environment? Or is it really about you? Is it about his communication style that is different than yours or his values? You might even like Jack but you might be intimidated by his confidence.&lt;/p&gt;
&lt;p&gt;It can be anything really. Your triggers are yours to work through, not his to fix. The reports who trigger you the most are often showing you something you don&#39;t want to see about yourself. Maybe Jack is confident in areas where you feel insecure. Maybe he questions things you wish you had the courage to question. Maybe he reminds you of who you used to be before you learned to soften your edges. That&#39;s not his problem. That&#39;s yours.&lt;/p&gt;
&lt;p&gt;This is the hardest step because it requires admitting that maybe, just maybe, you&#39;re part of the problem. But it&#39;s also the most important because those triggers don&#39;t just affect Jack. They affect every person you&#39;ll ever manage who shares similar traits and they affect you as a person.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deliver fairness every day.&lt;/strong&gt; You don&#39;t have to like everyone. But you ought to treat everyone fairly. This is a daily discipline, not a one time decision.&lt;/p&gt;
&lt;p&gt;You&#39;re in the promotion discussion. You prepared three paragraphs for Sarah, two bullet points for Jack. Same level of work. Different level of effort from you. That&#39;s the moment you catch yourself and course correct.&lt;/p&gt;
&lt;p&gt;This is where most managers fail. Not because they don&#39;t know what to do, but because consistency is exhausting. It&#39;s easier to let a meeting slide. To delay difficult feedback. To forget to mention Jack when a cool project comes up.&lt;/p&gt;
&lt;p&gt;Show up to the 1:1. Give the feedback. Share the opportunities. Make the introduction. Write the performance review with the same care you&#39;d give to your favorite report. Fight for Jack&#39;s promotion if he deserves it, even if the idea of working with him for another year makes you tired.&lt;/p&gt;
&lt;p&gt;Your team watches how you treat everyone, not just them. When they see you managing Jack with the same consistency and respect you show everyone else, even when it&#39;s clear you don&#39;t naturally click, you&#39;re teaching them what leadership actually looks like.&lt;/p&gt;
&lt;p&gt;And Jack notices too. He might not know you don&#39;t like him, or maybe he does, but he knows whether he gets fair treatment. He knows whether you show up for him.&lt;/p&gt;
&lt;h2&gt;When The Work Isn&#39;t Enough&lt;/h2&gt;
&lt;p&gt;Sometimes you do all of this. You admit the problem. You separate feelings from reality. You build systems. You find Jack&#39;s superpowers. You examine your triggers. You show up every single day.&lt;/p&gt;
&lt;p&gt;And it still doesn&#39;t work.&lt;/p&gt;
&lt;p&gt;Maybe the communication gap is too wide. Maybe your management style and Jack&#39;s needs are mismatched. Maybe you&#39;re both great at what you do, but together you&#39;re not making each other better.&lt;/p&gt;
&lt;p&gt;The kindest thing you can do, sometimes, is to help Jack find a different team. Maybe with a manager whose style complements his.&lt;/p&gt;
&lt;p&gt;But here&#39;s the critical part. You don&#39;t get to take this exit until you&#39;ve done the work. All of it. You don&#39;t get to shuffle Jack to another team because he annoys you. You only get to make this call after you&#39;ve genuinely tried, after you&#39;ve examined your own bias, after you&#39;ve delivered consistent fairness and it&#39;s still not working for either of you.&lt;/p&gt;
&lt;p&gt;And if you do help Jack move on, you do it with the same care you&#39;d show anyone else. Good reference. Clear communication. Support during the transition. Because even if you couldn&#39;t make it work together, Jack&#39;s career matters. His growth matters. His success matters.&lt;/p&gt;
&lt;h2&gt;The Truth About This Work&lt;/h2&gt;
&lt;p&gt;I know I&#39;ve used &amp;quot;you&amp;quot; throughout this article. Truth is, it should be &amp;quot;I&amp;quot; or &amp;quot;we&amp;quot;. I&#39;ve been there. You&#39;ve been there. We all go through this at some point. Hire people who think like us. Get comfortable with certain personalities. It&#39;s human nature. It&#39;s also a trap.&lt;/p&gt;
&lt;p&gt;The good news is you can get out of it. The important thing is to try. You might fail. You might only partly succeed. But trying is the difference between a manager who lets bias run the show and one who fights it every day.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Exits, Entries, and the Background Check in Between</title>
   <link href="https://codegazerants.com/2025/09/14/exits-entries-and-the-background-check-in-between/"/>
   <updated>2025-09-14T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2025/09/14/exits-entries-and-the-background-check-in-between/"><![CDATA[
    &lt;p&gt;I&#39;ve done this dance enough times now to spot the pattern. Forms asking for exact dates from years back, hunting for documents you swore you saved somewhere, that familiar anxiety when your work history looks messier on paper than it felt living through it.&lt;/p&gt;
&lt;p&gt;Background checks aren&#39;t terrifying, but they can feel impersonal and awkward. There&#39;s no hiring manager to explain things to, no coffee chat where you can add context. Just you, some third-party service, and a checklist they need to work through.&lt;/p&gt;
&lt;p&gt;I remember my first time years ago and how stressed I felt. Now I know the truth, that most of that stress was unnecessary. These checks aren&#39;t personal investigations, they&#39;re verification processes. But knowing that doesn&#39;t make them feel less invasive when you&#39;re in the middle of one.&lt;/p&gt;
&lt;p&gt;So here&#39;s what I wish someone had told me before my first background check, and what I&#39;m telling you now.&lt;/p&gt;
&lt;h2&gt;Exit Matters&lt;/h2&gt;
&lt;p&gt;Background check anxiety can start before you even apply for the new job. It starts with how you leave your current one.&lt;/p&gt;
&lt;p&gt;Every burned bridge becomes a reference you can&#39;t use. Every loose thread becomes something a background check might snag on.&lt;/p&gt;
&lt;p&gt;The rule is simple, &lt;strong&gt;don&#39;t be a d*ck.&lt;/strong&gt; Not only because it&#39;s the right thing to do, but because your reputation follows you in ways you won&#39;t realize until years later. When a background check service calls your old company, you want the person who answers to remember you fondly or at least neutrally.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Finish your work or document it clearly.&lt;/strong&gt; If you wouldn&#39;t want to inherit someone else&#39;s half-finished mess, don&#39;t leave one behind.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Share your contact info.&lt;/strong&gt; Five minutes of exchanging phone numbers can prevent weeks of &amp;quot;we couldn&#39;t reach anyone to verify your employment&amp;quot; emails later.&lt;/p&gt;
&lt;p&gt;Here is the thing, if you&#39;re managing someone who&#39;s leaving, the same rules apply. Don&#39;t make it weird. Don&#39;t sulk. Someone choosing to leave isn&#39;t a personal rejection. It&#39;s a career decision. Help them exit cleanly, and they&#39;ll remember it.&lt;/p&gt;
&lt;h2&gt;What These Checks Actually Are (And Aren&#39;t)&lt;/h2&gt;
&lt;p&gt;Background checks feel personal, but they&#39;re not. The company running your check is processing hundreds of applications weekly. They&#39;re not investigating your character. They&#39;re confirming your claims.&lt;/p&gt;
&lt;p&gt;They&#39;ll verify:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Employment dates and job titles&lt;/li&gt;
&lt;li&gt;Education and certifications&lt;/li&gt;
&lt;li&gt;Sometimes criminal records or credit history&lt;/li&gt;
&lt;li&gt;Maybe a quick scan of public social media&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;(Note: This applies to standard employment background checks. Security clearances and certain government positions involve much more intensive investigations that can include character references, financial deep-dives, and interviews with associates.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;They won&#39;t call your old boss to ask if you were &amp;quot;a team player&amp;quot; or &amp;quot;good under pressure&amp;quot;. That&#39;s what reference checks are for, which happen separately and with your permission.&lt;/p&gt;
&lt;p&gt;The uncomfortable part is how faceless it all feels. You can&#39;t explain that the company restructured twice while you were there, changing your official title three times. You can&#39;t clarify that you worked remotely from another country for six months, which might look weird on paper.&lt;/p&gt;
&lt;p&gt;These services don&#39;t know your story&#39;s context. They just know what the paperwork says.&lt;/p&gt;
&lt;p&gt;But here&#39;s what matters: &lt;strong&gt;they&#39;re not making hiring decisions&lt;/strong&gt;. They&#39;re just gathering facts for the employer, who will interpret those facts knowing they hired you already. A small discrepancy in dates won&#39;t torpedo your offer unless it reveals outright deception.&lt;/p&gt;
&lt;h2&gt;Your Background Check Survival Kit&lt;/h2&gt;
&lt;p&gt;The secret to stress-free background checks is boring. Organization. Future-you will thank present-you for keeping things organized. Keep a folder, digital or physical, with these documents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Offer letters and contracts&lt;/strong&gt; from every job&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ID or passport scans&lt;/strong&gt; (high quality, readable)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Promotion letters or title change notifications&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A few recent pay stubs&lt;/strong&gt; from each employer&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resignation letters or termination documentation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Certificates from training, courses, or professional development&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contact information&lt;/strong&gt; for someone in HR from each company (if possible)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This isn&#39;t about being paranoid, it&#39;s about being prepared. When you&#39;re scrambling to find a three-year-old offer letter at 11 PM, you&#39;ll thank yourself for this folder. This will be your &amp;quot;career packet&amp;quot;.&lt;/p&gt;
&lt;p&gt;Also, make sure your LinkedIn matches reality. Same company names, same job titles, same approximate dates. It&#39;s not the end of the world if there are small differences, but why create questions you don&#39;t need to answer?&lt;/p&gt;
&lt;h2&gt;The Long Game&lt;/h2&gt;
&lt;p&gt;After your second or third background check, assembling these documents becomes routine. What once felt like a month of anxiety becomes a week of straightforward paperwork.&lt;/p&gt;
&lt;p&gt;Small hiccups will happen. Titles that don&#39;t match exactly. Forgotten certificates. Companies that got acquired and changed their HR systems. These rarely derail anything, they just require a quick email to clarify.&lt;/p&gt;
&lt;p&gt;The real insight is this. Background checks aren&#39;t about you personally. They&#39;re about the paper trail you&#39;ve left behind. The better you manage that trail throughout your career, through clean exits, organized records and professional relationships, the easier these processes become.&lt;/p&gt;
&lt;p&gt;Your future self will thank you for taking this seriously now. Not because background checks are scary, but because they don&#39;t have to be stressful at all.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Why Engineering Work Isn&#39;t Done Until It&#39;s Actually Done</title>
   <link href="https://codegazerants.com/2025/08/30/why-engineering-work-isnt-done-until-its-actually-done/"/>
   <updated>2025-08-30T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2025/08/30/why-engineering-work-isnt-done-until-its-actually-done/"><![CDATA[
    &lt;p&gt;I can picture myself in a team meeting or a 1:1, bringing this up - and yes, I’m spoiling the article a bit - &amp;quot;Asking someone to review your work isn’t a favor. It’s part of the job. It’s literally in their job description&amp;quot;.&lt;/p&gt;
&lt;p&gt;If I had a dollar for every apologetic follow-up I’ve read (or written myself) that starts with &amp;quot;Sorry to bother you… 😅&amp;quot; and asks for something be be unblocked, well, let’s not exaggerate. I wouldn’t be rich, but I’d be in a better financial state.&lt;/p&gt;
&lt;p&gt;Sure, it has to do with everyone’s confidence and experience, and the environment and culture. But there’s also something broken in how we think about our work.&lt;/p&gt;
&lt;p&gt;Our industry has a tendency to celebrate lone - but productive - wolves, the superstars, the sole engineer who stayed up until 2 a.m. to deliver a &amp;quot;mission critical&amp;quot; feature. Sounds good, but in practice, we’ve tried that before, and it didn’t work the way we hoped. We just produced burned-out people. Rich, maybe, but burned-out. Modern software development is collaborative, and it should be.&lt;/p&gt;
&lt;p&gt;Asking for a PR review a second time? That’s not nagging, that’s about making sure of quality and also ownership. And just to be clear if there’s one thing to keep from this piece, it’s that the work doesn’t end when you move your task to the “Merged” column. It ends when it’s in production, and making sure everything works in production too.&lt;/p&gt;
&lt;h2&gt;When Politeness (or Confidence) Becomes Self-Sabotage&lt;/h2&gt;
&lt;p&gt;Why do engineers find the collaborative parts of their job challenging, especially when they need to ask for something to be done?&lt;/p&gt;
&lt;p&gt;First, it’s human nature. Most of us find it difficult to be &amp;quot;that person&amp;quot; who asks three times for a review, the next iteration of a design, or specs that never came with a ticket. We don&#39;t want to stop people doing their &amp;quot;more important&amp;quot; work. And let’s not forget about introverts!&lt;/p&gt;
&lt;p&gt;But there’s something deeper. Many engineers, especially early in their careers, see their work as done when they move a ticket from &amp;quot;Started&amp;quot; to &amp;quot;Review.&amp;quot; Usually, a senior engineer or manager will step in, but too often, no one explains that we all contribute to the team’s success, not just with code.&lt;/p&gt;
&lt;p&gt;I’ve seen projects delayed because hesitation accumulated over time. Nobody got hurt, and the company didn’t fail, but it’s a shame to lose a milestone after hard work, just because someone didn’t follow up.&lt;/p&gt;
&lt;h2&gt;What &amp;quot;Done&amp;quot; Actually Means (Spoiler: It’s Not What You Might Think)&lt;/h2&gt;
&lt;p&gt;Let’s be honest. Engineering or implementation work is usually only 50–60% of the total effort. When you click &amp;quot;Create PR&amp;quot; and add reviewers, the work isn’t done. It’s really just a draft waiting for review, either code-wise or as an end-to-end experience.&lt;/p&gt;
&lt;p&gt;There could be one minor comment, a major issue, or even a complete misinterpretation of the specs that needs rewriting that can get the team off of their plans by significant time. It all depends on the case.&lt;/p&gt;
&lt;p&gt;So yes, our work isn’t done when we create the PR. It’s done when it’s in production, and the system hasn’t crashed. I once had a very experienced engineer on my team who, with every release, would open a new tab to check, “Did we bring down the app? Nope. So far so good.” After all these years, that habit still sticks and I still crack a smile every once in a while when thinking about it.&lt;/p&gt;
&lt;p&gt;But back to following up on work that isn’t visible. Let’s call our engineer Anna. She got specs for a new feature, estimated her work, implemented it, and wrote solid tests. She moved her ticket to “Review” after self-testing and creating a PR, and added a reviewer. The next day, she mentioned in standup that she’d start the next ticket while waiting for feedback.&lt;/p&gt;
&lt;p&gt;Her PR sat untouched for five days because she only mentioned it once. When she finally followed up, the reviewer was busy with something urgent. Between UI changes and code revisions, the feature took an extra week and a half. Yes, Anna did amazing work, and yes, someone else could have raised their hand earlier, but the milestone failed simply because she didn’t follow up.&lt;/p&gt;
&lt;h2&gt;The Professional Follow-Up Playbook&lt;/h2&gt;
&lt;p&gt;Here’s the good news: this is a learnable skill. The secret is replacing apologetic uncertainty with confident ownership.&lt;/p&gt;
&lt;p&gt;Timing matters, but not the usual way. For normal reviews, 24–48 hours is reasonable. For blockers, same day follow up is expected without being aggressive. Critical issues? Most of the team should already be on top of it.&lt;/p&gt;
&lt;p&gt;Context is everything. Compare these approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Hey, can you please review my PR when you have some time?” (ambiguous, easy to ignore, priority unclear, it will most probably be at the bottom of the tasks)&lt;/li&gt;
&lt;li&gt;“@specificmembersoftheteam Could you please review the payment integration in PR #847 by Thursday? It’s needed for the client demo we discussed.” (specific, deadline-driven, business context)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One gets lost in the noise. The other gets action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Make it stupidly easy for reviewers.&lt;/strong&gt; Write PR descriptions explaining not just what changed, but why. Add self-review comments highlighting areas where you want specific feedback. Include screenshots for UI changes. Provide context. Your reviewer probably has multiple PRs to handle - like you probably do - so removing ambiguity about urgency is crucial.&lt;/p&gt;
&lt;p&gt;Follow up, especially if it’s a repeat request: &amp;quot;I need a review on PR #847 by EOD Friday to hit our sprint commitments. Can someone take a look, or should I find another reviewer?&amp;quot; This isn’t confrontational, it&#39;s trying to figure out a solution.&lt;/p&gt;
&lt;p&gt;Stop apologizing for doing your job. Replace &amp;quot;Sorry to bother you again…&amp;quot; with &amp;quot;Following up on…&amp;quot; You’re not bothering anyone. Treat this like any other impediment in delivering your work. Because it is.&lt;/p&gt;
&lt;h2&gt;Building a Culture That Actually Works&lt;/h2&gt;
&lt;p&gt;Now, if for some reason you ended up on the leadership side, then this is for you. Many things can go wrong, but leadership sets the tone. Encourage the team to remember that success is a group effort, not individual heroism.&lt;/p&gt;
&lt;p&gt;It can start in a 1:1 by setting expectations about accountability and ownership. In standups, a simple question like &amp;quot;Who will handle the review?&amp;quot; or a gentle nudge to prioritize reviews can create healthy habits over time.&lt;/p&gt;
&lt;p&gt;If I’m working with a team and notice a lot of WIP in the review column, I explicitly ask them to prioritize it for the day rather than jumping into new work. It works, but you need to understand the board and the remaining tasks.&lt;/p&gt;
&lt;p&gt;Processes and habits matter too. Set guidelines like time limits for reviews or limits on how many tickets can be reviewed at once. Leadership must model responsiveness, urge collaboration, and create safety so people aren’t afraid to remove impediments and own their work.&lt;/p&gt;
&lt;h2&gt;The Real Work&lt;/h2&gt;
&lt;p&gt;Finishing the code is the the first part. More work comes afterward, the follow-ups, the reviews, the small nudges that make sure what you built actually reaches production. Done is not a task moving across a board. It is the moment when your code quietly works for real people, without anyone needing to check if it broke.&lt;/p&gt;
&lt;p&gt;Engineering is rarely a solo act. It is more like a relay, where every handoff matters, and those nudges are just part of keeping the baton moving. When the team finds that rhythm, the process feels almost invisible, but when it is missing, you notice immediately. That is the subtle work that makes engineering truly done, not just finished.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>The Complexity Paradox: Why Fixing Windows Got Harder When Everything Got Better</title>
   <link href="https://codegazerants.com/2025/08/15/the-complexity-paradox-why-fixing-windows-got-harder-when-everything-got-better/"/>
   <updated>2025-08-15T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2025/08/15/the-complexity-paradox-why-fixing-windows-got-harder-when-everything-got-better/"><![CDATA[
    &lt;p&gt;Windows machines. The gift and the curse of this world. And for the record, I&#39;ve been using Macs for the past ten years, so what follows might just be a Windows problem or... who knows.&lt;/p&gt;
&lt;p&gt;My experience goes from Windows 95 up to Windows 7, and apart from some hiccups here and there (yes Vista, I&#39;m looking at you), some driver issues, and some early development tools that could take two to three days to get working, I had good feelings toward the operating system. After Windows 7, I lost touch a bit, and I always need some time to rewire my brain and work with the OS again.&lt;/p&gt;
&lt;p&gt;But maybe that&#39;s part of the problem. Or maybe it&#39;s something deeper about how we&#39;ve traded simplicity for sophistication.&lt;/p&gt;
&lt;h2&gt;When Machines Decide to Have Opinions&lt;/h2&gt;
&lt;p&gt;There were two and a half cases that really made me question the nature of modern computing. Each one a perfect example of how our &amp;quot;improved&amp;quot; systems have become their own worst enemies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Case One(and a half): The TPM Tantrum&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;One laptop decided, seemingly overnight, that it would return a cryptic TPM error demanding a full reset. Fine, we thought. Reset completed, problem solved. Two months later, the same machine had the audacity to reboot mid-email, trapping itself in an endless repair console loop with messages claiming it &amp;quot;couldn&#39;t repair Windows.&amp;quot;&lt;/p&gt;
&lt;p&gt;This time, even a reset wouldn&#39;t work. We had to download a specific manufacturer version of Windows, rebuild everything from scratch, and do it all while on the phone with a support team that was as mystified as we were. They had no real understanding of what had gone sideways and just asked to send them the laptop for fixing. We did it ourselves, of course.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Case Two: The Sleepy Reboots&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Another PC started randomly rebooting when waking from sleep. No warning, no pattern, no apparent reason. The logs pointed to the ever unhelpful &amp;quot;Error 41,&amp;quot; which, for the uninitiated, is Windows-speak for &amp;quot;Kernel-Power failure.&amp;quot; It&#39;s a generic &amp;quot;your system shut down unexpectedly&amp;quot; notice that could mean anything from a bad driver to a failing power supply to a cosmic ray flipping a bit in RAM. In plain English, it&#39;s Windows shrugging and saying, &amp;quot;Something happened.&amp;quot; Still no fix. The machine works fine until it doesn&#39;t, which is somehow worse than a failure you can count on.&lt;/p&gt;
&lt;h2&gt;Do They Make Them Like They Used To?&lt;/h2&gt;
&lt;p&gt;A few weeks earlier, I joked about the old days when you had a problem with your machine. You either had a &amp;quot;tech&amp;quot; person (usually someone&#39;s cousin who &amp;quot;knew computers&amp;quot;) who would most probably format your PC, or you would do it yourself. The nuclear option was the only option and you also had to cancel everything for the weekend. You had a lot of work to do!&lt;/p&gt;
&lt;p&gt;If you saw a BSOD (Blue Screen of Death), you didn&#39;t have a lot of choices. You would either format everything and start fresh-and everything would magically work again-or you&#39;d throw the machine out and get a new one. If you had no money, then you had no PC. It was brutal but honest.&lt;/p&gt;
&lt;p&gt;The beauty of this approach wasn&#39;t the destruction-it was the clarity. One problem, one solution. Your computer either worked or it didn&#39;t.&lt;/p&gt;
&lt;h2&gt;The Infinite Complexity Machine&lt;/h2&gt;
&lt;p&gt;Nowadays, you have all the information at your disposal. You have more knowledge than ever before, and it&#39;s all accessible. But you also have a billion freaking things that could go wrong, each with its own rabbit hole of potential causes.&lt;/p&gt;
&lt;p&gt;You get an Error 41? Well, it could be your power supply, your cables, the latest Windows update, the latest manufacturer update, a driver conflict, a memory issue, overheating, a dying hard drive, corrupted system files, or-and I&#39;m only half joking here, the butterfly that decided to flap its wings in Osaka at precisely the wrong moment.&lt;/p&gt;
&lt;p&gt;It&#39;s paradoxically more confusing than it used to be, despite having access to vastly more information. We&#39;ve traded the brutal simplicity of &amp;quot;format and pray&amp;quot; for the infinite complexity of &amp;quot;debug and despair.&amp;quot;&lt;/p&gt;
&lt;h2&gt;The Update Treadmill&lt;/h2&gt;
&lt;p&gt;You could blame the constant stream of updates. The 4 billion patches, security fixes, feature additions, and &amp;quot;improvements&amp;quot; that flow through our machines like a new create startup releases that never stops. Each update is a potential point of failure, a new way for things to break that worked perfectly yesterday.&lt;/p&gt;
&lt;p&gt;Or maybe it&#39;s the hardware itself, designed now for replaceability rather than reliability. Components that used to last a decade are now expected to be swapped out every few years. Everything is modular, upgradeable, and somehow more fragile.&lt;/p&gt;
&lt;h2&gt;The Paradox of Progress&lt;/h2&gt;
&lt;p&gt;Here&#39;s the thing that really gets me: we&#39;ve made computers incredibly powerful and capable, but somehow less dependable. A modern laptop can run AI models (look at me, keeping up with the times!), process 4K video, and connect to a dozen devices simultaneously, but it can&#39;t consistently wake up from sleep without having an existential crisis. It stirs for a few seconds, decides it’s not in the mood, goes back to sleep, repeats three times and then reboots!&lt;/p&gt;
&lt;p&gt;We&#39;ve gained infinite possibilities and lost the simple certainty that our tools will work when we need them. It&#39;s like trading a reliable hammer for a Swiss Army knife that sometimes forgets how to be a screwdriver.&lt;/p&gt;
&lt;p&gt;The old way was harsh but honest. The new way is sophisticated but maddening. I&#39;m not sure which I prefer, but I know which one lets me actually get work done.&lt;/p&gt;
&lt;h2&gt;The Real Question&lt;/h2&gt;
&lt;p&gt;Maybe the issue isn&#39;t Windows at all. Maybe it&#39;s that we&#39;ve built systems so complex that no single person - not the user, not the support tech, not even the original programmers - truly understands how all the pieces fit together anymore.&lt;/p&gt;
&lt;p&gt;We&#39;ve created machines that are smarter than ever but somehow less predictable than a coin flip. And we&#39;ve convinced ourselves this is progress.&lt;/p&gt;
&lt;p&gt;The question isn&#39;t whether they make them like they used to. The question is: when did &amp;quot;better&amp;quot; stop meaning &amp;quot;more reliable&amp;quot;? Although if I&#39;m being honest, I haven&#39;t had this kind of issue with the overrated and overpriced Mac laptops...&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Moved to Eleventy After Ten Years With Jekyll</title>
   <link href="https://codegazerants.com/2025/08/02/moved-to-eleventy-after-ten-years-with-jekyll/"/>
   <updated>2025-08-02T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2025/08/02/moved-to-eleventy-after-ten-years-with-jekyll/"><![CDATA[
    &lt;p&gt;Based on the git log, it’s been about six or seven months since I moved this blog over to Eleventy. I did take notes at the time and even started drafting a post about it, but then life happened. Things shifted, priorities changed, and that early draft is probably lost for good now.&lt;/p&gt;
&lt;p&gt;So instead, I’m writing this from memory. I’ll try to cover what I did and why, though I can only recall one specific citation. The rest? Let&#39;s make some assumptions. 😄&lt;/p&gt;
&lt;p&gt;For years, this blog was powered by Jekyll, using GitHub Pages - all provided by the good people of Github - which meant I could push to the main branch and the whole thing would build and deploy on its own.&lt;/p&gt;
&lt;p&gt;Setup details, more or less:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jekyll handled Sass preprocessing from some very old CSS files I wrote at the start of this blog.&lt;/li&gt;
&lt;li&gt;There was also some magic JavaScript bundling, cobbled together from a guide I &lt;a href=&#34;https://codegazerants.com/2016/01/09/a-jekyll-workflow-with-gulp/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;created&lt;/a&gt; nine years ago and never touched it again.&lt;/li&gt;
&lt;li&gt;It all just worked, until it didn’t.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Reason for Change&lt;/h2&gt;
&lt;p&gt;Jekyll itself wasn’t the problem. I liked it. Still do. But Ruby on a Mac can be a headache, especially when you don’t live in that ecosystem.&lt;/p&gt;
&lt;p&gt;My old Mac? Jekyll ran fine. Why? No idea. Some mix of good luck and forgotten installs. But when I tried to get it running on a new machine, everything broke. I believe the last time I tried, I didn&#39;t manage to make it work even after a few hours, and I do like things simple.&lt;/p&gt;
&lt;p&gt;I wanted a setup that didn&#39;t argue with me. It was time for a change!&lt;/p&gt;
&lt;h2&gt;The Plan&lt;/h2&gt;
&lt;p&gt;I knew I had to solve a few things quickly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Find a Jekyll alternative that could preserve my URL structure.&lt;/li&gt;
&lt;li&gt;Migrate all existing posts and templates.&lt;/li&gt;
&lt;li&gt;Set up a build pipeline to deploy automatically through GitHub Pages.&lt;/li&gt;
&lt;li&gt;Do it fast. If it took more than an afternoon or two, I&#39;d probably abandon it and never come back. I had done something similar in the past, but as soon as I managed to make something work I lost my interest.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Candidates&lt;/h2&gt;
&lt;p&gt;I started with Next.js. I&#39;d been messing with it recently, so it felt like a natural first option. I got most of the migration done before realizing it was overkill. Too many moving parts. The URLs didn&#39;t work as I wanted. Everything felt heavier than it needed to be, especially for a blog.&lt;/p&gt;
&lt;p&gt;So I looked elsewhere. Enter Eleventy.&lt;/p&gt;
&lt;p&gt;I’d had my eye on 11ty for a while but never used it seriously. One of the downsides of Eleventy is the documentation. At that time at least, it was more of a reference than documentation, so it was... okay. But there were enough blog posts and migration guides to piece things together and don&#39;t get me wrong, the people at 11ty are trying their best.&lt;/p&gt;
&lt;p&gt;Now that I&#39;m thinking about it, why wasn&#39;t I using ChatGPT during all this?&lt;/p&gt;
&lt;p&gt;After a one or two afternoons of reading and tinkering during a weekend, the blog was up and running again at least locally!&lt;/p&gt;
&lt;h2&gt;Eleventy Configuration&lt;/h2&gt;
&lt;p&gt;Most of Eleventy’s logic lives in &lt;code&gt;eleventy.config.js&lt;/code&gt;. You can break things out more if you want, and structure it as any JS library, but this setup was enough for me. I also added two config files in, &lt;code&gt;_posts&lt;/code&gt; and &lt;code&gt;_data&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here’s where I defined the preprocessing behavior, added collections, and plugged in a few filters. For CSS, I went with PostCSS and some basic plugins:&lt;/p&gt;
&lt;pre class=&#34;language-js&#34;&gt;&lt;code class=&#34;language-js&#34;&gt;eleventyConfig&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;eleventy.before&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;async&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; cssSourceFile &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;./assets/css/index.css&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; cssDestinationFile &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;./_site/index.css&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  fs&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;readFile&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;cssSourceFile&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;err&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; css&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token function&#34;&gt;postcss&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;postcssImport&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; postNested&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; autoprefixer&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; cssnano&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;css&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; cssSourceFile&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; cssDestinationFile &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;then&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;Writing CSS to _site&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        fs&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;writeFile&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;cssDestinationFile&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; result&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;css&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  eleventyConfig&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addWatchTarget&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;./assets/css/&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For collections, I added one for posts and another for categories:&lt;/p&gt;
&lt;pre class=&#34;language-js&#34;&gt;&lt;code class=&#34;language-js&#34;&gt;eleventyConfig&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addCollection&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;posts&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;collectionApi&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; collectionApi&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getFilteredByGlob&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;_posts/*&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;reverse&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

eleventyConfig&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addCollection&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;postsByCategory&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;collectionApi&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; posts &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; collectionApi&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getFilteredByGlob&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;_posts/*&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;reverse&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; categoriesMap &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  posts&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;post&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; categories &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; post&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;data&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;categories &lt;span class=&#34;token operator&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    categories&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;category&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;categoriesMap&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;category&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        categoriesMap&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;category&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
      categoriesMap&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;category&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;push&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;post&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; Object&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;entries&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;categoriesMap&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;category&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; posts&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    category&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    posts&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To replicate Jekyll’s &lt;code&gt;excerpt&lt;/code&gt; filter, I added this:&lt;/p&gt;
&lt;pre class=&#34;language-js&#34;&gt;&lt;code class=&#34;language-js&#34;&gt;eleventyConfig&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addLiquidFilter&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;excerpt&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;input&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; separator &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&amp;lt;/p&gt;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; input
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;separator&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token regex&#34;&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-source language-regex&#34;&gt;&amp;lt;script.*?&amp;lt;\/script&gt;&lt;/span&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-flags&#34;&gt;gs&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token regex&#34;&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-source language-regex&#34;&gt;&amp;lt;!--.*?--&gt;&lt;/span&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-flags&#34;&gt;gs&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token regex&#34;&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-source language-regex&#34;&gt;&amp;lt;style.*?&amp;lt;\/style&gt;&lt;/span&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-flags&#34;&gt;gs&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token regex&#34;&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-source language-regex&#34;&gt;&amp;lt;.*?&gt;&lt;/span&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-flags&#34;&gt;gs&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can check this file on &lt;a href=&#34;https://github.com/codegaze/codegaze.github.io/blob/master/eleventy.config.cjs&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Github&lt;/a&gt; of course for all the contents!&lt;/p&gt;
&lt;p&gt;As mentioned, I also added:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/codegaze/codegaze.github.io/blob/master/_data/site.js&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;site.js&lt;/code&gt;&lt;/a&gt; for shared variables.&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/codegaze/codegaze.github.io/blob/master/_posts/_posts.json&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;_posts.json&lt;/code&gt;&lt;/a&gt; to keep paths consistent with Jekyll.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Non-Mandatory Updates&lt;/h2&gt;
&lt;p&gt;During the migration process I made some other updates that really simplified things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Removed all old JS build steps and ended up with just seven dependencies. Five are for CSS. Two are Eleventy itself.&lt;/li&gt;
&lt;li&gt;Simplified the CSS setup. Sass was overkill. I switched to native CSS variables, kept nesting via PostCSS, and stuck with BEM. Everything stayed in separate files, which keeps me happy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No big flashy features here, but it felt good to clean house. Small dopamine dose!&lt;/p&gt;
&lt;h2&gt;The Build Pipeline&lt;/h2&gt;
&lt;p&gt;Once the blog was working locally, I needed a way to deploy it.&lt;/p&gt;
&lt;p&gt;Of course I looked for something that Github Actions would help. There were a bunch of solutions that used a secret or something like that which I tried to avoid.&lt;/p&gt;
&lt;p&gt;Somewhere along the way, I found &lt;a href=&#34;https://github.com/actions/upload-pages-artifact&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;&lt;code&gt;actions/upload-pages-artifact&lt;/code&gt;&lt;/a&gt;. I can’t remember where, maybe GitHub Docs, maybe a blog post. Either way, it did the trick.&lt;/p&gt;
&lt;p&gt;One more thing, because the repo is used for Github Pages and we are creating our own build pipeline, we need to inform Github about this. I added an empty &lt;code&gt;.nojekyll&lt;/code&gt; file to skip their automation and let my build handle everything.&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;It’s been months since I finished this migration the beggining of this year. I’ve barely touched the setup since and things seems to be working even in a machine that I just installed it. That’s a good thing. No... That&#39;s a very good thing. Initial goal is done!&lt;/p&gt;
&lt;p&gt;It runs. It builds. It deploys.&lt;/p&gt;
&lt;p&gt;If it holds together for another ten years like Jekyll did, I’ll call that a success.&lt;/p&gt;
&lt;p&gt;And one last thing: I still think Jekyll is great. It served me well for a long time. My move away from it was more about my limited Ruby skills and a desire for a simpler experience than any fault in the tool itself.&lt;/p&gt;
&lt;p&gt;My suggestion would be to give it a try and see if it works for you. The team has done some amazing work. All the contributors, they’ve built something solid and lasting.&lt;/p&gt;
&lt;h2&gt;Assumed Citations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://kittygiraudel.com/2020/11/30/from-jekyll-to-11ty/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://kittygiraudel.com/2020/11/30/from-jekyll-to-11ty/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://24ways.org/2018/turn-jekyll-up-to-eleventy/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://24ways.org/2018/turn-jekyll-up-to-eleventy/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://alex.pearwin.com/2020/06/jekyll-to-eleventy/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://alex.pearwin.com/2020/06/jekyll-to-eleventy/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/11ty/eleventy/discussions/1455&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/11ty/eleventy/discussions/1455&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dozens more, probably. It was a very productive weekend.&lt;/li&gt;
&lt;/ul&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Check-in III</title>
   <link href="https://codegazerants.com/2024/02/02/check-in-iii/"/>
   <updated>2024-02-02T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2024/02/02/check-in-iii/"><![CDATA[
    &lt;p&gt;As we step into February, we&#39;re faced with a blank canvas for the next thirty days. However, let&#39;s reflect on January first.&lt;/p&gt;
&lt;p&gt;January was a bit peculiar, both in a positive and challenging way.&lt;/p&gt;
&lt;p&gt;First of all, I had fewer working days and more days to relax, due to some PTO days I had from the previous year. Family issues threw me off my game a bit, yet simultaneously, I had to be super focused on tackling my to-do list before the month&#39;s end.&lt;/p&gt;
&lt;p&gt;Why was I in such a rush? Well, after seven years in Transifex, I decided it was time to make use of my one month sabbatical perk. A sabbatical is always a great opportunity to relax, travel, do a personal project or just stop thinking about work. February might sound like a weird choice, but if I&#39;m being honest, there is never an optimal time for a month-long break from work, so here I am.&lt;/p&gt;
&lt;p&gt;I purposely didn’t plan anything for this month. If I manage to enjoy this time, clear my head and get ready to come back with more ideas, I will be happy. There are some things I want to do at home, which I have been procrastinating, but the main focus will probably be to make the best of this time even if it is a “anything can happen” month! More on that in four weeks!&lt;/p&gt;
&lt;h2&gt;Quantified (?) Metrics&lt;/h2&gt;
&lt;h3&gt;Reading&lt;/h3&gt;
&lt;p&gt;Since the end of November, I&#39;ve been on a break, so there are no major updates regarding my reading. I have spent some time delving into AI world updates. What can I say, I’m the adventurous type of person.&lt;/p&gt;
&lt;h3&gt;Writing&lt;/h3&gt;
&lt;p&gt;We have one for this month. A small update regarding work, breaks and exercise and how I’m experimenting with ways of  getting midday boosts!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/2024/01/28/trying-out-new-things/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Trying Out New Things&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&#39;s better than nothing, but I should stop hoarding drafts at some point! &lt;em&gt;This marks the fourth time I&#39;m writing something titled &#39;Check-in III&#39;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Oh! Almost forgot. During a fairly not so good day, I started writing a mystery/crime short story about… who knows what it really is about, but I enjoyed the process so far and it is one of the pieces I’ve felt confident about the storytelling and the writing.&lt;/p&gt;
&lt;p&gt;And since we are still in the &lt;strong&gt;Writing&lt;/strong&gt; section, Michael Lopp started a &lt;a href=&#34;https://randsprompts.substack.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;new newsletter&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;} that shares three writing prompts each Monday. It&#39;s nice to see people with some influence urging people to write. The “Writing teaches you how you think” quote couldn’t be more close to the truth!&lt;/p&gt;
&lt;h3&gt;Watching&lt;/h3&gt;
&lt;p&gt;Now that I’m thinking of it, I realise this category is proportionally opposite to the &lt;strong&gt;Reading&lt;/strong&gt; section. We’ve been watching a lot of tv-shows and movies in our free time.&lt;/p&gt;
&lt;p&gt;If I had to choose something, it would probably be The West Wing. A show that first aired in 1999, so 25 years ago!&lt;/p&gt;
&lt;p&gt;In case I haven’t mentioned that in the past, I love Sorkin’s writing. Yes, his dialogue can be challenging, even for native speakers, and his themes are US-specific, and yes there are moments of cheesy scenes, but I’ve enjoyed most of his work and it’s the only show of his I haven’t watched yet. &lt;em&gt;Have I told you how much I loved The Newsroom?&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Exercising&lt;/h3&gt;
&lt;p&gt;I’ve written more about my routine this week, what I can share more is that for January I’ve done 16 workouts and I’ve managed to hit my steps goal for 19 days. Keep in mind that the goals are dynamic, and increase based on performance so at some point I cannot keep up. I could always change it to fixed, but where is the fun in that?&lt;/p&gt;
&lt;p&gt;My current goal, though, is to incorporate more intensive workout minutes throughout the week.&lt;/p&gt;
&lt;p&gt;I wish I had more specific numbers regarding exercising, but I&#39;m still trying to figure things out in the &amp;quot;activity tracking&amp;quot; area and make sure I&#39;m not getting duplicate tracking or something like that.&lt;/p&gt;
&lt;div style=&#34;text-align: center; padding-bottom: 10px;&#34;&gt;***&lt;/div&gt;
&lt;p&gt;As I dive into this month with no set plans, here&#39;s to the unexpected, the unscripted, and the unfiltered moments. 🍻&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Trying Out New Things</title>
   <link href="https://codegazerants.com/2024/01/28/trying-out-new-things/"/>
   <updated>2024-01-28T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2024/01/28/trying-out-new-things/"><![CDATA[
    &lt;p&gt;January is ending and I already started experimenting a bit to work on this year’s themes, and more specifically on the physical and mental health area. How?&lt;/p&gt;
&lt;p&gt;This week, I began taking a 15-20 minute break in the middle of my working day and spent that time on the treadmill with 3 minutes of running and 1 minute rest intervals. I usually manage to cover approximately a 1.5km distance.&lt;/p&gt;
&lt;p&gt;So far, this routine has had various positive side effects on my day.&lt;/p&gt;
&lt;h2&gt;Doing My Exercise&lt;/h2&gt;
&lt;p&gt;After injuring my knee (nothing serious but annoying), I became scared of going into a week of recovery and physiotherapy sessions again. As a result, I reduced my exercise and had to start from scratch again.&lt;/p&gt;
&lt;p&gt;Twenty minutes per day of intervals seems to be a good pace for now. It&#39;s challenging enough for me, but it doesn&#39;t create any issues.&lt;/p&gt;
&lt;p&gt;Until I start increasing this time again, it means I can do this exercise during my day as a break from work, which is one more side effect.&lt;/p&gt;
&lt;h2&gt;Taking a Break&lt;/h2&gt;
&lt;p&gt;I must admit I struggle with taking breaks during my working hours. Even though I manage to maintain a work/life balance with a lot on my plate, breaks are something I find challenging. And even when I do take a break, I can&#39;t seem to forget about the work I&#39;m leaving behind.&lt;/p&gt;
&lt;p&gt;However, this changed. I close notifications, do some stretching, blast some music in my ears, push start and the treadmill and I can forget about everything for the next few minutes.&lt;/p&gt;
&lt;h2&gt;Getting a Boost&lt;/h2&gt;
&lt;p&gt;Oh yes... the endorphins! Or maybe it&#39;s just a placebo. I don&#39;t know, but it works!&lt;/p&gt;
&lt;p&gt;Some weekdays are challenging. I might find myself not fully energized during a meeting or a specific task in the midday, and I don&#39;t like it. Until now, I haven&#39;t found something that truly worked, but over the past week, I&#39;ve been getting a lot of energy after doing the 15-minute workout.&lt;/p&gt;
&lt;h2&gt;Not Another Fitness Buff&lt;/h2&gt;
&lt;p&gt;You might be wondering, &amp;quot;Why is this guy preaching about exercise?&amp;quot;&lt;/p&gt;
&lt;p&gt;Well, I&#39;m not. I will probably be the last person on Earth to do that. But I found a way to help me feel a bit better throughout my day. If I find an alternative way that doesn&#39;t require any effort, I&#39;ll probably prefer it.&lt;/p&gt;
&lt;p&gt;So, if I had to leave you with a few things, it would be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Please take some breaks.&lt;/li&gt;
&lt;li&gt;Move a bit during these breaks.&lt;/li&gt;
&lt;li&gt;Find something to do that takes your mind off work and energizes you.&lt;/li&gt;
&lt;/ul&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Twenty Twenty-Three Review</title>
   <link href="https://codegazerants.com/2024/01/02/twenty-twenty-tree-review/"/>
   <updated>2024-01-02T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2024/01/02/twenty-twenty-tree-review/"><![CDATA[
    &lt;img src=&#34;/assets/img/2023.svg&#34; alt=&#34;2023 Review - Codegazerants.com&#34; width=&#34;100%&#34;&gt;
End of the year 2023, an opportunity to take a look at the highlights.
&lt;p&gt;It was an interesting year, sometimes a mojo rollercoaster, but productive!&lt;/p&gt;
&lt;p&gt;As always, work is a big part of my life. Apart from a three week break during the summer I can’t remember a week that wasn’t interesting and challenging at the same time at a technical or managerial level. I still haven’t found a way to stop thinking about work in the evenings!&lt;/p&gt;
&lt;p&gt;2023 started with me getting into managing a new team with all the bells and whistles that come with it. Building rapport, trying and tweaking things, until it works out for everyone. There never is an immediate outcome, but when it comes it’s the reason I’m doing this work.&lt;/p&gt;
&lt;p&gt;Some more leadership changes happened through the year in the company that affected the usual flow of working, and after the first half I started on a journey of a new big project. As a rule, I try not to undertake big blocks of work so I can never block other  team members. This was different. Foundational work, core implementation, managing multiple teams and outcomes. I had my day to day usual work, but my focus was on bringing results on an implementation level. Again regardless of the challenges and the feeling of stretching too thin at times, but when I see the results, it makes me forget the difficult parts.&lt;/p&gt;
&lt;p&gt;And of course working in an amazing talented team makes things easier!&lt;/p&gt;
&lt;p&gt;On top of that, the AI domain is more approachable than ever to everyone, changing/improving everyday and people from all industries are hyped. It’s everywhere. Exciting and strange times!&lt;/p&gt;
&lt;h2&gt;2023 Goals Review&lt;/h2&gt;
&lt;p&gt;Flexible themes I set last year as focus points to motivate myself. Overall, not bad!&lt;/p&gt;
&lt;h3&gt;Reading 👌👌👌&lt;/h3&gt;
&lt;p&gt;Oh my, oh my! It’s been an amazing journey! I spent A LOT of my free time diving into a new book. Usually one after the other. I started slowing down in October/November but overall I read 24 books! Most of it were Stephen King novels, but it was what I needed at that time to make me fully immerse into something different than TV or work! I don’t believe I’ve read so many books in a year in my adult life before.&lt;/p&gt;
&lt;p&gt;A special mention to one non fiction book I enjoyed this year and had some “book club” sessions with other engineering managers.&lt;/p&gt;
&lt;p&gt;It’s &lt;a href=&#34;https://www.engmanagement.dev/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Engineering Management for the Rest of Us&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;} by Sarah Drasner. I am a bit biassed because most of the book aligns with my values on how to approach leadership. It was a great refresh and a must read for anyone that would like to take or has already taken the management path in their career.&lt;/p&gt;
&lt;h3&gt;Writing 👎&lt;/h3&gt;
&lt;p&gt;Ah… This is where the ball was dropped. Back in October 2022 I started a schedule of posts here or on LinkedIn and worked great, but in March I lost my motivation a bit. My mojo wasn’t there and I preferred doing something completely different. I think this had something to do about being tired of listening to my inner voice again and again. Hopefully this will come back this year.&lt;/p&gt;
&lt;p&gt;Regardless, I did write seven articles, which for some of them I’m very proud of.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/2023/03/16/the-bait-the-swith-and-the-loop/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;The Bait, the Switch &amp;amp; the Loop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2023/01/21/on-leading-through-values/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;On Leading Through Values&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Extroversion 👌&lt;/h3&gt;
&lt;p&gt;No huge improvements, since priorities changed during the year, but there are continuous small step improvements that are happening daily.&lt;/p&gt;
&lt;h3&gt;Exercising 👌👌👌&lt;/h3&gt;
&lt;p&gt;This is a win! After some years I started improving my - non existing - exercise habits.
I started with an old indoor bicycle we had here at home. It wasn’t bad and I almost exercised everyday without an issue, but I needed something different.&lt;/p&gt;
&lt;p&gt;Back in August, we did invest in a treadmill, since I love jogging. Like most people,  I overdid it and hurt a bit my knee, which needed some physiotherapy, but the doctor mentioned it wasn’t my fault since I must have had some kind of an issue since my teens and the treadmill just made it resurface. All is good on that front now. I’m having a healthy pace and by the way, my favourite music to run is at 165 BPMs.&lt;/p&gt;
&lt;p&gt;I also got an activity tracker and it seems that most of the days I’m keeping up with my step goals.
Regardless of the hiccups along the way, the addition of exercise and small changes in my eating habits helped me lose some weight. That weight loss is not that important, but the fact that my metabolism is still working fine is a good sign.&lt;/p&gt;
&lt;h2&gt;2024 Themes&lt;/h2&gt;
&lt;p&gt;I hope this year is going to be focused on Health. Physical or mental.
It’s similar to this year’s theme, but I’ve been stretching myself too thin for some years  and I’m close to 40. I’m feeling fine, but if I want to keep up for the following years, I need to be taking care of myself more.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Health.&lt;/li&gt;
&lt;li&gt;Take up writing again.&lt;/li&gt;
&lt;li&gt;Keep the same pace of reading and exercising.&lt;/li&gt;
&lt;/ul&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>The Bait, the Switch &amp; the Loop</title>
   <link href="https://codegazerants.com/2023/03/16/the-bait-the-swith-and-the-loop/"/>
   <updated>2023-03-16T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2023/03/16/the-bait-the-swith-and-the-loop/"><![CDATA[
    &lt;h2&gt;The Bait&lt;/h2&gt;
&lt;p&gt;You find yourself on a call with three people on a Wednesday afternoon.&lt;/p&gt;
&lt;p&gt;One is the hiring manager, one HR representative and another person they introduced as “Page, a member of one of our teams”. They all look tired, but you notice they are trying to smile. It’s evident that this is a routine call for them. It could have been the third or fourth similar call for the day, and it looked like this one was outside their usual working hours. Or not.&lt;/p&gt;
&lt;p&gt;Sheila, the hiring manager, describes how the teams work and that there is always an opportunity to grow and experiment. She then starts talking a lot about herself, but you choose to ignore that for now because the offer in the initial stage was impressive. A 35% raise to what you are getting in your current gig. This will be an excellent boost to being closer to your wish list.&lt;/p&gt;
&lt;p&gt;After the diversion, she talks about the teams again and their achievements. A relief. Your mind strategically blocked the previous discussion.&lt;/p&gt;
&lt;p&gt;The HR representative lists some of the perks, the growth plan they have in place that is carefully tailored to each individual, and how every day is a chance to learn something new. He seems proud of the work and process they have in place. He gave some well-thought answers to your questions.&lt;/p&gt;
&lt;p&gt;Page only speaks when you mention day-to-day work. She seems happy with the result overall, which is a good sign. She asks about previous experience and some easy technical questions. This isn’t supposed to be a technical interview, but you are happy to answer.&lt;/p&gt;
&lt;p&gt;That last session comes to an end after one and a half hours. Something feels slightly off, but you’ve done your due diligence. Glassdoor reviews seem high and legit, and overall the company has a good reputation. You managed to talk to someone that was working three years ago in the company, and he didn’t have anything bad to say.&lt;/p&gt;
&lt;p&gt;Based on this, it’s “go” time. The money is good, and you need a change. You have been looking for some time now, so you do it. You are excited and ready to join.&lt;/p&gt;
&lt;h2&gt;The Switch&lt;/h2&gt;
&lt;p&gt;Two months into the gig, you haven’t done a 1:1 yet and haven’t seen the people from the interview again. You heard that Page, the “member of one of our teams”, resigned. These things happen. The hiring manager is usually lost somewhere in a meeting, &lt;a href=&#34;/2022/09/05/the-five-minutes-talk/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;being busy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Your peers are amazing at their job, but they are disoriented most of the time, like no one knows why they do the things they do, and the team’s last project didn’t make it to production because of “reasons”. Six months of design and implementation are out of the window. You have no idea about the next steps. Someone will tell you, but not knowing what is coming is not your strong suit.&lt;/p&gt;
&lt;p&gt;That week, Thursday would be a “come to the office” day - remote wasn’t really remote - and mid-day, an angry person you haven’t seen before walked into the open office space and screamed, “Who pushed the ‘a4e9c’ commit? WHO DID THAT?!?”.&lt;/p&gt;
&lt;p&gt;You had no idea who that person was, but who behaves like that in a professional environment, and how doesn’t he know he can check the contributor for the commit in the following line? Later you learn that this was the VP of Engineering…&lt;/p&gt;
&lt;p&gt;Perks magically disappear, and bureaucracy and hidden agendas are a thing.
Six months passed - during which similar not-so-good things happened - and you are on an interview call again. The team seems great, and there is no weird gut feeling this time. As a precautionary measure this time, you found two people on LinkedIn still working there to ask about the company. The money is not that good, but the whole thing seems more human-oriented.&lt;/p&gt;
&lt;p&gt;Of course, you take the job.&lt;/p&gt;
&lt;h2&gt;The Loop&lt;/h2&gt;
&lt;p&gt;Bait and Switch it’s a known sales technique to get customers to buy in with low prices and then raise prices as you go towards the signing time or after you are bound with a contract. It’s used as a bad practice in UX, and It’s also used in interviews when an interviewee is not the person applying for work (who does that?!?).&lt;/p&gt;
&lt;p&gt;This is different. This is the case of a company overselling to the candidate. Not small things about setting priorities or gym perks. I’m talking about significant differences in culture. The things that might differentiate a healthy from a toxic environment.&lt;/p&gt;
&lt;p&gt;I used to wonder what is the purpose of hiding the truth in an interview?&lt;/p&gt;
&lt;p&gt;Every new hire is an investment. If you hire someone and they leave after a few months, you have spent time and energy onboarding them, making them part of a team and training them. Don’t they get that if a candidate sees BS in the first months in the company, they will just bail out?&lt;/p&gt;
&lt;p&gt;Then it hit me. They do know it.&lt;/p&gt;
&lt;h3&gt;Take 1&lt;/h3&gt;
&lt;p&gt;Once you are in, you are probably staying. Money and perks are the incentives. They depend on this being enough to retain people even if they are not completely happy. Even if a percentage of people leave, other people will stay.&lt;/p&gt;
&lt;h3&gt;Take 2&lt;/h3&gt;
&lt;p&gt;In big organizations in a growth state, hiring becomes a number in someone’s OKRs, “Hire 70 people”. This person might be so up the chain that it is probably too difficult to understand the actual situation in the organization. They do believe they have an amazing culture.&lt;/p&gt;
&lt;h3&gt;Take 3&lt;/h3&gt;
&lt;p&gt;Big organizations, big stakes. Current goals in someone’s OKRs are more important than anything else. Again, “Hire 70 people”. Every month they don’t hit this number, it translates to lost opportunities and lost revenue (crazy, right?), so they do anything to cover this number no matter what. If people leave, this can be a problem for another quarter, another person.&lt;/p&gt;
&lt;p&gt;And this is the Loop. An endless Loop of new goals to cover the numbers of the previous goal. Every month, every quarter.&lt;/p&gt;
&lt;div style=&#34;text-align: center; padding-bottom: 10px;&#34;&gt;***&lt;/div&gt;
&lt;p&gt;This might come up as criticizing, but it’s really not. I get it. I don’t like it, but I get it. And, of course, this doesn’t apply to all organizations. There are teams out there, even with hundreds of people, that maintain a fantastic culture in which people can thrive.&lt;/p&gt;
&lt;p&gt;What is needed is extra caution. An interview is a two-way street. Ask questions so you can better understand what is going on. Reach out to people currently working there and make sure what you heard in the interview was legit. If you join, keep the organization accountable for their promises.&lt;/p&gt;
&lt;p&gt;Be vigilant and keep an eye out for the Bait and Switch!&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Check-in II</title>
   <link href="https://codegazerants.com/2023/03/03/check-in-II/"/>
   <updated>2023-03-03T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2023/03/03/check-in-II/"><![CDATA[
    &lt;p&gt;February has been and gone in the blink of an eye!&lt;/p&gt;
&lt;p&gt;I hate when time flies like that, and I can’t remember much. This is when I’m in the “busy” mode, losing a lot of “me” time.&lt;/p&gt;
&lt;p&gt;On the good side of things, my other half got me a present that I’ve been thinking of buying myself for some time now. I’m usually hesitant to buy “one more gadget”, and I wasn’t sure if I would like the feeling of using it. So yeah, I got a new Kindle Paperwhite! Is it essential? No. Do I consider it overpriced? Yes, but they have done a fantastic job on the “reading a book” feel.&lt;/p&gt;
&lt;p&gt;I replaced a laptop monitor without breaking things, which I consider a win. I’ve been using computers for the biggest part of my life, but I’m clumsy when it comes to fixing an electronic part that needs delicacy and patience. YouTube FTW, of course!&lt;/p&gt;
&lt;p&gt;On the other hand, we did break the heatsink of an ancient computer we use to watch movies. Yes, it was a month of fixing - well, messing with probably is the best way to put it - computers.&lt;/p&gt;
&lt;p&gt;The old beast was having some issues lately and rebooted at will due to high temperatures, so the next logical thing was to open it, clean it, remove the CPU heatsink, replace the thermal paste and assemble it again. Removing it was pretty easy, but when we tried to put everything back, something wasn’t right. And this was when we figured out we’d broken the awful heatsink mount pins that lock on the motherboard.&lt;/p&gt;
&lt;p&gt;There is a message I would give to the person who created this patent… “You deserve a special place in hell!” Why would you make this kind of mechanism that is difficult to understand - if you haven’t broken one already - breaks easily, and everyone hates it?&lt;/p&gt;
&lt;p&gt;If you ever do this similar work and see these &lt;a href=&#34;https://www.intel.com/content/www/us/en/support/articles/000005852/processors.html&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;kind of pins&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;}, please have a spare heatsink in case something goes wrong.&lt;/p&gt;
&lt;h2&gt;Writing&lt;/h2&gt;
&lt;p&gt;Didn’t publish much this month. I just wasn’t in the mood for some reason. I felt “bad”, but then I thought about “The importance of being idle” and decided to not stress myself out.&lt;/p&gt;
&lt;p&gt;I wrote some things, of course, but only one was published:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/2023/02/16/six-years-of-using-team-oclock/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Six Years of Using Team O’Clock&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Reading&lt;/h2&gt;
&lt;h3&gt;Stephen King Corner&lt;/h3&gt;
&lt;h4&gt;The Institute&lt;/h4&gt;
&lt;p&gt;Kids with Telekinetic or Telepathic powers are abducted and moved to a facility called the Institute. Excellent read. I enjoyed it. Mid-level King.&lt;/p&gt;
&lt;h4&gt;The Bazaar of Bad Dreams&lt;/h4&gt;
&lt;p&gt;A short story collection published in 2015. Great read. Grim, but great. Who doesn’t like a car that eats people?!?&lt;/p&gt;
&lt;h4&gt;Roadwork (as Richard Bachman)&lt;/h4&gt;
&lt;p&gt;A man spiralling into madness because his house (and his workplace) will be demolished to create an extension to a highway.
I suggest this only if you have read all his other 60+ novels. Not his best work. My least favourite so far. I couldn’t relate to the main character or his motives, and the writing just wasn’t as good as usual. I should do a ranking of his novels at some point. Everybody else does it.&lt;/p&gt;
&lt;h3&gt;Prague Fatale - Phillip Kerr&lt;/h3&gt;
&lt;p&gt;I was sceptical about this, but the person at the bookstore told me, “Any of these stories are good. I’ve enjoyed them too. Just pick one!”.&lt;/p&gt;
&lt;p&gt;This is part of a fourteen books series that focuses on a Berlin cop, Bernie Gunther.&lt;/p&gt;
&lt;p&gt;This novel takes place in October 1941, and Bernie Gunther gets involved in a story with Reinhard Heydrich, Reichsprotector of Bohemia. Murder, spies, women and decadence.&lt;/p&gt;
&lt;p&gt;If you enjoy reading mystery books with some historical figures, this one might be for you.&lt;/p&gt;
&lt;h2&gt;Watching&lt;/h2&gt;
&lt;p&gt;There was more watching this month. These are some things that stood out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Last Of Us&lt;/strong&gt; - Great storytelling. There should be some more episodes or a faster pace.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shrinking&lt;/strong&gt; - I always enjoy this kind of comedy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prospect&lt;/strong&gt; - While watching this movie, I was thinking about it in a written format. I would love to read it.&lt;/li&gt;
&lt;/ul&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Six Years of Using Team O’Clock</title>
   <link href="https://codegazerants.com/2023/02/16/six-years-of-using-team-oclock/"/>
   <updated>2023-02-16T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2023/02/16/six-years-of-using-team-oclock/"><![CDATA[
    &lt;p&gt;When I joined Transifex, the organization had - and still does - an Agile mentality in how they built the product and had been using Scrum for two or three years before my time.&lt;/p&gt;
&lt;h2&gt;Day 1&lt;/h2&gt;
&lt;p&gt;During the first team’s standup, I noticed a product the team used called &lt;a href=&#34;https://www.teamoclock.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Team O’clock&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;} to help them with the ceremonies facilitation. &lt;em&gt;It would be later on that I discovered that I was working with the founders on a daily basis.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We used it for standups at first (and maybe planpoker, but I might be wrong on the timeline), and it felt natural. A two-minute purple circle timer around each person’s avatar was responsible for keeping us within the two minutes limit to discuss what we did the previous day, what we would do that day and if we had any impediments. After someone was done, it would go to the next person based on a random order.&lt;/p&gt;
&lt;p&gt;In my eyes, it was a simple and fantastic way to avoid awkward looks about who should go next or people speaking for too long and missing the purpose and the essence of a standup which is to coordinate and align.&lt;/p&gt;
&lt;h2&gt;Two Weeks In&lt;/h2&gt;
&lt;p&gt;At that point, we would still do retrospectives in a more traditional way in which the facilitator would have to gather notes - or note down everything if it was an open discussion - and keep and track action items. I’m not sure if you have done this, but after a while, it becomes cumbersome, especially if it is a Friday afternoon and you’ve been trying to finish up any sprint work leftovers. Retrospective is the most important ceremony of a team, but it shouldn’t be challenging to facilitate. All the participants should be focused on the value of the meeting and nothing else.&lt;/p&gt;
&lt;p&gt;With great surprise, on a Friday that was no different from any other Friday, our Scrum Master sent us a link to join, and we saw a new feature called Retrospectives.&lt;/p&gt;
&lt;p&gt;It had everything needed. You could choose from a number of predefined activities and had a notes-gathering step, a notes-grooming step, a voting step and a last discussion step. Everyone would write their own notes. The note-grooming could be a team effort, and of course, no bias because you wouldn’t see what other people voted for until the discussion step.&lt;/p&gt;
&lt;p&gt;It was pure magic. All the annoying problems… gone, and everyone could enjoy the retrospective!&lt;/p&gt;
&lt;h2&gt;Evolution&lt;/h2&gt;
&lt;p&gt;A few years passed. Transifex changed, but so did Team O’clock. The product became from a simple standup tool to a full solution for agile ceremonies and team alignment. Our team even moved away from Scrum to our own &lt;a href=&#34;https://agilesquads.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;agile framework&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;}, and we were still covered by what the product offers. We missed nothing!&lt;/p&gt;
&lt;p&gt;The purple circle timer became a straight line, and the product was redesigned at some point. Now asynchronous standups are possible. You have a time difference with your teammates? Solved.&lt;/p&gt;
&lt;p&gt;We can create custom activities in retrospectives and have sentiment analysis and other useful metrics to understand a team’s state.&lt;/p&gt;
&lt;p&gt;Hell, I’ve even managed to use the Retrospectives feature more than once for a twenty-plus group of people, with little work and a successful result!&lt;/p&gt;
&lt;h2&gt;Feature Requests&lt;/h2&gt;
&lt;p&gt;There are only two things I’m missing from TOC.&lt;/p&gt;
&lt;p&gt;The first one is some music during the gathering notes step of a retrospective. I’ve made a feature request about this, but it falls into the “Won’t fix” category (I wonder why :P).&lt;/p&gt;
&lt;p&gt;The second one is a recurring reminder in Slack about action items, which I can build by myself since there is a &lt;a href=&#34;https://www.teamoclock.com/api&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;public API&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;} I can use to create a simple integration to do this!&lt;/p&gt;
&lt;div style=&#34;text-align: center; padding-bottom: 10px;&#34;&gt;***&lt;/div&gt;
&lt;p&gt;Yes, I’m very happy with the product and always excited about any new addition the team makes.&lt;/p&gt;
&lt;p&gt;Having said that, it’s worth noting that I try not to get too attached to any service.&lt;/p&gt;
&lt;p&gt;I have preferences, of course, but I should be able to work under any conditions. But, there are some cases of products that do solve a real problem, the product serves the user, not the opposite, and on top of that, you have a great user experience.&lt;/p&gt;
&lt;p&gt;Team O’clock is one of those cases. Just trust me, and go &lt;a href=&#34;https://www.teamoclock.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;give it a try&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;}!&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Check-In</title>
   <link href="https://codegazerants.com/2023/02/04/check-in/"/>
   <updated>2023-02-04T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2023/02/04/check-in/"><![CDATA[
    &lt;p&gt;Hey! A check-in for January. What went well. What didn’t go well, and what I’ve been doing.&lt;/p&gt;
&lt;h2&gt;Work&lt;/h2&gt;
&lt;p&gt;New year, new challenges!&lt;/p&gt;
&lt;p&gt;The start of a quarter is usually busier after a holiday break. A lot of people with time off - including me - are coming back and trying to kickstart things, getting into the zone again and returning to the usual flow. If you add the fact that it is the beginning of the year, yes too many things to tackle! A to-do list with items to be done always does the trick for me.&lt;/p&gt;
&lt;p&gt;Overall, I can’t complain. Many things done, with good results! It was a good month.&lt;/p&gt;
&lt;h2&gt;Reading&lt;/h2&gt;
&lt;p&gt;Five books already. I know I won’t be able to keep up this pace, but I enjoyed every moment! I’ve also picked up Turn the Ship around (again) as an audiobook. Still in progress.&lt;/p&gt;
&lt;h3&gt;The Last House on Needless Street - Catriona Ward&lt;/h3&gt;
&lt;p&gt;“This is the story of a serial killer. A stolen child. Revenge. Death. And an ordinary house at the end of an ordinary street.”. This is the only thing I will say (copied/pasted, really) regarding the plot so as not to spoil anything. I read it in one sitting.&lt;/p&gt;
&lt;h3&gt;The Restaurant at the End of the Universe - Douglas Adams&lt;/h3&gt;
&lt;p&gt;I loved the HGTTG. I can’t remember the last time I laughed so much with a book. This one was &amp;quot;more difficult&amp;quot;. Well not difficult, I still liked it, but for a 300 pages book, it took me a while to finish it. The constant action and scenery change probably had something to do with it. Not sure. It’s a good one either way!&lt;/p&gt;
&lt;p&gt;I hope they paid good money to the people translating these series into other languages. This must have been a difficult job.&lt;/p&gt;
&lt;h3&gt;Stephen King Corner&lt;/h3&gt;
&lt;h4&gt;Lisey’s Story&lt;/h4&gt;
&lt;p&gt;Lisey is Scott Landon’s widow. Scott was a successful writer. We see her life after his death, their life together and Scott’s life.&lt;/p&gt;
&lt;p&gt;Slow start. Amazing storytelling. It’s impressive to see King in his 70s and, after all these books, still writing and writing good stories.&lt;/p&gt;
&lt;h4&gt;Misery&lt;/h4&gt;
&lt;p&gt;This is a classic. A writer (again) is kept captive by an unstable fan of his work.&lt;/p&gt;
&lt;p&gt;I’ve yet to see the movie. This is a good one.&lt;/p&gt;
&lt;h4&gt;It&lt;/h4&gt;
&lt;p&gt;Mysterious disappearances, murders, and pure evil in the form of a clown. What else do you need?&lt;/p&gt;
&lt;p&gt;I love Stephen King’s characters. They are flawed and somehow real, even when they are a bit over the top.&lt;/p&gt;
&lt;p&gt;The greek version is two books with a total of 1700+ pages. Is it a beast to read? Yes. Are the surroundings sometimes too descriptive for my taste? Yes, but it’s fantastic.&lt;/p&gt;
&lt;p&gt;A warning about this book though. There are some awkward scenes that may or not make sense and can make you unconfortable. Don&#39;t ignore this book because of it, if you haven&#39;t read it already.&lt;/p&gt;
&lt;h2&gt;Writing&lt;/h2&gt;
&lt;p&gt;I got three articles out there. One coding, one about Disqus and one about leadership. A good start!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;/2023/01/01/create-new-jekyll-post-with-a-command/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Create a New Jekyll Post with a Simple Shell Command&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2023/01/10/disqus-no-more/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Disqus No More&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;/2023/01/21/on-leading-through-values/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;On Leading Through Values&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>On Leading Through Values</title>
   <link href="https://codegazerants.com/2023/01/21/on-leading-through-values/"/>
   <updated>2023-01-21T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2023/01/21/on-leading-through-values/"><![CDATA[
    &lt;p&gt;Almost one year into the Engineering Manager role, I thought of providing more clarity to the team regarding what this role is about. What I did was to give a brief presentation about it, and there it was, a slide titled “What’s on my mind” (yeah, “kudos” on the great titles).&lt;/p&gt;
&lt;img src=&#34;/assets/img/presentation2019.png&#34; alt=&#34;The 2019 presentation slide&#34; width=&#34;100%&#34; style=&#34;padding: 0px 0;border: 1px solid gray&#34;&gt;
&lt;p&gt;I’m not sure what I was trying to accomplish with it, but it was probably an effort to explain “What a manager does” at an individual, team and organizational level. In reality, it was a combination of values and responsibilities (who knows what 2019 Thanos was thinking).&lt;/p&gt;
&lt;p&gt;Looking back, I see awkwardness and difficulty articulating my thoughts (slide title FTW again). The truth is, though, that some of these values are still values I live by - well, they’ve evolved, as we all do - and writing them down was equally beneficial to me as it might have been for the team. But why?&lt;/p&gt;
&lt;h2&gt;Why Have a Set of Values&lt;/h2&gt;
&lt;p&gt;Guidance. To know when you live by those or not - just as a company does - and cross-correct if needed.
Especially in hard times, having your own values can guide you and get you out of a difficult place. Hiring, firing, promoting, saying the difficult thing, choosing the right battles, even staying in the company you work for, or leaving for another gig. You pick. Each and every day is full of decision making.&lt;/p&gt;
&lt;p&gt;And why write them down? For one, If you write them down, it becomes real. And the other reason is to recognize dumb ideas before letting them out in the world.&lt;/p&gt;
&lt;h2&gt;Why Communicate Your Values&lt;/h2&gt;
&lt;p&gt;First and foremost, you are now accountable to more than yourself. No vague grey areas. “I’m accountable to you to do this, and you have every right to call me out if I’m full of BS”. Be cautious. This is a make or break situation.&lt;/p&gt;
&lt;p&gt;As I mentioned, some of your values will change at some point, but as long as you are evolving and not bending the rules, everything will be fine!&lt;/p&gt;
&lt;p&gt;Then I know it’s a bit obvious, but nobody can read your mind, and people don’t have the time to observe. They got things to do. Communicating your values gives them a better idea of your actions, and you might inspire your team to follow this practice.&lt;/p&gt;
&lt;h2&gt;In Retrospect&lt;/h2&gt;
&lt;p&gt;This has worked great for me so far, so what would I suggest to my past self before 2019?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Have a set of written values to guide you, especially during the most challenging times. They don’t have to be life-changing. Just do it.&lt;/li&gt;
&lt;li&gt;Communicate your values early on with your team.&lt;/li&gt;
&lt;/ul&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Disqus No More</title>
   <link href="https://codegazerants.com/2023/01/10/disqus-no-more/"/>
   <updated>2023-01-10T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2023/01/10/disqus-no-more/"><![CDATA[
    &lt;p&gt;Back in 2015, I created - I&#39;m still having difficulty calling it a blog for some reason - this place. GitHub Pages with &lt;a href=&#34;https://jekyllrb.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Jekyll&lt;/a&gt; (free hosting FTW), the &lt;a href=&#34;https://github.com/poole/poole&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Poole theme&lt;/a&gt; with some CSS and layout changes, and there was a thing - my own thing, besides work - in the internet. &lt;em&gt;&amp;quot;Introverts of the world, unite&amp;quot;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Depending on the mood I&#39;m in, I make minor improvements here and there or remove parts I don&#39;t like.&lt;/p&gt;
&lt;p&gt;So a few weeks ago, it was time for Disqusm, a commenting system, to be removed from codegazerants.&lt;/p&gt;
&lt;p&gt;There were two main reasons for doing this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Disqus has had a bad reputation for a long time now. Tracking, ads, JS bloat, loading times etc.&lt;/li&gt;
&lt;li&gt;People don&#39;t comment that much so removing it won&#39;t do any harm.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Regardless of the last point, I wanted to keep the ability to comment on something. What if someone had a question?&lt;/p&gt;
&lt;h2&gt;Search for an Alternative&lt;/h2&gt;
&lt;p&gt;For a moment, I thought of creating a small custom service to handle the whole commenting system, but this has been done too many times in the past by other people. Maybe a weekend project at some point.&lt;/p&gt;
&lt;p&gt;It was time for a Google search, and the only requirements were something that worked on a static site and was lightweight.&lt;/p&gt;
&lt;p&gt;I saw &lt;a href=&#34;https://en.wikipedia.org/wiki/Webmention&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;webmention&lt;/a&gt; - maybe for another time - and then two similar approaches that looked good to me. The first one was &lt;a href=&#34;https://utteranc.es/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;utterances&lt;/a&gt;, and the second one was &lt;a href=&#34;https://github.com/giscus/giscus&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;giscus&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Both are Github apps that use its features as a commenting system. The only reason I chose one over the other was that giscus - a newer app - is using comments instead of issues.&lt;/p&gt;
&lt;h2&gt;Enter giscus&lt;/h2&gt;
&lt;p&gt;The setup was straightforward. You install the app in Github for the specific repository, include a JS script in your page, and that&#39;s it.&lt;/p&gt;
&lt;p&gt;You can also do some CSS tweaking, but I didn&#39;t bother. The default one looks nice on this site.&lt;/p&gt;
&lt;p&gt;The only &amp;quot;issue&amp;quot; with the giscus (and utterances) approach is that only people with a Github account can interact with it, but it&#39;s something I can live with.&lt;/p&gt;
&lt;h2&gt;Old Comments and Moving Forward&lt;/h2&gt;
&lt;p&gt;I apologise a bit for removing some old comments, although I&#39;m sure no one remembers.&lt;/p&gt;
&lt;p&gt;I will try to keep giscus for some time, and if no one is using it, I will remove this too.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Create a New Jekyll Post with a Simple Shell Command</title>
   <link href="https://codegazerants.com/2023/01/01/create-new-jekyll-post-with-a-command/"/>
   <updated>2023-01-01T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2023/01/01/create-new-jekyll-post-with-a-command/"><![CDATA[
    &lt;p&gt;Let&#39;s build a shell command to automate the creation of a new post in Jekyll.&lt;/p&gt;
&lt;p&gt;This will be a short one.&lt;/p&gt;
&lt;p&gt;Jekyll has its quirks, and I always wondered why they don&#39;t have a simple command to create a new post. I used to copy/paste the previous one, but you know how things are... If you can automate something boring in a few minutes, just do it.&lt;/p&gt;
&lt;h2&gt;Creating the Script&lt;/h2&gt;
&lt;p&gt;We first need to create a simple bash script to do the job for us.&lt;/p&gt;
&lt;p&gt;So, create a new file. I call mine &lt;code&gt;newjekyllpost.sh&lt;/code&gt; and add the following parts to it:&lt;/p&gt;
&lt;pre class=&#34;language-bash&#34;&gt;&lt;code class=&#34;language-bash&#34;&gt;&lt;span class=&#34;token shebang important&#34;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&#34;token assign-left variable&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token variable&#34;&gt;&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;date&lt;/span&gt; +%Y-%m-%d-new-post.md&lt;span class=&#34;token variable&#34;&gt;`&lt;/span&gt;&lt;/span&gt;

&lt;span class=&#34;token function&#34;&gt;cat&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token variable&#34;&gt;$filename&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;EOF
---
layout: post
title: A title
description: A description
categories: [&#34;tag&#34;]
social_image: add here
---
EOF&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&#39;s rubberduck this.&lt;/p&gt;
&lt;p&gt;The second line is a variable called &lt;code&gt;filename&lt;/code&gt;. This will be used for our file name with today&#39;s date and the following format:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;YYYY-MM-DD-new-post.md #
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The third line will create the file with the contents we like. I chose to add the YAML front matter with the most used content for my posts. If I don&#39;t want something, I remove it.&lt;/p&gt;
&lt;p&gt;And that&#39;s it. Our script is that simple. Let&#39;s now try to execute it.&lt;/p&gt;
&lt;h2&gt;Making the Script Executable&lt;/h2&gt;
&lt;p&gt;If you try to run it, you will get an error about permissions. There is one more step, which is to change the file&#39;s permissions.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod u+x ./newjekyllpost.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After that, running &lt;code&gt;./newjekyllpost.sh&lt;/code&gt; will create a file in the specific folder with our contents.&lt;/p&gt;
&lt;h2&gt;Adding an Alias&lt;/h2&gt;
&lt;p&gt;Let&#39;s do one more last thing to make our lives easier.&lt;/p&gt;
&lt;p&gt;Right now, we have our script in a specific folder, so we need to write the path each time, which is also boring. Adding an alias for the script will work like magic.&lt;/p&gt;
&lt;p&gt;Move the script to any path you want. I keep a &lt;code&gt;scripts&lt;/code&gt; folder inside my &lt;code&gt;Users&lt;/code&gt; folder.&lt;/p&gt;
&lt;p&gt;Open the profile your shell is using. I&#39;m using ZSH, so I have this line in my &lt;code&gt;.zshrc&lt;/code&gt; file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;alias njp=&amp;quot;~/scripts/newjekyllpost.sh&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Every time I run &lt;code&gt;njp&lt;/code&gt; in a folder, the script creates a new file. You can choose any alias you want, of course.&lt;/p&gt;
&lt;p&gt;Run &lt;code&gt;source pathoftheprofilefile&lt;/code&gt; to reload the new changes, and we are done.&lt;/p&gt;
&lt;h2&gt;Improving the Script&lt;/h2&gt;
&lt;p&gt;As I was writing this, I though there is one more thing we could do to improve the script. If there are argguments to the script use them to postfix the filename.&lt;/p&gt;
&lt;p&gt;So our first part of the script becomes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if [ $# -gt 0 ]
then
  filename=`date +%Y-%m-%d-`
  filename+=`echo &amp;quot;$@&amp;quot; | sed -e &#39;s/ /-/g&#39;`.md
else
  filename=`date +%Y-%m-%d-new-post.md`
fi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the &amp;quot;bash&amp;quot; language what that means is:&lt;/p&gt;
&lt;p&gt;If I have arguments add the date in the filename. Then join with a space all the arguments as string with &lt;code&gt;&amp;quot;$@&amp;quot;&lt;/code&gt; and then replace the spaces with &lt;code&gt;-&lt;/code&gt; which is done by the &lt;code&gt;sed&lt;/code&gt; part.&lt;/p&gt;
&lt;p&gt;If I have no arguments, business as usual.&lt;/p&gt;
&lt;p&gt;If we run &lt;code&gt;njp this is my new post&lt;/code&gt; at 2022-12-30 the file will be create will have the following name:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2022-12-30-this-is-my-new-post.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Just remember, all of this can be achieved with any language. The logic is the same. I just chose to do it in a bash script because, why not?&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Twenty Twentytwo at a Glance</title>
   <link href="https://codegazerants.com/2022/12/22/twenty-twentytwo-at-a-glance/"/>
   <updated>2022-12-22T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2022/12/22/twenty-twentytwo-at-a-glance/"><![CDATA[
    &lt;img src=&#34;/assets/img/2022.svg&#34; alt=&#34;2022 at a glance - Codegazerants.com&#34; width=&#34;100%&#34; style=&#34;padding: 40px 0&#34;&gt;
Let&#39;s try something for the first time. Writing a few words about the whole year.
&lt;p&gt;Overall, it was a busy, stressful but productive year. For some reason, I cannot remember a lot from the first half.&lt;/p&gt;
&lt;p&gt;I&#39;m going to focus on the more positive things!&lt;/p&gt;
&lt;h2&gt;On Writing &amp;amp; This Place&lt;/h2&gt;
&lt;p&gt;The second half of the year was more productive for me. I pushed myself to work on article ideas and post them on a &amp;quot;soft&amp;quot; schedule. I didn&#39;t want to do it as an obligation, but I needed something to get me out of my comfort zone.&lt;/p&gt;
&lt;p&gt;I started being more active on LinkedIn and here. This one is the tenth post for this year in codegazerants, an improvement based on 2020 and 2021 post numbers. I&#39;ll take the win!&lt;/p&gt;
&lt;p&gt;The weird thing is that I never stopped doing the work. I have a considerable number of drafts that were never published. Editing and publishing is always the most challenging part.&lt;/p&gt;
&lt;p&gt;Some things that changed and helped me be more active:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I stopped worrying about expressing my thoughts more in public.&lt;/li&gt;
&lt;li&gt;I accepted that I&#39;m probably better at writing short content of 500 - 1200 words and not worrying about &amp;quot;big revelation&amp;quot; articles. (see also &amp;quot;on Reading&amp;quot;)&lt;/li&gt;
&lt;li&gt;It doesn&#39;t matter if I write about things others have written before. It&#39;s my perspective. If someone finds this information helpful, well, that&#39;s awesome!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also did a micro-redesign of this place. I shouldn&#39;t even call it micro, but did I put some effort into it.&lt;/p&gt;
&lt;h2&gt;On Reading&lt;/h2&gt;
&lt;p&gt;This year I started reading books in a physical form again. I wanted to get my eyes off of screens and reduce binge-watching. Do something different.&lt;/p&gt;
&lt;p&gt;I tried to read things that wouldn&#39;t be work-related. I had to remember again to focus on one thing and enjoy it. I started with a &amp;quot;goal&amp;quot; of reading two books, and in six months or so, I managed to go up to ten. The themes were mainly Fantasy, Mystery, and Sci-fi. Stephen King, Philip K. Dick, J.K Rowling and Douglas Adams were the writers I enjoyed reading.&lt;/p&gt;
&lt;p&gt;Unfortunately, I didn&#39;t manage to finish reading Foucault&#39;s Pendulum once again. I stopped at page 400+ or something. Again. I probably need to accept that I&#39;ll never read the whole thing. Who knows.&lt;/p&gt;
&lt;p&gt;Now an observation on work-related reading, I had an information overload at some point. I needed a break. I was mainly consuming instead of learning.&lt;/p&gt;
&lt;p&gt;It was challenging for me to focus on a 4000 words article or 300 page book unless the writer had the charisma of storytelling. I respect and acknowledge the work and achievement of writing a book, but I&#39;ve become a fan of reading things where writers quickly get to the point.&lt;/p&gt;
&lt;h2&gt;On Miscellaneous Things&lt;/h2&gt;
&lt;p&gt;I&#39;m in year two of remote working, so it was time to create my own space in the house. An &amp;quot;office room&amp;quot; where I can focus on the working hours and when I&#39;m not working use it to play some music. No more working from the kitchen or moving equipment around the house to get some &amp;quot;privacy&amp;quot;.&lt;/p&gt;
&lt;p&gt;On the subject of music, I got a &lt;a href=&#34;https://en.wikipedia.org/wiki/Epiphone_Sheraton&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;new guitar&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;} that I absolutely love and a keyboard that I can play a tune or two. Playing on an S-type guitar for a long time created a challenge for me to make a good sound on the Sheraton, but it&#39;s also like a white canvas for me. I am still trying to tame the sound of a semi-hollow guitar.&lt;/p&gt;
&lt;h2&gt;On 2023&lt;/h2&gt;
&lt;p&gt;Based on the last two years, I&#39;m not sure I should be making big plans, so there are some things I want to continue doing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Take up challenges that help my introverted self improve.&lt;/li&gt;
&lt;li&gt;Keep reading and writing. It looks like ten was the magic number for me this year. Twenty sounds like fun.&lt;/li&gt;
&lt;li&gt;I&#39;d like to start doing some kind of exercise. I&#39;m not a person that loves exercising, but it&#39;s needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As promised, 500-1200 words! 👌&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>On The Power Of Individuals</title>
   <link href="https://codegazerants.com/2022/12/09/on-the-power-of-individuals/"/>
   <updated>2022-12-09T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2022/12/09/on-the-power-of-individuals/"><![CDATA[
    &lt;p&gt;High-performing teams are fascinating.&lt;/p&gt;
&lt;p&gt;A team with the right values and a good flow in place moves a company forward. But it&#39;s never about speed. It&#39;s all about efficiency.&lt;/p&gt;
&lt;p&gt;What happens, though, when day-to-day routine kicks in? Groups can get lost in their current goals and lose opportunities to make a difference. They lose the chance to see the impact of small initiatives in favour of day-to-day work that helps their primary goals.&lt;/p&gt;
&lt;p&gt;At times, all that is needed is for an individual to raise their voice and a call to action.&lt;/p&gt;
&lt;p&gt;&amp;quot;I believe this matters, and I need help&amp;quot;.&lt;/p&gt;
&lt;p&gt;A great team listens. A great team leans in. There is no need for roles, levels or permission. They just need a nudge from someone, and they will be there to solve a problem as a group. You are driving change with just a simple move.&lt;/p&gt;
&lt;p&gt;High-performing teams are made of outstanding individuals.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Thoughts on Feedback</title>
   <link href="https://codegazerants.com/2022/10/15/thoughts-on-feedback/"/>
   <updated>2022-10-15T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2022/10/15/thoughts-on-feedback/"><![CDATA[
    &lt;p&gt;Thoughts on feedback, the really short version.&lt;/p&gt;
&lt;p&gt;Feedback is difficult and needs a lot of practice. Why? Because emotions are involved.&lt;/p&gt;
&lt;p&gt;There are two parts to becoming better at it. The rules are simple, but it&#39;s hard to live by.&lt;/p&gt;
&lt;h2&gt;Receiving Feedback&lt;/h2&gt;
&lt;p&gt;To get feedback, you need to be and also look open to feedback. If your face changes and you start being defensive - even if you have counter arguments - when someone gets out of their way to give you some feedback, there is a chance they won&#39;t do it again. And yes, we&#39;ve all been there.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Listen to what the other person has to say, even if you disagree.&lt;/li&gt;
&lt;li&gt;Ask questions to understand more about the situation. Keep notes.&lt;/li&gt;
&lt;li&gt;Thank the person for the feedback. They&#39;ve given some thought, time and care about you.&lt;/li&gt;
&lt;li&gt;Sleep on it.&lt;/li&gt;
&lt;li&gt;Act if needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And yes, ask for direct feedback like hell! I usually mention to the people around me that even if their feedback &amp;quot;hurts&amp;quot; me, at the end of the day, if it&#39;s constructive, it will make me better. It&#39;s going to make me grow.&lt;/p&gt;
&lt;h2&gt;Giving Feedback&lt;/h2&gt;
&lt;p&gt;There is a strong possibility you have some feedback about people, but you are hesitant to share it because you are afraid of how the other person will feel and how it might make you look like not a good person.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Be empathetic, respectful and direct.&lt;/li&gt;
&lt;li&gt;Try not to judge, but describe a situation and its effect.&lt;/li&gt;
&lt;li&gt;Be precise and provide examples, don&#39;t be vague.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&#39;ll let you in on a secret. Everything about providing feedback ends when you do it. After that, It&#39;s the other person&#39;s job to filter and evaluate the input. There is no need to convince or be convinced about anything.&lt;/p&gt;
&lt;p&gt;You can&#39;t imagine how fulfilling it is to hear an honest &amp;quot;Thank you for pointing this out. I wasn&#39;t aware of that&amp;quot; after providing hard feedback.&lt;/p&gt;
&lt;p&gt;One last note. I was lucky enough to be introduced to &lt;a href=&#34;https://www.radicalcandor.com/radical-candor-not-brutal-honesty/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Radical Candor&lt;/a&gt; and &lt;a href=&#34;https://www.ccl.org/articles/leading-effectively-articles/closing-the-gap-between-intent-vs-impact-sbii/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;SBI (Situation Behaviour Impact) model&lt;/a&gt; by Dimitris Glezos a few years ago, which helped me improve the way I use feedback. So it&#39;s my turn now to urge some people to give these resources a try if they haven&#39;t already.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This was originally posted on &lt;a href=&#34;https://www.linkedin.com/posts/thanos-kolovos-95110592_feedback-radicalcandor-sbi-activity-6976419487394750464-gGNa?utm_source=share&amp;amp;utm_medium=member_desktop&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;LinkedIn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Chaos Engineering For Humans</title>
   <link href="https://codegazerants.com/2022/10/09/chaos-engineering-for-humans/"/>
   <updated>2022-10-09T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2022/10/09/chaos-engineering-for-humans/"><![CDATA[
    &lt;p&gt;If you came here about Chaos Engineering for your services, “it’s not what it looks like”.&lt;/p&gt;
&lt;h2&gt;Chaos Engineering&lt;/h2&gt;
&lt;p&gt;You might think I just said it’s not about Chaos Engineering, but I’m about to give some kind of definition of Chaos Engineering. Yes, I am.&lt;/p&gt;
&lt;p&gt;Our products have become, or maybe better say, have progressed to be, a sum of multiple services and not a monolith service that tries to do everything. Core application, auth service, user service, payments service, prospects service. Name your service here.&lt;/p&gt;
&lt;p&gt;The whole system should be resilient.&lt;/p&gt;
&lt;p&gt;Unit and end-to-end testing should be in place for each service, but these are done in a predictable way. What I mean by “predictable way” is that we provide a specific input and expect a specific output. And this is what we test.&lt;/p&gt;
&lt;p&gt;Don’t get me wrong, this is a great state. But what would be the next step?&lt;/p&gt;
&lt;p&gt;Here is where Chaos Engineering comes in. The essence is that you create a situation for your whole system, for example, latency or absence of a service. You observe what happens, and then you prioritize improvements.&lt;/p&gt;
&lt;p&gt;This helps increase confidence, have a more predictable system and protect customers from a total failure of your system if your 10th service down the road underperforms.&lt;/p&gt;
&lt;h2&gt;Getting Closer to A Point&lt;/h2&gt;
&lt;p&gt;What is a team? A group of individuals that work together have an input (a goal), a throughput (their work, processes etc.) and an output (results).&lt;/p&gt;
&lt;p&gt;A team is a system.&lt;/p&gt;
&lt;p&gt;When all parts work, we have great results. When something is wrong with a part of the system, then the whole system starts to show signs of latency.&lt;/p&gt;
&lt;p&gt;Do you see where I’m going with this?&lt;/p&gt;
&lt;h2&gt;Teams as Systems&lt;/h2&gt;
&lt;p&gt;This all began when I started thinking of what would happen if someone from my team left tomorrow or a new team was created, and we had to do an internal restructuring? What would happen if a manager had a sabbatical? What if someone was on medical leave for two weeks?&lt;/p&gt;
&lt;p&gt;Would that absence block the team? What could we do to remove some uncertainty? Can we get some ideas from Chaos Engineering and apply them to a team?&lt;/p&gt;
&lt;p&gt;The idea is to find a way to observe when limitations arise in a team and understand where we can optimize.&lt;/p&gt;
&lt;p&gt;Here are some simple metrics you can have, but of course, it varies based on each organization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can the team groom a feature?&lt;/li&gt;
&lt;li&gt;Can the team deploy a feature?&lt;/li&gt;
&lt;li&gt;If specialization is missing, can the team find a way to bypass that?&lt;/li&gt;
&lt;li&gt;Are the initial milestones on track?&lt;/li&gt;
&lt;li&gt;Is team morale high?&lt;/li&gt;
&lt;li&gt;What are the main areas the team struggled with?&lt;/li&gt;
&lt;li&gt;Can the team self-organize and communicate with the stakeholders if leadership is absent?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Organic Way&lt;/h2&gt;
&lt;p&gt;There is an easy and organic way to observe and draw some conclusions without changing anything in your team.&lt;/p&gt;
&lt;p&gt;Try to observe when someone has Paid Time Off or, for some reason, cannot contribute to the problem at hand. Is there sufficient documentation? Do you have a bus factor one? Having one person less, will reduce the capacity of a team, but is it in the danger zone?&lt;/p&gt;
&lt;p&gt;Note down the observations, share them with the team and create action items.&lt;/p&gt;
&lt;h2&gt;The More Creative Way&lt;/h2&gt;
&lt;p&gt;Create the circumstances that will create some “planned turbulence” for the team.&lt;/p&gt;
&lt;p&gt;Once a quarter, throw all the team’s names in a randomizer, and the winner gets one or two weeks of having to work on a project they choose or join another team. During that time, they should not interact with the rest of the team.&lt;/p&gt;
&lt;p&gt;There are no secrets or sketchy areas here. The team should know the goals and the metrics.&lt;/p&gt;
&lt;h2&gt;Final Notes&lt;/h2&gt;
&lt;p&gt;Please remember that this is not a way to calculate individual impact, create mayhem or stress your team. It’s one more tool to create the circumstances for a team to observe and improve. Low impact initiatives might also be a good start.&lt;/p&gt;
&lt;p&gt;Keep your team in the loop if you want to try this out. If they don’t feel comfortable, abort.&lt;/p&gt;
&lt;p&gt;I would consider this suitable for an environment with a great culture. You need safety and team maturity. This is a next-level approach. You wouldn’t try Chaos Engineering for your system if you didn’t have a good system in place first, would you?&lt;/p&gt;
&lt;p&gt;And one last thing, in case this wasn’t clear. You can apply this to any kind of team, not just Engineering teams.&lt;/p&gt;
&lt;p&gt;Happy experimenting!&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>The Five Minutes Talk</title>
   <link href="https://codegazerants.com/2022/09/05/the-five-minutes-talk/"/>
   <updated>2022-09-05T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2022/09/05/the-five-minutes-talk/"><![CDATA[
    &lt;p&gt;It&#39;s a random Tuesday morning after the team&#39;s standup, and Josh just nodded and asked if you had five minutes to talk.&lt;/p&gt;
&lt;p&gt;You know that look because you&#39;ve been there a few times before so you take your notebook and a pen. It&#39;s going to be more than five minutes. Best case scenario, half an hour. Worst case... who knows.&lt;/p&gt;
&lt;p&gt;For a few seconds, you are thinking about the new OKRs, the ad hoc report someone asked for, the next big thing and other initiatives you promised to drive or help this week. You think you have a lot on your plate, and for some reason, you are feeling a bit grumpy today because something is off at home. You are only human, after all. But everyone is busy, so you decide to shove these thoughts into a mental room and close the door for a bit.&lt;/p&gt;
&lt;p&gt;Josh seems a bit stressed out. You can notice that from his body language. He may even have imagined how this could go. How the conversation would start, progress and probably some possible outcomes. It seems like he really needs to get something out of his chest.&lt;/p&gt;
&lt;p&gt;While walking to the room, you try to think about Josh and his behaviour over the last few days. Was he a bit too quiet? Did he participate less than usual in decision-making? When was the last time he was on a vent? Did you do anything to resolve the situation? When was the last time you gave feedback to him?&lt;/p&gt;
&lt;p&gt;You sit down and stop thinking about the reasons he asked you to discuss. It&#39;s time to listen.&lt;/p&gt;
&lt;h2&gt;Triaging&lt;/h2&gt;
&lt;p&gt;You know how this starts, and you are prepared for it. Usually with an awkward &amp;quot;Look... I wanted to talk to you about...&amp;quot;.&lt;/p&gt;
&lt;p&gt;Josh could be giving his resignation notice, asking for a raise, discussing something regarding the team or sharing something personal that doesn&#39;t have to do with work.&lt;/p&gt;
&lt;p&gt;Good or bad, it doesn&#39;t really matter. The key here is to actively listen and not lose focus with other things in the back of your mind or solutions. This is Josh&#39;s time.&lt;/p&gt;
&lt;p&gt;You listen carefully. You Gather all the information you need to assess the situation and remove assumptions. You repeat. Then you act if it&#39;s necessary.&lt;/p&gt;
&lt;h2&gt;The Twist&lt;/h2&gt;
&lt;p&gt;This is not about how to act in these situations. This is about something else.&lt;/p&gt;
&lt;p&gt;The truth is that Josh knows that you are busy. But he also appreciates you getting out of your way to listen and help him regardless of your daily schedule. It probably wasn&#39;t a big deal the first time you did it, but now he knows you can make time for him, and the most important thing is that he knows he can depend on you. You will be there for him and the team no matter what.&lt;/p&gt;
&lt;p&gt;These interactions might look like distractions from focus, but trust me, they are not. This is a crucial part of the job.&lt;/p&gt;
&lt;h2&gt;Everyone Is Busy, but a Leader Should Never Look Busy&lt;/h2&gt;
&lt;p&gt;Leadership is not only about big gestures and fireworks. It&#39;s about consistency. Doing the things needed daily, so your team has the things they need to thrive. Often this means getting out of your carefully scheduled day to support them.&lt;/p&gt;
&lt;p&gt;I&#39;m not going to lie. This isn&#39;t easy. It&#39;s messy, unpredictable and you need to make sense of all the noise and, on top of it, make it look easy. People are not going to stay with you forever in the company. That&#39;s a fact. But interactions like these could sometimes determine someone&#39;s future in the company and show the kind of leader you are.&lt;/p&gt;
&lt;p&gt;The five minutes talk is a lie. In reality, it&#39;s a well-disguised opportunity for meaningful conversations and trust-building.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Use JavaScript to Navigate Through a Table And Other Elements</title>
   <link href="https://codegazerants.com/2022/08/18/use-javascript-to-navigate-through-table/"/>
   <updated>2022-08-18T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2022/08/18/use-javascript-to-navigate-through-table/"><![CDATA[
    &lt;p&gt;The browser API has given us many tools to navigate through a webpage, and if done correctly, you will have a great result without the use of any Javascript.&lt;/p&gt;
&lt;p&gt;In some case though, you might need to enhance some of the navigation experience. Usually, this is a challenge in an application environment, or more specifically, on some elements of the application. And here is when JavaScript comes in handy.&lt;/p&gt;
&lt;h2&gt;A Beautiful Table&lt;/h2&gt;
&lt;p&gt;If you are using Gmail, then you probably have seen that you can navigate between the mail list with your up and down arrow keys. Gmail uses a table, and I have no idea what they are doing under the hood, but let&#39;s see how we can accomplish this.&lt;/p&gt;
&lt;p&gt;We will go through some sections of the code, but keep in mind that we can use this code for various HTML elements.&lt;/p&gt;
&lt;h2&gt;The Basics&lt;/h2&gt;
&lt;p&gt;Let&#39;s get the basic stuff out of the way. We will create an HTML file. Let&#39;s call it &lt;code&gt;index.html&lt;/code&gt;. Yes, we will do everything in a single file, no bundlers or anything.&lt;/p&gt;
&lt;pre class=&#34;language-html&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;&lt;span class=&#34;token doctype&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&#34;token doctype-tag&#34;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&#34;token name&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;en&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;UTF-8&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;http-equiv&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;X-UA-Compatible&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;IE=edge&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;viewport&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;width=device-width, initial-scale=1.0&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Use JavaScript to Navigate Through a Table And Other Elements&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token style&#34;&gt;&lt;span class=&#34;token language-css&#34;&gt;
    &lt;span class=&#34;token selector&#34;&gt;.is-active&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token property&#34;&gt;box-shadow&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; inset 0 -1px 0 0 &lt;span class=&#34;token function&#34;&gt;rgb&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;0 0 0&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;table&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;mytable&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;tabindex&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;0&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;One&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Two&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Three&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Four&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Five&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;table&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token script&#34;&gt;&lt;/span&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, we have a simple file with a table and a CSS part with one class to visualise a selected table row.&lt;/p&gt;
&lt;p&gt;One small addition that makes the difference is the &lt;code&gt;tabindex&lt;/code&gt; attribute so we can focus on our table.&lt;/p&gt;
&lt;h2&gt;The Key Navigation Backbone&lt;/h2&gt;
&lt;p&gt;Let&#39;s design our navigation function. What could be the main parts of it.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;  &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;script&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;navigateElement&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;elementID&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; itemsTagName&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; activeClass&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; scroller&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;handleKeyboard&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;handleScroll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;script&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We have one main function here called &lt;code&gt;navigateElement&lt;/code&gt; - which I&#39;m sure you can find a better name for it - that takes some parameters. We could have everything hardcoded, but you will probably reuse this in other elements in your application.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;elementID&lt;/code&gt;: The element we are going to add our key capture event listener to and includes our list items. We need to have this in case we have more than one &lt;code&gt;navigateElement&lt;/code&gt; instance.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;itemsTagName&lt;/code&gt;: The element&#39;s tag name we will navigate through.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;activeClass&lt;/code&gt;: The active class we mentioned in our CSS part.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scroller&lt;/code&gt;: The element that is responsible for our content overflow. More on that later. Secret sauce.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The &lt;code&gt;handleKeyboard&lt;/code&gt; does what it promises. It will handle the navigation between items, and the &lt;code&gt;handleScroll&lt;/code&gt; will be responsible for always having in our viewport the selected element. This simple design is all we need for now.&lt;/p&gt;
&lt;h2&gt;The Key Navigation Code&lt;/h2&gt;
&lt;p&gt;Right now, our page doesn&#39;t do anything. Let&#39;s add what we promised.&lt;/p&gt;
&lt;pre class=&#34;language-html&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;&lt;span class=&#34;token doctype&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&#34;token doctype-tag&#34;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&#34;token name&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;en&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;UTF-8&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;http-equiv&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;X-UA-Compatible&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;IE=edge&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;viewport&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;width=device-width, initial-scale=1.0&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Use JavaScript to Navigate Through a Table And Other Elements&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;style&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token style&#34;&gt;&lt;span class=&#34;token language-css&#34;&gt;
    &lt;span class=&#34;token selector&#34;&gt;.is-active&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token property&#34;&gt;box-shadow&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; inset 0 -1px 0 0 &lt;span class=&#34;token function&#34;&gt;rgb&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;0 0 0&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;style&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;table&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;mytable&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;tabindex&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;0&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;One&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Two&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Three&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Four&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Five&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;td&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
     &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;tr&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
   &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;table&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token script&#34;&gt;&lt;span class=&#34;token language-javascript&#34;&gt;
    &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;navigateElement&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;elementID&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; itemsTagName&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; activeClass&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; scroller&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; mainDOMElement &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;elementID&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; scrollElement &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;scroller&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;||&lt;/span&gt; window&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; items &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; mainDOMElement&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;itemsTagName&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; itemsLength &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; items&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; selection &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

      &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;handleKeyboard&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;e&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; which&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;e&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; e&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;preventDefault&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;e &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;which&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        items&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; item&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;classList&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;remove&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;activeClass&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; selectedIndex &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; which &lt;span class=&#34;token operator&#34;&gt;||&lt;/span&gt; e&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;which&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;selectedIndex&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;38&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;selection &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
              selection &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; itemsLength &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
              selection&lt;span class=&#34;token operator&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
            &lt;span class=&#34;token function&#34;&gt;handleScroll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;40&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;selection &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; itemsLength &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
              selection &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
              selection&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
            &lt;span class=&#34;token function&#34;&gt;handleScroll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
        items&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;selection&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;classList&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;activeClass&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;handleScroll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; el &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; mainDOMElement&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementsByClassName&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;activeClass&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;el&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
          el&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;scrollIntoView&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;token literal-property property&#34;&gt;block&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;center&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            &lt;span class=&#34;token literal-property property&#34;&gt;behavior&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;smooth&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
          &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
      mainDOMElement&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;keydown&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; handleKeyboard&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      mainDOMElement&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;focus&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;selection &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;handleKeyboard&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;40&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

    &lt;span class=&#34;token function&#34;&gt;navigateElement&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;mytable&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;tr&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;is-active&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you copy/paste this code in an HTML file, should work out of the box.&lt;/p&gt;
&lt;p&gt;Focus on the element and navigate through your up and down arrow keys.&lt;/p&gt;
&lt;p&gt;But let&#39;s rubberduck the script in sections.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;navigateElement&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;elementID&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; itemsTagName&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; activeClass&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; scroller&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; mainDOMElement &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;elementID&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; scrollElement &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;scroller&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;||&lt;/span&gt; window&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; items &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; mainDOMElement&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;itemsTagName&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; itemsLength &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; items&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; selection &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token operator&#34;&gt;...&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Simple things, we initiate some variables based on our parameters and set a &lt;code&gt;selection&lt;/code&gt; to &lt;code&gt;-1&lt;/code&gt;, which means that nothing is selected. If &lt;code&gt;scroller&lt;/code&gt; is not defined, we get the window as our element.&lt;/p&gt;
&lt;h3&gt;The navigation part&lt;/h3&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token operator&#34;&gt;...&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;handleKeyboard&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;e&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; which&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;e&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; e&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;preventDefault&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;e &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;which&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  items&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; item&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;classList&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;remove&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;activeClass&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; selectedIndex &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; which &lt;span class=&#34;token operator&#34;&gt;||&lt;/span&gt; e&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;which&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;selectedIndex&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;38&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;selection &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        selection &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; itemsLength &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        selection&lt;span class=&#34;token operator&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
      &lt;span class=&#34;token function&#34;&gt;handleScroll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;40&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;selection &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; itemsLength &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        selection &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        selection&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
      &lt;span class=&#34;token function&#34;&gt;handleScroll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  items&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;selection&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;classList&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;add&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;activeClass&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token operator&#34;&gt;...&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For each event we capture, we prevent the default behaviour. This is used to avoid browser page or element scrolling, resulting in a weird user experience. We are going to handle it ourselves in &lt;code&gt;handleScroll&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Our selected item is based on the &lt;code&gt;event.which&lt;/code&gt; or just a programmatically given &lt;code&gt;which&lt;/code&gt; we are utilising the first time someone is focusing the element. If both of these are not set, we just &lt;code&gt;return&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We remove the active class from all the items, then we have some logic checking if we are going up or down, and we decide to increase or decrease the selected. We also cover the first/last item case, and we go to the appropriate position.&lt;/p&gt;
&lt;p&gt;After we have the selected item, we apply the active class to it.&lt;/p&gt;
&lt;h3&gt;The Scrolling Part&lt;/h3&gt;
&lt;p&gt;Now let&#39;s explain a bit the scrolling part. This is one thing I see people forgetting when creating custom navigation in HTML elements.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;handleScroll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; el &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; mainDOMElement&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementsByClassName&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;activeClass&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;el&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    el&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;scrollIntoView&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token literal-property property&#34;&gt;block&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;center&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      &lt;span class=&#34;token literal-property property&#34;&gt;behavior&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;smooth&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each time we use our keys to navigate, two things can happen:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The browser will catch the key event and scroll any element that could be considered valid, like the screen scroll, for example, and not our element. This is the reason why we use &lt;code&gt;preventDefault&lt;/code&gt; in our previous code.&lt;/li&gt;
&lt;li&gt;Since the event is not bubbling up, there is no scrolling happening, and if the content exceeds the viewport, the user won&#39;t be able to see the selected item at some point.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is why we use the fantastic &lt;code&gt;scrollIntoView&lt;/code&gt;. Before this, we would try to calculate the scrolling position of the wrapper, the element height, offset, and things that sound boring. &lt;code&gt;scrollIntoView&lt;/code&gt; will solve this, and this is why we are calling it with each key press.&lt;/p&gt;
&lt;h3&gt;Adding the Event Listeners&lt;/h3&gt;
&lt;p&gt;One more thing left. To add the listeners for the key event and choose the first item when the item is focused if no selection is set.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;mainDOMElement&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;keydown&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; handleKeyboard&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
mainDOMElement&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;focus&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;selection &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;handleKeyboard&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;40&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We are all set.&lt;/p&gt;
&lt;h2&gt;Takeaways&lt;/h2&gt;
&lt;p&gt;These small snippers are cool the first time you bump into them. After that, it gets a bit boring. You will want to make a helper for it. With some more work, it could include logic for the state if you want to combine it with a frontend framework like React, Vue or anything like that. But this is the basic logic.&lt;/p&gt;
&lt;p&gt;If I wasn&#39;t lazy, I could also add some checks and validations with some beautiful errors for the developer, but I&#39;ll leave this up to you.&lt;/p&gt;
&lt;p&gt;Once again, please don&#39;t forget to use &lt;code&gt;tab&lt;/code&gt; to focus on the table first.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Mike Seavers - From Manager to Director: Guide to Managing Managers</title>
   <link href="https://codegazerants.com/2022/08/15/mike-seavers-from-manager-to-director/"/>
   <updated>2022-08-15T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2022/08/15/mike-seavers-from-manager-to-director/"><![CDATA[
    &lt;p&gt;This week I watched a Mike Seavers (Epic Games as VP of Online Development) interview dated February 2022 on the Coding Sans podcast channel.&lt;/p&gt;
&lt;p&gt;His honesty and anecdotes during the entire episode are inspiring. If you are interested in making a transition from an Engineering Manager to a Director role, I would consider this a must &lt;a href=&#34;https://www.youtube.com/watch?v=r6x0lTzfBMI&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;watch&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;} or &lt;a href=&#34;https://codingsans.com/blog/managing-managers&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;read&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;}.&lt;/p&gt;
&lt;p&gt;The following excerpts of the podcast made me want to watch the whole episode.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On his initial motivations to get the director&#39;s role&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My motivations weren’t right. My focus wasn’t to enable others or to become the best leader I could be. I wanted the bigger title, I wanted to feel important, and I was chasing my ego. Unfortunately, I think this is more common than people like to admit.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;On his first mistake as a director&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I was proud of what we managed to accomplish, but when it came time for performance reviews, I received the worst review of my career. My peers and everyone around me outside my team said in their feedback that they had no relationship with me. They didn’t know what I was doing, they just saw me making changes in engineering without involving the leaders of the project management team, the release management team, or the QA team.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;On turning the ship around&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I looked for patterns and themes in all feedback I received, and I poured myself into reading books, and taking classes to improve my leadership skills. I didn’t turn it around overnight, but I tried out new tools and learned new skills to become an effective director. &lt;br&gt;&lt;br&gt;At the time, I didn’t have the skills necessary for managing managers. This was a failed transition for me. It took me about three years to figure out what a successful director looks like.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And this was just the beginning of the episode.&lt;/p&gt;
&lt;p&gt;Mike shares more insights about other themes like necessary skills for this role, common mistakes, support to new directors and other interesting topics.&lt;/p&gt;
&lt;p&gt;Overall, great interview and leadership content podcast. I&#39;m not sure why there are not more subscribers to this channel.&lt;/p&gt;
&lt;p&gt;If you are interested in this kind of content, I&#39;d suggest checking out the other episodes too.&lt;/p&gt;
&lt;div class=&#34;video-fluid-wrapper&#34;&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/r6x0lTzfBMI&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Jekyll: Goodbye ‘site.GH_ENV’</title>
   <link href="https://codegazerants.com/2022/08/07/jekyll-config-environment/"/>
   <updated>2022-08-07T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2022/08/07/jekyll-config-environment/"><![CDATA[
    &lt;p&gt;This code has been a great friend for some time now. Based on git history, I added this six years ago and didn’t touch it again.&lt;/p&gt;
&lt;pre class=&#34;language-ruby&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;
&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; site&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token constant&#34;&gt;GH_ENV&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; ‘gh_pages’ &lt;span class=&#34;token string-literal&#34;&gt;&lt;span class=&#34;token string&#34;&gt;%}
    # Analytics code
{% endif %}&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What this does, or better say what it should do, is to check if we are in a production environment - aka Github Pages - and print Google analytics code. Of course, I have no idea where I found this, but it stopped working two months ago.&lt;/p&gt;
&lt;p&gt;A few days ago, I saw a warning in the Google Analytics console, a place I don’t hang out much. The message was &lt;code&gt;Property codegazerants.com is not receiving hits&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I disregarded it at first, but then I thought it was worth checking out my code.&lt;/p&gt;
&lt;p&gt;After doing some “view source” on production, I saw that there was no GA script. 🤷
My beautiful condition just stopped working.&lt;/p&gt;
&lt;p&gt;I searched about the &lt;code&gt;GH_ENV&lt;/code&gt; key and found two or three Github issues from 2014 and 2018, but that was it. Undocumented configuration. That’s the spirit!&lt;/p&gt;
&lt;p&gt;Of course, as a responsible engineer, I then went through the proper channels (it’s called documentation) and found that the same thing could be achieved with&lt;/p&gt;
&lt;pre class=&#34;language-ruby&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;
&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; jekyll&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;environment &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token string-literal&#34;&gt;&lt;span class=&#34;token string&#34;&gt;&#39;production&#39;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token string-literal&#34;&gt;&lt;span class=&#34;token string&#34;&gt;%}
    # Analytics code
{% endif %}&lt;/span&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;What are the key takeaways here?&lt;/h2&gt;
&lt;p&gt;Using undocumented, internal parts of libraries, is a bad practice.&lt;/p&gt;
&lt;p&gt;Especially in a work environment, that can result to money loss because someone changed their library.&lt;/p&gt;
&lt;p&gt;It’s not worth it, trying to understand what went wrong six months from now.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;See you again in 2028, dear configuration variable!&lt;/strong&gt;&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Articulating Company Values &amp; Living Them Authentically by Jeff Lawson</title>
   <link href="https://codegazerants.com/2022/07/23/company-values/"/>
   <updated>2022-07-23T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2022/07/23/company-values/"><![CDATA[
    &lt;p&gt;I really enjoyed watching Jeff Lawson&#39;s - CEO of Twilio - presentation about a company&#39;s values.&lt;/p&gt;
&lt;p&gt;Whether you are doing your first professional steps in a start-up or you are a founder, you should check this one out. There are a lot of insights on how to create, revisit your company&#39;s values or even evaluate the values of the company you are a member of.&lt;/p&gt;
&lt;div class=&#34;video-fluid-wrapper&#34;&gt;
&lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/0CKI8Jah-Po&#34; title=&#34;YouTube video player&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>How to TitleCase Jekyll Titles With Node</title>
   <link href="https://codegazerants.com/2020/06/11/how-to-titlecase-jekyll-titles-with-node/"/>
   <updated>2020-06-11T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2020/06/11/how-to-titlecase-jekyll-titles-with-node/"><![CDATA[
    &lt;p&gt;Back in December, I decided to refresh this place and start writing again. What I noticed then was that my post titles are a bit inconsistent. Some words are uppercase, some lowercase, some don&#39;t even bother, but you get the point.&lt;/p&gt;
&lt;p&gt;I wanted to change these titles then, but let&#39;s be honest, sometimes I&#39;m a bit lazy. So while I was sitting in my couch yesterday I thought of doing something about it.&lt;/p&gt;
&lt;p&gt;I had two choices, doing it manually wasn&#39;t one of them. Install a dependency and get it done in two minutes or try to build something. I chose the latter because I didn&#39;t want to install any dependency. And that was the only rule, no dependencies.&lt;/p&gt;
&lt;p&gt;It was a bit easy since I told my self that a) There was no shame in this, which means no tests no fear of judgement b) No need to freak out about details, just make it work and have some fun.&lt;/p&gt;
&lt;h2&gt;What Was Built&lt;/h2&gt;
&lt;p&gt;This is a simple node script that runs in the Jekyll blog root and will change the titles in the &lt;code&gt;_posts&lt;/code&gt; folder. No more no less.&lt;/p&gt;
&lt;p&gt;I started thinking of how I will tackle this and there were three parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read the contents of the &lt;code&gt;_posts&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Find and change the title based on some criteria.&lt;/li&gt;
&lt;li&gt;Write the new content to the file.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Loop Through the &lt;code&gt;_posts&lt;/code&gt; Folder&lt;/h3&gt;
&lt;p&gt;Simple stuff, we use Node&#39;s core libraries to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read the contents of a directory.&lt;/li&gt;
&lt;li&gt;For each item of this directory, we read the contents of this item.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You could log your &lt;code&gt;data&lt;/code&gt; in case you need to see the contents of a file. We just used some basic file-based operations.&lt;/p&gt;
&lt;pre class=&#34;language-js&#34;&gt;&lt;code class=&#34;language-js&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;path&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; fs &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;fs&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; directoryPath &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;__dirname&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;_posts&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token comment&#34;&gt;// Loop through the folder&#39;s files&lt;/span&gt;
fs&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;readdir&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;directoryPath&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;err&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; files&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;err&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;Unable to scan directory: &#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; err&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;token comment&#34;&gt;// Loop through all files&lt;/span&gt;
  files&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; file &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;directoryPath&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;filename&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    fs&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;readFile&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;utf-8&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;err&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; data&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;go wild!&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Find and Change the Title Based on Some Criteria&lt;/h2&gt;
&lt;p&gt;The fun part! All the code we are going to use is going to inside the &lt;code&gt;readFile&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;We have three things we need to tackle:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Get the FrontMatter part.&lt;/li&gt;
&lt;li&gt;Extract the title.&lt;/li&gt;
&lt;li&gt;Split the title by spaces and check each word if it needs to be changed, also based on a list of small words that shouldn&#39;t be changed. We are going to do this with simple regular expressions and not a library. Remember, we are just hacking our way to result.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&#34;language-js&#34;&gt;&lt;code class=&#34;language-js&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;path&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; fs &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;fs&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; directoryPath &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;__dirname&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;_posts&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token comment&#34;&gt;// Loop through the folder&#39;s files&lt;/span&gt;
fs&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;readdir&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;directoryPath&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;err&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; files&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;err&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;Unable to scan directory: &#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; err&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;token comment&#34;&gt;// Loop through all files&lt;/span&gt;
  files&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; file &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;directoryPath&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;filename&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    fs&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;readFile&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;utf-8&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;err&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; data&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

      &lt;span class=&#34;token comment&#34;&gt;// ======== NEW CODE FROM HERE =========&lt;/span&gt;

      &lt;span class=&#34;token comment&#34;&gt;// Split the content with `---`. The second key will be what we want&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; frontMatter &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; data&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;---&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;frontMatter&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;// Parse the frontMatter and find the title&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;originalTitle&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; uselessKey&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; title&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; frontMatter&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;
          &lt;span class=&#34;token regex&#34;&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-source language-regex&#34;&gt;(title:\s*)(.+)&lt;/span&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-flags&#34;&gt;im&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;// These words should not be capitalised&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; smallWords &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token regex&#34;&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-source language-regex&#34;&gt;^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|v.?|vs.?|via)$&lt;/span&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-flags&#34;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;// Split the title by spaces&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; newTitle &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; title
          &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
          &lt;span class=&#34;token comment&#34;&gt;// Loop through all the items&lt;/span&gt;
          &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;item&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; index&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; array&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;
              &lt;span class=&#34;token comment&#34;&gt;// Does it belong to the smallwords&lt;/span&gt;
              item&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;smallWords&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
              &lt;span class=&#34;token comment&#34;&gt;// and it&#39;s not first or last word&lt;/span&gt;
              index &lt;span class=&#34;token operator&#34;&gt;!==&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
              index &lt;span class=&#34;token operator&#34;&gt;!==&lt;/span&gt; array&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
              &lt;span class=&#34;token comment&#34;&gt;// This needs to be lowercase&lt;/span&gt;
              &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; item&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;toLowerCase&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
              &lt;span class=&#34;token comment&#34;&gt;// Everything else should be capitalised&lt;/span&gt;
              &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; item&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token regex&#34;&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-source language-regex&#34;&gt;^[&#39;A-Za-z&#39;]&lt;/span&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; item&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;toUpperCase&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
          &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
          &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;oldTitle&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; newTitle&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ok, you may think, a lot is going on here. If you run this, nothing is changed in your files, but you should see in your terminal a list of new and old titles.&lt;/p&gt;
&lt;p&gt;What I&#39;d like to explain is the two regular expressions we have here.
The first one, &lt;code&gt;/(title:\s*)(.+)/im&lt;/code&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Will try to find a match of &lt;code&gt;title: some content&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;We create two groups. The &lt;code&gt;(title:\s*)&lt;/code&gt; will get the &lt;code&gt;title:&lt;/code&gt; and any kind of white space after it.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;(.+)&lt;/code&gt; part will get the rest, in our example the &lt;code&gt;some content&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If this regular expression finds a match this will produce an array of results which will be:&lt;/p&gt;
&lt;pre class=&#34;language-js&#34;&gt;&lt;code class=&#34;language-js&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;
    &lt;span class=&#34;token string&#34;&gt;&#39;title: some content&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;// Full Match - originalTitle&lt;/span&gt;
    &lt;span class=&#34;token string&#34;&gt;&#39;title: &#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;// Group 1 - uselessKey&lt;/span&gt;
    &lt;span class=&#34;token string&#34;&gt;&#39;some content&#39;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;// Group 2 - title&lt;/span&gt;
    &lt;span class=&#34;token operator&#34;&gt;...&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that&#39;s why we named the second one &lt;code&gt;uselessKey&lt;/code&gt; in our code since we are not going to use it. We only need the &lt;code&gt;originalTitle&lt;/code&gt; and the &lt;code&gt;title&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The second one is easier &lt;code&gt;/^[&#39;A-Za-z&#39;]/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;From a given string match the first character if it is in the range of &lt;code&gt;A-Z&lt;/code&gt; or &lt;code&gt;a-z&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I know it&#39;s a bit silly to explain it to this extent, but for a lot of people, regular expressions are a mystery.&lt;/p&gt;
&lt;h2&gt;Write the New Content to the File&lt;/h2&gt;
&lt;p&gt;We have one more small thing to do. Replace the title in the original file data and save the file.&lt;/p&gt;
&lt;pre class=&#34;language-js&#34;&gt;&lt;code class=&#34;language-js&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;path&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; fs &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;fs&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; directoryPath &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; path&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;__dirname&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;_posts&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token comment&#34;&gt;// Loop through the folder&#39;s files&lt;/span&gt;
fs&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;readdir&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;directoryPath&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;err&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; files&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;err&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;Unable to scan directory: &#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; err&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;token comment&#34;&gt;// Loop through all files&lt;/span&gt;
  files&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;forEach&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;filename&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; file &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;directoryPath&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;filename&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    fs&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;readFile&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;utf-8&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;err&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; data&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token comment&#34;&gt;// Split the content with `---`. The second key will be what we want&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; frontMatter &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; data&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;---&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;frontMatter&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;// Parse the frontMatter and find the title&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;originalTitle&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; uselessKey&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; title&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; frontMatter&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;match&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;
          &lt;span class=&#34;token regex&#34;&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-source language-regex&#34;&gt;(title:\s*)(.+)&lt;/span&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-flags&#34;&gt;im&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;// These words should not be capitalised&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; smallWords &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token regex&#34;&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-source language-regex&#34;&gt;^(a|an|and|as|at|but|by|en|for|if|in|nor|of|on|or|per|the|to|v.?|vs.?|via)$&lt;/span&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-flags&#34;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;// Split the title by spaces&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; newTitle &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; title
          &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
          &lt;span class=&#34;token comment&#34;&gt;// Loop through all the items&lt;/span&gt;
          &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;item&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; index&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; array&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;
              &lt;span class=&#34;token comment&#34;&gt;// Does it belong to the smallwords&lt;/span&gt;
              item&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;search&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;smallWords&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
              &lt;span class=&#34;token comment&#34;&gt;// and it&#39;s not first or last word&lt;/span&gt;
              index &lt;span class=&#34;token operator&#34;&gt;!==&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;
              index &lt;span class=&#34;token operator&#34;&gt;!==&lt;/span&gt; array&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length &lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
              &lt;span class=&#34;token comment&#34;&gt;// This needs to be lowercase&lt;/span&gt;
              &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; item&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;toLowerCase&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
              &lt;span class=&#34;token comment&#34;&gt;// Everything else should be capitalised&lt;/span&gt;
              &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; item&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token regex&#34;&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;token regex-source language-regex&#34;&gt;^[&#39;A-Za-z&#39;]&lt;/span&gt;&lt;span class=&#34;token regex-delimiter&#34;&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; item&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;toUpperCase&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
          &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
          &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39; &#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;// ======== NEW CODE FROM HERE =========&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;// Replace the old title with the new one in the original content&lt;/span&gt;
        data &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; data&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;originalTitle&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;title: &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;newTitle&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        fs&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;writeFile&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;file&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; data&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;err&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; result&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;err&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;something went wrong with &#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; file&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;Yay!&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are better ways to do all this and more beautiful approaches, but it wasn&#39;t about that. I was probably bored a bit, so I did some quick hacky code and have my titles corrected. This could also be used to change headings in the document.&lt;/p&gt;
&lt;p&gt;Oh, by the way, I didn&#39;t add any kind of report or validation since I&#39;m using git for my blog and I can do a quick manual QA on commit.&lt;/p&gt;
&lt;p&gt;The gist in &lt;a href=&#34;https://gist.github.com/codegaze/5d517826fd14d1697720374205247da2&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Two repos I visited to get some inspiration from:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/kvz/jekyll-fix-titlecase/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/kvz/jekyll-fix-titlecase/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/gouch/to-title-case/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/gouch/to-title-case/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Talent Is Not Enough</title>
   <link href="https://codegazerants.com/2020/06/06/talent-is-not-enough/"/>
   <updated>2020-06-06T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2020/06/06/talent-is-not-enough/"><![CDATA[
    &lt;p&gt;June 2019. Radiohead release &lt;a href=&#34;https://en.wikipedia.org/wiki/MiniDiscs_(Hacked)&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MiniDiscs [Hacked]&lt;/a&gt;, a compilation of demos and rehearsals from the creation of the OK Computer era, one of the greatest albums of the 90s.&lt;/p&gt;
&lt;p&gt;If for some reason you haven&#39;t listened to this album or don&#39;t know Radiohead please do. Although I&#39;m not sure if there is still a person - apart from Sheldon Cooper - that doesn&#39;t know who Radiohead is. &lt;em&gt;Two pop culture references in two sentences, not bad for a start!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In these minidiscs, there was a lot of content, which wasn&#39;t really divided into songs or something, but eighteen parts with a total time of sixteen hours. I&#39;ve listened to some of it and then I forgot about since then, but I revisited it in the last month since a &lt;a href=&#34;https://www.youtube.com/channel/UCoYhBWghdaR5Zn9vP2GBIlQ&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;youtube account&lt;/a&gt; is uploading these minidiscs based on songs which is, you know, a bit easier to listen to.&lt;/p&gt;
&lt;p&gt;Both times, I got the same feeling. If you listen to these recordings, you are going to understand two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How talented these guys are.&lt;/li&gt;
&lt;li&gt;How much work they put on these songs to get them to the point we all know from the album.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It was mind-blowing. I always thought that Thom Yorke and the rest of the gang just had some ideas, and effortless made a record. If you listen to these raw recordings, the experimentations and progress of their work is evident.&lt;/p&gt;
&lt;p&gt;Success and excellence don&#39;t come easy. You have to work for it.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Boring Software Is Good</title>
   <link href="https://codegazerants.com/2020/05/30/boring-software-is-good/"/>
   <updated>2020-05-30T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2020/05/30/boring-software-is-good/"><![CDATA[
    &lt;p&gt;Last night I was wandering around the internet reading a bunch of articles, and I ended up reading Basecamp’s blog. For some reason, this part of this &lt;a href=&#34;https://m.signalvnoise.com/postmortem-on-the-read-only-outage-of-basecamp-on-november-9th-2018/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;random post&lt;/a&gt; really struck a chord.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We pride ourselves at Basecamp on being “boring software” because it just works and it’s always available.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This quote made me think. Each service/software has one or more pieces considered the core of this service. The main value of the product.&lt;/p&gt;
&lt;p&gt;Now here come the questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Do you know which parts of the product are your core value?&lt;/li&gt;
&lt;li&gt;If you could give a version number to each one of these parts, what would it be? And remember, it doesn’t matter how many iterations you’ve done. What matters is if you consider it to be stable, “boring”. If it just works.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like you do, your customers have ROI (Return of Investment) in their vocabulary. They may join and pay for your product if you have some shiny things or extra features, but they will not stay if your core service - your main value proposition - is faulty.&lt;/p&gt;
&lt;p&gt;Are you sure you are moving in the right direction?&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Writing Beyond the Academy by Larry McEnerney</title>
   <link href="https://codegazerants.com/2020/01/13/writing-beyond-the-academy-by-larry-mcenerney/"/>
   <updated>2020-01-13T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2020/01/13/writing-beyond-the-academy-by-larry-mcenerney/"><![CDATA[
    &lt;p&gt;Since I&#39;ve started writing again - yes, do I write, I kid you not - I try to find ways to become better at it. During my search for resources, I stumbled upon this workshop by Larry McEnerney for the University of Chicago Writing Program.&lt;/p&gt;
&lt;p&gt;McEnerney shares some thoughts on writing style, how it is related to your readers, how important is the value of your writings outside of academia and why. Great stuff there. I don&#39;t want to say too much and spoil it for you.&lt;/p&gt;
&lt;div class=&#34;video-fluid-wrapper&#34;&gt;
  &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/aFwVf5a3pZM&#34; frameborder=&#34;0&#34; allow=&#34;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>After the Intermission</title>
   <link href="https://codegazerants.com/2019/12/29/after-the-intermission/"/>
   <updated>2019-12-29T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2019/12/29/after-the-intermission/"><![CDATA[
    &lt;p&gt;I surely have not written something in a long while. I&#39;ve concluded that I have the urge to share, when I need an alternative way of expression.&lt;/p&gt;
&lt;p&gt;A lot has changed since I started this blog. Back in 2016, I moved to another company and I had too much on my plate. I moved from a full-time Engineer to Scrum Master and now Engineering Manager. I&#39;ve also learned a lot about how products are built. It wasn&#39;t easy, but I feel I have found my true calling and something that keeps me on my toes.&lt;/p&gt;
&lt;p&gt;I have different experiences now and I want to share some of my thoughts on people management and leadership. This doesn&#39;t mean I will stop writing about code or anything else. I am just shifting my main focus to other stuff. Of course, I hope this might be helpful to other people too.&lt;/p&gt;
&lt;p&gt;If you have visited before, here are some more changes you will notice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New domain. No Github in it. Rants is something that can describe some of my posts, and I also find it funny!&lt;/li&gt;
&lt;li&gt;A new layout, hopefully, more readable. I&#39;m sure I&#39;ll have some debugging and code clean up to do.&lt;/li&gt;
&lt;li&gt;An &lt;a href=&#34;/about/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;About&lt;/a&gt; section, in which I share more stuff about me and this blog. It&#39;s time to be a bit more out there.&lt;/li&gt;
&lt;li&gt;Categories, in which you can find something you like, easier. Needs improvement I know.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&#39;s all for now... Let&#39;s see how this will turn up!&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Checking Your Open Ports With lsof</title>
   <link href="https://codegazerants.com/2019/05/02/keep-your-ports-safe-with-lsof/"/>
   <updated>2019-05-02T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2019/05/02/keep-your-ports-safe-with-lsof/"><![CDATA[
    &lt;p&gt;Ok, some terminal stuff today. 💻&lt;/p&gt;
&lt;p&gt;Have you ever thought about all these servers, databases, and other services we run in our machines and how vulnerable we become to malicious attacks?&lt;/p&gt;
&lt;p&gt;Let me give you a simple example, I use the &lt;code&gt;vue-cli&lt;/code&gt; to create and manage vue applications. Once you create an application, by default vue-cli exposes the port &lt;code&gt;8081&lt;/code&gt; to everyone inside your network.&lt;/p&gt;
&lt;p&gt;This means that everyone can visit &lt;code&gt;http://myinternalip:8081&lt;/code&gt; and see my application and do whatever he or she wants. I&#39;m not saying that this is the cli&#39;s fault. I should be able to configure my application to listen only to my machine&#39;s request.&lt;/p&gt;
&lt;p&gt;We are not going to cover here how to prevent this kind of situation but how we can see which of our processes are listening to every request.&lt;/p&gt;
&lt;h2&gt;How to check our open ports&lt;/h2&gt;
&lt;p&gt;Well, &lt;code&gt;lsof&lt;/code&gt; FTW, which is a command that &lt;code&gt;lists open files&lt;/code&gt;. In Unix systems this means &amp;quot;everything&amp;quot;.&lt;/p&gt;
&lt;p&gt;A colleague of mine sent me this which gives a list of ports that listen to requests:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;lsof -i -P -n | grep LISTEN&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Which translates to:&lt;/p&gt;
&lt;pre class=&#34;language-html&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;lsof -i // List all the connections
-P // show the port numbers (not names)
-n // Don&#39;t give me hostnames (IPs only)
| grep LISTEN // Find ports that are awaiting connections.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In our vue cli example you would see something like that:&lt;/p&gt;
&lt;pre class=&#34;language-html&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;node 69218 thanos 24u IPv4 0x89e5844963379b35 0t0 TCP \*:8081&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When you see &lt;code&gt;*:port&lt;/code&gt; means open to everyone. Everything else that has &lt;code&gt;127.0.0.1&lt;/code&gt; or &lt;code&gt;[::1]&lt;/code&gt; before the port will be listening only to local requests.&lt;/p&gt;
&lt;p&gt;Here is another example with two Python simple servers. Based on our previous examples, one is open to everyone and one only in the local machine.&lt;/p&gt;
&lt;figure&gt;
  &lt;a href=&#34;/public/terminal.png&#34;&gt;&lt;img src=&#34;/public/terminal.png&#34; border=&#34;0&#34; alt=&#34;lsof example&#34;&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;p&gt;So, try to remember to bind your services to &lt;code&gt;127.0.0.1&lt;/code&gt;! :)&lt;/p&gt;
&lt;p&gt;Bonus: Check this well written and quick &lt;a href=&#34;https://danielmiessler.com/study/lsof/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;article&lt;/a&gt; about lsof.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Andrew Shafer @ Cloud Foundry Summit 2014</title>
   <link href="https://codegazerants.com/2019/05/01/there-is-no-talent-shortage/"/>
   <updated>2019-05-01T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2019/05/01/there-is-no-talent-shortage/"><![CDATA[
    &lt;div class=&#34;video-fluid-wrapper&#34;&gt;
  &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/NAazenCRQSY&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>IE&#39;s InnerHTML Quirks</title>
   <link href="https://codegazerants.com/2017/04/08/IE-innerHTML-quirks/"/>
   <updated>2017-04-08T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2017/04/08/IE-innerHTML-quirks/"><![CDATA[
    &lt;h3&gt;The background&lt;/h3&gt;
&lt;p&gt;There are a lot of articles out there and StackOverflow threads about this,
most of which come to the conclusion that we shouldn&#39;t do it.
But let&#39;s face it, sometimes you have to parse the DOM or parts of the DOM
with regular expressions, because it&#39;s faster.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It&#39;s a dirty job but someones gotta do it &lt;a href=&#34;https://www.youtube.com/watch?v=7GnGwlBRe7w&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;*&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&#39;m not going to get into details, because it would be boring, but I had to
parse an element with regular expression that would exclude some specific HTML
tags from highlighting and process the rest.&lt;/p&gt;
&lt;p&gt;Here is an example of the regex:&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;RegExp&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;&amp;lt;span class=\&#34;no-highlight.*?&amp;lt;\/span&gt;|&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; word&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;gi&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Everything worked find until the IE incident. For some reason the regex didn&#39;t
worked as it should.&lt;/p&gt;
&lt;h3&gt;The debugging period&lt;/h3&gt;
&lt;p&gt;I run the function in the IE console with some &amp;quot;dummy&amp;quot; string which worked fine.
Tried a lot of things without any solid result. I knew it was something simple,
but I couldn&#39;t get my head around it. The local browserstack testing speed in IE
didn&#39;t help either (loving the tool but sometimes local testing is a bitch).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The definition of insanity is doing something over and over again and
expecting a different result.
&lt;a href=&#34;https://www.news.hypercrit.net/2012/11/13/einstein-on-misattribution-i-probably-didnt-say-that/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;*&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;The epiphany&lt;/h3&gt;
&lt;p&gt;Then... what was my input? As I said before, my input was a DOM element,
which means I would take the source with &lt;code&gt;innerHTML&lt;/code&gt; or jQuery&#39;s &lt;code&gt;.html()&lt;/code&gt; function.
I did a console log of the input and I noticed something strange.  The HTML source
wasn&#39;t the same, IE had its own way of dealing with the order of the HTML attributes.&lt;/p&gt;
&lt;p&gt;I&#39;ve lost three hours of my life because of this stupid mistake.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://codepen.io/codegaze/pen/WpqJWj&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Here&lt;/a&gt; is a simple example you can check
the difference in any other browser than IE and IE itself (in a Windows machine
of course).&lt;/p&gt;
&lt;p&gt;When you get the innerHTML of an element in IE, &lt;a href=&#34;https://stackoverflow.com/a/32273037/2321666&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;its attributes are sorted by name, native attributes first. But if you add an attribute at runtime IE adds it at the end&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;My regex would fail because of this. I did find I quick solution for this:&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;token class-name&#34;&gt;RegExp&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;&amp;lt;span.[^&gt;]*?class=\&#34;no-highlight.*?&amp;lt;\/span&gt;|&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; word&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;gi&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I know the problems of this solution, but in my case there won&#39;t be any nesting
in these tags because everything else is escaped.&lt;/p&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Don&#39;t use regular expressions to parse the DOM, but if you do, beware
of the IE&#39;s attributes order.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;style&gt;
  table tr td:first-child {
    width: 30%;
  }
  .post__separator {
    border: 0;
    margin: 0;
    color: #E4E4E4;
  }
  .post__separator:before {
    content: &#39;•••&#39;;
    margin: 0 45%;
    font-size: 2em;
  }
&lt;/style&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Got Rid of Google Fonts and I Feel Fine</title>
   <link href="https://codegazerants.com/2017/03/24/got-rid-of-google-fonts-and-I-feel-fine/"/>
   <updated>2017-03-24T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2017/03/24/got-rid-of-google-fonts-and-I-feel-fine/"><![CDATA[
    &lt;p&gt;I started writing in this blog in 2015, and I made a decision to use the Roboto font as my weapon of choice. Why? Actually, I&#39;m not sure. But I did.&lt;/p&gt;
&lt;p&gt;This means I have to add a script to my page to use the Google Font which adds ~36kb of data to this page. You can say it&#39;s not a significant amount for a page which usually has only text, but these are additional resources.&lt;/p&gt;
&lt;p&gt;I do care about performance and UX. So, I use lazy loading with a fallback and a service worker which gets assets from cache after the client downloads the resource.&lt;/p&gt;
&lt;p&gt;After some discussion with colleagues we ended up having some questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does this make a difference to this blog?&lt;/li&gt;
&lt;li&gt;Does this add any value to the user?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;No - Nope - Nada.&lt;/strong&gt; But let me explain what I mean.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does it make a difference to this blog?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m not a brand or a product that is going to add some value to it.  And if you think about it, the web is full of the Roboto font. My writings won&#39;t stand out because of the font I&#39;m using. Getting better at this will &lt;em&gt;(I really do try!)&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Does it add any value to the user?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Well, no. If I use Helvetica (or Arial for windows and Linux machines) will have &lt;strong&gt;almost&lt;/strong&gt; the same result. I&#39;m not saying it&#39;s the same, but I wont make any big difference to the untrained eye. As I said before, the content will, and readability.&lt;/p&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;&lt;a href=&#34;https://theunderstatement.com/post/11645166791/roboto-vs-helvetica&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Here&lt;/a&gt; is a &lt;code&gt;Roboto/Helvetica&lt;/code&gt; and &lt;a href=&#34;https://www.webdesignerdepot.com/2013/03/arial-vs-helvetica-can-you-spot-the-difference/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;here&lt;/a&gt; a &lt;code&gt;Helvetica/Arial&lt;/code&gt; comparison.&lt;/p&gt;
&lt;p&gt;Not a long time ago Github changed its stack to &lt;code&gt;-apple-system, BlinkMacSystemFont, &amp;quot;Segoe UI&amp;quot;, Helvetica, Arial, sans-serif, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;&lt;/code&gt;. So, who am I to judge?&lt;/p&gt;
&lt;p&gt;Having said that, at least for now I decided to remove the Roboto font and use the &lt;code&gt;&#39;Helvetica, Arial, sans-serif&#39;&lt;/code&gt; stack. I&#39;m working on an Apple machine, so I&#39;m going to do some experiments to get a great result to other systems too.&lt;/p&gt;
&lt;p&gt;Also, now that I&#39;m removing this dependency, I can also get some kb of the small JS that used to check when the web font available for use. These two changes I did reduced the home page resources from ~80kb to ~35kb. I say home page because in the article pages I have the Disqus dependency (at least for now).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; I got rid of the Google Fonts and I feel fine!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; I&#39;m not a typography expert (shocker!).&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;style&gt;
  .post__separator {
    border: 0;
    margin: 0;
    color: #E4E4E4;
  }
  .post__separator:before {
    content: &#39;•••&#39;;
    margin: 0 45%;
    font-size: 2em;
  }
  &lt;/style&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>A Service Worker First Release</title>
   <link href="https://codegazerants.com/2016/07/25/a-service-worker-first-release/"/>
   <updated>2016-07-25T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2016/07/25/a-service-worker-first-release/"><![CDATA[
    &lt;p&gt;I &#39;ve been experimenting for some time with progressive web apps and service workers. I know I am not the first one not even have the best implementation (google has already &lt;a href=&#34;https://github.com/GoogleChrome/sw-toolbox&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;built&lt;/a&gt; a collection of tools for service workers), but this works and I am happy about it.&lt;/p&gt;
&lt;p&gt;I just wanted to say that you can read the posts you have visited while you have internet connection available, when you are offline.&lt;/p&gt;
&lt;p&gt;But what&#39;s next?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&#34;check&#34;&gt;✔&lt;/span&gt; Observe update issues with current service worker setup.&lt;/li&gt;
&lt;li&gt;Implement better caching strategy for pages.&lt;/li&gt;
&lt;li&gt;Fix a bug on mobile devices that offline fallback page doesn&#39;t get retrieved.&lt;/li&gt;
&lt;li&gt;Maybe write a post about this experience and issues I&#39;ve dealt with.&lt;/li&gt;
&lt;li&gt;Implement offline google analytics.&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;check&#34;&gt;✔&lt;/span&gt; Maybe create a manifest file.&lt;/li&gt;
&lt;li&gt;&lt;span class=&#34;check&#34;&gt;✔&lt;/span&gt; Check score with google&#39;s &lt;a href=&#34;https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk?hl=en&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Lighthouse&lt;/a&gt; (100 / 100).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;style&gt;
    .check {
        color: #8fc847;
    }
&lt;/style&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>First Steps With Facebook&#39;s Instant Articles</title>
   <link href="https://codegazerants.com/2016/04/25/first-steps-with-facebooks-instant-articles/"/>
   <updated>2016-04-25T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2016/04/25/first-steps-with-facebooks-instant-articles/"><![CDATA[
    &lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;I think Instant Articles is the Facebook&#39;s way of saying &amp;quot;You had one job&amp;quot; to all developers out there. For me (a developer) is nothing more than a way to give your content to users fast without all the problems that our CMS&#39;s and code add to the user experience.&lt;/p&gt;
&lt;p&gt;But I have one question:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If you are willing to do some work to give your content stripped down to a third party service, why can&#39;t you make the same things to you website to make it better?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Anyway I &#39;ll give a mini start guide for the RSS feed thing for everyone who is interested, with some issues I dealt with.&lt;/p&gt;
&lt;h2&gt;What happened&lt;/h2&gt;
&lt;p&gt;Started working with Facebook&#39;s Instant Articles a few days ago. After two days of frustration I got my first articles consumed by this new Facebook feature. This might be due to my lack of patience with facebook&#39;s documentation or their lack of good documentation. I just tried the RSS way to add content to the Articles (Who the f*ck is going to add manually content to this thing FFS?!)&lt;/p&gt;
&lt;p&gt;I&#39;m not going to guide you through the steps of enabling the Instant Articles because there are ton of articles out there, but I am going to guide you through the painful work of creating a compatible RSS feed by yourself and not by using some plugin.&lt;/p&gt;
&lt;h2&gt;Let&#39;s start&lt;/h2&gt;
&lt;p&gt;First thing you need to do is go to your page and click &lt;code&gt;Settings&lt;/code&gt; at the upper right corner and then &lt;code&gt;Instant Articles&lt;/code&gt; at the left menu. If you can&#39;t find it, this means you haven&#39;t enabled Instant Articles for you page. Go back, do it and come back to this section.&lt;/p&gt;
&lt;p&gt;For your first trial and error stuff we are going to need two thing from the &lt;code&gt;tools&lt;/code&gt; section, the &lt;code&gt;Claim your url&lt;/code&gt; and the &lt;code&gt;Development RSS Feed&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;
  &lt;a href=&#34;/public/instant_articles/scrn_1.png&#34;&gt;&lt;img src=&#34;/public/instant_articles/scrn_1.png&#34; border=&#34;0&#34;&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;For the &lt;code&gt;Claim your Url&lt;/code&gt; tool &lt;strong&gt;first&lt;/strong&gt; you need to add the og tag to your website tags inside &lt;code&gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;/code&gt; and &lt;strong&gt;then&lt;/strong&gt; add you domain you are going to use to authorize your website to give RSS for this feature.&lt;/p&gt;
&lt;figure&gt;
  &lt;a href=&#34;/public/instant_articles/scrn_2.png&#34;&gt;&lt;img src=&#34;/public/instant_articles/scrn_2.png&#34; border=&#34;0&#34;&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;Now, the best part. You need to provide a url with your RSS file that you can do tests. Just write your url and don&#39;t be scared. This is a development feature. You can do anything you want and nothing goes public.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Forgot to say that you need to &amp;quot;Get the Pages Manager App&amp;quot; to preview your articles and styles on iOS or Android. Yeap, there is no other way to preview/debug your instant articles, only your mobile device!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I followed the instructions of facebook for a compatible RSS and built something like this:&lt;/p&gt;
&lt;pre class=&#34;language-xml&#34;&gt;&lt;code class=&#34;language-xml&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;rss&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;2.0&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token attr-name&#34;&gt;&lt;span class=&#34;token namespace&#34;&gt;xmlns:&lt;/span&gt;content&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;http://purl.org/rss/1.0/modules/content/&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;channel&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;News Publisher&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;http://www.example.com/&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;link&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;description&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
Read our awesome news, every day.
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;description&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;language&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;en-us&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;language&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;lastBuildDate&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;2014-12-11T04:44:16Z&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;lastBuildDate&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;item&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;This is an Instant Article&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;link&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;http://example.com/article.html&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;link&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token namespace&#34;&gt;content:&lt;/span&gt;encoded&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token cdata&#34;&gt;&amp;lt;![CDATA[
&amp;lt;!doctype html&gt;
&amp;lt;html lang=&#34;en&#34; prefix=&#34;op: http://media.facebook.com/op#&#34;&gt;
&amp;lt;head&gt;
&amp;lt;meta charset=&#34;utf-8&#34;&gt;
&amp;lt;link rel=&#34;canonical&#34; href=&#34;http://example.com/article.html&#34;&gt;
&amp;lt;meta property=&#34;op:markup_version&#34; content=&#34;v1.0&#34;&gt;
&amp;lt;/head&gt;
&amp;lt;body&gt;
&amp;lt;article&gt;
&amp;lt;header&gt;
&amp;lt;!— Article header goes here --&gt;
&amp;lt;/header&gt;

              &amp;lt;!— Article body goes here --&gt;

              &amp;lt;footer&gt;
                &amp;lt;!— Article footer goes here --&gt;
              &amp;lt;/footer&gt;
            &amp;lt;/article&gt;
          &amp;lt;/body&gt;
        &amp;lt;/html&gt;
        ]]&gt;&lt;/span&gt;
      &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&#34;token namespace&#34;&gt;content:&lt;/span&gt;encoded&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;item&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    ....

&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;channel&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;rss&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you see there is nothing special. Of course this had my content but these were my tags I wanted to use as I read in the documentation, right? &lt;strong&gt;Nope!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For some time I was changing things and trying the results but nothing happened, not even one error. I even tried using a 404 page to see if I was going to get any message from Facebook... &lt;strong&gt;Nope!&lt;/strong&gt;(again)&lt;/p&gt;
&lt;p&gt;After some time I was ready to give up and my last hope was installing Wordpress and the plugin for Instant Messages to see the differences and come up with a solution. After a while I found out that the only different thing was the &lt;code&gt;pubDate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;What did you say? Facebook says it is not required? Yes it does:&lt;/p&gt;
&lt;figure&gt;
  &lt;a href=&#34;/public/instant_articles/scrn_3.png&#34;&gt;&lt;img src=&#34;/public/instant_articles/scrn_3.png&#34; border=&#34;0&#34;&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;p&gt;After two days and one minute before going to a colleague or a stranger for help I saw my Development Instant Articles consuming my RSS feed. Just go to &lt;code&gt;Publishing Tools&lt;/code&gt; from your top menu and then to your left side menu to your &lt;code&gt;Instant Articles -&amp;gt; Development&lt;/code&gt;.&lt;/p&gt;
&lt;figure&gt;
  &lt;a href=&#34;/public/instant_articles/scrn_4.png&#34;&gt;&lt;img src=&#34;/public/instant_articles/scrn_4.png&#34; border=&#34;0&#34;&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;And just like that, I felt better!&lt;/p&gt;
&lt;p&gt;But not for long. Added some more stuff like images, article text etc, but when I tried to see the articles in my mobile device I couldn&#39;t see the images and got some other errors from facebook. What I noticed was that my figure images where inside a paragraph tag because... editors!&lt;/p&gt;
&lt;p&gt;The reason: &lt;strong&gt;Your wysiwyg editor sucks!&lt;/strong&gt;&lt;/p&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;Facebook Instant Articles need clean HTML code. If your image is wrapped in a paragraph you have a problem. If your text isn&#39;t inside a paragraph you have a problem and other stuff that I haven&#39;t gotten into.&lt;/p&gt;
&lt;p&gt;This means you may have to do some code-post-clean-up work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2016-09-25 Update:&lt;/strong&gt;
Chris Coyer wrote a interesting &lt;a href=&#34;https://mediatemple.net/blog/tips/wordpress-apple-news-instant-articles-amp/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;article&lt;/a&gt; about making content available to Instant Articles, Apple News and AMP. Not everyone uses Wordpress (only the 25% of the internet websites do :P), but it&#39;a a great case study.&lt;/p&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;That&#39;s all for now. Test and debug your articles and stay tuned to see if I manage to deliver the project and how! :P&lt;/p&gt;
&lt;p&gt;Don&#39;t trust Facebook&#39;s documentation and build beautiful lightweight websites so we won&#39;t use third party services.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;style&gt;
  .post__separator {
    border: 0;
    margin: 0;
    color: #E4E4E4;
  }
  .post__separator:before {
    content: &#39;•••&#39;;
    margin: 0 45%;
    font-size: 2em;
  }
  &lt;/style&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Upgrading Jekyll 2.x to 3.x</title>
   <link href="https://codegazerants.com/2016/02/04/upgrading-jekyll-2x-to-3x/"/>
   <updated>2016-02-04T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2016/02/04/upgrading-jekyll-2x-to-3x/"><![CDATA[
    &lt;p&gt;At February 1st Github &lt;a href=&#34;https://github.com/blog/2100-github-pages-now-faster-and-simpler-with-jekyll-3-0&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;announced&lt;/a&gt; the upgrade of Jekyll from 2.4 to 3.0 for Guthub Pages. I thought this was the time to upgrade my local setup to the new version. I &#39;ve tried it some time ago but got some error and was too tired to debug anything, but now I had no choice.&lt;/p&gt;
&lt;p&gt;Jekyll has a &lt;a href=&#34;https://jekyllrb.com/docs/upgrading/2-to-3/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;guide&lt;/a&gt; for upgrading but it wasn&#39;t enough for me. I ran &lt;code&gt;gem update jekyll&lt;/code&gt; and tried to start my site with &lt;code&gt;jekyll serve&lt;/code&gt; as always but I got the following errors.&lt;/p&gt;
&lt;h3&gt;Error Message #1&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Deprecation: You appear to have pagination turned on, but you haven&#39;t included the &lt;code&gt;jekyll-paginate&lt;/code&gt; gem. Ensure you have &lt;code&gt;gems: [jekyll-paginate]&lt;/code&gt; in your configuration file.&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was easy, I just removed the &lt;code&gt;paginate:&lt;/code&gt; setting from my _config.yml. I got no pagination so this was easier for me. If you have pagination in your site then you need to install the &lt;code&gt;jekyll-paginate&lt;/code&gt; gem.&lt;/p&gt;
&lt;h3&gt;Error Message #2&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Dependency Error: Yikes! It looks like you don&#39;t have kramdown or one of its dependencies installed. In order to use Jekyll as currently configured, you&#39;ll need to install this gem. The full error message from Ruby is: &#39;cannot load such file -- kramdown&#39; If you run into trouble, you can find helpful resources at
&lt;a href=&#34;http://jekyllrb.com/help/!jekyll&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;http://jekyllrb.com/help/!jekyll&lt;/a&gt; 3.1.1 Error: kramdown&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was a litle bit more complicated than I thought it would be.&lt;/p&gt;
&lt;p&gt;At first I installed the kramdown gem but it kept returning me the same error message. The solution was to uninstall the old Jekyll verions with &lt;code&gt;gem uninstall Jekyll&lt;/code&gt;.&lt;/p&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
After doing this I got one more error:
&lt;h3&gt;Error Message #3&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Bundler could not find compatible versions for gem &amp;quot;jekyll&amp;quot;: (Bundler::VersionConflict) In Gemfile: github-pages x64-mingw32 was resolved to 34, which depends on jekyll (= 2.4.0) x64-mingw32&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I removed a Gemfile file I had in my folder and that worked for me.&lt;/p&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;If you have any more errors with your upgrade feel free to contact me to add them here!&lt;/p&gt;
&lt;style&gt;
  .post__separator {
    border: 0;
    margin: 0;
    color: #E4E4E4;
  }
  .post__separator:before {
    content: &#39;•••&#39;;
    margin: 0 45%;
    font-size: 2em;
  }
  &lt;/style&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>A Simple BEM Advice</title>
   <link href="https://codegazerants.com/2016/01/11/a-bem-advice/"/>
   <updated>2016-01-11T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2016/01/11/a-bem-advice/"><![CDATA[
    &lt;p&gt;For some time now I have been using the BEM methodology for production and I came to a conclusion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;Don&#39;t get carried away!&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What I mean is, when I started using BEM I thought SASS will be my savior, I will use the sh*t out of &#39;&amp;amp;&#39; and don&#39;t ever repeat one single word...&lt;/p&gt;
&lt;p&gt;This was a mistake. If you have a small project that won&#39;t scale it&#39;s okay, but if you have a big project that will grow, you and your colleagues are going to have a big problem. Code will get more and more complicated, even a simple navigation menu with some modifiers will be difficult to find the right line to change or add something.&lt;/p&gt;
&lt;p&gt;Let me be more clear with an example.&lt;/p&gt;
&lt;pre class=&#34;language-css&#34;&gt;&lt;code class=&#34;language-css&#34;&gt;&lt;span class=&#34;token selector&#34;&gt;.nav&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;token selector&#34;&gt;&amp;amp;__item&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; inline&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token selector&#34;&gt;&amp;amp;--primary&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token property&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; blue&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token selector&#34;&gt;&amp;amp;--dashed&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token property&#34;&gt;border&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 1px dashed #000&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

    &lt;span class=&#34;token selector&#34;&gt;&amp;amp;-link&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token property&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; #000&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token property&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 100%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

      &lt;span class=&#34;token selector&#34;&gt;&amp;amp;--gray&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token property&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; gray&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token property&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; #fff&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token selector&#34;&gt;&amp;amp;-sub&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token selector&#34;&gt;&amp;amp;-link&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        .....
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This code after a while (or even now) will be incomprehensible. The solution is simple. Write some clean starting points. This code will sure be more readable if we change it to something like this&lt;/p&gt;
&lt;pre class=&#34;language-css&#34;&gt;&lt;code class=&#34;language-css&#34;&gt;&lt;span class=&#34;token selector&#34;&gt;.nav__item&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;token property&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; inline&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token selector&#34;&gt;&amp;amp;--primary&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; blue&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; block&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

  &lt;span class=&#34;token selector&#34;&gt;&amp;amp;--dashed&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;border&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 1px dashed #000&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;token selector&#34;&gt;.nav__item-sub&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  .....
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;token selector&#34;&gt;.nav__item-link&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;token property&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; #000&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 100%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token selector&#34;&gt;&amp;amp;--gray&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; gray&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; #fff&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;token selector&#34;&gt;.nav__item-sub-link&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  .......
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now you will know what you are doing the next time you or someone else opens your SASS files.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Jekyll Workflow With Gulp</title>
   <link href="https://codegazerants.com/2016/01/09/a-jekyll-workflow-with-gulp/"/>
   <updated>2016-01-09T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2016/01/09/a-jekyll-workflow-with-gulp/"><![CDATA[
    &lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This weekend I decided to take this blog&#39;s design and create a theme. Of course it&#39;s not ready yet, because in the process of refactoring the SASS code I came across a problem. I &#39;m using flexbox but I didn&#39;t have prefixes! It&#39;s not the end of the world but this led to the fact that because of the github pages limitations I &#39;m limiting my workflow too. This is a problem.&lt;/p&gt;
&lt;h2&gt;Gulp to the rescue&lt;/h2&gt;
&lt;p&gt;So, we are going to include Gulp and some plugins to make our lives easier.&lt;/p&gt;
&lt;p&gt;This process has two parts. The first one is the Jekyll&#39;s _config.yml configuration and the creation of a new folder we are going to have our development files, and our gulpfile.js configuration/setup.&lt;/p&gt;
&lt;h3&gt;Part I: Jekyll&lt;/h3&gt;
&lt;p&gt;Let&#39;s add some configuration to _config.yml.&lt;/p&gt;
&lt;pre class=&#34;language-yaml&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;&lt;span class=&#34;token key atrule&#34;&gt;exclude&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;_dev&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            &lt;span class=&#34;token string&#34;&gt;&#34;gulpfile.js&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            &lt;span class=&#34;token string&#34;&gt;&#34;node_modules&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            &lt;span class=&#34;token string&#34;&gt;&#34;package.json&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;exclude&lt;/code&gt; is a configuration setting variable in Jekyll&#39;s core to exlude paths or files from the site&#39;s conversion. (aka _site folder).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Exclude directories and/or files from the conversion. These exclusions are relative to the site&#39;s source directory and cannot be outside the source directory.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, we don&#39;t want these files in our production site. I think it&#39;s pretty straightforward what we did here, but what you are goin to say is &lt;strong&gt;&#39;What the f*uck is the _dev folder?&#39;&lt;/strong&gt; and you &#39;ll be right. The _dev folder is going to be the folder to keep our sass,js...(and whatever you want) source files which we don&#39;t want to be visible to the website.&lt;/p&gt;
&lt;p&gt;Our project folder should be like this. The partials folder isn&#39;t mandatory, it&#39;s the way I structure my sass code. (if you feel comfortable tweaking the gulpfile.js you can work with any structure you want :) ):&lt;/p&gt;
&lt;pre&gt;
|-- project
    |-- gulpfile.js
    |-- index.html
    |-- package.json
    |-- _config.yml
    |-- assets
    |   |-- css
    |   |   |-- style.css
    |   |-- img
    |   |-- js
    |-- _dev
    |   |-- src
    |       |-- sass
    |           |-- style.scss
    |           |-- partials
    |               |-- _base.scss
    |               |-- _functions.scss
    |               |-- _grid.scss
    |               |-- _layout.scss
    |               |-- _reset.scss
    |               |-- _syntax.scss
    |               |-- _variables.scss
    |-- _includes
    |-- _layouts
    |-- _posts
    |-- _site
&lt;/pre&gt;
&lt;p&gt;And that&#39;s all we need to do for the Jekyll part.&lt;/p&gt;
&lt;h3&gt;Part II: Gulp&lt;/h3&gt;
&lt;p&gt;Now, let&#39;s install all the things!&lt;/p&gt;
&lt;p&gt;You can copy paste this to a package.json file&lt;/p&gt;
&lt;pre class=&#34;language-json&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;&#34;devDependencies&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^3.9.0&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-autoprefixer&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^3.1.0&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-connect&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^2.3.1&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-clean-css&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^2.0.13&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-plumber&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^1.0.1&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-rename&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^1.2.2&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-sass&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^2.1.1&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-util&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^3.0.7&#34;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and install by typing in your terminal&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;npm install&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or create an empty package.json by typing&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;npm init&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and follow the instructions to create a package.json file.&lt;/p&gt;
&lt;p&gt;And then install by&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;npm install &lt;span class=&#34;token operator&#34;&gt;--&lt;/span&gt;save&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;dev gulp gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;sass gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;util gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;plumber gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;rename gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;clean&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;css gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;autoprefixer gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;connect&lt;/code&gt;&lt;/pre&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;Now we have our dependences let&#39;s build our gulpfile.js.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// Require all the things&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; gulp &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      sass &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-sass&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      gutil &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-util&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      plumber &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-plumber&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      rename &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-rename&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      minifyCSS &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-clean-css&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      prefixer &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-autoprefixer&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      connect &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-connect&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      cp &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;child_process&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token comment&#34;&gt;// Set the path variables&lt;/span&gt;
&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; base_path &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;./&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      src &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; base_path &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;_dev/src&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      dist &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; base_path &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;assets&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      paths &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
          &lt;span class=&#34;token literal-property property&#34;&gt;js&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; src &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;/js/*.js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
          &lt;span class=&#34;token literal-property property&#34;&gt;scss&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; src &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;/sass/*.scss&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
                  src &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;/sass/**/* .scss&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
                  src &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;/sass/**/**/*.scss&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
          &lt;span class=&#34;token literal-property property&#34;&gt;jekyll&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;index.html&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;_posts/*&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;_layouts/*&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;_includes/*&#39;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;assets/*&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;assets/**/*&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;


&lt;span class=&#34;token comment&#34;&gt;// Compile sass to css&lt;/span&gt;
gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;compile-sass&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;paths&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;scss&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;plumber&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        gutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;gutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;colors&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;error&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;message&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;compile-sass&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;emit&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;end&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;sass&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;prefixer&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;last 3 versions&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;ie 9&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;minifyCSS&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;rename&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token literal-property property&#34;&gt;dirname&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; dist &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;/css&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;./&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token comment&#34;&gt;// Rebuild Jekyll&lt;/span&gt;
gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;build-jekyll&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; cp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;spawn&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;jekyll&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;build&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;--incremental&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token literal-property property&#34;&gt;stdio&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;inherit&#39;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;// Adding incremental reduces build time.&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;error&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; gutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;gutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;colors&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;error&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;message&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;close&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; code&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;token comment&#34;&gt;// Setup Server&lt;/span&gt;
gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;server&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  connect&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;server&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token literal-property property&#34;&gt;root&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;_site&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token literal-property property&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;4000&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;

&lt;span class=&#34;token comment&#34;&gt;// Watch files&lt;/span&gt;
gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;watch&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;watch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;paths&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;scss&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;compile-sass&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;watch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;paths&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;jekyll&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;build-jekyll&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token comment&#34;&gt;// Start Everything with the default task&lt;/span&gt;
gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;default&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;compile-sass&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;build-jekyll&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;server&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;watch&#39;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Important For Windows users:&lt;/strong&gt; You need to replace in the build-jekyll task the &#39;jekyll&#39; string with the path of your jekyll.bat. In my case it was in the &lt;code&gt;C:\Ruby22-x64\bin&lt;/code&gt; so I changed this code to:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2016/11/20 Update:&lt;/strong&gt; As &lt;a href=&#34;https://talk.jekyllrb.com/t/jekyll-workflow-with-gulp-tutorial/1752/2?u=codegaze&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Ron Dyar&lt;/a&gt; commented, in some Windows OS cases a jekyll.bat is enough, without the path. You can try both and see which one works for you.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// Rebuild Jekyll&lt;/span&gt;
gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;build-jekyll&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;code&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; cp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;spawn&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;C:\\your_ruby_path\\bin\\jekyll.bat&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;build&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token literal-property property&#34;&gt;stdio&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;inherit&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;error&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; gutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;gutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;colors&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;red&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;error&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;message&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;close&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; code&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;2016/01/10 Update:&lt;/strong&gt; &lt;a href=&#34;https://disq.us/p/1ds1bx6&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Alex Lockwood&lt;/a&gt; was kind enough to create a &lt;a href=&#34;https://gist.github.com/alexjlockwood/9a4201b5a4b47c3f1c3de69dde4e8ece&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;gist&lt;/a&gt; for older npm versions on which ES6 features cause errors.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2017/02/11 Update:&lt;/strong&gt; A user&#39;s comment I cannot find requested to update the ruby path with a newer version. So, in the &lt;code&gt;your_ruby_path&lt;/code&gt; you need to set your ruby path. For example, mine was &lt;code&gt;Ruby22-x64&lt;/code&gt; at the time.&lt;/p&gt;
&lt;div class=&#34;important&#34;&gt;
Now, if you don&#39;t care to know how this works or why, just copy/paste all these we talked about, and when you are ready just execute in your terminal &lt;code&gt;gulp&lt;/code&gt; and you can go to &lt;code&gt;http://localhost:4000&lt;/code&gt; and see your site. All changes will be watched and compiled.
&lt;/div&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;What our gulpfile does:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Builds Jekyll&lt;/li&gt;
&lt;li&gt;Minifies/compiles/autoprefixes SASS&lt;/li&gt;
&lt;li&gt;Sets up a local server&lt;/li&gt;
&lt;li&gt;Watches our source files(Jekyll&#39;s and static assets) and recompile when changes on update.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Let&#39;s see what each plugin does for our case:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gulp:&lt;/strong&gt; You know what this does!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gulp-sass:&lt;/strong&gt; Takes our sass files and compiles them to css.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gulp-util/gulp-plumber:&lt;/strong&gt; Some gulp utilities to catch and report errors. For some reason the gulp-sass plugin stops gulp on error and we have to start it again, so with these two we can prevent that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gulp-rename:&lt;/strong&gt; Renames our CSS files because if we didn&#39;t we would get a file like this &lt;code&gt;/assets/css/src/css/style.css&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gulp-&lt;s&gt;minify&lt;/s&gt;clean-css:&lt;/strong&gt; Simple!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gulp-autoprefixer:&lt;/strong&gt; What started all this! This prefixes our css. There are some great options for this plugin, be sure to check them out! &lt;a href=&#34;https://github.com/postcss/autoprefixer&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gulp-connect:&lt;/strong&gt; Setups a local web server to preview our site. It&#39;s inevitable because we can&#39;t use &lt;code&gt;jekyll serve&lt;/code&gt; like we did before.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;child_process:&lt;/strong&gt; This is not a plugin. This is a Node.js core module. We are using this because (very roughly) Gulp is running in one process and we need to run the &lt;code&gt;jekyll build&lt;/code&gt; process at the same time, we cannot stop Gulp. So we are &#39;attaching&#39; the jekyll command to a child process that returns that everything went fine when it finishes. I want to see this in depth but I got carried away with the Windows problem I warned you before.&lt;/p&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;That&#39;s it! As I said before just run &lt;code&gt;gulp&lt;/code&gt; and work with your masterpiece!&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Having this workflow might be strange at the beginning but it will help you, I promise. I didn&#39;t include the js files manipulation on purpose so that you can do some tests. But it will be available to the theme workflow I am working right now. Stay tuned!&lt;/p&gt;
&lt;p&gt;If you have and questions or comments don&#39;t hesitate to contact me here or at my &lt;a href=&#34;https://twitter.com/codegaze&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;twitter&lt;/a&gt; account.&lt;/p&gt;
&lt;p&gt;Cheers!&lt;/p&gt;
&lt;style&gt;

  .post__separator {
    border: 0;
    margin: 0;
    color: #E4E4E4;
  }
  .post__separator:before {
    content: &#39;•••&#39;;
    margin: 0 45%;
    font-size: 2em;
  }
  .important {
    border-top: 3px solid #000;
    border-bottom: 3px solid #000;
    padding: 10px;
    margin-bottom: 10px;
  }
&lt;/style&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Working With ES6 in the Browser</title>
   <link href="https://codegazerants.com/2016/01/05/working-with-es6-in-browser/"/>
   <updated>2016-01-05T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2016/01/05/working-with-es6-in-browser/"><![CDATA[
    &lt;p&gt;These are some ways to work with ES6 in the browser. We are going to use &lt;a href=&#34;https://babeljs.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Babel&lt;/a&gt; 6 as our transpiler and &lt;a href=&#34;https://gulpjs.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Gulp&lt;/a&gt; as our task runner.&lt;/p&gt;
&lt;h2&gt;The playground&lt;/h2&gt;
&lt;p&gt;If you just want to test some of the new features first we must install the following by:&lt;/p&gt;
&lt;p&gt;Creating a package.json and add the &lt;code&gt;gulp&lt;/code&gt;, &lt;code&gt;gulp-babel&lt;/code&gt;, &lt;code&gt;gulp-concat&lt;/code&gt;, &lt;code&gt;gulp-sourcemaps&lt;/code&gt;, &lt;code&gt;babel-preset-es2015&lt;/code&gt; dependences in it and execute &lt;code&gt;npm install&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;language-json&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;&#34;devDependencies&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;babel-preset-es2015&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^6.3.13&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^3.9.0&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-babel&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^6.1.1&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-concat&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^2.6.0&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-sourcemaps&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^1.6.0&#34;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or just in our command line&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;npm install &lt;span class=&#34;token operator&#34;&gt;--&lt;/span&gt;save&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;dev gulp gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;babel gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;sourcemaps gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;concat babel&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;preset&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;es2015&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Some explanation of the plugins:&lt;/p&gt;
&lt;p&gt;| ------------------- |:-----------------------------------------:|
| &lt;strong&gt;gulp&lt;/strong&gt;                | The task/build runner to glue everything  |
| &lt;strong&gt;babel&lt;/strong&gt;               | Transforms our ES6 to ES5*                |
| &lt;strong&gt;gulp-sourcemaps&lt;/strong&gt;     | For better Debugging                      |
| &lt;strong&gt;gulp-concat&lt;/strong&gt;         | Concatenates files (js for us)            |
| &lt;strong&gt;babel-preset-es2015&lt;/strong&gt; | Transforms our ES6 to ES5*                |&lt;/p&gt;
&lt;p&gt;*As of version 6 Babel doesn&#39;t transpile ES2015 by default.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Since Babel is focusing on being a platform for JavaScript tooling and not an ES2015 transpiler, we’ve decided to make all of the plugins opt-in. This means when you install Babel it will no longer transpile your ES2015 code by default.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;After we install all our plugins we need to create a gulpfile.js with the following content:&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; gulp &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      babel &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-babel&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      concat &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-concat&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      sourcemaps &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-sourcemaps&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;babel-js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;src/*.js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;sourcemaps&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;babel&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token literal-property property&#34;&gt;presets&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;es2015&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;concat&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;app.js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;sourcemaps&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;write&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;.&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;dist&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;watch&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;watch&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;src/app.js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;babel-js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;default&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;babel-js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;watch&#39;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;For our html file we just need to add our app.js file to our simple html structure:&lt;/p&gt;
&lt;pre class=&#34;language-html&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;&lt;span class=&#34;token doctype&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&#34;token doctype-tag&#34;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&#34;token name&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;en&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;UTF-8&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;ES6 Browser Starter&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;./dist/app.js&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token script&#34;&gt;&lt;/span&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;Now that all our scripts and files are ready, our directory structure should look like this:&lt;/p&gt;
&lt;pre&gt;
    |-- gulpfile.js
    |-- index.html
    |-- package.json
    |-- dist
    |-- src
        |-- app.js
&lt;/pre&gt;
&lt;p&gt;We execute &lt;code&gt;gulp&lt;/code&gt; in our terminal and any change in our javascript files will be watched and compiled.&lt;/p&gt;
&lt;h2&gt;Let&#39;s get serious&lt;/h2&gt;
&lt;p&gt;That was fun, but if we want to use modules requires a different setup. This time we are going to use &lt;a href=&#34;https://browserify.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Browserify&lt;/a&gt; to bundle our module. You can check how to do this with &lt;a href=&#34;https://webpack.github.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Webpack&lt;/a&gt; in a &lt;a href=&#34;https://codegazerants.com/2015/12/27/create-an-es6-module/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;previous post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Like before, we need to install our dependences by creating this package.json:&lt;/p&gt;
&lt;pre class=&#34;language-json&#34;&gt;&lt;code class=&#34;language-json&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;&#34;devDependencies&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;babel-preset-es2015&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^6.3.13&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;babelify&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^7.2.0&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;browserify&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^12.0.1&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^3.9.0&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-rename&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^1.2.2&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;gulp-util&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^3.0.7&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;vinyl-buffer&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^1.0.0&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;vinyl-source-stream&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^1.1.0&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;&#34;watchify&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;^3.6.1&#34;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;or by command line:&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;npm install &lt;span class=&#34;token operator&#34;&gt;--&lt;/span&gt;save&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;dev babel&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;preset&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;es2015 babelify browserify gulp gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;rename gulp&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;util vinyl&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;buffer vinyl&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;source&lt;span class=&#34;token operator&#34;&gt;-&lt;/span&gt;stream watchify&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What our new gulp plugins do:&lt;/p&gt;
&lt;p&gt;| ------------------- |:-----------------------------------------:|
| &lt;strong&gt;babelify&lt;/strong&gt;            | Browserify transform for Babel. This will transpile our ES6 code to ES5                         |
| &lt;strong&gt;Browserify&lt;/strong&gt;          | Browserify lets you require(&#39;modules&#39;) in the browser by bundling up all of your dependencies. This will make our modules work in the browser when we &#39;ll transpile our ES6 code to ES5                                                                       |
| &lt;strong&gt;gulp-rename&lt;/strong&gt;         | Rename files                                                                                    |
| &lt;strong&gt;gulp-util&lt;/strong&gt;           | Utilities for gulp plugins. We are using it here to get a colorful message of successful bundle |
| &lt;strong&gt;vinyl-buffer&lt;/strong&gt;        | Transforms our bundle to Gulp stream                                                            |
| &lt;strong&gt;vinyl-source-stream&lt;/strong&gt; | Transforms our bundle to Gulp stream                                                            |
| &lt;strong&gt;watchify&lt;/strong&gt;            | Watches for updates in our browserify files and recompiles them.                                |&lt;/p&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;Our &lt;code&gt;gulpfile.js&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token string&#34;&gt;&#34;use strict&#34;&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; gulp &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      babelify &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;babelify&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      browserify &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;browserify&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      source &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;vinyl-source-stream&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      buffer &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;vinyl-buffer&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      watchify &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;watchify&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      rename &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-rename&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
      gutil &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;gulp-util&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;


&lt;span class=&#34;token keyword&#34;&gt;const&lt;/span&gt; config &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token literal-property property&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;./src/app.js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
        &lt;span class=&#34;token literal-property property&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;./dist/&#39;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;bundle&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;bundler&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  bundler
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;bundle&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;bundled-app.js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;buffer&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;rename&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;bundle.js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;config&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;dest&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;end&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; gutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;gutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;colors&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;green&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;==&gt; Successful Bundle!&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;task&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;default&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; bundler &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;browserify&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;config&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;src&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token literal-property property&#34;&gt;debug&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
                  &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;plugin&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;watchify&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
                  &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;transform&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;babelify&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token literal-property property&#34;&gt;presets&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;es2015&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token function&#34;&gt;bundle&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;bundler&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  bundler&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;update&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;bundle&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;bundler&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Let&#39;s start from the bottom.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; bundler &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;browserify&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;config&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;src&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token literal-property property&#34;&gt;debug&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
                  &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;plugin&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;watchify&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
                  &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;transform&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;babelify&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token literal-property property&#34;&gt;presets&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;es2015&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Our default task is creating a bundler variable with a browserify object. Takes two parameters, one is our source file and the second one is to return inline sourcemaps in our &lt;code&gt;bundle.js&lt;/code&gt; file. Then adds the watchify plugin and transforms it with babelify to ES5 code.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token function&#34;&gt;bundle&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;bundler&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  bundler&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;update&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;bundle&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;bundler&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This part of code calls the bundle function for the first time and adds the &lt;code&gt;on update&lt;/code&gt; event to recall it when our source code changes.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;bundle&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;bundler&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  bundler
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;bundle&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;source&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;bundled-app.js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;buffer&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;rename&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;bundle.js&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pipe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;gulp&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;dest&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;config&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;dest&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;on&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;end&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; gutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;gutil&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;colors&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;green&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;==&gt; Successful Bundle!&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;bundle&lt;/code&gt; function bundles our code and puts the result in our destination folder.&lt;/p&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
&lt;p&gt;For this example we are going to create one more js file to test our module works.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Remember to put &#39;./&#39; in front of the import folder. I lost a lot of time because I forgot to.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;//---- ./app.js&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;y&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;./libs/simpleModule&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token function&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token comment&#34;&gt;//---- ./libs/simpleModule.js&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;y&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;This is a Module!&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
For this html file we are going to change our app.js from our previous example with the bundle.js.
&lt;pre class=&#34;language-html&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;&lt;span class=&#34;token doctype&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;!&lt;/span&gt;&lt;span class=&#34;token doctype-tag&#34;&gt;DOCTYPE&lt;/span&gt; &lt;span class=&#34;token name&#34;&gt;html&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;html&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;lang&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;en&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;charset&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;UTF-8&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;ES6 Browser Modules&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;body&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;script&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;src&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;./dist/bundle.js&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token script&#34;&gt;&lt;/span&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;script&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;body&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;html&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr class=&#34;post__separator&#34;/&gt;
And our folder structure must be something like this right now.
&lt;pre&gt;
    |-- gulpfile.js
    |-- index.html
    |-- package.json
    |-- dist
    |-- src
        |-- app.js
        |-- libs
            |-- simpleModule.js
&lt;/pre&gt;
&lt;p&gt;Just execute &lt;code&gt;gulp&lt;/code&gt; in your terminal and any change in your javascript files will be watched and compiled. If everything went well you should be able to see the &#39;==&amp;gt; Successful Bundle!&#39; message.&lt;/p&gt;
&lt;style&gt;
  table tr td:first-child {
    width: 30%;
  }
  .post__separator {
    border: 0;
    margin: 0;
    color: #E4E4E4;
  }
  .post__separator:before {
    content: &#39;•••&#39;;
    margin: 0 45%;
    font-size: 2em;
  }
&lt;/style&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Create an ES6 Module</title>
   <link href="https://codegazerants.com/2015/12/27/create-an-es6-module/"/>
   <updated>2015-12-27T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/12/27/create-an-es6-module/"><![CDATA[
    &lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;ES6 Time! I decided to migrate the share buttons script to ECMASCRIPT 6.&lt;/p&gt;
&lt;p&gt;First some things I want to say:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;This is a prototype that may contain errors in code or concept. I am open to suggestions :)&lt;/li&gt;
&lt;li&gt;I just started, and if you are interested in ES6 you should too, reading the &lt;a href=&#34;https://leanpub.com/exploring-es6/&#34; target=&#34;_blank&#34;&gt;&amp;quot;Exploring ES6 - Upgrade to the next version of JavaScript&amp;quot;&lt;/a&gt; by Axel Rauschmayer.&lt;/li&gt;
&lt;li&gt;I started this code by reading &lt;a href=&#34;https://exploringjs.com/es6/ch_deploying-es6.html#sec_webpack-babel&#34; target=&#34;_blank&#34;&gt;this chapter&lt;/a&gt; from this book and using this &lt;a href=&#34;https://github.com/rauschma/webpack-babel-demo&#34; target=&#34;_blank&#34;&gt;repository&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The code of this article is available in my github account in &lt;a href=&#34;https://github.com/codegaze/es6-module-codegaze-blog-post-code&#34;&gt;this&lt;/a&gt; repository to check it out.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What&#39;s this post about&lt;/h3&gt;
&lt;p&gt;This post is about creating a small ES6 module we created in a previous post about &lt;a href=&#34;https://codegazerants.com/2015/11/24/share-buttons-performance/&#34;&gt;Share Buttons Performance&lt;/a&gt; and a script to avoid all these problems. It&#39;s a simple script that scans the dom for a specific class and adds a click event.&lt;/p&gt;
&lt;h3&gt;ES6 fast catchup&lt;/h3&gt;
&lt;p&gt;To fully understand this post you &#39;ll need to understand some basic ES6 features. This is a rough explaination of these features, you should take a look at Axel Rauschmayer&#39;s book for more in depth stuff.&lt;/p&gt;
&lt;h4&gt;VAR vs LET&lt;/h4&gt;
&lt;p&gt;In ES6 we can use &lt;code&gt;let&lt;/code&gt; to create block variables. Here is an example from MDN:&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;varTest&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; x &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;31&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; x &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;71&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;// same variable!&lt;/span&gt;
    console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;// 71&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;// 71&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;letTest&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; x &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;31&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token boolean&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; x &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;71&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;// different variable&lt;/span&gt;
    console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;// 71&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;x&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;  &lt;span class=&#34;token comment&#34;&gt;// 31&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I noticed that if you set with &lt;code&gt;let&lt;/code&gt; the same variable in the same block you &#39;ll get an error.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; x &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; x &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token comment&#34;&gt;// Uncaught TypeError: unknown: Line 2: Duplicate declaration &#34;x&#34;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Arrow functions&lt;/h4&gt;
&lt;p&gt;In my opinion the main difference of using arrow functions is that the word &lt;code&gt;this&lt;/code&gt; doesn&#39;t refer to the current arrow function&#39;s scope but to some parent function that has a &lt;code&gt;this&lt;/code&gt; definition (We will see this in our code later). This means no more &lt;code&gt;that = this&lt;/code&gt; etc but this can be tricky, especially inside modules.&lt;/p&gt;
&lt;p&gt;But here are some examples:&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// No parameters (parenthesis is required)&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;logMe&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;ME!&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token function&#34;&gt;logMe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token comment&#34;&gt;// One parameter (can ommit parenthesis)&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;logMe&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token parameter&#34;&gt;name&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;name&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token function&#34;&gt;logMe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;Jim&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token comment&#34;&gt;// More than one parameter (parenthesis is required)&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;logMe&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;what&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; name&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;what &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39; &#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; name&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token function&#34;&gt;logMe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;Hello&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;Jim&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token comment&#34;&gt;// More than one parameter and multiple line expression&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;logMe&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;what&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; name&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; text &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; what &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39; &#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; name&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;text&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token function&#34;&gt;logMe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;Hello&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;Jim&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;


    &lt;span class=&#34;token comment&#34;&gt;/*
        The `this` scope. this will refer to the logMe() and not the setTimeout function.
        There is no `this` inside that arrow function.
    */&lt;/span&gt;

    &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;logMe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token function&#34;&gt;setTimeout&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
            console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;Who:&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;name&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;500&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token comment&#34;&gt;// or&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;logMe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token function&#34;&gt;setTimeout&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;Who:&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;name&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;token number&#34;&gt;500&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token function&#34;&gt;logMe&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;call&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token literal-property property&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;Jim&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Template Strings&lt;/h4&gt;
&lt;p&gt;Yay! No more errors in your string templates! From MDN:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Template strings are enclosed by the back-tick (``) (grave accent) character instead of double or single quotes. Template strings can contain place holders. These are indicated by the Dollar sign and curly braces (${expression}). The expressions in the place holders and the text between them get passed to a function. The default function just concatenates the parts into a single string. If there is an expression preceding the template string (tag here),  the template string is called &amp;quot;tagged template string&amp;quot;. In that case, the tag expression (usually a function) gets called with the processed template string, which you can then manipulate before outputting.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;There is so much to learn about this but we are just going to cover the very basics just like we did before.
Here is how we are going to use our &lt;code&gt;logMe()&lt;/code&gt; with the new shiny string templates.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// The old way&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;logMe&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;what&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; name&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; text &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; what &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39; &#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; name&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;text&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

    &lt;span class=&#34;token comment&#34;&gt;// The New way&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;logMe&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;what&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; name&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; text &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;what&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;name&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;text&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token comment&#34;&gt;// or even in a crazy ugly multiline string&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;logMe&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;what&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; name&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; text &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;I just wanted to
         say &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;what&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; to my friend
                    &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;name&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;text&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Modules&lt;/h4&gt;
&lt;p&gt;Last but not least, the modules. At last in ES6 we can create and use our modules in separate files and import them without any third party libraries. And this is what this post is about, building a simple module. But let&#39;s cover the basics.&lt;/p&gt;
&lt;p&gt;In ES6 we can use &lt;code&gt;export&lt;/code&gt; and have one &lt;code&gt;default&lt;/code&gt; export for a function or a class per module, or use &lt;code&gt;named exports&lt;/code&gt; to export as many functions as we want per module.
We are going to use two .js files, our module file called myLogModule.js and our main.js to import our module.&lt;/p&gt;
&lt;p&gt;This is an example with a default export. This can be a function or a class.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// myLogModule.js&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;default&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;This is from myLogModule and it says &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;text&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token comment&#34;&gt;// main.js&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; whateverNameYouWant &lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;./myLogModule&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token function&#34;&gt;whateverNameYouWant&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;hello&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If we were going to use named exports this is what we were going to do.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// myLogModule.js&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;saySomething&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;This is from myLogModule and it says &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;text&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;saySomethingElse&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;This is something else &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;text&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;


    &lt;span class=&#34;token comment&#34;&gt;// main.js&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;as&lt;/span&gt; myLogModule &lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;./myLogModule&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    myLogModule&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;saySomething&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;hellooooo&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    myLogModule&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;saySomethingElse&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;hello again&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or we can always import a specific function in our main.js&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// main.js&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;saySomething&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;./myLogModule&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token function&#34;&gt;saySomething&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;hellooooo&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or more than one&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// main.js&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;saySomething&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; saySomethingElse&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;./myLogModule&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token function&#34;&gt;saySomething&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;hellooooo&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token function&#34;&gt;saySomethingElse&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;hello again&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;s a very (really) rough explaination of these features, but I am sure these are enought to continue with our own module.&lt;/p&gt;
&lt;h3&gt;Our Module&lt;/h3&gt;
&lt;p&gt;As I said before we are going to create our own module to see a more &#39;complex&#39; situation. The script we are going to use is this and all it does is search the dom for elements with a &lt;code&gt;.js-share-button&lt;/code&gt; class and add a click event listener to each element that opens a window with a share url for facebook or twitter.&lt;/p&gt;
&lt;p&gt;This is the script in &#39;traditional&#39; javascript:&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token function-variable function&#34;&gt;shareButtons&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;token comment&#34;&gt;// Select all our buttons with the js-share-button class&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; shareButtons &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;.js-share-button&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;init&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token function&#34;&gt;add_listeners_to_buttons&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;window_open&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    window&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;url&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=500,height=300&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;add_listeners_to_buttons&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

    &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; shareButtons&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

      &lt;span class=&#34;token comment&#34;&gt;// Add a click handler to each of our buttons&lt;/span&gt;
      shareButtons&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;i&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;click&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        e&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;preventDefault&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;// Get the service from the data attribute&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; service &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;data-service&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;// Gets the href from our link (Good for ajax)&lt;/span&gt;
            page_url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;href&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;// Check which service we want and attach the right url.&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;// window.location give the current url.&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;//&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;// IMPORTANT! Always remember we need to encode our urls&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;//            and variables we are sending.&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;service&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;facebook&#39;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            url&lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;https://www.facebook.com/sharer/sharer.php?u=&#39;&lt;/span&gt;
               &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; page_url&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;twitter&#39;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            url&lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;https://twitter.com/intent/tweet/?text=&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;title&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            url&lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;&amp;amp;url=&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; page_url&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;There is no such share service in your `switch`!&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

        &lt;span class=&#34;token function&#34;&gt;window_open&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;url&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token comment&#34;&gt;// Return to the user only the init function&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token literal-property property&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;init&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token comment&#34;&gt;// Just call this function to initiate everything.&lt;/span&gt;
shareButtons&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What we need to create is a main.js file as we had in our examples before, and a ShareButtons.js file with our module and begin by writing the functions we are going to use in our module.&lt;/p&gt;
&lt;h4&gt;ShareButtons.js&lt;/h4&gt;
&lt;p&gt;We can use let instead of var for everything without getting and error. This was a trial and error to for me. Every traditional function code is replaced with arrow functions. This module still reveals only the init function to the user.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;shareButtons&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;// Select all our buttons with the js-share-button class&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; shareButtons &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;.js-share-button&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;// There are no parameters, so a parenthesis is ok here.&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;init&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;//  No need for a parenthesis here we got one parameter&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;window_open&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token parameter&#34;&gt;url&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;add_listeners_to_buttons&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;// Return to the user only the init function&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token literal-property property&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;init&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nothing else is changed in our &lt;code&gt;init&lt;/code&gt; or &lt;code&gt;window_open&lt;/code&gt; function&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;init&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token function&#34;&gt;add_listeners_to_buttons&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;window_open&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token parameter&#34;&gt;url&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    window&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;url&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=500,height=300&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The most interesting parts are in the &lt;code&gt;add_listeners_to_buttons&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;First of all instead of using a &lt;code&gt;for(var i=....)&lt;/code&gt; function we used the new ES6 &lt;code&gt;for...of&lt;/code&gt; to iterate through our array of elements. Then we replaced our traditional string concatenation with the new ES6 string templates as we did in our examples before. That was easy and fun, I must say!&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;add_listeners_to_buttons&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

    &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; button &lt;span class=&#34;token keyword&#34;&gt;of&lt;/span&gt; shareButtons&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;click&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token parameter&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        e&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;preventDefault&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; service &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;data-service&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            title &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;title&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            page_url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;href&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token keyword&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;service&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;facebook&#39;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;https://www.facebook.com/sharer/sharer.php?u=&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;page_url&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;twitter&#39;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;https://twitter.com/intent/tweet/?text=&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;title&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&amp;amp;url=&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;page_url&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;There is no &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;service&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; share service in your &#39;switch&#39;!&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

        &lt;span class=&#34;token function&#34;&gt;window_open&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;url&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And now the evil event listener with arrow function and &lt;code&gt;this&lt;/code&gt;!&lt;/p&gt;
&lt;p&gt;First I tried using &lt;code&gt;this.getAttribute()&lt;/code&gt; and never worked. Of course it never worked, it returned undefined, because &lt;code&gt;this&lt;/code&gt; doesn&#39;t refer to the dom element but to some parent function.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;click&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token parameter&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        e&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;preventDefault&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; service &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;data-service&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            title &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;title&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            page_url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;href&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token operator&#34;&gt;...&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After some research(google it) and some experemental time I came to the conclusion that I could either use a traditional &lt;code&gt;function(e) {}&lt;/code&gt; to get &lt;code&gt;this&lt;/code&gt; to work or (the experemental time we talked about) use the button variable that keeps the dom element. I wasn&#39;t sure this would work but there was no error and the buttons worked whithout a problem. Up to this time I &#39;m sure there is a way to make arrow functions and &lt;code&gt;this&lt;/code&gt; work inside an event listener but I don&#39;t know it.&lt;/p&gt;
&lt;p&gt;Another conceptual &#39;problem&#39; I faced was the &amp;quot;What I am going to export? The main function? The init? What I am talking about? I just want to give the init to the user will the function export expose the other functions too?&amp;quot; and other fun things like these. At the end, it was easy, I needed to export the &lt;code&gt;ShareButtons&lt;/code&gt; function and expose only the &lt;code&gt;init()&lt;/code&gt; like I did before. Nothing else will be visible to the user.&lt;/p&gt;
&lt;p&gt;So to export our module we add to the end of our ShareButtons.js file &lt;code&gt;export default shareButtons;&lt;/code&gt;. And that&#39;s all for our module. It&#39;s ready. I know this wasn&#39;t difficult but if you create it from scratch you are going to face some problems - or not. I did :).&lt;/p&gt;
&lt;p&gt;Remember, we could make this a class or we could separate our &lt;code&gt;window_open&lt;/code&gt; to another module and use it in our module to make things more interesting.&lt;/p&gt;
&lt;p&gt;So, this is our complete module:&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;shareButtons&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;token comment&#34;&gt;// Select all our buttons with the js-share-button class&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; shareButtons &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;.js-share-button&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;init&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token function&#34;&gt;add_listeners_to_buttons&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token comment&#34;&gt;//  No need for a parenthesis here we got one parameter&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;window_open&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token parameter&#34;&gt;url&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    window&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;url&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=500,height=300&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;add_listeners_to_buttons&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

    &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; button &lt;span class=&#34;token keyword&#34;&gt;of&lt;/span&gt; shareButtons&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token comment&#34;&gt;/*
        We cannot use an arrow function because `this` will return `undefined`.
        So, we are using the button variable to have the preferred functionality.
      */&lt;/span&gt;
      button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;click&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token parameter&#34;&gt;e&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        e&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;preventDefault&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token keyword&#34;&gt;let&lt;/span&gt; service &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;data-service&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            title &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;title&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            page_url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;button&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;href&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token keyword&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;service&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;facebook&#39;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;https://www.facebook.com/sharer/sharer.php?u=&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;page_url&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;twitter&#39;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;https://twitter.com/intent/tweet/?text=&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;title&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&amp;amp;url=&lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;page_url&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token template-string&#34;&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;There is no &lt;/span&gt;&lt;span class=&#34;token interpolation&#34;&gt;&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;${&lt;/span&gt;service&lt;span class=&#34;token interpolation-punctuation punctuation&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt; share service in your &#39;switch&#39;!&lt;/span&gt;&lt;span class=&#34;token template-punctuation string&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

        &lt;span class=&#34;token function&#34;&gt;window_open&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;url&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token comment&#34;&gt;// Return to the user only the init function&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token literal-property property&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;init&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;export&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;default&lt;/span&gt; shareButtons&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;main.js&lt;/h4&gt;
&lt;p&gt;For our main.js file things are much easier. We just import our module as we did before and call the init function.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;import&lt;/span&gt; ShareButtons &lt;span class=&#34;token keyword&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;./ShareButtons&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

ShareButtons&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;The code&lt;/h3&gt;
&lt;p&gt;You can try this code by downloading &lt;a href=&#34;https://github.com/codegaze/es6-module-codegaze-blog-post-code&#34;&gt;this&lt;/a&gt; repository from my github account.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Well, this was a big and fun post, at least for me.&lt;/p&gt;
&lt;p&gt;As I said before, ES6 is new to me and I &#39;m sure there are some errors in my concept or the code and it would be great if someone has any comment on this to make it better.
Cheers!&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Create Custom Domains for Development in XAMPP</title>
   <link href="https://codegazerants.com/2015/12/12/custom-domains-in-xampp-in-development/"/>
   <updated>2015-12-12T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/12/12/custom-domains-in-xampp-in-development/"><![CDATA[
    &lt;p&gt;If you are developing sites the you &#39;ve come to a place where you are furstrated with constantly having to change things when you move to production such as changing urls to get the thing work. We spent three hours of our lives with a friend of mine to reconfigure a Wordpress site from a XAMPP server to production server. Another example I can think of is the Laravel&#39;s public folder, I don&#39;t want to go to &lt;code&gt;localhost/site/public&lt;/code&gt; each time, a &lt;a href=&#34;http://mywebsite.com&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;mywebsite.com&lt;/a&gt; would be fine.&lt;/p&gt;
&lt;p&gt;The best thing you could do is configure your local setup as your production server. To do this we need to edit our hosts file and our httpd-vhosts.conf file.&lt;/p&gt;
&lt;h2&gt;Hosts File&lt;/h2&gt;
&lt;p&gt;Just go to your &lt;code&gt;C:\Windows\System32\drivers\etc&lt;/code&gt;, edit(as administrator) your hosts file and add your preffered domain. For this example I used &lt;code&gt;yourdomain.io&lt;/code&gt;. Remember, my driver is &#39;C:&#39;, yours might be something else.&lt;/p&gt;
&lt;p&gt;When you do this open your command and type &lt;code&gt;ipconfig /flushdns&lt;/code&gt; to flush your local dns settings.&lt;/p&gt;
&lt;pre class=&#34;language-html&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a &#39;#&#39; symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
# 127.0.0.1       localhost
# ::1             localhost
127.0.0.1      yourdomain.io&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By doing this you can access any site in your local development by using &lt;a href=&#34;http://yourdomain.io/site&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;yourdomain.io/site&lt;/a&gt; but this isn&#39;t enough. We must configure something in our apache server to be more specific.&lt;/p&gt;
&lt;h2&gt;httpd-vhosts.conf File&lt;/h2&gt;
&lt;p&gt;Navigate to &#39;your XAMPP install folder\apache\conf\extra&#39;, for me is &#39;C:\xampp\apache\conf\extra&#39; and edit your &lt;code&gt;httpd-vhosts.conf&lt;/code&gt; file. Just copy/paste one of the example in this file and use the ones you want. Remember to uncomment each line by removing the &#39;##&#39; before the line and we are set to go!&lt;/p&gt;
&lt;pre class=&#34;language-html&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;# Virtual Hosts
#
# Required modules: mod_log_config

# If you want to maintain multiple domains/hostnames on your
# machine you can setup VirtualHost containers for them. Most configurations
# use only name-based virtual hosts so the server doesn&#39;t need to worry about
# IP addresses. This is indicated by the asterisks in the directives below.
#
# Please see the documentation at
# &amp;lt;URL:http://httpd.apache.org/docs/2.4/vhosts/&gt;
# for further details before you try to setup virtual hosts.
#
# You may use the command line option &#39;-S&#39; to verify your virtual host
# configuration.

#
# Use name-based virtual hosting.
#
##NameVirtualHost *:80
#
# VirtualHost example:
# Almost any Apache directive may go into a VirtualHost container.
# The first VirtualHost section is used for all requests that do not
# match a ##ServerName or ##ServerAlias in any &lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;VirtualHost&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt; block.
#
##&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;VirtualHost&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;&lt;span class=&#34;token namespace&#34;&gt;*:&lt;/span&gt;80&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    ##ServerAdmin webmaster@dummy-host.example.com
    ##DocumentRoot &#34;C:/xampp/htdocs/dummy-host.example.com&#34;
    ##ServerName dummy-host.example.com
    ##ServerAlias www.dummy-host.example.com
    ##ErrorLog &#34;logs/dummy-host.example.com-error.log&#34;
    ##CustomLog &#34;logs/dummy-host.example.com-access.log&#34; common
##&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;VirtualHost&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

##&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;VirtualHost&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;&lt;span class=&#34;token namespace&#34;&gt;*:&lt;/span&gt;80&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    ##ServerAdmin webmaster@dummy-host2.example.com
    ##DocumentRoot &#34;C:/xampp/htdocs/dummy-host2.example.com&#34;
    ##ServerName dummy-host2.example.com
    ##ErrorLog &#34;logs/dummy-host2.example.com-error.log&#34;
    ##CustomLog &#34;logs/dummy-host2.example.com-access.log&#34; common
##&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;VirtualHost&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;VirtualHost&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;&lt;span class=&#34;token namespace&#34;&gt;*:&lt;/span&gt;80&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
    ServerAdmin something@yourdomain.io
    DocumentRoot &#34;C:/xampp/htdocs/yoursite&#34;
    ServerName yourdomain.io
    ServerAlias www.yourdomain.io
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;VirtualHost&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Just in case start and stop your apache service. Next thing you got to do is navigate to your url by typing &lt;a href=&#34;http://www.yourdomain.io&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;www.yourdomain.io&lt;/a&gt; in your browser.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Share Buttons Performance Issues</title>
   <link href="https://codegazerants.com/2015/11/24/share-buttons-performance/"/>
   <updated>2015-11-24T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/11/24/share-buttons-performance/"><![CDATA[
    &lt;p&gt;Last week we had a series of interviews with a number of candidates for a junior frontend developer position and at the end of each session we gave them a &amp;quot;code challenge&amp;quot; to complete in their spare time, only if they wanted to. Nothing special, just a simple responsive prototype so as to take a peak at the quality of their code.&lt;/p&gt;
&lt;p&gt;One thing we had in this prototype was a Facebook share button to see how they could deal with it. There was no restriction to it, they could use any library, service or code snippet they could think of.&lt;/p&gt;
&lt;p&gt;Almost a &lt;strong&gt;40%&lt;/strong&gt; of the candidates &lt;strong&gt;used a simple link&lt;/strong&gt; which redirected you to a facebook share page, a &lt;strong&gt;30% used a third party&lt;/strong&gt; library and a &lt;strong&gt;30% used Facebook&#39;s default share button&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The first thing that comes to my mind is: Don&#39;t use social network&#39;s share buttons, it&#39;s bad for the page&#39;s performance.&lt;/p&gt;
&lt;p&gt;There is always a simple solution to this. With some lines of code you can share your content without loading all these resources that come with the official share buttons.&lt;/p&gt;
&lt;p&gt;I know this subject has been covered by many people but here is an example for facebook and twitter share buttons without messing with external libraries.&lt;/p&gt;
&lt;h2&gt;Code&lt;/h2&gt;
&lt;p&gt;Here is the HTML code for the buttons. We are just creating simple links. We use the &lt;code&gt;js-share-button&lt;/code&gt; class in our script to select all the share buttons. And the &lt;code&gt;data-service&lt;/code&gt; attribute gives us the services we are going to use.&lt;/p&gt;
&lt;pre class=&#34;language-html&#34;&gt;&lt;code class=&#34;language-html&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;https://codegazerants.com/2015/11/24/share-buttons-performance/&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;share__button facebook js-share-button&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;data-service&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;facebook&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Share on Facebook&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;&lt;/span&gt;a&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;href&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;https://codegazerants.com/2015/11/24/share-buttons-performance/&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;share__button twitter js-share-button&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;data-service&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;twitter&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token attr-name&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;token attr-value&#34;&gt;&lt;span class=&#34;token punctuation attr-equals&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;Share Buttons Performance Issues and how to deal with them - @codegaze&lt;span class=&#34;token punctuation&#34;&gt;&#34;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Share on Twitter&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token tag&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;&amp;lt;/&lt;/span&gt;a&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the javascript code for it with some comments to explain what&#39;s going on.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;script&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;

  &lt;span class=&#34;token comment&#34;&gt;// Select all our buttons with the js-share-button class&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; shareButtons &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;.js-share-button&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;


  &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; shareButtons&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

    &lt;span class=&#34;token comment&#34;&gt;// Add a click handler to each of our buttons&lt;/span&gt;
    shareButtons&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;i&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;click&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      e&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;preventDefault&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

      &lt;span class=&#34;token comment&#34;&gt;// Get the service from the data attribute&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; service &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;data-service&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
          url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

      &lt;span class=&#34;token comment&#34;&gt;// Check which service we want and attach the right url.&lt;/span&gt;
      &lt;span class=&#34;token comment&#34;&gt;// window.location give the current url.&lt;/span&gt;
      &lt;span class=&#34;token comment&#34;&gt;//&lt;/span&gt;
      &lt;span class=&#34;token comment&#34;&gt;// IMPORTANT! Always remember we need to encode our urls&lt;/span&gt;
      &lt;span class=&#34;token comment&#34;&gt;//            and variables we are sending.&lt;/span&gt;
      &lt;span class=&#34;token keyword&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;service&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;facebook&#39;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
          url&lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;https://www.facebook.com/sharer/sharer.php?u=&#39;&lt;/span&gt;
             &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;window&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;location&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;twitter&#39;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
          url&lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;https://twitter.com/intent/tweet/?text=&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;title&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          url&lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;&amp;amp;url=&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;window&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;location&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
          console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;There is no such share service in your `switch`!&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

      window&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;url&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=500,height=300&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;script&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Update 12/12/2015&lt;/h2&gt;
&lt;p&gt;I wanted to create a module for this script so I can use it to ajax elements too.
This could be better, for example the &lt;code&gt;window_open&lt;/code&gt; function could be in another module with global small utilities but this is good for now. The only difference for the user is that the URL comes from the link and not from the current page. This is great when you got an ajax list you want to share each item.&lt;/p&gt;
&lt;p&gt;Just use &lt;code&gt;shareButtons.init();&lt;/code&gt; when you want to parse the DOM.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;script&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;

&lt;span class=&#34;token function-variable function&#34;&gt;shareButtons&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;token comment&#34;&gt;// Select all our buttons with the js-share-button class&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; shareButtons &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;querySelectorAll&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;.js-share-button&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;init&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token function&#34;&gt;add_listeners_to_buttons&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;window_open&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    window&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;url&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=500,height=300&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; &lt;span class=&#34;token function-variable function&#34;&gt;add_listeners_to_buttons&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

    &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; shareButtons&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

      &lt;span class=&#34;token comment&#34;&gt;// Add a click handler to each of our buttons&lt;/span&gt;
      shareButtons&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;i&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;click&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        e&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;preventDefault&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;// Get the service from the data attribute&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; service &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getAttribute&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;data-service&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;// Gets the href from our link (Good for ajax)&lt;/span&gt;
            page_url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;href&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
            url &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        &lt;span class=&#34;token comment&#34;&gt;// Check which service we want and attach the right url.&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;// window.location give the current url.&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;//&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;// IMPORTANT! Always remember we need to encode our urls&lt;/span&gt;
        &lt;span class=&#34;token comment&#34;&gt;//            and variables we are sending.&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;service&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;facebook&#39;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            url&lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;https://www.facebook.com/sharer/sharer.php?u=&#39;&lt;/span&gt;
               &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; page_url&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;twitter&#39;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            url&lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;https://twitter.com/intent/tweet/?text=&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;encodeURIComponent&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;title&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            url&lt;span class=&#34;token operator&#34;&gt;+=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;&amp;amp;url=&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; page_url&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token keyword&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
            console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;There is no such share service in your `switch`!&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
            &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

        &lt;span class=&#34;token function&#34;&gt;window_open&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;url&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token comment&#34;&gt;// Return to the user only the init function&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token literal-property property&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;init&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token comment&#34;&gt;// Just call this function to initiate everything.&lt;/span&gt;
shareButtons&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;init&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;script&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;p&gt;You  can check the demo of these buttons, will give you a share to the current page url.&lt;/p&gt;
&lt;div class=&#34;has-centered&#34;&gt;
  &lt;a href=&#34;https://codegazerants.com/2015/11/24/share-buttons-performance/&#34; class=&#34;share__button facebook js-share-button&#34; data-service=&#34;facebook&#34;&gt;Share on Facebook&lt;/a&gt;
  &lt;a href=&#34;https://codegazerants.com/2015/11/24/share-buttons-performance/&#34; class=&#34;share__button twitter js-share-button&#34; data-service=&#34;twitter&#34; title=&#34;Share Buttons Performance Issues and how to deal with them - @codegaze&#34;&gt;Share on Twitter&lt;/a&gt;
&lt;/div&gt;
&lt;script&gt;

shareButtons = function(){

  // Select all our buttons with the js-share-button class
  var shareButtons = document.querySelectorAll(&#39;.js-share-button&#39;);

  var init = function(){
    add_listeners_to_buttons();
  };

  var window_open = function(url){
    window.open(url, &#39;&#39;, &#39;menubar=no,toolbar=no,resizable=yes,scrollbars=yes,width=500,height=300&#39;);
  }

  var add_listeners_to_buttons = function(){

    for (var i = 0; i &lt; shareButtons.length; i++) {

      // Add a click handler to each of our buttons
      shareButtons[i].addEventListener(&#39;click&#39;, function(e) {
        e.preventDefault();

        // Get the service from the data attribute
        var service = this.getAttribute(&#39;data-service&#39;),

        // Gets the href from our link (Good for ajax)
            page_url = encodeURIComponent(this.href),
            url = &#39;&#39;;

        // Check which service we want and attach the right url.
        // window.location give the current url.
        //
        // IMPORTANT! Always remember we need to encode our urls
        //            and variables we are sending.
        switch (service) {
          case &#39;facebook&#39;:
            url+= &#39;https://www.facebook.com/sharer/sharer.php?u=&#39;
               + page_url;
            break;
          case &#39;twitter&#39;:
            url+=&#39;https://twitter.com/intent/tweet/?text=&#39; + encodeURIComponent(this.title);
            url+=&#39;&amp;url=&#39; + page_url;
            break;
          default:
            console.log(&#39;There is no such share service in your `switch`!&#39;);
            break;
        }

        window_open(url);
      });
    }
  };

  // Return to the user only the init function
  return{init:init}
}();

// Just call this function to initiate everything.
shareButtons.init();

&lt;/script&gt;
&lt;style&gt;

  a.share__button{
    padding: 20px;
    margin: 20px;
    display: inline-block;
    color: #fff;
  }
  a.share__button:hover {
    opacity: .6;
  }
  .facebook {
    background: #47639E;
  }

  .twitter {
    background: #55ACEE;
  }
  .has-centered {
    text-align: center;
  }
&lt;/style&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Modern Workflow + Tooling for Front-end Developers</title>
   <link href="https://codegazerants.com/2015/11/13/modern-workflow-tools/"/>
   <updated>2015-11-13T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/11/13/modern-workflow-tools/"><![CDATA[
    &lt;p&gt;Wes Bos at Fronteers Conference 2015 gives a short presentation for each of the modern workflow tools front-end developers are using right now and a bonus talk with Bruce Lawson asking people&#39;s questions.&lt;/p&gt;
&lt;div class=&#34;video-fluid-wrapper&#34;&gt;
  &lt;iframe src=&#34;https://player.vimeo.com/video/145138873&#34; width=&#34;500&#34; height=&#34;281&#34; frameborder=&#34;0&#34; webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt; &lt;p&gt;&lt;a href=&#34;https://vimeo.com/145138873&#34;&gt;Wes Bos - Modern Workflow + Tooling for Front-end Developers&lt;/a&gt; from &lt;a href=&#34;https://vimeo.com/fronteers&#34;&gt;Fronteers&lt;/a&gt; on &lt;a href=&#34;https://vimeo.com&#34;&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Responsive Rounded Buttons</title>
   <link href="https://codegazerants.com/2015/10/30/responsive-css-rounded-buttons/"/>
   <updated>2015-10-30T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/10/30/responsive-css-rounded-buttons/"><![CDATA[
    &lt;p&gt;Last week I wanted to create three rounded buttons for a client&#39;s site.&lt;/p&gt;
&lt;p&gt;I didn&#39;t keep it in the design but here is some code and explaination of how this is done for responsive cases.&lt;/p&gt;
&lt;p&gt;First of all our button needs to have a wrapper with a width. For our example we are going to use a list.&lt;/p&gt;
&lt;pre class=&#34;language-css&#34;&gt;&lt;code class=&#34;language-css&#34;&gt;&lt;span class=&#34;token selector&#34;&gt;li&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 15%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; inline-block&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now, each button needs to have 100% width and magic trick number 1: we give a zero height and a &lt;code&gt;padding-bottom: 100%&lt;/code&gt; to resize the height fluidly. And &lt;code&gt;overflow: hidden&lt;/code&gt; to hide the remaining color of the link.&lt;/p&gt;
&lt;pre class=&#34;language-css&#34;&gt;&lt;code class=&#34;language-css&#34;&gt;&lt;span class=&#34;token selector&#34;&gt;.button&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 100%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;height&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 0&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;padding-bottom&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 100%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;border-radius&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 50%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;overflow&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; hidden&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For the next part, our link needs to have &lt;code&gt;padding-top: 50%;&lt;/code&gt; &amp;amp; &lt;code&gt;padding-bottom: 50%;&lt;/code&gt; to be in the &amp;quot;middle&amp;quot; of the link and a &lt;code&gt;margin-top&lt;/code&gt; half the size of the &lt;code&gt;line-height&lt;/code&gt; to create an &amp;quot;absolute middle&amp;quot;. It&#39;s the same logic with absolute centering things.&lt;/p&gt;
&lt;pre class=&#34;language-css&#34;&gt;&lt;code class=&#34;language-css&#34;&gt;&lt;span class=&#34;token selector&#34;&gt;.button__link&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;border&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 1px solid red&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; block&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 100%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;padding-top&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 50%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;padding-bottom&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 50%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; center&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; #fff&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;text-decoration&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; none&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;line-height&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 2em&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 2em&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;margin-top&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; -1em&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; #E9C46A&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is a demo of what we created and the sass code for it.&lt;/p&gt;
&lt;ul class=&#34;demo--buttons&#34;&gt;
  &lt;li&gt;
    &lt;div class=&#34;button&#34;&gt;
      &lt;a href=&#34;#&#34; class=&#34;button__link&#34;&gt;About&lt;/a&gt;
    &lt;/div&gt;
  &lt;/li&gt;&lt;li&gt;
    &lt;div class=&#34;button&#34;&gt;
      &lt;a href=&#34;#&#34; class=&#34;button__link&#34;&gt;Home&lt;/a&gt;
    &lt;/div&gt;
  &lt;/li&gt;&lt;li&gt;
    &lt;div class=&#34;button&#34;&gt;
      &lt;a href=&#34;#&#34; class=&#34;button__link&#34;&gt;Contact&lt;/a&gt;
    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&#34;language-css&#34;&gt;&lt;code class=&#34;language-css&#34;&gt;&lt;span class=&#34;token selector&#34;&gt;li&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 15%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; inline-block&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;token selector&#34;&gt;.button&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 100%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;height&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 0&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;padding-bottom&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 100%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;border-radius&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 50%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token property&#34;&gt;overflow&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; hidden&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

  &lt;span class=&#34;token selector&#34;&gt;&amp;amp;__link&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;border&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 1px solid red&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;display&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; block&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 100%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;padding-top&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 50%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;padding-bottom&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 50%&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;text-align&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; center&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;color&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; #fff&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;text-decoration&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; none&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;line-height&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 2em&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;font-size&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 2em&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;margin-top&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; -1em&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token property&#34;&gt;background&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; #E9C46A&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;s all you need to know to work with rounded buttons. Below there is a new &amp;quot;section&amp;quot; you can check out about status when I write each post.&lt;/p&gt;
&lt;p&gt;Maybe it works for you too &lt;strong&gt;:)&lt;/strong&gt;.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>A Modal Alternative Proposal</title>
   <link href="https://codegazerants.com/2015/10/19/a-modal-alternative/"/>
   <updated>2015-10-19T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/10/19/a-modal-alternative/"><![CDATA[
    &lt;p&gt;When I saw modals some years ago, I thought it was one of the best things happened. Just use a plugin and show your important stuff to the user and you are ready to go. Things changed since then and plugins went bigger and better, but I think we are using tooooo many resources and third party libraries and we need to stop.&lt;/p&gt;
&lt;p&gt;In my projects I usually use a modal either to show a new feature (announcement) to the user or in a photo gallery or something like this. I am ok with the latter - although there is always another solution - but when it comes to the first we can always choose a more lightweight and simplified way.&lt;/p&gt;
&lt;p&gt;Here is what I am proposing (live &lt;a href=&#34;https://codegaze.github.io/demos/modal_alternative/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;demo&lt;/a&gt;):&lt;/p&gt;
&lt;figure&gt;
  &lt;a href=&#34;/public/example_big.png&#34;&gt;&lt;img src=&#34;/public/example_big.png&#34; border=&#34;0&#34; alt=&#34;Example 1&#34;&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;p&gt;Add your big announcement in your content. Use just a small script to close your &amp;quot;modal&amp;quot;. No more big chunks of js and css.&lt;/p&gt;
&lt;p&gt;With this solution the user has three options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ignore it.&lt;/li&gt;
&lt;li&gt;Close it.&lt;/li&gt;
&lt;li&gt;Click it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Please, don&#39;t auto close your message.
If the user ignores it and continues to read your content it will be annoying to remove it while he reads something.&lt;/p&gt;
&lt;p&gt;And if someone clicks the close button, give that person a cookie for a while. He clicked it for a reason.&lt;/p&gt;
&lt;p&gt;Here is the small script I talked about before:&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;closeModulePromo&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; module_element &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;module_promo&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  module_element&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;parentElement&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;removeChild&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;module_element&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; module_close_handler &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;module_promo_close&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

module_close_handler&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function-variable function&#34;&gt;onclick&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token function&#34;&gt;closeModulePromo&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Notes:&lt;/strong&gt;&lt;br&gt;
In my &lt;a href=&#34;https://codegaze.github.io/demos/modal_alternative/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;demo&lt;/a&gt; I don&#39;t use a cookie.&lt;br&gt;
I used a &lt;a href=&#34;https://www.initializr.com/&#34;&gt;https://www.initializr.com/&lt;/a&gt; boilerplate for the demo.&lt;br&gt;
Maybe I&#39;ll do another part about an image gallery version.&lt;/p&gt;
&lt;p&gt;If you have any questions or reccomendations, feel free to comment.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Better UX for Users With Ad Blockers</title>
   <link href="https://codegazerants.com/2015/10/17/better-ux-with-ad-block-checker/"/>
   <updated>2015-10-17T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/10/17/better-ux-with-ad-block-checker/"><![CDATA[
    &lt;p&gt;Let me start by saying that preventing people from using your content if they use an ad blocker is unethical. All this fuzz about ad blockers and no one says that ad blockers may block a site feature too.&lt;/p&gt;
&lt;h2&gt;The problem&lt;/h2&gt;
&lt;p&gt;Some time ago I built a site for a client  which had an iframe with a third party service for booking tickets. We were getting complains from users that couldn&#39;t see the widget.&lt;/p&gt;
&lt;p&gt;After some research we found out that these users had an ad blocker enabled, and we needed to find a way, not to bypass this but inform our users that they are missing a service.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I repeat&lt;/strong&gt;: Please use this to provide to your user a better experience.&lt;/p&gt;
&lt;h2&gt;The solution&lt;/h2&gt;
&lt;p&gt;Usually ad blockers remove the content they think it&#39;s an add and put some inline styling to remove any unwanted white space. So what we need to do is check for any &amp;quot;suspicious&amp;quot; styling in our widget.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;checkAdBlocker&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;iframe_id&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; error_message_id&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

    &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; iframe_element &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;iframe_id&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
        error_meesage_element &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;error_message_id&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;iframe_element&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;style&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;height &lt;span class=&#34;token operator&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;||&lt;/span&gt; iframe_element&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;style&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;display &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;none&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      error_meesage_element&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;classList&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;remove&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;hidden&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This script checks our widget height and display status and if its hidden or has 0 height then it removes the hidden class from our beautiful message element explaining the situation. The two arguments needed here are the iframe and error message id.&lt;/p&gt;
&lt;p&gt;What we need to do next is set a &lt;code&gt;setTimeout&lt;/code&gt; function with a delay we think it&#39;s adequate to have our page ready.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token function&#34;&gt;setTimeout&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;checkAdBlocker&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;fake_service&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;error_msg&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here is a &lt;a href=&#34;https://codegazerants.com/demos/adblock/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;demo&lt;/a&gt; you can check it&#39;s functionality. If you have an add blocker enabled you will see a message, if not you will see an iframe with a &lt;code&gt;This is a fake 3d party iframe!&lt;/code&gt; text.&lt;/p&gt;
&lt;p&gt;This script isn&#39;t a solid solution but works for most cases. Is just a first step to help your user not miss a feature in your site, but use it carefully.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Browser History API</title>
   <link href="https://codegazerants.com/2015/10/05/keep-your-form-filters-with-history/"/>
   <updated>2015-10-05T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/10/05/keep-your-form-filters-with-history/"><![CDATA[
    &lt;p&gt;This is a simple tutorial about using browsers&#39; history API to keep your form selections.
Imagine you have a form that filters some posts with ajax. If the user goes to one of those links without opening to another tab, all the filters are going to disappear if he comes back.&lt;/p&gt;
&lt;p&gt;This can be easily bypassed with the use of browser history API.&lt;/p&gt;
&lt;h2&gt;Back to the future I&lt;/h2&gt;
&lt;p&gt;We &#39;ve all used the &lt;code&gt;history.back()&lt;/code&gt; back in the old days (and in this example too) to go back to a previous page.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;It was awful! Don&#39;t do it&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you don&#39;t have your own controlled environment e.g a mobile app, you don&#39;t know what was the previous page.&lt;/p&gt;
&lt;h2&gt;Back to the future II&lt;/h2&gt;
&lt;p&gt;Nowadays we have &lt;code&gt;history.pushState();&lt;/code&gt; that adds a state to the browser history.&lt;/p&gt;
&lt;p&gt;This method has three parameters. The state object, the state description and the state url.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;State Object: Here you can store an object with things you want to retrieve from this state. A title, some html content and other things tou consider useful. For example, you can store a protion of data to show to the user when he comes back and the retrieve the rest. &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/API/History/pushState&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;MDN&lt;/a&gt; proposal is a size limit of 640k characters on the serialized representation of a state object.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;State Description: You can add a description to your state.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your state url: This is optional. This changes/is appended to the current url without reloading the page. But if you go to another url and then come back this will be in your url.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I didn&#39;t explained all the parameters in depth because we are only going to use the last parameter, the state url.&lt;/p&gt;
&lt;p&gt;What we want to do is pass all our form parameters to our url and when we come back we will get these parameters to fill our form.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://codegaze.github.io/demos/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Here&lt;/a&gt; is a live example of what we are going to do.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// Get our elements by id&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; selectBox &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;select_value&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;
        textBox &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;text_value&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token comment&#34;&gt;/*
       With every value change in our elements
       we serialize our form (I was to lazy to create a serialize
       function so I used jquery) and send it to the function
       setBrowserHistory();
    */&lt;/span&gt;

    textBox&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function-variable function&#34;&gt;onkeyup&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token function&#34;&gt;setBrowserHistory&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;serializeForm&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

    selectBox&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function-variable function&#34;&gt;onchange&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token function&#34;&gt;setBrowserHistory&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;serializeForm&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

    &lt;span class=&#34;token comment&#34;&gt;/*
       Serialize the form with jQuery (Lazy SOB)
       as a string
    */&lt;/span&gt;

    &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;serializeForm&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
     &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;#form_to_serialize&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;serialize&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now we are going to use the history API.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;setBrowserHistory&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    history&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;pushState&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;null&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;?&#34;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;+&lt;/span&gt; url&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As I said before  we are only going to use the url parameter and null the other two.
We just pushState our url with our parameters with a &lt;code&gt;?&lt;/code&gt; in front of it and that&#39;s how magic works.&lt;/p&gt;
&lt;p&gt;If you go to another url and then hit back our parameters will be in our url.&lt;/p&gt;
&lt;p&gt;This doesn&#39;t mean our parameters will be selected in our form. This must be done with some help from your backend.
In my demo I just used a function to deserialize the url parameters to show you how it should work.&lt;/p&gt;
&lt;p&gt;I hope this was helpful to you!&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Laura Kalbag – Ethical Design @ Frontendconf Zürich</title>
   <link href="https://codegazerants.com/2015/10/04/Ethical-Design-Laura-Kalbag/"/>
   <updated>2015-10-04T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/10/04/Ethical-Design-Laura-Kalbag/"><![CDATA[
    &lt;p&gt;I always love this kind of talks about the ethical responsibilities we have.&lt;/p&gt;
&lt;p&gt;We can make a difference and leave something good behind.&lt;/p&gt;
&lt;p&gt;This is a similar talk by Mike Monteiro from Webstock &#39;13 &lt;a href=&#34;https://vimeo.com/68470326&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Vimeo link&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&#34;video-fluid-wrapper&#34;&gt;
  &lt;iframe width=&#34;560&#34; height=&#34;315&#34; src=&#34;https://www.youtube.com/embed/bzlLL_uAdkI&#34; frameborder=&#34;0&#34; allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>BEMIT CSS Based Grid Mixin</title>
   <link href="https://codegazerants.com/2015/09/30/inuit-css-based-grid-mixin/"/>
   <updated>2015-09-30T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/09/30/inuit-css-based-grid-mixin/"><![CDATA[
    &lt;p&gt;After reading &lt;a href=&#34;https://csswizardry.com/2015/08/bemit-taking-the-bem-naming-convention-a-step-further/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;this&lt;/a&gt; article from &lt;a href=&#34;https://twitter.com/csswizardry&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;@csswizardry&lt;/a&gt; about taking the BEM naming a step further I wanted to create as simple mixin to build grid classes with this pattern &lt;code&gt;u-1/3@md&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If you &#39;ve read any of Harry Roberts&#39; articles, you know that &lt;code&gt;u&lt;/code&gt; stands for utility, &lt;code&gt;1/3&lt;/code&gt; declares that this element takes one third of the available space  and &lt;code&gt;@md&lt;/code&gt; declares the breakpoint.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pros:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The CSS and HTML code is highly readable for you and your coworkers&lt;/li&gt;
&lt;li&gt;Abstraction/DRY&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CSS size&lt;/li&gt;
&lt;li&gt;Declaration of layout in the dom&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I want to say is that I am using this in a project, but this is simple prototype and it needs tuning.
I need to come up with an elegant way to add a &#39;hide this&#39; feature without having to declare it to each grid item because not everyone has the privilege to mess with the backend item loop (if there is any).&lt;/p&gt;
&lt;p&gt;This is the (current) sass code to create this kind of grid.&lt;/p&gt;
&lt;pre class=&#34;language-css&#34;&gt;&lt;code class=&#34;language-css&#34;&gt;&lt;span class=&#34;token atrule&#34;&gt;&lt;span class=&#34;token rule&#34;&gt;@mixin&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;u-grid-setup&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;$namespace&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; $width&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;token atrule&#34;&gt;&lt;span class=&#34;token rule&#34;&gt;@media&lt;/span&gt; screen &lt;span class=&#34;token keyword&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token property&#34;&gt;min-width&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; $width&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

    &lt;span class=&#34;token atrule&#34;&gt;&lt;span class=&#34;token rule&#34;&gt;@for&lt;/span&gt; $i from 1 through $max-cols&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

      // If is in the ingore list do nothing
      &lt;span class=&#34;token atrule&#34;&gt;&lt;span class=&#34;token rule&#34;&gt;@if&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;$ignore&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; $i&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
      &lt;span class=&#34;token atrule&#34;&gt;&lt;span class=&#34;token rule&#34;&gt;@else&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
        $&lt;span class=&#34;token property&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 1&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

        // Take care of the one col 100% width
        // The `\` character is used to escape characters
        &lt;span class=&#34;token atrule&#34;&gt;&lt;span class=&#34;token rule&#34;&gt;@if&lt;/span&gt; $j == 1 &lt;span class=&#34;token keyword&#34;&gt;and&lt;/span&gt; $i == 1&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
          &lt;span class=&#34;token selector&#34;&gt;.u-#&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;$j&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token selector&#34;&gt;\/#&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;$i&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token selector&#34;&gt;\@#&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;$namespace&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
              &lt;span class=&#34;token property&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;percentage&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;$j/$i&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

        // Take care of the rest
        &lt;span class=&#34;token atrule&#34;&gt;&lt;span class=&#34;token rule&#34;&gt;@while&lt;/span&gt; $j &amp;lt; $i&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
          &lt;span class=&#34;token selector&#34;&gt;.u-#&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;$j&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token selector&#34;&gt;\/#&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;$i&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token selector&#34;&gt;\@#&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;$namespace&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
              &lt;span class=&#34;token property&#34;&gt;width&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;percentage&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;$j/$i&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
          &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

          $&lt;span class=&#34;token property&#34;&gt;j&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; $j + 1
        &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

  &lt;span class=&#34;token atrule&#34;&gt;&lt;span class=&#34;token rule&#34;&gt;@for&lt;/span&gt; $i from 1 through &lt;span class=&#34;token function&#34;&gt;length&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;$versions&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token atrule&#34;&gt;&lt;span class=&#34;token rule&#34;&gt;@include&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;u-grid-setup&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;nth&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;$versions&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; $i&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;nth&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;$sizes&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; $i&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; + px &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Somewhere in our sass file we need to declare the variables we used in our mixin:&lt;/p&gt;
&lt;pre class=&#34;language-css&#34;&gt;&lt;code class=&#34;language-css&#34;&gt;// Set your breakpoints&#39; names and sizes
$&lt;span class=&#34;token property&#34;&gt;versions&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;sm&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;md&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#34;lg&#34;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
$&lt;span class=&#34;token property&#34;&gt;sizes&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 320&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; 768&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt; 1024&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

// Set breakpoint unit
$&lt;span class=&#34;token property&#34;&gt;unit&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;px&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
// Set you max columns
$&lt;span class=&#34;token property&#34;&gt;max-cols&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; 12&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

// Set columns you want to ignore separated by comma e.g 7&lt;span class=&#34;token punctuation&#34;&gt;,&lt;/span&gt;8
$&lt;span class=&#34;token property&#34;&gt;ignore&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You don&#39;t need to mess with the mixin, you can just declare you variables and compile your files.&lt;/p&gt;
&lt;p&gt;You can get a more structured code in my &lt;a href=&#34;https://github.com/codegaze/bemit-u-grid&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github repository&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you have any comments or recommendations feel free to comment here or on github.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Vanilla Javascript Selectors</title>
   <link href="https://codegazerants.com/2015/09/25/javascript-vanilla-selectors/"/>
   <updated>2015-09-25T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/09/25/javascript-vanilla-selectors/"><![CDATA[
    &lt;p&gt;Everytime I start a new project I try to evaluate my needs for javascript and decide if I am going to use any third party library or not.&lt;/p&gt;
&lt;p&gt;I am not talking about prototyping, we can use everything we want to get a prototype fast and easy, &lt;strong&gt;but what about our production code?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I know there are some lightweight javascript libraries out there but trust me, if you &#39;re just using a library to select elements then something is not right.&lt;/p&gt;
&lt;p&gt;And it&#39;s slower too!&lt;/p&gt;
&lt;p&gt;So, this is a post about using your own selectors!&lt;/p&gt;
&lt;h3&gt;Get Elements By id&lt;/h3&gt;
&lt;p&gt;This is an easy one, just call &lt;code&gt;document.getElementById(&#39;your_id&#39;);&lt;/code&gt; and you are ready to go!&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// jQuery / Zepto&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; element &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;#my_elements_id&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token comment&#34;&gt;// Vanilla JS&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; element &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;my_elements_id&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you think this is boring we can create a simple wrapper function to help our coding.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// Vanilla JS&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; element &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;getById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;my_elements_id&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;getById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;el_id&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementById&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;el_id&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Get Elements By Class&lt;/h3&gt;
&lt;p&gt;Getting elements by class is fairly easy too, but we need to write some code to iterate through the selected elements.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token comment&#34;&gt;// jQuery / Zepto&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; elements &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token function&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;.my_elements_class&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
elements&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;New Text&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token comment&#34;&gt;// Vanilla JS&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; elements &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementsByClassName&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;my_elements_class&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; elements&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

    elements&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;i&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;innerHTML &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;New Text&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&#39;s all for now.&lt;/p&gt;
&lt;p&gt;Within a few lines of code we saved ourselves a 40kb - 80kb library request and browser memory.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>How to Capture User Keystrokes With Vanilla Javascript</title>
   <link href="https://codegazerants.com/2015/09/12/javascript-catch-keystrokes/"/>
   <updated>2015-09-12T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/09/12/javascript-catch-keystrokes/"><![CDATA[
    &lt;p&gt;These days I am in the mood for ditching big libraries and having my own mini libraries or a few lines of code only for using the things I need.&lt;/p&gt;
&lt;p&gt;It&#39;s not that I don&#39;t like the libraries we have, it&#39;s that sometimes I just want to have only the things I need for my project.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Why should I map all the keys if I just want two or three of them?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Enough with the developers guilt that loves abstraction layers. Let&#39;s proceed with our script.&lt;/p&gt;
&lt;p&gt;An example I came accross while I was reading the &lt;a href=&#34;https://webtypography.net/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://webtypography.net/&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;} site — it&#39;s great, give it a try — was using keys to navigate through artiles. I know, I am a lazy person, but I miss this when I read tutorials with page sections or a book like site. It&#39;s a small script and won&#39;t affect the no javascript users.&lt;/p&gt;
&lt;p&gt;Let&#39;s start by creating a function that captures keystrokes. After we include this in a script, the browser will execute this function for every key press.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function-variable function&#34;&gt;onkeydown&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;I stroke a key&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you use this function in your document, for every keystroke the browser will log &lt;code&gt;I stroke a key&lt;/code&gt;.
The &lt;code&gt;e&lt;/code&gt; parameter is the event itself that is going to give us the unicode character of the key we pressed.&lt;/p&gt;
&lt;p&gt;Now we need to tell this function what to do when a specific key is pressed. In this case we need to map the right and left arrow key to send us to the next page or previous page.&lt;/p&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;document&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function-variable function&#34;&gt;onkeydown&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
  &lt;span class=&#34;token keyword&#34;&gt;switch&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;e&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;keyCode&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;37&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
        console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;Go to the previous page!&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
    &lt;span class=&#34;token keyword&#34;&gt;case&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;39&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
        console&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;Got to the next page&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;break&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

    &lt;span class=&#34;token keyword&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt;
        &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;token comment&#34;&gt;// Do nothing for the rest&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that&#39;s it!&lt;/p&gt;
&lt;p&gt;You can use whatever key you want without using any library, or create your own lightweight &#39;plugin&#39; for a number of keys!
Here is a list of keycodes from the &lt;a href=&#34;https://www.toptal.com/developers/keycode&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Toptal&lt;/a&gt;{:target=&amp;quot;_blank&amp;quot;} website.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Create Custom Description for Your Jekyll Posts</title>
   <link href="https://codegazerants.com/2015/09/07/jekyll-custom-description-for-your-posts/"/>
   <updated>2015-09-07T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/09/07/jekyll-custom-description-for-your-posts/"><![CDATA[
    &lt;p&gt;There are two ways to create a description from your post, the first one is use the existing &lt;code&gt;post.excerpt&lt;/code&gt; tag Jekyll has after reading &lt;a href=&#34;https://jekyllrb.com/docs/posts/#post-excerpts&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Jekyll documentation&lt;/a&gt; or create your own with some simple steps.&lt;/p&gt;
&lt;p&gt;The general idea is to create a custom page variable in your posts and use it in your layouts.&lt;/p&gt;
&lt;p&gt;For our example we &#39;ll call our variable &lt;code&gt;post_description&lt;/code&gt;, at least that&#39;s what I am using for my blog, and give it a value in my markdown post:&lt;/p&gt;
&lt;h2&gt;&lt;pre class=&#34;language-yaml&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;&lt;span class=&#34;token key atrule&#34;&gt;layout&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; post&lt;/h2&gt;
&lt;p&gt;&lt;span class=&#34;token key atrule&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; My post title
&lt;span class=&#34;token key atrule&#34;&gt;post_description&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; This is my post description&lt;/p&gt;
&lt;p&gt;&lt;span class=&#34;token punctuation&#34;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;and in my default.html or any other place I want to use it instead of &lt;code&gt;post.excerpt&lt;/code&gt;, now I can use &lt;code&gt;post.post_description&lt;/code&gt; and that&#39;s it.&lt;/p&gt;
&lt;p&gt;You can use these page values anywhere you want. For instance I am using this for creating meta tags for description and keywords in my &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; tag. You can take a peak in my &lt;a href=&#34;https://github.com/codegaze/codegaze.github.io&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;github repository&lt;/a&gt; for this site.&lt;/p&gt;
&lt;p&gt;You can add and image for your facebook og tags or anything else you can think of.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; As Emilio Lopez correctly mentioned in the &lt;a href=&#34;https://codegazerants.com/2015/09/07/jekyll-custom-description-for-your-posts/#comment-2242343497&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;comments&lt;/a&gt; you can declare post_excerpt in the page variables too.&lt;/p&gt;
&lt;h2&gt;&lt;pre class=&#34;language-yaml&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;&lt;span class=&#34;token key atrule&#34;&gt;layout&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; post&lt;/h2&gt;
&lt;p&gt;&lt;span class=&#34;token key atrule&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; My post title
&lt;span class=&#34;token key atrule&#34;&gt;excerpt&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; This is my post description&lt;/p&gt;
&lt;p&gt;&lt;span class=&#34;token punctuation&#34;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The truth is I prefer extending things than overwriting default environment variables but this is in the Jekyll documentation so, it&#39;s safe. (Thanks Emilio!)&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Swiper-JW Player</title>
   <link href="https://codegazerants.com/2015/09/05/how-to-stop-jwplayer-between-slides-a-swiper-jw-plugin/"/>
   <updated>2015-09-05T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/09/05/how-to-stop-jwplayer-between-slides-a-swiper-jw-plugin/"><![CDATA[
    &lt;p&gt;&lt;a href=&#34;https://github.com/codegaze/Swiper-JWPlayer&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Swiper-JW Player&lt;/a&gt; is a very small plugin that extends &lt;a href=&#34;http://iDangero.us&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;iDangero.us&lt;/a&gt; &lt;a href=&#34;https://www.idangero.us/swiper/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Swiper&lt;/a&gt; to avoid setting up the configuration for stopping &lt;a href=&#34;https://www.jwplayer.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;JW Player&lt;/a&gt; videos between slide navigation in each Swiper instance.&lt;/p&gt;
&lt;p&gt;This was created to satisfy my need for a fairly abstract/dynamic way to deal with JW Player events, in this case stopping it, without writing code in Swipper callbacks everytime I need something like this.&lt;/p&gt;
&lt;p&gt;The goal was to be slide targeted and not just call a &lt;code&gt;jwplayer().stop()&lt;/code&gt; that can cause a UX problem by stopping any other player on the page.&lt;/p&gt;
&lt;h3&gt;Code&lt;/h3&gt;
&lt;pre class=&#34;language-javascript&#34;&gt;&lt;code class=&#34;language-javascript&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;Swiper&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

  &lt;span class=&#34;token class-name&#34;&gt;Swiper&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;prototype&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;plugins&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function-variable function&#34;&gt;jwplayer&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token parameter&#34;&gt;swiper&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
      &lt;span class=&#34;token string&#34;&gt;&#39;use strict&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

      &lt;span class=&#34;token keyword&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
          &lt;span class=&#34;token function-variable function&#34;&gt;onSlideChangeStart&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;

            &lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; jwplayer_elements &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; swiper&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;slides&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;swiper&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;previousIndex&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;getElementsByClassName&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#39;jwplayer&#39;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

            &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt; jwplayer_elements&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length &lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
              &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token keyword&#34;&gt;var&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token number&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt; jwplayer_elements&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;length&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt; i&lt;span class=&#34;token operator&#34;&gt;++&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;
                &lt;span class=&#34;token function&#34;&gt;jwplayer&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;jwplayer_elements&lt;span class=&#34;token punctuation&#34;&gt;[&lt;/span&gt;i&lt;span class=&#34;token punctuation&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;id&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;token function&#34;&gt;stop&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
              &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

          &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
      &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;
  &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;

&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;(&lt;/span&gt;Swiper&lt;span class=&#34;token punctuation&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;How it works&lt;/h3&gt;
&lt;p&gt;Each time Swiper runs &lt;code&gt;onSlideChangeStart()&lt;/code&gt;, this plugin searches for any jwplayer instance in the previous slide and stops it, without messing with the code specified in the configuration for the &lt;code&gt;onSlideChangeStart()&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Usage&lt;/h3&gt;
&lt;p&gt;Just include the &lt;code&gt;swiper.jwplayer.js&lt;/code&gt; or &lt;code&gt;swiper.jwplayer.min.js&lt;/code&gt; script file in your page after your Swiper script.&lt;/p&gt;
&lt;h3&gt;Compatibility&lt;/h3&gt;
&lt;p&gt;JW Player 6, 7&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;You can download the minified and source code from github &lt;a href=&#34;https://github.com/codegaze/Swiper-JWPlayer&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;https://github.com/codegaze/Swiper-JWPlayer&lt;/a&gt;.&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>VirtualBox Copy/Paste &amp; Drag &#39;n&#39; Drop</title>
   <link href="https://codegazerants.com/2015/09/01/copy-paste-and-drag-n-drop-in-VirtualBox/"/>
   <updated>2015-09-01T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/09/01/copy-paste-and-drag-n-drop-in-VirtualBox/"><![CDATA[
    &lt;p&gt;You are working with VirtualBox and you want to share clipboard and files between your guest machine and your Linux host?&lt;/p&gt;
&lt;p&gt;It&#39;s easy...&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Or not?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;First of all I want to say that I am using VirtualBox 5.0.2 and a Xubuntu 15.04 image, so any problems I have might be a version fault.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Before doing anything, take a snapshot of your machine.&lt;/p&gt;
&lt;h3&gt;Installing the Guest Additions&lt;/h3&gt;
&lt;p&gt;In order to enable any interaction between the host and the machine and vise versa we need to install the Guest Additions.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;sudo apt-get update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;sudo apt-get upgrade&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;sudo apt-get install dkms&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Make some coffee or tea.&lt;/li&gt;
&lt;li&gt;Drink it while browsing the internet!&lt;/li&gt;
&lt;li&gt;When the installation ends run &lt;code&gt;sudo reboot&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Go to Devices &amp;gt; Insert Guest Additions CD Image&lt;/li&gt;
&lt;li&gt;From the opened File Manager copy the path.&lt;/li&gt;
&lt;li&gt;Open your console and write &lt;code&gt;cd /path-you-copied/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;sudo sh ./VBoxLinuxAdditions.run&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;sudo reboot&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Enable communication between Host and Guest&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Go to your VirtualBox Manager select your machine and click settings.&lt;/li&gt;
&lt;li&gt;From the first selection General, select the Advanced tab and select Bidirectional to Shared Clipboard and Drag &#39;n&#39; Drop.&lt;/li&gt;
&lt;li&gt;Restart your machine.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Create a shared folder&lt;/h3&gt;
&lt;p&gt;For my configuration drag &#39;n&#39; drop didn&#39;t work in any folder and raised an error which suspended my machine. So I created a shared folder and used this to share any files I wanted.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to your VirtualBox Manager select your machine and click settings.&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;Shared Folders&lt;/code&gt; and add the folder you want to share between the host and the guest.&lt;/li&gt;
&lt;li&gt;Check Auto-mount and Make permanent.&lt;/li&gt;
&lt;li&gt;Log off and on again.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Give your user privileges&lt;/h3&gt;
&lt;p&gt;In order to give your user access to any shared folder run&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo adduser yourusername vboxsf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Log off and on again. Your shared folders will be in &lt;code&gt;/media/&lt;/code&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;If I find a anything for the drag &#39;n&#39; drop part I will make another post or add the solution here. If anyone has a valid solution for this feel free to comment!&lt;/p&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Highlight Ruby Code in Jekyll</title>
   <link href="https://codegazerants.com/2015/08/09/highlighting-ruby-code-in-jekyll/"/>
   <updated>2015-08-09T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/08/09/highlighting-ruby-code-in-jekyll/"><![CDATA[
    &lt;p&gt;A few days ago I was trying to write a &lt;a href=&#34;/2015/08/08/how-to-create-a-dynamic-navigation-menu-in-jekyll/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;tutorial&lt;/a&gt; about creating a simple dynamic menu for Jekyll and I came across a strange problem while I was trying to show and highlight some ruby code.&lt;/p&gt;
&lt;p&gt;Instead of ruby code and html I was getting whitespace and html only.&lt;/p&gt;
&lt;p&gt;I reinstalled &lt;a href=&#34;https://pip.pypa.io/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;pip&lt;/a&gt; and &lt;a href=&#34;https://pygments.org/&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;pygments&lt;/a&gt; to check if something was wrong with my installation but that wasn&#39;t the problem.&lt;/p&gt;
&lt;p&gt;After a little research I found out that the problem was that Liquid, the template language Jekyll uses, considered everything inside the curly braces as code to execute.&lt;/p&gt;
&lt;p&gt;That thing we call the internet helped me to find out that the solution is another tag called &lt;a href=&#34;https://docs.shopify.com/themes/liquid-documentation/tags/theme-tags#raw&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;raw&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;raw&lt;/strong&gt;
Allows output of Liquid code on a page without being parsed.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That means that if you use the following code(without the spaces between the curly brackets and %) after the highlight tag you can achieve the preferred result.&lt;/p&gt;
&lt;pre class=&#34;language-ruby&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; highlight python &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; raw &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; page&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;title &lt;span class=&#34;token operator&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;token string-literal&#34;&gt;&lt;span class=&#34;token string&#34;&gt;&#39;Highlight ruby code in Jekyll&#39;&lt;/span&gt;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
You are right&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; endif &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; endraw &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; endhighlight &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;results to:&lt;/p&gt;
&lt;pre class=&#34;language-ruby&#34;&gt;&lt;code class=&#34;language-ruby&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; raw &lt;span class=&#34;token string-literal&#34;&gt;&lt;span class=&#34;token string&#34;&gt;%}
{% if page.title == &#39;Highlight ruby code in Jekyll&#39; %}&lt;/span&gt;&lt;/span&gt;
You are right&lt;span class=&#34;token operator&#34;&gt;!&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; endif &lt;span class=&#34;token string-literal&#34;&gt;&lt;span class=&#34;token string&#34;&gt;%}
{% endraw %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

  ]]></content>
 </entry>
 
 <entry>
   <title>Dynamic Navigation for Jekyll</title>
   <link href="https://codegazerants.com/2015/08/08/how-to-create-a-dynamic-navigation-menu-in-jekyll/"/>
   <updated>2015-08-08T00:00:00+00:00</updated>
   <id>https://codegazerants.com</id>
  <content type="html" xml:base="https://codegazerants.com/2015/08/08/how-to-create-a-dynamic-navigation-menu-in-jekyll/"><![CDATA[
    &lt;p&gt;This is a tutorial on how to create a simple dynamic menu for &lt;a href=&#34;https://github.com/jekyll/jekyll&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;Jekyll&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Jekyll is great for static sites, but if you are lazy like me you want to add some scripts here and there to make your life easier.&lt;/p&gt;
&lt;p&gt;Jekyll uses the _data folder to create dynamic data with the use of .yml files.
You can name the file however you want but keep in mind that we are going to use it to retrieve the data with site.data.filename.&lt;/p&gt;
&lt;p&gt;First of all you need to check if there is a _data folder in your project folder. If not we must create it and add a navigation.yml file in with this data:&lt;/p&gt;
&lt;pre class=&#34;language-yaml&#34;&gt;&lt;code class=&#34;language-yaml&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;token key atrule&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; Home
  &lt;span class=&#34;token key atrule&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; /
&lt;span class=&#34;token punctuation&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;token key atrule&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; Blog
  &lt;span class=&#34;token key atrule&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; /blog/
&lt;span class=&#34;token punctuation&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;token key atrule&#34;&gt;title&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; About
  &lt;span class=&#34;token key atrule&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;:&lt;/span&gt; /about/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next add this script to your default.html in your _layout folder or create a menu.html file in your _include folder.&lt;/p&gt;
&lt;pre class=&#34;language-python&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; raw &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;

&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;nav&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;
    &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;ul&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;for&lt;/span&gt; link &lt;span class=&#34;token keyword&#34;&gt;in&lt;/span&gt; site&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;data&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;navigation &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; assign current &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; nil &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;token keyword&#34;&gt;if&lt;/span&gt; page&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;url contains link&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;url &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
            &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; assign current &lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;token string&#34;&gt;&#39;active&#39;&lt;/span&gt; &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
        &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; endif &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
        &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;li &lt;span class=&#34;token keyword&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;{{ current }}&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;
            &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;a href&lt;span class=&#34;token operator&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;token string&#34;&gt;&#34;{{ link.url }}&#34;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt; link&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;title &lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;a&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;
        &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;li&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;
    &lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; endfor &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
    &lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;ul&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;
&lt;span class=&#34;token operator&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;/&lt;/span&gt;nav&lt;span class=&#34;token operator&#34;&gt;&gt;&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; endraw &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The latter is better and you need to include the menu in your preferred place in your default.html&lt;/p&gt;
&lt;pre class=&#34;language-python&#34;&gt;&lt;code class=&#34;language-python&#34;&gt;&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; raw &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; include menu&lt;span class=&#34;token punctuation&#34;&gt;.&lt;/span&gt;html &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;
&lt;span class=&#34;token punctuation&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt; endraw &lt;span class=&#34;token operator&#34;&gt;%&lt;/span&gt;&lt;span class=&#34;token punctuation&#34;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Refresh your page and see your new menu!&lt;/p&gt;

  ]]></content>
 </entry>
 
</feed>
