<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://misapuntesde.com/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <atom:link href="https://misapuntesde.com/rss.xml" rel="self" type="application/rss+xml"/>
    <title>My Notes about...</title>
    <link>https://misapuntesde.com/</link>
    <description>A blog demo for vuepress-theme-hope</description>
    <language>en-US</language>
    <pubDate>Sat, 02 May 2026 15:53:43 GMT</pubDate>
    <lastBuildDate>Sat, 02 May 2026 15:53:43 GMT</lastBuildDate>
    <generator>@vuepress/plugin-feed</generator>
    <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
    <category>Apple</category>
    <category>Developer</category>
    <category>DevOps</category>
    <category>Raspberry Pi</category>
    <category>General</category>
    <category>Raspberry PI</category>
    <category>Linux</category>
    <item>
      <title>Cool-Retro-Term recompiled for Apple Silicon aarch64 (download link)</title>
      <link>https://misapuntesde.com/2025/09/cool-retro-term_for_apple_silicon_aarch64.html</link>
      <guid>https://misapuntesde.com/2025/09/cool-retro-term_for_apple_silicon_aarch64.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Cool-Retro-Term recompiled for Apple Silicon aarch64 (download link)</source>
      <description>Download Cool-Retro-Term natively compiled for Apple Silicon M1/M2/M3 (aarch64). No Rosetta 2 needed.</description>
      <category>Apple</category>
      <pubDate>Sun, 28 Sep 2025 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2025/09/cool-retro-term.png" alt="Cool-Retro-Term" tabindex="0" loading="lazy"><figcaption>Cool-Retro-Term for aarch64</figcaption></figure>
<p>If you're a few years old like me, I think you'll be a lover of the aesthetics of old CRT terminals as a good retro lover that we are. <code>Cool-Retro-Term</code> emulates it very well and I'm sure you already know it.</p>
<p><code>brew</code> on <em>macOS</em> installs it without problems, but only for Intel <em>x86_64</em> using <em>Rosetta 2</em>, which adds an emulation layer that can affect performance. I've tried it and it's not that noticeable, but if you have an <em>Apple Silicon (M1, M2, M3)</em> computer and you want to get the most out of it, the ideal is to have a native version for <em>aarch64</em>, don't you think?</p>
<p>Well, today I have compiled it for <em>aarch64</em> and I leave it here in case you are interested. I have refactored some warnings that came out when compiling, but in general everything works perfectly following the steps that you can read in the <em>GitHub</em> repository <a href="https://github.com/Swordfish90/cool-retro-term/wiki/Build-Instructions-(macOS)" target="_blank" rel="noopener noreferrer">here</a>. I hope you enjoy it and let me know if you find any bugs.</p>
<p>Link: <a href="https://misapuntesde.com/res/cool-retro-term-macos-aarch64.zip" target="_blank" rel="noopener noreferrer">Cool-Retro-Term for aarch64</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2025/09/cool-retro-term.png &quot;Cool-Retro-Term for aarch64&quot;" type="image/"/>
    </item>
    <item>
      <title>Debugging an AWS Lambda Function in Python Inside a Docker Container Using VS Code</title>
      <link>https://misapuntesde.com/2025/06/debug_lambda_function_on_python_inside_docker_container_using_vs_code.html</link>
      <guid>https://misapuntesde.com/2025/06/debug_lambda_function_on_python_inside_docker_container_using_vs_code.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Debugging an AWS Lambda Function in Python Inside a Docker Container Using VS Code</source>
      <description>Debugging an AWS Lambda Function in Python Inside a Docker Container Using VS Code</description>
      <category>Developer</category>
      <pubDate>Mon, 02 Jun 2025 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2025/06/debug_lambda_vscode_en.png" alt="VSCode helps you debug Lambda functions. Image generated using Copilot." tabindex="0" loading="lazy"><figcaption>VSCode helps you debug Lambda functions. Image generated using Copilot.</figcaption></figure>
<p>I've been working for months on a project that uses <em>AWS Lambda + Python + FastAPI + Docker</em>. I tried to debug a <em>Lambda</em> following several tutorials, AI, <em>Medium</em> articles, and <em>YouTube</em> videos without success. Almost all of them were obsessed with using <em>AWS SAM</em>, which I don't use at all. So I took advantage of a quiet Sunday afternoon in my dungeon (I mean basement), and finally found a way to make it work. I'll show you how below and I hope it helps you. 😉</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2025/06/debug_lambda_vscode_en.png &quot;VSCode helps you debug Lambda functions. Image generated using Copilot.&quot;" type="image/"/>
    </item>
    <item>
      <title>Trivy vulnerability scanner for containers... and more!</title>
      <link>https://misapuntesde.com/2025/05/trivy_scanner_of_vulnerabilities_for_containers_and_more.html</link>
      <guid>https://misapuntesde.com/2025/05/trivy_scanner_of_vulnerabilities_for_containers_and_more.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Trivy vulnerability scanner for containers... and more!</source>
      <description>Trivy vulnerability scanner for containers... and more!</description>
      <category>Developer</category>
      <pubDate>Thu, 22 May 2025 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2025/05/trivy_logo.png" alt="Trivy" tabindex="0" loading="lazy"><figcaption>Trivy Logo</figcaption></figure>
<p>Ah!... The wonderful world of security, especially in the realm of containers, which has seen a boom in the adoption of tools to detect vulnerabilities. Among my favorites is <em>Trivy</em>, which stands out as a versatile and powerful scanner, and today I'll show you how to use it.</p>
<p>The articles I've read out there are somewhat outdated or AI-generated, and it pains me, mostly because we developers can't live ignoring security without having to take a cybersecurity course, right? Well, let's get to it.</p>
<h2>What is Trivy? 🤷</h2>
<ul>
<li>But I don't know what <em>Trivy</em> is...</li>
<li>Patience, young <em>Padawan</em>. I'll tell you.</li>
</ul>
<p><em>Trivy</em> is an open-source tool developed by <em>Aqua Security</em>, renowned for its speed and simplicity in detecting vulnerabilities in container images, file systems, application dependencies, etc. <strong>You don't need to know more</strong>. There are many vulnerability scanners: <em>Chimera, Clair, Snyk</em>,... but I was looking for one that was easy to use and didn't give me problems. I've been using this one for years and it works great for me.</p>
<h2>How to install it? 📦</h2>
<p>Well, it offers several installation methods depending on the operating system and user needs. I'll refer you to their <a href="https://github.com/aquasecurity/trivy/releases" target="_blank" rel="noopener noreferrer">GitHub</a> so you can see the available download versions. I'll comment on the way I install it on <em>macOS</em>:</p>
<p><strong>macOS (with Homebrew):</strong></p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">brew <span class="token function">install</span> aquasecurity/trivy/trivy</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>You can also do it <strong>using Docker,</strong> by the way, I use a lighter client on <em>macOS</em> called <a href="https://orbstack.dev" target="_blank" rel="noopener noreferrer">OrbStack</a>:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">docker</span> run aquasec/trivy image <span class="token operator">&lt;</span>image_name<span class="token operator">></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>Couldn't be easier. 😉</p>
<h2>How to use Trivy locally? 💻</h2>
<p>It allows scanning different types of targets:</p>
<ul>
<li><strong>Container images:</strong></li>
</ul>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">trivy image image_name:tag</span>
<span class="line">trivy image alpine:3.15 <span class="token comment"># Example</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong>File system or directories:</strong></li>
</ul>
<figure><img src="/images/2025/05/trivy_fs.png" alt="Trivy file system scan" tabindex="0" loading="lazy"><figcaption>Trivy file system scan</figcaption></figure>
<p>It will scan the current directory for vulnerabilities in dependencies and sensitive files.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">trivy fs <span class="token builtin class-name">.</span></span>
<span class="line">trivy fs <span class="token parameter variable">--scanners</span> vuln,secret,misconfig <span class="token builtin class-name">.</span> <span class="token comment"># Scans for vulnerabilities, secrets, and misconfigurations</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li><strong>Application dependencies:</strong></li>
</ul>
<p>Automatically detects files like <code>requirements.txt|pyproject.toml|uv.lock</code> (Python), <code>package.json</code> (Node.js),...</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">trivy config path/to/file</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>Configuration and customization 🔧</h2>
<p>Although what I've explained is enough, it allows customizing its behavior through a configuration file. You can create a <code>.trivyignore</code> file to exclude certain files or directories from the scan (similar to a <code>.gitignore</code>, indeed). You can also use a <code>trivy.yaml</code> file to define specific configurations like the severity level to report.</p>
<div class="language-yaml line-numbers-mode" data-highlighter="prismjs" data-ext="yml"><pre><code class="language-yaml"><span class="line"><span class="token key atrule">ignore</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token punctuation">-</span> path/to/ignored/file</span>
<span class="line">    <span class="token punctuation">-</span> path/to/ignored/directory</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>You have different options to adjust its behavior using flags like <code>--severity</code>, <code>--format</code>, <code>--output</code>, and environment variables starting with <code>TRIVY_</code> (like <code>TRIVY_SEVERITY=CRITICAL</code>).</p>
<h2>Tips and best practices 📚</h2>
<ul>
<li><strong>Review the arguments you can pass via the Terminal</strong> to customize the scan.</li>
<li><strong>Always scan before uploading images to a registry</strong> to prevent vulnerabilities, especially, from reaching production.</li>
<li><strong>Use the <code>--exit-code</code> flag</strong> to automatically break insecure builds in CI/CD pipelines. I mention it but <strong>I don't use it</strong>. It's good to warn about vulnerabilities, but it's not always necessary to break the build.</li>
<li><strong>Automate periodic scanning</strong> of already deployed images to detect new vulnerabilities.</li>
<li><strong>Customize reports</strong> using output formats (<code>table</code>, <code>json</code>, <code>sarif</code>, etc.) according to your needs, although the console results are sufficient for me.</li>
</ul>
<h2>Conclusions 📝</h2>
<p>For me, it was a great discovery years ago, as it stands out for its ease of installation and use. It allows detecting vulnerabilities of very different types as I mentioned, and helps you strengthen the security of your projects without adding complexity that is sometimes unnecessary.</p>
<p>I decided to mention it because I have colleagues who didn't know about it, and I find it a very useful tool for any developer.</p>
<p>I hope this helps you, and if you have any questions,... Here I am! 😉</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2025/05/trivy_logo.png &quot;Trivy Logo&quot;" type="image/"/>
    </item>
    <item>
      <title>TensorZero is the black box you need for AI</title>
      <link>https://misapuntesde.com/2025/03/tensorzero_is_the_black_box_you_need_for_ai.html</link>
      <guid>https://misapuntesde.com/2025/03/tensorzero_is_the_black_box_you_need_for_ai.html</guid>
      <source url="https://misapuntesde.com/rss.xml">TensorZero is the black box you need for AI</source>
      <description>TensorZero is the black box you need for AI</description>
      <category>Developer</category>
      <pubDate>Sat, 29 Mar 2025 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2025/03/tensonzero_01.png" alt="TensorZero Dashboard" tabindex="0" loading="lazy"><figcaption>TensorZero Dashboard</figcaption></figure>
<p>I'm currently working in a project that explores the capabilities of <em>GenAI architecture</em> and its applications in various fields. We are using high level resources like <em>AWS</em> and its services like <em>Bedrock, Lambdas, StepFunctions</em> and others to create a robust and scalable architecture (That is what we say).</p>
<p>This is OK for a high-level architecture where you can use all those expensive services, but... What if you want to create a low/mid-level AI project that can be used in any environment? <em>Amy Chen</em> contacted with me to present <em>TensorZero</em>, and today I'm going to show you how I use it in a little example.</p>
<h2>What is TensorZero?</h2>
<figure><img src="/images/2025/03/tensonzero_02.png" alt="Diagram" tabindex="0" loading="lazy"><figcaption>Component Diagram</figcaption></figure>
<p><em>TensorZero</em> creates a feedback loop for optimizing <em>LLM</em> applications — turning production data into smarter, faster, and cheaper models. It's a black box that allows you to create and train your own models without the need for expensive resources. It's designed to be easy to use and integrate into your existing projects... And yes before you ask: <strong>It's open-source and some of its components are written in Rust.</strong></p>
<ul>
<li>Integrate our model gateway.</li>
<li>Send metrics or feedback.</li>
<li>Optimize prompts, models, and inference strategies.</li>
<li>Watch your LLMs improve over time.</li>
</ul>
<p>So at the end, it provides a data &amp; learning flywheel for LLMs by unifying:</p>
<ul>
<li>Inference: one API for all LLMs, with &lt;1ms P99 overhead.</li>
<li>Observability: inference &amp; feedback → your database.</li>
<li>Optimization: from prompts to fine-tuning and RL.</li>
<li>Experimentation: built-in A/B testing, routing, fallbacks.</li>
</ul>
<p>So cool, right? But how do you use it? Let's see a simple example of how to use it in your own projects.</p>
<h2>How to use TensorZero</h2>
<p>I'm going to test the <em>TensorZero</em> library with an example that generates a pseudo-summarizer. The idea is to create a simple function that tell us what <em>TensorZero</em> is. The function will be called <code>generate_summarizer</code> and will use the <code>gpt-4o-mini</code> model.</p>
<p>So according to the <em>Quick Start documentation</em>, I need a file called <code>tensorzero.toml</code> with a minimal setup:</p>
<div class="language-toml line-numbers-mode" data-highlighter="prismjs" data-ext="toml"><pre><code class="language-toml"><span class="line"><span class="token comment"># A function defines the task we're tackling (e.g. generating a summarizer)...</span></span>
<span class="line"><span class="token punctuation">[</span><span class="token table class-name">functions.generate_summarizer</span><span class="token punctuation">]</span></span>
<span class="line"><span class="token key property">type</span> <span class="token punctuation">=</span> <span class="token string">"chat"</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># Since we only have one variant for this function, the gateway will always use it.</span></span>
<span class="line"><span class="token punctuation">[</span><span class="token table class-name">functions.generate_summarizer.variants.gpt_4o_mini</span><span class="token punctuation">]</span></span>
<span class="line"><span class="token key property">type</span> <span class="token punctuation">=</span> <span class="token string">"chat_completion"</span></span>
<span class="line"><span class="token key property">model</span> <span class="token punctuation">=</span> <span class="token string">"openai::gpt-4o-mini"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Oh! You need to set/export an environment variable for <code>OPENAI_API_KEY</code> with your API key.</p>
<p>Now grab the next <a href="https://raw.githubusercontent.com/tensorzero/tensorzero/refs/heads/main/examples/quickstart/docker-compose.yml" target="_blank" rel="noopener noreferrer">docker-compose.yaml</a> file and run it:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">docker-compose</span> up</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="hint-container warning">
<p class="hint-container-title">Warning</p>
<p>Do not use that docker-compose.yaml in production. For production-ready deployments, see: <a href="https://www.tensorzero.com/docs/gateway/deployment" target="_blank" rel="noopener noreferrer">https://www.tensorzero.com/docs/gateway/deployment</a>.</p>
</div>
<figure><img src="/images/2025/03/tensonzero_03.jpg" alt="Deploying the container" tabindex="0" loading="lazy"><figcaption>Deploying the container</figcaption></figure>
<p>You can interact with the <em>TensorZero Gateway</em> in several ways: using the <em>TensorZero Python</em> client, leveraging existing <em>OpenAI clients</em> (available for <em>Python, Node.js</em>, and other languages), or directly through its <em>HTTP API</em>, making it accessible from any programming language.</p>
<p>I'm going to use the basic <em>Python</em> implementation, so I need to install the <code>tensorzero</code> package. Let's do it using <a href="https://docs.astral.sh/uv/" target="_blank" rel="noopener noreferrer">uv</a>, but you can use any package manager you want. So open a new terminal and run the following commands:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">uv init <span class="token builtin class-name">.</span></span>
<span class="line">uv <span class="token function">add</span> tensorzero</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><figure><img src="/images/2025/03/tensonzero_04.jpg" alt="Adding package and virtual environment" tabindex="0" loading="lazy"><figcaption>Adding package and virtual environment</figcaption></figure>
<p>Now I can create a simple script to generate a summarizer. The script will look like this and It must to have the name <code>after.py</code>:</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">from</span> tensorzero <span class="token keyword">import</span> TensorZeroGateway</span>
<span class="line"></span>
<span class="line"><span class="token keyword">with</span> TensorZeroGateway<span class="token punctuation">.</span>build_embedded<span class="token punctuation">(</span></span>
<span class="line">    clickhouse_url<span class="token operator">=</span><span class="token string">"https://chuser:chpassword@localhost:8123/tensorzero"</span><span class="token punctuation">,</span></span>
<span class="line">    config_file<span class="token operator">=</span><span class="token string">"config/tensorzero.toml"</span><span class="token punctuation">,</span></span>
<span class="line"><span class="token punctuation">)</span> <span class="token keyword">as</span> client<span class="token punctuation">:</span></span>
<span class="line">    response <span class="token operator">=</span> client<span class="token punctuation">.</span>inference<span class="token punctuation">(</span></span>
<span class="line">        function_name<span class="token operator">=</span><span class="token string">"generate_summarizer"</span><span class="token punctuation">,</span></span>
<span class="line">        <span class="token builtin">input</span><span class="token operator">=</span><span class="token punctuation">{</span></span>
<span class="line">            <span class="token string">"messages"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span></span>
<span class="line">                <span class="token punctuation">{</span></span>
<span class="line">                    <span class="token string">"role"</span><span class="token punctuation">:</span> <span class="token string">"user"</span><span class="token punctuation">,</span></span>
<span class="line">                    <span class="token string">"content"</span><span class="token punctuation">:</span> <span class="token string">"Summarize the key features of TensorZero."</span><span class="token punctuation">,</span></span>
<span class="line">                <span class="token punctuation">}</span></span>
<span class="line">            <span class="token punctuation">]</span></span>
<span class="line">        <span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line">    <span class="token punctuation">)</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>response<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Now run the script:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token builtin class-name">export</span> <span class="token assign-left variable">OPENAI_API_KEY</span><span class="token operator">=</span>your_openai_api_key</span>
<span class="line">uv run after.py</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>This is the output you get:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">ChatInferenceResponse<span class="token punctuation">(</span></span>
<span class="line">    <span class="token assign-left variable">inference_id</span><span class="token operator">=</span>UUID<span class="token punctuation">(</span><span class="token string">'0195e199-9227-76b3-a96b-f042cf892917'</span><span class="token punctuation">)</span>,</span>
<span class="line">    <span class="token assign-left variable">episode_id</span><span class="token operator">=</span>UUID<span class="token punctuation">(</span><span class="token string">'0195e199-9227-76b3-a96b-f05bb3aec0d3'</span><span class="token punctuation">)</span>,</span>
<span class="line">    <span class="token assign-left variable">variant_name</span><span class="token operator">=</span><span class="token string">'gpt_4o_mini'</span>,</span>
<span class="line">    <span class="token assign-left variable">content</span><span class="token operator">=</span><span class="token punctuation">[</span></span>
<span class="line">        Text<span class="token punctuation">(</span></span>
<span class="line">            <span class="token assign-left variable">type</span><span class="token operator">=</span><span class="token string">'text'</span>,</span>
<span class="line">            <span class="token assign-left variable">text</span><span class="token operator">=</span><span class="token string">'TensorZero is an advanced machine learning platform designed to accelerate the development and deployment of AI models. Here are the key features:\n\n1. **Model Development**: TensorZero offers intuitive tools for building and training machine learning models, making it accessible to users with varying levels of expertise.\n\n2. **Scalability**: The platform is designed to handle large datasets and complex models, enabling users to scale their projects efficiently.\n\n3. **Interoperability**: TensorZero can seamlessly integrate with various data sources and existing frameworks, allowing for flexibility in workflow and data management.\n\n4. **Real-time Collaboration**: It supports collaborative features, enabling teams to work together in real time on projects.\n\n5. **Monitoring and Visualization**: The platform includes tools for monitoring model performance and visualizing data, which helps in understanding and optimizing models.\n\n6. **Deployment Options**: TensorZero provides various deployment options, facilitating the launch of models in different environments, whether on-premises or in the cloud.\n\n7. **User-friendly Interface**: A user-friendly design simplifies navigation and enhances the user experience, catering to both novice and experienced users.\n\n8. **Customizable Workflows**: Users can create customized workflows to fit specific project needs, enhancing efficiency and productivity.\n\nTensorZero aims to streamline the machine learning lifecycle, from development to deployment, while ensuring ease of use and adaptability.'</span>,</span>
<span class="line">            <span class="token assign-left variable">arguments</span><span class="token operator">=</span>None</span>
<span class="line">        <span class="token punctuation">)</span></span>
<span class="line">    <span class="token punctuation">]</span>,</span>
<span class="line">    <span class="token assign-left variable">usage</span><span class="token operator">=</span>Usage<span class="token punctuation">(</span></span>
<span class="line">        <span class="token assign-left variable">input_tokens</span><span class="token operator">=</span><span class="token number">17</span>,</span>
<span class="line">        <span class="token assign-left variable">output_tokens</span><span class="token operator">=</span><span class="token number">276</span></span>
<span class="line">    <span class="token punctuation">)</span>,</span>
<span class="line">    <span class="token assign-left variable">finish_reason</span><span class="token operator">=</span><span class="token operator">&lt;</span>FinishReason.STOP: <span class="token string">'stop'</span><span class="token operator">></span></span>
<span class="line"><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Not bad! The summarizer is working and you can see the output in the terminal. You can also see the input and output tokens used in the request. This is useful for monitoring and optimizing your usage of the <em>OpenAI API</em>. You can also see the <em>inference ID</em> and <em>episode ID</em>, which are useful for tracking the requests and responses in the <em>TensorZero system</em>.</p>
<p>Do you remember the <em>Docker</em> container we started? Go to http://localhost:4000 and you can see the <em>TensorZero UI dashboard</em>.</p>
<figure><img src="/images/2025/03/tensonzero_05.png" alt="Supervised Fine-tuning" tabindex="0" loading="lazy"><figcaption>Supervised Fine-tuning</figcaption></figure>
<p>We can access the <em>Observability</em> and <em>Optimization</em> tabs. The <em>Observability</em> tab shows the <em>Inferences, Episodes, and Functions</em>. The <em>Optimization</em> tab shows an interesting feature: <strong>Supervised Fine-tuning</strong>. This super-power allows you to improve the performance of your model by providing it with additional info as you can see above. Once we start using more advanced functions like feedback and variants, the observability UI will enable us to track metrics, experiments (A/B tests), and more.</p>
<p>This was only a call to its library as you can see. You have more tutorials (A Chat bot!) in the <a href="https://www.tensorzero.com/docs/gateway/tutorials" target="_blank" rel="noopener noreferrer">TensorZero documentation</a>, where you can explore more features and functionalities.</p>
<h2>Final Words</h2>
<p>This example is a tiny taste of what <em>TensorZero</em> is capable of. I hope to get time to go deep into its features and functionalities in the future. 💪</p>
<p>I said you can build low/mid-level projects with it, but I think you can also build high-level projects with it, too. It allows you to create and train your own models without the need for expensive resources, and this is a great advantage for developers who want to create their own AI applications without the need for expensive cloud services. I like that it’s designed to be easy to use and integrate into new or existing projects, so... What are you waiting for? Go ahead and try it out! You can find the documentation <a href="https://www.tensorzero.com/docs" target="_blank" rel="noopener noreferrer">here</a>.</p>
<p>Thanks again to Amy Chen for show me TensorZero. I hope you find this article useful and that it helps you to create your own AI applications with <em>TensorZero</em>. If you have any questions or comments, feel free to reach out to me on X-Twitter/LinkedIn/Email.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2025/03/tensonzero_01.png &quot;TensorZero Dashboard&quot;" type="image/"/>
    </item>
    <item>
      <title>Stripe Webhook Guide</title>
      <link>https://misapuntesde.com/2025/03/stripe-webhook.html</link>
      <guid>https://misapuntesde.com/2025/03/stripe-webhook.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Stripe Webhook Guide</source>
      <description>Stripe Webhook Guide</description>
      <category>Developer</category>
      <pubDate>Sat, 15 Mar 2025 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2025/03/stripe.jpg" alt="Stripe" tabindex="0" loading="lazy"><figcaption>Stripe</figcaption></figure>
<p>A webhook (also known as reverse API) is a tool that allows a system or application to send notifications about specific events to another system or application in real-time.</p>
<h2>Define route in our application</h2>
<p>The application will define the route where the webhook will listen for stripe events.</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token decorator annotation punctuation">@app<span class="token punctuation">.</span>route</span><span class="token punctuation">(</span><span class="token string">'/webhook'</span><span class="token punctuation">,</span> methods<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'POST'</span><span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line">    <span class="token keyword">def</span> <span class="token function">stripe_webhook</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">return</span> webhook<span class="token punctuation">.</span>webhook<span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The webhook method will handle stripe events. It must be implemented to handle the desired events. You can see an example at: <a href="https://stripe.com/docs/webhooks#webhook-endpoint-integration" target="_blank" rel="noopener noreferrer">https://stripe.com/docs/webhooks#webhook-endpoint-integration</a>.</p>
<h2>Stripe CLI</h2>
<p>Stripe CLI is a developer tool that helps create, test, and manage Stripe integration directly from a terminal</p>
<h3>1. Installing Stripe CLI:</h3>
<p>For Windows:</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">1. Download the latest windows tar.gz file from https://github.com/stripe/stripe-cli/releases/latest</span>
<span class="line">2. Unzip the stripe_X.X.X_windows_x86_64.zip file</span>
<span class="line">3. Run the uncompressed .exe file</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>For GNU/Linux or macOS:</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">1. Download the latest linux tar.gz file from https://github.com/stripe/stripe-cli/releases/latest</span>
<span class="line">2. Unzip the file: tar -xvf stripe_X.X.X_linux_x86_64.tar.gz</span>
<span class="line">3. Add ./stripe to your execution path.</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>2. Login to Stripe CLI</h3>
<p>Use the stripe login command to authenticate to Stripe CLI in your browser. This command generates a restricted key set for your account (one in test mode and one in active mode) that is valid for 90 days.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">$ stripe login</span>
<span class="line"><span class="token operator">></span> Your pairing code is: glitz-boom-entice-quiet</span>
<span class="line"><span class="token operator">></span> This pairing code verifies your authentication with Stripe.</span>
<span class="line"><span class="token operator">></span> Press Enter to <span class="token function">open</span> the browser or visit <span class="token operator">&lt;</span>url<span class="token operator">></span> <span class="token punctuation">(</span>^C to quit<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Optionally, if you don't want to use a browser, use the --interactive flag to authenticate with an API secret key or a restricted key.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">$ stripe login <span class="token parameter variable">--interactive</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>Optionally, you can use the --api-key flag to specify your API secret key inline each time you send a request</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">$ stripe login --api-key <span class="token operator">&lt;</span>stripe-test-api-key<span class="token operator">></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>3. Sending events from Stripe CLI</h3>
<p>The Stripe client allows us to send events to simulate the different operations that Stripe notifies.
First, you must indicate the route where our application will handle Stripe events</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">$ stripe listen --forward-to http://127.0.0.1:5000/webhook</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>To get the list of possible events, run the following command:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">$ stripe trigger</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>To send a specific event, run the following command:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">$ stripe trigger <span class="token operator">&lt;</span>event_name<span class="token operator">></span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>4. List of required events</h3>
<p>Studying the webhook, the most common events when making a payment are (from bottom to top):</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">transfer.created</span>
<span class="line">payment_intent.succeeded</span>
<span class="line">charge.succeeded</span>
<span class="line">charge.pending</span>
<span class="line">payment_intent.processing</span>
<span class="line">payment_intent.created</span>
<span class="line">payment_intent.requires_action</span>
<span class="line">customer.subscription.updated</span>
<span class="line">invoice.created</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Others interesting events:</p>
<div class="language-text line-numbers-mode" data-highlighter="prismjs" data-ext="text"><pre><code class="language-text"><span class="line">customer.updated</span>
<span class="line">customer.subscription.deleted</span>
<span class="line">customer.subscription.updated</span>
<span class="line">invoice.updated</span>
<span class="line">invoice.voided</span>
<span class="line">invoice.paid</span>
<span class="line">invoice.finalized</span>
<span class="line">subscription.triggered</span>
<span class="line">invoice.draft.paid</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2025/03/stripe.jpg &quot;Stripe&quot;" type="image/"/>
    </item>
    <item>
      <title>My Ultimate Git Guide for Developers</title>
      <link>https://misapuntesde.com/2024/11/my_ultimate_git_guide_for_developers.html</link>
      <guid>https://misapuntesde.com/2024/11/my_ultimate_git_guide_for_developers.html</guid>
      <source url="https://misapuntesde.com/rss.xml">My Ultimate Git Guide for Developers</source>
      <description>My Ultimate Git Guide for Developers</description>
      <category>Developer</category>
      <pubDate>Tue, 12 Nov 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/11/git_branch.jpg" alt="This is like AI and I imagine Git branches" tabindex="0" loading="lazy"><figcaption>This is like AI and I imagine Git branches</figcaption></figure>
<p>It never hurts to remember the basic <em>Git</em> commands, and today is that day. In this article that I wrote for my team at one of the companies where I worked, I'll show you how we worked with this version control system on a project that involved six people and almost two years of development.</p>
<h2>What to Know About Branches?</h2>
<figure><img src="https://wac-cdn.atlassian.com/dam/jcr:34c86360-8dea-4be4-92f7-6597d4d5bfae/02 Feature branches.svg?cdnVersion=205" alt="Git Flow" tabindex="0" loading="lazy"><figcaption>Git Flow</figcaption></figure>
<p>I usually work using <em>GitFlow</em>, where we have a <em>main</em> branch, a <em>develop</em> branch, and others that can be <em>feature/</em> or <em>hotfix/</em>.</p>
<p>The flow is always the same: from <em>develop</em>, new branches are created to work locally and then merged back into <em>develop</em> (remote). When we have reached our goals, <em>develop</em> is merged into <em>main</em> to go into production.</p>
<p>If you are new to <em>Git</em>, I recommend that you first read the article <a href="https://www.atlassian.com/en/git/tutorials/what-is-git" target="_blank" rel="noopener noreferrer">Introduction to Git</a>.</p>
<h2>Naming Conventions</h2>
<p>Regarding the standard for naming commits, I have recently been using <em>Conventional Commits</em>, which is a standard for writing commit messages that you can see at <a href="https://www.conventionalcommits.org/en/v1.0.0/" target="_blank" rel="noopener noreferrer">this link</a>. Here is the format and the most common types:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token operator">&lt;</span>type<span class="token operator">></span><span class="token punctuation">[</span>optional scope<span class="token punctuation">]</span>: <span class="token operator">&lt;</span>description with verb <span class="token keyword">in</span> infinitive<span class="token operator">></span></span>
<span class="line"></span>
<span class="line">feat: <span class="token function">add</span> new functionality</span>
<span class="line">fix: fix a bug</span>
<span class="line">docs: changes <span class="token keyword">in</span> documentation</span>
<span class="line">style: changes that <span class="token keyword">do</span> not affect the meaning of the code <span class="token punctuation">(</span>whitespace, formatting, missing semicolons, etc.<span class="token punctuation">)</span></span>
<span class="line">refactor: a code change that neither fixes a bug nor adds a feature</span>
<span class="line">perf: a code change that improves performance</span>
<span class="line">test: <span class="token function">add</span> missing tests or correct existing tests</span>
<span class="line">chore: changes to the build process or auxiliary tools and libraries such as documentation generation</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="hint-container warning">
<p class="hint-container-title">Recommendation if you have never used git and no one tells you</p>
<p>Before executing any <em>Git</em> command on your branch and you think you might mess it up (especially until you get used to working with this version control system), <strong>make a backup of the project folder with the current state of the task</strong>. This way, if any disaster occurs that you cannot control, you can revert to a previous state and repeat the process correctly.</p>
</div>
<h2>Git File Lifecycle or States</h2>
<figure><img src="https://www.dougmahugh.com/content/images/2019/01/GitCommands-1.png" alt="git commands" tabindex="0" loading="lazy"><figcaption>git commands</figcaption></figure>
<p>The most relevant states (there are several more) are:</p>
<ul>
<li><strong>Untracked Files</strong>: these are files that <strong>DO NOT</strong> live inside <em>Git</em>, only on the hard drive. <em>Git</em> has no record of their existence. For example, a new file that we have created and has not yet been added with <code>git add</code>.</li>
</ul>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">touch</span> my_new_file <span class="token comment"># untracked</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ul>
<li><strong>Staged Files</strong>: these are files in <em>Staging</em>. They live inside <em>Git</em> and there is a record of them because they have been affected by the <code>git add</code> command, although not their latest changes. <em>Git</em> already knows about these latest changes, but they have not yet been definitively saved in the repository because the <em>git commit</em> command is missing.</li>
</ul>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> <span class="token function">add</span> my_new_file <span class="token comment"># staged</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ul>
<li><strong>Tracked Files</strong>: these are the files that live inside <em>Git</em>, have no pending changes, and their latest updates have been saved in the repository thanks to the <code>git add &amp;&amp; git commit</code> commands.</li>
</ul>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> commit my_new_file <span class="token comment"># tracked</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>Initializing a Project</h2>
<p>The first step is <strong>to initialize the project</strong>. This is done the first time by following a series of steps. The easiest way to do this is to create the project on your Git server (<em>remote/local Docker container, GitLab, GitHub, etc</em>) and download it to our system.</p>
<p>It's recommended to install the <a href="https://skoch.github.io/Git-Workflow/" target="_blank" rel="noopener noreferrer">Git Flow</a> package. We execute the following, which gives you the default values:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> flow init <span class="token parameter variable">-d</span></span>
<span class="line"><span class="token function">git</span> branch <span class="token parameter variable">-m</span> master main <span class="token comment"># Change the name of the master branch to main if desired</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><div class="hint-container info">
<p class="hint-container-title">Info</p>
<p>This process <strong>only needs to be done once</strong> by a team member.</p>
</div>
<h2>Working with Branches</h2>
<p>The first thing we are going to learn is the <code>git status</code> command, which will tell us the current state of the repository, with the changes that need to be made, deletions, or if everything is up to date.</p>
<ul>
<li>View <em>local</em> and <em>remote</em> branches:</li>
</ul>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> branch <span class="token parameter variable">-a</span></span>
<span class="line"></span>
<span class="line">    develop</span>
<span class="line">    * main</span>
<span class="line">    remotes/origin/HEAD -<span class="token operator">></span> origin/main</span>
<span class="line">    remotes/origin/develop</span>
<span class="line">    remotes/origin/main</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="hint-container info">
<p class="hint-container-title">Info</p>
<p>We can also use <code>git branch --no-merged</code> to see branches that contain changes.</p>
</div>
<ul>
<li>Switch to a branch:</li>
</ul>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> switch develop</span>
<span class="line"></span>
<span class="line">    * develop</span>
<span class="line">    main</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li>To create a branch and switch to it, we have two options. From <em>develop</em>, execute one of the following options:</li>
</ul>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># Option 1</span></span>
<span class="line"><span class="token function">git</span> branch feature/api-token <span class="token operator">&amp;&amp;</span> <span class="token function">git</span> switch feature/api-token</span>
<span class="line"><span class="token comment"># Option 2</span></span>
<span class="line"><span class="token function">git</span> switch <span class="token parameter variable">-c</span> feature/api-token</span>
<span class="line"></span>
<span class="line">develop</span>
<span class="line">* feature/api-token</span>
<span class="line">main</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li>Delete a branch:</li>
</ul>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> checkout develop <span class="token operator">&amp;&amp;</span> <span class="token function">git</span> branch <span class="token parameter variable">-D</span> feature/api-token <span class="token comment"># D = force delete or -d = safe delete and warns if there are changes</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><div class="hint-container info">
<p class="hint-container-title">Info</p>
<p>If we are inside a branch that we want to delete, we must first <strong>switch out</strong> of it. Deleting a branch that has not been merged can make you lose many hours of work. Make sure you want to delete it. 😉</p>
</div>
<p>We can also delete remote branches:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> push origin <span class="token parameter variable">--delete</span> feature/api-token</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><em>origin</em> is a convention that refers to the remote repository.</p>
<p>If we want to delete a branch with changes in <em>staging</em>, it may not allow us to delete it. There are several methods. I prefer moving the changes to the <em>stash</em> (a kind of clipboard or temporary memory) that <em>&quot;cuts&quot;</em> all the changes and deletes the branch. The other method is more drastic and deletes all changes made in that branch since it was created:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> stash <span class="token parameter variable">-u</span></span>
<span class="line"><span class="token function">git</span> checkout develop</span>
<span class="line"><span class="token function">git</span> branch <span class="token parameter variable">-D</span> branch_name</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>Essential Git Commands</h2>
<h3>git clone</h3>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> clone repository_URL</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>git fetch</h3>
<p>This command downloads the remote content but does not update the local repository's working state, so your current work will not be affected. Similar to the <code>svn update</code> command.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> fetch</span>
<span class="line"><span class="token function">git</span> fetch <span class="token parameter variable">-a</span> <span class="token parameter variable">-p</span> <span class="token comment"># for all branches (all) and removes (prune) local branches that no longer exist remotely</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>If you want to know more about this command, read the article: <a href="https://www.atlassian.com/en/git/tutorials/syncing/git-fetch" target="_blank" rel="noopener noreferrer">git fetch</a>.</p>
<h3>git add</h3>
<p>Add file(s) to the <em>staging</em> area:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> <span class="token function">add</span> README.md</span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span></span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> <span class="token parameter variable">-a</span> <span class="token comment"># All changes.</span></span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> <span class="token parameter variable">-A</span> <span class="token comment"># New, modified, and deleted files.</span></span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> --ignore-removal <span class="token builtin class-name">.</span> <span class="token comment"># New and modified files.</span></span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> <span class="token parameter variable">-u</span> <span class="token comment"># Modified and deleted files.</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4>Difference between <code>git add .</code>, <code>git add -a</code>, and <code>git add -A</code></h4>
<ul>
<li><code>git add .</code>: Adds all new and modified files in the current directory and its subdirectories, but does not include deleted files.</li>
<li><code>git add -a</code>: Adds all new, modified, and deleted files in the current directory and its subdirectories.</li>
<li><code>git add -A</code>: Adds all new, modified, and deleted files <strong>in the entire repository, both in the current directory and anywhere else in the repository</strong>.</li>
</ul>
<div class="hint-container warning">
<p class="hint-container-title">- &quot;José, I always use git add .&quot;</p>
<p>See below my comment about the use of <code>git add .</code> and why It's not recommended.</p>
</div>
<h3>git stash</h3>
<p>Temporarily saves changes to bring them back later.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> stash <span class="token comment"># It's like cutting to Git's clipboard</span></span>
<span class="line"><span class="token function">git</span> stash <span class="token parameter variable">-u</span> <span class="token comment"># Also saves untracked files.</span></span>
<span class="line"><span class="token function">git</span> stash pop <span class="token comment"># It's like pasting the last stash from Git's clipboard</span></span>
<span class="line"><span class="token function">git</span> stash save <span class="token string">"message"</span> <span class="token comment"># Saves changes with a message</span></span>
<span class="line"><span class="token function">git</span> stash list <span class="token comment"># shows what we have in the stash</span></span>
<span class="line"><span class="token function">git</span> stash pop stash@<span class="token punctuation">{</span><span class="token number">2</span><span class="token punctuation">}</span> <span class="token comment"># Recovers from stash with index 2</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><figure><img src="https://wac-cdn.atlassian.com/dam/jcr:d6fec41a-dc66-4af6-8b0f-c23d271eaf8e/01.svg?cdnVersion=212" alt="Stash" tabindex="0" loading="lazy"><figcaption>Stash</figcaption></figure>
<p>By default, changes in stash will become <em>staged</em>. If you want to remove them, use the <code>git restore --staged</code> command.</p>
<p>More info on Stash at the following link: <a href="https://www.atlassian.com/en/git/tutorials/saving-changes/git-stash" target="_blank" rel="noopener noreferrer">Git stash</a>.</p>
<h3>git pull</h3>
<p>Fetches data from the remote repository and then merges the changes with the local repository. It's the same as doing <code>git fetch &amp;&amp; git merge origin/$CURRENT_BRANCH</code></p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> pull <span class="token parameter variable">-p</span> <span class="token comment"># -p=prune, removes references to deleted remote branches</span></span>
<span class="line"><span class="token function">git</span> pull <span class="token parameter variable">--force</span> <span class="token comment"># overwrites the current local branch</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>git push</h3>
<p>Push local changes to remote.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> push <span class="token comment"># -p=prune, removes references to deleted remote branches</span></span>
<span class="line"><span class="token function">git</span> push <span class="token parameter variable">--force</span> <span class="token comment"># overwrites the remote branch with the same name</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>Regarding the <code>--force</code> parameter, be very careful and use it only when you know exactly what you are doing.</p>
<h3>git rm</h3>
<p>Remove files marked as tracked. Better to use <code>git rm</code> than <code>rm</code> to avoid problems.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> <span class="token function">rm</span> file_name</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>git merge</h3>
<p>Case 1: <strong>DO NOT</strong> want to keep local changes. Maybe you modified a file to test, but you no longer need the modification. The only thing that matters is being up to date with remote changes.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> fetch</span>
<span class="line"><span class="token function">git</span> reset <span class="token parameter variable">--hard</span> HEAD</span>
<span class="line"><span class="token function">git</span> merge origin branch_name <span class="token comment"># usually develop. @{u} is the same as origin $CURRENT_BRANCH</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Case 2: You care about local changes:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> fetch</span>
<span class="line"><span class="token function">git</span> pull origin develop</span>
<span class="line"><span class="token comment"># Resolve conflicts if any</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>git log</h3>
<p>Shows a history of all branches:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> log</span>
<span class="line"><span class="token function">git</span> log <span class="token parameter variable">--oneline</span> <span class="token parameter variable">--decorate</span> <span class="token parameter variable">--graph</span></span>
<span class="line"><span class="token function">git</span> log <span class="token parameter variable">--pretty</span><span class="token operator">=</span>format:<span class="token string">'%h - %an, %ar : %s'</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>.gitconfig File</h2>
<p><code>~/.gitconfig</code> or <code>~/.config/git/config</code> is where the <em>git</em> configuration is on your computer. From there, we can, for example, create aliases for a list of commands that we usually use so we don't have to type the same thing all the time.</p>
<p>Some useful commands:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> user.name <span class="token string">"John Doe"</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> user.email john_doe@dev.com</span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> core.editor <span class="token string">"code --wait"</span> <span class="token comment"># VSCode as default editor</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> <span class="token parameter variable">-e</span> <span class="token comment"># Opens .gitconfig file for editing</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">--global</span> core.autocrlf <span class="token punctuation">[</span>true, input<span class="token punctuation">]</span> <span class="token comment"># true for Windows / input for Mac/Linux</span></span>
<span class="line"><span class="token function">git</span> config <span class="token parameter variable">-h</span> <span class="token comment"># Help on config</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="hint-container info">
<p class="hint-container-title">Info</p>
<p>Regarding <em>core.autocrlf</em>, if there are developers working on different OS, the special characters <em>carriage Return (CR) and Line Feed (LF)</em> will be added by Windows users, so It's necessary to run <code>git config --global core.autocrlf true</code>. On <em>macOS/Linux</em> It's not necessary, but It's advisable to assign the value input so that it automatically handles this value.</p>
</div>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># .gitconfig file</span></span>
<span class="line"></span>
<span class="line"><span class="token punctuation">[</span>alias<span class="token punctuation">]</span></span>
<span class="line">    pull_force <span class="token operator">=</span> <span class="token operator">!</span><span class="token string">"git fetch --all; git reset --hard HEAD; git merge @{u}"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>Example of Daily Workflow for Working with Git</h2>
<p>Let's see an example of how to work with <em>Git</em> on a project. Let's imagine we are going to work on a new feature that involves authenticating an <em>API</em>.</p>
<p>Although my team and I work with common <em>Git</em> commands, I'll also show how it would be done with <em>GitFlow</em>.</p>
<h3>1. Create feature branch</h3>
<p>We create a branch parallel to <em>develop</em> where we will work. Generally, using <em>GitFlow</em> it will be a <em>feature/</em> branch, for example:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> fetch <span class="token parameter variable">-a</span> <span class="token parameter variable">-p</span></span>
<span class="line"><span class="token function">git</span> switch develop <span class="token comment"># In case we are on another branch, you can check where you are with git branch</span></span>
<span class="line"><span class="token comment"># Common mode</span></span>
<span class="line"><span class="token function">git</span> switch <span class="token parameter variable">-c</span> <span class="token string">"feature/#HM-01-auth-api"</span></span>
<span class="line"><span class="token comment"># GitFlow mode</span></span>
<span class="line"><span class="token function">git</span> flow feature start HM-01-auth-api</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>2. Add commits</h3>
<p>We have worked on the necessary changes, so we will add them to the <em>stage</em> and then commit:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> status <span class="token comment"># to know which files are modified, untracked,...</span></span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span> <span class="token comment"># or better the names of the files for that commit</span></span>
<span class="line"><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"feature/#HM-01-auth-api"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Regarding the use of <code>git add .</code>, It's considered bad practice, as we can unintentionally introduce unnecessary files. Also, commits are usually made according to the files needed for a logic to work and It's easier when doing a code review. For example, if we need to authenticate an <em>API</em> in our task, the correct way would be:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> <span class="token function">add</span> auth/api_auth.py app.py</span>
<span class="line"><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"feature/#HM-01-Add new class &amp; modify routes"</span> <span class="token comment"># Message text in English and does NOT end with a period</span></span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> readme.md</span>
<span class="line"><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"feature/#HM-01-Update doc"</span> <span class="token comment"># Verbs in infinitive: add, merge, bump, change, delete, modify, fix,...</span></span>
<span class="line"><span class="token function">git</span> <span class="token function">add</span> test/system/api/auth/test_api_auth.py</span>
<span class="line"><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"feature/#HM-01-Add tests for all routes"</span> <span class="token comment"># It's advised that the message does not exceed 50 characters</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>3. Compare with develop</h3>
<p>Other developers probably advance in the code and your branch is not up to date. It's necessary to download the new modifications from the <em>develop</em> branch and choose the changes that remain.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># We are in the feature/ branch, if not we switch to it</span></span>
<span class="line"><span class="token function">git</span> fetch <span class="token parameter variable">-a</span> <span class="token parameter variable">-p</span> <span class="token comment"># Not necessary, but always advisable to keep branches up to date</span></span>
<span class="line"><span class="token function">git</span> pull origin develop <span class="token comment"># IMPORTANT: This downloads changes from remote develop, NOT from your local develop branch.</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Now two things can happen, everything is fine (we move to point 4) or there are conflicts that need to be resolved (<em>merge conflict</em>).</p>
<h4>3.1. Merge conflict. Resolve conflicts in your branch.</h4>
<p>We will review with <code>git status</code> the files that need to be resolved and resolve them one by one. It's recommended to use a graphical application or a more friendly IDE, as our code now contains merge traces that could be forgotten to remove. Some recommended Git apps are <a href="https://www.sourcetreeapp.com/" target="_blank" rel="noopener noreferrer">Sourcetree</a>, <a href="https://www.gitkraken.com/" target="_blank" rel="noopener noreferrer">GitKraken</a>.</p>
<h3>4. Push changes to the remote git server</h3>
<p>We just need to push the changes to merge them with <em>develop</em>. There are three ways to do this: <code>git merge</code>, <code>git rebase</code>, and the <em>gitflow</em> way.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># Common mode</span></span>
<span class="line"><span class="token comment"># We are in the feature/ branch. If not, we switch to it</span></span>
<span class="line"><span class="token function">git</span> merge origin develop --fast-forward <span class="token comment"># Option 1</span></span>
<span class="line"><span class="token function">git</span> merge origin develop <span class="token parameter variable">--squash</span> <span class="token comment"># Option 2</span></span>
<span class="line"></span>
<span class="line"><span class="token function">git</span> rebase origin develop <span class="token operator">&amp;&amp;</span> <span class="token function">git</span> merge --fast-forward <span class="token comment"># Option 3</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># GitFlow mode</span></span>
<span class="line"><span class="token function">git</span> flow feature finish HM-01-auth-api</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The recommended way is to use <strong><em>git merge</em>,</strong> although I'll explain the two options:</p>
<ul>
<li>
<p>With <code>git merge</code> we combine the commits and make a new commit in <em>develop</em>. If the <em>develop</em> branch is very active, this option can <em>&quot;contaminate&quot;</em> the history quite a bit.</p>
</li>
<li>
<p>With <code>git rebase</code>, <strong>WE DELETE</strong> the commits from the <em>feature</em> branch, equalize with <em>develop</em>, and put new commits on top. The merge would be done with <code>git merge --fast-forward</code>.</p>
</li>
<li>
<p>It should be clear that <em>git rebase</em> solves the same problem as <em>git merge</em>: they are designed to integrate changes from one branch to another, but in different ways. <em>git rebase</em> is mainly used so that in the <em>Git</em> history, branches other than <em>main</em> and <em>develop</em> of the development team (<em>features, hotfix</em>) are not seen, as these parallel branches may not be of interest in the history or if there are many commits and they want to be reordered (5 commits can be merged into 2, for example), we would have the option to use an interactive rebase with <code>git rebase -i</code>. It's all a matter of aesthetics when we run <code>git log</code>.</p>
</li>
<li>
<p>Another golden rule of <em>git rebase</em> is <strong>NEVER USE IT ON PUBLIC BRANCHES</strong>.</p>
</li>
</ul>
<p>More information at <a href="https://www.atlassian.com/en/git/tutorials/merging-vs-rebasing" target="_blank" rel="noopener noreferrer">atlassian.com &gt; merging-vs-rebasing</a></p>
<h2>Tips and Other Commands</h2>
<h3>untrack a file</h3>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> <span class="token function">rm</span> <span class="token parameter variable">--cached</span> file_name</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>Fix a bug in main</h3>
<p>To do this, create a <code>hotfix/xxx</code> branch locally to fix the problem and merge it into <code>main</code>. If everything is correct, we must also merge it with <code>develop</code>. Using <em>gitflow</em>, you need to run the following command:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> flow hotfix start HM-01-fix-bug</span>
<span class="line"><span class="token comment"># Do your Kung-Fu</span></span>
<span class="line"><span class="token function">git</span> flow hotfix finish HM-01-fix-bug</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>Get remote changes without keeping local changes</h3>
<p>You want to delete all <em>uncommitted</em> local changes. Maybe you modified a file to test, but you no longer need the modification. The only thing that matters is being up to date with the remote branch.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> fetch <span class="token parameter variable">-a</span></span>
<span class="line"><span class="token function">git</span> stash <span class="token parameter variable">-u</span> <span class="token comment"># Optional but advisable</span></span>
<span class="line"><span class="token function">git</span> reset <span class="token parameter variable">--hard</span> HEAD</span>
<span class="line"><span class="token function">git</span> merge --no-ff origin develop <span class="token comment"># Or alternatively we can do git pull</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>Delete my changes</h3>
<p>If you want to revert to the previous state:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> reset <span class="token parameter variable">--soft</span> <span class="token comment"># Keeps changes</span></span>
<span class="line"><span class="token function">git</span> reset <span class="token parameter variable">--hard</span> <span class="token comment"># Deletes even your code. Use with caution</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>Go to a previous state via an ID without keeping changes</h3>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">git</span> log <span class="token comment"># See the commit ID to which we want to revert</span></span>
<span class="line"><span class="token function">git</span> reset <span class="token parameter variable">--hard</span> 23j45b3b45hb345b</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h2>Interesting Links</h2>
<ul>
<li><a href="https://rogerdudler.github.io/git-guide/index.en.html" target="_blank" rel="noopener noreferrer">Git Guide</a></li>
<li><a href="https://learngitbranching.js.org" target="_blank" rel="noopener noreferrer">Learn Git Branching</a></li>
<li><a href="https://qastack.mx/programming/315911/git-for-beginners-the-definitive-practical-guide" target="_blank" rel="noopener noreferrer">Git for Beginners: The Definitive Practical Guide</a></li>
<li><a href="https://git-scm.com/doc" target="_blank" rel="noopener noreferrer">git-scm.com</a></li>
<li><a href="https://onlywei.github.io/explain-git-with-d3/#merge" target="_blank" rel="noopener noreferrer">Explain Git with D3</a></li>
<li><a href="https://www.freecodecamp.org/news/tag/git/" target="_blank" rel="noopener noreferrer">Freecodecamp &gt; #Git</a></li>
<li><a href="https://www.stacking.dev" target="_blank" rel="noopener noreferrer">The stacking workflow</a></li>
</ul>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/11/git_branch.jpg &quot;This is like AI and I imagine Git branches&quot;" type="image/"/>
    </item>
    <item>
      <title>Python. Curiosities, code, notes to get ready to PCEP</title>
      <link>https://misapuntesde.com/2024/11/python_tips_code_notes_pcep.html</link>
      <guid>https://misapuntesde.com/2024/11/python_tips_code_notes_pcep.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Python. Curiosities, code, notes to get ready to PCEP</source>
      <description>Python. Curiosities, code, notes to get ready to PCEP</description>
      <category>Developer</category>
      <pubDate>Thu, 07 Nov 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/11/pcep.png" alt="Certification Roadmap" tabindex="0" loading="lazy"><figcaption>Certification Roadmap</figcaption></figure>
<p>I might take the <a href="https://pythoninstitute.org/pcep" target="_blank" rel="noopener noreferrer">PCEP</a> exam to demonstrate my knowledge in <em>Python</em>. For now, I have taken a <em>CISCO</em> course called <strong>Python Essential 1</strong> and here are some notes, curiosities, and code that I found interesting if you are not a <em>Pythonista</em>.</p>
<h2>Quick notes</h2>
<ul>
<li><em>CPython</em> is the default and reference implementation of the Python language, written in C. When you install <em>Python</em> on your system, you are actually installing <em>CPython</em>. 😱</li>
<li><strong>PEP</strong> (Python Enhancement Proposals) is a system for designing and specifying Python. PEPs are documents that describe and discuss proposed features and changes for Python.</li>
<li>What are the four fundamental elements of a language? An alphabet, a lexicon, a syntax, and a semantics.</li>
<li>Where do functions come from? From <em>Python</em> itself (<em>built-in functions</em>), from modules, or from your code.</li>
<li><code>0o123</code> is an octal number (base 8). They start with <code>0o</code> and this example is equal to 83 in decimal (base 10).</li>
<li><code>0x123</code> is a hexadecimal number (base 16). They start with <code>0x</code>. 291 is the decimal result in this case (base 10).</li>
<li><code>.4 = 0.4 | 4. = 4.0</code></li>
<li>The result produced by the division operator is always a float, even if the operands are integers and the result is an integer. <code>print(10 / 5) # 2.0</code></li>
<li>The asterisk (_) sign, when applied to a string and a number (or a number and a string) becomes a replication operator: <code>&quot;an-&quot; _ 3 # an-an-an-</code></li>
<li>What is the default return value for a function that does not explicitly return any value? It returns the value <code>None</code>.</li>
<li>What is the result of the following comparison? <code>2 == 2.</code>. <strong>The answer is True</strong>. Python converts the integer to a float before comparing them.</li>
<li>Useful exceptions: <code>ValueError</code>, <code>TypeError</code>, <code>AttributeError</code>, <code>SyntaxError</code>.</li>
</ul>
<h2>What happens when Python encounters an invocation like the one below?</h2>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">function_name<span class="token punctuation">(</span>argument<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ul>
<li>First, Python checks if the specified name is legal (it explores its internal data to find an existing function of that name; if this search fails, Python aborts the code).</li>
<li>Second, Python checks if the function's requirements for the number of arguments allow it to invoke the function in this way (for example, if a specific function requires exactly two arguments, any invocation that provides only one argument will be considered erroneous and will abort the code execution).</li>
<li>Third, Python leaves the code for a moment and jumps into the function to be invoked; therefore, it also takes the argument(s) and passes them to the function.</li>
<li>Fourth, the function executes the code, causes the desired effect (if any), evaluates the desired result(s), and completes the task.</li>
<li>Finally, Python returns to the code (to the place immediately after the invocation) and resumes its execution.</li>
</ul>
<h2>Sequence types and mutability</h2>
<h3>Lists = []</h3>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">list1 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token operator">*</span> <span class="token number">3</span> <span class="token comment"># [3, 3, 3]</span></span>
<span class="line">list2 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">]</span> <span class="token comment"># [3, 3, 3]</span></span>
<span class="line">list3 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">3</span> <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">]</span> <span class="token comment"># [3, 3, 3]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>We have three different ways to generate a list in Python</p>
<ul>
<li><strong>Lists are mutable (they can be modified).</strong></li>
<li>They are sequences (they can be indexed and sliced).</li>
<li>They are heterogeneous (they can contain elements of different types).</li>
<li>They are ordered (the order of elements is important).</li>
<li>Lists can be nested (a list can contain other lists).</li>
</ul>
<h3>Tuples = ()</h3>
<p><code>my_tuple = (1, 2, 3)</code></p>
<ul>
<li><strong>Tuples are immutable.</strong></li>
<li>They are sequences.</li>
<li>They are heterogeneous.</li>
<li>They are ordered.</li>
<li>Tuples can be nested.</li>
</ul>
<h3>Dictionaries = {}</h3>
<p><code>dictionary = {&quot;cat&quot;: &quot;chat&quot;, &quot;dog&quot;: &quot;chien&quot;, &quot;horse&quot;: &quot;cheval&quot;}</code></p>
<ul>
<li>Dictionaries are mutable.</li>
<li><strong>Dictionaries are not sequences.</strong></li>
<li>Dictionaries are heterogeneous.</li>
<li><strong>Dictionaries are not ordered.</strong></li>
<li>Dictionaries can be nested.</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">my_dict <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">"key1"</span><span class="token punctuation">:</span> <span class="token string">"value1"</span><span class="token punctuation">,</span> <span class="token string">"key2"</span><span class="token punctuation">:</span> <span class="token string">"value2"</span><span class="token punctuation">}</span></span>
<span class="line">my_dict<span class="token punctuation">[</span><span class="token string">"key3"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">"value3"</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">for</span> key <span class="token keyword">in</span> my_dict<span class="token punctuation">.</span>keys<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">print</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> <span class="token string">"->"</span><span class="token punctuation">,</span> my_dict<span class="token punctuation">[</span>key<span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token comment"># key1 -> value1</span></span>
<span class="line"><span class="token comment"># key2 -> value2</span></span>
<span class="line"><span class="token comment"># key3 -> value3</span></span>
<span class="line"></span>
<span class="line">dictionary <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token string">"cat"</span><span class="token punctuation">:</span> <span class="token string">"chat"</span><span class="token punctuation">,</span> <span class="token string">"dog"</span><span class="token punctuation">:</span> <span class="token string">"chien"</span><span class="token punctuation">,</span> <span class="token string">"horse"</span><span class="token punctuation">:</span> <span class="token string">"cheval"</span><span class="token punctuation">}</span></span>
<span class="line"><span class="token keyword">for</span> key <span class="token keyword">in</span> <span class="token builtin">sorted</span><span class="token punctuation">(</span>dictionary<span class="token punctuation">.</span>keys<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">    <span class="token keyword">print</span><span class="token punctuation">(</span>key<span class="token punctuation">,</span> <span class="token string">"->"</span><span class="token punctuation">,</span> dictionary<span class="token punctuation">[</span>key<span class="token punctuation">]</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token comment"># horse -> cheval</span></span>
<span class="line"><span class="token comment"># cat -> chat</span></span>
<span class="line"><span class="token comment"># dog -> chien</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">del</span> dictionary<span class="token punctuation">[</span><span class="token string">'dog'</span><span class="token punctuation">]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><div class="hint-container info">
<p class="hint-container-title">Info</p>
<p>Remember that we already reviewed lists and tuples in the article <a href="https://misapuntesde.com/2024/03/tuples_vs_lists_on_python.html" target="_blank" rel="noopener noreferrer">Python: Lists and Tuples</a>.</p>
</div>
<h2>Questions and answers</h2>
<ul>
<li>What is the output of the following code?</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">a <span class="token operator">=</span> <span class="token number">1</span></span>
<span class="line">b <span class="token operator">=</span> <span class="token number">0</span></span>
<span class="line">x <span class="token operator">=</span> a <span class="token keyword">or</span> b</span>
<span class="line">y <span class="token operator">=</span> <span class="token keyword">not</span><span class="token punctuation">(</span>a <span class="token keyword">and</span> b<span class="token punctuation">)</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>x <span class="token operator">+</span> y<span class="token punctuation">)</span></span>
<span class="line"><span class="token comment"># 2</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The expression <code>a or b</code> evaluates to 1 because in <em>Python</em>, the or operator returns the first truthy value it encounters. Since 1 is truthy, <strong>x = 1</strong>.</p>
<p>The expression <code>a and b</code> evaluates to 0 because b is falsy (0). The and operator returns the last value if both values are truthy, otherwise it returns the first falsy value encountered. Hence, a and b gives 0. <code>not(0)</code> evaluates to <em>True</em>, which in <em>Python</em> is equivalent to 1. Therefore, <strong>y = 1</strong>.</p>
<h2>EXTRA!: Cool code</h2>
<h3>Print() arguments</h3>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"Hello"</span><span class="token punctuation">,</span> <span class="token string">"World"</span><span class="token punctuation">,</span> sep<span class="token operator">=</span><span class="token string">"***"</span><span class="token punctuation">,</span> end<span class="token operator">=</span><span class="token string">"!"</span><span class="token punctuation">)</span></span>
<span class="line"><span class="token comment"># Hello***World!</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>Sorting a list</h3>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">my_list <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">]</span>  <span class="token comment"># list to sort</span></span>
<span class="line">swapped <span class="token operator">=</span> <span class="token boolean">True</span>  <span class="token comment"># We need it to be true to enter the while loop.</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">while</span> swapped<span class="token punctuation">:</span></span>
<span class="line">    swapped <span class="token operator">=</span> <span class="token boolean">False</span>  <span class="token comment"># no swaps so far</span></span>
<span class="line">    <span class="token keyword">for</span> i <span class="token keyword">in</span> <span class="token builtin">range</span><span class="token punctuation">(</span><span class="token builtin">len</span><span class="token punctuation">(</span>my_list<span class="token punctuation">)</span> <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">:</span></span>
<span class="line">        <span class="token keyword">if</span> my_list<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">></span> my_list<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
<span class="line">            swapped <span class="token operator">=</span> <span class="token boolean">True</span>  <span class="token comment"># swap occurred!</span></span>
<span class="line">            my_list<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">,</span> my_list<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> my_list<span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> my_list<span class="token punctuation">[</span>i<span class="token punctuation">]</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>my_list<span class="token punctuation">)</span></span>
<span class="line"><span class="token comment"># [2, 4, 6, 8, 10]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3>Protection against iterating through None values</h3>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line"><span class="token keyword">for</span> element <span class="token keyword">in</span> mylist <span class="token keyword">or</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">:</span></span>
<span class="line">do_stuff <span class="token punctuation">(</span>element<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>Explanation: If <code>mylist</code> is <code>None</code>, the loop will iterate through an empty list.</p>
<h3>Lists store memory locations</h3>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">list_1 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span></span>
<span class="line">list_2 <span class="token operator">=</span> list_1</span>
<span class="line">list_1<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">2</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>list_2<span class="token punctuation">)</span></span>
<span class="line"><span class="token comment"># [2]</span></span>
<span class="line">🤔</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>You could say that:</p>
<ul>
<li>The name of an ordinary variable is the name of its content: <code>variable = 1</code></li>
<li>The name of a list is the name of a memory location where the list is stored: <code>list_1 = [1]</code>, where list_1 is a memory location name.</li>
</ul>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">list_1 <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span></span>
<span class="line">list_2 <span class="token operator">=</span> list_1<span class="token punctuation">[</span><span class="token punctuation">:</span><span class="token punctuation">]</span></span>
<span class="line">list_1<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">2</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>list_2<span class="token punctuation">)</span></span>
<span class="line"><span class="token comment"># [1]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>This not visible part of the code described as [:] can produce a completely new list. <code>my_list[start:end]</code> is a way to copy a list.</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">my_list <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span></span>
<span class="line">new_list <span class="token operator">=</span> my_list<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token number">3</span><span class="token punctuation">]</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>new_list<span class="token punctuation">)</span></span>
<span class="line"><span class="token comment"># [8, 6]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>The new_list will contain end - start (3 - 1 = 2) elements ‒ those with indices equal to 1 and 2 (but not 3).</p>
<div class="language-python line-numbers-mode" data-highlighter="prismjs" data-ext="py"><pre><code class="language-python"><span class="line">my_list <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">]</span></span>
<span class="line">new_list <span class="token operator">=</span> my_list<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">:</span><span class="token punctuation">]</span></span>
<span class="line"><span class="token keyword">print</span><span class="token punctuation">(</span>new_list<span class="token punctuation">)</span></span>
<span class="line"><span class="token comment"># [4, 2]</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>Interesting Links</h2>
<ul>
<li><a href="https://programming.earthonline.us/interviewer-what-is-the-difference-between-0-3-and-0-0-0-in-python-f642a0c93a11" target="_blank" rel="noopener noreferrer">Medium &gt; Most Developers Failed with this Senior-Level Python Interview Question</a></li>
</ul>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/11/pcep.png &quot;Certification Roadmap&quot;" type="image/"/>
    </item>
    <item>
      <title>Relational Database Vs NoSQL</title>
      <link>https://misapuntesde.com/2024/07/rdbms_vs_nosql.html</link>
      <guid>https://misapuntesde.com/2024/07/rdbms_vs_nosql.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Relational Database Vs NoSQL</source>
      <description>Relational Database Vs NoSQL</description>
      <category>DevOps</category>
      <pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/07/rdbms_vs_nosql.jpg" alt="rdbms versus nosql" tabindex="0" loading="lazy"><figcaption>It's funny the image generated by the AI, the young guy for NoSQL</figcaption></figure>
<p>As a developer, you will most likely have done a project, and had to use a relational database. It happens all the time on each project. I think I miss very few relational <em>DBMS</em> (Database Management System) that I haven’t used in my profile as <em>DevOp</em>. This has not been the case for non-relational <em>BBDD</em> or also called <em>NoSQL</em> (<em>Not Only SQL</em>) such as <em>MongoDB</em>. I will explain the differences above and in a future article, we will see their use.</p>
<hr>
<h2>Relational Databases</h2>
<h3>Main Features</h3>
<ol>
<li><strong>Tabular structure</strong>: The data is organized in tables with rows and columns, where each row represents a record and each column an attribute of the record.</li>
<li><strong>Fixed Schema</strong>: Require a predefined schema that determines the structure of data before it can be stored.</li>
<li><strong>SQL language</strong>: Use SQL (Structured Query Language) for data manipulation and query.</li>
<li><strong>ACID properties</strong>: Atomicity, Consistency, Isolation and Durability, which ensures reliable and consistent transactions.</li>
</ol>
<h3>Pros</h3>
<ul>
<li><strong>Consistency and Security</strong>: Ideal for applications that require secure and consistent transactions, such as financial systems.</li>
<li><strong>Data Integrity</strong>: Thanks to the <em>ACID</em> properties, the integrity and consistency of the data is ensured.</li>
<li><strong>Tools and Support</strong>: Wide availability of tools and support due to its long history in the market.</li>
</ul>
<h3>Cons</h3>
<ul>
<li><strong>Vertical Scalability</strong>: Generally they scale better vertically (increasing server capacity) than horizontally (adding more servers).</li>
<li><strong>Scheme Rigidity</strong>: Less flexible to changes in data structure, which may make it difficult to adapt to new needs.</li>
</ul>
<h3>Examples and where you could use it</h3>
<p>Relational databases are often used in <strong>applications that require primarily transactional systems</strong>, where data consistency and integrity are critical and the data have a fixed, well-defined structure. Examples: <em>MySQL/MariaDB, PostgreSQL, Oracle, SQL Server</em>. You can use them in banking systems, inventory management, reservation system, CRM,...</p>
<div class="hint-container warning">
<p class="hint-container-title">Pro Tip</p>
<p>Do you have to do a lot of JOIN information?. Then opt for using <em>SGBD</em> relational.</p>
</div>
<h2>NoSQL Databases</h2>
<h3>Main Features</h3>
<ol>
<li><strong>Dynamic Schema</strong>: Do not require a fixed schema, allowing for storing unstructured or semi-structured data.</li>
<li><strong>Various Data Models</strong>: They include several types such as key-value, documents, columns and graphs.</li>
<li><strong>Scale Out</strong>: Designed to scale easily by adding more nodes to the system.</li>
<li><strong>Eventual consistency</strong>: Often prioritise availability and partitioning tolerance over immediate consistency, following the <a href="https://en.wikipedia.org/wiki/CAP_theorem" target="_blank" rel="noopener noreferrer">CAP theorem</a>.</li>
</ol>
<h3>Pros</h3>
<ul>
<li><strong>Flexibility</strong>: Can handle data of different types and structures without the need for a predefined schema.</li>
<li><strong>Scalability</strong>: Scale horizontally efficiently, ideal for applications with high data volumes and high availability needs.</li>
<li><strong>Performance</strong>: They offer high performance in read and write operations.</li>
</ul>
<h3>Cons</h3>
<ul>
<li><strong>Less Consistency</strong>: In many cases they offer instant rather than instant consistency, which may not be suitable for all applications.</li>
<li><strong>Less Support Tools</strong>: Although this is changing, they have historically had fewer tools and support compared to relational databases.</li>
</ul>
<h3>Examples and where you could use it</h3>
<p>They are perfect for <strong>Big Data and real-time analytics</strong> as they support fast access to large volumes of data and the data does not necessarily have to be fixed in structure. Examples: <em>MongoDB (documents), Cassandra (columns or tabular), Redis or Amazon DynamoDB (key-value)</em>. The most common use of this type of database is for location, geospatial/streaming/messaging/transaction/inventory data, customer profile, vector embeddings,...</p>
<h2>When to choose one or the other?</h2>
<p>Obviously, it will be defined by the project you must accomplish. There are no winners or victors, and each one is born with a purpose. I have given you some examples and use cases, but experience will show you which is the most suitable. If you have any questions, you can <a href="mailto:ulysess@gmail.com" target="_blank" rel="noopener noreferrer">contact me</a> and I will help you choose which database to use, but if we have to order food, then you choose. 😆</p>
<h2>Interesting links</h2>
<ul>
<li>(FREE) Introduction to NoSQL Databases: https://www.coursera.org/learn/introduction-to-nosql-databases</li>
</ul>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/07/rdbms_vs_nosql.jpg &quot;It&apos;s funny the image generated by the AI, the young guy for NoSQL&quot;" type="image/"/>
    </item>
    <item>
      <title>You Were Waiting for It. PHP Vs Python</title>
      <link>https://misapuntesde.com/2024/10/php_vs_python.html</link>
      <guid>https://misapuntesde.com/2024/10/php_vs_python.html</guid>
      <source url="https://misapuntesde.com/rss.xml">You Were Waiting for It. PHP Vs Python</source>
      <description>You Were Waiting for It. PHP Vs Python</description>
      <category>Developer</category>
      <pubDate>Sat, 26 Oct 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/10/python_vs_php.jpg" alt="Pythons Versus Elephants" tabindex="0" loading="lazy"><figcaption>Generated by Copilot</figcaption></figure>
<p>I hate technical interviews like everyone else. But there is <strong>SOMETHING</strong> I like about them: <strong>the questions I haven't previously asked myself</strong>. Usually, there's no time to develop an answer that one likes, you know how perfectionist I am. One of them was this week:</p>
<p><em>&quot;What advantages do you see in Python over PHP?&quot;</em>.</p>
<p>I found it interesting and decided to write an article about it from a broad and not very technical perspective.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/10/python_vs_php.jpg &quot;Generated by Copilot&quot;" type="image/"/>
    </item>
    <item>
      <title>AutoFirma Troubleshooting on macOS Sonoma</title>
      <link>https://misapuntesde.com/2024/09/fix_self_signature_errors_in_macos_sonoma.html</link>
      <guid>https://misapuntesde.com/2024/09/fix_self_signature_errors_in_macos_sonoma.html</guid>
      <source url="https://misapuntesde.com/rss.xml">AutoFirma Troubleshooting on macOS Sonoma</source>
      <description>AutoFirma Troubleshooting on macOS Sonoma</description>
      <category>Apple</category>
      <pubDate>Fri, 27 Sep 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/09/autofirma_installation.jpg" alt="autofirma" tabindex="0" loading="lazy"><figcaption>AutoFirma installation on macOS</figcaption></figure>
<p>If you are a <em>macOS</em> user in Spain and need to access through <em>Safari</em> some page where the digital certificate is required, you may have had problems with <em>AutoFirma</em>. Come in and see how to fix the most common errors that occur when trying to access pages where a certificate is required in <em>Safari on macOS Sonoma</em>. Go ahead!.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/09/autofirma_installation.jpg &quot;AutoFirma installation on macOS&quot;" type="image/"/>
    </item>
    <item>
      <title>How I use AI as a developer today</title>
      <link>https://misapuntesde.com/2024/06/how_i_use_ai_as_developer_today.html</link>
      <guid>https://misapuntesde.com/2024/06/how_i_use_ai_as_developer_today.html</guid>
      <source url="https://misapuntesde.com/rss.xml">How I use AI as a developer today</source>
      <description>How I use AI as a developer today</description>
      <category>Developer</category>
      <pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/06/me_trying_be_faster_than_copilot.jpg" alt="AI" tabindex="0" loading="lazy"><figcaption>MEME found at <a href="https://www.reddit.com/r/ProgrammerHumor/comments/1dg2862/igottabefaster/" target="_blank" rel="noopener noreferrer">r/ProgrammerHumor</a></figcaption></figure>
<div class="hint-container info">
<p class="hint-container-title">Info</p>
<p>Post updated on November 7, 2024.</p>
</div>
<p>I don’t tell you a lie when I advise you that if you’re not using AI in your day-to-day life, you’re missing a great opportunity.</p>
<p><strong>WE CAN'T ESCAPE!</strong>.</p>
<p>This is moving fast and you do not need to be convinced that it can help you in all the processes you perform, <strong>in the profession you have</strong>. In this article, I'll tell you how I use it as a developer and maybe in another article, as a writer.</p>
<h2>GitHub Copilot</h2>
<figure><img src="/images/2024/06/ai_code_generation_meme.jpg" alt="AI Code generation meme" tabindex="0" loading="lazy"><figcaption>True, true...</figcaption></figure>
<p>I’m not going to spend much time telling you what I write in this section either. For $20 you have an assistant on your <em>IDE</em> that helps you write code. It’s not perfect by the way, but it saves you time and I'm impressed with the Wow 😱 effect.</p>
<p>Sometimes, it even gives you solutions you hadn’t thought of (and at first it makes you angry as a human that you are). It’s like the smart-ass dude who’s correcting you and giving you solutions without asking him... Funny that I came to mind <a href="https://www.eddiedeezen.com/2010/07/maury-chaykin-rip-19492010.html" target="_blank" rel="noopener noreferrer">Eddie Deezen</a> acting in the movie <em>WarGames</em>.</p>
<figure><img src="/images/2024/06/Eddie-Deezen-wargames.gif" alt="Eddie Deezen" tabindex="0" loading="lazy"><figcaption>You rock, Eddie Deezen! DEP.</figcaption></figure>
<p>Not everything is as beautiful as it seems, because sometimes it gives you solutions that are not the most optimal, and you have to review them (there are hundreds of memes about this, <a href="https:/www.reddit.com/rProgrammerHumor/s/obmhe3/ng_copilot_memes_are/are" target="_blank" rel="noopener noreferrer">here is one</a> 😂 ). But hey, that’s what it is this year. The next one, we’ll see...</p>
<p>By the way, in <em>VSCode</em> remember to install the two essential extensions to get the most out of it: <em>GitHub Copilot and GitHub Copilot chat</em>. You also have an extension for use with <a href="https://marketplace.visualstudio.com/items?itemName=GitHub.codespaces" target="_blank" rel="noopener noreferrer">GitHub Codespaces</a>, which allows you to use <em>Copilot</em> in the cloud.</p>
<p>I recommend looking at the playlists on the <a href="https://www.youtube.com/@code/playlists" target="_blank" rel="noopener noreferrer">Visual Studio Code</a> YouTube channel. I leave you some tips that I use in my day to day:</p>
<ul>
<li>
<p><strong>Ideal for small scripts</strong>: It is one of the features I use most. I have created scripts to automate tasks that took time and now I have them in a snap. For example, a script that cleans the external storage systems before expelling them in <em>Rust</em> (and I don’t have much idea of this language), another that downloads <em>YouTube</em> playlists...</p>
</li>
<li>
<p><strong>Make my tests!</strong>: What we most hate as programmers, but that helps us to see if what we write meets expectations (and we have not screwed updating a method). Our friend helps you write the tests, but It's not thinking about them. You give him a little push, you’ll see how fast the dirty work does.</p>
</li>
<li>
<p><strong>Use keyboard shortcuts</strong>: If you use <em>VSCode</em> like me, I recommend that you learn the keyboard shortcuts it offers. <code>Cmd + I</code> to ask him inline, <code>Shift + Cmd + H</code> opens the side chat so you can ask him.</p>
</li>
<li>
<p><strong>Use / in the chat</strong>: If you type the back <code>/</code> in the chat, it gives you a list of commands that you can use to improve the response. In my case, I use a lot <code>@workspace</code> to give me solutions according to my workspace, but you have many others: <code>/help</code>, <code>#file:index.html</code>, <code>/explain</code>, <code>@vscode</code>, etc.</p>
</li>
<li>
<p><strong>Ask what you want</strong>: It’s an AI, so don’t be afraid: <em>How can I build this project? How do I install the dependencies? Where are the middlewares? Can you give me the secret to get rich?</em> Remember that if you don’t want generic results, you have to specify <code>@workspace</code> or <code>@file</code> to get solutions that fit your workspace. It is not the same <code>build me a class Calculator</code> that <code>build me in PHP a class Calculator documenting the methods and typing the parameters</code>.</p>
</li>
<li>
<p><strong>Errors in the code or Terminal</strong>: If you get an error when executing your code, you can ask <em>Copilot</em> what is happening. Select the error and paste it into the chat. If the problem comes from the terminal, select the code, press the right mouse button and choose the <code>Explain this</code> option. You can also click on the stars ✨ that appear on the left of your prompt.</p>
</li>
</ul>
<figure><img src="/images/2024/06/github-mobile.jpg" alt="GitHub mobile screenshot" tabindex="0" loading="lazy"><figcaption>GitHub Mobile has Copilot, too</figcaption></figure>
<ul>
<li>
<p><strong>On your smartphone, too!</strong>: If you use <em>GitHub</em> on your smartphone, you can use <em>GitHub Copilot</em>. 😍</p>
</li>
<li>
<p><strong>When all fails or doesn’t get the solution you’re looking for</strong>: Don’t get upset. What I do is create a new chat and ask again. Above all, it happened to me when he offered you code that comes from some public project. You must specify in the settings within <em>GitHub Copilot</em> that you want to (or not) give you solutions using public code by turning on or off the option <code>Suggestions matching public code (duplication detection filter)</code>.</p>
</li>
</ul>
<figure><img src="/images/2024/06/commit-comments.png" alt="comments" tabindex="0" loading="lazy"><figcaption>Let that generate the comments for your commits</figcaption></figure>
<ul>
<li><strong>Let that generate the for your commits</strong>: If you don’t like to write comments for <em>commits</em>, tap the stars icon ✨. The good thing is that it is learning from your comments and will give you descriptions according to your style.</li>
</ul>
<h2>Help in the Terminal</h2>
<figure><img src="/images/2024/06/warp_ai.png" alt="Warp AI" tabindex="0" loading="lazy"><figcaption>Warp AI</figcaption></figure>
<p>When I have to write a command I don’t know or don’t remember, I always go to <a href="https://www.warp.dev/ai" target="_blank" rel="noopener noreferrer">Warp</a>, the <em>Terminal</em> that has built-in serial AI. It’s like a <em>Copilot</em> for the <em>Terminal</em> and it’s cross-platform. If you haven’t tried it, I recommend it. So write what you want to do and it gives you the solution. Easy and fast... It's free, but it has payment plans.</p>
<div class="hint-container info">
<p class="hint-container-title">Yes, Copilot in the Terminal</p>
<p><em>GitHub Copilot</em> can also help you with terminal commands in three different ways: you specify the word <code>@terminal</code> before your chat question, with <code>Cmd + i</code> in the terminal view inside <em>VSCode</em> or you can use <a href="https://docs.github.com/en/copilot/github-copilot-in-the-cli" target="_blank" rel="noopener noreferrer">GitHub Copilot in the CLI</a>.</p>
</div>
<h2>Code reviews</h2>
<figure><img src="/images/2024/06/sourcery.png" alt="Sourcery screenshot" tabindex="0" loading="lazy"><figcaption>Sourcery in action!</figcaption></figure>
<p>If you use a <em>GitHub or GitLab</em> account, you can incorporate <a href="https://sourcery.ai" target="_blank" rel="noopener noreferrer">sourcery</a> into your workflow. In my case, when I go to make a <em>pull request</em>, it gives me suggestions on how to improve my code. For projects <em>open-source</em> is free.</p>
<h2>AI agents</h2>
<figure><img src="/images/2024/06/ai_agents.jpg" alt="AI Agents" tabindex="0" loading="lazy"><figcaption>Guide of AI Agent Types with examples. <a href="https://medium.com/@thomas.latterner/guide-of-ai-agent-types-with-examples-79f94a741d44" target="_blank" rel="noopener noreferrer">Medium</a></figcaption></figure>
<p>Although it is not a tool that I use daily (yet), I find this concept interesting to mention. They explain it very well in this article by <a href="https://zapier.com/blog/ai-agent/" target="_blank" rel="noopener noreferrer">Zapier</a>. I'll let my AI explain it to you:</p>
<p><em>Imagine you have a <em>bot</em> that helps you do repetitive tasks, such as letting you know if a server is down, telling you if a <em>pull request</em> has been approved, or letting you know if an <em>issue</em> has been closed. Well, that’s what <em>AI Agents</em> mean.</em></p>
<p>You have at <em>Medium</em> a specific topic about it that you can find <a href="https://medium.com/tag/ai-agent" target="_blank" rel="noopener noreferrer">here</a>. For reference, the <a href="https://github.com/reworkd/AgentGPT" target="_blank" rel="noopener noreferrer">AgentGPT</a> project is a good example of what I’m talking about.</p>
<p>If you don’t have time to spend programming these types of agents, your solution may be to use <em>LLM Pipelines</em>, which is a service that allows you to create AI agents without having to program. Check out <a href="https://towardsdatascience.com/you-dont-need-an-llm-agent-333bf0eb1019" target="_blank" rel="noopener noreferrer">this article</a> called <em>You Don’t Need an LLM Agent</em>.</p>
<p>Did you hear about Atomic Agents? They are a new type of AI agent that can be used to automate tasks in a more efficient way. You can find more information about them <a href="https://generativeai.pub/forget-langchain-crewai-and-autogen-try-this-framework-and-never-look-back-e34e0b6c8068" target="_blank" rel="noopener noreferrer">here in Medium</a> or in the <a href="https://atomicagents.io" target="_blank" rel="noopener noreferrer">official site</a>.</p>
<p>Today I discover <a href="https://docs.composio.dev/swekit/introduction" target="_blank" rel="noopener noreferrer">SWE Development Kit (swekit)</a>. It's a powerful framework for building Software Engineering agents using <em>Composio’s tooling ecosystem</em>. It provides tools like <em>Github, Repo Indexing, Repo Search, File Manager, Shell Manager,</em> and more. It's a good choice if you want to build your own AI agents.</p>
<h2>As a learning tool</h2>
<p>I think it’s one of the best tools you can have to learn how to code.</p>
<p>In case you are starting with a new language or framework, my advice is to create a markdown file with a header type <em>How to make a CRUD in Python or Introduction to Rust programming</em>. Behold how it begins to give you ideas and sections continuously.</p>
<h2>Tell me what you know about my PDFs</h2>
<p>I worked as a project manager for the last two years, and I accumulated a lot of reports. If a client requested any data, I had to look for it among hundreds of Word documents or PDFs.</p>
<p>When I found the <a href="https://github.com/zylon-ai/private-gpt" target="_blank" rel="noopener noreferrer">private-gpt</a> repo, all I had to do was ask for any information from a chat, and it was returned to me along with the name of the file where it was quickly and (almost) effective.</p>
<p>It is a tool that I recommend if you have to deal with many documents and your brain does not remember the commissions that were agreed on six months ago. <strong>The best</strong>: privately and locally.</p>
<h2>Other AI you can use</h2>
<p>If you are not convinced or do not want to pay for <em>GitHub Copilot</em>, there are other options.</p>
<p>Two kings actually as an alternative for <em>GitHub Copilot</em> are <a href="https://www.cursor.com" target="_blank" rel="noopener noreferrer">Cursor</a> and <a href="https://bolt.new" target="_blank" rel="noopener noreferrer">Bolt</a>. The first one has a free plan with 2000 completions per month (not bad) and 50 slow premium requests. The second one is an online IDE, but is a good choice for rapid mockups with predefined templates using Astro, ShaCDN or Vitepress.</p>
<p><a href="https://www.tabnine.com/" target="_blank" rel="noopener noreferrer">Tabnine</a> in its <em>Basic</em> plan, uses autocomplete code and is a <em>GitHub Copilot</em> first cousin. Another approach is <a href="https://www.deepcode.ai/" target="_blank" rel="noopener noreferrer">DeepCode</a>, which is a code analyzer that helps you find errors and improve your code.</p>
<p>The above-mentioned <em>Sourcery</em> can also help you in this regard and it is very easy to implement it. You can see the documentation for <em>VSCode</em> <a href="https://docs.sourcery.ai/Coding-Assistant/Guides/Getting-Started/VSCode/" target="_blank" rel="noopener noreferrer">here</a>.</p>
<p>Do you know <a href="https://marketplace.visualstudio.com/items?itemName=Continue.continue" target="_blank" rel="noopener noreferrer">Continue</a>? It is a very young extension for <em>VSCode</em> and <em>JetBrains</em>. It seems <em>Copilot</em>, but locally. That is, the model must be supplied by you using <em>Ollama</em> or similar (list of models <a href="https://docs.continue.dev/setup/select-model" target="_blank" rel="noopener noreferrer">here</a>). You can get more info <a href="https://www.continue.dev" target="_blank" rel="noopener noreferrer">here</a>.</p>
<p>There are many sites specializing in AI for developers, such as <a href="https://www.phind.com" target="_blank" rel="noopener noreferrer">Phind</a> or <a href="https://userway.org/get/" target="_blank" rel="noopener noreferrer">Userway</a>, but I recommend those you can use within your <em>IDE</em>, to make it easier to use and &quot;learn&quot; to give you code according to your workspace.</p>
<p>Other I don't tested, but I have heard good things about them are <a href="https://codeium.com" target="_blank" rel="noopener noreferrer">codeium</a> and <a href="https://supermaven.com" target="_blank" rel="noopener noreferrer">supermaven</a>.</p>
<h2>Final words</h2>
<p>It’s funny what happens with this technology: if you don’t use it, you stay behind, and if you use it, it’s like that new co-worker who has put you aside so that you learn everything you know and the company can hire you in the future.</p>
<p>According to some analysts, there is still a lot left for that to happen (five years!), although others believe that it is one more tool and that it will simply modify the way we interact with machines.</p>
<p>Allow me, in the meantime, to enjoy the advantages that it offers me to improve my writing, either of code or of prose, and to continue helping me in those works that take me more time than I would like.</p>
<p>As an example of what I am talking about, I have written the word <code>we</code>, and look at what the autocomplete of <em>Copilot</em> tries to convince me of:</p>
<div class="hint-container info">
<p class="hint-container-title">Copilot, your friend 🤖</p>
<p><em>We have to be aware that AI is not the enemy, but a tool that can help us to be more efficient in our work.</em></p>
</div>
<p>Whatever you say, dude. Whatever you say... 🤦</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/06/me_trying_be_faster_than_copilot.jpg &quot;MEME found at [r/ProgrammerHumor](https://www.reddit.com/r/ProgrammerHumor/comments/1dg2862/igottabefaster/" type="image/"/>
    </item>
    <item>
      <title>How to use a VGA Adapter for Raspberry Pi</title>
      <link>https://misapuntesde.com/2024/06/vga_adapter_for_raspberry_pi.html</link>
      <guid>https://misapuntesde.com/2024/06/vga_adapter_for_raspberry_pi.html</guid>
      <source url="https://misapuntesde.com/rss.xml">How to use a VGA Adapter for Raspberry Pi</source>
      <description>How to use a VGA Adapter for Raspberry Pi</description>
      <category>Raspberry Pi</category>
      <pubDate>Thu, 20 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/06/vga-connector_01.jpg" alt="Photo about VGA 666 GPIO Connector" tabindex="0" loading="lazy"><figcaption>VGA 666 GPIO Connector</figcaption></figure>
<p>Recently I got a <em>AOC Model 7Vlr 17&quot; Monitor</em> with VGA connector and I wanted to use it with my <em>Raspberry Pi</em>... The real reason is that I don't have any laptop, PC or device at home with VGA output right now 😅.</p>
<p>I found a cheap adapter on a China store (Under 5 euro-dollar) called <em>VGA 666</em> (6 bits for Red, 6-Green &amp; 6-Blue), and I'm going to show you how to use it.</p>
<hr>
<p>So as you can see in the picture above, it's not difficult to connect into the <em>GPIO</em>. No mystery here. Just plug and play.</p>
<p>Now is the time to configure your OS. No matter what you are using, <em>Raspberry Pi OS, Ubuntu</em>, etc. You have to go to the configuration file <code>/boot/config.txt</code> and add/modify/uncomment the following lines:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token comment"># Enable DRM VC4 V3D driver</span></span>
<span class="line"><span class="token comment"># dtoverlay=vc4-kms-v3d</span></span>
<span class="line"><span class="token comment"># max_framebuffers=2</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># Comment all hdmi lines</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># Comment the next lines</span></span>
<span class="line"><span class="token comment"># dtparam=i2c_arm=on</span></span>
<span class="line"><span class="token comment"># dtparam=i2s=on</span></span>
<span class="line"><span class="token comment"># dtparam=spi=on</span></span>
<span class="line"></span>
<span class="line"><span class="token assign-left variable">dtoverlay</span><span class="token operator">=</span>vga666</span>
<span class="line"><span class="token assign-left variable">enable_dpi_lcd</span><span class="token operator">=</span><span class="token number">1</span></span>
<span class="line"><span class="token assign-left variable">display_default_lcd</span><span class="token operator">=</span><span class="token number">1</span></span>
<span class="line"><span class="token assign-left variable">dpi_group</span><span class="token operator">=</span><span class="token number">2</span></span>
<span class="line"><span class="token assign-left variable">dpi_mode</span><span class="token operator">=</span>0x9 <span class="token comment"># See below</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Here a list with the most common <code>dpi_mode</code> resolutions I tested, but the best you can do is to search the manual of your monitor to get the correct one. The <code>dpi_mode</code> is a hexadecimal value that defines the resolution and refresh rate. Here are some examples:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">HDMI_DMT_SVGA_60 <span class="token operator">=</span> 0x9 <span class="token comment"># 800x600 60Hz</span></span>
<span class="line">HDMI_DMT_1280x800_60 <span class="token operator">=</span> 0x1C <span class="token comment"># 1280x800 60Hz</span></span>
<span class="line">HDMI_DMT_1280x960_60 <span class="token operator">=</span> 0x20 <span class="token comment"># 1280x960 60Hz</span></span>
<span class="line">HDMI_DMT_XGA_60 <span class="token operator">=</span> 0x10 <span class="token comment"># 1024x768 60Hz</span></span>
<span class="line">HDMI_DMT_SXGA_60 <span class="token operator">=</span> 0x23 <span class="token comment"># 1280x1024 60Hz</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>According <a href="https://www.manualslib.com/manual/791057/Aoc-Spectrum-7vlr.html?page=16#manual" target="_blank" rel="noopener noreferrer">to the manual</a> of my monitor, I should use as maximum <em>1280x1024 60Hz</em>. I tried finally with <code>0x10</code> and it fits perfectly.</p>
<p>You can find more info here at <a href="https://www.raspberrypi.org/documentation/configuration/config-txt/video.md" target="_blank" rel="noopener noreferrer">raspi-config documentation</a> and <a href="https://www.raspberrypi.com/documentation/computers/legacy_config_txt.html#hdmi_drive" target="_blank" rel="noopener noreferrer">Legacy config.txt options</a>. The list of <code>dpi_mode</code> is defined in the <a href="https://forums.raspberrypi.com/viewtopic.php?t=5851" target="_blank" rel="noopener noreferrer">official forum</a>.</p>
<figure><img src="/images/2024/06/vga-connector_02.jpg" alt="screen settings" tabindex="0" loading="lazy"><figcaption>Modifying the resolution there doesn't work</figcaption></figure>
<div class="hint-container warning">
<p class="hint-container-title">Important</p>
<p>Don't try to change the resolution through the <em>Raspberry Pi</em> settings. <strong>It doesn't work</strong>. You have to do it manually in the <code>config.txt</code> file.</p>
</div>
<p>Remember you need to get an output for the audio now!. You can use a <em>3.5mm jack</em> to speakers, USB sound card or <em>Bluetooth</em> speakers. Check the next parameters in the same file to enable audio output through the <em>3.5mm jack</em>.</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token assign-left variable">hdmi_force_edid_audio</span><span class="token operator">=</span><span class="token number">1</span></span>
<span class="line"><span class="token assign-left variable">dtparam</span><span class="token operator">=</span>audio<span class="token operator">=</span>on</span>
<span class="line"><span class="token assign-left variable">audio_pwm_mode</span><span class="token operator">=</span><span class="token number">1</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><figure><img src="/images/2024/06/vga-connector_03.jpg" alt="game screenshot" tabindex="0" loading="lazy"><figcaption>What game is it?</figcaption></figure>
<p>If you have problems accessing the graphical environment due to <em>Wayland</em>, you must access the Pi (I use <em>SSH</em>) and run <code>sudo raspi-config</code>. Go to <code>Advanded Options &gt; Wayland</code> and switch to <em>X11</em>. Restart and you’re done.</p>
<p>That's all! Enjoy your VGA monitor with our beloved <em>Raspberry Pi</em>. I'll try the <em>PCem</em> (Thanks to <a href="https://github.com/jmcerrejon/PiKISS" target="_blank" rel="noopener noreferrer">PiKISS</a>, of course 😉) emulator with <em>MS-DOS or even Windows 98SE</em>. Back to the 90s! I'm so excited! 😍</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/06/vga-connector_01.jpg &quot;VGA 666 GPIO Connector&quot;" type="image/"/>
    </item>
    <item>
      <title>Best roadmaps for developers 2024 Edition</title>
      <link>https://misapuntesde.com/2024/06/best_roadmaps_for_programming_languages_2024_edition.html</link>
      <guid>https://misapuntesde.com/2024/06/best_roadmaps_for_programming_languages_2024_edition.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Best roadmaps for developers 2024 Edition</source>
      <description>Best roadmaps for developers 2024 Edition</description>
      <category>Developer</category>
      <pubDate>Sun, 16 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/06/roadmaps.jpg" alt="Man in front of computer" tabindex="0" loading="lazy"><figcaption>Generated with Dall-E</figcaption></figure>
<div class="hint-container info">
<p class="hint-container-title">Updated</p>
<p>This post was updated on June 23, 2024.</p>
</div>
<p>The best part that you are reading my blog is that I don't need to convince you with tons of resources like a dirty trickster to follow me. The resources I share with you are the best roadmaps for programming languages I found, now in 2024. Those are my personal preferences, and here are not all the language programming, only the ones I'm interested in according to my career, but I'm sure you will find them useful.</p>
<h2>Laravel</h2>
<p>If you like <em>Laravel</em>, you probably follow <em>Povilas Korop</em>, the creator of <em>Laravel Daily</em>. He has a great roadmap for <em>Laravel</em> and is very updated.</p>
<p>Link: <a href="https://laraveldaily.com/roadmap-learning-path" target="_blank" rel="noopener noreferrer">laraveldaily.com/roadmap-learning-path</a></p>
<h2>PHP</h2>
<p>For <em>PHP</em>, I recommend the roadmap from <em>PHP The <s>Right</s>Wrong Way</em>. It's a very complete guide for beginners and advanced users. You have a lot of resources and tutorials to start with <em>PHP</em>, from the basics to the advanced.</p>
<p>Link: <a href="https://phpthewrongway.com" target="_blank" rel="noopener noreferrer">phpthewrongway.com</a> | OK, here you have the link to <a href="https://phptherightway.com" target="_blank" rel="noopener noreferrer">phptherightway.com</a> too.</p>
<h2>Front-End</h2>
<p>I'm not like front-end, but as a freelance, I need to know the basics. I chose the roadmap from <em>geeksforgeeks</em> because It's very complete and updated. Check the tutorials and resources they provide (very useful, but ssh!... Don't tell anyone).</p>
<p>They have a <a href="https://www.geeksforgeeks.org/mern-stack-development-roadmap/" target="_blank" rel="noopener noreferrer">MERN roadmap</a> too, but I'm not a big fan of that stack. Maybe because I haven't used it yet. Do you recommend it?</p>
<p>Link: <a href="https://www.geeksforgeeks.org/frontend-developer-roadmap" target="_blank" rel="noopener noreferrer">geeksforgeeks.org/frontend-developer-roadmap</a></p>
<h2>Open Source Guides</h2>
<p>If you are interested in contributing to open-source projects, you should check the next guides. They have a lot of resources and guides: Starting an open source project, contributing, licensing, best practices, and more.</p>
<p>Coded with love by GitHub and friends.</p>
<p>Link: <a href="https://opensource.guide" target="_blank" rel="noopener noreferrer">opensource.guide</a></p>
<h2>Developer roadmaps</h2>
<p>If you are a developer, you should check the roadmap from <a href="https://kamranahmed.info/" target="_blank" rel="noopener noreferrer">Kamran Ahmeds</a>. It's a very complete guide for people like you. From role to basic &amp; advanced skill.</p>
<p>Link: <a href="https://roadmap.sh" target="_blank" rel="noopener noreferrer">roadmap.sh</a></p>
<p>I will leave you with another great resource called <em>Exercism</em>: A platform that provides coding exercises for different programming languages. Practice your skills and learn new languages.</p>
<p>Link: <a href="https://exercism.org" target="_blank" rel="noopener noreferrer">exercism.org</a></p>
<h2>DSA</h2>
<p>Too many devs always recommend learning Data Structures and Algorithms with the <em>Princeton University</em> courses (<a href="https://www.coursera.org/learn/algorithms-part1" target="_blank" rel="noopener noreferrer">Part I</a>, <a href="https://www.coursera.org/learn/algorithms-part2" target="_blank" rel="noopener noreferrer">Part II</a>). I'm not a big fan of that course and they are a bit boring.</p>
<p>If you are interested in this topic, you really should check the roadmap from <a href="https://www.techiedelight.com/data-structures-and-algorithms-problems/" target="_blank" rel="noopener noreferrer">Techie Delight</a>. They have a lot of resources and tutorials with practical examples.</p>
<h2>Final thoughts</h2>
<p>Being a developer or starting a new career in programming is a challenge. Sometimes you can feel overwhelmed, but with the right resources, you can achieve your goals.</p>
<p>I forgot to mention If you are a complete newbie, you should check the <a href="https://cs50.harvard.edu/x/2024/weeks/0/" target="_blank" rel="noopener noreferrer">CS50’s Introduction to Computer Science</a> from Harvard University. It's a great course to start with the right foot.</p>
<p>I'm sure you will find this post useful. 😄</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/06/roadmaps.jpg &quot;Generated with Dall-E&quot;" type="image/"/>
    </item>
    <item>
      <title>Keep your macOS Apps updated with these free apps</title>
      <link>https://misapuntesde.com/2024/06/keep_your_macos_updated_with_these_free_apps.html</link>
      <guid>https://misapuntesde.com/2024/06/keep_your_macos_updated_with_these_free_apps.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Keep your macOS Apps updated with these free apps</source>
      <description>Keep your macOS Apps updated with these free apps</description>
      <category>Apple</category>
      <pubDate>Thu, 13 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/06/update_macos_apps.png" alt="collage with apps" tabindex="0" loading="lazy"><figcaption>My apps to get my OS to the latest</figcaption></figure>
<p>I have a problem with the software on my OS, maybe It's a disease, I don't know. The reason:</p>
<div class="hint-container caution">
<p class="hint-container-title">⛔️</p>
<p><strong>I NEED TO KEEP ALL MY APPS UPDATED</strong>.</p>
</div>
<p>I try not to have many of them, but the apps I have installed need the latest updates. How do I get it? With some apps that help me on that mission. Do you want to know which ones? Keep reading!</p>
<h2>Latest</h2>
<figure><img src="/images/2024/06/latest.jpg" alt="Latest Screenshot" tabindex="0" loading="lazy"><figcaption>Latest</figcaption></figure>
<p><em>Latest</em> is a free and open-source app that checks if all your apps are up to date. It's a simple app that shows you a list of all your installed apps and the latest version available.</p>
<p>You can update them with a single click or one by one. It supports apps downloaded from the <em>Mac App Store</em> and apps that use <em>Sparkle</em> for updates, which covers most of the apps on the market.</p>
<p>If the app is not supported, you can open the app through <em>Latest</em> and check for updates manually.</p>
<p>Link: <a href="https://github.com/mangerlahn/Latest" target="_blank" rel="noopener noreferrer">github.com &gt; Latest</a></p>
<h2>Cork</h2>
<figure><img src="/images/2024/06/cork.jpg" alt="Cork Screenshot" tabindex="0" loading="lazy"><figcaption>Cork</figcaption></figure>
<p>It's a fast <em>GUI</em> for <em>Homebrew</em> apps!</p>
<p>In the past, I used to update my apps with the terminal, but with <em>Cork</em>, I can do it with a single click (even when I love the <em>Terminal</em>).</p>
<p>It's a paid app, but you have the chance to compile and use it for free. It has many other features to handle visually your <em>Homebrew</em> apps: search, fix, install, uninstall,...</p>
<p>It just works &amp; It's a great tool to keep your apps updated. <strong>Dot.</strong></p>
<p>Link: <a href="https://github.com/buresdv/Cork" target="_blank" rel="noopener noreferrer">github.com &gt; Cork</a></p>
<h2>Python cleanup script for macOS</h2>
<figure><img src="/images/2024/06/mac-cleanup.png" alt="Python cleanup Screenshot" tabindex="0" loading="lazy"><figcaption>Python cleanup</figcaption></figure>
<p><em>mac-cleanup-py</em> is a powerful cleanup script for macOS. It helps you in the next tasks: Empty Trash, delete unnecessary logs &amp; files and clear cache from OS or some apps. You can enable specific apps to clean up, like <em>Xcode</em> or <em>Android Studio</em>. It has a very useful dry mode to see what it will do before running it.</p>
<p>Link: <a href="https://github.com/mac-cleanup/mac-cleanup-py" target="_blank" rel="noopener noreferrer">github.com &gt; mac-cleanup-py</a></p>
<h2>Custom function</h2>
<p>So I think this is something all developers should have in their <code>.*rc</code> file: A simple function that checks if there are any updates available for the installed apps. For example, I use this function in my <em>.zshrc</em> file:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function-name function">upgradeALL</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">if</span> <span class="token punctuation">[</span><span class="token punctuation">[</span> <span class="token parameter variable">-f</span> /usr/local/bin/composer <span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></span>
<span class="line">        <span class="token function">composer</span> self-update</span>
<span class="line">        <span class="token function">composer</span> global update</span>
<span class="line">    <span class="token keyword">fi</span></span>
<span class="line"></span>
<span class="line">    softwareupdate <span class="token parameter variable">--all</span> <span class="token parameter variable">--install</span> <span class="token parameter variable">--force</span></span>
<span class="line">    brew outdated <span class="token operator">&amp;&amp;</span> brew update <span class="token operator">&amp;&amp;</span> brew upgrade <span class="token operator">&amp;&amp;</span> brew cleanup</span>
<span class="line">    <span class="token comment">## Add yours here!</span></span>
<span class="line">    mac-cleanup</span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>Conclusion</h2>
<p>Now you have no excuse to keep your <em>macOS</em> updated. Of course, you can still use <em>manual methods</em>, but with these apps, you can have more control over the process in less time. Do you use any other app to achieve that? <a href="mailto:ulysess@gmail.com" target="_blank" rel="noopener noreferrer">Let me know!</a> 😃</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/06/update_macos_apps.png &quot;My apps to get my OS to the latest&quot;" type="image/"/>
    </item>
    <item>
      <title>Add an icon to a directory on macOS</title>
      <link>https://misapuntesde.com/2024/06/add_an_icon_to_a_directory_on_macos.html</link>
      <guid>https://misapuntesde.com/2024/06/add_an_icon_to_a_directory_on_macos.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Add an icon to a directory on macOS</source>
      <description>Add an icon to a directory on macOS</description>
      <category>Apple</category>
      <pubDate>Wed, 12 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/06/explanation.png" alt="png image + folder = folderified!" tabindex="0" loading="lazy"><figcaption>png image + folder = folderified!</figcaption></figure>
<p>This is the kind of article nobody reads, but everybody want to try. It's a simple <em>trick</em> to add an icon to a directory on <em>macOS</em> using a line command app called <code>folderify</code>. Instructions inside the article!...</p>
<hr>
<p>To install, use brew:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">brew <span class="token function">install</span> folderify</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>Then, to add an icon to a directory, just use the following command:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">folderify mask.png /path/to/folder</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>For example, I've used this <em>PNG</em> image for the directory where I have all my source code:</p>
<figure><img src="/images/2024/06/source_code.png" alt="source code icon" tabindex="0" loading="lazy"><figcaption>Source code icon</figcaption></figure>
<p>Then I run:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">folderify source_code.png <span class="token environment constant">$HOME</span>/Documents/sc</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><figure><img src="/images/2024/06/run_folderify.png" alt="Running folderify on the Terminal" tabindex="0" loading="lazy"><figcaption>Running folderify on the Terminal</figcaption></figure>
<p>Et voi là! I have a nice icon for that directory. ❤️</p>
<figure><img src="/images/2024/06/sc_folder.png" alt="source code folder" tabindex="0" loading="lazy"><figcaption>Source code folder</figcaption></figure>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/06/explanation.png &quot;png image + folder = folderified!&quot;" type="image/"/>
    </item>
    <item>
      <title>Adblock for the Spotify desktop client on Linux &amp; macOS</title>
      <link>https://misapuntesde.com/2024/06/adblock_for_the_spotify_desktop_client_on_linux_macos.html</link>
      <guid>https://misapuntesde.com/2024/06/adblock_for_the_spotify_desktop_client_on_linux_macos.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Adblock for the Spotify desktop client on Linux &amp; macOS</source>
      <description>Adblock for the Spotify desktop client on Linux &amp; macOS</description>
      <category>Apple</category>
      <pubDate>Sun, 09 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/06/spotx-bash.jpg" alt="SpotX Bash logo" tabindex="0" loading="lazy"><figcaption>SpotX Bash script to block ads on Sp0tify</figcaption></figure>
<p>I own a license of <em>Adguard</em> on <em>macOS</em> and I'm happy with it. It blocks ads on the <em>$potify desktop client</em>, but I don't know what's wrong lately: It doesn't work anymore. So I found a better approach to block ads on <em>$potify</em>. It's a simple solution that works on both <em>Linux</em> and <em>macOS</em>.</p>
<p><strong>TLD;DR:</strong> Run on your terminal:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">bash</span> <span class="token operator">&lt;</span><span class="token punctuation">(</span><span class="token function">curl</span> <span class="token parameter variable">-sSL</span> https://spotx-official.github.io/run.sh<span class="token punctuation">)</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p><em>Mmm, I don't trust you, Jose. What does it do?.</em></p>
<p>Good! Don't trust anyone. Here is the link to the repository:</p>
<p><a href="https://github.com/SpotX-Official/SpotX-Bash" target="_blank" rel="noopener noreferrer">https://github.com/SpotX-Official/SpotX-Bash</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/06/spotx-bash.jpg &quot;SpotX Bash script to block ads on Sp0tify&quot;" type="image/"/>
    </item>
    <item>
      <title>Where can I buy the Raspberry pi AI Kit?</title>
      <link>https://misapuntesde.com/2024/06/where_can_i_buy_the_raspberry_pi_ai_kit_module.html</link>
      <guid>https://misapuntesde.com/2024/06/where_can_i_buy_the_raspberry_pi_ai_kit_module.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Where can I buy the Raspberry pi AI Kit?</source>
      <description>Where can I buy the Raspberry pi AI Kit?</description>
      <category>Raspberry Pi</category>
      <pubDate>Fri, 07 Jun 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/06/raspberry-ia.jpg" alt="Raspberry pi AI Kit" tabindex="0" loading="lazy"><figcaption>Raspberry pi AI Kit (Worst background color in the World)</figcaption></figure>
<p>Sayonara,... Siri!</p>
<p>Here we have an interesting module for all AI enthusiasts!</p>
<p>The <em>AI Hailo-8L M.2</em> is a <em>HAT+ using PCI3 3.0</em> for AI accelerator module that delivers unprecedented performance. It is designed to accelerate AI workloads at the edge, enabling developers to deploy AI applications on <em>Raspberry P</em>i with minimal latency and power consumption. It can gets an inference of 13 TOPS (Tera Operations Per Second). Their price is around $70.</p>
<div class="hint-container info">
<p class="hint-container-title">But... What is Hailo?</p>
<p>It's a company that specializes in developing AI processors for edge devices. The <em>Hailo-8L</em> is their latest product.</p>
</div>
<p>You can use it for a wide range of applications, including:</p>
<ul>
<li>Image and video processing.</li>
<li>Object detection</li>
<li>Natural language processing.</li>
<li>Neural network inference.
...</li>
</ul>
<p>For more information, check the documentation <a href="https://www.raspberrypi.com/documentation/accessories/ai-kit.html" target="_blank" rel="noopener noreferrer">here</a>.</p>
<h2>Where to buy?</h2>
<figure><img src="/images/2024/06/ai-technology.jpg" alt="AI Chip" tabindex="0" loading="lazy"><figcaption>AI Chip</figcaption></figure>
<p>You can buy the <em>Kit</em> from the following stores:</p>
<h3>UK</h3>
<ul>
<li><a href="https://thepihut.com/products/raspberry-pi-ai-kit?src=raspberrypi" target="_blank" rel="noopener noreferrer">The Pi Hut</a> £54.75 (excl. VAT)</li>
<li><a href="https://shop.pimoroni.com/products/raspberry-pi-ai-kit?variant=41880918130771" target="_blank" rel="noopener noreferrer">Pimoroni</a> £65.70 (excl. VAT)</li>
</ul>
<h3>USA</h3>
<ul>
<li><a href="https://www.pishop.us/product/raspberry-pi-ai-kit/?src=raspberrypi" target="_blank" rel="noopener noreferrer">PiShop</a> $85 (excl. VAT)</li>
<li><a href="https://vilros.com/products/raspberry-pi-ai-kit?src=raspberrypi" target="_blank" rel="noopener noreferrer">Vilros</a> $70 (excl. VAT)</li>
<li><a href="https://www.canakit.com/raspberry-pi-ai-kit.html?cid=USD&amp;src=raspberrypi" target="_blank" rel="noopener noreferrer">CanaKit</a> $70 or with case, fan and heat sink $99.95 (excl. VAT)</li>
<li><a href="https://www.sparkfun.com/products/25827" target="_blank" rel="noopener noreferrer">Sparkfun</a> $70 (excl. VAT)</li>
</ul>
<h3>Spain</h3>
<ul>
<li>The only place I found (anticipated, but sell at Jun, 14) is for  <a href="https://www.kubii.com/es/raspberry-pi-5/4343-kit-ai-raspberry-pi-5056561803906.html" target="_blank" rel="noopener noreferrer">Kubii.com</a> 78,60 € (VAT included) and <a href="https://www.tiendatec.es/maker-zone/sensores/2297-raspberry-pi-ai-kit-acelerador-ia-hailo-8l-5056561803906.html" target="_blank" rel="noopener noreferrer">tiendatec.es</a>
78,95 € (VAT included)</li>
</ul>
<h3>Wordwide</h3>
<ul>
<li><a href="https://www.elektor.com/products/raspberry-pi-ai-kit" target="_blank" rel="noopener noreferrer">Elector</a></li>
</ul>
<div class="hint-container warning">
<p class="hint-container-title">Warning</p>
<p>Please, If you know more stores, you want to add yours, or you found some mistake, <a href="mailto:ulysess@gmail.com" target="_blank" rel="noopener noreferrer">let me know!</a>.</p>
</div>
<p>Check the official <a href="https://www.raspberrypi.com/products/ai-kit/" target="_blank" rel="noopener noreferrer">Raspberry Pi</a> site for more information and links to other stores.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/06/raspberry-ia.jpg &quot;Raspberry pi AI Kit (Worst background color in the World" type="image/"/>
    </item>
    <item>
      <title>Install unrecognized USB Ethernet devices on macOS</title>
      <link>https://misapuntesde.com/2024/05/install_unrecognized_usb_ethernet_devices_on_macos.html</link>
      <guid>https://misapuntesde.com/2024/05/install_unrecognized_usb_ethernet_devices_on_macos.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Install unrecognized USB Ethernet devices on macOS</source>
      <description>Install unrecognized USB Ethernet devices on macOS</description>
      <category>Apple</category>
      <pubDate>Fri, 31 May 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/05/usb_ethernet.jpg" alt="USB Ethernet device photo" tabindex="0" loading="lazy"><figcaption>Do you know what USB device is it? Me neither.</figcaption></figure>
<p>I'm moving from my attic to the basement, and I needed to connect my Mac to the router, because the <em>WiFi</em> connection is terrible. I have a <em>USB Ethernet</em> device that I used with a miniPC, but it was not recognized by my <em>macOS</em>. I found a way to install it, and I want to share it with you.</p>
<h2>Introduction</h2>
<p>So, If you have a <em>USB Ethernet</em> device that is not recognized by <em>macOS</em>, you can try the following steps to install it. At least, it worked for me, and I hope it works for you, too. 😉</p>
<h2>Steps</h2>
<ol>
<li>Open the Terminal and connect the USB Ethernet device to the Mac.</li>
<li>Run the following command to list the network interfaces:</li>
</ol>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line">networksetup <span class="token parameter variable">-listallnetworkservices</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><ol start="3">
<li>Identify the new network interface that appears after connecting the USB Ethernet device. It should have a name like &quot;USB Ethernet&quot; or similar.</li>
</ol>
<div class="hint-container warning">
<p class="hint-container-title">Warning</p>
<p>You can use the Application Utils &gt; System Information If you don't feel comfortable with the Terminal.</p>
</div>
<p>Now you have some information to get the driver for the device. You can search for the manufacturer's website or use any search engine to find the driver. In my case, It was <em>ASIX AX88179 chipset</em>, so I downloaded the driver from the <a href="https://www.asix.com.tw/en/support/download" target="_blank" rel="noopener noreferrer">official website</a>. Another way is to search by <em>product_id</em> or <em>vendor_id</em>.</p>
<figure><img src="/images/2024/05/usb_ethernet_drivers_on_macos.jpg" alt="All stuff to get it working on macOS" tabindex="0" loading="lazy"><figcaption>All stuff to get it working on macOS.</figcaption></figure>
<p>I only needed to install the driver, restart a couple of time, and the <em>USB Ethernet device</em> was recognized by <em>macOS</em>. I passed from 150 MB/s using WiFi to ~600 MB/s. Not bad!</p>
<video controls>
  <source src="/images/2024/05/dload_rpi_os_from_cli.mp4" type="video/mp4">
  Your browser does not support the video tag.
</video>
<h6>Video showing the speed downloading RPi OS image from the Internet using Ethernet.</h6>
<div class="hint-container warning">
<p class="hint-container-title">Can't see the video?</p>
<p>I don't know why, this video is only played using a Chromium based browser. 🤷‍♂️</p>
<p>Right click and download it.</p>
</div>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/05/usb_ethernet.jpg &quot;Do you know what USB device is it? Me neither.&quot;" type="image/"/>
    </item>
    <item>
      <title>Kotlin Multiplatform overview on macOS using Compose Multiplatform</title>
      <link>https://misapuntesde.com/2024/05/kotlin_multiplatform_overview_on_macos.html</link>
      <guid>https://misapuntesde.com/2024/05/kotlin_multiplatform_overview_on_macos.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Kotlin Multiplatform overview on macOS using Compose Multiplatform</source>
      <description>Kotlin Multiplatform overview on macOS using Compose Multiplatform</description>
      <category>Developer</category>
      <pubDate>Fri, 24 May 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/05/android_studio_run_android.png" alt="Android Studio with a Kotlin Multiplatform App" tabindex="0" loading="lazy"><figcaption>Android Studio with a Kotlin Multiplatform App</figcaption></figure>
<p>I must confess I'm not a very big fan of all products related with <em>Jetbrains</em>. All because its ecosystem is based on <em>Java</em>, and as a senior developer, we all hate <em>Java</em>. 🤣</p>
<p>Jokes aside, everybody is talking about <em>Kotlin Multiplatform</em>, so I decided to give it a try. This is a brief overview of the steps I followed to get started on <em>macOS</em> using <em>Compose Multiplatform</em> to build multiplatform apps. Is it worth it? Let's find out.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/05/android_studio_run_android.png &quot;Android Studio with a Kotlin Multiplatform App&quot;" type="image/"/>
    </item>
    <item>
      <title>Godot Engine to develop your own video games</title>
      <link>https://misapuntesde.com/2024/05/godot_engine_for_develop_videogames.html</link>
      <guid>https://misapuntesde.com/2024/05/godot_engine_for_develop_videogames.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Godot Engine to develop your own video games</source>
      <description>Godot Engine to develop your own video games</description>
      <category>Developer</category>
      <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/05/godot_logo.jpg" alt="Godot Engine Logo" tabindex="0" loading="lazy"><figcaption>Godot Engine Logo</figcaption></figure>
<p>I'm going to tell you a story.</p>
<p>One day, at my grandmother’s house, my father brought a device that was connected to the TV. It was a <strong>ZX Spectrum 48k</strong>. After plugging it in and watching them load the cassette tapes (with a sound that was a little weird) and playing on the TV, I fell in love with this new machine. I had already seen an <em>Atari</em> with the <em>Pong</em>, but this was another level.</p>
<p>What I didn’t expect was that my father would start typing some letters and numbers that came in the instruction manual, and a few hours later, a spaceship would appear shooting enemies coming down the screen... That completely <strong>changed my world</strong>. I no longer wanted to be an astronaut, <strong>I wanted to be a video game developer!</strong>.</p>
<hr>
<p>Movies like <em>Tron</em> and <em>War Games</em> didn’t help either. The point is, I’ve always had a concern about making video games, and I’ve done some games on <em>MSX</em> with <em>BASIC</em> and <em>PC (<a href="https://github.com/DIVGAMES/DIV-Games-Studio" target="_blank" rel="noopener noreferrer">DIV!</a>)</em> platform.</p>
<p>When I started growing up, the world of programming took me on other paths. I still have that thorn in my side, and a few months ago, I found out about all the excitement with <em>Unity</em>, and I thought again about an engine that caught my attention since it was released. I even did a talk in my hometown for a developer community. That engine is called <em>Godot Engine</em>, and today I want to talk about it if you don't know it and,... Who knows if I fulfill my dream of creating my own game!</p>
<h2>What is Godot Engine?</h2>
<figure><img src="/images/2024/05/godot_engine_capture.jpg" alt="Platform videogame demo" tabindex="0" loading="lazy"><figcaption>Platform videogame demo</figcaption></figure>
<p>Godot is a free and open source video game engine. It was created by <em>Juan Linietsky and Ariel Manzur</em> in 2007, and was released to the public in 2014. Today, it is maintained thanks to community donations and the support of some companies. The first thing that stands out is that to start working with it, you only need to download a file of a few megabytes (114 mb compared to the almost 16 GB of <em>Unity</em>!), and you can start to give it a go.</p>
<h3>Pros</h3>
<ul>
<li><strong>Free</strong>: There are no licenses or royalties, one of the reasons why many developers are switching to <em>Godot</em>.</li>
<li><strong>Open source</strong>: You can modify the source code and make <em>Pull Requests</em> so that we can all benefit.</li>
<li><strong>Cross-platform</strong>: You can create your games on <em>Windows, Linux and/or macOS</em>. Then the project can also be exported to <em>Android, iOS, HTML5 and consoles such as Playstation, Xbox and Nintendo Switch</em>. By the way, it supports <em>XR (VR)</em> and <em>ARM</em> processors.</li>
<li><strong>Programming language</strong>: You can program in <em>GDScript</em>, a programming language similar to <em>Python</em>, or in <em>C#/C++</em> among others (Have I seen <em>Rust</em> out there?).</li>
<li><strong>Community</strong>: Very active community, <em>Discord</em> and forums where you can resolve your questions.</li>
<li><strong>Assets Library</strong>: You don’t have to start from scratch. Visit the library where you can find <em>assets</em> visuals, sounds, music. **But remember! **: The <em>assets</em> are there to help you: don’t abuse them. Best of all, there are also tools that allow you to add functionality to <em>Godot</em>.</li>
</ul>
<h3>Cons</h3>
<ul>
<li><strong>Learning curve</strong>: <em>Godot</em> has a somewhat steep learning curve, especially if you do not have previous programming experience.</li>
<li><strong>Documentation</strong>: The documentation of <em>Godot</em> is not as extensive as that of other game engines, although the community is very active, especially after the bad decisions of <em>Unity</em> a year ago.</li>
<li><strong>Community</strong>: As I mentioned, the community is not as big as <em>Unity or Unreal Engine</em>, although it is growing more and more (<a href="https://godotengine.org/community/" target="_blank" rel="noopener noreferrer">+info</a>).</li>
<li><strong>Assets</strong>: Although there is a library of assets as I have already mentioned, it is not as abundant as in the engines of competition.</li>
</ul>
<h2>How to start programming in Godot?</h2>
<p>To start programming in <em>Godot</em>, the first thing you need to do is download the program from the <a href="https://godotengine.org/" target="_blank" rel="noopener noreferrer">official website</a>.</p>
<p>Once downloaded, install it on your computer and open it. You will see that the editor is very intuitive and with many options. Although it can be overwhelming so many choices,  don’t despair, everything has its function. You can start creating your first game from scratch, import one that you have already made or look at the examples that you can also download from the project menu.</p>
<p>I recommend, if you have no experience, that you start with the tutorials that are in the <a href="https://docs.godotengine.org/en/stable/getting_started/introduction" target="_blank" rel="noopener noreferrer">official website</a>. You can also search for tutorials in <em>YouTube</em> or blogs. I leave you some links at the end of the post.</p>
<h3>Tips</h3>
<ul>
<li><strong>Start with something simple</strong>: Don’t try to make a very complex game from the start. As with any working tool, you have to get experience. Go slowly. I would start with a platform game. Try following a tutorial like <a href="https://www.youtube.com/watch?v=u2fwxuHZXIA" target="_blank" rel="noopener noreferrer">this one</a> from <em>Youtuber @wye</em> to recreate <em>Super Mario World</em> and then modify it to your liking.</li>
<li><strong>Try everything Godot can do for you</strong>: <em>Godot</em> has many features that can save you time and effort. Try as much as you can and learn to use its options. Start by testing the mechanics, <em>nodes</em> and <em>scripts</em>. Then go for the physics and animations before embarking on a game of your own.</li>
<li><strong>Patience</strong>: Making a game is tedious, difficult, time-consuming, and requires a lot of patience. Don’t despair if it doesn’t come out right away. Try, fail, learn and try again. Set small goals and see them accomplished little by little.</li>
<li><strong>Learn from the community</strong>: <em>Youtube, Discord, forums,...</em> The <em>Godot</em> community is very active and can help you resolve your questions. Don’t be afraid to ask if you don’t understand something. Learn from others by reading code and understand what you intend to do, surely someone has solved the problem you are having with your game before you.</li>
</ul>
<h2>Final words</h2>
<p>I just wanted to share with you my adoration for <em>Godot Engine</em>, and encourage you to try it if you have ever felt like me, and you have a desire to create video games. Do not pretend to get rich either or base your careers on it (for now). You do not need to have previous programming knowledge (although it helps). You can always start with tutorials and gradually go forward. If you want to create a game, tell me, I’d love to see it. 😉</p>
<h2>Resources</h2>
<h3>Youtube</h3>
<ul>
<li>
<p><a href="https://www.youtube.com/watch?v=LOhfqjmasi0" target="_blank" rel="noopener noreferrer">Brackeys &gt; How to make a Video Game - Godot Beginner Tutorial</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/@Leedeo/playlists" target="_blank" rel="noopener noreferrer">Leedeo Studio &gt; Playlists</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/@Gdquest/playlists" target="_blank" rel="noopener noreferrer">GDQuest &gt; Playlists</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/@BastiaanOlij/playlists" target="_blank" rel="noopener noreferrer">Bastiaan Olij &gt; Playlists</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/@dev-worm/videos" target="_blank" rel="noopener noreferrer">DevWorm &gt; Playlists</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/@MalcolmANixon/videos" target="_blank" rel="noopener noreferrer">Marcolm Nixon &gt; Playlists</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/@legiongames2400/videos" target="_blank" rel="noopener noreferrer">LegionGames &gt; Playlists</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=-FQNPCB7e3s" target="_blank" rel="noopener noreferrer">MrElipteach &gt; 10+2 AWESOME ADDONS for GODOT 4</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/@mrelipteach/playlists" target="_blank" rel="noopener noreferrer">MrElipteach &gt; Playlists</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/@gamefromscratch/videos" target="_blank" rel="noopener noreferrer">Gamefromscratch &gt; Playlists</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/@CodingQuests/videos" target="_blank" rel="noopener noreferrer">Coding Quests &gt; Playlists</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/@uheartbeast/playlists" target="_blank" rel="noopener noreferrer">Heartbeast &gt; Playlists</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=tO2gthp45MA" target="_blank" rel="noopener noreferrer">Lukky &gt; All 219 Godot Nodes Explained In 42 Minutes</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=3iGHpha-DmE" target="_blank" rel="noopener noreferrer">StayAtHomeDev &gt; Do THIS Before You Publish Your Godot Game</a></p>
</li>
</ul>
<h3>XR (VR)</h3>
<ul>
<li>
<p><a href="https://www.youtube.com/watch?v=fxZoXfX4oBo&amp;list=PLfX6C2dxVyLxXl3gJwakzdqRaV7WKlqFR" target="_blank" rel="noopener noreferrer">Muddy Wolf &gt; Setting up the XR Origin - Build a VR Game in Godot List</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=7XWyZblSnZA" target="_blank" rel="noopener noreferrer">Boon Makes Games &gt; Setting up XR/VR on Godot 4 | First Impressions, Passthrough, Hand tracking</a></p>
</li>
<li>
<p><a href="https://www.youtube.com/watch?v=9gM70XjKgOE&amp;list=PLW-dunxSEhi-WaCz11YABR5UME8RD2zfE" target="_blank" rel="noopener noreferrer">Blekoh &gt; Making my Indie VR Game</a></p>
</li>
</ul>
<h3>Documentation, resources and blogs</h3>
<ul>
<li>
<p><a href="https://www.gdquest.com/tutorial/godot/" target="_blank" rel="noopener noreferrer">gdquest.com &gt; Godot tutorials</a></p>
</li>
<li>
<p><a href="https://docs.godotengine.org/en/stable/tutorials/xr/index.html" target="_blank" rel="noopener noreferrer">docs.godotengine.org &gt; XR</a></p>
</li>
<li>
<p><a href="https://godotshaders.com" target="_blank" rel="noopener noreferrer">Godot Shaders</a></p>
</li>
</ul>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/05/godot_logo.jpg &quot;Godot Engine Logo&quot;" type="image/"/>
    </item>
    <item>
      <title>SOLID principles PHP Edition. Today, Dependency Inversion Principle</title>
      <link>https://misapuntesde.com/2024/04/solid_principles_php_edition_dependency_inversion_principle.html</link>
      <guid>https://misapuntesde.com/2024/04/solid_principles_php_edition_dependency_inversion_principle.html</guid>
      <source url="https://misapuntesde.com/rss.xml">SOLID principles PHP Edition. Today, Dependency Inversion Principle</source>
      <description>SOLID principles PHP Edition. Today, Dependency Inversion Principle</description>
      <category>Developer</category>
      <pubDate>Tue, 23 Apr 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/04/dep_injection.jpg" alt="Horse on top of stones with humans on the ground" tabindex="0" loading="lazy"><figcaption> Dependency Inversion Principle. Generated with AI and modified later.</figcaption></figure>
<p>Finally, we reach the last principle of the <strong>SOLID</strong> series. The <strong>Dependency Inversion Principle</strong> is the most complex of all, but I'll try to explain it in a simple way.</p>
<p>I remember being asked about this principle in a recent job interview and I did not know what to say. Many times you know what it is by concept, but explaining it with an example is hard. If it happens to you, the best thing to do is to be honest and say so. It's okay and the interviewer will appreciate it.</p>
<hr>
<p>Let's review all the principles we have seen:</p>
<ul>
<li><em><a href="https://misapuntesde.com/2024/03/solid_principles_php_edition_single_responsibility_principle.html" target="_blank" rel="noopener noreferrer">Single Responsibility Principle</a></em>: A class should have only one reason to change.</li>
<li><em><a href="https://misapuntesde.com/2024/03/solid_principles_php_edition_open_closed_principle.html" target="_blank" rel="noopener noreferrer">Open/Closed Principle</a></em>: A class should be open for extension but closed for modification.</li>
<li><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_liskov_substitution_principle.html" target="_blank" rel="noopener noreferrer">Liskov Substitution Principle</a>: You should be able to use any subclass in place of its parent class.</li>
<li><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_interface_segregation_principle.html" target="_blank" rel="noopener noreferrer">Interface Segregation Principle</a>: A class should not be forced to implement an interface it doesn't use.</li>
<li><strong>Dependency Inversion Principle</strong>: High-level modules should not depend on low-level modules. Both should depend on abstractions.</li>
</ul>
<p>The <strong>Dependency Inversion Principle</strong> states that <mark>high-level modules should not depend on low-level modules. Both should depend on abstractions</mark>. Also, abstractions should not depend on details. Details should depend on abstractions. A lot of words, I know, but we'll look at it right now. Besides, I think this principle is the one that will help you the most in the long run.</p>
<p>Let's see some examples to better understand it:</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token comment">// Bad</span></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">MySQLConnection</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"Database connection"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">PasswordReminder</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">private</span> <span class="token variable">$dbConnection</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">MySQLConnection</span> <span class="token variable">$dbConnection</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">dbConnection</span> <span class="token operator">=</span> <span class="token variable">$dbConnection</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>In this example, the <code>PasswordReminder</code> class depends on the <code>MySQLConnection</code> class. If you want to change the database connection to another type, you will have to modify the <code>PasswordReminder</code> class. This violates the <strong>Dependency Inversion Principle</strong>.</p>
<p>To solve this, you can use an interface:</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">DBConnectionInterface</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token comment"># The MySQLConnection class implements this interface, providing its own implementation of the connect() method.</span></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">MySQLConnection</span> <span class="token keyword">implements</span> <span class="token class-name">DBConnectionInterface</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">connect</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"Database connection"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">PasswordReminder</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">private</span> <span class="token variable">$dbConnection</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">DBConnectionInterface</span> <span class="token variable">$dbConnection</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">dbConnection</span> <span class="token operator">=</span> <span class="token variable">$dbConnection</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Now, the <code>PasswordReminder</code> class depends on the <code>DBConnectionInterface</code> interface, not on the <code>MySQLConnection</code> class. If you want to change the database connection, you only need to create a new class that implements the <code>DBConnectionInterface</code> interface. This makes <code>PasswordReminder</code> more flexible and less coupled to a specific database connection implementation.</p>
<p>Do you not find it easy? Let's see another example:</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">StorageInterface</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">save</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">FileStorage</span> <span class="token keyword">implements</span> <span class="token class-name">StorageInterface</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">save</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token comment">// Save data to a file</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">DatabaseStorage</span> <span class="token keyword">implements</span> <span class="token class-name">StorageInterface</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">save</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token comment">// Save data to a database</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">UserController</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">private</span> <span class="token variable">$storage</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token class-name type-declaration">StorageInterface</span> <span class="token variable">$storage</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">storage</span> <span class="token operator">=</span> <span class="token variable">$storage</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">store</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">storage</span><span class="token operator">-></span><span class="token function">save</span><span class="token punctuation">(</span><span class="token variable">$data</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token variable">$fileStorage</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">FileStorage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$userController</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">UserController</span><span class="token punctuation">(</span><span class="token variable">$fileStorage</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$userController</span><span class="token operator">-></span><span class="token function">store</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Some data"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>In this example, the <code>UserController</code> class depends on the <code>StorageInterface</code> interface, not on the <code>FileStorage</code> or <code>DatabaseStorage</code> classes. This allows you to easily change the storage type without having to modify the <code>UserController</code> class.</p>
<p>We also note that <code>UserController</code> does not know how information is stored (details), it only knows that it is stored. The <code>DatabaseStorage</code> and <code>FileStorage</code> classes are the details and depend on the <code>StorageInterface</code> abstraction.</p>
<p>I hope you have enjoyed the last article about <strong>SOLID</strong> principles. In the future, I plan to investigate other design patterns.</p>
<p>Stay tuned! 😄</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/04/dep_injection.jpg &quot; Dependency Inversion Principle. Generated with AI and modified later.&quot;" type="image/"/>
    </item>
    <item>
      <title>SOLID principles PHP Edition. Today, Interface Segregation Principle</title>
      <link>https://misapuntesde.com/2024/04/solid_principles_php_edition_interface_segregation_principle.html</link>
      <guid>https://misapuntesde.com/2024/04/solid_principles_php_edition_interface_segregation_principle.html</guid>
      <source url="https://misapuntesde.com/rss.xml">SOLID principles PHP Edition. Today, Interface Segregation Principle</source>
      <description>SOLID principles PHP Edition. Today, Interface Segregation Principle</description>
      <category>Developer</category>
      <pubDate>Wed, 10 Apr 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/04/interface.jpg" alt="flying eagles and penguins" tabindex="0" loading="lazy"><figcaption>Interface Segregation Principle. Generated with AI.</figcaption></figure>
<p>We are almost ending the series of articles about the <strong>SOLID</strong> principles. Here you have a brief explanation of each principle to review them:</p>
<hr>
<ul>
<li><em><a href="https://misapuntesde.com/2024/03/solid_principles_php_edition_single_responsibility_principle.html" target="_blank" rel="noopener noreferrer">Single Responsibility Principle</a></em>: A class should have only one reason to change.</li>
<li><em><a href="https://misapuntesde.com/2024/03/solid_principles_php_edition_open_closed_principle.html" target="_blank" rel="noopener noreferrer">Open/Closed Principle</a></em>: A class should be open for extension but closed for modification.</li>
<li><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_liskov_substitution_principle.html" target="_blank" rel="noopener noreferrer">Liskov Substitution Principle</a>: You should be able to use any subclass in place of its parent class.</li>
<li><strong>Interface Segregation Principle</strong>: A class should not be forced to implement an interface it doesn't use.</li>
<li><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_dependency_inversion_principle.html" target="_blank" rel="noopener noreferrer">Dependency Inversion Principle</a>: High-level modules should not depend on low-level modules. Both should depend on abstractions.</li>
</ul>
<p>Today we are going to focus on the <strong>Interface Segregation Principle</strong>. It's very easy to understand, I promise. ❤️</p>
<p>This principle states that <mark>a class should never be forced to implement an interface that it doesn't use</mark>. If you implement an interface in a class, but only utilize a few of its methods, It indicates that you are violating this principle. An Example:</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token comment">// Bad</span></span>
<span class="line"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Bird</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">swim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Eagle</span> <span class="token keyword">implements</span> <span class="token class-name">Bird</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can fly"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">swim</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">&lt;</span><span class="token operator">-</span> Forced to implement a method that it does not need</span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can't swim"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Penguin</span> <span class="token keyword">implements</span> <span class="token class-name">Bird</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">&lt;</span><span class="token operator">-</span> Forced to implement a method that it does not need</span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can't fly"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">swim</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can swim"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>In this example, the <code>Bird</code> interface has two methods: <code>fly</code> and <code>swim</code>.</p>
<p>The <code>Eagle</code> and the <code>Penguin</code> classes implements both methods, but the <code>Penguin</code> class only should implements the <code>swim</code> method (Have you ever seen a penguin flying?), and <code>Eagle</code> should implement the <code>fly</code> method. This violates the <em>Interface Segregation Principle</em>.</p>
<p>An example with the correct way to implement the <em>Interface Segregation Principle</em>:</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token comment">// Good</span></span>
<span class="line"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Bird</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Swimmer</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">swim</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Eagle</span> <span class="token keyword">implements</span> <span class="token class-name">Bird</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can fly"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Penguin</span> <span class="token keyword">implements</span> <span class="token class-name">Swimmer</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">swim</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can swim"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Now we have two interfaces: <code>Bird</code> and <code>Swimmer</code>. The <code>Eagle</code> class implements the <code>Bird</code> interface, and the <code>Penguin</code> class implements the <code>Swimmer</code> interface. This way, we are following the principle we are discussing. Easy, right?. 😄</p>
<p>I hope you have enjoyed the article today. If you have any questions or suggestions, in the meantime I add comments to the blog, you can send me an <a href="mailto:ulysess@gmail.com" target="_blank" rel="noopener noreferrer">email</a>.</p>
<p>See you in the next article!.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/04/interface.jpg &quot;Interface Segregation Principle. Generated with AI.&quot;" type="image/"/>
    </item>
    <item>
      <title>One line command for download latest Raspberry Pi OS image</title>
      <link>https://misapuntesde.com/2024/04/one_line_command_for_download_latest_raspberry_pi_os_image.html</link>
      <guid>https://misapuntesde.com/2024/04/one_line_command_for_download_latest_raspberry_pi_os_image.html</guid>
      <source url="https://misapuntesde.com/rss.xml">One line command for download latest Raspberry Pi OS image</source>
      <description>One line command for download latest Raspberry Pi OS image</description>
      <category>Raspberry Pi</category>
      <pubDate>Tue, 09 Apr 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/04/rpios_dload.png" alt="Download Raspberry Pi OS from Terminal" tabindex="0" loading="lazy"><figcaption>Download Raspberry Pi OS from Terminal</figcaption></figure>
<p>I like to use Terminal for everything (I'm an old school man). Check how I download the latest version of the <em>Raspberry Pi OS for aarch64</em> (It's what I use), with the next command:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token function">curl</span> <span class="token parameter variable">-s</span> https://downloads.raspberrypi.org/operating-systems-categories.json <span class="token operator">|</span> jq <span class="token parameter variable">-r</span> <span class="token string">'.[0].images[0].urlHttp'</span> <span class="token operator">|</span> <span class="token function">xargs</span> axel <span class="token parameter variable">-n</span> <span class="token number">4</span> <span class="token parameter variable">-k</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>As you can see, I'm using curl, <a href="https://jqlang.github.io/jq/" target="_blank" rel="noopener noreferrer">jq</a> to read the json file &amp; <a href="https://github.com/axel-download-accelerator/axel" target="_blank" rel="noopener noreferrer">axel</a> as a download manager, because is the fastest method, but you can change it with its arguments.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/04/rpios_dload.png &quot;Download Raspberry Pi OS from Terminal&quot;" type="image/"/>
    </item>
    <item>
      <title>SOLID principles PHP Edition. Today, Open/Closed Principle</title>
      <link>https://misapuntesde.com/2024/03/solid_principles_php_edition_open_closed_principle.html</link>
      <guid>https://misapuntesde.com/2024/03/solid_principles_php_edition_open_closed_principle.html</guid>
      <source url="https://misapuntesde.com/rss.xml">SOLID principles PHP Edition. Today, Open/Closed Principle</source>
      <description>SOLID principles PHP Edition. Today, Open/Closed Principle</description>
      <category>Developer</category>
      <pubDate>Fri, 22 Mar 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/03/open_close.jpg" alt="Open/Closed Principle" tabindex="0" loading="lazy"><figcaption>Open/Closed Principle. Generated with AI.</figcaption></figure>
<p>Today, let's focus on the <strong>Open/Closed Principle</strong>.</p>
<hr>
<p>First of all, here you have the four principles of SOLID:</p>
<ul>
<li><em><a href="https://misapuntesde.com/2024/03/solid_principles_php_edition_single_responsibility_principle.html" target="_blank" rel="noopener noreferrer">Single Responsibility Principle</a></em>: A class should have only one reason to change.</li>
<li><strong>Open/Closed Principle</strong>: A class should be open for extension but closed for modification.</li>
<li><em><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_liskov_substitution_principle.html" target="_blank" rel="noopener noreferrer">Liskov Substitution Principle</a></em>: You should be able to use any subclass in place of its parent class.</li>
<li><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_interface_segregation_principle.html" target="_blank" rel="noopener noreferrer">Interface Segregation Principle</a>: A class should not be forced to implement an interface it doesn't use.</li>
<li><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_dependency_inversion_principle.html" target="_blank" rel="noopener noreferrer">Dependency Inversion Principle</a>: High-level modules should not depend on low-level modules. Both should depend on abstractions.</li>
</ul>
<p>The <em>Open/Closed</em> principle states that <em>&quot;software entities (classes, modules, functions, etc.) must be open for extension, but closed for modification&quot;</em>. So, once a software entity is developed and tested, it should be possible to extend its behavior without having to modify its source code.</p>
<p>Look the following code:</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Rectangle</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token variable">$width</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token variable">$height</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$width</span><span class="token punctuation">,</span> <span class="token variable">$height</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">width</span> <span class="token operator">=</span> <span class="token variable">$width</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">height</span> <span class="token operator">=</span> <span class="token variable">$height</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Circle</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token variable">$radius</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$radius</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">radius</span> <span class="token operator">=</span> <span class="token variable">$radius</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">AreaCalculator</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">calculate</span><span class="token punctuation">(</span><span class="token variable">$shapes</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$area</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$shapes</span> <span class="token keyword">as</span> <span class="token variable">$shape</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$shape</span> <span class="token keyword">instanceof</span> <span class="token class-name">Rectangle</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$area</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$shape</span><span class="token operator">-></span><span class="token property">width</span> <span class="token operator">*</span> <span class="token variable">$shape</span><span class="token operator">-></span><span class="token property">height</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span> <span class="token keyword">elseif</span> <span class="token punctuation">(</span><span class="token variable">$shape</span> <span class="token keyword">instanceof</span> <span class="token class-name">Circle</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$area</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$shape</span><span class="token operator">-></span><span class="token property">radius</span> <span class="token operator">*</span> <span class="token variable">$shape</span><span class="token operator">-></span><span class="token property">radius</span> <span class="token operator">*</span> <span class="token function">pi</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">      <span class="token punctuation">}</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">return</span> <span class="token function">array_sum</span><span class="token punctuation">(</span><span class="token variable">$area</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>In this example, if you wanted to add a new form, you would have to modify the <code>AreaCalculator</code> class and add a new condition in the <code>calculate</code>method. In other words, Open/Closed principle said that <mark>you should be able to add new functionality to a class without modifying it</mark>.</p>
<p>The example above violates the <em>Open/Closed principle</em>.</p>
<p>A better way to do this would be to define a <code>area</code> method in each form and then call that method in <code>AreaCalculator</code>:</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Shape</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">area</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Rectangle</span> <span class="token keyword">implements</span> <span class="token class-name">Shape</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token variable">$width</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token variable">$height</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$width</span><span class="token punctuation">,</span> <span class="token variable">$height</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">width</span> <span class="token operator">=</span> <span class="token variable">$width</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">height</span> <span class="token operator">=</span> <span class="token variable">$height</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">area</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">width</span> <span class="token operator">*</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">height</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Circle</span> <span class="token keyword">implements</span> <span class="token class-name">Shape</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token variable">$radius</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$radius</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">radius</span> <span class="token operator">=</span> <span class="token variable">$radius</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">area</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">radius</span> <span class="token operator">*</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">radius</span> <span class="token operator">*</span> <span class="token function">pi</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">AreaCalculator</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">calculate</span><span class="token punctuation">(</span><span class="token variable">$shapes</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token variable">$area</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$shapes</span> <span class="token keyword">as</span> <span class="token variable">$shape</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">      <span class="token variable">$area</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$shape</span><span class="token operator">-></span><span class="token function">area</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">return</span> <span class="token function">array_sum</span><span class="token punctuation">(</span><span class="token variable">$area</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Now, if you wanted to add a new form, you would just have to create a new class that implements the <code>Shape</code> interface and defines the <code>area</code> method. The <code>AreaCalculator</code> class would not have to be modified to accommodate the new form. Therefore, it would comply with the <em>Open/Closed</em> principle.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/03/open_close.jpg &quot;Open/Closed Principle. Generated with AI.&quot;" type="image/"/>
    </item>
    <item>
      <title>SOLID principles PHP Edition. Today, Liskov Substitution Principle</title>
      <link>https://misapuntesde.com/2024/04/solid_principles_php_edition_liskov_substitution_principle.html</link>
      <guid>https://misapuntesde.com/2024/04/solid_principles_php_edition_liskov_substitution_principle.html</guid>
      <source url="https://misapuntesde.com/rss.xml">SOLID principles PHP Edition. Today, Liskov Substitution Principle</source>
      <description>SOLID principles PHP Edition. Today, Liskov Substitution Principle</description>
      <category>Developer</category>
      <pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/04/liskov.jpg" alt="Liskov Substitution Principle" tabindex="0" loading="lazy"><figcaption>Liskov Substitution Principle. Generated with AI.</figcaption></figure>
<p>In the noble art of coding, you should remember the <strong>SOLID principles</strong> always. Sometimes, I forget some of them, so here is a brief explanation of each principle:</p>
<hr>
<ul>
<li><em><a href="https://misapuntesde.com/2024/03/solid_principles_php_edition_single_responsibility_principle.html" target="_blank" rel="noopener noreferrer">Single Responsibility Principle</a></em>: A class should have only one reason to change.</li>
<li><em><a href="https://misapuntesde.com/2024/03/solid_principles_php_edition_open_closed_principle.html" target="_blank" rel="noopener noreferrer">Open/Closed Principle</a></em>: A class should be open for extension but closed for modification.</li>
<li><strong>Liskov Substitution Principle</strong>: You should be able to use any subclass in place of its parent class.</li>
<li><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_interface_segregation_principle.html" target="_blank" rel="noopener noreferrer">Interface Segregation Principle</a>: A class should not be forced to implement an interface it doesn't use.</li>
<li><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_dependency_inversion_principle.html" target="_blank" rel="noopener noreferrer">Dependency Inversion Principle</a>: High-level modules should not depend on low-level modules. Both should depend on abstractions.</li>
</ul>
<p>Today we are going to focus on the <strong>Liskov Substitution Principle</strong>.</p>
<p>This principle states that <em>&quot;functions that use pointers or references to base classes must be able to use objects of a derived class without knowing it&quot;</em>.</p>
<p>In other words, <mark>derived classes must be completely substitutable for their base classes</mark>. If a derived class cannot be substituted for a base class, then the class hierarchy is not well designed and violates <em>Liskov's substitution principle</em>.</p>
<p>Here you have an example on <em>PHP</em> about it:</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token comment">// Bad</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Bird</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can fly"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Penguin</span> <span class="token keyword">extends</span> <span class="token class-name">Bird</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can't fly"</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function-definition function">letItFly</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Bird</span> <span class="token variable">$bird</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token variable">$bird</span><span class="token operator">-></span><span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">echo</span> <span class="token function">letItFly</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Bird</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "I can fly"</span></span>
<span class="line"><span class="token keyword">echo</span> <span class="token function">letItFly</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Penguin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "I can't fly"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>In this example, <code>Penguin</code> is a subclass of <code>Bird</code>. However, not all birds can fly, so when we try to make a <code>Penguin</code> fly, we get an unexpected result. This violates <em>Liskov's substitution principle</em>.</p>
<p>A better way to do this would be to have a <code>Bird</code> base class and a <code>Flyable interface</code> that only implement birds that can fly:</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Bird</span> <span class="token punctuation">{</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Flyable</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Sparrow</span> <span class="token keyword">extends</span> <span class="token class-name">Bird</span> <span class="token keyword">implements</span> <span class="token class-name">Flyable</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can fly"</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Penguin</span> <span class="token keyword">extends</span> <span class="token class-name">Bird</span> <span class="token punctuation">{</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function-definition function">letItFly</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Flyable</span> <span class="token variable">$bird</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">return</span> <span class="token variable">$bird</span><span class="token operator">-></span><span class="token function">fly</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">echo</span> <span class="token function">letItFly</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Sparrow</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "I can fly"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>In this example, if we try to fly a <code>Penguin</code>, we will get a compile-time error, because <code>Penguin</code> does not implement the <code>Flyable</code> interface.</p>
<p>Another example:</p>
<div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token comment">// Bad</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Animal</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can eat"</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Lion</span> <span class="token keyword">extends</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can eat meat"</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Rabbit</span> <span class="token keyword">extends</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can eat vegetables"</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Plant</span> <span class="token keyword">extends</span> <span class="token class-name">Animal</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">throw</span> <span class="token keyword">new</span> <span class="token class-name">Exception</span><span class="token punctuation">(</span><span class="token string double-quoted-string">"Plants do not eat"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function-definition function">feed</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Animal</span> <span class="token variable">$animal</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">return</span> <span class="token variable">$animal</span><span class="token operator">-></span><span class="token function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">echo</span> <span class="token function">feed</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Lion</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "I can eat meat"</span></span>
<span class="line"><span class="token keyword">echo</span> <span class="token function">feed</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Rabbit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "I can eat vegetables"</span></span>
<span class="line"><span class="token keyword">echo</span> <span class="token function">feed</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Plant</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// Exception: Plants do not eat</span></span>
<span class="line"></span>
<span class="line"><span class="token comment">// Good</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">LivingEntity</span> <span class="token punctuation">{</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">interface</span> <span class="token class-name-definition class-name">Eatable</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Lion</span> <span class="token keyword">extends</span> <span class="token class-name">LivingEntity</span> <span class="token keyword">implements</span> <span class="token class-name">Eatable</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can eat meat"</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Rabbit</span> <span class="token keyword">extends</span> <span class="token class-name">LivingEntity</span> <span class="token keyword">implements</span> <span class="token class-name">Eatable</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">return</span> <span class="token string double-quoted-string">"I can eat vegetables"</span><span class="token punctuation">;</span></span>
<span class="line">  <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Plant</span> <span class="token keyword">extends</span> <span class="token class-name">LivingEntity</span> <span class="token punctuation">{</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">function</span> <span class="token function-definition function">feed</span><span class="token punctuation">(</span><span class="token class-name type-declaration">Eatable</span> <span class="token variable">$entity</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">  <span class="token keyword">return</span> <span class="token variable">$entity</span><span class="token operator">-></span><span class="token function">eat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">echo</span> <span class="token function">feed</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Lion</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "I can eat meat"</span></span>
<span class="line"><span class="token keyword">echo</span> <span class="token function">feed</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Rabbit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// "I can eat vegetables"</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>I hope we understood it. See you in the next principle!.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/04/liskov.jpg &quot;Liskov Substitution Principle. Generated with AI.&quot;" type="image/"/>
    </item>
    <item>
      <title>SOLID principles PHP Edition. Today, Single Responsibility Principle</title>
      <link>https://misapuntesde.com/2024/03/solid_principles_php_edition_single_responsibility_principle.html</link>
      <guid>https://misapuntesde.com/2024/03/solid_principles_php_edition_single_responsibility_principle.html</guid>
      <source url="https://misapuntesde.com/rss.xml">SOLID principles PHP Edition. Today, Single Responsibility Principle</source>
      <description>SOLID principles PHP Edition. Today, Single Responsibility Principle</description>
      <category>Developer</category>
      <pubDate>Wed, 20 Mar 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/03/solid.jpg" alt="Single Responsibility Principle" tabindex="0" loading="lazy"><figcaption>Single Responsibility Principle. Generated with AI.</figcaption></figure>
<p>In the noble art of coding, you should remember the <strong>SOLID principles</strong> always. Here is a brief explanation of each principle:</p>
<hr>
<ul>
<li><strong>Single Responsibility Principle</strong>: A class should have only one reason to change.</li>
<li><em><a href="https://misapuntesde.com/2024/03/solid_principles_php_edition_open_closed_principle.html" target="_blank" rel="noopener noreferrer">Open/Closed Principle</a></em>: A class should be open for extension but closed for modification.</li>
<li><em><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_liskov_substitution_principle.html" target="_blank" rel="noopener noreferrer">Liskov Substitution Principle</a></em>: You should be able to use any subclass in place of its parent class.</li>
<li><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_interface_segregation_principle.html" target="_blank" rel="noopener noreferrer">Interface Segregation Principle</a>: A class should not be forced to implement an interface it doesn't use.</li>
<li><a href="https://misapuntesde.com/2024/04/solid_principles_php_edition_dependency_inversion_principle.html" target="_blank" rel="noopener noreferrer">Dependency Inversion Principle</a>: High-level modules should not depend on low-level modules. Both should depend on abstractions.</li>
</ul>
<p>Today we are going to focus on the <strong>Single Responsibility Principle</strong>.</p>
<p>Here you have an example on <em>PHP</em> about it:</p>
<div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="Order class">
    <span>Order class</span>
  </div>
  <div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Order</span></span>
<span class="line"><span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">private</span> <span class="token variable">$items</span> <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">addItem</span><span class="token punctuation">(</span><span class="token variable">$item</span><span class="token punctuation">)</span></span>
<span class="line">    <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">items</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token variable">$item</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">calculateTotal</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$total</span> <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token keyword">foreach</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">items</span> <span class="token keyword">as</span> <span class="token variable">$item</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line">            <span class="token variable">$total</span> <span class="token operator">+=</span> <span class="token variable">$item</span><span class="token operator">-></span><span class="token function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token punctuation">}</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token variable">$total</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div><div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="Item class">
    <span>Item class</span>
  </div>
  <div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token keyword">class</span> <span class="token class-name-definition class-name">Item</span></span>
<span class="line"><span class="token punctuation">{</span></span>
<span class="line">    <span class="token keyword">private</span> <span class="token variable">$name</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token keyword">private</span> <span class="token variable">$price</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">__construct</span><span class="token punctuation">(</span><span class="token variable">$name</span><span class="token punctuation">,</span> <span class="token variable">$price</span><span class="token punctuation">)</span></span>
<span class="line">    <span class="token punctuation">{</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">name</span> <span class="token operator">=</span> <span class="token variable">$name</span><span class="token punctuation">;</span></span>
<span class="line">        <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">price</span> <span class="token operator">=</span> <span class="token variable">$price</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"></span>
<span class="line">    <span class="token keyword">public</span> <span class="token keyword">function</span> <span class="token function-definition function">getPrice</span><span class="token punctuation">(</span><span class="token punctuation">)</span></span>
<span class="line">    <span class="token punctuation">{</span></span>
<span class="line">        <span class="token keyword">return</span> <span class="token variable">$this</span><span class="token operator">-></span><span class="token property">price</span><span class="token punctuation">;</span></span>
<span class="line">    <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div><div class="code-block-with-title">
  <div class="code-block-title-bar" data-title="Usage">
    <span>Usage</span>
  </div>
  <div class="language-php line-numbers-mode" data-highlighter="prismjs" data-ext="php"><pre><code class="language-php"><span class="line"><span class="token variable">$item1</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Item</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Taco'</span><span class="token punctuation">,</span> <span class="token number">2.99</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$item2</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Item</span><span class="token punctuation">(</span><span class="token string single-quoted-string">'Burrito'</span><span class="token punctuation">,</span> <span class="token number">4.99</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token variable">$order</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Order</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$order</span><span class="token operator">-></span><span class="token function">addItem</span><span class="token punctuation">(</span><span class="token variable">$item1</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token variable">$order</span><span class="token operator">-></span><span class="token function">addItem</span><span class="token punctuation">(</span><span class="token variable">$item2</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span>
<span class="line"><span class="token variable">$total</span> <span class="token operator">=</span> <span class="token variable">$order</span><span class="token operator">-></span><span class="token function">calculateTotal</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">echo</span> <span class="token string double-quoted-string">"Total: $"</span> <span class="token operator">.</span> <span class="token variable">$total</span><span class="token punctuation">;</span> <span class="token comment">// Total: $7.98</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>
</div><p>The <em>Single Responsibility Principle (SRP)</em> states that a class must have only one reason to change. This means that <mark>a class must have only one responsibility and must have no more than one reason to be modified</mark>.</p>
<p>In the code above, we can identify two classes: <em>Order and Item</em>. These classes follow the principle of single responsibility, as <strong>each has a single responsibility</strong> and has no more than one reason to change.</p>
<p>The <em>Order</em> class is responsible for representing an order and performing operations related to it, such as adding elements to the order and calculating the total, and handle the logic of the order.</p>
<p>The <em>Item</em> class represents an item and provides methods for obtaining its price. It has the responsibility to represent an article and provide information about it.</p>
<p>As we can see, each class <strong>has a unique responsibility</strong> and there is no mix of features in any of them.</p>
<p>This is beneficial because if in the future we need to make changes in the logic of the order, we just need to modify the <em>Order</em> class. Similarly, if we need to make changes in the representation or behavior of an article, we just need to modify the <em>Item</em> class. This facilitates code maintenance and reduces the risk of errors when making changes.</p>
<p>I hope this example helps you to understand the principle of single responsibility and how to apply it in your code.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/03/solid.jpg &quot;Single Responsibility Principle. Generated with AI.&quot;" type="image/"/>
    </item>
    <item>
      <title>Dependency injection pattern explained like you&amp;apos;re 5</title>
      <link>https://misapuntesde.com/2024/03/dependency_injection_pattern_explained_like_you_are_5.md.html</link>
      <guid>https://misapuntesde.com/2024/03/dependency_injection_pattern_explained_like_you_are_5.md.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Dependency injection pattern explained like you&amp;apos;re 5</source>
      <description>Dependency injection pattern explained like you&amp;apos;re 5</description>
      <category>Developer</category>
      <pubDate>Tue, 19 Mar 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/03/turkey.png" alt="dep injection" tabindex="0" loading="lazy"><figcaption>Why did I choose that example for explaining dependency injection?. Generated with AI.</figcaption></figure>
<p>Today I was asked this question in a job interview, and I found it to be a very simple way to explain dependency injection. Here's the explanation I gave, a bit more detailed (I'm sure it blew my interviewer's mind):</p>
<hr>
<p>Imagine you're preparing a turkey for a special dinner. The turkey needs to be stuffed to have a delicious flavor. You could put the stuffing directly inside the turkey, but that would limit your options. If you wanted to change the stuffing, you would have to take out the entire turkey and start over.</p>
<p>Instead, you decide to use a bag for the stuffing. You put the stuffing in the bag and then put the bag inside the turkey. Now, if you ever want to change the stuffing, you can simply take out the bag and put in a new one with a different stuffing. You don't need to dismantle the whole turkey.</p>
<p>In programming, &quot;dependency injection&quot; is like using the bag for the stuffing. Instead of putting the dependencies (the stuffing) directly in your code (the turkey), you put them in something that can be easily changed (the bag). This makes your code more flexible and easier to change or reuse in the future.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/03/turkey.png &quot;Why did I choose that example for explaining dependency injection?. Generated with AI.&quot;" type="image/"/>
    </item>
    <item>
      <title>Prompts for improving your texts using Artificial Intelligence</title>
      <link>https://misapuntesde.com/2024/03/prompts_for_improve_your_texts_using_ai.html</link>
      <guid>https://misapuntesde.com/2024/03/prompts_for_improve_your_texts_using_ai.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Prompts for improving your texts using Artificial Intelligence</source>
      <description>Prompts for improving your texts using Artificial Intelligence</description>
      <category>General</category>
      <pubDate>Tue, 12 Mar 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/03/ai_writing.png" alt="I'm the good guy... for now" tabindex="0" loading="lazy"><figcaption>I'm the good guy... for now. Generated with AI.</figcaption></figure>
<p>All prompts are extracted from the app <a href="https://fixkey.app/" target="_blank" rel="noopener noreferrer">Fixkey</a>. It's an app that uses AI to help you write better. It provides prompts to improve your writing, fix grammar,... Available for <em>macOS</em>, I use it a lot, but It's a trial version, and unfortunately, I don't have the money to subscribe to the app right now. If you can afford it, I recommend it.</p>
<p>If you go to the settings, you can check the prompts used by the app. I think these prompts are very interesting for any project. Even I am looking to make a similar app using <em>Python</em>. So let's check the prompts and the &quot;powers&quot; that can help you to improve your writing.</p>
<hr>
<h2>Fix grammar</h2>
<blockquote>
<p>Revise the given text to correct any grammatical errors. Focus on improving sentence structure, punctuation, verb tense consistency, and word usage. Ensure the text adheres to standard grammar rules of the language this text is written in, enhancing readability and clarity. When the sentence has a bullet point at the beginning, don't remove the bullet point, otherwise answer with raw text. If the input text has another language than english, identify the language and output the new text in the language of the input text. If the original sentence does not contain pronouns like 'I' or 'you' I dont want that you add them in the process of fixing</p>
</blockquote>
<div class="language-plaintext line-numbers-mode" data-highlighter="prismjs" data-ext="plaintext"><pre><code class="language-plaintext"><span class="line">Revise the given text to correct any grammatical errors. Focus on improving sentence structure, punctuation, verb tense consistency, and word usage. Ensure the text adheres to standard grammar rules of the language this text is written in, enhancing readability and clarity. When the sentence has a bullet point at the beginning, don't remove the bullet point, otherwise answer with raw text. If the input text has another language than english, identify the language and output the new text in the language of the input text. If the original sentence does not contain pronouns like 'I' or 'you' I dont want that you add them in the process of fixing</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>Improve writing</h2>
<blockquote>
<p>Refine the writing of the given text style to convey ideas with precision and impact. Pay attention to the appropriate tone for the intended audience, whether it be formal, informal, persuasive, or informative. Focus on clarity by organizing thoughts logically, avoiding ambiguity, and providing clear transitions between ideas. Strive for conciseness by eliminating unnecessary wordiness and refining sentences for brevity without sacrificing clarity. If the input text has another language than english, identify the language and output the new text in the language of the input text</p>
</blockquote>
<div class="language-plaintext line-numbers-mode" data-highlighter="prismjs" data-ext="plaintext"><pre><code class="language-plaintext"><span class="line">Refine the writing of the given text style to convey ideas with precision and impact. Pay attention to the appropriate tone for the intended audience, whether it be formal, informal, persuasive, or informative. Focus on clarity by organizing thoughts logically, avoiding ambiguity, and providing clear transitions between ideas. Strive for conciseness by eliminating unnecessary wordiness and refining sentences for brevity without sacrificing clarity. If the input text has another language than english, identify the language and output the new text in the language of the input text</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>Convert To bullet points</h2>
<blockquote>
<p>Transform the given content into bullet points. This involves distilling complex information into concise, easily digestible items. Focus on extracting key ideas and essential details. Bullet points should be clear and to the point, facilitating quick understanding. Ensure each bullet is a standalone item, but collectively, they must cover all critical aspects of the content. Ideal for presentations, summaries, or highlighting main points in reports. Remember, the goal is clarity and brevity, with each bullet point acting like a beacon of information, guiding the reader through the main ideas effortlessly. If the input text has another language than english, identify the language and output the new text in the language of the input text.</p>
</blockquote>
<div class="language-plaintext line-numbers-mode" data-highlighter="prismjs" data-ext="plaintext"><pre><code class="language-plaintext"><span class="line">Transform the given content into bullet points. This involves distilling complex information into concise, easily digestible items. Focus on extracting key ideas and essential details. Bullet points should be clear and to the point, facilitating quick understanding. Ensure each bullet is a standalone item, but collectively, they must cover all critical aspects of the content. Ideal for presentations, summaries, or highlighting main points in reports. Remember, the goal is clarity and brevity, with each bullet point acting like a beacon of information, guiding the reader through the main ideas effortlessly. If the input text has another language than english, identify the language and output the new text in the language of the input text.</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>Summarize</h2>
<blockquote>
<p>Can you provide a comprehensive summary of the given text? The summary should cover all the key points and main ideas presented in the original text, while also condensing the information into a concise and easy-to-understand format. Please ensure that the summary includes relevant details and examples that support the main ideas, while avoiding any unnecessary information or repetition. The length of the summary should be appropriate for the length and complexity of the original text, providing a clear and accurate overview without omitting any important information. Do not reference the text answer with summary straight away. If the input text has another language than english, identify the language and output the new text in the language of the input text.</p>
</blockquote>
<div class="language-plaintext line-numbers-mode" data-highlighter="prismjs" data-ext="plaintext"><pre><code class="language-plaintext"><span class="line">Can you provide a comprehensive summary of the given text? The summary should cover all the key points and main ideas presented in the original text, while also condensing the information into a concise and easy-to-understand format. Please ensure that the summary includes relevant details and examples that support the main ideas, while avoiding any unnecessary information or repetition. The length of the summary should be appropriate for the length and complexity of the original text, providing a clear and accurate overview without omitting any important information. Do not reference the text answer with summary straight away. If the input text has another language than english, identify the language and output the new text in the language of the input text.</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>Explain this</h2>
<blockquote>
<p>Explain this concept intuitevely.</p>
</blockquote>
<div class="language-plaintext line-numbers-mode" data-highlighter="prismjs" data-ext="plaintext"><pre><code class="language-plaintext"><span class="line">Explain this concept intuitevely.</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>Make shorter</h2>
<blockquote>
<p>Condense the provided text into a shorter version. Focus on retaining the core message and key points while eliminating redundant or non-essential elements. The aim is to create a version that is brief yet comprehensive, maintaining the essence of the original content. Ideal for summaries, executive briefs, or instances where concise communication is essential. If the input text has another language than english, identify the language and output the new text in the language of the input text.</p>
</blockquote>
<div class="language-plaintext line-numbers-mode" data-highlighter="prismjs" data-ext="plaintext"><pre><code class="language-plaintext"><span class="line">Condense the provided text into a shorter version. Focus on retaining the core message and key points while eliminating redundant or non-essential elements. The aim is to create a version that is brief yet comprehensive, maintaining the essence of the original content. Ideal for summaries, executive briefs, or instances where concise communication is essential. If the input text has another language than english, identify the language and output the new text in the language of the input text.</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>Translate to English</h2>
<blockquote>
<p>Convert the given text from its original language to English, ensuring the translation is accurate and maintains the meaning, tone, and nuances of the original. Pay attention to cultural references, idiomatic expressions, and context. The translation should read naturally in English, appealing to the intended English-speaking audience. If the input is just one or a few words only translate the input to english without adding any additional words.</p>
</blockquote>
<div class="language-plaintext line-numbers-mode" data-highlighter="prismjs" data-ext="plaintext"><pre><code class="language-plaintext"><span class="line">Convert the given text from its original language to English, ensuring the translation is accurate and maintains the meaning, tone, and nuances of the original. Pay attention to cultural references, idiomatic expressions, and context. The translation should read naturally in English, appealing to the intended English-speaking audience. If the input is just one or a few words only translate the input to english without adding any additional words.</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>Change to markdown</h2>
<blockquote>
<p>Convert the given text into Markdown format. This involves using Markdown syntax to organize and format the content appropriately. Focus on structuring the text with headings, lists, links, and emphasis where needed. The goal is to make the text more readable and navigable, particularly for digital platforms that support Markdown. This task requires an understanding of Markdown syntax and the ability to apply it effectively to enhance the text's presentation</p>
</blockquote>
<div class="language-plaintext line-numbers-mode" data-highlighter="prismjs" data-ext="plaintext"><pre><code class="language-plaintext"><span class="line">Convert the given text into Markdown format. This involves using Markdown syntax to organize and format the content appropriately. Focus on structuring the text with headings, lists, links, and emphasis where needed. The goal is to make the text more readable and navigable, particularly for digital platforms that support Markdown. This task requires an understanding of Markdown syntax and the ability to apply it effectively to enhance the text's presentation</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>Change to Casual</h2>
<blockquote>
<p>Rewrite the given text in a casual, conversational style. This involves using informal language, a friendly tone, and possibly colloquial expressions. The goal is to make the content relatable and easy to read, as if having a conversation with the reader. Ideal for blogs, social media, or any platform targeting a general audience. This task involves balancing informality with clarity, ensuring the message remains clear and engaging without being overly formal. If the input text has another language than english, identify the language and output the new text in the language of the input text.</p>
</blockquote>
<div class="language-plaintext line-numbers-mode" data-highlighter="prismjs" data-ext="plaintext"><pre><code class="language-plaintext"><span class="line">Rewrite the given text in a casual, conversational style. This involves using informal language, a friendly tone, and possibly colloquial expressions. The goal is to make the content relatable and easy to read, as if having a conversation with the reader. Ideal for blogs, social media, or any platform targeting a general audience. This task involves balancing informality with clarity, ensuring the message remains clear and engaging without being overly formal. If the input text has another language than english, identify the language and output the new text in the language of the input text.</span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div>]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/03/ai_writing.png &quot;I&apos;m the good guy... for now. Generated with AI.&quot;" type="image/"/>
    </item>
    <item>
      <title>Tuples Vs Lists on Python</title>
      <link>https://misapuntesde.com/2024/03/tuples_vs_lists_on_python.html</link>
      <guid>https://misapuntesde.com/2024/03/tuples_vs_lists_on_python.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Tuples Vs Lists on Python</source>
      <description>Tuples Vs Lists on Python</description>
      <category>Developer</category>
      <pubDate>Mon, 04 Mar 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/03/tuples_vs_lists.jpg" alt="Tuples Vs Lists" tabindex="0" loading="lazy"><figcaption>Tuples Vs Lists. Generated with AI.</figcaption></figure>
<p><strong>tuples</strong> and <strong>lists</strong> are two types of data incorporated in <em>Python</em> that are used to store collections of elements. Although they share some similarities, they also have key differences. Let’s look at them:</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/03/tuples_vs_lists.jpg &quot;Tuples Vs Lists. Generated with AI.&quot;" type="image/"/>
    </item>
    <item>
      <title>How I migrated from PHP to Vuepress 2 (Part II)</title>
      <link>https://misapuntesde.com/2024/03/migration_from_php_to_vuepress2_II.html</link>
      <guid>https://misapuntesde.com/2024/03/migration_from_php_to_vuepress2_II.html</guid>
      <source url="https://misapuntesde.com/rss.xml">How I migrated from PHP to Vuepress 2 (Part II)</source>
      <description>How I migrated from PHP to Vuepress 2 (Part II)</description>
      <category>DevOps</category>
      <pubDate>Sat, 02 Mar 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="https://misapuntesde.com/images/2024/02/php_vue.jpg" alt="Generated by OpenAI's DALL-E and modified later." tabindex="0" loading="lazy"><figcaption>Generated by OpenAI's DALL-E and modified later.</figcaption></figure>
<p>This is the second part of the series of articles about how has been the experience of migrating a blog made in <em>PHP + MySQL</em>, to a static one using <em>Vuepress 2</em>. Here I talk about the old code structure and the technology used. Let's go!</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/02/php_vue.jpg &quot;Generated by OpenAI&apos;s DALL-E and modified later.&quot;" type="image/"/>
    </item>
    <item>
      <title>Open Quicktime and stream any device on macOS</title>
      <link>https://misapuntesde.com/2024/02/open_quicktime_streaming_any_device_on_macos.html</link>
      <guid>https://misapuntesde.com/2024/02/open_quicktime_streaming_any_device_on_macos.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Open Quicktime and stream any device on macOS</source>
      <description>Open Quicktime and stream any device on macOS</description>
      <category>Apple</category>
      <pubDate>Tue, 27 Feb 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/02/open_usb_device.png" alt="Open Quicktime" tabindex="0" loading="lazy"><figcaption>Open Quicktime shortcut</figcaption></figure>
<p>This is one of those things that I do every day, and the flow is very boring: <em>Open Quicktime, cancel the box dialog, Go to File &gt; File &gt; New Movie Recording</em>, and then select the device. I mainly use it to view the signal from a <em>USB video capture</em> device, which works much better than doing it via <em>VNC, Remote Desktop</em>, or similar. In addition, these types of capture devices are very cheap.</p>
<p>So today I'm going to show you how to open <em>Quicktime</em> and start streaming a device on <em>macOS</em> using the command line or making an <em>Automator</em> script.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/02/open_usb_device.png &quot;Open Quicktime shortcut&quot;" type="image/"/>
    </item>
    <item>
      <title>Dietpi 9.1 release with Raspberry Pi 5 support!</title>
      <link>https://misapuntesde.com/2024/02/dietpi_9.1_release_with_raspberry_pi_5_support.html</link>
      <guid>https://misapuntesde.com/2024/02/dietpi_9.1_release_with_raspberry_pi_5_support.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Dietpi 9.1 release with Raspberry Pi 5 support!</source>
      <description>Dietpi 9.1 release with Raspberry Pi 5 support!</description>
      <category>Raspberry PI</category>
      <pubDate>Mon, 26 Feb 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2018/02/dietpi.png" alt="DietPi" tabindex="0" loading="lazy"><figcaption>DietPi Logo</figcaption></figure>
<p><em>DietPi</em>, in its recent 9.1 release, introduces several exciting enhancements and bug fixes. Notably, it now provides support for the <em>Raspberry Pi 5</em>. Additionally, various <code>dietpi-software</code> options have been refined.</p>
<hr>
<p>The new <em>Raspberry Pi 5</em> images, based on the latest <em>Bookworm</em> kernel and firmware package set from <em>Raspberry Pi Ltd</em>, are available for testing. However, some features—such as changing screen resolution and camera module support—are not yet functional. DietPi’s primary focus remains on performance and a compact installation size, with extensive configuration tools that allow for more customization than usual. If the performance gains, reduced <em>RAM</em> usage, and faster boot times observed on the <em>Raspberry Pi 4</em> persist, Die_tPi can provide a welcome boost to the <em>Raspberry Pi 5</em> while also being energy-efficient.</p>
<p>Source: <a href="https://dietpi.com/docs/releases/v9_1/" target="_blank" rel="noopener noreferrer">DietPi</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2018/02/dietpi.png &quot;DietPi Logo&quot;" type="image/"/>
    </item>
    <item>
      <title>Read Medium articles for free</title>
      <link>https://misapuntesde.com/2024/02/read_medium_articles_for_free.html</link>
      <guid>https://misapuntesde.com/2024/02/read_medium_articles_for_free.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Read Medium articles for free</source>
      <description>Read Medium articles for free</description>
      <category>General</category>
      <pubDate>Mon, 26 Feb 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/02/medium.png" alt="&quot;Medium post read for free" tabindex="0" loading="lazy"><figcaption>Medium post read for free</figcaption></figure>
<p>Just a quick tip If you want to read a <em>Medium</em> article for free, cuz you don't have money to pay for a subscription or you don't want to create an account.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/02/medium.png &quot;Medium post read for free&quot;" type="image/"/>
    </item>
    <item>
      <title>Run a script after running apt-get update on a Debian or Ubuntu Linux</title>
      <link>https://misapuntesde.com/2024/02/run-a-script-after-apt-update-on-debian.html</link>
      <guid>https://misapuntesde.com/2024/02/run-a-script-after-apt-update-on-debian.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Run a script after running apt-get update on a Debian or Ubuntu Linux</source>
      <description>Run a script after running apt-get update on a Debian or Ubuntu Linux</description>
      <category>Linux</category>
      <pubDate>Thu, 22 Feb 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2024/02/apt_conf_d.png" alt="/etc/apt/apt.conf.d" tabindex="0" loading="lazy"><figcaption>/etc/apt/apt.conf.d</figcaption></figure>
<p>If you want to run a script for example, after <code>apt update</code> on <em>Debian</em>, you can use the <code>apt</code> hook system. This is useful if you want to perform some other action after the update. In my case, I need to run a script and re-install the <em>Vulkan driver on Raspberry Pi</em>, because <code>apt update</code> break it and the system can't open the <em>Desktop environment</em>.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/02/apt_conf_d.png &quot;/etc/apt/apt.conf.d&quot;" type="image/"/>
    </item>
    <item>
      <title>Umount &amp; Clean your NTFS/exFAT partition from macOS using Python</title>
      <link>https://misapuntesde.com/2024/02/umount_and_clean_ntfs_exfat_partition_from_macos_using_python.html</link>
      <guid>https://misapuntesde.com/2024/02/umount_and_clean_ntfs_exfat_partition_from_macos_using_python.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Umount &amp; Clean your NTFS/exFAT partition from macOS using Python</source>
      <description>Umount &amp; Clean your NTFS/exFAT partition from macOS using Python</description>
      <category>Apple</category>
      <pubDate>Wed, 21 Feb 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="https://misapuntesde.com/images/2024/02/hard-drive-with-macbook-pro.jpg" alt="external hard drive" tabindex="0" loading="lazy"><figcaption>My external hard drive with tons of 💩.</figcaption></figure>
<p>Sometimes I think I'm the one who has problems with the <em>NTFS/exFAT</em> partition on <em>macOS</em>. I have to unmount and clean it, because <em>exFAT</em> is the file system I use on a <em>Raspberry Pi</em> acting as <em>NAS</em> using the great <a href="https://dietpi.com" target="_blank" rel="noopener noreferrer">DietPi OS</a>.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/02/hard-drive-with-macbook-pro.jpg &quot;My external hard drive with tons of 💩.&quot;" type="image/"/>
    </item>
    <item>
      <title>How I migrated from PHP to Vuepress 2 (Part I)</title>
      <link>https://misapuntesde.com/2024/02/migration_from_php_to_vuepress2.html</link>
      <guid>https://misapuntesde.com/2024/02/migration_from_php_to_vuepress2.html</guid>
      <source url="https://misapuntesde.com/rss.xml">How I migrated from PHP to Vuepress 2 (Part I)</source>
      <description>How I migrated from PHP to Vuepress 2 (Part I)</description>
      <category>DevOps</category>
      <pubDate>Mon, 19 Feb 2024 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="https://misapuntesde.com/images/2024/02/php_vue.jpg" alt="This is the only use of AI you will see in this article. Generated by OpenAI's DALL-E and modified later." tabindex="0" loading="lazy"><figcaption>This is the only use of AI you will see in this article. Generated by OpenAI's DALL-E and modified later.</figcaption></figure>
<p>It's been 3 years since my last post here. I have been busy with my work and other projects. The new focus I want to give to the blog is going to be a bit different. Less <em>Raspberry Pi</em> (I will tell why later) and more technical.</p>
<p>I want to share with you a series of articles about how has been the experience of migrating a blog made in <em>PHP + MySQL</em>, to a static one using <em>Vuepress 2</em>.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2024/02/php_vue.jpg &quot;This is the only use of AI you will see in this article. Generated by OpenAI&apos;s DALL-E and modified later.&quot;" type="image/"/>
    </item>
    <item>
      <title>C64 emulator (image)</title>
      <link>https://misapuntesde.com/2013/02/c64-emulator-image.html</link>
      <guid>https://misapuntesde.com/2013/02/c64-emulator-image.html</guid>
      <source url="https://misapuntesde.com/rss.xml">C64 emulator (image)</source>
      <description>C64 emulator (image)</description>
      <category>Raspberry PI</category>
      <pubDate>Sat, 23 Feb 2013 12:15:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/c64.jpg" alt="c64" tabindex="0" loading="lazy"><figcaption>c64</figcaption></figure>
<p>On this image You will find the famous <em>Commodore 64</em> emulator <em>VICE</em>.</p>
<p>When powering on the RPi there is an automatic login with the user c64 (password c64) and then the emulator is started.</p>
<p>There are some files already installed in the <em>/home/c64/c64</em> folder, split by disk images, tape images and other.</p>
<p>Link: <a href="https://www.mascal.it/rpi64_e.html" target="_blank" rel="noopener noreferrer">C64 Emulator</a></p>
<p>Games: <a href="https://www.c64.com/games/games.php" target="_blank" rel="noopener noreferrer">Search .sid files</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/c64.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Downlading Recursively Files with wget</title>
      <link>https://misapuntesde.com/2013/02/downlading-recursively-files-with-wget.html</link>
      <guid>https://misapuntesde.com/2013/02/downlading-recursively-files-with-wget.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Downlading Recursively Files with wget</source>
      <description>Downlading Recursively Files with wget</description>
      <category>Linux</category>
      <pubDate>Thu, 21 Feb 2013 18:30:00 GMT</pubDate>
      <content:encoded><![CDATA[
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"></span>
<span class="line"><span class="token operator">></span> <span class="token function">wget</span> --no-parent <span class="token parameter variable">--recursive</span> <span class="token parameter variable">--level</span><span class="token operator">=</span><span class="token number">1</span> --no-directories <span class="token parameter variable">--user</span><span class="token operator">=</span>login <span class="token parameter variable">--password</span><span class="token operator">=</span>pass https://myftpsite.com/</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>It's valid to ftp sites too.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Google Docs&amp;apos; Notes Updated! (spanish link)</title>
      <link>https://misapuntesde.com/2013/02/google-docs-notes-updated-spanish-link.html</link>
      <guid>https://misapuntesde.com/2013/02/google-docs-notes-updated-spanish-link.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Google Docs&amp;apos; Notes Updated! (spanish link)</source>
      <description>Google Docs&amp;apos; Notes Updated! (spanish link)</description>
      <category>Raspberry PI</category>
      <pubDate>Tue, 26 Feb 2013 08:50:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/css/images/raspi_icon.png" alt="Rpi" tabindex="0" loading="lazy"><figcaption>Rpi</figcaption></figure>
<p>I see my <em>Google Docs' notes</em> has nearly the same success (or even more) that this blog 😛</p>
<p>I updated and ordered the next sections: blogs, forums, Other blogs</p>
<p>It's in spanish, but links are mainly in english.</p>
<p>Link: <a href="https://goo.gl/Iwhbq" target="_blank" rel="noopener noreferrer">G Docs</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/css/images/raspi_icon.png" type="image/png"/>
    </item>
    <item>
      <title>Little pause on the blog</title>
      <link>https://misapuntesde.com/2013/02/little-pause-on-the-blog.html</link>
      <guid>https://misapuntesde.com/2013/02/little-pause-on-the-blog.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Little pause on the blog</source>
      <description>Little pause on the blog</description>
      <category>General</category>
      <pubDate>Thu, 07 Feb 2013 21:40:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>As you can see, I do not update my notes for a days.</p>
<p>My wife has had a delicate operation in which nearly lost his life as she has suffered a brain stroke with 35 years old. Fortunately, thanks to a <a href="https://www.cdyte.com/pacientes/glosario/arteriografia/" target="_blank" rel="noopener noreferrer">arteriography</a> held in Virgen del Rocio Hospital (Seville, Spain), found three [aneurysms](https:// www.arteriasyvenas.org/index/aneurysms) and closed two. Hopefully in a couple of weeks we stared at home and we can continue to update the blog.</p>
<p>Thank you!</p>
]]></content:encoded>
    </item>
    <item>
      <title>livarPi. Debian based distro</title>
      <link>https://misapuntesde.com/2013/02/livarpi-debian-based-distro.html</link>
      <guid>https://misapuntesde.com/2013/02/livarpi-debian-based-distro.html</guid>
      <source url="https://misapuntesde.com/rss.xml">livarPi. Debian based distro</source>
      <description>livarPi. Debian based distro</description>
      <category>Raspberry PI</category>
      <pubDate>Fri, 22 Feb 2013 16:15:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/livarPilogo.jpg" alt="livarpi" tabindex="0" loading="lazy"><figcaption>livarpi</figcaption></figure>
<p>I like to put on my blog news that you can't find on the normal channels, mostly so that you do not see always the same boring news about <em>GPIO</em>, libraries and custom projects: P</p>
<p>I'd like to show you <em>livarPi</em>.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/livarPilogo.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Openelec vs Raspbmc vs Xbian</title>
      <link>https://misapuntesde.com/2013/02/openelec-vs-raspbmc-vs-xbian.html</link>
      <guid>https://misapuntesde.com/2013/02/openelec-vs-raspbmc-vs-xbian.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Openelec vs Raspbmc vs Xbian</source>
      <description>Openelec vs Raspbmc vs Xbian</description>
      <category>Raspberry PI</category>
      <pubDate>Thu, 21 Feb 2013 10:45:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/xbmc.jpg" alt="xbmc" tabindex="0" loading="lazy"><figcaption>xbmc</figcaption></figure>
<p>I'm back!</p>
<p>Probably the worst three weeks of my life, but everything is back to normal and my wife is recovering slowly.</p>
<p>This first post, I leave an updated link comparing these three distributions based on XBMC.</p>
<p>What is your favorite?</p>
<p>Link: <a href="https://goshawknest.wordpress.com/2013/02/19/openelec-vs-raspbmc-vs-xbian/" target="_blank" rel="noopener noreferrer">goshawknest</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/xbmc.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Raspberry Control application with Android</title>
      <link>https://misapuntesde.com/2013/02/raspberry-control-application-with-android.html</link>
      <guid>https://misapuntesde.com/2013/02/raspberry-control-application-with-android.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Raspberry Control application with Android</source>
      <description>Raspberry Control application with Android</description>
      <category>Raspberry PI</category>
      <pubDate>Fri, 22 Feb 2013 16:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<iframe width="560" height="315" src="https://www.youtube.com/embed/EbcCQ7MHcuc" frameborder="0" allowfullscreen></iframe>
<p>Raspberry Control - Control <em>Raspberry Pi</em> with your <em>Android</em> Device.</p>
<p>Application Features:</p>
<ul>
<li>
<p>secure connection via SSH,</p>
</li>
<li>
<p>easy control and monitoring GPIO,</p>
</li>
<li>
<p>monitor and graph temperatures remotely using DS18B20,</p>
</li>
<li>
<p>remote terminal emulator,</p>
</li>
<li>
<p>remote process management,</p>
</li>
<li>
<p>built-in MJPEG stream client,</p>
</li>
<li>
<p>easy 1-wire and I2C bus management,</p>
</li>
</ul>
<p><em>Raspberry Control soon available in Google Play (Android app) and Pi Store (Raspberry Pi app).</em></p>
<p><em>Note:</em> Their author just told me that this app will be available in this weekend <em>(Google Play)</em> 😄</p>
]]></content:encoded>
    </item>
    <item>
      <title>RasPi unboxing &amp; home automation from Javier Pardo Blasco (Spanish Link)</title>
      <link>https://misapuntesde.com/2013/02/raspi-unboxing-home-automation-from-javier-pardo-blasco-spanish-link.html</link>
      <guid>https://misapuntesde.com/2013/02/raspi-unboxing-home-automation-from-javier-pardo-blasco-spanish-link.html</guid>
      <source url="https://misapuntesde.com/rss.xml">RasPi unboxing &amp; home automation from Javier Pardo Blasco (Spanish Link)</source>
      <description>RasPi unboxing &amp; home automation from Javier Pardo Blasco (Spanish Link)</description>
      <category>Raspberry PI</category>
      <pubDate>Thu, 28 Feb 2013 12:40:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/01_RaspberryPi.jpg" alt="raspi3" tabindex="0" loading="lazy"><figcaption>raspi3</figcaption></figure>
<p>Our friends <a href="https://raspipc.es" target="_blank" rel="noopener noreferrer">RaspiPC.es</a> recommended me a blog by <em>Javier Pardo Blasco</em> quite interesting.</p>
<p>First Raspberry Pi's unboxing and the steps he took to make it operational.</p>
<p>The second is a home automation with the <em>RasPi.</em></p>
<p>Welcome to this exciting world, Javier.</p>
<p>Link: <a href="https://jpardobl.com/2013/02/20/abriendo-mi-rasberry-pi/" target="_blank" rel="noopener noreferrer">Unboxing Raspberry PI</a></p>
<p>Link: <a href="https://jpardobl.com/2013/02/25/domotica-con-la-rasberry-pi/" target="_blank" rel="noopener noreferrer">Domotic with Rasberry PI</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/01_RaspberryPi.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Show your Raspi temperature</title>
      <link>https://misapuntesde.com/2013/02/show-your-raspi-temperature.html</link>
      <guid>https://misapuntesde.com/2013/02/show-your-raspi-temperature.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Show your Raspi temperature</source>
      <description>Show your Raspi temperature</description>
      <category>Raspberry PI</category>
      <pubDate>Mon, 25 Feb 2013 14:15:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/RaspberryPiHot.png" alt="RasPi" tabindex="0" loading="lazy"><figcaption>RasPi</figcaption></figure>
<p>I just found a script to display the temperature under your Raspi terminal. If you are interested...</p>
<hr>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"><span class="token shebang important">#!/bin/bash</span></span>
<span class="line"><span class="token comment"># Script to show the temperature of the Raspberry Pi in terminal</span></span>
<span class="line"><span class="token comment"># Values can be adjusted to show different color temperatures.</span></span>
<span class="line"><span class="token comment"># By default:</span></span>
<span class="line"><span class="token comment">#      40 degrees or less -> green (32)</span></span>
<span class="line"><span class="token comment">#      Between 41 and 54 -> yellow (33)</span></span>
<span class="line"><span class="token comment">#      Greater than or equal to 55 -> red (31)</span></span>
<span class="line"></span>
<span class="line"><span class="token assign-left variable">mgrados</span><span class="token operator">=</span><span class="token string">'cat /sys/class/thermal/thermal_zone0/temp'</span></span>
<span class="line"><span class="token assign-left variable">engrados</span><span class="token operator">=</span><span class="token string">'expr $mgrados / 1000'</span></span>
<span class="line"></span>
<span class="line"><span class="token keyword">if</span> <span class="token punctuation">[</span> <span class="token variable">$engrados</span> <span class="token parameter variable">-le</span> <span class="token number">40</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></span>
<span class="line">	<span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">"Temp CPU:<span class="token entity" title="\033">\033</span>[32m <span class="token variable">$engrados</span>"</span></span>
<span class="line"><span class="token keyword">elif</span> <span class="token punctuation">[</span> <span class="token variable">$engrados</span> <span class="token parameter variable">-gt</span> <span class="token number">40</span> <span class="token punctuation">]</span> <span class="token operator">&amp;&amp;</span> <span class="token punctuation">[</span> <span class="token variable">$engrados</span> <span class="token parameter variable">-lt</span> <span class="token number">55</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">then</span></span>
<span class="line">	<span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">"Temp CPU:<span class="token entity" title="\033">\033</span>[33m <span class="token variable">$engrados</span>"</span></span>
<span class="line"><span class="token keyword">else</span></span>
<span class="line">	<span class="token builtin class-name">echo</span> <span class="token parameter variable">-e</span> <span class="token string">"Temp CPU:<span class="token entity" title="\033">\033</span>[31m <span class="token variable">$engrados</span>"</span></span>
<span class="line"><span class="token keyword">fi</span></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div>]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/RaspberryPiHot.png" type="image/png"/>
    </item>
    <item>
      <title>Spectrum girl calendar</title>
      <link>https://misapuntesde.com/2013/02/spectrum-girl-calendar.html</link>
      <guid>https://misapuntesde.com/2013/02/spectrum-girl-calendar.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Spectrum girl calendar</source>
      <description>Spectrum girl calendar</description>
      <category>General</category>
      <pubDate>Wed, 27 Feb 2013 10:25:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/spectrum_calendar_13.jpg" alt="calendar" tabindex="0" loading="lazy"><figcaption>calendar</figcaption></figure>
<p>Those who live in the <em>Spectrum's</em> era, usually dream with cover girls from the great artist <a href="https://en.wikipedia.org/wiki/Alfonso_Azpiri" target="_blank" rel="noopener noreferrer">Alfonso Azpiri</a>.</p>
<p>I found a 2013 calendar with the sexiest girls from Spectrum. Enjoy! 😉</p>
<p>Link: <a href="https://dl.dropbox.com/u/15307433/calendario-retro-spectrum-Tias-2013.pdf" target="_blank" rel="noopener noreferrer">Calendar</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/spectrum_calendar_13.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>The MagPi in Spanish</title>
      <link>https://misapuntesde.com/2013/02/the-magpi-in-spanish.html</link>
      <guid>https://misapuntesde.com/2013/02/the-magpi-in-spanish.html</guid>
      <source url="https://misapuntesde.com/rss.xml">The MagPi in Spanish</source>
      <description>The MagPi in Spanish</description>
      <category>Raspberry PI</category>
      <pubDate>Sat, 23 Feb 2013 12:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/magpi.jpg" alt="magpi" tabindex="0" loading="lazy"><figcaption>magpi</figcaption></figure>
<p>I missed the MagPi translated into Spanish. They are looking for translators, in case anyone is encouraged.</p>
<p>I wish you lucky and much encouragement.</p>
<p>Link: <a href="https://www.themagpi.com/es/" target="_blank" rel="noopener noreferrer">The MagPi</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/magpi.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Tip. save and compress at the same time with dd and gzip</title>
      <link>https://misapuntesde.com/2013/02/tip-save-and-compress-at-the-same-time-with-dd-and-gzip.html</link>
      <guid>https://misapuntesde.com/2013/02/tip-save-and-compress-at-the-same-time-with-dd-and-gzip.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Tip. save and compress at the same time with dd and gzip</source>
      <description>Tip. save and compress at the same time with dd and gzip</description>
      <category>Raspberry PI</category>
      <category>Linux</category>
      <pubDate>Sun, 24 Feb 2013 19:20:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>An interesting tip I've found:</p>
<p>To save and compress, the command is as follows (replace xxx with the ID of your disc):</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"></span>
<span class="line"><span class="token function">dd</span> <span class="token assign-left variable">if</span><span class="token operator">=</span>/dev/xxx <span class="token assign-left variable">conv</span><span class="token operator">=</span>sync,noerror <span class="token assign-left variable">bs</span><span class="token operator">=</span>4m <span class="token operator">|</span> <span class="token function">gzip</span> <span class="token parameter variable">-c</span> <span class="token operator">></span> xxx.img.gz</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>To decompress and restore, the command is as follows (replace xxx with the ID of your disc):</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"></span>
<span class="line">gunzip <span class="token parameter variable">-c</span> xxx.img.gz <span class="token operator">|</span> <span class="token function">dd</span> <span class="token assign-left variable">of</span><span class="token operator">=</span>/dev/xxx <span class="token assign-left variable">conv</span><span class="token operator">=</span>sync,noerror <span class="token assign-left variable">bs</span><span class="token operator">=</span>4m</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>For other operating system than <em>OSX</em>, use capital M.</p>
<p>Source: <a href="https://pihomeserver.wordpress.com/2013/02/07/astuce-sauvegarder-et-compresser-en-meme-temps-avec-dd-et-gzip/" target="_blank" rel="noopener noreferrer">pihomeserver.wordpress.com</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Top 10 Raspberry Pi Blogs on Jeremy Morgan&amp;apos;s website.</title>
      <link>https://misapuntesde.com/2013/02/top-10-raspberry-pi-blogs-on-jeremy-morgans-website.html</link>
      <guid>https://misapuntesde.com/2013/02/top-10-raspberry-pi-blogs-on-jeremy-morgans-website.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Top 10 Raspberry Pi Blogs on Jeremy Morgan&amp;apos;s website.</source>
      <description>Top 10 Raspberry Pi Blogs on Jeremy Morgan&amp;apos;s website.</description>
      <category>Raspberry PI</category>
      <pubDate>Sun, 24 Feb 2013 19:35:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>I love <em>Jeremy Morgan's website</em>.</p>
<p>He has posted a <em>Top 10 Raspberry Pi Blogs</em>. Don't miss it!</p>
<p>Link: <a href="https://www.jeremymorgan.com/tutorials/raspberry-pi/top-10-raspberry-pi-blogs/" target="_blank" rel="noopener noreferrer">jeremymorgan.com</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Update ATI drivers on Mac (Windows) or PC</title>
      <link>https://misapuntesde.com/2013/02/update-ati-drivers-on-mac-windows-or-pc.html</link>
      <guid>https://misapuntesde.com/2013/02/update-ati-drivers-on-mac-windows-or-pc.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Update ATI drivers on Mac (Windows) or PC</source>
      <description>Update ATI drivers on Mac (Windows) or PC</description>
      <category>General</category>
      <category>Apple</category>
      <pubDate>Wed, 27 Feb 2013 13:30:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/compo_misa_imac.jpg" alt="ati" tabindex="0" loading="lazy"><figcaption>ati</figcaption></figure>
<p>On my iMac I have a partition with <em>Windows 8</em> (damn).</p>
<p>Basically I use it to... nothing, maybe play sometimes, and It's difficult to get some updated drivers to test a game or cool benchmarks... until now.</p>
<p><strong>NOTE:</strong> Also applies to Windows 7 or 8 computers, whether desktop or laptop especially, who are facing more problems.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/compo_misa_imac.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Arduino Uno vs BeagleBone vs Raspberry Pi</title>
      <link>https://misapuntesde.com/2013/04/arduino-uno-vs-beaglebone-vs-raspberry-pi.html</link>
      <guid>https://misapuntesde.com/2013/04/arduino-uno-vs-beaglebone-vs-raspberry-pi.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Arduino Uno vs BeagleBone vs Raspberry Pi</source>
      <description>Arduino Uno vs BeagleBone vs Raspberry Pi</description>
      <category>Raspberry PI</category>
      <pubDate>Tue, 16 Apr 2013 10:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/ardubeagleraspi.jpg" alt="ardubeagleraspi" tabindex="0" loading="lazy"><figcaption>ardubeagleraspi</figcaption></figure>
<p>I have a few days between work extreme fighting with <em>MySQL</em> and leisure spending <em>PAL to NTSC</em> audio from <em>Mac</em> to put in a video. Let's see if I can tinker with Raspi, as I have prepared several tutorials that I hope you like them.</p>
<p>I leave you with an article of those where we like to compare these three <em>monsters</em> of the digital age, they are the jewel of microcontrollers.</p>
<p>Link: <a href="https://blog.makezine.com/2013/04/15/arduino-uno-vs-beaglebone-vs-raspberry-pi/" target="_blank" rel="noopener noreferrer">makezine blog</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/ardubeagleraspi.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Beaglebone Black comes to stay with us</title>
      <link>https://misapuntesde.com/2013/04/beaglebone-black-comes-to-stay-with-us.html</link>
      <guid>https://misapuntesde.com/2013/04/beaglebone-black-comes-to-stay-with-us.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Beaglebone Black comes to stay with us</source>
      <description>Beaglebone Black comes to stay with us</description>
      <category>Raspberry PI</category>
      <category>General</category>
      <pubDate>Tue, 23 Apr 2013 09:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/beaglebone.jpg" alt="BEAGLEBONE" tabindex="0" loading="lazy"><figcaption>BEAGLEBONE</figcaption></figure>
<p>It seems that the <em>Raspberry Pi</em> had its moment of glory, and is already looking for another <em>PCB</em> to do more for the same price. <em>Beaglebone</em> has fit some features of your card, and now sell for $45. Is it worth it? Let's see its features...</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/beaglebone.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Flash Player on the Pi</title>
      <link>https://misapuntesde.com/2013/04/flash-player-on-the-pi.html</link>
      <guid>https://misapuntesde.com/2013/04/flash-player-on-the-pi.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Flash Player on the Pi</source>
      <description>Flash Player on the Pi</description>
      <category>Raspberry PI</category>
      <pubDate>Sat, 27 Apr 2013 19:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>Now I remember why I bought a <em>Mac</em>. These days I've been busy setting up <em>Ubuntu</em> on the <em>Mac</em> The best thing is that for the first time, almost works, and I say almost because the damn <em>bluetooth</em>, which correctly matches the devices (keyboard, mouse and wireless trackpad) on every reboot.</p>
<p>But anyway, my fault. Not much value I have found, so I leave you with a few steps to be able to run <em>Adobe Flash Player on the Raspberry Pi</em>, which is that I like it.</p>
<p>Link: <a href="https://mrpiworld.wordpress.com/2013/04/13/adobe-flash-player-works-on-pi/" target="_blank" rel="noopener noreferrer">mrpiworld.wordpress.com</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Is it real?. Bodhi Linux goes to Raspberry Pi</title>
      <link>https://misapuntesde.com/2013/04/is-it-real-bodhi-linux-goes-to-raspberry-pi.html</link>
      <guid>https://misapuntesde.com/2013/04/is-it-real-bodhi-linux-goes-to-raspberry-pi.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Is it real?. Bodhi Linux goes to Raspberry Pi</source>
      <description>Is it real?. Bodhi Linux goes to Raspberry Pi</description>
      <category>Raspberry PI</category>
      <pubDate>Mon, 01 Apr 2013 20:50:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/bodhy_linux.jpg" alt="Bodhi Linux" tabindex="0" loading="lazy"><figcaption>Bodhi Linux</figcaption></figure>
<p>Atention! I just <a href="https://plus.google.com/100130971560879475093/posts/aroZf63DNPL" target="_blank" rel="noopener noreferrer">read</a> and I don't believe it. <em>Bodhi Linux</em>, an <em>Ubuntu</em> based distro, has been ported to <em>Raspberry Pi</em>.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/bodhy_linux.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Misapuntesde present... NOTESbox!</title>
      <link>https://misapuntesde.com/2013/04/misapuntesde-present-notesbox.html</link>
      <guid>https://misapuntesde.com/2013/04/misapuntesde-present-notesbox.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Misapuntesde present... NOTESbox!</source>
      <description>Misapuntesde present... NOTESbox!</description>
      <category>Raspberry PI</category>
      <pubDate>Fri, 05 Apr 2013 08:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/cubopuntes.jpg" alt="CUBOpuntes" tabindex="0" loading="lazy"><figcaption>CUBOpuntes</figcaption></figure>
<p>I have a gift for us!</p>
<p>This is the reason because I have been busy these days. I got the idea of having a <em>cheat sheet</em> with information that is always good to have on hand. And to make it look pretty and practical, I present to all the SINGLE NOTES ON A CUBE TO RASPBERRY PI... EL CUBOpuntes! (a.k.a. NOTESbox)</p>
<hr>
<figure><img src="/images/SanchosNOTESbox.jpg" alt="sanchocube" tabindex="0" loading="lazy"><figcaption>sanchocube</figcaption></figure>
<p>On this unfortunately named <em>CUBOpuntes</em> I have compiled some information you will have to consult securely.</p>
<p>But certainly not without faults, so if you see something wrong, a command that does not work, you need that package essential, just let me know. If you have another name for the baby, I'll be watching the comments.</p>
<p>The information gathered:</p>
<ul>
<li>
<p>Side 1: Logos, schema and GPIO.</p>
</li>
<li>
<p>Side 2: Copy OS to SD.</p>
</li>
<li>
<p>Side 3: Files you should know and its location.</p>
</li>
<li>
<p>Side 4: Useful commands I.</p>
</li>
<li>
<p>Side 5: Useful commands II.</p>
</li>
<li>
<p>Side 6: Shortcuts keys in the terminal and Favorite apps.</p>
</li>
</ul>
<p>Hope you all like it!</p>
<p><em><strong>PS:</strong></em> I am not responsible if you stick your fingers with the glue or hurt yourself with the scissors because your lack of experience.</p>
<figure><img src="/css/images/us.png" alt="en" tabindex="0" loading="lazy"><figcaption>en</figcaption></figure>
<p>Link: <a href="/res/NOTESbox.png">NOTESbox PNG in English</a> | <a href="/res/NOTESbox.pdf">NOTESbox PDF in English</a></p>
<figure><img src="/css/images/es.png" alt="es" tabindex="0" loading="lazy"><figcaption>es</figcaption></figure>
<p>Descarga: <a href="/res/CUBOpuntes.png">CUBOpuntes PNG in Spanish</a> | <a href="/res/CUBOpuntes.pdf">CUBOpuntes PDF in Spanish</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/cubopuntes.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>News this week...</title>
      <link>https://misapuntesde.com/2013/04/news-this-week.html</link>
      <guid>https://misapuntesde.com/2013/04/news-this-week.html</guid>
      <source url="https://misapuntesde.com/rss.xml">News this week...</source>
      <description>News this week...</description>
      <category>Raspberry PI</category>
      <pubDate>Fri, 19 Apr 2013 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/04_RaspberryPi.png" alt="rpi" tabindex="0" loading="lazy"><figcaption>rpi</figcaption></figure>
<p>Well, at last Friday. This weekend we play with our <em>Raspberry Pi</em>. I give some ideas to cover news this week have been several blogs.</p>
<hr>
<ul>
<li>
<p><a href="//sirlagz.net/2013/04/19/piparted-v0-03" target="_blank" rel="noopener noreferrer">PiParted v0.03</a></p>
<p>Distribution from <em>GParted LiveCD ISO</em> dedicated as you all know to download and install distros from <a href="//raspberrypi.org/downloads" target="_blank" rel="noopener noreferrer">Raspberrypi.org</a> (easy method). Size: 149 MB.</p>
</li>
<li>
<p><a href="//Rpix86.patrickaalto.com/rblog.html" target="_blank" rel="noopener noreferrer">Rpix86 has logo!</a></p>
<p>Finally have this great <em>DOS</em> emulator logo. Patrick has been busy, but the <em>MIDI</em> synthesizer support continues to progress.</p>
</li>
<li>
<p><a href="//Blog.sheasilverman.com/2013/04/pimame-0-6-beta-5-now-with-playstation-support/" target="_blank" rel="noopener noreferrer">PiMAME 0.6 Beta 5 - Now with PlayStation support!</a></p>
<p>As you can seen in the video, everything seems to go quite well with the <em>PSX1</em> emulator. In the next version will come with a distribution updater not have to be downloaded every time an image.</p>
</li>
<li>
<p><a href="//openelec.tv/news/22-releases/88-openelec-3-0-1-released" target="_blank" rel="noopener noreferrer">New OpenELEC 3.0.1</a></p>
<p><em>Frodo 12.1</em> Updated with corrections for our Raspi among others, several drivers and packages updated in the distro. Full list of changes <a href="//github.com/OpenELEC/OpenELEC.tv/compare/3.0.0...3.0.1" target="_blank" rel="noopener noreferrer">here</a>. Download <a href="//resources.pichimney.com/OpenELEC/official_images/OpenELEC-RPi.arm-3.0.1.img.zip" target="_blank" rel="noopener noreferrer">here</a></p>
</li>
<li>
<p><a href="//raspberryalphaomega.org.uk/?P=819" target="_blank" rel="noopener noreferrer">Starting with Arch Linux</a></p>
<p>One of these days I will try this fantastic distro. <em>Fran Carver</em> has an article explaining the first contact he had with <em>Arch Linux</em> in Raspi.</p>
</li>
</ul>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/04_RaspberryPi.png" type="image/png"/>
    </item>
    <item>
      <title>Optimize and speed up your Raspberry Pi</title>
      <link>https://misapuntesde.com/2013/04/optimize-and-speed-up-your-raspberry-pi.html</link>
      <guid>https://misapuntesde.com/2013/04/optimize-and-speed-up-your-raspberry-pi.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Optimize and speed up your Raspberry Pi</source>
      <description>Optimize and speed up your Raspberry Pi</description>
      <category>Raspberry PI</category>
      <pubDate>Fri, 12 Apr 2013 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/raspflash.jpg" alt="RaspFlash" tabindex="0" loading="lazy"><figcaption>RaspFlash</figcaption></figure>
<p>Ever since my first <em>PC 286</em> to the present days, I have been obsessed with optimization: an operating system, programming code, an application...</p>
<p>We are going to know how to optimize a little our <em>Raspberry Pi</em>.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/raspflash.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>PiMAME 0.4 Beta 4</title>
      <link>https://misapuntesde.com/2013/04/pimame-04-beta-4.html</link>
      <guid>https://misapuntesde.com/2013/04/pimame-04-beta-4.html</guid>
      <source url="https://misapuntesde.com/rss.xml">PiMAME 0.4 Beta 4</source>
      <description>PiMAME 0.4 Beta 4</description>
      <category>Raspberry PI</category>
      <pubDate>Sat, 13 Apr 2013 15:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<iframe width="560" height="315" src="https://www.youtube.com/embed/xyj-a1OqA-w" frameborder="0" allowfullscreen></iframe>
<p>New version of this distribution which now supports more emulators. From here we give <em>Shea Silverman</em> Congratulations on your marriage, because he has been married a few weeks ago.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Raspberry Pi and GPIO (1)</title>
      <link>https://misapuntesde.com/2013/04/raspberry-pi-and-gpio-1.html</link>
      <guid>https://misapuntesde.com/2013/04/raspberry-pi-and-gpio-1.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Raspberry Pi and GPIO (1)</source>
      <description>Raspberry Pi and GPIO (1)</description>
      <category>Raspberry PI</category>
      <pubDate>Tue, 16 Apr 2013 10:05:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/GPIO.jpg" alt="gpio" tabindex="0" loading="lazy"><figcaption>gpio</figcaption></figure>
<p>Probably site <a href="//diverteka.com" target="_blank" rel="noopener noreferrer">Diverteka</a> is one that has more hispanic fans. Its clean <em>Wordpress</em> theme and content so enriching is what motivates us every day to visit their website.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/GPIO.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Raspberry Pi Home Automation with Arduino (Ebook)</title>
      <link>https://misapuntesde.com/2013/04/raspberry-pi-home-automation-with-arduino-ebook.html</link>
      <guid>https://misapuntesde.com/2013/04/raspberry-pi-home-automation-with-arduino-ebook.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Raspberry Pi Home Automation with Arduino (Ebook)</source>
      <description>Raspberry Pi Home Automation with Arduino (Ebook)</description>
      <category>Raspberry PI</category>
      <pubDate>Sun, 07 Apr 2013 07:20:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/raspiwardu.jpg" alt="Raspi_Arduino" tabindex="0" loading="lazy"><figcaption>Raspi_Arduino</figcaption></figure>
<p><em>This essential reference will guide you through a series of exciting projects that will allow you to automate your very own home. With easy-to-follow, step-by-step examples, diagrams, and explanations you will not only find it incredibly productive but also highly engaging and informative.</em></p>
<hr>
<p>What you will learn from this book:</p>
<ul>
<li>
<p>Install an operating system for your <em>Raspberry Pi.</em></p>
</li>
<li>
<p>Set up the <em>Raspberry Pi</em> and Arduino bridge shield.</p>
</li>
<li>
<p>Learn how to work with electronic components to build small circuits.</p>
</li>
<li>
<p>Develop applications that interact with your circuits.</p>
</li>
<li>
<p>Use thermistors and photoresistors to monitor and control your surroundings.</p>
</li>
<li>
<p>Control your own mains power with a relay shield and even connect a motor to your <em>Raspberry Pi.</em></p>
</li>
</ul>
<p>Purchase: <a href="//www.amazon.com/Raspberry-Pi-Home-Automation-Arduino/dp/1849695865/" target="_blank" rel="noopener noreferrer">Amazon</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/raspiwardu.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Raspberry Pi. Making Raspbian OS Lite (under 500MB)</title>
      <link>https://misapuntesde.com/2013/04/raspberry-pi-making-raspbian-os-lite-under-500mb.html</link>
      <guid>https://misapuntesde.com/2013/04/raspberry-pi-making-raspbian-os-lite-under-500mb.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Raspberry Pi. Making Raspbian OS Lite (under 500MB)</source>
      <description>Raspberry Pi. Making Raspbian OS Lite (under 500MB)</description>
      <category>Raspberry PI</category>
      <pubDate>Thu, 25 Apr 2013 09:40:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/raspflash.jpg" alt="raspFlash" tabindex="0" loading="lazy"><figcaption>raspFlash</figcaption></figure>
<p>Today is one of those days that excites me. First, today Canonical released a new Ubuntu OS and with a new version I feel like a child to test it on my <em>iMac</em>. So today did not bother me, LOL.</p>
<p>Second because the tutorial that I found today is on diet Raspbian distribution for those who do not get into <em>LXDE</em> for anything, and we connected our Raspi <em>Ethernet</em> cable. These are simple steps, and you lose nothing to try the script that have <em>element14</em> forum.</p>
<p>Link: <a href="https://www.element14.com/community/blogs/mirandasoft/2013/04/20/raspberry-pi-making-raspbian-os-lite-under-500mb" target="_blank" rel="noopener noreferrer">Element14</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/raspflash.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Raspberry Pi Temperature Control with Expansion Board (translated link)</title>
      <link>https://misapuntesde.com/2013/04/raspberry-pi-temperature-control-with-expansion-board-translated-link.html</link>
      <guid>https://misapuntesde.com/2013/04/raspberry-pi-temperature-control-with-expansion-board-translated-link.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Raspberry Pi Temperature Control with Expansion Board (translated link)</source>
      <description>Raspberry Pi Temperature Control with Expansion Board (translated link)</description>
      <category>Raspberry PI</category>
      <pubDate>Sat, 06 Apr 2013 12:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/ee_medir_temperatura.jpg" alt="medir_temp" tabindex="0" loading="lazy"><figcaption>medir_temp</figcaption></figure>
<p>First of all thanks for the welcome given to the <em>NOTESbox</em> (nobody has told me anything about the name, I guess you like). I never received so many hits so far, even with the <em>RetroPie</em> guide with which I took a week. It seems that you prefer manual labor, lol.</p>
<p>Well, I just found a very interesting article on a temperature-controlled room with the Expansion Board you can find in this <a href="//www.electroensaimada.com/tienda.html" target="_blank" rel="noopener noreferrer">Store</a>.</p>
<p>Link translated into English: <a href="//translate.google.es/translate?sl=es&amp;tl=en&amp;js=n&amp;prev=_t&amp;hl=es&amp;ie=UTF-8&amp;eotf=1&amp;u=%2F%2Fwww.electroensaimada.com%2Fcontrol-temperatura.html" target="_blank" rel="noopener noreferrer">Electronica Ensaimada</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/ee_medir_temperatura.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Raspberry Pi Workshops in Oviedo this Friday</title>
      <link>https://misapuntesde.com/2013/04/raspberry-pi-workshops-in-oviedo-this-friday.html</link>
      <guid>https://misapuntesde.com/2013/04/raspberry-pi-workshops-in-oviedo-this-friday.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Raspberry Pi Workshops in Oviedo this Friday</source>
      <description>Raspberry Pi Workshops in Oviedo this Friday</description>
      <category>Raspberry PI</category>
      <pubDate>Wed, 10 Apr 2013 20:10:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/alcabot_12.jpg" alt="talleres" tabindex="0" loading="lazy"><figcaption>talleres</figcaption></figure>
<p><em>On Friday April 12, 2013 will be the first meeting (presentation, order of material and introduction to management system) Rasperry workshops Pi 2013 <a href="https://ieeesb-uniovi.es/informacion/localizacion" target="_blank" rel="noopener noreferrer">local Student Branch (North Aulario)</a>.</em></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/alcabot_12.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>RaspiPC.es, first advertiser to  MisApuntesde.com</title>
      <link>https://misapuntesde.com/2013/04/raspipces-first-advertiser-to-misapuntesdecom.html</link>
      <guid>https://misapuntesde.com/2013/04/raspipces-first-advertiser-to-misapuntesdecom.html</guid>
      <source url="https://misapuntesde.com/rss.xml">RaspiPC.es, first advertiser to  MisApuntesde.com</source>
      <description>RaspiPC.es, first advertiser to  MisApuntesde.com</description>
      <category>Raspberry PI</category>
      <category>General</category>
      <pubDate>Thu, 04 Apr 2013 15:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/raspipces.jpg" alt="raspipc.es" tabindex="0" loading="lazy"><figcaption>raspipc.es</figcaption></figure>
<p>These days I've been doing something that if all goes well, I will publish by the end of the week. Surely you all like. 😉</p>
<p>I wanted to give you the news that I have been in contact with <em>Juande</em>, one of the creators of the company <a href="//raspipc.es" target="_blank" rel="noopener noreferrer">raspipc.es</a>, to reach an agreement with this blog.</p>
<p><em>Raspipc</em> is a company with which I have worked, and I have only words of kindness by how quickly deliver their orders and seriousness when working here in Spain. If you're from here, would not hesitate to purchase products through its <a href="//raspipc.es/tienda.php" target="_blank" rel="noopener noreferrer">Store</a>.</p>
<p>I am very happy and confident that we can soon make the odd contest for you all. What do you think?</p>
<p>Welcome!</p>
<figure><img src="/css/sm/smiling.png" alt="smile" tabindex="0" loading="lazy"><figcaption>smile</figcaption></figure>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/raspipces.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Remote monitoring with an RC car, Arduino and the raspberry pi (translated link)</title>
      <link>https://misapuntesde.com/2013/04/remote-monitoring-with-an-rc-car-arduino-and-the-raspberry-pi-translated-link.html</link>
      <guid>https://misapuntesde.com/2013/04/remote-monitoring-with-an-rc-car-arduino-and-the-raspberry-pi-translated-link.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Remote monitoring with an RC car, Arduino and the raspberry pi (translated link)</source>
      <description>Remote monitoring with an RC car, Arduino and the raspberry pi (translated link)</description>
      <category>Raspberry PI</category>
      <pubDate>Mon, 22 Apr 2013 13:45:00 GMT</pubDate>
      <content:encoded><![CDATA[
<iframe width="560" height="315" src="https://www.youtube.com/embed/7cpkeEOFRRA" frameborder="0" allowfullscreen></iframe>
<p>Monday and I could not have touched the Raspi, but I have something going on... 😉</p>
<p>I link to a post that I found quite full. I dedicate it to my father, who sure likes.</p>
<p>Translated link: <a href="https://translate.google.com/translate?sl=es&amp;tl=en&amp;js=n&amp;prev=_t&amp;hl=es&amp;ie=UTF-8&amp;eotf=1&amp;u=http%3A%2F%2Fwww.sistemasorp.es%2F2013%2F03%2F23%2Ftelevigilancia-con-un-coche-rc-arduino-y-la-raspberry-pi%2F" target="_blank" rel="noopener noreferrer">sistemasorp.es</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>rpix86 0.07</title>
      <link>https://misapuntesde.com/2013/04/rpix86-007.html</link>
      <guid>https://misapuntesde.com/2013/04/rpix86-007.html</guid>
      <source url="https://misapuntesde.com/rss.xml">rpix86 0.07</source>
      <description>rpix86 0.07</description>
      <category>Raspberry PI</category>
      <pubDate>Tue, 30 Apr 2013 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/rpix86_logo.jpg" alt="rpix86" tabindex="0" loading="lazy"><figcaption>rpix86</figcaption></figure>
<p>This version contains the following fixes and improvements:</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/rpix86_logo.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>rpix86 v0.04 released!</title>
      <link>https://misapuntesde.com/2013/04/rpix86-v004-released.html</link>
      <guid>https://misapuntesde.com/2013/04/rpix86-v004-released.html</guid>
      <source url="https://misapuntesde.com/rss.xml">rpix86 v0.04 released!</source>
      <description>rpix86 v0.04 released!</description>
      <category>Raspberry PI</category>
      <pubDate>Thu, 04 Apr 2013 10:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/rpix86_01.jpg" alt="rpix86" tabindex="0" loading="lazy"><figcaption>rpix86</figcaption></figure>
<p>We have a new version of our favorite <em>MS-DOS</em> emulator.</p>
<p>I would like to say one thing to Patrick after the criticism he has had because some routines he have copied from Dosbox ...</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/rpix86_01.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>rpix86 v0.06 released!</title>
      <link>https://misapuntesde.com/2013/04/rpix86-v006-released.html</link>
      <guid>https://misapuntesde.com/2013/04/rpix86-v006-released.html</guid>
      <source url="https://misapuntesde.com/rss.xml">rpix86 v0.06 released!</source>
      <description>rpix86 v0.06 released!</description>
      <category>Raspberry PI</category>
      <pubDate>Sun, 21 Apr 2013 17:30:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/rpix86_logo.jpg" alt="rpix86" tabindex="0" loading="lazy"><figcaption>rpix86</figcaption></figure>
<p>rpix86 version 0.06 released!</p>
<p>This version contains the following fixes and improvements:</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/rpix86_logo.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Ubuntu 13.04 on a 27 touch screen</title>
      <link>https://misapuntesde.com/2013/04/ubuntu-1304-on-a-27-touch-screen.html</link>
      <guid>https://misapuntesde.com/2013/04/ubuntu-1304-on-a-27-touch-screen.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Ubuntu 13.04 on a 27 touch screen</source>
      <description>Ubuntu 13.04 on a 27 touch screen</description>
      <category>Linux</category>
      <pubDate>Mon, 01 Apr 2013 08:45:00 GMT</pubDate>
      <content:encoded><![CDATA[
<iframe width="560" height="315" src="https://www.youtube.com/embed/Vp8_jetKEu8" frameborder="0" allowfullscreen></iframe>
<p>It's amazing how well they have mastered the touch system in the <em>Ubuntu</em> updated operating system that has to go out this month.</p>
<p>I believe that although I have always seen it as a waste of time, since the keyboard and mouse will always be much faster than touching the screen and staining it, are moving in a very positive way with this control system.</p>
<p>If they want to somehow revive repetitive features that are occurring in the operating systems and to copy each other, one will have to uncheck from the rest.</p>
<p><em>Ubuntu</em> although criticized for decisions that are altering its operating system for better or worse are trying it at least, and I dare say better than <em>Microsoft</em> with their <em>Windows 8</em>.</p>
<p>Would you like to control your desktop with your fingers?</p>
]]></content:encoded>
    </item>
    <item>
      <title>Ubuntu 13.04 Raring Ringtail released!</title>
      <link>https://misapuntesde.com/2013/04/ubuntu-1304-raring-ringtail-released.html</link>
      <guid>https://misapuntesde.com/2013/04/ubuntu-1304-raring-ringtail-released.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Ubuntu 13.04 Raring Ringtail released!</source>
      <description>Ubuntu 13.04 Raring Ringtail released!</description>
      <category>Linux</category>
      <pubDate>Thu, 25 Apr 2013 14:20:00 GMT</pubDate>
      <content:encoded><![CDATA[
<iframe width="560" height="315" src="https://www.youtube.com/embed/fH2VHiIW_dE" frameborder="0" allowfullscreen></iframe>
<p>It is among us the new <em>Ubuntu 13.04</em> from <em>Canonical</em>. I'll report ...</p>
<p>Download: <a href="https://www.ubuntu.com/download/desktop" target="_blank" rel="noopener noreferrer">Ubuntu Raring ringtail</a></p>
<p>Screenshot Tour: <a href="https://www.noobslab.com/2013/04/ubuntu-1304-raring-ringtail-finally.html" target="_blank" rel="noopener noreferrer">noobslab.com</a></p>
<p>Tweaks: <a href="https://www.noobslab.com/2013/04/tweaksthings-to-do-after-install-of.html" target="_blank" rel="noopener noreferrer">Things/Tweaks to do after Install of Ubuntu 13.04 Raring Ringtail</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Unstoppable. rpix86 0.5 released!</title>
      <link>https://misapuntesde.com/2013/04/unstoppable-rpix86-05-released.html</link>
      <guid>https://misapuntesde.com/2013/04/unstoppable-rpix86-05-released.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Unstoppable. rpix86 0.5 released!</source>
      <description>Unstoppable. rpix86 0.5 released!</description>
      <category>Raspberry PI</category>
      <pubDate>Tue, 09 Apr 2013 07:35:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/DSx86Animated2.gif" alt="rpix86" tabindex="0" loading="lazy"><figcaption>rpix86</figcaption></figure>
<p>A few days ago version 0.4 released, and would not comment if I get many positive changes in this emulator. If you want to know what new features brings...</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/DSx86Animated2.gif" type="image/gif"/>
    </item>
    <item>
      <title>10.000 Hits!</title>
      <link>https://misapuntesde.com/2013/03/10000-hits.html</link>
      <guid>https://misapuntesde.com/2013/03/10000-hits.html</guid>
      <source url="https://misapuntesde.com/rss.xml">10.000 Hits!</source>
      <description>10.000 Hits!</description>
      <category>General</category>
      <category>Raspberry PI</category>
      <pubDate>Sat, 09 Mar 2013 18:45:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/thank-you.jpg" alt="thank_you" tabindex="0" loading="lazy"><figcaption>thank_you</figcaption></figure>
<p>Well, I have nothing prepared for this great event, but it deserves a few words.</p>
<p>Two months have passed since the blog started. There are still many things to do around here, and as you know I've been out a few weeks because of my wife.</p>
<p>Almost 100 post, visitors from USA, UK, Argentina, Chile, Germany, France, Mexico and particularly Spain.</p>
<p>First, let me thank the comments of encouragement that I have received, both on <em>Twitter</em> and in the blog. It seems silly, but I was excited about your comments on this difficult moments, and this makes a difference to me. Now you are part of my circle, as would said <em>Google</em> 😉</p>
<p>Now it is making some progress on the web (I hope I do not take another 10,000 visits). Most you come here to read news about <em>Raspberry Pi</em>, I know, and forgive me that sometimes post content that interests me. Let's see if I can separate content for anyone having to read any of the other topics that interest to me, both in the feeds and with the sections in the header.</p>
<p>Of course, any improvements or advice you may offer, are welcome. I also want that this blog to be a point of interest to help you spread your post or blog. Whenever you want to give visibility to your post, please send me your link, which I will publish it. Ditto if you have a store or business.</p>
<p>This post is dedicated to my wife who encouraged me to continue the blog, and my daughter, who can't stop dancing Mickey Mouse Club House and were it not for the 27&quot; iMac, it would be impossible to devote time to blog .</p>
<p>And you, of course!. Hope to continue reading, the best is yet to come...</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/thank-you.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>2 useful Mac tools. PiCLoner &amp; PiWriter</title>
      <link>https://misapuntesde.com/2013/03/2-useful-mac-tools-picloner-piwriter.html</link>
      <guid>https://misapuntesde.com/2013/03/2-useful-mac-tools-picloner-piwriter.html</guid>
      <source url="https://misapuntesde.com/rss.xml">2 useful Mac tools. PiCLoner &amp; PiWriter</source>
      <description>2 useful Mac tools. PiCLoner &amp; PiWriter</description>
      <category>Raspberry PI</category>
      <category>Apple</category>
      <pubDate>Tue, 12 Mar 2013 08:30:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/piclonerwriter.jpg" alt="pipi" tabindex="0" loading="lazy"><figcaption>pipi</figcaption></figure>
<p>I have two applications on <em>Mac</em> to create a backup of your SD card <em>(PiCloner)</em> and another that is a graphical interface to copy the operating system from the <em>.img</em> file to <em>SD (PiWriter).</em></p>
<p>Remember the right way to do the same as <em>PiWriter</em> in the Mac Terminal:</p>
<div class="language-bash line-numbers-mode" data-highlighter="prismjs" data-ext="sh"><pre><code class="language-bash"><span class="line"></span>
<span class="line">N is the drive of your SD card</span>
<span class="line">$ diskutil list</span>
<span class="line">$ <span class="token function">sudo</span> diskutil unmountDisk /dev/diskN</span>
<span class="line">$ <span class="token function">date</span> +<span class="token string">'Start: %H:%M:%S'</span> <span class="token operator">&amp;&amp;</span> <span class="token function">sudo</span> <span class="token function">dd</span> <span class="token assign-left variable">if</span><span class="token operator">=</span>myImage.img <span class="token assign-left variable">bs</span><span class="token operator">=</span>1m <span class="token assign-left variable">of</span><span class="token operator">=</span>/dev/rdiskN</span>
<span class="line">$ diskutil <span class="token function">eject</span> /dev/diskN</span>
<span class="line"></span>
<span class="line"></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Link: <a href="https://sourceforge.net/projects/picloner/" target="_blank" rel="noopener noreferrer">PiCloner</a></p>
<p>Link: <a href="https://sourceforge.net/projects/piwriter/" target="_blank" rel="noopener noreferrer">PiWriter</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/piclonerwriter.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Article from Custom PC UK Magazine (May, 2013)</title>
      <link>https://misapuntesde.com/2013/03/article-from-custom-pc-uk-magazine-may-2013.html</link>
      <guid>https://misapuntesde.com/2013/03/article-from-custom-pc-uk-magazine-may-2013.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Article from Custom PC UK Magazine (May, 2013)</source>
      <description>Article from Custom PC UK Magazine (May, 2013)</description>
      <category>Raspberry PI</category>
      <pubDate>Tue, 19 Mar 2013 17:05:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/PCUK_0513.jpg" alt="Custom PC" tabindex="0" loading="lazy"><figcaption>Custom PC</figcaption></figure>
<p>What a coincidence!. I found online an article about <em>Raspberry Pi</em> of the British publication called <em>Custom PC UK.</em> Apparently is from May, 2013 (WTF!).</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/PCUK_0513.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Article from the magazine Linux Format UK (April, 2013)</title>
      <link>https://misapuntesde.com/2013/03/article-from-the-magazine-linux-format-uk-april-2013.html</link>
      <guid>https://misapuntesde.com/2013/03/article-from-the-magazine-linux-format-uk-april-2013.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Article from the magazine Linux Format UK (April, 2013)</source>
      <description>Article from the magazine Linux Format UK (April, 2013)</description>
      <category>Raspberry PI</category>
      <pubDate>Thu, 21 Mar 2013 18:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/Linux_Format_UK_2013-04.jpg" alt="Linux format UK" tabindex="0" loading="lazy"><figcaption>Linux format UK</figcaption></figure>
<p>In this magazine we teach various tricks, apps and how to stream and record TV channels through our <em>Raspberry Pi</em>. It also teaches several distros to choose the ones you like.</p>
<p><strong><em>PS:</em></strong> I encourage people to buy the magazine or subscribe to it better.</p>
<p>Subscription: <a href="https://www.myfavouritemagazines.co.uk/content/lp/linuxformat/" target="_blank" rel="noopener noreferrer">Linux Format UK</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/Linux_Format_UK_2013-04.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Automation university project with Raspberry Pi (Spanish link)</title>
      <link>https://misapuntesde.com/2013/03/automation-university-project-with-raspberry-pi-spanish-link.html</link>
      <guid>https://misapuntesde.com/2013/03/automation-university-project-with-raspberry-pi-spanish-link.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Automation university project with Raspberry Pi (Spanish link)</source>
      <description>Automation university project with Raspberry Pi (Spanish link)</description>
      <category>Raspberry PI</category>
      <pubDate>Tue, 05 Mar 2013 08:35:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/domotica_01.jpg" alt="domotic" tabindex="0" loading="lazy"><figcaption>domotic</figcaption></figure>
<p>I found a pretty curious post about home automation project that I want to show you. Nothing better than the words from the author about this project to know it:</p>
<blockquote>
<p><em>I recently presented a project with the Raspberry Pi in college where I study Computer Science.</em></p>
<p><em>The goal was pretty generic and was used GPIO pin header that brings the Raspberry Pi and to control the I/O from a mobile device.</em></p>
<p><em>So for this project I thought of making a model of a home and simulate home automation.</em></p>
</blockquote>
<p>Link: <a href="https://muyraspi.blogspot.com.es/2013/03/domotica-con-la-raspberry-pi.html" target="_blank" rel="noopener noreferrer">Mis experiencias con la Raspberry Pi</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/domotica_01.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>ChameleonPi 0.3 &amp; PiMAME 0.6 Beta out!</title>
      <link>https://misapuntesde.com/2013/03/chameleonpi-03-pimame-06-beta-out.html</link>
      <guid>https://misapuntesde.com/2013/03/chameleonpi-03-pimame-06-beta-out.html</guid>
      <source url="https://misapuntesde.com/rss.xml">ChameleonPi 0.3 &amp; PiMAME 0.6 Beta out!</source>
      <description>ChameleonPi 0.3 &amp; PiMAME 0.6 Beta out!</description>
      <category>Raspberry PI</category>
      <pubDate>Sat, 02 Mar 2013 06:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/chameleon.jpg" alt="chameleon" tabindex="0" loading="lazy"><figcaption>chameleon</figcaption></figure>
<p>This weekend we have an important mission. No matter the emulator or the game, but the platform.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/chameleon.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Free Bunfle. get 9 awesome Mac apps for FREE</title>
      <link>https://misapuntesde.com/2013/03/free-bunfle-get-9-awesome-mac-apps-for-free.html</link>
      <guid>https://misapuntesde.com/2013/03/free-bunfle-get-9-awesome-mac-apps-for-free.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Free Bunfle. get 9 awesome Mac apps for FREE</source>
      <description>Free Bunfle. get 9 awesome Mac apps for FREE</description>
      <category>Apple</category>
      <pubDate>Tue, 26 Mar 2013 09:25:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/macupdate.jpg" alt="macupdate" tabindex="0" loading="lazy"><figcaption>macupdate</figcaption></figure>
<p>First, let me thank you for the great reception given to the <em>RetroPie's</em> guide that I published a <a href="/post.php?id=109">few days ago</a>. The visits have gone through the roof and now I have a daily average of 400 visits. For a blog devoted entirely to something as specific as the <em>Raspberry Pi</em> has a special <em>merit</em>. Anyway I don't understand how it is possible that <em>Google Docs</em> continues to have such popularity and every time I go to the doc I see an average of 10 users online: P</p>
<p>Now I want to write about an offer for Mac. You need to register and you get at your disposal a number of free applications, which otherwise would cost you a bunch of dollars (in this case an average of 130$). If you have a Mac, take advantage.</p>
<p>Link: <a href="https://deals.macupdate.com/freebundle/affil/11708" target="_blank" rel="noopener noreferrer">MacUpdate</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/macupdate.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>How to make an internet Stuffed Toy with Raspberry Pi and Carriots</title>
      <link>https://misapuntesde.com/2013/03/how-to-make-an-internet-stuffed-toy-with-raspberry-pi-and-carriots.html</link>
      <guid>https://misapuntesde.com/2013/03/how-to-make-an-internet-stuffed-toy-with-raspberry-pi-and-carriots.html</guid>
      <source url="https://misapuntesde.com/rss.xml">How to make an internet Stuffed Toy with Raspberry Pi and Carriots</source>
      <description>How to make an internet Stuffed Toy with Raspberry Pi and Carriots</description>
      <category>Raspberry PI</category>
      <pubDate>Tue, 26 Mar 2013 11:45:00 GMT</pubDate>
      <content:encoded><![CDATA[
<iframe width="560" height="315" src="https://www.youtube.com/embed/QBq8DtiPs8Y?rel=0" frameborder="0" allowfullscreen></iframe>
<p><em>Carrots</em> is like a service to connect mobile internet devices. Following these instructions will have a teddy-cyborg with <em>Raspberry Pi's</em> hearted that will delight the little kids.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/carriots.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Increased Performance With Aaxbmc Script for Raspbmc</title>
      <link>https://misapuntesde.com/2013/03/increased-performance-with-aaxbmc-script-for-raspbmc.html</link>
      <guid>https://misapuntesde.com/2013/03/increased-performance-with-aaxbmc-script-for-raspbmc.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Increased Performance With Aaxbmc Script for Raspbmc</source>
      <description>Increased Performance With Aaxbmc Script for Raspbmc</description>
      <category>Raspberry PI</category>
      <pubDate>Fri, 01 Mar 2013 17:30:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/raspxbmc.jpg" alt="raspxbmc" tabindex="0" loading="lazy"><figcaption>raspxbmc</figcaption></figure>
<p>The tip is to keep your profile in <em>RAM</em>. This uses the <em>tmpfs</em> filesystem.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/raspxbmc.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Kali Linux on Raspberry Pi</title>
      <link>https://misapuntesde.com/2013/03/kali-linux-on-raspberry-pi.html</link>
      <guid>https://misapuntesde.com/2013/03/kali-linux-on-raspberry-pi.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Kali Linux on Raspberry Pi</source>
      <description>Kali Linux on Raspberry Pi</description>
      <category>Raspberry PI</category>
      <category>Linux</category>
      <pubDate>Thu, 14 Mar 2013 13:10:00 GMT</pubDate>
      <content:encoded><![CDATA[
<iframe width="560" height="315" src="https://www.youtube.com/embed/U0TrBdOSaGg" frameborder="0" allowfullscreen></iframe>
<p>Its website says the following about Kali:</p>
<p><em>From the creators of BackTrack comes Kali Linux, the most advanced and versatile penetration testing distribution ever created. BackTrack has grown far beyond its humble roots as a live CD and has now become a full-fledged operating system.</em></p>
<p>Would you like that I make a tutorial about their use?</p>
<p>Link: <a href="https://www.kali.org/downloads/" target="_blank" rel="noopener noreferrer">Download Kali</a></p>
<p>Cheatsheet: <a href="https://comparite.ch/kalics" target="_blank" rel="noopener noreferrer">Kali Linux Cheat Sheet</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Learn Raspberry Pi with Linux (Ebook)</title>
      <link>https://misapuntesde.com/2013/03/learn-raspberry-pi-with-linux-ebook.html</link>
      <guid>https://misapuntesde.com/2013/03/learn-raspberry-pi-with-linux-ebook.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Learn Raspberry Pi with Linux (Ebook)</source>
      <description>Learn Raspberry Pi with Linux (Ebook)</description>
      <category>Raspberry PI</category>
      <pubDate>Sun, 24 Mar 2013 08:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/learnrwl.jpg" alt="Learn Raspberry Pi with Linux" tabindex="0" loading="lazy"><figcaption>Learn Raspberry Pi with Linux</figcaption></figure>
<p>Learn <em>Raspberry Pi</em> with Linux will tell you everything you need to know about the <em>Raspberry Pi's</em> GUI and command line so you can get started doing amazing things.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/learnrwl.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>MAME4ALL port for Pi</title>
      <link>https://misapuntesde.com/2013/03/mame4all-port-for-pi.html</link>
      <guid>https://misapuntesde.com/2013/03/mame4all-port-for-pi.html</guid>
      <source url="https://misapuntesde.com/rss.xml">MAME4ALL port for Pi</source>
      <description>MAME4ALL port for Pi</description>
      <category>Raspberry PI</category>
      <pubDate>Wed, 06 Mar 2013 13:52:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/mame.jpg" alt="mame4all" tabindex="0" loading="lazy"><figcaption>mame4all</figcaption></figure>
<p>Sometimes I think the only thing that interests me from Raspi are emulators. I see <em>Frogger</em> in the Pi and the nostalgia come to me :_)</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/mame.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Meeting next Thursday on Barcelona (Spain)</title>
      <link>https://misapuntesde.com/2013/03/meeting-next-thursday-on-barcelona-spain.html</link>
      <guid>https://misapuntesde.com/2013/03/meeting-next-thursday-on-barcelona-spain.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Meeting next Thursday on Barcelona (Spain)</source>
      <description>Meeting next Thursday on Barcelona (Spain)</description>
      <category>Raspberry PI</category>
      <pubDate>Fri, 08 Mar 2013 16:15:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/kddbcn.jpg" alt="kdd" tabindex="0" loading="lazy"><figcaption>kdd</figcaption></figure>
<p>I show you an email sent to me about a Rasbberry meeting in Barcelona (Spain):</p>
<p><em>Greetings and congratulations because your document on Raspberry Pi, who are &quot;newbies&quot; like this shared and updated documentation. Also congratulations on your new blog, wish good luck. I pass a link of a &quot;meeting&quot; in Barcelona:</em></p>
<p><a href="https://lanyrd.com/2013/raspberrypizza/" target="_blank" rel="noopener noreferrer">https://lanyrd.com/2013/raspberrypizza/</a></p>
<p><em>It will be a &quot;geek stuff&quot; but I found very interesting the term &quot;Raspberry pizza&quot;, about Raspberry Pi brainstorm with the idea about sharing and enjoying the pizzas...</em></p>
<p><em>Greeting.</em></p>
<p><em>Marius</em></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/kddbcn.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Minimal web browser start up in 1 second</title>
      <link>https://misapuntesde.com/2013/03/minimal-web-browser-start-up-in-1-second.html</link>
      <guid>https://misapuntesde.com/2013/03/minimal-web-browser-start-up-in-1-second.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Minimal web browser start up in 1 second</source>
      <description>Minimal web browser start up in 1 second</description>
      <category>Raspberry PI</category>
      <pubDate>Mon, 11 Mar 2013 08:30:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/browser_fight.jpg" alt="browser fight" tabindex="0" loading="lazy"><figcaption>browser fight</figcaption></figure>
<p>What leads people worse on <em>Raspberry</em> Pi is <em>Flash</em> support (an advance) and slow web browsers like <em>Chromium.</em></p>
<p>I propose another one. It's based on <em>WebKitGTK</em> engine and start up in <strong>1 second!</strong>.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/browser_fight.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>New chameleon release v.0.3.1</title>
      <link>https://misapuntesde.com/2013/03/new-chameleon-release-v031.html</link>
      <guid>https://misapuntesde.com/2013/03/new-chameleon-release-v031.html</guid>
      <source url="https://misapuntesde.com/rss.xml">New chameleon release v.0.3.1</source>
      <description>New chameleon release v.0.3.1</description>
      <category>Raspberry PI</category>
      <pubDate>Thu, 28 Mar 2013 18:25:00 GMT</pubDate>
      <content:encoded><![CDATA[
<iframe width="560" height="315" src="https://www.youtube.com/embed/1zWJDMxCT1I" frameborder="0" allowfullscreen></iframe>
<p>Their author said about it:</p>
<p><em>We have patched a lot of bugs, removed that horrible text-mode rom selector, moved all options menus to graphic mode (except rapsbian ones).</em></p>
<p><em>Hope all you like as much as we enjoyed creating it.</em></p>
<p>Downloads: <a href="https://chameleon.enging.com/?q=download" target="_blank" rel="noopener noreferrer">Torrent</a> | <a href="https://chameleon.enging.com/chameleon.v031.img.bz2" target="_blank" rel="noopener noreferrer">Direct download</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>New firmware with improvements for analogue audio popping</title>
      <link>https://misapuntesde.com/2013/03/new-firmware-with-improvements-for-analogue-audio-popping.html</link>
      <guid>https://misapuntesde.com/2013/03/new-firmware-with-improvements-for-analogue-audio-popping.html</guid>
      <source url="https://misapuntesde.com/rss.xml">New firmware with improvements for analogue audio popping</source>
      <description>New firmware with improvements for analogue audio popping</description>
      <category>Raspberry PI</category>
      <pubDate>Wed, 06 Mar 2013 15:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/firmware.jpg" alt="hexxeh" tabindex="0" loading="lazy"><figcaption>hexxeh</figcaption></figure>
<p>As discussed in <em>Raspbmc's forum</em>, a new firmware has been release and fix the pop sound before and after played media. Good news for all. Did anyone test it on Raspbian and want to comment?</p>
<p>Link: <a href="https://forum.stmlabs.com/showthread.php?tid=4573&amp;pid=59568#pid59568" target="_blank" rel="noopener noreferrer">stmlabs.com</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/firmware.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>OpenELEC 3.0.0 released!</title>
      <link>https://misapuntesde.com/2013/03/openelec-300-released.html</link>
      <guid>https://misapuntesde.com/2013/03/openelec-300-released.html</guid>
      <source url="https://misapuntesde.com/rss.xml">OpenELEC 3.0.0 released!</source>
      <description>OpenELEC 3.0.0 released!</description>
      <category>Raspberry PI</category>
      <pubDate>Mon, 25 Mar 2013 05:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/openelec3.jpg" alt="openelec" tabindex="0" loading="lazy"><figcaption>openelec</figcaption></figure>
<p>Probably the best distribution for enjoying a good media center with <em>XBMC</em>. At least with faster boot times.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/openelec3.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>PCEngine emulator</title>
      <link>https://misapuntesde.com/2013/03/pcengine-emulator.html</link>
      <guid>https://misapuntesde.com/2013/03/pcengine-emulator.html</guid>
      <source url="https://misapuntesde.com/rss.xml">PCEngine emulator</source>
      <description>PCEngine emulator</description>
      <category>Raspberry PI</category>
      <pubDate>Wed, 13 Mar 2013 09:35:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/PC_Engine_logo.png" alt="pcengine" tabindex="0" loading="lazy"><figcaption>pcengine</figcaption></figure>
<p>A <em>Raspberry Pi</em> forum user put few days ago, a compiled binary of <em>PCEngine</em> emulator. Apparently everything runs perfectly, but no one has left a comment, so I'll put it here to see if anyone is encouraged to test it.</p>
<p>All the information on the second link.</p>
<p>Link: <a href="https://www.raspberrypi.org/phpBB3/viewtopic.php?f=78&amp;t=35906" target="_blank" rel="noopener noreferrer">forum</a></p>
<p>Link: <a href="https://docs.google.com/file/d/0B51Q7dpulGC8MXJVMjhjLUdtWEU/edit?pli=1" target="_blank" rel="noopener noreferrer">PCEngine/TurboGrafx-16 Emulator Mednafen Module</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/PC_Engine_logo.png" type="image/png"/>
    </item>
    <item>
      <title>PiBang Server Edition</title>
      <link>https://misapuntesde.com/2013/03/pibang-server-edition.html</link>
      <guid>https://misapuntesde.com/2013/03/pibang-server-edition.html</guid>
      <source url="https://misapuntesde.com/rss.xml">PiBang Server Edition</source>
      <description>PiBang Server Edition</description>
      <category>Raspberry PI</category>
      <pubDate>Wed, 13 Mar 2013 10:25:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/pibang.jpg" alt="pibang" tabindex="0" loading="lazy"><figcaption>pibang</figcaption></figure>
<p>The previous post was my 100th post, and I see that every day is more difficult to find updated news about our Raspi. Many blogs have several days without updating, and perhaps means the Pi fever is down. Hopefully not.</p>
<p>We all tend to use either <em>Raspbian</em> or <em>Arch Linux</em>. Sometimes they do not bother to try other alternatives. Wrong.</p>
<p>PiBang is a good solid distribution now takes a version Server, all command-line based on <em>Debian</em> and access to their repos. Also you may be interested in their desktop version that uses <em>OpenBox</em> instead of <em>LXDE</em>, lighter.</p>
<p>Enlace: <a href="https://sourceforge.net/projects/pibang/files/pibang-server-20130312.img.zip/download" target="_blank" rel="noopener noreferrer">Imagen PiBang Server Ed.</a></p>
<p>Enlace: <a href="https://pibanglinux.org/notes.html" target="_blank" rel="noopener noreferrer">Raspbian Vs Raspbian</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/pibang.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Rapberry Pi. TV record and stream (Spanish link)</title>
      <link>https://misapuntesde.com/2013/03/rapberry-pi-tv-record-and-stream-spanish-link.html</link>
      <guid>https://misapuntesde.com/2013/03/rapberry-pi-tv-record-and-stream-spanish-link.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Rapberry Pi. TV record and stream (Spanish link)</source>
      <description>Rapberry Pi. TV record and stream (Spanish link)</description>
      <category>Raspberry PI</category>
      <pubDate>Fri, 29 Mar 2013 08:30:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/xbmc.jpg" alt="xbmc" tabindex="0" loading="lazy"><figcaption>xbmc</figcaption></figure>
<p>A blog reader of your favourite blog (this, of course) has done us the favor to all Spanish speakers to translate an article from <em>Linux Format</em> Magazine. Try to record and broadcast TV channels with a <em>Raspberry Pi</em>.</p>
<p>The ingredients: <em>TDT-USB</em> receiver, <em>XBMC</em> and the plugin <em>TVheadend.</em></p>
<p>Link: <a href="https://blamarpa.blogspot.com.es/2013/03/rapberry-pi-grabar-y-emitir-tv.html" target="_blank" rel="noopener noreferrer">blamarpa blog</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/xbmc.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Raspberry Control reach v. 2.0 (Android)</title>
      <link>https://misapuntesde.com/2013/03/raspberry-control-reach-v-20-android.html</link>
      <guid>https://misapuntesde.com/2013/03/raspberry-control-reach-v-20-android.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Raspberry Control reach v. 2.0 (Android)</source>
      <description>Raspberry Control reach v. 2.0 (Android)</description>
      <category>Raspberry PI</category>
      <pubDate>Wed, 27 Mar 2013 11:40:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/raspberry_control_2.jpg" alt="RaspControl2" tabindex="0" loading="lazy"><figcaption>RaspControl2</figcaption></figure>
<p>It's available for <em>Android</em> a new version of this software to control various aspects of our <em>Raspberry Pi</em>. You need to install a software in your Raspi, but you will have available the following features:</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/raspberry_control_2.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Raspberry Pi. back to the era in which we manage our devices (spanish link)</title>
      <link>https://misapuntesde.com/2013/03/raspberry-pi-back-to-the-era-in-which-we-manage-our-devices-spanish-link.html</link>
      <guid>https://misapuntesde.com/2013/03/raspberry-pi-back-to-the-era-in-which-we-manage-our-devices-spanish-link.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Raspberry Pi. back to the era in which we manage our devices (spanish link)</source>
      <description>Raspberry Pi. back to the era in which we manage our devices (spanish link)</description>
      <category>Raspberry PI</category>
      <pubDate>Wed, 27 Mar 2013 11:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/xakatahome.jpg" alt="xataka" tabindex="0" loading="lazy"><figcaption>xataka</figcaption></figure>
<p><em>How is the experience from the user?, Is it difficult to use?, Is it worth one Raspberry Pi?, How is that back to basics and manage our devices, often from a terminal?</em></p>
<p>All these questions and their answers on a post made ​​by <em>Fernando Dotuel</em> to <em>Xataka</em> website.</p>
<p>Link: <a href="https://www.xataka.com/componentes-de-pc/raspberry-pi-regreso-a-la-era-en-que-administrabamos-nuestros-dispositivos" target="_blank" rel="noopener noreferrer">Xataka</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/xakatahome.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Raspberry Pi is a great Media Center. The installation (Spanish link)</title>
      <link>https://misapuntesde.com/2013/03/raspberry-pi-is-a-great-media-center-the-installation-spanish-link.html</link>
      <guid>https://misapuntesde.com/2013/03/raspberry-pi-is-a-great-media-center-the-installation-spanish-link.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Raspberry Pi is a great Media Center. The installation (Spanish link)</source>
      <description>Raspberry Pi is a great Media Center. The installation (Spanish link)</description>
      <category>Raspberry PI</category>
      <pubDate>Mon, 25 Mar 2013 12:35:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/raspxbmc.jpg" alt="xbmc" tabindex="0" loading="lazy"><figcaption>xbmc</figcaption></figure>
<p>I just read a very interesting article from the plugin's creator <em>Pelis a la carta</em>. It explains how to install very easily <em>Raspbmc</em> distro and configure it to access their plugin. Do not miss it!.</p>
<p>Link: <a href="https://blog.tvalacarta.info/2013/03/08/raspberry-pi-es-un-gran-media-center-la-instalacion/#more-7005" target="_blank" rel="noopener noreferrer">blog.tvalacarta.info</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/raspxbmc.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>Raspbian Server Edition Version 2.3 1GB Image</title>
      <link>https://misapuntesde.com/2013/03/raspbian-server-edition-version-23-1gb-image.html</link>
      <guid>https://misapuntesde.com/2013/03/raspbian-server-edition-version-23-1gb-image.html</guid>
      <source url="https://misapuntesde.com/rss.xml">Raspbian Server Edition Version 2.3 1GB Image</source>
      <description>Raspbian Server Edition Version 2.3 1GB Image</description>
      <category>Raspberry PI</category>
      <pubDate>Tue, 05 Mar 2013 09:10:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>Probably few people need such a small image of the server version from our friend <em>Madman</em>, but it is worth mentioning the decrease of size for an operating system to fit on 1GB. Remember that there is not an <em>iso</em>, It's an <em>img</em> file.</p>
<p>Link: <a href="https://sirlagz.net/2013/03/04/raspbian-server-edition-version-2-3-1gb-image/" target="_blank" rel="noopener noreferrer">sirlagz.net</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>RaspBMC. online television channels and sports (Spanish link)</title>
      <link>https://misapuntesde.com/2013/03/raspbmc-online-television-channels-and-sports-spanish-link.html</link>
      <guid>https://misapuntesde.com/2013/03/raspbmc-online-television-channels-and-sports-spanish-link.html</guid>
      <source url="https://misapuntesde.com/rss.xml">RaspBMC. online television channels and sports (Spanish link)</source>
      <description>RaspBMC. online television channels and sports (Spanish link)</description>
      <category>Raspberry PI</category>
      <pubDate>Mon, 04 Mar 2013 13:46:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/xbmc.jpg" alt="raspxbmc" tabindex="0" loading="lazy"><figcaption>raspxbmc</figcaption></figure>
<p>A comment on my <a href="https://goo.gl/Iwhbq" target="_blank" rel="noopener noreferrer">Google Docs</a> has made me know this site, their <a href="https://www.goshield.es/es/39-raspberry-pi" target="_blank" rel="noopener noreferrer">shop</a> and a very interesting tutorial about how to watch TV channels and TV sport with a plugin called rmtpGUI + modified.</p>
<p>Link: <a href="https://blog.goshield.es/2013/02/raspmbc-canales-de-television-online-y.html" target="_blank" rel="noopener noreferrer">goshield blog</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/xbmc.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>RasPlex. New Media Center Distribution</title>
      <link>https://misapuntesde.com/2013/03/rasplex-new-media-center-distribution.html</link>
      <guid>https://misapuntesde.com/2013/03/rasplex-new-media-center-distribution.html</guid>
      <source url="https://misapuntesde.com/rss.xml">RasPlex. New Media Center Distribution</source>
      <description>RasPlex. New Media Center Distribution</description>
      <category>Raspberry PI</category>
      <pubDate>Mon, 18 Mar 2013 13:40:00 GMT</pubDate>
      <content:encoded><![CDATA[
<iframe width="560" height="315" src="https://www.youtube.com/embed/n2d4c8JIT0E" frameborder="0" allowfullscreen></iframe>
<p>A blog reader called <em>Hugo Ruiz</em>, told me days ago we have a new distribution based on <em>OpenELEC</em>, but using the <em>Plex</em> app, which as many of you know, is an alternative with enough followers to <em>XBMC.</em></p>
<p>It's still in beta, but it works pretty well. Supports <em>AirPlay</em> and <em>AirTunes.</em></p>
<p>Link: <a href="https://rasplex.com/" target="_blank" rel="noopener noreferrer">RasPlex</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>RetroPie Project. Definitive Guide!</title>
      <link>https://misapuntesde.com/2013/03/retropie-project-definitive-guide.html</link>
      <guid>https://misapuntesde.com/2013/03/retropie-project-definitive-guide.html</guid>
      <source url="https://misapuntesde.com/rss.xml">RetroPie Project. Definitive Guide!</source>
      <description>RetroPie Project. Definitive Guide!</description>
      <category>Raspberry PI</category>
      <pubDate>Fri, 22 Mar 2013 07:20:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/2013/03/retrop_01_min.jpg" alt="RetroPie Project splash boot" tabindex="0" loading="lazy"><figcaption>RetroPie Project splash boot</figcaption></figure>
<p>I'm very excited to share with us this post 😄</p>
<p>I decided to make a tutorial a little longer than usual. Today we will test this distribution based on <em>Raspbian</em> and making accessible to anyone the world of emulators with a <em>Raspberry Pi</em> as I mentioned <a href="/post.phpid=103">above</a>. Let's Start!</p>
<p><strong><em>NOTE:</em></strong> This review is based on SD-card image from <em>03/07/2013</em>, but also is valid for the script you can find on <a href="https://github.com/petrockblog/RetroPie-Setup" target="_blank" rel="noopener noreferrer">GiHub</a>.</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/2013/03/retrop_01_min.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>RetroPie Project SD Card Image</title>
      <link>https://misapuntesde.com/2013/03/retropie-project-sd-card-image.html</link>
      <guid>https://misapuntesde.com/2013/03/retropie-project-sd-card-image.html</guid>
      <source url="https://misapuntesde.com/rss.xml">RetroPie Project SD Card Image</source>
      <description>RetroPie Project SD Card Image</description>
      <category>Raspberry PI</category>
      <pubDate>Fri, 15 Mar 2013 10:40:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/retropieprojectlogofinish.jpg" alt="retropie" tabindex="0" loading="lazy"><figcaption>retropie</figcaption></figure>
<p>This is an SD-card image with a ready-to-go installation of the RetroPie Setup Script. It needs an SD-card with at least 4 GB space.</p>
<p>If you want to know what systems are supported...</p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/retropieprojectlogofinish.jpg" type="image/jpeg"/>
    </item>
    <item>
      <title>RISC OS Pi</title>
      <link>https://misapuntesde.com/2013/03/risc-os-pi.html</link>
      <guid>https://misapuntesde.com/2013/03/risc-os-pi.html</guid>
      <source url="https://misapuntesde.com/rss.xml">RISC OS Pi</source>
      <description>RISC OS Pi</description>
      <category>Raspberry PI</category>
      <pubDate>Sun, 31 Mar 2013 14:30:00 GMT</pubDate>
      <content:encoded><![CDATA[
<figure><img src="/images/riscOS_sshot.jpg" alt="riscos" tabindex="0" loading="lazy"><figcaption>riscos</figcaption></figure>
<p>I have wanted to have a look at this great operating system. Perhaps preparing a post in Spanish, as I have not seen one and could be useful to someone. What do you think?</p>
<p>Meanwhile, I leave you with this one that I found very useful.</p>
<p>Link: <a href="https://www.element14.com/community/blogs/mirandasoft/2013/03/24/raspberry-pi-discovering-risc-os-pi" target="_blank" rel="noopener noreferrer">element14 - Discovering RISC OS Pi</a></p>
]]></content:encoded>
      <enclosure url="https://misapuntesde.com/images/riscOS_sshot.jpg" type="image/jpeg"/>
    </item>
  </channel>
</rss>