<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Programando na Madrugada – Programando na Madrugada</title><link>https://luizpicanco.com/</link><description>Recent content on Programando na Madrugada</description><generator>Hugo -- gohugo.io</generator><language>pt-br</language><lastBuildDate>Sat, 08 Apr 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://luizpicanco.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Introducing Krate: A Rate Limiter Library for Kotlin</title><link>https://luizpicanco.com/blog/2023-04-08-introducing-krate-a-rate-limiter-library-for-kotlin/</link><pubDate>Sat, 08 Apr 2023 00:00:00 +0000</pubDate><guid>https://luizpicanco.com/blog/2023-04-08-introducing-krate-a-rate-limiter-library-for-kotlin/</guid><description>
&lt;p&gt;As a software developer, I&amp;rsquo;m always on the lookout for tools and libraries that can help streamline my projects and improve their overall efficiency.&lt;/p&gt;
&lt;p&gt;Today, I will share with you my latest creation, an open-source rate limit library for Kotlin called Krate!&lt;/p&gt;
&lt;p&gt;In this post, I&amp;rsquo;ll introduce you to Krate, explain its features, and show you how it can be a valuable addition to your Kotlin-based applications.&lt;/p&gt;
&lt;h3&gt;What is Krate?&lt;span class="hx:absolute hx:-mt-20" id="what-is-krate"&gt;&lt;/span&gt;
&lt;a href="#what-is-krate" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Krate is a rate limiter library designed specifically for Kotlin applications. It provides a simple yet powerful solution for managing and enforcing rate limits in various types of applications, such as APIs, web services, or any other projects that require rate limiting to control request rates and protect your resources from abuse.&lt;/p&gt;
&lt;h3&gt;Why Use Krate?&lt;span class="hx:absolute hx:-mt-20" id="why-use-krate"&gt;&lt;/span&gt;
&lt;a href="#why-use-krate" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Rate limiting is a crucial aspect of any application that exposes resources over a network, as it helps prevent abuse, ensures fair usage, and maintains the stability and performance of your services. With Krate, you can effortlessly implement rate limiting in your Kotlin projects, thanks to its easy-to-use and highly configurable design.&lt;/p&gt;
&lt;h3&gt;Key Features of Krate&lt;span class="hx:absolute hx:-mt-20" id="key-features-of-krate"&gt;&lt;/span&gt;
&lt;a href="#key-features-of-krate" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Token Bucket Algorithm: Krate uses the token bucket algorithm, a widely-used technique for rate limiting, to ensure efficient and fair resource allocation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Burst Support: Krate allows for bursty request patterns, letting clients make a certain number of requests in a short time before being rate-limited.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Redis Support: Krate offers support for Redis as a backend for storing rate limit information, enabling distributed rate limiting across multiple instances of your application.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Keys eviction support: Krate automatically evicts unused keys, optimizing memory usage and ensuring optimal performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Easy Integration: Krate can be easily integrated into your existing Kotlin projects without any hassle.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Customizable Rate Limits: Krate allows you to define custom rate limits based on your specific requirements, ensuring that your application&amp;rsquo;s resources are protected and fairly distributed.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Getting Started with Krate&lt;span class="hx:absolute hx:-mt-20" id="getting-started-with-krate"&gt;&lt;/span&gt;
&lt;a href="#getting-started-with-krate" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To get started with Krate, you can simply add it as a dependency to your Kotlin project. Here&amp;rsquo;s an example of how you can add Krate to your project using Gradle:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;implementation(&lt;span style="color:#e6db74"&gt;&amp;#34;io.github.lpicanco:krate-core:1.0.2&amp;#34;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Once you&amp;rsquo;ve added Krate to your project, you can start using it to enforce rate limits.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a simple example of how to use Krate to limit requests to an API endpoint:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; com.neutrine.krate.rateLimiter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 60 requests per minute
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; rateLimiter = rateLimiter(maxRate = &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; maxRateTimeUnit = &lt;span style="color:#a6e22e"&gt;ChronoUnit&lt;/span&gt;.MINUTES
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;handleRequest&lt;/span&gt;(request: Request) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (rateLimiter.tryTake()) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Process the request
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Reject the request due to rate limit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Here&amp;rsquo;s another example, limiting requests by client ID:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-kotlin" data-lang="kotlin"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; com.neutrine.krate.rateLimiter
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 5 requests per second
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;val&lt;/span&gt; rateLimiter = rateLimiter(maxRate = &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fun&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;handleRequest&lt;/span&gt;(request: Request, clientId: String) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (rateLimiter.tryTake(clientId)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Process the request
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Reject the request due to rate limit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;Learn More and Contribute&lt;span class="hx:absolute hx:-mt-20" id="learn-more-and-contribute"&gt;&lt;/span&gt;
&lt;a href="#learn-more-and-contribute" class="subheading-anchor" aria-label="Link permanente para esta secção"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;To learn more about Krate and explore its features, please visit the project repository on &lt;a href="https://github.com/lpicanco/krate"target="_blank" rel="noopener"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to contribute to the project, feel free to submit issues, pull requests, or help improve the documentation.&lt;/p&gt;
&lt;p&gt;Additionally, you can visit the Krate &lt;a href="https://lpicanco.github.io/krate"target="_blank" rel="noopener"&gt;documentation site&lt;/a&gt; for more detailed information, usage examples, and API reference.&lt;/p&gt;
&lt;p&gt;I hope this post has given you a good introduction to Krate and how it can help you implement rate limiting in your Kotlin applications. Feel free to share your thoughts, experiences, or questions in the comments section below. Happy coding!&lt;/p&gt;</description></item><item><title>Artigo sobre o Playlist Exchange no The Next Web</title><link>https://luizpicanco.com/blog/2015-11-18-artigo-sobre-o-playlist-exchange-no-the-next-web/</link><pubDate>Wed, 18 Nov 2015 14:45:07 +0000</pubDate><guid>https://luizpicanco.com/blog/2015-11-18-artigo-sobre-o-playlist-exchange-no-the-next-web/</guid><description>
&lt;p&gt;Saiu um artigo sobre o &lt;a href="http://playlistexchange.neutrine.com"target="_blank" rel="noopener"&gt;Playlist Exchange&lt;/a&gt; no The Next Web.&lt;/p&gt;
&lt;p&gt;O Playlist Exchange é uma ferramenta online para importação e exportação de playlists de música.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://thenextweb.com/insider/2015/11/17/how-to-save-your-rdio-playlists-to-spotify-and-apple-music-while-you-still-can"target="_blank" rel="noopener"&gt;How to save your Rdio playlists to Spotify and Apple Music while you still can&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Workaround para o problema de checksum mismatch error do SVN</title><link>https://luizpicanco.com/blog/2015-05-20-workaround-para-o-problema-de-checksum-mismatch-error-do-svn/</link><pubDate>Wed, 20 May 2015 10:34:55 +0000</pubDate><guid>https://luizpicanco.com/blog/2015-05-20-workaround-para-o-problema-de-checksum-mismatch-error-do-svn/</guid><description>
&lt;p&gt;Existem casos onde os metadados de uma working copy do SVN fica corrompida e durante o commit, recebemos a seguinte mensagem:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;Some update&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;svn: Checksum mismatch &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;/home/me/dev/bionshare/FileServer.java&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;expected: &lt;span style="color:#e6db74"&gt;&amp;#39;77d5a3ce97ccff226dcdaaf07d5721f5&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;actual: &lt;span style="color:#e6db74"&gt;&amp;#39;67d76735a0467d91c5ff733f98de451d&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Existem algumas formas de resolver esse problema, como renomear o arquivo e depois restaurar o nome original. A forma mais rápida que eu encontrei foi essa:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn update --set-depth empty
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;D FileServer.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Updated to revision 6544.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ svn update --set-depth infinity
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A FileServer.java
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Updated to revision 6544.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esses comandos restauram os dados de cache do arquivo com as informações do repositório.&lt;/p&gt;</description></item><item><title>Contando palavras no SQL Server</title><link>https://luizpicanco.com/blog/2014-04-12-contando-palavras-no-sql-server/</link><pubDate>Sat, 12 Apr 2014 22:38:01 +0000</pubDate><guid>https://luizpicanco.com/blog/2014-04-12-contando-palavras-no-sql-server/</guid><description>
&lt;p&gt;Hoje precisei executar uma consulta no SQL Server que me retornasse a quantidade de palavras de uma coluna, agrupado pela palavra.&lt;/p&gt;
&lt;p&gt;Utilizei a consulta abaixo para fazer o serviço sujo:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;WITH Num1 (n) AS (SELECT 1 UNION ALL SELECT 1),
Num2 (n) AS (SELECT 1 FROM Num1 AS X, Num1 AS Y),
Num3 (n) AS (SELECT 1 FROM Num2 AS X, Num2 AS Y),
Num4 (n) AS (SELECT 1 FROM Num3 AS X, Num3 AS Y),
Nums (n) AS (SELECT ROW_NUMBER() OVER(ORDER BY n) FROM Num4),
Words (word) AS (
SELECT SUBSTRING(&amp;#39; &amp;#39; &amp;#43; descr &amp;#43; &amp;#39; &amp;#39;, n &amp;#43; 1,
CHARINDEX(&amp;#39; &amp;#39;, &amp;#39; &amp;#39; &amp;#43; descr &amp;#43; &amp;#39; &amp;#39;, n &amp;#43; 1) - n - 1)
FROM Nums
JOIN (SELECT text FROM TweetMessages) AS F(descr)
ON SUBSTRING(&amp;#39; &amp;#39; &amp;#43; descr &amp;#43; &amp;#39; &amp;#39;, n, 1 ) = &amp;#39; &amp;#39;
AND n &amp;lt; LEN(&amp;#39; &amp;#39; &amp;#43; descr &amp;#43; &amp;#39; &amp;#39;))
SELECT word, COUNT(*) AS cnt
FROM Words
GROUP BY word
ORDER BY cnt DESC&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Não é uma maravilha de performance, mas é bem útil!&lt;/p&gt;
&lt;p&gt;O resultado da consulta:&lt;br&gt;
&lt;a href="http://104.131.7.34/wp-content/uploads/2014/04/twitterCount.png"target="_blank" rel="noopener"&gt;&lt;img src="http://104.131.7.34/wp-content/uploads/2014/04/twitterCount.png" alt="twitterCount" loading="lazy" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Importando um arquivo CSV para o SQL Server com BULK INSERT</title><link>https://luizpicanco.com/blog/2014-01-15-importando-um-arquivo-csv-para-o-sql-server-com-bulk-insert/</link><pubDate>Wed, 15 Jan 2014 21:08:29 +0000</pubDate><guid>https://luizpicanco.com/blog/2014-01-15-importando-um-arquivo-csv-para-o-sql-server-com-bulk-insert/</guid><description>
&lt;p&gt;Como importar um arquivo CSV para o SQL Server com BULK INSERT&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;BULK
INSERT CLIENTE
FROM &amp;#39;F:BULKDATACLIENTE.txt&amp;#39;
WITH
(
FIRSTROW = 2, -- Ignora o header
FIELDTERMINATOR = &amp;#39;,&amp;#39;,
ROWTERMINATOR = &amp;#39;n&amp;#39;
)
GO&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Baixando o conteúdo de uma URL no PowerShell</title><link>https://luizpicanco.com/blog/2013-11-10-baixando-o-conteudo-de-uma-url-no-powershell/</link><pubDate>Sun, 10 Nov 2013 19:46:18 +0000</pubDate><guid>https://luizpicanco.com/blog/2013-11-10-baixando-o-conteudo-de-uma-url-no-powershell/</guid><description>
&lt;p&gt;Hoje precisei programar um job no SQL Server para baixar um arquivo de um site usando o powershell.&lt;/p&gt;
&lt;p&gt;O script que eu utilizei foi esse:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;$fileName = &amp;#34;c:tempfile.zip&amp;#34;
$webclient = New-Object System.Net.WebClient
$webclient.DownloadFile(&amp;#34;http://siteparabaixararquivo/arquivo&amp;#34;,$fileName)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Um script muito simples que as vezes poder ser útil.&lt;/p&gt;</description></item><item><title>Removendo registros duplicados na base de dados</title><link>https://luizpicanco.com/blog/2013-11-01-removendo-registros-duplicados-na-base-de-dados/</link><pubDate>Fri, 01 Nov 2013 22:18:16 +0000</pubDate><guid>https://luizpicanco.com/blog/2013-11-01-removendo-registros-duplicados-na-base-de-dados/</guid><description>
&lt;p&gt;&lt;a href="http://104.131.7.34/wp-content/uploads/2013/11/duplicate-content.jpg"target="_blank" rel="noopener"&gt;&lt;img src="http://104.131.7.34/wp-content/uploads/2013/11/duplicate-content-300x225.jpg" alt="duplicate-content" loading="lazy" /&gt;&lt;/a&gt;&lt;br&gt;
Script SQL simples para remover os registros duplicados de uma tabela:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;DELETE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Links
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; ID &lt;span style="color:#66d9ef"&gt;NOT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;IN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;SELECT&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;MAX&lt;/span&gt;(ID)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; Links
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;GROUP&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;BY&lt;/span&gt; url
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Removendo os registros com urls duplicadas da tabela Links.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Indexando e buscando documentos com Lucene.Net e LINQ</title><link>https://luizpicanco.com/blog/2013-10-28-indexando-e-buscando-documentos-com-lucene-net-e-linq/</link><pubDate>Mon, 28 Oct 2013 20:57:50 +0000</pubDate><guid>https://luizpicanco.com/blog/2013-10-28-indexando-e-buscando-documentos-com-lucene-net-e-linq/</guid><description>
&lt;p&gt;Código de exemplo:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System.Linq;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Microsoft.VisualStudio.TestTools.UnitTesting;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; System.IO;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Lucene.Net.Store;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Lucene.Net.Linq;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Lucene.Net.Linq.Mapping;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Lucene.Net.Analysis.Standard;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;namespace&lt;/span&gt; LuceneTests
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt; [TestClass]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;LuceneTest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt; [TestMethod]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; TestIndex()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Configura o Lucene.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; luceneDir = Path.Combine(System.Environment.CurrentDirectory,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;lucene_index&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (!System.IO.Directory.Exists(luceneDir))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;lock&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; System.IO.Directory.CreateDirectory(luceneDir);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; directory = FSDirectory.Open(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; DirectoryInfo(luceneDir));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; provider = &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; LuceneDataProvider(directory,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Lucene.Net.Util.Version.LUCENE_30);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Indexa os Documentos.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; session = provider.OpenSession&amp;lt;Document&amp;gt;())
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; session.Add(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Document()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Title = &lt;span style="color:#e6db74"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Content = &lt;span style="color:#e6db74"&gt;&amp;#34;Hello Lucene!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; session.Add(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Document()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Title = &lt;span style="color:#e6db74"&gt;&amp;#34;Hi&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Content = &lt;span style="color:#e6db74"&gt;&amp;#34;Hi, Lucene!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Busca os documentos que contém a palavra &amp;#34;Hello&amp;#34; no título.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; items = provider.AsQueryable&amp;lt;Document&amp;gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .Where(l =&amp;gt; l.Title.Contains(&lt;span style="color:#e6db74"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Assert.AreNotEqual(items.Count(), &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Document&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt; [Field(Analyzer = typeof(StandardAnalyzer))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String Title { &lt;span style="color:#66d9ef"&gt;get&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt; [Field(Analyzer = typeof(StandardAnalyzer))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; String Content { &lt;span style="color:#66d9ef"&gt;get&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;set&lt;/span&gt;; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Como desenvolver para XNA no Windows 8</title><link>https://luizpicanco.com/blog/2012-10-08-como-desenvolver-para-xna-no-windows-8/</link><pubDate>Mon, 08 Oct 2012 20:35:37 +0000</pubDate><guid>https://luizpicanco.com/blog/2012-10-08-como-desenvolver-para-xna-no-windows-8/</guid><description>
&lt;p&gt;Por padrão, se você tentar instalar o XNA Game Studio 4.0 no Windows 8, você receberá uma mensagem de erro. Esse erro é devido a problemas de compatibilidade.&lt;/p&gt;
&lt;p&gt;A Microsoft prometeu uma nova versão do Windows Phone SDK que resolve esse problema, mas ainda deve demorar para sair.&lt;/p&gt;
&lt;p&gt;Uma maneira de contornar o problema é instalando o &lt;a href="http://www.xbox.com/en-US/LIVE/PC/DownloadClient"title="Games for Windows Marketplace Client"target="_blank" rel="noopener"&gt;Games for Windows Marketplace Client&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Após essa instalação, você poderá instalar o XNA Game Studio para utilizá-lo com o Visual Studio 2010.&lt;br&gt;
Infelizmente, o XNA Game Studio ainda não é compatível com o Visual Studio 2012.&lt;/p&gt;</description></item><item><title>Utilizando o Apple Wireless Keyboard no Windows</title><link>https://luizpicanco.com/blog/2012-05-28-utilizando-o-apple-wireless-keyboard-no-windows/</link><pubDate>Mon, 28 May 2012 22:54:37 +0000</pubDate><guid>https://luizpicanco.com/blog/2012-05-28-utilizando-o-apple-wireless-keyboard-no-windows/</guid><description>
&lt;p&gt;Sem dúvida alguma, o &lt;a href="http://www.apple.com/keyboard/"target="_blank" rel="noopener"&gt;Apple Wireless Keyboard&lt;/a&gt; é um teclado sensacional.&lt;/p&gt;
&lt;p&gt;Adquiri recentemente um teclado apple wireless, para utilizar no meu hackintosh. Funcionou que é uma maravilha!&lt;/p&gt;
&lt;p&gt;Como estava tendo diversos problema de compatibilidade com o hardware, resolvi parar de utilizá-lo e montar uma estação Windows :/&lt;/p&gt;
&lt;p&gt;Como queria utilizar o teclado com o Windows, utilizei o aplicativo &lt;a href="http://applewirelesskbrd.codeplex.com/"target="_blank" rel="noopener"&gt;Apple Wireless Keyboard&lt;/a&gt;, que além de fornecer uma boa compatibilidade, oferece uma opção de trocar as teclas Control Fn.&lt;/p&gt;
&lt;p&gt;O projeto é open source &lt;img src="http://www.luizpicanco.com/wp-content/uploads/2012/05/wlEmoticon-smile.png" alt="Smile" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://applewirelesskbrd.svn.codeplex.com/svn"target="_blank" rel="noopener"&gt;Repositório do SVN&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Script para dar commit/deploy automático no Heroku</title><link>https://luizpicanco.com/blog/2011-07-31-script-para-dar-commitdeploy-automatico-no-heroku/</link><pubDate>Sun, 31 Jul 2011 00:44:51 +0000</pubDate><guid>https://luizpicanco.com/blog/2011-07-31-script-para-dar-commitdeploy-automatico-no-heroku/</guid><description>
&lt;p&gt;Para realizar commit e deploy automático no Heroku, utilizo o seguinte script:&lt;br&gt;
&lt;code&gt;git add . git commit -m &amp;quot;Automatic Commit&amp;quot; git push heroku master&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Recuperando uma partição com problemas no OSX</title><link>https://luizpicanco.com/blog/2011-05-27-recuperando-uma-particao-com-problemas-no-osx/</link><pubDate>Fri, 27 May 2011 21:14:32 +0000</pubDate><guid>https://luizpicanco.com/blog/2011-05-27-recuperando-uma-particao-com-problemas-no-osx/</guid><description>
&lt;p&gt;Ontem, durante uma falha de energia, meu osx não estava conseguindo mais montar a partição de boot. A mensagem que eu estava recebendo era a seguinte:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;failed to open/create the journal journal is not empty cannot mount root, errno = 19&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Após uma série de tentativas frustradas de recuperação, consegui recuperá-la desabilitando o journal.&lt;br&gt;
Após bootar pelo cd do osx, vá para o terminal e entre com os seguintes comandos:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo mount_hfs -j device mount_dir sudo diskutil disableJournal mount_dir sudo diskutil enableJournal mount_dir&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;No meu caso, o device era disk0s2&lt;/p&gt;</description></item><item><title>Labs Facebook</title><link>https://luizpicanco.com/blog/2011-05-12-labs-facebook/</link><pubDate>Thu, 12 May 2011 00:00:34 +0000</pubDate><guid>https://luizpicanco.com/blog/2011-05-12-labs-facebook/</guid><description>
&lt;p&gt;Estou estudando a API do Facebook, que é muito boa por sinal. É possível desenvolver várias aplicações utilizando somente Javascript.&lt;br&gt;
Estou aproveitando esse estudo para desenvolver algumas aplicações simples para o Facebook:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://apps.facebook.com/recitador"target="_blank" rel="noopener"&gt;Recitador&lt;/a&gt; &amp;ldquo;â?? Recite frases de sabedoria para o seus amigos!&lt;br&gt;
&lt;a href="http://apps.facebook.com/facebook_poker/"target="_blank" rel="noopener"&gt;Cutucador&lt;/a&gt; &amp;ldquo;â?? Cutuque os seus amigos&lt;/p&gt;</description></item><item><title>Levantando um http server simples no OSX, de forma nativa</title><link>https://luizpicanco.com/blog/2011-03-10-levantando-um-http-server-simples-no-osx-de-forma-nativa/</link><pubDate>Thu, 10 Mar 2011 23:03:08 +0000</pubDate><guid>https://luizpicanco.com/blog/2011-03-10-levantando-um-http-server-simples-no-osx-de-forma-nativa/</guid><description>
&lt;p&gt;Estava precisando levantar um simples servidor http de páginas estáticas no osx. Após uma busca no google, descobri uma forma muito simples de fazer isso, utilizando pyhton, que ja vem embutido no osx.&lt;/p&gt;
&lt;p&gt;É só executar o seguinte comando do diretório a ser servido:&lt;br&gt;
&lt;code&gt;Hadron:HTML lpicanco$ python -m SimpleHTTPServer 8082&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Um simples servidor HTTP será iniciado para o diretório local. &lt;em&gt;8082&lt;/em&gt; é o número da porta.&lt;/p&gt;</description></item><item><title>Usando o iPad ou o iPhone como segundo monitor no mac</title><link>https://luizpicanco.com/blog/2011-01-16-usando-o-ipad-ou-iphonecomo-segundo-monitor-no-mac/</link><pubDate>Sun, 16 Jan 2011 15:54:40 +0000</pubDate><guid>https://luizpicanco.com/blog/2011-01-16-usando-o-ipad-ou-iphonecomo-segundo-monitor-no-mac/</guid><description>
&lt;p&gt;Com uma tela daquele tamanho, seria desperdício não poder utilizar o iPad, ou até mesmo o iPhone como um segundo ou terceiro monitor, não ?&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;img src="http://avatron.com/images/air-display-product-shot.jpg" title="Air Display" alt="" loading="lazy" /&gt;
&lt;figcaption&gt;Air Display&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;O Air Display da Avatron resolve isso utilizando a rede wi-fi para compartilhar o display do iPad e do iPhone.&lt;br&gt;
A experiência é muito boa, tirando um pouco a lentidão na renderização da tela do iPad, devido a baixa velocidade da rede wifi.&lt;/p&gt;
&lt;p&gt;Além de versão para OSX, tem versão também Windows.&lt;br&gt;
&lt;a href="http://avatron.com/apps/air-display"target="_blank" rel="noopener"&gt;http://avatron.com/apps/air-display&lt;/a&gt;&lt;/p&gt;</description></item><item><title>O Photoshop não abre arquivos do Photoshop ?</title><link>https://luizpicanco.com/blog/2011-01-15-o-photoshop-nao-abre-arquivos-do-photoshop/</link><pubDate>Sat, 15 Jan 2011 00:35:18 +0000</pubDate><guid>https://luizpicanco.com/blog/2011-01-15-o-photoshop-nao-abre-arquivos-do-photoshop/</guid><description>
&lt;p&gt;&lt;a href="http://www.luizpicanco.com/wp-content/uploads/2011/01/fail.tiff"target="_blank" rel="noopener"&gt;&lt;figure&gt;
&lt;img src="http://www.luizpicanco.com/wp-content/uploads/2011/01/fail.tiff" title="Photoshop Fail" alt="" loading="lazy" /&gt;
&lt;figcaption&gt;Photoshop Fail&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Então tá&amp;hellip;&lt;/p&gt;</description></item><item><title>Talk is cheap. Show me the code!</title><link>https://luizpicanco.com/blog/2011-01-05-talk-is-cheap-show-me-the-code-2/</link><pubDate>Wed, 05 Jan 2011 00:05:43 +0000</pubDate><guid>https://luizpicanco.com/blog/2011-01-05-talk-is-cheap-show-me-the-code-2/</guid><description>
&lt;p&gt;Essa é a camisa!&lt;br&gt;
&lt;figure&gt;
&lt;img src="http://posterous.com/getfile/files.posterous.com/temp-2010-12-11/wbbrcxCzlJtizjgIeciwqkCCxHEHBApsirvFycddjzmwHsuIbJFxAvppAmFI/show-me-the-code-v3.jpg.scaled600.jpg" title="Task is cheap. Show me the code" alt="Task is cheap. Show me the code" loading="lazy" /&gt;
&lt;figcaption&gt;Task is cheap. Show me the code&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Removendo a acentuação e os caracteres especiais de uma String</title><link>https://luizpicanco.com/blog/2010-05-28-removendo-a-acentuacao-e-os-caracteres-especiais-de-uma-string/</link><pubDate>Fri, 28 May 2010 10:56:37 +0000</pubDate><guid>https://luizpicanco.com/blog/2010-05-28-removendo-a-acentuacao-e-os-caracteres-especiais-de-uma-string/</guid><description>
&lt;p&gt;Estava precisando remover a acentuação e os caracteres especiais do nome de um arquivo. Para isso, desenvolvi um extension method para a classe String.&lt;/p&gt;
&lt;p&gt;Exemplo:&lt;br&gt;
String de entrada:&lt;br&gt;
&lt;strong&gt;Adobe Acrobat - Pacy-Paraná_05.12_áèïôúã+.pdf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;String de retorno:&lt;br&gt;
&lt;strong&gt;AdobeAcrobatPacyParana_05.12_aeioua.pdf&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Desenvolvi o método utilizando uma HashTable e expressão regular. Caso você tenha alguma sugestão de melhoria, poste aí nos comentários.&lt;/p&gt;
&lt;p&gt;Extension method:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; String RemoveSpecialCharacters(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt; String self)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; normalizedString = self;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Prepara a tabela de símbolos.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; symbolTable = &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;[]&amp;gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; symbolTable.Add(&lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;[] {&lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;á&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;ä&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;â&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;ã&amp;#39;&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; symbolTable.Add(&lt;span style="color:#e6db74"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;[] { &lt;span style="color:#e6db74"&gt;&amp;#39;ç&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; symbolTable.Add(&lt;span style="color:#e6db74"&gt;&amp;#39;e&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;[] { &lt;span style="color:#e6db74"&gt;&amp;#39;è&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;é&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;ë&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;ê&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; symbolTable.Add(&lt;span style="color:#e6db74"&gt;&amp;#39;i&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;[] { &lt;span style="color:#e6db74"&gt;&amp;#39;ì&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;í&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;ï&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;î&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; symbolTable.Add(&lt;span style="color:#e6db74"&gt;&amp;#39;o&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;[] { &lt;span style="color:#e6db74"&gt;&amp;#39;ò&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;ó&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;ö&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;ô&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;õ&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; symbolTable.Add(&lt;span style="color:#e6db74"&gt;&amp;#39;u&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;char&lt;/span&gt;[] { &lt;span style="color:#e6db74"&gt;&amp;#39;ù&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;ú&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;ü&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;û&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Substitui os símbolos.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;foreach&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; key &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; symbolTable.Keys)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;foreach&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; symbol &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; symbolTable[key])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; normalizedString = normalizedString.Replace(symbol, key);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Remove os outros caracteres especiais.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; normalizedString = Regex.Replace(normalizedString, &lt;span style="color:#e6db74"&gt;&amp;#34;[^0-9a-zA-Z._]+?&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; normalizedString;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Criando um relógio analógico com Processing JS</title><link>https://luizpicanco.com/blog/2010-05-26-criando-um-relogio-analogico-com-processing-js/</link><pubDate>Wed, 26 May 2010 23:24:08 +0000</pubDate><guid>https://luizpicanco.com/blog/2010-05-26-criando-um-relogio-analogico-com-processing-js/</guid><description>
&lt;p&gt;Excelente tutorial do Thej, do blog &lt;a href="http://thejeshgn.com"target="_blank" rel="noopener"&gt;Thejesh GN&lt;/a&gt;, sobre processingjs.&lt;/p&gt;
&lt;p&gt;Nesse tutorial, ele ensina como criar um relógio analógico usando processing.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://thejeshgn.com/2009/10/29/getting-started-with-processingjs-by-writing-analog-clock/"target="_blank" rel="noopener"&gt;Getting started with Processingjs by writing Analog clock&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Processing Labs: Game Of Life</title><link>https://luizpicanco.com/blog/2010-05-25-processing-labs-game-of-life/</link><pubDate>Tue, 25 May 2010 23:37:00 +0000</pubDate><guid>https://luizpicanco.com/blog/2010-05-25-processing-labs-game-of-life/</guid><description>
&lt;p&gt;Comecei a estudar &lt;a href="http://processing.org"target="_blank" rel="noopener"&gt;processing&lt;/a&gt;. Processing é uma linguagem de programação para trabalhar com visualização de dados. &lt;a href="http://processingjs.org"target="_blank" rel="noopener"&gt;Processing.js&lt;/a&gt; é um porte da linguagem para Javascript.&lt;/p&gt;
&lt;p&gt;Como primeiro experimento, o famoso &lt;a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life"target="_blank" rel="noopener"&gt;Game of Life&lt;/a&gt;:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;float&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;density&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;[][][] &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setup&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;size&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;frameRate&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;15&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;stroke&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;255&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Set random cells to &amp;#39;on&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;density&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt;)][(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt;)][&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;draw&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;background&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Drawing and update cycle
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ((&lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;point&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Birth and death cycle
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;neighbors&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ((&lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;count&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Count the number of adjacent cells &amp;#39;on&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;neighbors&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[(&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][(&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[(&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt;][&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt;][(&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[(&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt;][(&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[(&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt;][(&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[(&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt;][(&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;world&lt;/span&gt;[(&lt;span style="color:#a6e22e"&gt;x&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sx&lt;/span&gt;][(&lt;span style="color:#a6e22e"&gt;y&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sy&lt;/span&gt;][&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;];
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Webcam Life Log</title><link>https://luizpicanco.com/blog/2010-05-23-webcam-life-log/</link><pubDate>Sun, 23 May 2010 21:10:35 +0000</pubDate><guid>https://luizpicanco.com/blog/2010-05-23-webcam-life-log/</guid><description>
&lt;p&gt;O Webcam Life Log é um utilitário que tira fotos com a webcam, em um intervalo de tempo definido. Desenvolvi ele utilizando o Adobe AIR.&lt;/p&gt;
&lt;p&gt;Para instalar, basta clicar na imagem abaixo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Please upgrade your Flash Player&lt;/strong&gt;&lt;br&gt;
This is the content that would be shown if the user does not have Flash Player 6.0.65 or higher installed.&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-actionscript" data-lang="actionscript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// version 9.0.115 or greater is required for launching AIR apps.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;so&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;SWFObject&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;http://webcamlifelog.googlecode.com/svn/wiki/AIRInstallBadge.swf&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;215&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;180&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;9.0.115&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#000000&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;so&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;useExpressInstall&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;http://webcamlifelog.googlecode.com/svn/wiki/expressinstall.swf&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;so&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addVariable&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;airversion&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;1.5.3&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;so&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addVariable&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;appname&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Webcam%20Life%20Log&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;so&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addVariable&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;appurl&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;http://webcamlifelog.googlecode.com/files/WebCamLifeLog.air&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;so&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addVariable&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;appid&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;com.luizpicanco.WebCamLifeLog&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;so&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;addVariable&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;appversion&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;,&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0.1&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;so&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;write&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;flashcontent&amp;#34;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Screenshot:&lt;br&gt;
&lt;figure&gt;
&lt;img src="http://webcamlifelog.googlecode.com/svn/wiki/webcamlifelog.png" title="Webcam Life Log screenshot" alt="" loading="lazy" /&gt;
&lt;figcaption&gt;Webcam Life Log screenshot&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;O código-fonte está disponível no google code:&lt;br&gt;
&lt;a href="http://code.google.com/p/webcamlifelog/"target="_blank" rel="noopener"&gt;http://code.google.com/p/webcamlifelog&lt;/a&gt;&lt;/p&gt;</description></item><item><title>SessionScope e FlushAction no Castle ActiveRecord</title><link>https://luizpicanco.com/blog/2010-04-09-sessionscope-e-flushaction-no-castle-activerecord/</link><pubDate>Fri, 09 Apr 2010 00:21:51 +0000</pubDate><guid>https://luizpicanco.com/blog/2010-04-09-sessionscope-e-flushaction-no-castle-activerecord/</guid><description>
&lt;p&gt;O Castle ActiveRecord é uma implementação do padrão homônimo feita em cima nHibernate. Um ORM bastante conhecido no mundo Java. Apesar de alguns comportamentos serem realizados pelo nHibernate, estarei aqui citando o ActiveRecord como responsável por tais comportamentos.&lt;/p&gt;
&lt;p&gt;Um problema muito comum que eu costumo me deparar, é com a utilização de lazy loading no ActiveRecord.&lt;/p&gt;
&lt;p&gt;Geralmente na utilização de lazy loading em aplicações web, é utilizado o padrão Session per Request para o SessionScope. Só que por padrão, o ActiveRecord persiste automaticamente (em algumas situações) as entidades, mesmo que seus métodos Save ou Update não tenham sido invocados. Isso costuma gerar uma série de problemas, como por exemplo, entidades com o seu estado interno inválido sendo persistido.&lt;/p&gt;
&lt;p&gt;Para resolver esse problema, deve ser especificado o FlushAction como Never:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SessionScope session = &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; SessionScope(FlushAction.Never);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Assim, o ActiveRecord não irá mais persistir automaticamente as entidades. Em contrapartida, mesmo invocando os métodos Save ou Update as entidades não serão persistidas. Para que isso ocorra, será necessário utilizar os métodos SaveAndFlush e UpdateAndFlush, respectivamente, ou utilizar o método Flush da instância do SessionScope.&lt;/p&gt;</description></item><item><title>O Gênesis em Java</title><link>https://luizpicanco.com/blog/2010-02-24-o-genesis-em-java/</link><pubDate>Wed, 24 Feb 2010 10:25:35 +0000</pubDate><guid>https://luizpicanco.com/blog/2010-02-24-o-genesis-em-java/</guid><description>
&lt;ul&gt;
&lt;li&gt;No início, a terra era sem forma e vazia&lt;/li&gt;
&lt;li&gt;Então Deus criou o Java e viu que era bom&lt;/li&gt;
&lt;li&gt;Com o Java ele levou 6 dias para escrever o código-fonte do universo&lt;/li&gt;
&lt;li&gt;No 7º dia ele botou para compilar e foi descansar&lt;/li&gt;
&lt;li&gt;E assim, tudo teve início&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Powered by Java HotSpot Virtual Machine 6.0&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Erro ao utilizar o mysql no ruby: LIBMYSQL.dll is missing</title><link>https://luizpicanco.com/blog/2010-02-21-erro-ao-utilizar-o-mysql-no-ruby-libmysql-dll-is-missing/</link><pubDate>Sun, 21 Feb 2010 01:39:26 +0000</pubDate><guid>https://luizpicanco.com/blog/2010-02-21-erro-ao-utilizar-o-mysql-no-ruby-libmysql-dll-is-missing/</guid><description>
&lt;p&gt;Um erro muito comum que costuma acontecer no ruby/rails, em ambiente windows é: &amp;ldquo;LIBMYSQL.dll is missing from your computer&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;img src="http://www.luizpicanco.com/wp-content/uploads/2010/02/erro.png" title="erro" alt="LIMYSQL.dll is missing" loading="lazy" /&gt;
&lt;figcaption&gt;erro&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;E a mensagem também pode aparecer no console da seguinte forma:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ruby.exe - Unable to locate Component
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;This application has failed to start because LIBMYSQL.DLL was not
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;found. Re-installing the application might
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fix this problem.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Esse erro ocorre porque a dll do mysql, LIBMYSQL.dll, não foi localizada. Para resolver esse problema, faça o seguinte:&lt;/p&gt;
&lt;p&gt;1 - Instale a gem do mysql&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gem install mysql&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;2 - Copie o arquivo LIBMYSQL.dll do diretório bin do mysql(ex.: c:mysqlbin) para o diretório bin do ruby (ex.: c:rubybin)&lt;/p&gt;</description></item><item><title>The Social Media Revolution</title><link>https://luizpicanco.com/blog/2009-08-25-the-social-media-revolution/</link><pubDate>Tue, 25 Aug 2009 00:25:52 +0000</pubDate><guid>https://luizpicanco.com/blog/2009-08-25-the-social-media-revolution/</guid><description>
&lt;p&gt;We no longer search for the news, the news find us&amp;hellip;&lt;/p&gt;
&lt;p&gt;Are you ready ?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE: 08/05/2010&lt;/strong&gt;&lt;br&gt;
Versão 2.0:&lt;/p&gt;</description></item><item><title>Obtendo as Properties pela ordem de declaração no C#</title><link>https://luizpicanco.com/blog/2009-08-18-obtendo-as-properties-pela-ordem-de-declaracao-no-c/</link><pubDate>Tue, 18 Aug 2009 18:07:25 +0000</pubDate><guid>https://luizpicanco.com/blog/2009-08-18-obtendo-as-properties-pela-ordem-de-declaracao-no-c/</guid><description>
&lt;p&gt;Em alguns momentos, pode ser necessário obter a lista de properties de um objeto. Um jeito simples de fazer isso é:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; IEnumerable&amp;lt;PropertyInfo&amp;gt; GetProperties(Type type)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; type.GetProperties();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;O problema é que, segundo a Microsoft, a ordem em que as properties são retornadas não é garantido:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The GetProperties method does not return properties in a particular order, such as alphabetical or declaration order. Your code must not depend on the order in which properties are returned, because that order varies.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Uma solução para resolver esse problema é ordenar a lista de properties pela property MetadataToken.&lt;/p&gt;
&lt;p&gt;O código então, ficaria assim:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; IEnumerable&amp;lt;PropertyInfo&amp;gt; GetProperties(Type type)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; type.GetProperties().OrderBy(p =&amp;gt; p.MetadataToken);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Se a intenção for obter as properties na ordem inversa, o código ficaria assim:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; IEnumerable&amp;lt;PropertyInfo&amp;gt; GetPropertiesDescending(Type type)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; type.GetProperties().OrderByDescending(p =&amp;gt; p.MetadataToken);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;O ideal é que o seu código não dependa da ordem dos membros para executar, mas em alguns casos, como geração automática de código, isso pode ser útil.&lt;/p&gt;</description></item><item><title>Jamais compre um notebook HP !!!</title><link>https://luizpicanco.com/blog/2009-07-02-jamais-compre-um-notebook-hp/</link><pubDate>Thu, 02 Jul 2009 00:19:25 +0000</pubDate><guid>https://luizpicanco.com/blog/2009-07-02-jamais-compre-um-notebook-hp/</guid><description>
&lt;p&gt;Eu fui proprietário de um notebook HP, modelo tx1070br, que parou de funcionar de forma repentina. Pesquisando nos fóruns, qual não foi a minha surpresa ao constatar que CENTENAS de pessoas tiveram o mesmo problema ?&lt;/p&gt;
&lt;p&gt;Em quase todos os casos, para não generalizar, a HP ignorou o caso e como a maioria dos problemas &amp;ldquo;estranhamente&amp;rdquo; ocorreram logo após o término de garantia, cobrou pelo serviço. Algumas pessoas pagaram e logo após receberem o notebook de volta(após 2 meses), o notebook apresentou o mesmo problema.&lt;/p&gt;
&lt;p&gt;Pesquisando mais sobre o assunto, descobrir que diversos modelos de notebook da HP estão &amp;ldquo;morrendo&amp;rdquo; logo após o término da garantia (aproximadamente 1 mês depois).&lt;/p&gt;
&lt;p&gt;Eu sempre respeitei os produtos da HP, mas isso não pode passar assim em branco. Uma empresa do porte da HP tem o dever de respeitar os consumidores.&lt;/p&gt;
&lt;p&gt;Link para um outro blog que relata o mesmo problema:&lt;br&gt;
&lt;a href="http://www.mycheaplaptop.net/2009/03/never-buy-hp-laptop/"target="_blank" rel="noopener"&gt;NEVER buy an HP laptop | Cheap Laptop Blog&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Erro na instalação de uma Ruby Gem: no such file to load -- mkmf</title><link>https://luizpicanco.com/blog/2009-05-06-erro-na-instalacao-de-uma-ruby-gem-no-such-file-to-load-mkmf/</link><pubDate>Wed, 06 May 2009 14:36:18 +0000</pubDate><guid>https://luizpicanco.com/blog/2009-05-06-erro-na-instalacao-de-uma-ruby-gem-no-such-file-to-load-mkmf/</guid><description>
&lt;p&gt;Se ao instalar uma gem você se deparou com esse erro:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;Building native extensions. This could take a while...
ERROR: While executing gem ... (Gem::Installer::ExtensionBuildError)
ERROR: Failed to build gem native extension.
ruby extconf.rb install mechanize
extconf.rb:1:in `require&amp;#39;: no such file to load -- mkmf (LoadError)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;from extconf.rb:1&lt;/p&gt;
&lt;p&gt;O problema é que o mkmf não foi encontrado. Ele se encontra no pacote ruby-dev. Para instalá-lo baixa executar o seguinte comando:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;sudo apt-get install ruby-dev&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;span style=&amp;#34;font-family: -webkit-monospace;&amp;#34;&amp;gt;
&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;span style=&amp;#34;font-family: -webkit-monospace;&amp;#34;&amp;gt;
&amp;lt;/span&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copiar código"
aria-label="Copiar código"
data-copied-label="Copiado!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Guia rápido do Grails</title><link>https://luizpicanco.com/blog/2009-04-26-guia-rapido-do-grails/</link><pubDate>Sun, 26 Apr 2009 23:27:29 +0000</pubDate><guid>https://luizpicanco.com/blog/2009-04-26-guia-rapido-do-grails/</guid><description>
&lt;p&gt;É bom ver a comunidade Grails crescendo no Brasil.&lt;/p&gt;
&lt;p&gt;O &lt;a href="http://www.itexto.net/devkico"target="_blank" rel="noopener"&gt;Henrique Weissmann&lt;/a&gt; produziu esse ótimo guia sobre o Grails.&lt;/p&gt;
&lt;p&gt;O guia está divido da seguinte forma:&lt;/p&gt;
&lt;p&gt;1 - Introdução&lt;br&gt;
2 - Como instalar o Grails&lt;br&gt;
3 - Groovy - O básico para quem for aprender Grails&lt;br&gt;
4 - Grails&lt;/p&gt;
&lt;p&gt;Acesse aqui: &lt;a href="http://www.itexto.net/devkico/?page_id=220"target="_blank" rel="noopener"&gt;Grails: um guia rápido e indireto ë /dev/Kico&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=26a8f052-3a26-8c0f-bf7e-9cac765a1c23" alt="" loading="lazy" /&gt;&lt;/p&gt;</description></item><item><title>Batalha de RAP de geeks</title><link>https://luizpicanco.com/blog/2009-04-17-batalha-de-rap-de-geeks/</link><pubDate>Fri, 17 Apr 2009 15:53:45 +0000</pubDate><guid>https://luizpicanco.com/blog/2009-04-17-batalha-de-rap-de-geeks/</guid><description>
&lt;p&gt;Veja como os geeks fazem uma batalha de RAP:&lt;/p&gt;
&lt;p&gt;djahandarie: we ain&amp;rsquo;t here to do e-c-e&lt;br&gt;
djahandarie: we&amp;rsquo;re here to do c-s-e on the w-e-b&lt;br&gt;
djahandarie: listen to me spit these rhymes&lt;br&gt;
djahandarie: while i program lines&lt;br&gt;
djahandarie: and commit web accessibility crimes&lt;br&gt;
djahandarie: word, son&lt;br&gt;
http402: You talk like your big on these I-Net kicks,&lt;br&gt;
http402: But your shit flows slower than a two-eighty-six.&lt;br&gt;
http402: I&amp;rsquo;m tracking down hosts and nmap scans,&lt;br&gt;
http402: While Code Igniter&amp;rsquo;s got you wringing your hands.&lt;br&gt;
http402: Cut the crap rap,&lt;br&gt;
http402: Or I&amp;rsquo;ll run ettercap,&lt;br&gt;
http402: Grab your AIM chat,&lt;br&gt;
http402: N&amp;rsquo; send a PC bitch-slap!&lt;br&gt;
http402: peace&lt;br&gt;
djahandarie: you&amp;rsquo;re talkin bout down hosts and nmap scans&lt;br&gt;
djahandarie: while i got other plans&lt;br&gt;
djahandarie: you&amp;rsquo;re at your new job, but you can&amp;rsquo;t even do it right&lt;br&gt;
djahandarie: you just create a plight with your http rewrites&lt;br&gt;
djahandarie: i&amp;rsquo;ve been on the web since the age of three&lt;br&gt;
djahandarie: you just got on directly off the bus from mississippi&lt;br&gt;
djahandarie: respect yo&amp;rsquo; elders, bitch&lt;br&gt;
http402: You&amp;rsquo;ve been webbin&amp;rsquo; since three, but still ain&amp;rsquo;t grown up,&lt;br&gt;
http402: Gotta update your config and send the brain a SIGHUP.&lt;br&gt;
http402: You say you&amp;rsquo;re that old? No wonder you&amp;rsquo;re slow!&lt;br&gt;
http402: You&amp;rsquo;re knocking at the door while I run this show!&lt;br&gt;
http402: Elders my ass, you&amp;rsquo;re shit&amp;rsquo;s still in school,&lt;br&gt;
http402: Hunt and pecking at the keyboard like a spaghetti-damned fool,&lt;br&gt;
http402: Rim-riffing your hard drive like a tool,&lt;br&gt;
http402: Face it. I rule.&lt;br&gt;
djahandarie: i erase my harddrives with magnets (bitch)&lt;br&gt;
djahandarie: all you can do is troll on the fagnets&lt;br&gt;
djahandarie: and son, my brain&amp;rsquo;s wrapped in a nohup&lt;br&gt;
djahandarie: it wont be hurt by the words you throwup&lt;br&gt;
djahandarie: dont mind me while i emerge my ownage&lt;br&gt;
djahandarie: while you&amp;rsquo;re still over there apt-getting your porridge&lt;br&gt;
djahandarie: you say i&amp;rsquo;m still in school&lt;br&gt;
djahandarie: but the fact is that i know the rule&lt;br&gt;
djahandarie: cuz you need to go back to grade three&lt;br&gt;
djahandarie: and you better plea, that they take sucky graduates from c-s-e&lt;br&gt;
http402: Time to bend over and apply a patch,&lt;br&gt;
http402: Your brain&amp;rsquo;s throwing static like a CD with a scratch.&lt;br&gt;
http402: Your connection got nuked and you&amp;rsquo;ve met your match.&lt;br&gt;
http402: You run a single process like a VAX with a batch.&lt;br&gt;
http402: I&amp;rsquo;d pass the torch to a real winner&lt;br&gt;
http402: But it&amp;rsquo;d just scorch a while-loop spinner&lt;br&gt;
http402: Caught in a loop that you cant escape,&lt;br&gt;
http402: I run clock cycles around your words and flows,&lt;br&gt;
http402: Cuz your rhyme is like a PS fan: it&amp;rsquo; blows,&lt;br&gt;
http402: Your water-cooled lyrics leak and it shows,&lt;br&gt;
http402: Take your ass back to alt.paid.for.windows.&lt;br&gt;
djahandarie: Good god, I can&amp;rsquo;t even respond to that. :P&lt;br&gt;
djahandarie: You win haha&lt;/p&gt;
&lt;p&gt;Fonte: &lt;a href="http://www.bash.org/?870063"target="_blank" rel="noopener"&gt;http://www.bash.org/?870063&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Client para twitter em .Net</title><link>https://luizpicanco.com/blog/2009-03-25-client-para-twitter-em-net/</link><pubDate>Wed, 25 Mar 2009 01:30:30 +0000</pubDate><guid>https://luizpicanco.com/blog/2009-03-25-client-para-twitter-em-net/</guid><description>
&lt;p&gt;Criei um client para twitter utilizando a plataforma .Net.&lt;/p&gt;
&lt;p&gt;Funcionalidades:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lista as mensagens dos seus amigos&lt;/li&gt;
&lt;li&gt;Lista os seus replies&lt;/li&gt;
&lt;li&gt;Lista as suas mensagens&lt;/li&gt;
&lt;li&gt;Adiciona novas mensagens&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A aplicação está funcional mas precisa de aprimoramentos no layout. Com o tempo vou atualizando.&lt;/p&gt;
&lt;p&gt;Screenshot da tela principal:&lt;/p&gt;
&lt;p&gt;[caption id=&amp;ldquo;attachment_84&amp;rdquo; align=&amp;ldquo;alignnone&amp;rdquo; width=&amp;ldquo;1024&amp;rdquo; caption=&amp;ldquo;Twitter.Net Screenshot&amp;rdquo;]&lt;a href="http://www.luizpicanco.com/wp-content/uploads/2009/03/twitternet1.jpg"target="_blank" rel="noopener"&gt;&lt;figure&gt;
&lt;img src="http://www.luizpicanco.com/wp-content/uploads/2009/03/twitternet1-1024x455.jpg" title="twitternet1" alt="Twitter.Net Screenshot" loading="lazy" /&gt;
&lt;figcaption&gt;twitternet1&lt;/figcaption&gt;
&lt;/figure&gt;&lt;/a&gt;[/caption]&lt;/p&gt;
&lt;p&gt;Faça o download:&lt;br&gt;
&lt;a href="http://twitterclient.googlecode.com/files/TwitterNet.zip"target="_blank" rel="noopener"&gt;Twitter.Net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;O código pode ser acessado aqui:&lt;br&gt;
&lt;a href="http://code.google.com/p/twitterclient/"target="_blank" rel="noopener"&gt;twitterclient - Google Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=dbb868ae-1d13-43e9-b0df-f72ff5404a60" alt="" loading="lazy" /&gt;&lt;/p&gt;</description></item><item><title>Banco de dados key-value simples em Java</title><link>https://luizpicanco.com/blog/2009-03-24-banco-de-dados-key-value-simples-em-java/</link><pubDate>Tue, 24 Mar 2009 21:50:15 +0000</pubDate><guid>https://luizpicanco.com/blog/2009-03-24-banco-de-dados-key-value-simples-em-java/</guid><description>
&lt;p&gt;Em mais uma dessas noites sem ter muito o que fazer, resolvi criar um banco de dados do tipo key-value (kvdb) em Java.&lt;/p&gt;
&lt;p&gt;O código do projeto está no Google Code com uma classe de testes.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/simplekvdb/"target="_blank" rel="noopener"&gt;simplekvdb - Google Code&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Technorati Tags: &lt;a href="http://technorati.com/tag/kvdb"target="_blank" rel="noopener"&gt;kvdb&lt;/a&gt;, &lt;a href="http://technorati.com/tag/database"target="_blank" rel="noopener"&gt;database&lt;/a&gt;, &lt;a href="http://technorati.com/tag/java"target="_blank" rel="noopener"&gt;java&lt;/a&gt;, &lt;a href="http://technorati.com/tag/simplekvdb"target="_blank" rel="noopener"&gt;simplekvdb&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://img.zemanta.com/pixy.gif?x-id=93717e34-a3f0-4ef9-8956-6217980419b5" alt="" loading="lazy" /&gt;&lt;/p&gt;</description></item><item><title>Http Server Simples em Java</title><link>https://luizpicanco.com/blog/2009-01-08-http-server-simples-em-java/</link><pubDate>Thu, 08 Jan 2009 23:21:00 +0000</pubDate><guid>https://luizpicanco.com/blog/2009-01-08-http-server-simples-em-java/</guid><description>
&lt;p&gt;Eu estava precisando de um servidor http simples, quando então, resolvi criar um em Java&lt;/p&gt;
&lt;p&gt;Esse servidor http é um servidor ultra simples, que trabalha apenas com arquivos estáticos.&lt;/p&gt;
&lt;p&gt;O código-fonte e os binários podem ser encontrados aqui:&lt;br&gt;
&lt;a href="http://code.google.com/p/hserver/"target="_blank" rel="noopener"&gt;http://code.google.com/p/hserver/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Configurando o NetBeans 6.5 para inglês</title><link>https://luizpicanco.com/blog/2008-12-15-configurando-o-netbeans-65-para-ingles/</link><pubDate>Mon, 15 Dec 2008 19:39:01 +0000</pubDate><guid>https://luizpicanco.com/blog/2008-12-15-configurando-o-netbeans-65-para-ingles/</guid><description>
&lt;p&gt;O NetBeans 6.5 utiliza por padrão as configurações regionais da sua máquina e se o seu computador estiver configurado para o português, ele utilizará esse idioma.&lt;/p&gt;
&lt;p&gt;Como é horrível desenvolver utilizando uma IDE em português, aí vai a dica para configurá-lo para o inglês.&lt;/p&gt;
&lt;p&gt;Abra o arquivo NETBEANS_HOME/etc/netbeans.conf, onde NETBEANS_HOME é o path de instalação do mesmo.&lt;/p&gt;
&lt;p&gt;Localize a linha &lt;em&gt;netbeans_default_options&lt;/em&gt; e adicione ao final dela (antes das aspas) o seguinte:&lt;br&gt;
-J-Duser.language=en&lt;/p&gt;</description></item><item><title>Instalando o Redmine no dreamhost</title><link>https://luizpicanco.com/blog/2008-12-04-instalando-o-redmine-no-dreamhost/</link><pubDate>Thu, 04 Dec 2008 23:30:45 +0000</pubDate><guid>https://luizpicanco.com/blog/2008-12-04-instalando-o-redmine-no-dreamhost/</guid><description>
&lt;p&gt;O &lt;a href="http://www.redmine.org/"target="_blank" rel="noopener"&gt;Redmine&lt;/a&gt; é uma excelente ferramenta de gerenciamento de projetos.&lt;/p&gt;
&lt;p&gt;Se após seguir os &lt;a href="wiki.dreamhost.com/Redmine"&gt;passos de instalação&lt;/a&gt; o layout ficar quebrado, remova o arquivo public/.htaccess&lt;/p&gt;
&lt;p&gt;O .htaccess que vem com o redmine, tem alguns problemas de compatibilidade com o Passenger do Dreamhost&lt;/p&gt;</description></item><item><title>Hello World em 366 linguagens</title><link>https://luizpicanco.com/blog/2008-05-13-hello-world-em-366-linguagens/</link><pubDate>Tue, 13 May 2008 17:40:59 +0000</pubDate><guid>https://luizpicanco.com/blog/2008-05-13-hello-world-em-366-linguagens/</guid><description>
&lt;p&gt;Coleção interessante listando programas hello world para 366 linguages de programação. Vai de assembly até PDF.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.roesler-ac.de/wolfram/hello.htm"target="_blank" rel="noopener"&gt;The Hello World Collection&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Lista de 22 APIs para ActionScript 3.0</title><link>https://luizpicanco.com/blog/2008-05-06-lista-de-22-apis-para-actionscript-30/</link><pubDate>Tue, 06 May 2008 21:10:47 +0000</pubDate><guid>https://luizpicanco.com/blog/2008-05-06-lista-de-22-apis-para-actionscript-30/</guid><description>
&lt;p&gt;Foi publicado no blog &lt;a href="http://seantheflashguy.com"target="_blank" rel="noopener"&gt;sean the flex guy&lt;/a&gt; uma lista interessante contendo uma lista de 22 APIs para ActionScript 3.0&lt;/p&gt;
&lt;p&gt;A listagem é muit boa e inclui APIs para serviços como digg, last.fm e amazon.&lt;/p&gt;
&lt;p&gt;Uma mão na roda para o pessoal que está desenvolvendo em Flex, AIR e Flash.&lt;/p&gt;
&lt;p&gt;Vale a visita: &lt;a href="http://seantheflashguy.com/blog/2007/08/13/list-of-22-actionscript-30-apis/"target="_blank" rel="noopener"&gt;List of 22 ActionScript 3.0 API&amp;quot;â?¢s&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Homer Simpson em CSS</title><link>https://luizpicanco.com/blog/2008-05-02-homer-simpson-em-css/</link><pubDate>Fri, 02 May 2008 00:15:58 +0000</pubDate><guid>https://luizpicanco.com/blog/2008-05-02-homer-simpson-em-css/</guid><description>
&lt;p&gt;Muito legal o trabalho realizado por Roman Cortes: Desenhou o Homer Simpson em CSS&lt;br&gt;
Confira no &lt;a href="http://www.romancortes.com/blog/homer-css/"target="_blank" rel="noopener"&gt;link&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Efetuando downgrade do firmware 1.1.4 para 1.1.3 no iPhone</title><link>https://luizpicanco.com/blog/2008-02-27-efetuando-downgrade-do-firmware-114-para-113-no-iphone/</link><pubDate>Wed, 27 Feb 2008 11:39:30 +0000</pubDate><guid>https://luizpicanco.com/blog/2008-02-27-efetuando-downgrade-do-firmware-114-para-113-no-iphone/</guid><description>
&lt;p&gt;Olá pessoal,&lt;/p&gt;
&lt;p&gt;Ontem atualizei sem querer para o firmware 1.1.4 e acabei com um telefone que só faz chamada de emergência. Após muito sufoco, descobri como voltar para o 1.1.3.&lt;/p&gt;
&lt;p&gt;Passos:&lt;/p&gt;
&lt;p&gt;1 - Efetue um restore no iTunes para o 1.1.3 (Vai dar erro, sem problemas)&lt;br&gt;
2 - Utilizando o ZiPhone, efetue o JailBreak e a ativação&lt;br&gt;
3 - Via SSH suba &lt;a href="http://www.luizpicanco.com/uploads/downgrade-04.04.05-04.03.13.rar"target="_blank" rel="noopener"&gt;esse arquivo&lt;/a&gt;(descompactado) para um diretório qualquer do iPhone e de as permissoes 755 para o bbupdater e ieraser&lt;br&gt;
3 - Efetue unload no commcenter (ulctl)&lt;br&gt;
4 - No terminal do iPhone execute:&lt;/p&gt;
&lt;p&gt;./ieraser&lt;br&gt;
./bbupdater -f ICE04.03.13_G.fls -e ICE04.03.13_G.eep&lt;/p&gt;
&lt;p&gt;5 - Efetue load no commcenter denovo e reinicie seu iphone&lt;br&gt;
6 - Pelo ZiPhone, efetue o unlock no SIM-Card&lt;/p&gt;
&lt;p&gt;Bom pessoal é isso, o ideal é esperarem sair o Jailbreak e a ativação oficial para o 1.1.4, mas para quem atualizou essa dica pode ajudar.&lt;br&gt;
Lembrando que o meu iPhone é o 1.0.0 OTB&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 28/02/2008: O &lt;a href="http://www.ziphone.org/"target="_blank" rel="noopener"&gt;ZiPhone&lt;/a&gt; já está fazendo o downgrade automaticamente. Recomendo utilizar o ZiPhone para realizar o downgrade.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Mudança de domínio - www.luizantonio.com</title><link>https://luizpicanco.com/blog/2008-02-27-mudanca-de-dominio-wwwluizantoniocom/</link><pubDate>Wed, 27 Feb 2008 00:00:33 +0000</pubDate><guid>https://luizpicanco.com/blog/2008-02-27-mudanca-de-dominio-wwwluizantoniocom/</guid><description>
&lt;p&gt;Olá pessoal,&lt;/p&gt;
&lt;p&gt;andei um bom tempo sumido daqui, pois não estava sobrando tempo para blogar !!!&lt;/p&gt;
&lt;p&gt;Tenho me dedicado ao estudo de algoritmos genéticos e inteligência artificial.&lt;br&gt;
Estou desenvolvendo um framework de desenvolvimento com suporte a GA e AI.&lt;/p&gt;
&lt;p&gt;Como novidade, abandonei o domínio antigo (luizantonio.com) e adotei um novo: luizpicanco.com&lt;/p&gt;</description></item><item><title>De Belo Horizonte a Miami - Google Maps feito por analistas ?</title><link>https://luizpicanco.com/blog/2007-11-02-de-belo-horizonte-a-miami-google-maps-feito-por-analistas/</link><pubDate>Fri, 02 Nov 2007 16:11:45 +0000</pubDate><guid>https://luizpicanco.com/blog/2007-11-02-de-belo-horizonte-a-miami-google-maps-feito-por-analistas/</guid><description>
&lt;p&gt;Seria a imagem abaixo uma prova de que o google maps foi desenvolvido por analistas ?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.luizantonio.com/wp-content/uploads/2007/11/nadandooceanoatlantico.jpg"title="Atravessando o oceano atlântico a nado"target="_blank" rel="noopener"&gt;&lt;img src="http://www.luizantonio.com/wp-content/uploads/2007/11/nadandooceanoatlantico.thumbnail.jpg" alt="Atravessando o oceano atlântico a nado" loading="lazy" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Confira no google maps (Item 43):&lt;br&gt;
&lt;a href="http://maps.google.com/maps?f=d&amp;amp;hl=pt-BR&amp;amp;geocode=&amp;amp;time=&amp;amp;date=&amp;amp;ttype=&amp;amp;saddr=Belo&amp;#43;horizonte&amp;amp;daddr=miami&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=46.14027,69.082031&amp;amp;ie=UTF8&amp;amp;ll=1.406109,-56.074219&amp;amp;spn=56.206246,69.082031&amp;amp;z=4&amp;amp;om=1"target="_blank" rel="noopener"&gt;Belo Horizonte - Miami - Como Chegar&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Desbloqueando o iPhone após um Restore - Couldn't locate the bytes to patch</title><link>https://luizpicanco.com/blog/2007-10-23-desbloqueando-o-iphone-apos-um-restore-couldnt-locate-the-bytes-to-patch/</link><pubDate>Tue, 23 Oct 2007 19:55:48 +0000</pubDate><guid>https://luizpicanco.com/blog/2007-10-23-desbloqueando-o-iphone-apos-um-restore-couldnt-locate-the-bytes-to-patch/</guid><description>
&lt;p&gt;Após ter instalado várias aplicações no meu iPhone, a aplicação de e-mail parou de funcionar, com isso, resolvi restaurá-lo pelo iTunes para realizar o processo de desbloqueio novamente.&lt;br&gt;
Quando fui rodar o anySim, recebi a seguinte mensagem: couldn&amp;rsquo;t locate the bytes to patch&lt;br&gt;
O problema é que como o baseband já estava hackeado o anySim não consegui hackea-lo novamente. Para resolver o problema tive que recorrer ao bbupdater&lt;/p&gt;
&lt;p&gt;Segue abaixo a solução para o problema:&lt;br&gt;
1 - Você vai precisar dos seguintes arquivos (Download &lt;a href="http://rs157.rapidshare.com/files/55991876/314_bbfirmware.zip"target="_blank" rel="noopener"&gt;aqui&lt;/a&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;314.eep&lt;/li&gt;
&lt;li&gt;314.fls&lt;/li&gt;
&lt;li&gt;bbupdater&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;2 - Com o iBrickr, crie um diretório para guardar esses arquivos (Ex.: restore) e copie os 3 arquivos para lá&lt;br&gt;
3 - Pelo iBrickr, instale a aplicação MobileTerminal&lt;br&gt;
4 - No iPhone, execute o MobileTerminal&lt;br&gt;
5 - Digite os seguintes comandos:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cd /restore&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;launchctl unload /System/Library/LaunchDaemons/com.apple.CommCenter.plist&lt;/p&gt;
&lt;p&gt;chmod +x bbupdater&lt;/p&gt;
&lt;p&gt;bbupdater -f *.fls -e *.eep&lt;/p&gt;
&lt;p&gt;launchctl load /System/Library/LaunchDaemons/com.apple.CommCenter.plist&lt;/p&gt;
&lt;p&gt;Se você receber uma mensagem do launchtcl dizendo &amp;ldquo;no process&amp;rdquo;, ignore-a.&lt;br&gt;
6 - Execute o AnySim&lt;br&gt;
7 - Enjoy!&lt;/p&gt;</description></item><item><title>A Evolução da Engenharia de Software</title><link>https://luizpicanco.com/blog/2007-10-03-a-evolucao-da-engenharia-de-software/</link><pubDate>Wed, 03 Oct 2007 20:55:26 +0000</pubDate><guid>https://luizpicanco.com/blog/2007-10-03-a-evolucao-da-engenharia-de-software/</guid><description>
&lt;p&gt;&lt;strong&gt;Introdução&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nos últimos anos tem se observado uma crescente movimentação no mercado em torno do modelo de desenvolvimento denominado Fábrica de Software. Esse modelo tem uma grande característica que é o uso de técnicas utilizadas na engenharia industrial de produção em série, para a criação de um ambiente produtivo de desenvolvimento de software com qualidade e baixo custo.&lt;br&gt;
Esse modelo de desenvolvimento não é novo, surgiu na década de 60, mas só agora começa a ser intensivamente utilizado pelas empresas de desenvolvimento de software.&lt;br&gt;
Os avanços da engenharia de software nos últimos anos e as mudanças ocorridas nos processos de desenvolvimento de sistemas, como o software livre e o surgimento de padrões abertos para desenvolvimento corporativo, fizeram surgir um novo modelo de fábrica de software no mercado. As novas facilidades tornaram possíveis que empresas de médio e até de pequeno porte, pudessem montar suas fábricas de software para prestar serviços de desenvolvimento de sistemas crescente terceirização do mercado, resultando numa proliferação deste novo modelo de fábrica pelo mundo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evolução&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Empresas em todo mundo estão percebendo que o desenvolvimento de software é uma atividade bastante especializada para ser absorvida e custeada internamente. Desta forma é crescente o número de terceirização na área de informática, especialmente na área de desenvolvimento de software.&lt;br&gt;
Juntamente com esta crescente demanda por terceirização, cresce também o nível de exigência do mercado em termos de qualidade e custo do software. Como resultado, empresas estão investindo em ferramentas de automação, enquanto trabalhos de pesquisas em novos paradigmas de implementação, como orientação a aspectos, estão obtendo resultados significativos.&lt;br&gt;
Algumas destas pesquisas já possuem resultados práticos, como o AspectJ, uma extensão da linguagem Java para o paradigma orientado a aspectos desenvolvida pelos Institutos de Pesquisa da Xerox. Com a evolução e amadurecimento da orientação a aspectos, será possível desenvolver software de forma mais consistente, abordando de uma única vez importantes aspectos não-funcionais do sistema, que poderão ser reutilizados em várias demandas da fábrica, eliminando desta forma o retrabalho e a replicação de código.&lt;br&gt;
Segundo Jack Greenfield, importante arquiteto de software da Microsoft, &amp;ldquo;os métodos e práticas de desenvolvimento de software terão que mudar radicalmente&amp;hellip; A solução deve envolver a modificação dos nossos métodos e práticas. Devemos encontrar formas de tornar os desenvolvedores muito mais produtivos&amp;quot;.&lt;br&gt;
A Microsoft está desenvolvendo uma nova arquitetura de desenvolvimento de sistemas denominada &amp;ldquo;Software Facotories&amp;quot; (Fábricas de Software).&lt;br&gt;
Segunda a própria Microsoft será uma arquitetura revolucionária, que elevará bastante os níveis de reutilização de software, através de conceitos como o de linhas de produção de software, onde componentes poderão ser montados, configurados e empacotados, resultando num produto final completo. O desenvolvedor se preocupará apenas em customizar os aspectos altamente especializados e específicos do projeto.&lt;br&gt;
Um outro tópico que será um diferencial no futuro são os significativos avanços das ferramentas case nos últimos anos, que permitirá a visualização e controle de todas as fases de desenvolvimento do sistema em uma única ferramenta. Atualmente o nível de integração entre todos os artefatos das várias fases do projeto é alto, mas não permite uma automação e rastreabilidade de todos os pontos do sistema. Porém num futuro próximo, com a evolução dos processos de software e das tecnologias de construção de ferramentas case, se espera abranger todo o sistema, desde a geração do código partir dos artefatos de análise e projeto até a automação na realização dos testes.&lt;br&gt;
Com a constante evolução da engenharia de software e das tecnologias envolvidas no desenvolvimento de sistemas, as fábricas de software poderão vir a ser uma realidade cada vez mais presente no mercado e se tornando cada vez mais efetivas dentro de seu objetivo de produzir software de qualidade em pouco tempo e com baixo custo. Como resultado, espera-se em todo mercado mundial um crescimento ainda maior na adoção do modelo de fábricas de software para o desenvolvimento de sistemas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Como pode-se observar a engenharia de software está sempre evoluindo. Novos paradigmas, linguagens, ambientes surgem a cada dia, buscando aumentar a produtividade e qualidade no desenvolvimento de software. Sistemas que levavam dois anos para serem codificados hoje em dia podem ser feitos em meses.&lt;br&gt;
O profissional ligado a área de desenvolvimento de software deve ficar atento a esses novos paradigmas, pois se não o fizer, correrá o risco de tornar-se obsoleto.&lt;/p&gt;</description></item><item><title>Um ano de Programando na Madrugada</title><link>https://luizpicanco.com/blog/2007-09-20-um-ano-de-programando-na-madrugada/</link><pubDate>Thu, 20 Sep 2007 22:54:25 +0000</pubDate><guid>https://luizpicanco.com/blog/2007-09-20-um-ano-de-programando-na-madrugada/</guid><description>
&lt;p&gt;É isso aí pessoal.&lt;/p&gt;
&lt;p&gt;Hoje está completando um ano que comecei o blog Programando na Madrugada.&lt;/p&gt;
&lt;p&gt;Espero ter mais tempo para me dedicar ao blog.&lt;/p&gt;</description></item><item><title>Catálogo de Anti-Padrões em TDD</title><link>https://luizpicanco.com/blog/2007-09-20-catalogo-de-anti-padroes-em-tdd/</link><pubDate>Thu, 20 Sep 2007 01:45:04 +0000</pubDate><guid>https://luizpicanco.com/blog/2007-09-20-catalogo-de-anti-padroes-em-tdd/</guid><description>
&lt;p&gt;Catálogo interessante prouzido pelo &lt;a href="http://blog.james-carr.org/"target="_blank" rel="noopener"&gt;James Carr&lt;/a&gt; e traduzido pelo &lt;a href="http://malditacomedia.blogspot.com/2007/08/tdd-anti-patterns.html"target="_blank" rel="noopener"&gt;Victor&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Liar&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Todos os metodos de um teste unitário estão passando perfeitamente, aparentando serem validos, entretanto sob uma inspeção mais próxima é descoberto que o teste unitário não testa o real intuíto para que foi criado.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Excessive Setup&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste que necessita muito trabalho para ser configurado antes mesmo de ser executado. Algumas vezes centenas de linhas de código tornam-se necessárias para adaptar o ambiente a um único método de testes, com dezenas de objetos envolvidos. Aqui a maior dificuldade é compreender &amp;ldquo;o quê&amp;rdquo; realmente está sendo testado dentro de toda a &amp;ldquo;sujeira&amp;rdquo; que um setup pode causar. (tradutor: &lt;em&gt;Lembrem-se sempre do princípio &lt;a href="http://en.wikipedia.org/wiki/KISS_principle"target="_blank" rel="noopener"&gt;KISS&lt;/a&gt;&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Giant&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste unitário que, mesmo sendo verdadeiro na intenção de validar um objeto, pode possuir centenas de linhas contendo inúmeros casos de teste (inúmeros mesmos). Esta pode ser uma indicação do que chamamos de &lt;a href="http://en.wikipedia.org/wiki/God_object"target="_blank" rel="noopener"&gt;God Object&lt;/a&gt;, objeto que possui responsabilidades demais dentro do sistema. Indício claro de alto acoplamento em seu sistema.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Mockery&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Muitas vezes um mock pode ser útil e bastante indicado. Mas desenvolvedores podem perder tempo desnecessariamente esforçando-se em mockear o que não está sendo testado. Percebe-se neste caso que a classe possuí tantos mocks, stubs ou fakes que no final das coisas o sistema não está sendo testado, mas o que é retornado da interação entre os mocks. (tradudor: &lt;em&gt;use apenas o que for estritamente necessário!&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Inspector&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste unitáro que viola o encapsulamente em um esforço de atingir 100% de cobertura de testes, mas está situação nem sempre é favoravél, pois qualquer tentativa de refactor pode quebrar testes desnecessariamente, necessitanto adequações nas classes de teste unitário.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Generous Leftovers&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uma instância de um teste unitário cria um dado que é persistido em algum lugar, e outro teste utiliza tal dado para seus próprios asserts. Caso algo saia errado, o teste que utiliza o dado cadastrado também falhará. (tradutor: &lt;em&gt;Testes devem ser independentes!&lt;/em&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The local Hero&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste que é dependente de algo específico do ambiente de desenvolvimento em que ele foi escrito. O resultado: o teste passa perfeitamente na células de desenvolvimento, mas falha quando alguém tenta executá-lo fora desse ambiente.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Nitpicker&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste unitáro que compara toda a saída quando o que lhe deveria interessar é uma pequena parte apenas, assim o teste deve se manter sempre alinhado com detalhes que o teste não deveria tratar. Esta situação é endemica em testes de aplicações web.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Dodger&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste unitário que possui muitos testes para efeitos pequenos (e presumidamente simples de testar), mas nunca testando o comportamente real desejado. Encontrado em testes relacionados para testes de banco de dados, onde um método é chamado, e então o teste seleciona itens do banco e procede asserts contra os resultados.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Loudmout&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste unitário (ou suite de testes) que enxe o console com mensagens de diagnóstico, logs e qualquer outro tipo de saídas, mesmo quando os testes estão passando. Algumas vezes durante a criação dos testes existe o desejo de manualmente ver a saída dos metodos, mas mesmo eles deixando de serem necessários, são deixados para trás.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Greedy Catcher&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste unitário que trata exceções e sobrepões pilhas de execução (stack trace) algumas vezes com mensagens menos informativas, mas algumas vezes ainda apenas logando (Loudmouth) e deixando o teste passar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Sequencer&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste unitário dependente de uma lista que sempre é retornada em forma desordenada.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hidden Dependecy&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Primo de primeiro grau do &amp;ldquo;The Local Hero&amp;rdquo;, um teste unitário dependente de um dado que deve ser populado em algum lugar par ao teste rodar. Se o dado não estive presente, o teste falhará deixando pouca informação para o desenvolvedor o que é necessário, ou porque o teste falhou&amp;hellip; forçando-o a buscar através de uma floresta de código para descobrir de onde vem o dado que o teste deveria utilizar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Enumerator&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste unitário em que os nomes de métodos são apenas uma enumeração: teste1, teste2, teste3. Como resultado, a intenção dos testes torna-se pouco clara, e a única maneira de ter certeza é ler o código fonte e rezar para que esteja bem escrito.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Stranger&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um método de teste que nem ao menos pertence ao Teste Unitário que ele está inserido. O método está realmente testando um objeto separado e independente, normalmente um objeto utilizado pelo objeto que sofre o teste.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Operating System Evangelist&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste unitário que está ajustado apenas para um determinado sistema operacional para que possa funcionar. Um bom exemplo seria um caso de teste que utilize o separador de linhas do Windows para um assert, que falha apenas rodando em Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Success Against All Odds&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste escrito para passar antes mesmo de falhar. Como um infeliz efeito colateral, o caso de teste acaba sempre passando mesmo que tenha sido feito para falhar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Free Ride&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ao invés de escrever um novo teste para uma nova funcionalidade ou característica, apenas um novo assert é criado ao final de um teste já existente.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The One&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uma combinação de alguns outros padrões, particularmente o TheFreeRide e TheGiant. Um teste unitário que contém apenas um único metodo que teste todo tipo de funcionalidade que um objeto pode conter. Um indicador comum é que o teste possui o mesmo nome da classe, e ainda com múltiplas linhas, setups e asserts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Peeping Tom&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste que, compartilhando recursos, pode ver o resultado de outro test, e pode falhar mesmo que o sistema testado esteja em perfeito funcionamento. Verificado na ferramenta Fitnesse, onde a utilização de variáveis estáticas para abrigar coleções não eram corretamente limpas após a execução do teste, podendo surgir erros durante a execução de qualquer teste. Também conhecido com TheUninvitedGuests.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The Slow Poke&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Um teste unitário que é incrivelmente lento para ser executado. Quando o teste é iniciado, os programadores podem ir ao banheiro, fumar um cigarro ou pior ainda, inicar o teste no final do dia e ir para casa, esperando que o resultado saia no dia seguinte.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Einstein on Rails</title><link>https://luizpicanco.com/blog/2007-09-13-einstein-on-rails/</link><pubDate>Thu, 13 Sep 2007 23:24:13 +0000</pubDate><guid>https://luizpicanco.com/blog/2007-09-13-einstein-on-rails/</guid><description>
&lt;p&gt;Será que Einstein gostaria do ActiveRecord do Rails ?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.luizantonio.com/wp-content/uploads/2007/09/einstein_ar.jpg"title="Einstein On Rails"target="_blank" rel="noopener"&gt;&lt;img src="http://www.luizantonio.com/wp-content/uploads/2007/09/einstein_ar.jpg" alt="Einstein On Rails" loading="lazy" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Analisador Léxico</title><link>https://luizpicanco.com/blog/2007-06-30-analisador-lexico/</link><pubDate>Sat, 30 Jun 2007 22:33:15 +0000</pubDate><guid>https://luizpicanco.com/blog/2007-06-30-analisador-lexico/</guid><description>
&lt;p&gt;Os códigos estão fluindo.&lt;/p&gt;
&lt;p&gt;Estava fazendo aqui, um pequeno analisador léxico, para verificar se uma expressão matemática básica é válida.&lt;/p&gt;
&lt;p&gt;Se quiserem dar uma olhada nos fontes, segue abaixo o link para ele. Está programado em Java.
&lt;a href="http://www.luizantonio.com/wp-content/uploads/2007/06/analisadorlexico.zip"title="Analisador léxico"target="_blank" rel="noopener"&gt;Analisador léxico&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Post do Mike Potter sobre o NeutrineGTD</title><link>https://luizpicanco.com/blog/2007-06-15-post-do-mike-potter-sobre-o-neutrinegtd/</link><pubDate>Fri, 15 Jun 2007 00:17:26 +0000</pubDate><guid>https://luizpicanco.com/blog/2007-06-15-post-do-mike-potter-sobre-o-neutrinegtd/</guid><description>
&lt;p&gt;O Mike Potter, da Adobe, fez um post legal no blog dele sobre o &lt;a href="http://neutrinegtd.neutrine.com"title="NeutrineGTD"target="_blank" rel="noopener"&gt;NeutrineGTD&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ele pensou que o backend da aplicação rodava sobre PHP, mas está rodando em cima de Ruby on Rails.&lt;/p&gt;
&lt;p&gt;Como ele falou, a aplicação está nos seus estágios iniciais de desenvolvimento. Mas já estou com uma lista com muitas funcionalidades para adicionar nele.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.riapedia.com/2007/06/14/get_things_done_with_this_gtd_flex_application"title="Get Things Done with this GTD Flex application"target="_blank" rel="noopener"&gt;Get Things Done with this GTD Flex application&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Getting Things Done com NeutrineGTD</title><link>https://luizpicanco.com/blog/2007-06-14-getting-things-done-com-neutrinegtd/</link><pubDate>Thu, 14 Jun 2007 19:55:24 +0000</pubDate><guid>https://luizpicanco.com/blog/2007-06-14-getting-things-done-com-neutrinegtd/</guid><description>
&lt;p&gt;Depois de algumas madrugadas de programação, saiu a versão beta do NeutrineGTD.&lt;/p&gt;
&lt;p&gt;O NeutrineGTD é uma aplicação que visa auxiliar as pessoas a manterem a sua vida organizada, utilizando a metodologia &lt;a href="http://pt.wikipedia.org/wiki/GTD"target="_blank" rel="noopener"&gt;GTD&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.luizantonio.com/wp-content/uploads/2007/06/neutrinegtd_newtrine_com.jpg" alt="NeutrineGTD" loading="lazy" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://neutrinegtd.neutrine.com"target="_blank" rel="noopener"&gt;NeutrineGTD&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Flex 3 e Adobe AIR: Disponíveis para download</title><link>https://luizpicanco.com/blog/2007-06-12-flex-3-e-adobe-air-disponivel-para-download/</link><pubDate>Tue, 12 Jun 2007 10:35:46 +0000</pubDate><guid>https://luizpicanco.com/blog/2007-06-12-flex-3-e-adobe-air-disponivel-para-download/</guid><description>
&lt;p&gt;O Flex 3 (beta) e o AIR (Apollo) já estão disponíveis para download no labs da adobe.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs%5Fadobeflexbuilder3"target="_blank" rel="noopener"&gt;Flex Builder 3 beta&lt;/a&gt;&lt;br&gt;
&lt;a href="http://labs.adobe.com/technologies/air/"target="_blank" rel="noopener"&gt;Adobe Integrated Runtime (AIR)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.adobe.com/cfusion/entitlement/index.cfm?e=labs%5Fadobeflexbuilder3"target="_blank" rel="noopener"&gt;&lt;img src="http://www.luizantonio.com/wp-content/uploads/2007/06/flex3_logotype_red.jpg" alt="flex 3" loading="lazy" /&gt;&lt;/a&gt; &lt;a href="http://labs.adobe.com/technologies/air/"target="_blank" rel="noopener"&gt;&lt;img src="http://www.luizantonio.com/wp-content/uploads/2007/06/adobe_air.gif" alt="Adobe Air" loading="lazy" /&gt;&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>