<?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>Forem: Kenneth Larsen</title>
    <description>The latest articles on Forem by Kenneth Larsen (@kennethlarsen).</description>
    <link>https://forem.com/kennethlarsen</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%2F56051%2F1d5d12e4-2806-4250-9f16-8c7514b79b51.jpg</url>
      <title>Forem: Kenneth Larsen</title>
      <link>https://forem.com/kennethlarsen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/kennethlarsen"/>
    <language>en</language>
    <item>
      <title>How I Stay on Top of 1:1s</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Mon, 23 Aug 2021 08:01:59 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/how-i-stay-on-top-of-1-1s-25cc</link>
      <guid>https://forem.com/kennethlarsen/how-i-stay-on-top-of-1-1s-25cc</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JaR0fHbp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1494599948593-3dafe8338d71%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMnwxMTc3M3wwfDF8c2VhcmNofDR8fG5vdGVzfGVufDB8fHx8MTYyOTcwNTM1MQ%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JaR0fHbp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1494599948593-3dafe8338d71%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMnwxMTc3M3wwfDF8c2VhcmNofDR8fG5vdGVzfGVufDB8fHx8MTYyOTcwNTM1MQ%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" alt="How I Stay on Top of 1:1s"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Keeping track of 1:1s, action items, feedback and important news to deliver can be quite overwhelming. 1:1s are so crucial, and while I've read a lot of how to do 1:1s, I did not find much on how to stay on top of 1:1s.&lt;/p&gt;

&lt;p&gt;That's why I build a system that serves me instead of me serving the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a System That Supports You
&lt;/h2&gt;

&lt;p&gt;Through trial and error, I've developed a system that supports me instead of supporting the system. Maybe this system works for you too, but the chances are that you need to make adjustments to make it fit your need and personality.&lt;/p&gt;

&lt;p&gt;Since moving to a fully remote work mode, I don't take notes in notebooks anymore. The fact that I can have my notes next to the video call and look into the camera as I write has turned out to be way more comfortable for me.&lt;/p&gt;

&lt;p&gt;To write and store my notes, I use the app &lt;a href="https://agenda.com/"&gt;Agenda&lt;/a&gt;. My system fully works in their free offering, though their paid version offers some nice-to-have features.&lt;/p&gt;

&lt;p&gt;My system is built around these blocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always have previous notes at hand&lt;/li&gt;
&lt;li&gt;Make it effortless to track points for the next meeting&lt;/li&gt;
&lt;li&gt;Make sure always to have feedback ready&lt;/li&gt;
&lt;li&gt;Make it effortless to replay the last 6 months&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Always Have Previous Notes at Hand
&lt;/h2&gt;

&lt;p&gt;It's crucial for me to easily scan the last few weeks' worth of 1:1 notes. This is why Agenda is quite useful to me. I have a 1:1 section in the left sidebar with a notebook for each person in my team. Whenever I click on the name of the person I have a 1:1 with, I instantly see the last few week's notes, and it puts me immediately back in the context of what is important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make it effortless to track talking points
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ob1Wuxhq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.kennethlarsen.org/content/images/2021/08/Screenshot-2021-08-19-at-13.09.25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ob1Wuxhq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.kennethlarsen.org/content/images/2021/08/Screenshot-2021-08-19-at-13.09.25.png" alt="How I Stay on Top of 1:1s"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I might get ideas, feedback, or action items that I need to bring forward into 1:1s with my team members during my day. To make this easy, the first note in every 1:1 notebook is named "Next", and it always stays as the first note (in the paid version, you can pin it to the top). This is also a great place to store action items from the meeting itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make Sure Always to Have Feedback Ready
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--n-cQSFNV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.kennethlarsen.org/content/images/2021/08/Screenshot-2021-08-19-at-13.21.29.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--n-cQSFNV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.kennethlarsen.org/content/images/2021/08/Screenshot-2021-08-19-at-13.21.29.png" alt="How I Stay on Top of 1:1s"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Underneath the "Next" note, I have pinned a "Feedback" note. &lt;a href="https://publish.obsidian.md/engineering-leadership/Great+leaders+provide+continuous+feedback"&gt;I believe great leaders provide continuous feedback&lt;/a&gt;, so my system needs to support me in this. Here I have two sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Needs Praise, which is where I add things I want to praise. Whenever I see them handling something well, I'll quickly add it here and make sure to tell them in the next 1:1.&lt;/li&gt;
&lt;li&gt;Growth opportunities are where I add items where I see a growth opportunity for them. I'll add a quick note to remind myself but &lt;a href="https://larahogan.me/blog/feedback-equation/"&gt;prepare it properly before the 1:1.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With all of my team members, I ask in our very first 1:1 how they would like to receive feedback. I store their answer at the top of this note as a reminder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make it Effortless to Replay the Last 6 Months
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yxuZi6AE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.kennethlarsen.org/content/images/2021/08/Screenshot-2021-08-23-at-09.51.22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yxuZi6AE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.kennethlarsen.org/content/images/2021/08/Screenshot-2021-08-23-at-09.51.22.png" alt="How I Stay on Top of 1:1s"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we do half-year feedback sessions, it's important to me to quickly see the praise, growth, talking points etc., from the last 6 months. With this system, it only takes me a few minutes to be fully up to date.&lt;/p&gt;

&lt;p&gt;Putting it all together, I have a full overview with just one click.&lt;/p&gt;

&lt;p&gt;A bonus feature of Agenda is that all new notes will be put "On the agenda". This means by the end of the day, I can easily review all new notes and make sure I have transferred all my action items.&lt;/p&gt;




&lt;p&gt;Want to get a weekly digest of the best in engineering leadership? Then sign up for my newsletter, &lt;a href="https://www.kennethlarsen.org/#/portal/signup/free"&gt;The Weekly Retro&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>tools</category>
      <category>meetings</category>
      <category>career</category>
    </item>
    <item>
      <title>Should I Become a Manager?</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Wed, 18 Aug 2021 05:00:00 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/should-i-become-a-manager-3a75</link>
      <guid>https://forem.com/kennethlarsen/should-i-become-a-manager-3a75</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O9tBT0cl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1531538512164-e6c51ea63d20%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMnwxMTc3M3wwfDF8c2VhcmNofDh8fGZlbWFsZSUyMG1hbmFnZXJ8ZW58MHx8fHwxNjI5MTAyNzc2%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O9tBT0cl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1531538512164-e6c51ea63d20%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMnwxMTc3M3wwfDF8c2VhcmNofDh8fGZlbWFsZSUyMG1hbmFnZXJ8ZW58MHx8fHwxNjI5MTAyNzc2%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" alt="Should I Become a Manager?"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's not always easy. I often get asked by senior developers if they should pick the management track or not. The management track is often used as a salary jump and not as the right career path. This often happens in companies that do not have any defined roles for principal or staff engineers.&lt;/p&gt;

&lt;p&gt;But should you become a manager? First, you need to answer some questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  1) Are you ready to give up coding?
&lt;/h2&gt;

&lt;p&gt;While you might find the time here and there to do some actual coding, you will soon realise that it is not a productive use of your time. You should instead spend time enabling those in your team who code. You will still utilise your coding knowledge as a manager but in a very different way, and you need to be ready for that before you say yes.&lt;/p&gt;

&lt;h2&gt;
  
  
  2) Do you enjoy interpersonal activities?
&lt;/h2&gt;

&lt;p&gt;When you change the track, you also change your main day-to-day tasks. It will differ from company to company on what exactly those tasks are, but for me, the tasks have always included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weekly 1:1 with team members&lt;/li&gt;
&lt;li&gt;Quarterly feedback reviews&lt;/li&gt;
&lt;li&gt;Coordination and planning meetings&lt;/li&gt;
&lt;li&gt;Reporting to stakeholders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's fine not to already be a master of these skills, but if you already know you don't like these kinds of tasks, then it's a red flag.&lt;/p&gt;

&lt;p&gt;I have often seen senior engineers accept the role because it seemed like the only way forward in career progression. In the end, they hated the work. Remember to reflect on that before you accept.&lt;/p&gt;

&lt;h2&gt;
  
  
  3) Do I know any people who went through the same transition?
&lt;/h2&gt;

&lt;p&gt;Talking directly to someone who has been through the same decision process can be tremendously helpful. This could be your existing manager, a colleague or a friend outside of work.&lt;/p&gt;

&lt;p&gt;If you do not know anyone, I can highly recommend the free mentoring service &lt;a href="//mentoring-club.com"&gt;The Mentoring Club&lt;/a&gt;. Here you can find a mentor with management experience and book them for a session.&lt;/p&gt;




&lt;p&gt;Still not sure? Then I highly recommend reading a few chapters in &lt;a href="https://www.oreilly.com/library/view/the-managers-path/9781491973882/"&gt;The Manager's Path&lt;/a&gt;. It helped me make the decision.&lt;/p&gt;

</description>
      <category>career</category>
    </item>
    <item>
      <title>Understand Your Users: Contextual Inquiry</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Thu, 12 Aug 2021 13:39:02 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/understand-your-users-contextual-inquiry-4c5h</link>
      <guid>https://forem.com/kennethlarsen/understand-your-users-contextual-inquiry-4c5h</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--siyy9Vls--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1616587894998-eb4d3007bbb9%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMnwxMTc3M3wwfDF8c2VhcmNofDQwfHxpbnRlcnZpZXd8ZW58MHx8fHwxNjI4Nzc1NDE1%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--siyy9Vls--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://images.unsplash.com/photo-1616587894998-eb4d3007bbb9%3Fcrop%3Dentropy%26cs%3Dtinysrgb%26fit%3Dmax%26fm%3Djpg%26ixid%3DMnwxMTc3M3wwfDF8c2VhcmNofDQwfHxpbnRlcnZpZXd8ZW58MHx8fHwxNjI4Nzc1NDE1%26ixlib%3Drb-1.2.1%26q%3D80%26w%3D2000" alt="Understand Your Users: Contextual Inquiry"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Understanding and interviewing your users is a crucial part of delivering the right things. While there are many ways of doing this, there's a particular theory that I was encouraged to follow by my design professor that is still stuck with me: &lt;em&gt;Contextual inquiry.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The contextual inquiry is not just about interviewing your users. It is built on the idea that systems design should be grounded in future users' work and aim to enrich the work through the new possibilities offered by information technology.&lt;br&gt;&lt;br&gt;
It is user interviews combined with observations. The goal is to construct a rich picture of the actual work situation: roles, responsibilities, problems with the work and existing tools, etc.&lt;/p&gt;

&lt;p&gt;A few principles guide it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Context&lt;/em&gt;: Start with the actual work, not with what people say they do&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Partnership&lt;/em&gt;: Future users are experts in their work and should be jointly responsible for the inquiry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Focus&lt;/em&gt;: Everybody focuses on something different in the same situation. Therefore it is essential to be aware of this fact and actively try to extend the total focus of the inquiry.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The interview is then best performed when the user is working on their daily tasks, and the interviewer is sitting next to them while they discuss what is happening and what that means. The interviewer should note what the user is saying and &lt;em&gt;what they are actively doing&lt;/em&gt;. Especially if any issues arise with the tools and to what extend the tools are supporting the work.&lt;/p&gt;

</description>
      <category>design</category>
      <category>product</category>
      <category>interview</category>
    </item>
    <item>
      <title>3 Ways to Give Better Feedback</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Fri, 16 Jul 2021 06:24:16 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/3-ways-to-give-better-feedback-48l6</link>
      <guid>https://forem.com/kennethlarsen/3-ways-to-give-better-feedback-48l6</guid>
      <description>&lt;p&gt;Giving feedback to your peers can be extremely difficult if you do not plan it right. Thankfully, there are a set of tools that can drastically improve those skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  1: Use the proper format
&lt;/h2&gt;

&lt;p&gt;"Your pull requests are really annoying to review!" is not feedback that is easy to accept or easy to act on. It is very confronting and blaming and thereby switches the focus away from solving the problem.&lt;/p&gt;

&lt;p&gt;Instead, feedback should follow an observing formula:&lt;/p&gt;

&lt;p&gt;Observation of behaviour + impact of the behaviour + question or request = actionable and specific feedback.&lt;/p&gt;

&lt;p&gt;The formula turns the feedback from something blaming into: "Over the last three weeks, I've noticed that you have created large pull requests without any descriptions or instructions. This more than doubles the review time needed and has led to five production bugs. Can you help me understand why you prefer these large pull requests?"&lt;/p&gt;

&lt;h2&gt;
  
  
  2: Negative feedback should be given with a growth mindset
&lt;/h2&gt;

&lt;p&gt;To ensure that people can use negative feedback, you must give it with a growth mindset. If the negative feedback does not have the goal of helping your colleague grow in that particular area, then it is not valuable feedback.&lt;/p&gt;

&lt;h2&gt;
  
  
  3: Do not deliver it as a script
&lt;/h2&gt;

&lt;p&gt;It might seem like a good idea to write down the feedback and read it to your colleague, but it will often come off as ungenuine. Feedback is about being present and listening, not delivering a presentation. &lt;/p&gt;

&lt;p&gt;With these three steps, you can easily take your feedback skills to the next level.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;Huston, Therese; Let's Talk: Make Effective Feedback Your Superpower&lt;/p&gt;

&lt;p&gt;Hogan, Lara; Resilient Management&lt;/p&gt;

</description>
      <category>feedback</category>
      <category>management</category>
      <category>leadership</category>
      <category>reviews</category>
    </item>
    <item>
      <title>Teams are not a constant, but a living and changing being</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Wed, 14 Jul 2021 11:31:28 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/teams-are-not-a-constant-but-a-living-and-changing-being-5aem</link>
      <guid>https://forem.com/kennethlarsen/teams-are-not-a-constant-but-a-living-and-changing-being-5aem</guid>
      <description>&lt;p&gt;Dealing with team changes can be very frustrating. Sometimes, it leads to a lack of delivery, decreased team mood, or even people quitting. There are a few things to be especially aware of when your team is going through change. Being open-minded to these frameworks can make a difference.&lt;/p&gt;

&lt;p&gt;A widespread mistake is to assume that your work is done once your team is delivering features. Teams are never in a finished or constant state but rather something living and ever-changing. Many events can cause a change in the team dynamics, productivity or mood:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;New people joining the team&lt;/li&gt;
&lt;li&gt;People leaving the team or the company&lt;/li&gt;
&lt;li&gt;Changing priorities&lt;/li&gt;
&lt;li&gt;Real-world events such as the Corona pandemic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thankfully, there are also great frameworks to help you understand where your team currently is and how to help them move towards becoming a healthy and productive team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Tuckman%27s_stages_of_group_development#Group_development"&gt;Tuckman's stages of group development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://lethain.com/durably-excellent-teams/"&gt;Four stages of a team&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To set up your team for success, you need to match the team changes with a change in expectations. Whether it is about changing the scope or team members, changes to a team should change expectations equal to the team change. This provides the much-needed space to get back on track to becoming a productive team.&lt;/p&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;Hogan, Lara; Resilient Management&lt;/p&gt;

&lt;p&gt;Larson, Will; An Elegant Puzzle: Systems of Engineering&lt;/p&gt;

</description>
      <category>leadership</category>
      <category>management</category>
    </item>
    <item>
      <title>How to Distribute a Rust Binary on NPM</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Mon, 30 Sep 2019 18:31:28 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/how-to-distribute-a-rust-binary-on-npm-75n</link>
      <guid>https://forem.com/kennethlarsen/how-to-distribute-a-rust-binary-on-npm-75n</guid>
      <description>&lt;p&gt;Recently I published a CLI tool called &lt;a href="https://github.com/kennethlarsen/baelte"&gt;baelte&lt;/a&gt;. It's written in Rust, and it's aimed at frontend developers who make applications using Svelte. I wanted to write it in Rust as a learning project but also to utilize the performance benefits which Rust provides over Node.&lt;/p&gt;

&lt;p&gt;When it came to building and releasing it, I was without a clue on how to do it. It seemed that I could push it to Cargo, but to me, that was not a good solution.&lt;/p&gt;

&lt;p&gt;First of all, Cargo seems like a registry for packages used by other Rust packages and not for user facing applications.&lt;/p&gt;

&lt;p&gt;Secondly, my target group most likely haven't installed Rust and doesn't know what Cargo is. I don't think they should need to know about an entirely different ecosystem to install my tool. Since they are frontend developers, the tool would need to be installable via &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But how can I ship a Rust tool on NPM? Let's find out!&lt;/p&gt;

&lt;h2&gt;
  
  
  Building
&lt;/h2&gt;

&lt;p&gt;Once my tool was ready to be build and shipped, I looked at what my options were. I wanted something that could be automatically triggered on Github and I did not want to spend too much time on building locally for several operating systems.&lt;/p&gt;

&lt;p&gt;Thankfully, there is a project called &lt;a href="https://github.com/japaric/trust"&gt;trust&lt;/a&gt; that saved my day. In the trust repository, they have build configurations ready for you to copy and paste. They make Travis build and test for several operating systems when you create a pull request in your repository.&lt;/p&gt;

&lt;p&gt;And even better, when you push a tag to your repository it will trigger a build for several operating systems, create a release on Github and push the binaries as downloads for your users to enjoy.&lt;/p&gt;

&lt;p&gt;This is really, really awesome. But, I don't want my users to go to a release page on Github and download the binaries themselves. Trust has a small script that can install the latest release for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-LSfs&lt;/span&gt; https://japaric.github.io/trust/install.sh | &lt;span class="se"&gt;\&lt;/span&gt;
    sh &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--git&lt;/span&gt; kennethlarsen/baelte

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;This will detect the user's operating system and fetching the related binary. While this is great, I still don't want my users to do this since this is out of their usual context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing via NPM
&lt;/h2&gt;

&lt;p&gt;Frontend developers expect packages and tools to be installable with &lt;code&gt;npm install&lt;/code&gt;. Since my tool is written in Rust and not JavaScript that makes things difficult.&lt;/p&gt;

&lt;p&gt;I decided to create a JavaScript file which triggers the install script previously mentioned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;exec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;child_process&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;curl -LSfs https://japaric.github.io/trust/install.sh | &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s1"&gt;
sh -s -- --git kennethlarsen/baelte&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="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stderr&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="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stderr&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;Then in &lt;code&gt;package.json&lt;/code&gt; I added a &lt;code&gt;postinstall&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"postinstall"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run install"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;which triggers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"install"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node install.js"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;And just like that, it is possible to publish your Rust CLI tool to npm. Users can now download my tool with &lt;code&gt;npm install -g baelte&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Rust for Frontend Developers: Modules</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Tue, 30 Apr 2019 09:57:24 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/rust-for-frontend-developers-modules-19p8</link>
      <guid>https://forem.com/kennethlarsen/rust-for-frontend-developers-modules-19p8</guid>
      <description>&lt;p&gt;Not that long ago I decided to start learning Rust. While it has a lot of useful resources online and a very friendly community there's still things that are weird to me. That's because Rust is a very different mental model than the frontend mental model I'm used to.&lt;/p&gt;

&lt;p&gt;That means that things that are obvious to a lot of people are not obvious to me. So I'll try to document some of these things from the perspective of a frontend developer. This time on using modules.&lt;/p&gt;




&lt;p&gt;With Javascript using imports or modules of any kind is fairly straight forward. If you have a very basic HTML page with a couple of JavaScript files you can add them all with a &lt;code&gt;script&lt;/code&gt; tag.&lt;/p&gt;

&lt;p&gt;If you have a more fancy setup you can import JavaScript files (or modules) like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;require('cool-module')&lt;/code&gt; or even &lt;code&gt;import { function } from 'cool-module'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you use a framework like Ember.js there's a standard of separating code that also goes beyond these module imports. Components are isolated chunks of code that can be invoked like this: &lt;code&gt;&amp;lt;CoolComponent @arg="wow" /&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The point is that there is a lot of ways of separating code on the frontend to make sure your codebase is manageable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modules with Rust
&lt;/h2&gt;

&lt;p&gt;While trying to make my &lt;a href="https://github.com/kennethlarsen/rember-cli"&gt;Rust clone of Ember-CLI&lt;/a&gt; I quickly discovered that the &lt;code&gt;main()&lt;/code&gt; function was getting out of hand. I wanted to split the code into separate files to make sure that I could maintain all of the features I wanted to add.&lt;/p&gt;

&lt;p&gt;There are a few things to keep in mind here.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where's my &lt;code&gt;npm install&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;The good news is that there is an equivalent system in place for distributing and using packages.  In the world of Rust that's called &lt;a href="https://crates.io/"&gt;Crates&lt;/a&gt;. Crates is the registry of the Rust community. To consume packages from this registry or publishing you have to use the &lt;code&gt;cargo&lt;/code&gt; package manager.&lt;/p&gt;

&lt;p&gt;If you want a package installed globally like &lt;code&gt;npm install -g cool-module&lt;/code&gt; then you'll run &lt;code&gt;cargo install cool-module&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But what if you want to install a package for your project? I'm honestly not sure if there is an equivalent to &lt;code&gt;npm install --save-dev cool-module&lt;/code&gt; since all documentation is proposing something different.&lt;/p&gt;

&lt;p&gt;The documented approach is to add the package name and version to the project's &lt;code&gt;Cargo.toml&lt;/code&gt;. This file is the equivalent of &lt;code&gt;package.json&lt;/code&gt;. Then when you build your project it will fetch the dependencies.&lt;/p&gt;

&lt;p&gt;Now you have to remember to import it where you need it like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;use package_name::module_name{function_name}&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separating Concerns
&lt;/h3&gt;

&lt;p&gt;Back to my main issue. I wanted to split out the code into different modules that I could import when I needed it.&lt;/p&gt;

&lt;p&gt;My project is currently like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;main.rs&lt;/code&gt; containing the basics to run the CLI tool and process input from the user.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;new.rs&lt;/code&gt; containing everything related to the &lt;code&gt;new&lt;/code&gt; command for generating new Ember projects.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;utils.rs&lt;/code&gt; for utility-like function such as creating a progress bar and replacing placeholder values with user inputted names.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;First I saw that it was possible to use the same import style from the package manager but for local files. I wanted to use the &lt;code&gt;create_new_application()&lt;/code&gt; function from &lt;code&gt;new.rs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;main.rs&lt;/code&gt; I tried &lt;code&gt;use rember::new::{create_new_application}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;But quickly got an error saying that &lt;code&gt;rember::new&lt;/code&gt; wasn't found.&lt;/p&gt;

&lt;p&gt;It turns out that these internal modules have to be declared first. Since I was building a CLI tool they had to go in a file named &lt;code&gt;lib.rs&lt;/code&gt; like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;mod new;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This made the &lt;code&gt;new.rs&lt;/code&gt; available for me to use in &lt;code&gt;main.rs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now I had another problem. I wanted to use a function from &lt;code&gt;utils.rs&lt;/code&gt; in &lt;code&gt;new.rs&lt;/code&gt; and just assumed that I had to use the exact same approach. But now I got the error with module not found.&lt;/p&gt;

&lt;p&gt;I still don't quite understand why but it looks like that for modules not imported in &lt;code&gt;main.rs&lt;/code&gt; they have to use &lt;code&gt;super&lt;/code&gt; instead of the package name &lt;code&gt;rember&lt;/code&gt;. So in &lt;code&gt;new.rs&lt;/code&gt; it looks like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;use super::utils::{create_progress_bar};&lt;/code&gt; instead of &lt;code&gt;use rember::utils::{create_progress_bar};&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>beginners</category>
      <category>rust</category>
    </item>
    <item>
      <title>How to turn a bash script into a Mac app</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Thu, 18 Apr 2019 20:20:10 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/turning-a-bash-script-into-a-mac-app-217c</link>
      <guid>https://forem.com/kennethlarsen/turning-a-bash-script-into-a-mac-app-217c</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%2Fwww.kennethlarsen.org%2Fcontent%2Fimages%2F2019%2F04%2Fdadjoke.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%2Fwww.kennethlarsen.org%2Fcontent%2Fimages%2F2019%2F04%2Fdadjoke.png"&gt;&lt;/a&gt;My dad joke app in the Mac dock&lt;/p&gt;

&lt;p&gt;I had this stupid idea: At work, we love to share dad jokes. And I know that there is a site called &lt;a href="https://icanhazdadjoke.com/" rel="noopener noreferrer"&gt;https://icanhazdadjoke.com/&lt;/a&gt; which when I &lt;code&gt;curl&lt;/code&gt; it returns a dad joke. So why not make a mac app that fetches a dad joke and reads it out loud?&lt;/p&gt;

&lt;p&gt;But I didn't even know where to start building a Mac app. I've built a lot of things, but never a Mac app. So I decided to start making a bash script instead. It looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;JOKE=$(curl https://icanhazdadjoke.com)

say -v Daniel "$JOKE"

exit 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This script will assign the dad joke from the website to a variable called &lt;code&gt;JOKE&lt;/code&gt;. Then I call the &lt;code&gt;say&lt;/code&gt; command which is a native Mac OS command that reads a string out loud. I pick the voice named &lt;code&gt;Daniel&lt;/code&gt; to have a consistent British feel to the delivery of the joke.&lt;/p&gt;

&lt;p&gt;I could easily run this and have a lot of fun. But, I wanted to share this with my colleagues. I wanted to turn the bash script into a Mac app.&lt;/p&gt;

&lt;p&gt;It turns out that if you create the folder structure of a Mac app and use the bash script as the &lt;code&gt;main.command&lt;/code&gt; it actually works. You can see the result here: &lt;a href="https://github.com/kennethlarsen/dadjoke.app" rel="noopener noreferrer"&gt;https://github.com/kennethlarsen/dadjoke.app&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Your Own App
&lt;/h2&gt;

&lt;p&gt;If you have your own bash script you would like to turn into a Mac app then start by forking my dad joke app. Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Edit &lt;a href="https://github.com/kennethlarsen/dadjoke.app/blob/master/dadjoke.app/Contents/Info.plist" rel="noopener noreferrer"&gt;Info.plist&lt;/a&gt; to contain your name and info.&lt;/li&gt;
&lt;li&gt;Add your bash script to &lt;a href="https://github.com/kennethlarsen/dadjoke.app/blob/master/dadjoke.app/Contents/MacOS/main.command" rel="noopener noreferrer"&gt;main.command&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Replace &lt;a href="https://github.com/kennethlarsen/dadjoke.app/blob/master/dadjoke.app/Contents/Resources/cmd.icns" rel="noopener noreferrer"&gt;cmd.icns&lt;/a&gt; with your own icon&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it! Now you can &lt;code&gt;zip&lt;/code&gt; it and send it to your friends.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>tutorial</category>
      <category>bash</category>
    </item>
    <item>
      <title>How to Contribute: Ember Times</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Thu, 07 Mar 2019 12:40:26 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/how-to-contribute-ember-times-34a8</link>
      <guid>https://forem.com/kennethlarsen/how-to-contribute-ember-times-34a8</guid>
      <description>&lt;p&gt;Getting started contributing to open source isn't always easy. Usually, there's a whole new code base we need to understand before starting contributing. Sometimes it's well-documented, sometimes not. That's why I always recommend people to start with documentation first and code later. It's a perfect way to get started contributing without any specialized tooling or knowledge, and usually, open source projects always welcome updates to the documentation.&lt;/p&gt;

&lt;p&gt;I've decided to create a guide on how to contribute to the Ember ecosystem starting with contributions that don't even require coding and ending up with something a bit more advanced. This is part one.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://the-emberjs-times.ongoodbits.com/"&gt;The Ember Times&lt;/a&gt; is a weekly newsletter made by a lot of different contributors. Some of them are members of the Core Teams, some of them have been writing for The Ember Times for a very long time, and some stop by to contribute once or twice. No matter which category you fall into, your contributions are always incredibly helpful and appreciated.&lt;/p&gt;

&lt;p&gt;Usually, a contributor for the Ember Times will select a topic and then write a small section about that specific topic. There's often the misconception with contributions like this that we have to be experts to write about a particular topic. I can guarantee you that most people who contribute documentation - including me - don't know a whole lot about what they're about to document.&lt;/p&gt;

&lt;p&gt;When I pick a topic, it's usually about something I don't know a whole lot about and that's perfectly fine. It's an excellent opportunity to learn.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first steps
&lt;/h2&gt;

&lt;p&gt;The first thing to do is to make sure that you're signed up for the &lt;a href="https://discordapp.com/invite/zT3asNS"&gt;Ember Discord chat&lt;/a&gt;. There is a channel named &lt;code&gt;#support-ember-times&lt;/code&gt;. This is where all work regarding the newsletter is coordinated.&lt;/p&gt;

&lt;p&gt;If you have never contributed to the Ember Times before it's a good idea to go and say hello. The Ember Times people are incredibly kind and will help you get started picking a topic if you need it.&lt;/p&gt;

&lt;p&gt;For each week there is a work in progress pull request containing the draft of the newsletter as well as a list of potential topics to include. This pull request can be found in the channel topic of the Discord channel.&lt;/p&gt;

&lt;p&gt;Let's have a look at one of the &lt;a href="https://github.com/emberjs/website/pull/3807."&gt;previous pull requests&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here you can see that I have picked the topic "New guides are out containing angle bracket invocation syntax." This is not because I have a specific knowledge about angle bracket invocation syntax, but it's something I wanted to know more about.&lt;/p&gt;

&lt;p&gt;When I've decided on a topic, I'll let the others know in the #support-ember-times channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting the Repo
&lt;/h2&gt;

&lt;p&gt;Working with open source repositories does require some work with Git. If you haven't used Git before I suggest completing a small Git tutorial before you proceed.&lt;/p&gt;

&lt;p&gt;First, visit &lt;a href="https://github.com/emberjs/website"&gt;https://github.com/emberjs/website&lt;/a&gt; and press the &lt;code&gt;fork&lt;/code&gt; button. This will create a fork of the repository that you can work directly on. Think of this as a photocopy of an original document. You can draw all you want on the photocopy until you're satisfied with the result and it won't harm the original.&lt;/p&gt;

&lt;p&gt;Once it's forked, it's time for some work in the terminal. In your terminal you need to clone your newly forked repository:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git clone URL&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You can find the clone URL in your forked repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ijprpoEL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.kennethlarsen.org/content/images/2019/03/Sk-rmbillede-2019-03-07-kl.-13.13.27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ijprpoEL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.kennethlarsen.org/content/images/2019/03/Sk-rmbillede-2019-03-07-kl.-13.13.27.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cd website/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now, we have one remote source for this repository which is your newly forked repository. This is great for when we want to create the pull request in the end. But for now, we want to fetch the work-in-progress pull request containing the draft of the Ember Times issue.&lt;/p&gt;

&lt;p&gt;Let's add the original repository as a remote source and call it &lt;code&gt;upstream&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git remote add upstream git@github.com:emberjs/website.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This means that we can fetch the branch containing the draft. The branch name can be found in the GitHub UI for the work-in-progress pull request.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git fetch upstream blog/embertimes-85&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And then let's checkout to that branch:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git checkout blog/embertimes-85&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now we're ready to create a branch that we want to work from. In my case I'll name it like this:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git checkout -b angle-bracket-guides&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;There are no rules for naming of your branch, but I like to include some reference to what it contains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Writing The Section
&lt;/h2&gt;

&lt;p&gt;The technical setup is done, and we're now ready to write some content. There are no rules on the length of the section, but I think the average is around 100 words. Ideally, we want to keep it short and sweet.&lt;/p&gt;

&lt;p&gt;Even though I'll write about angle bracket invocation syntax, I aim to keep it non-technical. Any crucial technical information, code samples or things like this should ideally live in a separate guide or blog post that can be referred to in the Ember Times.&lt;/p&gt;

&lt;p&gt;In this case, there's a new version of the Ember Guides containing this new syntax.&lt;/p&gt;

&lt;p&gt;Again, there are no rules on how to do this but here's my process when I write:&lt;/p&gt;

&lt;p&gt;I start by announcing the news right away while still keeping the reader interested.&lt;/p&gt;

&lt;p&gt;"A new version of the &lt;a href="https://guides.emberjs.com/release/"&gt;Ember guides&lt;/a&gt; has been deployed, and it contains some exciting surprises."&lt;/p&gt;

&lt;p&gt;Now since the new guides contain two new features I choose to start with the non-flashy one:&lt;/p&gt;

&lt;p&gt;"First of all, the guides-source and guides-app repositories have become **one repository**. This makes it so much more convenient to maintain and contribute. It also now uses the &lt;a href="https://github.com/empress/guidemaker"&gt;Guidemaker&lt;/a&gt; technology which means that CLI-guides and the Ember guides are using the same tech."&lt;/p&gt;

&lt;p&gt;And for the finale:&lt;/p&gt;

&lt;p&gt;"And now for the big surprise: **The newly deployed guides now contains angle bracket invocation syntax**. So, if you're looking to use angle bracket invocation syntax in your Ember application, the guides are the place to look for help."&lt;/p&gt;

&lt;p&gt;Now, as you might notice, this small section did not require me to have any special knowledge of the technical aspects of angle bracket invocation syntax for me to be able to write about the update.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping It Up
&lt;/h2&gt;

&lt;p&gt;Now that we've finished the section there are only a few things left to do. As you'll notice in &lt;a href="https://github.com/emberjs/website/pull/3817/files"&gt;my pull request&lt;/a&gt;, I've added a few things besides the section itself.&lt;/p&gt;

&lt;p&gt;In the very top, I add my name as an author. Everyone who writes a section for the Times should be credited as an author.&lt;/p&gt;

&lt;p&gt;Next, I've added a one-sentence description of my section for the introduction. Don't worry about it being cohesive with the rest - that will happen in the final edit.&lt;/p&gt;

&lt;p&gt;Lastly, I've added my name again at the bottom.&lt;/p&gt;

&lt;p&gt;You're now ready to commit everything and push it to your fork:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git add blog-file-name&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git commit -m "Added section on new guides"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git push origin angle-bracket-guides&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you visit your forked repository, you will now be able to create a pull request targeting &lt;code&gt;blog/embertimes-85&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When that's done, you should post a link to the pull request in the &lt;code&gt;#support-ember-times&lt;/code&gt; channel, and one of the team members will review your pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your Actions
&lt;/h2&gt;

&lt;p&gt;Are you ready to get started?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the Times channel, find the work-in-progress pull request.&lt;/li&gt;
&lt;li&gt;Pick a topic and let the Times people know.&lt;/li&gt;
&lt;li&gt;Fork and clone the repository.&lt;/li&gt;
&lt;li&gt;Start writing a small section.&lt;/li&gt;
&lt;li&gt;Add your name and an intro.&lt;/li&gt;
&lt;li&gt;Send it for review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you get stuck or need any help, please reach out to the fantastic Ember Times people in the Times channel on Discord.&lt;/p&gt;




&lt;p&gt;That's it for getting started contributing to the Ember Times. Stay tuned for the next post in this series where will write a section for the release post together.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Inclusive Documentation With alex</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Tue, 19 Feb 2019 13:49:31 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/inclusive-documentation-with-alex-2gcp</link>
      <guid>https://forem.com/kennethlarsen/inclusive-documentation-with-alex-2gcp</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3Sehc0tN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.kennethlarsen.org/content/images/2019/02/Sk-rmbillede-2019-02-19-kl.-15.00.54.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3Sehc0tN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.kennethlarsen.org/content/images/2019/02/Sk-rmbillede-2019-02-19-kl.-15.00.54.png" alt="Inclusive Documentation With alex"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is a lot of helpful open-source tools out there that can help us improve our documentation. In general, automated tools can help us remove the overhead that exists in maintaining documentation and let us spend our valuable time on writing the content. Sadly, these tools aren't perfect, and you have to be aware of a few things. In this post, I'll show you how to refactor our current documentation using alex.&lt;/p&gt;

&lt;p&gt;The development community doesn't have the best reputation when it comes to being inclusive and considerate. Even though a lot of great efforts has been made to improve this, we're still far away from the goal. There is however one thing we can do to help promote this - and it all starts with documentation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://alexjs.com/"&gt;alex&lt;/a&gt; is an automated tool that enables us to catch inconsiderate and offensive language within our documentation and even our code base.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;To get started we have to &lt;code&gt;cd&lt;/code&gt; into a directory containing one or more markdown file and run &lt;code&gt;npx alex&lt;/code&gt;.  (or &lt;code&gt;npm install -g alex; alex&lt;/code&gt;). Now the output in the terminal should tell you if there are any current issues with our documentation.&lt;/p&gt;

&lt;p&gt;If we want to have this working as a linter inside our editor there are a few integrations available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Atom: &lt;a href="https://github.com/get-alex/atom-linter-alex"&gt;atom-linter-alex&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sublime: &lt;a href="https://github.com/sindresorhus/SublimeLinter-contrib-alex"&gt;SublimeLinter-contrib-alex&lt;/a&gt; (by &lt;a href="https://github.com/sindresorhus"&gt;@sindresorhus&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Visual Studio Code: &lt;a href="https://github.com/shinnn/vscode-alex"&gt;vscode-alex&lt;/a&gt; (by &lt;a href="https://github.com/shinnn"&gt;@shinnn&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Gulp: &lt;a href="https://github.com/dustinspecker/gulp-alex"&gt;gulp-alex&lt;/a&gt; (by &lt;a href="https://github.com/dustinspecker"&gt;@dustinspecker&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Slack: &lt;a href="https://github.com/keoghpe/alex-slack"&gt;alex-slack&lt;/a&gt; (by &lt;a href="https://github.com/keoghpe"&gt;@keoghpe&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Probot: &lt;a href="https://github.com/swinton/linter-alex"&gt;linter-alex&lt;/a&gt; (by &lt;a href="https://github.com/swinton"&gt;@swinton&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Vim: &lt;a href="https://github.com/w0rp/ale"&gt;ALE&lt;/a&gt; (by &lt;a href="https://github.com/w0rp"&gt;@w0rp&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we're using Ember.js there's even an Ember addon that will run alex within our test suite to also catch offensive namings within our code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ember: &lt;a href="https://github.com/yohanmishkin/ember-cli-alex"&gt;ember-cli-alex&lt;/a&gt; (by &lt;a href="https://github.com/yohanmishkin"&gt;@yohanmishkin&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Refactoring Our Documentation
&lt;/h2&gt;

&lt;p&gt;So, we have alex running, and it's listing a lot of issues - how do we proceed from here?&lt;/p&gt;

&lt;p&gt;There will be words that alex catches that might not be inconsiderate or offensive at all - and that's fine. It's a linter, not a human. This is where we as a company or maintainer get to define our rules. Let's say we have written the following sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To try out the new React hooks visit the guides.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;alex will return the following:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Be careful with &lt;code&gt;hooks&lt;/code&gt;, it’s profane in some cases&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now, while it's true that &lt;code&gt;hooks&lt;/code&gt; is profane in some cases, some cases it's not. If we would like to ignore this warning since it's not profane in this context we add an ignore statement above the sentence like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!-- alex ignore hooks --&amp;gt;
&amp;lt;p&amp;gt;To try out the new React hooks visit the guides.&amp;lt;/p&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If we run alex once again, it will return no errors or warnings.&lt;/p&gt;

&lt;p&gt;But what if all we write about is React hooks? It's quite cumbersome to add the ignore statement every single time we mention React hooks. Thankfully, alex supports an ignore file.&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://github.com/emberjs/website"&gt;repository for the Ember.js website&lt;/a&gt; we have an ignore file that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "allow": ["color", "dad-mom", "her-him", "he-she", "hook", "hooks", "harder"] 
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As long as this file is named &lt;code&gt;.alexrc&lt;/code&gt; and placed in the root of the project it will automatically ignore these words.&lt;/p&gt;

&lt;p&gt;Whatever is left after ignoring non-offensive words are things we should fix. Say we have a README.md that contained the following section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;It writes all changes to the **master server** thus, the slaves were read-only copies of master. 

If any of you guys would like to contribute please do so 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;alex will raise issues about this text. First of all, the use of  &lt;code&gt;master/slave&lt;/code&gt; is considered to be insensitive. Instead, we should use terms like &lt;code&gt;primary/replica&lt;/code&gt; which - besides being more inclusive - is a much more precise term.&lt;/p&gt;

&lt;p&gt;Another issue we have is the use of &lt;code&gt;guys&lt;/code&gt;. alex tells us that "&lt;code&gt;guys&lt;/code&gt; may be insensitive, use &lt;code&gt;people&lt;/code&gt;, &lt;code&gt;persons&lt;/code&gt;, &lt;code&gt;folks&lt;/code&gt; instead". In this case, I agree that &lt;code&gt;guys&lt;/code&gt; is insensitive and hinting that males are the ones being encouraged to contribute.&lt;/p&gt;

&lt;p&gt;After a few changes we now have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;It writes all changes to the **primary server** thus, the replicas were read-only copies of primary. 

If any of you folks would like to contribute please do so 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much better.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping It Clean
&lt;/h2&gt;

&lt;p&gt;Besides having the linter in our IDE and running alex on our local machine, there is something we could do to catch errors going forward.&lt;/p&gt;

&lt;p&gt;If we again have a look at the &lt;a href="https://github.com/emberjs/website"&gt;Ember.js website repository&lt;/a&gt; we find a script that is being run by the CI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git remote add base https://github.com/emberjs/website.git
git fetch base
BLOG_HAS_CHANGES=$(git diff --name-status base/master source/blog/2*)
if [[$BLOG_HAS_CHANGES]]
  then
    alex $(git diff --name-status base/master source/blog/2* | sed s/^..//)
fi

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This script checks whether the blog has any changes - since the blog is currently the only place where alex is being run - and if so alex is being run in the diff only. This is especially important when we already have a lot of documentation. Changing everything in one go is often not a possibility, but catching it going forward is doable.&lt;/p&gt;

&lt;p&gt;So, every time a pull request is raised alex will make sure that we consider our language.&lt;/p&gt;




&lt;p&gt;It might be overwhelming at first, but I do think it is worth investing in improving our documentation to be more welcoming and inclusive.&lt;/p&gt;

</description>
      <category>documentation</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
    <item>
      <title>What Can We Learn From +50000 Tweets About Ember.js</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Sun, 12 Aug 2018 16:40:30 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/what-can-we-learn-from-50000-tweets-about-emberjs-2k3c</link>
      <guid>https://forem.com/kennethlarsen/what-can-we-learn-from-50000-tweets-about-emberjs-2k3c</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eBFVvxPo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AdiKuoCb0vjKUjXMrrKixXQ.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eBFVvxPo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn-images-1.medium.com/max/1024/1%2AdiKuoCb0vjKUjXMrrKixXQ.jpeg" alt=""&gt;&lt;/a&gt;Photo by &lt;a href="https://unsplash.com/photos/HAIPJ8PyeL8?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;freestocks.org&lt;/a&gt; on &lt;a href="https://unsplash.com/search/photos/twitter?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  What Have You Done?!
&lt;/h4&gt;

&lt;p&gt;I had a thought. I wanted to gain an overview of open source communities and their activity. A first natural place to look is Twitter since a lot of developers are sharing and discussing on that platform. I wanted to start a place that I thought was particularly interesting: Ember.js.&lt;/p&gt;

&lt;p&gt;So, I decided to scrape every single tweet containing the hashtag #EmberJS. This contains everything (Well, except for the ones that have been deleted). I then used Elasticsearch with Kibana and started finding trends and interesting data.&lt;/p&gt;

&lt;p&gt;The very first tweet in the database — and what seems to be the first tweet ever about Ember.js is:&lt;/p&gt;

&lt;p&gt;Liquid error: internal&lt;/p&gt;

&lt;p&gt;Now, there might have been earlier tweets but they have since been deleted. The latest tweet in the database is this one:&lt;/p&gt;

&lt;p&gt;Liquid error: internal&lt;/p&gt;

&lt;p&gt;Which gives a time frame of just about 7 years.&lt;/p&gt;

&lt;p&gt;The goal of this post is to gain an overview of the Ember.js community &lt;strong&gt;just&lt;/strong&gt; by looking at the tweet activity through 7 years. In total, this contains 51866 tweets. This is the first post in this series, but I intend to continue with other open source communities.&lt;/p&gt;

&lt;h4&gt;
  
  
  The Most Active Users
&lt;/h4&gt;

&lt;p&gt;One way to understand a community is to look into the most active people in that community. So, I created a top ten of Twitter users who have used the Ember.js hashtag.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top ten amount of tweets&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a class="mentioned-user" href="https://dev.to/tarasm"&gt;@tarasm&lt;/a&gt;
 (16,280 tweets)&lt;/li&gt;
&lt;li&gt;@michaellnorth (10,720 tweets)&lt;/li&gt;
&lt;li&gt;@EmberWatch (8,163 tweets)&lt;/li&gt;
&lt;li&gt;@EmberA2D (8,021 tweets)&lt;/li&gt;
&lt;li&gt;
&lt;a class="mentioned-user" href="https://dev.to/ladyleet"&gt;@ladyleet&lt;/a&gt;
 (6,542 tweets)&lt;/li&gt;
&lt;li&gt;@JavascriptFlux (4,817 tweets)&lt;/li&gt;
&lt;li&gt;@dr_vitus_zato (4,442 tweets)&lt;/li&gt;
&lt;li&gt;@EmberWeekly (3,848 tweets)&lt;/li&gt;
&lt;li&gt;@TechWars_io (3,486 tweets)&lt;/li&gt;
&lt;li&gt;@JavaScriptKicks (3,270 tweets)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now one of the interesting things with this list is that we see accounts like @JavaScriptKicks and @Techwars_io. If we have a look at what they are writing it’s quick to see that they are just spam machines trying to ride the Ember.js wave. For example, @Techwars_io has written the following tweet 2.265 times:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We compared #batmanjs vs #emberjs — see results: &lt;a href="http://www.techwars.io/fight/batmanjs/emberjs/"&gt;http://www.techwars.io/fight/batmanjs/emberjs/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is obviously spam and they have earned the first place in the spam list of the Ember.js community.&lt;/p&gt;

&lt;p&gt;Thankfully, the other Twitter users are not horrible like this. The most active users also seem to be community profiles like @EmberWatch and @EmberWeekly though the most active users are actual profiles.&lt;/p&gt;

&lt;p&gt;It’s interesting that the official Ember.js account didn’t make this list which would have made sense. Also, this top 10 seems to indicate the majority of the core team are mostly active in other places than the #EmberJS community. This might be the forum or Slack. Maybe their time is better spent there?&lt;/p&gt;

&lt;h4&gt;
  
  
  What Makes an Ember Tweet Popular?
&lt;/h4&gt;

&lt;p&gt;Likes and retweets are a popular measure of success. Even though I agree that it can tell us &lt;em&gt;something&lt;/em&gt; about what’s popular it’s not always significant in showing us what is valuable for a community. That being said, I still think it’s interesting to have a look at what makes an Ember.js tweet popular.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top 5 retweets&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;@baaz: &lt;a href="https://twitter.com/baaz/status/649587166247579648"&gt;https://twitter.com/baaz/status/649587166247579648&lt;/a&gt; (202 retweets)
&lt;/li&gt;
&lt;li&gt;
&lt;a class="mentioned-user" href="https://dev.to/pocztarski"&gt;@pocztarski&lt;/a&gt;
: &lt;a href="https://twitter.com/pocztarski/status/537078929916694528"&gt;https://twitter.com/pocztarski/status/537078929916694528&lt;/a&gt; (177 retweets)
&lt;/li&gt;
&lt;li&gt;@michaellnorth: &lt;a href="https://twitter.com/michaellnorth/status/593564323865174016"&gt;https://twitter.com/michaellnorth/status/593564323865174016&lt;/a&gt; (165 retweets)
&lt;/li&gt;
&lt;li&gt;@baaz: &lt;a href="https://twitter.com/baaz/status/568136988093767681"&gt;https://twitter.com/baaz/status/568136988093767681&lt;/a&gt; (132 retweets)
&lt;/li&gt;
&lt;li&gt;@Evontech: &lt;a href="https://twitter.com/Evontech/status/824130617776504832"&gt;https://twitter.com/Evontech/status/824130617776504832&lt;/a&gt; (118 retweets)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There are a few interesting things about this list. First, it seems like the most popular Ember tweets still have a quite low retweet count. Compared to something like #reactjs this is really in the low end. Why is that?&lt;/p&gt;

&lt;p&gt;It &lt;em&gt;could&lt;/em&gt; be that the Ember.js simply is smaller and the possible amount of retweets is therefore smaller. Ember.js also has other active communication channels such as Slack where there’s way more activity which could result in Twitter not being as active.&lt;/p&gt;

&lt;p&gt;Another reason might be the fact that Ember.js is not very good at hyping itself. If you look at this tweet by Dan Abramov stating that you can use React.js without npm you’ll see that it has twice the retweets as the number one retweeted Ember.js tweet. Something so simple, so hyped.&lt;/p&gt;


&lt;blockquote class="ltag__twitter-tweet"&gt;
      &lt;div class="ltag__twitter-tweet__media"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FmExjp9B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/DgtUuTdW4AAd0as.jpg" alt="unknown tweet media content"&gt;
      &lt;/div&gt;

  &lt;div class="ltag__twitter-tweet__main"&gt;
    &lt;div class="ltag__twitter-tweet__header"&gt;
      &lt;img class="ltag__twitter-tweet__profile-image" src="https://res.cloudinary.com/practicaldev/image/fetch/s--rWFXJF0B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/profile_images/906557353549598720/oapgW_Fp_normal.jpg" alt="Dan Abramov profile image"&gt;
      &lt;div class="ltag__twitter-tweet__full-name"&gt;
        Dan Abramov
      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__username"&gt;
        &lt;a class="mentioned-user" href="https://dev.to/dan_abramov"&gt;@dan_abramov&lt;/a&gt;

      &lt;/div&gt;
      &lt;div class="ltag__twitter-tweet__twitter-logo"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ir1kO05j--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-f95605061196010f91e64806688390eb1a4dbc9e913682e043eb8b1e06ca484f.svg" alt="twitter logo"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__body"&gt;
      Did you know: you can use React as a &amp;lt;script&amp;gt; tag without npm! 🤔 Here’s a handy guide: &lt;a href="https://t.co/gJwqp3ADJf"&gt;reactjs.org/docs/add-react…&lt;/a&gt; 
    &lt;/div&gt;
    &lt;div class="ltag__twitter-tweet__date"&gt;
      15:32 PM - 27 Jun 2018
    &lt;/div&gt;


    &lt;div class="ltag__twitter-tweet__actions"&gt;
      &lt;a href="https://twitter.com/intent/tweet?in_reply_to=1011995700748521477" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fFnoeFxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-reply-action-238fe0a37991706a6880ed13941c3efd6b371e4aefe288fe8e0db85250708bc4.svg" alt="Twitter reply action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/retweet?tweet_id=1011995700748521477" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k6dcrOn8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-retweet-action-632c83532a4e7de573c5c08dbb090ee18b348b13e2793175fea914827bc42046.svg" alt="Twitter retweet action"&gt;
      &lt;/a&gt;
      &lt;a href="https://twitter.com/intent/like?tweet_id=1011995700748521477" class="ltag__twitter-tweet__actions__button"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SRQc9lOp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/twitter-like-action-1ea89f4b87c7d37465b0eb78d51fcb7fe6c03a089805d7ea014ba71365be5171.svg" alt="Twitter like action"&gt;
      &lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/blockquote&gt;


&lt;p&gt;Why is it that Ember.js cannot manage to hype itself like this? First of all, Ember.js already have a lot of amazing features but they are not all new. They are just there. And they work. And they’ve been there for a while. When there is something new and great it sort of just slips through the hype system.&lt;/p&gt;

&lt;p&gt;This means that Ember.js &lt;em&gt;could&lt;/em&gt; start rebranding existing features to gain the hype that React.js benefits from. This also means that &lt;strong&gt;future&lt;/strong&gt; communication from Ember.js could be phrased in similar ways as React.js.&lt;/p&gt;

&lt;p&gt;But maybe it doesn’t matter at all? Is the hype even worth it? One of the great benefits of Ember.js is that it’s consistent, conventional and stable. That is also the &lt;em&gt;feeling&lt;/em&gt; I get when I read the community tweets. I get a totally different feeling when reading the React.js tweets and perhaps the two frameworks have found their different homes on Twitter and that’s all good. What I do know is that when I talk to developers about Ember.js they think it’s dead. And that’s mainly because of the lack of online presence.&lt;/p&gt;

&lt;p&gt;If we go back to the retweets it’s also noticeable that two of the top five tweets are by @baaz on the same subject. He did write a &lt;strong&gt;great&lt;/strong&gt; book on Ember.js and the fact that this book earns the most retweets might suggest a critical thing about the Ember.js community.&lt;/p&gt;

&lt;p&gt;The fact the one book resource gains all the retweets might suggest that Ember.js suffers from a lack of good learning resources so that when there’s finally a great one it gets shared a lot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top 5 liked tweets&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;@pusher&lt;a href="https://twitter.com/pusher/status/839052252417560576"&gt;https://twitter.com/pusher/status/839052252417560576&lt;/a&gt; (354 likes)&lt;/li&gt;
&lt;li&gt;@lukedeniston &lt;a href="https://twitter.com/lukedeniston/status/876873369970290688"&gt;https://twitter.com/lukedeniston/status/876873369970290688&lt;/a&gt; (154 likes)&lt;/li&gt;
&lt;li&gt;
&lt;a class="mentioned-user" href="https://dev.to/jeffreybiles"&gt;@jeffreybiles&lt;/a&gt;
 &lt;a href="https://twitter.com/JeffreyBiles/status/791664130490937344"&gt;https://twitter.com/JeffreyBiles/status/791664130490937344&lt;/a&gt; (135 likes)&lt;/li&gt;
&lt;li&gt;
&lt;a class="mentioned-user" href="https://dev.to/remi"&gt;@remi&lt;/a&gt;
 &lt;a href="https://twitter.com/remi/status/984851429906178048"&gt;https://twitter.com/remi/status/984851429906178048&lt;/a&gt; (131 likes)&lt;/li&gt;
&lt;li&gt;@rwjblue &lt;a href="https://twitter.com/rwjblue/status/799722020745441281"&gt;https://twitter.com/rwjblue/status/799722020745441281&lt;/a&gt; (123 likes)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here the top tweets are about features and talks that are interesting for the community. But still the top tweet here only have 354 likes which is nothing compared to tweets in the React.js community. Reasons might be the same as for the retweets.&lt;/p&gt;

&lt;h4&gt;
  
  
  Engaging in tweets
&lt;/h4&gt;

&lt;p&gt;So far it doesn’t look like that there’s a lot of engagement in sharing news about Ember.js on Twitter. So what about discussions? If we look at the tweets with the most replies we might get a bit disappointed:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Top 5 Replies Count&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;@joachimhs: &lt;a href="https://twitter.com/joachimhs/status/376046831660068864"&gt;https://twitter.com/joachimhs/status/376046831660068864&lt;/a&gt; (34 replies)&lt;/li&gt;
&lt;li&gt;@ryantotweets: &lt;a href="https://twitter.com/ryantotweets/status/948228827230228480"&gt;https://twitter.com/ryantotweets/status/948228827230228480&lt;/a&gt; (22 replies)&lt;/li&gt;
&lt;li&gt;@michaeldegli:&lt;a href="https://twitter.com/michaeldegli/status/458365260009705472"&gt;https://twitter.com/michaeldegli/status/458365260009705472&lt;/a&gt; (20 replies)&lt;/li&gt;
&lt;li&gt;
&lt;a class="mentioned-user" href="https://dev.to/tarasm"&gt;@tarasm&lt;/a&gt;
: &lt;a href="https://twitter.com/tarasm/status/906935258909630464"&gt;https://twitter.com/tarasm/status/906935258909630464&lt;/a&gt; (18 replies)&lt;/li&gt;
&lt;li&gt;@ebryn: &lt;a href="https://twitter.com/ebryn/status/463778352021508096"&gt;https://twitter.com/ebryn/status/463778352021508096&lt;/a&gt; (16 replies)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These numbers are also on the low side which suggests that actual discussions about Ember.js are probably happening elsewhere. The fact that the most replied to tweet only have 34 replies and is about getting a free eBook says it all.&lt;/p&gt;

&lt;h4&gt;
  
  
  So… Is It Dead?
&lt;/h4&gt;

&lt;p&gt;Of course not. Even though Twitter activity isn’t saying everything about a community I do feel that it provides a great insight into &lt;em&gt;why&lt;/em&gt; a lot of people think Ember.js is dead. The majority of activity and engagement is happening in specific Ember.js communities such as the forum or the very active Slack channel. But that means you only see it if you’re already part of the community.&lt;/p&gt;

&lt;p&gt;If I’m a React.js developer I will most likely never see an Ember.js retweet, like or discussion on Twitter. So why should I think it’s still alive? I personally don’t work with React.js but yet I see React.js tweets all the time in my timeline.&lt;/p&gt;

&lt;p&gt;It might not be worth creating a more active Ember.js community on Twitter but it at least explains something about how other communities see Ember.js&lt;/p&gt;

&lt;p&gt;Want to read more posts like this? Follow me on &lt;a href="https://twitter.com/kennethlarsen"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>twitter</category>
      <category>scraping</category>
      <category>ember</category>
    </item>
    <item>
      <title>Five Minute Accessibility: Input and Labels</title>
      <dc:creator>Kenneth Larsen</dc:creator>
      <pubDate>Sun, 16 Jul 2017 08:06:01 +0000</pubDate>
      <link>https://forem.com/kennethlarsen/five-minute-accessibility-input-and-labels-20e9</link>
      <guid>https://forem.com/kennethlarsen/five-minute-accessibility-input-and-labels-20e9</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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2ANlqpTTAM8DbGl4paBmjE_g.jpeg" 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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2ANlqpTTAM8DbGl4paBmjE_g.jpeg"&gt;&lt;/a&gt;Photo: Christopher Gower&lt;/p&gt;

&lt;p&gt;It seems that a lot of frontend developers either don’t know about coding for accessibility or they don’t care. Of course, it can be hard to implement in organizations with no focus on accessibility. But it’s always a developer’s (and designer’s) responsibility to develop an inclusive web.&lt;/p&gt;

&lt;p&gt;In the series &lt;em&gt;Five Minute Accessibility&lt;/em&gt; I will introduce one simple thing you can do to improve accessibility in your projects. In this post you’ll learn about how to use input and labels.&lt;/p&gt;

&lt;p&gt;Even though you’ve been creating input forms for years it might be the case that none of them are accessible. Thankfully, it’s very simple to change this starting today.&lt;/p&gt;

&lt;p&gt;To create accessible input fields you have to beware of labels. Creating a label which is uniquely tied to an input field is necessary to create accessible forms. Note that labels are referring to an id of the input. Screen readers do not support multiple labels associated with the same form element.&lt;/p&gt;

&lt;p&gt;So you might normally see an input field like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;label&amp;gt;Name:&amp;lt;/label&amp;gt;
&amp;lt;input type=”text” name=”textfield”&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you might expect this works great for users of non-assistive technologies and this is a very common way of developing forms. However, this will be non-inclusive. So by simply wiring the label and the input we now have an accessible input field:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;label for=”name” &amp;gt;Name:&amp;lt;/label&amp;gt;
&amp;lt;input id=”name” type=”text” name=”textfield”&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By adding for=”name” to the label we link this label uniquely to the id of the input. This is now accessible and also has some other nice features included. The user can now click on the label itself to set focus to the form element. This is useful to some with motor disabilities, particularly when selecting small checkboxes and radio buttons.&lt;/p&gt;

&lt;p&gt;The good thing is that this is useable for other types of inputs as well. Let’s have a look at check boxes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;fieldset&amp;gt;
&amp;lt;legend&amp;gt;Select your pizza toppings:&amp;lt;/legend&amp;gt;
&amp;lt;input id=”ham” type=”checkbox” name=”toppings” value=”ham”&amp;gt;
&amp;lt;label for=”ham”&amp;gt;Ham&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input id=”pepperoni” type=”checkbox” name=”toppings” value=”pepperoni”&amp;gt;
&amp;lt;label for=”pepperoni”&amp;gt;Pepperoni&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input id=”mushrooms” type=”checkbox” name=”toppings” value=”mushrooms”&amp;gt;
&amp;lt;label for=”mushrooms”&amp;gt;Mushrooms&amp;lt;/label&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input id=”olives” type=”checkbox” name=”toppings” value=”olives”&amp;gt;
&amp;lt;label for=”olives”&amp;gt;Olives&amp;lt;/label&amp;gt;
&amp;lt;/fieldset&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice that each check box has an id which is matched by the label. By adding these few lines you have accessible forms — so why not start doing it today?&lt;/p&gt;




&lt;p&gt;Check out my &lt;a href="http://kennethlarsen.org/fails/" rel="noopener noreferrer"&gt;fail log&lt;/a&gt; or subscribe to my &lt;a href="https://tinyletter.com/failmail" rel="noopener noreferrer"&gt;Fail Mail newsletter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also follow me on &lt;a href="https://www.twitter.com/kennethlarsen" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;.&lt;/p&gt;




</description>
      <category>javascript</category>
      <category>html</category>
      <category>a11y</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
