خان المُبرمجين (علي فاضل)
542 subscribers
93 photos
9 videos
116 links
قناة أنشر فيها ما أتعلمه خلال عملي على مشاريعي الخاصة 👀
Download Telegram
خان المُبرمجين (علي فاضل)
Photo
تعقيبًا على منشور البارحة والذي يمكن أن تقرأه من هنا:
https://t.me/programmerskhan/38

سأل أحد الأصدقاء: "لماذا أزلت التخزين المؤقت (Caching) من منصة باحث؟"، والجواب باختصار شديد هو الانتقال من استخدام ERb للواجهات إلى مكتبة Phlex.

ذكرت مكتبة Phlex من قبل وهي عبارة عن شيئ شبيه بـ JSX للغة Ruby، حيث يمكنك بناء عناصر (Components) منفصلة للصفحات بلغة Ruby وإعادة استخدامها ثم يتحول ما كتبته من Ruby إلى HTML خلال عملية الـ Rendering، مع توفير مميزات إضافية يمكن أن تقرأ عنها في موقع المكتبة: https://beta.phlex.fun

افتراضيًّا، Rails تدعم التخزين المؤقت في ERb من خلال دالة cache وهي تهتم بإنشاء Digests لملفات الصفحات ومتابعة التغييرات التي تحصل لها وإنشاء المفاتيح (Keys) المطلوبة لتخزين واسترجاع الصفحات أو أجزاءها، ولكن هذا الأمر لا يتوفّر في مكتبات مثل Phlex و ViewComponent المُقدّمة من GitHub ولهم أسبابهم في ذلك.

فلسفة مطوّر Phlex هي أن المكتبة سريعة كفاية ولا حاجة لاستخدام التخزين المؤقت معها، فمثلا Phlex أسرع من ERb بـ 12 مرة وأسرع من ViewComponent بـ 6 مرات تقريبا حسب الاختبارات، فمع وجود هذه السرعة، إضافة التخزين المؤقت قد يكون مُضرًّا بكفاءة المكتبة مع إضافة تعقيدات لا داعٍ لها، وهذا الادعاء صحيح إجمالا، ولكن هناك تفصيل.

في البداية، عندما نقلت باحث بالكامل من ERb إلى Phlex وأطلقت الإصدار الجديد، لاحظت انخفاضًا كبيرًا في زمن الاستجابة وكان سببه الأساسي تقليل زمن تجهيز الصفحة وإرسالها للمستخدم، وهذا ما كنت أنتظره من انتقالي إلى Phlex (مع التخلص من ERb 😂، ألقِ نظرةً على الصور لتفهم الفرق)، رغم إزالتي للتخزين المؤقت بالكامل.

ولكن بعد مدة وجدت أنني أحتاج للتواصل مع قاعدة البيانات بشكل أكثر من السابق، والسبب أن بعض الاستعلامات (Queries) على قاعدة البيانات كان يُستغنى عنها لأنها تتم داخل الصفحة المخزنة بالفعل، وهنا تأتي التفاصيل المتعلقة بالتخزين المؤقت و Phlex.

بشكل عام، إذا كنت مضطرًّا لجلب البيانات من قاعدة البيانات لبناء مفتاح التخزين المؤقت فلا داعي لاستخدامه مع وجود Phlex، لأن جلب الصفحة أو أجزاءها المخزنة من Redis مثلا هو أبطأ من عمل Render لها، أما إذا كان المفتاح يعتمد على عدد محدود من البيانات وهناك استعلامات كثيرة تحصل داخل الصفحة خلال عملية الـ Rendering فوجود التخزين المؤقت مفيد وسيُسرّع العملية أكثر.

لهذا السبب، ستدعم مكتبة Phlex التخزين المؤقت مستقبلا بناء على بعض النقاشات الحاصلة في مجتمع مطوّري المكتبة على Discord.

والسلام عليكم 👋🏻
👍21
خان المُبرمجين (علي فاضل)
Photo
هل من المهم أن تشارك في المشاريع مفتوحة المصدر 🤔

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

فبدأت بمحاولة فهم السبب بنفسي أولا، ولكن لم أصل إلى نتيجة واضحة، فباحث كان يستخدم Phlex بالإضافة إلى مكتبة RubyUI، وهي بديل عن مكتبة shadcn/ui ولكن للغة Ruby، فلم أجد أي مشكلة في استخدامي للمكتبتين داخل مشروع باحث.

فتوجّهت إلى مجتمع مكتبة Phlex على Discord وبدأت نقاشًا بخصوص هذا الأمر مع ذكر طريقة استخدامي للمكتبتين وصورة من لوحة متابعة زمن الاستجابة في الموقع، ولكن لم يخطر في ذهن أحد من الموجودين حلٌّ مباشر، إلا أن النصيحة كانت: "حاول استخدام Vernier لاستخراج Flame Graphs ومنها يمكن أن تبدأ في التفتيش عن السبب".

كنت قد شاهدت محاضرة عن Vernier بالفعل، وهو عبارة عن CRuby Profiler، ولكن لم أفهم كيف يمكنني قراءة الـ Frame Graphs بشكل كبير، فحاولت ولكنني سرعان ما طلبت المساعدة من خلال مشاركة ملف الـ Profile المستخرج من Vernier مع المجتمع، مع ذكر الملاحظة الوحيدة التي تمكنت من استخراجها وهي أن دالة merge من مكتبة tailwind_merge تُستخدم بكثرة وتستهلك وقتًا كبيرا.

بعد نقاش دار في المجتمع، وجدنا أن مكتبة RubyUI تستخدم مكتبة tailwind_merge لدمج الـ CSS Classes الخاصة بالمكتبة مع الـ CSS Classes المُستخدمة من قِبل المطوّر، فانتقلنا للسؤال التالي وهو: "هل يمكننا تحسين أداء هذه المكتبة؟"، وأظن أننا تسرعنا في طرح هذا السؤال.

مكتبة tailwind_merge كانت تستخدم التخزين المؤقت أو Caching، وكانت مكتوبة بطريقة جيدة ولا يمكن أن تكون هي السبب، فانتقلنا للسؤال التالي: "هل تُستخدم مكتبة tailwind_merge بطريقة صحيحة داخل مكتبة RubyUI؟"، وهنا كانت المشكلة!

صحيح أن مكتبة tailwind_merge تقوم بعمل تخزين مؤقت للنتائج عند استخدام دالة merge لكي لا تُعيد الحسابات أكثر من مرة لنفس المدخلات، ولكن هذا التخزين المؤقت على مستوى الكائن الواحد من نوع TailwindMerge::Merger، والمشكلة كانت أن مكتبة RubyUI في كل مرة تقوم بتعريف كائن جديد من نوع TailwindMerge::Merger، فلا يُستفاد من التخزين المؤقت!

بمجرد تعريف الكائن من نوع TailwindMerge::Merger كثابت في مكتبة RubyUI والبدء في إعادة استخدامه، حُلّت المشكلة ولله الحمد، ويمكنك الاطلاع على التعديل من هنا:
https://github.com/ruby-ui/ruby_ui/commit/2b770cae877e096237c324670fa9bf7fdd7d3d30

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

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

ملاحظة: ذكرت في منشوري السابق أن زمن الاستجابة كان أفضل مع Phlex، ولكن بعد حل هذه المشكلة.
11
نفحاتٍ نبويّة قد أقبلت بالسّعد والسّرور🌿

فإنّ الأرواح قد وجدت ريح طيْبَةَ وساكنها؛ فهاجت لواعج النّفس لمجلسٍ تُتلى فيه سنّة الحبيب المصطفى ﷺ، ولعلّ أيّام الوصال قد دنت!🤍

🤍فنحن على موعدٍ نرتقبه ونعدّ له العُدّة، فقد أقبلت الدّورة العلميّة المكثّفة:
«هِمَمْ 3 - لعام ١٤٤٦ هـ»

لتجمعنا على موائد⬇️

ســـنــن الــنّــسائـيّ

◀️مع الشَّيخ إبراهيم رفيق الطَّويل

🔘من يوم السّبت 09 شعبان 1446 هـ إلى يوم الثّلاثاء 19 شعبان 1446هـ.

📌وجاهيًّا: مجمّع مكين-قرب إشارات وادي صقرة - « موقع المجمّع »

🔘توجد أماكن مُخصَّصة للنّساء.

💻كما يُمكنكم المُتابعة عبر البثّ المُباشر فيسبوك | يوتيوب

إجازة بالسّند المتّصل إلى المصنّف لمن يحضر المجالس كاملة 📚!

🔘استمارة التّسجيل بالدّورة:
https://forms.gle/4wwKAG9YDNkMjm288

🟢تكاتف أهل غراس لتغطية تكاليف الدّورات العلميّة المُكثّفة أمر ضروريّ لاستدامتها؛ لذلك نحن بانتظاركم لتغطية تكاليف أجور المكان، والتّنسيقات، وكفالة الكتب للمحتاجين، والضّيافة والإعلان.. يمكنكم التّواصل عبر البوت:
https://t.me/gherasal3elm_bot

🌐 تـابعوا قناة أكاديميّة غراس العلم للاطّلاع على كلّ جديد:
https://t.me/gherasal3elm

شاركوا الخير ودلّوا عليه، فالدّال على الخير كفاعله🌱

#همم3
#أكاديمية_غراس_العلم✔️
Please open Telegram to view this post
VIEW IN TELEGRAM
3
لا يعني كونك مبرمجا ألا تهتم بالعلم الشرعي، شمّر عن ساعديك وأقبل ❤️
11❤‍🔥1
أسعار خوادم المعالجات الرسومية (GPU) مرتفعة، هل أنت بحاجتها لكل مشاريعك 🤔

عندما قررت إضافة البحث بالمعنى في المكتبة الشاملة في منصة باحث، كان السؤال الذي يراودني: "أين سأقوم بتحويل صفحات كتب المكتبة الشاملة إلى Embeddings؟"، فالخوادم المُزوّدة بالمعالجات الرسومية سعرها مرتفع، ومنصة باحث وكافة مشاريع مبادرة الكتب المُيسّرة مشاريع مجانية/غير ربحية.

بدايةً، المكتبة الشاملة هي مكتبة إلكترونية تضم أكثر من 8,400 كتاب، بمجموع صفحات يتجاوز 7 ملايين صفحة، وتصل التحديثات لهذه الكتب بشكل دوري سواء بإضافة الكتب الجديدة أو تصحيح الأخطاء الموجودة في الكتب القديمة، فالحاجة للمعالج الرسومي حاجة مستمرة لتحديث الـ Embeddings أولا بأول.

ففكرت في استغلال المعالج الرسومي الذي أمتلكه في المنزل وهو الصغير الكبير RTX 3060 😂، ولكن بدون الحاجة لمعالجة الصفحات على حاسبي الشخصي ثم نقل الـ Embeddings إلى خادم باحث، إنما تمكين خادم باحث من الوصول إلى حاسبي الشخصي واستخدامه.

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

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

كتبت Service صغيرة باستخدام إطار عمل Sinatra (وهو ما يقابل Flask ولكن للغة Ruby) تستقبل النص الذي أريد تحويله إلى Embeddings وتُعيد لي الـ Embeddings، وهي عبارة عن ملفين فقط يمكنك الاطلاع عليهم من هنا:
https://gist.github.com/AliOsm/762146228177312642855e081794b90a

بعد ذلك بدأت تشغيل الـ Service الجديدة على حاسبي وجربت استخدامها من خادم باحث ونجح الأمر والحمدلله، ولكن بعد تجربة العديد من الطلبات كان الأمر بطيئًا والمشكلة الأساسية كانت في سرعة الاتصال عندي في المنزل، وهنا يدخل صديقي الثاني في القصة 😎

تحدثت معه عن الأمر فاقترح إعادة التجربة ولكن من منزله نظرًا لسرعة الاتصال لديه، وتبرّع بحاسبه الشخصي ليكون هو مستضيف الـ Service التي تحوّل النص إلى Embeddings، فأرسلت له الملفات وطريقة تشغيلها وقام بتثبيت Tailscale عنده وجربنا وفعلا كانت الطلبات أسرع بكثير!

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

نستفيد من هذه القصة أن الأصدقاء نعمة، ولا داعي لزيادة تكاليف مشاريعك خصوصا إذا كانت مشاريع جانبية مجانية/غير ربحية 😁

والسلام عليكم 👋🏻
7👍3😁2
قديمًا، قبل اكتشافي لاختراع يُدعى Linux، وقبل طلاقي البائن لـ Windows (باستثناء الألعاب)، في أواخر عام 2016، واجهت مشكلةً في تثبيت إحدى مكتبات Ruby.

كتبت حينها سؤالًا على مستودع المكتبة أستفسر فيه عن المشكلة، ثم تمكنت من حلها خلال ساعة، والحمد لله:
https://github.com/bcrypt-ruby/bcrypt-ruby/issues/142

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

المفاجأة كانت عندما قرأت اسم صاحب المشكلة والحل واكتشفت أنه... أنا! كانت واحدة من أسعد لحظات حياتي البرمجية وأكثرها ضحكًا.

تذكرت هذا السؤال اليوم، فدخلت على صفحته ووجدت أن الكثيرين استفادوا منه، والحمد لله.
😁103
خان المُبرمجين (علي فاضل)
Photo
عن مُحركات البحث (هل من ترجمات أفضل؟)

الميزة الأساسية التي تقوم عليها منصة باحث هي البحث (اسم على مسمى 😁)، وكان السؤال عند بداية إنشاء المنصة: "ما هو محرك البحث الذي سأستخدمه؟".

كان الخيار الأكثر انتشارا هو ElasticSearch، ولكن لم يكن لدي الوقت الكافي لبدء تعلمه، خصوصا بعد القراءة عنه أكثر وكلام الناس عن صعوبة إدارته في المستقبل. الخيار الثاني كان محركات البحث القائمة على قواعد البيانات كمكتبة pg_search والتي تستخدم قاعدة بيانات PostgreSQL لتوفير ميزة البحث في النصوص، ولكن لم أكن مقتنعا بالحلول المعتمدة على نفس التقنية لتوفير ميزات مختلفة.

فرزقني الله بهذا المقطع الذي يشرح فيه Chris Oliver، مؤسس موقع GoRails (دعاية غير مدفوعة للأسف 😂) كيفية استخدام محرك بحث جديد نسبيا مع Rails اسمه MeiliSearch:
https://gorails.com/episodes/how-to-use-meilisearch-rails

شاهدت المقطع وأضفت MeiliSearch إلى الـ DevContainer الخاصة بباحث (تحدثت عن الـ DevContainers في منشور سابق يمكن قراءته من هنا: https://t.me/programmerskhan/8) ثم ثبَّتت مكتبة meilisearch-rails في المشروع وبدأت التجربة، ولم أتوقع أن تكون بهذه السهولة!

كل المطلوب كان إضافة Module في الـ Model الذي أريد تمكين البحث فيه من خلال كتابة include MeiliSearch::Rails، ثم تعريف الخصائص التي أريد استخدامها في الاستعلامات سواء كانت خصائص للبحث أو للتصفية أو للتظليل، والصورة فيها مثال من منصة باحث، تحديدا من الـ Model الخاص بالتفريغات.

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

حاليا MeiliSearch يحتوي على أكثر من 21 مليون مستند بين تفريغات الدروس وعناوينها والأحاديث وغيرها، بحجم كلي للنصوص يتجاوز الـ 10GB، واستهلاك ذاكرة لا يتجاوز الـ 8GB، واستهلاك للمساحة التخزينية لا يتجاوز الـ 90GB، وسرعة استجابة أقل من ثانية عند ضغطه على 10 آلاف طلب في الدقيقة (الطلب يتضمن جلب البيانات من قاعدة البيانات أيضًا).

كل هذا و MeiliSearch يعمل على نفس الخادم الذي تعمل عليه قاعدة البيانات والمنصة نفسها ومشاريع أخرى 😅

من المميزات اللطيفة عند استخدام MeiliSearch مع Rails إضافة خيار enqueue: true الذي يُضيف البيانات الجديدة لمحرك البحث في الخلفية، وهذا أمر مهم لمنصة باحث فأنا أقوم بإضافة الكثير من التفريغات دفعة واحدة ومعالجتها بشكل مباشر كان يُحدث بعض أخطاء الـ Timeout.

هل هو مثالي لهذه الدرجة؟ بالتأكيد لا! مقارنة مع أشياء مثل ElasticSearch، فـ MeiliSearch لا يوفّر إمكانيات عالية فيما يتعلّق بالـ Stemming على سبيل المثال، وغيرها من الأمور المتعلقة بتحليل النصوص.

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

أخيرا، MeiliSearch يوفّر أكثر من 20 مكتبة رسمية لاستخدامه مع مشروعك، فسواء كنت تكتب باستخدام Ruby أو Rust أو NET.، فيمكنك استخدامه بسهولة إن شاء الله، فهو عبارة عن ملف Binary واحد.

والسلام عليكم 👋🏻
2👍2
خان المُبرمجين (علي فاضل)
Photo
إذا كنت تعمل في شركة GitHub، لا تقرأ من فضلك 😅

تحتوي منصة باحث على أكثر من 380 ألف مادة والعدد في ازدياد، بين فتاوى ودروس ومحاضرات وبرامج تلفزيونية لأكثر من 175 عالم وشيخ وداعية. الملفات الصوتية غير المرئية MP3 الخاصة بهذه المواد يصل حجمها لأكثر من 8TB والحجم يزداد يوما بعد يوم.

منذ اليوم الأول، قررت قرارين:
- تضمين المواد من منصة YouTube مباشرة في باحث
- الاحتفاظ بنسخة صوتية من أي مادة تُضاف إلى باحث

ولكن بعد فترة بدأت المشاكل تظهر. YouTube "لا يحب" بعض المواد الموجودة عنده ويحذفها ويُعيد الناس نشرها وهكذا. مثال ذلك مواد الشيخ عبدالعزيز الطريفي والمهندس أيمن عبدالرحيم فرّج الله عنهما.

فأصبحت المواد على باحث تُعرض كنص بدون مادة مرئية أو مسموعة يُستفاد منها استفادة حقيقية، وكنت أفكر دائما: "أين يمكن أن أرفع المواد الصوتية بدون تكلفة وأعرضها على منصة باحث مرة أخرى؟"، بما أن المواد موجودة عندي في الأساس.

أحد الخيارات كان موقع archive.org، ولكن هو أيضًا عليه بعض القيود وقد تُحذف منه المواد، غير أن الموقع نفسه رُفعت عليه العديد من القضايا. بعد تفكير لأيام، تذكرت GitHub (وقت الـ 😂).

جرّبت رفع ملف صوتيٍّ على GitHub وتضمينه في صفحة HTML ونجح الأمر، ثم حاولت التحكّم بمُشغّل المادة نفسه من خلال JavaScript لتحديد المكان الذي يجب أن يبدأ التشغيل منه وغيرها من الأمور ونجح الأمر كذلك.

بعد ذلك غصتُ قليلا في قيود GitHub نفسه فيما يتعلق بحجم الملفات وحجم المستودعات ككل. فكان أكبر حجم للملفات يمكن رفعه هو 100MB ولكن من الأفضل أن لا يتجاوز 50MB، وحجم المستودع يمكن أن يصل إلى 5GB ومن الأفضل أن لا يتجاوز 2GB.

بناءً على ذلك، قررت إنشاء حسابٍ جديدٍ على GitHub باسم baheth-platform وكتبت بعض الـ Bash Scripts التي تقوم بضغط الصوتيات وترفعها إلى الحساب الجديد بشكل تلقائي من خلال إنشاء مستودع لكل قائمة تشغيل تُحذف من YouTube.

أعدت رفع 80 قائمة تشغيل تخص الشيخ عبدالعزيز الطريفي والمهندس أيمن عبدالرحيم ثم عدّلت منصة باحث لأستطيع تغيير مصدر قوائم التشغيل بسهولة من YouTube إلى GitHub والحمدلله نجحت الفكرة.

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

يمكنك تجربة هذه القوائم من خلال صفحة الشيخ عبدالعزيز الطريفي على منصة باحث:
https://baheth.ieasybooks.com/speakers/عبدالعزيز-الطريفي

أو من صفحة المهندس أيمن عبدالرحيم:
https://baheth.ieasybooks.com/speakers/أيمن-عبدالرحيم

وهذا رابط حساب المنصة على GitHub لمن أحب الاطلاع:
https://github.com/baheth-platform?tab=repositories

وأخيرا، أرجو عدم التبليغ عن الحساب في GitHub 😅، والسلام عليكم 👋🏻
5😁42👍2
لا تسأل لتسأل، فقط اسأل

قد تبدو جملة غريبة في البداية، ولكنها عميقة وتمثل مشكلة يقع فيها الكثيرون عند التواصل.

لا داعي لأن ترسل رسالة تقول فيها "مرحبا، هل من الممكن أن أسألك سؤالا؟" أو "هل لديك معرفة بمجال معين؟ لدي سؤال فيه".

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

وهذا الأمر ينطبق على بيئة العمل والحياة الإجتماعية كذلك.

شخصيا، أتخوف من الرد على الرسائل التي تحتوي على "مرحبا" فقط في بيئة العمل، أو عندما يرسل أحد الأصدقاء: "هل أنت مشغول خلال العطلة؟".

كل هذه الأساليب تضع حاجزا بين مستلم الرسالة وبين أن يرد عليها.

للاستزادة:
https://dontasktoask.com/ar
https://nohello.net
4
خان المُبرمجين (علي فاضل)
Photo
نحنُ مسؤولون.

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

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

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

عموما، وبعد هذه المقدمة العاطفية، نعود للأمور التقنية.

مشروع تخرجّي من الجامعة كان هدفه بناء نموذج ذكاء اصطناعي لتشكيل النصوص العربية، والحمدلله أنجزنا المشروع ونشرنا عددا من النماذج والأوراق البحثية عن الأمر وكان إنجازا حقيقيا وقتها، وكان هذا بين عامي 2018 و2019.

فقررت إعادة استخدام النموذج ودمجه مع منصة باحث لتوفير الميزة التي طلبها الأخ، وكان هذا لأسباب منها:
- النماذج الجديدة تعتمد على معماريات معقدة تحتاج خادما قويا مثل Transformers.
- النموذج الخاص بنا تدرّب في غالبه على نصوص عربية فصيحة، وهذا أنسب لمتطلبات باحث.
- حجم النموذج صغير جدا، 30MB فقط.

فكان أمامي خياران، الأول بناء Service جديدة باستخدام FastAPI والتعامل معها من خلال API للتشكيل، وهذا الحل الأمثل والأكثر كفاءة، والثاني، وهو الذي طبّقته، استخدام مكتبة TensorFlowJS لتشكيل النصوص باستخدام النموذج على متصفح المستخدم مباشرة.

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

كل ما كان علي فعله هو تثبيت مكتبة tensorflowjs ثم تحويل النموذج المُنشأ باستخدام Keras (من 5 سنوات 😂) إلى JavaScript باستخدام الأمر التالي:
tensorflowjs_converter --input_format keras kera_model.h5 js_model


ثم رفعت ملفات النموذج المُحوّل (10MB بعد التحويل) إلى CloudFlare R2، وأنشأت Web Worker هدفه تحميل النموذج والتشكيل في Thread منفصلة عن الـ Thread الأساسية لـ JavaScript، يمكنك الاطلاع عليه من هنا وإعادة استخدامه:
https://baheth.ieasybooks.com/workers/diacritizationWorker.js

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

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

يمكنك الاطلاع على عملنا في التشكيل من خلال هذه المستودعات:
https://github.com/AliOsm/arabic-text-diacritization
https://github.com/AliOsm/shakkelha
https://github.com/AliOsm/shakkelha-website

والسلام عليكم 👋🏻
👏54👨‍💻2👍1
خان المُبرمجين (علي فاضل)
Photo
قليلٌ من التنظيف لن يضر 😁

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

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

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

إطار عمل Ruby on Rails يستخدم مكتبة browser بشكل افتراضي للتحقق من بعض ما يتعلّق بالمتصفحات، كإصدار المتصفح ونوع نظام التشغيل والجهاز الذي يعمل عليه، اعتمادًا على الـ User Agent، يمكنك الاطلاع على مكتبة browser من هنا:
https://github.com/fnando/browser

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

وماذا استفادت الأمة من هذا التعقيد الإضافي؟

اختبرت التعديل الجديد على 3 مواد من خلال Google Chrome Dev Tools وموقع DebugBear لمقارنة حجم الصفحات قبل وبعد التعديل.

المادة الأولى ومدتها 77 دقيقة، نزل حجم صفحتها من 55.1KB إلى 51.1KB حسب Google Chrome Dev Tools، وحسب موقع DebugBear نزل حجم الصفحة الكامل بعد الضغط من 71.1KB إلى 42.3KB.

المادة الثانية ومدتها 144 دقيقة، نزل حجم صفحتها من 117KB إلى 99KB حسب Google Chrome Dev Tools، وحسب موقع DebugBear نزل حجم الصفحة الكامل بعد الضغط من 150KB إلى 83.2KB.

المادة الأخيرة ومدتها 151 دقيقة، نزل حجم صفحتها من 111KB إلى 94.2KB حسب Google Chrome Dev Tools، وحسب موقع DebugBear نزل حجم الصفحة الكامل بعد الضغط من 143KB إلى 79.8KB.

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

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

والسلام عليكم 👋🏻
🔥21👍1😭1
مما يُعشَق في اللغة العربية الشعر، ومما يُعشَق في الشعر قصائد الزهد والتزكية، ومنها:
- نونية البُستي: https://youtu.be/yRu-P1Xz6bI
- لامية ابن الوردي: https://youtu.be/oWzo-SsqOVY
- تائية الإلبيري: https://youtu.be/HEYIcr8ODcI

وأغلب قصائد أبو العتاهية مثل:
- يسلم المرءَ أخوه: https://youtu.be/NAmc74KK7JI
- إن السلامة أن ترضى بما قضي: https://youtu.be/-bg5Ld09uW4

والشعرُ عامةً صديقٌ جيِّدٌ أثناء العمل، وفيه نوعٌ من التغيير. هو خيرٌ لك من الأغاني والموسيقى. فعلى أقل تقدير، ستتعلم كلماتٍ ومعانيَ جديدةً في اللغة العربية 😁
6💯6