<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" /><updated>2026-04-16T04:28:09+00:00</updated><id>/feed.xml</id><title type="html">SirECMG</title><subtitle>Bay Area Raised, programmer, hodler, empowering at Microsoft. Nostr: npub173xr8cmcp9zk9q268t9fel97tlaqaf95a79qxkpl6rw9v65agz6qcg4k35</subtitle><entry><title type="html">elixir basics</title><link href="/2026/04/09/elixir-basics.html" rel="alternate" type="text/html" title="elixir basics" /><published>2026-04-09T14:29:00+00:00</published><updated>2026-04-09T14:29:00+00:00</updated><id>/2026/04/09/elixir-basics</id><content type="html" xml:base="/2026/04/09/elixir-basics.html"><![CDATA[<h2 id="table-of-contents">table of contents</h2>

<ul>
  <li><a href="#testing-with-exunit">Testing with ExUnit</a></li>
  <li><a href="#test-setup-and-config">test set up and config</a></li>
  <li><a href="#open-file">open file</a></li>
  <li><a href="#tuples">tuples</a></li>
  <li><a href="#lists">lists</a></li>
  <li><a href="#maps">maps</a></li>
  <li><a href="#records">records</a></li>
  <li><a href="#struct">struct</a></li>
  <li><a href="#http-client">HTTP Client</a></li>
  <li><a href="#test-external-libraries">Test External Libraries</a></li>
</ul>

<h2 id="testing-with-exunit">Testing with ExUnit</h2>

<p><a href="https://hexdocs.pm/ex_unit/main/ExUnit.html">testing docs</a></p>

<ul>
  <li>mix will load all modules under lib/</li>
  <li>mix will run all test under /test</li>
</ul>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c1"># File: assertion_test.exs</span>

<span class="c1"># 1) Start ExUnit.</span>
<span class="no">ExUnit</span><span class="o">.</span><span class="n">start</span><span class="p">()</span>

<span class="c1"># 2) Create a new test module and use "ExUnit.Case".</span>
<span class="k">defmodule</span> <span class="no">AssertionTest</span> <span class="k">do</span>
  <span class="c1"># 3) Note that we pass "async: true", this runs the tests in the</span>
  <span class="c1">#    test module concurrently with other test modules. The</span>
  <span class="c1">#    individual tests within each test module are still run serially.</span>
  <span class="kn">use</span> <span class="no">ExUnit</span><span class="o">.</span><span class="no">Case</span><span class="p">,</span> <span class="ss">async:</span> <span class="no">true</span>

  <span class="c1"># 4) Use the "test" macro instead of "def" for clarity.</span>
  <span class="n">test</span> <span class="s2">"the truth"</span> <span class="k">do</span>
    <span class="n">assert</span> <span class="no">true</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>
<h3 id="test-setup-and-config">test setup and config</h3>

<p><a href="https://hexdocs.pm/ex_unit/main/ExUnit.Callbacks.html">test set up</a></p>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">defmodule</span> <span class="no">AssertionTest</span> <span class="k">do</span>
  <span class="kn">use</span> <span class="no">ExUnit</span><span class="o">.</span><span class="no">Case</span><span class="p">,</span> <span class="ss">async:</span> <span class="no">true</span>

  <span class="c1"># "setup_all" is called once per module before any test runs</span>
  <span class="n">setup_all</span> <span class="k">do</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">"Starting AssertionTest"</span><span class="p">)</span>

    <span class="c1"># Context is not updated here</span>
    <span class="ss">:ok</span>
  <span class="k">end</span>

  <span class="c1"># "setup" is called before each test</span>
  <span class="n">setup</span> <span class="k">do</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">"This is a setup callback for </span><span class="si">#{</span><span class="n">inspect</span><span class="p">(</span><span class="n">self</span><span class="p">())</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="n">on_exit</span><span class="p">(</span><span class="k">fn</span> <span class="o">-&gt;</span>
      <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">"This is invoked once the test is done. Process: </span><span class="si">#{</span><span class="n">inspect</span><span class="p">(</span><span class="n">self</span><span class="p">())</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
    <span class="k">end</span><span class="p">)</span>

    <span class="c1"># Returns extra metadata to be merged into context.</span>
    <span class="c1"># Any of the following would also work:</span>
    <span class="c1">#</span>
    <span class="c1">#     {:ok, %{hello: "world"}}</span>
    <span class="c1">#     {:ok, [hello: "world"]}</span>
    <span class="c1">#     %{hello: "world"}</span>
    <span class="c1">#</span>
    <span class="p">[</span><span class="ss">hello:</span> <span class="s2">"world"</span><span class="p">]</span>
  <span class="k">end</span>

  <span class="c1"># Same as above, but receives the context as argument</span>
  <span class="n">setup</span> <span class="n">context</span> <span class="k">do</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">"Setting up: </span><span class="si">#{</span><span class="n">context</span><span class="o">.</span><span class="n">test</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>

    <span class="c1"># We can simply return :ok when we don't want to add any extra metadata</span>
    <span class="ss">:ok</span>
  <span class="k">end</span>

  <span class="c1"># Setups can also invoke a local or imported function that returns a context</span>
  <span class="n">setup</span> <span class="ss">:invoke_local_or_imported_function</span>

  <span class="n">test</span> <span class="s2">"always pass"</span> <span class="k">do</span>
    <span class="n">assert</span> <span class="no">true</span>
  <span class="k">end</span>

  <span class="n">test</span> <span class="s2">"uses metadata from setup"</span><span class="p">,</span> <span class="n">context</span> <span class="k">do</span>
    <span class="n">assert</span> <span class="n">context</span><span class="p">[</span><span class="ss">:hello</span><span class="p">]</span> <span class="o">==</span> <span class="s2">"world"</span>
    <span class="n">assert</span> <span class="n">context</span><span class="p">[</span><span class="ss">:from_named_setup</span><span class="p">]</span> <span class="o">==</span> <span class="no">true</span>
  <span class="k">end</span>

  <span class="k">defp</span> <span class="n">invoke_local_or_imported_function</span><span class="p">(</span><span class="n">context</span><span class="p">)</span> <span class="k">do</span>
    <span class="p">[</span><span class="ss">from_named_setup:</span> <span class="no">true</span><span class="p">]</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="pattern-matching">pattern matching</h2>

<ul>
  <li>”=” is called the match operator
    <ul>
      <li>it is not an assignment operator as in other languages.</li>
    </ul>
  </li>
  <li>you can perform pattern matching by deconstructing complex data types
    <ul>
      <li>pattern match error will occur if sides can’t be matched</li>
      <li>you can pattern match against list</li>
      <li>you don’t care about a value you can put underscore “_”</li>
    </ul>
  </li>
</ul>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># matching operator</span>
<span class="n">x</span> <span class="o">=</span> <span class="mi">1</span>
<span class="mi">1</span> <span class="o">=</span> <span class="n">x</span>

<span class="c1"># complex data type example</span>
<span class="p">{</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span><span class="ss">:hello</span><span class="p">,</span> <span class="s2">"world"</span><span class="p">,</span> <span class="mi">42</span><span class="p">}</span>

<span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>

<span class="c1"># list example</span>

<span class="p">[</span><span class="n">head</span> <span class="o">|</span> <span class="n">tail</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">]</span>
<span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>
<span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">tail</span><span class="p">)</span>

<span class="c1"># using underscore for "I don't cares"</span>
<span class="p">[</span><span class="n">head</span> <span class="o">|</span> <span class="n">_</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">]</span>
<span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">head</span><span class="p">)</span>

</code></pre></div></div>

<h3 id="pin-operator">pin operator</h3>

<ul>
  <li>variables in elxir can be rebounded</li>
</ul>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">x</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">x</span> <span class="o">=</span> <span class="mi">2</span>
</code></pre></div></div>

<ul>
  <li>there are times were we don’t want to rebind a variable.
    <ul>
      <li>use the pin operator when you want to pattern match against a variables existing value rather than rebinding the variable</li>
      <li>it is a valiue checking mechanism to help enforce the matching of the original value.</li>
    </ul>
  </li>
</ul>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># example</span>
<span class="n">x</span> <span class="o">=</span> <span class="mi">1</span>
<span class="o">^</span><span class="n">x</span> <span class="o">=</span> <span class="mi">2</span> <span class="c1"># this will error</span>

<span class="c1">## example 2</span>
<span class="n">id</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">case</span> <span class="p">{</span><span class="mi">99</span><span class="p">,</span> <span class="s2">"ok"</span><span class="p">}</span> <span class="k">do</span>
  <span class="p">{</span><span class="n">id</span><span class="p">,</span> <span class="n">status</span><span class="p">}</span> <span class="o">-&gt;</span> <span class="p">{</span><span class="ss">:matched</span><span class="p">,</span> <span class="n">id</span><span class="p">,</span> <span class="n">status</span><span class="p">}</span> <span class="c1"># id becomes 99</span>
<span class="k">end</span>

<span class="c1">## example 3</span>
<span class="n">id</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">case</span> <span class="p">{</span><span class="mi">10</span><span class="p">,</span> <span class="s2">"ok"</span><span class="p">}</span> <span class="k">do</span>
  <span class="p">{</span><span class="o">^</span><span class="n">id</span><span class="p">,</span> <span class="n">status</span><span class="p">}</span> <span class="o">-&gt;</span> <span class="p">{</span><span class="ss">:matched</span><span class="p">,</span> <span class="n">status</span><span class="p">}</span> <span class="c1"># ^id is still 10</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="read-from-io">read from IO</h2>

<p>main.exs</p>
<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">input</span> <span class="o">=</span> <span class="no">IO</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="ss">:stdio</span><span class="p">,</span> <span class="ss">:eof</span><span class="p">)</span>
</code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>elixir main.exs &lt; input.txt
</code></pre></div></div>
<h2 id="open-file">open file</h2>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">file_name</span> <span class="o">=</span> <span class="s2">"input.txt"</span>
<span class="k">case</span> <span class="no">File</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span> <span class="k">do</span>
  <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">content</span><span class="p">}</span> <span class="o">-&gt;</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
  <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="n">reason</span><span class="p">}</span> <span class="o">-&gt;</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="s2">"open failed: </span><span class="si">#{</span><span class="n">reason</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="tuples">tuples</h2>

<p><a href="https://hexdocs.pm/elixir/1.12.3/Tuple.html">tuple docs</a></p>

<ul>
  <li>tuples are intended as fixed-size containers for multiple elements</li>
  <li>tuple usage
    <ul>
      <li>do
        <ul>
          <li>typically used either when a function has multiple return values for error handling</li>
        </ul>
      </li>
      <li>do not
        <ul>
          <li>to manipulate a collection of elements, use a list instead</li>
        </ul>
      </li>
      <li>notes
        <ul>
          <li>Enum functions don’t work on tuples</li>
          <li>may contain different types</li>
          <li>stored contiguously(in a row) in memory</li>
          <li>access any element takes constant time</li>
          <li>modifying produces a shallow copy, takes O(n)</li>
          <li>good for reading data (list better for traveral)</li>
          <li>functions that add and remove elements from tuples are rarely used in practice, as they imply tuples are</li>
          <li>to append to a tuple, it is preferable to extract the elements from the old tuple with pattern matching and being used as collections.</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<p>create a new tuple</p>
<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{}</span> <span class="c1"># basic tuple</span>

<span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="ss">:two</span><span class="p">,</span> <span class="s2">"three"</span><span class="p">}</span>

<span class="n">tuple</span> <span class="o">=</span> <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="ss">:example</span><span class="p">}</span>

<span class="c1"># avoid</span>
<span class="n">result</span> <span class="o">=</span> <span class="no">Tuple</span><span class="o">.</span><span class="n">insert_at</span><span class="p">(</span><span class="n">tuple</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="p">%{})</span>
<span class="c1"># prefer</span>
<span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">atom</span><span class="p">}</span> <span class="o">=</span> <span class="n">tuple</span> <span class="c1"># uses deconstruct syntax to create a new tuple</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="n">atom</span><span class="p">,</span> <span class="p">%{}}</span>
</code></pre></div></div>

<h2 id="lists">lists</h2>

<p><a href="https://hexdocs.pm/elixir/1.12.3/List.html">list docs</a>
	- linked lists hold zero, one, or moe elements in the chosen order</p>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="s2">"two"</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="ss">:four</span><span class="p">]</span>

<span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span> <span class="o">++</span> <span class="p">[</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]</span>

<span class="p">[</span><span class="n">new</span> <span class="o">|</span> <span class="n">list</span><span class="p">]</span>

<span class="p">[</span><span class="n">head</span> <span class="o">|</span> <span class="n">tail</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>

<span class="p">[</span><span class="mi">1</span> <span class="o">|</span> <span class="p">[</span><span class="mi">2</span> <span class="o">|</span> <span class="p">[</span><span class="mi">3</span> <span class="o">|</span> <span class="p">[]]]]</span>

</code></pre></div></div>

<h3 id="con-cells">con cells</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- [head | tail]
- prepending is always faster
- appending is slower
- most functions work in linear time
- Enum module works on List
</code></pre></div></div>

<h2 id="charlists">charlists</h2>
<ul>
  <li>list made of non-negative integer, where each integer represents a Unicode code point, the list can be also calle a charlist.
    <ul>
      <li>0..0x10FFFF</li>
      <li>be out of range 0xD800..0xDFFF</li>
      <li>elixir uses single quotes to define charlists</li>
    </ul>
  </li>
</ul>

<h2 id="maps">maps</h2>

<ul>
  <li>are the “go to” key-value data structure in elixir
    <ul>
      <li><code class="language-plaintext highlighter-rouge">%{}</code></li>
      <li>key-value pair <code class="language-plaintext highlighter-rouge">key =&gt; value</code></li>
      <li>kv pairs in a map do not follow any order</li>
      <li>maps do not impose any restriction on the key type: anything ca be a key in a map</li>
      <li>as a key-value structure, maps don’t allow duplicate keys</li>
      <li>when the key in a kv pair is an atom the key: value short hard syntax can be used <code class="language-plaintext highlighter-rouge">%{a: 1, b: 2}</code></li>
    </ul>
  </li>
</ul>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">%{}</span>

<span class="p">%{</span><span class="s2">"one"</span> <span class="o">=&gt;</span> <span class="ss">:two</span><span class="p">,</span> <span class="mi">3</span> <span class="o">=&gt;</span> <span class="s2">"four"</span><span class="p">}</span>

<span class="p">%{</span><span class="ss">one:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">two:</span> <span class="mi">2</span><span class="p">}</span>

<span class="p">%{</span><span class="ss">:one</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">:two</span> <span class="o">=&gt;</span> <span class="mi">2</span><span class="p">}</span>
</code></pre></div></div>

<h3 id="map-access-module">map access Module</h3>
<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">map</span> <span class="o">=</span> <span class="p">%{</span><span class="ss">a:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">b:</span> <span class="mi">2</span><span class="p">}</span>
<span class="no">Map</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="n">map</span><span class="p">,</span> <span class="ss">:a</span><span class="p">)</span>
<span class="n">map</span><span class="p">[</span><span class="ss">:b</span><span class="p">]</span>

<span class="n">map</span><span class="o">.</span><span class="n">foo</span>
<span class="n">map</span><span class="o">.</span><span class="n">non_existing_key</span>
</code></pre></div></div>

<ul>
  <li>do not add parens when accessing fields, such as in data.key(). If parenthesis are used, Elixir will expect data to be an atom representing a module and attempt to call the function key/0 in it.</li>
  <li>the two syntaxes for accessing keys reveal the dual nature of maps.
    <ul>
      <li>map[key] is used for dynamically created maps that may have any key of any type.</li>
      <li>map.key is used with maps that hold a predetermined set of atom keys, which are expected to always be present.</li>
      <li>Structs, defined via defstruct, are one example of such “static maps” where keys can also be checked during compile time</li>
      <li>maps can be pattern matched on.</li>
    </ul>
  </li>
</ul>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">%{}</span> <span class="o">=</span> <span class="p">%{</span><span class="ss">foo:</span> <span class="s2">"bar"</span><span class="p">}</span>
<span class="p">%{</span><span class="ss">a:</span> <span class="n">a</span><span class="p">}</span> <span class="o">=</span> <span class="p">%{</span><span class="ss">:a</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span> <span class="s2">"b"</span> <span class="o">=&gt;</span> <span class="mi">2</span><span class="p">,</span> <span class="p">[</span><span class="ss">:c</span><span class="p">,</span> <span class="ss">:e</span><span class="p">,</span> <span class="ss">:e</span><span class="p">]</span> <span class="o">=&gt;</span> <span class="mi">3</span><span class="p">}</span>
<span class="n">a</span>
<span class="mi">1</span>

<span class="c1"># Match Error</span>
<span class="p">%{</span><span class="ss">:c</span> <span class="o">=&gt;</span> <span class="mi">3</span><span class="p">}</span> <span class="o">=</span> <span class="p">%{</span><span class="ss">:a</span> <span class="o">=&gt;</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span> <span class="o">=&gt;</span> <span class="ss">:b</span><span class="p">}</span>

</code></pre></div></div>

<ul>
  <li>
    <p>Variables can be used as map keys both when writing map literals as well as when matching:</p>
  </li>
  <li>
    <p>Maps also support a specific update syntax to update the value stored under existing atom keys:</p>
  </li>
</ul>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">map</span> <span class="o">=</span> <span class="p">%{</span><span class="ss">one:</span> <span class="mi">1</span><span class="p">,</span> <span class="ss">two:</span> <span class="mi">2</span><span class="p">}</span>
<span class="p">%{</span><span class="n">map</span> <span class="o">|</span> <span class="ss">one:</span> <span class="s2">"one"</span><span class="p">}</span>
<span class="p">%{</span><span class="ss">one:</span> <span class="s2">"one"</span><span class="p">,</span> <span class="ss">two:</span> <span class="mi">2</span><span class="p">}</span>
</code></pre></div></div>

<p>When a key that does not exist in the map is updated a KeyError exception will be raised:</p>
<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">%{</span><span class="n">map</span> <span class="o">|</span> <span class="ss">three:</span> <span class="mi">3</span><span class="p">}</span>
</code></pre></div></div>

<ul>
  <li>The functions in this module that need to find a specific key work in logarithmic time.</li>
  <li>This means that the time it takes to find keys grows as the map grows, but it’s not directly proportional to the map size.</li>
  <li>In comparison to finding an element in a list, it performs better because lists have a linear time complexity.</li>
  <li>Some functions, such as keys/1 and values/1, run in linear time because they need to get to every element in the map.</li>
  <li>Maps also implement the Enumerable protocol, so many functions to work with maps are found in the Enum module. Additionally, the following functions for maps are found in Kernel:</li>
</ul>

<h2 id="records">records</h2>

<p>Module to work with, define, and import records.</p>

<p>Records are simply tuples where the first element is an atom:</p>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="no">Record</span><span class="o">.</span><span class="n">is_record</span><span class="p">({</span><span class="no">User</span><span class="p">,</span> <span class="s2">"john"</span><span class="p">,</span> <span class="mi">27</span><span class="p">})</span>
<span class="no">true</span>
</code></pre></div></div>

<p>This module provides conveniences for working with records at compilation time, where compile-time field names are used to manipulate the tuples, providing fast operations on top of the tuples’ compact structure.</p>

<p>In Elixir, records are used mostly in two situations:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>to work with short, internal data
to interface with Erlang records
</code></pre></div></div>

<p>The macros defrecord/3 and defrecordp/3 can be used to create records while extract/2 and extract_all/1 can be used to extract records from Erlang files.</p>

<h3 id="types">Types</h3>

<p>Types can be defined for tuples with the record/2 macro (only available in typespecs). This macro will expand to a tuple as seen in the example below:</p>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">defmodule</span> <span class="no">MyModule</span> <span class="k">do</span>
  <span class="kn">require</span> <span class="no">Record</span>
  <span class="no">Record</span><span class="o">.</span><span class="k">defrecord</span><span class="p">(</span><span class="ss">:user</span><span class="p">,</span> <span class="ss">name:</span> <span class="s2">"john"</span><span class="p">,</span> <span class="ss">age:</span> <span class="mi">25</span><span class="p">)</span>

  <span class="nv">@type</span> <span class="n">user</span> <span class="p">::</span> <span class="n">record</span><span class="p">(</span><span class="ss">:user</span><span class="p">,</span> <span class="ss">name:</span> <span class="no">String</span><span class="o">.</span><span class="n">t</span><span class="p">(),</span> <span class="ss">age:</span> <span class="n">integer</span><span class="p">)</span>
  <span class="c1"># expands to: "@type user :: {:user, String.t(), integer}"</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="struct">struct</h2>

<ul>
  <li><a href="https://hexdocs.pm/elixir/1.12.3/Kernel.html#defstruct/1">struct doc</a></li>
  <li><a href="https://hexdocs.pm/elixir/1.12.3/Kernel.SpecialForms.html#%25/2">struct doc#2</a></li>
</ul>

<p>A struct is a tagged map that allows developers to provide default values for keys, tags to be used in polymorphic dispatches and compile time assertions.</p>

<p>To define a struct, a developer must define both <strong>struct</strong>/0 and <strong>struct</strong>/1 functions. defstruct/1 is a convenience macro which defines such functions with some conveniences.</p>

<p>For more information about structs, please check Kernel.SpecialForms.%/2.</p>
<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">defmodule</span> <span class="no">User</span> <span class="k">do</span>
	<span class="k">defstruct</span> <span class="p">[</span><span class="ss">:name</span><span class="p">,</span> <span class="ss">:age</span><span class="p">]</span>
<span class="k">end</span>

<span class="ow">or</span>

<span class="k">defmodule</span> <span class="no">User</span> <span class="k">do</span>
	<span class="k">defstruct</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:age</span>
<span class="k">end</span>

<span class="k">defmodule</span> <span class="no">User</span> <span class="k">do</span>
	<span class="k">defstruct</span> <span class="ss">name:</span> <span class="no">nil</span><span class="p">,</span> <span class="ss">age:</span> <span class="no">nil</span>
<span class="k">end</span>
</code></pre></div></div>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">elixir</span> <span class="n">assertion_test</span><span class="o">.</span><span class="n">exs</span>
</code></pre></div></div>

<h2 id="http-client">HTTP Client</h2>

<ul>
  <li><a href="https://github.com/edgurgel/httpoison/blob/main/mix.exs">http poison</a>
    <ul>
      <li>This client has less dependencies than req</li>
    </ul>
  </li>
</ul>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">iex</span><span class="o">&gt;</span> <span class="no">HTTPoison</span><span class="o">.</span><span class="n">start</span>
<span class="n">iex</span><span class="o">&gt;</span> <span class="no">HTTPoison</span><span class="o">.</span><span class="n">get!</span> <span class="s2">"https://postman-echo.com/get"</span>
<span class="p">%</span><span class="no">HTTPoison</span><span class="o">.</span><span class="no">Response</span><span class="p">{</span>
  <span class="ss">status_code:</span> <span class="mi">200</span><span class="p">,</span>
  <span class="ss">body:</span> <span class="s2">"{</span><span class="se">\n</span><span class="s2">  </span><span class="se">\"</span><span class="s2">args</span><span class="se">\"</span><span class="s2">: {},</span><span class="se">\n</span><span class="s2">  </span><span class="se">\"</span><span class="s2">headers</span><span class="se">\"</span><span class="s2">: {</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">x-forwarded-proto</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">https</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">x-forwarded-port</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">443</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">host</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">postman-echo.com</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">x-amzn-trace-id</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">Root=1-644624fb-769bca0458e739dc07f6b630</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">user-agent</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">hackney/1.18.1</span><span class="se">\"\n</span><span class="s2">  },</span><span class="se">\n</span><span class="s2">  </span><span class="se">\"</span><span class="s2">url</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">https://postman-echo.com/get</span><span class="se">\"\n</span><span class="s2">}"</span><span class="p">,</span>
  <span class="ss">headers:</span> <span class="p">[</span> <span class="o">...</span> <span class="p">]</span>
<span class="p">}</span>

<span class="n">iex</span><span class="o">&gt;</span> <span class="no">HTTPoison</span><span class="o">.</span><span class="n">get!</span> <span class="s2">"http://localhost:1"</span>
<span class="o">**</span> <span class="p">(</span><span class="no">HTTPoison</span><span class="o">.</span><span class="no">Error</span><span class="p">)</span> <span class="ss">:econnrefused</span>
<span class="n">iex</span><span class="o">&gt;</span> <span class="no">HTTPoison</span><span class="o">.</span><span class="n">get</span> <span class="s2">"http://localhost:1"</span>
<span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="p">%</span><span class="no">HTTPoison</span><span class="o">.</span><span class="no">Error</span><span class="p">{</span><span class="ss">id:</span> <span class="no">nil</span><span class="p">,</span> <span class="ss">reason:</span> <span class="ss">:econnrefused</span><span class="p">}}</span>

<span class="n">iex</span><span class="o">&gt;</span> <span class="no">HTTPoison</span><span class="o">.</span><span class="n">post</span> <span class="s2">"https://postman-echo.com/post"</span><span class="p">,</span> <span class="s2">"{</span><span class="se">\"</span><span class="s2">body</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">test</span><span class="se">\"</span><span class="s2">}"</span><span class="p">,</span> <span class="p">[{</span><span class="s2">"Content-Type"</span><span class="p">,</span> <span class="s2">"application/json"</span><span class="p">}]</span>
<span class="p">{</span><span class="ss">:ok</span><span class="p">,</span>
 <span class="p">%</span><span class="no">HTTPoison</span><span class="o">.</span><span class="no">Response</span><span class="p">{</span>
   <span class="ss">status_code:</span> <span class="mi">200</span><span class="p">,</span>
   <span class="ss">body:</span> <span class="s2">"{</span><span class="se">\n</span><span class="s2">  </span><span class="se">\"</span><span class="s2">args</span><span class="se">\"</span><span class="s2">: {},</span><span class="se">\n</span><span class="s2">  </span><span class="se">\"</span><span class="s2">data</span><span class="se">\"</span><span class="s2">: {</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">body</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">test</span><span class="se">\"\n</span><span class="s2">  },</span><span class="se">\n</span><span class="s2">  </span><span class="se">\"</span><span class="s2">files</span><span class="se">\"</span><span class="s2">: {},</span><span class="se">\n</span><span class="s2">  </span><span class="se">\"</span><span class="s2">form</span><span class="se">\"</span><span class="s2">: {},</span><span class="se">\n</span><span class="s2">  </span><span class="se">\"</span><span class="s2">headers</span><span class="se">\"</span><span class="s2">: {</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">x-forwarded-proto</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">https</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">x-forwarded-port</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">443</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">host</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">postman-echo.com</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">x-amzn-trace-id</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">Root=1-6446255e-703101813ec2e395202ab494</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">content-length</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">16</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">user-agent</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">hackney/1.18.1</span><span class="se">\"</span><span class="s2">,</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">content-type</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">application/json</span><span class="se">\"\n</span><span class="s2">  },</span><span class="se">\n</span><span class="s2">  </span><span class="se">\"</span><span class="s2">json</span><span class="se">\"</span><span class="s2">: {</span><span class="se">\n</span><span class="s2">    </span><span class="se">\"</span><span class="s2">body</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">test</span><span class="se">\"\n</span><span class="s2">  },</span><span class="se">\n</span><span class="s2">  </span><span class="se">\"</span><span class="s2">url</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">https://postman-echo.com/post</span><span class="se">\"\n</span><span class="s2">}"</span><span class="p">,</span>
   <span class="ss">headers:</span> <span class="p">[</span> <span class="o">...</span> <span class="p">]</span>
 <span class="p">}}</span>
</code></pre></div></div>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">case</span> <span class="no">HTTPoison</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">)</span> <span class="k">do</span>
  <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="p">%</span><span class="no">HTTPoison</span><span class="o">.</span><span class="no">Response</span><span class="p">{</span><span class="ss">status_code:</span> <span class="mi">200</span><span class="p">,</span> <span class="ss">body:</span> <span class="n">body</span><span class="p">}}</span> <span class="o">-&gt;</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="n">body</span>
  <span class="p">{</span><span class="ss">:ok</span><span class="p">,</span> <span class="p">%</span><span class="no">HTTPoison</span><span class="o">.</span><span class="no">Response</span><span class="p">{</span><span class="ss">status_code:</span> <span class="mi">404</span><span class="p">}}</span> <span class="o">-&gt;</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">puts</span> <span class="s2">"Not found :("</span>
  <span class="p">{</span><span class="ss">:error</span><span class="p">,</span> <span class="p">%</span><span class="no">HTTPoison</span><span class="o">.</span><span class="no">Error</span><span class="p">{</span><span class="ss">reason:</span> <span class="n">reason</span><span class="p">}}</span> <span class="o">-&gt;</span>
    <span class="no">IO</span><span class="o">.</span><span class="n">inspect</span> <span class="n">reason</span>
<span class="k">end</span>
</code></pre></div></div>

<ul>
  <li><a href="https://github.com/edgurgel/httpoison/blob/main/mix.exs">req</a>
    <ul>
      <li>Batteries included client</li>
    </ul>
  </li>
</ul>

<h2 id="test-external-libraries">Test External Libraries</h2>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">git</span> <span class="n">clone</span> <span class="ss">https:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">phoenixframework</span><span class="o">/</span><span class="n">phoenix</span><span class="o">.</span><span class="n">git</span>
<span class="n">cd</span> <span class="n">phoenix</span>
</code></pre></div></div>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mix</span> <span class="n">deps</span><span class="o">.</span><span class="n">get</span>
</code></pre></div></div>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mix</span> <span class="n">test</span>
</code></pre></div></div>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mix</span> <span class="n">deps</span><span class="o">.</span><span class="n">get</span>
<span class="n">mix</span> <span class="n">deps</span><span class="o">.</span><span class="n">tree</span>
</code></pre></div></div>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">defp</span> <span class="n">deps</span> <span class="k">do</span>
  <span class="p">[</span>
    <span class="p">{</span><span class="ss">:phoenix</span><span class="p">,</span> <span class="ss">path:</span> <span class="s2">"../phoenix"</span><span class="p">}</span>
  <span class="p">]</span>
<span class="k">end</span>
</code></pre></div></div>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">iex</span> <span class="o">-</span><span class="no">S</span> <span class="n">mix</span>
</code></pre></div></div>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">git</span> <span class="n">clone</span> <span class="ss">https:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">elixir</span><span class="o">-</span><span class="n">lang</span><span class="o">/</span><span class="n">elixir</span><span class="o">.</span><span class="n">git</span>
<span class="n">cd</span> <span class="n">elixir</span>
<span class="n">make</span> <span class="n">test</span>

</code></pre></div></div>]]></content><author><name></name></author><category term="elixir" /><summary type="html"><![CDATA[table of contents]]></summary></entry><entry><title type="html">phoenix basics</title><link href="/2026/04/07/phoenix-basics.html" rel="alternate" type="text/html" title="phoenix basics" /><published>2026-04-07T16:10:00+00:00</published><updated>2026-04-07T16:10:00+00:00</updated><id>/2026/04/07/phoenix-basics</id><content type="html" xml:base="/2026/04/07/phoenix-basics.html"><![CDATA[<ul>
  <li><a href="https://hexdocs.pm/phoenix/installation.html">reference</a></li>
</ul>

<p>install the Phoenix application generator</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mix archive.install hex phx_new
</code></pre></div></div>

<h2 id="phx_new-application-that-creates-your-phoenix">phx_new (application that creates your phoenix)</h2>

<p>documentation</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mix <span class="nb">help </span>phx.new
</code></pre></div></div>

<p>create new project</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mix phx.new hello_world
mix phx.new hello_world <span class="nt">--database</span> sqlite3

mix phx.new hello_world <span class="nt">--database</span> sqlite3 <span class="nt">--no-ecto</span>

mix phx.new hello_world <span class="nt">--module</span> HelloWorld

mix phx.new ~/Workspace/hello_world <span class="nt">--no-html</span> <span class="nt">--no-assets</span>
</code></pre></div></div>

<p>create phoenix html template basic</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mix phx.gen.html Todos Todo todos title:string completed:boolean
mix phx.gen.html Todos Todo todos title:string description:text completed:boolean

mix ecto.migrate
</code></pre></div></div>

<p>output</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">*</span> creating lib/hello_web/controllers/todo_controller.ex
<span class="k">*</span> creating lib/hello_web/controllers/todo_html/edit.html.heex
<span class="k">*</span> creating lib/hello_web/controllers/todo_html/index.html.heex
<span class="k">*</span> creating lib/hello_web/controllers/todo_html/new.html.heex
<span class="k">*</span> creating lib/hello_web/controllers/todo_html/show.html.heex
<span class="k">*</span> creating lib/hello_web/controllers/todo_html/todo_form.html.heex
<span class="k">*</span> creating lib/hello_web/controllers/todo_html.ex
<span class="k">*</span> creating <span class="nb">test</span>/hello_web/controllers/todo_controller_test.exs
<span class="k">*</span> creating lib/hello/todos/todo.ex
<span class="k">*</span> creating priv/repo/migrations/20260403183538_create_todos.exs
<span class="k">*</span> creating lib/hello/todos.ex
<span class="k">*</span> injecting lib/hello/todos.ex
<span class="k">*</span> creating <span class="nb">test</span>/hello/todos_test.exs
<span class="k">*</span> injecting <span class="nb">test</span>/hello/todos_test.exs
<span class="k">*</span> creating <span class="nb">test</span>/support/fixtures/todos_fixtures.ex
<span class="k">*</span> injecting <span class="nb">test</span>/support/fixtures/todos_fixtures.ex
</code></pre></div></div>

<p>Add the resource to your browser scope in lib/hello_web/router.ex:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>resources "/todos", TodoController
</code></pre></div></div>

<p>Remember to update your repository by running migrations:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ mix ecto.migrate
</code></pre></div></div>

<h2 id="quicktour">quicktour</h2>
<p><a href="https://hexdocs.pm/phoenix/up_and_running.html">quicktour</a></p>

<h2 id="post-steps-after-running-mix-phxnew-hello">post steps after running mix phx.new hello</h2>

<p>We are almost there! The following steps are missing:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ cd hello
</code></pre></div></div>

<p>Then configure your database in config/dev.exs and run:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ mix ecto.create
</code></pre></div></div>

<p>Start your Phoenix app with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ mix phx.server
</code></pre></div></div>

<p>You can also run your app inside IEx (Interactive Elixir) as:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ iex -S mix phx.server
</code></pre></div></div>

<h2 id="useful-commands">useful commands</h2>

<p>kill process for existing port</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>lsof <span class="nt">-i</span> :4000

<span class="nb">kill</span> <span class="nt">-9</span> PID
</code></pre></div></div>

<h2 id="phoenix-components">Phoenix Components</h2>

<p><a href="https://hexdocs.pm/phoenix_live_view/Phoenix.Component.html">component docs</a></p>

<p>Define reusable function components with HEEx templates.</p>

<p>A function component is any function that receives an assigns map as an argument and returns a rendered struct built with the ~H sigil:</p>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">defmodule</span> <span class="no">MyComponent</span> <span class="k">do</span>
  <span class="c1"># In Phoenix apps, the line is typically: use MyAppWeb, :html</span>
  <span class="kn">use</span> <span class="no">Phoenix</span><span class="o">.</span><span class="no">Component</span>

  <span class="k">def</span> <span class="n">greet</span><span class="p">(</span><span class="n">assigns</span><span class="p">)</span> <span class="k">do</span>
    <span class="sx">~H""</span><span class="s2">"
    &lt;p&gt;Hello, {@name}!&lt;/p&gt;
    """</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<h2 id="embedding-external-template-files">Embedding external template files</h2>

<p><a href="https://hexdocs.pm/phoenix_live_view/Phoenix.Component.html">embedded template docs</a></p>
<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">defmodule</span> <span class="no">MyAppWeb</span><span class="o">.</span><span class="no">Components</span> <span class="k">do</span>
  <span class="kn">use</span> <span class="no">Phoenix</span><span class="o">.</span><span class="no">Component</span>

  <span class="n">embed_templates</span> <span class="s2">"cards/*"</span>

  <span class="k">def</span> <span class="n">landing_hero</span><span class="p">(</span><span class="n">assigns</span><span class="p">)</span> <span class="k">do</span>
    <span class="sx">~H""</span><span class="s2">"
    &lt;.pricing_card /&gt;
    &lt;.features_card /&gt;
    """</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<h3 id="if-you-get-inotify-error-messages-in-console-install-it">if you get inotify error messages in console, install it.</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">sudo </span>dnf <span class="nb">install </span>inotify-tools
</code></pre></div></div>]]></content><author><name></name></author><category term="elixir" /><summary type="html"><![CDATA[reference]]></summary></entry><entry><title type="html">git study codebase guide</title><link href="/2026/03/31/study-codebase.html" rel="alternate" type="text/html" title="git study codebase guide" /><published>2026-03-31T16:26:00+00:00</published><updated>2026-03-31T16:26:00+00:00</updated><id>/2026/03/31/study-codebase</id><content type="html" xml:base="/2026/03/31/study-codebase.html"><![CDATA[<p>Use the following commands to help you study codebases.</p>

<h2 id="search-code-history">search code history</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># in descending order</span>
git log <span class="nt">-G</span> <span class="s2">"some_string"</span> <span class="nt">-p</span>

<span class="c"># in ascending order</span>
git log <span class="nt">--reverse</span> <span class="nt">-G</span> <span class="s2">"some_string"</span> <span class="nt">-p</span>

<span class="c"># Shows the commit history for one file.</span>
git log <span class="nt">--reverse</span> <span class="nt">-G</span> <span class="s2">"some_string"</span> <span class="nt">-p</span> <span class="nt">--</span> path/to/file

<span class="c"># history per file and follows renames (better to use --follow than without)</span>
git log <span class="nt">--follow</span> <span class="nt">--reverse</span> <span class="nt">-G</span> <span class="s2">"some_string"</span> <span class="nt">-p</span> <span class="nt">--</span> path/to/file

<span class="c"># Finds commits where the exact string count changed. Good for tracing introduction/removal of a symbol.</span>
git log <span class="nt">-G</span><span class="s2">"def charge|class PaymentProcessor"</span> <span class="nt">-p</span>
</code></pre></div></div>

<h2 id="search-commit-history">search commit history</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># search file in codebase filtered by file name</span>

rg <span class="s2">"some string"</span> <span class="nt">-g</span> <span class="s2">"**amount**"</span>
rg <span class="s2">"some string"</span> <span class="nt">-g</span> <span class="s2">"**amount.cpp"</span>
</code></pre></div></div>

<h2 id="who-made-last-line-change-for-a-given-file">who made last line change for a given file</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git blame src/consensus/amount.h
</code></pre></div></div>

<h2 id="show-one-commit-in-full">show one commit in full</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git show &lt;commit_hash&gt;

git show abc123:app/services/payments.rb
</code></pre></div></div>

<h2 id="compare-commits">compare commits</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Helps compare current work, nearby commits, or branches.</span>
git diff
git diff HEAD~1..HEAD
git diff main...feature-branch

<span class="c"># Very good for understanding how one file evolved between two points.</span>
git diff abc123 def456 <span class="nt">--</span> app/services/payments.rb
</code></pre></div></div>

<h2 id="who-contributed-the-most">who contributed the most?</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Shows who has contributed the most commits.</span>
git shortlog <span class="nt">-sn</span>
git shortlog <span class="nt">-sne</span>
git shortlog <span class="nt">-sne</span> <span class="nt">--</span> src/
</code></pre></div></div>

<h2 id="track-a-person-commit-history">track a person commit history</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">#  That searches commit author names and emails.</span>
git log <span class="nt">--author</span><span class="o">=</span><span class="s2">"Alice"</span>
git log <span class="nt">--author</span><span class="o">=</span><span class="s2">"Alice|Bob"</span>

<span class="c"># Search commits by author for one file:</span>
git log <span class="nt">--author</span><span class="o">=</span><span class="s2">"Alice"</span> <span class="nt">--</span> path/to/file

<span class="c"># Search commits by author for a directory:</span>
git log <span class="nt">--author</span><span class="o">=</span><span class="s2">"Alice"</span> <span class="nt">--</span> src/

<span class="c"># See the actual patches they changed:</span>
git log <span class="nt">--author</span><span class="o">=</span><span class="s2">"Alice"</span> <span class="nt">-p</span> <span class="nt">--</span> src/

<span class="c"># See just filenames they changed:</span>
git log <span class="nt">--author</span><span class="o">=</span><span class="s2">"Alice"</span> <span class="nt">--name-only</span> <span class="nt">--oneline</span>

</code></pre></div></div>

<h2 id="quick-glance-on-current-events">quick glance on current events</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># see codebase history in compact graph</span>
git log <span class="nt">--oneline</span> <span class="nt">--graph</span> <span class="nt">--decorate</span> <span class="nt">--all</span>

<span class="c"># git an idea of what changed (good to skim)</span>
git log <span class="nt">--stat</span>
git log <span class="nt">-p</span>
</code></pre></div></div>]]></content><author><name></name></author><category term="git" /><summary type="html"><![CDATA[Use the following commands to help you study codebases.]]></summary></entry><entry><title type="html">view git commit history</title><link href="/2026/02/25/git-view-history.html" rel="alternate" type="text/html" title="view git commit history" /><published>2026-02-25T02:33:00+00:00</published><updated>2026-02-25T02:33:00+00:00</updated><id>/2026/02/25/git-view-history</id><content type="html" xml:base="/2026/02/25/git-view-history.html"><![CDATA[<p>View git commit history in nice graphical format.</p>

<p>oneline</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git log <span class="nt">--oneline</span> <span class="nt">--graph</span> <span class="nt">--all</span>
</code></pre></div></div>
<p>detailed</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git log <span class="nt">--graph</span> <span class="nt">--all</span> <span class="nt">--decorate</span><span class="o">=</span>short
</code></pre></div></div>

<p>You can use this command to get familiar with recent efforts and understanding merges.</p>

<p>query for time range</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git log <span class="nt">--since</span><span class="o">=</span><span class="s2">"2026-01-01"</span>

git log <span class="nt">--before</span><span class="o">=</span><span class="s2">"2026-02-01"</span>

git log <span class="nt">--since</span><span class="o">=</span><span class="s2">"2026-01-01"</span> <span class="nt">--before</span><span class="o">=</span><span class="s2">"2026-02-01"</span>

git log <span class="nt">--since</span><span class="o">=</span><span class="s2">"2 weeks ago"</span>
git log <span class="nt">--since</span><span class="o">=</span><span class="s2">"3 days ago"</span>
git log <span class="nt">--since</span><span class="o">=</span><span class="s2">"yesterday"</span>
</code></pre></div></div>

<p>query for author</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git log <span class="nt">--author</span><span class="o">=</span><span class="s2">"Elton"</span>
</code></pre></div></div>

<p>how frequently a file changed in repo</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git log <span class="nt">--name-only</span> <span class="nt">--pretty</span><span class="o">=</span>format: | <span class="nb">sort</span> | <span class="nb">uniq</span> <span class="nt">-c</span> | <span class="nb">sort</span> <span class="nt">-nr</span> | <span class="nb">head</span> <span class="nt">-50</span>
</code></pre></div></div>

<p>search commits for particular strings</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git log <span class="nt">-p</span> <span class="nt">-G</span> <span class="s2">"PaymentProcessor|def charge|class User"</span> <span class="nt">--</span> <span class="nb">.</span>
</code></pre></div></div>

<p>search commit messages</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git log <span class="nt">--oneline</span> <span class="nt">--grep</span><span class="o">=</span><span class="s2">"refactor</span><span class="se">\|</span><span class="s2">auth</span><span class="se">\|</span><span class="s2">payment"</span>
</code></pre></div></div>

<p>who commited the most</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git shortlog <span class="nt">-sn</span>
</code></pre></div></div>

<p>who changed the most on a particular folder</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git shortlog <span class="nt">-sn</span> <span class="nt">--</span> app/services
</code></pre></div></div>

<p>who commited the most in a particular folder</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git shortlog <span class="nt">-sn</span> <span class="nt">--</span> app/services
</code></pre></div></div>

<p>shows commit messages in reverse order useful to glance history</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git log <span class="nt">--reverse</span> <span class="nt">--oneline</span>
</code></pre></div></div>]]></content><author><name>Elton Murillo</name></author><category term="git" /><summary type="html"><![CDATA[View git commit history in nice graphical format.]]></summary></entry><entry><title type="html">Publish static website to azure</title><link href="/2026/02/23/publish-static-site-azure.html" rel="alternate" type="text/html" title="Publish static website to azure" /><published>2026-02-23T02:04:00+00:00</published><updated>2026-02-23T02:04:00+00:00</updated><id>/2026/02/23/publish-static-site-azure</id><content type="html" xml:base="/2026/02/23/publish-static-site-azure.html"><![CDATA[<h1 id="publish-static-website-to-azure">publish static website to azure</h1>

<p>the following doc will show you how to configure and deploy your static blog to azure. it assumes you already followed the directions in <a href="https://learn.microsoft.com/en-us/azure/static-web-apps/publish-jekyll">link_to_azure_docs</a></p>

<h1 id="build-static-site-generator">build static site generator</h1>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bundler exec jekyll build
</code></pre></div></div>

<h1 id="save-output-path-for-azure">save output path for azure</h1>
<ul>
  <li>after running <code class="language-plaintext highlighter-rouge">bundler exec jekyll build</code> it generates an output folder “site/”.</li>
  <li>you need to modify .github/workflows/azure-static-web-apps-[YOUR_APP_NAME].yml</li>
</ul>

<p><img src="/assets/publish-static-site-azure/image.png" alt="image showing what to modify" /></p>

<h1 id="make-custom-domain-changes-in-azure">make custom domain changes in azure</h1>
<p>Follow the steps in the two sections below to configure and sync both cloud provider and dns provider domain configs.</p>

<h2 id="cloud-provider-azure">Cloud Provider (Azure)</h2>
<ol>
  <li>Go to “Custom domains” tab on the left under “Settings”.</li>
  <li>Click “+ Add” then “New Custom Domain on other DNS”</li>
  <li>Enter “Domain name”, i.e “www.eltonmurillo.com”</li>
  <li>Select “Hostname record type”, I chose “CNAME”
    <ul>
      <li>It can take up to 48 hours for DNS entry changes to take effect.</li>
    </ul>
  </li>
</ol>

<h2 id="dns-provider">DNS Provider</h2>
<ol>
  <li>Go to your DNS provider</li>
  <li>Under Advanced DNS in my case,  try to find “HOST RECORDS”</li>
  <li>Go to “ADD NEW RECORD”, then add
    <ul>
      <li>Type: CNAME Record</li>
      <li>Host: www</li>
      <li>Value: green-red-blah.2.azurestaticapps.net (should match the “Auto-generated” name from “Custom domains tab” in Cloud Provider)</li>
      <li>TTL: Automatic</li>
    </ul>
  </li>
  <li>Done!</li>
</ol>

<h2 id="reference-doc">reference doc</h2>
<ul>
  <li><a href="https://learn.microsoft.com/en-us/azure/static-web-apps/publish-jekyll">reference doc</a></li>
</ul>

<h2 id="update-domain">update domain</h2>

<ul>
  <li><a href="https://learn.microsoft.com/en-us/azure/static-web-apps/custom-domain">internal domain</a></li>
  <li><a href="https://learn.microsoft.com/en-us/azure/static-web-apps/custom-domain-external">external domain</a></li>
</ul>]]></content><author><name>Elton Murillo</name></author><category term="web" /><summary type="html"><![CDATA[publish static website to azure]]></summary></entry><entry><title type="html">modern dev tools starter kit</title><link href="/tools/2026/02/01/modern-dev-tools.html" rel="alternate" type="text/html" title="modern dev tools starter kit" /><published>2026-02-01T17:42:00+00:00</published><updated>2026-02-01T17:42:00+00:00</updated><id>/tools/2026/02/01/modern-dev-tools</id><content type="html" xml:base="/tools/2026/02/01/modern-dev-tools.html"><![CDATA[<p>In order to become a better dev in the sense of tackling bigger projects and larger codebases. It is important to leverage tools to become more productive.</p>

<p>During university, we were taught to leverage unix commands to perform useful functions for whatever task we need it.</p>

<p>In todays world, those “legacy” tools are useful and pre-installed on many systems. But, there are other popular tools created by the community that offer better user experiences with more performance and the same functionality.</p>

<p>I will provide a list of what I feel are the essential programs and also notable ones which I feel are probably “nice to haves” outside of the core tools.</p>

<h2 id="essentials">Essentials</h2>
<ul>
  <li>grep -&gt; rg - used to find text in files</li>
  <li>find -&gt; fd - find files</li>
  <li>sed -&gt; sd - replace strings</li>
  <li>cat -&gt; bat - print file contents</li>
  <li>htop -&gt; btm/btop - resource monitor</li>
  <li>ls -&gt; lsd - view directory (might remove this one from list..)</li>
  <li>du -&gt; dust/gdu - disk usage</li>
  <li>vi -&gt; neovim - text editor</li>
  <li>tree - view directory in tree format</li>
</ul>

<h2 id="nice-to-haves">Nice to Haves</h2>
<ul>
  <li>delta (git diff) - git diff viewer</li>
</ul>

<hr />

<h1 id="install-commands">Install commands</h1>

<h2 id="rg">rg</h2>

<p><a href="https://github.com/BurntSushi/ripgrep">github</a></p>

<p>ubuntu/debian</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt-get install ripgrep
</code></pre></div></div>

<p>windows</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>winget install BurntSushi.ripgrep.MSVC
</code></pre></div></div>

<h2 id="fd">fd</h2>
<p><a href="https://github.com/BurntSushi/ripgrep">github</a></p>

<p>ubuntu/debian</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install fd-find
</code></pre></div></div>

<p>windows</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>winget install sharkdp.fd
</code></pre></div></div>

<h2 id="sd">sd</h2>
<p><a href="https://github.com/BurntSushi/ripgrep">github</a></p>

<p>ubuntu/debian</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install sd
</code></pre></div></div>

<p>windows</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>winget install chmln.sd
</code></pre></div></div>

<h2 id="bat">bat</h2>
<p><a href="https://github.com/sharkdp/bat">github</a></p>

<p>ubuntu/debian</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install bat
</code></pre></div></div>

<p>windows</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>winget install sharkdp.bat
</code></pre></div></div>

<h2 id="neovim">neovim</h2>
<p><a href="https://github.com/neovim/neovim">github</a></p>

<p>ubuntu/debian</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install neovim
</code></pre></div></div>

<p>windows
<a href="https://github.com/neovim/neovim/releases/">releases</a></p>

<h2 id="tree">tree</h2>

<p>ubuntu/debian</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>sudo apt install tree
</code></pre></div></div>

<p>windows</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>## built into powershell
tree
</code></pre></div></div>]]></content><author><name></name></author><category term="tools" /><summary type="html"><![CDATA[In order to become a better dev in the sense of tackling bigger projects and larger codebases. It is important to leverage tools to become more productive.]]></summary></entry><entry><title type="html">Elliptic Curves</title><link href="/git/2026/01/21/elliptic-curves.html" rel="alternate" type="text/html" title="Elliptic Curves" /><published>2026-01-21T03:22:00+00:00</published><updated>2026-01-21T03:22:00+00:00</updated><id>/git/2026/01/21/elliptic-curves</id><content type="html" xml:base="/git/2026/01/21/elliptic-curves.html"><![CDATA[<p>An elliptic curve is an equation of:</p>

<blockquote>
  <p>y^2 = x^3 + bx + c</p>
</blockquote>

<p>What makes elliptic curve interesting is that they define a math structure with properties that make them useful for key exchange, and digital signature in the context of cryptography.</p>

<p>Graphically when plotted with real numbers, they represent a curve. But when graphed using finite fields visually it looks like a scatter plot.</p>

<p>Elliptic curves are useful because of “point addition”. Point addition is where we can do an operation on two of the points on the curve and get a third point also on the curve. With point addition points behave more like numbers, you can combine them, repeat the operation and build harder operations from simipler ones.</p>

<p>This enables an important property.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- it is easy to compute nP if you know n.
- it is hard to go backwards and find n from P and nP
</code></pre></div></div>

<p>If you look closely, this property is a great set-up for public-key generation from a private scalar, key exchange and digital signatures.</p>

<h2 id="math-foundations-of-ec">Math Foundations of EC</h2>

<h3 id="math-properties-of-point-addition">math properties of point addition</h3>

<ul>
  <li>identitiy</li>
  <li>commutativity</li>
  <li>associativity</li>
  <li>invertibility</li>
</ul>

<h3 id="deriving-the-point-addition-formula">deriving the point addition formula</h3>

<h3 id="point-addition-for-when-x1--x2">point addition for when x1 != x2</h3>

<h3 id="point-addition-for-when-x1--x2-1">point addition for when x1 == x2</h3>

<h3 id="point-addition-for-p1--p2">point addition for P1 == P2</h3>

<h3 id="point-addition-for-tangent-exception">point addition for tangent (exception)</h3>

<h2 id="elliptic-curve-cryptography">Elliptic Curve Cryptography</h2>

<h2 id="ec-over-reals">EC over Reals</h2>

<h2 id="ec-over-finite-fields">EC over Finite Fields</h2>

<h2 id="point-addition-over-finite-fields">Point Addition over Finite Fields</h2>

<h2 id="scalar-multiplication-for-elliptic-curves">Scalar Multiplication for Elliptic Curves</h2>

<h2 id="discrete-log-problem">Discrete Log Problem</h2>

<h2 id="mathematical-groups">Mathematical Groups</h2>

<h3 id="identity">Identity</h3>

<h3 id="closure">Closure</h3>

<h3 id="invertibility">Invertibility</h3>

<h3 id="commutativity">Commutativity</h3>

<h3 id="associativity">Associativity</h3>

<h2 id="defining-curve-for-bitcoin">Defining Curve for Bitcoin</h2>

<h3 id="how-big-is-2256">How Big is 2^256</h3>

<h2 id="public-key-cryptography">Public Key Cryptography</h2>

<h3 id="signing">Signing</h3>

<h4 id="inscribing-the-target">Inscribing the target</h4>

<h4 id="signing-in-depth">Signing in Depth</h4>

<h4 id="creating-a-signature">Creating a signature</h4>

<h3 id="verifying">Verifying</h3>

<h4 id="verification-in-depth">Verification in Depth</h4>

<h3 id="importance-of-a-unique-k">Importance of a Unique k</h3>]]></content><author><name>Elton Murillo</name></author><category term="git" /><summary type="html"><![CDATA[An elliptic curve is an equation of:]]></summary></entry><entry><title type="html">Finite Fields</title><link href="/2026/01/19/finite-fields.html" rel="alternate" type="text/html" title="Finite Fields" /><published>2026-01-19T02:14:00+00:00</published><updated>2026-01-19T02:14:00+00:00</updated><id>/2026/01/19/finite-fields</id><content type="html" xml:base="/2026/01/19/finite-fields.html"><![CDATA[<h1 id="tldr">TLDR</h1>
<p>Finite fields, also known as Galois fields, are number systems with a finite number of elements.</p>

<p>They form the mathematical foundation for elliptic curve cryptography, which is widely used in modern systems for public-key cryptography, digital signatures, and secure communication.</p>

<p>Finite fields are important in cryptography because they provide a precise and predictable mathematical system that computers can handle efficiently. Their structure makes them especially useful for algorithms that need exact arithmetic rather than approximations.</p>

<p>They support addition, subtraction, multiplication, and division, except that division by zero is not allowed. A key property of a finite field is closure: when you perform these operations on elements in the field, the result stays within the same field.</p>

<p>Finite fields usually have a size equal to a prime number or a power of a prime. One simple example is arithmetic modulo 7, where the only possible values are 0 through 6.</p>

<h2 id="code-example">Code Example</h2>

<div class="language-ruby highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">FiniteElement</span>
    <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="n">order</span><span class="p">)</span>
        <span class="vi">@num</span> <span class="o">=</span> <span class="n">num</span>
        <span class="vi">@order</span> <span class="o">=</span> <span class="n">order</span>
    <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>

<div class="language-elixir highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">defmodule</span> <span class="no">FiniteElement</span> <span class="k">do</span>
  <span class="k">defstruct</span> <span class="p">[</span><span class="ss">:num</span><span class="p">,</span> <span class="ss">:order</span><span class="p">]</span>

  <span class="k">def</span> <span class="n">new</span><span class="p">(</span><span class="n">num</span><span class="p">,</span> <span class="n">order</span><span class="p">)</span> <span class="ow">when</span> <span class="n">num</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">num</span> <span class="o">&lt;</span> <span class="n">order</span> <span class="k">do</span>
    <span class="p">%</span><span class="no">FiniteElement</span><span class="p">{</span>
      <span class="ss">num:</span> <span class="n">num</span><span class="p">,</span>
      <span class="ss">order:</span> <span class="n">order</span> 
    <span class="p">}</span>
  <span class="k">end</span>
<span class="k">end</span>
</code></pre></div></div>]]></content><author><name>Elton Murillo</name></author><category term="bitcoin" /><category term="cryptography" /><summary type="html"><![CDATA[TLDR Finite fields, also known as Galois fields, are number systems with a finite number of elements.]]></summary></entry><entry><title type="html">Create Repo From Github Frontend</title><link href="/git/2025/12/29/add-new-repo-github.html" rel="alternate" type="text/html" title="Create Repo From Github Frontend" /><published>2025-12-29T11:04:00+00:00</published><updated>2025-12-29T11:04:00+00:00</updated><id>/git/2025/12/29/add-new-repo-github</id><content type="html" xml:base="/git/2025/12/29/add-new-repo-github.html"><![CDATA[<ol>
  <li>Login into your github account then head to
    <ul>
      <li><a href="https://github.com/new">New Repository</a></li>
      <li><img src="/assets/add-new-repo-github/image.png" alt="add new repo image" /></li>
    </ul>
  </li>
  <li>Push Repo Using SSH
    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git remote add origin git@github.com:SirECMG/elton-blog.git
git branch -M main
git push -u origin main
</code></pre></div>    </div>
  </li>
</ol>]]></content><author><name>Elton Murillo</name></author><category term="git" /><summary type="html"><![CDATA[Login into your github account then head to New Repository]]></summary></entry><entry><title type="html">git commit –amend</title><link href="/2025/08/09/git-ammend-commit.html" rel="alternate" type="text/html" title="git commit –amend" /><published>2025-08-09T00:00:00+00:00</published><updated>2025-08-09T00:00:00+00:00</updated><id>/2025/08/09/git-ammend-commit</id><content type="html" xml:base="/2025/08/09/git-ammend-commit.html"><![CDATA[<h1 id="how-to-ammend-a-commit">How to ammend a commit</h1>
<p>below are quick steps for when you want to modify a previous commit.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add .
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git commit --amend
</code></pre></div></div>

<ul>
  <li>an editor will pop-up and you can modify the commit message if needed</li>
  <li>as a result, no new commits will be added, instead will modify the previous commit.</li>
</ul>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git push --force
</code></pre></div></div>
<ul>
  <li>This will overwrite the remote branch, so becareful.</li>
</ul>]]></content><author><name></name></author><category term="git" /><summary type="html"><![CDATA[How to ammend a commit below are quick steps for when you want to modify a previous commit.]]></summary></entry></feed>