<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>بلوج شناوي</title><description>كل الافكار بتاعتي</description><link>https://shenawy29.github.io/ar/</link><language>ar</language><atom:link href="https://shenawy29.github.io/ar/rss.xml" rel="self" type="application/rss+xml" xmlns:atom="http://www.w3.org/2005/Atom"/><item><title>لية نيو ڤيم في عصر الاجينتس؟</title><link>https://shenawy29.github.io/ar/2026-07-16/nvim</link><guid isPermaLink="true">https://shenawy29.github.io/ar/2026-07-16/nvim</guid><pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;انا بكتب كود بقالي 4 سنين تقريباً. في الفترة دي, انا بدأت زي اي طالب CS بـVSCode. عايز اكتب كود, هكتبه كأني بكتب اي Text تاني. عايز اعمل Run للكود بتاعي, كنت بدوس Shortcut و VSCode يشغلهولي. مكنتش فاهم اصلاً الكود بيشتغل ازاي. كنت عارف انه It just runs.&lt;/p&gt;
&lt;h2&gt;How Neovim and I met&lt;/h2&gt;
&lt;p&gt;بعدها بفترة, بدأت اتفرج على يوتيوبر اسمه ThePrimeagen. ساعتها كان Software Engineer في Netflix, وكنت كل لما ابص عالـStreams بتاعته على Twitch او YouTube, عيني مكنتش بتعرف تواكب اصلاً هو بيعمل اية. بعيداً عن ان سرعته فالكتابة عالية جداً, وانه بيستعمل Keyboard غير العادية (&lt;a href=&quot;https://en.wikipedia.org/wiki/Dvorak_keyboard_layout&quot;&gt;dvorak&lt;/a&gt;), بس دا مكنش السبب الرئيسي اللي كان مخليه سريع. السبب الرئيسي كان الـText Editor بتاعه, Neovim.&lt;/p&gt;
&lt;h2&gt;What is Neovim&lt;/h2&gt;
&lt;p&gt;لو معندكش فكرة, Neovim هو Fork من Text Editor تاني اسمه Vim. Vim قديم جداً, اتعمل سنة 1991. وهو ذات نفسه كان تحسين لـText Editor اقدم منه اسمه Vi.&lt;/p&gt;
&lt;p&gt;كان في زي حرب بين Vim و Emacs فترة, بس المعارك دي خلصت خلاص, لكنها لسة موجودة فالـProgramming Culture. لو جيت تعمل جوجل لـVim مثلاً, هيقولك Did you mean emacs, والعكس بيحصل برضو.&lt;/p&gt;
&lt;p&gt;Neovim شغال على الـTerminal. بمعنى ان يعتبر مفيش GUI, اللي هي Window بتظهرلك الـUI. بيرسم الـUI بتاعه على الـTerminal.&lt;/p&gt;
&lt;p&gt;لعده اسباب, Neovim سريع جداً. بيفتح في اقل من 100ms على حسب الـCPU بتاعك, حتى لو حاطت عشرات الـPlugins.&lt;/p&gt;
&lt;p&gt;Neovim عبارة عن Modal Text Editor. يعني بتدخل في كذا Mode عشان تعمل حاجات. مينفعش مثلاً تعمل Hold لـShift وتنزل, ويقوم عاملك Selection. محتاج تدخل الـVisual Selection Mode. لو عايز تكتب, لازم تدخل الـInsert Mode. لو عايز تتحرك, لازم تدخل الـNormal Mode وهكذا. عشان كدا, الـLearning Curve ممكن يكون عالي شويتين.&lt;/p&gt;
&lt;p&gt;الهدف من الـArticle دي مش انك تعرف تستعمل Neovim. في مقولة بتقول “You don’t know what you don’t know”. تحسها بديهية شوية, لكنها حقيقة. عمرك ماكنت هتجرب Neovim لو محدش قالك عليه, عشان انت متعرفش انها حاجة موجودة اصلاً.&lt;/p&gt;
&lt;p&gt;زي مثلاً واحد عمره ما جرب حاجة غير المفكات العادية, مش هيفكر يسأل عن المفكات الكهربائية اصلاً. هو شايف ان المهمة بتتعمل, خلاص. نفس الكلام مع Neovim. لو انت شغال بـVSCode وخلاص, مش هتعرف ان في أسلوب تاني للكتابة خالص, وهتفضل فاكر ان الـVSCode هو الحقيقة المطلقة.&lt;/p&gt;
&lt;p&gt;وعشان انا شايف ان A Picture is Worth a Thousand Words, قررت اني اظهر حاجات انت ممكن تعملها بـNeovim, صعب تتعلم بـEditors تانية.&lt;/p&gt;
&lt;h2&gt;Practical Examples&lt;/h2&gt;
&lt;p&gt;هنا مثلاً حاجة Practical. غالباً كنت محتاج حاجة زي دي قبل كدا.&lt;/p&gt;

&lt;p&gt;او لو مثلاً, عايز اغير If statements لـSwitch Statment بسرعة بالـRegex Substitution:&lt;/p&gt;

&lt;p&gt;ممكن تضيف Plugins جديدة. مثلاً لو عايز تعمل Exchange للـFunction Arguments, ممكن تستعمل Plugin &lt;a href=&quot;https://github.com/nvim-mini/mini.ai&quot;&gt;&lt;code&gt;mini.ai&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;في Plugin برضو اسمها &lt;a href=&quot;https://github.com/folke/flash.nvim&quot;&gt;&lt;code&gt;flash.nvim&lt;/code&gt;&lt;/a&gt;. بتخليك تعمل Remote Operations, مثلاً تروح تعمل Delete لحاجة في مكان تاني وترجع تـPasteها مكان ما كنت واقف:&lt;/p&gt;

&lt;h2&gt;Any Agent Could Do This…&lt;/h2&gt;
&lt;p&gt;كل الحركات دي جامدة اوي وبتخليك سريع وكل حاجة. لو جيت تكتب Prompt واحدة الحاجات دي هتتعمل كلها عادي. طبعاً, بالوقت اللي انت بتستعمله عشان تكتب الـPrompt غالباً هيبقى اطول من الوقت اللي محتاجه عشان تعمل الحاجة دي اصلأ, ولكنها هتتعمل, ومش هضطر تتعلم Text Editor تاني من الاول.&lt;/p&gt;
&lt;p&gt;الـBenefits بتاعت Neovim عمرها ماكانت في السرعة. دا عامل كبير, بس ليا انا شخصياً دا مكنش اكبر Benefit ليا.&lt;/p&gt;
&lt;p&gt;الـBenefit الأكبر هو الـEcosystem. اول لما تستعمل الـVim Motions, مش هتعرف متستعملهاش في حاجة تانية. هتلاقيها في كل حاجة: الـBrowser (Vimium), الـFile Manager (ranger/lf/yazi), الـShell (set -o vi في zsh/bash), tmux, git, وحتى الـIDEs التانية (VS Code Vim extension, JetBrains IDEAVim). كلهم فيهم support للـVim Motions. بتكون حركة واحدة موحدة على كل حاجة بتستخدمها في الكمپيوتر.&lt;/p&gt;
&lt;p&gt;الـBenefit الأخر هو انك تتعود على الـCLI. يعتبر هتعيش جواه, هتحس ان اي حاجة تانية بطيئة, Bloated. هتبقى عادي عندك تعمل حاجات combine بين أدوات CLI مختلفة بـpipes, تدير sessions بـtmux, تعمل search و replace بـgrep و sed, تتعامل مع git بسرعة, تشتغل على servers بعيدة بـ ssh و nebula من غير ما تفتح حاجة تانية. الـCLI بيديك control كامل على كل حاجة.&lt;/p&gt;
&lt;p&gt;حاجة تانية هي الـCommunity. مع اي حاجة بتعملها بتلاقي Support كبير جداً. انا مثلاً كنت عامل &lt;a href=&quot;https://github.com/shenawy29/xdg-nvfilechooser.nvim&quot;&gt;xdg-nvfilechooser&lt;/a&gt;, ورغم ان الـProject مش Complete, الا اني لقيت دعم كبير لأن الناس عجبها الفكرة.&lt;/p&gt;
&lt;p&gt;هتلاقي في Overlap كبير في الـCommunity بتاعت Neovim, و الـCommunities الأخرى بتاعت الـProgrammers اللي بيقولوا عليهم “cracked.” غالباً هتلاقي اللي بيستعمل Neovim شخص عنده خبرة كبيرة في المجال بتاعه. دي حاجة لاحظتها, والناس دي ممكن تتعلم منها فعلاً.&lt;/p&gt;
&lt;p&gt;مثلاً, عمري ماكنت هكون كويس في Rust من غير الـYouTube Channel بتاعت &lt;a href=&quot;https://www.YouTube.com/c/JonGjengset&quot;&gt;Jon Gjengset&lt;/a&gt;, والكتب بتاعته. عايزك تخمن الـEditor بتاعه اية.&lt;/p&gt;
&lt;p&gt;في برضو &lt;a href=&quot;https://www.YouTube.com/@sphaerophoria&quot;&gt;sphaerophoria&lt;/a&gt;. بيستعمل Zig و Rust على طول, ومش بفهم 99 فالمية من الكود اللي بيكتبه لأنه على Level اخر بصراحة. خمن الـEditor بتاعه برضو.&lt;/p&gt;
&lt;p&gt;هتلاقي برضو Overlap بين الـCommunity بتاعت Neovim و Nix. لو متعرفش, Nix هو Package Manager لـLinux. من الـResources اللي فادتني هي الـYouTube Channel بتاعت &lt;a href=&quot;https://www.YouTube.com/@tweag&quot;&gt;Tweag&lt;/a&gt;. خمن الـEditor اللي بيستعملوه.&lt;/p&gt;
&lt;p&gt;مش معنى ان الناس دي كلها بتستعمل Neovim ان انت اول لما تستعمله وتتقنه هتبقى فظيع بقا ومفيش منك اتنين لأ. الفكرة ان الناس اللي بتحب تستعمل Neovim ليها Mindset معينة, والناس اصحاب الـMindset دي بحب اتعلم منها. بيكون عندهم شغف, حُب للي بيعملوه.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;لو عايز تتعلم اكتر عن Neovim, منصحكش تبدأ بالـEditor. ابدأ بأي Extension بتعمل Implementation للـVim Motions في الـEditor اللي انت بتستعمله already. لما تتعود, ممكن تغوص بقا في الـText Editor نفسه.&lt;/p&gt;</content:encoded></item><item><title>ادخل الحلبة</title><link>https://shenawy29.github.io/ar/2026-07-12/arenas</link><guid isPermaLink="true">https://shenawy29.github.io/ar/2026-07-12/arenas</guid><description>اتحكم في الميموري بتاعتك من غير صداع</description><pubDate>Sun, 12 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;لية بنستعمل Python؟ JavaScript؟ Java؟ Dart؟ اي طالب CS في سنة اولى ممكن يقولك ان اللغات دي بطيئة بالنسبة للغات تانية زي C. لو احنا عايزين الـSoftware بتاعنا يبقى اسرع مايمكن, لية بنستعمل اللغات دي لما ممكن نكون بنستعمل C++ مثلاً في كل حاجة؟&lt;/p&gt;
&lt;p&gt;الأجابة بسيطة: Ease of use. اللغات دي سهلة جداً فالاستعمال, الـSyntax بتاعها بسيط, بتقرأ زي الـEnglish, غالباً بتبقى Portable, ومن اهم الصفات انها Garbage Collected.&lt;/p&gt;
&lt;p&gt;Garbage Collected يعني الـCoder مش بيفكر فالـMemory. بينساها من دماغه (Ironically). لو كتبت برنامج بيستعمل 100 كيلوبايت, انا مش محتاج اعمل للـ100 كيلوبايت دي &lt;code&gt;free&lt;/code&gt;, لأني عارف ان الـRuntime بتاعت اللغة بتاعتي هتنقذني و هتحرر الـMemory اللي طلبتها دي في وقت ما.&lt;/p&gt;
&lt;p&gt;الوضع مكنش كدا على طول, معظم الـCoders زمان كانوا بيستعملوا Manual Memory Management, بيقولوا للكمبيوتر: انا هعمل Object. الـObject دي كلها على بعضها 100 كيلوبايت. الكمبيوتر مهمته الوحيدة انه يرجعلك الـMemory دي عشان تحط عليها الـData اللي انت محتاجها. مش مهمته انه يحرر الـMemory دي في وقت اخر. دي مهمتك انت.&lt;/p&gt;
&lt;p&gt;هفترض في الـArticle دي انك عندك فكرة عن الـHeap, الـStack, و اية &lt;code&gt;malloc&lt;/code&gt; و &lt;code&gt;free&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Stack Based Allocations&lt;/h2&gt;
&lt;p&gt;وانت بتتعلم برمجة لأول مرة في حياتك بتعرف ان في طريقتين انك تعمل ميموري. على الـStack او على الـHeap. غالباً اتعلمت ان الـStack اسرع عشان الميموري بتبقى ورا بعض, والـHeap ابطىء عشان الميموري بتبقى مبعثرة. وانك بتستعمل الـHeap لما متكونش عارف الـObject اللي انت عايزها هتبقى قد اية, فانت بتستعمل Dynamic Memory. الكلام دا مش دقيق اوي, انت ممكن بسهولة تستعمل الـStack عشان تعمل Dynamic Memory, بطريقة هنشوفها بعدين.&lt;/p&gt;
&lt;p&gt;تخيل الكود اللي تحت دا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; three&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    e &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    f &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    g &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; two&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    b &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    c &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; one&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    a &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    two&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;def&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;():&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    one&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; __name__ &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &quot;__main__&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;لو جينا نبص على الـBytecode بتاع Python دا على Godbolt, وركزنا على &lt;code&gt;three&lt;/code&gt; هنلاقي دا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Disassembly of &amp;lt;code object three at &lt;/span&gt;&lt;span&gt;0x5676616f8980&lt;/span&gt;&lt;span&gt;, file &quot;example.py&quot;, line &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&amp;gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  1&lt;/span&gt;&lt;span&gt;           RESUME                   &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  2&lt;/span&gt;&lt;span&gt;           LOAD_SMALL_INT           &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              STORE_FAST               &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; (e)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  3&lt;/span&gt;&lt;span&gt;           LOAD_SMALL_INT           &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              STORE_FAST               &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; (f)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  4&lt;/span&gt;&lt;span&gt;           LOAD_SMALL_INT           &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              STORE_FAST               &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; (g)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              LOAD_CONST               &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; (None)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;              RETURN_VALUE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;لاحظ ان في 3 Store (Allocate) بس مفيش اي Deallocate. عشان الـStack Frame كله بيتشال مرة واحدة, فا دا يعتبر الـDeallocate بتاعك.
&lt;img alt=&quot;Diagram of a call stack showing stack frames being deallocated automatically when a function returns&quot; src=&quot;/_astro/call_stack.MPyGQvZ0_2rALzP.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;الـVariables اللي احنا بنعملها بتتشال كلها مرة واحدة, عشان الـStack Frame كله بيتشال.&lt;/p&gt;
&lt;p&gt;سؤال بقا, احنا لية منستعملش الـStack لكل حاجة؟ الـStack تعتبر حاجة Efficient جداً. بتعمل Allocation واحدة لكل Object, و Deallocation لكل الـObjects لما الـLifetime بتاعت الـStack Frame تخلص.&lt;/p&gt;
&lt;p&gt;الفكرة كلها مش اننا عايزين Dynamic Memory. احنا لو عايزين Dynamic Memory, دي حاجة ممكنة على الـStack بـAPI اسمه &lt;a href=&quot;https://man7.org/linux/man-pages/man3/alloca.3.html&quot;&gt;&lt;code&gt;alloca&lt;/code&gt;&lt;/a&gt; موجود في الـStdlib بتاعت C. الفكرة ان احنا عايزين الـMemory بتاعتنا تطلع براالـStack Frame. مش عايزين الـMemory اللي احنا بنعمله تروح بعد مالـFunction Call تخلص.&lt;/p&gt;
&lt;h2&gt;Heap Based Allocations&lt;/h2&gt;
&lt;p&gt;على الجانب الأخر عندنا الـHeap. الطريقة العادية انك تعمل Allocation على الـHeap هي انك تستعمل الـC API اللي اسمه &lt;code&gt;malloc&lt;/code&gt; و &lt;code&gt;free&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;الـAPI بتاعهم مش صعب يتفهم, والهدف من الـArticle دي مش انك تتعلم &lt;code&gt;malloc&lt;/code&gt; و &lt;code&gt;free&lt;/code&gt;, لكن انك تتعلم Advanced Techniques للـMemory Allocation.&lt;/p&gt;
&lt;p&gt;الفكرة بتاعت &lt;code&gt;malloc&lt;/code&gt; و &lt;code&gt;free&lt;/code&gt; بسيطة. عايز ميموري؟ اطلب بـ&lt;code&gt;malloc&lt;/code&gt;. معنتش عايزها؟ حررها بـ&lt;code&gt;free&lt;/code&gt;. لو انتظمت على الشكل دا, البرنامج بتاعك مستحيل يبقى فيه Memory Leak.&lt;/p&gt;
&lt;p&gt;الـParadigm دا حلو. لكل &lt;code&gt;malloc&lt;/code&gt;, لازم يبقى في &lt;code&gt;free&lt;/code&gt; تصاحبها. لكن، في الواقع، الموضوع مش سهل بالبساطة دي دايماً.&lt;/p&gt;
&lt;h3&gt;Manual Memory Management: Problems&lt;/h3&gt;
&lt;p&gt;اصدقائنا بتوع الـCybersecurity عارفين ان جزء كبير من مجالهم موجود عشان يلاقي كود بيستعمل &lt;code&gt;malloc&lt;/code&gt; و &lt;code&gt;free&lt;/code&gt; بطريقة غلط. زي انك تعمل &lt;code&gt;free&lt;/code&gt; مرتين (Double Free), وهو ممكن يخليك تكتب على Memory اتحجزت لحاجة تانية خالص من غير ما تاخد بالك. او انك تـ&lt;code&gt;malloc&lt;/code&gt; لـBuffer صغير عن حجم الـData اللي هتحطها فيه, فتكتب برا حدود الـBuffer وتبوظ Memory جنبه. فانت لازم تاخد بالك كويس وانت بتستعمل الـAPI دا.&lt;/p&gt;
&lt;p&gt;رغم كدا، كل لسه محتاج يدور على مساحة مناسبة، ويحدث الـMetadata الداخلية بتاعته، ويتعامل مع مشاكل زي الـFragmentation. يعني حتى لو مفيش Syscall، فهو مش Operation ببلاش.&lt;/p&gt;
&lt;p&gt;ان الـOperation ممكن تكون Expensive شوية مش الحاجة الوحيدة السيئة في الـParadigm دا. لو انت عندك Graph كله Objects, انك تعرف انهي Node تعمله &lt;code&gt;free&lt;/code&gt; الأول ممكن يبقى صعب, بالذات لو الـGraph Cyclic.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A network of interconnected nodes in a chaotic pattern, each resembling a mesh sphere. Pink text at the top reads, &amp;quot;Which to free first?&amp;quot;&quot; src=&quot;/_astro/which.B1fqoHsn_1VXikb.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;حتى لو استعملت الـAPI صح 100%، لسه فيه تكلفة بتدفعها. الـ ممكن يضطر يطلب Memory جديدة من الـOS، ودا بيكون مكلف لأنه غالباً بيتضمن System Call. لكن معظم الـAllocators الحديثة مبتعملش Syscall لكل &lt;code&gt;malloc&lt;/code&gt;. بدل كدا، بتطلب Chunk كبيرة من الـMemory مرة واحدة، وبعدها تقسمها بنفسها على الـAllocations الصغيرة اللي برنامجك بيطلبها.&lt;/p&gt;
&lt;h3&gt;300,000 Rats&lt;/h3&gt;
&lt;p&gt;تخيل انك بتعمل لعبة. لعبة زي مثلاً A Plague Tale: Requiem. &lt;a href=&quot;https://en.wikipedia.org/wiki/A_Plague_Tale:_Requiem#:~:text=The%20release%20of%20a%20new%20generation%20of%20consoles%20allowed%20the%20game%20to%20render%20more%20than%20300%2C000%20rats%20at%20once.&quot;&gt;بيكون موجود اكتر من 300,000 فار عالـScreen&lt;/a&gt;. بعيداً عن صعوبة الـRendering اصلاً على الـGPU, الـCPU محتاج يـTrack الـObject نفسها عشان الـLogic بتاع الفار نفسه. هو بالتأكيد ان مش كل فار Object لوحده, بيحصل Merging لكن نفترض ان في اللعبة الخيالية بتاعتنا دي ان احنا مضطرين نخلي كل فار Object لوحده.&lt;/p&gt;
&lt;p&gt;هنعمل Creation للـObjects دي ازاي؟ احنا لو عملنا 300,000 Allocation مرة واحدة حرفياً مش هنخلص. تخيل انك عندك Ability فاللعبة برضو انك تقتل كل الـEnemies على الـScreen. لما تقتل الـEnemies بيختفوا. هل هنعمل 300,000 &lt;code&gt;free&lt;/code&gt;؟&lt;/p&gt;
&lt;p&gt;الحل الانسب عندنا, ان مادام الـEnemies دي بيتعملها Spawn مرة واحدة, وبيختفوا مرة واحدة برضو, ان احنا نعمل Allocation واحدة بس للـEnemies كلهم, واننا نعمل Deallocation مرة واحدة برضو. لأن الـEnemies دول حياتهم كلهم يعتبر مرتبطين ببعض. الـ&lt;a href=&quot;https://en.wikipedia.org/wiki/Object_lifetime&quot;&gt;Lifetime&lt;/a&gt; بتاعتهم مرتبطة ببعض.&lt;/p&gt;
&lt;h2&gt;Lifetimes&lt;/h2&gt;
&lt;p&gt;غالباً الناس اللي بتتعلم Rust جالهم PTSD Flashbacks لما شافوا الـSubtitle دا. مش هنتكلم كتير عن الـLifetimes لأنهم معقدين, لكن هنتكلم بمنظور عام.&lt;/p&gt;
&lt;p&gt;بطريقة بسيطة خالص: الـLifetime بتاعت Object هي المدة اللي الـObject تعتبر Valid فيها, وتقدر تستخدمها.&lt;/p&gt;
&lt;p&gt;هنا مثلاً, انا مقدرش استعمل &lt;code&gt;a_1&lt;/code&gt; و &lt;code&gt;a_2&lt;/code&gt; بعد ما الـScope (نهاية الـBrackets) بتاعتهم تخلص.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; a_1 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; a_2 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;زي كدا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; a_1 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; a_2 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// Invalid.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;console&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;log&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a_1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;بعيداً عن تعقيدات JavaScript اللي ليها علاقة بالـScope, الـConcept دا موجود في تقريباً كل لغة برمجة موجودة حالياً.&lt;/p&gt;
&lt;p&gt;لو عايزين نعمل Lifetime تانية, هنبدا Scope تاني. عشان نقدر نـTrack الـLifetimes بتاعتنا, احنا هنسميهم. هنسميهم a و b مثلاً.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// lifetime a start&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; a_1 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; a_2 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// lifetime a end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// lifetime b start&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; b_1 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    let&lt;/span&gt;&lt;span&gt; b_2 &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;// lifetime b end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ملاحظ اية؟ كل رقمين جوا كل Scope مرتبطين ببعض. الـLifetime بتاعتهم مرتبطة ببعض. أول لما الرقمين يبقوا Out of Scope، احنا ممكن نشيلهم كلهم مرة واحدة، عشان كدا كدا مفيش رقم هيعيش بعد التاني. لو رقم من الرقمين انتهت الـLifetime بتاعته، يبقى الرقم التاني ضروري إن الـLifetime بتاعته تنتهي برضو, لأنهم اتعملوا في نفس الـScope.&lt;/p&gt;
&lt;p&gt;الـStack بتعمل كدا بالظبط, زي ماشوفنا فوق. كل Variable جوا الـStack Frame الـLifetime بتاعتها مربوطة بـLifetime الـFrame نفسه.&lt;/p&gt;
&lt;p&gt;اللي احنا عايزينه دلوقت: &lt;strong&gt;احنا عايزين طريقة تخلينا نقدر نربط الـLifetimes بتاعت الـObjects بتاعتنا ببعض زي الـStack, نتجنب الصعوبات بتاعت &lt;code&gt;malloc&lt;/code&gt; و &lt;code&gt;free&lt;/code&gt;, ونعرف نحدد نهاية الـLifetime نفسها براحتنا.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;The Arena Allocator&lt;/h2&gt;
&lt;p&gt;الحل للمشكلة بتاعتنا دي هي الـArena Allocation. الفكرة كلها انك بتبدأ بأنك تعمل &lt;code&gt;malloc&lt;/code&gt; واحد لـBuffer كبير, وبعد كدا تستعمل الـRegion دا في انك تضيف الـObjects بتاعتك. الـObjects ممكن تكون من اي نوع, واحجامهم ممكن تكون مختلفة. ولما تخلص من الـArena, تعمل Reset للـMemory دي بس.&lt;/p&gt;
&lt;p&gt;في Techniques كتير انك تعمل Arenas, هنعمل Implementation لأشهر نوع, اسمه Bump Allocator. هنستعمل C.&lt;/p&gt;
&lt;h3&gt;The Arena Struct&lt;/h3&gt;
&lt;p&gt;دي اول حاجة هنعملها. كل اللي احنا محتاجينه جوا الـStruct بتاعنا هو Buffer عشان نحط فيه الـData, ومحتاجين نعرف الـSize بتاع الـBuffer دا.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt; &amp;lt;stddef.h&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;typedef&lt;/span&gt;&lt;span&gt; struct&lt;/span&gt;&lt;span&gt; Arena &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    unsigned&lt;/span&gt;&lt;span&gt; char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; buffer&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    size_t&lt;/span&gt;&lt;span&gt; buffer_size&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; Arena&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; argc&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; argv&lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;عشان نعمل الـArena محتاجين نعمل Function. الـFunction هنسميها &lt;code&gt;Arena_malloc&lt;/code&gt; وهترجع Pointer للـStruct اللي احنا عاملينه.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Arena&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; Arena_malloc&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;size_t&lt;/span&gt;&lt;span&gt; buffer_size&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // One malloc to create the struct.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Arena&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; arena &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; malloc&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Arena&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    arena&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_size &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; buffer_size&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // Another malloc to create the buffer.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    arena&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; malloc&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;buffer_size&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; arena&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;دلوقت, لو عايزين نعمل Arena جديدة, دا كل اللي احنا هنعمله:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; argc&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; argv&lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Arena&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; a &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Arena_malloc&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;دا هيعمل Buffer حجمه 1024 Byte.&lt;/p&gt;
&lt;p&gt;الـBuffer حالياً شكله كدا:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Diagram of an empty 1024-byte arena allocator buffer before any memory has been allocated&quot; src=&quot;/_astro/buffer.CtKDk4Q8_ybNRo.webp&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Arena Allocation&lt;/h3&gt;
&lt;p&gt;دلوقت, نستعمل الـArena بتاعتنا ازاي؟&lt;/p&gt;
&lt;p&gt;هنعمل Function تانية هنسميها &lt;code&gt;Arena_allocate&lt;/code&gt;. كل اللي الـFunction دي هتعمله انها تاخد Size parameter, وبالـSize دا هتحط الـMemory اللي احنا محتاجينها على الـBuffer اللي احنا عاملينه.&lt;/p&gt;
&lt;p&gt;لو جينا مثلاً نعمل Allocate لـStruct اسمه Player, وحجم الـStruct دا 120 بايت, الـBuffer هيبقى شكله عامل كدا:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Diagram of an arena allocator buffer after allocating a 120-byte Player struct&quot; src=&quot;/_astro/buffer_fill_2.pVgEg-Ta_2bD05a.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;دلوقت, احنا محتاجين حاجة تخلينا نعرف الـBuffer بتاعنا مليان قد اية. هنضيف &lt;code&gt;buffer_offset&lt;/code&gt; جوا الـArena struct.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;typedef&lt;/span&gt;&lt;span&gt; struct&lt;/span&gt;&lt;span&gt; Arena &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    size_t&lt;/span&gt;&lt;span&gt; buffer_offset&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; Arena&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;CPU Alignment&lt;/h3&gt;
&lt;p&gt;دلوقت, حاجة زيادة محتاجين نتعلمها. هي الـCPU Alignment.&lt;/p&gt;
&lt;p&gt;الـCPUs بتحب تقرأ من الميموري بطريقة معينة. لو انت عندك &lt;code&gt;int&lt;/code&gt; (غالباً 4 بايت), يبقى الـAddress بتاع اول بايت محتاج يكون Address يقبل القسمة على الـ4.&lt;/p&gt;
&lt;p&gt;فاحنا لو عندنا الـMemory بتاعتنا بالمنظر دا, بادئة من الصفر لحد 1024 (دول Addresses), ومستعملين لحد Address 493, يبقى الـAddress الجديد اللي المفروض نحط عنده الـ&lt;code&gt;int&lt;/code&gt; بتاعنا هو 496, عشان دا اقرب رقم يقبل القسمة على الـ4.&lt;/p&gt;
&lt;p&gt;نعمل اية في الـ3 Addresses اللي بعد 493؟ محتاجين نمليهم. هنمليهم بحاجة اسمها Padding.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Diagram of an arena buffer with padding bytes inserted to satisfy CPU memory alignment requirements&quot; src=&quot;/_astro/buffer_in_use.CUd3bYZc_ZEox3c.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;طيب, نحسب الـAlignment بتاعت الـData Types بتاعتنا ازاي؟ هتقولي مادام الـAddress بتاع الـData Type محتاج يقبل القسمة على الحجم بتاع الـData Type, فاحنا ممكن نستعمله بـ&lt;code&gt;sizeof&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;الموضوع مش بالسهولة دي للأسف. تخيل انك عندك حاجة زي كدا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;struct&lt;/span&gt;&lt;span&gt; Player &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    char&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    int&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;وان الـMemory بتاعتنا هتبقى كدا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;0    x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1    padding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2    padding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3    padding&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4    y&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5    y&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;7    y&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;8    y&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;الـ&lt;code&gt;sizeof&lt;/code&gt; بتاع الـStruct هيدينا 8. لكن الحقيقة ان احنا محتاجين الـAddress يكون يبدأ على Address يقبل القسمة على الـ4.&lt;/p&gt;
&lt;p&gt;الـRule of Thumb بتاعت الـAlignment هي ان الـAlignment تساوي اكبر Data Type جوا الـStruct, في الحالة دي اكبر Data Type هي الـ&lt;code&gt;int&lt;/code&gt;, فالـAlignment هتساوي 4, يعني الـStruct دا محتاج يبدأ على Address يقبل القسمة على 4.&lt;/p&gt;
&lt;p&gt;نرجع تاني للـAllocation. عشان نعمل Allocate جوا الـBuffer بتاعنا, محتاجين نعرف حجم الـStruct اللي هنعمله Allocation, والـAlignment بتاعته عشان نعرف نحطه في انهي Address جوا الـBuffer بتاعنا.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; Arena_allocate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Arena&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; size_t&lt;/span&gt;&lt;span&gt; struct_size&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; size_t&lt;/span&gt;&lt;span&gt; struct_alignment&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;محتاجين نعمل Visualization احسن شوية للـBuffer بتاعنا. الـBuffer بتاعنا مش موجود فالـMemory لوحده.&lt;/p&gt;
&lt;p&gt;لو الـMemory بتاعتنا مثلاً 4096 بايت, والـBuffer عبارة عن 1024 بايت, ممكن يكون بالمنظر دا:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Diagram showing a 1024-byte arena allocator buffer positioned within a larger 4096-byte memory allocation&quot; src=&quot;/_astro/actual.DPb0gfSQ_1jM682.webp&quot; /&gt;&lt;/p&gt;
&lt;p&gt;يبقى, عشان نعمل Allocate المفروض نعمل اية؟ المفروض نبدأ من اول الـAddress بتاع الـBuffer نفسه, ونضيف عليه الـOffset, اللي هو الـBuffer مستخدم قد اية, و كمان نضيف عليه Padding, عشان الـStruct يكون Aligned.&lt;/p&gt;
&lt;p&gt;اول حاجة هنعملها, اننا نحسب من اول الـOffset, احنا محتاجين نضيف قد اية عشان نبقى Aligned. لو احنا الـOffset عندنا 5 مثلاً, والـAlignment بـ4, يبقى احنا هنحسب &lt;code&gt;5 % 4 = 1&lt;/code&gt;. يعني الـOffset الحالي قدام 1 بايت بعد الـAlignment الصح. يبقى, عشان نوصل الـAlignment اللي بعده, محتاجين نطرح الـAlignment من النتيجة اللي حسبناها دي. يبقى &lt;code&gt;4 - 1 = 3&lt;/code&gt;. يعني احنا محتاجين نضيف 3 بايت للـOffset الحالي عشان نلاقي الـAddress الصح.&lt;/p&gt;
&lt;p&gt;لكن اية اللي هيحصل لو انت عند Alignment صح اصلاً؟ لو الـOffset بـ8, والـAlignment بـ4. هتيجي تحسب &lt;code&gt;8 % 4 = 4&lt;/code&gt;, وهتطرح النتيجة دي من الـAlignment, هيديك &lt;code&gt;4&lt;/code&gt;, لكن دا مش صح. عشان كدا فالأخر محتاجين نعمل mod للنتيجة بتاعتنا تاني. يبقى &lt;code&gt;4 % 4 = 0&lt;/code&gt;. ودي النتيجة الصح بتاعتنا.&lt;/p&gt;
&lt;p&gt;الكود هيبقى كدا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; Arena_allocate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Arena&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; size_t&lt;/span&gt;&lt;span&gt; struct_size&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; size_t&lt;/span&gt;&lt;span&gt; struct_alignment&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    size_t&lt;/span&gt;&lt;span&gt; padding &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;struct_alignment &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_offset &lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt; struct_alignment&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt; %&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        struct_alignment&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;دا هيدينا الـPadding عشان نخلي الـAddress aligned.&lt;/p&gt;
&lt;h3&gt;Arena Allocation: Continued&lt;/h3&gt;
&lt;p&gt;عايزين نتأكد ان الـStruct بتاعنا هيكفي جوا الـArena بتاعتنا. هنحسب لو الـOffset بتاعنا + الـPadding + الحجم بتاع الـStruct نفسه اقل من حجم الـArena نفسها.&lt;/p&gt;
&lt;p&gt;هنكتب السطر دا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_offset &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; padding &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; struct_size &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_size&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; NULL&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;عشان نحسب الـAddress, هنعمل Pointer Arithmetic. هنضيف الـPadding للـAddress بتاع الـPointer بتاع الـBuffer. وكمان هنضيف عليه الـOffset الحالي, اللي بيحسب احنا مستعملين قد اية من الـBuffer.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; placement_address &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_offset &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; padding&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;بعد كدا, هنضيف للـOffset بتاعنا الـPadding اللي احنا عملناه, زائد الحجم بتاع الـStruct اللي هنضيفه.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_offset &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; padding &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; struct_size&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;فالأخر, هنـReturn الـAddress بتاعنا.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;return&lt;/span&gt;&lt;span&gt; placement_address&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ودي الـImplementation كاملة للـAllocation:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; Arena_allocate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Arena&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; size_t&lt;/span&gt;&lt;span&gt; struct_size&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; size_t&lt;/span&gt;&lt;span&gt; struct_alignment&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    size_t&lt;/span&gt;&lt;span&gt; padding &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        (&lt;/span&gt;&lt;span&gt;struct_alignment &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_offset &lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt; struct_alignment&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt; %&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        struct_alignment&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_offset &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; padding &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; struct_size &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_size&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; NULL&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    void&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; placement_address &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_offset &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; padding&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_offset &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; padding &lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt; struct_size&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; placement_address&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;بس كدا. دي كل الـImplementation بتاعت الـAllocator بتاعنا.&lt;/p&gt;
&lt;h3&gt;Reset &amp;amp; Free&lt;/h3&gt;
&lt;p&gt;نعمل اية لو عايزين نعيد استعمال الـArena بتاعتنا في حاجة تانية؟ هنكتب Function تانية هنسميها &lt;code&gt;Arena_reset&lt;/code&gt;. طبعاً هتفتكر ان الـImplementation دي هتبقى معقدة, بس لأ. دي كل الـImplementation:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Arena_reset&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Arena&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer_offset &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;فكر كدا. لو احنا رجعنا الـOffset بتاعنا في صفر, اية اللي هيحصل؟ لما نيجي نعمل Allocate تاني, هنكتب فوق الـData اللي احنا كنا عاملينها قبل كدا. ممكن تفكر بيها ان احنا اعتبرنا الـData القديمة بتاعتنا Garbage Values, وان احنا بنكتب فوقها وخلاص.&lt;/p&gt;
&lt;p&gt;بس, لسة لحد دلوقت معملناش Free للـMemory بتاعت الـBuffer. عايزين Function تعمل كدا.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; Arena_free&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Arena&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // Free the buffer owned by the arena first&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    free&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buffer&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // Free the arena struct itself&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    free&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // `a` is now dangling.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Arena Usage&lt;/h3&gt;
&lt;p&gt;دلوقت, الجزء الممتع. نستعمل الـArena بتاعتنا ازاي؟ تخيل ان احنا بنعمل لعبة. عند كل Frame فاللعبة, محتاجين نعمل Allocate لشوية Ammo مثلاً, او رصاص.&lt;/p&gt;
&lt;p&gt;اول حاجة هنعملها هنعمل struct هنسميه Bullet.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;typedef&lt;/span&gt;&lt;span&gt; struct&lt;/span&gt;&lt;span&gt; Bullet &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    float&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; Bullet&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;لو حبينا نعمل Allocate, هنعمل حاجة زي كدا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; argc&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; argv&lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Arena&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; a &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Arena_malloc&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Bullet&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; b &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;Bullet&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;Arena_allocate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; sizeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bullet&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; _Alignof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bullet&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    b&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;x &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 10.0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;الحاجة الغريبة فالكود دا هي &lt;code&gt;_Alignof&lt;/code&gt;. دي بتجيبلنا الـAlignemnt بتاعت اي Type.&lt;/p&gt;
&lt;p&gt;بنبدأ الأول بأننا نعمل الـArena بتاعتنا, الـAllocate بترجعلنا Address جوا الـBuffer عبارة عن &lt;code&gt;void*&lt;/code&gt;. كل اللي احنا عايزينه ان احنا نعمل Cast للـAddress دا لـPointer للـType بتاعنا. دا مالأخر بيقول “انا معنتش عايز اعامل الـAddress دا كـRaw Bytes. الـAddress دا مخصص لأن يتحط عليه Bytes بتاعت struct Bullet.”&lt;/p&gt;
&lt;p&gt;بعد كدا, بنكتب جوا الـAddress دا الـData اللي احنا عايزينها. فالحالة دي خلينا الـ&lt;code&gt;x&lt;/code&gt; بـ10.0.&lt;/p&gt;
&lt;p&gt;كتابة الكود دا مزعجة شوية, فاحنا ممكن نعمل macro يخليلنا الكتابة اسهل.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt; ARENA_ALLOCATE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;arena&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Type&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;                                            \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ((&lt;/span&gt;&lt;span&gt;Type&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;Arena_allocate&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;arena&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; sizeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Type&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; _Alignof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Type&lt;/span&gt;&lt;span&gt;)))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; argc&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; char&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; argv&lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Arena&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; a &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Arena_malloc&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;1024&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Bullet&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; b &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ARENA_ALLOCATE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Bullet&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    b&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;x &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 10.0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;هنعمل دلوقت الـGame Loop بتاعتنا.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Arena&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; a &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Arena_malloc&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;MAX_BULLETS &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; sizeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bullet&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; +&lt;/span&gt;&lt;span&gt; 64&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // so gcc doesn&apos;t optimize this out.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    volatile&lt;/span&gt;&lt;span&gt; float&lt;/span&gt;&lt;span&gt; sink &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; frame &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; frame &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; FRAME_COUNT&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; frame&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        int&lt;/span&gt;&lt;span&gt; bullet_count &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;frame &lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt; MAX_BULLETS&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; +&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        Bullet&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; bullets &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;Bullet&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;Arena_allocate&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; sizeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bullet&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; bullet_count&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; _Alignof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bullet&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; bullet_count&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            bullets&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;].&lt;/span&gt;&lt;span&gt;x &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; 10.0&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            bullets&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;].&lt;/span&gt;&lt;span&gt;y &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; frame &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; 5.0&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        sink &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; bullets&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;bullet_count &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;].&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        Arena_reset&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    printf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;done, sink = &lt;/span&gt;&lt;span&gt;%f&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; sink&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Arena_free&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;بنعمل Arena واحدة بس قبل مالـLoop تبدأ. عند كل Frame, بنعمل Allocate لـBullets مخصصة بالـFrame دا, بنستخدم الـBullets, وبعد كدا بنعمل Reset للـArena في نهاية الـLoop.&lt;/p&gt;
&lt;p&gt;بعد كدا, بنعيد استخدام نفس الـArena عند الـFrame اللي بعد كدا.&lt;/p&gt;
&lt;h2&gt;الـBenchmark: Arena vs malloc&lt;/h2&gt;
&lt;p&gt;دلوقت, عايزين نقارن بين الـAllocator بتاعنا, وبين &lt;code&gt;malloc&lt;/code&gt;. دا نفس الـVersion بالظبط, بس بـ&lt;code&gt;malloc&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt; &amp;lt;stddef.h&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt; &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt; &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;typedef&lt;/span&gt;&lt;span&gt; struct&lt;/span&gt;&lt;span&gt; Bullet &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    float&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; Bullet&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt; FRAME_COUNT&lt;/span&gt;&lt;span&gt; 2000000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt; MAX_BULLETS&lt;/span&gt;&lt;span&gt; 50&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // same thing&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    volatile&lt;/span&gt;&lt;span&gt; float&lt;/span&gt;&lt;span&gt; sink &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; frame &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; frame &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; FRAME_COUNT&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; frame&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        int&lt;/span&gt;&lt;span&gt; bullet_count &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;frame &lt;/span&gt;&lt;span&gt;%&lt;/span&gt;&lt;span&gt; MAX_BULLETS&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; +&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        Bullet&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; bullets &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;Bullet&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;malloc&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;sizeof&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Bullet&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; bullet_count&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; bullet_count&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            bullets&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;].&lt;/span&gt;&lt;span&gt;x &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; i &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; 10.0&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            bullets&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt;].&lt;/span&gt;&lt;span&gt;y &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; frame &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; 5.0&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        sink &lt;/span&gt;&lt;span&gt;+=&lt;/span&gt;&lt;span&gt; bullets&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;bullet_count &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;].&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        free&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;bullets&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    printf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;done, sink = &lt;/span&gt;&lt;span&gt;%f&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; sink&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;هنستعمل&lt;a href=&quot;https://github.com/sharkdp/hyperfine&quot;&gt;&lt;code&gt;hyperfine&lt;/code&gt;&lt;/a&gt; عشان نقارن الاتنين.&lt;/p&gt;
&lt;p&gt;دي الـCompile Commands اللي هنستعملها:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;gcc&lt;/span&gt;&lt;span&gt; -O2&lt;/span&gt;&lt;span&gt; -std=c11&lt;/span&gt;&lt;span&gt; -o&lt;/span&gt;&lt;span&gt; arena_bin&lt;/span&gt;&lt;span&gt; arena.c&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;gcc&lt;/span&gt;&lt;span&gt; -O2&lt;/span&gt;&lt;span&gt; -std=c11&lt;/span&gt;&lt;span&gt; -o&lt;/span&gt;&lt;span&gt; malloc_bin&lt;/span&gt;&lt;span&gt; malloc.c&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;والـRun Command:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;hyperfine&lt;/span&gt;&lt;span&gt; --warmup&lt;/span&gt;&lt;span&gt; 3&lt;/span&gt;&lt;span&gt; ./malloc_bin&lt;/span&gt;&lt;span&gt; ./arena_bin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;دي الـResults بتاعتنا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Benchmark&lt;/span&gt;&lt;span&gt; 1:&lt;/span&gt;&lt;span&gt; ./malloc_bin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Time&lt;/span&gt;&lt;span&gt; (mean &lt;/span&gt;&lt;span&gt;±&lt;/span&gt;&lt;span&gt; σ&lt;/span&gt;&lt;span&gt;):      19.0 ms ±   1.9 ms    &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;User: &lt;/span&gt;&lt;span&gt;18.6&lt;/span&gt;&lt;span&gt; ms, System: &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Range&lt;/span&gt;&lt;span&gt; (min &lt;/span&gt;&lt;span&gt;…&lt;/span&gt;&lt;span&gt; max&lt;/span&gt;&lt;span&gt;):    17.9 ms …  36.8 ms    141 runs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Benchmark&lt;/span&gt;&lt;span&gt; 2:&lt;/span&gt;&lt;span&gt; ./arena_bin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Time&lt;/span&gt;&lt;span&gt; (mean &lt;/span&gt;&lt;span&gt;±&lt;/span&gt;&lt;span&gt; σ&lt;/span&gt;&lt;span&gt;):      10.0 ms ±   0.3 ms    &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;User: &lt;/span&gt;&lt;span&gt;9.7&lt;/span&gt;&lt;span&gt; ms, System: &lt;/span&gt;&lt;span&gt;0.5&lt;/span&gt;&lt;span&gt; ms&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  Range&lt;/span&gt;&lt;span&gt; (min &lt;/span&gt;&lt;span&gt;…&lt;/span&gt;&lt;span&gt; max&lt;/span&gt;&lt;span&gt;):     9.5 ms …  12.0 ms    244 runs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;Summary&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;  ./arena_bin&lt;/span&gt;&lt;span&gt; ran&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    1.90&lt;/span&gt;&lt;span&gt; ±&lt;/span&gt;&lt;span&gt; 0.20&lt;/span&gt;&lt;span&gt; times&lt;/span&gt;&lt;span&gt; faster&lt;/span&gt;&lt;span&gt; than&lt;/span&gt;&lt;span&gt; ./malloc_bin&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Credits&lt;/h3&gt;
&lt;p&gt;الـArticle دي مكنتش هتبقى ممكنة من غير الـTalk العظيم &lt;a href=&quot;https://youtu.be/TZ5a3gCCZYo?si=CY3XiIMTV-CTSyyE&quot;&gt;دا&lt;/a&gt; لـRyan Fleury.&lt;/p&gt;
&lt;p&gt;الـImplementation &lt;a href=&quot;https://www.youtube.com/watch?v=qTba8azvZQs&quot;&gt;دي&lt;/a&gt; بـC++ كانت مفيدة جداً برضو.&lt;/p&gt;</content:encoded></item><item><title>الاعداد التخيلية حقيقية</title><link>https://shenawy29.github.io/ar/2026-03-23/imaginary</link><guid isPermaLink="true">https://shenawy29.github.io/ar/2026-03-23/imaginary</guid><pubDate>Mon, 23 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;الـMath كعلم موجودة من بداية التاريخ. من اول مالبشرية بدأت تعمل حضارة, الارقام شيء موجود ولكن مكنش كل الارقام اللي احنا عارفينها دلوقت موجودة. الاول بدأنا بالاعداد الصحيحة: &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mi&gt;.&lt;/mi&gt;&lt;mi&gt;.&lt;/mi&gt;&lt;mi&gt;.&lt;/mi&gt;&lt;/mrow&gt;1, 2, 3, 4, 5, ...&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;الاعداد دي كانت كفاية لحد مابدأنا نواجه مشاكل في حساب النسب. في الفترة دي الاعداد الكسرية, الـFractions, اتوجدوا عشان يحلوا بعض المشاكل اللي واجهناها.&lt;/p&gt;
&lt;p&gt;بعدها اكتشفنا ان مش كل الاعداد ممكن نكتبها ككسر, زي مثلاً &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;\sqrt{2}&lt;/math&gt;&lt;/span&gt;.الفترة دي كانت صعبة شوية, لأن كان في ثقافات بتعتبر الارقام الصحيحة مقدسة وان كل حاجة في الكون ممكن نكتبها كأعداد صحيحة و كسور.&lt;/p&gt;
&lt;h2&gt;تطور الارقام&lt;/h2&gt;
&lt;p&gt;في قصة قديمة بتحكي ان في الاغريق, كان في جماعة بيتبعوا مدرسة فلسفية ودينية اسمها الـ”فيتاغورية”. اكتشفوا حاجة صدمتهم: طول قطر اي مربع طول ضلعه 1 يساوي &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;\sqrt{2}&lt;/math&gt;&lt;/span&gt;. مينفعش يتكتب ككسر, عدد غير نسبي. اللي اكتشف دا كان اسمه “هيبياسي” والقصة بتقول ان اتباع الفيثاغورية قتلوة لما قالهم كدا (غالباً يعني غرقوه).&lt;/p&gt;
&lt;p&gt;وده النمط اللي هنشوفه على طول في الحكاية دي: كل ما نكتشف نوع جديد من الأرقام, الناس قاومت في الأول.&lt;/p&gt;
&lt;p&gt;بعد ذلك, الاختراع الجديد للاعداد بتاعتنا كانت الاعداد السالبة وصفر. الاعداد دي واجهت مقاومة برضو, لأنك لو جيت تفكر فيها بجد: يعني اية 5- من حاجة؟&lt;/p&gt;
&lt;p&gt;الناس كانت بتحاول على قد ماتقدر انها متكتبش سالب في اي حاجة. فانت لو عندك مثلاً &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;a + b - c = 0&lt;/math&gt;&lt;/span&gt; كنت بتكتبها كـ&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;a&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;b&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;/mrow&gt;a + b = c&lt;/math&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;انا عندي 5 تفاحات, مفيش حاجة في الكون سالب حاجة من حاجة.&lt;/p&gt;
&lt;p&gt;المهم, دا السيستم الجديد للأعداد بتاعتنا. الاعداد الموجبة والسالبة والغير نسبية وصفر.&lt;/p&gt;
&lt;h2&gt;المعادلة&lt;/h2&gt;
&lt;p&gt;فضلنا كدا فترة. والرياضيين, زي ما اتعودنا, فضلوا بيحلوا معادلات أعقد وأعقد. لحد ما واحد منهم وصل لمعادلة محدتش قدر يحلها بأي أرقام موجودة, وفضل واقف قدامها مش عارف يعمل إيه. المعادلة دي كانت:&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;f(x) = x^2 + 1&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;دلوقت عندنا مشكلة. الـRoots او الجذور هي القيم اللي لما تحطها في المعادلة, المعادلة بتساوي صفر. في واحد زمان اثبت دا:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;.Polynomials of degree &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;n&lt;/math&gt;&lt;/span&gt; have exactly &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;n&lt;/math&gt;&lt;/span&gt; roots&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;الاثبات دا مهم جداً لدرجة انه اتسمى النظرية الأساسية في الجبر The Fundamental Theorem of Algebra سموها كدا لأنها من أهم الحقائق اللي الجبر كله اتبنى عليها.&lt;/p&gt;
&lt;p&gt;الاثبات دا بيقول ان المعادلة دي لازم يبقى في رقمين بيخلوا المعادلة دي تساوي صفر. لا نقاش.&lt;/p&gt;
&lt;p&gt;بس لو بصيت على الـGraph مش هتلاقي أي نقطة بتساوي صفر. يعني الـRoots موجودين بس مش في الأرقام اللي احنا عارفينها. دي بالظبط المشكلة.&lt;/p&gt;
&lt;p&gt;لو جينا نبص عالـFunction, مش هنلاقي اي نقطة فيها تساوي صفر.&lt;/p&gt;
&lt;p&gt;شوف ازاي الـFunction دي مش بتلمس الـX axis خالص:&lt;/p&gt;

&lt;p&gt;لو جينا نحل:&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;/mrow&gt;x^2 + 1 = 0&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;x^2 = -1&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;±&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;x = \pm\sqrt{-1}&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;هنلاقي اعداد غريبة جداً.&lt;/p&gt;
&lt;h2&gt;الأعداد التخيلية&lt;/h2&gt;
&lt;p&gt;جزر سالب واحد؟ بل اسوء, سالب جزر سالب واحد؟ ماشي هو في حلين للمعادلة بس للأسف الحلين مش منطقيين. الارقام دي بدأت تظهر في الحلول الرياضية كتير جداً. في ناس اتعودت عليها, وناس افترضوا ان اول لما الارقام دي تطلعلهم ان مفيش حل للمعادلة اللي بيحلوها.&lt;/p&gt;
&lt;p&gt;الارقام دي سميناها اعداد تخيلية. من اسوء الاسامي اللي على الكوكب, لأن لو قولت لحد ان دا عدد تخيلي هيفترض انه “مش موجود” او انه زي Glitch كدا انت بتستعمله وخلاص عشان تحل معادلاتك. في ناس اقترحت ان احنا نسميها “ارقام جانبية” او “عليا” لأسباب هتظهر قريب.&lt;/p&gt;
&lt;p&gt;مادام الارقام دي عمالة تطلع في كل حتة, فيها اية لو ضيفناها للأرقام بتاعتنا؟ مش هتكون اول مرة نعدل السيستم بتاعنا. بس مينفعش نضيف اي حاجة كدا وخلاص. لو الارقام دي ينفع نستعملها فعلاً, يبقى الارقام دي لازم تخضع لقوانين الجبر اللي موجودة حالياً.&lt;/p&gt;
&lt;p&gt;في الارقام العادية ممكن نقسم الجزر كدا&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;/mrow&gt;\sqrt{2\times3} = \sqrt{2} \times \sqrt{3}&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;هل ينفع للاعداد التخيلية؟&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;25&lt;/mn&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;25&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;\sqrt{-25} = \sqrt{25}\times \sqrt{-1} = 5\sqrt{-1}&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;طب والجمع والطرح؟&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;2x + 3x = 5x&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;و للتخيلية؟&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;2\sqrt{-1} + 3\sqrt{-1} = 5\sqrt{-1}&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;الظاهر ان الاعداد الغريبة بتاعتنا دي شغالة تمام مع كل العمليات الرياضية اللي جربناها. لكن هنكتبها ازاي؟&lt;/p&gt;
&lt;p&gt;الناس اتفقوا على طريقة لكتابة الاعداد التخيلية. كل عدد تخيلي ممكن يتكتب كعدد حقيقي مضروب في &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;\sqrt{-1}&lt;/math&gt;&lt;/span&gt;. يبقى الرقم دا مميز جداً لدرجة ان احنا اديناله رمز: &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;i&lt;/math&gt;&lt;/span&gt;&lt;a href=&quot;#user-content-fn-1&quot;&gt;1&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;الـComplex Plane&lt;/h2&gt;
&lt;p&gt;دلوقت, احنا عايزين طريقة نضيف بيها الاعداد بتاعتنا للسيستم بحيث اننا نقدر نكتب Functions ونرسمها. هنضحى بالـY axis بتاعنا ونكتب الارقام التخيلية بتاعتنا عليه هكذا:&lt;/p&gt;
&lt;p&gt;ده الـCoordinate System الجديد بتاعنا, الأرقام الحقيقية على المحور الأفقي والتخيلية على الرأسي:&lt;/p&gt;

&lt;p&gt;لاحظ حاجة في السيستم بتاعنا دا.&lt;/p&gt;
&lt;p&gt;كمثال عندك &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;1&lt;/math&gt;&lt;/span&gt;. اية اللي هيحصل لو ضربت الرقم دا في &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;i&lt;/math&gt;&lt;/span&gt; او في &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt; \sqrt{-1}&lt;/math&gt;&lt;/span&gt;؟&lt;/p&gt;
&lt;p&gt;هيبقى &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;1 \times \sqrt{-1}&lt;/math&gt;&lt;/span&gt; يعني &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;\sqrt{-1}&lt;/math&gt;&lt;/span&gt; طب ولو ضربت &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;\sqrt{-1}&lt;/math&gt;&lt;/span&gt; في &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;\sqrt{-1}&lt;/math&gt;&lt;/span&gt;؟ هيبقى &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;\sqrt{-1}^2&lt;/math&gt;&lt;/span&gt; يعني -1. طب لو عملت كدا تاني؟ هيبقى -&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;\sqrt{-1}&lt;/math&gt;&lt;/span&gt; لو ضربت تاني هيرجع يبقى 1.&lt;/p&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;        &lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;       &lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;              &lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt; &lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;\begin{aligned}
1          &amp;amp;\times \sqrt{-1} &amp;amp;&amp;amp;\;\;\;\;= \sqrt{-1} \\
\sqrt{-1}  &amp;amp;\times \sqrt{-1} &amp;amp;&amp;amp;\:\;\;\;= -1 \\
-1         &amp;amp;\times \sqrt{-1} &amp;amp;&amp;amp;\;\;\;\;\;\;\;= -\sqrt{-1} \\
-\sqrt{-1} &amp;amp;\times \sqrt{-1} &amp;amp;&amp;amp;\,= 1
\end{aligned}&lt;/math&gt;&lt;/span&gt;
&lt;p&gt;يعني&lt;/p&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;       &lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;      &lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt; &lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;\begin{aligned}
1          &amp;amp;\times i &amp;amp;&amp;amp;= i \\
i  &amp;amp;\times i &amp;amp;&amp;amp;\:\;\;\;= -1 \\
-1         &amp;amp;\times i &amp;amp;&amp;amp;\;\;\;= -i \\
-i &amp;amp;\times i &amp;amp;&amp;amp;\,= 1
\end{aligned}&lt;/math&gt;&lt;/span&gt;&lt;p&gt;او&lt;/p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;    &lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;    &lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;    &lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;\begin{aligned}
    i^1 =&amp;amp;\;\; i\\
    i^2 =&amp;amp; -1\\
    i^3 =&amp;amp; -i\\
    i^4 =&amp;amp;\;\;1\\
    i^5 =&amp;amp;\;\;i\\
\end{aligned}&lt;/math&gt;&lt;/span&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;.&lt;/mi&gt;&lt;mi&gt;.&lt;/mi&gt;&lt;mi&gt;.&lt;/mi&gt;&lt;/mrow&gt;...&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;والنمط دا بيتكرر للأبد.&lt;/p&gt;
&lt;p&gt;شوف ازاي الضرب في &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;i&lt;/math&gt;&lt;/span&gt; بيلف الأرقام في دايرة كاملة:&lt;/p&gt;

&lt;h2&gt;الأعداد المركبة&lt;/h2&gt;
&lt;p&gt;دلوقت عندنا نوعين من الأرقام: حقيقية الرمز بتاع مجموعتها &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;/mrow&gt;\Reals&lt;/math&gt;&lt;/span&gt; وتخيلية الرمز بتاع مجموعتها &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;ℑ&lt;/mi&gt;&lt;/mrow&gt;\Im&lt;/math&gt;&lt;/span&gt;. مجموعة الارقام التخيلية شكلها اجمد بكتير انا عارف. ولما بنجمعهم مع بعض بنعمل نوع تالت اسمه الأعداد المركبة &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/mrow&gt;\mathbb{C}&lt;/math&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;شوفنا طريقة نقدر نجمع بيها المجموعتين دول بحيث ان احنا نحط الأرقام الحقيقية على الـX axis والأرقام التخيلية على الـY axis. ولكن, ازاي ممكن نحط نقطة على الـGraph بتاعنا دا؟&lt;/p&gt;
&lt;p&gt;الـNotation اللي كله بيستخدمه هي انك تجمع الرقمين. دا بيسهل الجبر للأرقام دي كتير.&lt;/p&gt;
&lt;p&gt;مثلاً. لو احنا عايزين نقطة على &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;,&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;(2,3)&lt;/math&gt;&lt;/span&gt; هنكتبها &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;2 + 3i&lt;/math&gt;&lt;/span&gt;. المزج بين رقم حقيقي ورقم تخيلي كدا بيديك عدد &lt;strong&gt;مركب&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;مثلاً, النقطة &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;2 + 3i&lt;/math&gt;&lt;/span&gt; بتتحط على الـGraph كده:&lt;/p&gt;

&lt;h2&gt;العمليات على الأعداد المركبة&lt;/h2&gt;
&lt;p&gt;دلوقت بعد ما عرفنا الأعداد المركبة, خلينا نشوف ازاي بنتعامل معاها. مش هنتكلم عن الأرقام الحقيقية لوحدها, ولا التخيلية لوحدها. هنتكلم عن المركبة كاملة, يعني الاتنين مع بعض.&lt;/p&gt;
&lt;p&gt;القاعدة الأساسية بسيطة: &lt;strong&gt;الحقيقي مع الحقيقي, والتخيلي مع التخيلي.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;الجمع&lt;/h3&gt;
&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;(2 + 3i) + (1 + 2i)&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;= (2 + 1) + (3i + 2i)&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;= 3 + 5i&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;بالظبط زي ما بتجمع أي حاجتين من نفس النوع. الأرقام الحقيقية مع بعض, والتخيلية مع بعض.&lt;/p&gt;

&lt;h3&gt;الطرح&lt;/h3&gt;
&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;(5 + 4i) - (3 + 2i)&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;= (5 - 3) + (4i - 2i)&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;= 2 + 2i&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;نفس الفكرة بالظبط.&lt;/p&gt;

&lt;h3&gt;الضرب&lt;/h3&gt;
&lt;p&gt;الضرب بقى أكتر إثارة شوية. هنضرب زي ما بنضرب أي حدين جبريين بس لازم نفتكر إن &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;i^2 = -1&lt;/math&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;(2 + 3i)(1 + 2i)&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;= 2 + 4i + 3i + 6i^2&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;7&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;= 2 + 7i + 6(-1)&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;7&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;/mrow&gt;= 2 + 7i - 6&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;7&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;= -4 + 7i&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;لاحظ إن &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;6i^2&lt;/math&gt;&lt;/span&gt; اتحولت لـ &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;/mrow&gt;-6&lt;/math&gt;&lt;/span&gt; يعني عدد حقيقي عادي. ده مش خطأ, ده بالظبط اللي المفروض يحصل. الأعداد التخيلية والحقيقية بتتداخل مع بعض في الضرب بطريقة منضبطة تماماً.&lt;/p&gt;

&lt;h2&gt;الفيل في الغرفة&lt;/h2&gt;
&lt;p&gt;احنا فهمنا دلوقت العمليات البسيطة على الـComplex Numbers. سؤال بقا: هي فين الـRoots اللي كنا بنتكلم عنها &lt;a href=&quot;#eq&quot;&gt;هنا&lt;/a&gt;؟ لو المعادلة بتاعتنا لازم تساوي صفر عند نقطتين, فين النقطتين دول؟&lt;/p&gt;
&lt;p&gt;بص على الـEquation بتاعتنا:&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;f(x) = x^2 + 1&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;في كام Variable في الـEquation بتاعتنا دي؟ عندنا واحد &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;x&lt;/math&gt;&lt;/span&gt; اللي هو الـInput بتاعنا, وعندنا &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;f(x)&lt;/math&gt;&lt;/span&gt; اللي هو الـOutput بتاعنا. لو &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;x&lt;/math&gt;&lt;/span&gt; يساوي 2 مثلاً, يبقى &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;f(x)&lt;/math&gt;&lt;/span&gt; هيساوي &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;2^2 + 1&lt;/math&gt;&lt;/span&gt; يعني &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;/mrow&gt;5&lt;/math&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;احنا لو دخلنا الـImaginary Numbers بتاعتنا, يبقى احنا كدا عندنا Variable زيادة. يبقى عدد الـVariables اللي عندنا بقا 3. اتنين منهم Input وواحد بس Output.&lt;/p&gt;
&lt;p&gt;الـFunction بتاعتنا دلوقت هيبقى اسمها Complex Function, لأنها بتاخد عدد Complex مش Real.&lt;/p&gt;
&lt;p&gt;عشان نفهم الفكرة, هناخد Function ابسط شوية كمثال:&lt;/p&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;/mrow&gt;f(x + iy) = x + 5&lt;/math&gt;&lt;/span&gt;
&lt;p&gt;لاحظ ان الجزء الـImaginary بتاعنا دلوقت هو الـ&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;/mrow&gt;y&lt;/math&gt;&lt;/span&gt; مش الـ&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;x&lt;/math&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;كدا احنا لو عايزين نرسم الـFunction دي هنرسمها ازاي؟ الأول هنعمل Plug-in لشوية ارقام.&lt;/p&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;7&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;8&lt;/mn&gt;&lt;/mrow&gt;\begin{aligned}
f(\textcolor{#4488ff}{0} + \textcolor{#ff4444}{0i}) &amp;amp;= \textcolor{#4488ff}{0} + 5 = \textcolor{#44cc88}{5} \\
f(\textcolor{#4488ff}{1} + \textcolor{#ff4444}{1i}) &amp;amp;= \textcolor{#4488ff}{1} + 5 = \textcolor{#44cc88}{6}  \\
f(\textcolor{#4488ff}{2} + \textcolor{#ff4444}{2i}) &amp;amp;= \textcolor{#4488ff}{2} + 5 = \textcolor{#44cc88}{7}   \\
f(\textcolor{#4488ff}{3} + \textcolor{#ff4444}{3i}) &amp;amp;= \textcolor{#4488ff}{3} + 5 = \textcolor{#44cc88}{8}
\end{aligned}&lt;/math&gt;&lt;/span&gt;
&lt;p&gt;فانت زي مانت شايف, احنا عندنا 3 ارقام بتتغير, 3 Variables. لو عايزين نرسم الـFunction بتاعتنا دي, هنحتاج نرسمها كرسمة 3D, وشكلها هيبقى كدا:&lt;/p&gt;
x&lt;span class=&quot;slice-label3 x-label3&quot;&gt;x&lt;/span&gt;y&lt;span class=&quot;slice-label3 y-label3&quot;&gt;y&lt;/span&gt;
&lt;p&gt;لاحظ ان الـOutput بتاعنا في الـFunction دي يعتمد بس على الجزء الحقيقي اللي هو الـ&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;x&lt;/math&gt;&lt;/span&gt;, مهما غيرت في &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;/mrow&gt;y&lt;/math&gt;&lt;/span&gt; الـOutput مش هيتغير, لأن طبيعة الـOutput بتاع الـFunction دي انها تعتمد على الجزء الحقيقي فقط, رغم انها بتاخد الجزء التخيلي كـInput.&lt;/p&gt;
&lt;p&gt;نرجع للـFunction الأصلية بتاعتنا, اللي اتفقنا انها هتبقى &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;f(x + iy) = (x + iy)^2 + 1&lt;/math&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;هنيجي نعمل Plug-in بنفس الشكل اللي عملناه فالـFunction القديمة, بس المرادي بأرقام Random شوية.&lt;/p&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;7&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;12&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;5&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;40&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;\begin{alignedat}{2}
f(\textcolor{#4488ff}{2} + \textcolor{#ff4444}{1i}) &amp;amp;= (\textcolor{#4488ff}{2} + \textcolor{#ff4444}{1i})^2 + 1 &amp;amp;&amp;amp;= (\textcolor{#44cc88}{4} + \textcolor{#ffcc00}{4i}) \\
f(\textcolor{#4488ff}{1} + \textcolor{#ff4444}{3i}) &amp;amp;= (\textcolor{#4488ff}{1} + \textcolor{#ff4444}{3i})^2 + 1 &amp;amp;&amp;amp;= (\textcolor{#44cc88}{-7} + \textcolor{#ffcc00}{6i}) \\
f(\textcolor{#4488ff}{3} + \textcolor{#ff4444}{2i}) &amp;amp;= (\textcolor{#4488ff}{3} + \textcolor{#ff4444}{2i})^2 + 1 &amp;amp;&amp;amp;= (\textcolor{#44cc88}{6} + \textcolor{#ffcc00}{12i}) \\
f(\textcolor{#4488ff}{5} + \textcolor{#ff4444}{4i}) &amp;amp;= (\textcolor{#4488ff}{5} + \textcolor{#ff4444}{4i})^2 + 1 &amp;amp;&amp;amp;= (\textcolor{#44cc88}{10} + \textcolor{#ffcc00}{40i})
\end{alignedat}&lt;/math&gt;&lt;/span&gt;
&lt;p&gt;دلوقت احنا عندنا مشكلة. الـOutput بتاعنا عبارة عن رقمين, والـInput عبارة عن رقمين برضو. يبقى دول يعتبروا كدا 4 Variables. يعني محتاجين 4 ابعاد عشان نرسم الـEquation دي. بما أننا عايشين في عالم ثلاثي الابعاد, فاحنا مش هنعرف نرسم الـOutput بتاعنا دا في رسمه واحدة.&lt;/p&gt;
&lt;p&gt;الحل عندنا اننا “نمذج” الـOutput بتاعنا دا جوا رقم واحد بيمثل المسافة من الـOrigin.&lt;/p&gt;
&lt;p&gt;يعني بدل مالـEquation بالـOutput بتاعها تبقى كدا:&lt;/p&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;7&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;\begin{alignedat}{2}
f(\textcolor{#4488ff}{1} + \textcolor{#ff4444}{3i}) &amp;amp;= (\textcolor{#4488ff}{1} + \textcolor{#ff4444}{3i})^2 + 1 &amp;amp;&amp;amp;= (\textcolor{#44cc88}{-7} + \textcolor{#ffcc00}{6i}) \\
\end{alignedat}&lt;/math&gt;&lt;/span&gt;
&lt;p&gt;هتبقى كدا:&lt;/p&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;3&lt;/mn&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;7&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;6&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mrow&gt;&lt;mrow&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;85&lt;/mn&gt;&lt;/mrow&gt;\begin{aligned}
f(\textcolor{#4488ff}{1} + \textcolor{#ff4444}{3i})
&amp;amp;= (\textcolor{#4488ff}{1} + \textcolor{#ff4444}{3i})^2 + 1 \\
&amp;amp;= \sqrt{\textcolor{#44cc88}{-7}^2 + \textcolor{#ffcc00}{6}^2} \\
&amp;amp;= \textcolor{#44cc88}{\sqrt{85}}
\end{aligned}&lt;/math&gt;&lt;/span&gt;
&lt;p&gt;وبكدا, الـOutput بتاعنا فيه رقم واحد بس, ويبقى عندنا 3 Variables نقدر نرسمهم.&lt;/p&gt;
&lt;p&gt;تعديل بسيط بس, احنا عندنا Standard ان بدل مالـFunction تتكتب كدا:&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;f(x + iy) = (x + iy)^2 + 1&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;هنعرف &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;z&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;/mrow&gt; z = x + iy&lt;/math&gt;&lt;/span&gt; ونكتبها كدا:&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;z&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;z&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;f(z) = z^2 + 1&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;وبما ان الـOutput بتاع الـFunction هو الطول, هنحط الـSymbol بتاع الـMagnitude:&lt;/p&gt;
&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;∣&lt;/mi&gt;&lt;mi&gt;f&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;z&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mi&gt;∣&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mi&gt;∣&lt;/mi&gt;&lt;mi&gt;z&lt;/mi&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;∣&lt;/mi&gt;&lt;/mrow&gt;|f(z)| = |z^2 + 1|&lt;/math&gt;&lt;/span&gt;
&lt;p&gt;دا التحويل الكامل للـFunction بتاعتنا.&lt;/p&gt;
&lt;p&gt;لاحظ دلوقتي ان الـImaginary axis بتاعنا هو الـ&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;/mrow&gt;y&lt;/math&gt;&lt;/span&gt; مش الـ&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;x&lt;/math&gt;&lt;/span&gt; زي فالمعادلة الأصلية.&lt;/p&gt;
&lt;p&gt;لاحظ برضو ان الـEquation بتاعتنا كلها بتساوي صفر لما الجزء الحقيقي بتاعنا اللي هو &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;x&lt;/mi&gt;&lt;/mrow&gt;x&lt;/math&gt;&lt;/span&gt; يساوي صفر, والـImaginary اللي هو &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;y&lt;/mi&gt;&lt;/mrow&gt;y&lt;/math&gt;&lt;/span&gt; يساوي &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;i&lt;/math&gt;&lt;/span&gt; او &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;-i&lt;/math&gt;&lt;/span&gt;, يعني عند النقطة &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;0 + i&lt;/math&gt;&lt;/span&gt; و &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;0&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;0 -i&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
x&lt;span class=&quot;slice-label x-label&quot;&gt;x&lt;/span&gt;y&lt;span class=&quot;slice-label y-label&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;root-hint&quot;&gt;● Roots&lt;/span&gt;
&lt;h2 class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;ساعات هتلاقي اسمه &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;j&lt;/mi&gt;&lt;/mrow&gt;j&lt;/math&gt;&lt;/span&gt; بالذات في النطاقات الهندسية, لأن &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;i&lt;/mi&gt;&lt;/mrow&gt;i&lt;/math&gt;&lt;/span&gt; محفوظة للـCurrent. &lt;a href=&quot;#user-content-fnref-1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>ڤيكتور فيلدس</title><link>https://shenawy29.github.io/ar/2026-03-13/vectors</link><guid isPermaLink="true">https://shenawy29.github.io/ar/2026-03-13/vectors</guid><pubDate>Fri, 13 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;من اكتر الحاجات الجميلة في الـMathematics عامتاً والـVector Calculus خاصتاً هي الـVector Fields. الـVector Fields بتمثل حاجات كتيرة. الجاذبية, مجال كهرومغناطيسي, Neural Network.&lt;/p&gt;
&lt;p&gt;العب شوية بالـTool اللي تحت جرب ارقام وشوف هيطلعلك اية. في Presets ممكن تختارها لو عايز الهام.&lt;/p&gt;
fieldstreamRun&lt;span class=&quot;mr-1 font-mono text-xs text-[#727169]&quot;&gt;presets&lt;/span&gt;rotationsinksaddlesourcespiral outsine wavesgravitytwo vortices</content:encoded></item><item><title>أويلر</title><link>https://shenawy29.github.io/ar/2026-03-06/euler</link><guid isPermaLink="true">https://shenawy29.github.io/ar/2026-03-06/euler</guid><pubDate>Fri, 06 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;تخيل انك معاك جنية, وقولتلك هاتلي الجنية دا وهديلك بعد سنة &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;mi&gt;%&lt;/mi&gt;&lt;/mrow&gt;100\%&lt;/math&gt;&lt;/span&gt; من القيمة اللي انت حطيتها. يعني بعد سنة هتاخد جنية كمان.&lt;/p&gt;
&lt;p&gt;ييبقى انت كدا بعد سنة هيبقى معاك &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;/mrow&gt;1 + 1&lt;/math&gt;&lt;/span&gt; جنية. دلوقت, لو انا قولتلك مش هديلك الـ&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;100&lt;/mn&gt;&lt;mi&gt;%&lt;/mi&gt;&lt;/mrow&gt;100\%&lt;/math&gt;&lt;/span&gt; على طول, هحسبلك &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;50&lt;/mn&gt;&lt;mi&gt;%&lt;/mi&gt;&lt;/mrow&gt;50\%&lt;/math&gt;&lt;/span&gt; بعد 6 شهور, و&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;50&lt;/mn&gt;&lt;mi&gt;%&lt;/mi&gt;&lt;/mrow&gt;50\%&lt;/math&gt;&lt;/span&gt; كمان بعد 6 شهور. كدا هيبقى معاك كام بعد سنة؟&lt;/p&gt;
&lt;p&gt;بعد 6 شهور هيبقى معاك&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.5&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;1.5&lt;/mn&gt;&lt;/mrow&gt;1 \times 1.5 = 1.5&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;والـ6 شهور اللي بعدهم هيبقى&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1.5&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.5&lt;/mn&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;2.25&lt;/mn&gt;&lt;/mrow&gt;1.5 \times 1.5 = 2.25&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;طيب, لو قولتلك 3 شهور؟ يعني هتاخد &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;25&lt;/mn&gt;&lt;mi&gt;%&lt;/mi&gt;&lt;/mrow&gt;25\%&lt;/math&gt;&lt;/span&gt; كل 3 شهور لحد ماتكمل سنة, هيبقى كام؟&lt;/p&gt;
&lt;p&gt;بعد 3 شهور هيبقى &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;/mrow&gt;1 \times 1.25&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;بعد 6 شهور هيبقى &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;/mrow&gt;1\times 1.25 \times 1.25&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;بعد 9 شهور هيبقى &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;/mrow&gt;1 \times 1.25 \times 1.25 \times 1.25 &lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;بعد 12 شهر هيبقى &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;/mrow&gt;1\times 1.25 \times 1.25 \times 1.25 \times 1.25&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;هنلاقي نمط. فالأخر العدد هيساوي &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;1.25^4&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;نقدر نخلي &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;/mrow&gt;1.25&lt;/math&gt;&lt;/span&gt; عبارة عن &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1.25&lt;/mn&gt;&lt;/mrow&gt;1 + 1.25&lt;/math&gt;&lt;/span&gt; يعني &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mn&gt;4&lt;/mn&gt;&lt;/mrow&gt;(1 + \frac{1}{4})^4&lt;/math&gt;&lt;/span&gt;, وهيساوي &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;2.44140625&lt;/mn&gt;&lt;/mrow&gt;2.44140625&lt;/math&gt;&lt;/span&gt;. لاحظ ان المبلغ بتاعنا بيكبر كل لما نحسب الفايدة بتاعتنا في اوقات اكتر.&lt;/p&gt;
&lt;p&gt;افرض قولتلك احنا عايزين نعمل نفس الحاجة دي كل شهر, او كل اسبوع, او كل يوم, لحد مانوصل لكل ثانية وفيمتوثانية, عشان نجيب اكبر سعر ممكن؟&lt;/p&gt;
&lt;p&gt;النمط بتاعنا هيبقى &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;/mrow&gt;(1 + \frac{1}{n})^n&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;لو فضلنا نعمل كدا للأبد وحطينا رقم كبير جداً, &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mo&gt;+&lt;/mo&gt;&lt;mn&gt;1&lt;/mn&gt;&lt;mn&gt;100000&lt;/mn&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;mn&gt;100000&lt;/mn&gt;&lt;/mrow&gt;(1 + \frac{1}{100000})^{100000}&lt;/math&gt;&lt;/span&gt; مثلاً. هنلاحظ ان العدد بتاعنا بيقرب لعدد معين. &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mn&gt;2.71828&lt;/mn&gt;&lt;/mrow&gt;2.71828&lt;/math&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;يتضح ان العدد دا مهم جداً لدرجة ان احنا اديناله رمز معين: &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;/mrow&gt;e&lt;/math&gt;&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;من الحاجات المثيرة للأهتمام في العدد دا انه ملوش نهاية. كأثبات لذلك, احب اقدملك عدد اويلر اللانهائي.&lt;/p&gt;
&lt;h1&gt;&lt;p&gt;&lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;e&lt;/mi&gt;&lt;/mrow&gt;e&lt;/math&gt;&lt;/span&gt;&lt;/p&gt;&lt;/h1&gt;
&lt;p&gt;&lt;/p&gt;</content:encoded></item><item><title>طرمبة الـMemory بتسرب</title><link>https://shenawy29.github.io/ar/2025-08-10/raii</link><guid isPermaLink="true">https://shenawy29.github.io/ar/2025-08-10/raii</guid><pubDate>Sun, 10 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;عشان معظم اللغات اللي بنستعملها فيها نوع من الـGarbage Collection, قليل اوي اللي بتلاقيه بيفكر فالـMemory بطريقة عملية. فيها اية يعني لو عملت &lt;code&gt;new Foo()&lt;/code&gt;؟&lt;/p&gt;
&lt;p&gt;عندك حق. لو بتستعمل لغة زي Java او Go, غالباً مش هتفكر فالموضوع كتير. بس, لو بتستعمل ++ C, الموضوع يختلف. اي Heap Allocation بتعملها ب&lt;code&gt;new&lt;/code&gt; &lt;strong&gt;&lt;em&gt;لازم&lt;/em&gt;&lt;/strong&gt; تعملها Free ب&lt;code&gt;delete&lt;/code&gt;. الموضوع بسيط, صح؟ لما اخلص حاجة, همسحها!&lt;/p&gt;
&lt;p&gt;بالرغم من ان الموضوع بسيط سطحياً, البني ادمين بطبيعتهم خطائين. وبسبب دا, مايكروسوفت بتقول ان &lt;a href=&quot;https://www.zdnet.com/article/microsoft-70-percent-of-all-security-bugs-are-memory-safety-issues/&quot;&gt;%70 من الـSecurity Bugs في منتجاتها بسبب Bugs ليها علاقة بالـMemory&lt;/a&gt;. اغلبية الـBugs دي بسبب Use After Free, يعني انك تستعمل &lt;code&gt;vector&lt;/code&gt; معموله Allocation بـ&lt;code&gt;new&lt;/code&gt; مثلاً بعد ماتعمله &lt;code&gt;delete&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;دا فحد ذاته بيثبت ان فكرة ال&lt;code&gt;new&lt;/code&gt; و &lt;code&gt;delete&lt;/code&gt; مش احسن حاجة, لأن حتى لما بتفتكر تعمل &lt;code&gt;delete&lt;/code&gt;, ممكن تنسى وتستعمل الحاجة اللي انت عملتلها &lt;code&gt;delete&lt;/code&gt; تاني بالغلط!&lt;/p&gt;
&lt;p&gt;اللغات اللي فيها Garbage Collection مفيهاش مشاكل من النوع دا, بس انت بتدفع تمن تاني: الـGarbage Collection ذات نفسها.&lt;/p&gt;
&lt;p&gt;ايوة غالباً مش هيبقى عندك Memory Bugs, بس الـGarbage Collection نفسها مش مجانية. الـRuntime بتاعت اللغة بتاخد وقت انها تشوف الحاجات اللي مش مستخدمة وتعملها Free!&lt;/p&gt;
&lt;p&gt;ديسكورد حل المشكلة بتاعت الـGarbage Collection في الـServices بتاعتهم اللي &lt;a href=&quot;https://discord.com/blog/why-discord-is-switching-from-go-to-rust&quot;&gt;بتستعمل Go بأنهم يعدلوا الـSettings بتاعت الـGarbage Collector نفسه&lt;/a&gt;, بس مثبتوش على قرارهم وقرروا يستعملوا لغة تانية لأن الحل مكنش احسن حاجة.&lt;/p&gt;
&lt;p&gt;كدا احنا عندنا مشكلة. عايزين لغة سريعة كفاية بأنها تأدي احتياجاتنا, وفنفس الوقت يبقى صعب اننا نعمل Vulnerabilities بالغلط بسبب طريقتنا في استعمال الـMemory.&lt;/p&gt;
&lt;h2&gt;RAII - Resource acquisition Is Initialization&lt;/h2&gt;
&lt;p&gt;راي - Resource Acquisition Is Initialization. ممكن اسوء اسم فالعالم, بس بيشرح نفسه.&lt;/p&gt;
&lt;p&gt;عشان نفهم اية هي راي, ونستعملها ازاي, محتاجين نتكلم بطريقة تجريدية شوية.&lt;/p&gt;
&lt;p&gt;لو فكرنا فاللي احنا بنعمله في معظم اللغات الـObject Oriented, احنا بنعمل Variables و نعمل شوية حاجات على الـVariables دي. Functions, Methods مهما كان. بس الفكرة ان احنا &lt;strong&gt;&lt;em&gt;منقدرش نستعمل حاجة الا لما نديلها اسم&lt;/em&gt;&lt;/strong&gt;. الـ&lt;code&gt;vector&lt;/code&gt; اللي احنا بنعمله ممكن يبقى اسمه &lt;code&gt;v&lt;/code&gt; مثلاً. هستعمل حاجة ازاي لو هي ملهاش وجود فالبرنامج نفسه؟&lt;/p&gt;
&lt;p&gt;راي يعتبر مبني على الفكرة دي. اي “اسم” فالبرنامج هو المسؤول عن انه يحرر الـMemory اللي بيستعملها.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;vector&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;gt;*&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;vector&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;فالكود دا, &lt;code&gt;x&lt;/code&gt; هو الاسم, وهو مسؤول انه يحرر الـMemory بتاعت الـ&lt;code&gt;vector&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;طب ودا؟&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; y &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 42&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;هنا في فرق.
الفرق هنا ان &lt;code&gt;x&lt;/code&gt; مسؤول انه يحرر حاجة محطوطة في الـHeap. اي حاجة Dynamically allocated بـ&lt;code&gt;new&lt;/code&gt; &lt;strong&gt;&lt;em&gt;لازم&lt;/em&gt;&lt;/strong&gt; تبقى في مكان الـMemory بتاعته تقدر تفضل بعد الـScope بتاعها.&lt;/p&gt;
&lt;p&gt;فا هنا مثلاً:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt; &amp;lt;vector&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; foo&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;vector&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;gt;*&lt;/span&gt;&lt;span&gt; x &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;vector&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;الـMemory بتاعت الـVector مش هتتحرر بعد مالـFunction Call تخلص, لأنك بتستعمل &lt;code&gt;new&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;بس هنا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;void&lt;/span&gt;&lt;span&gt; foo&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    int&lt;/span&gt;&lt;span&gt; y &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 42&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;24 دا موجود على الـStack. مش Dynamically Allocated, مستعملناش &lt;code&gt;new&lt;/code&gt;, فالـMemory بتاعته هتتحرر لما الـFunction Call تخلص.&lt;/p&gt;
&lt;p&gt;راي بتستعمل الفكرة دي للحاجات الـHeap Allocated.&lt;/p&gt;
&lt;p&gt;اول لما اسم الـScope بتاعه يخلص, يعني مثلاً الـFunction Call اللي هو فيها تخلص, هو من مسؤوليته انه يحرر الـMemory بتاعت الـResource اللي هو ماسكه.&lt;/p&gt;
&lt;p&gt;تمام زي الفل, نستعمل راي ازاي في++ C؟ الـStandard Library بتتيحلنا الامكانية دي في &lt;code&gt;&amp;lt;memory&amp;gt;&lt;/code&gt;. الـType الاساسي اللي ممكن تستعمله هو &lt;code&gt;unique_ptr&lt;/code&gt;. اسمه ممكن يكون مريب شوية زي RAII, بس هو فعلاً شارح هو بيعمل اية. هو Pointer ايوة, بس Unique…مميز. في حيث انه هو &lt;strong&gt;&lt;em&gt;الشخص الوحيد المسؤول انه يحرر الـResource بتاعه&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;كمثال:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt; &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt; &amp;lt;vector&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;include&lt;/span&gt;&lt;span&gt; &amp;lt;memory&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;unique_ptr&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;vector&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt; vec &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;make_unique&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;vector&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;(&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    // الميموري بتخلص هنا.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ملاحظ ان مفيش ولا كلمة &lt;code&gt;new&lt;/code&gt; فالكود؟ ولكن فعلاً الـ&lt;code&gt;vector&lt;/code&gt;دا Dynamically Allocated.&lt;/p&gt;
&lt;p&gt;عايز دليل؟ بص عالـAssembly.&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave has-focused&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;main&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        push&lt;/span&gt;&lt;span&gt;    rbp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        mov&lt;/span&gt;&lt;span&gt;     rbp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;rsp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        push&lt;/span&gt;&lt;span&gt;    rbx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        sub&lt;/span&gt;&lt;span&gt;     rsp&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;24&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        mov&lt;/span&gt;&lt;span&gt;     DWORD&lt;/span&gt;&lt;span&gt; PTR [&lt;/span&gt;&lt;span&gt;rbp&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;], &lt;/span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        lea&lt;/span&gt;&lt;span&gt;     rax&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;rbp&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;32&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        lea&lt;/span&gt;&lt;span&gt;     rdx&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;rbp&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        mov&lt;/span&gt;&lt;span&gt;     rsi&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;rdx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        mov&lt;/span&gt;&lt;span&gt;     rdi&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;rax&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line focused&quot;&gt;&lt;span&gt;        call&lt;/span&gt;&lt;span&gt;    std&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;__detail&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;:_MakeUniq&amp;lt;&lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::vector&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::allocator&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;::__single_object &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::make_unique&amp;lt;&lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::vector&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::allocator&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;, &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;) &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        mov&lt;/span&gt;&lt;span&gt;     ebx&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        lea&lt;/span&gt;&lt;span&gt;     rax&lt;/span&gt;&lt;span&gt;, [&lt;/span&gt;&lt;span&gt;rbp&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;32&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        mov&lt;/span&gt;&lt;span&gt;     rdi&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;rax&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line focused&quot;&gt;&lt;span&gt;        call&lt;/span&gt;&lt;span&gt;    std&lt;/span&gt;&lt;span&gt;::unique_ptr&amp;lt;&lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::vector&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::allocator&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;, &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::default_delete&amp;lt;&lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::vector&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::allocator&amp;lt;&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;::~unique_ptr() [complete object destructor] &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        mov&lt;/span&gt;&lt;span&gt;     eax&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ebx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        mov&lt;/span&gt;&lt;span&gt;     rbx&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;QWORD&lt;/span&gt;&lt;span&gt; PTR [&lt;/span&gt;&lt;span&gt;rbp&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        leave&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        ret&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;LC0&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        .string &quot;cannot create &lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span&gt;::vector larger than max_size()&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;هتلاحظ ان السطر التاني بيستعمل حاجة اسمها &lt;code&gt;std::default_delete&lt;/code&gt;. لو بصينا على الـ&lt;a href=&quot;https://en.cppreference.com/w/cpp/memory/default_delete.html&quot;&gt;Documentation&lt;/a&gt; هنلاقيها بتقول دا:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The non-specialized default_delete uses delete to deallocate memory for a single object&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;معنى ان الـType دا بيستعمل &lt;code&gt;delete&lt;/code&gt; ان الـResource دا Dynamically Allocated!&lt;/p&gt;
&lt;p&gt;هنا كنا بنستعمل راي في اننا نستعمل Dynamic Memory على الـHeap. بس, راي ممكن تستعملها بطريقة عامة اكتر. ملف مثلاً استعملته وعايز تقفله لما متكونش محتاجة.&lt;/p&gt;
&lt;h2&gt;الناهية&lt;/h2&gt;
&lt;p&gt;الهدف من البوست دا انه يظهر فكرة RAII اكتر, بس في حاجات كتير متكلمتش عنها. افرض انا عايز كذا حد يملك Resource واحد و محتاج الـResource دا استعمله في اماكن كتير؟&lt;/p&gt;
&lt;p&gt;في الحالة دي هتستعمل &lt;a href=&quot;https://en.cppreference.com/w/cpp/memory/shared_ptr.html&quot;&gt;&lt;code&gt;shared_ptr&lt;/code&gt;&lt;/a&gt;. الـType دا بيستعمل Technique اسمه &lt;a href=&quot;https://en.wikipedia.org/wiki/Reference_counting&quot;&gt;Reference Counting&lt;/a&gt;. الـTechnique دا بطيء نسبياً, فاخد بالك!&lt;/p&gt;
&lt;p&gt;Fun Fact: كل Object انت بتعملها في Python هتلاقيها By default بتستعمل Reference Counting عشان تحدد الـMemory بتاعت الـObject دي تتحرر امتى!&lt;/p&gt;</content:encoded></item><item><title>هيللو وورلد!</title><link>https://shenawy29.github.io/ar/2025-08-09/astro</link><guid isPermaLink="true">https://shenawy29.github.io/ar/2025-08-09/astro</guid><pubDate>Sat, 09 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;إن كانت المطرقة هي كل ما بيدك, فسترى كل الأشياء مسامير&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;دا غالباً هيبقى اول بوست فالبلوج دي.&lt;/p&gt;
&lt;p&gt;معظم الناس لو طلبت منهم يعملوا موقع بسيط, هيقربوا ببطء لReact&lt;a href=&quot;#user-content-fn-1&quot;&gt;1&lt;/a&gt; , Angular, Vue, او الخمسوميت فريم وورك اللي موجودين حالياً.&lt;/p&gt;
&lt;p&gt;بصراحة, اول لما جيت افكر اعمل البلوج دي اتجهت للحاجة اللي انا اعرفها, React. بس, بعدها بدأت افكر شوية وافتكرت اني كنت قريت عن استرو وانه يعتبر مخصص للStatic Sites, حاجات مش محتاجة Interactivity كتير.&lt;/p&gt;
&lt;p&gt;قبل مابدأ, انا كنت محتاج حاجات معينة:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;محتاج ان الموقع يكون سريع. انا حرفياً مش بعمل حاجة مذهلة لأنه يكون بطيء, هو كل اللي بتشوفه HTML و CSS مش اكتر.&lt;/li&gt;
&lt;li&gt;محتاج ان كتابة البوستس تكون سهلة. لو كتابة البوستس صعبة, مش هيبقى عندي شغف اني اكتب.&lt;/li&gt;
&lt;li&gt;محتاج اني اعملة بسرعة. مش عايز ابدأ من الصفر, ولكن عايز انجز يعني!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;انا مش هشرح استرو نفسه, لو عايز تتعلم اكتر عنه ال&lt;a href=&quot;https://docs.astro.build/en/getting-started/&quot;&gt;documentation&lt;/a&gt; هتشرح احسن مني بكتير. بس, انا هشرح ازاي استرو حل المشاكل اللي اتكلمت عليها فوق.&lt;/p&gt;
&lt;h2&gt;سريع&lt;/h2&gt;
&lt;p&gt;لو بتعمل Static Site, فانت غالباً مش محتاج JavaScript. او بمعنى اصح, الـClient مش محتاج JavaScript.&lt;/p&gt;
&lt;p&gt;استرو سريع عشان هو By default مش بيبعت اي JavaScript للClient. ولكن, استرو بيشتغل كCompiler. بتكتب كل كل ما تريد في ملفات &lt;code&gt;.astro&lt;/code&gt;, وفالاخر دا بيتحول لملف HTML صغير يتبعت للـClient.&lt;/p&gt;
&lt;p&gt;كمثال, بص عالكود دا, دا الكود اللي بيجيب كل البوستس في صفحة &lt;a href=&quot;/tags&quot;&gt;&lt;code&gt;tags/&lt;/code&gt;&lt;/a&gt;. هي فاضية دلوقت, بس هتتملي (اتمنى).&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;BaseLayout&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &quot;$lib/layouts/base_layout.astro&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; getCollection&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &quot;astro:content&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; pages &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; getCollection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;posts&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; tagMap &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; Map&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; page &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; pages&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; tag &lt;/span&gt;&lt;span&gt;of&lt;/span&gt;&lt;span&gt; page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;tagMap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;has&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            tagMap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; []);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        tagMap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;page&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; uniqueTags &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;...&lt;/span&gt;&lt;span&gt;tagMap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;keys&lt;/span&gt;&lt;span&gt;()];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;BaseLayout&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;تاجژ&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        uniqueTags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            &amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                &amp;lt;&lt;/span&gt;&lt;span&gt;h2&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;}&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    &amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;}&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                &amp;lt;/&lt;/span&gt;&lt;span&gt;h2&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                &amp;lt;&lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    {&lt;/span&gt;&lt;span&gt;tagMap&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                        &amp;lt;&lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            &amp;lt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;`/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toISOString&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;substring&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                &amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                    {&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                        .&lt;/span&gt;&lt;span&gt;toISOString&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                        .&lt;/span&gt;&lt;span&gt;substring&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt;)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                &amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                &amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                                &amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;{&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;}&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                            &amp;lt;/&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                        &amp;lt;/&lt;/span&gt;&lt;span&gt;li&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    ))}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                &amp;lt;/&lt;/span&gt;&lt;span&gt;ul&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            &amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        ))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;BaseLayout&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;اية دا؟ انت بتضحك عليا؟! دي JavaScript اهي! واية دا كمان؟ 2 for loop جوا بعض!&lt;/p&gt;
&lt;p&gt;دي &lt;span class=&quot;katex&quot;&gt;&lt;math&gt;&lt;mrow&gt;&lt;mi&gt;O&lt;/mi&gt;&lt;mo&gt;(&lt;/mo&gt;&lt;mi&gt;n&lt;/mi&gt;&lt;mo&gt;×&lt;/mo&gt;&lt;mi&gt;t&lt;/mi&gt;&lt;mo&gt;)&lt;/mo&gt;&lt;/mrow&gt;O(n \times t)&lt;/math&gt;&lt;/span&gt;!&lt;a href=&quot;#user-content-fn-2&quot;&gt;2&lt;/a&gt; ازاي ممكن يكون سريع؟&lt;/p&gt;
&lt;p&gt;عندك حق… دا مش اكتر حاجة Efficient…لو دا بيتعمل At runtime. الفكرة ان استرو بيشوف الكود دا, وبيحول كل حاجة لStatic HTML. مالاخر, بيعمل Compile للJavaScript اللي بتكتبه, وبيحوله لHTML &amp;amp; CSS. بالطريقة دي, استرو بيحفظ الـDX بأنه يسيبك تكتب لغة للScripting, وفنفس الوقت مبيعاقبش الـClient بأنه يبعتله حاجات هو مش محتاجها!&lt;/p&gt;
&lt;p&gt;دا بيواجه الفكرة بتاعت الـFrontend Frameworks المشهورة, صفحة واحدة HTML وJavaScript تغير الـHTML بطريقة Dynamic (دي ال &lt;a href=&quot;https://en.wikipedia.org/wiki/Single-page_application&quot;&gt;Single-Page Applications&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;مش مصدقني؟ ادخل عالـNetwork Tab في الـChrome Devtools. مفيش ولا JavaScript Resource.&lt;/p&gt;
&lt;h2&gt;كتابة بوستس سهلة&lt;/h2&gt;
&lt;p&gt;من اكتر اللغات السهلة اللي ممكن تتعملها &lt;a href=&quot;https://www.markdownguide.org/basic-syntax/&quot;&gt;في ساعة حرفياً&lt;/a&gt; هي Markdown. وهي برضو من اكتر اللغات اللي الناس متعرفهاش, مش عارف لية. تحس ان البني ادمين كلهم قرروا يكتبوا الـReadMe بتاعتهم بالـAI.&lt;/p&gt;
&lt;p&gt;غالباً, الكونتنت بتاعتك هتكتبها بMarkdown في استرو, والـMarkdown دا هيتحول لHTML فالاخر عشان الـBrowser بتاعك يقدر يقراه.&lt;/p&gt;
&lt;p&gt;لية مكتبش بHTML على طول؟ انت ممكن تعمل كدا عادي, بس انت يعتبر بتعاقب نفسك. لو خيروك, هتحب تكتب دا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;lt;!&lt;/span&gt;&lt;span&gt;doctype&lt;/span&gt;&lt;span&gt; html&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt; lang&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;en&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; charset&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;UTF-8&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;viewport&quot;&lt;/span&gt;&lt;span&gt; content&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;width=device-width, initial-scale=1&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Hello, World!&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ولا دا؟&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt; Hello, World!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;DX سريعة&lt;/h2&gt;
&lt;p&gt;انا شخص مبحبش اعمل UI. بالنسبالي اكتر جزء مضجر في كتابة اي Software. فابستعمل ادوات بتسهللي الموضوع لو جاتلي الفرصة, اولهم غالباً هي &lt;a href=&quot;https://tailwindcss.com/&quot;&gt;Tailwind&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;تاني حاجة ممكن استعملها هي اي Component Library بتستعمل Tailwind. لو كنت بستعمل React او Next, كنت غالباً هختار &lt;a href=&quot;https://ui.shadcn.com/&quot;&gt;ShadCn&lt;/a&gt; , بس انا كان عندي نظره لشكل الـBlog هيبقى عامل ازاي, وللأسف ملقتش حاجة بنفس الشكل اللي انا عايزه ومبتستعملش JavaScript, فاضطريت اكتب الـComponents بتاعتي بايدي (رعب).&lt;/p&gt;
&lt;p&gt;الموضوع مكنش صعب اوي, عشان استرو برضو بيتيحلك انك تعمل الـComponents بتاعتك. اي ملف &lt;code&gt;astro.&lt;/code&gt; يعتبر Component من وجهه نظر استرو.&lt;/p&gt;
&lt;p&gt;دا مثلاً:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span&gt; post &lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; Astro&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;props&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;w-full&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;flex flex-wrap gap-x-3 divide-dotted text-xl text-wrap opacity-70&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;text-wrap&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            {&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toISOString&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;substring&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt;)}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                &amp;lt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    &amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; • &lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    &amp;lt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;`/tags#&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;}&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                        &amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;#&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span&gt;}&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                    &amp;lt;/&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;                &amp;lt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            ))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;mb-0&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            href&lt;/span&gt;&lt;span&gt;={&lt;/span&gt;&lt;span&gt;`/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;toISOString&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;substring&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 10&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            {&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        &amp;lt;/&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;h1&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;italic&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;{&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;subtitle&lt;/span&gt;&lt;span&gt;}&amp;lt;/&lt;/span&gt;&lt;span&gt;span&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;دا الكود اللي بيظهر الـTitle - Subtitle - Date - Tags بتاعت كل بوست. الـComponent بياخد Prop من النوع Post و بيRender دا على حسب كل بوست.&lt;/p&gt;
&lt;p&gt;ممكن تستعمله كدا:&lt;/p&gt;
&lt;pre class=&quot;astro-code kanagawa-wave has-highlighted&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt; getCollection&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &quot;astro:content&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line highlighted&quot;&gt;&lt;span&gt;import &lt;/span&gt;&lt;span&gt;PostHeader&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span&gt; &quot;./post-header.astro&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; allPosts &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; await&lt;/span&gt;&lt;span&gt; getCollection&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;posts&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;flex h-full w-full flex-col gap-y-12&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;        allPosts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getTime&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;pubDate&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;getTime&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            .&lt;/span&gt;&lt;span&gt;map&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line highlighted&quot;&gt;&lt;span&gt;                &amp;lt;&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;flex flex-col&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;{&amp;lt;&lt;/span&gt;&lt;span&gt;PostHeader&lt;/span&gt;&lt;span&gt; post&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt; /&amp;gt;}&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;            ))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;div&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;بتستعمله زي اي Component استعملته في حياتك (غالباً).&lt;/p&gt;
&lt;h2&gt;الناهية&lt;/h2&gt;
&lt;p&gt;استرو مش الـStatic Site Generator الوحيد, في &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;, &lt;a href=&quot;https://www.11ty.dev/&quot;&gt;11ty&lt;/a&gt;, &lt;a href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt; و غيرهم. طبعاً انا مستعملتهمش كلهم, ووارد جداً احب SSG غير استرو, ولكن صعب اتخيل DX اسهل من استرو.&lt;/p&gt;
&lt;p&gt;اتمنى اني اكون شجعتك انك تستعمل استرو في مشروع ما, ولو استعملته بسبب البوست دا ابعتلي لينك!&lt;/p&gt;
&lt;h2 class=&quot;sr-only&quot;&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;رياكت Library مش Framework…عارف…عارف. &lt;a href=&quot;#user-content-fnref-1&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;حلو شكل الـO صح؟ دي Plugins استرو &lt;a href=&quot;https://docs.astro.build/en/guides/markdown-content/#markdown-plugins&quot;&gt;بيدعمها&lt;/a&gt;: &lt;a href=&quot;https://github.com/remarkjs/remark-math/tree/main/packages/remark-math&quot;&gt;remark-math&lt;/a&gt; و &lt;a href=&quot;https://github.com/remarkjs/remark-math/tree/main/packages/rehype-katex&quot;&gt;rehype-katex&lt;/a&gt;. استرو برضو &lt;a href=&quot;https://docs.astro.build/en/guides/syntax-highlighting/&quot;&gt;بيدعم Syntax Highlighting&lt;/a&gt; في الكود ب &lt;a href=&quot;https://shiki.style/&quot;&gt;Shiki&lt;/a&gt; و &lt;a href=&quot;https://prismjs.com/&quot;&gt;Prism&lt;/a&gt;. &lt;a href=&quot;#user-content-fnref-2&quot; class=&quot;data-footnote-backref&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item></channel></rss>