<?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: Gabriel Reimers</title>
    <description>The latest articles on DEV Community by Gabriel Reimers (@codingfriend1).</description>
    <link>https://dev.to/codingfriend1</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%2F655646%2Fa71d1be1-afe1-4e93-8492-499a2aa6fdad.png</url>
      <title>DEV Community: Gabriel Reimers</title>
      <link>https://dev.to/codingfriend1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/codingfriend1"/>
    <language>en</language>
    <item>
      <title>What the "in" keyword in Swift Closures means</title>
      <dc:creator>Gabriel Reimers</dc:creator>
      <pubDate>Mon, 11 Jul 2022 08:46:08 +0000</pubDate>
      <link>https://dev.to/codingfriend1/what-the-in-keyword-in-swift-closures-means-ia1</link>
      <guid>https://dev.to/codingfriend1/what-the-in-keyword-in-swift-closures-means-ia1</guid>
      <description>&lt;p&gt;Ever since I started programming in Swift if found the &lt;code&gt;in&lt;/code&gt; keyword for closures a bit weird. It doesn't make much sense to me.&lt;br&gt;
For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;by&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="nv"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;s2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;Bool&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; 
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s2&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;Today I found this explanation by Joe Groff, one of the original Swift engineers:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forums.swift.org/t/history-why-does-closure-syntax-use-the-keyword-in/21885"&gt;https://forums.swift.org/t/history-why-does-closure-syntax-use-the-keyword-in/21885&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL/DR:&lt;br&gt;
There is no real meaning in &lt;code&gt;in&lt;/code&gt;. It was chosen for a lack of a better keyword.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I personally think about &lt;code&gt;in&lt;/code&gt; as an abbreviation for &lt;code&gt;input&lt;/code&gt;, because that at least makes sense when the return type is inferred like here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;by&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s2&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;s1&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;s2&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;



</description>
      <category>swift</category>
    </item>
    <item>
      <title>My favorite Slack apps for remote work</title>
      <dc:creator>Gabriel Reimers</dc:creator>
      <pubDate>Tue, 28 Jun 2022 16:19:22 +0000</pubDate>
      <link>https://dev.to/codingfriend1/my-favorite-slack-apps-for-remote-work-222p</link>
      <guid>https://dev.to/codingfriend1/my-favorite-slack-apps-for-remote-work-222p</guid>
      <description>&lt;p&gt;When your team is fully or partially remote, Slack becomes the central hub for collaboration.&lt;/p&gt;

&lt;p&gt;Here are my five favorite apps that help our team stay productive, connected and motivated.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏷 &lt;a href="https://rewindapp.io"&gt;Rewind&lt;/a&gt; — Organize to-dos with tags
&lt;/h3&gt;

&lt;p&gt;Communicating remotely inevitably means you get a lot of Slack messages for your various projects.&lt;/p&gt;

&lt;p&gt;While Slack has bookmarks and reminders built in, it can still get messy when you have a lot going on.&lt;/p&gt;

&lt;p&gt;Rewind lets you store messages for reading later and organize them with tags like “to-do”, “research”, “project-x” etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧁 &lt;a href="https://macarons-roulette.app/"&gt;Macarons&lt;/a&gt; — Chat roulettes &amp;amp; random coffees
&lt;/h3&gt;

&lt;p&gt;When you don’t meet your teammates in the hallway or at the coffee machine, you miss out on small-talk and social interaction.&lt;/p&gt;

&lt;p&gt;Chat roulettes are a great way to stay connected. Add Macarons app to a team channel and it will automatically match random pairs (or groups) of co-workers to have a short video chat (preferably over off-work topics).&lt;/p&gt;

&lt;h3&gt;
  
  
  🥷 &lt;a href="https://www.incognitoforslack.com/"&gt;Incognito&lt;/a&gt; — Anonymous feedback
&lt;/h3&gt;

&lt;p&gt;No matter how flat your hierarchies are or how open your company-culture is, sometimes you just can’t give feedback openly.&lt;/p&gt;

&lt;p&gt;Incognito lets you post feedback anonymously within Slack. This is great for suggestion box channels, management feedback, or even for product design reviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚢 &lt;a href="https://loqbooq.app"&gt;Loqbooq&lt;/a&gt; — Record decisions asynchronously
&lt;/h3&gt;

&lt;p&gt;Making decisions is one thing. Making sure everybody involved takes notice and is on the same page is a much harder problem.&lt;/p&gt;

&lt;p&gt;Loqbooq is a web app with full Slack integration that lets you agree on decisions as a team and build up a single source of truth. And because it works asynchronously, those who missed the meeting can be involved as well. Maybe you don’t even need a meeting?&lt;/p&gt;

&lt;h3&gt;
  
  
  🌳 &lt;a href="https://www.evergreen.so/"&gt;Evergreen&lt;/a&gt; — Celebrate achievements by planting trees
&lt;/h3&gt;

&lt;p&gt;In the office (and before Covid) you would simply high-five your teammates when they have accomplished something. Appreciating your team’s great work is much harder remotely.&lt;/p&gt;

&lt;p&gt;With evergreen your team can reward their co-workers by having trees planted for them. This lets your achievements have impact beyond your own company and is a much healthier perk than handing out snacks.&lt;/p&gt;

</description>
      <category>slack</category>
      <category>wfh</category>
      <category>productivity</category>
      <category>team</category>
    </item>
    <item>
      <title>Restore deleted files on the Mac from Snapshots in Disk Utility</title>
      <dc:creator>Gabriel Reimers</dc:creator>
      <pubDate>Sun, 19 Jun 2022 07:19:04 +0000</pubDate>
      <link>https://dev.to/codingfriend1/restore-deleted-files-on-the-mac-from-snapshots-in-disk-utility-4jmo</link>
      <guid>https://dev.to/codingfriend1/restore-deleted-files-on-the-mac-from-snapshots-in-disk-utility-4jmo</guid>
      <description>&lt;p&gt;Snapshots are usually invisible. But you can view and manage them in Disk Utility. From there you can easily mount any previous snapshot in Finder and simply browse your disk as if it were yesterday.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a5Dk84Nw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e146ku9bbyzovm6mph3i.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a5Dk84Nw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e146ku9bbyzovm6mph3i.jpg" alt="Mount snapshot from Disk Utility" width="880" height="644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have written a full blog post with more details and step-by-step instructions on &lt;a href="https://coding-friends.com/blog/restore-deleted-files-mac-disk-utility-snapshots/"&gt;how to restore lost files from snapshots on macOS&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>macos</category>
      <category>tooling</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Do you use SwiftUI for your Mac apps?</title>
      <dc:creator>Gabriel Reimers</dc:creator>
      <pubDate>Mon, 23 May 2022 08:04:07 +0000</pubDate>
      <link>https://dev.to/codingfriend1/do-you-use-swiftui-for-your-mac-apps-bk1</link>
      <guid>https://dev.to/codingfriend1/do-you-use-swiftui-for-your-mac-apps-bk1</guid>
      <description>&lt;p&gt;We are currently re-writing the UI of our &lt;a href="https://wokabulary.com"&gt;flash card vocabulary learning app Wokabulary&lt;/a&gt; with SwiftUI.&lt;br&gt;
Wokabulary is available for iPhone, iPad and Mac; so having a platform independent UI system saves us a lot of time.&lt;br&gt;
However, we face quite a few challenges with SwiftUI especially on the Mac. For example performance of SwiftUI on the Mac is often worse than with AppKit (e.g. lists). Also the documentation for Mac specific features is very sparse and some things just cannot be done (e.g. customizable toolbars).&lt;/p&gt;

&lt;p&gt;So we are wondering: &lt;strong&gt;Are you using SwiftUI for your Mac apps in production? What Mac apps have you built or are you building in SwiftUI? What challenges do you face?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>swiftui</category>
      <category>swift</category>
      <category>macos</category>
    </item>
    <item>
      <title>The built in dictionaries of macOS and iOS</title>
      <dc:creator>Gabriel Reimers</dc:creator>
      <pubDate>Tue, 17 May 2022 10:20:01 +0000</pubDate>
      <link>https://dev.to/codingfriend1/the-built-in-dictionaries-of-macos-and-ios-4f5h</link>
      <guid>https://dev.to/codingfriend1/the-built-in-dictionaries-of-macos-and-ios-4f5h</guid>
      <description>&lt;p&gt;Did you know that your Mac, iPhone and iPad comes with high quality foreign language dictionaries for many languages?&lt;/p&gt;

&lt;p&gt;I don't mean machine learning translation, I mean real dictionaries like Oxford, Duden, Pons, etc.&lt;/p&gt;

&lt;p&gt;For example there are Dictionaries for German, English, Mandarin, French, Italian, Korean, Thai, Turkish, Tamil and more.&lt;br&gt;
Even dual-language dictionaries for combinations like French-English, German-English, Korean-English, and others.&lt;br&gt;
As well as an English Thesaurus, which is super useful for copy writing.&lt;/p&gt;

&lt;p&gt;I have written a &lt;a href="https://wokabulary.com/blog/built-in-dictionary-mac-iphone/"&gt;short blog post about how to activate and use the dictionaries on iOS and macOS&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>macos</category>
      <category>ios</category>
      <category>language</category>
      <category>tools</category>
    </item>
    <item>
      <title>Macarons — Building a chat roulette app for Slack</title>
      <dc:creator>Gabriel Reimers</dc:creator>
      <pubDate>Fri, 13 May 2022 14:29:28 +0000</pubDate>
      <link>https://dev.to/coding-friends/macarons-building-a-chat-roulette-app-for-slack-115</link>
      <guid>https://dev.to/coding-friends/macarons-building-a-chat-roulette-app-for-slack-115</guid>
      <description>&lt;p&gt;Last year we tapped into building Slack apps. &lt;br&gt;
Our first project was our decision record app &lt;a href="https://loqbooq.app"&gt;Loqbooq&lt;/a&gt;. And while building a Slack app looks simple on first glimpse, it turned out to be very challenging. Especially user management and shared channels caused a lot of headache for us.&lt;/p&gt;

&lt;p&gt;When we had finally achieved building and releasing our first Slack app, we thought it would be much easier to build another one based on that.&lt;/p&gt;

&lt;p&gt;And so we did.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Within just a few weeks we build &lt;a href="https://macarons-roulette.app"&gt;Macarons&lt;/a&gt;, a chat roulette app to connect teams.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
We know there are already quite a few chat roulette apps for Slack like Donut, Snack or Hallway.&lt;br&gt;&lt;br&gt;
But we found those either too complicated, too expensive, or missing important features.&lt;/p&gt;

&lt;p&gt;Macarons is simple to setup but at the same time comes with some neat features that make chat roulettes more fun for everybody:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧁 Quick and Easy&lt;/strong&gt;&lt;br&gt;
Just add the Macarons app to a Slack channel and it will automatically pair off random members for (virtual) coffees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎰 Control the Odds&lt;/strong&gt;&lt;br&gt;
For each channel you can control how often and when chat lotteries happen, as well as how many people should be matched together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧊 Ice Breakers&lt;/strong&gt;&lt;br&gt;
Let Macarons get conversations started with predefined ice breakers or set your own custom topics for each round.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🏖 Take a skip day&lt;/strong&gt;&lt;br&gt;
Independent of a channels meeting interval, each user can always individually pause their participation or decide to only take part every other time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can try Macarons for free and we really appreciate any feedback:&lt;br&gt;&lt;br&gt;
&lt;a href="https://macarons-roulette.app"&gt;macarons-roulette.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>slack</category>
      <category>laravel</category>
    </item>
    <item>
      <title>Why we added a Free Plan for our SaaS</title>
      <dc:creator>Gabriel Reimers</dc:creator>
      <pubDate>Sun, 29 Aug 2021 10:54:33 +0000</pubDate>
      <link>https://dev.to/coding-friends/why-we-added-a-free-plan-for-our-saas-4ip4</link>
      <guid>https://dev.to/coding-friends/why-we-added-a-free-plan-for-our-saas-4ip4</guid>
      <description>&lt;p&gt;Early on we had decided that our SaaS &lt;a href="https://loqbooq.app" rel="noopener noreferrer"&gt;Loqbooq&lt;/a&gt; should not have a free plan. After all, it is a service aimed at businesses not individuals.&lt;/p&gt;

&lt;p&gt;We thought &lt;strong&gt;business customers are willing to pay for a service&lt;/strong&gt; that saves them time and reduces friction. Now, two months have passed since we publicly releasing Loqbooq. And we found that assumption does hold true.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Still, this week, we introduced a free plan&lt;/strong&gt; for small teams, including all features. What made us change our minds? Here is what we learned from our early adopters.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53szt4qvg669jm563ypi.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F53szt4qvg669jm563ypi.png" alt="Seagull living free"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤑 Our business model
&lt;/h2&gt;

&lt;p&gt;Loqbooq is an app to record your project decisions and commit to these decisions as a team. We have a web app and a Slack app.&lt;/p&gt;

&lt;p&gt;We are convinced that Loqbooq is a service that saves companies money. When you document your project decisions, your teams spend less time researching why things were done as they were done.&lt;br&gt;
New team members can be on-boarded quicker as you have a record of all decisions on design, architecture or strategy, as well as the reasoning behind them.&lt;br&gt;
And if your project involves multiple parties, it also reduces stress and discussions if stakeholders commit to decisions together.&lt;/p&gt;

&lt;p&gt;Our customers consider Loqbooq a valuable tool that is worth paying for it.&lt;br&gt;
And of course, we rely on paying customers as our business model. We do not sell our users’ data nor do we display advertisements — and never will.&lt;/p&gt;

&lt;h2&gt;
  
  
  💸 But then why add a Free Plan?
&lt;/h2&gt;

&lt;p&gt;For us, offering a free plan is about organically convincing teams that Loqbooq is a useful and easy to integrate tool.&lt;/p&gt;

&lt;p&gt;When we talked to our early adopters we learned that introducing new tools in a team can be a slow and complicated process. We often hear things like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I really love Loqbooq. But I also need to convince my team.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We learned that it is often one or two individuals who see the need for a decision log in a project. The easy part for them is to find a tool for that (like Loqbooq). But &lt;strong&gt;the hard part is to convince their team&lt;/strong&gt; to make the step to actually use a decision log.&lt;/p&gt;

&lt;p&gt;We did already offer a trial period so interested teams could try out and experiment with Loqbooq before needing to enter a credit card number. Yet, this often was not sufficient.&lt;br&gt;
Having created some sample decisions is just not as convincing as using Loqbooq as part of your actual daily work. And that is where we see the &lt;a href="https://loqbooq.app/pricing" rel="noopener noreferrer"&gt;new Free Plan&lt;/a&gt; comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Make it easy for early adopters
&lt;/h2&gt;

&lt;p&gt;Now, a small group of early adopters within an organization can use Loqbooq with all features in their real projects for as long as they need it — for free!&lt;/p&gt;

&lt;p&gt;The only limitations are that you cannot have more than three decision logs and can only have three reviewers on each decision. This should work out fine for small teams or startups.&lt;/p&gt;

&lt;p&gt;Now, early adopters can play with Loqbooq and experiment with decision logs in a small project. They can take their time to integrate it in their work culture, project structure and other tooling they already have.&lt;/p&gt;

&lt;p&gt;But most important: &lt;strong&gt;They don’t need to ask for budget to do a pilot project&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🙌 Spread to larger teams
&lt;/h2&gt;

&lt;p&gt;Once a group of early adopters is convinced that Loqbooq actually suits their needs and improves their project management, they can start expanding the use to more or larger projects.&lt;/p&gt;

&lt;p&gt;When they now pitch it to their teams, they have real world experience with the tool, making it much easier to win over more hesitant colleagues. And only then they need to upgrade to the paid Pro Plan for an unlimited number of logs and reviewers.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 How it worked out
&lt;/h2&gt;

&lt;p&gt;Well, we will only know in a couple of weeks or months. The downside of letting your users use your product for free up to some limits is obvious: it takes much longer for users to decide for a paid plan.&lt;/p&gt;

</description>
      <category>saas</category>
      <category>startup</category>
      <category>pricing</category>
    </item>
  </channel>
</rss>
