<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>عين</title><link>https://omarelkhatib.com/</link><description>Recent content on عين</description><generator>Hugo</generator><language>en-us</language><copyright>© Omar ElKhatib</copyright><atom:link href="https://omarelkhatib.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Typed Nil in Go</title><link>https://omarelkhatib.com/posts/typed-nil-in-go/</link><pubDate>Fri, 05 Dec 2025 19:50:43 +0200</pubDate><guid>https://omarelkhatib.com/posts/typed-nil-in-go/</guid><description>&lt;h2 id="guess-the-output">Guess the output&lt;/h2>
&lt;p>Let&amp;rsquo;s take this method which is simple nil check&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-go" data-lang="go">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">IsErrNil&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span> &lt;span class="kt">error&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="kc">nil&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Let&amp;rsquo;s start directly with snippets and guess their output&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-go" data-lang="go">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">var&lt;/span> &lt;span class="nx">err&lt;/span> &lt;span class="kt">error&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">fmt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nx">fmt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="kc">nil&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">IsErrNil&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>What do you think the output is?&lt;/p>
&lt;p>If you think that it&amp;rsquo;s&lt;/p>
&lt;pre tabindex="0">&lt;code>&amp;lt;nil&amp;gt;
true
true
&lt;/code>&lt;/pre>&lt;p>Then right! Easy, cause in Go default value of &lt;code>error&lt;/code> is &lt;code>nil&lt;/code>&lt;/p>
&lt;p>Let&amp;rsquo;s go to the next snippet, here I am defining my own custom error type that
satisfies the &lt;code>error&lt;/code> interface in Go&lt;/p></description></item><item><title>Gemini API Memory Efficient Way to Handle File Upload</title><link>https://omarelkhatib.com/posts/gemini-api-memory-efficient-way-to-handle-file-upload/</link><pubDate>Fri, 01 Aug 2025 14:37:45 +0300</pubDate><guid>https://omarelkhatib.com/posts/gemini-api-memory-efficient-way-to-handle-file-upload/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Hello, in this post we will design a memory efficient way to take a file from client and communicate it back to the genai go SDK.&lt;/p>
&lt;h2 id="method">Method&lt;/h2>
&lt;p>If we go the documentation of &lt;a href="https://web.archive.org/web/20250711023008/https://ai.google.dev/gemini-api/docs/document-processing#go_2" target="_blank" rel="noreferrer nofollow">document processing API&lt;/a>

notice in the example they are getting the file storing it inside a temporary buffer then using &lt;code>client.Files.UploadFromPath&lt;/code>
to upload the file from local path, genai, at the moment of writing this blog allow maximum is &lt;code>20 MB&lt;/code>
Also the attached PDF which is &lt;code>19.7 MB&lt;/code> is the PDF I will be using in this blog.&lt;/p></description></item><item><title>Be Aware of Pointer References And Cache</title><link>https://omarelkhatib.com/posts/be-aware-of-pointer-references-and-caching/</link><pubDate>Sat, 21 Jun 2025 20:53:36 +0300</pubDate><guid>https://omarelkhatib.com/posts/be-aware-of-pointer-references-and-caching/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>I faced a bug, that is so simple, that it took me sometime to find it.
Let&amp;rsquo;s start with the problem, and explain what was happening.&lt;/p>
&lt;h2 id="problem-description">Problem Description&lt;/h2>
&lt;p>Let&amp;rsquo;s take a look at this code ( I knew it&amp;rsquo;s not well written, but it&amp;rsquo;s a good minimal example)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-go" data-lang="go">&lt;span class="line">&lt;span class="cl">&lt;span class="kd">type&lt;/span> &lt;span class="nx">S&lt;/span> &lt;span class="kd">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">Field1&lt;/span> &lt;span class="kt">int&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">type&lt;/span> &lt;span class="nx">X&lt;/span> &lt;span class="kd">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">S&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nx">S&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">type&lt;/span> &lt;span class="nx">Y&lt;/span> &lt;span class="kd">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">sm&lt;/span> &lt;span class="kd">map&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="kt">string&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="nx">S&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="nf">main&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">key&lt;/span> &lt;span class="o">:=&lt;/span> &lt;span class="s">&amp;#34;k&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">s&lt;/span> &lt;span class="o">:=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="nx">S&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nx">Field1&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="mi">10&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">x&lt;/span> &lt;span class="o">:=&lt;/span> &lt;span class="nx">X&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nx">S&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nx">s&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">y&lt;/span> &lt;span class="o">:=&lt;/span> &lt;span class="nx">Y&lt;/span>&lt;span class="p">{&lt;/span>&lt;span class="nx">sm&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="kd">map&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="kt">string&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="nx">S&lt;/span>&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="nx">key&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nx">s&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="p">}}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">x&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">S&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Field1&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="mi">20&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">fmt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Changing x reflected in y map: %d\n&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">y&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sm&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">])&lt;/span> &lt;span class="c1">// prints 20&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">fmt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Caching x struct...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">c&lt;/span> &lt;span class="o">:=&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="nx">Cache&lt;/span>&lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">xJSON&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">err&lt;/span> &lt;span class="o">:=&lt;/span> &lt;span class="nx">json&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Marshal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="k">if&lt;/span> &lt;span class="nx">err&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="kc">nil&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="nb">panic&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">c&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Put&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">xJSON&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">y&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sm&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">Field1&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="o">-&lt;/span>&lt;span class="mi">100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">fmt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Field in y map: %d\n&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">y&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">sm&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">].&lt;/span>&lt;span class="nx">Field1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// prints -100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">fmt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Field in x (live without saving to cache): %d\n&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">x&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">S&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Field1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// prints -100&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">ok&lt;/span> &lt;span class="o">:=&lt;/span> &lt;span class="nx">c&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">key&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="k">if&lt;/span> &lt;span class="p">!&lt;/span>&lt;span class="nx">ok&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="nb">panic&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;not found&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="kd">var&lt;/span> &lt;span class="nx">xFromCache&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nx">X&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">err&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nx">json&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Unmarshal&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">v&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="o">&amp;amp;&lt;/span>&lt;span class="nx">xFromCache&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="k">if&lt;/span> &lt;span class="nx">err&lt;/span> &lt;span class="o">!=&lt;/span> &lt;span class="kc">nil&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="nb">panic&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">err&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">fmt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Reading x from cache...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">fmt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Printf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;After reading from cache: %d\n&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">xFromCache&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">S&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Field1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">// prints 20&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">type&lt;/span> &lt;span class="nx">Entry&lt;/span> &lt;span class="kd">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">key&lt;/span> &lt;span class="kt">string&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">value&lt;/span> &lt;span class="p">[]&lt;/span>&lt;span class="kt">byte&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">type&lt;/span> &lt;span class="nx">Cache&lt;/span> &lt;span class="kd">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">mu&lt;/span> &lt;span class="nx">sync&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">Mutex&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">entries&lt;/span> &lt;span class="p">[]&lt;/span>&lt;span class="nx">Entry&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">c&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nx">Cache&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">Put&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">key&lt;/span> &lt;span class="kt">string&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">value&lt;/span> &lt;span class="p">[]&lt;/span>&lt;span class="kt">byte&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">c&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">mu&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Lock&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="k">defer&lt;/span> &lt;span class="nx">c&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">mu&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Unlock&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">c&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">entries&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="nb">append&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">c&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">entries&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">Entry&lt;/span>&lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="nx">key&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nx">key&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="nx">value&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">c&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nx">Cache&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">Get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nx">key&lt;/span> &lt;span class="kt">string&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">([]&lt;/span>&lt;span class="kt">byte&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kt">bool&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">c&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">mu&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Lock&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="k">defer&lt;/span> &lt;span class="nx">c&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">mu&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Unlock&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="k">for&lt;/span> &lt;span class="nx">_&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nx">entry&lt;/span> &lt;span class="o">:=&lt;/span> &lt;span class="k">range&lt;/span> &lt;span class="nx">c&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">entries&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="k">if&lt;/span> &lt;span class="nx">entry&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">key&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="nx">key&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">			&lt;span class="k">return&lt;/span> &lt;span class="nx">entry&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">value&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">true&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">		&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="k">return&lt;/span> &lt;span class="p">[]&lt;/span>&lt;span class="kt">byte&lt;/span>&lt;span class="p">{},&lt;/span> &lt;span class="kc">false&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The problem here that after we changed the values we didn&amp;rsquo;t save the changes to the cache.
If we save the Y struct to the cache, the changes will be reflected only for the Y struct itself, but not for the X struct.
so when they are stored in the cache, the changes made to the Y struct will not be reflected in the X struct.&lt;/p></description></item><item><title>Read From Pipe and Terminal in Same Go App</title><link>https://omarelkhatib.com/posts/read-from-pipe-and-terminal-in-same-go-app/</link><pubDate>Sat, 12 Apr 2025 20:08:10 +0300</pubDate><guid>https://omarelkhatib.com/posts/read-from-pipe-and-terminal-in-same-go-app/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Hello, I wanted to create a small app that do fuzzy matching on what ever passed to it in the pipe.
The app will take the input from the pipe, then enter terminal mode to interactive fuzzing.&lt;/p>
&lt;p class="imgp" style="filter: contrast(1.05) brightness(1.08) sepia(0.35) saturate(1.8) hue-rotate(65deg)">
&lt;img class="imgp" src='images/demo.webp' />
&lt;/p>
But there is a problem, that took me a while to figure out how to solve it.
&lt;h2 id="the-problem">The problem&lt;/h2>
&lt;p>The problem is that once &lt;code>os.Stdin&lt;/code> is used in pipe mode, it can&amp;rsquo;t be switched to terminal mode for interactive use.&lt;/p></description></item><item><title>Add Prompt Shortcut to Firefox AI Integration</title><link>https://omarelkhatib.com/posts/add-prompt-shortcut-to-firefox-ai-integration/</link><pubDate>Sun, 16 Mar 2025 01:51:51 +0200</pubDate><guid>https://omarelkhatib.com/posts/add-prompt-shortcut-to-firefox-ai-integration/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Hello, I wanted a way to boost my Japanese studies, I was thinking of a way that gives smart subtitles no only word to word translation, at first I prototyped a small app that load video and subtitles, then it give meaning of words and some grammar, how ever this takes a lot of time to prepare content and subtitles.
So I thought of a way to watch anime in browser, and leverage firefox new AI integration to give me the meaning of words in the context and grammar.&lt;/p></description></item><item><title>My Programming Philosophy and Rules</title><link>https://omarelkhatib.com/posts/my-programming-philosophy-and-rules/</link><pubDate>Fri, 14 Mar 2025 04:21:50 +0200</pubDate><guid>https://omarelkhatib.com/posts/my-programming-philosophy-and-rules/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>This blog will be some ideas that I reassemble of how I think about programming.
These are subjected to change the more I grow.
These are pure personal and opinionated, it&amp;rsquo;s just a public memo that I would like to revisit from time to time and track how the way I think about programming have changed each time I look at this.
A worth noting, that I am not a subject expert. So I touch the surface of different topics. I won&amp;rsquo;t claim that I know the smallest details about all of the things. Just enough knowledge that get the job done.&lt;/p></description></item><item><title>PostgreSQL Query Optimization Second Edition Summary</title><link>https://omarelkhatib.com/posts/postgresql-query-optimization-second-edition-summary/</link><pubDate>Tue, 18 Feb 2025 18:56:59 +0200</pubDate><guid>https://omarelkhatib.com/posts/postgresql-query-optimization-second-edition-summary/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Hello, this is a summary of the book &lt;a href="https://link.springer.com/book/10.1007/979-8-8688-0069-6" target="_blank" rel="noreferrer nofollow">PostgreSQL Query Optimization Second Edition&lt;/a>
 after reading mysql
now that I am professionally working with postgresql I want to learn more about optimizing queries in postgresql.&lt;/p>
&lt;p>These types of summaries are not really for audiences but for me to remember what I read and to be able to reference them later.
AI tools these days are so good at this but I like to do this type of summaries for my own learning.
Actually each chapter in the book have a summary so :)&lt;/p></description></item><item><title>Restrict Direct Call to a Method Inside Test in Go</title><link>https://omarelkhatib.com/posts/restrict-direct-call-to-a-method-inside-test-in-go/</link><pubDate>Fri, 06 Dec 2024 01:33:05 +0400</pubDate><guid>https://omarelkhatib.com/posts/restrict-direct-call-to-a-method-inside-test-in-go/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Hello, I am going to show a &lt;em>cool&lt;/em> trick to restrict direct call to a method inside test in Go. This is useful when you want to make sure that a method is only called from production code and not tests.&lt;/p>
&lt;h2 id="problem">Problem&lt;/h2>
&lt;p>I will put this code, our objective is simple we need to make sure that MyStruct doer have done and confirmed the end of their job.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-go" data-lang="go">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">package&lt;/span> &lt;span class="nx">demo&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="s">&amp;#34;fmt&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">type&lt;/span> &lt;span class="nx">Doer&lt;/span> &lt;span class="kd">interface&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nf">Do&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nf">EndDo&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">type&lt;/span> &lt;span class="nx">MyStruct&lt;/span> &lt;span class="kd">struct&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">D&lt;/span> &lt;span class="nx">Doer&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">type&lt;/span> &lt;span class="nx">DoPrint&lt;/span> &lt;span class="kd">struct&lt;/span>&lt;span class="p">{}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">d&lt;/span> &lt;span class="nx">DoPrint&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">Do&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">fmt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Doing&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">d&lt;/span> &lt;span class="nx">DoPrint&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">EndDo&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">fmt&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Println&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;End Doing&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kd">func&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nx">s&lt;/span> &lt;span class="o">*&lt;/span>&lt;span class="nx">MyStruct&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">Run&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="nx">s&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">D&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">Do&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">	&lt;span class="k">defer&lt;/span> &lt;span class="nx">s&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nx">D&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="nf">EndDo&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>in other word we need to make sure that when &lt;code>Do&lt;/code> is called &lt;code>EndDo&lt;/code> is also called.
to verify this let&amp;rsquo;s write a unit test.&lt;/p></description></item><item><title>Run Infinite Loop Without Frying the CPU in C</title><link>https://omarelkhatib.com/posts/run-infinite-loop-without-frying-the-cpu-in-c/</link><pubDate>Mon, 25 Nov 2024 04:59:15 +0400</pubDate><guid>https://omarelkhatib.com/posts/run-infinite-loop-without-frying-the-cpu-in-c/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>In this article, I will show you how to run an infinite loop without frying the CPU in C.
In Go it&amp;rsquo;s easy to achieve this by using channels and goroutines.
I am new to C and I wanted to see how I can achieve the same thing in C.
So if you are an experienced C developer, please let me know if there is a better way to do this.&lt;/p></description></item><item><title>Learning Japanese: The Journey</title><link>https://omarelkhatib.com/posts/learning-japanese-the-journey/</link><pubDate>Wed, 29 May 2024 02:06:01 +0300</pubDate><guid>https://omarelkhatib.com/posts/learning-japanese-the-journey/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>This is documentation of my progress in learning Japanese, I will post updates on this same post.
I tried to learn Japanese before but stoped because LIFE. Also this is an updated journey, I had old content on this post that I deleted, because it was failure attemp, basically I was trying to learn Japanese using a game on steam, the progress was so slow and unproductive.&lt;/p>
&lt;p>Date format is dd-MM-yyyy&lt;/p></description></item><item><title>PostgreSQL - Experimenting Trigger Under Transaction</title><link>https://omarelkhatib.com/posts/postgresql-experimenting-trigger-under-transactions/</link><pubDate>Sun, 14 Apr 2024 23:34:38 +0300</pubDate><guid>https://omarelkhatib.com/posts/postgresql-experimenting-trigger-under-transactions/</guid><description>&lt;h2 id="introduction-and-motivation">Introduction and Motivation&lt;/h2>
&lt;p>Hello, this blog post will be very light, it&amp;rsquo;s a small experiment I did to solidify my understanding of triggers under a transaction.&lt;/p>
&lt;p>I was working on a piece of code that uses some helper functions, and I was getting a behavior that I wasn&amp;rsquo;t expecting.&lt;/p>
&lt;p>My original guess was that all the trigger runs under the transactions would be done immediately and not after the &lt;code>COMMIT&lt;/code>.&lt;/p></description></item><item><title>Building Distributed Game Server In Go</title><link>https://omarelkhatib.com/posts/building-distributed-game-server-in-go/</link><pubDate>Mon, 18 Dec 2023 19:16:41 +0200</pubDate><guid>https://omarelkhatib.com/posts/building-distributed-game-server-in-go/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>In this blog, I will go through designing a distributed game server and the theory behind it.&lt;/p>
&lt;p>The game is Hangman with a Kanna theme. The game itself doesn&amp;rsquo;t make any sense to be distributed, this is just a project I made for fun to sharpen my skills in building a distributed system.&lt;/p>
&lt;p>&lt;p class="imgp">
 &lt;img loading="lazy" src="images/p1.webp" alt="p1" />
&lt;/p>
&lt;/p>
&lt;p>I will not show any code in this article but rather some theory and architecture, if you have questions feel free to &lt;a href="https://omarelkhatib.com/contact" >contact me&lt;/a>
 or read the source code at &lt;a href="https://github.com/khatibomar/dhangkanna/" target="_blank" rel="noreferrer nofollow">dhangkanna&lt;/a>
 to see the implementation details.&lt;/p></description></item><item><title>Csharp Wait All Tasks to Finish Without Holding Pointers to Tasks</title><link>https://omarelkhatib.com/posts/csharp-wait-all-tasks-to-finish-without-holding-pointer-to-tasks/</link><pubDate>Sat, 14 Oct 2023 08:39:17 +0300</pubDate><guid>https://omarelkhatib.com/posts/csharp-wait-all-tasks-to-finish-without-holding-pointer-to-tasks/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Let&amp;rsquo;s say you have an old code base, that doesn&amp;rsquo;t hold pointer to Tasks, and you need to wait all of them to be done on caller side, and you have nested calls so it&amp;rsquo;s hard to refactor, so you can&amp;rsquo;t do &lt;code>Task.WhenAll(tasks).Wait()&lt;/code>, so we need a wait all tasks to finish before executing code without keeping track of which Tasks are executed.&lt;/p>
&lt;h2 id="coding">Coding&lt;/h2>
&lt;h3 id="c-taskwhenall">C# Task.WhenAll&lt;/h3>
&lt;p>I will start by show casing how it&amp;rsquo;s done usually with &lt;code>Task.WhenAll&lt;/code>, we will start with a code that does not wait tasks and refactor to wait tasks.&lt;/p></description></item><item><title>Mysql 8 Query Performance Reference</title><link>https://omarelkhatib.com/posts/mysql-eight-query-performance-reference/</link><pubDate>Sun, 03 Sep 2023 00:20:03 +0300</pubDate><guid>https://omarelkhatib.com/posts/mysql-eight-query-performance-reference/</guid><description>&lt;h2 id="introduction-and-motivation">Introduction and Motivation&lt;/h2>
&lt;p>Hello I decided to make this complete reference because of a problem I faced at work: a painfully slow query that took 25 seconds to run. Through extensive research and learning, I managed to optimize it to just 1 second. But my journey didn&amp;rsquo;t stop there; I continued exploring database performance tuning, guided by the book &amp;ldquo;MySQL 8 Query Performance Tuning.&amp;rdquo;&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup> This blog serves as a summary of some chapters and sections from the book. If you find it intriguing, I encourage you to explore the full version, which delves into many more details and insights.&lt;/p></description></item><item><title>Generate Time Based One Time Password Like 2FA Apps</title><link>https://omarelkhatib.com/posts/generate-time-based-one-time-password-like-2fa-apps/</link><pubDate>Tue, 29 Aug 2023 22:28:12 +0300</pubDate><guid>https://omarelkhatib.com/posts/generate-time-based-one-time-password-like-2fa-apps/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Hello, I will try to explain in this post how I made my own TOTP(Time Based One Time Password) using &lt;code>c#&lt;/code>&lt;/p>
&lt;p>Many of us use authenticator apps like &lt;a href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2" target="_blank" rel="noreferrer nofollow">google authenticator&lt;/a>
 it basically generate a one time password every &lt;code>X&lt;/code> seconds.
Then we can use this password to verify login or whatever.&lt;/p>
&lt;h2 id="theory">Theory&lt;/h2>
&lt;p>I will explain the theory behind it in very simple words, Here is some math of how we will generate TOTP&lt;sup id="fnref:1">&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref">1&lt;/a>&lt;/sup>&lt;/p></description></item><item><title>Sync Same Git Repo Between Different Version Control Systems</title><link>https://omarelkhatib.com/posts/sync-same-git-repo-between-different-version-control-systems/</link><pubDate>Sun, 27 Aug 2023 14:04:38 +0300</pubDate><guid>https://omarelkhatib.com/posts/sync-same-git-repo-between-different-version-control-systems/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Hello, years back I decided to migrate to &lt;a href="https://codeberg.org/omarkhatib" target="_blank" rel="noreferrer nofollow">codeberg&lt;/a>
 because of disagreement with github policies&lt;/p>
&lt;p>Now I decided to move back to github, so the problem I faced is that my repos are outdated on github and I need to get the updates from codeberg.&lt;/p>
&lt;h2 id="solution-1">Solution 1&lt;/h2>
&lt;p>The first solution was to delete repo from github then use import feature in github to import repo from codeberg.
That works but we loose a lot of stuff when doing so, like stars.&lt;/p></description></item><item><title>Copy Null Values From Another Object Using Reflection</title><link>https://omarelkhatib.com/posts/copy-null-values-from-another-object-using-reflection/</link><pubDate>Sat, 26 Aug 2023 20:33:57 +0300</pubDate><guid>https://omarelkhatib.com/posts/copy-null-values-from-another-object-using-reflection/</guid><description>&lt;p>Let&amp;rsquo;s say we have the following class&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">Client&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kt">string?&lt;/span> &lt;span class="n">Name&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="k">get&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">set&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kd">public&lt;/span> &lt;span class="kt">int?&lt;/span> &lt;span class="n">Age&lt;/span> &lt;span class="p">{&lt;/span> &lt;span class="k">get&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="k">set&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>let&amp;rsquo;s create two instances from this class&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="n">Client&lt;/span> &lt;span class="n">client1&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">Client&lt;/span> &lt;span class="n">client2&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="k">new&lt;/span>&lt;span class="p">();&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>let&amp;rsquo;s assign name for &lt;code>client1&lt;/code> and age for &lt;code>client2&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="n">client1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Name&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="s">&amp;#34;Omar&amp;#34;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">client2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Age&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="m">23&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Now if we look at memory, we can see that client1 have &lt;code>Age&lt;/code> as null and client2 have &lt;code>Name&lt;/code> as null.&lt;/p>
&lt;figure>&lt;img src="https://omarelkhatib.com/posts/copy-null-values-from-another-object-using-reflection/images/1.webp"
 alt="image 1">
&lt;/figure>

&lt;p>We need to fill null values in &lt;code>client1&lt;/code> from &lt;code>client2&lt;/code> during runtime, sounds easy! right?&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-csharp" data-lang="csharp">&lt;span class="line">&lt;span class="cl">&lt;span class="n">client1&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Age&lt;/span> &lt;span class="p">=&lt;/span> &lt;span class="n">client2&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">Age&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>sure that works, but let&amp;rsquo;s say our object have over 100 properties. Typing them one by one is boring as 🦆&lt;/p></description></item><item><title>My personal Setup</title><link>https://omarelkhatib.com/posts/my-personal-setup/</link><pubDate>Fri, 25 Aug 2023 00:15:07 +0300</pubDate><guid>https://omarelkhatib.com/posts/my-personal-setup/</guid><description>&lt;h2 id="introduction">Introduction&lt;/h2>
&lt;p>Hello I am going to write about my personal setup for both work, gaming and learning.&lt;/p>
&lt;p>I have 2 machines for now, one laptop for work and gaming pc for home usage.&lt;/p>
&lt;h2 id="work-setup">Work setup&lt;/h2>
&lt;p>For work I use a &lt;a href="https://www.lenovo.com/us/en/p/laptops/thinkpad/thinkpadp/p14s-amd-g2/22wsp144sa2" target="_blank" rel="noreferrer nofollow">ThinkPad P14s Gen 2&lt;/a>
&lt;/p>
&lt;p>&lt;p class="imgp">
 &lt;img loading="lazy" src="images/1.jpeg" alt="laptop" />
&lt;/p>
&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Specs&lt;/th>
 &lt;th>Name&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>CPU&lt;/strong>&lt;/td>
 &lt;td>AMD Ryzen™ 7 PRO 5850U Processor (1.90 GHz, up to 4.40 GHz Max Boost, 8 Cores, 16 Threads, 16 MB Cache)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>RAM&lt;/strong>&lt;/td>
 &lt;td>32 GB DDR4 3200MHz&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>OS&lt;/strong>&lt;/td>
 &lt;td>&lt;a href="https://instantos.io/" target="_blank" rel="noreferrer nofollow">Instant OS beta 7&lt;/a>
&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="home-setup">Home setup&lt;/h2>
&lt;p>For home/gaming setup I use a custom build&lt;/p></description></item><item><title>About</title><link>https://omarelkhatib.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://omarelkhatib.com/about/</guid><description>&lt;div class="postcard">
 &lt;div class="postcard-stamp">&lt;/div>
 &lt;div class="postcard-content">
 &lt;div class="postcard-image">
 &lt;img src="https://omarelkhatib.com/images/me.webp"
 alt="Omar ElKhatib"
 class="profile-image"
 loading="lazy">
 &lt;/div>
 &lt;div class="postcard-text">
 &lt;p>Hello, I'm &lt;strong>Omar ElKhatib&lt;/strong>, also known online as &lt;strong>عين&lt;/strong> (pronounced Ayn).&lt;/p>
 &lt;p>You will find me blogging from time to time about things that I found interesting. I love distributed systems, performance, some low level details and architecture.&lt;/p>
 &lt;p>Professionally I worked as .net and currently a Go developer, tried to learn Rust but never build things with it, currently I am exploring C.&lt;/p>
 &lt;p>In my freetime I like to watch anime or learn new stuff, I am also a casual gamer, mostly card games.&lt;/p></description></item><item><title>Contact</title><link>https://omarelkhatib.com/contact/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://omarelkhatib.com/contact/</guid><description>&lt;p>&lt;svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">&lt;path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>&lt;/svg> &lt;a href="https://github.com/khatibomar" target="_blank" rel="noreferrer nofollow">khatibomar&lt;/a>
&lt;/p>
&lt;p>&lt;svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20.177 19.62" width="20.177" height="19.62">&lt;path clip-rule="evenodd" d="M 20.177 7.116 L 20.177 9.719 C 17.86 9.722 15.638 10.629 13.997 12.242 C 12.675 13.544 11.818 15.22 11.536 17.017 L 20.177 17.017 L 20.177 19.62 L 0 19.62 L 0 17.017 L 8.686 17.017 C 8.404 15.208 7.543 13.521 6.211 12.21 C 4.563 10.589 2.329 9.678 0 9.674 L 0 7.065 C 2.08 7.067 4.124 7.627 5.906 8.686 C 7.688 9.745 9.142 11.261 10.114 13.072 C 11.083 11.274 12.533 9.769 14.305 8.721 C 16.079 7.672 18.108 7.116 20.177 7.116 Z" fill-rule="evenodd" style="" transform="matrix(1, 0, 0, 1, 3.552713678800501e-15, 0)"/>&lt;path d="M 10.088 6.348 C 11.87 6.348 13.314 4.927 13.314 3.174 C 13.314 1.421 11.87 0 10.088 0 C 8.307 0 6.863 1.421 6.863 3.174 C 6.863 4.927 8.307 6.348 10.088 6.348 Z" style="" transform="matrix(1, 0, 0, 1, 3.552713678800501e-15, 0)"/>&lt;/svg> &lt;a href="https://oku.club/user/OmarElKhatib" target="_blank" rel="noreferrer nofollow">OmarElKhatib&lt;/a>
&lt;/p></description></item></channel></rss>