<?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:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Caffeina Developers - Medium]]></title>
        <description><![CDATA[IDEAS NEVER SLEEP. - Medium]]></description>
        <link>https://medium.com/code-caffeina?source=rss----4a3ff832f2be---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Caffeina Developers - Medium</title>
            <link>https://medium.com/code-caffeina?source=rss----4a3ff832f2be---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 13 Nov 2026 04:13:28 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/code-caffeina" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Let’s talk about the low-code approach (Episode 2)]]></title>
            <link>https://medium.com/code-caffeina/lets-talk-about-the-low-code-approach-episode-2-4166b4a45e9c?source=rss----4a3ff832f2be---4</link>
            <guid isPermaLink="false">https://medium.com/p/4166b4a45e9c</guid>
            <category><![CDATA[coders]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[low-code]]></category>
            <dc:creator><![CDATA[Alessandro Casu]]></dc:creator>
            <pubDate>Fri, 30 Apr 2021 06:35:14 GMT</pubDate>
            <atom:updated>2021-04-30T06:33:16.157Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*UnBG4T3WZpelvWD3.jpg" /></figure><h3>Pros and cons of the low-code</h3><p>Here we are again. We left with some signs that the market was sending us:</p><ul><li>immediate time-to-market</li><li>massive digitization of processes</li><li>fast development and always in line with technologies</li><li>reduced time of system maintenance</li><li>reduced time in bug fixes</li></ul><p>These demands seem to be throwing <strong>standard development</strong> into crisis, as it is unable to keep up with customer demands. These needs seem to undermine <strong>standard</strong> <strong>development</strong>, which cannot keep up with customer requests.</p><p>Everything seems to be very complex because of the continuous need to “customize” every product, with the consequent being a <strong>strong request for developers compared to the real availability</strong>. In addition to this, there are problems related to the style of code writing, subjective from developer to developer, which rises to software maintenance problems. Last but not least, the number of projects that are in real life insist on a single figure…and so on and so forth.</p><p>What seemed to make the <strong>developer</strong> a <strong>fascinating job,</strong> future-oriented, innovation, research, “cool” things, today<strong> has made</strong> it a <strong>nightmare</strong>.</p><p>And it is precisely by acting on these aspects that low-code can lighten the load, allowing developers to dedicate themselves again to what makes them “happy”. (Some people enjoy seeing others running after a ball and some people benefit from incomprehensible strings of characters. That’s just the way we are!)</p><p>Be careful though: <strong>lighten up, not replace.</strong></p><p>In this episode we’ll talk about the advantages and disadvantages of a low-code approach.</p><h3>What really is low-code?</h3><p>When we talk about low-code, we’re talking about an approach in which the creation of a <strong>digital service/product can be done through the use of third-party platforms,</strong> without necessarily having development skills. Writing code is not, however, completely abandoned. The developer is strictly necessary for a few reasons:</p><ul><li>Customization of low-code modules, when required</li><li>Integration between modules</li><li>Insertions of any “pure” software layers to ensure interoperability between frameworks</li></ul><p>What is gained is mainly in the fact that the intervention of a developer can be easily restricted, allowing even non-technical figures to create digital products and services. A logical approach to problems and the ability to structure and modulate a solution are required.</p><h3>Not all that glitters is gold.</h3><p>But then if it’s so simple, why don’t we do everything in low-code?</p><p>Because it goes without saying that we are faced with a short blanket: if I pull on one side, I uncover the opposite.</p><p><strong>Not writing</strong> code<strong> involves someone writing it for us</strong>, maintaining it for us, and ensuring for us that everything works. <strong>You become dependent on someone else</strong>, and this must be taken into account when you choose to go down this road. If whoever manages the low-code platform that we have chosen, at a certain point decides to close, the risk that we find ourselves with a system that no longer works is very high..</p><p>It is also true that we are now in a <strong>historical context in which we tend to “own” less and less.</strong> The cloud and the services linked to it <strong>are the places/non-places</strong> where all the digital components on which we base our lives exist and live. And the cloud is not an eternal entity and is also subject to the rules of the market. The services on which we base our sites, our photos, our music, are also in this case, in the hands of someone else.<strong> And as much as we may consider it a valid solution, this someone else may one day decide to abandon everything, leaving us in the street.</strong></p><p>So by creating a similarity between the two contexts,<strong> just as with the cloud, with low-cod</strong>e, the risk of depending on someone is high. .</p><p>But it tends to be the case that the larger the entity you rely on, the more users that platform has, the less likely it is that it will abandon us.</p><h3>Advantages and disadvantages of low-code</h3><p>Below are the most obvious pros and cons of using a low-code approach.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aPozlBbC_r6phmaPjX8L5g.png" /></figure><p>What are immediately apparent are two aspects:</p><ul><li><strong>anyone can create a technological product</strong>: this solves the problem of lack of developers</li><li><strong>we don’t have full control</strong>: we don’t know exactly what’s going on “under the hood”.</li></ul><p>Everything is working, everything is spinning, we are fast, but there is a huge question mark over how this happens. Of course, that’s not a bad thing as long as you decide to focus on the end result and not on how it is achieved.</p><p>It is also true, however, that if we wanted to act with a “screwdriver” and go perform a “fine tuning” of our solution, this is impossible, since what we have in front of us is to all intents and purposes a closed box with “suggested” tools to use it.</p><h3>Possible scenarios</h3><p>So, given the benefits and risks, what scenarios does it make sense to cover with a low-code approach?</p><p><strong>1. Products with fast time-to-market, but not long-lasting</strong>: e.g. applications related to particular events, campaigns, historical moments.</p><p>Once we have established the theoretical <strong>duration</strong> of the <strong>project</strong> and chosen the <strong>low-code components</strong> that we are going to insert, we are almost sure to obtain an<strong> optimal result</strong> in a <strong>very short time</strong> without having to worry about having to scale up the product. In addition to this, if we have the fear of being left on the street by those who have developed the low-code platform we are relying on, we are almost sure that, <strong>if when it was chosen, it was solid</strong>, it will hardly close down without a fade-out that will lead us to sustain our solution until the established duration.</p><p><strong>2. Poc/MVP/Prototypes:</strong> if we need to <strong>evaluate</strong> the <strong>goodness</strong> of <strong>an idea,</strong> of a solution, without losing too much time in the implementation, the use of <strong>low-code</strong> platforms allows us to <strong>validate</strong> in a short time if a hypothetical <strong>architecture</strong>, a <strong>UX</strong> or certain <strong>functionalities</strong> have reason to exist for the hypothesized scenarios. In this way, the client can <strong>immediately understand</strong> whether to <strong>invest</strong> in a digital product <strong>or</strong> to <strong>abandon</strong> the decision.</p><p><strong>3.</strong> <strong>Business processes or tools:</strong> automating business processes. At certain times in a company it may be necessary to <strong>automate</strong> <strong>processes</strong> in order to dispose of<strong> jobs, migrations, conversions</strong> due to <strong>reorganization</strong>, systems audits that inevitably highlight inefficiencies that need to be corrected in a very short time. In addition to this, there is the need to create<strong> internal tools to manage certain activities related to projects</strong>: data analysis, machine learning, integration with external tools.</p><p><strong>4. Innovative projects</strong>: The continuous proliferation of new technologies makes it impossible to immediately implement solutions based on them. However, these new technologies put a lot of pressure on IT departments that have to maintain legacy projects and meet the “crazy” demands of those who want to see a new technology applied at all costs. <strong>IoT, Vocal Assistant, VR, AR, Smart Home</strong>, are filling our minds, stimulating ideas, but without real and measured validation on what impact they can have in our lives. Using a low-code approach we can quickly drop these technologies into reality raising the bar for experiences. <strong>We are approaching the future, but without too much “flutter”: we are experimenting.</strong></p><p><strong>5. Software Modules</strong>: if within our architecture we have repetitive, <strong>boring and time consuming software components in the development</strong>, these can be replaced, temporarily, by <strong>low-code modules</strong>, allowing an initial reduction of implementation time and costs. Only afterwards they can be replaced or strengthened with “pure” code.</p><h3>So?</h3><p>In conclusion: <strong>low-code</strong> today can be defined as an approach that, if placed side by side with the standard one, <strong>allows us to compensate for criticalities, allowing us to solve problems in the short term</strong>, with a series of advantages:</p><ul><li>Extension of the tech team with non-technical figures, making up for the lack of developers</li><li>Easing the workload of the developer who can concentrate on more complex projects</li><li>Experimentation without too much complexity</li><li>Realization of non-critical architectural modules, to be placed side by side to the “pure” code.</li></ul><p>In the next episode, we’re going to look at some low-code platforms to understand how they can fit within a project.</p><p>See you soon.</p><p>Alex.</p><p><a href="https://medium.com/p/f483c0f6c0a6">[Ita]</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=4166b4a45e9c" width="1" height="1" alt=""><hr><p><a href="https://medium.com/code-caffeina/lets-talk-about-the-low-code-approach-episode-2-4166b4a45e9c">Let’s talk about the low-code approach (Episode 2)</a> was originally published in <a href="https://medium.com/code-caffeina">Caffeina Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Parliamo dell’approccio low-code (Episodio 2)]]></title>
            <link>https://medium.com/code-caffeina/parliamo-dellapproccio-low-code-episodio-2-f483c0f6c0a6?source=rss----4a3ff832f2be---4</link>
            <guid isPermaLink="false">https://medium.com/p/f483c0f6c0a6</guid>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[development]]></category>
            <category><![CDATA[coders]]></category>
            <dc:creator><![CDATA[Alessandro Casu]]></dc:creator>
            <pubDate>Fri, 30 Apr 2021 06:34:47 GMT</pubDate>
            <atom:updated>2021-04-30T07:41:53.283Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*XQ0xlgEnz9ZbgQMO.jpg" /></figure><h3>Pro e contro del low-code</h3><p>Eccoci di nuovo qui. Ci eravamo lasciati con alcuni segnali provenienti dal mercato:</p><ul><li>time-to-market immediato</li><li>digitalizzazione massiva dei processi</li><li>sviluppo veloce e sempre al passo con le tecnologie</li><li>riduzione dei tempi di manutenzione sistemistica</li><li>riduzione dei tempi di risoluzione dei bug</li></ul><p>Queste esigenze sembrano mandare in crisi lo <strong>sviluppo standard</strong>, che non riesce a stare dietro alle richieste dei clienti.</p><p>Tutto sembra essersi complicato negli ultimi anni, vista la continua necessità di “personalizzare” ogni prodotto, con la conseguente <strong>forte richiesta di sviluppatori rispetto alla reale disponibilità</strong>. A questo si affiancano problemi legati allo stile di scrittura del codice, molto diverso da sviluppatore a sviluppatore, che fanno sorgere diverse difficoltà nella manutenzione del software. Infine il numero di progetti che nella vita quotidiana insistono su una unica figura…e chi più ne ha, più ne metta.</p><p>Ciò che sembrava fare dello <strong>sviluppatore</strong> un <strong>mestiere</strong> <strong>affascinante</strong>, orientato al futuro, all’innovazione, alla ricerca, alle cose “fighe”, oggi lo ha <strong>reso</strong> un <strong>incubo</strong>.</p><p>Ed è proprio agendo su questi aspetti che il low-code può alleggerire le attività, permettendo ai developers di dedicarsi di nuovo a ciò che li rende “felici”. (Eh si…siamo felici quando facciamo codice. C’è chi gode nel vedere gente che corre dietro ad una palla e chi trae giovamento da stringhe di caratteri incomprensibili. Siamo fatti così!)</p><p>Attenzione però: <strong>alleggerire, non sostituire</strong>.</p><p>In questo episodio parleremo dei vantaggi e degli svantaggi legati ad un approccio low-code.</p><h3><strong>Cosa è veramente il low-code?</strong></h3><p>Quando parliamo di low-code, parliamo di un approccio in cui la creazione di un <strong>servizio/prodotto digitale può avvenire attraverso l’impiego di piattaforme terze</strong>, senza necessariamente avere competenze di sviluppo. La scrittura del codice non è, però, completamente abbandonata. Lo sviluppatore è strettamente necessario per alcuni motivi:</p><ul><li>Personalizzazione dei moduli low-code, quando richiesto</li><li>Integrazione tra moduli</li><li>Inserimento di eventuali strati software “puri” atti a garantire l’interoperabilità fra framework</li></ul><p>Ciò che si guadagna risiede principalmente nel fatto che l’intervento di uno sviluppatore può essere circoscritto, limitato, permettendo anche a figure non propriamente tecniche, di poter realizzare prodotti e servizi digitali. E’ richiesto, fondamentalmente, un approccio logico ai problemi e la capacità di saper strutturare e modulare una soluzione.</p><h3><strong>Non è tutto oro quel che luccica.</strong></h3><p>Ma allora se è così semplice, perchè non facciamo tutto in low-code?</p><p>Perchè vien da se che siamo di fronte ad una coperta corta: se tiro da una parte, scopro la parte opposta.</p><p><strong>Non scrivere codice comporta che qualcuno lo scriva per noi</strong>, che lo mantenga per noi e che garantisca per noi che tutto funzioni. <strong>Si diventa a tutti gli effetti dipendenti da altri</strong> e questa situazione va tenuta in considerazione quando si sceglie di intraprendere questa strada. Se chi gestisce la piattaforma low-code che abbiamo scelto, ad un certo punto decide di chiudere, il rischio che ci si trovi con un sistema non più funzionante è molto alto.</p><p>E’ anche vero che ci troviamo ormai in <strong>un contesto storico in cui si tende a “possedere” sempre meno</strong>. Il cloud e i servizi ad esso legati <strong>sono i luoghi/non luoghi</strong> in cui esistono e vivono tutte le componenti digitali su cui basiamo la nostra vita. E il cloud non è una entità eterna ed è soggetto anch’esso alle regole del mercato. I servizi su cui poggiamo i nostri siti, le nostre foto, la nostra musica è anche in questo caso in mano a qualcun’altro. <strong>E per quanto una soluzione può sembrarci valida e affidabile, questo qualcuno un domani potrebbe decidere di abbandonare tutto, lasciandoci per strada</strong>.</p><p>Quindi creando una similitudine fra i due contesti, <strong>così come per il cloud, anche per il low-code, </strong>il rischio di dipendere da qualcuno è alto. Ma tendenzialmente,<strong> </strong>più è grande la realtà a cui ci si appoggia, più sono gli utenti che quella piattaforma la usano, meno probabilità ci sono che possa abbandonarci.</p><h3><strong>Vantaggi e svantaggi del low-code</strong></h3><p>Di seguito i pro e i contro più evidenti nell’uso di un approccio low-code.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*9C-TZnJOWBk0AfN2ktxbnw.png" /></figure><p>Quelli che risultano subito evidenti sono due aspetti:</p><ul><li><strong>chiunque può creare un prodotto tecnologico</strong>: questo risolve il problema della carenza di sviluppatori</li><li><strong>non abbiamo il pieno controllo</strong>: non sappiamo esattamente ciò che accade “sotto la scocca”.</li></ul><p>Tutto funziona, tutto gira, siamo veloci, ma c’è un enorme punto interrogativo su come questo accada. Ovviamente non è un male, nel momento in cui si decide di concentrarsi sul risultato finale e non sul come questo si ottenga.</p><p>Se volessimo, però, agire con un “cacciavite” e andare ad eseguire un “fine tuning” della nostra soluzione, questo è impossibile, o comunque difficile, dato che ciò che abbiamo davanti è a tutti gli effetti una scatola chiusa con degli strumenti “suggeriti” per usarla.</p><h3><strong>Scenari possibili</strong></h3><p>Quindi, visti i vantaggi e i rischi, quali scenari ha senso coprire con un approccio low-code?</p><p><strong>1. Prodotti con time-to-market veloce, ma non duraturi nel tempo</strong>: per esempio applicazioni legate ad eventi particolari, campagne, momenti storici.</p><p>Stabilita la <strong>durata</strong> teorica del <strong>progetto</strong> e scelte le <strong>componenti</strong> <strong>low-code</strong> che andiamo ad inserire, siamo pressoché sicuri di ottenere un <strong>risultato ottimale</strong>, in <strong>pochissimo tempo</strong> senza doverci preoccupare di dover scalare il prodotto. Oltre a questo, se abbiamo il timore di essere lasciati per strada da chi ha sviluppato la\le piattaforma\e low-code a cui ci appoggiamo, siamo pressoché sicuri che, <strong>se quando è stata scelta era solida</strong>, non possa chiudere di punto in bianco senza un fade-out che ci porti a sostenere la nostra soluzione fino alla durata stabilita.</p><p><strong>2. Poc/MVP/Prototipi</strong>: se abbiamo esigenza di <strong>valutare</strong> la <strong>bontà</strong> di <strong>un’ idea,</strong> di una soluzione, senza dover perdere troppo tempo nella messa in esercizio, l’utilizzo di piattaforme <strong>low-code</strong> ci consente di <strong>validare</strong> in poco tempo se una <strong>architettura</strong> ipotetica, una <strong>UX</strong> o determinate <strong>funzionalità</strong> hanno ragione di esistere per gli scenari ipotizzati. Il <strong>cliente</strong> ha così la possibilità di <strong>capire</strong> <strong>immediatamente</strong> se <strong>investire</strong> su un prodotto digitale <strong>o</strong> se <strong>abbandonare</strong> la decisione.</p><p><strong>3. Processi aziendali:</strong> automazione di processi aziendali. In determinati momenti storici, in una azienda potrebbe risultare necessario andare ad <strong>automatizzare</strong> dei <strong>processi</strong> per <strong>smaltire</strong> <strong>lavorazioni</strong>, effettuare <strong>migrazioni</strong>, avviare <strong>conversioni</strong> dovute a <strong>riorganizzazioni</strong>, audit di sistemi che inevitabilmente vanno ad evidenziare inefficienze da correggere in pochissimo tempo</p><p><strong>4. Progetti innovativi</strong>: il proliferare continuo di nuove tecnologie, rende impossibile una applicazione immediata di soluzioni basate su esse. Tuttavia proprio queste nuove tecnologie esercitano molta pressione sui reparti IT che si trovano a dover mantenere progetti legacy e a soddisfare le richieste “pazze” di chi a tutti i costi vuole vedere applicata una nuova tecnologia. <strong>IoT, Vocal Assistant, VR, AR, Smart Home</strong>, stanno riempiendo le nostre menti, stimolando idee, ma senza una reale e misurata validazione su che impatto possano avere nella vita. Usando un approccio low-code possiamo in poco tempo calare queste tecnologie nella realtà alzando il livello delle esperienze. <strong>Ci avviciniamo al futuro, ma senza troppo “sbattimento”: stiamo sperimentando.</strong></p><p><strong>5. Moduli software: </strong>se all’interno della nostra architettura abbiamo delle <strong>componenti software ripetitive</strong>, <strong>noiose e time consuming nello sviluppo</strong>, queste possono essere sostituite, temporaneamente, da <strong>moduli low-code</strong>, permettendo un abbattimento iniziale dei tempi di realizzazione e dei costi. Solo successivamente potranno essere sostituiti o irrobustiti con codice “puro”.</p><h3><strong>Quindi?</strong></h3><p>In conclusione: <strong>il low-code</strong> ad oggi può essere un approccio che, se affiancato a quello standard, <strong>permette di andare a compensare delle criticità, permettondoci di risolvere alcune problematiche nel breve periodo</strong>, con una serie di vantaggi:</p><ul><li>estensione del team tech con figure non tecniche, sopperendo alla carenza di sviluppatori</li><li>alleggerimento del lavoro dello sviluppatore che può concentrarsi su progetti più complessi</li><li>sperimentazione senza troppe complessità</li><li>realizzazione di moduli architetturali non critici, da affiancare al codice “puro”.</li></ul><p>Nel prossimo episodio andiamo ad analizzare alcune piattaforme low-code per capire come possono essere inserite all’interno di un team di sviluppo.</p><p>Alla prossima.</p><p>Alex.</p><p><a href="https://medium.com/p/4166b4a45e9c/">[Eng]</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f483c0f6c0a6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/code-caffeina/parliamo-dellapproccio-low-code-episodio-2-f483c0f6c0a6">Parliamo dell’approccio low-code (Episodio 2)</a> was originally published in <a href="https://medium.com/code-caffeina">Caffeina Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Let’s talk about low-code approach (Episode 1)]]></title>
            <link>https://medium.com/code-caffeina/lets-talk-about-low-code-approach-episode-1-ce0b62ba791f?source=rss----4a3ff832f2be---4</link>
            <guid isPermaLink="false">https://medium.com/p/ce0b62ba791f</guid>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[coders]]></category>
            <category><![CDATA[development]]></category>
            <dc:creator><![CDATA[Alessandro Casu]]></dc:creator>
            <pubDate>Fri, 26 Mar 2021 13:53:55 GMT</pubDate>
            <atom:updated>2021-04-08T09:23:28.949Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*kDyjYlYyp9oUuZJI" /></figure><h3><strong>Introduction</strong></h3><p>I was also a developer and one of those people who fell in love with the philosophy that put the <strong>“beautiful code</strong>” at the center of their work, <strong>well written</strong>, in a refined way, <strong>only for the sophisticated palate.</strong></p><p>I have seen the concept of development change: from monolithic <strong>C</strong> to object-oriented programming in <strong>C ++</strong>, to get, with <strong>JAVA</strong>, the abolition of the pointer, up to <strong>C #</strong>, which provided a beneficial and functional visual environment, passing through standardization of <strong>patterns</strong>, up to the tools of today that make the work more accessible and more solid.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*smWgVFlIZH0bvbUy" /><figcaption>The evolution of programming</figcaption></figure><p>This path always had critics or sponsors due to change being seen as a danger for those who believe “It already works well!” or those who “The future is already here.”</p><p>The fact is that these changes have made it possible to focus more and more on ideas, trying to break down where possible and the recursive and recurrent components’ implementation times.</p><p>It’s called progress or innovation or whatever the hell you want to call it!</p><h3><strong>The “progress” at the base of new choices</strong></h3><p>In philosophy, progress is “<em>the development of human society in its history conceived as a linear proceeding, where improvements in every aspect of human existence, presumed as prevalent to interruptions and setbacks, accumulate in such a way as to determine favorable conditions, advanced material and spiritual aspects of human life </em>“(cit. Wikipedia)</p><p>Applied to technology, I would translate it as follows:<strong> placing a new brick to build subsequent ones endlessly.</strong></p><p>So why not take all that is useful and good that has been done in software development, make it easy to access, and use to concentrate on subsequent evolutions?</p><p>And this is where the <strong>low-code approach</strong> can prove to be <strong>successful.</strong></p><p>Before delving into and dissecting all the hidden implications behind such an approach, I would like to discuss what prompted me to consider such a solution. I will do this in several articles so that you can reflect and metabolize the concepts every time.</p><p>I believe that a gradual path is critical because such a choice can have non-trivial consequences. Not only from a technical point of view but also from a “social” point of view: new types of teams, new professional figures, new organizational models will have to be born.</p><p>I conclude this introduction by providing the first starting point for the subsequent analysis, calling into question what drives most of the entrepreneurial choices: <strong>the market.</strong></p><h3><strong>Today, what is the market suggesting to us?</strong></h3><p>“Every company is now a software company” is the message that Satya Nadella, CEO of Microsoft, launched a couple of years ago from the Mobile World Congress stage.</p><p>The message was born from the companies’ awareness that a <strong>digitization process</strong> was appropriate to<strong> keep up with the markets’ evolution.</strong></p><p>Processes and services must be digitized, and doing it well means making a difference compared to competitors. And what if software development can make this possible? This is why it has become a critical activity for (almost) everyone.</p><p>Placed in this new perspective, <strong>“software development”</strong> today is not only creating monolithic applications. It becomes the creation of <strong>applications</strong>, <strong>workflows</strong>, and <strong>services</strong> that act within the company to <strong>improve</strong> its processes and, why not, the lives of employees and end-users who use the services.</p><p>Development is, therefore, more articulated, sometimes even more complex, while professionals are asked to develop <strong>more and more quickly</strong>, to meet the increasingly numerous and pressing demands of customers. But software development is not magic: <strong>well-made software requires time, people, investments</strong>. And developers seem to be in short supply compared to today’s immense demand.</p><p>This is why companies have always looked with interest to the promises of <strong>“alternative” development</strong>, which <strong>reduces</strong> the <strong>“code-grinder”</strong> part to get to the applications first while trying to satisfy the tendency of developers to learn, create, dare.</p><h3>But is there a solution?</h3><p>For some time now, these needs seem to be met by platforms and frameworks that promise to facilitate development with results comparable to those of a classic development.</p><p>So the question we all ask ourselves (and which I have also asked myself, of course) is: have we found the panacea for all ills? So now we can make developers happy, produce code in no time, satisfy customers and even become “rich”?</p><p>That’s not quite the case. However, the right alchemy of ingredients can lead to unexpected results for critics and balanced solutions for those too enthusiastic.</p><p>Therefore, it seems possible to respond to a particular slice of the market, which requires speed, scalability, solidity, and a pinch of customization, without completely distorting the approach, work, and skills of the developers that are always fundamental and essential, whatever the scenario.</p><p>I share some articles that may give evidence of the interest currently presented around the low-code approach.</p><ul><li><a href="https://insidebigdata.com/2021/01/09/why-2021-is-the-year-of-low-code/">https://insidebigdata.com/2021/01/09/why-2021-is-the-year-of-low-code/</a></li><li><a href="https://blog.cubeapps.co/2021-how-low-code-will-be-at-the-heart-of-businesses-fight-in-the-post-covid-world-cd2b4b4f3f89">https://blog.cubeapps.co/2021-how-low-code-will-be-at-the-heart-of-businesses-fight-in-the-post-covid-world-cd2b4b4f3f89</a></li><li><a href="https://powerapps.microsoft.com/en-us/blog/3-low-code-trends-why-low-code-will-be-big-in-your-2021-tech-strategy/">https://powerapps.microsoft.com/en-us/blog/3-low-code-trends-why-low-code-will-be-big-in-your-2021-tech-strategy/</a></li></ul><p>We will see in the following articles if all this is possible and how.</p><p>See you soon and stay tuned.</p><p><a href="https://medium.com/p/8350ae723797">[Ita]</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ce0b62ba791f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/code-caffeina/lets-talk-about-low-code-approach-episode-1-ce0b62ba791f">Let’s talk about low-code approach (Episode 1)</a> was originally published in <a href="https://medium.com/code-caffeina">Caffeina Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Parliamo dell’approccio low-code (Episodio 1)]]></title>
            <link>https://medium.com/code-caffeina/parliamo-dellapproccio-low-code-episodio-1-8350ae723797?source=rss----4a3ff832f2be---4</link>
            <guid isPermaLink="false">https://medium.com/p/8350ae723797</guid>
            <category><![CDATA[low-code]]></category>
            <category><![CDATA[coders]]></category>
            <category><![CDATA[development]]></category>
            <dc:creator><![CDATA[Alessandro Casu]]></dc:creator>
            <pubDate>Fri, 26 Mar 2021 13:53:33 GMT</pubDate>
            <atom:updated>2021-04-08T09:24:34.931Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*lmkalZrGSILLsFwb" /></figure><h3>Introduzione</h3><p>Sono stato anche io sviluppatore e uno di quelli innamorati della filosofia che metteva al centro del proprio lavoro il “<strong>codice bello</strong>”, <strong>scritto bene</strong>, in modo raffinato, <strong>solo per palati fini</strong>.</p><p>Ho visto cambiare il concetto di sviluppo: dal monolitico <strong>C</strong>, alla programmazione a oggetti del <strong>C++</strong>, per arrivare, con <strong>JAVA</strong>, all’abolizione del puntatore, fino al <strong>C#</strong> che metteva a disposizione un ambiente visuale molto utile e funzionale, passando per la standardizzazione dei <strong>pattern</strong>, fino ad arrivare agli strumenti di oggi che rendono il lavoro sempre più agevole e solido.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/800/0*7dNY_RU_sVlfB8BE" /><figcaption>L’evoluzione della programmazione</figcaption></figure><p>Questo percorso ha avuto sempre detrattori o sponsor, perchè ogni cambiamento è sempre visto come dannatamente pericoloso per quelli che “Funziona già bene!” o magicamente risolutivo per chi “Il futuro è già qui”.</p><p>Fatto sta che questi cambiamenti hanno fatto in modo che ci si potesse sempre di più concentrare sulle idee, cercando di abbattere, dove fosse possibile, i tempi di realizzazione di componenti ricorsivi e ricorrenti.</p><p>Si chiama progresso o innovazione o come diavolo vogliate chiamarlo!</p><h3><strong>Il “progresso” alla base delle nuove scelte</strong></h3><p>In filosofia, il progresso è “l<em>o sviluppo della società umana nella sua storia concepita come un lineare procedere, dove i miglioramenti di ogni aspetto dell’esistenza umana, presupposti come prevalenti rispetto alle interruzioni e agli arretramenti, si accumulano in modo da determinare condizioni positivamente avanzate, materiali e spirituali, della vita umana</em>” (cit. Wikipedia)</p><p>Applicato alla tecnologia lo tradurrei nel seguente modo: <strong>piazzare un nuovo mattone per poter costruire quelli successivi, all’infinito</strong>.</p><p>E allora, perchè non prendere tutto ciò che di utile e buono è stato fatto in ambito di sviluppo software, renderlo di facile accesso e utilizzo per potersi concentrare sulle evoluzioni successive?</p><p>Ed è qui che l’<strong>approccio low-code</strong> può rivelarsi <strong>vincente</strong>.</p><p>Prima di approfondire e sviscerare tutte le implicazioni nascoste dietro ad un approccio del genere, vorrei ragionare con voi su cosa mi ha spinto a prendere in considerazione una tale soluzione. Lo farò in diversi articoli, in modo da poter ogni volta riflettere e metabolizzare i concetti.</p><p>Ritengo che un percorso graduale sia importante perchè una scelta del genere può avere conseguenze non banali, non solo dal punto di vista tecnico, ma anche dal punto di vista “sociale”: dovranno nascere nuove tipologie di team, nuove figure professionali, nuovi modelli organizzativi.</p><p>Concludo questa introduzione fornendo già adesso il primo spunto per l’analisi successiva, chiamando in causa ciò che guida la maggior parte delle scelte imprenditoriali: <strong>il mercato</strong>.</p><h3><strong>Cosa ci suggerisce oggi il mercato.</strong></h3><p>“<em>Every company is now a software company</em>” è il messaggio che Satya Nadella, CEO di Microsoft, lanciò un paio di anni fa dal palco del Mobile World Congress.</p><p>Il messaggio nasceva dalla presa di coscienza delle aziende che un <strong>processo di digitalizzazione</strong> fosse opportuno <strong>per essere al passo con l’evoluzione dei mercati</strong>.</p><p>I processi, i servizi vanno digitalizzati e farlo bene significa fare la differenza rispetto ai concorrenti. E cosa se non lo sviluppo software può rendere possibile questo? Per questo è diventato un’attività critica per (quasi) tutti.</p><p>Calato in questa nuova prospettiva, lo “<strong>sviluppo software</strong>” oggi non solo è la creazione di applicazioni monolitiche. Diventa la creazione di <strong>applicazioni</strong>, di <strong>workflow</strong> e <strong>servizi</strong> che agiscono all’interno dell’azienda per <strong>migliorare</strong> i suoi processi e, perchè no, la vita dei dipendenti e degli utenti finali, che i servizi li usano.</p><p>Lo sviluppo si fa quindi più articolato, a volte anche più complesso, mentre agli addetti ai lavori si chiede di <strong>sviluppare di più e </strong><a href="https://www.impresacity.it/news/23893/scrum-sviluppo-agile.html"><strong>più in fretta</strong></a>, per soddisfare le richieste sempre più numerose e pressanti dei clienti. Ma lo sviluppo software non è magia: <strong>software ben realizzati richiedono tempo, persone, investimenti</strong>. E gli sviluppatori sembrano scarseggiare rispetto alla grande domanda di oggi.</p><p>È per questo che le imprese hanno sempre guardato con interesse alle promesse dallo <strong>sviluppo “alternativo”</strong>, qualsiasi cosa che aiutasse a <strong>ridurre</strong> la parte <strong>“macina-codice”</strong> per arrivare prima alle applicazioni, cercando al contempo di soddisfare la tendenza degli sviluppatori ad apprendere, creare, osare.</p><h3>Ma esiste una soluzione?</h3><p>Queste esigenze da un po’ di tempo, sembrano essere soddisfatte da piattaforme e framework che promettono di facilitare lo sviluppo con dei risultati paragonabili a quelli di uno sviluppo classico.</p><p>E allora la domanda che ci poniamo tutti (e che mi sono posto anche io, ovviamente) è: abbiamo trovato la panacea di tutti i mali? Quindi ora possiamo rendere felici gli sviluppatori, produrre codice in poco tempo, soddisfare i clienti e addirittura diventare “ricchi”?</p><p>Inutile dire che non è proprio così. La giusta alchimia degli ingredienti, però, può portare a risultati inattesi per i detrattori e a soluzioni equilibrate per quelli troppo entusiasti.</p><p>Sembra possibile, dunque, rispondere ad una particolare fetta di mercato, che richiede velocità, scalabilità, solidità e un pizzico di personalizzazione, non snaturando del tutto l’approccio, il lavoro e le competenze degli sviluppatori sempre fondamentali e imprescindibili, qualsiasi sia lo scenario.</p><p>Vi condivido alcuni articoli che possono dare evidenza dell’interesse ad oggi presenta attorno all’approccio low-code.</p><ul><li><a href="https://insidebigdata.com/2021/01/09/why-2021-is-the-year-of-low-code/">https://insidebigdata.com/2021/01/09/why-2021-is-the-year-of-low-code/</a></li><li><a href="https://blog.cubeapps.co/2021-how-low-code-will-be-at-the-heart-of-businesses-fight-in-the-post-covid-world-cd2b4b4f3f89">https://blog.cubeapps.co/2021-how-low-code-will-be-at-the-heart-of-businesses-fight-in-the-post-covid-world-cd2b4b4f3f89</a></li><li><a href="https://powerapps.microsoft.com/en-us/blog/3-low-code-trends-why-low-code-will-be-big-in-your-2021-tech-strategy/">https://powerapps.microsoft.com/en-us/blog/3-low-code-trends-why-low-code-will-be-big-in-your-2021-tech-strategy/</a></li></ul><p>Vedremo nei prossimi articoli se tutto ciò è veramente possibile e come.</p><p>A presto e “stay tuned”.</p><p><a href="https://medium.com/p/ce0b62ba791f">[Eng]</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8350ae723797" width="1" height="1" alt=""><hr><p><a href="https://medium.com/code-caffeina/parliamo-dellapproccio-low-code-episodio-1-8350ae723797">Parliamo dell’approccio low-code (Episodio 1)</a> was originally published in <a href="https://medium.com/code-caffeina">Caffeina Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Pure CSS Material Design Input]]></title>
            <link>https://medium.com/code-caffeina/pure-css-material-design-input-d581b45d6469?source=rss----4a3ff832f2be---4</link>
            <guid isPermaLink="false">https://medium.com/p/d581b45d6469</guid>
            <category><![CDATA[css]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[material-design]]></category>
            <dc:creator><![CDATA[Andrea "Fiad" Fiadone]]></dc:creator>
            <pubDate>Tue, 12 Jan 2021 10:32:25 GMT</pubDate>
            <atom:updated>2021-01-12T09:58:38.091Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*vkIH1E7usLh7j7Sn3wKgVA.jpeg" /></figure><h3>TL;TR</h3><p>Many times we’ve been asked to develop interfaces containing material-design style input elements and, since they usually require some custom validation logic, we have always relied on javascript for their visual state handling too. Today we want to propose a leaner pure-css approach for their implementation. It’s very useful and performing, especially if the javascript part would be used for graphic purposes only.</p><h3>THE CHALLENGE</h3><p>Our goal is to create a classic material-design style input without javascript, i.e. a field with a label overlaying the input that moves above it on focus, as shown in the figures below:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Yu1jqzgJSSh9EwjI0LZWmA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sSDr5BbLPHHQB1Ik86M_9A.png" /><figcaption>Input statuses (from default to focused/filled)</figcaption></figure><h3>LET’S CODE</h3><p>First, we define the markup code of the sample field:</p><p>&lt;div class=&quot;<strong>field</strong>&quot;&gt;<br> &lt;input class=&quot;<strong>field__input</strong>&quot; type=&quot;text&quot; name=&quot;firstname&quot; /&gt;<br> &lt;p class=&quot;<strong>field__label</strong>&quot;&gt;Firstname&lt;/p&gt;<br>&lt;/div&gt;</p><p>With no custom CSS applied, it will look something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/436/1*TWpNJ74yqeLaqt2Xk3bg0A.png" /><figcaption>Default output (no CSS applied)</figcaption></figure><p>Now, let’s write a few lines of CSS to apply some basic style to the input and to make the label overlying it:</p><p><strong>.field</strong> {<br> position: relative;<br>}</p><p><strong>.field__input</strong> {<br> appearance: none;<br> width: 100%;<br> padding: 12px;<br> border: solid 1px grey;<br> outline: none;<br> font-size: 16px;<br> line-height: 20px;<br>}</p><p><strong>.field__label</strong> {<br> position: absolute;<br> top: 0;<br> left: 0;<br> margin: 0;<br> transform-origin: 0 0;<br> transform: translate3d(12px, 12px, 0);<br> font-size: 14px;<br> line-height: 20px;<br>}</p><p>The result should look like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*wIv15DwaGtnO3u596mzDoA.png" /><figcaption>Basic CSS applied</figcaption></figure><p>At this point, we want the label to move above the input when it’s focused, so the user can freely enter some text. Let’s manage this feature with some additional CSS:</p><p><strong>.field__input:focus + .field__label</strong> {<br> transform: translate3d(0, -100%, 0) scale(0.875);<br>}</p><p>and just a few minor adjustments on the code written before:</p><p><strong>.field</strong> {<br> /* ... */<br> margin-top: 24px;<br>}</p><p><strong>.field__label</strong> {<br> /* ... */<br> text-transform: uppercase;<br> transition: transform .2s;<br>}</p><p>And that’s the result!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*w8KTmk1BaLN_Oh9o2UdLNg.png" /><figcaption>Focused input</figcaption></figure><p>But… just wait a second!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_O_b29hYsN3LAGiMlE4W3Q.png" /><figcaption>Blurred filled input</figcaption></figure><p>How can we keep the style applied on focus when the filled input will blur? This is most likely just the case where using javascript is the first solution we think of. Instead we can rely on the CSS <strong>:placeholder-shown </strong>pseudo-selector, which represents the status where the input shows its placeholder, i.e. when it’s not filled. So let’s apply some tweaks taking into account that this pseudo-selector will only work when the input tag’s <strong>placeholder</strong> attribute is set:</p><h4><strong>HTML</strong></h4><p>&lt;input<br> class=&quot;<strong>field__input</strong>&quot;<br> type=&quot;text&quot;<br> name=&quot;firstname&quot;<br> placeholder=&quot;Firstname&quot;<br>/&gt;</p><h4>CSS</h4><p><strong>.field__input:not(:placeholder-shown) + .field__label</strong> {<br> transform: translate3d(0, -100%, 0) scale(0.875);<br>}</p><p>Just look how close we are to the desired result!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4AgX5xL8a2mmTqXd07ZY7w.png" /><figcaption>Blurred filled input</figcaption></figure><p>Only one new problem remains: if the input value is deleted, we notice how the label overlays the native placeholder just set…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*M2ukqpTJhX3glZ1hz6u66g.png" /><figcaption>Blurred empty input</figcaption></figure><p>Luckily, there’s a very simple solution: we can override the default style applied by the browser to the <strong>::placeholder </strong>pseudo-element in order to hide it, as shown below:</p><p><strong>.field__input::placeholder</strong> {<br> color: transparent !important;<br> user-select: none !important;<br>}</p><p>Et voilà! Our pure-css material-design input is ready!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UDE1OsfPAZJXcChaksAW2A.gif" /><figcaption>Final result</figcaption></figure><p>Take a look at the <a href="https://codesandbox.io/s/pure-css-material-input-cnp0e">full example</a>!</p><h3>BUT… WHAT ABOUT SUPPORT?</h3><p>Although the pseudo-selectors/elements seen so far are well supported by modern browsers, your project could require some extended support, for instance, to IE11. In that case, no worries: let’s apply the following CSS and that’s it!</p><p><strong>.field__input:not(:-ms-input-placeholder) + .field__label</strong> {<br> transform: translate3d(0, -100%, 0) scale(0.875);<br>}</p><p><strong>.field__input:-ms-input-placeholder</strong> {<br> color: transparent !important;<br> -ms-user-select: none !important;<br>}</p><p>For more information about support, look at the following links:<br><a href="https://caniuse.com/css-placeholder-shown">https://caniuse.com/css-placeholder-shown</a><br><a href="https://caniuse.com/css-placeholder">https://caniuse.com/css-placeholder</a></p><h3>THAT’S ALL FOLKS! HAPPY CODING!</h3><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d581b45d6469" width="1" height="1" alt=""><hr><p><a href="https://medium.com/code-caffeina/pure-css-material-design-input-d581b45d6469">Pure CSS Material Design Input</a> was originally published in <a href="https://medium.com/code-caffeina">Caffeina Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tech Mondays #4]]></title>
            <link>https://medium.com/code-caffeina/tech-mondays-4-f83d778daaf7?source=rss----4a3ff832f2be---4</link>
            <guid isPermaLink="false">https://medium.com/p/f83d778daaf7</guid>
            <category><![CDATA[augmented-reality]]></category>
            <category><![CDATA[vuforia]]></category>
            <category><![CDATA[unity]]></category>
            <dc:creator><![CDATA[Jeuffre Brena Pulido]]></dc:creator>
            <pubDate>Fri, 07 Feb 2020 14:51:23 GMT</pubDate>
            <atom:updated>2020-02-07T14:51:23.232Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Tech Mondays #4 — AR Treasure Hunt" src="https://cdn-images-1.medium.com/max/1024/1*xKy2vu2Whh-tetmyCUEH6A.jpeg" /></figure><p>New year new <strong>TM episode</strong>. Back at work <strong>full of </strong>(food) <strong>ideas</strong> after the winter holidays, here we are with our first experiment of the year.</p><figure><img alt="WTF — Enhance work environment with augmented reality" src="https://cdn-images-1.medium.com/max/1024/1*j9CbyS352cZBROWZCwA09A.jpeg" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FQaCOK_DEYY4%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DQaCOK_DEYY4&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FQaCOK_DEYY4%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/6dff51c5f499ee60eeb96fb127ed0288/href">https://medium.com/media/6dff51c5f499ee60eeb96fb127ed0288/href</a></iframe><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kCjQiwkYgYTpX3cUzXU1ew.jpeg" /></figure><p>We wanted to explore <strong>the power of AR</strong> and develop <strong>common and shared knowledge.</strong></p><figure><img alt="HOW — C# Scripting — Vuforia — Unity" src="https://cdn-images-1.medium.com/max/1024/1*mJeL_ppt78MM7iE-shnG_g.jpeg" /></figure><h3>The Path choice</h3><p>To develop our idea we had several options, eventually narrowing the choice down to <strong>Unity + Vuforia, SparkAR, ARCore</strong>. Our decision was guided by the prototype needs and the platform features, we needed:</p><ul><li>AR features</li><li>Multi-target image recognition</li><li>Scripting interface</li></ul><p><strong>Unity + Vuforia</strong> was our final choice, as <strong>SparkAR</strong> does NOT have multi-target image recognition support and <strong>ARCore </strong>needed a deeper knowledge of mobile technology and ecosystem. At this stage, we didn’t take into account the distribution so that combo seemed to be the better choice.</p><h4>First enemies and friends</h4><p>After setting up Unity with Vuforia, we got used to working with the <strong>Unity</strong> interface. Thanks, <a href="https://www.youtube.com/watch?v=nv9qUEccIjE">YouTube mate</a>. 😄</p><p>At first, we were quite confident in handling the platform but, shortly after we realised <a href="https://en.wikipedia.org/wiki/RTFM"><strong>RTFM</strong></a> was the only way.</p><h4>Learning to read the map.</h4><p><strong>Reading the manual</strong> facilitated our journey in developing the idea, we took some pictures of some posters we have in the office and uploaded the images on the Vuforia developer portal, several times until we got <strong>the best score for every single image in order to be recognised by the tool</strong>.</p><h4>Implementing some strategy</h4><p>In Unity, we created <strong>target image objects</strong>. Every target had a <strong>handler</strong> to manage image detection.</p><p>To orchestrate the treasure hunt, we created another script aimed at handling the objects already recognised and <strong>notifying the user</strong> once they find a new object during the quest.</p><h3>Conclusion</h3><p>Considering none of us were 100% confident with the Unity interface, the prototyping took us 3–4 hours but we sorted out how to properly write the scripts and link them to the objects. In the end, the result was quite good.</p><p>Here you can find the code repository to run a <a href="https://github.com/caffeinalab/tech-mondays-4">demo</a>.</p><p>Tech Mondays is a series of events spontaneously organized at Caffeina’s HQ in Parma by the Technology Department and (for the time being) aimed towards its employees only. Never Sleep.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f83d778daaf7" width="1" height="1" alt=""><hr><p><a href="https://medium.com/code-caffeina/tech-mondays-4-f83d778daaf7">Tech Mondays #4</a> was originally published in <a href="https://medium.com/code-caffeina">Caffeina Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tech Mondays #3]]></title>
            <link>https://medium.com/code-caffeina/tech-mondays-3-daf4aba3eef7?source=rss----4a3ff832f2be---4</link>
            <guid isPermaLink="false">https://medium.com/p/daf4aba3eef7</guid>
            <category><![CDATA[caffeina]]></category>
            <category><![CDATA[pong]]></category>
            <category><![CDATA[tensorflow]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[tech-monday]]></category>
            <dc:creator><![CDATA[Vincent De Feo]]></dc:creator>
            <pubDate>Thu, 19 Dec 2019 17:27:25 GMT</pubDate>
            <atom:updated>2020-01-29T08:46:17.055Z</atom:updated>
            <content:encoded><![CDATA[<h4>Pong + Handtrack.js</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rt8IcTVytkzCzu5pn0aWWg.png" /></figure><p>So… holidays came and went, but right before enjoying our food-centric Italian traditions we worked on another experiment in the series.</p><p><strong>This time our team was very small.</strong> <br>In fact, because of vacations, we were just 3 people.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZrNCUEjaWs0eSk77HaDItQ.png" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F5qSVxtKtIGU%3Ffeature%3Doembed&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D5qSVxtKtIGU&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F5qSVxtKtIGU%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/c05d1478c5a6c687551971c5df27c6a9/href">https://medium.com/media/c05d1478c5a6c687551971c5df27c6a9/href</a></iframe><p>A <strong>Pong</strong> game, in the <strong>browser</strong>, controlled by <strong>YOU</strong>! <br>Our very own user.</p><p>Try for a <a href="https://master.tech-mondays-3.n3.caffeina.host/"><strong>live version</strong> <strong>here</strong></a>!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BtktbPgO7XA7VLRptiZ6zw.png" /></figure><p>We wanted to explore <strong>body-based UIs</strong>.</p><p>Some of us have prior experience doing <strong>pose estimation </strong>with Kinect, but we wanted to see <strong>how far</strong> we could get on our most loved (and hated) platform: <strong>the browser</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*oa4Avuh1egtzlkrZKgL5iQ.png" /></figure><p>We used a handy (badum, tss…) hand-detection library on top of <strong>tensorflow: </strong><a href="https://github.com/victordibia/handtrack.js/"><strong>Handtrack.js</strong></a></p><p>This kickstarted our development, gifting us with <strong>ready-made hand tracking! </strong>Now, that’s something!</p><p>We just needed to:</p><ul><li>map hand coordinates to screen-space</li><li>draw the paddles and the ball</li><li>write some game logic</li></ul><p>We also wrote some code on top of that library to <strong>only pick the best hand in both sides</strong> of the scene.</p><p>Soon we realized that <strong>waving your hand around </strong>for a long time <strong>is quite tiresome</strong>.</p><p>So we <strong>reduced the actual physical space</strong> which controlled the paddle, limiting it around the center of the scene.</p><p>This <strong>increased sensitivity</strong> of the controls and also resulted in <strong>higher stability</strong>.</p><p>After playing around for a while with some magic numbers, we found a balance, which allowed us to play a full game.</p><h3>The Aftermath</h3><p>We’re <strong>quite happy</strong> with the result. <br>It’s poor-man style, but <strong>it works</strong>, and it took between 3 and 4 hours to accomplish this.</p><p>While this is definitely <strong>NOT what we would do in production</strong>, we now know <strong>it is doable indeed</strong>!</p><p>If we had to bring this into a real world application we would most probably <strong>write our own logic</strong> on top of <strong>tensorflow + </strong><a href="https://github.com/tensorflow/tfjs-models/tree/master/body-pix"><strong>body-pix</strong></a>.</p><p>This was the last one for 2019.<br>Let’s see what we’ll come up with in 2020!</p><p>Tech Mondays is a series of events spontaneously organized at Caffeina’s HQ in Parma by the Technology Department and (for the time being) aimed towards its employees only. Never Sleep.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=daf4aba3eef7" width="1" height="1" alt=""><hr><p><a href="https://medium.com/code-caffeina/tech-mondays-3-daf4aba3eef7">Tech Mondays #3</a> was originally published in <a href="https://medium.com/code-caffeina">Caffeina Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Tech Mondays #2]]></title>
            <link>https://medium.com/code-caffeina/tech-mondays-2-ae7c0d112804?source=rss----4a3ff832f2be---4</link>
            <guid isPermaLink="false">https://medium.com/p/ae7c0d112804</guid>
            <category><![CDATA[prototyping]]></category>
            <category><![CDATA[led]]></category>
            <category><![CDATA[processing]]></category>
            <category><![CDATA[arduino]]></category>
            <category><![CDATA[technology]]></category>
            <dc:creator><![CDATA[Lorenzo Girardi]]></dc:creator>
            <pubDate>Mon, 25 Nov 2019 16:24:10 GMT</pubDate>
            <atom:updated>2019-11-25T16:24:10.013Z</atom:updated>
            <content:encoded><![CDATA[<h4>Arduino + Processing</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AP-oj0nAJ1FpjsEB4KRk8g.jpeg" /></figure><p>👋 Welcome back to the <strong>second issue</strong> of <strong>Tech Mondays!</strong></p><p>For this episode we’ve taken a lot of inspiration after a weekend at <strong>KIKK Festival in Namur 🇧🇪</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CMsXDepbnMywfEfXoI5ymQ.png" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FjpkiJm1I9VQ%3Ffeature%3Doembed&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DjpkiJm1I9VQ&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FjpkiJm1I9VQ%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/9f1f7b4a90e1a123c9ca91ff21636edb/href">https://medium.com/media/9f1f7b4a90e1a123c9ca91ff21636edb/href</a></iframe><p>Walking into the city we were overwhelmed by <strong>fresh tech installations</strong> and<strong> talented people</strong> who ⚡️ <strong><em>fueled our minds, </em></strong>so we came back with the idea of experimenting something with <strong><em>Arduino.</em></strong></p><p>The idea: <strong>visualizing</strong> <strong>people’s</strong> <strong>heartbeat on LEDs.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*u4wlqXZLh0A67uu3AGIbVg.png" /></figure><p>We <strong>wanted to get out of our comfort zone:</strong> none of us have <strong>solid knowledge </strong>of hardware topics and the first idea was visualizing something that <strong>human senses 💗 can’t perceive</strong>.</p><p>The <strong>main goal </strong>was to attempt <strong>a physical output</strong> having a <strong>physical input</strong>.</p><p>Some practical <strong>use cases</strong> for this could be:</p><ul><li><strong>Outdoor installations</strong>, for client exhibitions</li><li><strong>Physical Interfaces</strong>, like video playback speed</li><li><strong>Engagement</strong>, attracting people to try something new</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WN5CQCe2lPdH1Bt6hzEOQA.jpeg" /></figure><p>Here’s the <a href="https://www.amazon.it/ideas/amzn1.account.AFHSCPUJM7VK2JEV5DX66OGATLRQ/O8QD4F32URRP?ref=idea_cp_vl_ov_d"><strong>Shopping List</strong></a><strong> </strong>for our journey!</p><p>Same as the last episode, we <strong>split up</strong> into three working teams, with the following tasks:</p><ul><li><strong>Normalize </strong>heartbeat sensor values<strong> between 0 and 1</strong></li><li><strong>Plug-in </strong>the <strong>power supply</strong></li><li><strong>Turn on LEDs </strong>using <strong>Arduino</strong></li></ul><h3><strong>What’s Bad? 🖕</strong></h3><ul><li>The first team spent a lot of time <strong>because of a broken heartbeat sensor.</strong></li><li>The second team messed up by <strong>plugging the 5V ground cable into the regular power supply’s ground.</strong></li><li>At the end <strong>we had to fine tune </strong>sensor values by <strong>averaging</strong> them, in order to have a <strong>smooth LED wave</strong>.</li></ul><h3><strong>What’s Good? 🤟</strong></h3><ul><li>We found a <strong>sound sensor</strong> and <strong>we saved the journey.</strong></li><li><strong>The IDE Plotter was awesome to debug</strong> our application.</li><li>In <strong>almost 4 hours</strong> we came up <strong>with a first prototype</strong> which we shared with coworkers in our<strong> Innovation Room!</strong></li></ul><h3><strong>What’s Next? 👉</strong></h3><p>The first final result <strong>didn’t meet our expectations </strong>because of the output.<br>The <strong>interaction wasn’t engaging</strong> for the final users and <strong>visual was very basic as well.</strong></p><p>In the following days we decided to:</p><ul><li><strong>Replace</strong> the <strong>sound sensor</strong> with the <strong>heartbeat </strong>one<strong>.</strong></li><li><strong>Blend physical</strong> output with a <strong>digital</strong> one using <strong>Processing</strong>.</li></ul><p>We <a href="https://www.amazon.it/Haljia-Sensore-frequenza-cardiaca-Raspberry/dp/B01CBGH4N6/ref=sr_1_3?__mk_it_IT=%C3%85M%C3%85%C5%BD%C3%95%C3%91&amp;keywords=sensore+battito&amp;qid=1574256031&amp;sr=8-3"><strong>bought another heartbeat sensor</strong></a><strong>,</strong> plugged it into the Arduino and it finally worked! 🔮</p><p>We <strong>improved the code</strong> by modifying the way we read the input values and the LED visual output.</p><p>At the end, we added a <strong>final visualization</strong> with <a href="https://github.com/caffeinalab/tech-mondays-2/tree/master/processing"><strong>Processing</strong></a>. As shown in the video above, <strong>it begins when then LED stripe lights reach the end</strong>.</p><p><strong>Code</strong> and further technical details can be found in this <a href="https://github.com/caffeinalab/tech-mondays-2">GitHub repo</a>.</p><p>We also suggest to follow these tutorials (<a href="https://www.youtube.com/watch?v=Ls-6BeLHbA0">Tutorial 1</a>, <a href="https://www.youtube.com/watch?v=UhYu0k2woRM">Tutorial 2</a>) if you want to know more.</p><p><em>Tech Mondays is a series of events spontaneously organized at Caffeina’s HQ in Parma by the Technology Department and (for the time being) aimed towards its employees only. Never Sleep.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ae7c0d112804" width="1" height="1" alt=""><hr><p><a href="https://medium.com/code-caffeina/tech-mondays-2-ae7c0d112804">Tech Mondays #2</a> was originally published in <a href="https://medium.com/code-caffeina">Caffeina Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Route Fifty]]></title>
            <link>https://medium.com/code-caffeina/route-fifty-5551d4102da6?source=rss----4a3ff832f2be---4</link>
            <guid isPermaLink="false">https://medium.com/p/5551d4102da6</guid>
            <category><![CDATA[space]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[technology]]></category>
            <category><![CDATA[games]]></category>
            <category><![CDATA[digital]]></category>
            <dc:creator><![CDATA[Gian Guido Ponzini]]></dc:creator>
            <pubDate>Thu, 31 Oct 2019 10:01:46 GMT</pubDate>
            <atom:updated>2019-10-31T10:01:46.741Z</atom:updated>
            <content:encoded><![CDATA[<h4>From Web to the Moon, and back again!</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2q-muy1sfPSVIgIgV2OcMA.jpeg" /></figure><p>This story has two main parts to it. The first is a road, 481km in America that connect West Sacramento to Ocean City. The second is a young boy, born in Rome at 16 Via Tevere on 31st October, 1930. He was the son of an American soldier working at the embassy.</p><p>On 20th July 1969, while Armstrong and Aldrin made history by<strong> stepping </strong>foot on the moon, this boy who was now an adult, was on the <strong>Apollo 11 Command Module Columbia</strong>. He had to be in orbit for twenty-one and a half hours, an experience that journalists described as ‘the most profound solitude any human has ever known’. <strong>Michael Collins</strong>, the name of the boy, is the third hero in the moon landing story, and for us in the Tech Team, a symbol.</p><p>He is a symbol for all those who, thanks to their hard work <strong>behind the scenes</strong>, push the limits of mankind forward, which would otherwise be impossible without them. Going back to the road at the beginning, its name is <strong>Route Fifty</strong>, and it is known as being the <strong>most isolated road</strong> in the United Sates.</p><p>Whether the name Route Fifty reminds you of the<strong> 50th anniversary</strong> of the landing on the moon, or the <strong>strength and determination</strong> shown by Collins during his incredible endeavour, Route Fifty is a <strong>tribute to this story</strong> either way.</p><h3>Where we started?</h3><p>As an <strong>R&amp;D project </strong>our aim was to experiment with the creative process of an <strong>interactive game</strong>. To do that, we started with basic <strong>shaders</strong> and used <strong>Three.js</strong> to build up, step by step, a complete experience.</p><p>The Team was composed of 3 developers (<a href="https://medium.com/u/f3aa1d515849">Alberto Parziale</a>, <a href="https://medium.com/u/83cb81eb8045">Lorenzo Girardi</a>, <a href="https://medium.com/u/849128190a93">Vincent No</a>), a 3D artist (<a href="https://medium.com/u/ff4d062c7371">Gian Guido Ponzini</a>), a copywriter (<a href="https://medium.com/u/7af87373bb92">Daniel Molinari</a>), a QA Tester (Pietro Tancredi) and a UI/UX Designer (Nico Cherubin).</p><p>Our <strong>deadline </strong>was to be finished in <strong>one month</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*flgNRyd5d7wkt_EkD8mnfw.png" /><figcaption>An in-game still of the finished game</figcaption></figure><h3>From Cubes to Ship</h3><p>We started creating a <strong>scrolling ground</strong> through shaders with some basic 3D shapes to test the scene. Immediately, we had the idea of creating an<strong> infinite runner,</strong> set in Space with various bonuses and enemies, and a little bit of 80s Sci-Fi flavour. With everything shown on screen, the next steps were to bind the controls with the <strong>keyboard and touch inputs </strong>and to create a <strong>spawning system</strong> with different <strong>PowerUps</strong>.</p><p>At this point we had our first <strong>prototype</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IYre06j82iK6o5QutQjAgA.png" /><figcaption>An early prototype of the project</figcaption></figure><h3>Something more…</h3><blockquote>“That’s one small step for man, one giant leap for mankind” — <strong>Neil Armstrong</strong></blockquote><p>The more we worked on the project, the more we started craving a <strong>narrative drive </strong>for the entire experience. We came up with the idea of celebrating one of the most important events of the <strong>19th Century</strong>, a milestone for mankind, the <strong>50th anniversary of the Moon landing </strong>which will take place this year.</p><p>Thinking about this glorious date brings up the memories of the famous words spoken by <strong>Neil Armstrong</strong> and his iconic walk on the Moon’s surface, but there is also another perspective of the story.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OfBPRGNzBeHwPx1uj0lv1Q.png" /><figcaption>First version of Route Fifty</figcaption></figure><h3><strong>An Alternative Hero</strong></h3><p>Armstrong was making history bouncing without gravity on the lunar sand, but meanwhile, deep in space, there was another hero that had one task: to <strong>fly around in orbit of the Moon</strong>, keeping radio contact with the other members of the crew.</p><p>All those three men, together, made this amazing achievement of science and exploration possible. This moment, addressed by the newspapers as <em>“not since Adam has any human known such solitude”, </em>is a great emotional trigger and, moreover, fits perfectly with the mechanic of an infinite runner.</p><p>So, we had our Hero: <strong>Michael Collins</strong>, an American astronaut born in Rome in 1930 and who, at the age of 39, contributed to writing history.</p><p>The title has a <strong>double meaning</strong>: it can be connected with the 50th anniversary, and also because Route 50 is one of the longest roads in the US, measuring at more than 3000 miles long, and is well-known as being “the loneliest road” in America. We thought that was a touching reminder to the solitude of flying around the Moon all alone.</p><p>That’s what <strong>Route Fifty </strong>is all about.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gxEDM37DQOuxbE-JWzudag.jpeg" /><figcaption>Michael Collins, our alternative Hero (Image from Wikimedia)</figcaption></figure><h3>3D Assets</h3><p>Once we had the main narrative driver, we updated all of the <strong>3D placeholders</strong> with some ad hoc stuff: we reproduced a <strong>low-poly faceted</strong> version of the <strong>Apollo 11</strong> capsule used by Collins and created some <strong>Sci-Fi PowerUps</strong> for our arcade experience.</p><p>For optimisation’s sake we decided to keep a <strong>unique colour palette texture</strong> for all the assets (with huge improvements on download size and draw calls), mapping the UVs of each model on it and shading everything with a <strong>Matcap custom shader</strong>. Each model has been optimised by <strong>deleting back-faces</strong> and keeping the <strong>polycount as low as possible</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*rq5YXxZ75_mcCC9GSniVqA.jpeg" /><figcaption>3D assets used in the game</figcaption></figure><h3>One Project to Rule Them All!</h3><p>One of the most important achievements of this R&amp;D project has been to test the possibility of <strong>working on a single project</strong> that can be <strong>delivered on many different platforms</strong>.</p><p>By meticulously working on the <strong>optimisation,</strong> we stripped all the shaders, used many <strong>best-practices </strong>from games such as <strong>object pooling </strong>and a single texture atlas through all the assets to create minimal effort on draw-calls.</p><p>All those tricks helped us to gain <strong>best performances</strong> even on <strong>low-end mobile devices</strong>.</p><p>Thanks to this, with one project we have been able to deliver the browser experience<strong> both on desktop and mobile devices</strong>. Moreover, we also worked on <strong>PWA support</strong>, and being able to export an <strong>APK</strong> that can be distributed through the <strong>Android Play Store</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*svQrJsMhLFS9w6pXIuqivQ.png" /><figcaption>The screen with facts about the moon Landing</figcaption></figure><h3>Easter Egg</h3><p>When we reached the deadline we literally went crazy and decided to add a little Easter Egg: through the <strong>Konami Code </strong>you can access an alternative setting, a tribute to the conspiration theory that the <strong>Moon landing was just a movie </strong>recorded in an artificial studio. Will you be good enough to find it? :)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*La-vWLUWK9HdLZmzLP-Gbg.jpeg" /><figcaption>Our 3D Assets for the Easter Egg</figcaption></figure><h3>Be the Rocket Man!</h3><p>During the <strong>Route Fifty</strong> game you can explore some <strong>interesting facts</strong> about the Moon Landing and all the journeys human beings have made in Space, as well as seeing <strong>realtime stats</strong> of all the users connected. Just prepare yourself, start the engine and be an alternative hero.</p><p><a href="https://routefifty.caffeina.com/"><strong>START YOUR ENGINES!</strong></a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IYdxJA6yAg2hr3niPhOlYw.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5551d4102da6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/code-caffeina/route-fifty-5551d4102da6">Route Fifty</a> was originally published in <a href="https://medium.com/code-caffeina">Caffeina Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Configure Kubernetes on premise]]></title>
            <link>https://medium.com/code-caffeina/kubernetes-on-premise-8ceffa48fee5?source=rss----4a3ff832f2be---4</link>
            <guid isPermaLink="false">https://medium.com/p/8ceffa48fee5</guid>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[cloud-computing]]></category>
            <category><![CDATA[software-engineering]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[kubernetes]]></category>
            <dc:creator><![CDATA[Ani Sinanaj]]></dc:creator>
            <pubDate>Wed, 16 Oct 2019 14:59:40 GMT</pubDate>
            <atom:updated>2019-10-16T14:59:40.661Z</atom:updated>
            <content:encoded><![CDATA[<h4>How to install and configure Kubernetes on your own servers and create your custom cluster</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YR5MtgTklN4MSHzVKuQpXg.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/photos/sgYamIzhAhg?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Guilherme Cunha</a> on <a href="https://unsplash.com/search/photos/construction?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>This is the simplest design you can configure Kubernetes on (except minikube). It is not meant to be for production use as it does not offer high-availability on the cluster. More on the reasons later.</p><h4>Two words on Kubernetes</h4><p>Just because it’s getting a lot of hype lately, it doesn’t mean that it is the right technology for your use case or that your company is ready to adopt it.</p><p>Kubernetes is not a way to lower costs on itself, in fact you’ll probably spend more on servers. What it does though, is guarantee a high availability for your projects, meaning that it will be hard for them to have downtime even if you deploy a bugged software. It needs to be configured correctly though.</p><p>If you can, <strong>opt for a cloud based K8s solution</strong>. They offer a lot of complicated parts that otherwise you’d have <strong>to configure yourself</strong>. (read: control plane high availability, network, storage, autoscaling on nodes)</p><p>Some situations when it might come in handy:</p><ul><li><strong>Cluster management</strong></li><li>Structures that use continuous deployment.</li><li>Canary deployments.</li><li>A/B testing or even multiple different projects on the same cluster</li><li>Management of multiple clusters on different availability zones</li><li>Rollback on faulty deployments</li><li>Autoscaling</li><li>Microservices</li></ul><p>Deploying K8s on a single server may be too much. It is best when you have multiple servers to deploy it on.</p><p>The parts that make Kubernetes are:</p><ul><li>kubeadm or the control plane, made of etcd controller manager scheduler api server</li><li>kubelet which is the software that manages deployments as instructed by the control plane</li></ul><p>The design I’m explaining here requires about 3 servers. One for <em>kubadm</em>, and two for <em>kubelet</em>.</p><h4>Cloud VS On-Premise</h4><p>All major players offer Kubernetes on their platforms. Microsoft has AKS (Azure Kubernetes Service), Amazon offers EKS (Elastic Kubernetes Service) and Google has GKE (Google Kubernetes Engine).</p><p>There are some other providers that offer it too such as Digital Ocean which introduced it recently.</p><p>Although I’m a fan of AWS, for a K8s cluster I’d suggest Google Cloud because it has the most complete implementation.</p><p>Generally all these providers will offer out of the box these features:</p><ul><li>High availability on the Control Plane which you don’t even pay</li><li>Scalability with autoscaling on nodes</li><li>Fast storage of different kinds (Block Storage, FS)</li><li>Load Balancer and External IPs</li><li>Auto update on the nodes</li></ul><p>You can have all of the above with an on-premise solution by combining virtualisation and somewhat more powerful servers while still having a</p><h4>Design</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*EWfjAXbpiKdxq5k-MFi1Fg.png" /><figcaption>Infrastructure architecture</figcaption></figure><p>Let’s stick with a simple design like this and analyse it. With my knowledge at the time, this is what I had come up with, considering to scale the worker nodes in case it was necessary.</p><p>So there’s a <strong>Master node</strong> where basically we’ll install <em>kubeadm</em> out of the box. And there are 3 nodes dedicated to app deployment.</p><h4>Master</h4><p>Configuring the master node is very simple, especially considering that this part is well <a href="https://kubernetes.io/docs/setup/independent/install-kubeadm/">documented</a>. You only need to install a few software packages on the host system such as Docker, Kubelet, Kubeadm, Kubectl and their dependencies.</p><p>To install Docker these are the commands needed to be executed. Remember that the official supported Docker community edition version for Kubernetes is the 18.06. To check the available versions for the exact version code run apt-cache madison docker-ce</p><pre>sudo apt-get install \<br>    apt-transport-https \<br>    ca-certificates \<br>    curl \<br>    gnupg2 \<br>    software-properties-common</pre><pre>curl -fsSL <a href="https://download.docker.com/linux/debian/gpg">https://download.docker.com/linux/debian/gpg</a> | sudo apt-key add -</pre><pre>sudo apt-key fingerprint 0EBFCD88</pre><pre>sudo add-apt-repository \<br>   &quot;deb [arch=amd64] <a href="https://download.docker.com/linux/debian">https://download.docker.com/linux/debian</a> \<br>   $(lsb_release -cs) \<br>   stable&quot;</pre><pre>apt-get update<br>apt-get install docker-ce=<strong>18.06.1~ce~3-0~debian</strong></pre><p>The following code installs Kubernetes components instead.</p><pre>apt-get update &amp;&amp; apt-get install -y apt-transport-https curl</pre><pre>curl -s <a href="https://packages.cloud.google.com/apt/doc/apt-key.gpg">https://packages.cloud.google.com/apt/doc/apt-key.gpg</a> | apt-key add -</pre><pre>cat &lt;&lt;EOF &gt;/etc/apt/sources.list.d/kubernetes.list<br>deb <a href="https://apt.kubernetes.io/">https://apt.kubernetes.io/</a> kubernetes-xenial main<br>EOF</pre><pre>apt-get update<br>apt-get install -y kubelet kubeadm kubectl<br>apt-mark hold kubelet kubeadm kubectl</pre><p>The above snippets should be executed on all the servers.</p><p>There some other configuration requirements for Kubernetes.</p><pre># The swap should be turned off<br>swapoff -a</pre><pre># Remove the line that contains <strong>swap</strong> from /etc/fstab<br>nano /etc/fstab</pre><pre># Check that all servers have different mac addresses<br>ip link</pre><pre># Check that all servers have a different product ID<br>sudo cat /sys/class/dmi/id/product_uuid</pre><p>The only thing left to do is to bring up the master and that’s done with the simple command kubeadm init <strong>don’t</strong> execute this yet though.</p><h4>Networking</h4><p>Kubernetes has some core components. These components are standard but for the whole system to work some third party components are needed. These pieces communicate to each other through interfaces. For example the container engine used isn’t necessarily Docker, it can be any software implementing the <strong>Container Runtime Interface</strong> or CRI.</p><p>Networking is a difficult concept in this context. Consider the diagram above again. We have 3 servers where eventually our applications will go.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/368/1*k775cqJ_nXTGi47y0f2Nrg.png" /><figcaption>Example of 2 containers on different servers</figcaption></figure><p>Let’s say I want to deploy a database (MySQL) and a php application on my cluster. Kubernetes puts them where it thinks they fit best. This means we can have all sorts of combinations like having the database on server <strong>Node 1</strong> and the application on server <strong>Node 2</strong>. Now my php container needs to communicate to the mysql container but it isn’t in the same server. We need a way to make it seem to my containers that they’re in the same local network and communicate to each other. For this purpose Kubernetes exposes the <strong>Container Network Interface</strong> (CNI).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/981/1*99CAzYVzpfoDLnij61BTlg.png" /><figcaption>Network namespaces</figcaption></figure><p>The CNI is supposed to create a virtual network on each server node and make it possible for each container to reach the others on the same IP space like <strong>10.244.0.0/16</strong>. When a container tries to reach another container it will ping an IP such as 10.244.0.1, the CNI will translate this IP to the node IP and then to the container address inside that node.</p><p>Available CNIs include different features. But generally they add some overhead to networking. It is possible to define your own networking through iptables rules. This isn’t difficult and doesn’t add overhead, but it’s a manual job that is manageable only if you have a few servers.</p><p>The documentation is quite well written and there are many articles explaining this issue with clusters. Here is a well written article that explains networking more in detail <a href="https://medium.com/google-cloud/understanding-kubernetes-networking-pods-7117dd28727">https://medium.com/google-cloud/understanding-kubernetes-networking-pods-7117dd28727</a></p><p>This is a great article that classifies all the CNIs and analyses their features. <a href="https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-s-network-36475925a560">https://itnext.io/benchmark-results-of-kubernetes-network-plugins-cni-over-10gbit-s-network-36475925a560</a></p><p>One of the simplest to use is <a href="https://github.com/coreos/flannel">Flannel</a>, it offers basic connectivity features and doesn’t add much overhead.</p><p>Now that we have some knowledge on networking we’re ready to execute kubeadm init and we’ll add to it, the POD network space through the flag --pod-network-cidr=10.244.0.0/16 If you choose another CNI, you have to check the documentation on what network space to give it, for example calico uses 192.168.0.0/16.</p><pre># - Initializing kubernetes master with a <br>#   network space ready for flannel<br># - Add --dry-run and write the output to a file to have<br>#   an idea of what configurations the installation will use<br><strong>kubeadm init --pod-network-cidr=10.244.0.0/16 --dry-run &gt;&gt; init.log</strong></pre><pre># Finally run the following to initialise the node<br><strong>kubeadm init --pod-network-cidr=10.244.0.0/16</strong></pre><h4>Worker Nodes</h4><p>Technically the Kubernetes cluster is up but it only has a master server. What’s missing is the worker nodes. The output of the kubeadm init command will show you the join command which can be used on any server exposed on the internet as long as it has kubeadm kubelet kubectl docker installed.</p><p>If for some reason you cleaned the command output and don’t have the join command, you don’t need to panic. It can be generated again.</p><pre><strong>kubeadm token create --print-join-command</strong></pre><pre># The output will be something like below<br>kubeadm join 10.10.10.1:6443 --token vpo60f.pk0x3fhrnzhvr2sy --discovery-token-ca-cert-hash sha256:8d55ca78560cb926d2953e14042dd3de40137234a4b51698894db0f43849aa97</pre><p>It’s easy as that, running the code on the other nodes will set them up. We can monitor it like this.</p><pre>watch -n 1 kubectl get nodes -o wide --namespace kube-system</pre><p>The command below instead will show the state of the components.</p><pre>watch -n 1 kubectl get pods -o wide --namespace kube-system</pre><p>There you might notice a couple of pods name core-dns that seem to not be working. That’s because we told Kubernetes to get ready on the network space for Flannel by adding --pod-network-cidr=10.244.0.0/16 but didn’t really “install” Flannel yet.</p><p>The installation of Flannel (or any other CNI) generally means deploying it to the cluster.</p><pre>kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml</pre><h4><strong>Done… Not yet</strong></h4><p>So the cluster is up and running. Trying to deploy an application, like the one I mentioned before, wouldn’t work though. There’s another problem with having an application living in multiple servers and that is <strong>storage</strong>.</p><p>Generally all of the applications will work with files, some will get generated, some will get deleted and a few need to be saved persistently like the files a database generates.</p><p>Out of the box, Kubernetes gives you the possibility to save files in the Pod context, which means that other Pods can’t access them, but containers in the same Pod could. It also means that the files remain if the Pod restarts but they will be deleted if the Pod itself is deleted. Thus we need a better way to save files. We have two requirements, the files need to be <strong>accessible by multiple Pods</strong> possibly in different servers and they need to be <strong>persistent</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/981/1*IllC2e8C-cpUnnhPhHijAg.png" /><figcaption>Design of a deployment</figcaption></figure><p>Not focusing on how good the application design is, let’s see what are the problems of this <strong>deployment</strong>.</p><p>So I told Kubernetes to deploy a php application that generates pdf files, stores the “generated” status on the database and then renders them. Then I also deployed a MySQL database. I said, I want 2 replicas of the php application and 1 of my database.</p><p>Now consider the php application generating a file, storing to the database the fact that it generated that particular file and then rendering it.</p><p>When I ask again for that pdf file but this time, I ask my other php container on the second Pod, the application will check the database which will tell it that the file has already been generated, but when php looks on the filesystem, it won’t find anything.</p><p>This issue is not easy to explain and you realise the gravity only when deploying an application and scaling it up.</p><p>To solve this Kubernetes came up with something called CSI, <strong>Container Storage Interface</strong>.</p><h4>Storage</h4><p>When an application defines a storage in Kubernetes, it asks for a PVC, which translates to <strong>Persistent Volume Claim</strong>. It’s like telling the cluster that I, the application, need <em>this much</em> persistent storage. When this happens, Kubernetes will activate a storage <strong>Provisioner</strong> and allocate that storage to the application. There may be different storage provisioners. For each provisioner, there will be a <strong>Storage Class</strong>.</p><p>This makes sense because there are different kinds of storage thus different storage provisioners. Each one will create it’s own kind of storage.</p><p>There must always be a default Storage Class. Application deployments don’t have to define it always.</p><p>To allocate the storage, the provisioner has a few options such as being bound to a file server like Ceph, GlusterFS or others.</p><p><a href="https://ceph.com/">Ceph</a> and <a href="https://www.gluster.org/">GlusterFS</a> though, are clusters of their own. They can be installed on the same servers where the Kubernetes cluster is running or on other servers completely. The second option is strongly advised.</p><p>I won’t get too into the storage servers on this article but consider two things when it comes to storage.</p><ul><li>Persistent means persistent. The software I mentioned above offer replication.</li><li>Network. The servers on the Kubernetes cluster communicate continuously with each other, and with the world. The storage servers need to communicate to each other continuously to replicate the data and to serve it.</li></ul><p>I’ll eventually write another article to explain better how to set up a <strong>storage cluster</strong>.</p><h4>Production</h4><p>This cluster is not yet production ready for three reasons.</p><ul><li>Persistent Storage configuration</li><li>Creating a cluster with <strong>highly available</strong> <strong>master</strong> nodes</li><li>Hardening the cluster security-wise</li></ul><p>Special thanks to <a href="https://www.linkedin.com/in/adrianopezzuto/">Adriano Pezzuto</a> for his support.</p><p>Thanks for reading this far and stay tuned for more fun articles :)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8ceffa48fee5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/code-caffeina/kubernetes-on-premise-8ceffa48fee5">Configure Kubernetes on premise</a> was originally published in <a href="https://medium.com/code-caffeina">Caffeina Developers</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>