خان المُبرمجين (علي فاضل)
544 subscribers
93 photos
9 videos
116 links
قناة أنشر فيها ما أتعلمه خلال عملي على مشاريعي الخاصة 👀
Download Telegram
طرح أحد الإخوة سؤالًا ملخصه: "ماذا أنشر وكيف أنشر؟".

الجواب من وجهة نظري وباختصار شديد: "أنشر تجربتك وما تعرفه، حتى لو كانت المعلومة بسيطة وترى أنها معروفة للجميع مسبقًا".

على سبيل المثال، كان منشور البارحة منشورًا تقنيًّا تحدّثت فيه عن استهلاك الذاكرة في لغة Ruby وكيف حللت المشكلة في منصة باحث، يمكنك قراءته من هنا:
https://t.me/programmerskhan/92

ومنشور اليوم كان منشورًا تعليميًّا قصصيًّا أكثر منه منشورًا تقنيًّا أتحدث فيه عن تجربتي وبعض النصائح في مجال البرمجة التنافسية، يمكنك قراءته من هنا:
https://t.me/programmerskhan/93

كان تفاعل الناس مع منشور اليوم ضعف تفاعلهم مع منشور البارحة على منصة قبيلة وقناتي على تطبيق Telegram وأكثر بـ 4 أضعاف تقريبا على LinkedIn، مع أنني توقعت العكس تمامًا.

فما أريد قوله، شارك ما تعرفه ولو كان من وجهة نظرك بسيطًا، ولا داعي لتعقيد الأمور ومحاولة طرح المواضيع الشيّقة 😁
6👍3
خان المُبرمجين (علي فاضل)
Photo
الكمال عدو الإنجاز

عندما أضفت ميزة تسجيل الدخول باستخدام Google إلى منصة باحث بتاريخ 7 من شهر 4 سنة 2024، كان هناك مشكلة أنني أُنشئ كلمة مرور عشوائية لهذا المستخدم، وليس هناك طريقة يمكنه من خلالها تغيير كلمة المرور، وبالتالي لا يستطيع تغيير أي شيء في حسابه كالاسم الأول والأخير والبريد الإلكتروني.

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

في تطبيقات الهاتف، لا يوجد زر لتسجيل الدخول باستخدام Google (نُحاول حل هذه المشكلة الأخرى 😆)، فيجب على المستخدم تسجيل الدخول باستخدام البريد الإلكتروني وكلمة المرور، ولكنه لا يستطيع تغيير كلمة المرور ليُسجّل دخوله، وهكذا يدور المستخدم في حلقة مفرغة ولله الحمد 😂

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

في سياق مختلف، نشرت منشورا قبل 3 أيام أتحدث فيه عن ميزة جديدة أضفتها إلى منصة باحث وهي تمكين المستخدم من الكتابة باستخدام Yamli، يمكنك قراءته من هنا:
https://t.me/programmerskhan/91

ولكن لم أكن أريد تمكين هذه الميزة لكل مستخدمي المنصة، كنت أريد تمكينها بناء على طلب المستخدم من خلال إضافة خيار "تمكين Yamli" في صفحة إعدادات المستخدم.

أضفت هذا الخيار ونشرت الميزة، ثم طلبت من صديقي الذي طلبها في البداية تجربتها، وكانت المفاجأة، لا يستطيع صديقي تفعيل الميزة لأنه سجّل دخوله باستخدام Google، وليس لديه كلمة مرور لحسابه 😁

هنا أدركت أنه يجب علي إصلاح هذه المشكلة في المنصة.

بدأت في حل المشكلة بعد إضافة ميزة Yamli بيوم، وكان حلها سهلا، مجرد 200 سطر لتعديل الواجهة وطريقة تعامل المنصة مع هذا النوع من المستخدمين، والحمدلله حُلّت المشكلة بعد أكثر من 10 أشهر من وجودها 🥳

هذه المشكلة وغيرها من المشاكل موجودة في باحث وغيرها من المشاريع التي أعمل عليها، ومنها مشاكل أعلم بوجودها ومنها ما لا أعلم بوجوده، ولكن هل هذا يمنع إظهار هذه المشاريع وبدء الاستفادة منها؟ بالتأكيد لا!

لا يجب عليك إنشاء مُنتج كامل لتظهر به أمام الناس ويبدأ الآخرون بالاستفادة منه، كل ما عليك هو توفير مُنتج يعمل بأقل عدد من المشاكل، لا أكثر ولا أقل.

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

وإذا سألتني: "هل يوجد من انتبه لهذه المشكلة خلال الـ 10 أشهر؟"، فالجواب نعم، شخص واحد بعد 5 أيام من إضافة ميزة تسجيل الدخول باستخدام Google، وراسل المنصة لحلها، وانت تعرف الباقي.

والسلام عليكم 👋🏻
5👍4
وصلنا اليوم إلى 200 مشترك ولله الحمد 🎉 لعل هذه المنشورات تكون لنا لا علينا يارب 🤲🏻

شارك معنا شيئا استفدته في هذه الرحلة 😎
🎉82
خان المُبرمجين (علي فاضل)
Photo
البيانات الهرمية في قاعدة البيانات

أعمل حاليا على إضافة ميزة جديدة إلى منصة باحث (قريبًا 🚀) وتحتاج هذه الميزة إلى ترتيب البيانات هرميًّا، فكل صف من صفوف الجدول يُعبّر عن عنصرٍ وهذا العنصر قد يكون له ابن أو مجموعة أبناء، وهكذا إلى أن نحصل على شجرة من البيانات.

هذا التمثيل للبيانات مهم ومنتشر في حياتنا فيمكنك من خلاله تمثيل فئات المنتجات (مثلا: فئة البقالة تحتها منتجات الألبان ومنتجات اللحوم) أو تمثيل الموظفين في الشركة حسب أقسامهم (مثلا: قسم تكنولوجيا المعلومات تحته قسم الصيانة وقسم المشتريات).

كنت أظن الأمر سهلا ولا يوجد فيه الكثير من التعقيدات، مجرد جدول في قاعدة البيانات مع عمودٍ باسم parent_id من خلاله تعرف الأب لكل صف من صفوف الجدول، وإذا كان الصف بدون parent_id، فهذا يعني أنه جذر في هذه الشجرة، سهلة.

ولكن قبل البدء في التنفيذ قررت البحث والقراءة عن الأمر، فاكتشفت الخيارات الكثيرة المتاحة لك عند تمثيل هذا النوع من البيانات، ومنها الخيار المذكور في الفقرة السابقة والمسمى بـ "أب-ابن" (Parent-Child).

استخدام هذا النوع سهلٌ جدًّا في Ruby on Rails، تحتاج إلى إضافة العمود ثم تعريف العلاقة في الـ Model كما هو موضّح في الصورة. بهذه الطريقة يمكنك الوصول إلى أب أي عنصر من خلال دالة parent والوصول إلى أبناء أي عنصر من خلال دالة children.

هذا الخيار يُوّفر لك سرعة كبيرة في إضافة العناصر الجديدة، فأنت تحتاج إلى كتابة صفٍّ واحدٍ فقط، ولكن القراءة فيه تكون بطيئة، فإذا وُجد عنصر يبعد عن الجذر الخاص به بمسافة 5 عناصر، فستحتاج إلى 4 استعلامات على قاعدة البيانات لتصل إلى الجذر، لذلك يُنصح به إذا كان أطول مسارٍ في شجرة بياناتك لا يتعدَّى عنصرين أو ثلاثة عناصر كحد أقصى.

النوع الثاني يسمى المسار الملموس (Materialized Path)

في هذا النوع أنت تحتفظ بكل آباء العنصر إلى أن تصل إلى الجذر في كل صف من صفوف الجدول، فلا تحتاج إلى الكثير من الاستعلامات لتصل إلى جذر عنصرٍ مُعيّن لأنك تمتلك المسار كاملًا من العنصر إلى الجذر، ولكن الكتابة في هذا النوع مكلفة وحجم البيانات المُخزّنة أكبر.

يوجد مكتبة لـ Rails توفّر لك هذا النوع من التمثيل تسمى ancestry، يمكنك الاطلاع عليها من هنا:
https://github.com/stefankroes/ancestry

النوع الأخير يسمى المجموعات المتداخلة (Nested Sets)

وهذا النوع أعقدهم، ولكنه يوفّر قراءة سريعة جدًّا لعناصر الشجرة. يعمل هذا النوع بمبدأ مُشابه لمبدأ عمل الـ Segment Tree، والتي شرحتها في هذا المقطع:
https://www.youtube.com/live/U_sZY8WTX-Y

سريعًا، يستخدم هذا النوع 3 أعمدة وهي level و left و right لتمثيل مستوى العناصر في الشجرة وبداية ونهاية العناصر المُنتمية لكل عنصرٍ من عناصر الشجرة. باستخدام هذه الأعمدة يمكنك الاستعلام عن أبناء عنصر من العناصر بسرعة كبيرة، ولكن كسابقه، الكتابة فيه مكلفة.

يوجد مكتبة لـ Rails توفّر لك هذا النوع من التمثيل تسمى awesome_nested_set، يمكنك الاطلاع عليها من هنا:
https://github.com/collectiveidea/awesome_nested_set

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

هل استخدمت أي نوع من هذه الأنواع سابقًا ؟.؟ وهل تعرف أنواعًا أخرى؟ شاركنا لنستفيد 😁

والسلام عليكم 👋🏻
5
اكتب بالعربية

لا يختلف اثنان على أن الكتابة بالعربية أمرٌ صعب في مجالِ التقنية بشكل عام، فمعظم المصطلحات ليس لها ترجمة، وإن وُجدت ترجمة، فقد تكون غير مستساغة لدى المتلقِّي.

ولكن رغم كل هذه الصعوبات، الأمر يستحق المجاهدة والمُحاولة، فلا ترتقي الأمم بلغة غيرها ولا تبدأ النهضة إلا بترجمة العلوم وإنتاجها بلغة القوم.

عن نفسي، أكتب بسهولة أكبر في مجالي عند استخدام الإنجليزية، ولكن أبذل بعض الجهد في استخدام العربية سواءً كان في المحادثات الشخصية أو في توثيق البرمجيات، ومن أمثلة ذلك مكتبتيْ تفريغ وتحويل:
- https://github.com/ieasybooks/tafrigh
- https://github.com/ieasybooks/tahweel

بدأت بكتابة التوثيق الخاص بمكتبة تفريغ باللغة العربية، ثم عند استقراره استخدمت الذكاء الاصطناعي لترجمته إلى الإنجليزية وتوفيره كنسخة ثانية (وليست أساسية) للتوثيق في المستودع.

كذلك، بدأت بكتابة توثيق تحويل باللغة العربية، لكنني لم أرَ حاجة إلى ترجمته إلى الإنجليزية بعد.

وعلى الهامش، سأكون متواجدًا في Leap هذه السنة في الرياض من الأحد الموافق 09/02 إلى الأربعاء الموافق 12/02، إن كنتَ حاضرًا، فلنلتقِ 😁

والسلام عليكم 👋🏻
9👍1🔥1
عندما تأتيك التزكية من صاحب المكان 😎✌🏻😂
72
خان المُبرمجين (علي فاضل)
Photo
الاتباع القاتل لأفضل الممارسات (Best Practices)

يمكن للمستخدم تصفّح منصة باحث باللغتين العربية والانجليزية (لواجهة المستخدم فقط، وليس للمحتوى) وهذه ميزة متوفرة تلقائيًّا في إطار عمل Ruby on Rails تسمح لك بكتابة النصوص المستخدمة في تطبيقك في ملفات YAML ثم تستطيع تغيير لغة التطبيق من خلال الإعدادات.

عندما بدأت منصة باحث، كنت أضع نصوص كل صفحة من صفحات الموقع في ملف منفصل.

مثلا، الصفحة الموجودة في مسار app/views/pages/home.rb يكون لها ملفات للترجمات في المسارات التالية:
- config/locales/views/pages/home.ar.yml
- config/locales/views/pages/home.en.yml

وكنت مقتنعًا أن هذا الأمر جيِّدٌ لأنني أفصل نصوص الصفحات عن بعضها، ويمكنني تحديد مكان النص الذي أريد تغييره بدقة كبيرة، ولكن هذا لم يكن الواقع!

كان الأمر مزعجًا، ولم يكن العثور على الملفات سهلًا، بل إن أي صفحة جديدة، وحتى المُكوِّنات (Components)، كان لها ملفاتها المنفصلة، فكان عدد الملفات يتجاوز الـ 300 ملف (للنصوص فقط)!

في يوم من الأيام قررت إزالة كل هذه الملفات وتجميع كل النصوص في ملف واحد لكل لغة، فأصبح لديَّ ملفّان فقط:
- config/locales/ar.yml
- config/locales/en.yml

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

بعد هذه التجربة اكتشفت أن أفضل الممارسات ليست دائما أفضل ما تفعله لمشروعك 😁

والسلام عليكم 👋🏻
5
أول ميزة تصل إلى منصة باحث طُوِّرت في LEAP من الرياض، السعودية 😎

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

الأكاديميات المُضافة حتى الآن هي أكاديمية غراس العلم وأكاديمية زاد، وسيزداد العدد في المستقبل بإذن الله.

هذه هي الميزة التي كتبت عنها في منشور سابق، حيث ناقشت فيه بعض ما يتعلق بالبيانات الهرمية وطُرق تمثيلها في قاعدة البيانات:
https://t.me/programmerskhan/99

والسلام عليكم 👋🏻
8
عُدنا والعود أحمدُ

لا أحب ترشيح أيّ شيءٍ إلا بعد تجربته، سواء كان الأمر يتعلق بتقنية مُعينة أو سلسلة مُصوّرة، لذلك تأخرت في ترشيح البث الذي أجراه الأخ أبو بكر سليمان مع الأخ أحمد الإمام حتى أنهيت مشاهدته، وكانت 4 ساعات رائعة.

البث يتطرّق إلى:
- معالجة البيانات وتجهيزها
- تشغيل النماذج اللغوية ومقارنتها
- تدريب النماذج اللغوية
- حفظ ونشر النماذج اللغوية
- تقدير تكلفة استخدام النماذج اللغوية

ويتخلل هذه المحاور العديد من المعلومات المفيدة، مثل التعرّف على مكتباتٍ جديدة وبعض التقنيات المُساعِدة عند التعامل مع هذه النماذج.

يمكنك مشاهدة البث من هنا:
https://www.youtube.com/live/S9VHQhC3HPc

أنصحك سواءً كنت مبتدئًا أو متقدمًا في هذا العالم أن تُشاهد البث، فهو مفيد جدا.

والسلام عليكم 👋🏻
8👍1
الخوف من المجهول

من سنوات طويلة وأنا أسمع عن NGINX وأراه يُستخدم بكثرة وأحيانا أستخدمه من خلال أحد مقدِّمي الخدمات، ولكن لم أُجرّب استخدامه بشكل مباشر أبدًا من قبل، والسبب كان "الخوف من المجهول".

كنت أظن أنه شيء مُعقّد ومن الصعب التعامل معه، إلى أن اضطررت البارحة إلى تشغيله يدويًّا واكتشفت أن الأمر لم يكن صعبا كما كنت أتخيّل!

كل ما احتجته هو تشغيل بعض الأوامر على الخادم وتعديل بعض الإعدادات وكان NGINX مربوطًا باسم النطاق الخاص بي وبدون أي مشاكل. بكل تأكيد هناك العديد من الإعدادات التي لم ألمسها والكثير من الأمور التي أحتاج لتعلمها، ولكن التجربة المبدئية كانت ناجحة.

نفس هذا الأمر يتكرر معنا في حياتنا اليومية خلال العمل أو خارجه، دائما ما نخاف من المجهول إلى أن نجربه فنكتشف أنه لم يكن كما كنا نعتقد.

لو أنني تخلّصت من هذا الخوف من سنوات لكنت الآن أكثر معرفة ولدي تجارب مختلفة في مجالات أكثر، ولكن هذا ما حدث، لذلك أنا آتٍ من المستقبل لأخبرك "لا تخف من المجهول"، فقط جرّب وأعطِ نفسك الفرصة.

ما هي أسوأ الاحتمالات؟ ستفشل في تنفيذ بعض الأفكار؟ لن تستطيع تشغيل بعض التقنيات؟ وماذا بعد؟ فقط جرّب.

والسلام عليكم 👋🏻
11👍2
خان المُبرمجين (علي فاضل)
Photo
تضمينات (تمثيلات | متجهات) الماتريوشكا أو Matryoshka Embeddings

كل النماذج المُستخدمة في استخراج التضمينات أو الـ Embeddings تُعطيك حجمًا ثابتًا للتضمينات يتراوح بين 384 في النماذج الصغيرة من Sentence Transformer كنموذج MiniLM، ويصل إلى 8,960 في بعض النماذج الضخمة المُقدمة من Nova وعلي بابا.

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

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

على سبيل المثال، عندما يُعطينا النموذج تضمين بحجم 1,024 نحسب الـ Loss الخاص به باستخدام التضمين بحجمه الكامل بالإضافة إلى الـ Loss باستخدام أول 512 عنصر من عناصر التضمين بالإضافة إلى الـ Loss باستخدام أول 256 عنصر من عناصر التضمين، وهكذا.

اختيار الأحجام هو شيء يحدده صانع النموذج، فمثلا نموذج silma-embeddding-matryoshka-v0.1 المقدّم من SIMLA AI يُعطيك تضمينات بأحجام 768 و 256 و 48 و 16 و 8.

يمكن الاستفادة من هذا النوع من التضمينات في حالات استرجاع البيانات، فمثلا يمكنك استرجاع عدد كبير من المستندات باستخدام التضمينات الصغيرة (48 مثلا) ثم تُعيد ترتيبها باستخدام التضمينات الأكبر والأكثر دقة (256 مثلا) وتستبعد جزءًا من النتائج لتُعيد ترتيب المُتبقي لديك بأكبر حجم من التضمينات (768 مثلا).

يوجد العديد من النماذج من هذا النوع موجودة على HuggingFace يمكنك الاطلاع عليها من هنا:
https://huggingface.co/models?search=matryoshka

كما يمكنك قراءة هذه المقالة لفهم أعمق:
https://huggingface.co/blog/matryoshka

وأخيرا، يمكنك استخدام متعب (MTEB) لمعرفة أفضل نماذج التضمينات الموجودة على الساحة:
https://huggingface.co/spaces/mteb/leaderboard

والسلام عليكم 👋🏻
4
مما لا يسع المبرمج جهله

تعرّفت على العديد من المبرمجين خلال حياتي البرمجية القصيرة، وجزء لا بأس به منهم لا يعرفون كيفية استخدام Git بشكل جيد أو لم يستخدموه من قبل أساسا (بالإضافة إلى شيء مثل GitHub)، وهذا من المحرمات، صدقًا 😅

"يجب" على المبرمج أن يعرف كيفية استخدام Git سواءً كان مطوّر مواقع أو تطبيقات للهاتف أو عاملا في مجال الذكاء الاصطناعي أو مديرًا للأنظمة والبنية التحتية، هذا ليس رفاهيةً أبدا.

هذان مصدران من المصادر اللطيفة والخفيفة على النفس والتي أنهيتها شخصيا:
- https://ohmygit.org
- https://learngitbranching.js.org

يمكنك مشاهدة بعض الدروس التعليمية كمقدمة ثم استخدام المصدرين في الأعلى للتعلّم والتسلية في الوقت نفسه.

والسلام عليكم 👋🏻
👍63😱1