<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Ahmed Ibrahim]]></title><description><![CDATA[I'm a full stack software engineer with 5 years of experience with Node.js. I do believe that anyone can master how to write better code, But ideas and passion cannot be gained that easy, based on my co-workers my strengths is the ability to produce ideas and passion. My forever favorite quote: DO IT WITH PASSION OR NOT AT ALL.]]></description><link>https://www.ahmed-ibrahim.com/</link><image><url>https://www.ahmed-ibrahim.com/logos/logo-48.png</url><title>Ahmed Ibrahim</title><link>https://www.ahmed-ibrahim.com/</link></image><generator>Ahmed Ibrahim</generator><lastBuildDate>Thu, 24 Sep 2026 14:36:22 GMT</lastBuildDate><atom:link href="https://www.ahmed-ibrahim.com/rss.xml" rel="self" type="application/rss+xml"/><item><title><![CDATA[LiveKit's new Answering Machine Detection is a state machine, not a feature]]></title><description><![CDATA[Yesterday LiveKit shipped Agents 1.5.9. Buried in the release notes, between a Deepgram redaction parameter and a  DTMF fix, is the line that matters for anyone running outbound…]]></description><link>https://www.ahmed-ibrahim.com//livekit-amd-state-machine/</link><guid isPermaLink="false">https://www.ahmed-ibrahim.com//livekit-amd-state-machine/</guid><category><![CDATA[livekit]]></category><category><![CDATA[voice ai]]></category><category><![CDATA[amd]]></category><category><![CDATA[telephony]]></category><category><![CDATA[state machine]]></category><pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 850px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8ec06d4c8e7755fae37bec74e647e28d/09fd1/amd-hero-desk-phone.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAADBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAdiu4gmHH//EABkQAAMBAQEAAAAAAAAAAAAAAAECAwQRE//aAAgBAQABBQKmuYitJrmDqgpCfnwBQeD/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAdEAEAAwABBQAAAAAAAAAAAAABAAIREBIhMUFh/9oACAEBAAY/AmvvI07owKvUfIpXLZ5m5x//xAAZEAADAQEBAAAAAAAAAAAAAAAAARExIVH/2gAIAQEAAT8hRmvnJ6TYJEuLWgotgUUSumQj/9oADAMBAAIAAwAAABDwD//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABwQAQACAwADAAAAAAAAAAAAAAERIQAxQVFhsf/aAAgBAQABPxBtlcjoqfG8FwYsgSYkT1dmcOoQbaR7rGmSdn5OQxhg7QSIvIQDP//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A black office desk phone on a desk, blurred office in the background, monochrome with high contrast&quot;
        title=&quot;&quot;
        src=&quot;/static/8ec06d4c8e7755fae37bec74e647e28d/faddd/amd-hero-desk-phone.jpg&quot;
        srcset=&quot;/static/8ec06d4c8e7755fae37bec74e647e28d/6a7c0/amd-hero-desk-phone.jpg 213w,
/static/8ec06d4c8e7755fae37bec74e647e28d/b9721/amd-hero-desk-phone.jpg 425w,
/static/8ec06d4c8e7755fae37bec74e647e28d/faddd/amd-hero-desk-phone.jpg 850w,
/static/8ec06d4c8e7755fae37bec74e647e28d/09fd1/amd-hero-desk-phone.jpg 1208w&quot;
        sizes=&quot;(max-width: 850px) 100vw, 850px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Yesterday LiveKit shipped Agents 1.5.9. Buried in the release notes, between a Deepgram redaction parameter and a &lt;code class=&quot;language-text&quot;&gt;WarmTransferTask&lt;/code&gt; DTMF fix, is the line that matters for anyone running outbound voice agents:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Answering Machine Detection (AMD) is now built in.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Until this release, if you placed outbound calls and wanted to know whether you reached a human, a voicemail box, or an IVR menu, you wrote it yourself. We did. Two other teams I traded notes with last year did too. Now it&apos;s a primitive.&lt;/p&gt;
&lt;p&gt;The classifier is the easy part. The state machine you build around it is where the work lives.&lt;/p&gt;
&lt;h3 id=&quot;outbound-is-not-inbound-flipped-backwards&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#outbound-is-not-inbound-flipped-backwards&quot; aria-label=&quot;outbound is not inbound flipped backwards permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Outbound is not inbound, flipped backwards&lt;/h3&gt;
&lt;p&gt;When someone calls your business, the moment the call connects you know exactly one thing. There&apos;s a human on the other end and they want something. The agent starts talking.&lt;/p&gt;
&lt;p&gt;When your agent calls someone, the moment the call connects you know nothing. The line might be:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A human (&quot;Hello?&quot;)&lt;/li&gt;
&lt;li&gt;A voicemail box (&quot;Hi, you&apos;ve reached Bob. Please leave a message after the beep.&quot;)&lt;/li&gt;
&lt;li&gt;An IVR menu (&quot;Press 1 for sales, 2 for support...&quot;)&lt;/li&gt;
&lt;li&gt;A network situation that connected but no one actually answered&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each one needs its own agent behavior. Talk to voicemail as if it&apos;s a human and the message goes nowhere, plus you&apos;ve burned a callback. Greet a real human with a stiff voicemail script and you sound like a scam. Try to navigate an IVR by speaking when you should be sending DTMF tones, and you sit on hold forever.&lt;/p&gt;
&lt;p&gt;The first second of an outbound call is the most expensive second. You have to classify before you commit to a behavior.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 850px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2805628521d6a1f6f8632b1d2d6647fd/09fd1/amd-waveform.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAAIF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABwUi0D//EABYQAQEBAAAAAAAAAAAAAAAAABEAIP/aAAgBAQABBQIiMf/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABgQAAMBAQAAAAAAAAAAAAAAAAAQEWFx/9oACAEBAAE/Idp2Uq//2gAMAwEAAgADAAAAEPAP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGxAAAgEFAAAAAAAAAAAAAAAAAAERITFBUZH/2gAIAQEAAT8QoiS06k+XEmU6Nndkt5kk/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Audio waveform on black background, white traces showing speech-like amplitude variation&quot;
        title=&quot;&quot;
        src=&quot;/static/2805628521d6a1f6f8632b1d2d6647fd/faddd/amd-waveform.jpg&quot;
        srcset=&quot;/static/2805628521d6a1f6f8632b1d2d6647fd/6a7c0/amd-waveform.jpg 213w,
/static/2805628521d6a1f6f8632b1d2d6647fd/b9721/amd-waveform.jpg 425w,
/static/2805628521d6a1f6f8632b1d2d6647fd/faddd/amd-waveform.jpg 850w,
/static/2805628521d6a1f6f8632b1d2d6647fd/09fd1/amd-waveform.jpg 1208w&quot;
        sizes=&quot;(max-width: 850px) 100vw, 850px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3 id=&quot;what-amd-actually-emits&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-amd-actually-emits&quot; aria-label=&quot;what amd actually emits permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What AMD actually emits&lt;/h3&gt;
&lt;p&gt;LiveKit&apos;s AMD model outputs one of three results per call:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;human&lt;/code&gt;: a person picked up&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;voicemail&lt;/code&gt;: answering machine greeting&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ivr&lt;/code&gt;: automated menu, press-N-for-X tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Plus a confidence score and the audio segment it classified on.&lt;/p&gt;
&lt;p&gt;The classification happens in the first 1 to 3 seconds of audio after the connect. You don&apos;t get to wait. Every additional second of silence before the agent starts talking makes the human on the other end (if there is one) more confused and more likely to hang up.&lt;/p&gt;
&lt;h3 id=&quot;how-159-wires-it-up&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-159-wires-it-up&quot; aria-label=&quot;how 159 wires it up permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How 1.5.9 wires it up&lt;/h3&gt;
&lt;p&gt;The AMD result drops into &lt;code class=&quot;language-text&quot;&gt;AgentSession&lt;/code&gt; as a lifecycle event. The toy version looks like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;session &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; AgentSession&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    stt&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    llm&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    tts&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    amd&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;AMDOptions&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
        enabled&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        timeout&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3.0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        confidence_threshold&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0.7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token decorator annotation punctuation&quot;&gt;@session&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;on&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;amd_complete&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;handle_amd&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;event&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;result &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;human&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; session&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;say&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Hi, this is the assistant calling about...&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;result &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;voicemail&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; wait_for_beep&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;session&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; session&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;say&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;voicemail_script&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; session&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;hangup&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; event&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;result &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;ivr&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;await&lt;/span&gt; navigate_ivr&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;session&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; target_extension&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;2&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That works in a demo. In production, you&apos;ll spend most of your time on the parts that aren&apos;t in this code.&lt;/p&gt;
&lt;h3 id=&quot;the-branches-that-look-obvious-arent&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-branches-that-look-obvious-arent&quot; aria-label=&quot;the branches that look obvious arent permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The branches that look obvious aren&apos;t&lt;/h3&gt;
&lt;p&gt;Here&apos;s the shape we converged on after running outbound flows at scale:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 850px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b7824fc154720451f0c46729aa8c57e2/f79fa/amd-state-machine.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 70.42253521126761%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAw1AAAMNQAHgcQlTAAABnklEQVR42o1Tu07DMBTNB/ABDCwg8fgA+AfEgviUFibohECCH0FqCwsjCwNCrAyISG3VgVZqpaYJct5x4kOui1M3LbRHOortXB8fX99rpGmKMAyRJIlkFEXySxBCSCqU54tgUADnHCSsM8uygrY9liyvl0laBlaA5/rwvGCVUF1QFCQnhNPqGbZ3N3F4fICjk33s7G2hUqnKf+RoieAUKrjRaKBWu8DN7bUkjev1ehGzKJ+GcscFQ8QtxJlNs/xh+EIXtEY5V1C3mRGM0ccL30Czs44nbw2DtAlmZ3C+LQRBgFarhW63C9d1MRpZOUd5Tj30ej202205nxEUCDFMHtGxHtAP7xFkX3BZCN/3pCPHcTAeT16Z3FFp0TqJ0iFUdv/mUG5MuKzHcp4YY3kJ2X/WoyaY5kGTfDCX4fLqHI3mXVHQCuSGXK0gOEUcx3h9e8an+TH3b1m3GGkqpABRr3hd4L/umOsUJt7hsAGiMCmuRHkiDIcDmKYpH4IOJKiepzk9jl5C0mEGP1dPJk3y60jVFm30fX/mmmqsUxf8AXtPM1j+wbuVAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;AMD state machine: CONNECTED, AMD_PENDING decision, then five branches for human, voicemail, ivr, low-confidence probe, and timeout retry&quot;
        title=&quot;&quot;
        src=&quot;/static/b7824fc154720451f0c46729aa8c57e2/ae694/amd-state-machine.png&quot;
        srcset=&quot;/static/b7824fc154720451f0c46729aa8c57e2/3cb16/amd-state-machine.png 213w,
/static/b7824fc154720451f0c46729aa8c57e2/2fbbf/amd-state-machine.png 425w,
/static/b7824fc154720451f0c46729aa8c57e2/ae694/amd-state-machine.png 850w,
/static/b7824fc154720451f0c46729aa8c57e2/f79fa/amd-state-machine.png 940w&quot;
        sizes=&quot;(max-width: 850px) 100vw, 850px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For copy/paste:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;CONNECTED
   │
   ▼
AMD_PENDING  (max 3.0s)
   │
   ├── human, conf &gt; 0.7      → HUMAN_CONVERSATION
   │
   ├── voicemail               → WAIT_FOR_BEEP → LEAVE_MESSAGE → HANGUP
   │
   ├── ivr                     → NAVIGATE_IVR (DTMF state machine)
   │
   ├── conf &amp;lt; 0.7              → UNCERTAIN_PROBE
   │                                  │
   │                                  └── &quot;Hello, is this &amp;lt;name&gt;?&quot; → reclassify
   │
   └── timeout                 → HANGUP_RETRY (back off, try again later)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Each branch has its own failure modes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HUMAN_CONVERSATION&lt;/strong&gt; wants the agent to start talking fast. We aim for under 200ms after the AMD event. Anything over 800ms reads as a robot or a bad connection, and people hang up. The rest of the pipeline burns through that budget: streaming TTS, prewarmed LLM context, and tool-call prefetching all have to be ready before the first word goes out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WAIT_FOR_BEEP&lt;/strong&gt; is where voicemail handling falls apart. Voicemail greetings vary from 5 to 25 seconds. You can&apos;t just start talking. You need a beep detector (energy plus frequency signature) running for as long as AMD result is &lt;code class=&quot;language-text&quot;&gt;voicemail&lt;/code&gt;. Get this wrong and your message starts mid-greeting, which sounds like a broken bot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LEAVE_MESSAGE&lt;/strong&gt; has tight constraints. Voicemail boxes cut off somewhere between 30 and 60 seconds, and voicemail-to-text systems will index whatever you say. Write the message so it reads cleanly in a transcript, then make sure it also sounds OK out loud. Write the script as if a transcription model is the first audience. Because one is.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NAVIGATE_IVR&lt;/strong&gt; is a different state machine entirely. Once AMD says IVR, you&apos;re in DTMF land. Speech doesn&apos;t work, and the timing of digits matters. Some IVRs swallow digits sent during prompts. Others won&apos;t accept input until a beep. You need menu prompt recognition (small ASR model, not your main LLM) plus a digit-sequence emitter with per-vendor tuning.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 850px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/796e6b31de66755e9c0a07a4fdf6402c/09fd1/amd-keypad-dtmf.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAQBAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHXRfpGiA//xAAYEAADAQEAAAAAAAAAAAAAAAABAgMEAP/aAAgBAQABBQK7FI5tDUY9RBVJZ0kx7//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EAB0QAAEEAgMAAAAAAAAAAAAAAAEAAhAREiExgZH/2gAIAQEABj8Cc4aKAPcYnhW2/Y//xAAZEAADAQEBAAAAAAAAAAAAAAAAAREhMYH/2gAIAQEAAT8hYTBY4bduPheHZczTSw6SSaH0/9oADAMBAAIAAwAAABBzz//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABkQAQEBAQEBAAAAAAAAAAAAAAERIQAxQf/aAAgBAQABPxASYVQzQs5nymoGJib5beBOfOQ34rFDZw05r0EexZ87/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Modern black office desk phone with handset off-hook, numeric keypad clearly visible&quot;
        title=&quot;&quot;
        src=&quot;/static/796e6b31de66755e9c0a07a4fdf6402c/faddd/amd-keypad-dtmf.jpg&quot;
        srcset=&quot;/static/796e6b31de66755e9c0a07a4fdf6402c/6a7c0/amd-keypad-dtmf.jpg 213w,
/static/796e6b31de66755e9c0a07a4fdf6402c/b9721/amd-keypad-dtmf.jpg 425w,
/static/796e6b31de66755e9c0a07a4fdf6402c/faddd/amd-keypad-dtmf.jpg 850w,
/static/796e6b31de66755e9c0a07a4fdf6402c/09fd1/amd-keypad-dtmf.jpg 1208w&quot;
        sizes=&quot;(max-width: 850px) 100vw, 850px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UNCERTAIN_PROBE&lt;/strong&gt; is the move when AMD comes back below threshold. Don&apos;t commit. Say something a human would respond to and a voicemail wouldn&apos;t. &quot;Hi, can you hear me?&quot; is a good probe because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A human says &quot;yes&quot; or &quot;hello&quot; within 1 to 2 seconds&lt;/li&gt;
&lt;li&gt;A voicemail keeps playing its scripted greeting, ignoring you&lt;/li&gt;
&lt;li&gt;An IVR ignores the question and continues its menu&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You reclassify based on what comes back. This recovers about 60% of the low-confidence cases we&apos;d otherwise have to hang up on.&lt;/p&gt;
&lt;h3 id=&quot;what-you-should-actually-measure&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-you-should-actually-measure&quot; aria-label=&quot;what you should actually measure permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What you should actually measure&lt;/h3&gt;
&lt;p&gt;After you ship this, four metrics matter. None of them are &quot;model accuracy.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Detection latency, P50 and P95.&lt;/strong&gt; Time from &lt;code class=&quot;language-text&quot;&gt;connect&lt;/code&gt; to &lt;code class=&quot;language-text&quot;&gt;amd_complete&lt;/code&gt;. In our pre-1.5.9 system this was around 1.4s P50, 2.8s P95. LiveKit claims their model is faster. Measure it on your own audio. Every telephony stack adds different noise characteristics.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Per-class false positive rate.&lt;/strong&gt; Don&apos;t track overall accuracy. &quot;Voicemail when actually human&quot; and &quot;human when actually voicemail&quot; carry different costs. In our outbound flows, mistaking a human for voicemail is worse: we play a recorded script at someone standing there confused, who then hangs up and remembers the brand as the one with the robot calls. Weight your scoring to your business.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;False-positive cost in dollars.&lt;/strong&gt; Pick a number for the cost of a wasted human contact. Multiply by FP rate. Pick a number for the cost of a confused real human (complaint, churn, lost sale). The model is good if it minimizes weighted FP cost, not raw accuracy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Time to first word after AMD.&lt;/strong&gt; If AMD says human, how fast does your agent actually say its first word? This is where the rest of your pipeline cost lives. If it&apos;s over 500ms, AMD is not your bottleneck.&lt;/p&gt;
&lt;h3 id=&quot;what-159-doesnt-give-you&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-159-doesnt-give-you&quot; aria-label=&quot;what 159 doesnt give you permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What 1.5.9 doesn&apos;t give you&lt;/h3&gt;
&lt;p&gt;Things production teams still build themselves:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Carrier-specific voicemail patterns.&lt;/strong&gt; Verizon, AT&amp;#x26;T, and T-Mobile voicemail systems each have their own greeting tempos and beep frequencies. A model trained on aggregate data is OK at all of them and best-in-class at none.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Voicemail systems with no beep.&lt;/strong&gt; Some VoIP boxes say &quot;leave your message after the beep&quot; without an actual beep. Or they use a tone the model wasn&apos;t trained on. We&apos;ve seen messages start before the box is ready, getting clipped mid-sentence.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IVR navigation.&lt;/strong&gt; AMD tells you the call is an IVR. It does not help you navigate one. That&apos;s a separate speech-to-intent pipeline tuned for menu prompts, plus a DTMF emitter that knows when each carrier accepts digits.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real-time confidence updates.&lt;/strong&gt; AMD fires once with a single confidence score. In practice, you want the score to update as more audio arrives, because a 1.2-second greeting and a 4-second greeting carry very different signal. Right now you get one shot.&lt;/p&gt;
&lt;h3 id=&quot;if-youre-already-on-agents-14-or-older&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#if-youre-already-on-agents-14-or-older&quot; aria-label=&quot;if youre already on agents 14 or older permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;If you&apos;re already on Agents 1.4 or older&lt;/h3&gt;
&lt;p&gt;A few moves before you flip the switch:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Don&apos;t migrate everything yet.&lt;/strong&gt; AMD is opt-in. Wrap 5 to 10% of outbound calls with it and shadow-log the result alongside your current logic. Measure agreement before you replace your old detector.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build the state machine before you trust the classifier.&lt;/strong&gt; The classifier is the easy part. The branching logic for voicemail, IVR, and uncertain probes is where your time goes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Instrument detection latency before changing anything.&lt;/strong&gt; You want a baseline. Otherwise you can&apos;t tell whether the new model is actually faster or just newer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Write the voicemail script for transcription.&lt;/strong&gt; Because a transcription bot will read it before any human does.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The classifier is a primitive. The product is the state machine you build on top.&lt;/p&gt;</content:encoded><author>me@ahmed-ibrahim.com</author></item><item><title><![CDATA[Typescript Decorators: What you need to know]]></title><description><![CDATA[Introduction Typescript Decorators are a feature of the Typescript programming language that adds additional behavior to an existing code. In simple words, a decorator is just a…]]></description><link>https://www.ahmed-ibrahim.com//typescript-decorators-what-do-you-need-to-know/</link><guid isPermaLink="false">https://www.ahmed-ibrahim.com//typescript-decorators-what-do-you-need-to-know/</guid><category><![CDATA[Typescript]]></category><category><![CDATA[Javascript]]></category><pubDate>Mon, 06 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;introduction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#introduction&quot; aria-label=&quot;introduction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Typescript Decorators are a feature of the Typescript programming language that adds additional behavior to an existing code. In simple words, a decorator is just a wrapper that adds some extra functionality to a class, method, property or parameter. Typescript Decorators were introduced in version 2.0 of the language, which was released in 2016.&lt;/p&gt;
&lt;h2 id=&quot;usage&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#usage&quot; aria-label=&quot;usage permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Usage&lt;/h2&gt;
&lt;p&gt;A decorator is applied to a declaration using the @ symbol. For example, to apply a decorator to a class, you would write @myDecorator before the class definition, like this:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;myDecorator&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token comment&quot;&gt;// class body&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Similarly, to apply a decorator to a method, you would write @myDecorator before the method definition:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;myDecorator&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;myMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;// method body&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;examples&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#examples&quot; aria-label=&quot;examples permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Examples&lt;/h2&gt;
&lt;p&gt;Let&apos;s look at a few examples of decorators in Typescript.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Class Decorator&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A class decorator is applied to a class and can modify the constructor of the class. Here is an example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;logClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;logClass&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Instantiating MyClass&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; myInstance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Output:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// [Function: MyClass]&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Instantiating MyClass&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Property Decorator&lt;/strong&gt; A property decorator is applied to a property and can modify the behavior of the property. Here is an example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;logProperty&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; propertyKey&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;propertyKey &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; has been accessed!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;logProperty&lt;/span&gt;&lt;/span&gt;
  myProperty&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Hello World!&quot;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; myInstance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;myInstance&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;myProperty&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Output:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// myProperty has been accessed!&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Hello World!&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Method Decorator&lt;/strong&gt; A method decorator is applied to a method and can modify the behavior of the method. Here is an example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;logMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; propertyKey&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; descriptor&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; PropertyDescriptor&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;propertyKey &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; has been called!&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;logMethod&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;myMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Calling myMethod&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; myInstance &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
myInstance&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;myMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Output:&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// myMethod has been called!&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;// Calling myMethod&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Parameter Decorator&lt;/strong&gt; A parameter decorator is applied to a parameter of a method and can modify the behavior of the parameter. Here is an example:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;typescript&quot;&gt;&lt;pre class=&quot;language-typescript&quot;&gt;&lt;code class=&quot;language-typescript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;logParameter&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;target&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; propertyKey&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; parameterIndex&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;propertyKey &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; has been called with parameter &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; parameterIndex&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;MyClass&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;myMethod&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token decorator&quot;&gt;&lt;span class=&quot;token at operator&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;logParameter&lt;/span&gt;&lt;/span&gt; myParameter&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;any&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token builtin&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;Calling myMethod with &quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; myParameter&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;summary&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#summary&quot; aria-label=&quot;summary permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Summary&lt;/h2&gt;
&lt;p&gt;Typescript decorators are a design pattern in Typescript that allows developers to add new behavior to an existing code. Decorators were introduced in Typescript version 1.5 and have since become a powerful tool for creating custom, reusable code. Decorators are used to modify the behavior of classes, properties, methods, and parameters and can be applied using the @ symbol followed by the name of the decorator. They are a useful tool for creating more flexible and maintainable code by allowing developers to separate the implementation of logic from the declaration of its behavior. Examples of decorators include @Component for creating a React component and @Injectable for creating a service in Angular. In conclusion, decorators in Typescript are a valuable tool for enhancing the functionality of existing code.&lt;/p&gt;</content:encoded><author>me@ahmed-ibrahim.com</author></item><item><title><![CDATA[Database index. What do you need to know?]]></title><description><![CDATA[What Is Database index 💾 Indexing makes columns faster to query by creating pointers to where data is stored within a database. Similar to bookmarks, That can make it easy to go…]]></description><link>https://www.ahmed-ibrahim.com//database-index-what-you-need-to-know/</link><guid isPermaLink="false">https://www.ahmed-ibrahim.com//database-index-what-you-need-to-know/</guid><category><![CDATA[database]]></category><pubDate>Tue, 11 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;what-is-database-index-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-database-index-&quot; aria-label=&quot;what is database index  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What Is Database index 💾&lt;/h2&gt;
&lt;p&gt;Indexing makes columns faster to query by creating pointers to where data is stored within a database. Similar to bookmarks, That can make it easy to go to a certain position in the book without going through each page!&lt;/p&gt;
&lt;h1 id=&quot;image-center&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#image-center&quot; aria-label=&quot;image center permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;img src=&quot;https://media2.giphy.com/media/Oo1MAs4PmdkJO/giphy.gif?cid=5a38a5a2hfibpu7qeb4pugf35v8cklk2tcikrao2tnmdf4si&amp;#x26;rid=giphy.gif&amp;#x26;ct=g&quot; alt=&quot;image-center&quot;&gt;&lt;/h1&gt;
&lt;h2 id=&quot;benefits-of-index&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#benefits-of-index&quot; aria-label=&quot;benefits of index permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Benefits of index&lt;/h2&gt;
&lt;p&gt;Faster lookup for results. Instead of scanning the entire table for the results, Use index structures such as B-Trees or Hash Indexes to get to your data faster. This is all about reducing the # of Disk IOs.&lt;/p&gt;
&lt;h1 id=&quot;image-center-1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#image-center-1&quot; aria-label=&quot;image center 1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;img src=&quot;https://c.tenor.com/KQ_L3hq_K0gAAAAd/no-indexes-wall.gif&quot; alt=&quot;image-center&quot;&gt;&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Indexes are good at speeding up the time it takes to search and find data in SELECT queries, but they can slow down queries to UPDATE, INSERT, or DELETE. If you have tables that you modify more often than you read the data, you may not want to use indexes for quicker searching.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;how-indexes-works&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-indexes-works&quot; aria-label=&quot;how indexes works permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How indexes works&lt;/h2&gt;
&lt;p&gt;Let’s start with this example, assuming we have a table of Friends. We won’t dive into the exact query that creates that table, as It differs based on the DBMS that you are using.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;City&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Alex&lt;/td&gt;
&lt;td&gt;NY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Sara&lt;/td&gt;
&lt;td&gt;LA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Zack&lt;/td&gt;
&lt;td&gt;VR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Dave&lt;/td&gt;
&lt;td&gt;CT&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;By default&lt;/strong&gt; primary key, Which in this case (ID) is auto-indexed, meaning that the DBMS(Database Management System) will create it automatically upon creating the table.&lt;/p&gt;
&lt;p&gt;Building on that, We can try two simple (lookup) queries that demonstrate how the index would affect query time.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;-- Lookup query with Name (Non-index)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; Friends &lt;span class=&quot;token keyword&quot;&gt;where&lt;/span&gt; Name &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Zack&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In the above example, We’re trying to lookup for the non-index column, Which will scan every single row of the table, Till it finds all rows with &lt;code class=&quot;language-text&quot;&gt;Name=&apos;Zack&apos;&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Full_table_scan&quot;&gt;Full table scan&lt;/a&gt; usually the slowest method of scanning a table due to the heavy amount of I/O reads&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;image-center-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#image-center-&quot; aria-label=&quot;image center  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;img src=&quot;https://dataschool.com/assets/images/sql-optimization/how_to_index/BasicSearchGif.gif&quot; alt=&quot;image-center &quot;&gt;&lt;/h1&gt;
&lt;p&gt;Source: &lt;strong&gt;&lt;strong&gt;&lt;a href=&quot;https://dataschool.com/sql-optimization/how-indexing-works/&quot;&gt;Indexing&lt;/a&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Let’s add an index and try again:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now, we’re going to add an index to column (Name) and see how the query will be different than before.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INDEX&lt;/span&gt; friends_name &lt;span class=&quot;token keyword&quot;&gt;ON&lt;/span&gt; Friends&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;Name&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Once index creation is finished, We can do the same query again, but now, we should notice a significant change in # of rows that we scan.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;We could skip looking for the data in certain rows. If we wanted to search for &quot;Zack&quot; and we know the data is in alphabetical order we could jump down to halfway through the data to see if Zack comes before or after that row. We could then half the remaining rows and make the same comparison.&lt;/p&gt;
&lt;h1 id=&quot;image-center--1&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#image-center--1&quot; aria-label=&quot;image center  1 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;img src=&quot;https://dataschool.com/assets/images/sql-optimization/how_to_index/BinarySearchGif.gif&quot; alt=&quot;image-center &quot;&gt;&lt;/h1&gt;
&lt;p&gt;Source: &lt;strong&gt;&lt;strong&gt;&lt;a href=&quot;https://dataschool.com/sql-optimization/how-indexing-works/&quot;&gt;Indexing&lt;/a&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Indexes allow us to create sorted lists without having to create all new sorted tables, which would take up a lot of storage space. This took 3 comparisons to find the right answer instead of 9 in the unindexed data.&lt;/p&gt;
&lt;h1 id=&quot;what-is-happening-under-the-hood&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-happening-under-the-hood&quot; aria-label=&quot;what is happening under the hood permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is happening Under the hood?&lt;/h1&gt;
&lt;p&gt;The index will also pointers that simply reference information for the location of the additional information in memory.&lt;/p&gt;
&lt;p&gt;With that index, the query can search for only the rows in the &lt;code class=&quot;language-text&quot;&gt;Name&lt;/code&gt; column that have &lt;code class=&quot;language-text&quot;&gt;Zack&lt;/code&gt; and then using the pointer can go into the table to find the specific row where that pointer lives.&lt;/p&gt;
&lt;h1 id=&quot;image-center-2&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#image-center-2&quot; aria-label=&quot;image center 2 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;img src=&quot;https://chartio.com/assets/65a00c/tutorials/database-indexing/569d22eeb4dbb4255daba9994ea4664251640a59cc99ade7cdb1c37691d6c99c/indexed-table.png&quot; alt=&quot;image-center&quot;&gt;&lt;/h1&gt;
&lt;p&gt;Source: &lt;strong&gt;&lt;strong&gt;&lt;a href=&quot;https://chartio.com/learn/databases/how-does-indexing-work/&quot;&gt;How Does Indexing Work&lt;/a&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h1 id=&quot;types-of-indexing&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#types-of-indexing&quot; aria-label=&quot;types of indexing permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;&lt;strong&gt;Types of Indexing&lt;/strong&gt;&lt;/strong&gt;&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;Clustered index&lt;/li&gt;
&lt;li&gt;Non-clustered index&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Both clustered and non-clustered indexes are stored and searched as B-trees, a data structure similar to a binary tree.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id=&quot;image-center-3&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#image-center-3&quot; aria-label=&quot;image center 3 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;img src=&quot;https://s3.us-west-2.amazonaws.com/secure.notion-static.com/c4914cc1-0b63-48fd-a195-ace65d6dbbad/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;#x26;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;#x26;X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221011%2Fus-west-2%2Fs3%2Faws4_request&amp;#x26;X-Amz-Date=20221011T191602Z&amp;#x26;X-Amz-Expires=86400&amp;#x26;X-Amz-Signature=48ba3eb1d3234c1d73cd86fbc682d5fdfc9e76e4259b4c5a04f2b7dfd2608ad8&amp;#x26;X-Amz-SignedHeaders=host&amp;#x26;response-content-disposition=filename%20%3D%22Untitled.png%22&amp;#x26;x-id=GetObject&quot; alt=&quot;image-center&quot;&gt;&lt;/h1&gt;
&lt;h2 id=&quot;clustered-indexes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#clustered-indexes&quot; aria-label=&quot;clustered indexes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;strong&gt;&lt;strong&gt;Clustered Indexes&lt;/strong&gt;&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;A Clustered index is the type of indexing that establishes a physical sorting order of rows. Suppose you have a table &lt;strong&gt;Friends Table&lt;/strong&gt; which contains &lt;code class=&quot;language-text&quot;&gt;ID&lt;/code&gt; as a primary key, then Clustered index which is self-created on that primary key will sort the  &lt;strong&gt;Friends Table&lt;/strong&gt;  table as per &lt;code class=&quot;language-text&quot;&gt;ID&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clustered indexes do not have to be explicitly declared.&lt;/li&gt;
&lt;li&gt;Created when the table is created.&lt;/li&gt;
&lt;li&gt;Use the primary key sorted in ascending order.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;non-clustered-indexes&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#non-clustered-indexes&quot; aria-label=&quot;non clustered indexes permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Non-clustered indexes&lt;/h2&gt;
&lt;p&gt;Index is an index structure separate from the data stored in a table that reorders one or more selected columns. The non-clustered index is created to improve the performance of frequently used queries not covered by a clustered index. It’s like a textbook; the index page is created separately at the beginning of that book&lt;/p&gt;
&lt;h1 id=&quot;image-center-4&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#image-center-4&quot; aria-label=&quot;image center 4 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;img src=&quot;https://s3.us-west-2.amazonaws.com/secure.notion-static.com/bedc3a7b-2bdb-41cf-879b-ac87bdd6d78f/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&amp;#x26;X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&amp;#x26;X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20221011%2Fus-west-2%2Fs3%2Faws4_request&amp;#x26;X-Amz-Date=20221011T191447Z&amp;#x26;X-Amz-Expires=86400&amp;#x26;X-Amz-Signature=8c1652bfeac1443dced120a0fc692dd772cd2e1f133be8dfa83771693592507d&amp;#x26;X-Amz-SignedHeaders=host&amp;#x26;response-content-disposition=filename%20%3D%22Untitled.png%22&amp;#x26;x-id=GetObject&quot; alt=&quot;image-center&quot;&gt;&lt;/h1&gt;
&lt;p&gt;And, They are used to increase the speed of queries on the table by creating columns that are more easily searchable. Non-clustered indexes can be created by data analysts/ developers after a table has been created and filled.&lt;/p&gt;
&lt;h2 id=&quot;when-should-indexes-be-avoided&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#when-should-indexes-be-avoided&quot; aria-label=&quot;when should indexes be avoided permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;When Should Indexes Be Avoided?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Small Table, It’s not effective to have indexes on a small table (&lt;a href=&quot;https://www.sqlservercentral.com/forums/topic/indexing-small-tables-what-is-small-enough-to-avoid-indexes-altogether#:~:text=Indexing%20small%20tables%20may%20not,data%20in%20the%20table%20changes.&quot;&gt;Why&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Tables that have frequent, large batch update jobs run can be indexed. However, the batch job&apos;s performance is slowed considerably by the index. The conflict of having an index on a table that is frequently loaded or manipulated by a large batch process&lt;/li&gt;
&lt;li&gt;Indexes should not be used on columns that contain a high number of NULL values.&lt;/li&gt;
&lt;li&gt;Columns that are frequently manipulated should not be indexed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thank you!&lt;/p&gt;
&lt;h1 id=&quot;image-center-5&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#image-center-5&quot; aria-label=&quot;image center 5 permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;img src=&quot;https://media2.giphy.com/media/bAplZhiLAsNnG/giphy.gif?cid=5a38a5a2ihzyzsvg35xopj7proxa8qdulm2ibdmajiniqzqm&amp;#x26;rid=giphy.gif&amp;#x26;ct=g&quot; alt=&quot;image-center&quot;&gt;&lt;/h1&gt;</content:encoded><author>me@ahmed-ibrahim.com</author></item><item><title><![CDATA[Relational Database transactions (ACID)]]></title><description><![CDATA[What is the Database transaction? A transaction is a single logical unit of work which accesses and possibly modifies the contents of a database. Transactions access data using…]]></description><link>https://www.ahmed-ibrahim.com//relational-database-transaction-acid-in-dbms/</link><guid isPermaLink="false">https://www.ahmed-ibrahim.com//relational-database-transaction-acid-in-dbms/</guid><category><![CDATA[RDBMS]]></category><category><![CDATA[ACID]]></category><category><![CDATA[MySQL]]></category><category><![CDATA[SQL]]></category><category><![CDATA[postgreSQL]]></category><pubDate>Sun, 27 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;what-is-the-database-transaction&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-the-database-transaction&quot; aria-label=&quot;what is the database transaction permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is the Database transaction?&lt;/h2&gt;
&lt;p&gt;A &lt;em&gt;transaction&lt;/em&gt; is a single logical unit of work which accesses and possibly modifies the contents of a database. Transactions access data using read and write operations.&lt;/p&gt;
&lt;p&gt;All types of database access operation which are held between the beginning and end transaction statements are considered as a single logical transaction. During the transaction the database is inconsistent. Only once the database is committed the state is changed from one consistent state to another.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.guru99.com/images/1/100518_0500_DBMSTransac1.png&quot; alt=&quot;Database Transaction &quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example of simple transaction:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;sql&quot;&gt;&lt;pre class=&quot;language-sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;START&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TRANSACTION&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; Users &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;ID&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; user_name&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; email&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;asdf&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;bbb&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;bbb@gmail.com&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;INSERT&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;INTO&lt;/span&gt; Address &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;street_address&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; city&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; zip_code&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;permanent&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; user_id&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;VALUES&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;98  Old Chapel Road&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;GARWAY&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;HR2 7XH&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;COMMIT&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;If any part of the above code fails for any reason, unknown column, missing validation value or something. No other query will be performed, transaction ensures that there is no partial completion being recorded in the database.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;ACID PROPERTIES&lt;/strong&gt; are used for maintaining the integrity of database during transaction processing. ACID stands for Atomicity, Consistency, Isolation, and Durability.
&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/94364437-779aeb00-00c9-11eb-9743-fe0a769150a6.png&quot; alt=&quot;ACID Properties&quot;&gt;&lt;/p&gt;
&lt;p&gt;#Atomicity
It means that either the entire transaction logic got executed successfully at once or does not happen at all. Transactions do not occur partially. Each transaction runs as one unite. Either to complete the full logic, or nothing executed. It involves the following operations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Abort&lt;/strong&gt;: The changes made to database are not visible&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Commit&lt;/strong&gt;: The changes made to database are visible.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Atomicity is also known as the ‘All or nothing rule’.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;#Consistency
Ensures that you guarantee that all data will be consistent. All data will be valid according to all defined rules, including any constraints, cascades, and triggers that have been applied on the database.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Consider the following transaction T consisting of T1 and T2: Transfer of 100 from account X to account Y.

If the transaction fails after completion of T1 but before completion of T2.( say, after write(X) but before write(Y)), 

then amount has been deducted from X but not added to Y.

This results in an inconsistent database state. Therefore, the transaction must be executed in entirety in order to ensure correctness of database state.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;#Isolation
Guarantees that multiple transactions can be executed concurrently without causing inconsistency of database state. Transactions occurs independently without interference. The changes occurring with any transaction will not be visible to any any other transaction until it has been committed (Saved).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This property ensures that the execution of transactions concurrently will result in a state that is equivalent to a state achieved these were executed serially in some order.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;p&gt;#Durability
Durability means that, once a transaction is committed, it will remain in the system – even if there’s a system crash immediately following the transaction. Any changes from the transaction must be stored permanently. If the system tells the user that the transaction has succeeded, the transaction must have, in fact, succeeded.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;&lt;em&gt;ACID&lt;/em&gt;&lt;/strong&gt; properties of a DBMS allow safe sharing of data. Without these ACID properties, everyday occurrences such using computer systems to buy products would be difficult and the potential for inaccuracy would be huge. Imagine more than one person trying to buy the same size and color of a sweater at the same time -- a regular occurrence. The ACID properties make it possible for the merchant to keep these sweater purchasing transactions from overlapping each other -- saving the merchant from erroneous inventory and account balances.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;I think now, We&apos;ve covered a little more details about ACID, In the next article. I&apos;ll try to cover more about states of transactions. 🔥&lt;/p&gt;
&lt;p&gt;Peace ✌️&lt;/p&gt;</content:encoded><author>me@ahmed-ibrahim.com</author></item><item><title><![CDATA[The power of Node.js streams.]]></title><description><![CDATA[The power of Node.js streams. Streams are one of the most powerful features of Node.js What are Node.js streams? Streams are collections of data (Sequence of data) just like arrays…]]></description><link>https://www.ahmed-ibrahim.com//the-power-of-nodejs-streams/</link><guid isPermaLink="false">https://www.ahmed-ibrahim.com//the-power-of-nodejs-streams/</guid><category><![CDATA[Node.js]]></category><category><![CDATA[Streams]]></category><pubDate>Sat, 25 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;the-power-of-nodejs-streams&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#the-power-of-nodejs-streams&quot; aria-label=&quot;the power of nodejs streams permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;The power of Node.js streams.&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Streams are one of the most powerful features of Node.js&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;What are Node.js streams?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Streams are collections of data (Sequence of data) just like arrays or strings. The difference is that streams might not be available all at once, and they don’t have to fit in memory. This makes streams really powerful when working with large amounts of data, or data that’s coming from an external source one  &lt;em&gt;chunk&lt;/em&gt;  at a time. The opposite of streams is buffering which means to receive the data and send It once a time.&lt;/p&gt;
&lt;p&gt;Very Common example of streams and buffers:&lt;/p&gt;
&lt;p&gt;— Watching Live Video ( Stream )&lt;/p&gt;
&lt;p&gt;— Download a Video ( Buffer )&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Buffering versus streaming&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If we write a simple program that takes a simple input from the user i.e ( Hello Node.js ) and sends it a certain consumer for the buffer modal It will wait to receive &lt;em&gt;all the inputs&lt;/em&gt;  from the user then send the complete buffer to the consumer&lt;/p&gt;
&lt;p&gt;The following diagram shows a visual example of this paradigm:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/max/865/1*On0DNxruUhPcpcwYJvtDOQ.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;We can notice that, at the time t1, some data is received from the&lt;br&gt;
resource and saved into the buffer. At the time t2, another data chunk is received. The final one that completes the read operation and causes the entire buffer to be sent to the consumer.&lt;/p&gt;
&lt;p&gt;On the other side, streams allow you to process the data as soon as it arrives from the resource. This is shown in the following diagram:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/max/866/1*Hysp3M6dBKezQXZzjmhbUQ.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;The diagram shows you how each new chunk of data is received from the&lt;br&gt;
resource and is immediately provided to the consumer, who now has the chance to process it straight away without waiting for all the data to be collected in the buffer.&lt;/p&gt;
&lt;p&gt;But what are the differences between the two approaches? We can summarize them into two major categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spatial efficiency&lt;/li&gt;
&lt;li&gt;Time efficiency&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;spatial-efficiency&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#spatial-efficiency&quot; aria-label=&quot;spatial efficiency permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Spatial efficiency&lt;/h1&gt;
&lt;p&gt;streams allow us to do things that would not be possible, by buffering data and processing it all at once. Imagine reading a few of these big files concurrently; our application will easily run out of memory. Besides that, buffers in V8 cannot be bigger than 0x3FFFFFFF bytes (a little bit less than 1GB).&lt;/p&gt;
&lt;h1 id=&quot;time-efficiency&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#time-efficiency&quot; aria-label=&quot;time efficiency permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Time efficiency&lt;/h1&gt;
&lt;p&gt;Let’s now consider an application that compresses a file and uploads it to a remote HTTP server, which in turn decompresses it and saves it on the filesystem. If our client was implemented using a buffered API, the upload would start only when the entire file has been read and compressed. On the other hand, the decompression will start on the server only when all the data has been received. A better solution to achieve the same result&lt;br&gt;
involves the use of streams. On the client machine, streams allow you to compress and send the data chunks as soon as they are read from the filesystem, whereas on the server, it allows you to decompress every chunk as soon as it is received from the remote peer. The following diagram should give us a hint&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/max/851/1*vzjCmd2LtM6XNPDMtzkEMg.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;I hope this gives you a quick intro about Streams / Buffer with node.js&lt;/p&gt;
&lt;p&gt;— Note: Some parts quoted from Node.js-Design-Patterns-2nd-Edition-by-Mario-Casciaro-Luciano-Mammino&lt;/p&gt;
&lt;p&gt;Thank you,,&lt;/p&gt;</content:encoded><author>me@ahmed-ibrahim.com</author></item><item><title><![CDATA[Top 15 Visual studio code extensions for Full Stack Developer]]></title><description><![CDATA[Top 15 Visual studio code extensions for Full Stack Developer Visual studio code is one of the most beloved code editors. It's being used with more than 4.9 million users (monthly…]]></description><link>https://www.ahmed-ibrahim.com//top-15-visual-studio-code-for-full-stack-developer/</link><guid isPermaLink="false">https://www.ahmed-ibrahim.com//top-15-visual-studio-code-for-full-stack-developer/</guid><category><![CDATA[Visual studio]]></category><category><![CDATA[Extensions]]></category><pubDate>Mon, 20 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Top 15 Visual studio code extensions for Full Stack Developer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Visual studio code is one of the most beloved code editors. It&apos;s being used with more than &lt;a href=&quot;https://www.geekwire.com/2019/microsoft-declines-back-cmos-statement-majority-google-developers-using-visual-studio-code/&quot;&gt;4.9 million users&lt;/a&gt; (monthly active) across the whole world. with this hug popularity, developers and organizations are working on building an awesome visual studio code extensions that makes code much easier.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Top 15 VS Code extensions for Full Stack Developer&lt;/strong&gt;
In this blog, I will try to list the most beloved vs code extensions that I used. Almost every day.&lt;/p&gt;
&lt;h2 id=&quot;1-prettier-formatter&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#1-prettier-formatter&quot; aria-label=&quot;1 prettier formatter permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[1] Prettier Formatter&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://prettier.io/&quot; title=&quot;https://prettier.io/&quot;&gt;Prettier&lt;/a&gt;  is an opinionated code formatter. It enforces a consistent style by parsing your code and re-printing it with its own rules that take the maximum line length into account, wrapping code when necessary. It has more than 6 million download
&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79779573-e1ed7980-833a-11ea-9d33-22d073fe01db.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2-gitlens--git-supercharged&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#2-gitlens--git-supercharged&quot; aria-label=&quot;2 gitlens  git supercharged permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[2] GitLens — Git supercharged&lt;/h2&gt;
&lt;p&gt;GitLens &lt;strong&gt;supercharges&lt;/strong&gt; the Git capabilities built into Visual Studio Code. It helps you to &lt;strong&gt;visualize code authorship&lt;/strong&gt; at a glance via Git blame annotations and code lens, &lt;strong&gt;seamlessly navigate and explore&lt;/strong&gt; Git repositories, &lt;strong&gt;gain valuable insights&lt;/strong&gt; via powerful comparison commands, and so much more.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;With GitLens you can almost track every single line of the code, when it changed, who did that and what is the change is!
&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79780248-e6666200-833b-11ea-85b4-26c2edb02de3.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79779895-6809c000-833b-11ea-9037-8cc13418a10f.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;3-bracket-pair-colorizer&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#3-bracket-pair-colorizer&quot; aria-label=&quot;3 bracket pair colorizer permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[3] Bracket Pair Colorizer&lt;/h2&gt;
&lt;p&gt;This extension allows matching brackets to be identified with colors. The user can define which characters to match, and which colors to use.
&lt;img src=&quot;https://github.com/CoenraadS/BracketPair/raw/master/images/example.png&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;4-auto-close-tag&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#4-auto-close-tag&quot; aria-label=&quot;4 auto close tag permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[4] Auto Close Tag&lt;/h2&gt;
&lt;p&gt;Automatically add HTML/XML close tag, same as Visual Studio IDE or Sublime Text does. I thought it is so dumb to have an extension that closes ever tag you open until I tried it. Also, it has almost 2.7 million download
&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79780676-8c19d100-833c-11ea-9996-c882379a64ad.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;5-docker&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#5-docker&quot; aria-label=&quot;5 docker permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[5] Docker&lt;/h2&gt;
&lt;p&gt;The Docker extension makes it easy to build, manage and deploy containerized applications from Visual Studio Code. It allows you to write better YML files fo docker file or docker-compose through it&apos;s autocompleting
&lt;em&gt;Also it has very nice UI to manage your images and containers inside the visual studio&lt;/em&gt;
&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79781031-2aa63200-833d-11ea-87b7-7012c6a90eee.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;6-git-graph&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#6-git-graph&quot; aria-label=&quot;6 git graph permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[6] Git Graph&lt;/h2&gt;
&lt;p&gt;however, that Gitlens gives me many more insights about the repositories and branches. Git graph gives you little more to view a Git Graph of your repository, and easily perform Git actions from the graph. Configurable to look the way you want!
&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79781645-1282e280-833e-11ea-8f86-9f08963b6781.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;7-path-intellisense&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#7-path-intellisense&quot; aria-label=&quot;7 path intellisense permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[7] Path Intellisense&lt;/h2&gt;
&lt;p&gt;Visual Studio Code plugin that autocompletes filenames.&lt;/p&gt;
&lt;h2 id=&quot;8--settings-sync&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#8--settings-sync&quot; aria-label=&quot;8  settings sync permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[8] # Settings Sync&lt;/h2&gt;
&lt;p&gt;Since you might have multiple machines, for office, home .. setting sync allows you to synchronize Settings, Snippets, Themes, File Icons, Launch, Keybindings, Workspaces, and Extensions Across Multiple Machines Using GitHub Gist.
&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79782302-23802380-833f-11ea-91df-0e32decebaf9.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;9-todo-highlight&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#9-todo-highlight&quot; aria-label=&quot;9 todo highlight permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[9] TODO HIGHLIGHT&lt;/h2&gt;
&lt;p&gt;Highlight  &lt;code class=&quot;language-text&quot;&gt;TODO&lt;/code&gt;,  &lt;code class=&quot;language-text&quot;&gt;FIXME&lt;/code&gt;  and other annotations within your code.
Sometimes you forget to review the TODOs you&apos;ve added while coding before you publish the code to production. So I&apos;ve been wanting an extension for a long time that highlights them and reminds me that there are notes or things not done yet. Hope this extension helps you as well.
&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79782459-6d690980-833f-11ea-9739-bf4b81787cc7.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;10-better-comments&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#10-better-comments&quot; aria-label=&quot;10 better comments permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[10] Better Comments&lt;/h2&gt;
&lt;p&gt;The Better Comments extension will help you create more human-friendly comments in your code.&lt;br&gt;
With this extension, you will be able to categorize your annotations into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Alerts&lt;/li&gt;
&lt;li&gt;Queries&lt;/li&gt;
&lt;li&gt;TODOs&lt;/li&gt;
&lt;li&gt;Highlights&lt;/li&gt;
&lt;li&gt;Commented out code can also be styled to make it clear the code shouldn&apos;t be there&lt;/li&gt;
&lt;li&gt;Any other comment styles you&apos;d like can be specified in the settings&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79783077-6098e580-8340-11ea-85b4-02e8d1a60fbb.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;11-auto-rename-tag&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#11-auto-rename-tag&quot; aria-label=&quot;11 auto rename tag permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[11] Auto Rename Tag&lt;/h2&gt;
&lt;p&gt;Automatically rename paired HTML/XML tag, same as Visual Studio IDE does.&lt;/p&gt;
&lt;h2 id=&quot;12-code-spell-checker&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#12-code-spell-checker&quot; aria-label=&quot;12 code spell checker permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[12] Code Spell Checker&lt;/h2&gt;
&lt;p&gt;A basic spell checker that works well with camelCase code. The goal of this spell checker is to help catch common spelling errors while keeping the number of false positives low.
&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79783407-e61c9580-8340-11ea-9178-49f84cef194f.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;13-document-this&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#13-document-this&quot; aria-label=&quot;13 document this permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[13] Document This&lt;/h2&gt;
&lt;p&gt;&quot;Document This&quot; is a Visual Studio Code extension that automatically generates detailed JSDoc comments for both TypeScript and JavaScript files.
&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79783785-7b1f8e80-8341-11ea-808a-6c88f2207868.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;14-indenticator&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#14-indenticator&quot; aria-label=&quot;14 indenticator permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[14] Indenticator&lt;/h2&gt;
&lt;p&gt;Visually highlights the current indent depth. This extension can be used by itself, but it&apos;s recommended to use it alongside the builtin indent guides.
&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79783920-b7eb8580-8341-11ea-9b94-bf02c9aa482e.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;15-project-manager&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#15-project-manager&quot; aria-label=&quot;15 project manager permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;[15] Project Manager&lt;/h2&gt;
&lt;p&gt;It helps you to easily access your  &lt;strong&gt;projects&lt;/strong&gt;, no matter where they are located.  &lt;em&gt;don&apos;t miss that important projects anymore&lt;/em&gt;.
You can define your own  &lt;strong&gt;Projects&lt;/strong&gt;  (also called  &lt;strong&gt;Favorites&lt;/strong&gt;), or choose for auto-detect  &lt;strong&gt;Git&lt;/strong&gt;,  &lt;strong&gt;Mercurial&lt;/strong&gt;  or  &lt;strong&gt;SVN&lt;/strong&gt;  repositories,  &lt;strong&gt;VSCode&lt;/strong&gt;  folders, or  &lt;strong&gt;any&lt;/strong&gt;  other folder.
Here are some of the features that  &lt;strong&gt;Project Manager&lt;/strong&gt;  provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Save any folder as a  &lt;strong&gt;Project&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Save any workspace as a  &lt;strong&gt;Project&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Auto-detect  &lt;strong&gt;Git&lt;/strong&gt;,  &lt;strong&gt;Mercurial&lt;/strong&gt;  or  &lt;strong&gt;SVN&lt;/strong&gt;  repositories&lt;/li&gt;
&lt;li&gt;Open projects in the same or new window&lt;/li&gt;
&lt;li&gt;Identify  &lt;em&gt;deleted/renamed&lt;/em&gt;  projects&lt;/li&gt;
&lt;li&gt;A  &lt;strong&gt;Status Bar&lt;/strong&gt;  which identifies the current project&lt;/li&gt;
&lt;li&gt;A dedicated  &lt;strong&gt;Side Bar&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://user-images.githubusercontent.com/17949497/79784631-d4d48880-8342-11ea-8585-d73167b0a880.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s is for today! You can follow me on Twitter and let me know your thoughts! : &lt;strong&gt;Ahmed_ibrahim&lt;/strong&gt;
Thank you.&lt;/p&gt;</content:encoded><author>me@ahmed-ibrahim.com</author></item><item><title><![CDATA[Download the complete source code of any website]]></title><description><![CDATA[Website Downloader 💾 Download the complete source code of any website (including all assets) 🔨. 👉 Live Demo: https://site-dwloader.herokuapp.com/ enter image description here…]]></description><link>https://www.ahmed-ibrahim.com//download-the-source-code-of-anywebsite/</link><guid isPermaLink="false">https://www.ahmed-ibrahim.com//download-the-source-code-of-anywebsite/</guid><category><![CDATA[git]]></category><category><![CDATA[version control]]></category><category><![CDATA[web downloader]]></category><pubDate>Tue, 24 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;website-downloader-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#website-downloader-&quot; aria-label=&quot;website downloader  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Website Downloader 💾&lt;/h2&gt;
&lt;p&gt;Download the complete source code of any website (including all assets) 🔨.&lt;/p&gt;
&lt;p&gt;👉 Live Demo: &lt;a href=&quot;https://site-dwloader.herokuapp.com/&quot;&gt;https://site-dwloader.herokuapp.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/AhmadIbrahiim/Website-downloader/blob/master/public/Record.gif?raw=true&quot; alt=&quot;enter image description here&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;description-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#description-&quot; aria-label=&quot;description  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Description 📒&lt;/h2&gt;
&lt;p&gt;Website downloader works with &lt;code class=&quot;language-text&quot;&gt;wget&lt;/code&gt; and &lt;code class=&quot;language-text&quot;&gt;archiver&lt;/code&gt; to download all websites assets and compress then sends it back to the user through socket channel&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Wget params the being used&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;wget --mirror --convert-links --adjust-extension --page-requisites 
--no-parent http://example.org&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explanation of the various flags:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;--mirror – Makes (among other things) the download recursive.&lt;/li&gt;
&lt;li&gt;--convert-links – convert all the links (also to stuff like CSS stylesheets) to relative, so it will be suitable for offline viewing.&lt;/li&gt;
&lt;li&gt;--adjust-extension – Adds suitable extensions to filenames (html or css) depending on their content-type.&lt;/li&gt;
&lt;li&gt;--page-requisites – Download things like CSS style-sheets and images required to properly display the page offline.&lt;/li&gt;
&lt;li&gt;--no-parent – When recursing do not ascend to the parent directory. It useful for restricting the download to only a portion of the site&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;how-to-run-it-&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#how-to-run-it-&quot; aria-label=&quot;how to run it  permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;How to run it 🤔&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;git clone this repo&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$ npm install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;$ npm start&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>me@ahmed-ibrahim.com</author></item><item><title><![CDATA[Dynamic Open Graph Image API 👻]]></title><description><![CDATA[Imageiry.com 😺  Overview Imageiry Create a dynamic image representing your content for sharable content. To make it look stunning    👈. See the images in real facebook post…]]></description><link>https://www.ahmed-ibrahim.com//dynamic-graph-images-api/</link><guid isPermaLink="false">https://www.ahmed-ibrahim.com//dynamic-graph-images-api/</guid><category><![CDATA[graph-api]]></category><category><![CDATA[og images]]></category><pubDate>Tue, 24 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1 id=&quot;imageirycom--&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#imageirycom--&quot; aria-label=&quot;imageirycom   permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;&lt;a href=&quot;https://www.imageiry.com/&quot;&gt;Imageiry.com 😺 &lt;/a&gt;&lt;/h1&gt;
&lt;h2 id=&quot;overview&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#overview&quot; aria-label=&quot;overview permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Overview&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Imageiry&lt;/strong&gt; Create a dynamic image representing your content for sharable content. To make it look stunning    👈.&lt;/p&gt;
&lt;p&gt;See the images in real facebook post :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/kcNvYPQ/image.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/MSfCPjV/image.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;*Also,You can use imageiry to : *&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Turn your HTML Design into image.&lt;/li&gt;
&lt;li&gt;When you use Open Graph tags to attach rich photos, you need an image, and ideally, an image based on your content&lt;/li&gt;
&lt;li&gt;Enahnce the outfit for sharble content ( &lt;em&gt;With createing unquie meta image for each artical or blog&lt;/em&gt; )&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;what-is-an-open-graph-image&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#what-is-an-open-graph-image&quot; aria-label=&quot;what is an open graph image permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;What is an Open Graph Image?&lt;/h2&gt;
&lt;p&gt;Have you ever posted a hyperlink to Twitter, Facebook, or Slack and seen an image popup?
How did your social network know how to &quot;unfurl&quot; the URL and get an image?
The answer is in your &lt;code class=&quot;language-text&quot;&gt;&amp;lt;head&gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;http://ogp.me&quot;&gt;Open Graph protocol&lt;/a&gt; says you can put a &lt;code class=&quot;language-text&quot;&gt;&amp;lt;meta&gt;&lt;/code&gt; tag in the &lt;code class=&quot;language-text&quot;&gt;&amp;lt;head&gt;&lt;/code&gt; of a webpage to define this image.&lt;/p&gt;
&lt;p&gt;It looks like the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Title&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;og:image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;http://example.com/logo.jpg&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;why-use-this-service&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#why-use-this-service&quot; aria-label=&quot;why use this service permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Why use this service?&lt;/h2&gt;
&lt;p&gt;Read the &lt;a href=&quot;https://www.imageiry.com/blog/why-to-use-imageiry&quot;&gt;blog post&lt;/a&gt; for more info on the &quot;Why&quot; part.&lt;/p&gt;
&lt;p&gt;The short answer is that it would take a long time to painstakingly design an image for every single blog post. And we don&apos;t want the exact same image for every blog post because that wouldn&apos;t make the article stand out when it was shared to Twitter.&lt;/p&gt;
&lt;p&gt;That&apos;s where &lt;code class=&quot;language-text&quot;&gt;imageiry.com&lt;/code&gt; comes in. We can simply pass the title of our blog post to our generator service and it will generate the image for us on the fly!&lt;/p&gt;
&lt;p&gt;It looks like the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;html&quot;&gt;&lt;pre class=&quot;language-html&quot;&gt;&lt;code class=&quot;language-html&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;Hello World&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;title&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;meta&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;property&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;og:image&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;https://www.imageiry.com/api/default?title=Write%20your%20text&amp;amp;url=www.Imageiry.com&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;head&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now try changing the title text &lt;code class=&quot;language-text&quot;&gt;Write%20your%20text&lt;/code&gt; to the title of your choosing and watch the magic happen ✨&lt;/p&gt;
&lt;h2 id=&quot;usage&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#usage&quot; aria-label=&quot;usage permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Usage&lt;/h2&gt;
&lt;p&gt;Imageiry has an direct api to convert any HTML based design into image&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;http://www.imageiry.com/convert&lt;/code&gt;  [&lt;strong&gt;POST]&lt;/strong&gt; ⚡&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;html&lt;/td&gt;
&lt;td&gt;&lt;em&gt;Any html content&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;em&gt;Note&lt;/em&gt;: Imageiry will convert the &lt;em&gt;body&lt;/em&gt; of the page only.&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/RDV768h/image.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;ready-made-templates&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#ready-made-templates&quot; aria-label=&quot;ready made templates permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Ready made templates.&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Default Template&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using dynamic images for your content enrich your website and ideally enhance your user experience especially for sharable content.&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;http://www.imageiry.com/api/default&lt;/code&gt;  [&lt;strong&gt;GET]&lt;/strong&gt; ⚡&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paramter&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;title&lt;/td&gt;
&lt;td&gt;_required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;url&lt;/td&gt;
&lt;td&gt;&lt;em&gt;required&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;color&lt;/td&gt;
&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Response&lt;/em&gt;&lt;/strong&gt;
&lt;img src=&quot;https://www.imageiry.com/api/default?title=Hi!Github&amp;#x26;url=www.Imageiry.com&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Movies&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using dynamic images for your content enrich your website and ideally enhance your user experience especially for sharable content.&lt;/p&gt;
&lt;p&gt;*Example  *:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/kcNvYPQ/image.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;API&lt;/em&gt; &lt;code class=&quot;language-text&quot;&gt;http://www.imageiry.com/api/movie&lt;/code&gt; &lt;strong&gt;[GET]&lt;/strong&gt; ⚡&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paramter&lt;/th&gt;
&lt;th&gt;state&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;title&lt;/td&gt;
&lt;td&gt;&lt;em&gt;required&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;description&lt;/td&gt;
&lt;td&gt;&lt;em&gt;required&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;moreInfo&lt;/td&gt;
&lt;td&gt;&lt;em&gt;required&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rate&lt;/td&gt;
&lt;td&gt;&lt;em&gt;required&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tag&lt;/td&gt;
&lt;td&gt;&lt;em&gt;required&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;likes&lt;/td&gt;
&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;backgroundImage&lt;/td&gt;
&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;posterImage&lt;/td&gt;
&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Sample&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;http://www.imageiry.com/api/movie?title=How%20to%20be%20awesome&amp;amp;description=be%20like%20man&amp;amp;moreInfo=This%20is%20more%20info%20about%20the%20link&amp;amp;rate=3&amp;amp;tag=PG-13 🚦&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id=&quot;article&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#article&quot; aria-label=&quot;article permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;Article&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Generate imge for each artical you write. Fully customized &lt;code class=&quot;language-text&quot;&gt;title,author,color,image&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;How it looks like on social media.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/tmvqLGv/article-1.jpg&quot; alt=&quot;article-1&quot;&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/MSfCPjV/image.png&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;API&lt;/em&gt; &lt;code class=&quot;language-text&quot;&gt;http://www.imageiry.com/api/article&lt;/code&gt; &lt;strong&gt;[GET]&lt;/strong&gt; ⚡&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paramter&lt;/th&gt;
&lt;th&gt;state&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;title&lt;/td&gt;
&lt;td&gt;&lt;em&gt;required&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;author&lt;/td&gt;
&lt;td&gt;&lt;em&gt;required&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;image&lt;/td&gt;
&lt;td&gt;&lt;em&gt;optional&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Sample&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.imageiry.com/api/article?title=Build%20software%20better,%20together.&amp;#x26;author=Ahmed%20Ibrahim&quot;&gt;http://www.imageiry.com/api/article?title=Build%20software%20better,%20together.&amp;#x26;author=Ahmed%20Ibrahim&lt;/a&gt; 🚦&lt;/p&gt;
&lt;h2 id=&quot;to-create-you-own-free-template-please-feel-free-to-contact-us--helpimageirycom&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#to-create-you-own-free-template-please-feel-free-to-contact-us--helpimageirycom&quot; aria-label=&quot;to create you own free template please feel free to contact us  helpimageirycom permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;To Create you own (FREE) template please feel free to contact us : &lt;a href=&quot;mailto:help@Imageiry.com&quot;&gt;help@Imageiry.com&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;to-be-continued&quot; style=&quot;position:relative;&quot;&gt;&lt;a href=&quot;#to-be-continued&quot; aria-label=&quot;to be continued permalink&quot; class=&quot;anchor before&quot;&gt;&lt;svg aria-hidden=&quot;true&quot; focusable=&quot;false&quot; height=&quot;16&quot; version=&quot;1.1&quot; viewBox=&quot;0 0 16 16&quot; width=&quot;16&quot;&gt;&lt;path fill-rule=&quot;evenodd&quot; d=&quot;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&quot;&gt;&lt;/path&gt;&lt;/svg&gt;&lt;/a&gt;To be continued.💫&lt;/h2&gt;
&lt;p&gt;Please share your thoughts if there is anything is missing.&lt;/p&gt;</content:encoded><author>me@ahmed-ibrahim.com</author></item></channel></rss>