<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ezequiel Santos</title>
    <description>The latest articles on DEV Community by Ezequiel Santos (@ezefranca).</description>
    <link>https://dev.to/ezefranca</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F162506%2Fd6e7e3b5-5567-4485-a53e-9e4aaa2f366d.jpeg</url>
      <title>DEV Community: Ezequiel Santos</title>
      <link>https://dev.to/ezefranca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ezefranca"/>
    <language>en</language>
    <item>
      <title>Simplifying PRISMA 2009 Flow Diagrams in LaTeX with prisma-flow-diagram</title>
      <dc:creator>Ezequiel Santos</dc:creator>
      <pubDate>Mon, 17 Feb 2025 15:25:00 +0000</pubDate>
      <link>https://dev.to/ezefranca/simplifying-prisma-2009-flow-diagrams-in-latex-with-prisma-flow-diagram-22kl</link>
      <guid>https://dev.to/ezefranca/simplifying-prisma-2009-flow-diagrams-in-latex-with-prisma-flow-diagram-22kl</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When writing systematic reviews, PRISMA flow diagrams are essential for documenting study selection processes. However, manually creating these diagrams in LaTeX can be cumbersome. The &lt;code&gt;prisma-flow-diagram&lt;/code&gt; package simplifies this process by providing structured commands while leveraging TikZ for high-quality rendering.&lt;/p&gt;

&lt;p&gt;This post covers how to install and use &lt;code&gt;prisma-flow-diagram&lt;/code&gt; to generate PRISMA 2009 flow diagrams in LaTeX effortlessly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;prisma-flow-diagram&lt;/code&gt; package is available on &lt;a href="https://ctan.org/pkg/prisma-flow-diagram" rel="noopener noreferrer"&gt;CTAN&lt;/a&gt; and can be installed directly via TeX Live or MiKTeX package managers.&lt;/p&gt;

&lt;p&gt;To manually install, download &lt;code&gt;prisma-flow-diagram.sty&lt;/code&gt; from the &lt;a href="https://github.com/ezefranca/prisma-flow-diagram" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; and place it in the same directory as your &lt;code&gt;.tex&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Then, include the package in your LaTeX preamble:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\usepackage&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;prisma-flow-diagram&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;The package provides intuitive commands to construct PRISMA diagrams efficiently. Below are the main commands:&lt;/p&gt;

&lt;h3&gt;
  
  
  Basic Commands
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;\prismaflowstart&lt;/code&gt; – Initializes the flow diagram.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\prismaflownode{&amp;lt;id&amp;gt;}{&amp;lt;position&amp;gt;}{&amp;lt;text&amp;gt;}{&amp;lt;arrow source&amp;gt;}&lt;/code&gt; – Defines a node.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\prismalabel{&amp;lt;size&amp;gt;}{&amp;lt;position&amp;gt;}{&amp;lt;text&amp;gt;}&lt;/code&gt; – Adds a label.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\prismaflowarrow{&amp;lt;source&amp;gt;}{&amp;lt;destination&amp;gt;}&lt;/code&gt; – Manually connects nodes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;\prismaflowend&lt;/code&gt; – Ends the flow diagram.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Here’s a complete LaTeX example using the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tex"&gt;&lt;code&gt;&lt;span class="k"&gt;\documentclass&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;article&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\usepackage&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;prisma-flow-diagram&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nt"&gt;\begin{document}&lt;/span&gt;

&lt;span class="nt"&gt;\begin{figure}&lt;/span&gt;[H]
&lt;span class="k"&gt;\resizebox&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="k"&gt;\textwidth&lt;/span&gt;&lt;span class="p"&gt;}{&lt;/span&gt;!&lt;span class="p"&gt;}{&lt;/span&gt;
&lt;span class="k"&gt;\prismaflowstart&lt;/span&gt;

&lt;span class="c"&gt;% Identification phase&lt;/span&gt;
&lt;span class="k"&gt;\prismaflownode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n1a&lt;span class="p"&gt;}{&lt;/span&gt;left=of tc&lt;span class="p"&gt;}{&lt;/span&gt;Records identified through database searching (n = 251)&lt;span class="p"&gt;}{}&lt;/span&gt;;
&lt;span class="k"&gt;\prismaflownode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n1b&lt;span class="p"&gt;}{&lt;/span&gt;right=of tc&lt;span class="p"&gt;}{&lt;/span&gt;Additional records identified through other sources (n = 0)&lt;span class="p"&gt;}{}&lt;/span&gt;;
&lt;span class="k"&gt;\prismaflownode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n2&lt;span class="p"&gt;}{&lt;/span&gt;below=of tc |- n1a.south&lt;span class="p"&gt;}{&lt;/span&gt;Records after duplicates removed (n = 41)&lt;span class="p"&gt;}{&lt;/span&gt;n1a&lt;span class="p"&gt;}&lt;/span&gt;;
&lt;span class="k"&gt;\prismaflowarrow&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n1b&lt;span class="p"&gt;}{&lt;/span&gt;n2&lt;span class="p"&gt;}&lt;/span&gt;;

&lt;span class="c"&gt;% Screening phase&lt;/span&gt;
&lt;span class="k"&gt;\prismaflownode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n3&lt;span class="p"&gt;}{&lt;/span&gt;below=of n2&lt;span class="p"&gt;}{&lt;/span&gt;Records screened (n = 210)&lt;span class="p"&gt;}{&lt;/span&gt;n2&lt;span class="p"&gt;}&lt;/span&gt;;
&lt;span class="k"&gt;\prismaflownode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n3r&lt;span class="p"&gt;}{&lt;/span&gt;right=of n3&lt;span class="p"&gt;}{&lt;/span&gt;Records excluded (n = 175)&lt;span class="p"&gt;}{}&lt;/span&gt;;
&lt;span class="k"&gt;\prismaflowarrow&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n3&lt;span class="p"&gt;}{&lt;/span&gt;n3r&lt;span class="p"&gt;}&lt;/span&gt;;

&lt;span class="c"&gt;% Eligibility phase&lt;/span&gt;
&lt;span class="k"&gt;\prismaflownode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n4&lt;span class="p"&gt;}{&lt;/span&gt;below=of n3&lt;span class="p"&gt;}{&lt;/span&gt;Full-text articles assessed for eligibility (n = 35)&lt;span class="p"&gt;}{&lt;/span&gt;n3&lt;span class="p"&gt;}&lt;/span&gt;;
&lt;span class="k"&gt;\prismaflownode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n4r&lt;span class="p"&gt;}{&lt;/span&gt;right=of n4&lt;span class="p"&gt;}{&lt;/span&gt;Full-text articles excluded, with reasons (n = 4) &lt;span class="k"&gt;\\&lt;/span&gt; - Not Relevant (n = 3) &lt;span class="k"&gt;\\&lt;/span&gt; - Not Open/Available paper (n = 2)&lt;span class="p"&gt;}{}&lt;/span&gt;;
&lt;span class="k"&gt;\prismaflowarrow&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n4&lt;span class="p"&gt;}{&lt;/span&gt;n4r&lt;span class="p"&gt;}&lt;/span&gt;;

&lt;span class="c"&gt;% Inclusion phase&lt;/span&gt;
&lt;span class="k"&gt;\prismaflownode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n5&lt;span class="p"&gt;}{&lt;/span&gt;below=of n4&lt;span class="p"&gt;}{&lt;/span&gt;Studies included in qualitative synthesis (n = 30)&lt;span class="p"&gt;}{&lt;/span&gt;n4&lt;span class="p"&gt;}&lt;/span&gt;;
&lt;span class="k"&gt;\prismaflownode&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;n6&lt;span class="p"&gt;}{&lt;/span&gt;below=of n5&lt;span class="p"&gt;}{&lt;/span&gt;Studies included in quantitative synthesis (meta-analysis)&lt;span class="p"&gt;}{&lt;/span&gt;n5&lt;span class="p"&gt;}&lt;/span&gt;;

&lt;span class="c"&gt;% Labels&lt;/span&gt;
&lt;span class="k"&gt;\prismalabel&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;1.3*&lt;span class="k"&gt;\mh&lt;/span&gt;&lt;span class="p"&gt;}{&lt;/span&gt;n1a.west&lt;span class="p"&gt;}{&lt;/span&gt;Identification&lt;span class="p"&gt;}&lt;/span&gt;;
&lt;span class="k"&gt;\prismalabel&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;1.3*&lt;span class="k"&gt;\mh&lt;/span&gt;&lt;span class="p"&gt;}{&lt;/span&gt;n1a.west |- &lt;span class="p"&gt;{$&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;n&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)!&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="o"&gt;!(&lt;/span&gt;&lt;span class="nb"&gt;n&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;$}}{&lt;/span&gt;Screening&lt;span class="p"&gt;}&lt;/span&gt;;
&lt;span class="k"&gt;\prismalabel&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;1.3*&lt;span class="k"&gt;\mh&lt;/span&gt;&lt;span class="p"&gt;}{&lt;/span&gt;n1a.west |- &lt;span class="p"&gt;{$&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;n&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="o"&gt;)!&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="o"&gt;!(&lt;/span&gt;&lt;span class="nb"&gt;n&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;$}}{&lt;/span&gt;Eligibility&lt;span class="p"&gt;}&lt;/span&gt;;
&lt;span class="k"&gt;\prismalabel&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;1.3*&lt;span class="k"&gt;\mh&lt;/span&gt;&lt;span class="p"&gt;}{&lt;/span&gt;n1a.west |- n6&lt;span class="p"&gt;}{&lt;/span&gt;Included&lt;span class="p"&gt;}&lt;/span&gt;;

&lt;span class="k"&gt;\prismaflowend&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\caption&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;PRISMA 2009 Flow Diagram&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;\label&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;fig:prisma&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;\end{figure}&lt;/span&gt;

&lt;span class="nt"&gt;\end{document}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Final remarks
&lt;/h2&gt;

&lt;p&gt;Creating PRISMA flow diagrams in LaTeX no longer needs to be a tedious task. With &lt;code&gt;prisma-flow-diagram&lt;/code&gt;, you can generate clean, structured, and customizable diagrams efficiently. Try it out in your next systematic review and streamline your documentation workflow.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;prisma-flow-diagram&lt;/code&gt; package is licensed under LPPL 1.3c. Feel free to contribute via &lt;a href="https://github.com/ezefranca/prisma-flow-diagram" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; by opening issues or submitting pull requests.&lt;/p&gt;

</description>
      <category>latex</category>
      <category>research</category>
      <category>academia</category>
      <category>opensource</category>
    </item>
    <item>
      <title>CocoaPods is in Maintenance Mode</title>
      <dc:creator>Ezequiel Santos</dc:creator>
      <pubDate>Thu, 22 Aug 2024 21:14:35 +0000</pubDate>
      <link>https://dev.to/ezefranca/cocoapods-is-in-maintenance-mode-27cn</link>
      <guid>https://dev.to/ezefranca/cocoapods-is-in-maintenance-mode-27cn</guid>
      <description>&lt;p&gt;With the recent announcement that &lt;a href="https://blog.cocoapods.org/CocoaPods-Support-Plans/" rel="noopener noreferrer"&gt;CocoaPods is officially in maintenance mode&lt;/a&gt;, the iOS development community is entering a transition period. Active development of new features for CocoaPods has stopped, and while security patches and compatibility updates will continue, it’s clear that CocoaPods’ role in iOS development is becoming more limited. &lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://www.computer.org/csdl/proceedings-article/mobilesoft/2024/059400a078/1XQIQL7D9TO" rel="noopener noreferrer"&gt;survey I presented at the 2024 IEEE/ACM MOBILESoft conference&lt;/a&gt;, over 70% of iOS developers already favor &lt;strong&gt;Swift Package Manager (SPM)&lt;/strong&gt; for their dependency management. SPM's tight integration with Xcode and native support from Apple have made it the go-to tool for most developers. The trend is undeniable: SPM is the future of iOS dependency management.&lt;/p&gt;

&lt;p&gt;CocoaPods has served us well for over a decade, simplifying the once-complicated process of managing third-party libraries. But as iOS development has evolved, so have the tools. SPM provides a more streamlined and officially supported workflow, making it the preferred option for the majority of iOS developers.&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;not everyone can migrate overnight&lt;/strong&gt;. For certain frameworks like &lt;strong&gt;Unity&lt;/strong&gt;, &lt;strong&gt;React Native&lt;/strong&gt;, and &lt;strong&gt;Flutter&lt;/strong&gt;, CocoaPods still plays a critical role in managing dependencies. These frameworks rely on CocoaPods for edge cases that SPM has yet to fully cover. So while SPM is the future, CocoaPods is still essential for these specific environments.&lt;/p&gt;

&lt;p&gt;For those still relying on CocoaPods, this is kinda a "countdown". While there’s no immediate need to panic, it’s time to &lt;strong&gt;start planning your migration strategy&lt;/strong&gt;. The CocoaPods team will keep the tool functional for the time being, but this is a signal to gradually transition your projects to &lt;strong&gt;Swift Package Manager&lt;/strong&gt; where possible.&lt;/p&gt;

&lt;p&gt;It’s important to not be lazy to get it till the last day (like many companies did with Privacy Manifest) as well keep an eye on developments in SPM as Apple continues to enhance its capabilities till the point to be capable to fully replaces CocoaPods edge use case.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>cocoapods</category>
      <category>swiftpackagemanager</category>
      <category>dependency</category>
    </item>
    <item>
      <title>Dynamic Publication List from Google Scholar</title>
      <dc:creator>Ezequiel Santos</dc:creator>
      <pubDate>Thu, 04 Apr 2024 13:35:55 +0000</pubDate>
      <link>https://dev.to/ezefranca/dynamic-publication-list-from-google-scholar-4emd</link>
      <guid>https://dev.to/ezefranca/dynamic-publication-list-from-google-scholar-4emd</guid>
      <description>&lt;p&gt;Hey you! Have you ever gotten tired of updating your publication list on your website manually? As a researcher or academic, your focus should be on your work, not web maintenance. Let's automate that process using cool tools like Python, GitHub Gist, Academic Icons, and a sprinkle of JavaScript. Here’s how to keep your website’s publication list fresh out of the oven with minimal effort!&lt;/p&gt;

&lt;h2&gt;
  
  
  Whip Up a JSON File with Python
&lt;/h2&gt;

&lt;p&gt;First up, let's grab those publications from Google Scholar. You can cook this up in a Google Colab or Jupyter Notebook. It’s as easy as pie!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;scholarly&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;publications&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;scholarly_publications&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ScholarlyPublications&lt;/span&gt;

&lt;span class="n"&gt;scholar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ScholarlyPublications&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;publications&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;scholar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_publications&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;your_google_scholar_id_here&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;publications.json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;publications&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can check a &lt;a href="https://colab.research.google.com/drive/1xzH6hWNf-vGngA5dq2W-CImMRZq3Fz5u?usp=sharing" rel="noopener noreferrer"&gt;example here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Make sure to swap &lt;code&gt;'your_google_scholar_id_here'&lt;/code&gt; with your actual ID. You can find this in the URL when you view your profile on Google Scholar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dress It Up with Academic Icons
&lt;/h2&gt;

&lt;p&gt;Now, let’s make it pretty with Academic Icons. Pop this link into the &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; of your HTML to get started:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://cdnjs.cloudflare.com/ajax/libs/academicons/1.9.1/css/academicons.min.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check out &lt;a href="https://jpswalsh.github.io/academicons/" rel="noopener noreferrer"&gt;Academicons&lt;/a&gt; to see all the cool icons you can use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serve It with GitHub Gist
&lt;/h2&gt;

&lt;p&gt;GitHub Gist is our plate for this dish. Upload your &lt;code&gt;publications.json&lt;/code&gt; there. It’s perfect for snippets and files, and you can update it anytime. Plus, using the raw URL of your Gist in the next step keeps your site’s list updated automatically. Sweet, huh?&lt;/p&gt;

&lt;p&gt;When you upload to GitHub Gist, your URL will look something like this: &lt;code&gt;https://gist.github.com/username/gist_id&lt;/code&gt;. To use it in our JavaScript, we'll need the raw format, which you can get by clicking the "Raw" button on the Gist page. This URL will look like: &lt;code&gt;https://gist.githubusercontent.com/username/gist_id/raw/publications.json&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Load It Up with JavaScript
&lt;/h2&gt;

&lt;p&gt;Finally, let's add some JavaScript magic to load this list dynamically onto your site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loadPublications&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publicationsURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://gist.githubusercontent.com/your_username/gist_id/raw/publications.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publicationsURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Network response was not ok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;publications&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;publicationsList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;publicationsList&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;publications&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pub&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pubItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;p&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;pubItem&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;`&amp;lt;strong&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;{pub.year}&amp;lt;/strong&amp;gt;: &amp;lt;a href="&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;{pub.link}" target="_blank"&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\$&lt;/span&gt;&lt;span class="s2"&gt;{pub.title}&amp;lt;/a&amp;gt; &amp;lt;i class="ai ai-google-scholar-square ai-1x"&amp;gt;&amp;lt;/i&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="s2"&gt;;
        publicationsList.appendChild(pubItem);
      });
    })
    .catch(error =&amp;gt; {
      console.error('Could not load publications:', error);
    });
}

document.addEventListener('DOMContentLoaded', loadPublications);
&amp;lt;/script&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just replace &lt;code&gt;"https://gist.githubusercontent.com/your_username/gist_id/raw/publications.json"&lt;/code&gt; with the raw URL of your Gist file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;And there you have it! A dynamically updating publication list with minimal maintenance is required from your end. Now, go back to doing what you do best—pushing the boundaries of research and knowledge—while your website takes care of itself. 🚀&lt;/p&gt;

&lt;p&gt;You can check a example here: &lt;a href="https://github.com/ezefranca/nicolelis" rel="noopener noreferrer"&gt;https://github.com/ezefranca/nicolelis&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As well the live version: &lt;a href="https://ezefranca.com/nicolelis/" rel="noopener noreferrer"&gt;https://ezefranca.com/nicolelis/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>javascript</category>
      <category>academia</category>
    </item>
    <item>
      <title>Dealing with Premultiplied alpha on iOS</title>
      <dc:creator>Ezequiel Santos</dc:creator>
      <pubDate>Wed, 19 Feb 2020 16:27:32 +0000</pubDate>
      <link>https://dev.to/ezefranca/dealing-with-premultiplied-alpha-on-ios-2aob</link>
      <guid>https://dev.to/ezefranca/dealing-with-premultiplied-alpha-on-ios-2aob</guid>
      <description>&lt;p&gt;In computer graphics there are two different ways to represent the opacity of a color value: Straight alpha and Premultiplied alpha.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When using straight, also known as linear, alpha:&lt;br&gt;
    - RGB values specify the color of the thing being drawn&lt;br&gt;
    - The alpha value specifies how solid it is&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this world, RGB and alpha are independent. We can change one without affecting the other. To make an object fade out, we would gradually reduce its alpha value while leaving RGB unchanged.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When using premultiplied:&lt;br&gt;
     - RGB specifies how much color the thing being drawn contributes to the output&lt;br&gt;
     - The alpha value specifies how much it obscures whatever is behind it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this world, RGB and alpha are linked. To make an object transparent we must reduce both its RGB (to contribute less color) and also its alpha (to obscure less of whatever is behind it). Fully transparent objects no longer have any color at all, so there is only one value that represents 100% transparency: RGB and alpha all zero.&lt;/p&gt;

&lt;p&gt;Some days ago, I’d been racking my brains all day to solve one problem during an image processing on one of the apps on my work. &lt;/p&gt;

&lt;p&gt;It's just a simple bit manipulation inside an image, and when I run the app on simulator on my machine, everything was fine, but on a real device I got different values.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F79dc0037ev1c3ltgki96.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F79dc0037ev1c3ltgki96.jpg" alt="Alt Text" width="650" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Real device (iPhone XR in my case) renders using premultiplied and the simulator uses straight.&lt;/p&gt;

&lt;p&gt;For example, for the same pixel I got this:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;On Simulator&lt;/em&gt;: &lt;code&gt;R = 254, G = 254, B = 254, A = 254&lt;/code&gt;&lt;br&gt;
&lt;em&gt;On a Real Device&lt;/em&gt;: &lt;code&gt;R = 253, G = 253, B = 253, A = 254&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Just refreshing a little bit about images and pixels: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In digital imaging, a pixel, is a physical point in a raster image, or the smallest addressable element in an all points addressable display device; so it is the smallest controllable element of a picture represented on the screen. &lt;/p&gt;

&lt;p&gt;The RGB color model is an additive color model in which red, green, and blue light are added together in various ways to reproduce a broad array of colors. The name of the model comes from the initials of the three additive primary colors, red, green, and blue. (Wikipedia)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;How to solve? It's not hard, but when it's your first time dealing with could be. &lt;/p&gt;

&lt;p&gt;First thing, my main problem was get the &lt;strong&gt;correct&lt;/strong&gt; color of a pixel. So, I created this extension to help me:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;extension&lt;/span&gt; &lt;span class="kt"&gt;UIImage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;subscript&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="kt"&gt;UIColor&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;guard&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;cgImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cgImage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cgImage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dataProvider&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;providerData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;provider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CFDataGetBytePtr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;providerData&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;nil&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;numberOfComponents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;pixelData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;numberOfComponents&lt;/span&gt;

        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pixelData&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pixelData&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pixelData&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;pixelData&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kt"&gt;UIColor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;red&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;green&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PS: Why &lt;code&gt;(x: Int, y: Int)&lt;/code&gt; instead of a &lt;code&gt;CGPoint&lt;/code&gt;? Answer: No problem.&lt;/p&gt;

&lt;p&gt;Ok, now I have the UIColor for one exact point. But it's not considering premultiplied alpha. &lt;/p&gt;

&lt;p&gt;Since Apple provides on &lt;em&gt;CGImage&lt;/em&gt; a property called &lt;em&gt;CGImageAlphaInfo&lt;/em&gt; who gives you which kind of alpha you have.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.apple.com/documentation/coregraphics/cgimagealphainfo?language=swift" rel="noopener noreferrer"&gt;https://developer.apple.com/documentation/coregraphics/cgimagealphainfo?language=swift&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And for premultiplied we have:  (last and first) in my case last&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.apple.com/documentation/coregraphics/cgimagealphainfo/kcgimagealphapremultipliedfirst?language=swift" rel="noopener noreferrer"&gt;https://developer.apple.com/documentation/coregraphics/cgimagealphainfo/kcgimagealphapremultipliedfirst?language=swift&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;kCGImageAlphaPremultipliedLast&lt;/strong&gt;&lt;br&gt;
The alpha component is stored in the least significant bits of each pixel and the color components have already been multiplied by this alpha value. For example, premultiplied RGBA.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's it, surprisely easy to fix, the RGB values are multiplied by the alpha value, so, we just need to revert this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;premultiplied.R = (straight.R * straight.A / 255);
premultiplied.G = (straight.G * straight.A / 255);
premultiplied.B = (straight.B * straight.A / 255);
premultiplied.A = straight.A;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And we just need to do the opposite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;straight.R = (premultiplied.R / straight.A) * 255;
straight.G = (premultiplied.G / straight.A) * 255;
straight.B = (premultiplied.B / straight.A) * 255;
straight.A = premultiplied.A;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After figure out that, I create this extension to get the color of a pixel passing the &lt;code&gt;CGImageAlphaInfo&lt;/code&gt; as parameter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight swift"&gt;&lt;code&gt;&lt;span class="kd"&gt;extension&lt;/span&gt; &lt;span class="kt"&gt;UIColor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;rgb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;alphaInfo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGImageAlphaInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;red&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                            &lt;span class="nv"&gt;green&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                             &lt;span class="nv"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
                                            &lt;span class="nv"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;fRed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;fGreen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;fBlue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;fAlpha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kt"&gt;CGFloat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getRed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fRed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;green&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fGreen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fBlue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;fAlpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

            &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;iRed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fRed&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;
            &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;iGreen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fGreen&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;
            &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="nv"&gt;iBlue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fBlue&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;
            &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;iAlpha&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fAlpha&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;255.0&lt;/span&gt;

            &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;alphaInfo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;premultipliedLast&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;iRed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iRed&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;iAlpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;
                    &lt;span class="n"&gt;iGreen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iGreen&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;iAlpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;
                    &lt;span class="n"&gt;iBlue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iBlue&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;iAlpha&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;
            &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;red&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iRed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rounded&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;   

                  &lt;span class="nv"&gt;green&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iGreen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rounded&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;   

                   &lt;span class="nv"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iBlue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rounded&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; 

                  &lt;span class="nv"&gt;alpha&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kt"&gt;UInt8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;iAlpha&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rounded&lt;/span&gt;&lt;span class="p"&gt;()))&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Could not extract RGBA components:&lt;/span&gt;
            &lt;span class="nf"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fixed! Now it's working. After that is time to refactor these extensions to something better. For this post I end here. Thanks for reading.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>coreimage</category>
      <category>rgb</category>
      <category>alpha</category>
    </item>
  </channel>
</rss>
