خان المُبرمجين (علي فاضل) – Telegram
خان المُبرمجين (علي فاضل)
642 subscribers
113 photos
11 videos
132 links
قناة أنشر فيها ما أتعلمه خلال عملي على مشاريعي الخاصة 👀
Download Telegram
للأصدقاء في الأردن، يسرني دعوتكم لحدث مشترك بين MilkStraw AI و Stakpak 🎉

المكان: مقهى Respect
التاريخ: الأربعاء 2025/10/08
الوقت: الثامنة مساء

هدفنا التعارف وتبادل الخبرات، لا يوجد محاضرات أو عروض تقديمية 😎

رابط التسجيل:
https://luma.com/t6r86y0o

نراكم على خير بإذن الله 🚀
7
إذا كنت تستخدم Docker على MacOS فلا تستخدم Docker Desktop، فقط ثبّت Docker CLI من خلال الأمر brew install docker ثم استخدم Colima كـ runtime

https://github.com/abiosoft/colima
4
بعد انقطاع أسبوع تقريبا عن Discord لأسباب خارجة عن إرادة الشعب، عدت اليوم بعد تثبيت WARP من Cloudflare سهل التثبيت ويعمل بدون مشاكل 😄

وبعد مراجعة كل ما فاتني من رسائل، وجدت هذا الرابط في رسالة منها:
https://railsblocks.com

قد تكون أفضل مكتبة مكوِّنات واجهة مستخدم عرفتها إلى الآن مخصصة لإطار عمل Ruby on Rails، جارٍ التجربة 🤩
3
انتهت الدراما الحاصلة في مجتمع Ruby أخيرا 🤓

https://www.ruby-lang.org/en/news/2025/10/17/rubygems-repository-transition

النتيجة: Bundler و RubyGems ستُدار كما تُدار لغة Ruby من قِبل Matz وفريق لغة Ruby الأساسي وستنتقل المستودعات من مؤسسة RubyCentral على GitHub إلى مؤسسة Ruby 🎉
7
خوادم Discord أنصح كل مهتم بـ Ruby on Rails بالانضمام إليها:
- Naming Things: https://discord.gg/2Kxg6fbd
- GoRails: https://discord.gg/gorails-874684608686477352
- Kamal: https://discord.gg/UEee8VeK
- Masilotti.com: https://discord.gg/sxP2gdWw
8👍1
من مشاكل النماذج اللغوية في البرمجة هي مشكلة وهم الكمال (تسمية مُنمّقة 😂).

مثلا، تطلب من النموذج تعديل دالة معينة لتغيير شكل القيمة الخارجة منها، فيبدأ النموذج بـ"التفكير" خارج نطاق المطلوب و"يخطط" للتعديلات المطلوبة في المواضع التي تُستخدم فيها هذه الدالة.

هذا الأمر يشتت النموذج أحيانا ويُنتج تعديلات كثيرة قد لا تحتاجها أثناء تجربتك للفكرة التي طلبتها منه.

لذلك أصبحت دقيقا جدا في صياغة طلباتي وفي كل مرة أخبره "لا تهتم باستخدامات هذه الدالة، سأعدلها لاحقا بنفسي".
6👍1
كنت أشرح Hotwire (وهو الـ Frontend Stack الخاص بـ Ruby on Rails) خلال جلسة لمشاركة المعرفة في MilkStraw AI واكتشفنا أن منصتنا تُعيد تحميل الصفحة بالكامل عند التنقّل بين الصفحات!

وقبل أن تقول أن هذا هو الطبيعي، فيا صديقي Turbo (وهي جزء من Hotwire) تضمن لك تحميل الصفحة مرة واحدة، ثم مع كل تنقّل لصفحة جديدة تقوم Turbo بتغيير الـ Body الخاص بالصفحة فقط ولا تُعيد تحميل كل مكونات الصفحة من CSS و JS وغيرها.

في أي مشروع يستخدم Ruby on Rails، التنقّل بين الصفحات يتم من خلال طلب أو Request من نوع Fetch من خلال JS ولا نستخدم (في غالب الأحيان) أي طلبات من نوع Document، كما هو موضّح في الصورة.

الطلبات من نوع Fetch لا تُعيد تحميل الصفحة ومكوناتها بالكامل، أما الطلبات من نوع Document فهي تُعيد تحميل كامل مكونات الصفحة، وهذا هو الفرق الأساسي.

لم نهتم لإيجاد الحل خلال جلسة مشاركة المعرفة لأننا وجدنا المشكلة في أول 5 دقائق منها وكان هناك الكثير من الأشياء لشرحها.

قبل النوم، فتحت تطبيق GitHub على الهاتف وسألت Copilot عن المشكلة، وكان جوابه سيئًا وغير مفيد، لكنه كان ملهما 😂

بعد قراءة الجواب، فتحت ملف head.rb وهو المكوّن الخاص برأس الصفحة (HTML head) وقرأته، لأجد السطر التالي:

raw(cloudflare_turnstile_noscript_tag)


نستخدم في MilkStraw AI خدمة Cloudflare Turnstile، وهذا السطر يُضيف الـ Script الخاص بالخدمة إلى رأس الصفحة، ولكن خلال عملي على مشروع الجامع سبَّبَ لي هذا السطر مشكلة من نفس النوع، إعادة تحميل كاملة للصفحة!

ذهبت إلى ملف head.rb في مشروع الجامع لأجد أنني أزلت السطر السابق واستبدلته بشيفرة برمجية أخرى تجدونها في هذا الرابط:
https://github.com/ieasybooks/aljam3-web-app/blob/main/app/components/head.rb#L73-L78

وكان السبب:

Renders the below noscript tag with 
data_turbo_temporary: true
, which causes full page reloads.


أي أن استخدام cloudflare_turnstile_noscript_tag كان فعلا يسبب إعادة تحميل كاملة للصفحة في الجامع بسبب استخدام data_turbo_temporary: true.

أضفت نفس التعديل إلى MilkStraw AI (وكان طلب التعديل رقمه 1,000 على GitHub 🎉) ونشرنا النسخة الجديدة من المنصة وحُلَّت المشكلة 🚀

كانت المشكلة تتعلّق بكيفية عمل ميزتين من ميزات Turbo:
- data-turbo-temporary
- data-turbo-track

يمكن أن تقرأ عنهم أكثر من هذه الصفحة:
https://turbo.hotwired.dev/reference/attributes

والسلام عليكم 👋🏻
7👍3
لا أنشر خارج نطاق التقنية غالبا، ولكن السيد عمر يُبدع 😎✌🏻

https://youtu.be/IflzCK3JB2Q
11
عند انضمامي إلى MilkStraw AI، كانت الشركة تعتمد على خدمة مكتوبة باستخدام FastAPI لجمع البيانات الأساسية والمطلوبة لخدمة العملاء من مقدِّمي الخدمات مثل AWS.

بجانب هذه الخدمة، يوجد تطبيق Ruby on Rails يستهلك البيانات من خدمة FastAPI لعرضها، بالإضافة لإدارة المستخدمين ولوحات التحكم والمدفوعات وغيرها.

اليوم، ولله الحمد، انتهينا من نقل كل الشيفرة البرمجية من خدمة FastAPI إلى تطبيق Ruby on Rails 🎉

النتائج:
- شيفرة مصدرية واحدة ومسار نشر (Deployment Pipeline) واحد
- تحسين تجربة المطورين بناء على ردود فعل الفريق
- تقليل التكاليف التشغيلية بنسبة 75%
- تحسين الأداء بنسبة تتجاوز 300%

قد ننشر مقالاً تقنياً مفصلاً بأرقام دقيقة قريباً، سأشاركه هنا عند نشره إن شاء الله 🤓
🔥144
تعلم الأدوات التي تستخدمها 🤓 (4 دقائق للقراءة)

https://www.johnhawthorn.com/2024/ruby-might-be-faster-than-you-think/
5
تعرّفت اليوم صدفةً على مكتبة regexp-examples للغة Ruby

تستطيع من خلالها إنشاء نصوص عشوائية من خلال كتابة Regular Expressions كما هو موضّح في الصورة

كيف تعرّفت عليها؟ خلال حديثي مع Perplexity 😆
6
في MilkStraw AI نعتمد على Slack لإيصال بعض التنبيهات المهمة من منصتنا.

على سبيل المثال، عند فشل بعض المهمات الحرجة في المنصة، نُرسل رسالة على مجموعة في Slack ليتعامل الفريق معها بسرعة ولا تختفي بين الرسوم البيانية الكثيرة والسجلات الطويلة.

ولكننا نحتاج أحيانا لإيقاف بعض هذه التنبيهات في بعض الحالات لأننا نعلم أن هذا الخطأ سيحدث دائما ولمدة أسبوع مثلا بعد التحدث مع العميل وطلبِنا لبعض التعديلات من طرفه.

فظهرت الحاجة لحل يمكننا من إيقاف التنبيهات لمدة معينة أو إلى الأبد بناء على ظهور نمط معين أو كلمة/مجموعة من الكلمات فيه.

فقمنا بإنشاء جدول جديد في قاعدة البيانات باسم NotificationSuppressionRule والشيفرة التابعة له موجودة في الصورة.

فأصبحنا نكتب التالي قبل إرسال أي تنبيه إلى Slack لنتخطى إرسال التنبيه الحالي في حال وجود قاعدة تتطابق معه:

return if NotificationSuppressionRule.suppressed?(use_case_id: use_case_id, message: message)


بهذا الشكل حافظنا على الأخطاء في التقارير عامة، وأصبح لدينا القدرة على تقليل التنبيهات والحصول على العدد المطلوب منها فقط.

والسلام عليكم 👋🏻
2👍2
احتجت إلى تحميل قائمة التشغيل هذه من YouTube:
https://www.youtube.com/playlist?list=PLVVfonyXVJI3BXB9Wd2C5yXMr63w3SGXB

أستخدم غالبا yt-dlp لإجراء هذه العملية، فكتبت الأمر yt-dlp ... ليبدأ التحميل، فاكتشفت أن yt-dlp غير موجود على الجهاز، فكتبت الأمر python لأعرف نسخة Python الموجودة على الجهاز، فاكتشفت أن Python غير موجودة على الجهاز أيضا 😂

فتذكرت أن عندي Mise 🤩

فنفّذت الأوامر الموجودة في الصورة وبدأ التحميل بدون أي مشاكل ولله الحمد، هذه من ميزات أن تكون مبرمجا 🤓
9
🔗 رباط التقنية
المجمع العربي للقنوات التقنية

جمعنا لك أفضل القنوات التقنية العربية في مكان واحد، لتجد كل المحتوى المفيد بسهولة وبلا عناء.

📌 تصفح القنوات عبر الموقع:
https://alzanad.github.io/ribat-altaqniyyah

📜 اشترك بالقائمة الموحدة على تليجرام:
https://news.1rj.ru/str/addlist/Gg-LFze5N89mMTJk

💬 للإنضمام راجع الشروط على الموقع:
@alzaanad

#رباط_التقنية
4
من أكبر فوائد الذكاء الاصطناعي داخل المحررات مثل Cursor وغيرها إمكانية كتابة أوامر سريعة على الـ Terminal.

مثلا من لحظات كتبت له:
Kill process holding port 3000

وكتب لي:
lsof -ti :3000 | xargs kill -9

كان ممكن يأخذ من وقتي 5 دقائق بحث 😂
8😁6
قدرتك على كتابك شيفرة برمجية بهذا الشكل تعتمد على عدة أمور:
- توفيق الله عز وجل
- مهارتك كمبرمج
- ليونة لغة البرمجة والمكتبات المستخدمة

لهذا نحب Ruby و Rails في MilkStraw AI ❤️
11
انتهيت من قراءة هذا المقال (أو تفريغ المحاضرة 🤓) وأنصح بقراءته وبشدة:
https://pluralistic.net/2025/12/05/pop-that-bubble

المفاهيم التي يتطرق لها وترتيب الأفكار جميل جدا، وكما قال "فرقع الفقاعة" 😆
6
أحدهم بدأ نشر مقال يوميا عن أسباب حبه للغة Ruby على هذا الموقع من بداية السنة:
https://lovingruby.com/reasons

المقالات قصيرة وممتعة، أنصح المهتمين بقرائتها ❤️
3
انضممت إلى فريق MilkStraw AI قبل حوالي 3 أشهر، ومنذ ذلك الحين عملت مع الفريق على العديد من المشاريع المؤثرة:

- أعدنا كتابة Microservice كانت تعمل بـ Python ودمجناها داخل مشروع Rails الخاص بنا (شيفرة برمجية واحدة 🫶)

- رفعنا نسبة الشيفرة البرمجية المُغطَّاة بالاختبارات إلى 100% 🚀 (مفيد جدا لوكلاء الذكاء الاصطناعي)

- نقلنا الـ Frontend من Hotwire (وهو الـ Stack الافتراضي في Rails) إلى InertiaJS مع VueJS (للأسف 🙄)

- أعدنا هيكلة مشروع Rails الخاص بنا ليتَّبِع معايير Rails القياسية ❤️ (نصيحة: لا تحاول محاربة التقنية التي تستخدمها)

- خفَّضنا تكلفة البنية التحتية 4 أضعاف 💰 وغيرها من الأمور الممتعة

كفريق، أضفنا عشرات الآلاف من الأسطر البرمجية، وحذفنا مثلها تقريبا 😂، جربنا كل أدوات الذكاء الاصطناعي المتاحة للبرمجة، واستقبلنا PRs من أعضاء غير تقنيين، أضفنا مشاكل إلى المشروع ثم أصلحناها، وساهمنا في المصادر المفتوحة.

بعد هذه الرحلة القصيرة، سعيد بإعلان إغلاق جولتنا الاستثمارية (Seed) 🎉 لتمويل المرحلة القادمة من مهمتنا: تقليل فواتير بنيتك التحتية وتحسين الوصول إلى الخدمات السحابية ومراقبتها.
14