<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Gianluca Cini</title><link>https://gianlucacini.com/posts/</link><description>Recent content in Posts on Gianluca Cini</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><lastBuildDate>Sat, 25 Oct 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://gianlucacini.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Introducing Mietminder.de - A Platform for Rent Reduction in Germany</title><link>https://gianlucacini.com/introducing-mietminder.de-a-platform-for-rent-reduction-in-germany/</link><pubDate>Sat, 25 Oct 2025 00:00:00 +0000</pubDate><guid>https://gianlucacini.com/introducing-mietminder.de-a-platform-for-rent-reduction-in-germany/</guid><description>&lt;p>I’ve been living in Berlin for over a year now, and it feels like the moment you decide to move here, the struggles begin, and they never really stop. From finding an apartment to dealing with bureaucracy, landlords, maintenance people, utility providers, and the Ordnungsamt, it’s a constant uphill battle.&lt;/p>
&lt;p>My girlfriend and I managed to find an apartment that already seemed overpriced. We knew it would be a financial stretch, but we took it anyway. The area was nice, and, frankly, there were no other options.&lt;/p>
&lt;p>Once we moved in, we spent the next few months figuring out the basics: getting our Anmeldung, tax ID, setting up electricity, gas, internet, and so on.&lt;/p>
&lt;p>Then the problems started.&lt;/p>
&lt;p>The trash bins weren’t big enough and began to overflow.
Water started leaking from the toilet.
The doorbell stopped working.&lt;/p>
&lt;p>We were frustrated, not just by the lack of response from the maintenance guy, but also by the rent that already felt unjustifiable, and which was set to increase after 12 months.&lt;/p>
&lt;p>So, I started doing some research.&lt;/p>
&lt;p>That’s when I discovered Berlin’s surprisingly strong tenant laws.&lt;/p>
&lt;p>I read through the 2024 Mietspiegel PDF and checked several websites. Using the official calculator, I found out what the rent for my apartment should be, and I was shocked.&lt;/p>
&lt;p>I was paying €400 more than the maximum legal rent for my place.&lt;/p>
&lt;p>Furious, I sent a letter to my landlord. Then another one a month later. No response.&lt;/p>
&lt;p>I looked into the service Conny, but even though it’s technically free, they take a huge cut of any savings — so I decided to handle it myself. I also considered joining a tenant association, but since I don’t speak German, it felt too complicated, and you have to wait months before you can even use their services.&lt;/p>
&lt;p>I reached out to a few lawyers, but they were all too busy.&lt;/p>
&lt;p>So, as a developer always hungry for new challenges, I realized this was a problem that desperately needed a simpler, more affordable, and streamlined solution.&lt;/p>
&lt;p>After a few months of research, planning, and development, I’m excited to launch &lt;a href="https://mietminder.de">Mietminder.de&lt;/a> - a platform built to help tenants in Germany understand their rental rights and identify opportunities for rent reduction.&lt;/p>
&lt;p>Right now, it’s essentially a cleaner, easier-to-use Berlin rent calculator. But this is just the beginning — I’m already working on expanding it into a more comprehensive tool to make tenant rights more accessible to everyone.&lt;/p>
&lt;p>TBC&lt;/p>
&lt;h2 id="the-problem">The Problem&lt;/h2>
&lt;p>Rent prices in Germany have been steadily increasing, and many tenants are unaware of their rights when it comes to rent reductions. Whether it&amp;rsquo;s due to construction noise, heating issues, or other property problems, tenants often don&amp;rsquo;t know they can legally request rent reductions.&lt;/p>
&lt;p>The process of understanding these rights and finding qualified legal help can be overwhelming, especially for non-German speakers or those unfamiliar with German rental law.&lt;/p>
&lt;h2 id="the-solution">The Solution&lt;/h2>
&lt;p>&lt;a href="https://mietminder.de">Mietminder.de&lt;/a> aims to bridge this gap by providing:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Educational content&lt;/strong> about tenant rights and rent reduction possibilities&lt;/li>
&lt;li>&lt;strong>Step-by-step guides&lt;/strong> for the rent reduction process&lt;/li>
&lt;li>&lt;strong>Legal expert directory&lt;/strong> to connect tenants with qualified lawyers&lt;/li>
&lt;/ul>
&lt;h2 id="why-this-matters">Why This Matters&lt;/h2>
&lt;p>Rent reduction (Mietminderung) is a legitimate legal right in Germany, but the complexity of the process often prevents tenants from exercising it. By making this information accessible and actionable, we can help tenants:&lt;/p>
&lt;ul>
&lt;li>Save money on rent when facing property issues&lt;/li>
&lt;li>Understand their legal rights&lt;/li>
&lt;li>Connect with qualified legal professionals&lt;/li>
&lt;li>Navigate the German rental system with confidence&lt;/li>
&lt;/ul>
&lt;h2 id="technical-approach">Technical Approach&lt;/h2>
&lt;p>The platform is built with a focus on user experience and accessibility, ensuring that both German and international tenants can easily understand their rights and take action.&lt;/p>
&lt;h2 id="looking-forward">Looking Forward&lt;/h2>
&lt;p>This project represents a step toward making legal rights more accessible to everyday people. The goal is to democratize access to legal information and services, particularly in the rental housing sector.&lt;/p>
&lt;p>If you&amp;rsquo;re a tenant in Germany facing property issues, or if you&amp;rsquo;re a legal professional interested in connecting with potential clients, I invite you to visit &lt;strong>&lt;a href="https://mietminder.de">Mietminder.de&lt;/a>&lt;/strong> and explore what I&amp;rsquo;m building.&lt;/p></description></item><item><title>Localize ASP.NET Core Identity Error Messages</title><link>https://gianlucacini.com/localize-asp.net-core-identity-error-messages/</link><pubDate>Wed, 28 Feb 2024 00:00:00 +0000</pubDate><guid>https://gianlucacini.com/localize-asp.net-core-identity-error-messages/</guid><description>&lt;p>If you are building an application serving users residing in specific country using ASP.NET Core Identity, it might help knowing how to translate this library&amp;rsquo;s error messages to a specific language.&lt;/p>
&lt;p>You can do that by creating a class that inherits IdentityErrorDescriber, then by overriding all its methods.&lt;/p>
&lt;p>&lt;a href="https://gist.github.com/gianlucacini/411fa51d1cc67feb3c9f4f6c6ad3d7e5">Go to my Github Gist&lt;/a>&lt;/p>
&lt;p>Here is my class which translates default english error messages to italian.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">Microsoft.AspNetCore.Identity&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">public&lt;/span> &lt;span class="k">class&lt;/span> &lt;span class="nc">ItalianIdentityErrorDescriber&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">IdentityErrorDescriber&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">PasswordRequiresUniqueChars&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">uniqueChars&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PasswordRequiresUniqueChars&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;La password deve essere contenere almeno {uniqueChars} caratteri univoci.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">RecoveryCodeRedemptionFailed&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">RecoveryCodeRedemptionFailed&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;Il codice di recupero non è stato utilizzato correttamente.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">UserNotInRole&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">string&lt;/span> &lt;span class="n">role&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UserNotInRole&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;l&amp;#39;utente non fa parte del ruolo {role}.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">DefaultError&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">DefaultError&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;Si è verificato un errore sconosciuto.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">ConcurrencyFailure&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ConcurrencyFailure&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Fallimento della concorrenza ottimistica, l&amp;#39;oggetto è stato modificato.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">PasswordMismatch&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PasswordMismatch&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Password non corretta.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">InvalidToken&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">InvalidToken&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Token non valido&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">LoginAlreadyAssociated&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LoginAlreadyAssociated&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Esiste già un utente con questo login.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">InvalidEmail&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">string?&lt;/span> &lt;span class="n">email&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">InvalidEmail&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;Email &amp;#39;{email}&amp;#39; non è valida.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">InvalidRoleName&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">string?&lt;/span> &lt;span class="n">role&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">InvalidRoleName&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;Il Ruolo &amp;#39;{role}&amp;#39; non è valido.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">InvalidUserName&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">string?&lt;/span> &lt;span class="n">userName&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">InvalidUserName&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;Il nome utente &amp;#39;{userName}&amp;#39; non è valido, utilizzare i caratteri &amp;#39;a-z &amp;#39;A-Z&amp;#39;.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">DuplicateUserName&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">string&lt;/span> &lt;span class="n">userName&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">DuplicateUserName&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;Il nome utente &amp;#39;{userName}&amp;#39; è già stato preso.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">DuplicateEmail&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">string&lt;/span> &lt;span class="n">email&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">DuplicateEmail&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;l&amp;#39;email &amp;#39;{email}&amp;#39; è già stata presa.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">DuplicateRoleName&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">string&lt;/span> &lt;span class="n">role&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">DuplicateRoleName&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;il ruolo &amp;#39;{role}&amp;#39; è già stato preso.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">UserAlreadyHasPassword&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UserAlreadyHasPassword&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;L&amp;#39;utente ha già impostato una password.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">UserLockoutNotEnabled&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UserLockoutNotEnabled&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Il blocco non è abilitato per questo utente.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">UserAlreadyInRole&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">string&lt;/span> &lt;span class="n">role&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UserAlreadyInRole&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;L&amp;#39;utente è già nel ruolo &amp;#39;{role}&amp;#39;.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">PasswordTooShort&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="kt">int&lt;/span> &lt;span class="n">length&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PasswordTooShort&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$&amp;#34;Le password devono avere almeno {length} caratteri.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">PasswordRequiresNonAlphanumeric&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PasswordRequiresNonAlphanumeric&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Le password devono contenere almeno un carattere non alfanumerico.&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">PasswordRequiresDigit&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PasswordRequiresDigit&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Le password devono contenere almeno una cifra (&amp;#39;0&amp;#39;-&amp;#39;9&amp;#39;).&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">PasswordRequiresLower&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PasswordRequiresLower&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Le password devono contenere almeno una lettera minuscola (&amp;#39;a&amp;#39;-&amp;#39;z&amp;#39;).&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kd">override&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="n">PasswordRequiresUpper&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span> &lt;span class="k">new&lt;/span> &lt;span class="n">IdentityError&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="n">Code&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">nameof&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">PasswordRequiresUpper&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Le password devono contenere almeno una lettera maiuscola (&amp;#39;A&amp;#39;-&amp;#39;Z&amp;#39;).&amp;#34;&lt;/span> &lt;span class="p">};&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Then, in your Program.cs, add your class to the IdentityBuilder configuration&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">builder&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Services&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="n">AddIdentity&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">ApplicationUser&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">IdentityRole&lt;/span>&lt;span class="p">&amp;gt;().&lt;/span>&lt;span class="n">AddErrorDescriber&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">ItalianIdentityErrorDescriber&lt;/span>&lt;span class="p">&amp;gt;()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="n">AddEntityFrameworkStores&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">ApplicationDbContext&lt;/span>&lt;span class="p">&amp;gt;()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">.&lt;/span>&lt;span class="n">AddDefaultTokenProviders&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item><item><title>Blazor Interactive Server Page Speed Optimization (.NET 8)</title><link>https://gianlucacini.com/blazor-interactive-server-page-speed-optimization-.net-8/</link><pubDate>Sat, 24 Feb 2024 00:00:00 +0000</pubDate><guid>https://gianlucacini.com/blazor-interactive-server-page-speed-optimization-.net-8/</guid><description>&lt;p>Upon deploying my hobby project, &lt;a href="https://cadjobs.com">Cad Jobs&lt;/a>, I wanted to make sure it worked smoothly for users and search engines. So, I checked its performance using Google&amp;rsquo;s PageSpeed Insights tool.&lt;/p>
&lt;div style="text-align:center">&lt;img src="insight-14.png" />&lt;/div>
&lt;p>To my surprise, my website got a shockingly low 14/100 points for performance.&lt;/p>
&lt;p>After a moment of disbelief, I did some research to fix the issues. Here&amp;rsquo;s what I learned:&lt;/p>
&lt;h2 id="enable-websocket">Enable WebSocket:&lt;/h2>
&lt;p>If you&amp;rsquo;re using IIS to host your website, make sure the WebSocket feature is enabled in your Windows Features. Otherwise Blazor will fall back to Long Polling, increasing the time of startup.&lt;/p>
&lt;h2 id="use-progressive-loading">Use Progressive Loading:&lt;/h2>
&lt;p>Instead of loading all the data at once, especially for long lists on the homepage, load just a bit of it first. Then, let users load more if they want.
Another option is if you have a long list, you can use the Virtualize component.
For my site i chose the former method. As i wasn&amp;rsquo;t fully satisfied with how the Virtualize component behaves when using a flexbox layout.&lt;/p>
&lt;h2 id="make-css-and-js-files-smaller">Make CSS and JS Files Smaller:&lt;/h2>
&lt;p>To speed up loading times, shrink the size of your CSS and JavaScript files. You can do this by hosting them locally and minimizing them. I used a tool called Bundler Minifier in Visual Studio for this.&lt;/p>
&lt;h2 id="turn-on-response-compression">Turn on Response Compression:&lt;/h2>
&lt;p>With ASP.NET Core, you can compress your website&amp;rsquo;s responses to make them smaller and faster. It&amp;rsquo;s best to use the most effective compression method. According to Microsoft&amp;rsquo;s documentation, the smallest size is achieved by setting compression to optimal.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">Microsoft.AspNetCore.ResponseCompression&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//enable compression&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">builder&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Services&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">AddResponseCompression&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">options&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">options&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">EnableForHttps&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">options&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Providers&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Add&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">BrotliCompressionProvider&lt;/span>&lt;span class="p">&amp;gt;();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">options&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Providers&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Add&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">GzipCompressionProvider&lt;/span>&lt;span class="p">&amp;gt;();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">builder&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Services&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Configure&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">BrotliCompressionProviderOptions&lt;/span>&lt;span class="p">&amp;gt;(&lt;/span>&lt;span class="n">options&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">options&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Level&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">CompressionLevel&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Optimal&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">builder&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Services&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Configure&lt;/span>&lt;span class="p">&amp;lt;&lt;/span>&lt;span class="n">GzipCompressionProviderOptions&lt;/span>&lt;span class="p">&amp;gt;(&lt;/span>&lt;span class="n">options&lt;/span> &lt;span class="p">=&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">options&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Level&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">CompressionLevel&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Optimal&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">});&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>After making these changes, my website&amp;rsquo;s performance score shot up to 95/100 on PageSpeed Insights.&lt;/p>
&lt;p>I hope sharing these tips helps other developers improve their websites too!&lt;/p>
&lt;div style="text-align:center">&lt;img src="insight-95.png" />&lt;/div>
&lt;p>Sources:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://learn.microsoft.com/it-it/aspnet/core/blazor/components/virtualization?view=aspnetcore-8.0">https://learn.microsoft.com/it-it/aspnet/core/blazor/components/virtualization?view=aspnetcore-8.0&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://marketplace.visualstudio.com/items?itemName=MadsKristensen.BundlerMinifier">https://marketplace.visualstudio.com/items?itemName=MadsKristensen.BundlerMinifier&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://learn.microsoft.com/en-us/aspnet/core/performance/response-compression?view=aspnetcore-8.0">https://learn.microsoft.com/en-us/aspnet/core/performance/response-compression?view=aspnetcore-8.0&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>Planning and Developing a Niche Job Board</title><link>https://gianlucacini.com/planning-and-developing-a-niche-job-board/</link><pubDate>Thu, 17 Mar 2022 00:00:00 +0000</pubDate><guid>https://gianlucacini.com/planning-and-developing-a-niche-job-board/</guid><description>&lt;p>It&amp;rsquo;s been over a year now since i started to professionally focus more and more on the web aspect of software development. And the more time passes, the more i found myself wanting to create something challenging and for myself.&lt;/p>
&lt;p>The problem is there is so much stuff to build, but so little time that i was affected by analysis by paralisis. i spent too much time researching and making a decision instead of actually committing to a project.&lt;/p>
&lt;p>But you gotta start somewhere. So recently i pulled the trigger and, as i love cool domain names, i purchased the domain cadjobs.com.&lt;/p>
&lt;p>Although i am not so familiar with the world of cad. I decided to use this opportunity to learn something, so I created an aggregator of remote jobs focused on cad software (autocad, solidworks and the likes)&lt;/p>
&lt;p>&lt;em>link here &amp;raquo; &lt;a href="https://cadjobs.com">Cad Jobs&lt;/a>&lt;/em>&lt;/p>
&lt;p>The interesting thing about job boards is that they can be either really simple as a single page with a call to action to submit your email, or really intricated like an indeed or an upwork. So you can start from a simple page and brick by brick add every desired functionality.&lt;/p>
&lt;p>Technologies:&lt;/p>
&lt;ul>
&lt;li>Blazor Server&lt;/li>
&lt;li>MongoDB&lt;/li>
&lt;/ul>
&lt;p>Here&amp;rsquo;s a few things I&amp;rsquo;ve learned after a few months of work&lt;/p>
&lt;h2 id="prioritize-your-goals">Prioritize Your Goals&lt;/h2>
&lt;p>Your first question should be: what are your goals?&lt;/p>
&lt;p>Are You starting a project for the purpose of learning something or for business purposes? Or both?&lt;/p>
&lt;p>As time is of the essence, answering this question will save you significant amount of time.&lt;/p>
&lt;p>If you are doing this for money then there is no point in using a tech stack you are not comfortable with. You will spend a lot of time just figuring stuff out. Time that will end up wasted if your project will fail. In this case just buy a landing page, a wordpress theme or use the tech stack you are most confortable with and call it a day.&lt;/p>
&lt;p>Otherwise, take this opportunity to learn something new.&lt;/p>
&lt;h2 id="spend-more-time-planning-and-less-time-coding">Spend more time planning and less time coding&lt;/h2>
&lt;p>It may not be the most enjoyable aspect of the job, but dedicating more time to planning before diving into coding can save significant time and prevent numerous problems in the future.&lt;/p>
&lt;p>Coding without prior planning might seem enjoyable initially, but I encountered numerous &amp;ldquo;oh shit, what about this&amp;rdquo; moments that necessitated going back to modify existing code. These issues could have been avoided if I had engaged in proper planning beforehand.&lt;/p></description></item><item><title>Riassunto Del Libro Psicocibernetica di Maxwell Maltz</title><link>https://gianlucacini.com/riassunto-del-libro-psicocibernetica-di-maxwell-maltz/</link><pubDate>Fri, 18 Feb 2022 00:00:00 +0000</pubDate><guid>https://gianlucacini.com/riassunto-del-libro-psicocibernetica-di-maxwell-maltz/</guid><description>&lt;h2 id="capitolo-1-limmagine-dellio-è-la-chiave-per-una-vita-migliore">Capitolo 1: L’immagine dell’io è la chiave per una vita migliore.&lt;/h2>
&lt;p>Ognuno di noi porta con se una sorta di fotografia mentale di se stesso, che non puo essere riconoscibile consciamente, ma che è li. Questa è l’immagine dell’io: è il che genere di persona sono.
La maggior parte di queste immagini sorgono inconsciamente dalle nostre passate esperienze, e ogni volta che un concetto su noi stessi si inserisce in questa immagine, essa diventa vero. Non mettiamo in dubbio la sua validità, ma continuiamo ad agire come se fosse vero.
Voi agite come il genere di persona che credete di essere, e non potete fare altrimenti, nonostante i vostri sforzi coscienti e la vostra forza di volontà. Uno scolaro che si vede come un tipo da 4, troverà invariabilmente che le sue pagelle lo confermeranno tale, ed egli ne ha così una prova.
Prescott Lecky, pioniere della psicologia dell’immagine dell’io, concepiva la personalità come un sistema di idee, ognuna delle quali deve sembrare collegata alle altre. Le idee estranee vengono respinte, non credute. Le idee che sembrano far parte del sistema sono accettate. Al centro di questo sistema di idee, vi è l’immagine dell’io.
Per trovare la vita ragionevolmente soddisfacente, bisogna avere un esatta e realistica immagine di noi stessi. Dovete trovarvi accettabili e avere stima di voi stessi. Conoscete voi stessi, la vostra forza e debolezza. Fatelo onestamente. L’immagine dell’io deve essere né più né meno di quello che siete.
SUBCONSCIO: è un meccanismo tendente a una meta. Come tutti i meccanismi, esso deve avere un fine ben definito. Gli obiettivi che il nostro meccanismo creativo cerca di raggiungere sono le immagini mentali che creiamo con l’immaginazione. Se immettiamo nel meccanismo informazioni pensando id essere noi stessi indegni, esse vengono elaborate fornendoci le risposte sotto forma di esperienza oggettiva.&lt;/p>
&lt;h2 id="capitolo-2-il-meccanismo-del-successo">Capitolo 2: Il Meccanismo del successo&lt;/h2>
&lt;p>Non è necessario insegnare a uno scoiattolo a raccogliere noci, gli animali hanno determinati istinti che li guidano. E anche l’uomo ha un istinto al successo. Gli animali non possono scegliere i propri obiettivi, gli uomini con l’immaginazione possono prefiggersi una varietà di vini.
Come funziona li meccanismo: sono divisi in 2 tipo: il tipo in cui il bersaglio o la risposta sono conosciuti e l’obiettivo è il raggiungimento il il compimento, e il tipo in cui non sono conosciuti e l’obiettivo è scoprirlo.
Tipo 1: esempio il siluro ad auto puntamento. Esso punta l’obiettivo, fa errori, corregge gli errori fino a che non raggiunge l’obiettivo. Nell’uomo accade una cosa simile: punta l’obiettivo, usare il desiderio per cominciare l’azione e correggere la direzione fino al raggiungimento dello scopo. Una volta raggiunto lo scopo, il meccanismo ricorda questo processo e la mantiene impresso per casi futuri.
Tipo 2: esempio query di un database. Prima bisogna riempire la macchina di dati, successivamente mediante una query si pone il problema alla macchina, che esplorerà i dati fino a scoprire la risposta più pertinente. Nell’uomo accade cosa simile quando si tenta di ricordare un nome.
Non è possibile formare una nuova immagine dell’io senza sentire che è basata sulla verità. Allorché un individuo muti la propria immagine, ha la sensazione che egli finalmente veda la verità su se stesso. Abbiate fiducia nel meccanismo, senza preoccuparvi del fatto che possa funzionare o meno. Esso comincerà a mettersi in moto quando voi agirete. Non dovete aspettare che abbiate le prove, agite come se già le aveste. E non abbiate paura di insuccessi momentanei, ogni meccanismo raggiunge il suo scopo facendo errori e correggendosi immediatamente. La capacità si acquista attraverso esperienze e sbagli.&lt;/p>
&lt;h2 id="capitolo-3-limmaginazione-è-la-chiave-più-importante">Capitolo 3 L’immaginazione è la chiave più importante&lt;/h2>
&lt;p>Esempio: un uomo si imbatte in un orso in un sentiero. Egli ha paura e automaticamente si mette a fuggire. Tuttavia, cosa sarebbe successo se l’orso in realta fosse un attore travestito? Oppure un grosso cane con una folta pelliccia? Se l’uomo avesse pensato che fosse comunque un orso vero, si sarebbe comportato nello stesso identico modo e si sarebbe spaventato. L’uomo ha reagito a ciò che pensava fosse reale, non a quello che era oggettivamente reale.
Di conseguenza, se le nostre idee e immagini mentali sono distorte o irreali, allora anche le nostre reazione all’ambiente saranno errate.
Le immagini mentali ci danno l’opportunità di esercitare nuove inclinazione e avere nuovi atteggiamenti.
Edward McGoldrick usa questa tecnica per aiutare gli alcolizzati a oltrepassare il ponte da vecchio al nuovo io. Ogni giorno li fa rilassare il più possibile e, a occhi chiusi, raccomanda loro di creare un film mentale di se stessi, in cui possono vedersi come vorrebbero essere. Lo scopo dell’autoimmaginazione non è creare un se stesso fittizio, potente e arrogante, ma di crearne uno reale, in linea con il nostro vero io.
Secondo la religione e gli umanisti, lo scopo dell’uomo è quello di esprimere compiutamente se stessi.
Esercizio: 30 min al giorno, rilassatevi e mettetevi comodi. Chiudete gli occhi e immaginate di essere difronte a un grande schermo, mentre assisti a un film su te stesso. Il film deve essere molto vivido e particolareggiato (immagina luci, suoni, oggetti, odori). Per la mente la realtà immaginata è uguale alla realtà effettiva. Immaginatevi di agire e reagire con successo, in maniera ideale. Immaginate come vi sentireste se foste gia la persona che vorreste essere.&lt;/p>
&lt;h2 id="capitolo-4-disipnotizzatevi-dalle-convinzioni-errate">Capitolo 4 Disipnotizzatevi dalle convinzioni errate&lt;/h2>
&lt;p>Ogni essere umano è ipnotizzato o da idee che ha accettato senza criticare, o da idee ripetute a se stesso fino a convincersi che sono vere. Tali idee negative hanno sul comportamento lo stesso effetto che un ipnotizzatore ottiene inculcando nella mente di un soggetto idee negative. Il soggetto opera contro se stesso. La capacità fondamentale per compiere le cose è insita in tutti noi, ma spesso siamo incapaci di farne uso poiché le nostre opinioni negative ci impediscono di credere che siamo capaci.
COMPLESSO DI INFERIORITA’: il 95% della gente ce l’ha. Ciò impedisce alle persone di essere felici. Esso esiste perché misuriamo noi stessi non sul nostro stesso modello, ma sul modello di qualche altro individuo. Questo ci spinge a voler renderci e dimostrarci superiori.
Ma questa battaglia per la superiorità porta a un maggior disagio e rischia di farci diventare più infelici di prima. La verità è che non siamo ne inferiori ne superiori a nessuno: siamo semplicemente noi, non diventeremo mai come gli altri ne possiamo misurarci con gli altri perché non esiste individuo simile a noi.
RELAX: mutare le proprie opinioni e abitudini attraverso la pura forza di volontà ha un effetto contrario a quello voluto. Il miglior modo per liberarsi da un abitudine consiste nel formarsi una chiara immagine del risultato voluto e cercare di raggiungerla senza compiere sforzi. Il relax fisico, se praticato giornalmente, ha come effetto il relax mentale, che ci rende possibile controllare più coscientemente il nostro meccanismo.&lt;/p>
&lt;h2 id="capitolo-5-non-svegliare-il-can-che-dorme">Capitolo 5 Non svegliare il can che dorme&lt;/h2>
&lt;p>I nostri errori, sbagli, fallimenti e umiliazioni, sono stati dei passi fondamentali nel processo di apprendimento. Ma una volta serviti allo scopo, devono essere dimenticati. Se continuiamo a rimproverarci per gli errori commessi, allora l’errore potrebbe diventare lo scopo del nostro meccanismo. Ogniqualvolta sentite rimorso per un atto non malvagio, esaminatene le cause e convincetevi della sua assurdità.
RIVALUTATE LE VOSTRE OPINIONI&lt;/p>
&lt;ol>
&lt;li>Questa mia opinione è basata su un fatto reale, un ipotesi o su una conclusione errata?&lt;/li>
&lt;li>Esiste una vera ragione che giustifichi tale opinione?&lt;/li>
&lt;li>È possibile che mi sia sbagliato?&lt;/li>
&lt;li>Perché continuo ad agire e a sentire come se tale opinione fosse vera, pur non esistendo alcuna effettiva ragione che la convalidi?&lt;/li>
&lt;/ol>
&lt;p>Il pensiero razionale deve essere unito a un intenso desiderio e un profondo sentimento. Bisogna essere entusiasti e desiderosi di ciò che si vuole diventare, poiché tali cose sono assolutamente realizzabili.
È irrazionale dire “ho fallito una volta, quindi probabilmente fallirò ancora in futuro”. Trarre conclusioni in anticipo è illogico.
Concentratevi solo su ciò che volete, non su quello che non volete.&lt;/p>
&lt;h2 id="capitolo-6-rilassatevi-e-lasciate-lavorare-il-meccanismo">Capitolo 6 Rilassatevi e lasciate lavorare il meccanismo&lt;/h2>
&lt;p>La nostra è un era di tensione, nervosismo e ansia. Poiché ci affidiamo troppo al pensiero cosciente e non lasciamo agire il nostro meccanismo creativo. Difatti, le nostre idee creative non vengono consapevolmente emesse dal pensiero, ma sorgono automaticamente quando la mente cosciente si è distaccata dal problema e pensa ad altro.
È importante usare la mente cosciente per raccogliere più dati possibili sull’argomento e considerare tutti i possibili andamenti, oltre ad avere un forte desiderio di risolvere il problema. E dopo aver immaginato il risultato finale. Ma alla fine, bisogna lasciar agire il meccanismo senza preoccuparsi troppo. Lo sforzo consapevole blocca il meccanismo.&lt;/p>
&lt;ol>
&lt;li>Accettare le proprie ansie e preoccupazioni prima di compiere l’azione, cosicché non siate ansiosi e preoccupati nel durante.&lt;/li>
&lt;li>Reagite consciamente alle emozioni del momento e non siate preoccupati per il domani, riservate la vostra attenzione al presente. Vivete giorno per giorno, né guardando avanti né indietro. Vivete oggi meglio che potete. Vivendo al meglio oggi fate tutto ciò che è in vostro potere per vivere meglio domani.&lt;/li>
&lt;li>Fate solo una cosa per volta. Fare troppe cose per volta causa confusione e nervosismo.&lt;/li>
&lt;li>Dormiteci sopra&lt;/li>
&lt;li>Rilassatevi mentre lavorate. Di tanto in tanto fermatevi per visualizzare e ricordare dettagliatamente la sensazione di relax.&lt;/li>
&lt;/ol>
&lt;h2 id="capitolo-7-felicità">Capitolo 7 Felicità&lt;/h2>
&lt;p>La felicità è uno stato mentale in cui abbiamo pensieri piacevoli per buona parte del tempo. La felicità non la si guadagna ne si merità. Essa non è la ricompensa alla virtù, ma la virtù stessa. Siamo felici non perché tratteniamo i nostri ardenti desideri, ma al contrario, siamo in grado di vincerli perché siamo felici.
La felicita è un abitudine, uno stato mentale, non può essere condizionata da un fattore esterno esempio, quando mi sposerò… quando cambierò lavoro… allora sarò felice. Poiché l’uomo è un essere che lotta per raggiungere uno scopo, quando egli agisce da lottatore è sempre abbastanza felice.&lt;/p>
&lt;h2 id="capitolo-8-limmagine-del-successo">Capitolo 8 l’immagine del successo&lt;/h2>
&lt;p>AVERE UNA DIREZIONE
Quando non abbiamo uno scopo personale da raggiungere, ci sentiamo persi e sentiamo la vita stessa senza scopo. L’uomo è costruito per risolvere problemi, raggiungere scopi, e non possiamo essere ne soddisfatti ne felici senza ostacoli da superare e mete da raggiungere.
COMPRENSIONE
Come abbiamo gia visto, le persone reagiscono alle cose non come essere sono obiettivamente, ma come sono le loro immagini mentali. Spesso le persone reagiscono in un modo non per farci soffrire, ma perché interpretano le situazioni in modo diverso da noi. Credere che una persona abbia agito in buona fede piuttosto che volutamente con malizia, può giovare al miglioramento dei rapporti umani.
CORAGGIO
Dovete avere il coraggio di agire, poiché solo attraverso l’azione, gli scopi, i desideri e le opinioni possono tramutare in realtà. Se noi aspettiamo ad agire fino a quando non siamo completamente sicuri del risultato, non muoveremo mai un dito. Dovete avere ogni giorno il coraggio di rischiare e sbagliare di fallire e di essere umiliati. Un passo nella direzione sbagliata è meglio che stare immobili tutta la vita.
AMORE PER IL PROSSIMO
Le personalità di successo si interessano e prendo in considerazione il loro prossimo. Il nostro modo di sentire verso noi stessi tende a corrispondere ai nostri sentimenti verso il prossimo. Se penso che la gente non è molto importante, allora credo io stesso di non esserlo. Cessate di condannare, giudicare e odiare gli altri per i loro errori.
STIMA
Avere una bassa opinione di se stessi è un vizio. La gelosia deriva quasi sempre dal dubitare di se stessi. Smettete di immaginarvi come una persona sconfitta e indegna. Mostrate rispetto per ogni essere umano solo per il fatto che egli è una creatura di dio.
FIDUCIA IN SE STESSI
La fiducia in se stessi è costruita sull’esperienza del successo. Quando iniziamo una qualsiasi impresa è normale avere poca fiducia, perché non abbiamo imparato dall’esperienza c he possiamo avere successo. Può aiutare abituarsi a ricordare intensamente i successi passati e dimenticare i fallimenti.
ACCETTARSI COME SI E’
Abbandonare ogni finzione! Sapersi accettare significa trovare un accordo con noi stessi, ora, come siamo, con le nostre colpe, debolezze, difetti e la nostra forza e le nostre doti. Imparate a accettare le vostre imperfezioni. Non a odiarti per causa loro!&lt;/p>
&lt;h2 id="capitolo-9-il-meccanismo-per-linsuccesso">Capitolo 9 Il meccanismo per l’insuccesso&lt;/h2>
&lt;p>Sintomi del meccanismo per l’insuccesso:
FRUSTRAZIONE
Senso di rabbia che nasce quando un grande desiderio viene ostacolato. Un senso di delusione cronico dimostra di solito che i fini che ci siamo prefissi sono irrealizzabili o che la nostra immagine dell’io non è esatta, oppure l’una e l’altra cosa.
AGGRESSIVITA’
L’aggressività è l’energia emotiva necessaria per raggiungere uno scopo, infatti, dobbiamo sempre cercare di superare i problemi con aggressività. Tuttavia, quando noi siamo bloccati o delusi nel raggiungimento del nostro scopo, l’energia viene bloccata e diventa una forza distruttiva. Esempio l’impiegato che vuole prendere a pugni il suo capo ma non osa, torna a casa e potrebbe picchiare la moglie o tirare calci al gatto. L’aggressività non è una cosa negativa, infatti, non dobbiamo sradicarla, ma trovare dei canali giusti su cui direzionarla, per esprimerla.&lt;br>
Quando vi trovare a un punto morto nel raggiungimento di un fine, avete bisogno di una valvola per scaricare l’energia emotiva in eccesso. L’esercizio fisico e il lavoro sono sempre le migliori valvole di sfogo.
MANCANZA DI SICUREZZA
L’individuo che manca di sicurezza sente che dovrebbe essere capace, che dovrebbe avere successo. Dovrebbe essere felice, capace, equilibrato. Sente che dovrebbe essere già “arrivato”.
In realtà dovrebbe pensare che questi sono scopi da raggiungere, piuttosto che come fatti che dovrebbero essere già.
L’uomo che è convinto di essere buono in senso assoluto, non solo non ha alcun incentivo per far meglio, ma si sente insicuro perché ha una pretesa da difendere.
L’atteggiamento mentale che genera l’insicurezza è un modo di sostituire alla realtà il vanto della pretesa. È un mezzo per provare a se stessi e agli altri la propria superiorità. Se siete ora perfetti e superiori non vi è alcun motivo di lottare, di tentare, di cercare di superare gli altri.
SENSO DI SOLITUDINE
Tutti a volte siamo soli, ma è l’essere tagliato fuori da ogni contatto con il prossimo, che è un sintomo del meccanismo del fallimento. L’individuo solitario spesso forma un circolo vizioso, poiché a causa del suo sentimento di alienazione dal suo io, provoca contatti umani non soddisfacenti e diviene un recluso sociale.
Sforzatevi di mescolarvi con il prossimo, incuranti dei vostri sentimenti. Sviluppate in voi un’abilità sociale che vi permetta di aumentare la felicità degli altri: la danza, la conversazione, suonare uno strumento ecc… esporsi costantemente all’oggetto della paura rende immuni dalla paura stessa. Via via che la persona solitaria continua a forzare se stessa nelle relazioni sociali, come contribuente attivo, essa scoprirà che la maggior parte delle persone è amichevole e accogliente. La sua timidezza cominceranno a scomparire, si sentir api a suo agio con il prossimo e con se stesso. Essere accettati dagli altri aiuta ad accettare se stessi.
INCERTEZZA
l’incertezza è un modo per evitare errori e la responsabilità. Essa è bastata sull’errata premessa che se non si prende alcuna decisione è impossibile sbagliare. Babe Ruth, il migliore giocatore di baseball, detiene anche il record per il maggior numero di colpi male effettuati.
È nella natura delle cose progredire con l’azione, commettendo errori e correggendosi. I grandi uomini sbagliano e ammettono i loro errori, è il mediocre che ha paura di ammettere di aver sbagliato.
RISENTIMENTO
Il risentimento è un tentativo di rendere il nostro fallimento accettabile dando la colpa a un capro espiatorio.
Esso, assieme all’autocommiserazione, vanno di pari passo con un immagine inferiore e inefficiente dell’io. Vi immaginate come una persona degna di compassione, come una vittima creata per essere infelice.
Ma il risentimento non è causato dagli altri, ma dalla nostra risposta emotiva.
SENSO DI VUOTO
È un sintomo del fatto che non vivete creativamente. O non avete uno scopo che sia importante per voi. La persona che non ha una meta conclude “la vita non ha scopo”.
Il senso di vuoto, una volta provato, può diventare un modo di evitare qualsiasi sforzo. Tuttavia se troviamo uno scopo per cui valga la pena lottare, proveremo gioia e soddisfazione.
Conclusione: abbiamo bisogno di conoscere tutto ciò che è negativo per poterlo evitare. Ma non pensare continuamente a dove non vuoi andare. Getta uno sguardo agli ostacoli, ma pensa solo al campo.&lt;br>
Conoscere tutto ciò che è negativo può aiutarci se:&lt;/p>
&lt;ol>
&lt;li>Siamo abbastanza sensibili a ciò che è negativo da permetterci di avvisarci del pericolo&lt;/li>
&lt;li>Riconosciamo ciò che è negativo per quello che in realtà è. Qualcosa di indesiderabile, che non vogliamo e che non ci dà la vera felicità&lt;/li>
&lt;li>Intraprendiamo immediatamente un azione correttiva e sostituiamo il fattore negativo con un opposto fattore positivo.&lt;/li>
&lt;/ol>
&lt;h2 id="capitolo-10-come-eliminare-le-cicatrici-emotive">Capitolo 10 come eliminare le cicatrici emotive&lt;/h2>
&lt;p>Molti uomini hanno profonde cicatrici emotive. Queste persone sono state ferite e offese da qualcuno nel passato e per guarirsi da future ingiurie, si sono formate una sorta di callo spirituale. Una cicatrice emotiva per proteggere il loro io.
Il problema è che un eccessiva “cicatrice emotiva” può procurarci danni maggiori in altri campi.
Essa può portare alla formazione di un immagine dell’io falsata, l’immagine di una persona non amata e non accettata dagli altri, una persona che non riesce a inserirsi nella società. Le cicatrici emotive impediscono di avere una vita creativa e di realizzarsi compiutamente.
Tre regole per immunizzarvi contro le offese:&lt;/p>
&lt;ol>
&lt;li>Sentitevi troppo forti per poter essere minacciati
Coloro che si offendono per nulla, hanno una bassissima stima di se stessi.&lt;/li>
&lt;li>Essere più responsabili e fiduciosi rende meno vulnerabili
Cercate di dare affetto, amore, approvazione e comprensione agli altri, e vi accorgerete che tutto ciò tornerà a voi come una sorta di azione riflessa.&lt;/li>
&lt;li>Eliminate la tensione
Noi ci irritiamo emotivamente non tanto a causa degli altri, ma a causa del nostro stesso atteggiamento e della nostra reazione esempio il traffico.
Rilassarsi aiuta ad attutire i colpi emotivi.
Come eliminare le vecchie cicatrici emotive? Esse devono essere sradicate completamente attraverso il perdono. Esso però deve essere genuino, e deve essere dimenticato cosi come è stato perdonato il torto. Il perdono che viene ricordato e rimuginato in continuazione, infetta di nuovo la ferita che cercate di cauterizzare. Il perdono non deve neanche essere un arma. Non perdoniamo le persone perché abbiamo deciso di essere generosi, per farle un favore o perché siamo superiori. Il vero perdono si verifica solamente quando riusciamo a vedere e accettare spiritualmente che non vi è ne vi era niente che noi dovessimo perdonare. Per prima cosa non avremmo dovuto condannare e odiare un&amp;rsquo;altra persona.
A volte però, molte volte le ferite emotive ce le infliggiamo da soli. Ci condanniamo noi stessi col rimpianto e il rimorso, ci abbattiamo e ci addossiamo colpe eccessive.
È vano e fatale condannare noi stessi per i nostri sbagli.
Noi facciamo errori, ma gli errori non fanno noi. I nostri errori non ci definiscono.
Se veniamo offesi, possiamo fare una di queste due cose: o costruiamo uno spesso scudo, per evitare di essere feriti ancora, o porgiamo l’altra guancia, siamo vulnerabili, continuando però a vivere creativamente.&lt;/li>
&lt;/ol>
&lt;h2 id="capitolo-11-come-sbloccare-la-vostra-personalità">Capitolo 11 come sbloccare la vostra personalità&lt;/h2>
&lt;p>La personalità non è qualcosa che si acquista dal nulla, ma è qualcosa che si libera dall’interno. Quando infatti diciamo che una persona ha una forte personalità, vogliamo dire che ha liberato da ogni inibizione il suo intimo potenziale creativo ed è in grado di esprimere il suo io reale.
La chiave dell’inibizione è il reagire troppo negativamente. Essere troppo prudenti o ansioni di evitare di commettere errori, è una forma di reazione negativa sproporzionata. Il risultato è l’inibizione e una deformazione del comportamento.
Quando vi preoccupate troppo di ciò che gli altri pensano, o quando cerchiamo di compiacere gli altri, allora la vostra reazione negativa è sproporzionata e subentra l’inibizione e il comportamento mediocre.
Il modo per fare una buona impressione sugli altri è non cercate mai di fare buona impressione. Non agite mai o non mancate di agire semplicemente perché pensate troppo consciamente all’effetto. Non chiedetevi mai cosa gli altri pensino di voi o come vi giudichino.
Per disinibirci, bisogna deliberatamente fare pratica nell’essere meno prudenti, meno preoccupati, meno coscienziosi. Dovete parlare prima di pensare, agire prima di pensare.
ESERCIZIO:&lt;/p>
&lt;ol>
&lt;li>Non preoccupatevi in anticipo di ciò che direte, aprite la bocca e parlate.&lt;/li>
&lt;li>Non pianificate, non pensate prima di agire, agite e correggete le vostre azioni di volta in volta&lt;/li>
&lt;li>Smettete di criticarvi, la persona inibita indulge continuamente all’analisi critica di se stesso. L’introspezione è utile solo una volta l’anno.&lt;/li>
&lt;li>Parlate a voce più alta del solito.&lt;/li>
&lt;li>Fate vedere alle persone che le amate, se le amate. Fate complimenti.&lt;/li>
&lt;/ol>
&lt;h2 id="capitolo-12-siate-voi-stessi-a-produrre-sul-vostro-io-la-stessa-reazione-dei-tranquillanti">Capitolo 12 siate voi stessi a produrre sul vostro io la stessa reazione dei tranquillanti&lt;/h2>
&lt;h2 id="capitolo-13-come-convertire-una-crisi-in-unopportunità">Capitolo 13 come convertire una crisi in un’opportunità&lt;/h2>
&lt;p>Per agire bene durante una crisi, dobbiamo fare ciò che segue:&lt;/p>
&lt;ol>
&lt;li>Dobbiamo acquistare una determinata abilità in condizioni in cui siamo sotto pressione e dobbiamo farne pratica&lt;/li>
&lt;li>Dobbiamo imparare a reagire alla crisi con un atteggiamento aggressivo, rispondere non tanto alla minaccia che la situazione presenta quanto alla sfida. Dobbiamo tenere sempre a mente il nostro fine positivo.&lt;/li>
&lt;li>Dobbiamo imparare a valutare le cosiddette situazioni critiche nella loro vera luce, mai fare di un granello una montagna.&lt;/li>
&lt;/ol>
&lt;ol>
&lt;li>&lt;/li>
&lt;/ol>
&lt;p>Essere sotto pressione ritarda la capacità di apprendere. Per imparare a gestire una situazione di crisi, bisogna prima imparare e fare pratica in condizioni non critiche. Esempi -&amp;gt; shadow boxing, parlare davanti allo specchio, parlare davanti a delle sedie vuote immaginando gli spettatori, usando l’immaginazione, esercitandosi e facendo simulazioni in situazioni tranquille e senza la presenza di fattori inibitori.
2)
Pensare sempre a ciò che farò io, ciò che voglio che accada, non a quello che farà l’altro o quello che può succedere a me. Non importa ciò che accade, riuscirò a farcela, posso già vedere la fine.
Molte persone interpretano il sentimento di eccitazione come paura e ansia. Interpretandolo di conseguenza come una prova di inadeguatezza.
Ciò non è un segno di debolezza, ma un segno di forza che deve venir impiegata in qualsiasi modo scegliate. Se perdete di vista il vostro scopo originale, e il fine del vostro atteggiamento diventa quello di fuggire dalla crise, allora questa tendenza alla fuga sarà rafforzata e voi proverete paura e ansia. Ma se la vostra intenzione è quella di andare avanti, allora l’eccitazione che proverete rafforzerà questa tendenza e vi darà più coraggio e più forza per andare avanti.
3)
Quando una disgrazia vi minaccia, considerate attentamente e con serietà qual è la cosa peggiore che può accadere. Esaminate bene questa disgrazia e cercate di pensare che dopo tutto non vi è alcuna necessità di farne un dramma. C’è tutto da guadagnare e nulla da perdere.&lt;/p>
&lt;h2 id="capitolo-14-come-acquisire-queste-sensazioni-di-vittoria">Capitolo 14 come acquisire queste sensazioni di vittoria.&lt;/h2>
&lt;p>Se indugiamo a pensare al fallimento, immaginandolo in continuazione con particolari così vividi da farlo diventare reale, proveremo gli stessi sentimenti che a esso si accompagnano. Se invece teniamo sempre a mente il nostro scopo positivo, se ce lo immaginiamo così vividamente da farlo diventare reale, proveremo sentimenti di vittoria: fiducia in se stessi, coraggio e la convinzione che il risultato sarà positivo.
Cercate di tornare indietro nella memoria e rivivete queste esperienze di successo. Più dettagliatamente sarà meglio è. Se riuscirete a ricordare i sentimenti che avete provato in quei momenti, essi verranno riattivati nel presente. Dopo aver fatto sorgere questa sensazione, volgete il pensiero a qualsiasi cosa in cui volete avere successo adesso. Usate la vostra immaginazione per vedere come agireste o come vi sentireste se aveste già raggiunto tale successo.
Cominciate con un “supponiamo che” accada questa cosa, in seguito, viene l’idea “della possibilità”, e vi dite: bene, dopotutto questa cosa è possibile, può accadere.
Non basatevi sui consigli dettati dalla paura. Le sensazioni di paura e di ansia significano che sottovalutiamo la nostra capacità. Che sopravvalutiamo la natura del problema e che stiamo riattivando ricordi di passati fallimenti.
Accogliamo queste sensazioni negative come una sfida. Diventate più decisi quando qualcuno vi dice che non possiamo fare una cosa.&lt;/p>
&lt;h2 id="capitolo-15-più-anni-di-vita-e-più-vita-ai-vostri-anni">Capitolo 15 più anni di vita e più vita ai vostri anni.&lt;/h2>
&lt;p>Non mi interessa&lt;/p></description></item><item><title>Coding a Strong Internet Blocker (Part 1)</title><link>https://gianlucacini.com/coding-a-strong-internet-blocker-part-1/</link><pubDate>Sun, 21 Mar 2021 00:00:00 +0000</pubDate><guid>https://gianlucacini.com/coding-a-strong-internet-blocker-part-1/</guid><description>&lt;p>Around the end of the COVID lockdowns, I developed an unhealthy relationship with YouTube, Netflix, and video games. With little else to occupy my time, I found myself spending hours playing video games with friends and scrolling through endless content until the early hours of the morning.&lt;/p>
&lt;p>This behavior took a toll on both my mental and physical health, although I recognize that others faced even greater challenges during the pandemic.&lt;/p>
&lt;p>Research has shown that excessive screen time can negatively impact well-being. And unfortunately, there are no good solutions on the market that solve this problem. So, armed with this knowledge and after several months of development, I created a minimalistic yet effective internet blocker.&lt;/p>
&lt;p>You can find it here
&lt;a href="https://github.com/gianlucacini/Unplug">Link to GitHub&lt;/a>&lt;/p>
&lt;h2 id="must-have-feature-of-an-internet-blocker">Must-Have Feature of an Internet Blocker&lt;/h2>
&lt;p>What sets this internet blocker apart from most others is its high level of resistance to bypassing. It&amp;rsquo;s akin to your father sternly ordering you to switch off that device. I believe this feature should be a necessity for any internet or website blocker.&lt;/p>
&lt;h2 id="how-to-bypass-an-internet-blocker">How to Bypass an Internet Blocker&lt;/h2>
&lt;p>There are several methods to bypass an internet blocker:&lt;/p>
&lt;ul>
&lt;li>Terminating the process from the task manager&lt;/li>
&lt;li>Uninstalling it&lt;/li>
&lt;li>Deleting or overriding firewall rules&lt;/li>
&lt;li>Tampering with your DNS&lt;/li>
&lt;li>Changing the clock of your computer&lt;/li>
&lt;li>Changing the timezone of your computer&lt;/li>
&lt;li>Tampering with the file configuration&lt;/li>
&lt;li>Tampering with the registry&lt;/li>
&lt;/ul>
&lt;h2 id="what-my-internet-blocker-does-once-its-running">What My Internet Blocker Does Once It&amp;rsquo;s Running&lt;/h2>
&lt;ul>
&lt;li>It blocks internet access using a firewall rule and checks its existence every 15 seconds, automatically recreating it if deleted.&lt;/li>
&lt;li>It sets the process as critical, forcing a system restart if the process is terminated from the task manager.&lt;/li>
&lt;li>It stores your timezone in a configuration file and retrieves the current time from an external NTP server.&lt;/li>
&lt;li>It keeps its configuration file open to prevent tampering.&lt;/li>
&lt;li>It initiates several process monitors to detect any attempts to tamper with the registry or service configuration.&lt;/li>
&lt;li>You cannot uninstall it because you cannot stop the service.&lt;/li>
&lt;/ul>
&lt;h2 id="code-components">Code Components&lt;/h2>
&lt;h3 id="snippet-to-set-process-as-critical">Snippet to set process as critical&lt;/h3>
&lt;p>how is this even legal idk&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="na">[System.Runtime.InteropServices.DllImport(&amp;#34;ntdll.dll&amp;#34;, SetLastError = true)]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">private&lt;/span> &lt;span class="kd">static&lt;/span> &lt;span class="kd">extern&lt;/span> &lt;span class="k">void&lt;/span> &lt;span class="n">RtlSetProcessIsCritical&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">UInt32&lt;/span> &lt;span class="n">v1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">UInt32&lt;/span> &lt;span class="n">v2&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">UInt32&lt;/span> &lt;span class="n">v3&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//sets process as critical&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">RtlSetProcessIsCritical&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//sets process as not critical&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">RtlSetProcessIsCritical&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="snippet-to-create-firewall-rule">Snippet to create Firewall Rule&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">using&lt;/span> &lt;span class="nn">NetFwTypeLib&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">INetFwRule&lt;/span> &lt;span class="n">firewallRule&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">INetFwRule&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">Activator&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CreateInstance&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Type&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">GetTypeFromProgID&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;HNetCfg.FWRule&amp;#34;&lt;/span>&lt;span class="p">));&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">firewallRule&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Action&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">NET_FW_ACTION_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">NET_FW_ACTION_BLOCK&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">firewallRule&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Description&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;This rule blocks internet connection.&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">firewallRule&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Direction&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">NET_FW_RULE_DIRECTION_&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">NET_FW_RULE_DIR_OUT&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">firewallRule&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Enabled&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">firewallRule&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">InterfaceTypes&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;All&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">firewallRule&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Name&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Rule Name&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="snippet-to-get-set-registry-values">Snippet to Get Set Registry Values&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">String&lt;/span> &lt;span class="n">subkeyPath&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">$@&amp;#34;SYSTEM\CurrentControlSet\Services\Internet Blocker Service\&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//get registry key values&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">var&lt;/span> &lt;span class="n">keys&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">Microsoft&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Win32&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Registry&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">LocalMachine&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">OpenSubKey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">subkeyPath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//set registry key values&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//create key&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Microsoft&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Win32&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Registry&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">LocalMachine&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">CreateSubKey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">subkeyPath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//open key&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">browserKeys&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">Microsoft&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Win32&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Registry&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">LocalMachine&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">OpenSubKey&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">subkeyPath&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">true&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">//create subkey&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">browserKeys&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">SetValue&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;keyName&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;keyValue&amp;#34;&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">browserKeys&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Close&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description></item></channel></rss>