<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: John Luke Garofalo</title>
    <description>The latest articles on DEV Community by John Luke Garofalo (@johnlukeg).</description>
    <link>https://dev.to/johnlukeg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2225%2Fe35d6977-e1da-41a7-81c7-17d8a179930f.png</url>
      <title>DEV Community: John Luke Garofalo</title>
      <link>https://dev.to/johnlukeg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/johnlukeg"/>
    <language>en</language>
    <item>
      <title>On Finding Time to Read.</title>
      <dc:creator>John Luke Garofalo</dc:creator>
      <pubDate>Tue, 22 Oct 2019 17:58:11 +0000</pubDate>
      <link>https://dev.to/johnlukeg/on-finding-time-to-read-29f0</link>
      <guid>https://dev.to/johnlukeg/on-finding-time-to-read-29f0</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"No matter how busy you may think you are, you must find time for reading or surrender yourself to self-chosen ignorance." -- Confucius&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Reading books is an essential habit if you want to reach your full potential. Even if you haven’t thought of yourself as a “reader of books” in the past, it doesn't take much to start. &lt;strong&gt;Here are a few tips I have found to be effective at helping me fit book reading into my day.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Once you learn to read, you will be forever free." -- Frederick Douglass&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Tip: Find your format.
&lt;/h2&gt;

&lt;p&gt;For the first two years of my career, I commuted two hours a day. And like good sons do, I asked my mom for her Audible login and then selfishly used all her credits every month before she could. When I moved close to my office, I suddenly had a lot less time in my schedule to listen to all of the unread audiobooks that my mom would never read. &lt;/p&gt;

&lt;p&gt;My point is, whether it’s a physical book, audiobook, E-Book, or some combination of these; find which formats are the least disruptive to your usual routine.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“It is what you read when you don’t have to that determines what you will be when you can’t help it.” ― Oscar Wilde&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Tip: Any progress is better than no progress.
&lt;/h2&gt;

&lt;p&gt;You don't have to put aside significant amount of time in order to become a book reader. &lt;strong&gt;You only have to read one page a day, or even less, in order to make progress.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;After overcoming this mental hurdle myself, I began to view this one-page reading requirement as a daily game. If I couldn't hit my requirement, then I'd have to make up for it the next day. Pretty soon, I found myself reading more and more pages each day.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A person who won't read has no advantage over one who can't read." -- Mark Twain&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Tip: Read during the gaps of your day.
&lt;/h2&gt;

&lt;p&gt;Have you ever been waiting in line and noticed that everyone else in line is standing like a mannequin scrolling on Twitter or Instagram? Waiting in line is one of the many gaps in our day where we're not really using our brain or body for anything productive. These gaps offer excellent opportunities to fit in a few paragraphs or pages. &lt;/p&gt;

&lt;p&gt;These few minutes may seem insignificant but I guarantee you will be surprised by how many books you’ll have read by the end of the year by making this a habit.&lt;/p&gt;

&lt;p&gt;Some great times/places to read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the bathroom.&lt;/li&gt;
&lt;li&gt;Waiting in line.&lt;/li&gt;
&lt;li&gt;Before you fall asleep/lying in bed.&lt;/li&gt;
&lt;li&gt;During commercials.&lt;/li&gt;
&lt;li&gt;While you're having lunch. &lt;/li&gt;
&lt;li&gt;On your commute.&lt;/li&gt;
&lt;li&gt;While walking your dog.&lt;/li&gt;
&lt;li&gt; When you're at a restaurant and they're singing happy birthday to someone at another table and you don't know whether you should sing along too or politely ignore them.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“Somebody who only reads newspapers and at best books of contemporary authors looks to me like an extremely near-sighted person who scorns eyeglasses. He is completely dependent on the prejudices and fashions of his times, since he never gets to see or hear anything else.” – Albert Einstein&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Tip: Read something you enjoy.
&lt;/h2&gt;

&lt;p&gt;This one may seem obvious, but it's important, because it will be much more difficult to find time to read when you're reading a book you don't like. &lt;/p&gt;

&lt;p&gt;Choosing a book is a much bigger commitment than trying a new show on Netflix. Do some homework beforehand by reading reviews online (Goodreads, Amazon, etc..) and by asking for recommendations from your friends, colleagues, or people you respect. I love it when people ask me what books I recommend, because these books have changed my life so meaningfully, it's exciting to think it may have a similar effect on someone else. &lt;/p&gt;

&lt;p&gt;Most importantly, don't be afraid to abandon a book if you give it an honest try and aren't feeling it. Not all books are a good fit for you. Not all books are good, in general. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“My alma mater was books, a good library…. I could spend the rest of my life reading, just satisfying my curiosity.” – Malcolm X&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;I hope that you found some value in these tips. If you have other tips to suggest or need book recommendations, please leave a comment! &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How many a man has dated a new era in his life from the reading of a book.” – Henry David Thoreau&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>reading</category>
      <category>learning</category>
      <category>books</category>
    </item>
    <item>
      <title>What's the most pragmatic way to start a self-hosted blog? </title>
      <dc:creator>John Luke Garofalo</dc:creator>
      <pubDate>Tue, 30 Jul 2019 19:14:11 +0000</pubDate>
      <link>https://dev.to/johnlukeg/what-s-the-most-pragmatic-way-to-start-a-self-hosted-blog-5hf4</link>
      <guid>https://dev.to/johnlukeg/what-s-the-most-pragmatic-way-to-start-a-self-hosted-blog-5hf4</guid>
      <description>&lt;p&gt;Hey DT community, I need your help and expertise. &lt;/p&gt;

&lt;h2&gt;
  
  
  My Background
&lt;/h2&gt;

&lt;p&gt;I'm an experienced full-stack software engineer, with a strong background in React, React Native, &amp;amp; Ruby on Rails. &lt;/p&gt;

&lt;h2&gt;
  
  
  My Problem
&lt;/h2&gt;

&lt;p&gt;I've been having trouble figuring out a good service, library, or template to use to create a self-hosted blog for my business. I'm imagining something similar to the &lt;a href="https://auth0.com/blog/"&gt;Auth0 Blog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Thoughts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I haven't seen an easy way to create this type of thing in React without building it from scratch, which I'd rather not spend a lot of my time doing. &lt;/li&gt;
&lt;li&gt;My customers aren't necessarily developers and I'm not a big fan of Medium, so I'd like it to be hosted along with the business site.&lt;/li&gt;
&lt;li&gt;I'm not opposed to a hosted service, but I would need it to look professional since it's for my business.&lt;/li&gt;
&lt;li&gt;I know Wordpress is a popular choice but I’ve never used it so I hesitate to pick it for the time it may take to learn it and have it integrate into my react app.&lt;/li&gt;
&lt;li&gt;I've heard others mention Gatsby, but from what I could tell, my non-engineer partners couldn't write posts without me translating it into code. (I could be wrong about this. I don't know much about Gatsby).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you in advance!&lt;/p&gt;

&lt;p&gt;Edit: An earlier version of this question mentioned WordPress in passing without elaboration. I’ve updated it to clarify my thoughts.&lt;/p&gt;

</description>
      <category>help</category>
      <category>blog</category>
      <category>react</category>
    </item>
    <item>
      <title>Connect an Autonomous JS App to ActionCable for RealtimeÂ Goodness</title>
      <dc:creator>John Luke Garofalo</dc:creator>
      <pubDate>Wed, 16 Aug 2017 14:29:27 +0000</pubDate>
      <link>https://dev.to/johnlukeg/connect-an-autonomous-js-app-to-actioncable-for-realtimegoodness</link>
      <guid>https://dev.to/johnlukeg/connect-an-autonomous-js-app-to-actioncable-for-realtimegoodness</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fe324ir7ndltqmb9rm56c.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fe324ir7ndltqmb9rm56c.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few months ago I started learning Rails Action Cable for Fixt so that I could implement desktop notifications for our customer service reps. For those of you who don't know about Action Cable, it's an out-of-the-box websockets framework built for (and now into) rails. This was pretty straight forward as there are plenty examples in Ruby on Rails' preferred coffeescript, connecting via the asset pipeline. But as someone with somewhat of a shallow knowledge of websocket trends, I began to ask myself what if you want to connect from another standalone web app? Finally I had to face this  question as I was tasked with connecting our &lt;a href=""&gt;Repair Tracking Component&lt;/a&gt; to our Ruby on Rails backend for real time tracking. This is where I started to explore the best way to utilize Action Cable from any Javascript app.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fmoqu48lfjlr8jnxdav3e.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fmoqu48lfjlr8jnxdav3e.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
    &lt;a href="https://fixt.co/repairs" rel="noopener noreferrer"&gt;Submit a phone or tablet repair&lt;/a&gt; with Fixt to see the full feature for yourselfÂ ;)&lt;br&gt;
  &lt;/p&gt;




&lt;h3&gt;
  
  
  Action Cable Setup
&lt;/h3&gt;

&lt;p&gt;This isn't going to be a full tutorial, meaning I won't include all of the setup of action cables because this has been done well by &lt;a href="http://edgeguides.rubyonrails.org/action_cable_overview.html" rel="noopener noreferrer"&gt;the Edge Guides&lt;/a&gt; already. Instead I will focus on the changes you need to make to your configuration if you already have the standard action cable setup.&lt;/p&gt;

&lt;p&gt;You'll need to do two things to make sure that you can connect to your websocket from an outside source. First you'll need to add your client's address to the list of allowed origins.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/environments/development.rb&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_cable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'http://localhost:3000/cable'&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;web_socket_server_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'ws://localhost:3000/cable'&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_cable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allowed_request_origins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
   &lt;span class="c1"&gt;# Local address of our RoR server&lt;/span&gt;
  &lt;span class="s1"&gt;'http://localhost:3000'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="c1"&gt;# Local address we use for our React standalone client&lt;/span&gt;
  &lt;span class="s1"&gt;'http://localhost:8000'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# config/environments/production.rb&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;websocket_server_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'wss://&amp;lt;YOUR_SERVER_SITE&amp;gt;/cable'&lt;/span&gt;
&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;action_cable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allowed_request_origins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
   &lt;span class="c1"&gt;# Address of our Ruby on Rails App&lt;/span&gt;
  &lt;span class="s1"&gt;'https://&amp;lt;YOUR_SERVER_SITE&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="c1"&gt;# Address of our JS App&lt;/span&gt;
  &lt;span class="s1"&gt;'https://&amp;lt;YOUR_CLIENT_SITE&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: I'm assuming that you're using ssl certificates in production, but if you're not, then just change &lt;code&gt;https&lt;/code&gt; to &lt;code&gt;http&lt;/code&gt; and &lt;code&gt;wss&lt;/code&gt; to &lt;code&gt;ws&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you haven't already, you'll need to setup a channel to track whichever model that you want to receive updates about. There are two paradigms in Action Cable, you can either stream for an Active Record object or you can stream to a channel in general. The differences are better explained &lt;a href="http://edgeguides.rubyonrails.org/action_cable_overview.html#streams" rel="noopener noreferrer"&gt;in the Edge Guides Section 5.1 Streams&lt;/a&gt;. For the sake of simplicity, I'll explain what we want to do. We essentially want to stream any updates, to an instance of a model, to any client that's interested in that model. In our case at Fixt, we wanted to be able to track updates to a specific Repair instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# app/channels/repair_tracking_channel.rb&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RepairTrackingChannel&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationCable&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Channel&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;subscribed&lt;/span&gt;
    &lt;span class="n"&gt;stream_for&lt;/span&gt; &lt;span class="n"&gt;repair&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;repair&lt;/span&gt;
    &lt;span class="no"&gt;Repair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:id&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, any time that we want to update the client that's interested in the repair when something changes, all we have to do is call something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;RepairTrackingChannel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;broadcast_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@repair&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;repair: &lt;/span&gt;&lt;span class="n"&gt;repair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;as_json&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: You don't have to use &lt;code&gt;as_json&lt;/code&gt;. We actually use jbuilder at Fixt but since this article isn't about serializing data, I didn't want to spend too much time on it.&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Javascript Setup
&lt;/h3&gt;

&lt;p&gt;Now that we have Action Cable configured to stream to our standalone client JS app, let's set the client up. Everything before now has been vanilla Action Cable so this next part is the fun part.&lt;/p&gt;

&lt;p&gt;Action Cable is just a layer on top of web sockets so you really can connect to it just using good ole JS web sockets. For this article, I'm just going to use the &lt;code&gt;actioncable&lt;/code&gt; npm package because it makes the boilerplate web socket code a little easier to understand. If you are an anti-dependency, hardcore, 100x brogrammer who thinks npm is for the weak, then you probably don't need this tutorial or anyone's help, because you are unequivocally intelligent and we will all clap as you exit this thread. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6j0fw0kkh1ivujwlqtn4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F6j0fw0kkh1ivujwlqtn4.gif"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
     Not you Hermione, you're perfect. &amp;lt;3&lt;br&gt;
  
  &lt;/p&gt;

&lt;p&gt;Let's go ahead and install actioncable to our project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npm i &lt;span class="nt"&gt;-S&lt;/span&gt; actioncable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, let's create a file called &lt;code&gt;repair-tracking-subscription.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;repair-tracking-subscription.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this file, we want to encapsulate all of our Action Cable channel logic, similar to how you would if you were connecting to ActionCable via the asset pipeline.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ActionCable&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;actioncable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// 1. Configure your websocket address&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WEBSOCKET_HOST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NODE_ENV&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;production&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
                         &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;wss://&amp;lt;YOUR_SERVER_SITE&amp;gt;/cable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
                         &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ws://localhost:3000/cable&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;RepairTrackingSubscription&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;repairId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;onUpdate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 2. Define our constructor&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ActionCable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createConsumer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;WEBSOCKET_HOST&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;repairId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;repairId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// 3. Define the function we will call to subscribe to our channel&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscriptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;RepairTrackingChannel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;repairId&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;connected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;disconnected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disconnected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;received&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;received&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rejected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="c1"&gt;// 4. Define our default ActionCable callbacks.&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;received&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Received Data: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;connected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Tracking Repair &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;disconnected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Repair Tracking for &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; was disconnected.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rejected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;I was rejected! :(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;This will be the &lt;code&gt;ws&lt;/code&gt;/&lt;code&gt;wss&lt;/code&gt; address that you set up in the previous section. You don't have to hardcode it in here but I am not going to presume to know your environment.&lt;/li&gt;
&lt;li&gt;For those unfamiliar with javascript functions and object oriented programming, this is our constructor and anything starting with &lt;code&gt;this&lt;/code&gt; is a member variable on our object.&lt;/li&gt;
&lt;li&gt;We use the &lt;code&gt;subscribe&lt;/code&gt; function to essentially invoke our call to our ActionCable server. You could do this in the constructor and save a step but I figured it's worth separating for understanding. Also this way would allow you to pass around a subscription and subscribe at your will.&lt;/li&gt;
&lt;li&gt;These are your ActionCable callbacks that are invoked by default when certain actions occur from the channel. You can read more about default and custom callback functions on the &lt;a href="http://edgeguides.rubyonrails.org/action_cable_overview.html#client-server-interactions-subscriptions" rel="noopener noreferrer"&gt;Edge Guides 5.3 Subscriptions&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it! Now we can track a repair from anywhere. Just import this function and subscribe like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;repairTrackingSubscription&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./repair-tracking-subscription&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Tracker&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;repair&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nf"&gt;componentWillMount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;repairId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;repairChannel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RepairTrackingSubscription&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
      &lt;span class="nx"&gt;repairId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="na"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onRepairUpdate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="nx"&gt;repairChannel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;onRepairUpdate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;repair&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;repair&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;repair&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;repair&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Tracker&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Note: This is framework agnostic, you can use this function in any javascript situation that you currently find yourself in. I just currently find myself in React and can't seem to get out. Send help&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This may seem simple to many of you but I legitimately wasn't sure how to connect to Action Cable from an autonomous app last week. Most of the tutorials out there made the assumption that you'd be working from within the Ruby on Rails framework. I hope that this helps some of you make some cool ish.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>actioncable</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Make React Navigation Accessible Again</title>
      <dc:creator>John Luke Garofalo</dc:creator>
      <pubDate>Fri, 11 Aug 2017 11:34:31 +0000</pubDate>
      <link>https://dev.to/johnlucasg/make-react-navigation-accessible-again</link>
      <guid>https://dev.to/johnlucasg/make-react-navigation-accessible-again</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fi.imgur.com%2Fzd2m9dN.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fi.imgur.com%2Fzd2m9dN.jpg" alt="Imgur"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Early last week, our product manager finally convinced us to spend a day figuring out how to make our React App more accessible. If you're like me, you took a course in school that spent a semester explaining the importance of accessibility on the web and introducing you to the people who are mostly affected. If you haven't familiarized with this issue, then I highly suggest you do because you will learn how much we take for granted while using the internet every day.&lt;/p&gt;

&lt;p&gt;We struggled at first with the right solution as &lt;a href="https://facebook.github.io/react/docs/accessibility.html" rel="noopener noreferrer"&gt;React Accessibility documentation&lt;/a&gt; is pretty minimal when it comes to more complex situations, in my opinion. They do a great job of explaining the "why" it's important but not really the "how". We had a pretty large app that needed to be fully navigate-able with the &lt;code&gt;tab&lt;/code&gt;, &lt;code&gt;shift + tab&lt;/code&gt;, &amp;amp; &lt;code&gt;enter&lt;/code&gt; key. We also needed to make sure that every button would provide feedback when &lt;code&gt;:focused&lt;/code&gt;. I'm going to show you how we approached this problem as pragmatically as possible. Obviously, it's not perfect and we can always improve our accessibility, but I want to share what I learned to show you that you can make small changes that convert to massive improvements for anyone with disabilities using your React app.&lt;/p&gt;




&lt;h2&gt;
  
  
  Adding jsx-a11y to eslint
&lt;/h2&gt;

&lt;p&gt;This &lt;a href="https://www.npmjs.com/package/eslint-plugin-jsx-a11y" rel="noopener noreferrer"&gt;eslint-plugin-jsx-a11y&lt;/a&gt; plugin helps to suggest accessibility changes that you can make to your app as you develop. I think this is really important in regards to learning about the accessibility best practices in an inline manner. We use eslint here at Fixt Inc. so I'm partial to it, but I'm sure there are equivalents out there.&lt;/p&gt;




&lt;h2&gt;
  
  
  !!Tab
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fi.imgur.com%2FC11EUT3.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fi.imgur.com%2FC11EUT3.jpg" alt="Imgur"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A huge gain, with minimal effort, is simply making it possible to tab through all of the buttons in your app without using the mouse at all. This is really useful for webforms but also outside of webforms. &lt;/p&gt;

&lt;p&gt;Let's start by creating a custom &lt;code&gt;Button&lt;/code&gt; component in React and making it tab-able.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;PropTypes&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;prop-types&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;tabIndex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sweet. As you can see, the &lt;code&gt;tabIndex&lt;/code&gt; prop is the real hero here. This global attribute can have three different types of values, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex" rel="noopener noreferrer"&gt;according to the MDN docs&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Negative Value

&lt;ul&gt;
&lt;li&gt;A negative value (usually tabindex="-1" means that the element should be focusable, but should not be reachable via sequential keyboard navigation. Mostly useful to create accessible widgets with JavaScript.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Zero Value

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tabindex="0"&lt;/code&gt; means that the element should be focusable in sequential keyboard navigation, but its order is defined by the document's source order.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Positive Value

&lt;ul&gt;
&lt;li&gt;A positive value means the element should be focusable in sequential keyboard navigation, with its order defined by the value of the number. That is, tabindex="4" would be focused before tabindex="5", but after tabindex="3". If multiple elements share the same positive tabindex value, their order relative to each other follows their position in the document source.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Simple enough, right? &lt;/p&gt;




&lt;h2&gt;
  
  
  (Enter || Return) key
&lt;/h2&gt;

&lt;p&gt;So, now that we can tab to our button, we want the user to be able to click the Enter or Return key to simulate a click because what good is tabbing to buttons that you can't click on?&lt;/p&gt;

&lt;p&gt;Let's build a function that will help us to do just that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buildHandleEnterKeyPress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="nf"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are a few things going on here that may be confusing if you've never encountered them before. &lt;/p&gt;

&lt;p&gt;This function is a curried function meaning it's a function that returns a function. I'm not going to go into explaining this in-depth, but if you're unfamiliar with this concept, I'm going to explain why we need this. In our situation, we want to provide a function to our component that will handle whenever a key is pressed. Since we can assume that we will know what the value of &lt;code&gt;onClick&lt;/code&gt; is at the time that &lt;code&gt;buildHandleEnterKeyPress&lt;/code&gt; is invoked, then we can create a function that uses the &lt;code&gt;onClick&lt;/code&gt; function. This allows us to pass any callback function to &lt;code&gt;buildHandleEnterKeyPress&lt;/code&gt; and it will execute when a key is pressed while the user is focused on a given element.&lt;/p&gt;

&lt;p&gt;So now we can head to our &lt;code&gt;Button&lt;/code&gt; component and use this function to get our desired result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; 
    &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
    &lt;span class="nx"&gt;onKeyPress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;buildHandleEnterKeyPress&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; 
    &lt;span class="nx"&gt;tabIndex&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is really simple for the developer and really important to the people on the internet who absolutely need to be able to use the keyboard to navigate.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As I mentioned, this is about the bare minimum you can do in regards to accessibility. There are so many good resources and best practices out there that we should put aside our laziness to do the right thing. &lt;/p&gt;

</description>
      <category>react</category>
      <category>a11y</category>
      <category>softwareengineering</category>
      <category>tab</category>
    </item>
    <item>
      <title>How did you become proficient at geometry and vector math for web animations and/or VR?</title>
      <dc:creator>John Luke Garofalo</dc:creator>
      <pubDate>Fri, 21 Jul 2017 13:04:34 +0000</pubDate>
      <link>https://dev.to/johnlukeg/how-did-you-become-proficient-at-geometry-and-vector-math-for-web-animations-andor-vr</link>
      <guid>https://dev.to/johnlukeg/how-did-you-become-proficient-at-geometry-and-vector-math-for-web-animations-andor-vr</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclaimer: My question may be ambiguous because of the nature of it. I'm not entirely sure of what to concisely ask for so I'm attempting to describe it in the hopes that someone much smarter than I will translate.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I've been working in the frontend a lot throughout the past year and attempting to learn VR development on the side. As I've become more advanced, I've found that my desire to be able to create beautiful products, rather than mimic what other's have done, is predicated on the understanding of the geometry and physics of 3D objects and vectors. Many tutorials seem to gloss over this aspect of the process because the knowledge is probably assumed. I received my undergraduate degree in computer science so you'd think that I would've known this but I've never had the opportunity to connect the dots.*  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fmedia.boingboing.net%2Fwp-content%2Fuploads%2F2016%2F11%2Fbcf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fmedia.boingboing.net%2Fwp-content%2Fuploads%2F2016%2F11%2Fbcf.png"&gt;&lt;/a&gt;&lt;br&gt;"Wait... so I actually do need to know what the hypootmusnuse is?
  &lt;/p&gt;

&lt;p&gt;Do you have any suggestions for resources to help someone become better equipped to begin creating things like svg drawings, css drawings/animations, and/or virtual reality environments/objects?&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;* For example, I was reading &lt;a href="http://vr.cs.uiuc.edu/vrbook.pdf" rel="noopener noreferrer"&gt;Steven M. LaValle's book on VR&lt;/a&gt; but I began to struggle when he said that I should be able to visualize quaternions by looking at the equation. I could easily follow the math for geometrical rotations, but I'm missing the foundational understanding of "why" the math is being applied.&lt;/sup&gt;&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>All Meetings Are Terrible... Except for One (on One)</title>
      <dc:creator>John Luke Garofalo</dc:creator>
      <pubDate>Sun, 09 Jul 2017 04:41:13 +0000</pubDate>
      <link>https://dev.to/johnlucasg/the-most-important-meeting-the-one-onone</link>
      <guid>https://dev.to/johnlucasg/the-most-important-meeting-the-one-onone</guid>
      <description>&lt;p&gt;Okay, maybe not all meetings. I’m just pushing a software engineering stereotype.&lt;/p&gt;

&lt;p&gt;When I joined Fixt Inc., over a year ago, I was fresh out of college with little experience, other than a few internships under my belt. I accepted a job as a full stack software engineer at a company using React, React Native, and Ruby on Rails; none of which were taught to me in the four years pursuing a Bachelor’s degree in Computer science.&lt;/p&gt;

&lt;p&gt;Naturally, I had a lot of learning to do. I taught myself web development (html/css/js) and iOS programming (Swift) in college, while I wasn’t in class, so I had no problem with learning. I quickly hit an obstacle I wasn’t as familiar with; spending time learning on someone else’s dime. I would be perfectly content spending the rest of my life learning new technologies and being curious, but in reality, I knew that my boss had some sort of expectations regarding how long I should spend learning and when I should start becoming effective at building things for the company.&lt;/p&gt;

&lt;p&gt;The problem was that he never gave me any clues about these expectations because they’re difficult to define. We were a four engineer team at a startup so we were all heads down, all the time. My internal gauge for my performance was all guesswork, so I wasn’t sure what I was doing wrong or what I was doing right.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhgnv7v9hz9vujmiicz8a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fhgnv7v9hz9vujmiicz8a.jpg"&gt;&lt;/a&gt;&lt;br&gt;Lumbergh always knows what he wants.
  &lt;/p&gt;

&lt;p&gt;Don’t get me wrong, I didn’t need a pat on the back or reproach for every little action but I did want some affirmation for my own assessment of my performance. Imagine if our Google Maps just shouted out the cardinal direction, “Head North, to your destination every 15 minutes. I might eventually find my destination but I’ll waste a lot of time trying to determine if I’m making the right choices along the way. Looking back, there were a lot of actions I could’ve taken to remedy the anxiety and stress I was collecting. I was spending 11+ hour days, trying to learn 8 different web/mobile frameworks and catch up to the effectiveness of my coworkers.&lt;/p&gt;

&lt;p&gt;It wasn’t until a few months later, my boss introduced the popular concept of “one on ones to the whole company. If you’re unfamiliar, the “one on one meeting is a recurring meeting between each employee and his or her boss and/or manager. It’s a dedicated time to talk about those personal expectations, performance, any obstacles faced by either party, process pitfalls or pain points, as well as big picture goals for the employee and the company.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkl039ms11mmccxjs3ki2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fkl039ms11mmccxjs3ki2.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
    Actual picture taken during our first one on one. (Circa 2016)&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;During our first one on one, my boss and I walked all around the Baltimore Harbor and I had the time and the place to bring up the lack of communication and directly ask him about what I was doing right and/or wrong and how I can improve. All of that anxiety and stress that I built up over the preceding months, affecting my performance and overall health, vanished in the span of hour.&lt;/p&gt;

&lt;p&gt;I’m a simple man, I like to set goals and I like to try and blow them out of the water. The simple lesson I learned was this:&lt;/p&gt;

&lt;p&gt;The only way to succeed is with clear intention. If your team members don’t know their goals, then they are not going to execute with intention. They’ll be moving forward but with no clear destination, which means that your team members, your company, and you cannot be the best that you can be.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fdlgrpbkf2nvicmxflbnz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fdlgrpbkf2nvicmxflbnz.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;
    Actual image of me with my dev team.&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;People want to feel useful. If you and your team members are emotionally mature, then you’re willing to admit that you’re not always going to be perfect. A good team is made up of individuals committed to bettering themselves and bettering the people around them. There are countless inspirational leadership quote posters on Google to back me up on this but here’s one of my favorites.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Members of trusting teams admit weaknesses and mistakes, take risks in offering feedback and assistance, and focus time and energy on important issues, not politics.”â€Š–â€ŠPatrickÂ Lencioni&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We shouldn’t expect others to be able to read our minds. This is why the one on one meeting is so essential to health of your team and the health of your company. You will find that your quality of life will improve drastically by keeping a regular one on one with your boss and/or your employees.&lt;/p&gt;




&lt;p&gt;Here are some tips on having meaningful one on one meetings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prepare ahead of time.&lt;/strong&gt; Keep a running note, in between your one on one meetings, and add to it whenever something strikes you as worth bringing up at your next meeting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Get out of the office.&lt;/strong&gt; It’s very easy to work too hard. I’ve spent entire days from 6:30 am to 7 pm, without leaving the office because I’m deep in a feature or problem. Get a change of scenery and away from your other co-workers. This is time to focus on the person you’re meeting with. Last week, my boss and I walked for awhile then grabbed the water taxi across the harbor, which was a great way to get some fresh air, bond, and talk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Do not cancel this meeting.&lt;/strong&gt; This time should be sacred and while you can reschedule to accommodate anomalies in your schedule, don’t ever cancel one of these meetings or push to the following week (unless you’re on vacation). Your colleague should be able to rely on this time as a regular time to discuss what he or she needs to discuss. Even if there’s not much to talk about and it’s very short, always honor this meeting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ask for constructive criticism.&lt;/strong&gt; If we want to be the best version of ourselves, we must remember that not a single one of us is perfect. Every week, ask your colleague these three questions, “Is there anything that I did that bothered you? Is there anyway that I can improve? How can I make your life better? This can make your colleague feel a little more trust and is more likely to provide you with honest and constructive feedback, which is your golden ticket to finding success.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Give good feedback.&lt;/strong&gt; Start with the good feedback and praise your colleague for even minor things that he or she did well since your last meeting. This reinforces his or her pride and encourages him or her to continue to repeat those actions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Give constructive criticism.&lt;/strong&gt; Provide your colleague with constructive criticism and ways to improve. Always keep in mind that you will never be fully aware of all of the factors that go into someone’s actions and that he or she may have a good reason to back up his or her actions. Always present it as your perspective, rather than a factual statement. This will allow your colleague to approach the conversation being less defensive and more appreciative for your honesty.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consider your career goals.&lt;/strong&gt; This is important. If this person is your boss, ask them how you can get to where you want to be. If you’re unsure, give him or her some insight into your thoughts on the matter and you might just learn something. It’s important to get as many perspectives as you can when it comes to big issues, like your career.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Here are some topics to discuss during your one on one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Career goals within and outside of the company.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Things you’ve done well or poorly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Things others have done well or poorly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Pain points in your process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Things stopping you from being efficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The company’s goals and direction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ways that you can improve the life of your colleague.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Neat puppers you’ve seen lately.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ve been alluding to this one on one meeting as regular (weekly or bi-weekly) and between an employee and his or her direct boss. I’ve done this because I think that is the where you’ll see the greatest gain, but it doesn’t necessarily have to be so conventional. I have personally found so much value in these meetings that I decided to set them up with my co-workers on a less frequent basis. Once a month, I make room in my forever-busy schedule to take a break and go grab a coffee with each of my co-workers. I’m not the only one who does this either. The CEO of my company does this with every one of his employees on a monthly basis. I guarantee that you will be surprised at the effect of simple regular communication with the people you spend most of your day with, can have on your happiness and your success.&lt;/p&gt;




&lt;p&gt;I hope that you give this a try and I encourage you to share your experience with one on one meetings, either in the comments or send me your own post. I’m always looking for ways to improve my own life and productivity, as well as that of my team members.&lt;/p&gt;

</description>
      <category>startup</category>
      <category>teamwork</category>
      <category>management</category>
      <category>softwareengineer</category>
    </item>
    <item>
      <title>JL Garofalo</title>
      <dc:creator>John Luke Garofalo</dc:creator>
      <pubDate>Fri, 20 Jan 2017 03:20:47 +0000</pubDate>
      <link>https://dev.to/johnlukeg/jl-garofalo</link>
      <guid>https://dev.to/johnlukeg/jl-garofalo</guid>
      <description>&lt;p&gt;I have been coding for ~6 years.&lt;/p&gt;

&lt;p&gt;You can find me on GitHub as &lt;a href="https://github.com/JLGarofal" rel="noopener noreferrer"&gt;JLGarofal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I live in Baltimore, MD.&lt;/p&gt;

&lt;p&gt;I work for Fixt Inc.&lt;/p&gt;

&lt;p&gt;I mostly program in these languages: JS, Ruby, Swift.&lt;/p&gt;

&lt;p&gt;I am currently learning more about VR, Digital Graphics, and linear algebra.&lt;/p&gt;

</description>
      <category>introduction</category>
    </item>
  </channel>
</rss>
