<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Snippets on مدونة عمار الخوالده</title><link>https://ammar.dev/snippets/</link><description>Recent content in Snippets on مدونة عمار الخوالده</description><generator>Hugo</generator><language>ar</language><lastBuildDate>Sat, 05 Sep 2026 15:24:00 +0300</lastBuildDate><atom:link href="https://ammar.dev/snippets/index.xml" rel="self" type="application/rss+xml"/><item><title>متى لا تكون تعابير Regex كافية لتحليل النصوص؟</title><link>https://ammar.dev/snippets/when-regex-is-not-enough/</link><pubDate>Sun, 16 Aug 2026 22:35:00 +0300</pubDate><guid>https://ammar.dev/snippets/when-regex-is-not-enough/</guid><description>&lt;p&gt;كتبت سابقا مقالا تفاعليا يشرح Regex:
&lt;a href="https://ammar.dev/regex-introduction/"&gt;مقدمة في تعلم Regex&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;شرحت فيه عدة أمثلة للمُطابقة (Matching) لكن ما لم يُذكر في المقال أن Regex يفشل أحيانا في معالجة بعض النصوص.&lt;/p&gt;
&lt;p&gt;هذه القصاصة تعطي أمثلة على حالات لا يصلح فيها Regex لتحليل النصوص.&lt;/p&gt;
&lt;h2 id="التكرار-والتداخل-recursion"&gt;التكرار والتداخل Recursion&lt;/h2&gt;
&lt;p&gt;هذا النمط من المقال يُطابق بعض الـ HTML Tags:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="syntax-re" data-lang="re"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6e7681"&gt;1&lt;/span&gt;&lt;span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;&amp;lt;(&lt;/span&gt;strong&lt;span style="color:#ff7b72;font-weight:bold"&gt;|&lt;/span&gt;b&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&amp;gt;(?&amp;lt;&lt;/span&gt;tag_content&lt;span style="color:#ff7b72;font-weight:bold"&gt;&amp;gt;.*)&amp;lt;&lt;/span&gt;&lt;span style="color:#f85149"&gt;\&lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;/&lt;/span&gt;&lt;span style="color:#ff7b72;font-weight:bold"&gt;(&lt;/span&gt;strong&lt;span style="color:#ff7b72;font-weight:bold"&gt;|&lt;/span&gt;b&lt;span style="color:#ff7b72;font-weight:bold"&gt;)&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;لكن بالنظر إلى الى النص الآتي:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="syntax-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#6e7681"&gt;1&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#7ee787"&gt;strong&lt;/span&gt;&amp;gt;Test &amp;lt;&lt;span style="color:#7ee787"&gt;b&lt;/span&gt;&amp;gt;Bold&amp;lt;/&lt;span style="color:#7ee787"&gt;b&lt;/span&gt;&amp;gt; text&amp;lt;/&lt;span style="color:#7ee787"&gt;strong&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;سيتم مطابقة &lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt; و &lt;code&gt;&amp;lt;/strong&amp;gt;&lt;/code&gt; لكن &lt;code&gt;Test &amp;lt;b&amp;gt;Bold&amp;lt;/b&amp;gt; text&lt;/code&gt; ستُطابق كمجموعة واحدة تحت اسم &lt;code&gt;tag_content&lt;/code&gt;.
عند معالجة نمط معين، حيث يمكن لهذا النمط أن يحتوي على نفسه مرة أخرى (كوجود HTML tag داخل HTML tag آخر) فإن Regex يفشل في مطابقتها.&lt;/p&gt;</description></item><item><title>متى تتجنب استخدام الـ Average لقياس أداء الانظمة</title><link>https://ammar.dev/snippets/when-to-use-percentiles-instead-of-avg/</link><pubDate>Sun, 09 Aug 2026 22:00:00 +0300</pubDate><guid>https://ammar.dev/snippets/when-to-use-percentiles-instead-of-avg/</guid><description>&lt;p&gt;كثيرا ما يُستخدم المتوسط الحسابي (Average/Mean) عند مراقبة الأنظمة لتجميع القيّم وأخذ فكرة عامة عنها لكنه ليس أنسب عملية لتجميع البيانات دائما فهو لا يعطي صورة دقيقة عن الأداء.&lt;/p&gt;
&lt;h2 id="مثال-على-قياس-api-latency"&gt;مثال على قياس API Latency&lt;/h2&gt;
&lt;p&gt;لإعطاء مثال على ذلك، سنفترض أننا نقيس API Latency لأحد الأنظمة، الشكل الآتي يوضح الـ Latency لكل request (بدون أي حسابات إضافية، اعتبر ان كل نقطة على محور x هي request مختلفة):&lt;/p&gt;
&lt;p&gt;&lt;canvas id="latency-chart"&gt;&lt;/canvas&gt;&lt;/p&gt;
&lt;script src="https://cdn.jsdelivr.net/npm/chart.js"&gt;&lt;/script&gt;
&lt;script&gt;
 new Chart(document.getElementById('latency-chart'), {
 type: 'bar',
 data: {
 labels: Array.from({length: 25}, (_, i) =&gt; i + 1),
 datasets: [{
 label: 'Latency (ms)',
 data: [120, 186, 114, 931, 124, 170, 903, 642, 213, 534, 212, 111, 913, 107, 5231, 231, 433, 235, 2455, 421, 823, 450, 723, 98, 1021
]
 }]
 },
 options: {
 scales: {
 x: { display: false },
 y: { title: { display: true, text: 'Latency (ms)' } }
 },
 plugins: {
 legend: { display: false },
 title: { display: true, text: 'API Latency Per Request', font: { size: 16 } }
 }
 }
 });
&lt;/script&gt;
&lt;p&gt;نلاحظ من الرسم البياني أن الـ Requests متباينة في السرعة، فبعضها سريع جدا والآخر بطيء جدا، وبينهما تقع كثير من البيانات.&lt;/p&gt;</description></item><item><title>نظرة في الـ Infrastructure as Code - IaC</title><link>https://ammar.dev/snippets/infrastructure-as-code-iac-overview/</link><pubDate>Tue, 14 Apr 2026 00:51:00 +0300</pubDate><guid>https://ammar.dev/snippets/infrastructure-as-code-iac-overview/</guid><description>&lt;p&gt;البنية التحتية (Infrastructure) هي مجموع المكونات والموارد التي تعمل معا كقاعدة لتشغيل مشروعك، كالسيرفرات المطلوبة للتشغيل أو لتخزين البيانات، والشبكات والـ IPs وإعداداتها، أو الـ Domains وإعدادات الـ DNS وغيرها.&lt;/p&gt;
&lt;p&gt;كل جزء من أجزاء الـ Infrastructure تحصل عليه من أحد مزودي الخدمة، وإدارة هذه الموارد أو المكونات تتم عادة بالدخول إلى لوحة تحكم خاصة بكل مزود خدمة وإنشاء الموارد أو تعديلها.&lt;/p&gt;
&lt;p&gt;فأدخل مثلا إلى لوحة تحكم مزود خدمة السيرفرات لإنشاء بعض السيرفرات والـ Firewalls وإعدادات الشبكة فيما بينها، ثم أدخل إلى مزود خدمة الـ DNS لتعديل إعدادات الـ DNS، ثم إلى مزود خدمة الإيميلات والـ SMTP&amp;hellip; وهكذا&lt;/p&gt;</description></item><item><title>ما هو الـ Transaction في قواعد البيانات؟</title><link>https://ammar.dev/snippets/database-transaction/</link><pubDate>Sat, 31 Jan 2026 21:51:00 +0300</pubDate><guid>https://ammar.dev/snippets/database-transaction/</guid><description>الـ Transaction: تنفيذ مجموعة من الـ Queries على قاعدة البيانات كوحدة واحدة - Single Unit of Work</description></item><item><title>مشاكل قياس الوقت أو المدة - Monotonic Clock</title><link>https://ammar.dev/snippets/monotonic-time/</link><pubDate>Sun, 28 Dec 2025 22:00:00 +0300</pubDate><guid>https://ammar.dev/snippets/monotonic-time/</guid><description>مشاكل قياس المدة باستخدام وقت نظام التشغيل وكيف تحل الـ Monotonic Clock المشكلة.</description></item><item><title>طرق تخزين جداول قواعد البيانات: Row-oriented vs Column-oriented</title><link>https://ammar.dev/snippets/row-vs-column-oriented-databases/</link><pubDate>Sat, 04 Oct 2025 00:00:00 +0000</pubDate><guid>https://ammar.dev/snippets/row-vs-column-oriented-databases/</guid><description>&lt;p&gt;تنقسم قواعد البيانات من حيث طريقة تخزين البيانات على مستوى الجداول إلى نوعين:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Row-oriented Database&lt;/li&gt;
&lt;li&gt;Column-oriented Database&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;هذا التقسيم متعلق بآلية التخزين في الـ Storage System.&lt;/p&gt;
&lt;h2 id="التخزين-في-الـ-row-oriented-databases"&gt;التخزين في الـ Row-Oriented Databases&lt;/h2&gt;
&lt;p&gt;يتم تخزين القيم الخاصة بنفس الـ Entity على صف واحد بحيث تكون كلها متتالية، وهذا هو الافتراضي في قواعد البيانات المعروفة كـ PostgreSQL و SQLite.&lt;/p&gt;
&lt;figure class="db-row-vs-col-card not-prose"&gt;
 &lt;div class="card-header"&gt;
 &lt;div class="icon-container icon-blue"&gt;
 &lt;svg class="icon icon-blue" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"&gt;
 &lt;rect x="3" y="3" width="7" height="7"&gt;&lt;/rect&gt;
 &lt;rect x="14" y="3" width="7" height="7"&gt;&lt;/rect&gt;
 &lt;rect x="14" y="14" width="7" height="7"&gt;&lt;/rect&gt;
 &lt;rect x="3" y="14" width="7" height="7"&gt;&lt;/rect&gt;
 &lt;/svg&gt;
 &lt;/div&gt;
 &lt;div class="header-text"&gt;
 &lt;figcaption&gt;Row-Oriented Databases&lt;/figcaption&gt;
 &lt;p&gt;أنظمة قواعد البيانات التقليدية (PostgreSQL, MySQL) - OLTP&lt;/p&gt;</description></item><item><title> سجل الاستعلامات البطيئة - Slow Query Log</title><link>https://ammar.dev/snippets/slow-query-logs/</link><pubDate>Wed, 24 Jan 2024 00:00:00 +0000</pubDate><guid>https://ammar.dev/snippets/slow-query-logs/</guid><description>&lt;p&gt;من الإعدادات المفيدة في MariaDB / MySQL، هي إعدادات الـ Slow Query Log،&lt;/p&gt;
&lt;p&gt;وهي من الطرق التي تستخدم (بدون أدوات مراقبة خارجية) لمعرفة الـ Queries البطيئة في قاعدة البيانات،&lt;/p&gt;
&lt;p&gt;يمكنك تحديد عدد الثواني التي إذا تجاوزها وقت تشغيل الـ Query يعتبر بطيئا.&lt;/p&gt;
&lt;p&gt;



 
 
 
 


&lt;figure&gt;
 &lt;img src="https://ammar.dev/snippets/slow-query-logs/slow_query_log_settings_hu_6c06e36bc864d1e7.webp" alt="خيارات تفعيل الـ Slow Query Log"loading="lazy"
 &gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;توجد العديد من الإعدادات الأخرى كتحديد مسار الملف الخاص بالـ Log، أو بعض الشروط الإضافية التي يجب أن ينطبق حتى يتم تسجيل الـ Query على أنه بطيء&lt;/p&gt;</description></item><item><title>Server Sent Events (SSE)</title><link>https://ammar.dev/snippets/http-server-sent-event/</link><pubDate>Sat, 16 Sep 2023 00:00:00 +0000</pubDate><guid>https://ammar.dev/snippets/http-server-sent-event/</guid><description>&lt;p&gt;بروتوكول HTTP يستخدم Request-Response model، مما يعني أن السيرفر لا يستطيع إرسال بيانات إلى الـ Client ما لم يقم الـ Client أولا بإرسال Request.&lt;/p&gt;
&lt;p&gt;



 
 
 
 


&lt;figure&gt;
 &lt;img src="https://ammar.dev/snippets/http-server-sent-event/sse-server-sent-event_hu_98c57ef8c7c7eade.webp"loading="lazy"
 &gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;لكن يمكن استخدام SSE (Server Sent Events) لإرسال البيانات من السيرفر للـ Client، لا يزال الـ Client بحاجة إلى إرسال Request أولا،
لكن يتم استخدام Keep-Alive لإبقاء الاتصال مفتوحا، والسيرفر سيرسل البيانات دون انهاء الـ Response، في الصورة السابقة تجد أنه قد تم إرسال أكثر من رسالة من السيرفر إلى الـ Client في أوقات مختلفة، كلها تعتبر Response واحدة لكن تم تقسيما وإرسالها بالتدريج،&lt;/p&gt;</description></item><item><title>الحفاظ على الاتصال بين HTTP 1.0 و HTTP 1.1</title><link>https://ammar.dev/snippets/http-keep-alive/</link><pubDate>Fri, 18 Aug 2023 00:00:00 +0000</pubDate><guid>https://ammar.dev/snippets/http-keep-alive/</guid><description>&lt;p&gt;اقوم اليوم ببعض التجارب المتعلقة ببروتوكول HTTP لفهمه بشكل أعمق،&lt;/p&gt;
&lt;p&gt;حاولت إرسال الـ Request باستخدام netcat عبر TCP مباشرة دون استخدام HTTP Client.&lt;/p&gt;
&lt;p&gt;الصورة المرفقة توضح الفرق بين نسخة HTTP 1.0 و HTTP 1.1.&lt;/p&gt;
&lt;p&gt;



 
 
 
 


&lt;figure&gt;
 &lt;img src="https://ammar.dev/snippets/http-keep-alive/1_http1.0_vs_http1.1_raw_request_hu_c5b872467b360549.webp" alt="HTTP 1.0 vs HTTP 1.1 raw request"loading="lazy"
 &gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;في النسخة 1.0 ستضطر لإرسال كل HTTP Request باتصال TCP جديد،
بينما في النسخة 1.1، يمكن إرسال أكثر من HTTP Request على نفس الاتصال مما يزيد من سرعة العملية (ستختصر الوقت والموارد اللازمة لفتح اتصال جديد).&lt;/p&gt;</description></item></channel></rss>