<?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: Muhammed Ahmed</title>
    <description>The latest articles on DEV Community by Muhammed Ahmed (@ma3574).</description>
    <link>https://dev.to/ma3574</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%2F839613%2F688d77eb-1b8b-4e1a-b38d-1756bc4a959d.png</url>
      <title>DEV Community: Muhammed Ahmed</title>
      <link>https://dev.to/ma3574</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ma3574"/>
    <language>en</language>
    <item>
      <title>One tap navigation anywhere - iOS Google Maps Shortcut</title>
      <dc:creator>Muhammed Ahmed</dc:creator>
      <pubDate>Tue, 02 Aug 2022 13:22:00 +0000</pubDate>
      <link>https://dev.to/ma3574/one-tap-navigation-anywhere-ios-google-maps-shortcut-4lnf</link>
      <guid>https://dev.to/ma3574/one-tap-navigation-anywhere-ios-google-maps-shortcut-4lnf</guid>
      <description>&lt;ul&gt;
&lt;li&gt;I've recently started using Shortcuts and I'm finding the concept so powerful. &lt;/li&gt;
&lt;li&gt;I've created shortcuts that let me tap an icon on my home screen and Google Maps pops up with driving directions to that location&lt;/li&gt;
&lt;li&gt;You can download the shortcut &lt;a href="https://www.icloud.com/shortcuts/b7d576f0127642d287a7a32f8872936a"&gt;here&lt;/a&gt; and customise it for your own use&lt;/li&gt;
&lt;li&gt;I've done a full writeup on how it works &lt;a href="https://www.upsync.dev/2022/08/02/ios-google-maps-shortcut.html"&gt;here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ios</category>
      <category>shortcuts</category>
    </item>
    <item>
      <title>🕵🏽 Debug VS Code Keyboard Shortcuts</title>
      <dc:creator>Muhammed Ahmed</dc:creator>
      <pubDate>Fri, 08 Apr 2022 14:20:44 +0000</pubDate>
      <link>https://dev.to/ma3574/debug-vs-code-keyboard-shortcuts-34i9</link>
      <guid>https://dev.to/ma3574/debug-vs-code-keyboard-shortcuts-34i9</guid>
      <description>&lt;p&gt;&lt;em&gt;Sharing an article I originally wrote &lt;a href="https://www.upsync.dev/2022/04/08/vs-code-keybindings.html"&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Whilst using VS Code my &lt;code&gt;Cmd&lt;/code&gt; + &lt;code&gt;N&lt;/code&gt; keyboard shortcut stopped creating a new file&lt;/li&gt;
&lt;li&gt;I was stumped on how to figure out what was causing the issue&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Looking around on Stack Overflow people suggested looking at the Keybindings as installed plugins can cause keyboard shortcut conflicts&lt;/li&gt;
&lt;li&gt;In VS Code go to &lt;code&gt;Preferences&lt;/code&gt; &amp;gt; &lt;code&gt;Keyboard Shortcuts&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Whilst poking around here I discovered a handy little feature of VS Code where you can type a keyboard shortcut and find out what it's mapped to.&lt;/li&gt;
&lt;li&gt;You just have to click the little keyboard icon (1)
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rqWeRUzf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/swtx93ero6gzebn6puya.png" alt="VS Code Keyboard Shortcut" width="880" height="211"&gt;
&lt;/li&gt;
&lt;li&gt;I typed in &lt;code&gt;Cmd&lt;/code&gt; + &lt;code&gt;N&lt;/code&gt; and lo and behold it popped up with two entries and I found the source of the conflict and deleted the conflicting one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👋 Hope it helps someone figure out their issues. If you'd like to keep up with technical blog posts on a variety of topics please feel free to join me on &lt;a href="https://www.upsync.dev/"&gt;upsync.dev&lt;/a&gt; 😎&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>productivity</category>
      <category>debugging</category>
    </item>
    <item>
      <title>Running a Mongo Replicaset Locally using Docker and Docker Compose</title>
      <dc:creator>Muhammed Ahmed</dc:creator>
      <pubDate>Wed, 30 Mar 2022 22:00:23 +0000</pubDate>
      <link>https://dev.to/ma3574/running-a-mongo-replicaset-locally-using-docker-and-docker-compose-4g2c</link>
      <guid>https://dev.to/ma3574/running-a-mongo-replicaset-locally-using-docker-and-docker-compose-4g2c</guid>
      <description>&lt;h2&gt;
  
  
  TLDR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You can use Docker and Docker Compose to start a Mongo replica set locally&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/UpSync-Dev/docker-compose-mongo-replica-set" rel="noopener noreferrer"&gt;GitHub repo: docker-compose-mongo-replica-set&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;docker-compose up -d&lt;/code&gt; and off you go&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Docker Compose File
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mongo1&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo:4.2&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo1&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--replSet"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-replica-set"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--bind_ip_all"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--port"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30001"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data/mongo-1:/data/db&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;30001:30001&lt;/span&gt;
    &lt;span class="na"&gt;healthcheck&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test $$(echo "rs.initiate({_id:'my-replica-set',members:[{_id:0,host:\"mongo1:30001\"},{_id:1,host:\"mongo2:30002\"},{_id:2,host:\"mongo3:30003\"}]}).ok || rs.status().ok" | mongo --port 30001 --quiet) -eq &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
      &lt;span class="na"&gt;interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10s&lt;/span&gt;
      &lt;span class="na"&gt;start_period&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30s&lt;/span&gt;

  &lt;span class="na"&gt;mongo2&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo:4.2&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo2&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--replSet"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-replica-set"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--bind_ip_all"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--port"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30002"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data/mongo-2:/data/db&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;30002:30002&lt;/span&gt;

  &lt;span class="na"&gt;mongo3&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo:4.2&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mongo3&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--replSet"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-replica-set"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--bind_ip_all"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--port"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;30003"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./data/mongo-3:/data/db&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;30003:30003&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What is it?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A way to run 3 instances of Mongo in a replica set on your machine&lt;/li&gt;
&lt;li&gt;This &lt;code&gt;docker-compose&lt;/code&gt; setup starts a local mongo replica set with 3 instances running on: 

&lt;ul&gt;
&lt;li&gt;mongo1:30001&lt;/li&gt;
&lt;li&gt;mongo2:30002&lt;/li&gt;
&lt;li&gt;mongo3:30003&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Are there any prerequisites?
&lt;/h2&gt;

&lt;p&gt;• Docker&lt;br&gt;
• Docker Compose&lt;br&gt;
• The following in your &lt;code&gt;/etc/hosts&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1       mongo1
127.0.0.1       mongo2
127.0.0.1       mongo3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How do I run the Replica Set?
&lt;/h2&gt;

&lt;p&gt;Simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How do I access the Mongo Shells for each Instance?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker exec -it mongo1 sh -c "mongo --port 30001"
docker exec -it mongo2 sh -c "mongo --port 30002"
docker exec -it mongo3 sh -c "mongo --port 30003"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Starts three instances of Mongo&lt;/li&gt;
&lt;li&gt;On the first instance it runs the following Mongo Shell command:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;rs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;s_id&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;my-replica-set&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;members&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="na"&gt;_id&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongo1:30001&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="na"&gt;_id&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongo2:30002&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="na"&gt;_id&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongo3:30003&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;This causes all 3 instances to join the replica set named &lt;code&gt;my-replica-set&lt;/code&gt; and start talking to each other&lt;/li&gt;
&lt;li&gt;One is elected to become the &lt;code&gt;PRIMARY&lt;/code&gt; and the other two become &lt;code&gt;SECONDARY&lt;/code&gt; instances&lt;/li&gt;
&lt;li&gt;The Docker healthcheck config is used to cause the initialisation of the replica set. More info in the further reading links.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Robo 3T
&lt;/h2&gt;

&lt;p&gt;I used Robo 3T to test it locally and used the following config for the connection:&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%2Fwww.upsync.dev%2Fassets%2Fimages%2Frobo-3t.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.upsync.dev%2Fassets%2Fimages%2Frobo-3t.png" alt="Robo 3T Config"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Acknowledgements / Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://zgadzaj.com/development/docker/docker-compose/turning-standalone-mongodb-server-into-a-replica-set-with-docker-compose" rel="noopener noreferrer"&gt;How to turn standalone MongoDB server into a replica set with Docker-Compose&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.sohamkamani.com/blog/2016/06/30/docker-mongo-replica-set/" rel="noopener noreferrer"&gt;Creating a MongoDB replica set using Docker 🍃&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gist.github.com/asoorm/7822cc742831639c93affd734e97ce4f" rel="noopener noreferrer"&gt;asoorm/docker-compose-mongo-replicaset.yml&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Cross posted from my blog &lt;a href="https://www.upsync.dev/2021/02/02/run-mongo-replica-set.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>testing</category>
      <category>nosql</category>
    </item>
  </channel>
</rss>
