<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Luigi Maselli - I teach things to the computers and I try to fix humans problems]]></title><description><![CDATA[Thoughts about tech and code {}, mainly #javascript and #linux]]></description><link>https://grigio.org/</link><generator>Ghost 0.11</generator><lastBuildDate>Thu, 13 Oct 2022 13:38:54 GMT</lastBuildDate><atom:link href="https://grigio.org/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[How to create a mailserver selfhosted in 2022 . Tutorial Google GMAIL alternative]]></title><description><![CDATA[<p>In this post we'll make our own IMAP mail server via selfhosting. Yeah I know it's boring and won't receive a prize to do that.</p>

<p><img src="https://grigio.org/content/images/2022/10/photo_2022-10-13_14-10-35_cleanup--3-.jpg" alt="mail server stable diffusion">
This is a drawing how the <a href="https://www.youtube.com/watch?v=O21ik9lrAG0">Stable Diffusion</a> AI see the current email situation </p>

<h2 id="whyaselfhostedmailserver">WHY A SELF HOSTED MAIL SERVER ?</h2>

<ul>
<li><strong>Is still usefull an email</strong></li></ul>]]></description><link>https://grigio.org/how-to-create-a-mailserver-selfhosted-in-2022-google-gmail-alternative/</link><guid isPermaLink="false">53ed32b9-1014-479b-966c-7b871cd19fef</guid><category><![CDATA[imap]]></category><category><![CDATA[mail server]]></category><category><![CDATA[selfhosting]]></category><category><![CDATA[dkim]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Thu, 13 Oct 2022 13:03:11 GMT</pubDate><content:encoded><![CDATA[<p>In this post we'll make our own IMAP mail server via selfhosting. Yeah I know it's boring and won't receive a prize to do that.</p>

<p><img src="https://grigio.org/content/images/2022/10/photo_2022-10-13_14-10-35_cleanup--3-.jpg" alt="mail server stable diffusion">
This is a drawing how the <a href="https://www.youtube.com/watch?v=O21ik9lrAG0">Stable Diffusion</a> AI see the current email situation </p>

<h2 id="whyaselfhostedmailserver">WHY A SELF HOSTED MAIL SERVER ?</h2>

<ul>
<li><strong>Is still usefull an email in 2022?</strong> Yes, maybe not for casual chatting but as identity to register in online services. The phone number shuld be avoided.</li>
<li><strong>decentralization</strong>, mail is a <em>protocol</em> not a service. And it shouldn't be only in the hands of a few players. Anti SPAM rules, DKIM, DMARC, SPF, reverse DNS, TLS/SSL and <a href="https://cfenollosa.com/blog/after-self-hosting-my-email-for-twenty-three-years-i-have-thrown-in-the-towel-the-oligopoly-has-won.html">blacklists</a> can be an issue.</li>
<li><strong>Chat Control</strong>, CSS (Client Side Scanning and Server Side Scanning), CSAM,.. In EU are trying <a href="https://tutanota.com/blog/posts/eu-csam-scanning/">to force the service provider to scan</a> the user data to fight the children abuses, opening a huge backdoor for the user privacy. Like the GreenPass it won't solve the issue but it will limit the people lives.</li>
<li>Third because I can :) protonmail, tutanota and all the over "super secure privacy-oriented VPN easy TOR anonymous things" are just buzzwords. <strong>You can't really trust a service that manages your unencrypted data</strong>. End-to-End encryption can mitigate it but other data are still exposed </li>
</ul>

<blockquote>
  <p>At the end you'll get a working IMAP mail server <code>mail.greatreset.com</code> and <code>klaus@greatreset.com</code> and of course greatreset.com it'just an example domain.</p>
</blockquote>

<h2 id="prerequisites">PREREQUISITES</h2>

<ul>
<li>Knowledge: linux terminal, docker, docker-compose, DNS</li>
<li>$ A domain like <code>greatreset.com</code></li>
<li>$ Public IP (It means a VPS with 2Gb RAM (512Mb minimun)</li>
</ul>

<h2 id="letsstartaneasymailservertodeploydockermailserver">Lets start: an easy mailserver to deploy <code>docker-mailserver</code></h2>

<p>There are tons of mailservers webmail 1-click solutions, but this one is the most complete and flexible to deploy. It plays nice with reverse proxies and it doesn't take the full control of your machine.</p>

<h3 id="installation">Installation</h3>

<p>Please check the official <a href="https://github.com/docker-mailserver/docker-mailserver#get-the-tools">docker-mailserver</a> docs for the updated commands.</p>

<p>The following commands will provide the <code>docker-compose.yml</code> and a script helper <code>setup.sh</code>, very useful to avoid to change some configs manually.</p>

<pre><code class="language- bash">DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master'  
wget "${DMS_GITHUB_URL}/docker-compose.yml"  
wget "${DMS_GITHUB_URL}/mailserver.env"  
wget "${DMS_GITHUB_URL}/setup.sh"  
chmod a+x ./setup.sh  
</code></pre>

<p>My current <code>docker-compose.yml</code> looks like this:</p>

<pre><code>services:  
  mailserver:
    image: docker.io/mailserver/docker-mailserver:latest
    container_name: mailserver
    # If the FQDN for your mail-server is only two labels (eg: example.com),
    # you can assign this entirely to `hostname` and remove `domainname`.
    hostname: mail
    domainname: greatreset.com
    env_file: mailserver.env
    # More information about the mail-server ports:
    # https://docker-mailserver.github.io/docker-mailserver/edge/config/security/understanding-the-ports/
    # To avoid conflicts with yaml base-60 float, DO NOT remove the quotation marks.
    ports:
      - "25:25"    # SMTP  (explicit TLS =&gt; STARTTLS)
      - "143:143"  # IMAP4 (explicit TLS =&gt; STARTTLS)
      - "465:465"  # ESMTP (implicit TLS)
      - "587:587"  # ESMTP (explicit TLS =&gt; STARTTLS)
      - "993:993"  # IMAP4 (implicit TLS)
    volumes:
      - ./docker-data/dms/mail-data/:/var/mail/
      - ./docker-data/dms/mail-state/:/var/mail-state/
      - ./docker-data/dms/mail-logs/:/var/log/mail/
      - ./docker-data/dms/config/:/tmp/docker-mailserver/
      - /etc/localtime:/etc/localtime:ro
      # TODO: I NEED TO MIGRATE TO TRAEFIK 2
      # - /apps/traefik/config/acme.json:/etc/letsencrypt/acme.json:ro
      - ./docker-data/certbot/certs/:/etc/letsencrypt
    restart: always
    stop_grace_period: 1m
    environment:
      - SSL_TYPE=letsencrypt
      - SSL_DOMAIN=mail.greatreset.com
      - ENABLE_SPAMASSASSIN=1
      - SPAMASSASSIN_SPAM_TO_INBOX=1
      - ENABLE_CLAMAV=1
      - ENABLE_FAIL2BAN=1
      - ENABLE_POSTGREY=1
      - ENABLE_SASLAUTHD=0
      - ONE_DIR=1
    cap_add:
      - NET_ADMIN
    healthcheck:
      test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"
      timeout: 3s
      retries: 0

#   whoami:
#     image: docker.io/traefik/whoami:latest
#     networks:
#        - web
#     labels:
#        - "traefik.http.routers.whoami.rule=Host(`mail.greatreset.com`)"
#        - traefik.frontend.rule=Host:mail.greatreset.com
#        - traefik.port=80


# networks:
#   web:
#     external: true
</code></pre>

<p>You can specify other configurations in <code>mailserver.env</code> but I've left it as is.</p>

<pre><code>docker-compose up -d  
</code></pre>

<p>Will start the environment and with <code>docker compose logs -f</code> you can see what is going on. Some errors, for different reasons, aren't available there.</p>

<h3 id="myfirstemailaddressselfhosted">My first email address selfhosted</h3>

<pre><code>./setup.sh email add klaus@greatreset.com

# or if you prefer postmaster@greatreset.com
</code></pre>

<p>It will be asked to pick a password for the email account you are creating.</p>

<p>This is the most tricky part, hard to debug and you also need to wait the DNS propagation. </p>

<h2 id="somednsconfigurationsdkimspfdmarc">Some DNS configurations: DKIM SPF DMARC</h2>

<p>These steps aren't mandatory but if you don't do them your messages will go 100% in the Spam folder! So don't skip this part</p>

<p>Check the <a href="https://docker-mailserver.github.io/docker-mailserver/edge/config/best-practices/dkim/">official doc</a> for more details.</p>

<p>Now you need to add some records to your DNS, usually it's done via the domain provider web interface.</p>

<h3 id="dkim">DKIM</h3>

<p>You can also specify multiple domains comma separated.</p>

<pre><code>./setup.sh config dkim domain greatreset.com
</code></pre>

<p>Then you need to copy the DKIM key from your config and <strong>clean it by removing the " char</strong>.</p>

<pre><code>sudo cat docker-data/dms/config/opendkim/keys/greatreset.com/mail.txt  
</code></pre>

<p>Now you are ready to fill the form, just choose the right type like this:</p>

<p><img src="https://grigio.org/content/images/2022/10/dns.png" alt="DNS DKIM SPF DMARC"></p>

<p>Wait some minutes and check if the values are propagated via DNS</p>

<pre><code>$ dig mail._domainkey.greatreset.com MX | grep MX
; &lt;&lt;&gt;&gt; DiG 9.18.7 &lt;&lt;&gt;&gt; mail._domainkey.greatreset.com MX
;mail._domainkey.greatreset.com.    IN  MX
..
$ dig mail._domainkey.greatreset.com TXT
...
mail._domainkey.greatreset.com. 1787    IN  TXT "v=DKIM1; k=rsa; p=..."  
...
$ dig _dmarc.greatreset.com TXT
..
_dmarc.greatreset.com.    1699    IN  TXT "v=DMARC1; p=none"  
..
</code></pre>

<h2 id="httpsssltls">HTTPS SSL TLS</h2>

<p>Email communication, like HTTP, is unencrypted by default, so you need some valid certificates to obtain the HTTPS but for IMAP.</p>

<p>This can be complicated if your ports 80 443 are busy with a reverse proxy like nginx, caddy or traefik.</p>

<p>My advice is to use the <code>traefik v2</code> way (<a href="https://docker-mailserver.github.io/docker-mailserver/edge/config/security/ssl/#traefik-v2">here</a>) if you can otherwise the <code>letsencrypt</code> way (<a href="https://docker-mailserver.github.io/docker-mailserver/edge/config/security/ssl/#lets-encrypt-recommended">here</a>) is standalone <strong>but you need to stop the reverse proxy, change the docker-compose.yml during the verification to avoid the ports conflict</strong>.</p>

<p>Every 30 days you need to renew it via something like this command</p>

<pre><code>docker run --rm -it \  
  -v "${PWD}/docker-data/certbot/certs/:/etc/letsencrypt/" \
  -v "${PWD}/docker-data/certbot/logs/:/var/log/letsencrypt/" \
  -p 80:80 \
  certbot/certbot certonly --standalone -d mail.greatreset.com
</code></pre>

<h2 id="congratsnowyourmailserverisreadybutitsnotover">Congrats, now your mailserver is ready! But it's not over!</h2>

<p>Configure IMAP parameters in the Mail Client</p>

<pre><code>user: klaus@greatreset.com  
password: xxx

IMAP  
mail.greatreset.com SSL/TLS port 993

SMTP  
mail.greatreset.com SSL/TLS port 465  
</code></pre>

<p>You can pick a software like <a href="https://www.thunderbird.net/">Thunderbird</a> (desktop Linux, Mac, Windows) or <a href="https://k9mail.app/">K-9 Mail</a> (Android) or a Webmail like <a href="https://apps.nextcloud.com/apps/mail">Mail app in Nextcloud</a>.</p>

<p><img src="https://grigio.org/content/images/2022/10/Screenshot-from-2022-10-13-13-30-42-1.png" alt="IMAP mail client configured"></p>

<p>You can a more GMail -like experience enabling the "conversation extension" in Thunderbird.</p>

<h3 id="testyourconfiguration">Test your Configuration</h3>

<p>If you did everything correctly you should have at least 9.8/10 score in <a href="https://www.mail-tester.com/">www.mail-tester.com</a>, you can send a email message to it to see your score and debug if you missed some parts, you can open each section to see the details. Another tool is the <em>MX and DKIM checker online</em> (<a href="https://dnschecker.org/dkim-record-checker.php">here</a>)</p>

<p><img src="https://grigio.org/content/images/2022/10/Screenshot-from-2022-10-12-19-00-58.png" alt="mail test DKIM SPAM"></p>

<p>Congratulation redpilled, now you are outsite the Matrix and you need to mantain it by your self.</p>

<p>Be ready to do:</p>

<ul>
<li>updates</li>
<li>backups</li>
<li>and security brute force mitigations</li>
</ul>

<p>This IP from Vietnam <code>103.133.107.152</code> is already trying a brute force attack to find an OpenRelay. Good luck with the firewall!</p>

<pre><code>Oct 13 11:52:13 mail postfix/submission/smtpd[420557]: connect from unknown[103.133.107.152]  
Oct 13 11:52:13 mail postfix/submission/smtpd[420557]: SSL_accept error from unknown[103.133.107.152]: lost connection  
Oct 13 11:52:13 mail postfix/submission/smtpd[420557]: lost connection after STARTTLS from unknown[103.133.107.152]  
Oct 13 11:52:13 mail postfix/submission/smtpd[420557]: disconnect from unknown[103.133.107.152] ehlo=1 starttls=0/1 commands=1/2  
Oct 13 11:52:14 mail postfix/postscreen[420688]: CONNECT from [103.133.107.152]:30261 to [172.31.0.2]:25  
Oct 13 11:52:14 mail postfix/postscreen[420688]: HANGUP after 0 from [103.133.107.152]:30261 in tests before SMTP handshake  
Oct 13 11:52:14 mail postfix/postscreen[420688]: DISCONNECT [103.133.107.152]:30261  
Oct 13 11:52:14 mail postfix/postscreen[420688]: CONNECT from [103.133.107.152]:30284 to [172.31.0.2]:25  
Oct 13 11:52:20 mail postfix/postscreen[420688]: PASS NEW [103.133.107.152]:30284  
Oct 13 11:52:20 mail postfix/smtpd[420709]: connect from unknown[103.133.107.152]  
Oct 13 11:52:20 mail postfix/smtpd[420709]: NOQUEUE: reject: RCPT from unknown[103.133.107.152]: 554 5.7.1 &lt;irdi33@yahoo.com&gt;: Relay access denied; from=&lt;irdi33@yahoo.com&gt; to=&lt;irdi33@yahoo.com&gt; proto=SMTP helo=&lt;win-oy0k2ahb8s6.domain&gt;
</code></pre>

<p>
But the <code>fail2ban</code> provided already is doing a great job</p>

<pre><code>root@mail:/# zgrep 'Ban' /var/log/fail2ban.log*  
2022-10-12 18:58:10,978 fail2ban.actions        [729]: NOTICE  [dovecot] Ban 2.56.58.89  
2022-10-12 18:58:12,580 fail2ban.actions        [729]: NOTICE  [postfix-sasl] Ban 2.56.58.89  
2022-10-12 23:34:20,228 fail2ban.actions        [729]: NOTICE  [dovecot] Ban 58.246.96.36  
2022-10-12 23:34:21,391 fail2ban.actions        [729]: NOTICE  [postfix-sasl] Ban 58.246.96.36  
2022-10-13 11:52:41,469 fail2ban.actions        [729]: NOTICE  [dovecot] Ban 103.133.107.152  
2022-10-13 11:52:42,876 fail2ban.actions        [729]: NOTICE  [postfix-sasl] Ban 103.133.107.152  
</code></pre>

<blockquote>
  <p>Se sei interessato al tema del selfhosting, di come farti il cloud in casa, su <strong><a href="https://techonsapevole.gumroad.com/l/pggGPy">Techonsapevole Academy</a></strong> altri <a href="https://t.me/techonsapevole/744">video di approfondimento</a>.</p>
</blockquote>]]></content:encoded></item><item><title><![CDATA[Chiavetta USB o Hardisk SSD allo stato solido ? E quanto durano?]]></title><description><![CDATA[<p>Memorie USB, dischi USB, dischi USB fatte da memorie USB (raid microsd), USB2.0, USB3.0, le combinazioni possibili sono quasi infinite e onestamente non è immediato scegliere quello che può fare al caso nostro.</p>

<p><img src="https://grigio.org/content/images/2022/04/photo_2022-04-16_10-56-20.jpg" alt="chiavetta USB vs sdd usb + usb to sata adapter"></p>

<p>In questo post vediamo in generale, quali riflessioni fare e quali sono i pro e</p>]]></description><link>https://grigio.org/untitled-4/</link><guid isPermaLink="false">8b138981-80b2-44d6-956c-404f1ebfe016</guid><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Sat, 16 Apr 2022 08:58:29 GMT</pubDate><content:encoded><![CDATA[<p>Memorie USB, dischi USB, dischi USB fatte da memorie USB (raid microsd), USB2.0, USB3.0, le combinazioni possibili sono quasi infinite e onestamente non è immediato scegliere quello che può fare al caso nostro.</p>

<p><img src="https://grigio.org/content/images/2022/04/photo_2022-04-16_10-56-20.jpg" alt="chiavetta USB vs sdd usb + usb to sata adapter"></p>

<p>In questo post vediamo in generale, quali riflessioni fare e quali sono i pro e contro delle varie soluzioni.</p>

<h2 id="principalidifferenzepratichetramemorieusbeharddiskusb">Principali differenze pratiche tra memorie USB e harddisk USB</h2>

<p><img src="https://grigio.org/content/images/2022/04/Screenshot-from-2022-04-15-15-13-54.png" alt="microsd raid"></p>

<ul>
<li><p><strong>prezzo</strong>: tendenzialmente le memorie USB (a chiavetta) sono più economiche perchè più semplici.</p></li>
<li><p><strong>velocità di scrittura</strong>: tendenzialmente i dischi SSD USB hanno una velocità maggiore (anche <a href="https://grigio.org/chinese-ssd-benchmark/">340Mb/s</a>) rispetto le chiavette.</p></li>
<li><p><strong>scritture simultanee</strong>: tendenzialmente i dischi SSD supportano meglio le scritture multiple. Significa che se dovete installare sopra un sistema operativo e non singoli file, i dischi SSD funzionano meglio </p></li>
<li><p><strong>durata / longevità / diagnostica</strong>: i dischi SSD, a differenza delle memorie, hanno a livello hardware <a href="https://en.wikipedia.org/wiki/S.M.A.R.T.">un tool chiamato S.M.A.R.T</a> che mostra diversi parametri che mostrano lo stato di usura, blocchi danneggiati,.. questo significa che possiamo "predirre" se il dispositivo potrebbe rompersi a breve e quindi sostituirlo prima che il danno accada. </p></li>
</ul>

<h2 id="lamagiadelfreezer">La magia del freezer</h2>

<p>Ultimamente ho fatto dei test con un vecchio SSD da 60Gb con più di 4 anni anni di utilizzo 24h/7 e ho notato un fenomeno che mi capitava col modem 56k, ovvero nessun problema con file sotto il giga, ma oltre la temperatura del dispositivo si surriscalta e si impalla.</p>

<p>Un hack che "risolve" il problema è metterlo in freezer per una decina di minuti, dopodichè possiamo riprendere con delle scritture impegnative. Ovviamente si tratta di un dispositivo da buttare o da tenere per situazioni non troppo importanti.</p>

<p><img src="https://grigio.org/content/images/2022/04/Screenshot-from-2022-04-14-19-02-08.png" alt="smart tool autodiagnostica"></p>

<blockquote>
  <p>Se sei interessato al tema del selfhosting, di come farti il cloud in casa, su <strong><a href="https://techonsapevole.gumroad.com/l/pggGPy">Techonsapevole Academy</a></strong> altri <a href="https://t.me/techonsapevole/516">video di approfondimento</a>.</p>
</blockquote>]]></content:encoded></item><item><title><![CDATA[Accedere ai propri server LAN e bypass CG-NAT. Wireguard VPN site-to-site + VPS tunnel]]></title><description><![CDATA[<p>L'obbiettivo di questo post è accedere ai propri servizi di smart home (es. <a href="https://www.youtube.com/watch?v=D1f5eMNsR-A">Home Assistant</a>), NAS, telecamere di sicurezza, tramite Wireguard VPN.. all'interno della propria rete domestica (LAN).</p>

<p><img src="https://grigio.org/content/images/2022/04/Screenshot-from-2022-04-06-11-54-25.png" alt=""></p>

<p>Questa operazione con una connessione internet ADSL è abbastanza semplice, avendo un ip pubblico dinamico.</p>

<ol>
<li>Si <strong>installa Wireguard</strong> (o OpenVPN) sul server</li></ol>]]></description><link>https://grigio.org/accedere-lan-bypass-cg-nat-via-wireguard-vpn/</link><guid isPermaLink="false">8a5bbc1f-1e8e-40df-878d-4edde8455557</guid><category><![CDATA[wireguard]]></category><category><![CDATA[vpn]]></category><category><![CDATA[linux]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Wed, 06 Apr 2022 09:56:23 GMT</pubDate><content:encoded><![CDATA[<p>L'obbiettivo di questo post è accedere ai propri servizi di smart home (es. <a href="https://www.youtube.com/watch?v=D1f5eMNsR-A">Home Assistant</a>), NAS, telecamere di sicurezza, tramite Wireguard VPN.. all'interno della propria rete domestica (LAN).</p>

<p><img src="https://grigio.org/content/images/2022/04/Screenshot-from-2022-04-06-11-54-25.png" alt=""></p>

<p>Questa operazione con una connessione internet ADSL è abbastanza semplice, avendo un ip pubblico dinamico.</p>

<ol>
<li>Si <strong>installa Wireguard</strong> (o OpenVPN) sul server casalingo  </li>
<li>Si fa <strong>Port Forwarding</strong> sul router: il traffico VPN viene rediretto dal router al server interno che ospita il server VPN  </li>
<li>Tramite un servizio di FREE DNS (es. casamia.no-ip.org ) si ha un <strong>puntatore al proprio IP di casa</strong> che nel tempo potrebbe cambiare </li>
</ol>

<h2 id="cosafareinveceseusiamounaconnessione4gofibraeilnostroispcidaunipsottonat">Cosa fare invece se usiamo una connessione 4G o Fibra e il nostro ISP ci da un IP sotto NAT?</h2>

<p>Ovvero il nostro IP pubblico su internet è condiviso con altre persone e non il nostro router non è direttamente raggiungibile da internet?</p>

<p><strong>Opzione 1</strong>: Managed, in breve i nostri computer LAN si collegano via tunnel al server di Tailscale VPN e noi ci accediamo da internet tramite questo servizio VPN managed (non gestito da noi, ma gratuito per utilizzo base)</p>

<p><strong>Opzione 2</strong>: Selfhosted, dobbiamo avere un server VPS (quindi con indirizzo pubblico su internet) e far collegare i computer LAN interessati a questo server Wireguard</p>

<h2 id="configurazionewireguardsitetositeminima">Configurazione Wireguard site-to-site minima</h2>

<ul>
<li><strong>home-server</strong>: computer interno che ospita servizi LAN (es. web app)</li>
<li><strong>wireguard-vps-server</strong>: computer pubblico VPS</li>
<li><strong>client mobile</strong>: il nostro smartphone Android, che si trova su internet (<a href="https://play.google.com/store/apps/details?id=com.wireguard.android&amp;gl=it">Download app</a>)</li>
</ul>

<h2 id="installazionediwireguardsulinuxdebian11">Installazione di Wireguard su Linux Debian 11</h2>

<p>Questi passaggi valgono per <strong>home-server</strong> e <strong>wireguard-vps-server</strong> dopo esservi collegati via SSH.</p>

<pre><code># Solo per Debian 10
echo 'deb http://ftp.debian.org/debian buster-backports main' | sudo tee /etc/apt/sources.list.d/buster-backports.list

sudo apt update  
sudo apt install wireguard-tools  
</code></pre>

<h2 id="abilitazioneipforwardefirewall">Abilitazione ip forward e firewall</h2>

<p>Solo su <strong>wireguard-vps-server</strong></p>

<pre><code>sudo sysctl -w net.ipv4.ip_forward=1  
</code></pre>

<p>Opzionale, se presente un firewall abilitare l'accesso sulla porta del VPN server.</p>

<pre><code>sudo ufw allow 51820/udp  
</code></pre>

<h2 id="generazionedellechiavipubblicheprivateperwireguard">Generazione delle chiavi pubbliche private per Wireguard</h2>

<p>Il seguente comando genera le chiavi asimmetriche necessarie per i vari peer Wireguard, potete eseguirlo dove ritenete più opportuno, dovete solo ricordarvi di copiare le chiavi al posto giusto nei rispettivi file di configurazione</p>

<pre><code>wg genkey | tee privatekey | wg pubkey &gt; publickey &amp;&amp; cat privatekey publickey

0PqYhc/Nu4sqnSXJ8N+ViPV3Q3N3x4vBNcvEDDdGiUY=  
Hm8mUC5x1n0TSNM0qxydeqgDOrfBI1BlpXaWgCcbQCo=  
</code></pre>

<blockquote>
  <p>Nell'output d'esempio della coppia, la prima è una chiave privata e la seconda è una chiave pubblica.</p>
</blockquote>

<h2 id="filediconfigurazioneclientserverdiwireguard">File di configurazione client/server di Wireguard</h2>

<pre><code># Configurazione per esempio di wireguard-vps-server, il computer con IP pubblico raggiungibile
# /etc/wireguard/wg-server.conf
[Interface]
Address = 10.0.0.1  
ListenPort = 51820  
PrivateKey = &lt;chiave privata di wireguard-vps-server&gt;  
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# peer1 / home-server
PublicKey = &lt;chiave pubblica di home-server&gt;  
AllowedIPs = 10.0.0.2/32

[Peer]
# peer2 / client-mobile
PublicKey = &lt;chiave privata di client-mobile&gt;  
AllowedIPs = 10.0.0.3/32  
</code></pre>

<pre><code># Configurazione per esempio di home-server o altro computer in lan
# /etc/wireguard/wg-peer.conf
[Interface]
Address = 10.0.0.2  
PrivateKey = &lt;chiave privata di home-server&gt;  
ListenPort = 51820  
# Local DNS or DNS
DNS = 1.1.1.1

[Peer]
PublicKey = &lt;chiave pubblica di wireguard-vps-server&gt;  
Endpoint = wireguard-vps-server.com:51820  
# Classe di IP della rete VPN
AllowedIPs = 10.0.0.0/24  
# Per i peer dietro CG-NAT che devono contattare il VPN server
PersistentKeepalive = 30  
</code></pre>

<h2 id="abilitarewireguardinmodopersistente">Abilitare Wireguard in modo persistente</h2>

<p>Da eseguire nei rispettivi computer, per abilitare all'avvio e immediatamente wireguard</p>

<pre><code>sudo systemctl enable --now wg-quick@wg-peer

sudo systemctl enable --now wg-quick@wg-server  
</code></pre>

<h2 id="testdellaconfigurazionewireguardsitetosite">Test della configurazione Wireguard site-to-site</h2>

<pre><code>Il seguente comando eseguito su wireguard-vps-server vi da la visibuilità di tutti i nodi connessi. Potete anche eseguilo sui peer per verificare che siete conenssi ai server

sudo wg show  
interface: wg-server  
  public key: &lt;chiave pubblica wireguard-vps-server&gt;
  private key: (hidden)
  listening port: 51820

peer: &lt;chiave pubblica peer&gt;  
  endpoint: ip:62131
  allowed ips: 10.0.0.4/32
  latest handshake: 18 seconds ago
  transfer: 38.99 MiB received, 3.17 MiB sent

peer: &lt;chiave pubblica peer&gt;  
  endpoint: ip:62104
  allowed ips: 10.0.0.2/32
  latest handshake: 1 minute, 36 seconds ago
  transfer: 182.74 MiB received, 6.35 MiB sent
</code></pre>

<p>Se i vari nodi si vedono possiamo procedere con il ping e/o vedere se un eventuale web service è attivo.</p>

<p>In questo esempio partiamo dal peer con ip <code>10.0.0.2</code> e verifichiamo che il web service su <code>10.0.0.4:6666</code> risponde con dei dati.</p>

<pre><code>$ ip addr show wg-peer
1332: wg-peer: &lt;POINTOPOINT,NOARP,UP,LOWER_UP&gt; mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000  
    link/none 
    inet 10.0.0.2/32 scope global wg-peer
       valid_lft forever preferred_lft forever

$ ping 10.0.0.4
PING 10.0.0.4 (10.0.0.4) 56(84) bytes of data.  
64 bytes from 10.0.0.4: icmp_seq=1 ttl=63 time=117 ms  
64 bytes from 10.0.0.4: icmp_seq=2 ttl=63 time=103 ms  
^C


$ curl -I http://10.0.0.4:6666
HTTP/1.1 200 OK  
Date: Wed, 06 Apr 2022 09:12:20 GMT  
Content-Length: 0  
Etag: "da39a3ee5e6b4b0d3255bfef95601890afd80709"  
Content-Type: text/html; charset=UTF-8  
Server: motionEye/0.42
</code></pre>

<blockquote>
  <p>Se sei interessato al tema del selfhosting, di come farti il cloud in casa, su <strong><a href="https://techonsapevole.gumroad.com/l/pggGPy">Techonsapevole Academy</a></strong> altri <a href="https://t.me/techonsapevole/516">video di approfondimento</a>.</p>
</blockquote>]]></content:encoded></item><item><title><![CDATA[Chinese kingchuxing SSD Benchmark]]></title><description><![CDATA[<p><img src="https://grigio.org/content/images/2021/01/benchmark-512gb-kingchuxing.png" alt=""></p>

<p>Maybe it has fluctuating write performances and spikes, but it works.</p>

<p>I don't know it I'd trust to use it for important data, but for testing purposes it's fine</p>

<p>You can find it on <a href="https://s.click.aliexpress.com/e/_9jMqP3">Aliexpress</a></p>]]></description><link>https://grigio.org/chinese-ssd-benchmark/</link><guid isPermaLink="false">0fdd2949-c248-4aa1-b9f1-ff3fb2a262bb</guid><category><![CDATA[ssd]]></category><category><![CDATA[benchmark]]></category><category><![CDATA[linux]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Tue, 12 Jan 2021 15:37:57 GMT</pubDate><content:encoded><![CDATA[<p><img src="https://grigio.org/content/images/2021/01/benchmark-512gb-kingchuxing.png" alt=""></p>

<p>Maybe it has fluctuating write performances and spikes, but it works.</p>

<p>I don't know it I'd trust to use it for important data, but for testing purposes it's fine</p>

<p>You can find it on <a href="https://s.click.aliexpress.com/e/_9jMqP3">Aliexpress</a></p>]]></content:encoded></item><item><title><![CDATA[3rd migration complete ✌ . New era, new Docker stack]]></title><description><![CDATA[<p>After 12 year I'm still here and, finally I did it, the 3rd big self hosted migration✌.</p>

<p><img src="https://grigio.org/content/images/2019/01/2019-01-18_09-45.png" alt="VPS stats"></p>

<p><em>Nope, my VPS isn't so busy. Just generated some traffic to make it look cooler.</em></p>

<p>When I started <em>the word "blog" didn't exist yet</em> and internet was a mix of forums and websites,</p>]]></description><link>https://grigio.org/3rd-migration-complete-new-era-new-docker-stack/</link><guid isPermaLink="false">089a6b47-ca78-4c12-8fee-909b4146d99c</guid><category><![CDATA[docker]]></category><category><![CDATA[diy]]></category><category><![CDATA[hosting]]></category><category><![CDATA[database]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Fri, 18 Jan 2019 09:39:54 GMT</pubDate><media:content url="http://grigio.org/content/images/2019/01/2019-01-18_09-03.png" medium="image"/><content:encoded><![CDATA[<img src="http://grigio.org/content/images/2019/01/2019-01-18_09-03.png" alt="3rd migration complete ✌ . New era, new Docker stack"><p>After 12 year I'm still here and, finally I did it, the 3rd big self hosted migration✌.</p>

<p><img src="https://grigio.org/content/images/2019/01/2019-01-18_09-45.png" alt="3rd migration complete ✌ . New era, new Docker stack"></p>

<p><em>Nope, my VPS isn't so busy. Just generated some traffic to make it look cooler.</em></p>

<p>When I started <em>the word "blog" didn't exist yet</em> and internet was a mix of forums and websites, now it's full of social, videos and many people stopped to self host "things" because they prefere something that <strong>just works™</strong> that they don't have to mantain. The funny fact it's has never been years to self host a web software as today!</p>

<h3 id="why">Why?</h3>

<p>Linux, DNS, reverse proxy, HTTPS, PHP, NodeJS, CMS, VPN, ssh, to self host even a stupid kitten blog, you have to wire a lot of tech, most technologies are open source but <strong>you have to know what you are doing and it's your responsibility to check that they continue talk fine even after upgrades</strong>. ..And it's not easy to follow any possible stack permutation!</p>

<h3 id="okivealandingpagehowadeploycanbeeasier">OK, I've a landing page, how a deploy can be easier?</h3>

<p>Let's say you have a new web page in <code>./app/index.html</code> and you want to publish it on on the Internet.. to <code>https://make-self-hosting-great-again.grigio.org</code> what do you do? <br>
It can be easy as using a <code>docker-compose.yml</code> file and run a command!</p>

<pre><code class="language- bash "># docker-compose.yml 

version: "3"

services:  
  app:
    image: busybox
    restart: unless-stopped
    volumes:
      - ./app:/var/www    
    networks:
      - web
    labels:
      - traefik.docker.network=web
      - traefik.frontend.rule=Host:make-self-hosting-great-again.grigio.org
      - traefik.port=9000
      - traefik.backend=msgh
    entrypoint: busybox httpd -f -p 0.0.0.0:9000 -h /var/www

networks:  
  web:
    external: true
</code></pre>

<p>And then</p>

<pre><code>docker-compose up -d  
</code></pre>

<p>And we are live! <a href="https://make-self-hosting-great-again.grigio.org">https://make-self-hosting-great-again.grigio.org</a></p>

<p><img src="https://grigio.org/content/images/2019/01/2019-01-18_09-37.png" alt="3rd migration complete ✌ . New era, new Docker stack"></p>

<p><strong>Notes</strong></p>

<ol>
<li><p>Check with <code>dig subdomain.yourdomain.com</code> that the DNS propagation is complete, it could take some minutes. You should see the name resolved your IP. With <code>A    *   YOUR.VPS.IP</code> You can resolve all subdomains.</p></li>
<li><p>Sometimes the HTTPS / Traefik / Letsencrypt certificate is not valid, you have to wait or try an anonymous session in the browser.. because it isn't updated on every request, at least on Chrome.</p></li>
<li><p>The network <code>web</code> is used by Traefik to automagically generate the HTTPS certificate, you could also use a network to share a database name resolution among multiple containers.</p></li>
</ol>

<h3 id="makingthingssimpleishard">Making things simple is hard</h3>

<p>To be honest, I tried several times in the past to do this migration, and I failed. At the time docker was immature to my needs but now it's another story. Here is a list of things of my pains:</p>

<ul>
<li><p>Ideally docker containers are stateless, but some projects, specially old CMS mix app, config, plugins, web server extensions, database configs (ex. mod_rewrite for clean urls,..). There isn't a perfect solution, you can always mount that blob and use the container to freeze the stack.</p></li>
<li><p>Projects with not clear dependencies are pain. I had problems with old versions of Drupal 4 /6 and Meteor 1.0.3.x Stacks evolves and also Databases and you have to replicate the exact version to port them.</p></li>
<li><p><code>mysqldump</code> is a pain, it did a backup of a database with a corrupt table without errors.. but the dump ignored  halt of the tables -_-</p></li>
</ul>

<h3 id="thankstotheopensourceanddockerecosystem">Thanks to the open source and docker ecosystem</h3>

<p>Here some docker images I use:</p>

<p><strong>Base infrastructure</strong></p>

<ul>
<li>Reverse Proxy: <strong>Traefik</strong> <code>traefik:alpine</code> It is the only gateway to manage websites traffic and HTTPS certs renewal (port 80/443)</li>
<li>Container management web UI: <strong>Portainer</strong> <code>portainer/portainer</code> To have a visual feedback of <code>docker</code> and <code>docker-compose</code> commands</li>
<li>System performance overview: <strong>Netdata</strong> <code>netdata/netdata</code></li>
</ul>

<p><strong>Extra infrastructure</strong></p>

<ul>
<li>Email aliases <code>martinpesek/postfix-forwarding</code></li>
<li>VPN server <code>kylemanna/openvpn</code></li>
</ul>

<p><strong>App infrastructure</strong></p>

<ul>
<li>Databases: <code>mysql:5.7</code></li>
<li>Stacks: <code>php:5-fpm</code>, <code>ghost:0</code></li>
<li>.. and more but with weird customizations</li>
</ul>

<h3 id="conclusion">Conclusion</h3>

<p>Some beautyful oneliners..</p>

<p>It creates a temporary mysql container to extract a database backup  </p>

<pre><code>docker run --net web -v $PWD/backup:/backup --rm  -i mysql:5.7 sh -c "MYSQL_PWD=yourpassword mysqldump -h mysqlinstance -u yourdbuser yourdatabase | gzip -9 &gt; /backup/dbbackup.sql.gz"  
</code></pre>

<p>It attaches to mysql container to restore a database backup  </p>

<pre><code>docker exec -i mysqlinstance /usr/bin/mysql -u root --password=yourrootpassword -e "create database yourdatabase"  
gunzip &lt; backup/dbbackup.sql.gz | docker exec -i mysqlinstance /usr/bin/mysql -u yourdbuser --password=yourpassword yourdatabase  
</code></pre>

<p>I hope you like it, the cloud isn't just Amazon AWS and Google. <br>
Enjoy.</p>]]></content:encoded></item><item><title><![CDATA[I've uploaded a 187.4kB file on the EOS Blockchain for FREE with EOSfilestore, and this is what I've learnt]]></title><description><![CDATA[<p>There are many Blockchain projects that sell themself as "Blockchain for X" (where "X" is something cool!), unfortunatly the Blockchain is basically is an <strong>immutable, decentralized and secure  data storage</strong> so if X if rapresented by data you can use an existing Blockchain, <strong>the same way you use Internet, instead</strong></p>]]></description><link>https://grigio.org/-ive-uploaded-a-187-4kb-file-on-the-eos-blockchain-for-free-with-eosfilestore-and-this-is-what-ive-learnt/</link><guid isPermaLink="false">985b1ba4-0701-404f-a4f3-599e271b8280</guid><category><![CDATA[gdpr]]></category><category><![CDATA[eos]]></category><category><![CDATA[blockchain]]></category><category><![CDATA[eosfilestore]]></category><category><![CDATA[smart contract]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Sun, 08 Jul 2018 10:38:36 GMT</pubDate><content:encoded><![CDATA[<p>There are many Blockchain projects that sell themself as "Blockchain for X" (where "X" is something cool!), unfortunatly the Blockchain is basically is an <strong>immutable, decentralized and secure  data storage</strong> so if X if rapresented by data you can use an existing Blockchain, <strong>the same way you use Internet, instead of Internet for Gaming or Internet for Finance</strong> </p>

<p><img src="https://user-images.githubusercontent.com/8074/42409753-516e04c8-81df-11e8-9d60-823fe4909d75.png" alt="EOSfilestore"></p>

<blockquote>
  <p>TLDR; <a href="https://github.com/grigio/eosfilestore">EOSfilestore is on Github</a> !</p>
</blockquote>

<p>Most of non scammy Blockchains have different tradeoffs, EOS has <strong>fast and free transactions</strong> and you pay the service with <strong>inflation</strong>. </p>

<p>The EOS cryptocurrency has an actual value, because if You stake it, you can reserve a certain amount of CPU, RAM  or NET bandwidth on the EOS Blockchain.</p>

<h3 id="howdoesitwork">How does it work?</h3>

<p>Currently <code>eosfilestore</code> is a very simple to use command-line tool.  </p>

<pre><code>$ eosfilestore push myfile.gif
...
b5407140a0f7b6365b2dcf1731f6ad50ee0502d052ecdb9da01700ecd398f759 cpu: 8757 net:1272  
Done, uploaded myfile.gif in b5407140a0f7b6365b2dcf1731f6ad50ee0502d052ecdb9da01700ecd398f759
</code></pre>

<p>It will base64 encode the file and split it in several <code>action</code> transactions. The hash <code>b5407140a0f7b6365b2dcf1731f6ad50ee0502d052ecdb9da01700ecd398f759</code> is the only information you need to rebuild the file back.</p>

<pre><code>$ eosfilestore get b5407140a0f7b6365b2dcf1731f6ad50ee0502d052ecdb9da01700ecd398f759 x.gif
...
0fb2a1ebb57af6ba344ce43a10c88166c8c8b4b413652862266cfab4c0c95900  
null  
Done, saved b5407140a0f7b6365b2dcf1731f6ad50ee0502d052ecdb9da01700ecd398f759 in x.gif  
</code></pre>

<h3 id="whywouldiwanttostoreafileontheblockchain">Why would I want to store a file on the Blockchain?</h3>

<p>Because you can. Jokes aside, there many benefits to store certain files on the Blockchain:</p>

<ul>
<li><p><strong>Time proof</strong>: You can demonstrate publically you know, or you have, something to a certain date in the past</p></li>
<li><p><strong>Secure and Censorship resistant</strong>: Once the file is on the Blockchain you can't alter it, you can't corrupt it and it is nowhere and everywhere at the same time.</p></li>
<li>Probably there are also other use cases, the limit is your imagination</li>
</ul>

<h3 id="eosfilestoretradeoffsandwhativelearnt">EOSfilestore tradeoffs and what I've learnt</h3>

<ol>
<li><p>It costs 0 EOS to upload a file, but <strong>if you don't stake enough EOS for CPU or NET your file upload won't complete successfully</strong>, of course.</p></li>
<li><p><strong>RAM Cost</strong>. To publish my basic smart contract to the EOS mainnet I should pay 50kB RAM =~ 20 EOS =~ $ 200, so I'm using <code>decentwitter</code> / <code>avatar</code> action for my purposes.. Feel free to donate to <code>eosfilestore</code> RAM or EOS to allow me to deploy a dedicated smart contract.</p></li>
<li><p>In C++ a string has the max length of 4294967294 chars but in EOS the limit is lower because there is also a limit on transaction size at network level.</p></li>
<li><p>Storing a file on a Blockchain is not GDPR compliant.. because you can't delete it. But you encrypt it and then forget the password.</p></li>
<li><p>It isn't IPFS or Torrent, probably the EOSfilestore technique isn't suited for very big files. But 187.4kB could be a lot of kinds of documents an it is 25 txs</p></li>
</ol>

<p><img src="https://grigio.org/content/images/2018/07/Schermata-da-2018-07-08-16-00-46.png" alt=""></p>

<blockquote>
  <p>Finally I've consumed some CPU and NET, for the EOS I'm staking for it</p>
</blockquote>

<h2 id="conclusion">Conclusion</h2>

<p>Feedbacks are welcomed, <a href="https://github.com/grigio/eosfilestore">EOSfilestore</a> is Open source and available on Github.</p>]]></content:encoded></item><item><title><![CDATA[GDPR Cosa fare? Panico]]></title><description><![CDATA[<p>A vedere dalle pubblicità contestuali di Facebook, pare che la GDPR, la nuova normativa europea per il trattamento dei dati personali, stia scatenando il panico: ci sono fior fior di improvvisati esperti che per consulenze su "non si sa che cosa" ti aiutano a risolvere dei problemi che il che</p>]]></description><link>https://grigio.org/gdpr-cosa-fare/</link><guid isPermaLink="false">fa698c20-c364-49ea-83ff-1e12d2cfa89a</guid><category><![CDATA[italia]]></category><category><![CDATA[europa]]></category><category><![CDATA[privacy]]></category><category><![CDATA[gdpr]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Fri, 13 Apr 2018 10:50:17 GMT</pubDate><media:content url="http://grigio.org/content/images/2018/04/Schermata-da-2018-04-13-10-49-18.png" medium="image"/><content:encoded><![CDATA[<img src="http://grigio.org/content/images/2018/04/Schermata-da-2018-04-13-10-49-18.png" alt="GDPR Cosa fare? Panico"><p>A vedere dalle pubblicità contestuali di Facebook, pare che la GDPR, la nuova normativa europea per il trattamento dei dati personali, stia scatenando il panico: ci sono fior fior di improvvisati esperti che per consulenze su "non si sa che cosa" ti aiutano a risolvere dei problemi che il che il giorno prima non avevi e in questo putiferio che cosa fare?</p>

<h1 id="google">Google</h1>

<p>Fortunatamente Google Analytics ha fatto un <a href="https://support.google.com/analytics/answer/7667196">documento pratico</a> su come comportarsi, certo ci saranno situazioni da valutare caso per caso, ma almeno abbiamo qualche linea guida pratica che può ispirarci.</p>

<p>Concludendo. Chiedete il minor numero di dati necessari agli utenti e utenti, sappiate che una volta dato un dato, a un servizio di terze parti, non saprete mai veramente cosa ne verrà fatto e a chi verrà dato, perché di fatto non lo controllate più e non c'é giustizia, blockchain, machine learning AI che tenga!</p>]]></content:encoded></item><item><title><![CDATA[Perché in Italia non si trovano sviluppatori neanche a 3000€/mese]]></title><description><![CDATA[<p>Ciclicamente appaiono articoli di PMA che non riescono a trovare sviluppatori disposti a lavorare per loro, come <a href="http://biella.diariodelweb.it/biella/articolo/?nid=20170503_412798">questa azienda di Biella</a>, oppure "startup innovative" nella stessa situazione.</p>

<p><img src="https://media2.giphy.com/media/o0vwzuFwCGAFO/giphy.gif" alt="informatico produttivo"></p>

<p>Dall'altra parte troviamo <a href="https://grigio.org/possiamo-smetterla-di-usare-il-termine-informatico-come-professione/">informatici</a> che fanno <strong>siti a 1€</strong> e altri che lavorano a <strong>300€/h</strong>.</p>

<p>Com'é possibile che ci sia uno spread</p>]]></description><link>https://grigio.org/perche-in-italia-non-si-trovano-sviluppatori-neanche-a-3000eumese/</link><guid isPermaLink="false">e6450c53-43a1-4a49-a93b-d1576e19d194</guid><category><![CDATA[italia]]></category><category><![CDATA[lavoro]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Mon, 08 May 2017 14:33:15 GMT</pubDate><content:encoded><![CDATA[<p>Ciclicamente appaiono articoli di PMA che non riescono a trovare sviluppatori disposti a lavorare per loro, come <a href="http://biella.diariodelweb.it/biella/articolo/?nid=20170503_412798">questa azienda di Biella</a>, oppure "startup innovative" nella stessa situazione.</p>

<p><img src="https://media2.giphy.com/media/o0vwzuFwCGAFO/giphy.gif" alt="informatico produttivo"></p>

<p>Dall'altra parte troviamo <a href="https://grigio.org/possiamo-smetterla-di-usare-il-termine-informatico-come-professione/">informatici</a> che fanno <strong>siti a 1€</strong> e altri che lavorano a <strong>300€/h</strong>.</p>

<p>Com'é possibile che ci sia uno spread così elevato tra domanda e offerta? E che uno sviluppatore abbia uno stipendio più alto in Romania nonostante il costo della vita lì sia più basso?</p>

<h3 id="1corebusinessdelleaziendeitaliane">1. Core Business delle aziende italiane</h3>

<p>Non prendiamoci in giro l'Italia non è la Silicon Valley, né Londra, né Dublino, né Berlino. È conosciuta nel mondo per il cibo, la storia e il fashion,.. <strong>La stragrande maggioranza delle aziende italiane vede Il software come un costo per vendere prodotti o gestire i clienti, non è il prodotto</strong>!</p>

<p>Questo significa che non c'é nessun incentivo nel migliorarlo e raffinarlo una volta fatto. <strong>Lo stesso non si può dire per le aziende cloud/SaaS dove il software è il prodotto e che quindi sono più interessate nella qualità e nell'evoluzione del software.</strong> </p>

<p>Questo probabilmente è la causa principale.</p>

<h3 id="2lavororemoto">2. Lavoro remoto</h3>

<p><strong>A differenza di un medico, uno sviluppatore specializzato in informatica può lavorare all'estero senza spostarsi da casa ed anche più facile che così facendo trovi il lavoro più adatto per i propri interessi e a condizioni economiche migliori</strong>.</p>

<p>L'informatica applicata probabilmente ormai ha più branche della medicina ed è molto improbabile che lo sviluppatore che stai cercando si trovi a 10km da dove ti trovi tu. Piccola azienda eccellenza del MadeInItaly che produce tappi in sughero di qualità e che esporti in tutto il mondo e che vuoi fare una app.</p>

<p>Inoltre "lavoro remoto" non significa puntare una telecamera sul programmatore e dargli scosse ai genitali per aumentarne la produttività, <strong>lavorare in remoto significa organizzare il proprio lavoro in modalità asincrona e far sì che ci sia chiarezza negli obiettivi, nelle specifiche e nel fatto di utilizzare una comunicazione più efficace</strong>. Dettare specifiche per telefono è una perdita di tempo per entrambi.</p>

<h3 id="3annuncidilavorogeneralistibassisalari">3. Annunci di lavoro generalisti = Bassi salari</h3>

<p><em>Azienda Leader nel settore cerca sviluppatore junior esperto di <strong>PHP</strong>, <strong>Java</strong>, <strong>JavaScript</strong> ed è gradita conoscenza di perl5.5, mysql, sql server, nosql,.. e Photoshop e neolaureato</em></p>

<p>Quante volte si leggono annunci di lavoro del genere? Questi tipi di annunci non hanno senso perché:</p>

<ul>
<li>Se uno ha davvero tutte quelle conoscenze non può essere junior e neolaureato</li>
<li>Se uno ha davvero ha tutte quelle conoscenze difficilmente sarà "esperto", visto che sarebbe come cercare un medico otorino, ginecologo che conosca il tedesco e francese, difficilmente potrà essere esperto in tecnologie sostanzialmente intercambiabili ma con ecosistemi completamente diversi.</li>
<li>Se usi la parola junior come sinonimo di economico è normale che nessuno ti risponda e che fai fatica a trovare professionisti.</li>
</ul>

<h3 id="4tecnologieobsoleteeinnovazioneaparole">4. Tecnologie obsolete e innovazione a parole</h3>

<p>Il software non è un soprammobile che una volta fatto lo lasci lì 10 anni sulla mensola. Le tecnologie evolvono, i modelli di sviluppo , i linguaggi evolvono, se per anni l'hai lasciato lì il tuo bel sito in Adobe Flash perché faceva quel che volevi, non puoi svegliarti all'improvviso e renderti conto nessuno vuole più metterci mano. <br>
Se non vuoi seguire in prima persona l'evoluzione tecnologica devi affidarti a qualcuno che lo faccia al posto tuo.</p>

<p><strong>Sviluppare software è solo in minima parte scrivere codice, è più avere una visione d'insieme e saper risolvere problemi nel modo più appropriato a seconda della situazione con i migliori compromessi.</strong></p>

<p>Vi lascio anche con il <a href="https://www.facebook.com/simonetorrisi.dev/videos/301209186989195/">video di Simone Torrisi</a> sulla questione, perché il miglior modo per migliorare la situazione degli sviluppatori in italia è comunicare ai NON-sviluppatori che cosa facciamo.</p>]]></content:encoded></item><item><title><![CDATA[L'esperto di IoT, il nuovo Raspberry Pi Zero W e i ricambi]]></title><description><![CDATA[<p>Ho studiato elettronica alle superiori, poi mi sono dedicato al software e ora, dopo le ultime evoluzioni, sto valutando un ri-aggiornamento sul settore.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/9ffzw3AuAxM" frameborder="0" allowfullscreen></iframe>  

<p><em>Una panoramica dei vari dispositivi IoT (Internet of Things)</em></p>

<h2 id="raspberrypizerowesp8266eglialtrimicrocontrollori">Raspberry PI Zero W, ESP8266 e gli altri microcontrollori</h2>

<p>Pur dedicandomi allo sviluppo software come lavoro, non è</p>]]></description><link>https://grigio.org/lesperto-di-iot-il-nuovo-raspberry-pi-zero-w-e-i-ricambi/</link><guid isPermaLink="false">6a9b0f25-9be3-4ef9-bea2-10dbd2ab47af</guid><category><![CDATA[raspberrypi]]></category><category><![CDATA[hacking]]></category><category><![CDATA[diy]]></category><category><![CDATA[camera]]></category><category><![CDATA[iot]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Mon, 06 Mar 2017 11:57:12 GMT</pubDate><content:encoded><![CDATA[<p>Ho studiato elettronica alle superiori, poi mi sono dedicato al software e ora, dopo le ultime evoluzioni, sto valutando un ri-aggiornamento sul settore.</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/9ffzw3AuAxM" frameborder="0" allowfullscreen></iframe>  

<p><em>Una panoramica dei vari dispositivi IoT (Internet of Things)</em></p>

<h2 id="raspberrypizerowesp8266eglialtrimicrocontrollori">Raspberry PI Zero W, ESP8266 e gli altri microcontrollori</h2>

<p>Pur dedicandomi allo sviluppo software come lavoro, non è sempre tutto cloud. A volte può capitare per necessità di dover mettere mano allo strato sottostante, per esempio ultimamente si è bruciata una <strong>corona di led IR</strong> di una videocamera per esterno e dopo qualche ricerca mi sono reso conto di quanto sia difficile reperire ricambi adatti di dispositivi non mainstream.</p>

<p><img src="https://grigio.org/content/images/2017/03/security-camera-led.jpg" alt="security camera led"></p>

<p>Tuttavia, dopo aver sostituito la corona e attaccato il connettore di alimentazione ho dovuto constatare che i led ad infrarosso continuavano a non accendersi. Fosse stato un problema software sarei stato in grado a fare debug, ma in hardware, se un componente nuovo e collegato correttamente non funziona che cosa vuoi farci? <br>
Preso dallo sconforto, mi torna in mente che i led hanno una polarità e che quindi potevo provare a "segare" il connettore affinché potessi alimentarlo con polarità inversa! E così è stato e così ha funzionato.</p>

<p>Tutta questa lunga introduzione per cosa? L'elettronica ha sempre tenuto lontani i non-esperti per <strong>mancanza di standard di alto livello</strong>, ma con le ultime evoluzioni di <strong>Raspberry Pi</strong> e <strong>Arduino</strong> (es. <a href="https://www.reddit.com/r/esp8266/wiki/index">ESP8266</a>) diventa a portata di tutti (o almeno di chi ha ancora voglia di imparare).</p>

<p>Grazie al nuovo <a href="https://www.raspberrypi.org/blog/raspberry-pi-zero-w-joins-family/">Raspberry Pi Zero W</a> da 10$, <strong>chiunque abbia un minimo di conoscenza del sistema operativo Linux e base di programmazione è in grado a fare un dispositivo hardware che può interagire via internet senza fili</strong>!</p>

<p>E in questo caso l'innovazione sta nel fatto di <strong>essere un computer</strong> e di <strong>essere senza fili</strong>, quindi nessun firmware fa flashare sviluppato in linguaggi astrusi e nessun cavo per doverlo controllare, perché può ricevere dati via <strong>Wifi</strong> o <strong>Bluetooth</strong>. Non sarà il dispositivo elettronico più ottimizzato, ma <strong>trasforma l'elettronica in una sorta di mattoncini Lego che devono solo essere connessi tra loro e trasformano valori fisici in JSON</strong>.</p>

<pre><code class="language- javascript">(async () =&gt; {
  const data = await fetch('http://terrazzo.local')
    .then((data) =&gt; data.json())
    .catch((err) =&gt; console.error(err))

  console.log(`Nel terrazzo ci sono ${data.temperature}°C`)
})()
</code></pre>

<p>Che sia davvero arrivato l'anno della domotica e wearables fai da te? Quanto ci vorrà prima che nel 2017 un oggetto con uno di questi sensori e che si collega ad internet venga bollato come "rivoluzionario"?</p>

<ul>
<li>barometro</li>
<li>temperatura</li>
<li>suono</li>
<li>fiamma</li>
<li>umidità</li>
<li>rilevamento gas</li>
<li>laser</li>
<li>pioggia</li>
<li>tocco</li>
<li>urto</li>
<li>luminosità</li>
</ul>

<p><a href="https://www.sunfounder.com/media/catalog/product/cache/1/image/9df78eab33525d08d6e5fb8d27136e95/1/_/1_6_34.jpg">ecc..</a></p>]]></content:encoded></item><item><title><![CDATA[Letsencrypt and when a cron job fail]]></title><description><![CDATA[<p>Lets Encrypt / Certbot is a great initiative to simplify the HTTPS certificates management, but many things happen behind the scene and sometimes it could go wrong.</p>

<p><img src="https://grigio.org/content/images/2017/01/Schermata-2016-01-01-alle-19-28-59.png" alt="linux sysadmin">
<em>When your server say "You have mail" it means "We need to talk.."</em></p>

<pre><code>/usr/sbin/service nginx stop
./letsencrypt-auto certonly --standalone --email myemail@grigio.</code></pre>]]></description><link>https://grigio.org/letsencrypt-and-when-a-cron-job-fail/</link><guid isPermaLink="false">bd97d120-34c7-4b9a-acc9-93cc2bc298dd</guid><category><![CDATA[linux]]></category><category><![CDATA[nginx]]></category><category><![CDATA[ssl]]></category><category><![CDATA[letsencrypt]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Sun, 01 Jan 2017 19:35:46 GMT</pubDate><content:encoded><![CDATA[<p>Lets Encrypt / Certbot is a great initiative to simplify the HTTPS certificates management, but many things happen behind the scene and sometimes it could go wrong.</p>

<p><img src="https://grigio.org/content/images/2017/01/Schermata-2016-01-01-alle-19-28-59.png" alt="linux sysadmin">
<em>When your server say "You have mail" it means "We need to talk.."</em></p>

<pre><code>/usr/sbin/service nginx stop
./letsencrypt-auto certonly --standalone --email myemail@grigio.org -d grigio.org --renew-by-default --agree-tos
/usr/sbin/service nginx start
</code></pre>

<p>I used the command above in a cron job and it always worked but tonight it failed. <br>
I'm not enthusiast of it because it needs the <strong>root privileges</strong> and it also cause the <strong>nginx web server downtime</strong>,.. but it worked until now.</p>

<pre><code>Command "/root/.local/share/letsencrypt/bin/python2.7 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-2Ur7fS/cryptography/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('  
', '  
'), __file__, 'exec'))" install --record /tmp/pip-Uh6XzK-record/install-record.txt --single-version-externally-managed --compile --install-headers /root/.local/share/letsencrypt/include/site/python2.7/cryptography" failed with error code 1 in /tmp/pip-build-2Ur7fS/cryptography  
/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:120: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
You are using pip version 8.0.3, however version 9.0.1 is available.  
You should consider upgrading via the 'pip install --upgrade pip' command.  
nginx start/running, process 17815  
</code></pre>

<p>Apparently the new LE version coming from the autoupdate script <strong>changed its python dependencies</strong> so I had to debug it manually to make it work again.</p>

<p>Luckily it was easy to fix,..</p>

<pre><code>apt-get install python-pip  
pip install --upgrade pip  
</code></pre>

<p>..but i'd like to move away from this "manual" approach, because it requires to edit manually the NGINX config files and activate a cron job per each virtualhost (if you don't want to transform your configs in a big ball of mud).</p>

<h2 id="nginxletsencrypthttpsrenewalwithdocker">NGINX + Let's Encrypt + HTTPS renewal with Docker</h2>

<p>The idea is to start a container and with and ENV variable like <code>"VIRTUAL_HOST=foo.bar.com"</code>and automagically activate/deactivate the HTTPS for that domain or subdomain.</p>

<p>Woow, the answer is <a href="https://github.com/JrCs/docker-letsencrypt-nginx-proxy-companion">docker-letsencrypt-nginx-proxy-companion</a> I'm still not sure if all this automation can be a limit,.. in some situations. The LE service can activate a new SSL certificate only on public IPs, so it isn't easy to test the set up without a jump in the unknown. I tried to change the DNS and resolve a subdomain to my local dynamic IP and this solution worked very well.</p>

<p>That migration is something to do in 2017 when i've time :) <br>
Happy new year</p>]]></content:encoded></item><item><title><![CDATA[Bloccare definitivamente i referer spam, bot russi pro Trump e visite finte]]></title><description><![CDATA[<p>Hai avuto un picco di visite su Google Analytics? Congratulazioni! Ma sei sicuro che siano utenti veri? In questo post vediamo come separare DEFINITIVAMENTE gli utenti umani da bot, spam bot, visite fraudolente e quant'altro.</p>

<p><img src="https://grigio.org/content/images/2016/12/beforescroll.jpg" alt="Block referer spam bots">
<em>Prima e dopo la modifica, se riuscirai a seguire questo post le statistiche di Google</em></p>]]></description><link>https://grigio.org/bloccare-definitivamente-i-referer-spam-bot-russi-pro-trump-e-visite-finte/</link><guid isPermaLink="false">6103e87c-a46f-4878-a094-aa22743e3058</guid><category><![CDATA[spam]]></category><category><![CDATA[analytics]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Sat, 17 Dec 2016 10:56:22 GMT</pubDate><content:encoded><![CDATA[<p>Hai avuto un picco di visite su Google Analytics? Congratulazioni! Ma sei sicuro che siano utenti veri? In questo post vediamo come separare DEFINITIVAMENTE gli utenti umani da bot, spam bot, visite fraudolente e quant'altro.</p>

<p><img src="https://grigio.org/content/images/2016/12/beforescroll.jpg" alt="Block referer spam bots">
<em>Prima e dopo la modifica, se riuscirai a seguire questo post le statistiche di Google Analytics torneranno ad essere rilevanti e utili!</em></p>

<p>I bot esistono da quando esistono i motori di ricerca su internet, sono dei software che accedono in modo autonomo ai siti internet per indicizzarli, estrarre dati o altre motivazioni più o meno piacevoli, ultimamente però da <em>rumore di fondo</em> sono diventati molto più aggressivi e intelligenti, perché utilizzano <a href="https://grigio.org/tag/javascript/">JavaScript</a> per <strong>simulare una visita umana, con tanto di tempo di permanenza e pagine multiple visitate</strong>.</p>

<h2 id="googleanalyticsdiventatoinutile">Google Analytics è diventato inutile</h2>

<p>La configurazione di default del più utilizzato strumento di analisi è praticamente inutilizzabile. Quando quasi la metà dei dati visualizzati è causata da visite fittizie praticamente stiamo solo perdendo del tempo a guardare grafici irrilevanti, allo stato attuale gli spambot che ho incontrato possono influire pesantemente nei dati:</p>

<ul>
<li><strong>referral</strong>: fanno credere di essere linkati da siti di malware, spam o anche siti legittimi (con lo scopo di generare visite in modo fraudolento)</li>
<li><strong>tempo di permanenza</strong> e <strong>pagine viste</strong>: inizialmente queste visite avevano come tempo di permanente 0 minuti, ma ora simulano pure quello.</li>
</ul>

<h2 id="quallasoluzione">Qual'é la soluzione?</h2>

<p>Non c'é nessuna soluzione, perché tutto quello che fa un umano su internet può essere simulato prima o poi (sì anche leggere i captcha), quello che si può fare <strong>è trovare dei compromessi per identificare una visita reale da una fittizia</strong>.</p>

<ul>
<li><strong>Vuoi bloccare le visite da Russia e Cina?</strong> Sei un pazzo, ma se hai il sito di una pizzeria a Voghera ti potrebbe bastare</li>
<li><strong>Vuoi bloccare i domini spam?</strong> Sei un pazzo, mi sembra incredibile che molti esperti di marketing / seo / data analyst suggeriscano come "soluzione" di bloccare a mano i domini! Gli spammer li generano e li cambiano in continuazione</li>
<li><strong>Vuoi identificare bot?</strong> <a href="http://engineering.shapesecurity.com/2015/01/detecting-phantomjs-based-visitors.html">Ecco qui</a></li>
</ul>

<p>Qualsiasi strada tu decida di prendere avrà delle limitazioni con falsi positivi e falsi negativi. La strada che hanno preso molti colossi del web (come Techcrunch, Bloomberg,..) è quella di far fare un'azione all'utente sul proprio sito.. per esempio il "clicca per leggere l'articolo", in realtà l'articolo è già presente nella pagina, ma è parzialmente nascosto. Questa tecnica permette di separare le visite da chi è arrivato sul sito per caso (umani e non) da chi effettivamente era interessato all'articolo (e in grado di cliccare nel punto giusto).</p>

<p>In realtà qualsiasi interazione può essere usata e la più semplice e meno invasiva è lo <strong>scroll</strong>, perché nella stragrande maggioranza dei siti si scorre almeno un minimo la pagina e questa azione viene fatta sia dai computer desktop che da mobile.</p>

<p>Quindi primo passaggio è <strong>identificare l'evento "scroll"</strong> e poi inviarlo a Google Analytics</p>

<pre><code>// executed once, the first time the user scrolls
function scrollCheck(ev) {  
  // "scroll" is the event type
  ga('send', 'event', "scroll", JSON.stringify(ev, null, 2))
  document.removeEventListener('scroll', scrollCheck)
}

// "document" and "ga" code should be ready here
document.addEventListener('scroll', scrollCheck)  
</code></pre>

<p>A questo punto lo dovreste vedere nella console realtime</p>

<p><img src="https://grigio.org/content/images/2016/12/scroll-ev.png" alt="evento realtime">
<em>Significa che funziona. In questo caso di 28 visite solo 5 sono vere</em></p>

<p>Ora potete decidere di fermarvi e usare la tab eventi oppure potete andare oltre e generare una conversione in questo modo potrete filtrare la <strong>conversione "scroll"</strong> anche nelle altre funzionalità di Analytics</p>

<p><img src="https://grigio.org/content/images/2016/12/goal.png" alt="conversione">
<em>Oltre a prendere l'evento "scroll" è meglio generare anche una conversione</em></p>

<p>Bene se avete fatto la procedura correttamente ora potrete di nuovo godervi le vostre statistiche corrette. L'unica cosa che dovete fare è filtrare la "conversione scroll" dalle impostazioni avanzate quando volete vedere i "dati reali".</p>

<p><img src="https://grigio.org/content/images/2016/12/filter.png" alt="filtri avanzati">
<em>Maggiore di 1 è un valore arbitrario perché ne viene richiesto uno</em></p>

<p>Ora, le tab mappe, lingue referral,.. mostreranno SOLO i dati che hanno fatto una "conversione scroll" reale.</p>

<p>Addio, до свидания!</p>

<ul>
<li><strong>Secret.ɢoogle.com You are invited! Enter only with this ticket URL. Copy it. Vote for Trump!</strong></li>
<li><strong>Vitaly rules google ☆<em>:｡゜ﾟ･</em>ヽ(^ᴗ^)ﾉ<em>･゜ﾟ｡:</em>☆ ¯_(ツ)<em>/¯(ಠ益ಠ)(ಥ‿ಥ)(ʘ‿ʘ)ლ(ಠ</em>ಠლ)( ͡° ͜ʖ ͡°)ヽ(ﾟДﾟ)ﾉʕ•̫͡•ʔᶘ ᵒᴥᵒᶅ(=^ ^=)oO</strong></li>
<li><strong>o-o-8-o-o.com search shell is much better than google!</strong></li>
</ul>

<p>PS: ovviamente se tutti usassero scroll come evento i bot potrebbero emulare pure quello.. quindi siate creativi :)</p>

<p>Se ti è piaciuto condividi e linka pure l'articolo e cita la fonte</p>]]></content:encoded></item><item><title><![CDATA[La mia esperienza con il crowdfunding]]></title><description><![CDATA[<p>Avrei voluto scrivere sul crowdfunding qualche tempo fa, ma ho avuto l'ispirazione solo ora. Sì, ho provato ad utilizzare questa metodologia per finanziare lo sviluppo di <a href="https://corso-javascript.it">Corso JavaScript</a> e ho fallito. <br>
Tuttavia non è stato un fallimento totale, anzi, è stata <strong>una bella esperienza per validare un'idea con un soggetto</strong></p>]]></description><link>https://grigio.org/la-mia-esperienza-con-il-crowdfunding/</link><guid isPermaLink="false">5e8fe173-dc11-42b2-a79b-9e6bec4f6431</guid><category><![CDATA[startup]]></category><category><![CDATA[crowdfunding]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Mon, 14 Nov 2016 17:36:42 GMT</pubDate><content:encoded><![CDATA[<p>Avrei voluto scrivere sul crowdfunding qualche tempo fa, ma ho avuto l'ispirazione solo ora. Sì, ho provato ad utilizzare questa metodologia per finanziare lo sviluppo di <a href="https://corso-javascript.it">Corso JavaScript</a> e ho fallito. <br>
Tuttavia non è stato un fallimento totale, anzi, è stata <strong>una bella esperienza per validare un'idea con un soggetto terzo ed imparare qualcosa di nuovo</strong>.</p>

<p><img src="https://grigio.org/content/images/2016/11/1e50el.jpg" alt="crowdfunding italia"></p>

<p>Nello storytelling di qualche hanno fa sembrava che lanciare il proprio progetto o la propria idea tramite una piattaforma di crowdfunding fosse un "must" per trovare <strong>nuovi clienti</strong> e <strong>vendere qualcosa prima di averla prodotta</strong>. Nella realtà non è proprio così, quindi provo a riassumere per punti alcune suggestioni che in modo più o meno voluto potrebbero essere fraintese.</p>

<h2 id="lacommunitydelcrowdfunding">La "community del crowdfunding"</h2>

<p>Se pensate che ci siano delle persone con i soldi in mano pronti a finanziare la vostra idea, partite già col piede sbagliato. Se qualcuno decide di <strong>donarvi</strong> o <strong>acquistare in prevendita</strong> qualcosa è perché <strong>si fida di voi e della vostra storia pregressa</strong>, no perché ha trovato qualcosa di vagamente interessante che vuole finanziare.</p>

<p>Il fatto che vi troviate in mezzo a Nmila progetti su una piattaforma tipo <strong>Kickstarter</strong>, <strong>Eppela</strong>, <strong>Indiegogo</strong>, è irrilevante. Nel mio caso il traffico interno dovuto alla piattaforma è stato del 10% e ha generato lo 0% di conversioni.</p>

<p>L'altro punto è che potreste non essere presi da una piattaforma, e pazienza, c'é chi si è fatto una <a href="http://www.selfstarter.us/">landing page crowdfunding da solo</a> e ha avuto successo lo stesso.</p>

<h2 id="prezziecorrettezza">Prezzi e correttezza</h2>

<p>Pensate che alcuni deal, finanziamenti, sono finti? È così, le piattaforme privatamente o velatamente incentivano i creatori ad auto-acquistarsi delle offerte. Dopotutto voi sareste disponibili ad aderire pagando anche solo 10€ per un progetto che fino a quel momento ha raggiunto 0€? <br>
Il "network effect" non è facile, soprattutto se non sei nessuno o quasi, e anche se lanci un progetto su una nicchia che ti compete e c'é un mercato, non è detto che riuscirai a raggiungere le persone interessate in tempo utile per la durata della campagna. <br>
Ho visto gente pagare pubblicità su Facebook per portare traffico alla propria campagna di crowdfunding (e poi non riuscire comunque a raggiungere l'obbiettivo). <br>
Le persone fanno <em>acquisti online</em> per <strong>soddisfare un bisogno specifico, urgente</strong> o <strong>perché trovano "un affare"</strong> e nel crowdfunding ci sono tempi incerti e riguardo il prezzo, nessuno ti può garantire che se aderirai alla campagna nel frattempo non esca un prodotto innovativo analogo a un prezzo migliore.</p>

<p>Il mio consiglio sulla questione è prevedere diversi deal per attrarre gli "early adopters", ma allo stesso tempo non svendere troppo il prodotto (anche se è solo in via di sviluppo).</p>

<p>Se state sviluppando un software, libro ebook, videogioco,.. mettete diversi scalini, ma dall'offerta più conveniente (quella che esaurirà subito) a quella più cara non dovrebbe esserci un divario di più del 50%. Altrimenti si innesca uno strano meccanismo psicologico a quelli che arrivano dopo. Ovvero, l'invidia di quelli che l'hanno acquistato prima, il pensiero che quelli che l'hanno acquistato prima hanno fatto un'affare, mentre l'ultimo arrivato, no. <br>
Anche se magari l'offerta più cara è comunque un buon prezzo. </p>

<h2 id="conclusioneilcrowdfundingserve">Conclusione: il crowdfunding serve?</h2>

<p>Se lo vedi come <strong>un facile modo per trovare del capitale per la tua startup</strong> che giustifichi il tuo progetto.. <strong>NO</strong>.</p>

<p>Se lo vedi come un modo per fare marketing, validare l'idea e trovare i tuoi primi clienti.. <strong>Può servire</strong>. <br>
Può servire, come può servire un frigorifero agli eschimesi, si tratta comunque di un modo per aumentare la propria autorevolezza (è ad ogni modo un soggetto terzo che parla del tuo progetto), e insieme a una <strong>landing page</strong>, un <strong>video promozionale</strong> e <strong>una strategia di marketing social</strong>, può aiutarti a trovare nuove nicchie e clienti.</p>

<p>Happy experiments :)</p>]]></content:encoded></item><item><title><![CDATA[Hosting gratuito per NodeJS? Ci siamo quasi]]></title><description><![CDATA[<p>Visto che ho ricevuto molte richieste tramite <a href="https://corso-javascript.it/">Corso JavaScript</a>, su <strong>come iniziare a programmare e pubblicare dei progetti con JavaScript / NodeJS</strong> ho deciso di scrivere questo post e spero che possa essere utile.</p>

<p><img src="https://grigio.org/content/images/2016/10/gpost-.png" alt="enter image description here">
<em>Heroku può essere anche essere controllato via Dashboard Web, ma il terminale è meno dispersivo</em></p>

<p>Molti hanno</p>]]></description><link>https://grigio.org/hosting-nodejs/</link><guid isPermaLink="false">bf03fb6c-70ba-455a-a7de-af392a7762a7</guid><category><![CDATA[hosting]]></category><category><![CDATA[javascript]]></category><category><![CDATA[nodejs]]></category><category><![CDATA[ghost]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Fri, 28 Oct 2016 13:16:44 GMT</pubDate><content:encoded><![CDATA[<p>Visto che ho ricevuto molte richieste tramite <a href="https://corso-javascript.it/">Corso JavaScript</a>, su <strong>come iniziare a programmare e pubblicare dei progetti con JavaScript / NodeJS</strong> ho deciso di scrivere questo post e spero che possa essere utile.</p>

<p><img src="https://grigio.org/content/images/2016/10/gpost-.png" alt="enter image description here">
<em>Heroku può essere anche essere controllato via Dashboard Web, ma il terminale è meno dispersivo</em></p>

<p>Molti hanno iniziato a programmare e a pubblicare i propri lavori attraverso <a href="http://altervista.org/">Altervista</a>, un <strong>hosting gratuito per PHP</strong> oppure attraverso CPanel, ed è comprensibile. Tuttavia per NodeJS le cose funzionano un po' diversamente e nonostante sia improbabile trovare un <strong>hosting gratuito NodeJS</strong> è comunque possibile avvicinarsi a qualcosa di analogo.</p>

<p>La tecnologia che consiglio per mettere in produzione un'applicazione NodeJS è <a href="https://grigio.org/tag/docker">Docker</a> o comunque <strong>Linux Container</strong>, tuttavia se si cerca <strong>qualcosa di gratis ed immediato questa è la via che consiglio</strong>.</p>

<h2 id="lapaasherokuelesuelimitazioni">La PaaS Heroku e le sue limitazioni</h2>

<p>Heroku è la prima <em>Platform as a Service</em> ad avere riscosso un certo successo ed è anche il modo più veloce e con meno manutenzione che ci permette di mostrare qualcosa al mondo :) senza dover diventare sistemisti, in quanto ci dobbiamo preoccupare solo del nostro codice applicativo e lasciamo in gestione a loro il sistema operativo (Linux), i suoi aggiornamenti, la messa in sicurezza, la sua configurazione, database, backup.. e tanti aspetti che almeno all'inizio non fanno la differenza.</p>

<p>Ecco i limiti principali di Heroku gratuito:</p>

<ul>
<li><p>Le applicazioni su Heroku <strong>non gestiscono file statici</strong>, es. upload di immagini, file,.. o meglio se abbiamo questa necessità bisogna appoggiarsi a un server di terze parti: Amazon S3 o altro fornitore, per avere la persistenza.</p></li>
<li><p>La nostra applicazione NodeJS (o un'altra tecnologia) chiamata anche <em>Dyno</em>  viene "spenta" quando non viene utilizzata per più di 10 minuti (o comunque un tot di tempo), questo significa che a volte bisogna aspettare qualche secondo prima che il nostro sito sia nuovamente visibile. <strong>Si risolve passando a un piano a pagamento</strong>.</p></li>
<li><p>Il database Postgres può avere massimo un cero numero di record. <strong>Si risolve passando a un piano a pagamento</strong>.</p></li>
</ul>

<h2 id="prerequisiti">Prerequisiti</h2>

<p>Se già siete riusciti a sviluppare qualcosa in NodeJS avete già l'occorrente: npm, nodejs, git, dovete solo installare <a href="https://devcenter.heroku.com/articles/getting-started-with-nodejs#set-up">Heroku CLI</a>, il comando da terminale che vi permette di interagire con l'hosting.</p>

<h2 id="applicazionenodejsdesempiodatabaseghost">Applicazione NodeJS d'esempio + Database: Ghost</h2>

<p>Potrei scrivere un esempio in NodeJS, ma preferisco utilizzare un'applicazione reale. <a href="https://ghost.org/">Ghost</a> è una sorta di <em>Wordpress</em> sviluppata in NodeJS, quindi un'applicazione reale per fare blog e che memorizza i post in un database Postgres. Probabilmente quello che il 99% dei siti e applicazioni fanno. Se utilizzate <strong>MongoDB</strong>, <strong>Redis</strong> o un altro db la procedura sarà comunque molto simile.</p>

<p>Scompattate il file <code>.zip</code> che avete scaricato da Ghost e assicuratevi che la struttura sia analoga. Tutti i comandi che eseguiremo saranno dati dall'interno della cartella del progetto <code>ghost-corso-javascript</code>.  </p>

<pre><code>❯ mkdir ghost-corso-javascript
❯ cd ghost-corso-javascript
❯ ls
Gruntfile.js        PRIVACY.md          config.example.js   core                npm-shrinkwrap.json  
LICENSE             README.md           content             index.js            package.json  
</code></pre>

<h2 id="inizializzazionedelprogettoherokunodejs">Inizializzazione del progetto Heroku / NodeJS</h2>

<p>Create un file <code>Procfile</code>, questo file descrive come deve partire la vs applicazione sul server remote.</p>

<pre><code>web: npm start --production  
</code></pre>

<p>Ora ci autentichiamo con i dati di registrazione che abbiamo ottenuto da Heroku. È necessario farlo una sola volta.</p>

<pre><code>❯ heroku login
...
</code></pre>

<p>Perfetto, ora siamo pronti a creare, modificare o monitorare le nostre applicazioni su Heroku, senza necessariamente usare il browser.</p>

<p>Quindi creiamo la nostra prima applicazione pubblica, il nome e le password ci vengono generate in automatico da Heroku e possiamo anche verificarlo nella dashboard web.  </p>

<pre><code>❯ heroku create
Creating app... done, ⬢ intense-crag-21138  
</code></pre>

<pre><code>❯ heroku addons:add heroku-postgresql:hobby-dev --app intense-crag-21138
Creating heroku-postgresql:hobby-dev on ⬢ intense-crag-21138... free  
Database has been created and is available  
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pg:copy
Created postgresql-rugged-11532 as DATABASE_URL  
Use heroku addons:docs heroku-postgresql to view documentation  
</code></pre>

<p>Ovviamente i nomi generati per voi saranno diversi, ma in questo caso:</p>

<ul>
<li><strong>intense-crag-21138</strong> è il nome dell' app</li>
<li><strong>postgresql-rugged-11532</strong> è il nome del database</li>
</ul>

<p><strong>Sarà vostra cura mantenere segrete le password associate</strong>.</p>

<p>Bene, ora abbiamo un'applicazione vuota e un database associato. Dobbiamo inizializzare un progetto git (l'upload e le modifiche utilizzeranno questa convenzione). <br>
Poi dobbiamo ottenere l'<strong>url del database</strong> e <strong>associare il progetto git al repository git locale a quello remoto</strong>. Così come mostrato nei comandi sottostanti.</p>

<pre><code>❯ git init
❯ heroku config --app intense-crag-21138                                      
=== intense-crag-21138 Config Vars
DATABASE_URL: postgres://vxwuvgbqigvmhp:_cDFRk8HgoNXRDT7Q8IIeI-lJ7@ec2-54-243-249-56.compute-1.amazonaws.com:5432/df0vo3enil32je  
DATABASE_URL: postgres://user:password@host:port/dbname  
❯ heroku git:remote -a intense-crag-21138
set git remote heroku to https://git.heroku.com/intense-crag-21138.git  
</code></pre>

<p>Di tutte le modifiche fatte finora la nostra applicazione Ghost non è a conoscenza, quindi ora dobbiamo farle conoscere i parametri di produzione quando partirà in modalità <strong>production</strong>.</p>

<p>Quindi costruiamo il nostro <code>config.js</code> così come suggerito nell'esempio e andiamo a modificare la parte "production" con i dati che abbiamo in possesso. <br>
Come potete vedere in produzione, in questo caso, si può utilizzare addirittura un db diverso (Postgres) rispetto a quello usato in sviluppo (SQLite) e partendo dalla dburl che siamo in possesso ricaviamo: <strong>host</strong>, <strong>user</strong>, <strong>password</strong> e il <strong>nome del database</strong>.</p>

<pre><code>❯ cp config.example.js config.js
</code></pre>

<pre><code>    production: {
        url: 'http://intense-crag-21138.herokuapp.com',
        mail: {},
        database: {
            client: 'postgres',
            connection: {
                host: 'ec2-54-243-249-56.compute-1.amazonaws.com',
                user: 'vxwuvgbqigvmhp',
                password: '_cDFRk8HgoNXRDT7Q8IIeI-lJ7',
                database: 'df0vo3enil32je',
                port: '5432'
            },
            debug: false
        },

        server: {
            host: '0.0.0.0',
            port: process.env.PORT
        }
    },
</code></pre>

<p>Ci siamo quasi, ora dobbiamo solo più aggiungere le modifiche a git e pubblicare online i cambiamenti. <strong>Questi 3 comandi sono quelli che utilizzeremo ogni volta che vogliamo sincronizzare il codice locale con il codice remoto</strong>.</p>

<pre><code>❯ git add .
❯ git commit -m "Guarda mamma, ho l'app NodeJS online"
❯ git push heroku master
Counting objects: 491, done.  
Delta compression using up to 4 threads.  
Compressing objects: 100% (468/468), done.  
...
remote: -----&gt; Discovering process types  
remote:        Procfile declares types -&gt; web  
remote:  
remote: -----&gt; Compressing...  
remote:        Done: 53.5M  
remote: -----&gt; Launching...  
remote:        Released v4  
remote:        https://intense-crag-21138.herokuapp.com/ deployed to Heroku  
remote:  
remote: Verifying deploy... done.  
To https://git.heroku.com/intense-crag-21138.git  
 * [new branch]      master -&gt; master
</code></pre>

<p><strong>Congratulazioni, la vostra app NodeJS + Database è visibile a tutti su internet!</strong>
Nel log si vede che è riconosciuta come app NodeJS, vengono ricevuti i cambiamenti e il sito punta alla nuova versione.</p>

<p>Bello, ma come si fa a sapere se sta funzionando correttamente?</p>

<h2 id="manutenzioneedebugging">Manutenzione e debugging</h2>

<p>Non potendo gestire il server direttamente, Heroku ci mette comunque a disposizione dei tool per fare il deploy e capire come sta funzionando dietro le quinte.</p>

<p>Uptime. Con il seguente comando sappiamo da quanto tempo è attiva la nostra app e in che modalità.  </p>

<pre><code>❯ heroku ps
Free dyno hours quota remaining this month: 550h 0m (100%)  
For more information on dyno sleeping and how to upgrade, see:  
https://devcenter.heroku.com/articles/dyno-sleeping

=== web (Free): npm start --production (1)
web.1: up 2016/10/17 18:36:58 +0200 (~ 6m ago)  
</code></pre>

<p>Sta funzionando correttamente? Con i seguenti comandi possiamo vedere i log e/o riavviare la nostra istanza di app remota.</p>

<pre><code>❯ heroku logs
..
❯ heroku restart
Restarting dynos on ⬢ intense-crag-21138... done  
</code></pre>

<hr>]]></content:encoded></item><item><title><![CDATA[La Sharing Economy non esiste. Foodora, on-demand e YouTubers]]></title><description><![CDATA[<p>Pare sia scoppiato il caso, Foodora. I "foodorini" si lamentano che guadagnano troppo poco, <a href="https://www.youtube.com/watch?v=eyp1llxl_LY">Foodora censura</a> i commenti sui Facebook e <a href="http://www.lastampa.it/2016/10/10/cronaca/bloccare-laccesso-allapp-dei-lavoratori-foodora-la-nuova-frontiera-del-licenziamento-qAX2hzeWdsClOVS5Kmbi2I/pagina.html">sospende/licenzia alcuni lavoratori/collaboratori</a>.</p>

<p><img src="https://grigio.org/content/images/2016/10/Schermata-2016-10-10-alle-12-52-40.png" alt="sharing economy">
<em>Sharing Economy</em> su Google Trends.</p>

<h2 id="chefinehafattolasharingeconomy">Che fine ha fatto la Sharing Economy?</h2>

<p>Dagli stessi creatori di "Web 2.0", "Cloud", "Social Media", anche la</p>]]></description><link>https://grigio.org/la-sharing-economy-non-esiste-foodora-on-demand-e-youtubers/</link><guid isPermaLink="false">f8c42a4e-2bb5-4e3f-a5c9-f0e7ab62ab58</guid><category><![CDATA[economia]]></category><category><![CDATA[lavoro]]></category><category><![CDATA[youtubers]]></category><category><![CDATA[foodora]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Mon, 10 Oct 2016 13:41:48 GMT</pubDate><content:encoded><![CDATA[<p>Pare sia scoppiato il caso, Foodora. I "foodorini" si lamentano che guadagnano troppo poco, <a href="https://www.youtube.com/watch?v=eyp1llxl_LY">Foodora censura</a> i commenti sui Facebook e <a href="http://www.lastampa.it/2016/10/10/cronaca/bloccare-laccesso-allapp-dei-lavoratori-foodora-la-nuova-frontiera-del-licenziamento-qAX2hzeWdsClOVS5Kmbi2I/pagina.html">sospende/licenzia alcuni lavoratori/collaboratori</a>.</p>

<p><img src="https://grigio.org/content/images/2016/10/Schermata-2016-10-10-alle-12-52-40.png" alt="sharing economy">
<em>Sharing Economy</em> su Google Trends.</p>

<h2 id="chefinehafattolasharingeconomy">Che fine ha fatto la Sharing Economy?</h2>

<p>Dagli stessi creatori di "Web 2.0", "Cloud", "Social Media", anche la "Sharing Economy" inizia perdere un po' di "hype" come "buzzword".</p>

<p>Il <a href="https://grigio.org/tag/marketing/">marketing</a> ciclicamente ha bisogno di creare nuove parole, di far sognare, peccato che se uno non approfondisce i meccanismi che accadono dietro le quinte, si rischia di entusiasmarsi per nulla o peggio, di rimanere scottati.</p>

<p>cit. l'articolo de La Stampa: <br>
*Ambra: «Tutte under 30. Ho scelto di lavorare per Foodora per la flessibilità – spiega - mi permetteva di incastrare altre attività lavorative e personali. E portare avanti la mia vera carriera, quella di “arteterapia”, per cui ho studiato. ...E tu non sai se riuscirai a pagare l’affitto o le bollette». *</p>

<p>E qui mi viene di fare alcune riflessioni:</p>

<ul>
<li><p>cioé se una persona studia <strong>arteterapia</strong>,  perché poi pensa di poter pagarsi le bollette portando pizze in bici?</p></li>
<li><p>Il valore della sharing o meglio <strong>on-demand economy</strong>, è appunto di poterlo fare "su richiesta" o ad intermittenza, non quello di garantire il <em>giusto stipendio a tutti i lavoratori</em> per qualsiasi mansione. Sicuramente c'é gente che affitta case e poi le subaffitta via AirBnb, così si è creato un "lavoro stabile", però non è una cosa che si fa immediatamente, richiede tempo.</p></li>
</ul>

<p><strong>Pochi YouTuber guadagnano abbastanza per sopravvivere facendo solo quello, così come pochi giocano a calcio e sopravvivono facendo solo quello</strong>. <a href="https://www.youtube.com/watch?v=NHXWEKOIs8w">Quanto guadagnano gli YouTubers italiani?</a></p>

<p>Il lavoro, inteso come posto fisso seduto 8h a una scrivania è molto difficile da trovare, se <a href="https://www.youtube.com/watch?v=JVzQIlwXwC8">non morto</a> e le "opportunità" che sono emerse non sono tutte valide alternative, però con un minimo di matematica ci si può rendere subito conto se ne vale la pena investire il proprio tempo in questo modo oppure no. Probabilmente vale la pena <a href="https://grigio.org/perche-e-importante-specializzarsi-e-lavorare-in-remoto/">specializzarsi</a>.</p>]]></content:encoded></item><item><title><![CDATA[Possiamo smetterla di usare il termine "Informatico" come professione?]]></title><description><![CDATA[<p>Questa settimana deve essere la settimana dell'<strong>orgoglio nerd</strong>, sono spuntati come funghi articoli e discussioni che parlano delle frustrazioni della professione dell' <em>informatico</em> in Italia, sia nella <a href="https://medium.com/@sixpounder/cosa-vorrebbe-dirvi-un-informatico-quando-fate-domande-del-cazzo-33f84d54e3e1#.egwyzeysk">società</a>, che nel mondo del <a href="https://www.reddit.com/r/italy/comments/55mgii/programmatori_sottopagati_vi_siete_mai_chiesti/">lavoro</a>.</p>

<p><img src="https://grigio.org/content/images/2016/10/Schermata-2016-10-07-alle-13-31-00.png" alt=""></p>

<p>Secondo <strong>Google Trends</strong> l' "informatico" è ancora una parola tremendamente popolare in Italia, ma secondo <a href="https://translate.google.com/#it/en/io%20sono%20un%20informatico">Google</a></p>]]></description><link>https://grigio.org/possiamo-smetterla-di-usare-il-termine-informatico-come-professione/</link><guid isPermaLink="false">2696c9f9-bc20-4d18-8f81-af7c7824f634</guid><category><![CDATA[italia]]></category><category><![CDATA[lavoro]]></category><dc:creator><![CDATA[Luigi Maselli]]></dc:creator><pubDate>Fri, 07 Oct 2016 13:37:06 GMT</pubDate><content:encoded><![CDATA[<p>Questa settimana deve essere la settimana dell'<strong>orgoglio nerd</strong>, sono spuntati come funghi articoli e discussioni che parlano delle frustrazioni della professione dell' <em>informatico</em> in Italia, sia nella <a href="https://medium.com/@sixpounder/cosa-vorrebbe-dirvi-un-informatico-quando-fate-domande-del-cazzo-33f84d54e3e1#.egwyzeysk">società</a>, che nel mondo del <a href="https://www.reddit.com/r/italy/comments/55mgii/programmatori_sottopagati_vi_siete_mai_chiesti/">lavoro</a>.</p>

<p><img src="https://grigio.org/content/images/2016/10/Schermata-2016-10-07-alle-13-31-00.png" alt=""></p>

<p>Secondo <strong>Google Trends</strong> l' "informatico" è ancora una parola tremendamente popolare in Italia, ma secondo <a href="https://translate.google.com/#it/en/io%20sono%20un%20informatico">Google Translate non esiste</a>.</p>

<h2 id="macheprofessionelinformatico">Ma che professione è l'informatico?</h2>

<p>Secondo Wikipedia la <a href="https://it.wikipedia.org/wiki/Informatico#Le_figure_professionali_oggi">definizione di informatico</a> racchiude una serie di professioni che spazia da chi <strong>cambia gli hard disk ai computer</strong> a chi <strong>pianifica quali attività debba fare un sistema informativo all'interno di un'azienda</strong>.</p>

<p>Praticamente come se esistesse la categoria dell'<strong>esperto di benessere della persona</strong>, che spaziasse dal <strong>medico</strong> o <strong>soccorritore</strong> fino al <strong>comico intrattenitore</strong>.</p>

<p>Il punto è che oggi i computer sono ovunque e vengono usati in qualsiasi professione, per <em>analizzare</em>, <em>memorizzare</em>, <em>comunicare</em>, <em>costruire</em> e svolgere attività che in passato venivano svolte da altri strumenti fisici, quindi <strong>il fatto di saper usare il computer e sapere un minimo come funziona non caratterizza assolutamente le tue competenze e il tuo lavoro</strong>!</p>

<p>L'utilizzo di questo termine generico/fuorviante ha creato delle distorsioni che creano dei danni incredibili a tutta una serie di professioni legate al software:</p>

<ul>
<li><strong>Guru tuttologo dei computer</strong>: la mitica figura in grado di aggiustare lo smartphone rotto, darti consigli sull'hosting e costruirti il clone di Facebook per i gattini in 24h (a prezzi modici). Ovviamente senza nessuna specifica, basta fornire un logo e automaticamente il layout del sito si adatterà a desktop, tablet e app su smartphone secondo le esigenze del cliente</li>
<li><strong>Stipendi bassi</strong>: vista la difficoltà nel trovare la figura precedente, sicuramente si tratterà di una persona incapace. Non a caso <a href="https://grigio.org/lindagine-di-stackoverflow-fa-parlare-anche-ilsole24ore/">gli stipendi IT in Italia sono tra i più bassi in Europa</a>. Anche più bassi di Paesi i quali lavoratori non specializzati preferiscono emigrare in Italia.</li>
<li><strong>Stress e salute</strong>: il fatto che molti sviluppatori e altri professionisti siano coordinati da manager o figure che non distinguono chiaramente le professionalità, rende molto difficile l'ambiente lavorativo... e no, lo screenshot di un form non permette di definire API e validazione tra frontend e backend.</li>
</ul>

<p>Per concludere, anche il <a href="http://www.futuriodontoiatri.it/component/content/article/49-storia-dellodontoiatria/39--storia-dellodontoiatria-odontoiatri-gia-barbieri.html">barbiere e il dentista erano la stessa professione</a>, poi ad un certo punto si è capito che era meglio che ognuno si focalizzasse sulle proprie problematiche.. beh, quel momento è arrivato anche per l'informatico, <strong>non utilizzare più quel termine e lasciamolo tranquillamente all'oblio</strong>.</p>

<p>Grazie</p>]]></content:encoded></item></channel></rss>