خان المُبرمجين (علي فاضل)
543 subscribers
93 photos
9 videos
116 links
قناة أنشر فيها ما أتعلمه خلال عملي على مشاريعي الخاصة 👀
Download Telegram
خان المُبرمجين (علي فاضل)
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
لغة Ruby واستهلاك الذاكرة 😅

مشروع منصة باحث كان أول مشروعٍ كبيرٍ لي أكتبه بإطار عمل Ruby on Rails بعد سنوات من استخدامه في مشاريع مختلفة صغيرة أخرى.

بعد إطلاق منصة باحث، كنت مهتما بمتابعة استهلاكها للمعالج والذاكرة وتحسين الأداء، ومن الملاحظات التي كنت ألاحظها بشدة أن استهلاك الذاكرة يبدأ صغيرًا على الخادم ثم يزداد مع مرور الوقت، فقد يبدأ بـ 1.5GB ويصل إلى 20GB بعد أسابيع من تشغيل المنصة.

فكنت أُعيد نشر المنصة (Re-deploy) على فترات متباعدة لإعادة الذاكرة إلى نظام التشغيل وتخفيف الضغط عن الخادم، ولكن لماذا كان يحدث هذا الأمر؟

لغة Ruby مكتوبة بلغة C، وهو ما يسمى CRuby أو MRI اختصارًا لـ Matz's Ruby Interpreter و Matz هو اسم مُنشئ اللغة، الياباني Yukihiro Matsumoto.

يوجد نُسخ أخرى من لغة Ruby مكتوبة بـ Java كـ JRuby و TruffleRuby، ولكن هذا ليس موضوعنا.

النسخة الأصلية تستخدم لغة C، مما يعني أنها تستخدم malloc بشكل افتراضي لحجز الذاكرة، وحسب فهمي البسيط المتواضع فطريقة عمل malloc ليست الأفضل، ويوجد العديد من البدائل لـ malloc مثل jemalloc و tcmalloc و mimalloc.

الجميل في هذه البدائل أنها بدائل مباشرة، لا تحتاج إلى الكثير من الإعدادات (على الأقل في حالة jemalloc)، فكل ما تحتاجه هو تثبيت مكتبة libjemalloc2 على نظام تشغيل Linux ثم إضافة مسارها إلى متغير LD_PRELOAD، على سبيل المثال:

export LD_PRELOAD="$(echo /usr/lib/*/libjemalloc.so.2)"

بعد استبدال malloc بـ jemalloc في منصة باحث استقر استهلاك الذاكرة عند 4.8GB، أكثر من نصفها (2.5GB تحديدًا) مُستهلكة من قِبل نموذج الذكاء الاصطناعي المستخدم في المنصة.

بكلمات أخرى، استقر استهلاك الذاكرة عند 2.3GB، وهذا بعد أشهر من تشغيل المنصة دون إعادة نشرها.

الخبر الجميل أنه وبداية من Rails 7.2 هذه الإعدادات تأتي جاهزةً مع المشروع من ناحية تثبيت jemalloc على الـ Docker image الخاصة بالمشروع، وكذلك استخدامه في docker-entrypoint.

يمكنك قراءة هذه المقالة في المقارنة بين malloc وبدائلها:
https://lf-hyperledger.atlassian.net/wiki/spaces/BESU/pages/22156632/Reduce+Memory+usage+by+choosing+a+different+low+level+allocator

والسلام عليكم 👋🏻
🔥62👍1
ما هو الحد الذي يجب عليك تعلمه في مجال البرمجة التنافسية (Competitive Programming)؟

عندما بدأت الدراسة الجامعية، لم أكن أعرف عن وجود شيء يسمَّى "البرمجة التنافسية"، غير أني وبالصدفة البحتة وجدت موقع HackerRank وبدأت حل بعض المسائل الموجودة عليه والمخصصة للغة Ruby، كان هذا في غالب ظني سنة 2016.

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

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

ولكن خلال هذه الرحلة كان منا من اهتم بالبرمجة التنافسية بشكل كبير جدا وترك ما سواها وكان منا من أخذ منها الشيء القليل وركّز على غيرها من الأمور والقليلون من توسَّطوا وأدَّعي أنني كنت من الفئة المتوسطة (الغرور ↖️).

خلال 4 سنوات في الجامعة كنت أحاول الجمع بين البرمجة التنافسية وتعلّم أمورٍ أخرى من تطوير المواقع وتطبيقات الهاتف وحتى تطبيقات سطح المكتب. ما كنت أتعلمه في البرمجة التنافسية كان أساس التطوّر في باقي المجالات من ناحية التفكير وطريقة الكتابة.

فنصيحتي لمن يسأل دائما هل أتعلم البرمجة التنافسية وأصرف فيها وقتي؟ فالجواب نعم ولكن باعتدال. حاول أن تصل إلى مرحلة تستطيع فيها حل أسئلة A و B و C من موقع CodeForces بأريحية.

هذا الحد جيد بشكل عام في تطوير طريقة تفكيرك وتحسين أداءك في مقابلات العمل، وبشكل موازٍ حاول تعلّم تطوير تطبيقات الهاتف أو المواقع (حسب رغبتك وما تميل إليه نفسك).

وإذا أردتُ وضع قائمة بالمواضيع التي يحسن بك تعلمها فستنقسم القائمة إلى 3 أجزاء:
- التقنيات
- هياكل البيانات
- الخوارزميات

من الجزء الأول يمكنك تعلّم:
- Cumulative Sum
- Frequency Array
- Two Pointers
- الأعداد الأولية وما يتعلّق بالرياضيات بشكل عام

من الجزء الثاني يمكنك تعلّم:
- Pair
- Stack
- Queue
- Vector
- Set
- Map
- Priority Queue
- Trie
- Segment Tree

ومن الجزء الثالث يمكنك تعلّم:
- Binary Search
- Recursion
- Graph (DFS, BFS, Dijkstra, Minimum Spanning Tree, and Topological Sort)
- Dynamic Programming

بعد هذه الأساسيات، يمكنك التعمّق في أمور أخرى إذا وجدت لديك القدرة والوقت مثل:
- Disjoint Set
- Meet in the Middle
- Ternary Search
- 2D Cumulative Sum
- Maxflow

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

وإذا سألت عن المصادر، فقد شرحت جزءًا كبيرا من هذه المواضيع في قائمة التشغيل هذه:
https://youtube.com/playlist?list=PLxg8EAtENLXJ1o8SF0wKO7ZRRAacZbHn5

كما يمكنك الاستفادة من المصدر الأساس في هذا المجال باللغة العربية، قناة أخونا مصطفى سعد:
https://www.youtube.com/c/ArabicCompetitiveProgramming

أما المواقع المتخصصة فهي كثيرة منها:
- https://codeforces.com
- https://atcoder.jp
- https://onlinejudge.org
- https://www.spoj.com
- https://leetcode.com

والسلام عليكم 👋🏻
11🔥1
طرح أحد الإخوة سؤالًا ملخصه: "ماذا أنشر وكيف أنشر؟".

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

على سبيل المثال، كان منشور البارحة منشورًا تقنيًّا تحدّثت فيه عن استهلاك الذاكرة في لغة 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