خان المُبرمجين (علي فاضل)
542 subscribers
93 photos
9 videos
116 links
قناة أنشر فيها ما أتعلمه خلال عملي على مشاريعي الخاصة 👀
Download Telegram
قديمًا، قبل اكتشافي لاختراع يُدعى 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
خان المُبرمجين (علي فاضل)
Photo
ما هي استعلامات س+1 أو N+1 Queries 🤔 (الإصرار على التعريب 😂)

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

الأمر سهل، نحتاج لإحضار قوائم التشغيل من قاعدة البيانات باستخدام الاستعلام التالي:
SELECT * FROM playlists ORDER BY created_at DESC


ثم لكل قائمة تشغيل منها نقوم باستخدام الاستعلام التالي لحساب عدد المواد الموجودة فيها:
SELECT COUNT(*) FROM media WHERE playlist_id = {playlist_id}


مبروك، هذه هي استعلامات س+1 🥳

البيانات الأساسية والمهمة موجودة في الاستعلام الأول، ولكن احتجت للقيام باستعلام ثانٍ لكل صف من الصفوف القادمة من الاستعلام الأول لحساب عدد المواد، فأنت نفّذت استعلاما واحدًا (1) واحتجت بعده لـ (س) من الاستعلامات، وهكذا أصبحت س+1.

وتطبيقات هذا الأمر كثيرة، ولا تقف عند المثال المذكور، ولكن كيف نحل المشكلة في هذا المثال؟

في Ruby on Rails الأمر سهل جدا، تحتاج لإضافة عمود جديد في جدول قوائم التشغيل باسم media_count، وعند تعريف العلاقة بين قوائم التشغيل والمواد يمكنك إضافة الخيار counter_cache: true كما هو موضّح في الصورة.

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

تسمى هذه الميزة باسم Counter Cache وهي تعمل على العلاقات المباشرة فقط، أما إذا أردت استخدامها على العلاقات المُتعدّية، فستحتاج لاستخدام مكتبة counter_culture:
https://github.com/magnusvk/counter_culture

وبسبب شيوع هذا الخطأ في أُطر العمل المختلفة لسهولة التواصل مع قاعدة البيانات باستخدام الـ ORMs، يوجد أدوات كثيرة لاكتشاف هذا النوع من الأخطاء والتعامل معها كمكتبة bullet المختصة في تتبع هذا النوع من الاستعلامات وتنبيهك عليها:
https://github.com/flyerhzm/bullet

ومكتبة goldiloader التي تحاول حل المشكلة من جذورها من خلال جلب البيانات الإضافية المطلوبة من قاعدة البيانات في استعلام واحد، بدلا من مجرد تنبيهك:
https://github.com/salsify/goldiloader

والسلام عليكم 👋🏻
3
طلب مني صديقي إحصائية بعدد مستخدمي باحث على أنواع الأجهزة المختلفة (حاسب، هاتف، لوحي، إلى آخره) ليستفيد منها في تصميم مشروعه الذي يعمل عليه (قريبًا 🚀)، فدخلت إلى 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