<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Mohamed Attia's Macrocosm</title><link>https://mohamed.computer/</link><description>Recent content on Mohamed Attia's Macrocosm</description><generator>Hugo</generator><language>en-us</language><copyright>©️ Mohamed Attia</copyright><lastBuildDate>Sun, 27 Jul 2025 20:38:09 +0200</lastBuildDate><atom:link href="https://mohamed.computer/index.xml" rel="self" type="application/rss+xml"/><item><title>Please Use HTML data-attributes</title><link>https://mohamed.computer/posts/please-use-html-data-attributes/</link><pubDate>Sun, 27 Jul 2025 20:38:09 +0200</pubDate><guid>https://mohamed.computer/posts/please-use-html-data-attributes/</guid><description>&lt;p&gt;If you need to attach custom attributes to an &lt;code&gt;HTMLElement&lt;/code&gt; that you can also access from &lt;code&gt;JavaScript&lt;/code&gt; or &lt;code&gt;CSS&lt;/code&gt;,
please use &lt;a href="https://html.spec.whatwg.org/#embedding-custom-non-visible-data-with-the-data-*-attributes"&gt;&lt;code&gt;data-attributes&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="html"&gt;HTML&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s say you have a very simple gallery that has image thumbnails and it displays the full image
when you click on a thumbnail and also displays a caption for the image, we can define this gallery
in &lt;code&gt;HTML&lt;/code&gt; as follows:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#062873;font-weight:bold"&gt;div&lt;/span&gt; &lt;span style="color:#4070a0"&gt;id&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;gallery&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#062873;font-weight:bold"&gt;img&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;src&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;thumb1.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;alt&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;Sunrise thumbnail&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;class&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;thumbnail&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;data-full-src&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;images/sunrise.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;data-caption&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;Sunrise over the mountains&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#062873;font-weight:bold"&gt;img&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;src&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;thumb2.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;alt&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;City skyline thumbnail&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;class&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;thumbnail&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;data-full-src&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;images/skyline.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;data-caption&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;Nighttime city skyline&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#062873;font-weight:bold"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#062873;font-weight:bold"&gt;div&lt;/span&gt; &lt;span style="color:#4070a0"&gt;id&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;lightbox&amp;#34;&lt;/span&gt; &lt;span style="color:#4070a0"&gt;class&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;hidden&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#062873;font-weight:bold"&gt;button&lt;/span&gt; &lt;span style="color:#4070a0"&gt;id&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;close-btn&amp;#34;&lt;/span&gt;&amp;gt;❌&amp;lt;/&lt;span style="color:#062873;font-weight:bold"&gt;button&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#062873;font-weight:bold"&gt;img&lt;/span&gt; &lt;span style="color:#4070a0"&gt;id&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;lightbox-img&amp;#34;&lt;/span&gt; &lt;span style="color:#4070a0"&gt;alt&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &amp;lt;&lt;span style="color:#062873;font-weight:bold"&gt;p&lt;/span&gt; &lt;span style="color:#4070a0"&gt;id&lt;/span&gt;&lt;span style="color:#666"&gt;=&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;lightbox-caption&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#062873;font-weight:bold"&gt;p&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/&lt;span style="color:#062873;font-weight:bold"&gt;div&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Notice how for each image we used 2 attributes that start with &lt;code&gt;data-&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Quick journaling in org-mode in Emacs</title><link>https://mohamed.computer/posts/org-journal/</link><pubDate>Sun, 24 Mar 2024 00:00:00 +0000</pubDate><guid>https://mohamed.computer/posts/org-journal/</guid><description>&lt;p&gt;A while back I started maintaining a journal, it can contain things that I&amp;rsquo;ve learned like new
programming techniques, new commands, new insights, &amp;hellip;etc. The key for me to make this viable
is to be low-friction, so I&amp;rsquo;ve written an Emacs Lisp script that opens a journal in my &lt;code&gt;journal&lt;/code&gt;
directory with today&amp;rsquo;s date as the filename, so whenever I want to write something, I just
hit &lt;code&gt;Ctrl-x-j&lt;/code&gt; in emacs, write what i want and move on. And later on, if I want to check
something in my journal e.g. an obscure command, I can just grep my &lt;code&gt;journal&lt;/code&gt; directory.&lt;/p&gt;</description></item><item><title>Barebones python project with a virtual environment in Emacs Lisp</title><link>https://mohamed.computer/posts/elisp-python-project-init/</link><pubDate>Sat, 23 Mar 2024 00:00:00 +0000</pubDate><guid>https://mohamed.computer/posts/elisp-python-project-init/</guid><description>&lt;p&gt;A lot of the time I find myself wanting to have a directory with a basic Python virtual environment initialized in it,
so I wrote the following Emacs Lisp script to do that, you can use it as an interactive function in emacs or as a script that you call from a shell.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Remember to change the path and the keybinding to your liking&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-elisp" data-lang="elisp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style=""&gt;#&lt;/span&gt;&lt;span style="color:#bb60d5"&gt;!&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;emacs&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;--script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#60a0b0;font-style:italic"&gt;;;; Code:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#007020"&gt;defun&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;setup-python-project-in-directory&lt;/span&gt; (&lt;span style="color:#bb60d5"&gt;project-name&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;Setup a Python project at PROJECT-NAME with a virtual environment.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#007020"&gt;interactive&lt;/span&gt; (&lt;span style="color:#06287e"&gt;list&lt;/span&gt; (&lt;span style="color:#06287e"&gt;read-string&lt;/span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;Enter the project name: &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;frobenius&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#007020"&gt;let*&lt;/span&gt; ((&lt;span style="color:#bb60d5"&gt;project-dir&lt;/span&gt; (&lt;span style="color:#06287e"&gt;concat&lt;/span&gt; (&lt;span style="color:#06287e"&gt;expand-file-name&lt;/span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;~&amp;#34;&lt;/span&gt;) &lt;span style="color:#4070a0"&gt;&amp;#34;/personal/python-playground/&amp;#34;&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;project-name&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#bb60d5"&gt;venv-cmd&lt;/span&gt; (&lt;span style="color:#06287e"&gt;format&lt;/span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;python3 -m venv %s/.venv --prompt %s&amp;#34;&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;project-dir&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;project-dir&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#bb60d5"&gt;exists&lt;/span&gt; (&lt;span style="color:#06287e"&gt;file-exists-p&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;project-dir&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#007020"&gt;when&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;exists&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#007020"&gt;if&lt;/span&gt; (&lt;span style="color:#bb60d5"&gt;y-or-n-p&lt;/span&gt; (&lt;span style="color:#06287e"&gt;format&lt;/span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;Directory %s exists. Delete and recreate? &amp;#34;&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;project-dir&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#bb60d5"&gt;delete-directory&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;project-dir&lt;/span&gt; &lt;span style="color:#60add5"&gt;t&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#007020"&gt;user-error&lt;/span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;Process cancelled by the user&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#007020"&gt;unless&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;exists&lt;/span&gt; (&lt;span style="color:#bb60d5"&gt;make-directory&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;project-dir&lt;/span&gt; &lt;span style="color:#60add5"&gt;t&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#06287e"&gt;message&lt;/span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;Setting up virtual environment...&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#bb60d5"&gt;shell-command&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;venv-cmd&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#06287e"&gt;message&lt;/span&gt; (&lt;span style="color:#06287e"&gt;format&lt;/span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;To activate your virtual environment, run: \n\n source %s/.venv/bin/activate&amp;#34;&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;project-dir&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#007020"&gt;when&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;noninteractive&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#007020"&gt;let&lt;/span&gt; ((&lt;span style="color:#bb60d5"&gt;project-name&lt;/span&gt; (&lt;span style="color:#06287e"&gt;car&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;command-line-args-left&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#007020"&gt;if&lt;/span&gt; (&lt;span style="color:#007020"&gt;or&lt;/span&gt; (&lt;span style="color:#06287e"&gt;null&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;project-name&lt;/span&gt;) (&lt;span style="color:#bb60d5"&gt;string=&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;project-name&lt;/span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#007020"&gt;error&lt;/span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;No project name provided. Usage: script %s &amp;lt;project-name&amp;gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;load-file-name&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (&lt;span style="color:#bb60d5"&gt;setup-python-project-in-directory&lt;/span&gt; &lt;span style="color:#bb60d5"&gt;project-name&lt;/span&gt;))))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#bb60d5"&gt;global-set-key&lt;/span&gt; (&lt;span style="color:#bb60d5"&gt;kbd&lt;/span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;C-x p y&amp;#34;&lt;/span&gt;) &lt;span style="color:#517918"&gt;&amp;#39;setup-python-project-in-directory&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;(&lt;span style="color:#007020"&gt;provide&lt;/span&gt; &lt;span style="color:#517918"&gt;&amp;#39;setup-python-project-in-directory&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I haven&amp;rsquo;t bothered to make a proper shebang but check &lt;a href="https://gist.github.com/Kreyren/a12e3618525477c3dd5fb16c3de45bf3#making-emacs-lisp-scripts-executable"&gt;this&lt;/a&gt; out if you&amp;rsquo;re interested in doing that.&lt;/p&gt;</description></item><item><title>Python Internals – CPython Bytecode</title><link>https://mohamed.computer/posts/python-internals-cpython-bytecode/</link><pubDate>Sat, 16 Jun 2018 23:51:11 +0200</pubDate><guid>https://mohamed.computer/posts/python-internals-cpython-bytecode/</guid><description>&lt;p&gt;In this post, I am gonna walk you through compiling python code to CPython bytecode, what code objects are, how to construct them, how to disassemble them, and how to decompile them.&lt;/p&gt;
&lt;p&gt;I will be using CPython 3.6.5.&lt;/p&gt;
&lt;h2 id="a-simple-example"&gt;A simple example&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; codestr &lt;span style="color:#666"&gt;=&lt;/span&gt; &lt;span style="color:#4070a0"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#4070a0"&gt;print(&amp;#39;Witness me!&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#4070a0"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; compiled_codestr &lt;span style="color:#666"&gt;=&lt;/span&gt; &lt;span style="color:#007020"&gt;compile&lt;/span&gt;(codestr, &lt;span style="color:#4070a0"&gt;&amp;#39;&amp;lt;string&amp;gt;&amp;#39;&lt;/span&gt;, &lt;span style="color:#4070a0"&gt;&amp;#39;exec&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#007020"&gt;type&lt;/span&gt;(compiled_codestr)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#666"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#007020;font-weight:bold"&gt;class&lt;/span&gt; &lt;span style=""&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#0e84b5;font-weight:bold"&gt;code&lt;/span&gt;&lt;span style="color:#4070a0"&gt;&amp;#39;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Whoo, we have created our first &lt;a href="https://docs.python.org/3.6/c-api/code.html"&gt;code object&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We passed arguments to the &lt;a href="https://docs.python.org/3/library/functions.html#compile"&gt;compile function&lt;/a&gt; as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;codestr&lt;/code&gt; is, as you might have guessed, our code as a string.&lt;/p&gt;</description></item><item><title>ADTs (Algebraic Data Types) in Haskell</title><link>https://mohamed.computer/posts/haskell-adts/</link><pubDate>Wed, 30 May 2018 00:00:00 +0000</pubDate><guid>https://mohamed.computer/posts/haskell-adts/</guid><description>&lt;p style="color: gray;"&gt;&lt;em&gt;Update (2021-10-19) Correct inaccurate language referring to simple ADTs thanks to &lt;a href="https://www.reddit.com/r/haskell/comments/8ns3me/an_introduction_to_adts_algebraic_data_types_in/e01izuz/"&gt;e01izuz&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;p&gt;Algebraic Data Types are a way for us to define types like the ones that come with Haskell e.g. &lt;code&gt;Bool&lt;/code&gt; and &lt;code&gt;Int&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="single-constructor-without-arguments"&gt;Single Constructor Without Arguments&lt;/h2&gt;
&lt;p&gt;One of the simplest datatypes we can construct in Haskell is a type with a single constructor,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-haskell" data-lang="haskell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#007020;font-weight:bold"&gt;data&lt;/span&gt; &lt;span style="color:#902000"&gt;Frame&lt;/span&gt; &lt;span style="color:#007020;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#902000"&gt;MkFrame&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#06287e"&gt;x&lt;/span&gt; &lt;span style="color:#007020;font-weight:bold"&gt;=&lt;/span&gt; &lt;span style="color:#902000"&gt;MkFrame&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Examining the type in &lt;code&gt;ghci&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;:&amp;gt; :type MkFrame
MkFrame :: Frame

:&amp;gt; :type x
x :: Frame
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In this example, we use the &lt;code&gt;data&lt;/code&gt; keyword to signify a &lt;strong&gt;Data Type&lt;/strong&gt;, &lt;code&gt;Frame&lt;/code&gt; is the name of that type and we refer to it as a &lt;strong&gt;Type Constructor&lt;/strong&gt;. &lt;code&gt;MkFrame&lt;/code&gt; is called a &lt;strong&gt;Data Constructor&lt;/strong&gt; and this is how we create new instances of the type &lt;code&gt;Frame&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Mathematical Induction</title><link>https://mohamed.computer/posts/mathematical-induction/</link><pubDate>Mon, 12 Jun 2017 00:00:00 +0000</pubDate><guid>https://mohamed.computer/posts/mathematical-induction/</guid><description>&lt;p&gt;Suppose you want to sum up the first &lt;span class="math inline"&gt;10&lt;/span&gt; natural numbers &lt;span class="math inline"&gt;1, 2, 3, ...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The most obvious way to do it would be to add the numbers consecutively like so: &lt;br /&gt;&lt;span class="math display"&gt;1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55&lt;/span&gt;&lt;br /&gt; No big deal, but now you want to sum the first &lt;span class="math inline"&gt;1000&lt;/span&gt; natural numbers i.e. &lt;span class="math inline"&gt;1, 2, 3, ..., 1000&lt;/span&gt;. While you’re carrying out this laborious task, your friend &lt;strong&gt;Hypatia&lt;/strong&gt; passes by and tells you with a confused look “Why are you doing all that? You can just use this formula:” &lt;br /&gt;&lt;span class="math display"&gt;$$ \frac{n(n+1)}{2} $$&lt;/span&gt;&lt;br /&gt; Skeptical, you give it a try on the first &lt;span class="math inline"&gt;10&lt;/span&gt; natural numbers, because you already know the answer to that. So, you substitute &lt;span class="math inline"&gt;&lt;em&gt;n&lt;/em&gt;&lt;/span&gt; for &lt;span class="math inline"&gt;10&lt;/span&gt; and you get &lt;br /&gt;&lt;span class="math display"&gt;$$ \frac{10(10+1)}{2} = \frac{110}{2} = 55 $$&lt;/span&gt;&lt;br /&gt; Lo and Behold, it’s the right answer. Go ahead and try it for other values of &lt;span class="math inline"&gt;&lt;em&gt;n&lt;/em&gt;&lt;/span&gt; yourself, see if it works.&lt;/p&gt;</description></item></channel></rss>