<?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: Pascal Maniraho</title>
    <description>The latest articles on DEV Community by Pascal Maniraho (@murindwaz).</description>
    <link>https://dev.to/murindwaz</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%2F26655%2Fcddbe58d-cea0-47fc-b862-e23c611eccb6.jpeg</url>
      <title>DEV Community: Pascal Maniraho</title>
      <link>https://dev.to/murindwaz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/murindwaz"/>
    <language>en</language>
    <item>
      <title>How to install Let's Encrypt SSL Certificate on Ubuntu and Nginx Server</title>
      <dc:creator>Pascal Maniraho</dc:creator>
      <pubDate>Wed, 04 Apr 2018 17:43:45 +0000</pubDate>
      <link>https://dev.to/murindwaz/how-to-install-lets-encrypt-ssl-certificate-on-ubuntu-and-nginx-server-59h</link>
      <guid>https://dev.to/murindwaz/how-to-install-lets-encrypt-ssl-certificate-on-ubuntu-and-nginx-server-59h</guid>
      <description>&lt;h2&gt;
  
  
  &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F0%2Amw__iDefkSLbVuki." alt="Your encryption will need keys"&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;This article appeared on my &lt;a href="https://blog.hoo.gy/2018/03/13/how-to-install-lets-encrypt-ssl-certificate-on-ubuntu-and-nginx-server/" rel="noopener noreferrer"&gt;blog&lt;/a&gt;, and &lt;a href="https://medium.com/hoopeez/how-to-install-lets-encrypt-ssl-certificate-on-ubuntu-and-nginx-server-ffa363b94723" rel="noopener noreferrer"&gt;medium&lt;/a&gt;. Share with your friends ;-)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As opposed to other most SSL certificate issuers, &lt;em&gt;&lt;a href="https://letsencrypt.org/getting-started/" rel="noopener noreferrer"&gt;Let's encrypt&lt;/a&gt;&lt;/em&gt; is not only free to use but also easy to install and update. This write-up highlights steps I followed to install mine on both &lt;a href="https://app.hoo.gy" rel="noopener noreferrer"&gt;Hoo.gy&lt;/a&gt; and &lt;a href="https://blog.hoo.gy" rel="noopener noreferrer"&gt;Hoo.gy Blog&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;The motivation to write this article is threefold. First, this article serves as a reference for future needs, using &lt;em&gt;&lt;a href="https://letsencrypt.org/getting-started/" rel="noopener noreferrer"&gt;Let's encrypt&lt;/a&gt;&lt;/em&gt;. Second, sharing experience with developer community is another form of learning. Third, as a token of appreciation to &lt;a href="https://letsencrypt.org/isrg/" rel="noopener noreferrer"&gt;the team that democratizes&lt;/a&gt; this core part of security infrastructure. &lt;/p&gt;

&lt;p&gt;This article is divided into 4 major sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install necessary software&lt;/li&gt;
&lt;li&gt;Generate Key and Certificate
&lt;/li&gt;
&lt;li&gt;Install Certificate(s) on Nginx&lt;/li&gt;
&lt;li&gt;Enforce HTTS redirection&lt;/li&gt;
&lt;li&gt;Certificate Auto-renewal&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Acknowledgments: To my friend and security nerd &lt;em&gt;&lt;a href="https://twitter.com/jc_uwimpuhwe" rel="noopener noreferrer"&gt;@jc_uwimpuhwe&lt;/a&gt;&lt;/em&gt; for proof-reading and idea enrichments.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Install necessary software&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://app.hoo.gy" rel="noopener noreferrer"&gt;Hoo.gy&lt;/a&gt;&lt;/strong&gt; runs on &lt;strong&gt;Ubuntu 14 LTS&lt;/strong&gt; Linux box located at NYC &lt;a href="https://www.digitalocean.com/" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; datacenter. The NodeJS web server is coupled with &lt;strong&gt;Nginx&lt;/strong&gt;. From this perspective, I will suppose your system runs a similar stack.&lt;/p&gt;

&lt;p&gt;Certificate Issuance is done via a bot, &lt;a href="https://certbot.eff.org/#ubuntutrusty-nginx" rel="noopener noreferrer"&gt;Certbot&lt;/a&gt;, and covers a wide variety of Operating Systems and Web Servers. First, the step was to update and install latest packages, as well as making sure Ubuntu includes a new source of packages.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;software-properties-common
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;add-apt-repository ppa:certbot/certbot
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;python-certbot-nginx 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second step installs &lt;a href="https://certbot.eff.org/#ubuntutrusty-nginx" rel="noopener noreferrer"&gt;certbot&lt;/a&gt; on the box. The following command is good for Nginx server, but more can be found at &lt;a href="https://certbot.eff.org/" rel="noopener noreferrer"&gt;eff.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are two possible modes to generate SSL certificates. That is going to be the subject of the following section.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generate Key and Certificate&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The default mode is designed for regular Linux users. Everything is taken care of after you run the next command. Certbot generates proper keys+certificate and automatically update Nginx configuration files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For more advanced users, who rather like they key+certificate, and install certificates as it pleases them, this command will help them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt; &lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; certonly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After generating private key and certificate, in addition, you will need to &lt;em&gt;install certificates&lt;/em&gt;, &lt;em&gt;re-enforce HTTPS redirection&lt;/em&gt;, and to &lt;em&gt;automate certificate renewals&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install Certificate(s) on Nginx&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since you are already running Nginx in production, chances are you don't want anything to mess with your custom configurations. The second command gives you just that. There are two ways to do install certificates: first is to keep your configurations intact, and &lt;strong&gt;symlink&lt;/strong&gt; new certificates. The second is obviously to change configuration links to a new location. I preferred the latter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# in /etc/nginx/sites-enabled/[your-config-file]&lt;/span&gt;
server&lt;span class="o"&gt;{&lt;/span&gt;
  ...  
  listen 443 ssl&lt;span class="p"&gt;;&lt;/span&gt;
  server_name example.com&lt;span class="p"&gt;;&lt;/span&gt;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem&lt;span class="p"&gt;;&lt;/span&gt;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem&lt;span class="p"&gt;;&lt;/span&gt;  
  ...
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For some reasons, I was accustomed to &lt;strong&gt;chained.crt&lt;/strong&gt; for certificate and &lt;strong&gt;key.crt&lt;/strong&gt; for the keys. The switch is not that difficult though. Certbot generates same files under slightly different names: &lt;strong&gt;privatekey.pem&lt;/strong&gt; for keys, and &lt;strong&gt;fullchain.pem&lt;/strong&gt; for certificates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enforce HTTPS redirection&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;There is a lot of discussions on this topic. Software developers are the worst people to have a discussion with. We always end up in tribalism, and who does it better. One way that made sense in my case, was to create a new server block in existing configuration file and redirect any request to marching this new server block, to a server block that listens only to HTTPS. The new block looks somehow like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;server&lt;span class="o"&gt;{&lt;/span&gt;
 listen 80&lt;span class="p"&gt;;&lt;/span&gt;
 server_name example.com www.example.com&lt;span class="p"&gt;;&lt;/span&gt;

 &lt;span class="c"&gt;# redirect, and rewrite all links to https://example.com &lt;/span&gt;
 &lt;span class="k"&gt;return &lt;/span&gt;301 https://example.com&lt;span class="nv"&gt;$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

 &lt;span class="c"&gt;# Alternatively: if you want to forward without rewriting requested URL &lt;/span&gt;
 &lt;span class="k"&gt;return &lt;/span&gt;301 https://&lt;span class="nv"&gt;$server_name$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Customization of nginx configuration can be a whole new topic on its own, but I cannot close this post without talking about two things: auto-renewal(using a cron job) and redirect all traffic to secure channel. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatic renewal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SSL certificates issues by &lt;em&gt;&lt;strong&gt;Let's encrypt&lt;/strong&gt;&lt;/em&gt; last for 90 days. Which is not a bad thing on its own. If you have 1000+ servers to update every 90 days, though ... that would be a nightmare. Whence you need some sort of automation. How to go about that, is the last topic in this blog post. &lt;/p&gt;

&lt;p&gt;First of all, to renew certificate from Let's Encrypt takes a second ... if everything works according to the plan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot renew &lt;span class="nt"&gt;--dry-run&lt;/span&gt;
&lt;span class="c"&gt;# or simply:&lt;/span&gt;
&lt;span class="c"&gt;# $ sudo certbot renew&lt;/span&gt;
&lt;span class="c"&gt;# restart the nginx server&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx restart 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you are lucky to have a smaller configuration and used auto-renewal strategy, you may have a cronjob similar to the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# file: /etc/cron.d/certbot&lt;/span&gt;
0 &lt;span class="k"&gt;*&lt;/span&gt;/12 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; root &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-x&lt;/span&gt; /usr/bin/certbot &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="se"&gt;\!&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; /run/systemd/system &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; perl &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s1"&gt;'sleep int(rand(3600))'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; certbot &lt;span class="nt"&gt;-q&lt;/span&gt; renew
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Code snippet from &lt;a href="https://serverfault.com/a/879711" rel="noopener noreferrer"&gt;Ishigoya ~ Serverfault&lt;/a&gt;&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;It is possible to customize frequency, and restart command. The cronjob gives you a way to calibrate dates by using this star format: cronjob [minute, hour, the day of the month, month, the day of week].  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This cron runs every day around 5:30 server time: _30 5 * * * ... _
&lt;/li&gt;
&lt;li&gt;This one runs same time, every bi-monthly(1st and 15th) &lt;em&gt;30 5 1,15 * * ...&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;This last one runs same time, every two months: &lt;em&gt;30 5 * */2 *&lt;/em&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So your cronjob may end up looking like the following if you wish to renew certificates every day around 5:30 server time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;30 5 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; certbot renew &lt;span class="nt"&gt;--post-hook&lt;/span&gt; &lt;span class="s2"&gt;"service nginx restart"&lt;/span&gt;
&lt;span class="c"&gt;# alternatively: using systemctrl &lt;/span&gt;
&lt;span class="c"&gt;# 30 5 * * * certbot renew --post-hook "systemctl reload nginx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please consider a donation for this service to service at &lt;a href="https://letsencrypt.org/donate/" rel="noopener noreferrer"&gt;Let's Encrypt&lt;/a&gt;.Even though thoughts discussed in this article seems simple(not to say naive security-wise), there are enhancements done atop Let’s Encrypt foundations, that makes this choice rock solid. If you work in Containers environment, especially Kubernetes, you should check &lt;a href="https://twitter.com/kelseyhightower" rel="noopener noreferrer"&gt;Kelsey Hightower’s&lt;/a&gt; &lt;a href="https://github.com/kelseyhightower/kube-cert-manager" rel="noopener noreferrer"&gt;Kube Cert Manager&lt;/a&gt; project on Github. Netflix’s &lt;a href="https://github.com/Netflix/lemur" rel="noopener noreferrer"&gt;Lemur&lt;/a&gt; is another alternative to manage certificates, you can read an &lt;a href="https://medium.com/netflix-techblog/introducing-lemur-ceae8830f621" rel="noopener noreferrer"&gt;introductory article here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reading list&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/should-designers-code/how-to-set-up-ssl-with-lets-encrypt-on-heroku-for-free-266c185630db" rel="noopener noreferrer"&gt;How to setup SSL Let’s Encrypt on Heroku for free&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.exratione.com/2013/06/websockets-over-ssl-with-nodejs-and-nginx/" rel="noopener noreferrer"&gt;WebSockets Over SSL With Node.js and Nginx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;More on Nginx HTTPS redirection discussions: &lt;a href="https://serverfault.com/a/258424" rel="noopener noreferrer"&gt;1&lt;/a&gt;, &lt;a href="https://bjornjohansen.no/redirect-to-https-with-nginx" rel="noopener noreferrer"&gt;2&lt;/a&gt;, &lt;a href="https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#using-if" rel="noopener noreferrer"&gt;3&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/netflix-techblog/introducing-lemur-ceae8830f621" rel="noopener noreferrer"&gt;Introducing Lemur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc5915" rel="noopener noreferrer"&gt;Elliptic Curve Private Key Structure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nginx</category>
      <category>ssl</category>
      <category>letsencrypt</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to add better code snippets in presentations and blog posts?</title>
      <dc:creator>Pascal Maniraho</dc:creator>
      <pubDate>Thu, 16 Nov 2017 02:19:16 +0000</pubDate>
      <link>https://dev.to/murindwaz/how-to-add-better-code-snippets-in-presentations-and-blog-posts-cd1</link>
      <guid>https://dev.to/murindwaz/how-to-add-better-code-snippets-in-presentations-and-blog-posts-cd1</guid>
      <description>&lt;p&gt;&lt;strong&gt;Synopsis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quite often code snippets are posted on this and other dev platforms. Graphical annotations(drawings and text) on top of snippets, make code easy to digest, therefore conveying more knowledge to readers. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I know&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Codepen.io gives a way to take and &lt;a href="https://blog.codepen.io/documentation/api/screenshots/" rel="noopener noreferrer"&gt;export a screenshot&lt;/a&gt;. There is also highlighter libraries like &lt;a href="https://highlightjs.org/" rel="noopener noreferrer"&gt;highlight.js&lt;/a&gt;, in additions to plugins that allow highlighting in presentation(text processors).  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fteropa.info%2Fimages%2Fangular_1_component_approximation.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fteropa.info%2Fimages%2Fangular_1_component_approximation.png" alt="teropa article"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;this gem comes from &lt;a href="http://teropa.info/blog/2015/10/18/refactoring-angular-apps-to-components.html#components" rel="noopener noreferrer"&gt;"refactoring angular apps"&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Question&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How do you guys add graphical annotations on top of code snippets? Is it possible to share techniques you use; or any pointer that can help? I also wonder how long it takes to update those drawings after editing a typo for example.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Non exhaustive list of some products:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://jumpshare.com/capture-screenshot-annotate" rel="noopener noreferrer"&gt;Jumpshare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jasonsavard.com/Explain-and-Send-Screenshots" rel="noopener noreferrer"&gt;Explain and send screenshots&lt;/a&gt; ~ &lt;em&gt;paying&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://marker.io" rel="noopener noreferrer"&gt;Marker&lt;/a&gt; ~ &lt;em&gt;paying&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.awesomescreenshot.com/" rel="noopener noreferrer"&gt;Awesome Screenshot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.techsmith.com/screen-capture.html" rel="noopener noreferrer"&gt;SnagIt&lt;/a&gt; ~ &lt;em&gt;paying&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://droplr.com" rel="noopener noreferrer"&gt;Droplr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nimbus.everhelper.me/screenshot.php" rel="noopener noreferrer"&gt;Nimbus Capture&lt;/a&gt; ~ &lt;em&gt;paying&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://carbon.now.sh" rel="noopener noreferrer"&gt;Carbon&lt;/a&gt;&lt;em&gt;free and open source&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Research&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;I read most of these links without luck.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://wattenberger.com/blog/react-hooks" rel="noopener noreferrer"&gt;Advanced Data Vizualization&lt;/a&gt; ~ using &lt;a href="https://prismjs.com/plugins/custom-class/" rel="noopener noreferrer"&gt;prismjs&lt;/a&gt;/[d3js]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.atlassian.com/blog/2015/08/beautiful-presentations-with-highlight/" rel="noopener noreferrer"&gt;Creating beautiful presentations using Highlight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://productforums.google.com/forum/#!topic/docs/Q1N4KKe3jOE" rel="noopener noreferrer"&gt;Adding dynamic code snippets to presentations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://jeremythake.com/approaches-to-presenting-code-demos-to-a-developer-audience-33b5f09841c2" rel="noopener noreferrer"&gt;Approaches to presenting code demos to a Developer audience&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/281025/how-to-format-a-block-of-code-within-a-presentation" rel="noopener noreferrer"&gt;How To Format A Block of Code Within a Presentation?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://stackoverflow.com/questions/5505515/how-do-i-embed-source-code-or-html-in-open-office-org-presentations-without-usin?noredirect=1&amp;amp;lq=1" rel="noopener noreferrer"&gt;How do I embed source code or HTML in Open Office Org Presentations without using screenshots?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://gist.github.com/jimbojsb/1630790" rel="noopener noreferrer"&gt;Code highlighting for Keynote presentations&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://auralinna.blog/post/2017/code-syntax-highlighting-with-angular-and-prismjs" rel="noopener noreferrer"&gt;Code Syntax Highlighting with Angular and PrismJS&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://webapps.stackexchange.com/questions/19241/how-can-i-get-code-syntax-highlighting-in-google-docs" rel="noopener noreferrer"&gt;How can I get code syntax highlighting in Google Docs?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.quora.com/Whats-the-easiest-way-to-insert-code-snippets-into-a-Keynote-presentation" rel="noopener noreferrer"&gt;What's the easiest way to insert code snippets into a Keynote presentation?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://superuser.com/questions/98701/tool-to-annotate-pictures-screenshots-for-documentation-purposes" rel="noopener noreferrer"&gt;Tools to annotate screenshots for documentation purposes&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/gitpitch/gitpitch" rel="noopener noreferrer"&gt;Gitpitch&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://help.slides.com/knowledgebase/articles/646126-syntax-highlighted-code" rel="noopener noreferrer"&gt;Slides&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>snippets</category>
      <category>codeannotations</category>
      <category>question</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Hi, I'm Pascal Maniraho</title>
      <dc:creator>Pascal Maniraho</dc:creator>
      <pubDate>Wed, 19 Jul 2017 14:22:04 +0000</pubDate>
      <link>https://dev.to/murindwaz/hi-im-pascal-maniraho</link>
      <guid>https://dev.to/murindwaz/hi-im-pascal-maniraho</guid>
      <description>&lt;p&gt;I make things&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="https://amzn.to/2QDYqV3" rel="noopener noreferrer"&gt;Amazon&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="https://bit.ly/39skpH1" rel="noopener noreferrer"&gt;Google&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;&lt;a href="https://apple.co/2F7V72V" rel="noopener noreferrer"&gt;Apple&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="http://bit.ly/37tvGFk" rel="noopener noreferrer"&gt;Leanpub&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;em&gt;&lt;a href="https://gum.co/wGXuE" rel="noopener noreferrer"&gt;Gumroad&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;&lt;a href="http://bit.ly/2ZFJytb" rel="noopener noreferrer"&gt;On the blog&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Prior to that, I have been coding for 10+ years, mostly with JS/Node/PHP/Python/Java/Ruby. You can find me on GitHub as &lt;a href="https://github.com/murindwaz" rel="noopener noreferrer"&gt;murindwaz&lt;/a&gt;&lt;br&gt;
I live in Montreal, QC.&lt;/p&gt;

&lt;p&gt;I blog at &lt;a href="https://medium.com/hoopeez" rel="noopener noreferrer"&gt;Simple&lt;/a&gt;, break things at &lt;a href="https://app.hoo.gy" rel="noopener noreferrer"&gt;hoo.gy&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>introduction</category>
    </item>
  </channel>
</rss>
