{"tag":"security","articles":{"blog\/technology\/passwords-are-pass\u00e9":{"key":"blog\/technology\/passwords-are-pass\u00e9","type":"article","published":true,"meta":{"createdAt":"2020-04-18T11:09:31+02:00","publishedAt":"2020-04-18T11:09:31+02:00","group":null,"category":"blog","subcategory":"technology","slug":"passwords-are-pass\u00e9"},"content":{"en":{"slug":"passwords-are-pass\u00e9","title":"Passwords are pass\u00e9","intro":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/password_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.47720364742\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEfUlEQVRIiWWWW48bRRCFv+rpsb0X7zVxQBCCEq3ywAsSvPA\/eOcv8jcQDyACPLBaIBIJIdlbkvXaY8\/04aF6Lt6sZO+4unvq1KmqU22z4z0BWP4yDMywbOvtwswA4Sbf44tqd+bV\/O3\/\/Jf69WxG3VO\/N3Zg2pdjmMBMBMsW61fpgAxOqt\/g2AwNzgn5goyEMiL3pQE8ZESkfHIIRIQBC6aWuQ9ZG0bnoAwJhiYN2AsZv6TNczmauMGNQWF+POS0hcFzH5fbO4cdE5kPu5sa\/0oZXCJl\/zZMGghilyaDkGMpMApEYeaA8PQNowwZWOe8Y8XusJM\/5oAaeb0lhJnugIJo1kbsTgtgZL4QEdG80MIg6gIoMpoENEDKDvtdPasig8FY5UDq3Ad30xv9oDBEgTE2mJiYGIyASbAOIIi1YGRGzN7WgkpuTwMoLYtgBIMacStnBCDlgjYTlnpQkQzG\/AfbBscBjkJgHGAaAscxMC0CK4nLJjENgdK8thZJvKkbKnmKk0QSjIMRMGrEYQjEYJxWNS+VPNUYarsud6fAA20\/0WAHcVKWPB6X7MXAozLyxb1DSjMu5zdcKDErCiSYbk24Xlb8eP2ehPHZZMxKiavVmkeTMaNQsAzGbH\/K3vER3\/\/0Oz\/cVvxVNzSCBnWsNub5i5lVryM5qINgfPv4E47GI+rLtxx88xXvX\/zHyT8vOPl4RrFYwv4+abrLvUVF+cszFnXi6ddfcrOzTfj5GdMHM4oHM1gu4fwKHj3ku9UKfjvl6mbJrcRKUOPdbXJFil3VGSTECpinhsvr91STMbGq2H83Z1oUrJOw0YiUoDzcJ518TvPqnI\/+2OK1FYxm9zi6mbMWWFFADLBak6oloWkod3aYFgXlICvuX0gBEFHKLZnRVoKrRlRbY84vrrAmoVdveFivuF4uOSxLqGt09px4\/5jm9E\/ezOdMDg64PXvOi7O\/OZ\/PeQocGLw9v+D5y1dsXVwxOdjj19uKd8mboMFVfDhubHY4VWHe1iViJxgPAjwpA7tZUT8dldwvC8zEk+0Ju7HgZlWzHSMvlyvOFhW7RWArGOd14m1K3I8FR7Hgdd3w76omBFgn43Rd83cNc4ylRC1olLtOYLOjPbkGiYAxzqDGiG0TEzO2gzEJxsRgKxhbwQ83wDyJRfJRE81YyQs1AGbu9Da54zWwELyTUWXJaARNJ44iokTKU6utISVRAUuD0kRMojQv+IBrkGVBbCRSP\/c3xkUrmnXWqBqjFlT0upWUB6w8fbFJIgTXj2CiydSl3JJreToLWZ5z6goyZecJZV0eTibbAOUzzANY5+du3qm\/irgAu2aSBMEcSJ2Rt4ob8JSGQQHK2pdZdm8DQGw4TdllyvrTAv5gdLR0tX+po14ZoM8uv4a04zPv0fDB9US5jXsw1nWSsPbaQ9LwRiCU3xF9Q2v2O1GwNkbrDlrW9w396MnqgLT4lC9Nygy2s8EDtcFdqIcrZ2iQyBx+yi8282SYNj3bBqJsbo93I77luQcu1AHstUddMAD\/A+DnkhKGvnqaAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/password_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.47720364742\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHackers know your password. I\u0027m like 99% sure they do.\nJust go to \u003Ca href=\u0022https:\/\/haveibeenpwned.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E \u0027;--have i been pwned?\u003C\/a\u003E and enter your email(s).\nSee? Your password is as good as public.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/password_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022534.95440729483\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEfUlEQVRIiWWWW48bRRCFv+rpsb0X7zVxQBCCEq3ywAsSvPA\/eOcv8jcQDyACPLBaIBIJIdlbkvXaY8\/04aF6Lt6sZO+4unvq1KmqU22z4z0BWP4yDMywbOvtwswA4Sbf44tqd+bV\/O3\/\/Jf69WxG3VO\/N3Zg2pdjmMBMBMsW61fpgAxOqt\/g2AwNzgn5goyEMiL3pQE8ZESkfHIIRIQBC6aWuQ9ZG0bnoAwJhiYN2AsZv6TNczmauMGNQWF+POS0hcFzH5fbO4cdE5kPu5sa\/0oZXCJl\/zZMGghilyaDkGMpMApEYeaA8PQNowwZWOe8Y8XusJM\/5oAaeb0lhJnugIJo1kbsTgtgZL4QEdG80MIg6gIoMpoENEDKDvtdPasig8FY5UDq3Ad30xv9oDBEgTE2mJiYGIyASbAOIIi1YGRGzN7WgkpuTwMoLYtgBIMacStnBCDlgjYTlnpQkQzG\/AfbBscBjkJgHGAaAscxMC0CK4nLJjENgdK8thZJvKkbKnmKk0QSjIMRMGrEYQjEYJxWNS+VPNUYarsud6fAA20\/0WAHcVKWPB6X7MXAozLyxb1DSjMu5zdcKDErCiSYbk24Xlb8eP2ehPHZZMxKiavVmkeTMaNQsAzGbH\/K3vER3\/\/0Oz\/cVvxVNzSCBnWsNub5i5lVryM5qINgfPv4E47GI+rLtxx88xXvX\/zHyT8vOPl4RrFYwv4+abrLvUVF+cszFnXi6ddfcrOzTfj5GdMHM4oHM1gu4fwKHj3ku9UKfjvl6mbJrcRKUOPdbXJFil3VGSTECpinhsvr91STMbGq2H83Z1oUrJOw0YiUoDzcJ518TvPqnI\/+2OK1FYxm9zi6mbMWWFFADLBak6oloWkod3aYFgXlICvuX0gBEFHKLZnRVoKrRlRbY84vrrAmoVdveFivuF4uOSxLqGt09px4\/5jm9E\/ezOdMDg64PXvOi7O\/OZ\/PeQocGLw9v+D5y1dsXVwxOdjj19uKd8mboMFVfDhubHY4VWHe1iViJxgPAjwpA7tZUT8dldwvC8zEk+0Ju7HgZlWzHSMvlyvOFhW7RWArGOd14m1K3I8FR7Hgdd3w76omBFgn43Rd83cNc4ylRC1olLtOYLOjPbkGiYAxzqDGiG0TEzO2gzEJxsRgKxhbwQ83wDyJRfJRE81YyQs1AGbu9Da54zWwELyTUWXJaARNJ44iokTKU6utISVRAUuD0kRMojQv+IBrkGVBbCRSP\/c3xkUrmnXWqBqjFlT0upWUB6w8fbFJIgTXj2CiydSl3JJreToLWZ5z6goyZecJZV0eTibbAOUzzANY5+du3qm\/irgAu2aSBMEcSJ2Rt4ob8JSGQQHK2pdZdm8DQGw4TdllyvrTAv5gdLR0tX+po14ZoM8uv4a04zPv0fDB9US5jXsw1nWSsPbaQ9LwRiCU3xF9Q2v2O1GwNkbrDlrW9w396MnqgLT4lC9Nygy2s8EDtcFdqIcrZ2iQyBx+yi8282SYNj3bBqJsbo93I77luQcu1AHstUddMAD\/A+DnkhKGvnqaAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/password_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022534.95440729483\u0022\u003E\u003C\/span\u003E\n                \u003Cfigcaption\u003E\n                    \u003Ca href=\u0022https:\/\/unsplash.com\/photos\/zEFyM4sulJ8\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\n                        \u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E\n                        unsplash.com\/photos\/zEFyM4sulJ8\n                    \u003C\/a\u003E\n                \u003C\/figcaption\u003E\n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHackers know your password. I\u0027m like 99% sure they do.\nJust go to \u003Ca href=\u0022https:\/\/haveibeenpwned.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E \u0027;--have i been pwned?\u003C\/a\u003E and enter your email(s).\nSee? Your password is as good as public.\u003C\/p\u003E\n\u003Cp\u003EWe all hate passwords, don\u0027t we? Trying to keep them easy to remember, but also hard to break,\nwhile also complying with stupid \u003Ca href=\u0022https:\/\/twitter.com\/PWTooStrong\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E arbitrary rules\u003C\/a\u003E,\nwhile having corporate forcing you to change it regularly... They\u0027re a pain in the ass.\u003C\/p\u003E\n\u003Cp\u003EThey aren\u0027t even that safe.\nHow can you be sure that the administrator of a website that you trusted with your password even hashes it?\nHow do you know they salt it? How do you know they don\u0027t use an outdated hashing algorithm?\nHow can you be sure they won\u0027t have a data breach, their database leaked, and your password recovered with supercomputers?\u003C\/p\u003E\n\u003Cp\u003EDamn, I\u0027m an administrator myself, and I still can\u0027t be sure I do everything right.\nI got a panic attack last week when a user reported that his password was stolen and used for blackmail\n(\u003Ca href=\u0022\/blog\/recognising-red-flags-in-blackmail-emails\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-computer-speaker\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Recognising red flags in blackmail emails\u003C\/a\u003E)\n\u2013 in this case it was a reused password that leaked somewhere else, but still...\nEven though I\u0027m storing people\u0027s passwords in the best way I can,\nI would feel so much better, if I just \u003Cem\u003Edidn\u0027t have to store them\u003C\/em\u003E.\u003C\/p\u003E\n\u003Cp\u003EHow about we just \u003Cem\u003Estop using passwords\u003C\/em\u003E?\u003C\/p\u003E\n\u003Ch3\u003E1. Social login\u003C\/h3\u003E\n\u003Cp\u003EIf you log in with Facebook, Twitter, Google, Apple or whatever, you make me a happier developer.\nYes, your social media account is still protected by a password, but at least \u003Cem\u003EI don\u0027t know it\u003C\/em\u003E.\nIf anything happens to your social media account, it\u0027s gonna be a problem of a huge corporation with\nwell-funded infosec department \u2013 not a random developer who makes websites for fun and does their best keeping them safe.\u003C\/p\u003E\n\u003Ch3\u003E2. Magic links\u003C\/h3\u003E\n\u003Cp\u003EIn my first job I saw in the logs that many users use the \u201cremind password\u201d feature not as a recovery option,\nbut as their main login method. Today, their quirk is becoming an increasingly popular security trend, actually.\nIf you go, for example, to \u003Ca href=\u0022https:\/\/whereby.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Whereby\u003C\/a\u003E, they\u0027ll only ask you for your email, not a password.\nEvery time you try to log in, they\u0027ll just send you and email with a one-time code.\u003C\/p\u003E\n\u003Cp\u003EI implemented a similar approach in my new project, \u003Ca href=\u0022\/projects\/avris-booster-quick-start-of-new-projects\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-cogs\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Avris Booster: Quick start of new projects\u003C\/a\u003E (under active development).\nNow I don\u0027t need a separate \u201cregister\u201d, \u201clog in\u201d and \u201cremind password\u201d forms \u2013 I just have one.\nNow I don\u0027t keep any passwords \u2013 just some temporary codes that can\u0027t be reused on other websites.\u003C\/p\u003E\n\u003Cp\u003EAnd users don\u0027t have to worry about remembering, storing or losing their passwords.\u003C\/p\u003E\n\u003Ch3\u003E3. Multi-factor authentication\u003C\/h3\u003E\n\u003Cp\u003EWhatever authentication method you use (or are forced to use), it\u0027s always better to have a second one.\nIf a website offers MFA, it\u0027s smart set it up (I can strongly recommend the \u003Ca href=\u0022https:\/\/authy.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Authy\u003C\/a\u003E app for it).\u003C\/p\u003E\n\u003Cp\u003EThis way, even if your password gets stolen, the hackers will still need more (your phone) to access your account.\u003C\/p\u003E\n\u003Ch3\u003E4. Other options\u003C\/h3\u003E\n\u003Cp\u003EThere\u0027s also such a thing as \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Hardware_security_module\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Hardware Security Modules\u003C\/a\u003E.\nSome websites offer login with \u003Ca href=\u0022https:\/\/www.openpgp.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E PGP keys\u003C\/a\u003E.\nAnd there\u0027s probably a lot more options, but no time to dive into them right now.\u003C\/p\u003E\n\u003Ch3\u003E5. Password managers\u003C\/h3\u003E\n\u003Cp\u003ELet\u0027s face it, passwords are still inevitable. Until webmasters stop being so password-centric,\nwe have to keep using passwords, if we want to keep using their products.\u003C\/p\u003E\n\u003Cp\u003EThe best we can do in this situation, is to make sure that all of our passwords are strong and unique\n(so that a hacker who found out our Spotify password can\u0027t use it to log in to our bank or email).\nOf course, nobody can remember tens or hundreds of strong, unique password. That\u0027s why we have password managers.\nI can strongly recommend \u003Ca href=\u0022https:\/\/keepass.info\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E KeePass\u003C\/a\u003E. Or even saving the passwords in the browser.\u003C\/p\u003E\n\u003Cp\u003ESeriously, anything is better than using the same password for some shady forum as you use for your online banking.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["password","security","magic link","development","programming","hackers","hacking"],"hasMore":true,"image":"https:\/\/avris.it\/image\/password_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/password_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/password_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.73860182371\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHackers know your password. I\u0027m like 99% sure they do.\nJust go to \u003Ca href=\u0022https:\/\/haveibeenpwned.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E \u0027;--have i been pwned?\u003C\/a\u003E and enter your email(s).\nSee? Your password is as good as public.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/password_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/password_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.73860182371\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003Cfigcaption\u003E\n                    \u003Ca href=\u0022https:\/\/unsplash.com\/photos\/zEFyM4sulJ8\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csmall\u003Eunsplash.com\/photos\/zEFyM4sulJ8\u003C\/small\u003E\u003C\/a\u003E\n                \u003C\/figcaption\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EHackers know your password. I\u0027m like 99% sure they do.\nJust go to \u003Ca href=\u0022https:\/\/haveibeenpwned.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E \u0027;--have i been pwned?\u003C\/a\u003E and enter your email(s).\nSee? Your password is as good as public.\u003C\/p\u003E\n\u003Cp\u003EWe all hate passwords, don\u0027t we? Trying to keep them easy to remember, but also hard to break,\nwhile also complying with stupid \u003Ca href=\u0022https:\/\/twitter.com\/PWTooStrong\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E arbitrary rules\u003C\/a\u003E,\nwhile having corporate forcing you to change it regularly... They\u0027re a pain in the ass.\u003C\/p\u003E\n\u003Cp\u003EThey aren\u0027t even that safe.\nHow can you be sure that the administrator of a website that you trusted with your password even hashes it?\nHow do you know they salt it? How do you know they don\u0027t use an outdated hashing algorithm?\nHow can you be sure they won\u0027t have a data breach, their database leaked, and your password recovered with supercomputers?\u003C\/p\u003E\n\u003Cp\u003EDamn, I\u0027m an administrator myself, and I still can\u0027t be sure I do everything right.\nI got a panic attack last week when a user reported that his password was stolen and used for blackmail\n(\u003Ca href=\u0022\/blog\/recognising-red-flags-in-blackmail-emails.lite\u0022\u003E Recognising red flags in blackmail emails\u003C\/a\u003E)\n\u2013 in this case it was a reused password that leaked somewhere else, but still...\nEven though I\u0027m storing people\u0027s passwords in the best way I can,\nI would feel so much better, if I just \u003Cem\u003Edidn\u0027t have to store them\u003C\/em\u003E.\u003C\/p\u003E\n\u003Cp\u003EHow about we just \u003Cem\u003Estop using passwords\u003C\/em\u003E?\u003C\/p\u003E\n\u003Ch3\u003E1. Social login\u003C\/h3\u003E\n\u003Cp\u003EIf you log in with Facebook, Twitter, Google, Apple or whatever, you make me a happier developer.\nYes, your social media account is still protected by a password, but at least \u003Cem\u003EI don\u0027t know it\u003C\/em\u003E.\nIf anything happens to your social media account, it\u0027s gonna be a problem of a huge corporation with\nwell-funded infosec department \u2013 not a random developer who makes websites for fun and does their best keeping them safe.\u003C\/p\u003E\n\u003Ch3\u003E2. Magic links\u003C\/h3\u003E\n\u003Cp\u003EIn my first job I saw in the logs that many users use the \u201cremind password\u201d feature not as a recovery option,\nbut as their main login method. Today, their quirk is becoming an increasingly popular security trend, actually.\nIf you go, for example, to \u003Ca href=\u0022https:\/\/whereby.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Whereby\u003C\/a\u003E, they\u0027ll only ask you for your email, not a password.\nEvery time you try to log in, they\u0027ll just send you and email with a one-time code.\u003C\/p\u003E\n\u003Cp\u003EI implemented a similar approach in my new project, \u003Ca href=\u0022\/projects\/avris-booster-quick-start-of-new-projects.lite\u0022\u003E Avris Booster: Quick start of new projects\u003C\/a\u003E (under active development).\nNow I don\u0027t need a separate \u201cregister\u201d, \u201clog in\u201d and \u201cremind password\u201d forms \u2013 I just have one.\nNow I don\u0027t keep any passwords \u2013 just some temporary codes that can\u0027t be reused on other websites.\u003C\/p\u003E\n\u003Cp\u003EAnd users don\u0027t have to worry about remembering, storing or losing their passwords.\u003C\/p\u003E\n\u003Ch3\u003E3. Multi-factor authentication\u003C\/h3\u003E\n\u003Cp\u003EWhatever authentication method you use (or are forced to use), it\u0027s always better to have a second one.\nIf a website offers MFA, it\u0027s smart set it up (I can strongly recommend the \u003Ca href=\u0022https:\/\/authy.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Authy\u003C\/a\u003E app for it).\u003C\/p\u003E\n\u003Cp\u003EThis way, even if your password gets stolen, the hackers will still need more (your phone) to access your account.\u003C\/p\u003E\n\u003Ch3\u003E4. Other options\u003C\/h3\u003E\n\u003Cp\u003EThere\u0027s also such a thing as \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Hardware_security_module\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Hardware Security Modules\u003C\/a\u003E.\nSome websites offer login with \u003Ca href=\u0022https:\/\/www.openpgp.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E PGP keys\u003C\/a\u003E.\nAnd there\u0027s probably a lot more options, but no time to dive into them right now.\u003C\/p\u003E\n\u003Ch3\u003E5. Password managers\u003C\/h3\u003E\n\u003Cp\u003ELet\u0027s face it, passwords are still inevitable. Until webmasters stop being so password-centric,\nwe have to keep using passwords, if we want to keep using their products.\u003C\/p\u003E\n\u003Cp\u003EThe best we can do in this situation, is to make sure that all of our passwords are strong and unique\n(so that a hacker who found out our Spotify password can\u0027t use it to log in to our bank or email).\nOf course, nobody can remember tens or hundreds of strong, unique password. That\u0027s why we have password managers.\nI can strongly recommend \u003Ca href=\u0022https:\/\/keepass.info\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E KeePass\u003C\/a\u003E. Or even saving the passwords in the browser.\u003C\/p\u003E\n\u003Cp\u003ESeriously, anything is better than using the same password for some shady forum as you use for your online banking.\u003C\/p\u003E","words":656,"readTime":3,"lang":"en"}}},"blog\/technology\/recognising-red-flags-in-blackmail-emails":{"key":"blog\/technology\/recognising-red-flags-in-blackmail-emails","type":"article","published":true,"meta":{"createdAt":"2019-01-24T11:50:02+01:00","publishedAt":"2019-01-24T11:46:00+01:00","group":null,"category":"blog","subcategory":"technology","slug":"recognising-red-flags-in-blackmail-emails"},"content":{"en":{"slug":"recognising-red-flags-in-blackmail-emails","title":"Recognising red flags in blackmail emails","intro":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/lame-hacker_small.jpg\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022311.19402985075\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADxklEQVRIiY1WzUorMRg9ycQZamtFEMSF+AeFStdqwb0+gFvfwnfQJ3CvCxddu3GjbkQoxYWCoKggrQoig9ramU5mkru4N7lpnGn9YJi\/5Dsn5\/tJSBRFEgAIIZBSghACZVLK1Gf1LqXE3t4earUaoihCkiRgjOHw8BDz8\/Pal+nTfLaNEAJmf7SBTXB7jJQSy8vLKJfLKBaLCIIAzWYTrVYLc3NzqYCmH5uclBJEKZRlJpm0O2MMjDH0ej1wztHr9dDpdDA9Pa1BbaUGKcbMUJn3NDJphG5ubjAyMgIAeHh4QKFQwMzMDIQQQ8OjVTGIsrQQZamURrBUKsFxHABALpeD67pgjKWGXoGqf2mkqC3pIHXUJYTQ1\/f3N5IkQRiG4JwDAPL5fN8YIcSPBZlKm+\/0N+rYSplAz8\/PODg4gJQSnuehVqshjmMkSYIkSfrI2ItLVZBzLk1AG1wRMImEYYj393f4vo+joyNcXV0hjmNwztFut1GpVFCtVlGtVjE7OwvGGAghoJTqJM9K9qGEbDLX19fY2dlBp9MBpRRSSl1dlFJQSsEY0wBra2vY3t6G67p9hCil\/0kYhH6ELK0yFLkwDLG\/v4\/Pz08kSQIpJaIo0k4dx\/lRrWdnZzg\/P9cLM32mYVFbsiyTUuLi4gLNZhPFYhFCCCRJoiuMMaYVUsBJkiCOY9Tr9cyGawvB0kKVRajRaGBiYgIrKytgjKHb7cJxHB0KdWeMaaL39\/e4u7vL9GvjMrMXKKZp5fj4+Ijb21uUSiWsr6+nVpEKg5209Xp9KBk1Xu9ldpOySV1eXoJzjq+vL0gpMwkpX0qtIAgQRRGiKNIdfZD9qg9xznF6eoq3tzd0Op0flWcmrN1zgiAAAAghhpLRjdEOm\/kNAE5OTiCEwNTUFMbGxkAISa0ak4giEIYhAOheNIiMlPJ\/Dg2yl5cX5PN5eJ4Hz\/MynZm5oCwIgr5qtHPMxqd27E1TE8rlMrrdLqIoQrvd1rkjhEAcx\/j4+NDAqh0ohbrdrn7OWryp9I8DWtohanV1FYVCAYQQ9Ho97O7uAgDGx8dBKcXCwgJyuRyenp7gOA6Oj4\/\/rvZf115aWtIJbStjN8i+kGX1CkopKpWKVkQIgSAI4Ps+giBAo9HA6OgoJicn8fr6+jc5KYXnedjc3MTGxoauOnvxtjH7gGS+230FADjnfXuVGuf7Pnzf76sm13WxtbUF13Uz88bG\/FVSm5NbrZbeSE1l0xLaXtQwdYAhfShtUhRFkFLqM4\/aKuw5hBAsLi7q6lLfhgnwB8uPNwrCWTIsAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/lame-hacker_small.jpg\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022311.19402985075\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDid anyone receive a message recently that contained a video of me watching porn? \ud83d\ude06\u003C\/p\u003E\n\u003Cp\u003EBecause apparently I was being blackmailed that all my contacts would receive it, if I don\u2019t pay 202\u20ac in BTC. Alas, I didn\u2019t check the spam folder, so I\u2019d missed the deadline a week ago \ud83e\udd37\u200d\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/lame-hacker_big.jpg\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022622.38805970149\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAXCAYAAABj7u2bAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADxklEQVRIiY1WzUorMRg9ycQZamtFEMSF+AeFStdqwb0+gFvfwnfQJ3CvCxddu3GjbkQoxYWCoKggrQoig9ramU5mkru4N7lpnGn9YJi\/5Dsn5\/tJSBRFEgAIIZBSghACZVLK1Gf1LqXE3t4earUaoihCkiRgjOHw8BDz8\/Pal+nTfLaNEAJmf7SBTXB7jJQSy8vLKJfLKBaLCIIAzWYTrVYLc3NzqYCmH5uclBJEKZRlJpm0O2MMjDH0ej1wztHr9dDpdDA9Pa1BbaUGKcbMUJn3NDJphG5ubjAyMgIAeHh4QKFQwMzMDIQQQ8OjVTGIsrQQZamURrBUKsFxHABALpeD67pgjKWGXoGqf2mkqC3pIHXUJYTQ1\/f3N5IkQRiG4JwDAPL5fN8YIcSPBZlKm+\/0N+rYSplAz8\/PODg4gJQSnuehVqshjmMkSYIkSfrI2ItLVZBzLk1AG1wRMImEYYj393f4vo+joyNcXV0hjmNwztFut1GpVFCtVlGtVjE7OwvGGAghoJTqJM9K9qGEbDLX19fY2dlBp9MBpRRSSl1dlFJQSsEY0wBra2vY3t6G67p9hCil\/0kYhH6ELK0yFLkwDLG\/v4\/Pz08kSQIpJaIo0k4dx\/lRrWdnZzg\/P9cLM32mYVFbsiyTUuLi4gLNZhPFYhFCCCRJoiuMMaYVUsBJkiCOY9Tr9cyGawvB0kKVRajRaGBiYgIrKytgjKHb7cJxHB0KdWeMaaL39\/e4u7vL9GvjMrMXKKZp5fj4+Ijb21uUSiWsr6+nVpEKg5209Xp9KBk1Xu9ldpOySV1eXoJzjq+vL0gpMwkpX0qtIAgQRRGiKNIdfZD9qg9xznF6eoq3tzd0Op0flWcmrN1zgiAAAAghhpLRjdEOm\/kNAE5OTiCEwNTUFMbGxkAISa0ak4giEIYhAOheNIiMlPJ\/Dg2yl5cX5PN5eJ4Hz\/MynZm5oCwIgr5qtHPMxqd27E1TE8rlMrrdLqIoQrvd1rkjhEAcx\/j4+NDAqh0ohbrdrn7OWryp9I8DWtohanV1FYVCAYQQ9Ho97O7uAgDGx8dBKcXCwgJyuRyenp7gOA6Oj4\/\/rvZf115aWtIJbStjN8i+kGX1CkopKpWKVkQIgSAI4Ps+giBAo9HA6OgoJicn8fr6+jc5KYXnedjc3MTGxoauOnvxtjH7gGS+230FADjnfXuVGuf7Pnzf76sm13WxtbUF13Uz88bG\/FVSm5NbrZbeSE1l0xLaXtQwdYAhfShtUhRFkFLqM4\/aKuw5hBAsLi7q6lLfhgnwB8uPNwrCWTIsAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/lame-hacker_big.jpg\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022622.38805970149\u0022\u003E\u003C\/span\u003E\n                \u003Cfigcaption\u003E\n                    \u003Ca href=\u0022https:\/\/unsplash.com\/photos\/HJENWbX4t-Q\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\n                        \u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E\n                        unsplash.com\/photos\/HJENWbX4t-Q\n                    \u003C\/a\u003E\n                \u003C\/figcaption\u003E\n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDid anyone receive a message recently that contained a video of me watching porn? \ud83d\ude06\u003C\/p\u003E\n\u003Cp\u003EBecause apparently I was being blackmailed that all my contacts would receive it, if I don\u2019t pay 202\u20ac in BTC. Alas, I didn\u2019t check the spam folder, so I\u2019d missed the deadline a week ago \ud83e\udd37\u200d\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/alto-pericolo-1_big.jpg\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022968.51063829787\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAkCAYAAAAD3IPhAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFh0lEQVRYhcWYu25jyRGGv+5z5yFFjsQh55ZIyUQOPX4FJxsvnDkxdrAbLeDIgBM\/zryDF04cGI7mEQxhAArSkBLZPLfuPscBt1skRUnjXXm3AII8t67\/VP31VzXFcrns4jjm17aiKAijKCIIAoIgQAjxizi21lLXNUIIrLUkSUIURYQAVVXRNA3D4XDnISnl\/wVg27YURYEQgq7rsNZuglGWZXdzc8OnT58QQrBarTg6OkJKydu3b4nj2D906NvZ9nHXdQAPHu+voZTagDHGcIg3YRgipXzyyBwypdQmTUEQ3HuTe6unMBeN+ywEWC6XD6bpqeyxFxNlWXYuMg65+0RRdDDP2\/cKIe6QfJsL1tqDa0gpadsWKSXWWqqq2ETm+vqGuq6w1tJ1HVmW+d\/GGKSUSCn9YlVVEUURWmtOT08fJPSHDx8IwxAAYwzT6RSlFHEcs1gsGI\/HfPz4kffv32\/AZAiyLMc2DWGS0FQV\/ZMxYRzdicJ+hLbDfygN79698xpmjCFJEoqiYDAYcH19zcnJCS9fvrxNU5IkT0rUn2I3NzebyFxdXTGfz5lOp4xGo18FzOXl5QbMeDxmPB4DT1vK\/4s1TYOEDbG2bZ8DjsywkfLta23b0nWdP79vrtoe+8CPOqOUYj6fkyQJ6\/XaV1NZlkwmE4qi8IsrpRiNRjRN44EYY8jzHCEESimiKKLrOk5PT+8Ae1T0XDu4vr72gAaDgT\/nNCGOY7IsY7Va0e\/3qevaS4HWGtik\/Pj4+KCzxyjgOSOEYDqdEkW35ewW2Ba3+xrlIaf3NdL7zHfBfcU9tOghPXlIY\/bveeyZEDZlVZYlQgiKovCdOggC2rbdiVbTNPR6PV69evVFgL4UiAcTxzHr9Zo8z0mShLquSdMU2IyDWZZRVZXnRxAEXF5eUlUVAL1ej+VySZqmdF1HHMe0bYu1ljiOqarKrxuGIXVdk2UZSZJwdHS0C6bX6\/nRc7uBdV3nrw2HQ4wxnjthGNI0jf+dpunOZOg4Yq0lyzKklP5Fuq7zvpwlSbJpB0opFosF1lrOzs58Wn5Ju7q62kSmaRrSNEVrzWw2Q2uNMcbrSJ7nPlru2rNnz1BKYYzx6Tg7O\/tZk2ForfUpALzTIAiw1gK3lebucanJsoymaQBI09TrjrXWp9SND27s2E5fmqb0er1bMEophsMhZVn6GcVxpW1btNZ+QHKE7bqOJEn8Iq7KAD8sOeBOp9q2pW1bqqpCCEEQBBhjdvQnBFitVlRVxfn5Of1+H2OMV1SllHe4WCyQUpLnOfP5nMFgsFNtQRCQJMnOvqhtW9I0RQjhW47W2gOqqorJZLLxMZvNuiiKUErRti1hGDIYDFgulztE1loTBAFaayaTiXdwSJF\/ylbFjxDD4ZA8z71jKaV35krcWksYhmitPch9AfuS8eNR0ZNSProLcER8aFtzn+P7jvfPhQCz2Yy2bSnLEmMMvV7Pl\/BgMKBpGuq6pt\/vU1UVWZahlKIsS16\/fs3nz5+J49iT1nGprmviOKZpGuI4ZjKZ0O\/3739hgBcvXnzx2x6yk5OTn\/X8Dhi4O\/js75Hg7t5p2w7d\/5gd7NoXFxesViustYxGI5RSpGnKer324uZKWGtN0zS+t4RhyHq99k30+fPnO8XwkJ3\/81\/84y9\/4zd\/\/ANvvvr9prSNMdR17Us7z3NWqxVZlrFer2nbljzP0Vqjtabf71OWJWEY+sZXFIX\/n8WJpatExxtXha59\/P2b79GLG1b\/Oefrf\/9wO+k51UySBCEEeZ4jpeT4+NgrqOtNURR5oXIzsDGGLMt2UuDAAH4s2U7l7777Ez\/8+a\/89vtvEQLExcVFt16v0VoThiFlWXqp3m56QgivykEQ8ObNmyf9u2Q+n\/NfSjbh4azYjuYAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/alto-pericolo-1_big.jpg\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022968.51063829787\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/alto-pericolo-2_big.jpg\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022955.6678700361\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAjCAYAAAD8BaggAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGCUlEQVRYhb2Xy24byxGGv+7puZO0aFmGBQPx0gu\/W5Z5iLxBVnmM8xLZnCykhQ0b9ka27hQ54vRMX85CrgZJS5bik6QAQlRPsae6\/qq\/\/lYhhOicQykFgDGGGCPee4wxeO\/RWqOUIoSAUgql1JYPQAiBGCNKKbz35Hm+tRZCIMsyQgiEEDDGpDXxubi4wMQY+fz5M0VRYK2laRqMMdzc3FDXNeM4YozBWkuMkaqqGMcR5xwvXrzg4uJi64VVVdF1HWVZYq2lrmustXjvaduWrusoigKlFMMwUBQFRVGQ5zla67uAYoys12vyPOfy8pLZbMYwDBhjUErhnKOqKlarFeM4kmUZAGdnZ5RlyTAMKTOHh4dorRGT02\/a7tpmhpT3Pi4WC\/I8B2AcR\/I8x1qbAlJKobXGOUeWZTjnErzDMKQAvfcopSjLknEcGceRsiyJMaYgZf8YY\/KZTCZkWUbXdRhJt\/ceyZb3Hu89WZYleKQmpJ7GcQTAWotSiqqqtvaRfcdxTPsK9GJSYwIdgAkhcH5+ToyR6XTKYrGgKArKsuTg4ODBdMcYAdjb23sSHE\/x6fseA5BlGWVZkuc5k8kE7z1lWfLly5cETQgh\/biua7z3dF1HXddorVM2tNYJFjm1955xHFPWJJvOOUIIvHnzJgWnQgjRWruFrUQsG+R5nupj83QCodZ6K\/USvPjJc+896\/WaqqrSOkBZlgBcXl7eQfbp06etVpxOp+nEr169Is\/zVPSbkO1CURTFo5DVdf1THxVCiLsbP4T9YwH9rD6e4nNxcXFXQ1+\/fmU6nabOkS4zxpDnOc65RJDCS5tM672n73tmsxnC+jFGrLWUZZm6Umv9A6TOOebzeQpOC0dIy2ZZllpZPtba9GKps82RorVOgW82gNSevFzWhQoA+r5PWQohoJxz8ePHjyilyPOccRyZTqesVivKsiSEgLWWvu85ODhgHEestYmbuq6jaRqqqmI+n9M0zS9DdnR0hIoS6hPtf1lDR0dHd7NM6F\/mkVIqQZfnOUoplsslWZahtU6+MkakVgSOqqoSIwst9H1PVVVp4mutU+0VRUFd1wB3RX1+fo61Nm0UY6RpGpbLJVprmqbBe0\/TNFhr6boOgOl0StM0jOPI9fU1dV2zWCwwxqS98jzHGINzjqurK4wxaYR475OfBPQfQ\/aY\/WnIQgicnp4mTSKyQ9pXukYGoXyapmG1WiUIZKoLW8v6OI4URcF6vSbLsrSfUoq6rhPUkhcNpACkLY0xScmJc9d1xBjJsmwrCOGWzbrapAxRoGmafw8otbkwtChWgPV6zTAMLBYL6rpmvV5zc3ND27ZcX1\/Tti37+\/tpsm9O+4fsZz5t2\/7gI39NjJHVasV8Pufm5iZ1TNu2GGPY29uj73uWyyUnJyc0TUPbtiyXS+BuMDrnEgF679NvnHNJHUiXibx5+fIlk8nkh\/pSIYQoqZMWFEoXohRFKKeStt00WRPmvy87m2y9qRLEjo+P7xSjvLBpmvRQ1qToNm0zwJ+t3We7B9nNkPHe8\/79+y3t0rZtGhnCEfLC9XqNc47ZbMZqtUJrzWw2S0Qog1Tkr8w7Ywy3t7dpYPd9n4SeXKWAO5F\/dnYG8IMQK4oibbp7v7LWpqEqTN+2bRJf9xX17tru\/8fHx3ddJuJLOky4RqCQ53L6TRmSZVlq6ftm20PQPGQmxsjJyQnz+ZyrqytijDjnqOua5XKJUopnz57x\/PnzFOR9JwUepYInBaS15t27d\/du+BS++W+bAba0j9TJJsVL1gQqIEEntqWLv\/9G6m0Yhi1NHkLYqk95Bt8hOz09pW3b1AUiM+UK3ff9lgqUq3Nd19ze3iLkenBwgLWWyWTC9fV1UgrCb0KowzDQti3DMNA0zZaENTIAl8tluqXKzSDPc759+4ZSiqIoMMZweHj4pBra39+\/12c6nW6t7ZaEybKMt2\/fbqX9vuL9lXr6lZmnN0\/2Zwv4Ka39mI8JIfDhwwecc+zt7fH69ev\/exBbFkKIMcb4fcj+0vdN2117zOdf\/\/hn\/Puzv8Tf\/vq3+Pvv\/45\/AI6OU9eu93mSAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/alto-pericolo-2_big.jpg\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022955.6678700361\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EIf they really had full access to my computer, they\u2019d know that I almost never use Italian... Only to talk to some old friends once in a blue moon, and to laugh at all the spammers who assume that owning a \u201c.it\u201d domain automatically makes you Italian.\u003C\/li\u003E\n\u003Cli\u003EIf they really had full access to my computer, or even checked out my public posts on social media, they\u2019d know I don\u2019t give a shit about someone seeing me naked or masturbating.\u003C\/li\u003E\n\u003Cli\u003EBlackmailing someone with that is the most obvious choice: almost everyone watches porn \u0026amp; masturbates, and most people are (inexplicably) ashamed of it.\u003C\/li\u003E\n\u003Cli\u003EThey didn\u2019t attach ANY proof whatsoever. Not a piece of a video, not a single URL from browser history, not a screenshot. Not even naming my OS or browser. I have no idea, which of my computers they claim to have attacked \ud83d\ude06\u003C\/li\u003E\n\u003Cli\u003ESending an email from my own address to myself is given as a \u201cproof\u201d that they control my computer. The thing is, via SMTP you can send an email with ANY valid email in the \u201cFrom\u201d field. Most clients will deem it unreliable though and put it in spam \u2013 exactly as has happened here.\u003C\/li\u003E\n\u003Cli\u003EThey claim to have been \u201cobserving me for a couple of months\u201d. Well, to get enough porn \u0026amp; masturbation blackmail material on me, they wouldn\u2019t need more than a day \ud83e\udd2d\u003C\/li\u003E\n\u003Cli\u003E\u201cMalware was undetectable by the antivirus, because driver\u201d is a BS talk for people who don\u2019t know shit about computers. They\u2019ve been watching me for months, they should know I know my shit about computers \ud83d\ude06\u003C\/li\u003E\n\u003Cli\u003EMost importantly: the deadline is over already. And nothing? \u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EDespite so many red flags people seem to be buying this bullshit, apparently. Those criminals \u003Ca href=\u0022https:\/\/www.blockchain.com\/btc\/address\/17YKd1iJBxu616JEVo15PsXvk1mnQyEFVt\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E have received 4,5 BTC\u003C\/a\u003E already (~14k\u20ac). Within A WEEK!\u003C\/p\u003E\n\u003Cp\u003EPlease, educate yourself about cybersecurity, people... And don\u2019t panic! \ud83d\ude42\u003C\/p\u003E\n\u003Ch3\u003EUpdate\u003C\/h3\u003E\n\u003Cp\u003EI just got a report of a scam attempt that \u003Cem\u003Edid\u003C\/em\u003E include a \u201cproof\u201d, so let\u0027s take a look at it:\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/lame-hacker-2_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022479.22829581994\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACg0lEQVRIicWW227jOBBED++WbASw\/ZD\/\/8G1NpYsiiLZ8+AVJ\/EmwSQ7gy1AoCQ2ms1SdVEqTpO8TBOlFJxz5JxxzmGtJedMjBGA\/X5PrRURodYKgLWWdV3RWgOQUkIphfeeeZ4xxhBCIKUEQM4Z7z1KKbTWiAin04kNSinUOkcxwfO7oZRCRL4Uo5TCxhgZhwvee47H428v7CsQEayzFhEhpcQwDIzjyOFwIOd8p1CpFhxjJISA956cMykldrtdSzhNE845jDF477ndbux2O0opwJ2BZVl4enpiGAb2+31jaFmW+6dcc24Jtdbs93tSSpRSWjG11lacMYZxHAHaYjFGRATnHF3XcTqdyDmjtSbn3K51XQHaxqZpQinFuq6EEO5rztdRTLgLrdbaxKa1ppSC91\/Xl4g0fWyb+lVYRBiGoXWYtbZNOue+VdCv4LHobVQvf10k1UIp5V9dEUJo1G9zKSW6rmNZFowxlFLQWrf2L6U0DQGN9WVZCCGglGKe56a9WisxRrquA0At002Usxhj3iz8SPnj+49i3tv1e3kec23P9uXlhWmJXC4X+r7neDw2A2w0\/iPm4\/HYTPB18tdJH1l+L+Yz6BA83nuen58JIbAsC9ba1mlwd9i+798U8ycgIn\/Oqb8Le7vdWKeR8\/n8f9cCgBqHvyXmu2FtujHGsK4r1lpijHjvMcYgIszzTNd1lFKotWKMwVrL9XrlcDhQa8Va+6ZrnXOklFjXtbn8tsbWbUqpu+3AT8sXEbz3LZmIEEJoR0sphb7v22nf9z3TNAE\/\/wZyzpzP528bo5qvVxFjmg98hvda\/LO4r8Rso1bGkF+dZxsz2\/1Hyf4LPrIGgB8oZ+fP826JzAAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/lame-hacker-2_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022479.22829581994\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EYes, the attacker knows your password. But they don\u0027t tell you to which service\nthis password grants access to, which is pretty weird...\nIf I were an asshole and had that information, I\u0027d use it:\nat least to further prove to you that I know private shit about you,\nat worse to log in to that account, take it over and demand money for giving it back.\nAnd yet, they didn\u0027t. Suspicious.\u003C\/p\u003E\n\u003Cp\u003EBut anyways... if you go to the \u003Ca href=\u0022https:\/\/haveibeenpwned.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E \u0027;--have i been pwned?\u003C\/a\u003E website\nand enter your email, you\u0027ll see the list of data breaches over the years where your email was found.\u003C\/p\u003E\n\u003Cp\u003EThis guy\u0027s email was in 18 of them. Some were connected to the same reused password.\nSo here\u0027s how the attacker knew his password: he didn\u0027t hack his computer or gain access to his camera,\nhe just found it (or bought it) on some shady website.\nThe attacker probably doesn\u0027t even know what service was this password for or whether it\u0027s even still valid.\u003C\/p\u003E\n\u003Cp\u003EGood news about this attack: as of today, not a single cent was sent to\n\u003Ca href=\u0022https:\/\/www.blockchain.com\/btc\/address\/bc1qrpmrkdwh2uhnmrsj0803hg909m66rp6ax7y7je\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E that BTC address\u003C\/a\u003E \ud83c\udf89\u003C\/p\u003E\n\u003Cp\u003ESo what\u0027s the takeaway?\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EEven if someone knows your password, it doesn\u0027t automatically prove their other claims.\u003C\/li\u003E\n\u003Cli\u003ESign up for email updates from \u003Ca href=\u0022https:\/\/haveibeenpwned.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E \u0027;--have i been pwned?\u003C\/a\u003E\nand whenever they notify you about a breach, go to that website and change your password.\u003C\/li\u003E\n\u003Cli\u003EDon\u0027t reuse passwords! The best way to stay secure is to use a different, strong, random password for each service\nand store them in a password manager, like \u003Ca href=\u0022https:\/\/keepass.info\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E KeePass\u003C\/a\u003E or even a browser.\nIf someone told me, they know that my password is \u003Ccode\u003EhiVxV788S2dm8rK6P5qH\u003C\/code\u003E?\nBitch, even \u003Cem\u003EI\u003C\/em\u003E don\u0027t know that\u0027s my password \ud83e\udd37\u200d\u003C\/li\u003E\n\u003Cli\u003EDon\u0027t panic! The vast majority of such attacks is just a bluff.\u003C\/li\u003E\n\u003C\/ul\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["bitcoin","blackmail","cybersecurity","email","masturbation","porn","security"],"hasMore":true,"image":"https:\/\/avris.it\/image\/lame-hacker_small.jpg","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/lame-hacker_big.jpg\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/lame-hacker_mini.jpg\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022155.59701492537\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDid anyone receive a message recently that contained a video of me watching porn? \ud83d\ude06\u003C\/p\u003E\n\u003Cp\u003EBecause apparently I was being blackmailed that all my contacts would receive it, if I don\u2019t pay 202\u20ac in BTC. Alas, I didn\u2019t check the spam folder, so I\u2019d missed the deadline a week ago \ud83e\udd37\u200d\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/lame-hacker_big.jpg\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/lame-hacker_mini.jpg\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022155.59701492537\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003Cfigcaption\u003E\n                    \u003Ca href=\u0022https:\/\/unsplash.com\/photos\/HJENWbX4t-Q\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csmall\u003Eunsplash.com\/photos\/HJENWbX4t-Q\u003C\/small\u003E\u003C\/a\u003E\n                \u003C\/figcaption\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EDid anyone receive a message recently that contained a video of me watching porn? \ud83d\ude06\u003C\/p\u003E\n\u003Cp\u003EBecause apparently I was being blackmailed that all my contacts would receive it, if I don\u2019t pay 202\u20ac in BTC. Alas, I didn\u2019t check the spam folder, so I\u2019d missed the deadline a week ago \ud83e\udd37\u200d\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/alto-pericolo-1_big.jpg\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/alto-pericolo-1_mini.jpg\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022242.12765957447\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/alto-pericolo-2_big.jpg\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/alto-pericolo-2_mini.jpg\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022238.91696750903\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EIf they really had full access to my computer, they\u2019d know that I almost never use Italian... Only to talk to some old friends once in a blue moon, and to laugh at all the spammers who assume that owning a \u201c.it\u201d domain automatically makes you Italian.\u003C\/li\u003E\n\u003Cli\u003EIf they really had full access to my computer, or even checked out my public posts on social media, they\u2019d know I don\u2019t give a shit about someone seeing me naked or masturbating.\u003C\/li\u003E\n\u003Cli\u003EBlackmailing someone with that is the most obvious choice: almost everyone watches porn \u0026amp; masturbates, and most people are (inexplicably) ashamed of it.\u003C\/li\u003E\n\u003Cli\u003EThey didn\u2019t attach ANY proof whatsoever. Not a piece of a video, not a single URL from browser history, not a screenshot. Not even naming my OS or browser. I have no idea, which of my computers they claim to have attacked \ud83d\ude06\u003C\/li\u003E\n\u003Cli\u003ESending an email from my own address to myself is given as a \u201cproof\u201d that they control my computer. The thing is, via SMTP you can send an email with ANY valid email in the \u201cFrom\u201d field. Most clients will deem it unreliable though and put it in spam \u2013 exactly as has happened here.\u003C\/li\u003E\n\u003Cli\u003EThey claim to have been \u201cobserving me for a couple of months\u201d. Well, to get enough porn \u0026amp; masturbation blackmail material on me, they wouldn\u2019t need more than a day \ud83e\udd2d\u003C\/li\u003E\n\u003Cli\u003E\u201cMalware was undetectable by the antivirus, because driver\u201d is a BS talk for people who don\u2019t know shit about computers. They\u2019ve been watching me for months, they should know I know my shit about computers \ud83d\ude06\u003C\/li\u003E\n\u003Cli\u003EMost importantly: the deadline is over already. And nothing? \u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EDespite so many red flags people seem to be buying this bullshit, apparently. Those criminals \u003Ca href=\u0022https:\/\/www.blockchain.com\/btc\/address\/17YKd1iJBxu616JEVo15PsXvk1mnQyEFVt\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E have received 4,5 BTC\u003C\/a\u003E already (~14k\u20ac). Within A WEEK!\u003C\/p\u003E\n\u003Cp\u003EPlease, educate yourself about cybersecurity, people... And don\u2019t panic! \ud83d\ude42\u003C\/p\u003E\n\u003Ch3\u003EUpdate\u003C\/h3\u003E\n\u003Cp\u003EI just got a report of a scam attempt that \u003Cem\u003Edid\u003C\/em\u003E include a \u201cproof\u201d, so let\u0027s take a look at it:\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/lame-hacker-2_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/lame-hacker-2_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022119.80707395498\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EYes, the attacker knows your password. But they don\u0027t tell you to which service\nthis password grants access to, which is pretty weird...\nIf I were an asshole and had that information, I\u0027d use it:\nat least to further prove to you that I know private shit about you,\nat worse to log in to that account, take it over and demand money for giving it back.\nAnd yet, they didn\u0027t. Suspicious.\u003C\/p\u003E\n\u003Cp\u003EBut anyways... if you go to the \u003Ca href=\u0022https:\/\/haveibeenpwned.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E \u0027;--have i been pwned?\u003C\/a\u003E website\nand enter your email, you\u0027ll see the list of data breaches over the years where your email was found.\u003C\/p\u003E\n\u003Cp\u003EThis guy\u0027s email was in 18 of them. Some were connected to the same reused password.\nSo here\u0027s how the attacker knew his password: he didn\u0027t hack his computer or gain access to his camera,\nhe just found it (or bought it) on some shady website.\nThe attacker probably doesn\u0027t even know what service was this password for or whether it\u0027s even still valid.\u003C\/p\u003E\n\u003Cp\u003EGood news about this attack: as of today, not a single cent was sent to\n\u003Ca href=\u0022https:\/\/www.blockchain.com\/btc\/address\/bc1qrpmrkdwh2uhnmrsj0803hg909m66rp6ax7y7je\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E that BTC address\u003C\/a\u003E \ud83c\udf89\u003C\/p\u003E\n\u003Cp\u003ESo what\u0027s the takeaway?\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003EEven if someone knows your password, it doesn\u0027t automatically prove their other claims.\u003C\/li\u003E\n\u003Cli\u003ESign up for email updates from \u003Ca href=\u0022https:\/\/haveibeenpwned.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E \u0027;--have i been pwned?\u003C\/a\u003E\nand whenever they notify you about a breach, go to that website and change your password.\u003C\/li\u003E\n\u003Cli\u003EDon\u0027t reuse passwords! The best way to stay secure is to use a different, strong, random password for each service\nand store them in a password manager, like \u003Ca href=\u0022https:\/\/keepass.info\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E KeePass\u003C\/a\u003E or even a browser.\nIf someone told me, they know that my password is \u003Ccode\u003EhiVxV788S2dm8rK6P5qH\u003C\/code\u003E?\nBitch, even \u003Cem\u003EI\u003C\/em\u003E don\u0027t know that\u0027s my password \ud83e\udd37\u200d\u003C\/li\u003E\n\u003Cli\u003EDon\u0027t panic! The vast majority of such attacks is just a bluff.\u003C\/li\u003E\n\u003C\/ul\u003E","words":689,"readTime":3,"lang":"en"}}},"blog\/technology\/it-s-way-too-easy-to-do-webdevelopment-wrong":{"key":"blog\/technology\/it-s-way-too-easy-to-do-webdevelopment-wrong","type":"article","published":true,"meta":{"createdAt":"2018-08-04T01:12:15+02:00","publishedAt":"2018-08-05T11:30:00+02:00","group":"redesign","category":"blog","subcategory":"technology","slug":"it-s-way-too-easy-to-do-webdevelopment-wrong"},"content":{"en":{"slug":"it-s-way-too-easy-to-do-webdevelopment-wrong","title":"It\u0027s way too easy to do webdevelopment wrong","intro":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/wnbr-avris-it-header_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022234.32475039411\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFTUlEQVRIiT2WT48dRxXFf\/fe6n\/vz9gztrGxY4iIsk6+BFkksIrEx0DwZUB8FVgENlkhsidBXrBAZjS2Z97M61ddVfey6Bdq01KrdPucU6fOaZmmKQCWZcFMMTNSSoQ7lhKEo6aYGiaCmBIBqkpKxlIr+3GgH0be3X5ARUAhvGGW8OZc7XccHmZUlc00csqViKDvjFIrtTaG5NyfGmm72VBqxb0hoqgayQxXxd0RESKCx\/sd82lBVLjY7ZiP9ySFEtD3A8O0pZ+PiDvhwTSNnJbCnBeu62ElpkKpjSElcinc3lfSmeBShOZBOs4zIkLf93TJaB6rAgiWErU1CCEvhbFLIEKpFesGSi2ICrU1eq+UUuhUyaWgqtTS6NQopbAZB2pzWqtEMrZjx5CUu2OmeVAAFSGpKusKPALCaeEQIC5EgAs0d3IEItCbcn+8B+DFi1dcXDxGgFwWjqcjXjJLyfSpw6NhJiy1QvD\/1aWOZamoCMUbOa+WSc0rRIAIooImw8Lw1nB3TBURp+GIJojg7uFAlzou9nse7S5Y0SuXl8\/g9oYln6i1QauMW2XT77k7nMinjEewlMZSjlR3qjtCoLr6Uja7bfyokiZDhNU3tSLrdxinEe16vFYC4fLxJUvOjNNIMkNFeHTxiG7oybUg0Tg+3NN1PbVWQg08SCLcvf\/A3cMDpsrDshAiuDutVlQUjebUUqlLpubMcpqZNhOajFAoZeGrX\/2a3hJLzkx9z+9\/+zsuLy7o1RjUGFNiMw7sx2n14VLI5cTxeOA0zxxvP1CXQqvBuNmymyZcgAj8dGI53FHnGS+VFOGA4x5AIKrc390T3hAJ1ITD7S2fffY5X\/zyC\/b7Cx5f7PnFxz\/nzZs3zKeZ7WbDkgvX1zfM+cRmu8NbsCyZPC8gws37O8IdEQV3VIT+fNtS6oGgT4aqGYIiIoCSNBG1EK1CC3764jVff\/0bvvvHd3zzzV\/ZbDb84Y9\/ItnA8eFEqY3\/vL3m+uYGMWM7jsz5SJcGhmni8uljri6veP3yJR+\/\/hnPnjwlEEqrlLxgovRdR9\/3lNaQYRhCVTFVkio1Z9yUy6srXjx\/Rs6ZTz75lJ88f84PP\/wLVeWrL7\/k799+y7\/fvqUz4e31fwl1zJUlV7QzSllQ1fUpcHe4ZztuWFrDW1tND5gCXgkxmkNCgHBqdcJg3G7IJUNUSm0kM77\/\/p\/U5uy3G27ef+Bvf\/kzuTXy8YHN0ycsOdMi8BJU65E883C8A4JxGOlSh4pxe\/+AahARtBqkZHgoiCGiRFRkHMdQlbOHnK7rmKaJZT4ilgig6zo+evmKU17Y77acDve8O9zSmiMBpVWeP3rCOI68mw\/UUig1c9IrthwIAiI4zjNd16Gq5LwgEpgapTnKGrjSdV2ICH3XEQTeKtvdjnk+AoIlZeh7CDAzBkuUWmkRiAi1NjpVBoRGUAGvFTUhDQNzLudeNCIAhFoLokZ4XYP3HMQBJDPFfU1pEUEtUUrBNGHJMDNM7XzmQnFHzQgPamuoKZ2DmEKtIOv7CMjeCBfUFBVZlSLON22dJ4AE+AqGJBJspmlFyQrKmyMKSZVwpwFdZ7TWUDVaOK2t+1sNlmSQMxnHzAgTPIJoazmrGHlZWK3hIBAEXeqo1dfiCqcUR6apj64bVm9HrHVhSrI1tVWV8MBSQmXtoVIbuqqPILRoCCuI5kGXEqaCCLhDqfWsDiRb66eF420VQM5zPUB2u02YCJwHqgrJEqpyZifIj8oFtLYCFkBUzqIHpuuxVHci1jKOOAdhBE4grL8ycSYfKyc81nJ\/9eoj\/gca1kJk61I0igAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/wnbr-avris-it-header_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022234.32475039411\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s honestly diffucult being a webdeveloper in the world of shitty websites. I guess that\u2019s how hairdressers feel when they see my pathetic hair after it\u2019s been a while since my last visit...\u003C\/p\u003E\n\u003Cp\u003EBut the thing is, even though it\u2019s \u003Cem\u003Etechnically\u003C\/em\u003E easy to use scissors and clippers, I don\u2019t do that on my own hair, I leave that to the professionals.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/wnbr-avris-it-header_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022468.64950078823\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFTUlEQVRIiT2WT48dRxXFf\/fe6n\/vz9gztrGxY4iIsk6+BFkksIrEx0DwZUB8FVgENlkhsidBXrBAZjS2Z97M61ddVfey6Bdq01KrdPucU6fOaZmmKQCWZcFMMTNSSoQ7lhKEo6aYGiaCmBIBqkpKxlIr+3GgH0be3X5ARUAhvGGW8OZc7XccHmZUlc00csqViKDvjFIrtTaG5NyfGmm72VBqxb0hoqgayQxXxd0RESKCx\/sd82lBVLjY7ZiP9ySFEtD3A8O0pZ+PiDvhwTSNnJbCnBeu62ElpkKpjSElcinc3lfSmeBShOZBOs4zIkLf93TJaB6rAgiWErU1CCEvhbFLIEKpFesGSi2ICrU1eq+UUuhUyaWgqtTS6NQopbAZB2pzWqtEMrZjx5CUu2OmeVAAFSGpKusKPALCaeEQIC5EgAs0d3IEItCbcn+8B+DFi1dcXDxGgFwWjqcjXjJLyfSpw6NhJiy1QvD\/1aWOZamoCMUbOa+WSc0rRIAIooImw8Lw1nB3TBURp+GIJojg7uFAlzou9nse7S5Y0SuXl8\/g9oYln6i1QauMW2XT77k7nMinjEewlMZSjlR3qjtCoLr6Uja7bfyokiZDhNU3tSLrdxinEe16vFYC4fLxJUvOjNNIMkNFeHTxiG7oybUg0Tg+3NN1PbVWQg08SCLcvf\/A3cMDpsrDshAiuDutVlQUjebUUqlLpubMcpqZNhOajFAoZeGrX\/2a3hJLzkx9z+9\/+zsuLy7o1RjUGFNiMw7sx2n14VLI5cTxeOA0zxxvP1CXQqvBuNmymyZcgAj8dGI53FHnGS+VFOGA4x5AIKrc390T3hAJ1ITD7S2fffY5X\/zyC\/b7Cx5f7PnFxz\/nzZs3zKeZ7WbDkgvX1zfM+cRmu8NbsCyZPC8gws37O8IdEQV3VIT+fNtS6oGgT4aqGYIiIoCSNBG1EK1CC3764jVff\/0bvvvHd3zzzV\/ZbDb84Y9\/ItnA8eFEqY3\/vL3m+uYGMWM7jsz5SJcGhmni8uljri6veP3yJR+\/\/hnPnjwlEEqrlLxgovRdR9\/3lNaQYRhCVTFVkio1Z9yUy6srXjx\/Rs6ZTz75lJ88f84PP\/wLVeWrL7\/k799+y7\/fvqUz4e31fwl1zJUlV7QzSllQ1fUpcHe4ZztuWFrDW1tND5gCXgkxmkNCgHBqdcJg3G7IJUNUSm0kM77\/\/p\/U5uy3G27ef+Bvf\/kzuTXy8YHN0ycsOdMi8BJU65E883C8A4JxGOlSh4pxe\/+AahARtBqkZHgoiCGiRFRkHMdQlbOHnK7rmKaJZT4ilgig6zo+evmKU17Y77acDve8O9zSmiMBpVWeP3rCOI68mw\/UUig1c9IrthwIAiI4zjNd16Gq5LwgEpgapTnKGrjSdV2ICH3XEQTeKtvdjnk+AoIlZeh7CDAzBkuUWmkRiAi1NjpVBoRGUAGvFTUhDQNzLudeNCIAhFoLokZ4XYP3HMQBJDPFfU1pEUEtUUrBNGHJMDNM7XzmQnFHzQgPamuoKZ2DmEKtIOv7CMjeCBfUFBVZlSLON22dJ4AE+AqGJBJspmlFyQrKmyMKSZVwpwFdZ7TWUDVaOK2t+1sNlmSQMxnHzAgTPIJoazmrGHlZWK3hIBAEXeqo1dfiCqcUR6apj64bVm9HrHVhSrI1tVWV8MBSQmXtoVIbuqqPILRoCCuI5kGXEqaCCLhDqfWsDiRb66eF420VQM5zPUB2u02YCJwHqgrJEqpyZifIj8oFtLYCFkBUzqIHpuuxVHci1jKOOAdhBE4grL8ycSYfKyc81nJ\/9eoj\/gca1kJk61I0igAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/wnbr-avris-it-header_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022468.64950078823\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s honestly diffucult being a webdeveloper in the world of shitty websites. I guess that\u2019s how hairdressers feel when they see my pathetic hair after it\u2019s been a while since my last visit...\u003C\/p\u003E\n\u003Cp\u003EBut the thing is, even though it\u2019s \u003Cem\u003Etechnically\u003C\/em\u003E easy to use scissors and clippers, I don\u2019t do that on my own hair, I leave that to the professionals.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s great that HTML is so easy to learn and that many schools teach it to children. But its simplicity is also a curse, leaving some people convinced that \u201cthey can now do programming\u201d (HTML is a markup language, not a programming language) and that the whole thing is easy.\u003C\/p\u003E\n\u003Cp\u003EAnd, admittedly, writing code that \u003Cem\u003Edoes stuff\u003C\/em\u003E and solves problems isn\u2019t that hard either, especially if you have Google and StackOverflow on your side. The hard part is to write this code is such a way, that another person can understand it, maintain it and modify it, so that groups of programmers can colaborate on it together, so that it can easily be kept up to date... I\u2019ve learned how to write code when I was twelve. But learning, how to write \u003Cem\u003Egood, maintainable code\u003C\/em\u003E, took me years of professional work, and I still have a lot to learn.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s also difficult for the professionals to keep up to date with technology, it changes so rapidly. For example, a teacher of webdevelopment at a university (!) was teaching my class how to use HTML4 and how to deal with the ISO-8859-1 encoding, even though both HTML5 and UTF-8 have been standards \u003Cem\u003Efor years\u003C\/em\u003E!\u003C\/p\u003E\n\u003Cp\u003EThe same goes, I guess, for the author of \u003Ca href=\u0022http:\/\/wnbr.nl\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E wnbr.nl\u003C\/a\u003E:\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/wnbr-nl_big.png\u0022 alt=\u0022Screenshot of wnbr.nl\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022459.81538461538\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFo0lEQVRIiY2Vy2+dSRHFf1Xd3\/s+4hvHsh1lsJQHMDzEjEZiidiwQGxA\/I2wB3bDZtDsgmCQQE4YSMhjxkl84+vr+\/pe3cXiczJiR0sltdQ61VVd55yWGKPFaDxfrDl0il9scCe3EBEAlruW5a7leNMgZYq7OQbAzHi52LCXefKvLnD3DhFVAJo+8PXllmOLuLrD39l\/jzlf1zgRpq+X6PEeWqTvz57OV3gz4\/T1BZ89fcUvHv6H\/fsz3NEE5z0hBH73tydMJDL+9B\/kv\/oEN84QEZbbmt\/+5Ut+9vqKu21DclDhqhIz4\/N\/n\/Fstebnn54y+el9wsEY5xxd3\/ObPz\/moy7wo7+\/IP31j\/FH+3jveXax4g+PniMhBHuyXLLYtnx4ueSLOjDvDUEIFlk3Hbl3pLsGqhxUEaALkau2Y08VCQHKHAEM2HU9wYyq7ZEiBecQhD5GrpqWSeJwuwZGJZMi4zsHI7qq5OVygwcYBWVjxrqLPFrUnC5qRBUzI8QIBs4Mm7eIHwoyM3ozrl48oVlf4bIcUSHJC8aHH3yDkQZRuc4X6aOhBophbztObo44ynr205JCBb853xJebSgPU2xU8WDXcOA8iJH4jL4PqFdS5wjBQBjCBBOQ2z9ABUI0xA3FxhAxAa9K6AOiiqhAhGAR5xyx2\/Hls1Nmm312l7dpmjXVrQQ\/ulXhM8fxNGddrplsV+zvjXDOYWZDiCOiKIZYAIzQR5xXnHO0bUviE5I0QVVJkgRViNFwqojIkOddL8DjL\/7K7vSUcPsOxbfvMTuacTzJ8PXjr3Ai2OQIAFVH3XQ4F4h1QxBw3pEkKRGo2xZCIPcJQRxd2xEt0rQdWiupKAeHB7TWUFUlkhV4gVQFDRESR4iR73\/8MXe\/+yFthM3jJzgqbHyMdr9\/iPiAmQ2SbWreXLzl4s05Gg2LgRgjdb2jbhr6aIySnCxNKYqSoiwZjUakRUWW5aQo3jku52dsdztCvaULAboeYkQA7xzBhLSaUo0ndJ+fItJhZvjqlz\/EDm\/ybmV5ztRgXBTEKIxSj8hAYtTRdR2I0IQe3wl5nlNWIyaqeBEkGpoo3zp5wHz+lhB6wnrFsu9x6ogizPZu4BNPRFARip\/cRW4fAOC76Ng+X5Ad7kECqUvZao9PMqo8pzFPlgqjsiBGI2J4G3iADOrBjN4i0cBhxD5S5BnHx0eDfVxjhIH8OKFpdteNQjBl9WJBcrCH2nRMcJ56WQ8j64yelFVrRFHKRPAi9F0P0VARuHZxs2Fr0ZAICiAKCJfzS16\/OWc+f4sYg+wBEUFFrzE24KuSXjz1ZY3EGAfyGKw3a74+e81oMsOpQ2SYt4ig19\/C\/7NUIfFwsViQ+ISu71AZ1JZmKaOqYr1pUPWICK\/OnvHg\/gMMG4xxtWv5079e8b22RnPPZtei1iMi+CTB+YRKPeIEvHt\/cdMHPIL2Acn8+5eLZgTxHMz2UUDS6zMzmj7QxYjVHeQO04Gfu67jj4++Hv6ys9WGzgf04VPCRyekE2U2vXl9acQJSNNDmrwvxoBoIDEOpnddDEAfjLbt0T6gmYf2HcZYNT0SIVH9H8x8U9NqGF5IU+HkxojJJ3e4CCm0DW2XYyjBbOhYQfqIWSDxCaKCd4LqN0nfmR4ILkBrAp1BHwYHBySCRyBJQAbMIC\/4YFbhYx8pLns2WYSsQheXXJ0Fmt2KZtuz7Tp85im7jrYDn3uKcUFzWbPNhKlzaNtSd0o5KwhtYLttiaVj3EX6LmLek48z6lXDhkCRePK2pe6VYloyvTFB5g0uM3yzatF1z+G0JE1L7iQZu8a4dW+fxctL6l1Ltl9QxcjmqsfnCdV+xZvmnL29lL08g7pmszFuHE9p1g3r+QZ3VDKO0Kxaggmzkxlv\/nnOJIXppCCzwPKio5yVZEXKcnHFYZXxX4jA\/RIiweP1AAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/wnbr-nl_big.png\u0022 alt=\u0022Screenshot of wnbr.nl\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022459.81538461538\u0022\u003E\u003C\/span\u003E\n                \u003Cfigcaption\u003E\n                    \u003Ca href=\u0022http:\/\/wnbr.nl\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\n                        \u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E\n                        wnbr.nl\n                    \u003C\/a\u003E\n                \u003C\/figcaption\u003E\n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s not a bad website. It gives you the information you need, it doesn\u2019t hurt your eyes, it even uses HTML5 and UTF-8 (so much better than my uni...). On the other hand there\u2019s plenty one could do to make it better:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Eit looks like from two decades ago, could use a new design (the design hasn\u2019t been changed since the beginning of the website in \u003Ca href=\u0022https:\/\/web.archive.org\/web\/20110823123529\/http:\/\/wnbr.nl\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E 2011\u003C\/a\u003E),\u003C\/li\u003E\n\u003Cli\u003Eit doesn\u2019t use HTTPS, which is not understandable in the times of \u003Ca href=\u0022https:\/\/letsencrypt.org\/getting-started\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E free and easy SSL certificates\u003C\/a\u003E,\u003C\/li\u003E\n\u003Cli\u003Ethe route is described in plain text (in a separate file!), even though it could easily (and conveniently for the visitors who don\u2019t know the city) be a map,\u003C\/li\u003E\n\u003Cli\u003Eit uses an external website, \u003Ca href=\u0022http:\/\/www.ipernity.com\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Ipernity\u003C\/a\u003E, as a photo galery \u2013 that website\u2019s UX is \u003Cem\u003Ehorrible\u003C\/em\u003E (it took me ages to simply upload some pictures), and its functionality could be easily integrated into the main website,\u003C\/li\u003E\n\u003Cli\u003Eit only provides a Dutch version, which is strange, since the event itself is pretty much English-speaking, with many international participants,\u003C\/li\u003E\n\u003Cli\u003Eit\u2019s not responsive, instead offers a separate version for mobile.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EAnd while it\u2019s completely fine if a personal website or a side project looks like that, I feel really \u003Cem\u003Esad\u003C\/em\u003E when I see a website of a doctor, a business, or a big event, that is so far away in the past... Plenty of people are working on constant improvements of the standards, on new technologies, new approaches, new APIs \u2013 and yet, as a user, I\u2019m still left with not being able to make a doctor\u2019s appointment online, as if it was so damn hard to implement... Spending your whole life on digitalising the world bit by bit, but not being able to fully enojoy that digitalisation as a user really sucks...\u003C\/p\u003E\n\u003Cp\u003EAnyways... As a person, who wants to make the world (also the cyber-world) a better place, who really \u003Ca href=\u0022\/blog\/my-first-world-naked-bike-ride-and-i-absolutelly-loved-it\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-heartbeat\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E enjoyed the WNBR this year\u003C\/a\u003E and who happened to have some free time on my hands, I contacted the organisers and offered them my help in bringing their website to the 21st century.\u003C\/p\u003E\n\u003Cp\u003EI assumed they wouldn\u2019t want it, actually. Somebody created the current website (\u003Ca href=\u0022http:\/\/www.nsesoftware.nl\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E nsesoftware.nl\u003C\/a\u003E), somebody is proud of it, and obviously nobody likes criticism... So I tried to be nice, not to criticise, but to offer some ideas and help.\u003C\/p\u003E\n\u003Cp\u003EI got no answer though, and I really needed to start right away, as long as I had free time and the motivation to work on it. I ended up with something like this:\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/wnbr-avris-it_big.png\u0022 alt=\u0022My proposal of the refreshed version of wnbr.nl\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u00222295\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAkCAYAAABWvWC\/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEDUlEQVRIia2VzW4cVRCFv6p7b3fPrx3biRNFSDGBxAghBIkS1rwBOyS2bBCvwY4H4BUQQiRL1uyygUQmEkJRgADBMYk9sWfGPd19b7Foe+JJYINypZZa1X3qVJ2uOi39ft+apiELAVHodzr44MGMTrfLeDJGBZomEpxDRGlixCyhlhJZ5gHDUiKmRBMb1DuWV9bwWaCuawSjLCsEYzarGB1M8SaQgKzIcEBvacDa6mnK6ZTMOzY2XmX\/6S5NTCiOvd1dklOcd3hLkRgjlSU2Ni5w9co1Ni9vcuPrrxgfHGAiNNYQq4a6TpRlhTMDVbwZeFWKLCc1iV\/u3+fh73+AKIdlSRNhPBnj1CgPSwxDEBBB8jw37x3eO0SEPMvwojSWyJLRmBEtklBUlSYlLEZiMnwILUigVdOMxlo1K4Noifa0YooBIqgYcvPmDQNQUURARDCzeUIAA8zAsHnAzBAzMwCzRDmrcD5wDHMqyHGGE0eOgv44YAYCxLpGBFSVaMLeaESKiV6\/R\/CePM\/nSfT4pmkaJtMpdV1TVRXjyQSAfr9PyAIpxraVE6XMmUUEVcUwUkw45\/DeE0Kg2+m8WDs86\/n\/nDlz3dSUZclsVoMGJk3FsMi4NxHWXYUko9KM80sdiswvgjEYH1ZkEnmwCyk13J81rK6UPJWAljVol3pQUDzP3MRIMhhXY2ax4OxyTj4VQh2YyS7rvSEpJXJJc7652qqOJ+lvDsxxKkBBzVq\/QiRx1g9ICAklnpBoDgbjXLZOVx2DXoZpjuJpRBiNlQePtxEV0GfgudoxJqqqwnuHwXw0o4FK+9xI5FmGU7fY8+jpHnfu\/MCVq9dRdfy4dZu11VXKw4qllQ4xGsOlVbBEt9NbBO9sP+SLzz9j853r5P0hj+7e4pU33mLweEx+6RwpJh7d+4sPP\/mUi5c3n\/tUGN2VU7z52iWC97z\/3lWK3pCdx0\/Y2rqDYfx6MGE6m704JGvDPtc2N1gfdOiEgj+375IX57m99ROD4ZCqqkDg5Di+nPGcTg\/ZG43IQpiv32Qy5nBWsX7mDHpkEim1S7PAPK0S+6Wx1BGSQTe0Ne6O9gje471HRPHeEUIATgxJazVtB90gcztqmnaPnXOIMGddAGOgIjgRmnQcMhJQ+YISh\/fh33turae9vB55mHN8+82XhF5GcBWUygcffUx2ZEULs60YKS0kZzlkTLd3WC1Oc3r9HCcd8Zlgs5r9ScXyoEsR2hfG0wmY0O0UqCopWUuiulg2ZjiryH13Hup3e9z6\/juK4FEVnBNev\/guqtkiOMsCISwvuGMy4+ffdsjLMU9GJZXbZ+PC2xx9qZdlgDHR1A2iDucUr\/8NOq5uzpxSIqaTNnD0KyW1yyAKZninc\/A\/I277Xjf7CncAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/wnbr-avris-it_big.png\u0022 alt=\u0022My proposal of the refreshed version of wnbr.nl\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u00222295\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI got nothing but positive feedback from all the friends whom I\u2019ve shown the end result. Still, I got no response from the WNBR people on wheather or not they actually want it. But since it\u2019s almost done already, I\u2019ve sent them a demo, saying that if they do, it\u2019s free for them to use.\u003C\/p\u003E\n\u003Cp\u003EAfter a while I kind of got an answer \u2013 not a \u201cno, thanks\u201d, or even \u201cfuck off\u201d... instead, I just got blocked on Twitter. So childish... Well, that\u2019s how you lose like a 1000\u20ac worth of free service, too bad for them.\u003C\/p\u003E\n\u003Cp\u003EAnyways... a couple of days ago I stumbled upon the website \u003Ca href=\u0022https:\/\/www.polyamorynetwork.com\/private\/signup\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E polyamorynetwork.com\u003C\/a\u003E. I totally fell in love with their logo \ud83d\ude0d And even though I\u2019m not a polyamorist myself (yet?), I decided to check it out anyway.\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/polyamorynetwork-com_big.png\u0022 alt=\u0022Screenshot of the registration form at polyamorynetwork.com\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022755.98971722365\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAcCAYAAAAJKR1YAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADZ0lEQVRIic2XSW8kRRCFv4jM2u32MHAYLCMkDogD4gBc+PlckPgTCKE5jWwsL92urqrMmEMtU73YhqEMhNTq6FZF5MuXLyKj5OrqyviPLIZAiBEAVcU5hzcz4s+\/Ql1z+\/WXvGsfEBHW6zVFXuC8o65r8iyn7VrOzy84O3u1CCBRxatOv83AiwiEAFVJef6G87YhhoBhOOep6wdUldB1iCplWSEimNnOd5\/wn\/ogl5eX\/ZGFgHh\/sIsQOsyYFnfOTUlewlREUFV8liHSI028J4RImqaoKlVVAUJZFpgZaZoSY0RVURFA8EOMyOgHQgjTBsa4EAJ5nlMUxc4nyzJgYKjrOpw6GAABxBhxzhFjnBgREdq2RURI03RxdszAA1xfX+OcA8A5pWm7gaUwPGj44ThFBHWOJEleQEPSM1RVFdumwakO1GZ47xZn4CkLIXB\/f98zpKpYjNhMuIhij3QoEXC6HCujTUc2ggohUFUVzil1ExBVBNjHJSKo2CzRMr7IAChN0wORZl7YNtsJzLgb5xyJT16s9D1A0zRsNhvyoiAbgYlMpbhv4672G+T8v2P+fGPHnpkAJUnC2dnZwaJN09K3GWFXUEaW5VOipY5s0lDbtmw2G1QElySURUEP9LBzQ6+3fYbmu\/8YH57REEAXwsSMATJIPMuynWb5IeHH+6P1GtpuWW8eEIHVaoWq9t04SY4ytHQzPACUpCmvZgyZGV3XcXd31weIYMPcYhZRdZycnJAMgBfX0DHqnHOUZXkwZowJxotzvHKWsElDo6jzPJ+01F+kDUbPTg+6V5Kqkuc5zrlny35k4amyn5sfuRIR6rqmrh84PV1hFvE+ORoE4L1\/ubJP0hSffFjczIixX5SHup8o0xQEaDsQoa234BxS5DtaWqTs91kQkX4OenfJ7R9v4aSCbUMn0N2twfUj7SdlSfb9dzyW4+\/4ox3vfAP6enVC8u03jFOliNBtNmxv7wjbhvqz11hdT7pbrOzn5zgHNI6pdQPRfD+u3txy89vvbOs1fnvBpxdf\/Dtlr6p0XUeMETPDbA2qhNWK1Y8\/AJA45bQsFrv5Jw0dY+jPuuOXtzdgxk9ffc6bVTkL3O1Lf+WVaB63n2O0nQFt3zKvvK5yAPK9cfapcn\/sOJ57fgI6vZf9D0xEeA8eTKpuIuGc+gAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/polyamorynetwork-com_big.png\u0022 alt=\u0022Screenshot of the registration form at polyamorynetwork.com\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022755.98971722365\u0022\u003E\u003C\/span\u003E\n                \u003Cfigcaption\u003E\n                    \u003Ca href=\u0022https:\/\/www.polyamorynetwork.com\/private\/signup\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\n                        \u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E\n                        polyamorynetwork.com\/private\/signup\n                    \u003C\/a\u003E\n                \u003C\/figcaption\u003E\n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI couldn\u2019t, though. Setting aside that the SSL certificate was expired since a month, which makes browsers give the user a scary red security warning... The registration form still uses reCAPTCHA v1, which got shutdown in March 2018 (and deprecated way earlier). That means nobody was able to join their network for the last half a year, and apparently nobody noticed!\u003C\/p\u003E\n\u003Cp\u003EIs the website abandoned? Why can\u2019t it just say so? Or maybe there\u2019s a big, active community there, but it\u2019s closed for new members, because the admin doesn\u2019t give a damn anymore? I guess I\u2019ll never know.\u003C\/p\u003E\n\u003Ch3\u003ESumming up\u003C\/h3\u003E\n\u003Cp\u003EOn one hand it\u2019s great that anyone can build their own website \u2013 that\u2019s what makes the web thrive, that\u2019s what makes it open and equal!\u003C\/p\u003E\n\u003Cp\u003EOn the other hand though \u2013 it requires way more skill and knowledge to do it \u003Cem\u003Eright\u003C\/em\u003E. If you want to look professional, keep that in mind.\u003C\/p\u003E\n\u003Cp\u003ESo what\u2019s my point? I guess I don\u2019t have any, just wanted to complain a bit.\u003C\/p\u003E\n\u003Cp\u003EExcept maybe for one thing:\u003C\/p\u003E\n\u003Ch3\u003EFree website, anyone?\u003C\/h3\u003E\n\u003Cp\u003EIf you have (or want to start) a project, event or a non-profit organisation that I could stand behind (LGBTQ rights, human rights, naturism, non-monogamy, education...) that I could support from the IT side, feel free to \u003Ca href=\u0022mailto:andre@avris.it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E contact me\u003C\/a\u003E \ud83d\ude09\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["botch","design","maintainability","programming","progress","security","shit","up-to-date","volunteering","redesign","web","webdevelopment"],"hasMore":true,"image":"https:\/\/avris.it\/image\/wnbr-avris-it-header_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/wnbr-avris-it-header_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/wnbr-avris-it-header_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022117.16237519706\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s honestly diffucult being a webdeveloper in the world of shitty websites. I guess that\u2019s how hairdressers feel when they see my pathetic hair after it\u2019s been a while since my last visit...\u003C\/p\u003E\n\u003Cp\u003EBut the thing is, even though it\u2019s \u003Cem\u003Etechnically\u003C\/em\u003E easy to use scissors and clippers, I don\u2019t do that on my own hair, I leave that to the professionals.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/wnbr-avris-it-header_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/wnbr-avris-it-header_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022117.16237519706\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s honestly diffucult being a webdeveloper in the world of shitty websites. I guess that\u2019s how hairdressers feel when they see my pathetic hair after it\u2019s been a while since my last visit...\u003C\/p\u003E\n\u003Cp\u003EBut the thing is, even though it\u2019s \u003Cem\u003Etechnically\u003C\/em\u003E easy to use scissors and clippers, I don\u2019t do that on my own hair, I leave that to the professionals.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s great that HTML is so easy to learn and that many schools teach it to children. But its simplicity is also a curse, leaving some people convinced that \u201cthey can now do programming\u201d (HTML is a markup language, not a programming language) and that the whole thing is easy.\u003C\/p\u003E\n\u003Cp\u003EAnd, admittedly, writing code that \u003Cem\u003Edoes stuff\u003C\/em\u003E and solves problems isn\u2019t that hard either, especially if you have Google and StackOverflow on your side. The hard part is to write this code is such a way, that another person can understand it, maintain it and modify it, so that groups of programmers can colaborate on it together, so that it can easily be kept up to date... I\u2019ve learned how to write code when I was twelve. But learning, how to write \u003Cem\u003Egood, maintainable code\u003C\/em\u003E, took me years of professional work, and I still have a lot to learn.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s also difficult for the professionals to keep up to date with technology, it changes so rapidly. For example, a teacher of webdevelopment at a university (!) was teaching my class how to use HTML4 and how to deal with the ISO-8859-1 encoding, even though both HTML5 and UTF-8 have been standards \u003Cem\u003Efor years\u003C\/em\u003E!\u003C\/p\u003E\n\u003Cp\u003EThe same goes, I guess, for the author of \u003Ca href=\u0022http:\/\/wnbr.nl\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E wnbr.nl\u003C\/a\u003E:\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/wnbr-nl_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/wnbr-nl_mini.png\u0022 alt=\u0022Screenshot of wnbr.nl\u0022 width=\u0022240\u0022 height=\u0022114.95384615385\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003Cfigcaption\u003E\n                    \u003Ca href=\u0022http:\/\/wnbr.nl\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csmall\u003Ewnbr.nl\u003C\/small\u003E\u003C\/a\u003E\n                \u003C\/figcaption\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s not a bad website. It gives you the information you need, it doesn\u2019t hurt your eyes, it even uses HTML5 and UTF-8 (so much better than my uni...). On the other hand there\u2019s plenty one could do to make it better:\u003C\/p\u003E\n\u003Cul\u003E\n\u003Cli\u003Eit looks like from two decades ago, could use a new design (the design hasn\u2019t been changed since the beginning of the website in \u003Ca href=\u0022https:\/\/web.archive.org\/web\/20110823123529\/http:\/\/wnbr.nl\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E 2011\u003C\/a\u003E),\u003C\/li\u003E\n\u003Cli\u003Eit doesn\u2019t use HTTPS, which is not understandable in the times of \u003Ca href=\u0022https:\/\/letsencrypt.org\/getting-started\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E free and easy SSL certificates\u003C\/a\u003E,\u003C\/li\u003E\n\u003Cli\u003Ethe route is described in plain text (in a separate file!), even though it could easily (and conveniently for the visitors who don\u2019t know the city) be a map,\u003C\/li\u003E\n\u003Cli\u003Eit uses an external website, \u003Ca href=\u0022http:\/\/www.ipernity.com\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Ipernity\u003C\/a\u003E, as a photo galery \u2013 that website\u2019s UX is \u003Cem\u003Ehorrible\u003C\/em\u003E (it took me ages to simply upload some pictures), and its functionality could be easily integrated into the main website,\u003C\/li\u003E\n\u003Cli\u003Eit only provides a Dutch version, which is strange, since the event itself is pretty much English-speaking, with many international participants,\u003C\/li\u003E\n\u003Cli\u003Eit\u2019s not responsive, instead offers a separate version for mobile.\u003C\/li\u003E\n\u003C\/ul\u003E\n\u003Cp\u003EAnd while it\u2019s completely fine if a personal website or a side project looks like that, I feel really \u003Cem\u003Esad\u003C\/em\u003E when I see a website of a doctor, a business, or a big event, that is so far away in the past... Plenty of people are working on constant improvements of the standards, on new technologies, new approaches, new APIs \u2013 and yet, as a user, I\u2019m still left with not being able to make a doctor\u2019s appointment online, as if it was so damn hard to implement... Spending your whole life on digitalising the world bit by bit, but not being able to fully enojoy that digitalisation as a user really sucks...\u003C\/p\u003E\n\u003Cp\u003EAnyways... As a person, who wants to make the world (also the cyber-world) a better place, who really \u003Ca href=\u0022\/blog\/my-first-world-naked-bike-ride-and-i-absolutelly-loved-it.lite\u0022\u003E enjoyed the WNBR this year\u003C\/a\u003E and who happened to have some free time on my hands, I contacted the organisers and offered them my help in bringing their website to the 21st century.\u003C\/p\u003E\n\u003Cp\u003EI assumed they wouldn\u2019t want it, actually. Somebody created the current website (\u003Ca href=\u0022http:\/\/www.nsesoftware.nl\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E nsesoftware.nl\u003C\/a\u003E), somebody is proud of it, and obviously nobody likes criticism... So I tried to be nice, not to criticise, but to offer some ideas and help.\u003C\/p\u003E\n\u003Cp\u003EI got no answer though, and I really needed to start right away, as long as I had free time and the motivation to work on it. I ended up with something like this:\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/wnbr-avris-it_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/wnbr-avris-it_mini.png\u0022 alt=\u0022My proposal of the refreshed version of wnbr.nl\u0022 width=\u0022240\u0022 height=\u0022573.75\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI got nothing but positive feedback from all the friends whom I\u2019ve shown the end result. Still, I got no response from the WNBR people on wheather or not they actually want it. But since it\u2019s almost done already, I\u2019ve sent them a demo, saying that if they do, it\u2019s free for them to use.\u003C\/p\u003E\n\u003Cp\u003EAfter a while I kind of got an answer \u2013 not a \u201cno, thanks\u201d, or even \u201cfuck off\u201d... instead, I just got blocked on Twitter. So childish... Well, that\u2019s how you lose like a 1000\u20ac worth of free service, too bad for them.\u003C\/p\u003E\n\u003Cp\u003EAnyways... a couple of days ago I stumbled upon the website \u003Ca href=\u0022https:\/\/www.polyamorynetwork.com\/private\/signup\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E polyamorynetwork.com\u003C\/a\u003E. I totally fell in love with their logo \ud83d\ude0d And even though I\u2019m not a polyamorist myself (yet?), I decided to check it out anyway.\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/polyamorynetwork-com_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/polyamorynetwork-com_mini.png\u0022 alt=\u0022Screenshot of the registration form at polyamorynetwork.com\u0022 width=\u0022240\u0022 height=\u0022188.99742930591\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003Cfigcaption\u003E\n                    \u003Ca href=\u0022https:\/\/www.polyamorynetwork.com\/private\/signup\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csmall\u003Epolyamorynetwork.com\/private\/signup\u003C\/small\u003E\u003C\/a\u003E\n                \u003C\/figcaption\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EI couldn\u2019t, though. Setting aside that the SSL certificate was expired since a month, which makes browsers give the user a scary red security warning... The registration form still uses reCAPTCHA v1, which got shutdown in March 2018 (and deprecated way earlier). That means nobody was able to join their network for the last half a year, and apparently nobody noticed!\u003C\/p\u003E\n\u003Cp\u003EIs the website abandoned? Why can\u2019t it just say so? Or maybe there\u2019s a big, active community there, but it\u2019s closed for new members, because the admin doesn\u2019t give a damn anymore? I guess I\u2019ll never know.\u003C\/p\u003E\n\u003Ch3\u003ESumming up\u003C\/h3\u003E\n\u003Cp\u003EOn one hand it\u2019s great that anyone can build their own website \u2013 that\u2019s what makes the web thrive, that\u2019s what makes it open and equal!\u003C\/p\u003E\n\u003Cp\u003EOn the other hand though \u2013 it requires way more skill and knowledge to do it \u003Cem\u003Eright\u003C\/em\u003E. If you want to look professional, keep that in mind.\u003C\/p\u003E\n\u003Cp\u003ESo what\u2019s my point? I guess I don\u2019t have any, just wanted to complain a bit.\u003C\/p\u003E\n\u003Cp\u003EExcept maybe for one thing:\u003C\/p\u003E\n\u003Ch3\u003EFree website, anyone?\u003C\/h3\u003E\n\u003Cp\u003EIf you have (or want to start) a project, event or a non-profit organisation that I could stand behind (LGBTQ rights, human rights, naturism, non-monogamy, education...) that I could support from the IT side, feel free to \u003Ca href=\u0022mailto:andre@avris.it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E contact me\u003C\/a\u003E \ud83d\ude09\u003C\/p\u003E","words":1080,"readTime":5,"lang":"en"}}},"blog\/technology\/immutable-and-stateless":{"key":"blog\/technology\/immutable-and-stateless","type":"article","published":true,"meta":{"createdAt":"2018-01-14T13:35:17+01:00","publishedAt":"2018-01-14T13:24:00+01:00","group":null,"category":"blog","subcategory":"technology","slug":"immutable-and-stateless"},"content":{"en":{"slug":"immutable-and-stateless","title":"On the importance of immutability and statelessness","intro":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/mutants-everywhere_small.jpg\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022261.6\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAATCAYAAAD4f6+NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGxklEQVRIiVWW229cVxXGf\/syZ+bMzRPbsV3bgSRtcJrUJSmJklaNiihUDRJEPCFFPMCfAOIf4IV\/AnjgAQlaxAM88YD6kFBoGhTSNL0kdhw7Tnyb8XjuZ+bsvRcPZ5KSLR1t6eyzz\/7W9631ra1+\/tOrgjbklPB0GGOwVpHTCgigAAGFotlNCCFA9op8FJGmKSJCCIGeA2U0RaPZSDXFWhlr7bM9z\/aKjOdAGI54tdDGGo0FQYKAeQpHCMHjUkXQGmMURgkiQv9gn5\/88lfkcjnW1tao1\/c4\/fLLrK6u0my1uXjxInfu3GFhYYFiscgf3nufg1H\/\/w7\/KmgRQSmFCAQUMgZns\/CzoZSi1UvQKgAKRKGV4HotSp0Gc7Fm89Emy68uZ5GKsLb2AOcc09PTzMzM8GRzk+BSUJpvnDjBjbu3nwPyPDvyjOkgCoVC\/eJnV0WUEOfyGA31To\/D1SIiCuc9Adj6z8dcPj3Di0dm+PNmQOVrDIKnWi6ROs9olIKGfD6msX9AMc4zUZtgtd4mRBpjDAgEGcsVBJAxK0I68pyKWhQN6AylQquMIaUUSPZ5ECG4wIXT83x9NkaXy7w9q4mTA6oGSLow7JOXlJI4zKBNhOAHCeFgl3w4QLJTCYRMCxEmCajE81QIACcKUYL2IeA8pM7jQgBRGXbJHlGwdHye+Tii0mkwbTxT2meAg4BLmPQ9nBsihHHkgsPQkeozmV5yq0Qu4QUTeG0KTsQpIfWZbApSCYh4NKIgCE403glBAl7CM10Ryz82Ax0xxHGOraFnJxHGZ3Nh2vLdF0ucKsaEp4GMZxGVVZ8IT5ij1O5yugyDRpdSeQqJFBKyAEaiUaLRZIUNAbwIPgSC13j\/VeKJMnzYNAxGjtlIUauWcAS8CJPGQxihGRKbCBAW5w2VqZhKZewXwEDHTE1ZGp0uaZzjk539p0soBT4oPKC9ypgQIHhFCJqhCzgRfBACPlNPR9xYb\/LH21tsp2H8J8NKP8fSfJmlmsP1PGcWylg7pGn3oJNgySzj3eM13l5a4H4HPmob0kIOJdmaljFTItjMgDxBMupEhGHq0U4Q0WjxLB+bIHnwBWbUot32xNOevFbUKjX+vd3i0Z92aLoehSNFGjVDt5iw8kGf7y8d581XjnL9yRaXFiI+uPWQYa5AMIaKdJgMe6zqYyhgKJkBWCUhY2DMXzkuYIxGkRlXjKOxepNoeoF7TxocmnRsbt9j4dwMcXHEt0\/Mcrh8nJmJdb7cesLtVov6ukb3hW6nR82khNJj1pqOh\/UBJg3kfEoinj2pkJdWVv5qhBQ0Nku8kGW7ZLCc98+qYzY6oD2oc\/1akx9\/Z4l7Dzaoql0kLJAUO7T1SWrlGmv3P8T\/bYXcleOoVkSlZHjv+mcMvUJXNH+V++z0PdpX0UEjIngUmhEiQrmsKeQN9jk7zxJjXCEZQzXaLJ54iXe\/d4qVtRW0KTOyMWpfsTvoMXfmSxruHsm0YeXk12hcM1RLFeJqzJsXjnJ39yF6FwJl9NjjApmdCJ4yPVJdYm7C0h0OsSIpzo1QPsk6ShA0CvCgFMq0KOQOcfvOXfoHj5BkhJUqYb\/ByJZQe5ajySFa\/RrDfJ\/dgx0+vf8YZSrUJg+olLsIYAjjBg0Yi40UPk2ZtNsMmEJGFeyohY3q97DiMEpnGxXkxvaEhjvNFrWtzxlJRBTlODdT4v3P+ixXE+7vDdj+LOa\/7W0e7LVZ32vR6vYo5fO8cXKRnE+Ik2HW0WXMvoJgI8IQckFIUFAYUm9oGPawc3lw2KzzAnpxmTRotNYko4Tlo9Ns7rTp1g\/o2grNXIHjFwy+lmfYuIaeP8ZGe4MwUeT10+fY32\/S7fYpz0+gkoQgQqVSxVpLr9fD5iMmymW2d7eR3gHS2kIPEqxN8Ah24D0SFAoICt5450e88tr58fWiThSGhOkWxwoxly9f5je\/\/R1TJcs3L1zik49vcekHV5ldukehUGBxcYGd3V0erW9w5swZPv\/ic86dO8\/Ozg5nz57l5s2brKyscOXKFW7c+Ih\/\/uX3xDZrvBow1mJzWhF0xo4RxcbGBvHEJPV6HWs0Sb+DMpbDhw+zvr7OcDgiUSnOOaZmZuj1uvjRiK3mPnNzs+zt7LI4fYg7t24yWZtga2ubBw9WmZqaIkkSclqzt7tHCILN5TBGgxgMDq0C6tc\/XBaR7O4jGlr9IaDRCspxIM4P+PSxodNpMj\/zAjfak7x1xGHSNnkMJop56\/Vv8fe7W\/S2H\/PO+SUqk4f512qf5uoNnAiozPVVEEx1GlOu4ZyjEOXIWwMiuKRLVK7yP6sQ4wkEHMxKAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/mutants-everywhere_small.jpg\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022261.6\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKeeping your classes \u003Cstrong\u003Eimmutable and stateless\u003C\/strong\u003E makes your code \u003Cem\u003Eway\u003C\/em\u003E less prone to bugs. Yet somehow this clean code rule isn\u2019t as popular and as often invoked as\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Single_responsibility_principle\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E SRP\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/You_aren%27t_gonna_need_it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E YAGNI\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E DRY\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/KISS_principle\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E KISS\u003C\/a\u003E\nand others... Maybe it\u2019s because of the lack of a catchy acronym?\u003C\/p\u003E\n\u003Cp\u003EAnyways, I\u2019d like to take a look at two examples of when sticking to this rule could save your ass (or at least save you some time debugging).\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/mutants-everywhere_big.jpg\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022600\u0022 height=\u0022327\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAATCAYAAAD4f6+NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGxklEQVRIiVWW229cVxXGf\/syZ+bMzRPbsV3bgSRtcJrUJSmJklaNiihUDRJEPCFFPMCfAOIf4IV\/AnjgAQlaxAM88YD6kFBoGhTSNL0kdhw7Tnyb8XjuZ+bsvRcPZ5KSLR1t6eyzz\/7W9631ra1+\/tOrgjbklPB0GGOwVpHTCgigAAGFotlNCCFA9op8FJGmKSJCCIGeA2U0RaPZSDXFWhlr7bM9z\/aKjOdAGI54tdDGGo0FQYKAeQpHCMHjUkXQGmMURgkiQv9gn5\/88lfkcjnW1tao1\/c4\/fLLrK6u0my1uXjxInfu3GFhYYFiscgf3nufg1H\/\/w7\/KmgRQSmFCAQUMgZns\/CzoZSi1UvQKgAKRKGV4HotSp0Gc7Fm89Emy68uZ5GKsLb2AOcc09PTzMzM8GRzk+BSUJpvnDjBjbu3nwPyPDvyjOkgCoVC\/eJnV0WUEOfyGA31To\/D1SIiCuc9Adj6z8dcPj3Di0dm+PNmQOVrDIKnWi6ROs9olIKGfD6msX9AMc4zUZtgtd4mRBpjDAgEGcsVBJAxK0I68pyKWhQN6AylQquMIaUUSPZ5ECG4wIXT83x9NkaXy7w9q4mTA6oGSLow7JOXlJI4zKBNhOAHCeFgl3w4QLJTCYRMCxEmCajE81QIACcKUYL2IeA8pM7jQgBRGXbJHlGwdHye+Tii0mkwbTxT2meAg4BLmPQ9nBsihHHkgsPQkeozmV5yq0Qu4QUTeG0KTsQpIfWZbApSCYh4NKIgCE403glBAl7CM10Ryz82Ax0xxHGOraFnJxHGZ3Nh2vLdF0ucKsaEp4GMZxGVVZ8IT5ij1O5yugyDRpdSeQqJFBKyAEaiUaLRZIUNAbwIPgSC13j\/VeKJMnzYNAxGjtlIUauWcAS8CJPGQxihGRKbCBAW5w2VqZhKZewXwEDHTE1ZGp0uaZzjk539p0soBT4oPKC9ypgQIHhFCJqhCzgRfBACPlNPR9xYb\/LH21tsp2H8J8NKP8fSfJmlmsP1PGcWylg7pGn3oJNgySzj3eM13l5a4H4HPmob0kIOJdmaljFTItjMgDxBMupEhGHq0U4Q0WjxLB+bIHnwBWbUot32xNOevFbUKjX+vd3i0Z92aLoehSNFGjVDt5iw8kGf7y8d581XjnL9yRaXFiI+uPWQYa5AMIaKdJgMe6zqYyhgKJkBWCUhY2DMXzkuYIxGkRlXjKOxepNoeoF7TxocmnRsbt9j4dwMcXHEt0\/Mcrh8nJmJdb7cesLtVov6ukb3hW6nR82khNJj1pqOh\/UBJg3kfEoinj2pkJdWVv5qhBQ0Nku8kGW7ZLCc98+qYzY6oD2oc\/1akx9\/Z4l7Dzaoql0kLJAUO7T1SWrlGmv3P8T\/bYXcleOoVkSlZHjv+mcMvUJXNH+V++z0PdpX0UEjIngUmhEiQrmsKeQN9jk7zxJjXCEZQzXaLJ54iXe\/d4qVtRW0KTOyMWpfsTvoMXfmSxruHsm0YeXk12hcM1RLFeJqzJsXjnJ39yF6FwJl9NjjApmdCJ4yPVJdYm7C0h0OsSIpzo1QPsk6ShA0CvCgFMq0KOQOcfvOXfoHj5BkhJUqYb\/ByJZQe5ajySFa\/RrDfJ\/dgx0+vf8YZSrUJg+olLsIYAjjBg0Yi40UPk2ZtNsMmEJGFeyohY3q97DiMEpnGxXkxvaEhjvNFrWtzxlJRBTlODdT4v3P+ixXE+7vDdj+LOa\/7W0e7LVZ32vR6vYo5fO8cXKRnE+Ik2HW0WXMvoJgI8IQckFIUFAYUm9oGPawc3lw2KzzAnpxmTRotNYko4Tlo9Ns7rTp1g\/o2grNXIHjFwy+lmfYuIaeP8ZGe4MwUeT10+fY32\/S7fYpz0+gkoQgQqVSxVpLr9fD5iMmymW2d7eR3gHS2kIPEqxN8Ah24D0SFAoICt5450e88tr58fWiThSGhOkWxwoxly9f5je\/\/R1TJcs3L1zik49vcekHV5ldukehUGBxcYGd3V0erW9w5swZPv\/ic86dO8\/Ozg5nz57l5s2brKyscOXKFW7c+Ih\/\/uX3xDZrvBow1mJzWhF0xo4RxcbGBvHEJPV6HWs0Sb+DMpbDhw+zvr7OcDgiUSnOOaZmZuj1uvjRiK3mPnNzs+zt7LI4fYg7t24yWZtga2ubBw9WmZqaIkkSclqzt7tHCILN5TBGgxgMDq0C6tc\/XBaR7O4jGlr9IaDRCspxIM4P+PSxodNpMj\/zAjfak7x1xGHSNnkMJop56\/Vv8fe7W\/S2H\/PO+SUqk4f512qf5uoNnAiozPVVEEx1GlOu4ZyjEOXIWwMiuKRLVK7yP6sQ4wkEHMxKAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/mutants-everywhere_big.jpg\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022600\u0022 height=\u0022327\u0022\u003E\u003C\/span\u003E\n                \u003Cfigcaption\u003E\n                    \u003Ca href=\u0022https:\/\/makeameme.org\/meme\/mutants-mutants-everywhere-n6biem\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\n                        \u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E\n                        makeameme.org\/meme\/mutants-mutants-everywhere-n6biem\n                    \u003C\/a\u003E\n                \u003C\/figcaption\u003E\n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKeeping your classes \u003Cstrong\u003Eimmutable and stateless\u003C\/strong\u003E makes your code \u003Cem\u003Eway\u003C\/em\u003E less prone to bugs. Yet somehow this clean code rule isn\u2019t as popular and as often invoked as\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Single_responsibility_principle\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E SRP\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/You_aren%27t_gonna_need_it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E YAGNI\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E DRY\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/KISS_principle\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E KISS\u003C\/a\u003E\nand others... Maybe it\u2019s because of the lack of a catchy acronym?\u003C\/p\u003E\n\u003Cp\u003EAnyways, I\u2019d like to take a look at two examples of when sticking to this rule could save your ass (or at least save you some time debugging).\u003C\/p\u003E\n\u003Ch3\u003EDateTime\u003C\/h3\u003E\n\u003Cp\u003EPHP offers a \u003Ccode\u003EDateTime\u003C\/code\u003E object that encapsulates, well, a date and time. And it\u2019s pretty cool: it can parse strings like \u201cnext monday\u201d, it can understand instructions like modify \u201c+1 week midnight\u201d, the standard library offers support for time zones and for iterating over time (like from \u201cnow\u201d to \u201c+1 day\u201d every \u201c+30 minutes\u201d).\u003C\/p\u003E\n\u003Cp\u003EBut there\u2019s a huge catch involved: \u003Ccode\u003EDateTime\u003C\/code\u003E is mutable.\u003C\/p\u003E\n\u003Cp\u003ELet\u2019s say you have a \u003Ccode\u003EUser\u003C\/code\u003E entity:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@ORM\u003C\/span\u003E\\Entity\n * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@ORM\u003C\/span\u003E\\Table\n **\/\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-class\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Eclass\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EUser\u003C\/span\u003E\n\u003C\/span\u003E{\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/**\n     * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@var\u003C\/span\u003E \\DateTime\n     * \u003Cspan class=\u0022hljs-doctag\u0022\u003E@ORM\u003C\/span\u003E\\Column(type=\u0022datetime\u0022)\n     *\/\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Eprivate\u003C\/span\u003E $createdAt;\n\n    \u003Cspan class=\u0022hljs-comment\u0022\u003E\/\/ many other fields...\u003C\/span\u003E\n\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003E__construct\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;createdAt = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\DateTime();\n    }\n\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EgetCreatedAt\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E()\u003C\/span\u003E: \\\u003Cspan class=\u0022hljs-title\u0022\u003EDateTime\u003C\/span\u003E\n    \u003C\/span\u003E{\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E \u003Cspan class=\u0022hljs-keyword\u0022\u003E$this\u003C\/span\u003E-\u0026gt;createdAt;\n    }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EIt looks as if you could be sure that \u003Ccode\u003EcreatedAt\u003C\/code\u003E will be stored in the database as exactly the moment when the entity was first created, right? After all there\u2019s no setter given, so unless you hack around with reflections, there\u2019s no way to modify that value ever again, is there?\u003C\/p\u003E\n\u003Cp\u003EWell, let\u2019s say in your app it\u2019s important to display, how many Sundays have passed since some stuff happened, and one of them is the registration of a given user.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Epublic\u003C\/span\u003E \u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003EcountSundays\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E(\\DateTime $datetime)\u003C\/span\u003E: \u003Cspan class=\u0022hljs-title\u0022\u003Eint\u003C\/span\u003E\n\u003C\/span\u003E{\n    $datetime-\u0026gt;modify(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027next sunday 23:59:59\u0027\u003C\/span\u003E);\n    $sundays = \u003Cspan class=\u0022hljs-number\u0022\u003E0\u003C\/span\u003E;\n\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Ewhile\u003C\/span\u003E ($datetime \u0026lt; \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\DateTime(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027now\u0027\u003C\/span\u003E)) {\n        $sundays++;\n        $datetime-\u0026gt;modify(\u003Cspan class=\u0022hljs-string\u0022\u003E\u0027+1 week\u0027\u003C\/span\u003E);\n    }\n\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Ereturn\u003C\/span\u003E $sundays;\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAt first glance this code seems fine as well. We get some value, we use it to calculate some other value, and we return the result. But notice that we keep modifying the input data! If you did it with a string, int or an array, the input would not be modified at all (unless explicitly passed as reference, \u003Ccode\u003E\u0026amp;$string\u003C\/code\u003E). But \u003Ccode\u003E\\DateTime\u003C\/code\u003E, although it\u2019s just a simple value wrapped in a class, is a class after all, so it\u2019s always passed by reference.\u003C\/p\u003E\n\u003Cp\u003ESo even though you cannot set \u003Ccode\u003EUser\u003C\/code\u003E\u2019s \u003Ccode\u003EcreatedAt\u003C\/code\u003E to a \u003Cem\u003Edifferent\u003C\/em\u003E object, you can pass that object to some function that will modify the \u003Cem\u003Einside\u003C\/em\u003E of that object. So if you happen to save your \u003Ccode\u003EUser\u003C\/code\u003E entity to the database after its number of Sundays has been calculated, you will end up with all the users having been registered \u003Cem\u003Ein the future\u003C\/em\u003E and constantly changing their registration date.\u003C\/p\u003E\n\u003Cp\u003EIt might be quite difficult to find the source of this bug. After all, there is no setter, and the connection between this date and \u003Ccode\u003EcountSundays\u003C\/code\u003E might not be too obvious \u2013 maybe hidden in a Twig extension or an external library...\u003C\/p\u003E\n\u003Cp\u003EHow to mitigate that? Ideally, use \u003Ca href=\u0022https:\/\/secure.php.net\/manual\/en\/class.datetimeimmutable.php\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E \u003Ccode\u003EDateTimeImmuttable\u003C\/code\u003E\u003C\/a\u003E, which \u201cbehaves the same as DateTime except it never modifies itself but returns a new object instead\u201d.\u003C\/p\u003E\n\u003Cp\u003EOr if you don\u2019t want to adjust your whole project to use \u003Ccode\u003EDateTimeImmuttable\u003C\/code\u003E, you might instead remember to \u003Ccode\u003Eclone\u003C\/code\u003E a \u003Ccode\u003EDateTime\u003C\/code\u003E variable before passing it anywhere.\u003C\/p\u003E\n\u003Cp\u003EBtw, in the Rust programming language all variables are \u003Ca href=\u0022https:\/\/doc.rust-lang.org\/book\/first-edition\/mutability.html\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E immutable by default\u003C\/a\u003E \ud83d\ude0d\u003C\/p\u003E\n\u003Ch3\u003EInvoices import\u003C\/h3\u003E\n\u003Cp\u003EI had to work on a code like this recently:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003EinvoiceService = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E InvoiceService\nshop = \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E Shop\n\ninvoices = shop.loadInvoices\n\n\u003Cspan class=\u0022hljs-keyword\u0022\u003Efor\u003C\/span\u003E each invoice in invoices {\n    invoiceService.saveInvoice(invoice)\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd somewhere inside \u003Ccode\u003EsaveInvoice\u003C\/code\u003E, this function was executed:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E\u003Cspan class=\u0022hljs-function\u0022\u003E\u003Cspan class=\u0022hljs-keyword\u0022\u003Efunction\u003C\/span\u003E \u003Cspan class=\u0022hljs-title\u0022\u003ErunSQL\u003C\/span\u003E\u003Cspan class=\u0022hljs-params\u0022\u003E(sql)\u003C\/span\u003E \u003C\/span\u003E{\n    result = database_exec(sql)\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Eif\u003C\/span\u003E result is \u003Cspan class=\u0022hljs-keyword\u0022\u003Efalse\u003C\/span\u003E {\n        log(database_error)\n        \u003Cspan class=\u0022hljs-keyword\u0022\u003Edie\u003C\/span\u003E\n    }\n}\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThe code was PHP, but it\u2019s such a \u003Ca href=\u0022http:\/\/govnokod.ru\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E govnokod\u003C\/a\u003E that the above pseudocode with ~90% of original logic removed, is the best way to show it without crying...\u003C\/p\u003E\n\u003Cp\u003ESo the problem was: no invoices are generated anymore. Can you see why? If any invoice fails, the script just logs the error and just dies. When it runs again, it tries with the same invoice and dies again, over and over again, never even trying to handle any other invoice.\u003C\/p\u003E\n\u003Cp\u003EThe underlying error was easy to find and reasonably easy to fix. But we wanted to also make that old, shitty code just a tiny bit better \u2013 if one invoice fails, it shouldn\u2019t block all the others anymore.\u003C\/p\u003E\n\u003Cp\u003EInstead of \u003Ccode\u003Edie\u003C\/code\u003E-ing, the \u003Ccode\u003ErunSQL\u003C\/code\u003E would throw an exception. All the other places, where \u003Ccode\u003ErunSQL\u003C\/code\u003E is used, would basically work as they used to (uncaught exception would terminate the script anyway), but on loading the invoices we would just catch the exception and carry on with all the other invoices.\u003C\/p\u003E\n\u003Cp\u003EWhat could possibly go wrong?\u003C\/p\u003E\n\u003Cp\u003EWell, if you do it on Friday, while starting to get a bit sick, and with \u003Ccode\u003EInvoiceService\u003C\/code\u003E class consisting of \u0026gt;1000 lines of messy, overcomplicated code \u2013 a lot can go wrong.\u003C\/p\u003E\n\u003Cp\u003EAll because \u003Ccode\u003EInvoiceService\u003C\/code\u003E is stateful. That means running \u003Ccode\u003EinvoiceService.saveInvoice(invoice)\u003C\/code\u003E might result in different stuff actually being done, depending on the context it was run in. In this case, the class was keeping invoice items (and other stuff) as a private object property \u2013 first loading them from somewhere, then saving to the database, and finally cleaning it up.\u003C\/p\u003E\n\u003Cp\u003EObviously, with the try-catch, the last step wouldn\u2019t be executed. So if \u003Ccode\u003EinvoiceService.saveInvoice(invoice1)\u003C\/code\u003E fails, then \u003Ccode\u003EinvoiceService.saveInvoice(invoice2)\u003C\/code\u003E wouldn\u2019t really save the \u003Ccode\u003Einvoice2\u003C\/code\u003E, as name suggests \u2013 it would load \u003Ccode\u003Einvoice2\u003C\/code\u003E plus some failing items from \u003Ccode\u003Einvoice1\u003C\/code\u003E... The errors pile up, the invoice items accumulate, and we end up with hundreds of invalid (empty) invoices with the last one claiming that someone owes us 1,9 mln \u20ac...\u003C\/p\u003E\n\u003Ch3\u003EAlways immutable and stateless?\u003C\/h3\u003E\n\u003Cp\u003EObviously not. Some types of classes you \u003Cem\u003Eexpect\u003C\/em\u003E to be stateful. What would be the point of a \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Builder_pattern\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Builder\u003C\/a\u003E, if it couldn\u2019t hold an internal state? How to implement \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Event_(computing)\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Events\u003C\/a\u003E elegantly, if they were immutable?\u003C\/p\u003E\n\u003Cp\u003EForm libraries like \u003Ca href=\u0022https:\/\/symfony.com\/doc\/current\/forms.html\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Symfony Forms\u003C\/a\u003E or \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Forms\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Avris Forms\u003C\/a\u003E require you to provide getters and setters for your entity \u2013 and it reflects how your database probably works: a user might change their username or avatar, so the programmer shouldn\u2019t \u003Cem\u003Eexpect\u003C\/em\u003E them to be immutable. (Unless you\u2019re using \u003Ca href=\u0022https:\/\/martinfowler.com\/eaaDev\/EventSourcing.html\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Event Sourcing\u003C\/a\u003E, then good for you!).\u003C\/p\u003E\n\u003Cp\u003EBasically, it\u2019s all about what you would expect from a class, see \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Principle_of_least_astonishment\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Principle of least astonishment\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EA simple data value objects, like \u003Ca href=\u0022https:\/\/secure.php.net\/manual\/en\/class.datetimeimmutable.php\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E date and time\u003C\/a\u003E, or \u003Ca href=\u0022https:\/\/github.com\/moneyphp\/money\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-link\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E monetary value\u003C\/a\u003E should consistently represent the same value. Services that offer a method \u003Ccode\u003EhandleFoo(Foo)\u003C\/code\u003E should behave exactly the same for the same \u003Ccode\u003EFoo\u003C\/code\u003E, regardless of when were they triggered.\u003C\/p\u003E\n\u003Cp\u003EEntities though can be mutable in your project, and that\u2019s ok. Builders, by their nature, are mutable, and that\u2019s fine. You can even see that from the methods they provide: \u003Ccode\u003EaddFoo\u003C\/code\u003E etc. suggest you shouldn\u2019t expect immutability from them.\u003C\/p\u003E\n\u003Cp\u003EI think that Rust\u2019s approach should be followed: immutability by default, mutability explicitly declared. In other terms: write immutable classes, unless you can find a good justification for making one mutable.\u003C\/p\u003E\n\u003Cp\u003EAnd when it comes to finding a nice acronym for this rule... how about JAM?\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EJustify All Mutants\u003C\/strong\u003E.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["bug","class","clean code","immutability","immutable","programming","security","stateless","statelessness"],"hasMore":true,"image":"https:\/\/avris.it\/image\/mutants-everywhere_small.jpg","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mutants-everywhere_big.jpg\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mutants-everywhere_mini.jpg\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022130.8\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKeeping your classes \u003Cstrong\u003Eimmutable and stateless\u003C\/strong\u003E makes your code \u003Cem\u003Eway\u003C\/em\u003E less prone to bugs. Yet somehow this clean code rule isn\u2019t as popular and as often invoked as\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Single_responsibility_principle\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E SRP\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/You_aren%27t_gonna_need_it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E YAGNI\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E DRY\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/KISS_principle\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E KISS\u003C\/a\u003E\nand others... Maybe it\u2019s because of the lack of a catchy acronym?\u003C\/p\u003E\n\u003Cp\u003EAnyways, I\u2019d like to take a look at two examples of when sticking to this rule could save your ass (or at least save you some time debugging).\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/mutants-everywhere_big.jpg\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/mutants-everywhere_mini.jpg\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022130.8\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003Cfigcaption\u003E\n                    \u003Ca href=\u0022https:\/\/makeameme.org\/meme\/mutants-mutants-everywhere-n6biem\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Csmall\u003Emakeameme.org\/meme\/mutants-mutants-everywhere-n6biem\u003C\/small\u003E\u003C\/a\u003E\n                \u003C\/figcaption\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EKeeping your classes \u003Cstrong\u003Eimmutable and stateless\u003C\/strong\u003E makes your code \u003Cem\u003Eway\u003C\/em\u003E less prone to bugs. Yet somehow this clean code rule isn\u2019t as popular and as often invoked as\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Single_responsibility_principle\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E SRP\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/You_aren%27t_gonna_need_it\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E YAGNI\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E DRY\u003C\/a\u003E,\n\u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/KISS_principle\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E KISS\u003C\/a\u003E\nand others... Maybe it\u2019s because of the lack of a catchy acronym?\u003C\/p\u003E\n\u003Cp\u003EAnyways, I\u2019d like to take a look at two examples of when sticking to this rule could save your ass (or at least save you some time debugging).\u003C\/p\u003E\n\u003Ch3\u003EDateTime\u003C\/h3\u003E\n\u003Cp\u003EPHP offers a \u003Ccode\u003EDateTime\u003C\/code\u003E object that encapsulates, well, a date and time. And it\u2019s pretty cool: it can parse strings like \u201cnext monday\u201d, it can understand instructions like modify \u201c+1 week midnight\u201d, the standard library offers support for time zones and for iterating over time (like from \u201cnow\u201d to \u201c+1 day\u201d every \u201c+30 minutes\u201d).\u003C\/p\u003E\n\u003Cp\u003EBut there\u2019s a huge catch involved: \u003Ccode\u003EDateTime\u003C\/code\u003E is mutable.\u003C\/p\u003E\n\u003Cp\u003ELet\u2019s say you have a \u003Ccode\u003EUser\u003C\/code\u003E entity:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022language-php\u0022\u003E\/**\n * @ORM\\Entity\n * @ORM\\Table\n **\/\nclass User\n{\n    \/**\n     * @var \\DateTime\n     * @ORM\\Column(type=\u0022datetime\u0022)\n     *\/\n    private $createdAt;\n\n    \/\/ many other fields...\n\n    public function __construct()\n    {\n        $this-\u0026gt;createdAt = new \\DateTime();\n    }\n\n    public function getCreatedAt(): \\DateTime\n    {\n        return $this-\u0026gt;createdAt;\n    }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EIt looks as if you could be sure that \u003Ccode\u003EcreatedAt\u003C\/code\u003E will be stored in the database as exactly the moment when the entity was first created, right? After all there\u2019s no setter given, so unless you hack around with reflections, there\u2019s no way to modify that value ever again, is there?\u003C\/p\u003E\n\u003Cp\u003EWell, let\u2019s say in your app it\u2019s important to display, how many Sundays have passed since some stuff happened, and one of them is the registration of a given user.\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003Epublic function countSundays(\\DateTime $datetime): int\n{\n    $datetime-\u0026gt;modify(\u0027next sunday 23:59:59\u0027);\n    $sundays = 0;\n\n    while ($datetime \u0026lt; new \\DateTime(\u0027now\u0027)) {\n        $sundays++;\n        $datetime-\u0026gt;modify(\u0027+1 week\u0027);\n    }\n\n    return $sundays;\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAt first glance this code seems fine as well. We get some value, we use it to calculate some other value, and we return the result. But notice that we keep modifying the input data! If you did it with a string, int or an array, the input would not be modified at all (unless explicitly passed as reference, \u003Ccode\u003E\u0026amp;$string\u003C\/code\u003E). But \u003Ccode\u003E\\DateTime\u003C\/code\u003E, although it\u2019s just a simple value wrapped in a class, is a class after all, so it\u2019s always passed by reference.\u003C\/p\u003E\n\u003Cp\u003ESo even though you cannot set \u003Ccode\u003EUser\u003C\/code\u003E\u2019s \u003Ccode\u003EcreatedAt\u003C\/code\u003E to a \u003Cem\u003Edifferent\u003C\/em\u003E object, you can pass that object to some function that will modify the \u003Cem\u003Einside\u003C\/em\u003E of that object. So if you happen to save your \u003Ccode\u003EUser\u003C\/code\u003E entity to the database after its number of Sundays has been calculated, you will end up with all the users having been registered \u003Cem\u003Ein the future\u003C\/em\u003E and constantly changing their registration date.\u003C\/p\u003E\n\u003Cp\u003EIt might be quite difficult to find the source of this bug. After all, there is no setter, and the connection between this date and \u003Ccode\u003EcountSundays\u003C\/code\u003E might not be too obvious \u2013 maybe hidden in a Twig extension or an external library...\u003C\/p\u003E\n\u003Cp\u003EHow to mitigate that? Ideally, use \u003Ca href=\u0022https:\/\/secure.php.net\/manual\/en\/class.datetimeimmutable.php\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E \u003Ccode\u003EDateTimeImmuttable\u003C\/code\u003E\u003C\/a\u003E, which \u201cbehaves the same as DateTime except it never modifies itself but returns a new object instead\u201d.\u003C\/p\u003E\n\u003Cp\u003EOr if you don\u2019t want to adjust your whole project to use \u003Ccode\u003EDateTimeImmuttable\u003C\/code\u003E, you might instead remember to \u003Ccode\u003Eclone\u003C\/code\u003E a \u003Ccode\u003EDateTime\u003C\/code\u003E variable before passing it anywhere.\u003C\/p\u003E\n\u003Cp\u003EBtw, in the Rust programming language all variables are \u003Ca href=\u0022https:\/\/doc.rust-lang.org\/book\/first-edition\/mutability.html\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E immutable by default\u003C\/a\u003E \ud83d\ude0d\u003C\/p\u003E\n\u003Ch3\u003EInvoices import\u003C\/h3\u003E\n\u003Cp\u003EI had to work on a code like this recently:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003EinvoiceService = new InvoiceService\nshop = new Shop\n\ninvoices = shop.loadInvoices\n\nfor each invoice in invoices {\n    invoiceService.saveInvoice(invoice)\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd somewhere inside \u003Ccode\u003EsaveInvoice\u003C\/code\u003E, this function was executed:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003Efunction runSQL(sql) {\n    result = database_exec(sql)\n    if result is false {\n        log(database_error)\n        die\n    }\n}\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EThe code was PHP, but it\u2019s such a \u003Ca href=\u0022http:\/\/govnokod.ru\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E govnokod\u003C\/a\u003E that the above pseudocode with ~90% of original logic removed, is the best way to show it without crying...\u003C\/p\u003E\n\u003Cp\u003ESo the problem was: no invoices are generated anymore. Can you see why? If any invoice fails, the script just logs the error and just dies. When it runs again, it tries with the same invoice and dies again, over and over again, never even trying to handle any other invoice.\u003C\/p\u003E\n\u003Cp\u003EThe underlying error was easy to find and reasonably easy to fix. But we wanted to also make that old, shitty code just a tiny bit better \u2013 if one invoice fails, it shouldn\u2019t block all the others anymore.\u003C\/p\u003E\n\u003Cp\u003EInstead of \u003Ccode\u003Edie\u003C\/code\u003E-ing, the \u003Ccode\u003ErunSQL\u003C\/code\u003E would throw an exception. All the other places, where \u003Ccode\u003ErunSQL\u003C\/code\u003E is used, would basically work as they used to (uncaught exception would terminate the script anyway), but on loading the invoices we would just catch the exception and carry on with all the other invoices.\u003C\/p\u003E\n\u003Cp\u003EWhat could possibly go wrong?\u003C\/p\u003E\n\u003Cp\u003EWell, if you do it on Friday, while starting to get a bit sick, and with \u003Ccode\u003EInvoiceService\u003C\/code\u003E class consisting of \u0026gt;1000 lines of messy, overcomplicated code \u2013 a lot can go wrong.\u003C\/p\u003E\n\u003Cp\u003EAll because \u003Ccode\u003EInvoiceService\u003C\/code\u003E is stateful. That means running \u003Ccode\u003EinvoiceService.saveInvoice(invoice)\u003C\/code\u003E might result in different stuff actually being done, depending on the context it was run in. In this case, the class was keeping invoice items (and other stuff) as a private object property \u2013 first loading them from somewhere, then saving to the database, and finally cleaning it up.\u003C\/p\u003E\n\u003Cp\u003EObviously, with the try-catch, the last step wouldn\u2019t be executed. So if \u003Ccode\u003EinvoiceService.saveInvoice(invoice1)\u003C\/code\u003E fails, then \u003Ccode\u003EinvoiceService.saveInvoice(invoice2)\u003C\/code\u003E wouldn\u2019t really save the \u003Ccode\u003Einvoice2\u003C\/code\u003E, as name suggests \u2013 it would load \u003Ccode\u003Einvoice2\u003C\/code\u003E plus some failing items from \u003Ccode\u003Einvoice1\u003C\/code\u003E... The errors pile up, the invoice items accumulate, and we end up with hundreds of invalid (empty) invoices with the last one claiming that someone owes us 1,9 mln \u20ac...\u003C\/p\u003E\n\u003Ch3\u003EAlways immutable and stateless?\u003C\/h3\u003E\n\u003Cp\u003EObviously not. Some types of classes you \u003Cem\u003Eexpect\u003C\/em\u003E to be stateful. What would be the point of a \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Builder_pattern\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Builder\u003C\/a\u003E, if it couldn\u2019t hold an internal state? How to implement \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Event_(computing)\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Events\u003C\/a\u003E elegantly, if they were immutable?\u003C\/p\u003E\n\u003Cp\u003EForm libraries like \u003Ca href=\u0022https:\/\/symfony.com\/doc\/current\/forms.html\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Symfony Forms\u003C\/a\u003E or \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Forms\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Avris Forms\u003C\/a\u003E require you to provide getters and setters for your entity \u2013 and it reflects how your database probably works: a user might change their username or avatar, so the programmer shouldn\u2019t \u003Cem\u003Eexpect\u003C\/em\u003E them to be immutable. (Unless you\u2019re using \u003Ca href=\u0022https:\/\/martinfowler.com\/eaaDev\/EventSourcing.html\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Event Sourcing\u003C\/a\u003E, then good for you!).\u003C\/p\u003E\n\u003Cp\u003EBasically, it\u2019s all about what you would expect from a class, see \u003Ca href=\u0022https:\/\/en.wikipedia.org\/wiki\/Principle_of_least_astonishment\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Principle of least astonishment\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EA simple data value objects, like \u003Ca href=\u0022https:\/\/secure.php.net\/manual\/en\/class.datetimeimmutable.php\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E date and time\u003C\/a\u003E, or \u003Ca href=\u0022https:\/\/github.com\/moneyphp\/money\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E monetary value\u003C\/a\u003E should consistently represent the same value. Services that offer a method \u003Ccode\u003EhandleFoo(Foo)\u003C\/code\u003E should behave exactly the same for the same \u003Ccode\u003EFoo\u003C\/code\u003E, regardless of when were they triggered.\u003C\/p\u003E\n\u003Cp\u003EEntities though can be mutable in your project, and that\u2019s ok. Builders, by their nature, are mutable, and that\u2019s fine. You can even see that from the methods they provide: \u003Ccode\u003EaddFoo\u003C\/code\u003E etc. suggest you shouldn\u2019t expect immutability from them.\u003C\/p\u003E\n\u003Cp\u003EI think that Rust\u2019s approach should be followed: immutability by default, mutability explicitly declared. In other terms: write immutable classes, unless you can find a good justification for making one mutable.\u003C\/p\u003E\n\u003Cp\u003EAnd when it comes to finding a nice acronym for this rule... how about JAM?\u003C\/p\u003E\n\u003Cp\u003E\u003Cstrong\u003EJustify All Mutants\u003C\/strong\u003E.\u003C\/p\u003E","words":1181,"readTime":5,"lang":"en"}}},"projects\/clavis-shared-password-storage":{"key":"projects\/clavis-shared-password-storage","type":"article","published":true,"meta":{"createdAt":"2017-04-28T19:43:38+02:00","publishedAt":"2015-07-16T11:31:00+02:00","group":null,"links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/clavis.avris.it\/","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Clavis","displayUrl":null}],"category":"projects","subcategory":null,"slug":"clavis-shared-password-storage"},"content":{"en":{"slug":"clavis-shared-password-storage","title":"Clavis \u2013 Shared password storage","intro":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.17339667458\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEKElEQVRIiZ2Wv2\/bRhTHP3e8I0VSsiLHdl2oQeog3bIU6dr8DRnyJ3Tp2iVdAiND\/pEAyVhkDTLkr+iaIYCBoChgWxItUby714EiTVpx4uYt4o93d+99fzxRHR8fC8BkMkEpxbeE956zszMePHjAdDr9pvXv3r1Da40REQAeP36MtfZ\/b6aUYjab8fr1a46Ojrhz5weyLOf09JQ8z3HOobVum3XOAQqtFaPRDkrVBb19+xalFKaLiohQFAXWWpIkwXtPFEVbyD1\/\/pyjoyPev3\/PixcvGA6HbXH7+wcopUjTFBFhvV5jrf0i+g0oSqlLhACWyyUiwocPH7DWYoxhb2+vPbCJu3fvcnh4SFEUrNfr9nkInuVqRZamnJ+fUxQFy+WSLMvw3oMCayxVVRFCIE1TqqpiOBq1hRmlVFvhYDAghMD9+\/fRWrdJVVWhtQIUxhhevXrFcDjkyZMnVzqFal1BmpLnOSYyTCYT4jj+ohzKsrxEqLlofmuOa15FBK0jQPBeEMAYw7Nnz9om9vf36+6h1kPwLJdLjDEYaxgMBj1avhY9yrz3VFUFgKsqnA+k6QCUImwOnTvHLw8f4rxHa02WZczn801Bmt3JBAScd9g4vrYQEWkbCSG0z3qiDsFTliUhBKyJMMZQliXOeZIkBqAoCiJj8M4RRRHpIO0dcnZ6Rpql\/FOeMLs4J8\/zXiEKODB3cM7x6dMnRITd3d1LyrodaB0RgkcEsnzYc4bUJ7Y6M8bUayLd5kRRxK3JLQC+i6bspYdbyCjA6pg4jrl3717NxkYmW6JWSjEYpBhjWic0kHrvca5CKd26pqoqTEes3nuKiwvyLIMA1cohIoxGo5vbvrloYFCbjbXWKBQo2lmUJPEGxUAIAQmhtlZn49VyiTUGYyyjUXxtET3UOsX2KAsSWFcVIoK1htWqxBiD94EsS6EjRO9DjU5nM6014\/F4s8bf2FlN3paotdYbeGvHjMe3EBFqWunkXQe\/sF5XWGvRWrez7GvRaGhL1EBrexHh5OQE730NaZQQVExsI3768ftrOmVjCmlpvUn0bN9UBvXQy\/O8vX\/69E\/29m5TLBY476gqx87ODi9fvqQxQx9hRRInQK3D5WqFVqr9b7wuukiaq+rv3j969CuLxaL3\/uDgoDfZu+GdZzafE8eW2WzWUr2zM6Jcr2mykyQhjmvBf\/z4kfF43O7Xo0xE+HcBWQxB4Lff\/yDSEBuYryAxoBXMV4JWtZ6z+LKoyBhu366HXJZlLYJf0tJ0Ot2eQ1109kefX7ibX9JzlarPRRRFXFxcoLWmLEtEhDiOKcsV1sb89TcsyoAI\/Dy9RLxF6M2bN9\/8xdiIcotC73GuHo71CLFUlUMpTekiIqXQEfiN9kUEdXx8LJfW7qPQPeTqu25+k+u9v7GzrkbzefIfN0I9xLU5sOkAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.17339667458\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have lots of lots of passwords and access keys... Keeping them in a web browser or a window application is a good idea, but only until you need to share them with somebody.\u003C\/p\u003E\n\u003Cp\u003EClavis can be installed on your PHP server (no 3rd party involved in storing your sensitive data). It lets you share your keys and be in control of what and with whom are you sharing.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s easy, safe, comfortable and totally free!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022534.34679334917\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEKElEQVRIiZ2Wv2\/bRhTHP3e8I0VSsiLHdl2oQeog3bIU6dr8DRnyJ3Tp2iVdAiND\/pEAyVhkDTLkr+iaIYCBoChgWxItUby714EiTVpx4uYt4o93d+99fzxRHR8fC8BkMkEpxbeE956zszMePHjAdDr9pvXv3r1Da40REQAeP36MtfZ\/b6aUYjab8fr1a46Ojrhz5weyLOf09JQ8z3HOobVum3XOAQqtFaPRDkrVBb19+xalFKaLiohQFAXWWpIkwXtPFEVbyD1\/\/pyjoyPev3\/PixcvGA6HbXH7+wcopUjTFBFhvV5jrf0i+g0oSqlLhACWyyUiwocPH7DWYoxhb2+vPbCJu3fvcnh4SFEUrNfr9nkInuVqRZamnJ+fUxQFy+WSLMvw3oMCayxVVRFCIE1TqqpiOBq1hRmlVFvhYDAghMD9+\/fRWrdJVVWhtQIUxhhevXrFcDjkyZMnVzqFal1BmpLnOSYyTCYT4jj+ohzKsrxEqLlofmuOa15FBK0jQPBeEMAYw7Nnz9om9vf36+6h1kPwLJdLjDEYaxgMBj1avhY9yrz3VFUFgKsqnA+k6QCUImwOnTvHLw8f4rxHa02WZczn801Bmt3JBAScd9g4vrYQEWkbCSG0z3qiDsFTliUhBKyJMMZQliXOeZIkBqAoCiJj8M4RRRHpIO0dcnZ6Rpql\/FOeMLs4J8\/zXiEKODB3cM7x6dMnRITd3d1LyrodaB0RgkcEsnzYc4bUJ7Y6M8bUayLd5kRRxK3JLQC+i6bspYdbyCjA6pg4jrl3717NxkYmW6JWSjEYpBhjWic0kHrvca5CKd26pqoqTEes3nuKiwvyLIMA1cohIoxGo5vbvrloYFCbjbXWKBQo2lmUJPEGxUAIAQmhtlZn49VyiTUGYyyjUXxtET3UOsX2KAsSWFcVIoK1htWqxBiD94EsS6EjRO9DjU5nM6014\/F4s8bf2FlN3paotdYbeGvHjMe3EBFqWunkXQe\/sF5XWGvRWrez7GvRaGhL1EBrexHh5OQE730NaZQQVExsI3768ftrOmVjCmlpvUn0bN9UBvXQy\/O8vX\/69E\/29m5TLBY476gqx87ODi9fvqQxQx9hRRInQK3D5WqFVqr9b7wuukiaq+rv3j969CuLxaL3\/uDgoDfZu+GdZzafE8eW2WzWUr2zM6Jcr2mykyQhjmvBf\/z4kfF43O7Xo0xE+HcBWQxB4Lff\/yDSEBuYryAxoBXMV4JWtZ6z+LKoyBhu366HXJZlLYJf0tJ0Ot2eQ1109kefX7ibX9JzlarPRRRFXFxcoLWmLEtEhDiOKcsV1sb89TcsyoAI\/Dy9RLxF6M2bN9\/8xdiIcotC73GuHo71CLFUlUMpTekiIqXQEfiN9kUEdXx8LJfW7qPQPeTqu25+k+u9v7GzrkbzefIfN0I9xLU5sOkAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022534.34679334917\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have lots of lots of passwords and access keys... Keeping them in a web browser or a window application is a good idea, but only until you need to share them with somebody.\u003C\/p\u003E\n\u003Cp\u003EClavis can be installed on your PHP server (no 3rd party involved in storing your sensitive data). It lets you share your keys and be in control of what and with whom are you sharing.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s easy, safe, comfortable and totally free!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["company","micrus","password","php","security","share"],"hasMore":false,"image":"https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.58669833729\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have lots of lots of passwords and access keys... Keeping them in a web browser or a window application is a good idea, but only until you need to share them with somebody.\u003C\/p\u003E\n\u003Cp\u003EClavis can be installed on your PHP server (no 3rd party involved in storing your sensitive data). It lets you share your keys and be in control of what and with whom are you sharing.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s easy, safe, comfortable and totally free!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.58669833729\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWe all have lots of lots of passwords and access keys... Keeping them in a web browser or a window application is a good idea, but only until you need to share them with somebody.\u003C\/p\u003E\n\u003Cp\u003EClavis can be installed on your PHP server (no 3rd party involved in storing your sensitive data). It lets you share your keys and be in control of what and with whom are you sharing.\u003C\/p\u003E\n\u003Cp\u003EIt\u2019s easy, safe, comfortable and totally free!\u003C\/p\u003E","words":78,"readTime":null,"lang":"en"},"pl":{"slug":"clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a","title":"Clavis \u2013 wsp\u00f3\u0142dzielony schowek na has\u0142a","intro":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.17339667458\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEKElEQVRIiZ2Wv2\/bRhTHP3e8I0VSsiLHdl2oQeog3bIU6dr8DRnyJ3Tp2iVdAiND\/pEAyVhkDTLkr+iaIYCBoChgWxItUby714EiTVpx4uYt4o93d+99fzxRHR8fC8BkMkEpxbeE956zszMePHjAdDr9pvXv3r1Da40REQAeP36MtfZ\/b6aUYjab8fr1a46Ojrhz5weyLOf09JQ8z3HOobVum3XOAQqtFaPRDkrVBb19+xalFKaLiohQFAXWWpIkwXtPFEVbyD1\/\/pyjoyPev3\/PixcvGA6HbXH7+wcopUjTFBFhvV5jrf0i+g0oSqlLhACWyyUiwocPH7DWYoxhb2+vPbCJu3fvcnh4SFEUrNfr9nkInuVqRZamnJ+fUxQFy+WSLMvw3oMCayxVVRFCIE1TqqpiOBq1hRmlVFvhYDAghMD9+\/fRWrdJVVWhtQIUxhhevXrFcDjkyZMnVzqFal1BmpLnOSYyTCYT4jj+ohzKsrxEqLlofmuOa15FBK0jQPBeEMAYw7Nnz9om9vf36+6h1kPwLJdLjDEYaxgMBj1avhY9yrz3VFUFgKsqnA+k6QCUImwOnTvHLw8f4rxHa02WZczn801Bmt3JBAScd9g4vrYQEWkbCSG0z3qiDsFTliUhBKyJMMZQliXOeZIkBqAoCiJj8M4RRRHpIO0dcnZ6Rpql\/FOeMLs4J8\/zXiEKODB3cM7x6dMnRITd3d1LyrodaB0RgkcEsnzYc4bUJ7Y6M8bUayLd5kRRxK3JLQC+i6bspYdbyCjA6pg4jrl3717NxkYmW6JWSjEYpBhjWic0kHrvca5CKd26pqoqTEes3nuKiwvyLIMA1cohIoxGo5vbvrloYFCbjbXWKBQo2lmUJPEGxUAIAQmhtlZn49VyiTUGYyyjUXxtET3UOsX2KAsSWFcVIoK1htWqxBiD94EsS6EjRO9DjU5nM6014\/F4s8bf2FlN3paotdYbeGvHjMe3EBFqWunkXQe\/sF5XWGvRWrez7GvRaGhL1EBrexHh5OQE730NaZQQVExsI3768ftrOmVjCmlpvUn0bN9UBvXQy\/O8vX\/69E\/29m5TLBY476gqx87ODi9fvqQxQx9hRRInQK3D5WqFVqr9b7wuukiaq+rv3j969CuLxaL3\/uDgoDfZu+GdZzafE8eW2WzWUr2zM6Jcr2mykyQhjmvBf\/z4kfF43O7Xo0xE+HcBWQxB4Lff\/yDSEBuYryAxoBXMV4JWtZ6z+LKoyBhu366HXJZlLYJf0tJ0Ot2eQ1109kefX7ibX9JzlarPRRRFXFxcoLWmLEtEhDiOKcsV1sb89TcsyoAI\/Dy9RLxF6M2bN9\/8xdiIcotC73GuHo71CLFUlUMpTekiIqXQEfiN9kUEdXx8LJfW7qPQPeTqu25+k+u9v7GzrkbzefIfN0I9xLU5sOkAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022267.17339667458\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWszyscy mamy wiele hase\u0142 i kluczy dost\u0119pu. Pami\u0119tanie ich w przegl\u0105darce internetowej albo w aplikacji okienkowej jest dobrym pomys\u0142em, ale tylko dop\u00f3ki b\u0119dziesz potrzebowa\u0142 je z kim\u015b wsp\u00f3\u0142dzieli\u0107.\u003C\/p\u003E\n\u003Cp\u003EClavis mo\u017ce by\u0107 zainstalowany na Twoim serwerze PHP (\u017cadna trzecia strona nie jest zaanga\u017cowana w przechowywanie Twoich danych wra\u017cliwych). Pozwala Ci przechowywa\u0107 Twoje klucze i kontrolowa\u0107 komu, co i kiedy udost\u0119pniasz.\u003C\/p\u003E\n\u003Cp\u003EClavis jest prosty, bezpieczny, wygodny i ca\u0142kowicie darmowy!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022534.34679334917\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEKElEQVRIiZ2Wv2\/bRhTHP3e8I0VSsiLHdl2oQeog3bIU6dr8DRnyJ3Tp2iVdAiND\/pEAyVhkDTLkr+iaIYCBoChgWxItUby714EiTVpx4uYt4o93d+99fzxRHR8fC8BkMkEpxbeE956zszMePHjAdDr9pvXv3r1Da40REQAeP36MtfZ\/b6aUYjab8fr1a46Ojrhz5weyLOf09JQ8z3HOobVum3XOAQqtFaPRDkrVBb19+xalFKaLiohQFAXWWpIkwXtPFEVbyD1\/\/pyjoyPev3\/PixcvGA6HbXH7+wcopUjTFBFhvV5jrf0i+g0oSqlLhACWyyUiwocPH7DWYoxhb2+vPbCJu3fvcnh4SFEUrNfr9nkInuVqRZamnJ+fUxQFy+WSLMvw3oMCayxVVRFCIE1TqqpiOBq1hRmlVFvhYDAghMD9+\/fRWrdJVVWhtQIUxhhevXrFcDjkyZMnVzqFal1BmpLnOSYyTCYT4jj+ohzKsrxEqLlofmuOa15FBK0jQPBeEMAYw7Nnz9om9vf36+6h1kPwLJdLjDEYaxgMBj1avhY9yrz3VFUFgKsqnA+k6QCUImwOnTvHLw8f4rxHa02WZczn801Bmt3JBAScd9g4vrYQEWkbCSG0z3qiDsFTliUhBKyJMMZQliXOeZIkBqAoCiJj8M4RRRHpIO0dcnZ6Rpql\/FOeMLs4J8\/zXiEKODB3cM7x6dMnRITd3d1LyrodaB0RgkcEsnzYc4bUJ7Y6M8bUayLd5kRRxK3JLQC+i6bspYdbyCjA6pg4jrl3717NxkYmW6JWSjEYpBhjWic0kHrvca5CKd26pqoqTEes3nuKiwvyLIMA1cohIoxGo5vbvrloYFCbjbXWKBQo2lmUJPEGxUAIAQmhtlZn49VyiTUGYyyjUXxtET3UOsX2KAsSWFcVIoK1htWqxBiD94EsS6EjRO9DjU5nM6014\/F4s8bf2FlN3paotdYbeGvHjMe3EBFqWunkXQe\/sF5XWGvRWrez7GvRaGhL1EBrexHh5OQE730NaZQQVExsI3768ftrOmVjCmlpvUn0bN9UBvXQy\/O8vX\/69E\/29m5TLBY476gqx87ODi9fvqQxQx9hRRInQK3D5WqFVqr9b7wuukiaq+rv3j969CuLxaL3\/uDgoDfZu+GdZzafE8eW2WzWUr2zM6Jcr2mykyQhjmvBf\/z4kfF43O7Xo0xE+HcBWQxB4Lff\/yDSEBuYryAxoBXMV4JWtZ6z+LKoyBhu366HXJZlLYJf0tJ0Ot2eQ1109kefX7ibX9JzlarPRRRFXFxcoLWmLEtEhDiOKcsV1sb89TcsyoAI\/Dy9RLxF6M2bN9\/8xdiIcotC73GuHo71CLFUlUMpTekiIqXQEfiN9kUEdXx8LJfW7qPQPeTqu25+k+u9v7GzrkbzefIfN0I9xLU5sOkAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022534.34679334917\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWszyscy mamy wiele hase\u0142 i kluczy dost\u0119pu. Pami\u0119tanie ich w przegl\u0105darce internetowej albo w aplikacji okienkowej jest dobrym pomys\u0142em, ale tylko dop\u00f3ki b\u0119dziesz potrzebowa\u0142 je z kim\u015b wsp\u00f3\u0142dzieli\u0107.\u003C\/p\u003E\n\u003Cp\u003EClavis mo\u017ce by\u0107 zainstalowany na Twoim serwerze PHP (\u017cadna trzecia strona nie jest zaanga\u017cowana w przechowywanie Twoich danych wra\u017cliwych). Pozwala Ci przechowywa\u0107 Twoje klucze i kontrolowa\u0107 komu, co i kiedy udost\u0119pniasz.\u003C\/p\u003E\n\u003Cp\u003EClavis jest prosty, bezpieczny, wygodny i ca\u0142kowicie darmowy!\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["bezpiecze\u0144stwo","firma","has\u0142o","micrus","php","wsp\u00f3\u0142dzielenie"],"hasMore":false,"image":"https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.58669833729\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWszyscy mamy wiele hase\u0142 i kluczy dost\u0119pu. Pami\u0119tanie ich w przegl\u0105darce internetowej albo w aplikacji okienkowej jest dobrym pomys\u0142em, ale tylko dop\u00f3ki b\u0119dziesz potrzebowa\u0142 je z kim\u015b wsp\u00f3\u0142dzieli\u0107.\u003C\/p\u003E\n\u003Cp\u003EClavis mo\u017ce by\u0107 zainstalowany na Twoim serwerze PHP (\u017cadna trzecia strona nie jest zaanga\u017cowana w przechowywanie Twoich danych wra\u017cliwych). Pozwala Ci przechowywa\u0107 Twoje klucze i kontrolowa\u0107 komu, co i kiedy udost\u0119pniasz.\u003C\/p\u003E\n\u003Cp\u003EClavis jest prosty, bezpieczny, wygodny i ca\u0142kowicie darmowy!\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/clavis-wsp\u00f3\u0142dzielony-schowek-na-has\u0142a_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022133.58669833729\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EWszyscy mamy wiele hase\u0142 i kluczy dost\u0119pu. Pami\u0119tanie ich w przegl\u0105darce internetowej albo w aplikacji okienkowej jest dobrym pomys\u0142em, ale tylko dop\u00f3ki b\u0119dziesz potrzebowa\u0142 je z kim\u015b wsp\u00f3\u0142dzieli\u0107.\u003C\/p\u003E\n\u003Cp\u003EClavis mo\u017ce by\u0107 zainstalowany na Twoim serwerze PHP (\u017cadna trzecia strona nie jest zaanga\u017cowana w przechowywanie Twoich danych wra\u017cliwych). Pozwala Ci przechowywa\u0107 Twoje klucze i kontrolowa\u0107 komu, co i kiedy udost\u0119pniasz.\u003C\/p\u003E\n\u003Cp\u003EClavis jest prosty, bezpieczny, wygodny i ca\u0142kowicie darmowy!\u003C\/p\u003E","words":79,"readTime":null,"lang":"pl"}}}}}