<?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: camarm</title>
    <description>The latest articles on DEV Community by camarm (@camarm).</description>
    <link>https://dev.to/camarm</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%2F623301%2Fdadece5b-0364-4501-a6ce-1ec45c018507.png</url>
      <title>DEV Community: camarm</title>
      <link>https://dev.to/camarm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/camarm"/>
    <language>en</language>
    <item>
      <title>How I built a rhymes dictionary ?</title>
      <dc:creator>camarm</dc:creator>
      <pubDate>Sun, 09 Jun 2024 12:00:00 +0000</pubDate>
      <link>https://dev.to/camarm/how-i-built-a-rhymes-dictionary--3fme</link>
      <guid>https://dev.to/camarm/how-i-built-a-rhymes-dictionary--3fme</guid>
      <description>&lt;p&gt;Hi and welcome to this new article !&lt;/p&gt;

&lt;p&gt;I've been working hard on my mobile dictionary Remède this last month (I released the &lt;code&gt;1.2.0-beta&lt;/code&gt; version a week ago).&lt;/p&gt;

&lt;p&gt;I've added many things but today I will focus on a special functionality.&lt;/p&gt;

&lt;p&gt;I've added a &lt;strong&gt;rhymes dictionary&lt;/strong&gt; which is completely running on your phone (or any browser) without an internet connection !&lt;/p&gt;

&lt;h2&gt;
  
  
  1. - Find data to build a rhymes database
&lt;/h2&gt;

&lt;p&gt;I've searched for open source projects which had already built a rhymes database so I can re-use their database and adapt it for Remède.&lt;/p&gt;

&lt;p&gt;After some searches, I discovered that &lt;a href="http://www.lexique.org" rel="noopener noreferrer"&gt;Open Lexicon&lt;/a&gt;, a project which provides various open database about words, has enough data to build a rhymes dictionary.&lt;/p&gt;

&lt;p&gt;I found the &lt;a href="https://a3nm.net/git/drime/files.html" rel="noopener noreferrer"&gt;Drime&lt;/a&gt; project, which uses &lt;em&gt;Open Lexicon&lt;/em&gt; database to generate its own rhymes database. With their documentation, I built my own base and added these rows in a new table of the Remède database.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. - How it works ?
&lt;/h2&gt;

&lt;p&gt;If you don't know Remède (you can check it out on &lt;a href="https://github.com/camarm-dev/remede" rel="noopener noreferrer"&gt;Github&lt;/a&gt; and leave a star), it uses a &lt;strong&gt;Sqlite database&lt;/strong&gt; which is downloaded locally.&lt;/p&gt;

&lt;p&gt;Now that I have enough fields about words, how can I build an efficient dictionary ?&lt;/p&gt;

&lt;p&gt;First, let's explain how this dictionary is working.&lt;/p&gt;

&lt;p&gt;A table &lt;code&gt;rime&lt;/code&gt; contains rows (one row is equal to one word) with the fields &lt;code&gt;phon_end&lt;/code&gt;, &lt;code&gt;word_end&lt;/code&gt; (and more fields like &lt;code&gt;feminine&lt;/code&gt; or &lt;code&gt;elide&lt;/code&gt; for particular rhymes...).&lt;/p&gt;

&lt;p&gt;So for example, to get the rimes of the word &lt;code&gt;bonjour&lt;/code&gt;, phoneme &lt;code&gt;\b$ZuR\&lt;/code&gt;, we will filter all the words whose phoneme finishes with &lt;code&gt;uR&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The requests will look like&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;word&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;rime&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;phon_end&lt;/span&gt; &lt;span class="k"&gt;LIKE&lt;/span&gt; &lt;span class="s1"&gt;'%uR'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you understood the main concept ! Now we can add fields to filter and get more specific results, like in the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Final look
&lt;/h2&gt;

&lt;p&gt;Yes we have a dictionary but not anyone can use it ! You must know Sql to browse it...&lt;/p&gt;

&lt;p&gt;I tried to have the simplest and most understandable interface. For the interface, I use Ionic 7 with Vue 3.&lt;/p&gt;

&lt;p&gt;I integrate this functionality as following in Remède:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Screenshot&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Searching a word in the rimes dictionary&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.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%2F1kcrbhhrw81zlopyxp39.png" alt="Rimes dictionary" width="800" height="1590"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browsing rimes&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.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%2Fpkuujri43t8m7ey4dvoc.png" alt="Browsing" width="800" height="1590"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set &lt;em&gt;syllabes&lt;/em&gt; filter&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.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%2Fpe1orlg7la6bpdxhw9ho.png" alt="Filter" width="800" height="1590"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What's next ?
&lt;/h2&gt;

&lt;p&gt;For the moment, some functionalities are missing and the experience is not perfect... I want to add the possibility to choose the "nature" of the wanted rhymes (verb, noun...) and to enhance word finding experience.&lt;/p&gt;

&lt;p&gt;Thank you for reading,&lt;br&gt;
Don't hesitate to try Remède (&lt;a href="https://remede.camarm.fr" rel="noopener noreferrer"&gt;https://remede.camarm.fr&lt;/a&gt;, and let me a message about your experience if you want !)&lt;br&gt;
Have nice code !&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>french</category>
      <category>ionic</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Remède V1.1.5</title>
      <dc:creator>camarm</dc:creator>
      <pubDate>Sun, 19 May 2024 09:21:08 +0000</pubDate>
      <link>https://dev.to/camarm/remede-v115-2mgo</link>
      <guid>https://dev.to/camarm/remede-v115-2mgo</guid>
      <description>&lt;p&gt;Hi and welcome to my blog ! Yesterday, last month I released Remède version 1.1.5.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;strong&gt;Remède&lt;/strong&gt;&lt;/em&gt; is the &lt;strong&gt;free&lt;/strong&gt; and &lt;strong&gt;open source&lt;/strong&gt; french dictionary which I created !&lt;/p&gt;

&lt;p&gt;It has its own database, downloadable and re-usable by all your projects !&lt;/p&gt;

&lt;h2&gt;
  
  
  Latest challenges
&lt;/h2&gt;

&lt;p&gt;This version resolves many problems encountered previously with the 1.0.0.&lt;br&gt;
The navigation has been completely rebuilt so It implements correctly the back button on any Android device.&lt;br&gt;
The search has also been improved by creating an index table. It makes the search easier because it is now: case insensitive, accent insensitive and special characters insensitive.&lt;/p&gt;
&lt;h2&gt;
  
  
  Functionalities changelog
&lt;/h2&gt;

&lt;p&gt;This new version includes breaking changes ! Here there are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New&lt;/strong&gt; UI/UX on definition page&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New revised&lt;/strong&gt; database&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desktop applications&lt;/strong&gt; now available for Windows and Linux !&lt;/li&gt;
&lt;li&gt;Possibility to choose between light / complete database&lt;/li&gt;
&lt;li&gt;Resolved bugs around navigation&lt;/li&gt;
&lt;li&gt;Globally enhanced User Experience&lt;/li&gt;
&lt;li&gt;Better search experience !&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Screenshots
&lt;/h2&gt;

&lt;p&gt;As you can see, I added a landing screen to welcome new users. You can also look at the new UI for definition page.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Welcome page&lt;/th&gt;
&lt;th&gt;Definition page&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src="https://media2.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%2Fs1x5z6rlbuy4bbttoxd4.jpeg" alt="Welcome page" width="800" height="1590"&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.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%2Fv1u9enenvtp1e2rx4h89.jpeg" alt="Definition page" width="800" height="1590"&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  More to come
&lt;/h2&gt;

&lt;p&gt;I don't have so much time to develop Remède at this moment, but this projects have good days to come !&lt;/p&gt;

&lt;p&gt;I want desktop application to have their own interface, more adapted to landscape orientation and also running everywhere.&lt;br&gt;
I also want to add a rhymes dictionary which is a functionality I'm working on slowly by my side !&lt;/p&gt;
&lt;h2&gt;
  
  
  Don't hesitate to leave a star on Github !
&lt;/h2&gt;

&lt;p&gt;Or open an issue...&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/camarm-dev" rel="noopener noreferrer"&gt;
        camarm-dev
      &lt;/a&gt; / &lt;a href="https://github.com/camarm-dev/remede" rel="noopener noreferrer"&gt;
        remede
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Open Source and free alternative to Antidote. A french dictionary.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/camarm-dev/remede.github/icon.png"&gt;&lt;img alt="Remede icon" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fcamarm-dev%2Fremede.github%2Ficon.png" height="100" width="100"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Remède&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Open Source and free alternative to Antidote dictionary.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://remede-app.camarm.fr" rel="nofollow noopener noreferrer"&gt;Open application&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.remede.camarm.fr/docs/database/credits" rel="nofollow noopener noreferrer"&gt;Data credits&lt;/a&gt; • &lt;a href="https://github.com/camarm-dev/remede/blob/main/LICENSE" rel="noopener noreferrer"&gt;License&lt;/a&gt; • &lt;a href="https://remede.camarm.fr" rel="nofollow noopener noreferrer"&gt;Website&lt;/a&gt; • &lt;strong&gt;&lt;a href="https://remede.camarm.fr/download" rel="nofollow noopener noreferrer"&gt;Download&lt;/a&gt;&lt;/strong&gt; • &lt;strong&gt;&lt;a href="https://api-remede.camarm.fr/docs" rel="nofollow noopener noreferrer"&gt;API&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why Remède ?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Remède is a dictionary, which can replace any proprietary dictionary, with these advantages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple UI&lt;/li&gt;
&lt;li&gt;Nice UX&lt;/li&gt;
&lt;li&gt;Free&lt;/li&gt;
&lt;li&gt;Cross-platform&lt;/li&gt;
&lt;li&gt;Self-hostable&lt;/li&gt;
&lt;li&gt;Open source&lt;/li&gt;
&lt;li&gt;Off-line&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of content&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/camarm-dev/remede#t%C3%A9l%C3%A9charger" rel="noopener noreferrer"&gt;Télécharger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/camarm-dev/remede#g%C3%A9n%C3%A9rer-les-bases-de-donn%C3%A9es" rel="noopener noreferrer"&gt;Générer la base&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/camarm-dev/remede#documentation" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/camarm-dev/remede#screenshots" rel="noopener noreferrer"&gt;Screenshots&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Current: 1.3.0-beta — Phenomenal Feather&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;La version &lt;code&gt;1.3.0&lt;/code&gt;, nom de code &lt;code&gt;Phenomenal Feather&lt;/code&gt; inclue les nouvelles fonctionnalités suivantes :&lt;/p&gt;
&lt;ul class="contains-task-list"&gt;
&lt;li class="task-list-item"&gt;
 Application traduite en anglais&lt;/li&gt;
&lt;li class="task-list-item"&gt;
 Nouvelle structure de données&lt;/li&gt;
&lt;li class="task-list-item"&gt;
 Applications de bureau&lt;/li&gt;
&lt;li class="task-list-item"&gt;
 &lt;strong&gt;Base révisée&lt;/strong&gt; avec +900 000 mots !&lt;/li&gt;
&lt;li class="task-list-item"&gt;
 Téléchargeable sur le &lt;strong&gt;Play Store&lt;/strong&gt; !&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Télécharger&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Téléchargez les exécutables pour votre plateforme depuis &lt;a href="https://github.com/camarm-dev/remede/releases" rel="noopener noreferrer"&gt;la page releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Voir les autres méthodes de téléchargement sur &lt;a href="https://remede.camarm.fr" rel="nofollow noopener noreferrer"&gt;notre site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/camarm-dev/remede" rel="noopener noreferrer"&gt;Play Store&lt;/a&gt;
SOON: Disponible sur Play Store&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Générer les bases de données&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Guide: &lt;a href="https://github.com/camarm-dev/remede/blob/main/PARSING.md" rel="noopener noreferrer"&gt;&lt;code&gt;PARSING.md&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Références: &lt;a href="https://remede.camarm.fr/FR#donn%C3%A9es" rel="nofollow noopener noreferrer"&gt;documentation en ligne&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Documentation&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;La documentation est disponible sur &lt;a href="https://docs.remede.camarm.fr" rel="nofollow noopener noreferrer"&gt;docs.remede.camarm.fr&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Guide de contribution: &lt;a href="https://github.com/camarm-dev/remede/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;&lt;code&gt;CONTRIBUTING.md&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/camarm-dev/remede" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://api-remede.camarm.fr/release/apk" class="ltag_cta ltag_cta--branded" rel="noopener noreferrer"&gt;Download for android&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Thank you for reading and see you for version 1.2.0 !&lt;/p&gt;

</description>
      <category>ionic</category>
      <category>french</category>
      <category>webdev</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Running containers on distant host: docker contexts</title>
      <dc:creator>camarm</dc:creator>
      <pubDate>Sat, 06 Jan 2024 23:05:46 +0000</pubDate>
      <link>https://dev.to/camarm/running-containers-on-distant-host-docker-contexts-3k29</link>
      <guid>https://dev.to/camarm/running-containers-on-distant-host-docker-contexts-3k29</guid>
      <description>&lt;p&gt;&lt;em&gt;Cover from &lt;a href="https://blog.ruanbekker.com/blog/2022/07/14/remote-builds-with-docker-contexts/" rel="noopener noreferrer"&gt;Ruan Bekker blog&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hi, today I will introduce you a docker functionnality I discovered 6 months ago: &lt;strong&gt;docker contexts 🐳&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It allows you to &lt;strong&gt;build and run&lt;/strong&gt; your containers on a &lt;strong&gt;distant host&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please note I'm only a docker user, for further informations about contexts visit &lt;a href="https://docs.docker.com/engine/context/working-with-contexts/" rel="noopener noreferrer"&gt;the official documentation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  🧠 Understand contexts
&lt;/h1&gt;

&lt;p&gt;Actually, docker contexts let you &lt;strong&gt;manage multiple docker daemons from a single client&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A context has two major informations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Its name and description&lt;/li&gt;
&lt;li&gt;Its endpoint&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By default, a &lt;code&gt;default&lt;/code&gt; context is created and used. Its endpoint is the local docker sock.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME         DESCRIPTION                               DOCKER ENDPOINT               ERROR
default                                                unix:///var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The strength of contexts is that you can &lt;strong&gt;change from one host to another in only one command&lt;/strong&gt; !&lt;/p&gt;

&lt;h1&gt;
  
  
  ⚡ Get started with contexts
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ⚙️ Sever configuration
&lt;/h2&gt;

&lt;p&gt;First, you need to configure your server to enable remote access to your docker daemon.&lt;/p&gt;

&lt;p&gt;⚠️ Remote access permit anyone in a network to connect to your docker daemon and, potentially have &lt;code&gt;root&lt;/code&gt; access to your server ⚠️&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;See &lt;a href="https://docs.docker.com/config/daemon/remote-access/" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Two methods to enable remote access:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With &lt;strong&gt;systemd&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;With &lt;strong&gt;daemons.json&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  With systemd
&lt;/h3&gt;

&lt;p&gt;1.) Edit the &lt;code&gt;docker.service&lt;/code&gt; file and put your own values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl edit docker.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Service]
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.) Reload changes and restart docker daemon&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart docker.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  With daemons.json
&lt;/h3&gt;

&lt;p&gt;1.) Add the folowing to &lt;code&gt;/etc/docker/daemons.json&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"hosts"&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="s2"&gt;"unix:///var/run/docker.sock"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tcp://0.0.0.0:2375"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2.) Restart docker&lt;/p&gt;

&lt;p&gt;You should now have &lt;strong&gt;remote access&lt;/strong&gt; enabled. You can verify docker is binding on port &lt;code&gt;2375&lt;/code&gt; using &lt;code&gt;netstat&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;netstat &lt;span class="nt"&gt;-lntp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;dockerd
tcp        0      0 127.0.0.1:2375          0.0.0.0:&lt;span class="k"&gt;*&lt;/span&gt;               LISTEN      3758/dockerd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💻 Client configuration &amp;amp; examples
&lt;/h2&gt;

&lt;p&gt;First, you need to ensure that your docker cli supports the &lt;code&gt;context&lt;/code&gt; command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;It should show you a help about contexts&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Next, let's &lt;strong&gt;create a context&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker context create &amp;lt;context&amp;gt; &lt;span class="nt"&gt;--docker&lt;/span&gt; &lt;span class="nv"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tcp://host:2375
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Replace &lt;code&gt;&amp;lt;context&amp;gt;&lt;/code&gt; with its name and &lt;code&gt;host&lt;/code&gt; by the docker daemons IP.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It should be in the list of contexts outputted by&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker context &lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NAME         DESCRIPTION                               DOCKER ENDPOINT               ERROR
default *                                              unix:///var/run/docker.sock   
&amp;lt;context&amp;gt;                                              tcp://&amp;lt;context-ip&amp;gt;:2375 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Default as an asterisk after its name (&lt;code&gt;default *&lt;/code&gt;) because it's the currently used context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To change&lt;/strong&gt; to the newly created one, just type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker context use &amp;lt;context-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can run any docker container in the &lt;strong&gt;distant docker daemon&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; busybox /bin/sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;This execute a shell in an empty container&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You should see it in &lt;code&gt;docker ps&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CONTAINER ID   IMAGE               COMMAND                CREATED         STATUS                          PORTS     NAMES
f4d3674af80a   busybox             "/bin/sh"              2 seconds ago   Up 1 second                               focused_ramanujan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can &lt;strong&gt;verify that it's been running on the distant&lt;/strong&gt; host by passing which context to use directly in the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--context&lt;/span&gt; default ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Should not output busybox container&lt;/em&gt;&lt;br&gt;
&lt;em&gt;Whereas &lt;code&gt;docker --context &amp;lt;context&amp;gt; ps&lt;/code&gt; should !&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You have know the rudiments about &lt;strong&gt;docker context&lt;/strong&gt;. Consider referring to &lt;a href="https://docs.docker.com/engine/context/working-with-contexts/" rel="noopener noreferrer"&gt;the Docker documentation&lt;/a&gt; for further informations and explanations.&lt;/p&gt;

&lt;h1&gt;
  
  
  📈 How I use it ?
&lt;/h1&gt;

&lt;p&gt;Discovering this feature was very helpful in my workflow: I don't need to use ssh to deploy latest versions of my apps anymore.&lt;/p&gt;

&lt;p&gt;I just change context, to choose the right server (like &lt;code&gt;databases&lt;/code&gt;, &lt;code&gt;microservices&lt;/code&gt;, &lt;code&gt;web-prod&lt;/code&gt;) and fire &lt;code&gt;docker run -d ...&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In parallel i use &lt;a href="https://www.portainer.io/" rel="noopener noreferrer"&gt;&lt;em&gt;Portainer&lt;/em&gt;&lt;/a&gt;, a powerful web UI for docker. It allows me to manage my running containers and check their health &lt;strong&gt;right in my browser&lt;/strong&gt; !&lt;/p&gt;

&lt;p&gt;Here are some screenshots of my portainer:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;List of connected daemons&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.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%2Fnbsvq97qc6s0lmxr892y.png" alt="Connected Daemons" width="800" height="268"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Lists of containers&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src="https://media2.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%2Fh6hp0fvryiabea9w0xis.png" alt="Containers" width="800" height="284"&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;I hope you discovered something new,&lt;br&gt;
Have nice deployments,&lt;br&gt;
See you later 👋 !&lt;/p&gt;

</description>
    </item>
    <item>
      <title>New project : Remède</title>
      <dc:creator>camarm</dc:creator>
      <pubDate>Thu, 04 Jan 2024 22:20:51 +0000</pubDate>
      <link>https://dev.to/camarm/new-project-remede-1g3o</link>
      <guid>https://dev.to/camarm/new-project-remede-1g3o</guid>
      <description>&lt;p&gt;Hi everyone, recently I created a new project named &lt;strong&gt;Remède&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Remède is a &lt;strong&gt;mobile application&lt;/strong&gt; that provide a &lt;strong&gt;french offline dictionary&lt;/strong&gt;. It's 100% open source and you can download and re-use the dictionary as &lt;em&gt;JSON&lt;/em&gt;, &lt;em&gt;SQLite&lt;/em&gt; or with the &lt;em&gt;public API&lt;/em&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Actually
&lt;/h2&gt;

&lt;p&gt;Actually, the project is functional but very young. I released the V1.0.0 last week and starting planning future functionalities to develop in 2024.&lt;/p&gt;

&lt;h2&gt;
  
  
  Version 1.0.0
&lt;/h2&gt;

&lt;p&gt;The version &lt;strong&gt;1.0.0&lt;/strong&gt; has following functionalities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download the dictionary&lt;/li&gt;
&lt;li&gt;Search a word&lt;/li&gt;
&lt;li&gt;Add a bookmark on a word&lt;/li&gt;
&lt;li&gt;Correct a text (third-party)&lt;/li&gt;
&lt;li&gt;Read cheat sheet (no sheet is finished yet)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The goal
&lt;/h2&gt;

&lt;p&gt;The goal is to publish Remède on the &lt;strong&gt;Play Store&lt;/strong&gt; and provide a &lt;strong&gt;simple and powerful&lt;/strong&gt; user experience.&lt;/p&gt;

&lt;p&gt;I want to enhance the database with &lt;strong&gt;rimes&lt;/strong&gt;, &lt;strong&gt;examples usages&lt;/strong&gt;. I also want to provide cheat sheet about French grammar and orthography rules. You can &lt;strong&gt;contribute &lt;a href="https://github.com/camarm-dev/remede" rel="noopener noreferrer"&gt;on github&lt;/a&gt; to support and enhance Remède !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It will be really cool to create a grammar / orthography corrector for Remède instead of using third-parties&lt;/p&gt;

&lt;p&gt;Thanks for reading, please consider &lt;strong&gt;react&lt;/strong&gt; to this post and &lt;strong&gt;start&lt;/strong&gt; the &lt;a href="https://github.com/camarm-dev/remede" rel="noopener noreferrer"&gt;repository&lt;/a&gt; to give this project a bit of visibility !&lt;br&gt;
Have a nice code,&lt;br&gt;
See you later&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Reverse engineering a website to make a mobile application</title>
      <dc:creator>camarm</dc:creator>
      <pubDate>Thu, 04 Jan 2024 20:34:31 +0000</pubDate>
      <link>https://dev.to/camarm/reverse-engineering-a-website-to-make-a-mobile-application-3g22</link>
      <guid>https://dev.to/camarm/reverse-engineering-a-website-to-make-a-mobile-application-3g22</guid>
      <description>&lt;p&gt;A month ago I bought a card called "Avantages Jeunes" (Junior Advantages), made by my region for people below 30 years old.&lt;/p&gt;

&lt;p&gt;It can be used in many shops, restaurants, activities... to get promotions. I discovered that there was a web application to look for advantages.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fkq68suz8kw0o41b1nmzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fkq68suz8kw0o41b1nmzi.png" alt="Card Avantages Jeunes" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So &lt;strong&gt;I decided to use their API to make me a cleaner mobile application, with more functionalities&lt;/strong&gt; !&lt;/p&gt;

&lt;h2&gt;
  
  
  The app concept
&lt;/h2&gt;

&lt;p&gt;All you need is your card: just add your card using your credentials.&lt;/p&gt;

&lt;p&gt;In the interface you can view suggested advantages, liked ones, your card, your profile and also open a &lt;strong&gt;map that show every advantage around&lt;/strong&gt; you !&lt;/p&gt;

&lt;p&gt;There is also a search function.&lt;/p&gt;

&lt;h2&gt;
  
  
  The reflexion time
&lt;/h2&gt;

&lt;p&gt;Most of the data I needed can be simply got by calling the web application private API. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fitbmzpxvrqqcksh1l9f7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fitbmzpxvrqqcksh1l9f7.png" alt="HTTPie" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I opened &lt;strong&gt;HTTPie&lt;/strong&gt; (a requester), my browser's developer tools on network tab and started trying to reproduce requests.&lt;/p&gt;

&lt;p&gt;The map functionality was a bit more complicated... No endpoint can return advantages based on a geo-position. &lt;br&gt;
But I found an endpoint that return a complete list of all advantages, with their address !&lt;/p&gt;

&lt;p&gt;I coded a python script that retrieve all the advantages and found their coordinates based on their address (using &lt;strong&gt;&lt;a href="https://geocode.maps.co/" rel="noopener noreferrer"&gt;Gecoding API&lt;/a&gt;&lt;/strong&gt;) and store them in a &lt;strong&gt;&lt;a href="https://mongodb.com" rel="noopener noreferrer"&gt;MongoDb&lt;/a&gt;&lt;/strong&gt; database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fa903yofukdbyincs0q3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fa903yofukdbyincs0q3j.png" alt="MongoDB Geospatial" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using MongDb Geospatial &lt;strong&gt;&lt;a href="https://www.mongodb.com/docs/manual/core/indexes/index-types/geospatial/2dsphere" rel="noopener noreferrer"&gt;2dsphere&lt;/a&gt; index&lt;/strong&gt;, I have could request database for all the documents which their coordinates field is in a circle of precise center and radius ! &lt;strong&gt;MongoDB is so powerful !&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The app structure
&lt;/h2&gt;

&lt;p&gt;I used &lt;strong&gt;IonicFramework&lt;/strong&gt; to develop a web based frontend that can be compiled to mobile using a bridge.&lt;/p&gt;

&lt;p&gt;The frontend part directly calls the orginal private API except to get advantages around phone's position: it calls a &lt;strong&gt;Fastapi&lt;/strong&gt; server that return advantages in a radius of 1, 5, 10 or 50 kilometers around the position, by using the MongoDb database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;p&gt;Home page&lt;br&gt;
&lt;a href="https://media2.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%2Fgjdw0uw3hzm2joh4pgl0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fgjdw0uw3hzm2joh4pgl0.png" alt="Home page" width="720" height="1432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Map&lt;br&gt;
&lt;a href="https://media2.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%2Fax6k09yzhgtl3qipq1nh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fax6k09yzhgtl3qipq1nh.png" alt="Map" width="720" height="1432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Search page&lt;br&gt;
&lt;a href="https://media2.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%2F5k0sivbfvis738v61152.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F5k0sivbfvis738v61152.png" alt="Search Page" width="720" height="1432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can found this project at &lt;a href="https://github.com/camarm-dev/bfc-avantagesjeunes-mobile" rel="noopener noreferrer"&gt;camarm-dev/bfc-avantagesjeunes-mobile&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  And you ? Do you already reverse engineered something ? What was it ?
&lt;/h2&gt;

</description>
      <category>discuss</category>
      <category>ionic</category>
      <category>mobile</category>
      <category>webdev</category>
    </item>
    <item>
      <title>1 year of Homelab, experience and what's next</title>
      <dc:creator>camarm</dc:creator>
      <pubDate>Fri, 03 Feb 2023 17:52:45 +0000</pubDate>
      <link>https://dev.to/camarm/1-year-of-homelab-experience-and-whats-next-1oj9</link>
      <guid>https://dev.to/camarm/1-year-of-homelab-experience-and-whats-next-1oj9</guid>
      <description>&lt;p&gt;In this article I will explain my experience of my first homelab.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definitions
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;vm&lt;/strong&gt; = &lt;em&gt;Virtual Machine (&lt;a href="https://en.wikipedia.org/wiki/Virtual_machine" rel="noopener noreferrer"&gt;complete definition&lt;/a&gt;)&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;iso file&lt;/strong&gt; = &lt;em&gt;Disk / CD image compressed in one file, frequently used to install operating systems (&lt;a href="https://en.wikipedia.org/wiki/Optical_disc_image" rel="noopener noreferrer"&gt;complete definition&lt;/a&gt;)&lt;/em&gt;&lt;br&gt;
&lt;strong&gt;proxmox&lt;/strong&gt; = &lt;em&gt;Operating system based on kvm software designed to facilitate vm management (&lt;a href="https://en.wikipedia.org/wiki/Proxmox_Virtual_Environment" rel="noopener noreferrer"&gt;Proxmox&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;a href="https://media2.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%2Flkmioakre83l2z2r9rdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Flkmioakre83l2z2r9rdy.png" alt="My Dell Poweredge T320 Server" width="800" height="803"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it started
&lt;/h2&gt;

&lt;p&gt;2 years ago, I met a friend who is fond of servers... Like a virus he contamined me and I started my homelab with a raspberry pi. 6 months after, I bought a Dell Tower Server (T320) and installed Proxmox.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please note that I am not a professional, i’m only passionate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Experiences
&lt;/h2&gt;

&lt;p&gt;In this section I will tell you stories that appened with my homelab.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fu46cpv81a2awkarwso97.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fu46cpv81a2awkarwso97.png" alt="Dell Disk" width="800" height="1129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Backups, backups and organize storage
&lt;/h3&gt;

&lt;p&gt;One of my biggest mistakes hopefully appended 2 months after creating my first vms. I hadn’t setuped backup job and I only backuped my vms once…&lt;/p&gt;

&lt;p&gt;Results: one of my raid-0 (9yo) disk died and I lost all my server; from the system to vms and backups. Hopefully I had copied all backups to my PC and I didn’t lost all my datas…&lt;/p&gt;

&lt;p&gt;After that story I divided server root fs in one disk, iso / unimportant files in another and vms in one redunded disk (raid-1).&lt;/p&gt;

&lt;p&gt;I setuped Proxmox backups for backuping each vm everyday and keep a daily, weekly and monthly one.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fa01klzpfgy120eqawyf3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fa01klzpfgy120eqawyf3.png" alt="Disk Drive Caddy" width="800" height="720"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Caddies for drive bay
&lt;/h3&gt;

&lt;p&gt;When I wanted to add more storage I was confused to didn't find disk drive caddies easily. My server has 8 disk emplacement for disk drives but he only came with 3 caddies (and 3 disks). I bought 5 more that I found on amazone but next time I will ensure that there is no missing pieces like these.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.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%2F2j0tulk96kj1eojpger4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F2j0tulk96kj1eojpger4.png" alt="Monitorng Illustration" width="800" height="805"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoring
&lt;/h3&gt;

&lt;p&gt;Monitoring tools I use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maltrail:&lt;/strong&gt;&lt;br&gt;
I recommend you to use &lt;a href="https://github.com/stamparm/maltrail" rel="noopener noreferrer"&gt;Maltrail&lt;/a&gt; if you would like to ensure your server security...&lt;br&gt;
You will see every connection to your server and it will helps you to write more firewall rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Netdata:&lt;/strong&gt;&lt;br&gt;
Self-hosted or in the cloud, &lt;a href="https://github.com/netdata/netdata" rel="noopener noreferrer"&gt;Netdata&lt;/a&gt; is the software that notify you of any process, software or hardware problem or failure. You feel safer to know that you haven't to check charts everyday to see problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uptime Kuma:&lt;/strong&gt;&lt;br&gt;
A classical one: &lt;a href="https://github.com/louislam/uptime-kuma" rel="noopener noreferrer"&gt;Kuma Uptime&lt;/a&gt;. I register all my application urls and activated sms notification to be notified to any application failure. Very useful with his status pages to organize multiple monitors in one public page !&lt;/p&gt;




&lt;h2&gt;
  
  
  Next
&lt;/h2&gt;

&lt;p&gt;My current homelab setup is not very clean... A lot of useless vm are on my only server... But some important application are running on it and the server is directly connected to my home network so I need a new, fresh and clean, production server isolated in a vlan to make my homelab even secure.&lt;/p&gt;

&lt;p&gt;I'm currently looking for rackable servers and Ikea lack table. I want to make a DIY rack built with lack tables !&lt;/p&gt;

&lt;p&gt;I will write an article when my homelab will level up !&lt;/p&gt;

&lt;p&gt;Thank you very much for reading, &lt;br&gt;
Have nice code,&lt;br&gt;
See you later !&lt;/p&gt;

</description>
      <category>homelab</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Can you review my branding ?</title>
      <dc:creator>camarm</dc:creator>
      <pubDate>Mon, 25 Jul 2022 13:01:00 +0000</pubDate>
      <link>https://dev.to/camarm/can-you-review-my-branding--24c5</link>
      <guid>https://dev.to/camarm/can-you-review-my-branding--24c5</guid>
      <description>&lt;h3&gt;
  
  
  👋 Hello developers 👨‍💻, hello designers 🎨 !
&lt;/h3&gt;

&lt;p&gt;I'm currently working on my website 🌐 and I have designed a logo and multiples banner for my branding / artistic direction.&lt;/p&gt;

&lt;p&gt;Can &lt;strong&gt;you 👈&lt;/strong&gt; tell me what do think about these ?&lt;/p&gt;

&lt;h3&gt;
  
  
  The speech 💬:
&lt;/h3&gt;

&lt;p&gt;I went with blue 🔵 and purple 🟣 because they are my favourite colours and the white/black ⚪/⚫ are pulled from blue and purple !&lt;br&gt;
I looked on Duckduckgo 🔍 for icons that everyone 🌎 can understand are code.&lt;br&gt;
I found many images 🖼️ like this one:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fexternal-content.duckduckgo.com%2Fiu%2F%3Fu%3Dhttps%253A%252F%252Fcdn.dribbble.com%252Fusers%252F725831%252Fscreenshots%252F3251631%252F__________-2.png%26f%3D1%26nofb%3D1" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fexternal-content.duckduckgo.com%2Fiu%2F%3Fu%3Dhttps%253A%252F%252Fcdn.dribbble.com%252Fusers%252F725831%252Fscreenshots%252F3251631%252F__________-2.png%26f%3D1%26nofb%3D1" alt="Code logo" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I figured 🤔 if I made a logo like this one, I could be understood by everyone !&lt;/p&gt;

&lt;p&gt;I also wanted to create a logo I can use everywhere, modern and if possible with my nickname inside.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recap:
&lt;/h3&gt;

&lt;p&gt;Constraints of the logo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;With blue 🔵&lt;/li&gt;
&lt;li&gt;With purple 🟣&lt;/li&gt;
&lt;li&gt;For everywhere 🏞️ (website 🌐, social media 📱)&lt;/li&gt;
&lt;li&gt;Modern ➰&lt;/li&gt;
&lt;li&gt;Include an icon, banners and full logo 💼&lt;/li&gt;
&lt;li&gt;With my nickname 👤&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The logos:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  The icon:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fr9o4inavabgcdl7akgj5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fr9o4inavabgcdl7akgj5.png" alt="camarm icon" width="540" height="512"&gt;&lt;/a&gt;&lt;br&gt;
Designed with 2 colours and the shape of &amp;lt;&amp;gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  The full logo:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fp6d9ztybe7f7cepjcaw3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fp6d9ztybe7f7cepjcaw3.png" alt="camarm logo" width="800" height="150"&gt;&lt;/a&gt;&lt;br&gt;
Designed with the icon, it makes CAMARM DEV, my pseudonym&lt;/p&gt;

&lt;h3&gt;
  
  
  Banners:
&lt;/h3&gt;

&lt;p&gt;I also designed banners for opengraph and social medias:&lt;/p&gt;

&lt;h4&gt;
  
  
  The classic:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F7qz57udhb4vccyx1jf6e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F7qz57udhb4vccyx1jf6e.png" alt="Classic Banner" width="800" height="420"&gt;&lt;/a&gt;&lt;br&gt;
Full logo in a rounded white rectangle.&lt;/p&gt;

&lt;h4&gt;
  
  
  The logo background:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F3l9lvvimzmorz6aduymf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F3l9lvvimzmorz6aduymf.png" alt="logo background banner" width="800" height="420"&gt;&lt;/a&gt;&lt;br&gt;
Full logo with description and a background full of the icon.&lt;/p&gt;

&lt;h4&gt;
  
  
  The abstract background:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fvvpjaft5axqa0oz6q302.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fvvpjaft5axqa0oz6q302.png" alt="abstract background banner" width="800" height="420"&gt;&lt;/a&gt;&lt;br&gt;
Full logo with description and a background full of abstract shapes.&lt;/p&gt;

&lt;p&gt;Please note that all the images are under &lt;a href="https://creativecommons.org/licenses/by-nc-nd/3.0/fr/" rel="noopener noreferrer"&gt;CC BY-NC-ND 3.0 FR&lt;/a&gt; license&lt;/p&gt;

&lt;p&gt;Thanks you 🙏 for your reviews which I'll take note,&lt;br&gt;
Have nice code ✍️, &lt;br&gt;
And see ya later ✌️ !&lt;/p&gt;

</description>
      <category>branding</category>
      <category>design</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Hello Blog !</title>
      <dc:creator>camarm</dc:creator>
      <pubDate>Thu, 21 Jul 2022 09:24:00 +0000</pubDate>
      <link>https://dev.to/camarm/hello-blog--3kn2</link>
      <guid>https://dev.to/camarm/hello-blog--3kn2</guid>
      <description>&lt;h2&gt;
  
  
  Hi there 🔥 !
&lt;/h2&gt;




&lt;p&gt;Hello blog, hello Dev.to and welcome to &lt;strong&gt;you&lt;/strong&gt; !&lt;/p&gt;

&lt;p&gt;I'm &lt;strong&gt;camarm&lt;/strong&gt;, a French 🇫🇷 Developer 💻 fond of &lt;strong&gt;Linux&lt;/strong&gt; 🐧, &lt;strong&gt;server&lt;/strong&gt; infrastructures 💾 and development 👨‍💻&lt;/p&gt;

&lt;p&gt;I will write for my &lt;strong&gt;blog&lt;/strong&gt; 📰 articles about code/tricks/problems I encountered in my beginner/intermediate developer life (all articles will be sent in my &lt;a href="https://www.camarm.dev/#contact" rel="noopener noreferrer"&gt;newsletter ✉️&lt;/a&gt;).&lt;br&gt;
You can read them &lt;a href="https://www.camarm.dev/blog" rel="noopener noreferrer"&gt;here 🔗&lt;/a&gt; (thanks to dev.to 🎉 for hosting the articles!).&lt;/p&gt;

&lt;p&gt;Bye!&lt;/p&gt;

</description>
      <category>hello</category>
      <category>welcome</category>
    </item>
  </channel>
</rss>
