خان المُبرمجين (علي فاضل)
542 subscribers
93 photos
9 videos
116 links
قناة أنشر فيها ما أتعلمه خلال عملي على مشاريعي الخاصة 👀
Download Telegram
طلب مني صديقي إحصائية بعدد مستخدمي باحث على أنواع الأجهزة المختلفة (حاسب، هاتف، لوحي، إلى آخره) ليستفيد منها في تصميم مشروعه الذي يعمل عليه (قريبًا 🚀)، فدخلت إلى Google Analytics وقمت بتحديد الفترة من 01/01/2024 إلى 01/01/2025 وحدّثت التقرير، لأتفاجأ 😂

الحمدلله وبفضله وحده تجاوز عدد المستخدمين النشيطين الـ 470 ألف مستخدم، أغلبهم قادم من البحث المباشر على Google وما تبقى قادم من روابط مباشرة للمنصة، أما أكثر 5 دول استخداما لباحث فكانت السعودية ومصر والجزائر والمغرب والعراق.

لست متخصصًا في الـ SEO وقراءة تقارير Google Analytics، فمن كان مهتما بهذا المجال ووجد فرصة لتحسين وصول باحث أكثر فليتواصل معي رجاءً 😎

إذا أردت أن تعرف ما هي منصة باحث فيمكنك مشاهدة هذا المقطع القصير:
https://youtu.be/vl90LkLgfE4

وإذا أردت تجربتها فهذا رابطها:
https://baheth.ieasybooks.com
4👏3
يقول أحدهم: "النوايا الحسنة لا تعمل، الآليات هي التي تعمل" أو "Good intentions don't work. Mechanisms do".

عندما نقلت منصة باحث من استخدام قوالب ERb الخاصة بإطار عمل Ruby on Rails لبناء الواجهات إلى مكتبة Phlex قررت أن لا أضيف أي ملفات ERb إلى المشروع مرة أخرى، ولكن "النوايا الحسنة لا تعمل" 😁

فكّرت قليلا، فقررت إضافة GitHub Action يتأكد أن عدد ملفات ERb لم يزد في الـ PR الجديدة مقارنة بالحالة الحالية للمستودع، مع استثناء الملفات المنتهية بـ turbo_stream.erb لأن Phlex لا تقدم لها حلا إلى الآن.

وفعلا كتبت الـ GitHub Action المرفق في الصورة (بمساعدة ChatGPT 🥹) وأضفته إلى المستودع وأثبتت الأيام أن "الآليات هي التي تعمل" 😎

نستفيد أمران من هذه القصة:
- حاول استغلال GitHub Actions طالما أنهم مجانيين
- أول سطر في المنشور

وأخيرا، إذا كنت تتساءل عن ما هي الـ GitHub Actions، فمن المهم أن تقرأ عنها وتتعلمها ✌🏻

والسلام عليكم 👋🏻
3
إنما السيل اجتماع النُّقط 🌊

من 30 يوما، تحديدا يوم 26/12/2024، اتخذت قرارًا دون سابق تخطيطٍ أو ترتيب، أن أنشر منشورًا تقنيًّا واحدًا يوميًّا لمدة 30 يوما على قبيلة و LinkedIn، ثم دخل Telegram على الساحة، والبارحة كان اليوم الأخير ولله الحمد.

ماذا استفدت من هذه التجربة؟

- عرضَيْ عمل 😁
- شاركت جزءًا كبيرا من تجربتي في تطوير منصة باحث وباقي المشاريع التي أعمل عليها
- تعرّفت على أكثر من 15 صديقًا جديدًا (تحدثنا فعليًّا)
- بدأت التعاون مع 6 أشخاص لتطوير منصة باحث بشكل أكبر في نواحٍ مختلفة
- أكثر من 5 اجتماعات إلى الآن ضمن هذا التعاون والعدد يزداد
- كتبت نصف المنشورات تقريبا باللغة الفصحى، مع ركاكتها ولكن ستتحسن بمرور الوقت بإذن الله 🥹
- أكثر من 17 ألف ظهور للمنشورات على قبيلة وأكثر من 125 ألف على LinkedIn
- أكثر من 250 مشاهدة للملف الشخصي على قبيلة وأكثر من 1,150 على LinkedIn
- زيادة بنسبة 35% في عدد المتابعين على LinkedIn

أسأل الله أن يجعل هذا العمل خالصًا لوجهه الكريم، وأشجّع الجميع على مشاركة تجاربهم "العملية" لنشر الفائدة.

نستمر بإذن الله، والسلام عليكم 👋🏻
12
خان المُبرمجين (علي فاضل)
Photo
يقول رسولنا صلى الله عليه وسلم: "أَحَبُّ الأعمالِ إلى اللهِ أدْومُها وإن قَلَّ"، وعندما سُئلت عائشة رضي الله عنها: "هلْ كانَ رَسولُ اللَّهِ صَلَّى اللهُ عليه وسلَّمَ يَخْتَصُّ مِنَ الأيَّامِ شيئًا؟"، قالت: "لَا، كانَ عَمَلُهُ دِيمَةً، وأَيُّكُمْ يُطِيقُ ما كانَ رَسولُ اللَّهِ صَلَّى اللهُ عليه وسلَّمَ يُطِيقُ"، وحسب موقع الدرر السنِيَّة: "الدِّيمةُ في الأصلِ: المطَرُ المُستمِرُّ مع سُكونٍ بلا رَعْدٍ ولا بَرْقٍ، ثمَّ استُعمِلَ في غَيرِه؛ شَبَّهَت عَمَلَه في دَوامِه مع الاقتصادِ بدِيمةِ المَطَرِ".

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

بدأت تفريغ مواد منصة باحث في شهر 5 من سنة 2023، وأُطلقت المنصة في شهر 7 من نفس السنة. خلال هذه الفترة فرَّغت ما يقارب الـ 7,000 ساعة لـ 19 متحدِّثًا، الشهر الأول 2,130 والشهر الثاني 3,471 والشهر الثالث 1,401.

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

بعد ذلك مرّت الأيام والأسابيع والأشهر وكانت إضافة المواد مستمرة، كل شهرٍ بحسبه، فأحيانا أكثر من 10 آلاف أو 15 ألف ساعة، وأحيانا أقل من ألف ساعة في الشهر، وأحيانا أنقطع تماما لبعض الظروف كالذي حصل في شهر 10 من سنة 2023 أو شهرَيْ 3 و 4 من سنة 2024.

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

فالآن وبعد ما يقارب السنة والنصف من التفريغ، اقترب عدد المتحدثين على المنصة من 200 متحدث، وعدد الساعات تجاوز الـ 110 ألف ساعة ولله الحمد.

داوم على الأعمال ولو مع تقلُّبٍ وعدم استقرار في الكفاءة، فهذا طبيعيٌّ في الخط الأزرق، ولكنك ستلاحظ أو خطك الأحمر دائما في ازدياد وتحسُّن بإذن الله.

والسلام عليكم 👋🏻
10🔥1
خان المُبرمجين (علي فاضل)
Photo
أهمية الاختبارات 😅

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

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

بعد ذلك طلب مني صديقي الذي تحدثت عنه في هذا المنشور:
https://t.me/programmerskhan/57

طلب تجميع العلامات المرجعية الخاصة بكل قائمة تشغيل في جدول منفصل، ليسهل تتبع العلامات المرجعية بناءً على قوائم التشغيل، وبالفعل انتهيت من ذلك بتاريخ 15/11/2024.

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

بدأت صباح اليوم في العمل على هذا التعديل، وخلال العمل اكتشفت المفاجأة 😀

بدايةً، كيف أقوم بتجميع بيانات هذه الصفحة؟

في باحث يوجد جدول لقوائم التشغيل (playlists) وجدول للمواد (media) وجدول للتفريغات (cues). قوائم التشغيل تمتلك العديد من المواد والمواد تمتلك العديد من التفريغات. والعكس كذلك، فكل تفريغ ينتمي لمادة وكل مادة تنتمي لقائمة تشغيل.

عندما يقوم المستخدم بإضافة علامة مرجعية جديدة، أقوم بإضافة صفٍّ في جدول يربط المستخدمين بالتفريغات (cue_bookmarks)، وعندما يُزيل العلامة المرجعية أحذف الصف من الجدول.

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

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

عدّلت السطر كما هو موضّح في الصورة الثانية ليستخدم created_at: :desc بدلا من 'cues.medium_id, cues.start_time'، ثم راجعت السطر مِرارا لأكتشفت أنني أعرض بيانات كل المستخدمين لكل المستخدمين 🥳

وبالتجربة اكتشفت أن حدسي في محلّه، فإذا قمت بإضافة علامة مرجعية واحدة إلى أي قائمة تشغيل، ستستطيع رؤية كل العلامات المرجعية الأخرى التي وضعها باقي المستخدمين على نفس القائمة، ولكن، ولله الحمد، دون أن تعرف من هو المستخدم 😁

فقمت بإضافة where(user: current_user) لتحديد العلامات المرجعية التي يجب إظهارها والتي تخص المستخدم الحالي فقط والحمدلله حُلّت المشكلة.

ماذا نستفيد؟

لا تستعجل في تنفيذ طلبات أصدقاءك، واختبر تعديلاتك الجديدة جيدا على أكثر من حساب بأكثر من صلاحية ✌🏻

والسلام عليكم 👋🏻
5👍4
هل من الممكن تشغيل DeepSeek v3 على المعالج والذاكرة الخاصة به دون وجود معالجات رسومية (GPUs) أبدا؟

الجواب نعم، ولكن!

لدي وصول إلى جهاز بذاكرة بحجم 374GB و 48 معالجًا، فجربت تشغيل نموذج DeepSeek v3 والذي يبلغ حجمه 671 مليار مُعامل عليه من خلال Ollama كالتالي:

ollama run deepseek-v3


وكم كنت بريئًا 😂

أول ما ظهر على الشاشة بعد تنزيل النموذج كان تنبيها من Ollama يقول أن الذاكرة غير كافية لتشغيل النموذج. نعم، 374GB غير كافية 😁

لم يكن هناك أي Swap على هذا الجهاز، فأضفت 75GB إلى الـ Swap وأعدت تشغيل نفس الأمر من Ollama، فبدأت الذاكرة تمتلئ بالنموذج.

استغرق الأمر ما يقارب 20 دقيقة حتى انتهت Ollama من تحميل النموذج على الذاكرة، ثم كتبت "Hi"، فرد علي بعد 3 دقائق تقريبا "?Hello, how I can help you today"، وانتهت المحادثة وأغلقت الجهاز وعدت لما كنت أقوم به 😂

فالجواب نعم، ولكنه سيكون بطيئًا جدا.

ملاحظة: لا أدري إن كان سبب البطئ الشديد هو استخدامي للـ Swap، ولكن لم يكن لدي أي حلول.
🤣42
خان المُبرمجين (علي فاضل)
Photo
نشرت البارحة منشورًا أُشارك فيه تجربتي في تشغيل DeepSeek v3 على جهاز لا يحتوي على أي معالجات رسومية (GPUs)، يمكنك قراءته من هنا:
https://t.me/programmerskhan/77

اليوم قررت تجربة نماذج DeepSeek R1 المُقطّرة (Distilled) من نموذج DeepSeek R1 الأصلي بحجم 671 مليار مُعامل على نفس الجهاز.

تأتي النماذج المُقطّرة بأحجام 1.5 مليار و 7 مليارات و 8 مليارات و 14 مليارًا و 32 مليارًا و 70 مليار مُعامل.

بحثت في أمر اختبار النماذج ووجدت أكثر من مكتبة تقوم بهذا الأمر كمكتبة ollama-benchmark:
https://github.com/aidatatools/ollama-benchmark

فهمت كيف تعمل باستخدام Ollama وكتبت Script قصير يقوم بنفس الأمر ولكن على نماذج DeepSeek R1 المذكورة، يمكنك الاطلاع على الـ Script وتفاصيل الاختبار من هنا:
https://github.com/AliOsm/deepseek-r1-cpu-bench

كما هو موضّح في الصورة المرفقة، استطاع الجهاز إنتاج ما يقارب الـ 50 رمزا (Token) في الثانية باستخدام النموذج الأصغر، مقارنة بأكبر النماذج الذي استطاع الجهاز إنتاج ما يقارب الـ 2.2 رمزا في الثانية باستخدامه.

كما أن استهلاك الذاكرة كان يتراوح بين 1.4GB و 42.3GB من النموذج الأصغر إلى الأكبر.

الجميل أن الجهاز استطاع إنتاج ما يقارب الـ 15.5 رمزا في الثانية باستخدام نموذج 8 مليارات مُعامل مُستهلكًا 5.7GB من الذاكرة، وهو رقم جيد للاستخدام الشخصي أو لمعالجة البيانات على فترات طويلة (لدي صبر كبير على هذه الأمور 😂).

استخدمت 11 رسالة (Prompt) في الاختبار، تنقسم إلى 3 مجموعات:
- المحادثة (1)
- الأوامر (5)
- الأسئلة والأجوبة (5)

كل هذه الرسائل استعرتها من مكتبة ollama-benchmark 😁

والسلام عليكم 👋🏻
👍51🔥1
قراءة ممتعة لمن يُفكّر في تجربة Ruby on Rails 😌

https://news.ycombinator.com/item?id=42831938
3
"أريد مشروعًا لتنفيذه من باب التعلُّم وخدمة الدين/اللغة"

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

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

🔸 التعرّف على الآيات القرآنية في النصوص

كثيرًا ما نحتاج إلى التعرّف على الآيات القرآنية في نصٍّ طويلٍ أو صفحة من كتاب مثلا، فنحتاج إلى أداة (مكتبة Python، خدمة من خلال API، أو غيرها) نُعطيها النص وتخبرنا أن النص من الحرف س إلى الحرف ص هو الآية رقم ع من السورة رقم ك، ولا داعي لأن يكون "ذكاءً اصطناعيًّا"، يكفي أن يكون مجرد خوارزمية بسيطة تحل المشكلة.

🔸 التعرّف على الأحاديث النبوية في النصوص

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

🔸 أداة شاملة لتقييم التشكيل

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

🔸 شرح الشعر العربي

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

🔸 إضافة متصفحٍ لمنصة باحث

يوجد واجهة برمجية (API) لمنصة باحث ولكنها غير متاحة بشكل علني إلى الآن 😉 فإذا أردت إنشاء إضافة للمتصفح تُخبر المستخدم أن هذا المقطع موجود على باحث وتُضيف زرًّا لصفحة YouTube للانتقال إلى باحث فسأكون سعيدًا بمشاركة الواجهة البرمجية معك.

🔸 نُسخة مُحسّنة من Yamli

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

🔸 مكانٌ يجمع المشاريع الإسلامية

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

🔸 التصحيح التلقائي للنصوص

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

أقف عند هذه الأفكار حاليا، ولعل غيري يُضيف غيرها من الأفكار الهادفة لخدمة الدين واللغة.

والسلام عليكم 👋🏻
15👍1
خان المُبرمجين (علي فاضل)
"أريد مشروعًا لتنفيذه من باب التعلُّم وخدمة الدين/اللغة" كان هذا عنوانًا لأكثر من نقاشٍ خضته خلال الأيام الماضية، فقررت تلخيص الأفكار التي طُرحت لعلها تُفيد بعض الناس ويخرج للنور منها مشاريع تفيد الجميع بإذن الله. سأذكر اسم المشروع ونبذة عنه، وأنت عزيزي…
تعقيبا على منشور البارحة والذي يمكنك قراءته من هنا:
https://t.me/programmerskhan/81

وبعد اقتراح العديد من الإخوة لأفكار متعددة ومهمة، قررت إنشاء هذا المستودع على GitHub لتدوين الأفكار والملاحظات الخاصة بها بشكل مبدئي ومع الوقت قد يتحول إلى منصة لمتابعة التطوّر في هذه الأفكار والمشاريع:
https://github.com/ieasybooks/ideas

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

والسلام عليكم 👋🏻
🔥53👍2
أهمية المجتمعات البرمجية

لم أكن منخرطًا في المجتمعات البرمجية كثيرًا، خصوصا فيما يتعلق بالتقنيات التي أستخدمها كـ Ruby on Rails، ولكن تغيّر هذا الأمر خلال السنتين أو الثلاث الأخيرة، فدخلت في العديد من المجتمعات المتعلقة بالتقنيات التي أستخدمها، وكان هذا من الأسباب التي أدت إلى تطوّر مهاراتي بشكل ملحوظ.

بدأت القصة عندما اشتريت كتاب The Complete Guide to Rails Performance، وأنصح به بشدة، ومن مميزات هذا الكتاب أن للكاتب مجتمعًا خاصًّا بالكتاب، فدخلت هذا المجتمع وبدأت أسأل وأشارك تجاربي وأتعلم من الآخرين.

ثم بدأت في الدخول إلى مجتمعات أخرى كمجتمع GoRails الذي استفدت منه في أمور عديدة متعلقة بتطبيقات الهاتف لـ Rails:
https://discord.gg/NZbfhyEDs5

ومنه تعرفت على مجتمع Joe Masilotti المتخصص تحديدا في تطبيقات الهاتف لـ Rails:
https://discord.gg/gGat7WHD

ثم مجتمع مكتبة Kamal عند ظهورها واستفدت منه جدًّا في تعلّم المكتبة وحل مشاكلها:
https://discord.gg/VkQeWQJy

ومن ثم انضممت إلى المجتمع الأقرب إلى قلبي Naming Things الخاص بمطوّر مكتبة Phlex والذي يهتم بكل ما يتعلّق بلغة Ruby ودمجها بشكل أكثر مع SQLite وغيرها من الأمور غير الاعتيادية:
https://discord.gg/jP8UrXfy

كل هذه مجتمعات على تطبيق Discord، وأخرى على تطبيق Slack كمجتمع Ruby on Rails Link:
https://www.rubyonrails.link

ومجتمع Ruby DX المهتم بتحسين تجربة المستخدم للغة Ruby:
https://join.slack.com/t/ruby-dx/shared_invite/zt-2yd77ayis-yAiVc1TX_kH0mHMBbi89dA

ثم أصبحت هذه عادةً عندي، فكلما تعلمتُ تقنيةً جديدةً، انضممتُ إلى مجتمعها لعدة أسباب منها:
- التعلّم من الآخرين
- السؤال لحل المشاكل
- البحث عن الحلول في الرسائل الموجودة في المجتمع بالفعل (وهذا حدث كثيرا)

منها مجتمعات تتعلق بمحرك البحث MeiliSearch على Slack وحتى مجتمع CloudFlare على Discord، كلها كانت مفيدة وتعلمت منها عدة أمور.

فنصيحتي لكل من يستخدم تقنيةً معينةً أن يُحاول الانخراط في مجتمعاتها والتفاعل مع الأعضاء وطرح الأسئلة حول ما يُشكل عليه، فالناس في هذه المجتمعات غالبًا ما يحبون مساعدة غيرهم، بشكل مُبالغ فيه أحيانًا، حسب تجربتي (على الأقل فيما يتعلّق بـ Ruby و Rails).

والسلام عليكم 👋🏻
8👍2👏1
هل تحتاج للاحتفاظ بالـ Migrations الخاصة بقاعدة بياناتك؟

بدايةً، الـ Migration، في Ruby on Rails وغيرها، هو ملفٌّ تقوم من خلاله بتعديل هيكلية قاعدة البيانات، كأن تُضيف جدولًا جديدًا أو أن تعدّل خصائص بعض الأعمدة.

المشكلة أن هذه الملفات تكثُر بسرعة، فعلى سبيل المثال، منصة باحث، وخلال سنة ونصف من التطوير، وصل عدد هذه الملفات فيها إلى 72 ملفًّا، هذا وأنا مطوّرٌ واحد 😁

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

البارحة، وصدفةً وبدون أي ترتيب، سأل أحد الأشخاص على مجتمع Rails Performance على تطبيق Slack سؤالًا مشابهًا، يقول فيما معناه: "كيف تقومون بأرشفة ملفات الـ Migrations في مشاريعكم؟"، فتتبعت الردود لأجد أحد الأشخاص يرشّح مكتبة squasher للقيام بهذه المهمة:
https://github.com/jalkoby/squasher

المكتبة تقوم بدمج الـ Migrations بناء على تاريخ معينٍ في ملفٍّ واحدٍ، بدلًا من الاحتفاظ بكل الملفات متفرقة سنةً بعد سنة، وبكل تأكيد يوجد مكتبات مشابهة لأُطر العمل الأخرى.

أعجبتني الفكرة، وهكذا يمكننا إجابة سؤال صديقي في بداية المنشور، وكذلك نؤكّد على ما ذكرته في المنشور السابق من أهمية المجتمعات البرمجية:
https://t.me/programmerskhan/83

والسلام عليكم 👋🏻
5
خان المُبرمجين (علي فاضل)
Photo
لِكُلِّ شَيءٍ إِذا ما تَمّ نُقصانُ * فَلا يُغَرَّ بِطيبِ العَيشِ إِنسانُ

هذا كان مقال حالي البارحة مع Ruby on Rails 😁

من يقرأ منشوراتي يظن أن الله لم يخلق في أرضه قبل ولا بعد Rails، وهذه حقيقة من نواحٍ كثيرة، ولكنها كذبة أبريل من نواحٍ أخرى، ومنها ما سأتحدّث عنه اليوم، Turbo Drive وتعاملها مع JavaScript 😅

كما ذكرت في منشوراتٍ سابقة، أحد مهمات Turbo Drive أنها تُعطيك تجربة تطبيقات الصفحة الواحدة (SPA) ولكن دون الحاجة لاستخدام أُطر عمل مثل React، فهي تعترض أي طلب (Request) من تطبيقك وتحوِّله إلى طلب Ajax، ثم تقوم باستبدال جسم الصفحة القديم (Body) بالجسم الجديد القادم من رد الخادم (Response) على الطلب وتدمج رأس الصفحة القديم (Head) مع رأس الصفحة الجديد.

فكرة بسيطة تضمن من خلالها عدم اختفاء الصفحة وظهورها أمام المستخدم، مما يُعطيه انطباعًا مختلفًا عن تطبيقك، ولكن هل لاحظت أمرا؟ لا يوجد تحديث كامل للصفحة، مما يعني أن أي ملفاتٍ جديدة تُضاف إلى رأس الصفحة لن تعمل، كملفات JavaScript و CSS! فتحتاج للتعامل مع هذه الأمور بطريقة مختلفة في Ruby on Rails وفي غالب الأمر يكون التعامل معها صعبًا ومُرهقًا، أو تقوم بإيقاف Turbo Drive وتخسر كل الفوائد 😂

في سياقٍ مختلفٍ طلب مني صديقي المسلم غير الناطق بالعربية دعم Yamli في خانات البحث في منصة باحث، ولمن لا يعرف Yamli (كحالي قبل أسابيع قليلة) فهو يُمكّن المستخدم من الكتابة بالحروف الانجليزية ويقترح عليك كلماتٍ عربيةً تُقابل ما كتبته.

فمثلا، يمكنك كتابة "mhmd" و Yamli يقترح عليك "محمد"، فتضغط على زر إدخال (Enter) وتحصل على الكلمة العربية في خانة الإدخال.

عندما قرأت توثيق (Documentation) Yamli وجدت أنهم يوفّرون ملف JavaScript يمكنك إضافته إلى موقعك، ثم تقوم بإضافة Yamli إلى أي خانة إدخال موجودة في الصفحة من خلال دالة yamlify (الابداع في التسمية 😎).

أضفت الملف إلى منصة باحث ويامليفيت (آسف 😂) خانات البحث في الصفحة الرئيسية وظهرت ميزة Yamli بدون مشاكل ولله الحمد، إلى أن انتقلت من الصفحة الرئيسية إلى صفحة المتحدثين!

اكتشفت أن Yamli يقوم بتجهيز خانات الإدخال التي تريد إضافة الميزة لها عند تحميل الملف الخاص بهم أول مرة، وبما أن Turbo Drive لا يقوم بإعادة تشغيل الملف عند الانتقال بين الصفحات (لأنه لا يوجد تحديث كامل للصفحة)، فلم يقم Yamli بإضافة الميزة إلى خانات الإدخال الخاصة بالصفحة الجديدة.

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

أخيرًا، ميزات Turbo Drive كثيرة، وهذا العيب المذكور في المنشور لا يعني أنها تقنية أو فكرة سيئة، إنما تقنية أو فكرة لها عيوبها، كما لأي شيء في هذه الحياة عيوب وميزات.

والسلام عليكم 👋🏻

ملاحظة: شباب JavaScript أتمنى منكم أخذي بعطفكم 🥲
7👍1