{"tag":"doctrine","articles":{"blog\/technology\/new-year-new-digital-me":{"key":"blog\/technology\/new-year-new-digital-me","type":"article","published":true,"meta":{"createdAt":"2019-12-31T11:22:05+01:00","publishedAt":"2019-12-31T11:22:05+01:00","group":"redesign","category":"blog","subcategory":"technology","slug":"new-year-new-digital-me"},"content":{"en":{"slug":"new-year-new-digital-me","title":"New year \u2013 new (digital) me","intro":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4_small.png\u0022 alt=\u0022Screenshot of the new version of the blog\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022234.07874015748\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADFklEQVRIiaWWz24cRRDGf9XTf2aXJSvHYCLlgEDiyCkQiRtXrhw4IfEaSBx4AA55hQiJIxIvwM0kAiQgcoQcEsmAZGJsrx2CPd6dnunisJ71zu7au0BJo\/7UXfVNTdVXvSu33nlXRUAVAGZxlhlEDAAxVgt9GoyMl+AcYgyqabIpIqgqMUZSE6Dnx1PxVuSCuLEG3377FiLCzs6vpKQcDgZzPrPYWkvIA945rHWE4HHO4pwnBE+WZTjrCN7hg8d7T\/DjNc9z5ONPPlXnHN57fLg4DC0cJoEhzOxN\/ALeO7IsQ0QufZpqTa\/TJiklndtdwfb3D8hDhjCiSjlVVeODZzQckeeBfr+Pnremadcq+F8lVMbI3tM9nHPEKqIITs4oa09KiTzkxBhRFJtZjDFsbLyMtXblDxVV\/U8VAkgpTVqhqgtbsKqpKqqKbYiavFSVlNLEYfppzqfXacL\/YyKCMQZbFEWLzBjTEqExZhKwTJRlWTIYHOH9eOyvr61N\/FbW0LKWNdW5qhvNPVXXNSenp+O4pIgRyjJyWnte7HVZfyFbWilzVSIXuAaUqiq589kdPr\/7BVUsAaWuUyvGiCCMK21EcJml37VYja12X4bNIq1cppPtBz+wu3WfJ99+zeDwoJXItBZbHChnwxLnw9LqANhlk9HSVyrpWUGrClMWk\/1pjmKkdLyQZYaTYU0sayrJKIaRrvdz\/rP40pYtsnRSIJpwGjk5Opw7FxHWruXk+fgWv36tg+t26PdyrHOtj2xL4qIjdrYt08pv7NHWPeKzP\/hrlBgmJZ4VxKOHbG0e8Mprb7Jx8\/UpclBN5z+4Sj8Y6lgRCQvvqtl3zV2hi4bu9+\/uUR7\/yYPdZ\/S6yvrNde5+uUmv2+HDj16C84RUlbIcTSpgTEZVFtS+T27m+RfhlTS0F2u+2nzM91s73Fjr8NYbN9jefc6j3QHvvf8Br55zjBMBRDAy\/l9hvcebEomKBH\/lu4DxlF2QzWOAnx4\/5f6P2wg1x0XJN7\/sc3xW0nHCz7\/tt6cMRWguUeHvYaIoCorh85XG\/h9McAJLnmVpFQAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris4_small.png\u0022 alt=\u0022Screenshot of the new version of the blog\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022234.07874015748\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt wasn\u2019t really supposed for the New Year, but I\u2019ve had plenty of free time on my hands\nduring the holiday break, so here it is already: a brand new version of my blog \ud83e\udd73\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\/avris4_big.png\u0022 alt=\u0022Screenshot of the new version of the blog\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022468.15748031496\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADFklEQVRIiaWWz24cRRDGf9XTf2aXJSvHYCLlgEDiyCkQiRtXrhw4IfEaSBx4AA55hQiJIxIvwM0kAiQgcoQcEsmAZGJsrx2CPd6dnunisJ71zu7au0BJo\/7UXfVNTdVXvSu33nlXRUAVAGZxlhlEDAAxVgt9GoyMl+AcYgyqabIpIqgqMUZSE6Dnx1PxVuSCuLEG3377FiLCzs6vpKQcDgZzPrPYWkvIA945rHWE4HHO4pwnBE+WZTjrCN7hg8d7T\/DjNc9z5ONPPlXnHN57fLg4DC0cJoEhzOxN\/ALeO7IsQ0QufZpqTa\/TJiklndtdwfb3D8hDhjCiSjlVVeODZzQckeeBfr+Pnremadcq+F8lVMbI3tM9nHPEKqIITs4oa09KiTzkxBhRFJtZjDFsbLyMtXblDxVV\/U8VAkgpTVqhqgtbsKqpKqqKbYiavFSVlNLEYfppzqfXacL\/YyKCMQZbFEWLzBjTEqExZhKwTJRlWTIYHOH9eOyvr61N\/FbW0LKWNdW5qhvNPVXXNSenp+O4pIgRyjJyWnte7HVZfyFbWilzVSIXuAaUqiq589kdPr\/7BVUsAaWuUyvGiCCMK21EcJml37VYja12X4bNIq1cppPtBz+wu3WfJ99+zeDwoJXItBZbHChnwxLnw9LqANhlk9HSVyrpWUGrClMWk\/1pjmKkdLyQZYaTYU0sayrJKIaRrvdz\/rP40pYtsnRSIJpwGjk5Opw7FxHWruXk+fgWv36tg+t26PdyrHOtj2xL4qIjdrYt08pv7NHWPeKzP\/hrlBgmJZ4VxKOHbG0e8Mprb7Jx8\/UpclBN5z+4Sj8Y6lgRCQvvqtl3zV2hi4bu9+\/uUR7\/yYPdZ\/S6yvrNde5+uUmv2+HDj16C84RUlbIcTSpgTEZVFtS+T27m+RfhlTS0F2u+2nzM91s73Fjr8NYbN9jefc6j3QHvvf8Br55zjBMBRDAy\/l9hvcebEomKBH\/lu4DxlF2QzWOAnx4\/5f6P2wg1x0XJN7\/sc3xW0nHCz7\/tt6cMRWguUeHvYaIoCorh85XG\/h9McAJLnmVpFQAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris4_big.png\u0022 alt=\u0022Screenshot of the new version of the blog\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022468.15748031496\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt wasn\u2019t really supposed for the New Year, but I\u2019ve had plenty of free time on my hands\nduring the holiday break, so here it is already: a brand new version of my blog \ud83e\udd73\u003C\/p\u003E\n\u003Ch3\u003EWhy?\u003C\/h3\u003E\n\u003Cp\u003EWhere to start? I got increasingly annoyed by the old version.\nThe design started seeming boring and blunt.\nThe code started growing unstable.\nIt was using the \u003Ca href=\u0022\/projects\/micrus-v4\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-cogs\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Micrus framework\u003C\/a\u003E,\nwhich I \u003Ca href=\u0022\/blog\/how-and-why-i-ve-built-and-killed-a-php-framework\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-computer-speaker\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E stopped supporting\u003C\/a\u003E a year ago.\nIt was using \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Micrus-Assetic\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 Micrus Assetic\u003C\/a\u003E\n\u2013 an outdated method of asset management,\nwhich highly depended on the server configuration and binaries installed.\nThe deployments were \u201ciffy\u201d, to say the least.\nI was afraid of sending even small changes to the server, for fear something might blow up again.\nSome small things I didn\u2019t even notice were wrong: like still warning about Google Analytics tracking,\neven though I migrated to \u003Ca href=\u0022https:\/\/matomo.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 Matomo\u003C\/a\u003E ages ago.\u003C\/p\u003E\n\u003Ch3\u003EWhat changed?\u003C\/h3\u003E\n\u003Cp\u003EI decided to keep it simple. To go with a \u201cless is more\u201d approach.\nI\u2019ve removed soooo many features that just weren\u2019t useful enough.\u003C\/p\u003E\n\u003Cp\u003EI used to have an admin panel: except I didn\u2019t need any fancy editor,\nthe main content was written in an (enhanced) \u003Ca href=\u0022https:\/\/www.markdownguide.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 Markdown\u003C\/a\u003E anyway.\nSo for this version, I\u2019ve decided for a filesystem-based approach: I\u2019ve ditched the database completely,\nI don\u2019t need any ORM, I don\u2019t need an admin panel. I just have a bunch of \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/SUML\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 SUML\u003C\/a\u003E files\ntracked by GIT. Using \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Esse\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 Esse CMS\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EI used to have three language versions of the UI \u2013 but why?\nI don\u2019t think anyone really cared about not seeing the names of the categories in Polish,\nwhen most of recent my posts were in English anyway.\nSo now the posts are still available in the language(s) they were written in,\nbut I\u2019m no longer maintaining the multiple versions of the UI, or the features to filter content by language.\nWhat a relief!\u003C\/p\u003E\n\u003Cp\u003EI used to have a \u201crandom post\u201d box. I used to have tag clouds. I used to have an embedded Twitter timeline.\nI used to have the latest posts on the \u201cabout me\u201d page (really?). I used to have a link shortening feature\n(\u201davris.it\/l\/\u0026lt;whatever\u0026gt;\u201d) that I\u2019ve never used, not a single time.\nI used to have a separate controller and database fields to support redirects for legacy URLs from the even earlier version.\nI used to have database fixtures. I used to have a console command to export legacy comments to \u003Ca href=\u0022https:\/\/disqus.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 Disqus\u003C\/a\u003E.\nI used to have tooltips and popovers.\nAll gone now! \ud83d\ude0d\u003C\/p\u003E\n\u003Cp\u003EI replaced the infinite scroll with... just loading the whole page at once \ud83e\udd37\u200d\nIt\u2019s not that big for today\u2019s standards anyway \u2013 the heaviest list of posts is 113 KB of compressed HTML.\nInstead, I now lazy load images using the \u003Ccode\u003EIntersectionObserver\u003C\/code\u003E API.\nWay simpler than infinite scroll or pagination \u2013 which aren\u2019t really necessary with this amount of data.\u003C\/p\u003E\n\u003Cp\u003EOh, and the website is now using a fast an sleek \u003Ca href=\u0022https:\/\/symfony.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 Symfony\u003C\/a\u003E setup with an HTTP cache \ud83e\udd70\u003C\/p\u003E\n\u003Cp\u003EDesign-wise, I use the default \u003Ca href=\u0022https:\/\/getbootstrap.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 Bootstrap\u003C\/a\u003E theme,\nwith only minor changes of variables and minimal additional styling.\nThe main feature, obviously, are the tilted elements. That\u2019s enough to add some personality to the website,\nwithout making it overcomplicated.\nCompared to the previous version, it\u2019s way more contrasting, better tailored for wider screens and clearer.\u003C\/p\u003E\n\u003Cp\u003EOverall, 41090 (!) lines of code were removed:\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-3-4-diff_big.png\u0022 alt=\u0022424 files changed, 6711 insertions (+), 47801 deletions (-)\u0022 class=\u0022border\u0022 width=\u0022550\u0022 height=\u002289\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAFCAYAAAAt8E4LAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABbUlEQVQokZ2RTY4TQQyFP7uqKwlh0skIISSExBHYchPEATgVaxaciQVigRAw+emku6q6K2UWCYPYDBJePVnPz7I\/ef3slT1\/+YLcnzBtsDJSypmbdcv3r9+YzWesNi2xjwz9QN91pJgB4+GS\/\/L438I5hzaeVEZEhGpGe7tBqRy2B1SVWg1V+RNm18wHF\/6r\/vZ4EGqZMDPCLHDqjghwPBxRjNX6BhMh9pH93Y4nT28J8wXd\/siqXWIohsH5jGsaSimMKSMinKvRrleE4Nn+3LF4vKSWQhMCOV88ghHjyHm6kPFv3r2l3bTUanx8\/4G+O+GcEofEYrkg55FHyzkpjXin5JQQ58EqoopvLkc0zuGcAp7iJkIIDENizBnMQARBqNWotQKgqqgqItP9t\/yXT58RFXyYcTx0dPsDZoYIpBgB4w6wK6JpGu\/Zb3\/sQEAwEtB1ghiYGLGPmBlTzleyRhoGDLlOX5TZtSOAGL8AA7fCc1N6DsoAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris-3-4-diff_big.png\u0022 alt=\u0022424 files changed, 6711 insertions (+), 47801 deletions (-)\u0022 class=\u0022border\u0022 width=\u0022550\u0022 height=\u002289\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThere\u2019s nothing else in the (programming) world I love more than removing useless code!\u003C\/p\u003E\n\u003Cp\u003EDeployments are now stable, simple, reproducible and revertible, thanks to\n\u003Ca href=\u0022https:\/\/symfony.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 Symfony\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/webpack.js.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 Webpack\u003C\/a\u003E,\nlack of database (no db = no migrations),\nand most importantly my recent child: \u003Ca href=\u0022\/projects\/avris-deployer\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-cogs\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Avris Deployer\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4-deployer_big.png\u0022 alt=\u0022Console output of deployment\u0022 class=\u0022border\u0022 width=\u0022848\u0022 height=\u0022237\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAKCAYAAADcpvzeAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB1klEQVQ4ja2TMXPUMBCFvyfJdw6JyUDLpKOloOf\/\/w9mAqkokkDu7LP0KNZOLpmbpAAVlvbN0+767ZO+fflsgG4QhzujBK6F\/a8Luov3uE3U8UDfiYvznjbPgLi5\/olbA8T\/XPp6dWUJ1Jt6l0l9Q9tGe0jQhDZG2bgRcTFuggo2tD8JED5Am9JTYsBvFT\/BKZ4S6hv1NpPeNTwJbYSryGeGYtpDQimutjFFliVOvVFp1F2iG2bwUsSE2g2wAjRoYzyDSsSe9Yh5FsUN2iQ8iZaFxwSKZPU+BbnC\/Lvgw9OviVAIgouhGqQjfJmmX8FfrpL6aF1DDeKmQjbeJdSZep\/wlB6llXwk9nFncY7iEdtGKwcj6VE9a4kXjgXCJM+Qtku5tEiYQ1oyKJs8VMpQF\/uuJhZaax19n8UL4SUnsNOc4lm0fYIGrjG+NmaUQJ1Rt8y+b6RZeI7xvmpY\/4Op1S1QMVSFWsl4TNTbDDlwxnXwoG2LZNNrT1680fZJTgFI2xaj6mO3IQ+VdN5QZw43Ja6XMPj6ek6Z8mm91cxpTvnYf+KwHxk+XLJ\/2LEfd5wN53Ql8+P7dTxZwDZb9UzjiI9NvZh15YS3FlNj5GU\/4qzmjtvPOX8BswgOy6gNMP4AAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris4-deployer_big.png\u0022 alt=\u0022Console output of deployment\u0022 class=\u0022border\u0022 width=\u0022848\u0022 height=\u0022237\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EVersion 1 (\u201dSilva Idearum\u201d)\u003C\/h3\u003E\n\u003Cp\u003ESo, to finish this post, let me just quickly show you the four versions I\u2019ve been through so far:\u003C\/p\u003E\n\u003Cp\u003EMy first blog was called \u201cSilva Idearum\u201d (Latin for \u201cForest of ideas\u201d).\nIt was anonymous, spirituality-oriented, Polish-speaking, Joomla-running and with a \u201ctoo much\u201d design.\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris1-post_big.png\u0022 alt=\u0022Screenshot of the post page in version 1\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAGJUlEQVRIiS2UO49kZxGGn6rvdk736Z6+THt21pfF69sagYUsIECIhAjxL5BICIiQSEj4AyT8AmIiiEgXgQRItgAhC3vB9trMzM7Ozuz09O2cPt+FYLaSkkqvKqnnKfntL94uH58rg8mCz06\/yvok4k1h0AsLvmButxzdW3B4UOMOLMtux\/V6SW+Fq5j4bLOiDApfvz9jVNWYYnHF4kV4\/p8nKHtSdNjgmR7NSD5wcn1FbwzWWUosbG5a+rMnzCeLP9hHV4bZ6xOwR4yvN4zqPSmCN5F5UN585x7TqcebPV3j0Ww4S2fssDx8fMqTYpn3M\/78xy\/55Y++zzDMCOWIkjbE6hFSOtqLFcE4SjXAjGbMAxwMeh4cj3i+CqyWW\/J0zTx32LsP7jGZLoi9MkxbWhcZhinLizWz114nv3zElQ0Ym3FW8P2a98YLOHiF33zwa0LcIvWQeVjx17895N6rb+HNOSVH7h2\/RUlbar\/ExEgYvcR+d4M4gx8M6UOg7QY0s5cIuwva6y+xd195wG67IZcObYYIzwiaGNrAQTTsB4fYwYBQO3wVsKagqtgq8Kuf\/pzPv\/gUlxJvvPMyk4MRRg2npyfEPtGMDlAZIeMZOe4RqdCqQWPDrn3OZX+HVhJ+GJDhAp9W2O0msu96sjqaxUuM2sBhGPOstITNjnmj9NM5zXiM9w5VJZ99gvQbHsxG3K\/fwFWBv4vnal94LRjuD6fknHHZ0G5ajBRkdki2DTrosWkKN4Hd3pCMZ31zQx4echAcNkWDCyPscI7aEfZORTWsubM\/wZoJ86MxebHAhwYVQUTRyTcpWGK+hbeQ+bYqlELJGX0FcopYa2jUUdc1z59+QteuwVZIqqgpdJstlydnbDEU3bHwE6xBMDqAEnDWoIcv0w7HVPWI5maJEbDe4JxirENEEPEg4LktEUMpCTUBck+KHdlEVAXRQru5RNQhpsI5g0k91lasnn2MNY63H7zLo0cf8rTbYW0xEA1pF0kFqmmgV0+ZvYUZr6jiBicGNSBqoPTk0rO6WSMCIpBTRo2iLiBaiCnSOAMUIKNGKDlS8h41FSKC8TXNZErpr5Cy53ix4Pz0c+yiarjedCA99aTC1iNULNYUejth78Z4tXRtAjaIAESC91g\/wBpFbocgt2eDctsFKIJaj+hznHOU0kFZEsKUWf1f\/MKSVp8xn46ZTO9jTTVi3CvPrzqa+yPw1YvlmVDVZCJ9KpScUDUgDqGQU6HsVkQKooailpvLc549PWc2n7DbtjRNw9PHn7Ludrz3rW9DycS4J8anVBKZ3xlgdsLy4gLvGtquxYbaENOIsAewWBswKmQMJHDekzO07R4o5FzwzoMYJAREQVXo+45HH\/6Jf3\/wF8Jkwj8+PueH3\/saD3\/\/O4Z37\/L+d74LuaeoY992RHuCHnjCZol51uCzwWmDbUum626DOfZovyIJmDCh9IloE5VTmqa55SVnhAxiKCUjovT7Fms9fbfhfAOr88d88NEZunnCbHbM9OgQeWEjoohVri8umZgRuhuS1h2pGPZhjd13heRHCBGjYIwi6lABDYILFWgg5oxKIaf4gpmCtZa+7yg5UxB20TCcHfPuN95nefOQeLHk83+dQAkIGTUWRGhGr7KJheVKafwRaXzG5fUl5WyLPaoMZ9s9W23Q0QIzGCEFVBU1FuuHWDVQCsYqwgChEGNGVagHAyADhni9ptlfc\/lFZHB6SXA13DvAHhySzz8ipRYd3cG6Q+qmZfnsKdglySZyUxGGAVsVy2vn\/+Offo6++RWcH76wJWKMR42j37fc3KyBggDeO3JOGDWkXFAVVA0\/+PFPbuE3BvOzFhtb8voU2W+R5RkKZPGUcYPzd3B+w\/X1GjdsyO0TZDDCeh\/guuP+fIujoMYiqlDAqGKN4OsKZz0FEFEgUXKhlIJznhg7VC0xRiRHpF0S+x0xC+wVkRHN4BK1hl1vsH5IFRyD9oqzx2ckZ9l2icPjI6yaAcbXHBvYdlsiHU4NKSdEFZFISYbdboMYf2tgTrcvBqHv15RcEN0jYjBqiAxRGyj9mqI1g7omhxa9OWUwuUvrK0K6IXrP6NW7ZFdDUmLX8X\/09s8geltpKwAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris1-post_big.png\u0022 alt=\u0022Screenshot of the post page in version 1\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EVersion 2\u003C\/h3\u003E\n\u003Cp\u003EAfter coming out and becoming independent from my parents,\nI was finally able to put my name on my posts. New domain and a redesign was also in place.\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris2-home_big.png\u0022 alt=\u0022Screenshot of the homepage in version 2\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEQklEQVRIiZWWO2xcRRSGv3nd1+56d+21DY6xnYctIkAIRxGCCAGK6Hg1FFSICgloEAiJBikUFCkCDQUNLVJ6RKjpKJEQUhwLYYKVxHYSdm3f3bk7MxR3d+MkDlmmOpq5959zzv+f\/16xuroaqrUaIgQ6u7t8deEClWoVYyKiyJDnOQDGGJxzHD9xAiUlhy2lFMaYQ8\/GXJe0tZZOu02kBNZaGs0G9XoD7z2tVuuuC7z3dO0ecZSxc\/MGWhuKwqKkwjnPRK2OEBKtNZubm6ysrPzvjHS73WZxaoKF6QY\/\/7ZNllVozUwjEQghCCEghEBKydbNv\/nsm9d485W3WL\/6O9f+uk3e73D5yp\/YQvP5+19zcvE08\/PzLC8vjy4ZYowT6zPPnGR+QhFHGp1UiSODUZper0cABOC8J00SBIpqd4rrv3Y4Ov0Up559nnZ7h4n+T1z9Y41+J2CMptNu07UWrTVKStI0JYqi8To0u3CEONVIZWjEt9jZ2WF3bx9rLVmWkec5cZKQ7+8T6YhHry2RTR\/n1vU6353\/GELOS2fPcpNjFD1D+5823W6POI7Z292lUqkQxzEhhLs69qBYr6+vcWR+njipUTiNMYYkTZmamgKgXq+X1DUatG\/cYLMvqedbSK84c\/oNxETO3NIM3\/\/wLWdefhFtDEIKiqJPCIGiKJBSjk\/ZnkpY21gnMRUiAvn+HkJqCtvD2hKsKCxRFCMkzC1M0r29TdZMmHriSfTeL0w3Fec+eYflpx9Ha4W1Bc45jDFYa+n3++NTNp0ErDAECppxgzhOmJxsAiClJISADx6tNFprPv3iy3sgXh1FSik2NzeZm5tDaw1QVq31+JTVqkdRyR6ul2OdwBaO7e1tpJR474miaORBSkoQAu\/94DwAgRACUsqS3riGcw7vPVBaRbVaRQ6866GULZ1YZmvrOtb2SLUmTROiOB6MPGitEEKglCJ4TxCQRAnGGJSShHCnyiiKyFyOlALv79iFc26U0MOWWF1dDQc3Ll68yPTsDLE2MPCh0cNAGFA5rGy4vPcIIdjY2KBSqZSUC0Gj2RxbP8AlfS+wlJJKmrF2+TJiVFVASjWYGAGIUdXDylutFrVaDSkyarXagEZBYYvSj5QaKyP9oAMfAniP0XqkhyzLRiItEymtM4RAFMUANCdTNtavQAg0WjMkSUKlWhnhPlRDBykBcM7R7XZZWlq6L8mDAIcBOudoNpuc\/+hDlo\/MsfTcCxxZPE5zanKs7hzaoU6ngxCgtSHLspE2hokPrWC4N5wwhCBNEkIITCweI9QibrfbRDvbrPDfo34wvk9Dttej14vpdnvs75efkNJHPEKUehGD0VdK4ZwbdWl29hGq1Sqvv\/sB17Z2qJGzsPDY6J3DunofZYdRAZCm6ej\/RimFNqYc+wDeO6A0QiEE\/X5\/oKsS49yP62w7jcs7vH2qynszM2NT9i\/Q3AYk6KDr5QAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris2-home_big.png\u0022 alt=\u0022Screenshot of the homepage in version 2\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EVersion 3\u003C\/h3\u003E\n\u003Cp\u003EAs announced in \u003Ca href=\u0022\/blog\/brand-new-blog\u0022\u003E\u003Csvg class=\u0022icon\u0022\u003E\u003Cuse xlink:href=\u0022#light-computer-speaker\u0022\u003E\u003C\/use\u003E\u003C\/svg\u003E Brand new blog\u003C\/a\u003E\u2026\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris3-home_big.png\u0022 alt=\u0022Screenshot of the homepage in version 3\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u00221603.5\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAkCAYAAABmMXGeAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFE0lEQVRIia2Wy48cVxXGf+feenRVd0+P7Ywn47ESk4kTiEE8LEACsUECCQHZIRZs2CL+EZD4A9iyjmADUjYIgSJhQmyEIjBCKLKxsScT2zPdPT1Vdd8seqY1j3Y0SHybUl3V+e79zvnOqSt\/uPXnJEqBCKIUSmlaY8mLnKKsECVY4xCBhAAgMWBcoq5ylAgheJJ3xOAhRmT46udTMbpIUqCUJqsHqKIk74\/Iqj55URG9IwGZaBKgQ4QErmuwzmAOptj9Xdxsim8aMm8thfegFSEkwkGDdgGScOOlDWwUHh8U6GpEqTLq1FBoxdNH92mmewRriaYhNDOSDxAiKkWhmU7o9me4zqFUge6tcOO11\/jx975DayM2CNZYunaGFsHZjpgE0zZY0xF8IgaIzhFDQIorbySV5UiezyX3R+i8ABKfePllDlxkajwAKYR57qwlmJZoGnzXEJ0jeEM0Hcl2yDu33jsslELpjHklZF44USAgIoBASiQSpAQxklIixTB\/T4mUIqSEWGsTh0gpISKMx2OUUvT7fZRSADRNQwiBuq7RWh+FICKLuCOoI7LjKMsS7z2TyYQQAj\/76Y\/Ii4KpLdFZASLcfXCw2PA40vNPus9k\/ARFxmBlSDObsHH1JRKCEogxYnyilyuUUidO+lzSGOMJOUeYNJGVfk6KgZ2xY+NCMW+K88h3zuG9X3woInRdR6kszrQIifWRnhdmifzsKOg4fvm7P\/H+Bw8ZDGpsSGTlgO9++VO88sIQ0Zper7cgWIZs2eJf\/vEBv7\/9PvVwxJNpy3C4ws2tdTYv5uiQY42hqmtCCGeIRWS5\/GgNdZbTI3F11MPOxiTnSQeWzphDD5\/N+Qn5p+GN4fHjbRBFVVfM2pboLVlviODpug5IZFm+lHxpTp0x+K7BeU8vS2hvicFTDWu0koU\/T1f9Y3MavUNFj+86ullGWRSYtiN4RxRhMBgsSJdhKen33\/wmNz\/zOvPGn6994cbrdI1hY\/NFnm0\/ZOWFFxfGP42l5j+O4w3RHjSMLqwy29uhHFxckJ6OE2ttOlo8\/TxOehR8GsvadGmhmqbBWkuWZdR1jek66n6fe9v77E92WS0dXSzw2So3ro3Ol1M1GRP2JlRbW4QYefTMMNxP1FnFxitXmZnEWi+nypdFH5KezoleW6d34TIojVbwk7dm8M+\/8uFkk7d+8Vl8SEwPLMUoJzuvT4N3eGPIej3QBV+\/HpleGvF0\/AwRUAIJEJZ31VL5P\/\/NA+78a4x1kW\/cXOPbXxpQ1jfp5TmZVlwc5ljnIUUOB90CIrJcfq+5y9qzv3Otang1fZHB8FsE59FKePu3j7i7k4j+31zpwQ9\/8LUTpM+tfnvvNtu33+ajAtavXUZI9PsVdVVy7+EOt+48ZnfvXb56\/QpwkhSeY\/73bt\/h3v0HiGje+OQW6+uXsS4xGFQ4B+N9S1koRoOS4bBe\/js5bfq2bTFdh840\/f6A8XiKKCjzHKUVs\/0ZohSrq6torc9nfqXmIy8laI3n1+8+oSo1Lio2LxX856MZCWFrM\/KVT6+dT\/4f\/\/aE7d0O7yNbV\/p87volYoKqzGhaQ0QhApmCTKv\/vffj4U1EKYWIYIwhBI9SOb1eceIwHyv\/xK4iJ0bcfuvZHTdUVY+BS1wYlmdiz14xODt8rYv86p1HWBfZmwWezuD+TsuHu92y8JM5\/X9B0hynLNUQk8ZH0EoQSaR09AREKDMhy7IztQD4L+DGHxjr8QA8AAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris3-home_big.png\u0022 alt=\u0022Screenshot of the homepage in version 3\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u00221603.5\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris3-posts_big.png\u0022 alt=\u0022Screenshot of the list of posts in version 3\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADMElEQVRIib2WzW4cRRSFv1vV1T09f5AZx5EiJAiKWCDxIzZIkYxX7PCCBQs\/BO\/AM\/gV2PEEXrJha4UNwgpKVg6yzHg89sz0X1VdFh0bO1EyvaI2t\/vWUZ1T957WbYkxKhvW2dkZxhim0+kbe+fn54xGI4qixBjBOUdRFDjn8CGQuozZZcWDSY5zbhPVodR1vVHQ\/7gOE9XNek5mJQj0pGJ5tWCQ91gvL0mc4+EHH76BV1VCCAA0PhC852wtPNruv5NHRJCqqjYqqr3iIzhr6KUGAO89Ozs7nJyc3MHu7+9zdHTE8fHxnfze3h4HBwebqA6TTQgAX5c0vsFkGfPSMBmmiAinp6f8\/fLlHexiseCrjx\/z6P4nvDc2JLPf+fnXp8zn8y5UJCLyToCqkqYO5xJ6ec7YtBWirnkyGNO8P+VFYshDZOgjH7mM33qP+Wt7zmS6Yvb0CV989y02PGcTF0AnD5VlyeXlJaPRiMFgQJZlAGzvfsPsnxlfDvsISihLHnz+GT\/ee4F7\/gdJYbnYNfz5cAddf08Xrk4eqqqKEAJZlmFeVSjGSFk1BBVcYqgb2LrXx3vPxapmWSrjfkKIyrifYiV2EXTYqWViU3xUxll6k2+aBmugXC1Ra0mc4+oqkOc5qXimfUG1wpiUzBm8j91athEB+LoA76mqAS5CMsgREYL3eO9pmgYtCvr9Pnmeo6osLhaIEVSVusiYTCZdqLp5yDlH0zSEEIgilMslaZpiE9tG28brdgIYa1BVrDUoEFXZXJ+OX5mIMBwO7+RDCMQQKcsCaxPW6zXOJSRuiqq2LbUW7yMxKqgitwS\/VVAH0dgkJSI4KyS2PbSua9raCjFGjAjD4QgjgjEGY8yNZ4y1ncRAx5bF0KCqqDhiCIh7dQ9jSbMcRBABxdAWIyIIIq2HNEZQpcvQ7FSh69mUZdmdm\/70yzMu1p7pKOWq8BR1YPfTKT98vUXUiKgQNZKYTjQAbJz2twdlkrQHt97wRIWo\/3mwl7b5uq6p65per9e205guvx7wtll2beTX3733ADexbbdgrMFJ65lr3HK5ZLVaEVVJrGFr6\/7N\/usct5\/\/BSOPoERFJpF9AAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris3-posts_big.png\u0022 alt=\u0022Screenshot of the list of posts in version 3\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris3-post_big.png\u0022 alt=\u0022Screenshot of the top of the post page in version 3\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACrElEQVRIib2VTW7cRhBGX1V3s0nOUGNLTrIIggTeBYJhJSfwVQzoBr6FDpO1LxB4lUXuIMABpAiSrJnhX3d5IWlkw3ZIB0E+gADRLLJedX2slpyzMaGzszNUlYODg0+eXVxc0DQN222LqhBCYLvdEkJgTIkiRP6+7vhuvyKEMJXqtfR9Pwn0P+q1N5vm+evtWxChiJFmuZxT6b+SiODnBPoQcM6hqqzXa0SElBJFUdC27S2gGUMSDOXJ\/vKLCf9JZjYP6PDwkMvLyzmhHB8fc3JyQtu2mBl1veCPN7\/x8y8veLL\/\/eT7fg7112pz0zGMLWUsyTlTL35C\/WpyhwBmeehrZWJsc2bpHNkyz49+xcVyVnGzWnZfmbu7DDBVyIZgGJAAUUVEMBv4drVCnaMsy1tIs3k7NKdlT0MklzV7zlOpIgJ\/eqEaRp6iDNm4TCPv0shKlNXqEaqKquJDQICc8zygyQjgWb3EkiFApY7TsSfuNXRdy6M+sRChy5kuZX6MJaYFF9uEU3DdSB0dpZ+GgZkeerO+YnN9hRMhmTEWBU04IBQFv5+e4oeBDJjBD92WMRvdkInBURZCWTjIaZ6H5rTs5atXtG27W0t3CUWgKtxH8UdHR6gIhVdU4Go9MCZjVSlOp3dp1tFxfn7OOI6ICKq6q1REdt64H5Z1vaCoFqw7Y9snCicY8E3j0WmgeUeHmaHOoSKYGTFGvH+w3z1QzgnnPGZGPyaiV\/ox87gpUJ0302aZOqWEc+4WTJW265CuRZ2\/NQ6gqvR9T13XlHVkr1YEIQwj19fvKB8v\/pvf\/j5ZSpnlcgFAJUL+oG1mRlVVO+jNZkOMEYBYCk1Z74qZBPrc4odDzMxY1DXGg2fuUBB5mC+bzYamaQC4ubmh6zq8D7hYgUEd3Sff\/dz9e6J1Rd1KBbTbAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris3-post_big.png\u0022 alt=\u0022Screenshot of the top of the post page in version 3\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris3-post-end_big.png\u0022 alt=\u0022Screenshot of the bottom of the post page in version 3\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACD0lEQVRIia2VTW7bMBBG3wxJmaptpE4CFGgO0C56id46y+56ha56gaABEieWLIkzXeTPRZuatTsrShp8fPpmhhQzc\/bE1dUVqsrZ2dlv366vr1kul3Rdj6qQUqLrOlJKTKXQpBk\/bre8O21JKe3b6lKGYdgLtF6vCaqYP6S6OyKCu6Oq5JwREVR1n9ReoOi+l4ebmxsEMHdCCLg77k5QZSrl+R1A27asVquDaESEWJMYYwAEsYJqADfMQVSIO06JCCqHu+TudUA5t5gZzWxGk9IvJRORZzGAEKskX434JPi36PseM2MYBkopAKgq0zjyZj4nPUKaGTlnYtseDlTTQ22bEdHnTZ+ad9cpMyfGiJlRo\/kqUE1SKUaMSlvx58dOWlXJuq5jsVgwjuOjK9A0s5pz5d+BapJ6z+gotDExmqPANEB\/39M2gaCCilDcWeQjm7qm3jO2tCkxn0VUX6Zq0UYE2DX5mP6BypLN354TgjIWYxqcnAJNOvpU\/jNQTdLl12\/ENCPEwMnJyV9zL04zHy+WhwPVWPzlu7PZ3j8+3bKaJxAQhHU3MpYXjc+fzvnwfnEwkGy32+OK\/n\/jMtaM7t3dHapK0zTc9kZOAXi4XIsZQYVhclJ4mLSkSj8WFvllCGpDn5paRHhtrapIaOgnyCmgPoI7UzHERqxMqBheBnCnTFuiOv04sdls9urvrn8CnvD1+u2+X7sAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris3-post-end_big.png\u0022 alt=\u0022Screenshot of the bottom of the post page in version 3\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EVersion 4 (current)\u003C\/h3\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4-home_big.png\u0022 alt=\u0022Screenshot of the homepage in version 4\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u00221666\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAkCAYAAACJ8xqgAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEA0lEQVRIiY2Wz4scRRTHP1VdP3pmd2fdDSIkm7\/CeDC5aPAvEEHwIngSD168ePLi3T9CEFFEzFmQEBFFNqd48WwiyLgTd3p3pqu6uspDd+9sT3eyeXTxul\/xXr336lvfLnHr9huJS3Lz6IhlUbBcFqQUL08hhEQrhRCCBMRYE2NCa43RGmMN6t133sYYg7UGay2zvT2Ai+9mGKyxl2ytNhatFVJKhBDNiDH2MuzEOcf5asV6tSRGSGSkFNmf7TOdTjDGjLkhUkqDgCml0dHNPU+Uc258pa4EIdqSYD4\/wVpLnluUUmRZNvCTmz41wxiDUhn\/zv\/hwf2fkbILLJnN9jBG41zg6XnsLXqx+FhZAH8e\/8IfP90DNrYQamKMhDpis\/G2yLFyV2cLVmcF5X8nlMv5BXxi5ygg1OO9lNspA\/z2w5c8evgrk92MLz7\/DHd2CoDRikwpJloyndjRktXYKt88eMSP94955XCPxVnJh58GJkBZOqQUhDqiQkFuZgPf0YCHL1\/nrbt3yCc5mczoOpPntnXSSDFa8RDYY40OIeCc43RZ4JxrQe\/QSl58O+dx3iM++viTVLZG7zwpJVbrNWXp8JWnqirqOnIFnjcl\/378sGeYTqdYY1gWS25cv8GTv59gbVOqc47Dg0MWTxfcPDrir8ePx3rYb8ZqtW7xKFgWS0BQ1x3rCNblGhCcLBYIIQdHcQDslBJ5npNSajYkpQtIpJQ4ODggpUSMkRjjiwG7qioAsqyZViojb8v2zgMQY0TKobu4dfvNF2z3RrTWGKMx2mCMxlqDaflSfPX1t6khWNsj1bx9v0y+1liM0Ugpe6QKbPQ2H87nC8pyRWZ2uHY4I3sGgAESCa36Z0Nt71Ke1xi7jwDqUMEI53XSbVQvYJdqJ4Vz5FJRx0imRk\/mJsMWAc\/NcL+SrHRNSs1OXiVXZrhEotLV\/4423CDDAZAOMoWQkkxK6rq+IuBwxwZsMy8cJnlijL0TorVGaz0IYHS\/zwPYrFxAxEBq\/yVCCLTaBEokmqfRUoqLY+i9R333\/T3Ky5zWvXvft3mP77T3OOfxvsJXjQ4hNAm8+nr\/bvPS\/j46y1icnlLXAaU0QkCsGoekJLJOkJoatrs8AFpVlgghmWYRpSQxZQgBfmIb3BnI1hVG1\/g6UrhBwC0+9J61EIBAAImq7WVoV2zUeQlKaXZ2+iShPnj\/va2b1dYty2zZWrIw1pKNkcT2LhdFgQ9w7WCP5ToxmwhKn0BArgU+JIwSnJeJnXyIwwGwpzu7ZGYXgHXDpfgaQtv9zuZCc5PopGNsUZZlqqoK5xzl82DjPM432rffpe\/DzXuPeO3O3V7V0zxHZBJoACuAqsVYJyGEZ571\/wHlDJySzIsFTgAAAABJRU5ErkJggg==\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris4-home_big.png\u0022 alt=\u0022Screenshot of the homepage in version 4\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u00221666\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4-posts_big.png\u0022 alt=\u0022Screenshot of the list of posts in version 4\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADcklEQVRIiaWWz08kVRDHP+9n\/5gZdkFEgrBZ4wE18Wb8EcOiiRf\/BC\/GswlXjx688U9w5GSMx71hPJLswURijAc3JBrWhGGEZqaZ6ffKQ08PAzuQgJV06tv1rVevurpedav3PvpEBFAKRLgUBQhYa1BKATCqqtosNT8TA2nqiVHQWiMxAmCspaoqqqoixtpxek+lIITwk22CNcZpefLkY3q9HkdH\/xBi4Pi4+5LfNNYarHWkSYq1Bu893nuctSRpgrUWZy3OObz3JGPeJzUGtP3s081Lh8RfOiaexCeXtvF9s7i2JVO+tU1rjVJqopurTn62bqQoClRs6ndP6fcHFOcFxhheWViYbCIid8ZFUfxs\/08yABhLkj+gioLUkSeU3BED2Otlu6u0Uj\/T3mwUY0REJrqxX8cAIYTKlmVJHJ+E2zK\/jzT9M91P07jxaSTP86F1zl0hph365ZBuH6JAogJpcUK6tADjgH+dgtPgZUjOENduTda+KBRW1\/gigNUwn0UybzHG3PgQ9lZSQ8cMsNaSZRk8XJ5wu7u7bG9vz1y3s7PD\/sEhTgtp\/4R8cX7CbWxssLxcx5nV4PYmosFleYFSFxhj6qTG9m63y8HBwcyE9vf32dra4uFchyjC6Vkx4fb29iYJzSzC9caaxiLCoBwAijzPKc7PaeU5AKnSrDpPRxt6RuFDxETh3xhZWVrmmy++opetsTg34tHFb\/y4\/wtPnz2\/ca8G33rKtPWsrj0mSn2atYYqQhRhwVreSVvkRvN7p4UfjXh9UFJUgZFpsztcw6xn5B1D8ewt1tff5+3e98DLA\/FKhW5kgKqqCGFIiNAfgTOQWhDgzQ8\/4PPvvgVgUynGQwilFKuP4OvHP7By1KX994jDNzJ+Xdnkj3e\/vBJ\/VqvcOqkH5ZAXBXgdmQ\/n6Ln2ZfW04s\/nhxhjEIloXetOu8ODTouzkxOiqHFlK7TVmKxF5nPSNL0poae3Vsho8KNjFIpRK4eLISKRLM8BIUkSjNaEEHDO0Wq18N6hreVsOEJE0KrmkzSh7TXOufv3ENqy9NrKlV8MqHuIOCTPMgRhrjM3eV3OOUIItNtttNKIRASwxuL91Zl352NfVRUhDgkBiiF4C5mrGzz3htOzM4wxDAYlEiPaaF5dXMRaS1mWKBQxBrSxiBd8MvszMy3\/AclyutTtBlE0AAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris4-posts_big.png\u0022 alt=\u0022Screenshot of the list of posts in version 4\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4-post_big.png\u0022 alt=\u0022Screenshot of the top of the post page in version 4\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACVUlEQVRIib2Wz04bMRDGf+P1er2ABKrUC2ovPXLupapEi1SpT0DfgqfgoXqteu1DVOqhQfwvCoRge6aHJGSBQKIU9ZMsfzv+Zjy2x7srb999NANEwIwpBDDwvkJEAEg5j8w2Gp\/JgRgDqoZzDlMFoPKenDM5Z1RHwu6cIlBK+eYnwSbGLra333N+fs7BwSFFCycnpw90Xe4ceF8Tm4j3FSEEQgjU3tPEBu89tffUdU0IgWY8HpoRB5z\/tPNhKmjCVNgEmtBMbePnifPI1nS0I5tzDhG57SdtlPzsfoJ+v4\/oZP+WxOHREVqUto3EOGoAZnY74aK83+9\/98skMRgmcDUAzeoGognNiZwzV1dXOBG8QdXGWx\/rFOhjHMDf37ZFsBLDlIcAhAeap3YCQFUxszutlKK+lDJzsOv81IqWwaSuunXmnGNtbe3ap5QeFU3s+\/v79Hq9bsgHN3IePu7s8GV3d77QFsDW1pYB\/9T29vbMzExVb+PO4F\/dOKlugjP5\/4KfVyfPmdQicy11y5bFInO55wp0R3\/Pt3tJ5p2EX+RIvAhRHI1AFEcUoRZH5YSkymkM2E3i5ThUUuXajKEZGUgC1YKLWuhN\/cYHYtPSVhWtq6hFECA4x680ZLDaUkJic1hYdx7FuFFlqMpFyQxU2RD3fDX0OkbadoW28lyXzIsQGKoSXcUPTayvb6Cq\/Pzd43NcxczIalyWzCvXcpZu2AwNIjL3u+YfG+jyZMafUtAxv8iZG1MuS+EkZ8LxGSLClcFxSmxUFQNVFOiXQjbjevxfNA9\/AVXov5JBOanJAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris4-post_big.png\u0022 alt=\u0022Screenshot of the top of the post page in version 4\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4-post-end_big.png\u0022 alt=\u0022Screenshot of the bottom of the post page in version 4\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAARCAYAAAC1tw6GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAACx0lEQVRIiZ2Wy44cNRSGv2Mfu6qnJ5NZgMSKp2CDkAJIvBALFrwZy4gFQnkMFihCBLVGM9NdrrIPC1dXVV8nyS+V\/Nv++9x8a\/nm2x\/MABEwY4YABqoeEQGgH4Y6bHX+LAfaNlKK4ZzDSgHAqzIMA8MwUEoVLn2KQM75re6N7QeXePPmOzabDe\/f\/0MumQ8f\/jvRLblzgqrSNi2qSoyBGCNBlaZtUFWCKiHU8SbG2ja1VdVBf\/rx+ypojgUNzchTSoQQaJuG2ERUlVW7IgQlhkC7amnbFvUe7z3OecQJVgoiDucdr+\/upkoftwsMUvb1u4KHhwdKKYgIZrUSIJgVEMHMcAsntlh7o67lzc0NMUbMbArkDP9NXwoGYLfrKFawYtXFIjPvHEPOeO9ZtSuKGewdyVglIIQwBXoQ8BHXM2U7watXt+ScAZliKcWIMeC9n4zGGA+MX6nERa57Y8elXvZDCDjncM6RcwEBRQhB60kadaWUgyqc+5aaY5iZ0+fn54uCl5DzcNBfbtZj7r2f+KVVeXp6anW9Xl90mFLCjyfnU\/E5S2Zm6DXRcyr8u3nkqy\/vEXGkDI2Hbmz7Ak7AOxgyIIY6IQ2gHroBVlpPWp8heLgJ1xO5euy3A6QM6xeMfAq8my\/iYzw+Pv5+9ZR5mYMZCvz9AHdtzfyLdZ3fz6mbf\/fXBm4bKFbH79t5LpdaqUu4eg+5Razq4Ov7U81mV9+jbNCqcRtl1I2PHIdcZObHWwWYj\/05nDy4Z7DMfnZ+ym3kQr0e9thzMyPnXAM6vkHP3RulFFJKdCmRutp2XTeNdV0ipW5sa79L3aRNk2buz19PSoldt0N\/\/uXXyfB+IvU9KfX1zuh7tjmTS67ZjBU3myt4uA3H\/y0GeUziY5HzgP7x57uLghgCIYbJqXee1Pd47\/De0fcDpRRUFRFhu91+tPNzEJHyP7\/y5So+jfmBAAAAAElFTkSuQmCC\u0022 data-src=\u0022https:\/\/avris.it\/image\/avris4-post-end_big.png\u0022 alt=\u0022Screenshot of the bottom of the post page in version 4\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022464.5\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["programming","php","javascript","webpack","symfony","symfony encore","doctrine","orm","cms","esse","columnist","version","new year","blog","design","redesign"],"hasMore":true,"image":"https:\/\/avris.it\/image\/avris4_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris4_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4_mini.png\u0022 alt=\u0022Screenshot of the new version of the blog\u0022 width=\u0022240\u0022 height=\u0022117.03937007874\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt wasn\u2019t really supposed for the New Year, but I\u2019ve had plenty of free time on my hands\nduring the holiday break, so here it is already: a brand new version of my blog \ud83e\udd73\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris4_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4_mini.png\u0022 alt=\u0022Screenshot of the new version of the blog\u0022 width=\u0022240\u0022 height=\u0022117.03937007874\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EIt wasn\u2019t really supposed for the New Year, but I\u2019ve had plenty of free time on my hands\nduring the holiday break, so here it is already: a brand new version of my blog \ud83e\udd73\u003C\/p\u003E\n\u003Ch3\u003EWhy?\u003C\/h3\u003E\n\u003Cp\u003EWhere to start? I got increasingly annoyed by the old version.\nThe design started seeming boring and blunt.\nThe code started growing unstable.\nIt was using the \u003Ca href=\u0022\/projects\/micrus-v4.lite\u0022\u003E Micrus framework\u003C\/a\u003E,\nwhich I \u003Ca href=\u0022\/blog\/how-and-why-i-ve-built-and-killed-a-php-framework.lite\u0022\u003E stopped supporting\u003C\/a\u003E a year ago.\nIt was using \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Micrus-Assetic\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Micrus Assetic\u003C\/a\u003E\n\u2013 an outdated method of asset management,\nwhich highly depended on the server configuration and binaries installed.\nThe deployments were \u201ciffy\u201d, to say the least.\nI was afraid of sending even small changes to the server, for fear something might blow up again.\nSome small things I didn\u2019t even notice were wrong: like still warning about Google Analytics tracking,\neven though I migrated to \u003Ca href=\u0022https:\/\/matomo.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Matomo\u003C\/a\u003E ages ago.\u003C\/p\u003E\n\u003Ch3\u003EWhat changed?\u003C\/h3\u003E\n\u003Cp\u003EI decided to keep it simple. To go with a \u201cless is more\u201d approach.\nI\u2019ve removed soooo many features that just weren\u2019t useful enough.\u003C\/p\u003E\n\u003Cp\u003EI used to have an admin panel: except I didn\u2019t need any fancy editor,\nthe main content was written in an (enhanced) \u003Ca href=\u0022https:\/\/www.markdownguide.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Markdown\u003C\/a\u003E anyway.\nSo for this version, I\u2019ve decided for a filesystem-based approach: I\u2019ve ditched the database completely,\nI don\u2019t need any ORM, I don\u2019t need an admin panel. I just have a bunch of \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/SUML\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E SUML\u003C\/a\u003E files\ntracked by GIT. Using \u003Ca href=\u0022https:\/\/gitlab.com\/Avris\/Esse\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Esse CMS\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cp\u003EI used to have three language versions of the UI \u2013 but why?\nI don\u2019t think anyone really cared about not seeing the names of the categories in Polish,\nwhen most of recent my posts were in English anyway.\nSo now the posts are still available in the language(s) they were written in,\nbut I\u2019m no longer maintaining the multiple versions of the UI, or the features to filter content by language.\nWhat a relief!\u003C\/p\u003E\n\u003Cp\u003EI used to have a \u201crandom post\u201d box. I used to have tag clouds. I used to have an embedded Twitter timeline.\nI used to have the latest posts on the \u201cabout me\u201d page (really?). I used to have a link shortening feature\n(\u201davris.it\/l\/\u0026lt;whatever\u0026gt;\u201d) that I\u2019ve never used, not a single time.\nI used to have a separate controller and database fields to support redirects for legacy URLs from the even earlier version.\nI used to have database fixtures. I used to have a console command to export legacy comments to \u003Ca href=\u0022https:\/\/disqus.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Disqus\u003C\/a\u003E.\nI used to have tooltips and popovers.\nAll gone now! \ud83d\ude0d\u003C\/p\u003E\n\u003Cp\u003EI replaced the infinite scroll with... just loading the whole page at once \ud83e\udd37\u200d\nIt\u2019s not that big for today\u2019s standards anyway \u2013 the heaviest list of posts is 113 KB of compressed HTML.\nInstead, I now lazy load images using the \u003Ccode\u003EIntersectionObserver\u003C\/code\u003E API.\nWay simpler than infinite scroll or pagination \u2013 which aren\u2019t really necessary with this amount of data.\u003C\/p\u003E\n\u003Cp\u003EOh, and the website is now using a fast an sleek \u003Ca href=\u0022https:\/\/symfony.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Symfony\u003C\/a\u003E setup with an HTTP cache \ud83e\udd70\u003C\/p\u003E\n\u003Cp\u003EDesign-wise, I use the default \u003Ca href=\u0022https:\/\/getbootstrap.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Bootstrap\u003C\/a\u003E theme,\nwith only minor changes of variables and minimal additional styling.\nThe main feature, obviously, are the tilted elements. That\u2019s enough to add some personality to the website,\nwithout making it overcomplicated.\nCompared to the previous version, it\u2019s way more contrasting, better tailored for wider screens and clearer.\u003C\/p\u003E\n\u003Cp\u003EOverall, 41090 (!) lines of code were removed:\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris-3-4-diff_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris-3-4-diff_mini.png\u0022 alt=\u0022424 files changed, 6711 insertions (+), 47801 deletions (-)\u0022 width=\u0022240\u0022 height=\u002238.836363636364\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EThere\u2019s nothing else in the (programming) world I love more than removing useless code!\u003C\/p\u003E\n\u003Cp\u003EDeployments are now stable, simple, reproducible and revertible, thanks to\n\u003Ca href=\u0022https:\/\/symfony.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Symfony\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/webpack.js.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Webpack\u003C\/a\u003E,\nlack of database (no db = no migrations),\nand most importantly my recent child: \u003Ca href=\u0022\/projects\/avris-deployer.lite\u0022\u003E Avris Deployer\u003C\/a\u003E.\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris4-deployer_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4-deployer_mini.png\u0022 alt=\u0022Console output of deployment\u0022 width=\u0022240\u0022 height=\u002267.075471698113\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EVersion 1 (\u201dSilva Idearum\u201d)\u003C\/h3\u003E\n\u003Cp\u003ESo, to finish this post, let me just quickly show you the four versions I\u2019ve been through so far:\u003C\/p\u003E\n\u003Cp\u003EMy first blog was called \u201cSilva Idearum\u201d (Latin for \u201cForest of ideas\u201d).\nIt was anonymous, spirituality-oriented, Polish-speaking, Joomla-running and with a \u201ctoo much\u201d design.\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris1-post_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris1-post_mini.png\u0022 alt=\u0022Screenshot of the post page in version 1\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EVersion 2\u003C\/h3\u003E\n\u003Cp\u003EAfter coming out and becoming independent from my parents,\nI was finally able to put my name on my posts. New domain and a redesign was also in place.\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris2-home_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris2-home_mini.png\u0022 alt=\u0022Screenshot of the homepage in version 2\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EVersion 3\u003C\/h3\u003E\n\u003Cp\u003EAs announced in \u003Ca href=\u0022\/blog\/brand-new-blog.lite\u0022\u003E Brand new blog\u003C\/a\u003E\u2026\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris3-home_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris3-home_mini.png\u0022 alt=\u0022Screenshot of the homepage in version 3\u0022 width=\u0022240\u0022 height=\u0022400.875\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris3-posts_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris3-posts_mini.png\u0022 alt=\u0022Screenshot of the list of posts in version 3\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris3-post_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris3-post_mini.png\u0022 alt=\u0022Screenshot of the top of the post page in version 3\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris3-post-end_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris3-post-end_mini.png\u0022 alt=\u0022Screenshot of the bottom of the post page in version 3\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Ch3\u003EVersion 4 (current)\u003C\/h3\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris4-home_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4-home_mini.png\u0022 alt=\u0022Screenshot of the homepage in version 4\u0022 width=\u0022240\u0022 height=\u0022416.5\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris4-posts_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4-posts_mini.png\u0022 alt=\u0022Screenshot of the list of posts in version 4\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris4-post_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4-post_mini.png\u0022 alt=\u0022Screenshot of the top of the post page in version 4\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/avris4-post-end_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/avris4-post-end_mini.png\u0022 alt=\u0022Screenshot of the bottom of the post page in version 4\u0022 width=\u0022240\u0022 height=\u0022116.125\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E","words":694,"readTime":3,"lang":"en"}}},"projects\/micrus-v4":{"key":"projects\/micrus-v4","type":"article","published":true,"meta":{"createdAt":"2018-01-28T12:45:41+01:00","publishedAt":"2018-01-28T12:40:00+01:00","group":"micrus","links":[{"icon":"globe-europe","colour":"primary","url":"https:\/\/micrus.avris.it","displayUrl":null},{"icon":"brands gitlab","colour":"secondary","url":"https:\/\/gitlab.com\/Avris\/Micrus","displayUrl":null}],"category":"projects","subcategory":null,"slug":"micrus-v4"},"content":{"en":{"slug":"micrus-v4","title":"Micrus v4 \u2022 Beauty of simplicity","intro":"\u003Cfigure\u003E\n                \u003Cnoscript\u003E\n                    \u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus-demo_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022279.53757225434\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEgklEQVRIicWWy44bRRSGv1NdfbE9Y0+scTJBIQosgGwQICEWvAAb3oGX4hV4CRYsWCAuEkgIERCCEEKSGWcSz3hst12Xw6K6fZkJGyTgqOVqd50+9Z\/z\/12nRJMBoKocHx9js4yyqphOz+l293BuRZZllGXJ+fkZZdkhhgAC+\/0+ZVGwbSKCqq5HgOn9x2CUjsk5mzyEm7fpdDo45zg4OFj7ydc\/nTR365\/d4AiKrmc2znrFtzVtp7bChRAQbSKIIMZceikN9tNvHzVZtRGkvV4IcAeG6g423XFSaJJ50Zyy\/Z4imkZrshZMm5SuqyVyeaUX1UV3cekmEb2CtPVpqJRNXkgarTXbgJoZEaTxfve1Ef1uzlc\/j\/ngnVt8\/sMTnjxfbBaj1ckmKxE47HfwMRKjEiMU1hBUmdeeehV2C9mMqmC7uUkwRLbKmji7ddjj\/bvXAXjtpT5lnvHhe7f55LNfWPmwlfbm3cIaepUlaMQKRAMYwaAYIwy6lk4uzGq\/RaYkyhTszf0ilasJGJvggvDmnSHf3Dum3yt45eaAr348ZtArePuVIb8+Pmv8dxWcW6HKM0JstCFCjBEQoiohRHLJsC2l2nLWAHLBUUdDP1dqDw\/PA93c8PqhZfL0Kb52nM5gfjbB157xDLpVzlEvBfAq3Bs7vn9c40NEEbql4VrHMqgyEBhUBh8Ua2C+ijyfJ9qu7+csHIwvPMNuxqtDi3z08RdqAMQkLWkqcSZw93rJG7eukZtIgWe\/EDCG356teKlyfPfI8eWfnplLWhGgU2YMewXj6RIUjEDtGnpjREXxARZL3yqW3BgQMIDNTSvEVF4UFivP09pztnB8+fuMw\/2CvdJiM4OqMl04AKbLgI9KbpQoSbz1MvKwdolKTV9giMrKe0IjchCMQGYSzT5GUJLu3nq5h\/Pw5HzJn88WTOYOVYiAc46lD5yeC3lmyDJDlVvKPCMzwnLlGE8umNcritxSFJZeVXLQK7GZTV+ZQoxKCIaoEGLER8UAEUWi4pvqirHYUancO3c4Hxn2CoZ7JSjUPuBaZ92IPjOCaspouXL0OgXdKifGiI9wUS+Zzmuu7XW4PdonzwwhJBAtIEEQ02zDknqBUXDBI4t6+fc94H8wK+tdMfFts+w\/BaCqW1uHYtPAmpPT06c8ePCAo6MbIIaqLBmNRuvu3Qb5J\/fbz9ZgoqaTA01rXNSrLYVAWeT\/SiX+zmKMOB9ou6Hd9ONkIQTOziY450GVvCgYDodXAi0Wc+7f\/x3JLEVnnzu3jjCXDgchBMbjE55Pa4y1HFwbcuOgt3NO2vTA9N+mRtrSlh4aY9a9zTnHyckJVVUxGAzWi4kYBoMBe3t7O89baxfM84JBT4nVAf1etaZsG9Q2jetT0lZrJUZFYyTGyGqZTosXFxdMJpPNipIxz\/qcectv4xlLH7ey3nKr9lnmA0SETm6uzF9K46qoE7i0e9osw+YZIQSMMcxms3U1DJFunJI5IUZlcnpBCJHR6JA83+jQhprKXWCC4Y9TJSjcGfVecPRLBP0FlaGMv+a4vYsAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/micrus-demo_small.png\u0022 alt=\u0022\u0022 class=\u0022border-bottom\u0022 width=\u0022480\u0022 height=\u0022279.53757225434\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA framework doesn\u2019t have to be overly complex! Micrus provides you with a quick, easy and comfortable way of creating neatly structured, modular MVC websites, which can be easily extended and configured.\u003C\/p\u003E\n\u003Cp\u003EOur goal is to keep the framework as simple as possible, while offering all the most important features.\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\/micrus-demo_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022559.07514450867\u0022\u003E                \n                \u003C\/noscript\u003E\n                \u003Cspan class=\u0022hide-noscript\u0022\u003E\u003Cimg src=\u0022data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAUCAYAAADlep81AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEgklEQVRIicWWy44bRRSGv1NdfbE9Y0+scTJBIQosgGwQICEWvAAb3oGX4hV4CRYsWCAuEkgIERCCEEKSGWcSz3hst12Xw6K6fZkJGyTgqOVqd50+9Z\/z\/12nRJMBoKocHx9js4yyqphOz+l293BuRZZllGXJ+fkZZdkhhgAC+\/0+ZVGwbSKCqq5HgOn9x2CUjsk5mzyEm7fpdDo45zg4OFj7ydc\/nTR365\/d4AiKrmc2znrFtzVtp7bChRAQbSKIIMZceikN9tNvHzVZtRGkvV4IcAeG6g423XFSaJJ50Zyy\/Z4imkZrshZMm5SuqyVyeaUX1UV3cekmEb2CtPVpqJRNXkgarTXbgJoZEaTxfve1Ef1uzlc\/j\/ngnVt8\/sMTnjxfbBaj1ckmKxE47HfwMRKjEiMU1hBUmdeeehV2C9mMqmC7uUkwRLbKmji7ddjj\/bvXAXjtpT5lnvHhe7f55LNfWPmwlfbm3cIaepUlaMQKRAMYwaAYIwy6lk4uzGq\/RaYkyhTszf0ilasJGJvggvDmnSHf3Dum3yt45eaAr348ZtArePuVIb8+Pmv8dxWcW6HKM0JstCFCjBEQoiohRHLJsC2l2nLWAHLBUUdDP1dqDw\/PA93c8PqhZfL0Kb52nM5gfjbB157xDLpVzlEvBfAq3Bs7vn9c40NEEbql4VrHMqgyEBhUBh8Ua2C+ijyfJ9qu7+csHIwvPMNuxqtDi3z08RdqAMQkLWkqcSZw93rJG7eukZtIgWe\/EDCG356teKlyfPfI8eWfnplLWhGgU2YMewXj6RIUjEDtGnpjREXxARZL3yqW3BgQMIDNTSvEVF4UFivP09pztnB8+fuMw\/2CvdJiM4OqMl04AKbLgI9KbpQoSbz1MvKwdolKTV9giMrKe0IjchCMQGYSzT5GUJLu3nq5h\/Pw5HzJn88WTOYOVYiAc46lD5yeC3lmyDJDlVvKPCMzwnLlGE8umNcritxSFJZeVXLQK7GZTV+ZQoxKCIaoEGLER8UAEUWi4pvqirHYUancO3c4Hxn2CoZ7JSjUPuBaZ92IPjOCaspouXL0OgXdKifGiI9wUS+Zzmuu7XW4PdonzwwhJBAtIEEQ02zDknqBUXDBI4t6+fc94H8wK+tdMfFts+w\/BaCqW1uHYtPAmpPT06c8ePCAo6MbIIaqLBmNRuvu3Qb5J\/fbz9ZgoqaTA01rXNSrLYVAWeT\/SiX+zmKMOB9ou6Hd9ONkIQTOziY450GVvCgYDodXAi0Wc+7f\/x3JLEVnnzu3jjCXDgchBMbjE55Pa4y1HFwbcuOgt3NO2vTA9N+mRtrSlh4aY9a9zTnHyckJVVUxGAzWi4kYBoMBe3t7O89baxfM84JBT4nVAf1etaZsG9Q2jetT0lZrJUZFYyTGyGqZTosXFxdMJpPNipIxz\/qcectv4xlLH7ey3nKr9lnmA0SETm6uzF9K46qoE7i0e9osw+YZIQSMMcxms3U1DJFunJI5IUZlcnpBCJHR6JA83+jQhprKXWCC4Y9TJSjcGfVecPRLBP0FlaGMv+a4vYsAAAAASUVORK5CYII=\u0022 data-src=\u0022https:\/\/avris.it\/image\/micrus-demo_big.png\u0022 alt=\u0022\u0022 class=\u0022border\u0022 width=\u0022960\u0022 height=\u0022559.07514450867\u0022\u003E\u003C\/span\u003E\n                \n            \u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA framework doesn\u2019t have to be overly complex! Micrus provides you with a quick, easy and comfortable way of creating neatly structured, modular MVC websites, which can be easily extended and configured.\u003C\/p\u003E\n\u003Cp\u003EOur goal is to keep the framework as simple as possible, while offering all the most important features.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["container","dependency injection","doctrine","event dispatcher","framework","full-stack","micrus","mvc","php","routing","twig"],"hasMore":false,"image":"https:\/\/avris.it\/image\/micrus-demo_small.png","introLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/micrus-demo_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus-demo_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022139.76878612717\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA framework doesn\u2019t have to be overly complex! Micrus provides you with a quick, easy and comfortable way of creating neatly structured, modular MVC websites, which can be easily extended and configured.\u003C\/p\u003E\n\u003Cp\u003EOur goal is to keep the framework as simple as possible, while offering all the most important features.\u003C\/p\u003E","contentLite":"\u003Cfigure\u003E\u003Ca href=\u0022https:\/\/avris.it\/image\/micrus-demo_big.png\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E\u003Cimg src=\u0022https:\/\/avris.it\/image\/micrus-demo_mini.png\u0022 alt=\u0022\u0022 width=\u0022240\u0022 height=\u0022139.76878612717\u0022 loading=\u0022lazy\u0022\u003E\u003C\/a\u003E\u003C\/figure\u003E\u003C\/p\u003E\n\u003Cp\u003EA framework doesn\u2019t have to be overly complex! Micrus provides you with a quick, easy and comfortable way of creating neatly structured, modular MVC websites, which can be easily extended and configured.\u003C\/p\u003E\n\u003Cp\u003EOur goal is to keep the framework as simple as possible, while offering all the most important features.\u003C\/p\u003E","words":51,"readTime":null,"lang":"en"}}},"blog\/technology\/emojis-in-doctrine":{"key":"blog\/technology\/emojis-in-doctrine","type":"article","published":true,"meta":{"createdAt":"2017-05-25T19:08:08+02:00","publishedAt":"2017-05-25T19:03:00+02:00","group":null,"category":"blog","subcategory":"technology","slug":"emojis-in-doctrine"},"content":{"en":{"slug":"emojis-in-doctrine","title":"Emojis in Doctrine \ud83d\ude0e","intro":"\u003Cp\u003EPutting emojis in your database should be a piece of cake, right? You\u2019ve had enough trouble with encodings in your lifetime, and now that we have the blessing of \u003Cstrong\u003EUTF-8\u003C\/strong\u003E, you\u2019re always so careful to use it everywhere, so you\u2019d expect all the characters to just finally work out of the box, right?\u003C\/p\u003E\n\u003Cp\u003EWell, I did expect that. But I\u2019ve recently realised I can only put \u003Cem\u003Esome\u003C\/em\u003E emojis (like \u201c\u2764\ufe0f\u201d) in by blog posts. Most of them were just lost or replaced with \u201c?\u201d by MySQL... Oh, those damn encodings again!\u003C\/p\u003E\n\u003Cp\u003EBut fortunately the solution is quite simple.\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","content":"\u003Cp\u003EPutting emojis in your database should be a piece of cake, right? You\u2019ve had enough trouble with encodings in your lifetime, and now that we have the blessing of \u003Cstrong\u003EUTF-8\u003C\/strong\u003E, you\u2019re always so careful to use it everywhere, so you\u2019d expect all the characters to just finally work out of the box, right?\u003C\/p\u003E\n\u003Cp\u003EWell, I did expect that. But I\u2019ve recently realised I can only put \u003Cem\u003Esome\u003C\/em\u003E emojis (like \u201c\u2764\ufe0f\u201d) in by blog posts. Most of them were just lost or replaced with \u201c?\u201d by MySQL... Oh, those damn encodings again!\u003C\/p\u003E\n\u003Cp\u003EBut fortunately the solution is quite simple.\u003C\/p\u003E\n\u003Cp\u003EInstead of the \u003Ccode\u003Eutf8\u003C\/code\u003E charset, you need to use its superset, \u003Ccode\u003Eutf8mb4\u003C\/code\u003E. This one handles 4-byte characters and that\u2019s exactly what we need. We just have to make both the database and \u003Ca href=\u0022http:\/\/www.doctrine-project.org\/projects\/orm.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 Doctrine\u003C\/a\u003E use it.\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.phpmyadmin.net\/\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 phpMyAdmin\u003C\/a\u003E or \u003Ca href=\u0022https:\/\/www.adminer.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 Adminer\u003C\/a\u003E let you change the charset easily. Just go to edit table schema and switch the collation of relevant columns and tables to \u003Ccode\u003Eutf8mb4_unicode_ci\u003C\/code\u003E. Since you\u2019re going from \u003Ccode\u003Eutf8\u003C\/code\u003E to its superset, no data should become corrupted in the process. But just to play it safe, better create a \u003Cstrong\u003Ebackup\u003C\/strong\u003E before you start.\u003C\/p\u003E\n\u003Cp\u003EYou might encounter an error: \u201cSpecified key was too long; max key length is 767 bytes\u201d. That\u2019s because of some limitations of InnoDB regarding indices length. To make an index into \u003Ccode\u003Emb4\u003C\/code\u003E, you\u2019ll have to shorten the max length of a column to 191 (instead of max 255 for simple \u003Ccode\u003Eutf8\u003C\/code\u003E).\u003C\/p\u003E\n\u003Cp\u003EWhen it comes to Doctrine, you have to specify the collation and charset on the level of an entity\/table and on the level of the connection.\u003C\/p\u003E\n\u003Cp\u003EFor an entity, if you\u2019re using annotations:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs bash border\u0022\u003E\/**\n * @ORM\\Entity\n * @ORM\\Table(options={\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022collate\u0022\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022utf8mb4_unicode_ci\u0022\u003C\/span\u003E, \u003Cspan class=\u0022hljs-string\u0022\u003E\u0022charset\u0022\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022utf8mb4\u0022\u003C\/span\u003E})\n *\/\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr if you\u2019re using XML:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs xml border\u0022\u003E\u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\u003Cspan class=\u0022hljs-name\u0022\u003Eentity\u003C\/span\u003E \u003Cspan class=\u0022hljs-attr\u0022\u003Ename\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022Acme\\DemoBundle\\Entity\\User\u0022\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\u003Cspan class=\u0022hljs-name\u0022\u003Eoptions\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n        \u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\u003Cspan class=\u0022hljs-name\u0022\u003Eoption\u003C\/span\u003E \u003Cspan class=\u0022hljs-attr\u0022\u003Ename\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022charset\u0022\u003C\/span\u003E\u0026gt;\u003C\/span\u003Eutf8mb4\u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\/\u003Cspan class=\u0022hljs-name\u0022\u003Eoption\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n        \u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\u003Cspan class=\u0022hljs-name\u0022\u003Eoption\u003C\/span\u003E \u003Cspan class=\u0022hljs-attr\u0022\u003Ename\u003C\/span\u003E=\u003Cspan class=\u0022hljs-string\u0022\u003E\u0022collate\u0022\u003C\/span\u003E\u0026gt;\u003C\/span\u003Eutf8mb4_unicode_ci\u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\/\u003Cspan class=\u0022hljs-name\u0022\u003Eoption\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\/\u003Cspan class=\u0022hljs-name\u0022\u003Eoptions\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-tag\u0022\u003E\u0026lt;\/\u003Cspan class=\u0022hljs-name\u0022\u003Eentity\u003C\/span\u003E\u0026gt;\u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAs for the connection, go with:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs php border\u0022\u003E$conn = \\Doctrine\\DBAL\\DriverManager::getConnection(\n    [\n        \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027driver\u0027\u003C\/span\u003E   =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027pdo_mysql\u0027\u003C\/span\u003E,\n        \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027host\u0027\u003C\/span\u003E     =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027localhost\u0027\u003C\/span\u003E,\n        \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027user\u0027\u003C\/span\u003E     =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027user\u0027\u003C\/span\u003E,\n        \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027password\u0027\u003C\/span\u003E =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027password\u0027\u003C\/span\u003E,\n        \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027dbname\u0027\u003C\/span\u003E   =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027database\u0027\u003C\/span\u003E,\n        \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027charset\u0027\u003C\/span\u003E  =\u0026gt; \u003Cspan class=\u0022hljs-string\u0022\u003E\u0027utf8mb4\u0027\u003C\/span\u003E,\n    ],\n    \u003Cspan class=\u0022hljs-keyword\u0022\u003Enew\u003C\/span\u003E \\Doctrine\\DBAL\\Configuration()\n);\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr in \u003Ca href=\u0022https:\/\/symfony.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 Symfony\u003C\/a\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs yaml border\u0022\u003E\u003Cspan class=\u0022hljs-comment\u0022\u003E# app\/config\/config.yml\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-attr\u0022\u003Edoctrine:\u003C\/span\u003E\n    \u003Cspan class=\u0022hljs-attr\u0022\u003Edbal:\u003C\/span\u003E\n        \u003Cspan class=\u0022hljs-attr\u0022\u003Echarset:\u003C\/span\u003E  \u003Cspan class=\u0022hljs-string\u0022\u003Eutf8mb4\u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr in \u003Ca href=\u0022https:\/\/micrus.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 Micrus\u003C\/a\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode class=\u0022hljs yaml border\u0022\u003E\u003Cspan class=\u0022hljs-comment\u0022\u003E# app\/Config\/parameters.yml\u003C\/span\u003E\n\u003Cspan class=\u0022hljs-attr\u0022\u003Edatabase:\u003C\/span\u003E\n  \u003Cspan class=\u0022hljs-attr\u0022\u003Edriver:\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003Epdo_mysql\u003C\/span\u003E\n  \u003Cspan class=\u0022hljs-attr\u0022\u003Ehost:\u003C\/span\u003E \u003Cspan class=\u0022hljs-number\u0022\u003E127.0\u003C\/span\u003E\u003Cspan class=\u0022hljs-number\u0022\u003E.0\u003C\/span\u003E\u003Cspan class=\u0022hljs-number\u0022\u003E.1\u003C\/span\u003E\n  \u003Cspan class=\u0022hljs-attr\u0022\u003Edbname:\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003Edatabase\u003C\/span\u003E\n  \u003Cspan class=\u0022hljs-attr\u0022\u003Euser:\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003Euser\u003C\/span\u003E\n  \u003Cspan class=\u0022hljs-attr\u0022\u003Epassword:\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003Epassword\u003C\/span\u003E\n  \u003Cspan class=\u0022hljs-attr\u0022\u003Echarset:\u003C\/span\u003E \u003Cspan class=\u0022hljs-string\u0022\u003Eutf8mb4\u003C\/span\u003E\n\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd that would be it (hopefully). Enjoy your new emoji support! \ud83d\ude0a\u003C\/p\u003E\u003Csvg xmlns=\u0022http:\/\/www.w3.org\/2000\/svg\u0022 style=\u0022display: none;\u0022\u003E\u003C\/svg\u003E","tags":["charset","databse","doctrine","emoji","encoding","mysql","unicode","utf8"],"hasMore":true,"image":null,"introLite":"\u003Cp\u003EPutting emojis in your database should be a piece of cake, right? You\u2019ve had enough trouble with encodings in your lifetime, and now that we have the blessing of \u003Cstrong\u003EUTF-8\u003C\/strong\u003E, you\u2019re always so careful to use it everywhere, so you\u2019d expect all the characters to just finally work out of the box, right?\u003C\/p\u003E\n\u003Cp\u003EWell, I did expect that. But I\u2019ve recently realised I can only put \u003Cem\u003Esome\u003C\/em\u003E emojis (like \u201c\u2764\ufe0f\u201d) in by blog posts. Most of them were just lost or replaced with \u201c?\u201d by MySQL... Oh, those damn encodings again!\u003C\/p\u003E\n\u003Cp\u003EBut fortunately the solution is quite simple.\u003C\/p\u003E","contentLite":"\u003Cp\u003EPutting emojis in your database should be a piece of cake, right? You\u2019ve had enough trouble with encodings in your lifetime, and now that we have the blessing of \u003Cstrong\u003EUTF-8\u003C\/strong\u003E, you\u2019re always so careful to use it everywhere, so you\u2019d expect all the characters to just finally work out of the box, right?\u003C\/p\u003E\n\u003Cp\u003EWell, I did expect that. But I\u2019ve recently realised I can only put \u003Cem\u003Esome\u003C\/em\u003E emojis (like \u201c\u2764\ufe0f\u201d) in by blog posts. Most of them were just lost or replaced with \u201c?\u201d by MySQL... Oh, those damn encodings again!\u003C\/p\u003E\n\u003Cp\u003EBut fortunately the solution is quite simple.\u003C\/p\u003E\n\u003Cp\u003EInstead of the \u003Ccode\u003Eutf8\u003C\/code\u003E charset, you need to use its superset, \u003Ccode\u003Eutf8mb4\u003C\/code\u003E. This one handles 4-byte characters and that\u2019s exactly what we need. We just have to make both the database and \u003Ca href=\u0022http:\/\/www.doctrine-project.org\/projects\/orm.html\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Doctrine\u003C\/a\u003E use it.\u003C\/p\u003E\n\u003Cp\u003E\u003Ca href=\u0022https:\/\/www.phpmyadmin.net\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E phpMyAdmin\u003C\/a\u003E or \u003Ca href=\u0022https:\/\/www.adminer.org\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Adminer\u003C\/a\u003E let you change the charset easily. Just go to edit table schema and switch the collation of relevant columns and tables to \u003Ccode\u003Eutf8mb4_unicode_ci\u003C\/code\u003E. Since you\u2019re going from \u003Ccode\u003Eutf8\u003C\/code\u003E to its superset, no data should become corrupted in the process. But just to play it safe, better create a \u003Cstrong\u003Ebackup\u003C\/strong\u003E before you start.\u003C\/p\u003E\n\u003Cp\u003EYou might encounter an error: \u201cSpecified key was too long; max key length is 767 bytes\u201d. That\u2019s because of some limitations of InnoDB regarding indices length. To make an index into \u003Ccode\u003Emb4\u003C\/code\u003E, you\u2019ll have to shorten the max length of a column to 191 (instead of max 255 for simple \u003Ccode\u003Eutf8\u003C\/code\u003E).\u003C\/p\u003E\n\u003Cp\u003EWhen it comes to Doctrine, you have to specify the collation and charset on the level of an entity\/table and on the level of the connection.\u003C\/p\u003E\n\u003Cp\u003EFor an entity, if you\u2019re using annotations:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E\/**\n * @ORM\\Entity\n * @ORM\\Table(options={\u0022collate\u0022=\u0022utf8mb4_unicode_ci\u0022, \u0022charset\u0022=\u0022utf8mb4\u0022})\n *\/\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr if you\u2019re using XML:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E\u0026lt;entity name=\u0022Acme\\DemoBundle\\Entity\\User\u0022\u0026gt;\n    \u0026lt;options\u0026gt;\n        \u0026lt;option name=\u0022charset\u0022\u0026gt;utf8mb4\u0026lt;\/option\u0026gt;\n        \u0026lt;option name=\u0022collate\u0022\u0026gt;utf8mb4_unicode_ci\u0026lt;\/option\u0026gt;\n    \u0026lt;\/options\u0026gt;\n\u0026lt;\/entity\u0026gt;\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAs for the connection, go with:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E$conn = \\Doctrine\\DBAL\\DriverManager::getConnection(\n    [\n        \u0027driver\u0027   =\u0026gt; \u0027pdo_mysql\u0027,\n        \u0027host\u0027     =\u0026gt; \u0027localhost\u0027,\n        \u0027user\u0027     =\u0026gt; \u0027user\u0027,\n        \u0027password\u0027 =\u0026gt; \u0027password\u0027,\n        \u0027dbname\u0027   =\u0026gt; \u0027database\u0027,\n        \u0027charset\u0027  =\u0026gt; \u0027utf8mb4\u0027,\n    ],\n    new \\Doctrine\\DBAL\\Configuration()\n);\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr in \u003Ca href=\u0022https:\/\/symfony.com\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Symfony\u003C\/a\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E# app\/config\/config.yml\ndoctrine:\n    dbal:\n        charset:  utf8mb4\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EOr in \u003Ca href=\u0022https:\/\/micrus.avris.it\/\u0022 target=\u0022_blank\u0022 rel=\u0022noopener\u0022\u003E Micrus\u003C\/a\u003E:\u003C\/p\u003E\n\u003Cpre\u003E\u003Ccode\u003E# app\/Config\/parameters.yml\ndatabase:\n  driver: pdo_mysql\n  host: 127.0.0.1\n  dbname: database\n  user: user\n  password: password\n  charset: utf8mb4\u003C\/code\u003E\u003C\/pre\u003E\n\u003Cp\u003EAnd that would be it (hopefully). Enjoy your new emoji support! \ud83d\ude0a\u003C\/p\u003E","words":419,"readTime":2,"lang":"en"}}}}}