<?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: Ivan Dlugos</title>
    <description>The latest articles on DEV Community by Ivan Dlugos (@ivan).</description>
    <link>https://dev.to/ivan</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%2F84857%2F950b6be6-eeb5-437e-b587-21f9aed2a59b.jpeg</url>
      <title>DEV Community: Ivan Dlugos</title>
      <link>https://dev.to/ivan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ivan"/>
    <language>en</language>
    <item>
      <title>Rust looks awesome</title>
      <dc:creator>Ivan Dlugos</dc:creator>
      <pubDate>Sat, 07 Sep 2019 16:42:44 +0000</pubDate>
      <link>https://dev.to/ivan/rust-looks-awesome-16b9</link>
      <guid>https://dev.to/ivan/rust-looks-awesome-16b9</guid>
      <description>&lt;p&gt;I'm (finally) starting to look at Rust and it seems to have hit the nail on the head. Actually I haven't written any code yet (shame on me) but from reading &lt;a href="https://doc.rust-lang.org/book/"&gt;"The Book"&lt;/a&gt;, it looks wonderful and I had to share :). Solving almost every major pain point I can think of in the programming languages I've used for any reasonable length of time (namely C/C++, Go if we're talking system langugages).&lt;/p&gt;

&lt;p&gt;Like resource management for example… No automatic deep copying nor wondering who owns complex members data after a struct copy. Borrowing instead of reference/pointer management. Compile-time data race prevention? Seriously?! Seems to good to be true. I guess it does have some learning curve but if that means being able to worry less about correctness? Worth. every. minute.&lt;/p&gt;

&lt;p&gt;Also, those value-containing ENUMs? Together with compiler-enforced complete matches. I can’t count how many times I’ve seen code not matching all possible cases in a switch/if-else…&lt;/p&gt;

&lt;p&gt;Needless to say I’m getting really excited to start putting Rust through its paces. Please share your thoughts on this :)&lt;/p&gt;

</description>
      <category>rust</category>
      <category>go</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Go — build a minimal docker image in just three steps</title>
      <dc:creator>Ivan Dlugos</dc:creator>
      <pubDate>Sat, 07 Sep 2019 16:03:53 +0000</pubDate>
      <link>https://dev.to/ivan/go-build-a-minimal-docker-image-in-just-three-steps-514i</link>
      <guid>https://dev.to/ivan/go-build-a-minimal-docker-image-in-just-three-steps-514i</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%2AE33brkN6zivLSb-D9i-CdQ.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%2Fcdn-images-1.medium.com%2Fmax%2F1024%2F1%2AE33brkN6zivLSb-D9i-CdQ.png"&gt;&lt;/a&gt;Docker &amp;amp; Go image by &lt;a href="https://github.com/ashleymcnamara/gophers" rel="noopener noreferrer"&gt;github.com/ashleymcnamara/gophers&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Go — build a minimal docker image in just three steps
&lt;/h3&gt;

&lt;p&gt;When you build your Go application for docker, you usually start from some image like golang:1.13. However, it’s a waste of resources to actually use that image for runtime. Let’s take a look at how you can build a Go application as an absolute minimal docker image.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Choose a Go version
&lt;/h3&gt;

&lt;p&gt;While it might be tempting to use golang:latest or just golang there are many reasons why this is not such a good idea but the chief one among them is build repeatability. Whether it’s about using the same version for production deployment that you’ve developed and tested on, or if you find yourself in a need to patch an old version of your application, it’s a good idea to keep the Go version pinned to a specific release and only update it when you know it’s going to work with a newer one.&lt;/p&gt;

&lt;p&gt;Therefore, always use full specification, including the patch version number and ideally even the base OS that image comes from, e.g. 1.13.0-alpine3.10&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Keep it minimal
&lt;/h3&gt;

&lt;p&gt;There are two aspects to this — keeping the build time low and keeping the resulting image small.&lt;/p&gt;

&lt;h4&gt;
  
  
  Fast builds
&lt;/h4&gt;

&lt;p&gt;Docker caches intermediate layers for you so if you structure your Dockerfile right, you can reduce the time it takes for each subsequent rebuild (after a change). The rule of a thumb is to order the commands based on how frequently their source (e.g. source of a COPY) is going to change.&lt;/p&gt;

&lt;p&gt;Also, consider using a .dockerignore file which helps keep the build context small — basically, when you run docker build, docker needs to feed everything in the current directory to the build daemon (that Sending build context to Docker daemon message you see at the beginning of a docker build). In short, if your repo contains a lot of data not necessary for building your app (such as tests, markdown for docs generator, etc), .dockerignore will help to speed the build up. At the very least, you can start with the following contents. Dockerfile is there so that if you COPY . . (which you shouldn’t, BTW) doesn’t have to execute and invalidate everything bellow when you change just that Dockerfile.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.git
Dockerfile
testdata
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Small images
&lt;/h4&gt;

&lt;p&gt;Very simple — use scratch. Nothing else comes close (because it can’t). Scratch is a special “base” image in that it’s not really an actual image but a completely empty system. Note: in an older version of docker, an explicit scratch image was actually used as a layer, this is no longer the case as of docker 1.5.&lt;/p&gt;

&lt;p&gt;How this works is that you use a two-step build inside a single Dockerfile, where you actually build your app on one image, called builder (as an example, it can be actually any name you fancy), then copy the resulting binaries (and all other required files) to a final image based on scratch.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Putting it all together
&lt;/h3&gt;

&lt;p&gt;Let’s see how a complete Dockerfile looks like, shall we?&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;



&lt;p&gt;Please leave a comment if you find this useful and/or you would like to share a few tips or tricks of your own.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>go</category>
      <category>containers</category>
      <category>optimization</category>
    </item>
    <item>
      <title>What do you think of the ObjectBox database for Python</title>
      <dc:creator>Ivan Dlugos</dc:creator>
      <pubDate>Wed, 08 May 2019 13:16:02 +0000</pubDate>
      <link>https://dev.to/ivan/what-do-you-think-of-the-objectbox-database-for-python-32oh</link>
      <guid>https://dev.to/ivan/what-do-you-think-of-the-objectbox-database-for-python-32oh</guid>
      <description>&lt;p&gt;After Android, iOS, Java, Swift, C &amp;amp; Go, first support arrives for Python as well.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://objectbox.io/objectbox-python/"&gt;https://objectbox.io/objectbox-python/&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Joe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Green"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# Create
&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Read
&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Black"&lt;/span&gt;
&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;       &lt;span class="c1"&gt;# Update
&lt;/span&gt;&lt;span class="n"&gt;box&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# Delete
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>discuss</category>
      <category>python</category>
      <category>database</category>
    </item>
    <item>
      <title>Storing data in Go</title>
      <dc:creator>Ivan Dlugos</dc:creator>
      <pubDate>Mon, 10 Dec 2018 11:51:38 +0000</pubDate>
      <link>https://dev.to/ivan/storing-data-ingo-17me</link>
      <guid>https://dev.to/ivan/storing-data-ingo-17me</guid>
      <description>&lt;p&gt;Most programs usually work with some kind of data that needs to be persisted - ranging from different kinds of user input through internal app state, runtime cache, to program configuration.&lt;/p&gt;

&lt;p&gt;In this article, I'm going to provide an overview of the options available in Go, based on a few criteria we use to differentiate types of databases for various use-cases. Regardless of whether the project you're working on is a desktop app, a server program/micro-service, an embedded system/IoT solution, you should be able to find a storage solution to fit your needs.&lt;/p&gt;

&lt;p&gt;It is not unusual to use multiple database systems in a single project because each might fit a different purpose, e. g. one for logging/tracing and another one for user-data. Keep in mind, however, that this might become a burden to maintain, because, as with any other type of dependency, there is always a learning curve, changes you need to keep track of during updates and last but not least, security and licensing implications. Additionally, if you find yourself in need of the data from two databases in the same place for some action, you might reconsider your architecture choices.&lt;/p&gt;




&lt;h3&gt;
  
  
  Where the data is stored
&lt;/h3&gt;

&lt;p&gt;From the locality perspective, there are two main options based on what type of application you are building and what kind of data the application needs to store.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Remote (server) storage &lt;/strong&gt;- either a database server or other form of API server to which you connect from your program. Useful in case of multiple clients accessing a common data or sometimes in multiple services working with a single database server (not that the latter is considered an anti-pattern in the service-oriented architecture because it breaks service isolation).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Local storage (embedded)&lt;/strong&gt; - when the data is only specific to one application installation, or the data needs to be available off-line, it's desirable to have the data locally. In the embedded mode, the database libraries are part of the program and working with the data doesn't require any server/service (neither local nor remote).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Semi-Local storage&lt;/strong&gt; - similar to local storage, the "semi" in this category comes from using a database server running on the same machine as the program instead of an embedded library (as that's not an option for some databases).&lt;/p&gt;




&lt;h3&gt;
  
  
  How the data is stored and accessed
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SQL database &lt;/strong&gt;- stores structured data in tables (one entry per row) and provides a query language to access and create new sets.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Key-Value store &lt;/strong&gt;- uses an associative array (map/dictionary) to store arbitrary data as values (usually serialized) accessible by numeric/string keys.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Document store &lt;/strong&gt;- stores "documents" (JSON, XML, or arbitrary data) and provides ways to group and search those documents based on various criteria.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Object database &lt;/strong&gt;- combines approaches from the above-mentioned types to support representing data as objects, usually comes with a tight integration with objects (Go structs).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Graph database&lt;/strong&gt;- represents data as a collection of nodes and edges - useful in applications where multi-tier relations are the most important part of the data.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The way the data is used (most of the time)
&lt;/h3&gt;

&lt;p&gt;This is the category where it's actually most common for your project to end up with multiple databases in place because it actually distinguishes the purpose and the capabilities you need for your application.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;data ingress database &lt;/strong&gt;- logging, tracing, monitoring, time series,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;caching store &lt;/strong&gt;- operational cache to increase performance and decrease latencies,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;analytical database&lt;/strong&gt; - most useful to perform data analytics, usually come with tools for these purposes.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Use-cases
&lt;/h3&gt;

&lt;p&gt;I've selected a few interesting databases for the most common usage scenarios.&lt;/p&gt;

&lt;h4&gt;
  
  
  Monitoring, tracing, analytics
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/prometheus/prometheus"&gt;&lt;strong&gt;Prometheus&lt;/strong&gt;&lt;/a&gt; - remote server, data-ingress, analytical&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/influxdata/influxdb"&gt;&lt;strong&gt;InfluxDB&lt;/strong&gt;&lt;/a&gt; - remote server, data-ingress, analytical&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/jaegertracing/jaeger"&gt;&lt;strong&gt;Jaeger&lt;/strong&gt;&lt;/a&gt; - remote server, tracing, monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  General SQL storage
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/pingcap/tidb"&gt;&lt;strong&gt;TiDB&lt;/strong&gt;&lt;/a&gt; - remote server, distributed, scalable, ACID compliant, MySQL protocol compatible&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/cockroachdb/cockroach"&gt;&lt;strong&gt;CockroachDB&lt;/strong&gt;&lt;/a&gt; - remote server, distributed, scalable, ACID compliant&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rqlite/rqlite"&gt;&lt;strong&gt;rqlite&lt;/strong&gt;&lt;/a&gt; - remote server, distributed, scalable, SQLite based&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And a plethora of clients and ORMs for "standard" SQL servers so if you already have an existing SQL server infrastructure, you should have no problem connecting to it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Key-Value stores
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/dgraph-io/badger"&gt;&lt;strong&gt;BadgerDB&lt;/strong&gt;&lt;/a&gt; - local/embedded, ACID compliant, transactions&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/boltdb/bolt"&gt;&lt;strong&gt;BoltDB&lt;/strong&gt;&lt;/a&gt; - local/embedded, ACID compliant, transactions&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Object stores
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/objectbox/objectbox-go"&gt;&lt;strong&gt;ObjectBox&lt;/strong&gt;&lt;/a&gt; - local/embedded, ACID compliant, transactions, queries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This category seems to be quite underrepresented in Go, however, there are quite a few ORMs for key-value stores and SQL databases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/jinzhu/gorm"&gt;&lt;strong&gt;GORM&lt;/strong&gt;&lt;/a&gt; - remote server, supports MySQL, PostgreSQL, SQLite, MS SQL&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/timshannon/bolthold/"&gt;&lt;strong&gt;BoltHold&lt;/strong&gt;&lt;/a&gt; - local/embedded, provides serialization over BoltDB&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I hope this gives you a place to start with your next project. Let me know in the comments if you feel your favourite library should be listed or if you're missing something.&lt;/p&gt;

</description>
      <category>go</category>
      <category>database</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Storing confidential data in the cloud securely with Cryptomator</title>
      <dc:creator>Ivan Dlugos</dc:creator>
      <pubDate>Fri, 03 Aug 2018 01:24:35 +0000</pubDate>
      <link>https://dev.to/ivan/storing-confidential-data-in-the-cloud-securely-with-cryptomator-5ai</link>
      <guid>https://dev.to/ivan/storing-confidential-data-in-the-cloud-securely-with-cryptomator-5ai</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;TL;DR: If you have some data you need to store safely in your cloud folder (OneDrive, Google Drive, Dropbox, etc.) jump directly to the Cryptomator setup.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’ve been slacking off on backups of my personal things for quite a while, despite being a software engineer who knows the importance of backups and a working restore process and have been doing it on work-related stuff (sources, databases, etc.). I’ve had some backups on CDs &amp;amp; DVDs like ten years ago, then moved the “important” stuff to the cloud (Dropbox at first, then OneDrive, Google Drive), but it’s been inconsistent and disorganized. Still, lot’s of stuff have only been transferred from an old hard drive to a new one when changing PCs, without any backup at all.&lt;/p&gt;

&lt;p&gt;Lately, I’ve finally decided to clean things up, removing all the unnecessary mess and archiving the rest in a cloud storage. However, I’ve ended up with a few documents &amp;amp; contracts that necessitated keeping, but I’ve not been content having them just sit there in a cloud folder, however trustworthy and secure the provider seems to be. I’m not so afraid of them getting attacked but of someone getting hold of my account through more usual means, such as social engineering, for example. What I’m looking for is a way to password-protect my data whenever I don’t need to access it.&lt;/p&gt;

&lt;h3&gt;
  
  
  End-to-end encryption (E2EE)
&lt;/h3&gt;

&lt;p&gt;In plain English, this means that all your data is encrypted with some kind of password/key before it departs from your device (be it desktop, laptop, smartphone), is transferred and stored encrypted and then is only decrypted after you download it back to your device with the same password/key. Therefore, only a person who has the password/key can read that data, even if they get access to the encrypted version in the cloud. Of course this doesn’t protect you from someone who has access to your device but that is a different topic altogether.&lt;/p&gt;

&lt;p&gt;See &lt;a href="https://en.wikipedia.org/wiki/End-to-end_encryption" rel="noopener noreferrer"&gt;wiki on E2EE&lt;/a&gt; or google it for a more complete and correct explanation. I have considered a few options how to store my confidential files in the cloud:&lt;/p&gt;

&lt;h4&gt;
  
  
  VeraCrypt
&lt;/h4&gt;

&lt;p&gt;Based on the TrueCrypt, &lt;a href="https://www.veracrypt.fr/en/Home.html" rel="noopener noreferrer"&gt;VeraCrypt&lt;/a&gt; allows you to create an encrypted container/partition which you can then connect as a local drive and store data in it as if it was just another disk. While this is great and quite fast locally, the problem is that the container is a single file (e. g. 1 GB) and any change in it causes a full synchronization event — obviously very inefficient to upload the whole container each time you update a single file inside it.&lt;/p&gt;

&lt;h4&gt;
  
  
  E2EE cloud storage provider
&lt;/h4&gt;

&lt;p&gt;There are providers that seem to address my concern by providing E2EE as a part of their storage offering, e. g. &lt;a href="https://tresorit.com" rel="noopener noreferrer"&gt;Tresorit&lt;/a&gt; or &lt;a href="https://mega.nz" rel="noopener noreferrer"&gt;MEGA&lt;/a&gt;. However, I don’t really need so much storage to justify paying for it, if there are other, cheaper (free) options which I can use with my existing cloud providers.&lt;/p&gt;

&lt;h4&gt;
  
  
  Boxcryptor
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://www.boxcryptor.com/en/" rel="noopener noreferrer"&gt;Boxcryptor&lt;/a&gt; seemed interesting, doing the encryption on your device and storing the individual encrypted files inside the local synced folder of a cloud storage you are already using (Dropbox, OneDrive, etc.). However, I’ve been put off by a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;During installation, you need to accept a Data privacy &lt;em&gt;license/contract&lt;/em&gt; in German. I’m not saying I fully read all those licenses we accept during software installation, but I’d at least like to be able to do so, without speaking German or depending on machine translation. I know not everyone knows English either but then they are not reading this article :)&lt;/li&gt;
&lt;li&gt;Despite having a free tier, you need to register and login. I’m not sure why that would be necessary and honestly, I’m not willing to try and find out.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Cryptomator
&lt;/h4&gt;

&lt;p&gt;Similar to Boxcryptor, &lt;a href="https://cryptomator.org/" rel="noopener noreferrer"&gt;Cryptomator&lt;/a&gt; stores your encrypted files in your local cloud folder (or any folder for that matter, you can use floppy disks if you still fancy those) in a so-called &lt;em&gt;Vault.&lt;/em&gt; It ticks the boxes for what I’ve been looking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the files are stored separately, so there’s only need to synchronize the changed/added/removed files, not the whole vault,&lt;/li&gt;
&lt;li&gt;client-side: no accounts, no data shared with any online service,&lt;/li&gt;
&lt;li&gt;AES encryption with 256-bit key length,&lt;/li&gt;
&lt;li&gt;file names get encrypted &amp;amp; folder structure gets obfuscated,&lt;/li&gt;
&lt;li&gt;unlimited number of vaults, each with an individual password,&lt;/li&gt;
&lt;li&gt;the vault’s size is flexible (unlike with VeraCrypt which can grow but doesn’t shrink back), limited only by the size of the underlying storage, with only a negligible overhead.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To be completely frank, there is one problem I’ve encountered and depending on the way you work it might affect you considerably. Working with the drive it attaches is not really transparent for some programs — they seem to have a problem opening the file directly from the drive. As an example, I can open a PDF file in Acrobat Reader but not in Edge. Or a video won’t play in the PotPlayer. I don’t see a clear pattern but I think it’s related to how that program implements file operations. I’d just have to file an issue on the project’s GitHub but for the time being and for my use-cases, I’m OK with this limitation.&lt;a&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Setting up Cryptomator
&lt;/h4&gt;

&lt;p&gt;The setup is quite simple but the UX of the app is not that good at the moment, especially for the first time user, so here you go:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download from the &lt;a href="https://cryptomator.org/" rel="noopener noreferrer"&gt;cryptomator.org&lt;/a&gt; and install&lt;/li&gt;
&lt;li&gt;Launch the app and you are “greeted” with the following window:&lt;/li&gt;
&lt;/ol&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%2Fcdn-images-1.medium.com%2Fmax%2F654%2F1%2ADgcJn6LTWL06YphPRxdrrw.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%2Fcdn-images-1.medium.com%2Fmax%2F654%2F1%2ADgcJn6LTWL06YphPRxdrrw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click on the plus button and select “Create new vault”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browse to the folder where you want to create your vault (e. g. OneDrive folder) and write a name of the vault (e. g. _Confidential) — _it will be the name of a folder Cryptomator creates for you in the current directory.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fcdn-images-1.medium.com%2Fmax%2F705%2F1%2AKgUDlSj47tx4WNPdIKj4Ag.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%2Fcdn-images-1.medium.com%2Fmax%2F705%2F1%2AKgUDlSj47tx4WNPdIKj4Ag.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;After hitting save, you are prompted to create a password for the vault. This should be quite strong (long and complex) because if someone gets hold of your encrypted data, they have a lot of time to try to brute-force decrypt it (using dictionary attacks and other techniques). There are guides on how to create such a password all over the internet. By the way, maybe you might want to use a password manager if you like.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After your vault is created, you can choose how you want to work with the vault, most importantly whether to save the password locally and auto-unlock (only do this if you trust the security of your device) or you want to unlock it manually, entering the password each time. The latter might be safer, depending on your situation, whether you trust everyone who has access to your computer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Now you just open the Cryptomator drive, copy files over and to be sure, you can take a look at your encrypted data in the vault.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fcdn-images-1.medium.com%2Fmax%2F723%2F1%2AoGp7BQAx45UMjQ5GoTNhVQ.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%2Fcdn-images-1.medium.com%2Fmax%2F723%2F1%2AoGp7BQAx45UMjQ5GoTNhVQ.png"&gt;&lt;/a&gt;Unlocked vault automatically mapped by Cryptomator as a network drive&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%2Fcdn-images-1.medium.com%2Fmax%2F718%2F1%2AIp_v1BsqVD3XcwV0r7G8Qw.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%2Fcdn-images-1.medium.com%2Fmax%2F718%2F1%2AIp_v1BsqVD3XcwV0r7G8Qw.png"&gt;&lt;/a&gt;Encrypted Vault as visible in the target folder (OneDrive in this example), already synced to the cloud&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%2Fcdn-images-1.medium.com%2Fmax%2F708%2F1%2AnDIYPBlmVfgFP4_jkVxNYw.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%2Fcdn-images-1.medium.com%2Fmax%2F708%2F1%2AnDIYPBlmVfgFP4_jkVxNYw.png"&gt;&lt;/a&gt;The file path, name and contents are all encrypted when stored&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Don’t forget you can’t just copy files directly to the vault (e. g. on OneDrive) — they won’t magically get encrypted. You always need to work with an unlocked vault, i. e. inside the network folder Cryptomator attaches for you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s it, from now on, your confidential files are much more secure with a little upfront and a minimum ongoing effort. Cryptomator supports all the major platforms — Windows, Linux, macOS, Android, iOS so you can even access the files on other devices, synced automatically through your cloud provider. I personally will also take a look on how to have the data automatically backed up to another cloud storage in an unlikely situation that it is lost by one provider for some reason.&lt;/p&gt;

&lt;p&gt;All of the mentioned approaches have some issues, be it performance, ease of use, price, etc. Ultimately it’s your choice which one you choose, if any, but do yourself a favour and take at least some precautions; better safe than sorry. And remember:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Just because you’re paranoid doesn’t mean they aren’t after you.”&lt;br&gt;&lt;br&gt;
― Joseph Heller, Catch-22&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>encryption</category>
      <category>opensource</category>
      <category>security</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Fast-track to a new language for an experienced programmer</title>
      <dc:creator>Ivan Dlugos</dc:creator>
      <pubDate>Sun, 15 Jul 2018 15:28:16 +0000</pubDate>
      <link>https://dev.to/ivan/fast-track-to-a-new-language-for-an-experienced-programmer-5h1l</link>
      <guid>https://dev.to/ivan/fast-track-to-a-new-language-for-an-experienced-programmer-5h1l</guid>
      <description>&lt;p&gt;OK, so you are a software developer/engineer/coder, whatever you call yourself, and you are having some thoughtful pause between the tasks coming in a never-ending stream…&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Yeah, I can write a pretty decent Java/Python/… (fill in your favourite) but so what? This stuff is getting boring! I need some challenge! I gotta learn some new tech!"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And there you are, searching the internet for the "Best programming language to learn in 20XX", checking out the TIOBE Index, comparing salaries those languages could earn you, etc. Been there, done that. And I'm not going to discourage you, quite the opposite, let me give you some hints to guide you along the way.&lt;/p&gt;




&lt;h4&gt;
  
  
  Motivation
&lt;/h4&gt;

&lt;p&gt;Make sure you know why you are doing it in the first place. Is it to sate your curiosity? Or do you feel your skill set is getting outdated? You really, really wanted to finally do some functional programming? Maybe you are even one of the pragmatics who just wants to have the best tool for the job :)&lt;/p&gt;

&lt;p&gt;Whatever your reasons, remember them or write them down on a sticky note or something. You are gonna need this to steer you in the deep waters of choices ahead of you. You might come across, for example, this latest cool-kid-on-the-block which does everything c++ does, but much better, bringing a lot of new features, solving all kinds of problems. It might just so happen that they forget to mention all kinds of problems it's gonna bring (you know.. you don't know what you don't know).&lt;/p&gt;

&lt;p&gt;There are all kinds of interesting languages and technologies that might seem very tempting at first, but be ready and remember what your original motivation was. Either stick to that or just update (aren't we agile after all?). Just have and keep some general direction or your noble journey to master a new language might end up like that failed project. If you've worked for some time in a company of any size, you know which one I mean.&lt;/p&gt;

&lt;h4&gt;
  
  
  Picking the right one
&lt;/h4&gt;

&lt;p&gt;This is strongly tied to your reasons and expectations. Take a quick look at the few you are interested in. Check out their homepages. Scroll through the introductory tutorials/quick start guides. If you want to see the hard data, take a look at their popularity on Google Trends and TIOBE. Filter them on StackOverflow and GitHub to see the state and drive of the community.&lt;/p&gt;

&lt;p&gt;After your quick research, you would ideally end up with a single language to tackle next. We all know it's not gonna be the last one so if you can't decide, just throw a dice.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OK, got it, whats next?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Learn by observation
&lt;/h4&gt;

&lt;p&gt;Actually follow the quick start guide or tutorial. Watch a video on YouTube. For some languages, like &lt;a href="https://golang.org/"&gt;Go&lt;/a&gt;, for example, you don't have to install anything to quickly try them out. You can do it online in the browser, on a site provided either by the language creators or by third parties (e. g. coding-challenges, tutorial sites, …).&lt;/p&gt;

&lt;p&gt;At this point, you should get an idea what the language feels like, how it compares to what you have used before. In case you have any doubts, don't be afraid to revisit previous steps to make sure your reasons and expectations are met and you actually like your choice.&lt;/p&gt;

&lt;h4&gt;
  
  
  Learn by practice
&lt;/h4&gt;

&lt;p&gt;Obviously, you can't learn to program in a language without actually doing it. Here are some tips to get you started.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;use a coding-challenge site&lt;/strong&gt;, e. g. &lt;a href="https://app.codility.com/programmers/"&gt;Codility&lt;/a&gt;, &lt;a href="https://www.hackerrank.com/dashboard"&gt;HackerRank&lt;/a&gt; or similar. This is great for two reasons. Firstly, you have an online environment to practice in (no need to invest your time and set up a proper local environment yet). Secondly, you have actual problems to solve, with a proper specification, already defined tests, etc. This is a huge benefit because not only you are getting the syntax into your "muscle memory" in bite-size pieces, but you are also training and refreshing your algorithmic thinking (and that never hurts). Yeah, some of those live editors are not too good (though they are getting better each time I check) and if this is a stopper for you, just set up your dev-env, use &lt;a href="https://projecteuler.net/"&gt;ProjectEuler&lt;/a&gt; and do the scaffolding for each problem yourself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;create something&lt;/strong&gt;, useful or useless, doesn't matter too much. There are many things the coding-challenges do not cover - databases, APIs, sockets, and rest of the real world stuff you are dealing with daily. So after your algorithmic thinking is up to speed, you should try to use the language on some actual project. Something that would keep you engaged consistently and provide you with much-needed practice and experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;give back to the community&lt;/strong&gt;, by working on open-source projects in the language you have just learned. There is always someone in need of a helping hand so if you can't think of anything to create yourself, why not code some PRs and make the world a better place? Take a look at this &lt;a href="https://github.com/MunGell/awesome-for-beginners"&gt;list of OSS projects&lt;/a&gt; (by language) looking for outside help.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Use it professionally
&lt;/h4&gt;

&lt;p&gt;This is the real deal. Until you have used the language for a reasonable time on a (preferably larger) project, you are not going to cover its intricacies and really get to know it. Therefore, as soon as you feel comfortable, or sooner if you are a perfectionist, try to incorporate your hard earned knowledge wherever it makes sense. But please make sure you are not one of those guys with a big new hammer for whom everything looks like a nail :)&lt;/p&gt;




&lt;h4&gt;
  
  
  Déjà vu
&lt;/h4&gt;

&lt;p&gt;Time has passed, a few months, a year or more… You have finished a project or a few in the new language. You know how it ticks, you know what you like and don't like…&lt;/p&gt;

&lt;p&gt;And if you are the ever curious guy like me, you are going to be asking the same question that got you here.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What's next?&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>career</category>
      <category>computerscience</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
