<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.vernizzis.it/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.vernizzis.it/" rel="alternate" type="text/html" /><updated>2025-12-30T09:34:55+00:00</updated><id>https://www.vernizzis.it/feed.xml</id><title type="html">Davide Vernizzi</title><subtitle>My random thoughts, mainly on software and computers.
</subtitle><author><name>Davide Vernizzi</name></author><entry><title type="html">Side projects at work</title><link href="https://www.vernizzis.it/Side-projects-at-work" rel="alternate" type="text/html" title="Side projects at work" /><published>2021-05-13T00:00:00+00:00</published><updated>2021-05-13T00:00:00+00:00</updated><id>https://www.vernizzis.it/Side-projects-at-work</id><content type="html" xml:base="https://www.vernizzis.it/Side-projects-at-work"><![CDATA[<p>As developers we are naturally pushed towards regularly have side projects; it shows curiosity for the world around us.</p>

<p>I really think that side projects bring a lot of value to companies. Employees feel freer. There are times when, as an employee, you might lose interest in what your company does. It’s normal; your company goals might not align with your personal development wishes; the technology that one client wants to use is not your favorite one; or you just might prefer to do something that is not currently possible in your company; sometimes your role in the company does not allow you to develop much anymore. In this case, a pet project is perfect: it allows you to work at your own pace, on something that you like, and with a technology you love.</p>

<p>But it doesn’t end there. You learn a lot of things when you have a side project; it allows you to experiment with new techniques, test new technologies, get used to part of the stack you normally don’t use. It gives you a window into the alien world of project management and forces you to exit your comfort zone and to try to really understand user needs.</p>

<p>Of course, most of the side projects will never succeed, even if some will do <a href="https://www.techinasia.com/gmail-happened-story">particularly well</a>. Many will never even be finished. It’s part of their nature. People lose interest in that particular topic, want to explore something else, experience a lack of time. It’s part of the curiosity that pushed us to start the side project, to move us towards something else. It’s perfectly normal, and it’s perfectly fine. The goal of a side project is not always to start a new job, but just to breathe fresh air. If you want to turn your side project into something more concrete, you need to put in a lot of extra work, not related to development. And the main point why you started a side project was to develop more.</p>

<p>Not allowing them is just so silly, not only because they don’t do any harm. Nor just because they bring a lot of value. But especially because it shows a control-freak attitude by the managers, which is super toxic. Preventing employees from having side projects is the perfect recipe for unhappy people in the company and, eventually, for people that leave the company.</p>]]></content><author><name>Davide Vernizzi</name></author><summary type="html"><![CDATA[As developers we are naturally pushed towards regularly have side projects; it shows curiosity for the world around us.]]></summary></entry><entry><title type="html">Apple is an acceptable evil</title><link href="https://www.vernizzis.it/Apple-is-an-acceptable-evil" rel="alternate" type="text/html" title="Apple is an acceptable evil" /><published>2021-04-29T00:00:00+00:00</published><updated>2021-04-29T00:00:00+00:00</updated><id>https://www.vernizzis.it/Apple-is-an-acceptable-evil</id><content type="html" xml:base="https://www.vernizzis.it/Apple-is-an-acceptable-evil"><![CDATA[<p>Today I was thinking about the concept of acceptable evil. An acceptable evil is something that is far from being ideal but considering all the alternatives and the context is acceptable. For example, for me Apple is an acceptable evil; note the for me part, for others, they are pure evil or pure perfection.</p>

<p>They do a lot of bad stuff, but given the context, for me, they are an acceptable evil. I’ll explain. I don’t like the way they are covered with secrecy, nor I don’t like that they do so much closed source. And for sure I hate the way they close their products, not just code-wise, but also how they prevent interactions between their products and others. Or the way they <a href="https://www.cnbc.com/2020/06/22/apple-wwdc-app-store-controversy.html">take advantage of developers with their 30% fee on the app store</a>. However, given I use a computer mainly for development and a phone mainly for everyday life, they achieve an acceptable balance.</p>

<p>My Mac just works. Since years. Day after day, OS update after OS update it just works. No matter where I go, who I need to interact with, I know I can rely on my computer, it very rarely disappoints me. I open it and it switches on, I close and it switches off, it behaves as expected. Many see a Mac as a luxury item, whereas I see it as a workhorse that can carry on the expected amount of work reliably for months before I must reboot it.</p>

<p>My iPhone is more or less on the other end of the spectrum. I only use it for very regular and plain usage. Making calls, texting, surfing the web, a few apps. What I expect from my phone is that it is always available. I don’t care about fancy features, crazy cameras, or unbelievable customisation, if it comes at the expense of reliability.</p>

<p>Of course, this is my set of requirements and my set of acceptable evilness. Many out there can’t stand a closed source computer and are happy to trade off reliability for openness. I deeply respect that. For them, a Dell running Ubuntu is their acceptable evil (I might be biased, I have used Linux for more than 10 years, both for personal stuff and professional life; my last experience with Linux dates to a few years ago, but at that time the system was far from being as reliable as a Mac. If things have changed, please drop me a line).</p>

<p>And finally, we often must face unacceptable evil. This happens every time a client or an employer forces us to use outdated software, chosen without considering us (the users!) and our needs. When this happens productivity is reduced and happiness goes away. And a sad and unproductive employee is someone who will leave the company, sooner or later.</p>]]></content><author><name>Davide Vernizzi</name></author><summary type="html"><![CDATA[Today I was thinking about the concept of acceptable evil. An acceptable evil is something that is far from being ideal but considering all the alternatives and the context is acceptable. For example, for me Apple is an acceptable evil; note the for me part, for others, they are pure evil or pure perfection.]]></summary></entry><entry><title type="html">The lazy programmer story</title><link href="https://www.vernizzis.it/The-lazy-programmer-story" rel="alternate" type="text/html" title="The lazy programmer story" /><published>2021-04-27T00:00:00+00:00</published><updated>2021-04-27T00:00:00+00:00</updated><id>https://www.vernizzis.it/The-lazy-programmer-story</id><content type="html" xml:base="https://www.vernizzis.it/The-lazy-programmer-story"><![CDATA[<p>A few days ago my boss told me that he was about to publish a job post where he was looking for a lazy developer. It might seem counterintuitive, but laziness is a quality for a developer. Or at least, it is according to some people. Laziness in the sense that a lazy programmer will always try to find the smart way of solving problems instead of the brute force that requires tens of lines of code.
As we are friends I decided to mock him a little and quickly translated the job post to English, bought a domain for $0.99, and published online the site <a href="https://www.lazyprogrammer.it">www.lazyprogrammer.it</a>. And since it was a gloomy Sunday afternoon, I decided to post it on Hacker News, as a marketing exercise; against all the odds the post made the home page of Hacker News and I had my 15 minutes of glory.</p>

<p><img src="https://www.vernizzis.it/assets/images/1*cQGu252BqWK2eMNLjwNLjg.png" alt="" /></p>

<p>Here are a couple of things I’ve learned that afternoon.</p>

<p><strong>It is difficult to understand irony online</strong>. I should have known this before. The whole stuff was a joke for me, I never meant to claim that a developer like the one described on the site is a good one. Most of the sentences have some background of truth, but they are highly exaggerated. I thought that it was obvious by the context, but clearly, it wasn’t, my bad. Many people commented saying that this reflected in poor company culture, and I agree. Was this not a joke, it would be wrong. The correct version is <a href="https://1x.engineer/">this one</a>.</p>

<p><strong>Hacker News sends a lot of traffic</strong>. Again, this was something I was expecting, but I managed to have a decent picture of it. During the few hours it was on the home page I got about 7K visits.</p>

<p><img src="https://www.vernizzis.it/assets/images/1*visEgRTatFi_PeeftKk9VA.png" alt="" /></p>

<p>In the next few days the number got up to around 9K.</p>

<p><img src="https://www.vernizzis.it/assets/images/1*t70v2rK82rPZMDiZoYElIw.png" alt="" /></p>

<p>What amuses me is that I keep getting traffic, around 500 visits this week, which is crazy for a site that has very little content. In case you are wondering, the analytics are provided by the fantastic <a href="https://www.goatcounter.com/">GoatCounter</a>.</p>

<p>All in all, it was a fun marketing exercise which took me one hour of work or so, made me discover the 1x Engineer site, and taught me important lessons for the future.</p>]]></content><author><name>Davide Vernizzi</name></author><summary type="html"><![CDATA[A few days ago my boss told me that he was about to publish a job post where he was looking for a lazy developer. It might seem counterintuitive, but laziness is a quality for a developer. Or at least, it is according to some people. Laziness in the sense that a lazy programmer will always try to find the smart way of solving problems instead of the brute force that requires tens of lines of code. As we are friends I decided to mock him a little and quickly translated the job post to English, bought a domain for $0.99, and published online the site www.lazyprogrammer.it. And since it was a gloomy Sunday afternoon, I decided to post it on Hacker News, as a marketing exercise; against all the odds the post made the home page of Hacker News and I had my 15 minutes of glory.]]></summary></entry><entry><title type="html">Browser fingerprinting</title><link href="https://www.vernizzis.it/Browser-fingerprinting" rel="alternate" type="text/html" title="Browser fingerprinting" /><published>2020-03-30T00:00:00+00:00</published><updated>2020-03-30T00:00:00+00:00</updated><id>https://www.vernizzis.it/Browser-fingerprinting</id><content type="html" xml:base="https://www.vernizzis.it/Browser-fingerprinting"><![CDATA[<p>Browser fingerprinting is a nasty technique 
for identifying and tracking an individual computer by collecting data of the configuration of a user’s browser and system when they visit a website.
The problem is  hideous because the fingerprint of a browser is computed using <a href="https://en.wikipedia.org/wiki/Browser_fingerprint">different technologies</a>, making it difficult to avoid across websites.</p>

<p>The usual usage of browser fingerprinting is to track users among different sessions, even when they disable cookies or clean browsers cache. It goes like this: a user visits a website which runs a fingerprinting script. The script computes the fingerprint, a long number, which is unique to that single browser, running on that compute, and stores it the website database. When the user visits again the site in a later session, the fingerprint is computed again and, since the user had previously visited the site, it matches the previous session. The website can then track the user among different sessions, even without the help of cookies.</p>

<p>Fingerprinting poses particular threats to privacy because it relies on information that cannot be easily reset by a user, and is difficult to avoid or mitigate.
The topic is under active investigation, both by <a href="https://arxiv.org/abs/1905.01051">academic research</a>, by the <a href="https://w3c.github.io/fingerprinting-guidance/">W3C</a>, and, of course, by private companies (see, for instance, <a href="https://fingerprintjs.com/">FingerprintJS</a>).</p>

<p>Many browsers claim to protect users (e.g. <a href="https://blog.mozilla.org/security/2020/01/07/firefox-72-fingerprinting/">Firefox</a> and <a href="https://brave.com/brave-fingerprinting-and-privacy-budgets/">Brave</a>), but an empiric test showed that it is very easy to overcome the protection of all the major browsers (Chrome, FF, Safari, Brave); theoretically it is possible to make use of advanced protection mechanisms (e.g. by disabling javascript), but this is unpractical for experienced user and almost impossible for common ones.</p>

<p>Browser fingerprinting is the natural result of ugly <a href="https://www.vernizzis.it/On-Business-Models">business models</a>, which convinced millions of people that online services can be free, and supported by just a “little bit of advertising”.</p>]]></content><author><name>Davide Vernizzi</name></author><summary type="html"><![CDATA[Browser fingerprinting is a nasty technique for identifying and tracking an individual computer by collecting data of the configuration of a user’s browser and system when they visit a website. The problem is hideous because the fingerprint of a browser is computed using different technologies, making it difficult to avoid across websites.]]></summary></entry><entry><title type="html">Remote working with kids</title><link href="https://www.vernizzis.it/Remote-working-with-kids" rel="alternate" type="text/html" title="Remote working with kids" /><published>2020-03-24T00:00:00+00:00</published><updated>2020-03-24T00:00:00+00:00</updated><id>https://www.vernizzis.it/Remote-working-with-kids</id><content type="html" xml:base="https://www.vernizzis.it/Remote-working-with-kids"><![CDATA[<p>Many people are now working from home and they have kids around. Like lots of others I’m doing this as well, but since in Italy we got hit by the COVID-19 earlier, I got a little bit used to the new situation, and I set up a few tricks to make my time more productive.</p>

<p>If you are reading this in the future, the pandemics is finally gone, you have a remote job, and you are thinking to keep your kids around, just don’t. Send them to school. As soon as possible. Kindergarten is great place where kids develop a lot of social skills.</p>

<p>However, if you can’t leverage schools (for instance you might be in a pandemic lockdown), then you must cope with the presence of the kids.</p>

<p>I’m not an education expert, nor a remote job veteran, but I’m doing this for 5 weeks in a 60-square-meeters two-bedroom flat with two kids aged 7 and 9; we don’t have a garden and the only desk is in the kids’ bedroom. It might look a pretty dire, but it’s working out quite well, so far. My experience says that:</p>

<ul>
  <li>
    <p>not all the hours are created equals. You will have bursts of concentration-time (when they have their activities or are engaged by something), and non-concentration-time (when kids are bored). Concentration time is often short (half an hour, maybe one hour) and randomly distributed among the days. I call these <em>focus-time</em> and <em>regular-time</em>. One of the most productive tools you have is to plan for the <em>focus-time</em> to happen when you need it the most;</p>
  </li>
  <li>
    <p>kids are smart people and they tend to understand things when you explain them. Also, they will understand what is going on anyway, so it is better to tell them why you are closed at home and why you cannot leave. Give purpose to what they are enduring. I used <a href="https://thespinoff.co.nz/politics/22-03-2020/siouxsie-wiles-toby-morris-what-does-level-two-mean-and-why-does-it-matter/">this</a> great drawing to visually make them understand why it is important to stay at home. Besides, this allowed me to teach them a little bit about exponential growth and why it is bad;</p>
  </li>
  <li>
    <p>in hard times everyone must take more responsibility than usual. Make the grow. The epidemics will probably leave a lot of mental issues once gone. However, it is not the end of the world. A lot of people are way worse and have endured a much harder time, both in the past and now. Tell them this gracefully, and help them to accept that sometimes shit happens; this knowledge will be a useful tool in the future;</p>
  </li>
  <li>
    <p>boredom is healthy, so let them get bored. Of course, two bored kids in a small house will not bring a lot of <em>focus-time</em>;</p>
  </li>
  <li>
    <p>when living a lot of time in a home, the mess will pile up quickly. Kids need to play, you need to work, there is lunch to prepare and dish to wash, house works, chores, and so on. And during and epidemics there is a bunch of extra cleaning to be done. There is no need to carry all of this burden on your adult shoulders alone, kids can deliver a lot of housework. You just need to understand what is safest to assign them. My rule of thumb is nothing that could kill or seriously harm them (they can make dad and mom a coffee, but they cannot bring us the steamy hot coffee), and nothing that could bring permanent damage to the house if not properly done (cleaning is fine, bleaching a delicate wooden floor it not). Everything else is OK. I also apply with them the rule I usually apply with very junior colleagues: I give them responsibility, but then I check the job after done. It’s my version of the 80/20 rule: I expect them to get the 80% right and 20% wrong, but, hey, 80% less of the work is not bad;</p>
  </li>
  <li>
    <p>you will be busy during the weekdays and free during the weekends. Especially if you don’t already work for a remote-first company, other people will expect you to be online when they are online, so you will have things to do Mondy to Friday 9 to 5. Ish (more on this later). But weekend days are perfect because since you are locked at home, they’re nowhere to go (and believe me, a whole weekend without anything to do is a nightmare). I have solved two problems at once, by inverting the week: I assume that during weekdays the kids are less busy with school, and I concentrate the school work on Saturday and Sunday;</p>
  </li>
  <li>
    <p>this pandemic is not normal, so normal rules do not apply. We are a very not-digital family, with very limited computer/iPad/television time, but these rules are being relaxed now. We agreed that they have half an hour of leisure digital before lunch and half an hour before dinner, but they usually exceed a little bit and it’s more one hour each time. We just were very clear that it’s not the norm, and things will go back to normal sooner or later. A refresh of this every now and then doesn’t hurt. Another change to the habits is that we are watching TV together more often; of course, family time (or digital school) do not deplete their digital leisure;</p>
  </li>
  <li>
    <p>without school to go, activities during the week and family trips at weekends, every day looks like the others, so try to establish some routine. For instance, wake them up quite early (but not too much). Insist that they follow the same routine as usual; we have breakfast together, then they brush their theet, they get dressed for school, they tidy their room and they go to school (aka they get their books ready, open the computer for the daily call with the teachers, and so on). Giving them a routine is also helpful to force you to follow one. I have noticed that this helps me a lot. It also makes it easier to develop tiny habits;</p>
  </li>
  <li>
    <p>being forced at home sucks for physical health. We have solved this by doing some house training. Of course nothing too cardio, but we try yoga, and some mild calisthenics stuff. Easy things, but it helps to kill some time, waste some energy and keep a little bit more fit, if possible. Note that while we enjoy outdoor activities, we have never been a super sporty family, so you might want to adjust the intensity here;</p>
  </li>
  <li>
    <p>I use scratch extensively: my kids can play videogames as long as they want (breaking the half-an-hour-before-meals rule) if they code it themselves. At the moment is more the 9-year-old coding and the 7-year-old giving suggestions and “beta testing” the product;</p>
  </li>
  <li>
    <p>I take advantage of my education: for instance one evening I have challenged the kids that I would be quicker than them to alphabetically sort books. Of course, I didn’t mention them I would use quicksort to be efficient. I use any occasion to explain to them things I know (I know quicksort). For instance, we saw a documentary about submarines and my youngest son got crazy about submarines, so this morning we ended up talking about sonar, echos, and waves;</p>
  </li>
  <li>
    <p>since the <em>focus-time</em> is a scarce resource and happens randomly, it is best to maximize its usage by preparing things in advantage. The idea is to prepare things (like professional cooks prepare all the ingredients) during the <em>regular-time</em>, and then assemble them during the <em>focus-time</em>. This way, you can maximize the few <em>focus-hours</em> per day, and somehow make use of the <em>regular-time</em>. Do silly things like cloning repos, running long commands, zero inboxing, and so on while the kids are around screaming and begging for attention, and do important things like reading books, and coding your side project while they are doing something themselves;</p>
  </li>
  <li>
    <p>since everyone is remote, everyone will be engaged in conference calls most of the time. I know that many of you write emails, surf the web, or do other things while in a call, so leverage on this and do housework and chores instead. Pretend you have low bandwidth, so that you can avoid video calls as much as possible, put some Bluetooth earphones and while people speak about unnecessary things, do necessary things like dishwashing. Remember to put yourself on mute;</p>
  </li>
  <li>
    <p>taking advantage of the <em>focus-time</em> is great, but being able to create <em>focus-time</em> when necessary is huge. My experience tells me that kids get quickly used to things, so don’t expect you can create an unlimited number of quite hours by just putting them in front of a screen (unless you want to create a dumb brainwashed kid, but this is very poor planning for the future). What I try to do is mix games, TV, videogames, and things to do; I prepare a bunch of work for the kids so that I deliver a high amount of things to do when in need of some <em>focus-time</em>. Spend a couple of hours downloading any type of content from the Internet, so you can deliver them with tens of drawing to colorize, of school sheets to fill.</p>
  </li>
</ul>

<p>All in all, so far my experience was much better than I expected. I found a few nice tricks to keep things going on and my kids are behaving wonderfully.</p>

<p>Let’s hope this nightmare ends soon. Best.</p>]]></content><author><name>Davide Vernizzi</name></author><summary type="html"><![CDATA[Many people are now working from home and they have kids around. Like lots of others I’m doing this as well, but since in Italy we got hit by the COVID-19 earlier, I got a little bit used to the new situation, and I set up a few tricks to make my time more productive.]]></summary></entry><entry><title type="html">Faceswap and regulation</title><link href="https://www.vernizzis.it/faceswap-and-regulation" rel="alternate" type="text/html" title="Faceswap and regulation" /><published>2019-09-03T00:00:00+00:00</published><updated>2019-09-03T00:00:00+00:00</updated><id>https://www.vernizzis.it/faceswap-and-regulation</id><content type="html" xml:base="https://www.vernizzis.it/faceswap-and-regulation"><![CDATA[<p>The <a href="https://github.com/deepfakes/faceswap">Faceswap manifesto</a> has a very interesting point when stating that “it was the first AI code that anyone could download, run and learn by experimentation without having a Ph.D.”.
I think it actually is a great thing that such a powerful technology is easily available to everyone. The technology itself was existing even before this open source project, so keeping it <em>reserved</em> to few skilled people did not prevent misusage
(especially because as most of IT technology, it comes with a low price to run, so the only barrier is often actually lack of knowledge).</p>

<p>Similarly to Kerckhoffs’s principle, <em>any given technolofy should be safe even if everything is public knowledge and everyone can use it</em>. In this prespective, the Faceswap project put a spotlight on this type of AI and allows us to reason about it.</p>

<p>The deepfakes are getting better and better and these open source projects show that they also are becoming easier and easier to use. In a few months even non-developers will be able to create fake videos where people say something they never said or do something they never did.
While this may sound terrifying (after all the fake news have been used to hijack elections), I think is a great news: people are willing to believe to crazy written text claiming some very hard-to-believe
stories, just because such articles and posts restate their vision of the world; with fake videos and audios the situation will quickly exacerbate.</p>

<p>It takes a lot of time and effort to debunk a fake news (an operation that after all does not serve the purpose, since believer will always believe and non-believers will not need the debunk), with deepfakes the situation will become even worse.
And, again, I think this actually is a good news, because this will push societies in the direction of regulation. We cannot expect that people will educated themselves to discern high quality news from bad ones; it will take years to bring such a change in society, but recent events proved that we do not have that much time.</p>

<p>To spread a fake news we need at least three different actors: the producer, the consumer and the infection medium.
As we have seen, consumer are not getting better at consuming, while producing fake news is getting easier.
The only other option we have is to act on the infection medium.</p>

<p>Contrary to the technology needed to create a fake news, running a massive social network that reaches milion of people is hard and expensive; therefore, only a few exists and, hence, are the perfect target for
regulation. Regulation may happen at different levels, but I think two can be especially effective: building a sound reputation system and creating a robuts ban mechanism.</p>

<p>A reputation system would ensure that it is actually expesive to inject the content in the system. Everyone who has used StackOverflow knows how hard it is to earn enough reputation to perform actions. The same should go with social media. Before being allowed to inject contents that can get viral, users should put some effort (e.g. must be active users, have commented, earned some favs); this would prevent bots and bot networks to operate efficiently and it would discourage wild behaviours of users (who wants to waste that hard-earned reputation?).</p>

<p>On the other hand, a robust ban mechanis would make it difficult for misusers to go back online. Such a mechanism must, of course, include a robust identification system, but a mobile phone 2 factor authentication should be more than enough: a regular person can afford to be banned only so many times if his identity is tied to a phone number.</p>

<p>Or course there are other ways of addressing this issue. For instance, it would be possible to embed a fake videos detector on videos upload, but this would trigger a race between deepfake and detector algoritms and would not solve other fake news propagation.</p>

<p>Given the current times I do not think that we will see any push in regulation from politics, nor from private companies. That is why I think that making a technology easy to use might trigger a change in this situation.</p>]]></content><author><name>Davide Vernizzi</name></author><summary type="html"><![CDATA[The Faceswap manifesto has a very interesting point when stating that “it was the first AI code that anyone could download, run and learn by experimentation without having a Ph.D.”. I think it actually is a great thing that such a powerful technology is easily available to everyone. The technology itself was existing even before this open source project, so keeping it reserved to few skilled people did not prevent misusage (especially because as most of IT technology, it comes with a low price to run, so the only barrier is often actually lack of knowledge).]]></summary></entry><entry><title type="html">On Signal</title><link href="https://www.vernizzis.it/On-Signal" rel="alternate" type="text/html" title="On Signal" /><published>2019-08-06T00:00:00+00:00</published><updated>2019-08-06T00:00:00+00:00</updated><id>https://www.vernizzis.it/On-Signal</id><content type="html" xml:base="https://www.vernizzis.it/On-Signal"><![CDATA[<p>In <a href="https://www.schneier.com/blog/archives/2019/08/facebook_plans_.html">this</a> article Bruce Schneier (quite rightly) complains about the security of WhatsApp next features and the possible impact on society. At some point, he claims that <em>“Of course alternatives like Signal will exist for those who don’t want to be subject to Facebook’s content moderation”</em> and in one of the comments a reader says that <em>“Deleting whatsapp and installing Signal (Or other) takes less than 5 minutes. There just isn’t any excuse anymore. Do it. Do it now. Right now”</em>.</p>

<p>Unfortunately, while technically this is true, from a user point of view, this is just not possible. We use communication tools to, well, communicate and too often we cannot choose the app we get to use, because it is imposed by others (e.g. the other recipients of the communication). In many parts of the world, WhatsApp is the de-facto communication medium, widely used and adopted, and it is just not possible to avoid it. Not to mention that Signal has a bullshitty <a href="/On-Business-Models">business model</a>.</p>

<p>The hard truth is that this type of applications must be regulated by wise politics and
not left to the greedy hands of super companies. Unfortunately, these days it is difficult to be optimistic about any wise politics coming to regulate behemots like Facebook or Google.</p>]]></content><author><name>Davide Vernizzi</name></author><summary type="html"><![CDATA[In this article Bruce Schneier (quite rightly) complains about the security of WhatsApp next features and the possible impact on society. At some point, he claims that “Of course alternatives like Signal will exist for those who don’t want to be subject to Facebook’s content moderation” and in one of the comments a reader says that “Deleting whatsapp and installing Signal (Or other) takes less than 5 minutes. There just isn’t any excuse anymore. Do it. Do it now. Right now”.]]></summary></entry><entry><title type="html">On business models</title><link href="https://www.vernizzis.it/On-Business-Models" rel="alternate" type="text/html" title="On business models" /><published>2019-08-01T00:00:00+00:00</published><updated>2019-08-01T00:00:00+00:00</updated><id>https://www.vernizzis.it/On-Business-Models</id><content type="html" xml:base="https://www.vernizzis.it/On-Business-Models"><![CDATA[<p>The <a href="https://www.bbc.com/news/technology-46747118">recent</a> <a href="https://www.mirror.co.uk/news/terrifying-reality-youtube-addiction-children-15243607">events</a> made me think a lot about business models.
Modern services are most of the time non sense business model; the vast majority is either free, or ads supported, or subscription based. All of these models are not OK for most of the cases.</p>

<ul>
  <li>
    <p><strong>free apps or services</strong> are just nonsense because building software costs a lot. No one can afford to create and develop quality software for free. If they claim to, you can be sure it is a scam to trick users into something (usually trading personal data for cats pictures) and should be avoided like the plague. Perfect examples are social networks;</p>
  </li>
  <li>
    <p><strong>ads-based</strong> are OK only when they do not play a key role in your life. Again, since it costs a lot to build them, they usually are designed to maximize users’ attention, which usually leads to unethical behaviour. Since it is difficult to tell whether the service provider are embracing bad practices I try to scarcely use them, and stop before they become too important in my digital routine. A good example is causal gameing: I do play ads-based games, but when I feel they are too engaging I usually stop using it;</p>
  </li>
  <li>
    <p><strong>subscription-based</strong> are fine, but I always try to be careful to choose services that can be suspended without issues; of course an exception is the professional services that can be seen like consumable costs of my activity. Perfect examples are Netflix or email. I avoid like the plauge the services that I cannot afford to lose in the case I cannot pay anymore for a certain period (mainly the password manager);</p>
  </li>
  <li>
    <p><strong>fixed-cost</strong> is the business model I prefer for applications that require limited support over time or that do not run on live services or use very lightway service. I like to pay for quality services knowing that it will sustain their business in a ethical way. Of course, since, not only it costs to make a software, but also to support it during time, this business model is not suitable for expensive service that must be alwyas online (like the email). Anything should fall in this category, except for the very few that belong to the subscription-based or the ones that are trivial enough to be ads-based.</p>
  </li>
</ul>

<p>Of course our society requires us to break some of the rules. For instance in Europe is almost impossible to live without WhatsApp, which is a nonsense free app with a stellar implementation and an outstaing service. As a developer I cannot help to admire its quality, but as a user I must be scared because their business model is shady, at best.</p>]]></content><author><name>Davide Vernizzi</name></author><category term="rants" /><category term="business models" /><summary type="html"><![CDATA[The recent events made me think a lot about business models. Modern services are most of the time non sense business model; the vast majority is either free, or ads supported, or subscription based. All of these models are not OK for most of the cases.]]></summary></entry><entry><title type="html">FizzBuzz in Clojure</title><link href="https://www.vernizzis.it/fizzbuzz-in-clojure" rel="alternate" type="text/html" title="FizzBuzz in Clojure" /><published>2019-01-01T00:00:00+00:00</published><updated>2019-01-01T00:00:00+00:00</updated><id>https://www.vernizzis.it/fizzbuzz-in-clojure</id><content type="html" xml:base="https://www.vernizzis.it/fizzbuzz-in-clojure"><![CDATA[<p>Taking inspiration from <a href="http://iolivia.me/posts/fizzbuzz-in-10-languages/">this</a> great post of fizzbuzz written in 10 languages, I have decided to write it in Clojure.</p>

<p>The basic version is pretty simple, and fairly similar to the on proposed in Haskell:</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">fb?</span><span class="w"> </span><span class="p">[</span><span class="n">c</span><span class="p">]</span><span class="w">
 </span><span class="p">(</span><span class="k">cond</span><span class="w">
  </span><span class="p">(</span><span class="nb">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">(</span><span class="nb">+</span><span class="w"> </span><span class="p">(</span><span class="nb">rem</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nb">rem</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="mi">5</span><span class="p">)))</span><span class="w"> </span><span class="s">"fizzbuzz"</span><span class="w">
  </span><span class="p">(</span><span class="nb">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">(</span><span class="nb">rem</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="mi">3</span><span class="p">))</span><span class="w"> </span><span class="s">"fizz"</span><span class="w">
  </span><span class="p">(</span><span class="nb">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">(</span><span class="nb">rem</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="mi">5</span><span class="p">))</span><span class="w"> </span><span class="s">"buzz"</span><span class="w">
  </span><span class="no">:else</span><span class="w"> </span><span class="n">c</span><span class="w">
 </span><span class="p">)</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="p">(</span><span class="nb">map</span><span class="w"> </span><span class="n">fb?</span><span class="w"> </span><span class="p">(</span><span class="nb">range</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="mi">16</span><span class="p">))</span><span class="w">
</span><span class="c1">; (1 2 "fizz" 4 "buzz" "fizz" 7 8 "fizz" "buzz" 11 "fizz" 13 14 "fizzbuzz")</span><span class="w">
</span></code></pre></div></div>

<p>A more interesting version is one that uses <a href="https://clojure.org/reference/lazy">lazy sequences</a>:</p>

<div class="language-clojure highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">fb?</span><span class="w"> </span><span class="p">[</span><span class="n">c</span><span class="p">]</span><span class="w">
 </span><span class="p">(</span><span class="k">cond</span><span class="w">
  </span><span class="p">(</span><span class="nb">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">(</span><span class="nb">+</span><span class="w"> </span><span class="p">(</span><span class="nb">rem</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nb">rem</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="mi">5</span><span class="p">)))</span><span class="w"> </span><span class="s">"fizzbuzz"</span><span class="w">
  </span><span class="p">(</span><span class="nb">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">(</span><span class="nb">rem</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="mi">3</span><span class="p">))</span><span class="w"> </span><span class="s">"fizz"</span><span class="w">
  </span><span class="p">(</span><span class="nb">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">(</span><span class="nb">rem</span><span class="w"> </span><span class="n">c</span><span class="w"> </span><span class="mi">5</span><span class="p">))</span><span class="w"> </span><span class="s">"buzz"</span><span class="w">
  </span><span class="no">:else</span><span class="w"> </span><span class="n">c</span><span class="w">
 </span><span class="p">)</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="p">(</span><span class="k">defn</span><span class="w"> </span><span class="n">lazyfb</span><span class="w"> 
 </span><span class="p">([]</span><span class="w"> </span><span class="p">(</span><span class="nf">lazyfb</span><span class="w"> </span><span class="mi">1</span><span class="p">))</span><span class="w">
 </span><span class="p">([</span><span class="n">n</span><span class="p">]</span><span class="w"> </span><span class="p">(</span><span class="nf">lazy-seq</span><span class="w"> </span><span class="p">(</span><span class="nb">cons</span><span class="w"> </span><span class="p">(</span><span class="nf">fb?</span><span class="w"> </span><span class="n">n</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="nf">lazyfb</span><span class="w"> </span><span class="p">(</span><span class="nb">inc</span><span class="w"> </span><span class="n">n</span><span class="p">)))))</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="p">(</span><span class="nb">take</span><span class="w"> </span><span class="mi">15</span><span class="w"> </span><span class="p">(</span><span class="nf">lazyfb</span><span class="p">))</span><span class="w">
</span><span class="c1">; (1 2 "fizz" 4 "buzz" "fizz" 7 8 "fizz" "buzz" 11 "fizz" 13 14 "fizzbuzz")</span><span class="w">
</span></code></pre></div></div>]]></content><author><name>Davide Vernizzi</name></author><category term="clojure kata fizzbuzz" /><summary type="html"><![CDATA[Taking inspiration from this great post of fizzbuzz written in 10 languages, I have decided to write it in Clojure.]]></summary></entry><entry><title type="html">A (even) better git log</title><link href="https://www.vernizzis.it/even-better-git-log" rel="alternate" type="text/html" title="A (even) better git log" /><published>2018-01-03T00:00:00+00:00</published><updated>2018-01-03T00:00:00+00:00</updated><id>https://www.vernizzis.it/even-better-git-log</id><content type="html" xml:base="https://www.vernizzis.it/even-better-git-log"><![CDATA[<p>TL;DR:</p>

<p>I have moved from a git GUI back to command line interface. I use the following commands to have a better git log that works in the shell and to have it as git alias.
It’s not as good as the GUI, but it’s good enough to see what’s going on in the repo.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ git log --graph --branches --oneline --decorate --pretty=format:'%C(yellow)%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)&lt;%an&gt;%Creset'

$ git config --global alias.lg "log --graph --branches --oneline --decorate --pretty=format:'%C(yellow)%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr) %C(bold blue)&lt;%an&gt;%Creset'"

$ git lg
</code></pre></div></div>

<p>Recently I have decided to move from SourceTree back to command line git. Don’t get me wrong, SourceTree is a great software, but where I work we use a set of scripts to manage git branches
so that concurrent features and versions are correctly related each other and, unfortunately, this is not 100% compatible with SourceTree. So to avoid errors due to using SourceTree instead of
our custom git commands, I have decided to go back to command line. However, after using SourceTree I got used to its visual display of the graph of commits. Fortunately, git has a built-in
mechanisms to show such a graph, the <code class="language-plaintext highlighter-rouge">--graph</code> flag, usually coupled with <code class="language-plaintext highlighter-rouge">--oneline</code>.</p>

<p>However, we can do better. I have found a post where it is shown a <a href="https://coderwall.com/p/euwpig/a-better-git-log">better git log</a>. The result is quite okay, but we can still make a
little better. I have found <a href="https://stackoverflow.com/questions/1841405/how-can-i-show-the-name-of-branches-in-git-log">this</a> StackOverflow answer that suggests to use <code class="language-plaintext highlighter-rouge">--decorate</code> to achieve
something similar. I still prefer the former version, however the latter has nicely coloured branches.</p>

<p><img src="https://www.vernizzis.it/images/Better-git-log.png" alt="Better git log" /></p>

<p>Better git log</p>

<p><img src="https://www.vernizzis.it/images/Even-better-git-log.png" alt="Even better git log" /></p>

<p>Even better git log</p>

<p>After searching a while, I have found that these branches are the decorations printed by <code class="language-plaintext highlighter-rouge">--decoration</code> and by <code class="language-plaintext highlighter-rouge">%d</code> in the custom git log. The post used <code class="language-plaintext highlighter-rouge">%C(yellow)%d</code> to color the decorations in
yellow, but if we use <code class="language-plaintext highlighter-rouge">%C(auto)%d</code> the decorations will be nicely colored, just as <code class="language-plaintext highlighter-rouge">--decoration</code> would do.</p>]]></content><author><name>Davide Vernizzi</name></author><category term="git" /><summary type="html"><![CDATA[TL;DR:]]></summary></entry></feed>