خان المُبرمجين (علي فاضل)
543 subscribers
93 photos
9 videos
116 links
قناة أنشر فيها ما أتعلمه خلال عملي على مشاريعي الخاصة 👀
Download Telegram
خان المُبرمجين (علي فاضل)
Photo
إعادة فتح الـ Classes في Ruby 🤔

من الأشياء اللطيفة في لغة Ruby واللي بتفتح المجال للكثير من الأمور هي إمكانية إعادة فتح الـ Classes وإضافة أشياء جديدة لها مثل الدوال.

على سبيل المثال، الـ Class الخاص بالـ Strings ما فيه دالة ?palindrome في لغة Ruby، ولكن في الصورة الأولى أعدت فتح الـ Class (رغم انه Class جاي من اللغة نفسها) وأضفت له الدالة الجديدة واستطعت استخدامها على كائن جديد من نوع String.

هذا الأمر واللي يسمى بمُصطلح يصعب علي تعريبه "Monkey Patching"، مستخدم بكثرة في مكان زي Rails لتوفير تحسينات كثيرة للمطوّر، من أبسطها على سبيل المثال إضافة دالة inquiry للـ String Class واللي إذا طبقتها على نص مثلا "production" بتعطيك كائن جديد من نوع StringInquirer واللي ممكن تسأله عن قيمته النصية بشكل مباشر زي ماهو موضح في الصورة الثانية بدلا من مقارنة نص بنص.

ممكن تشوف كيف الإضافة صارت من هنا:
https://github.com/rails/rails/blob/v8.0.1/activesupport/lib/active_support/core_ext/string/inquiry.rb

وتشوف كيف الـ StringInquirer Class بيشتغل من هنا:
https://github.com/rails/rails/blob/v8.0.1/activesupport/lib/active_support/string_inquirer.rb

وهو يستخدم ميزة الـ method_missing اللي حكيت عنها في منشور سابق واللي ممكن تقرأه من هنا:
https://t.me/programmerskhan/17

أخيرا، بالرغم من أن إعادة فتح الـ Classes (أو الـ Monkey Patching) يوفر مرونة كبيرة لإضافة وتعديل اللغة ومكتباتها، إلا أن لها بعض العيوب اللي لازم تاخذها بعين الاعتبار.

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

والسلام عليكم 👋🏻
1👍1
خان المُبرمجين (علي فاضل)
Photo
من مشاكل التخزين المؤقت (أو الـ Caching) 😁

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

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

تطبيق الميزة كان سهل من ناحية قاعدة البيانات والـ Backend، ولكن لما وصلت لمرحلة تعديل واجهة المستخدم كانت المفاجأة، صفحة عرض المادة في عليها تخزين مؤقت (مارح أحكي Caching في المنشور 🙂).

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

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

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

بهذه الطريقة التخزين المؤقت شغّال والمستخدم قادر يشوف إشاراته المرجعية والعصافير تزقزق والسماء صافية والسلام عليكم 👋🏻

ملاحظة: بعد فترة أزلت التخزين المؤقت كله من باحث 😂 ولكن نفس الكود لساته موجود.
1👍1🔥1
خان المُبرمجين (علي فاضل)
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