Mohcin Space
261 subscribers
46 photos
13 videos
8 files
64 links
{فَأَمَّا الزَّبَدُ فَيَذْهَبُ جُفَاءً ۖ وَأَمَّا مَا يَنفَعُ النَّاسَ فَيَمْكُثُ فِي الْأَرْضِ} [الرعد: 17]

خواطر في الدين و الدنيا و هندسة البرمجيات في محاولة لإصلاح نفسي ولعلني اجعل لنفسي أثرا في إصلاح الاخرين.. على قلتهم، لعلنا نلقى الله بهذا.
Download Telegram
Forwarded from Mohcin
السلام عليكم،

نظرة عامة عن ال Unit Testing باللغة العربية. 

المعدات بسيطة و الاعداد و التقديم كان هذا الصباح بسرعة، فتقبلوا منا و لعله ينفع ولو قليلا.

و الحمد لله.

https://www.youtube.com/watch?v=VlfnKO9oczw
السلام عليكم.

Simple understanding of long polling:

- Client sends request
- Server holds the connection open
- Server waits for data to be available
- Server responds when data is available or the timeout is reached

Simple PHP example!


#BackEndDevelopment #PHP #تعلم_مستمر #تعلم #برمجة #هندسة_البرمجيات
1
مجرد تغيير بسيط في إعدادات الاتصال بقاعدة البيانات يمكنه تحسين أداء تطبيقك بشكل كبير في التطبيقات المبنية على ال PHP؟

PDO::ATTR_PERSISTENT => true

تعني أن PHP تستخدم persistent connections.

ما هي persistent connection؟

في الاتصال العادي بقاعدة البيانات: كل مرة يتم تشغيل سكريبت الإتصال يتم فتح اتصال جديد مع قاعدة البيانات وبعد الانتهاء يتم غلقه.

يعني:

Open-->operate-->close

في الاتصال المستمر (persistent connection): ال PHP تحتفظ بالاتصال مفتوح حتى بعد انتهاء السكريبت. وعند الحاجة، تعيد استخدام نفس الاتصال بدلاً من فتح اتصال جديد.

أهمية او مبتغى إستخدامها: بدون persistent connection يتم فتح وغلق الاتصال في كل مرة وهذا يستهلك وقت وموارد أكثر.. Cpu...

باستخدام persistent connection يتم إعادة استخدام الاتصال المفتوح مما يجعل التطبيق أسرع خصوصاً مع عدد مستخدمين أكبر.

ملاحظة مهمة:

إستخدام هذه الميزة في التطبيقات فقط يحافظ على الاتصال بقاعدة البيانات و لا يخزن معلومات ال query التي تتصل بقاعدة البيانات.

يمكنك أيضا استخدام هذه الميزة في الفريمووركس المبنية على ال php ايضا.


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

اللهم علمنا و انفعنا بما علمتنا.

#PHP #backendengineering
ما هو ملف ال Bootstrapping في تطبيقات ال PHP ولماذا هو مهم؟

عندما تبدأ في بناء تطبيق PHP عموما، تحتاج إلى وجود مكان موحد لتهيئة كل أجزاء التطبيق قبل أن تبدأ في التعامل مع ال requests القادمة من المستخدمين، يعني كنقطة إلتقاء،، هنا يأتي دور ملف الـ Bootstrapping.

ملف الـ Bootstrapping هو الملف الذي:

- يقوم بتحميل وتجهيز البيئة اللازمة للتطبيق.

- يجمع كل الإعدادات والملفات الأساسية مثل الاتصال بقاعدة البيانات، تحميل ملفات الـ Helpers، قراءة ملفات الإعدادات (Config)،، وتجهيز كل شيء يحتاجه التطبيق ليبدأ بالعمل او ال loading اذا اردنا أن نكون دقيقين.

- يتم استدعاؤه عادة مرة واحدة فقط داخل ملف الـ index.php،، والذي بدوره يعتبر نقطة الدخول (Entry Point) للتطبيق أو الموقع.

أهمية ملف Bootstrapping:

- تنظيم الكود: بدلاً من أن تضع كل التحميلات والإعدادات في كل ملف أو في ال index.php،، تجمعها كلها في مكان واحد مرتب و تستدعيها بعدُ عن طريق تحميل هذا الملف..

- سهولة الصيانة: إذا احتجت لتغيير شيء في الإعدادات أو إضافة مكتبات جديدة، لن تحتاج أن تبحث في كل السكربتات، يكفي تعديل ملف Bootstrapping.

- تهيئة البيئة: يمكنك ان تحدد من هنا إذا كنت في بيئة تطوير (development) أو بيئة إنتاج (production).

- التحكم بال requests: بعد التهيئة، يتم تمرير الطلب إلى نظام التوجيه (Routing) و غالبا يكون ملف منفصل،، وهو الذي يحدد أي كود/طلب ينفذ.

غالباً يوجد هذا الملف في المجلد الرئيسي (Root Directory) للتطبيق،، أو داخل مجلد مخصص مثل bootstrap/.

كيف يتم استخدامه؟

- المستخدم يرسل طلب.

- السيرفر (مثلاً Apache أو Nginx) يوجه الطلب إلى index.php.

- ال index.php يقوم بتحميل ملف Bootstrapping.

- ملف ال Bootstrapping يجهز كل الملفات الضرورية و يجمعها معا.

- يتم توجيه ال requests و الحصول على ال response.

مثال implementation بسيط:

// index.php
require_once 'bootstrap.php';

// prepare the request
$router = new Router();
$router->handle($_SERVER['REQUEST_URI']);

// bootstrap.php
require_once 'config/database.php';
require_once 'helpers/functions.php';
require_once 'routes/web.php';

كيف يتم ذلك في الفريموركات التي تقوم عالم ال php حاليا مثل Laravel؟

في Laravel، هناك مجلد bootstrap/ وملف app.php الذي يقوم بتحميل التطبيق وتجهيزه.
وأيضاً يتم استخدام ما يسمى بـ Service Providers لتهيئة أجزاء محددة من التطبيق بطريقة منظمة وقابلة للتوسيع.. ال service providers هلته هي نسخة متطورة و جميلة من مفهوم ال bootstrapping في ال PHP.

يعني غالبا لن تحتاج لان تهتم بهذا في حالة إشتغتلك بفرييموورك معين، لكن فهمه سيفرق في طريقة تعاملك معه و حلاوة استعماله.

اللهم علمنا و إنفعنا و غيرنا بما تعلمنا.

#PHP #softwareengineering #Fundamentals #backenddevelopment
1
السلام عليكم, الحمد لله أشارك أول حزمة Laravel قمت بنشرها، وذلك لسببين رئيسيين:

- أولًا، للمساهمة في دعم المجتمع العربي ببرمجيات مفتوحة المصدر.
- ثانيًا، للتعمق أكثر في تقنيات Laravel.

هذه الحزمة عبارة عن أداة لتحسين السيو (SEO) باللغة العربية لمواقع وتطبيقات Laravel، وتشمل إنشاء الوسوم التعريفية (Meta tags) وتوليد Slug باللغة العربية بشكل تلقائي.

الحزمة بسيطة وفعّالة، وتهدف إلى جعل المواقع العربية المبنية بـ Laravel أكثر توافقًا مع محركات البحث.

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

رابط Packagist: https://packagist.org/packages/mohcin/laravel-arabic-seo
رابط GitHub: https://github.com/MohcinBN/laravel-arabic-seo

سأقوم قريبًا بربط التحديثات التلقائية بين GitHub وPackagist. وسأستمر في مشاركة آخر التحديثات حول هذه الحزمة بشكل دوري.

دعواتكم.

#Laravel #openSource #PHP
🔥31
ال Recursion، ما هي؟ نظرة عامة و فهم عام!، -من الاساسيات-

ال Recursion هي تقنية مفيدة لحل المشاكل عن طريق تقسيمها إلى base case و recursive case.

تقنيا؛ هي لما تقوم دالة function بالنداء على نفسها داخل الكود. من أشهر الأمثلة على استخدامها هي طريقة/تقنية divide-and-conquer، اللي تُستخدم كثير في حل المشاكل المعقدة بطريقة ذكية و سريعة.

لكن لو نسيت تحدد base case، ممكن الكود يدخل في infinite loop ويوقف التطبيق تماما.
مثال بسيط يوضح المشكلة:

function countdown($number) {
echo $number . "\n";
countdown($number - 1);
}

countdown(20);


الكود أعلاه سيستمر في إستدعاء نفسه إلى ما لا نهاية.. لأنه لا يتوفر على شرط يوقف الـ recursion.

الحل: استخدم الـ base case

function countdown($number) {
if ($number <= 0) {
return;
}
echo $number . "\n";
countdown($number - 1);
}

في هذا المثال:

if ($number <= 0) { return; } ==> the base case

countdown($number - 1); ==> recursive case.

أنا استخدمت early return بدل if/else لأن القراءة أوضح (خيار شخصي).

الـ recursion من الناحية التقنية تستخدم نفس مفهوم الـ loops، ولا تعطيك أداء أعلى، لكن في بعض الحالات تكون أوضح وأسهل للفهم، خاصة لو كنت تتعامل مع هياكل متكررة أو المشاكل المعقدة و الضخمة.

#PHP #Recursion #ProgrammingTips #DX #CleanCode #Algorithms
ال scalar values في لغة ال PHP هي نوع من data type وهي قيم ثابته غير متغيرة و غير قابلة للتقسيم او التفويق، ليست كال arrays او ال objects.

وفي ال php هنالك اربع انواع من هذه الtypes.

int (integer)
float
String
Boolean

#PHP
الكونستراكتر (constructor) هو method خاصة تُنفذ تلقائيًا في كل مرة تنشئ فيها instance جديد من الكلاس الذي تعمل عليه. 

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

مثال بسيط:

class Database {
    public function __construct() {
        echo "connection has been established";
    }
}

كل ما تعمل instance جديد، الكونستراكتر يشتغل تلقائيًا. 

$database = new Database()

السذر البرمجي فوق سيقوم باخراج او طبع:

"connection has been established" 

#PHP #SoftwareDevelopment #Fundamentals 
2
عند استخدام Laravel Factories في اختباراتك، احرص على التمييز بين make() و create()، فالأمر بالغ الأهمية في سياق اختبارات قواعد البيانات.

- حالة استخدام:
ترغب في اختبار إمكانية إنشاء Category جديدة:

it('can create a category', function () {
$categoryData = CategoryFactory::new()->make()->toArray();

$response = $this->post(route('category.store'), $categoryData);

$this->assertDatabaseHas('categories', [
'name' => $categoryData['name'],
'slug' => $categoryData['slug'],
]);
$response->assertStatus(302);
expect(Category::count())->toBe(1);
});

هذا الاختبار سيؤدي إلى نتيجة خاطئة Assertion Failure في الغالب،، وذلك لأن make() تُنشئ Collection دون حفظه في قاعدة البيانات، ومع استخدام RefreshDatabase تُفقد البيانات بعد عملية إعادة التوجيه التي يقم بها ال Route.

الحل: استبدل make() بـ create():

$categoryData = CategoryFactory::new()->create()->toArray();

- ال make() تُنشئ ال Collection فقط دون حفظه في قاعدة البيانات.
- ال create() تُنشئ Collection وتُخزّنه في قاعدة البيانات مباشرة.

#Laravel #Factories #PHP #Backend #TDD #programming
إنشاء قاعدة بيانات خاصة للاختبارات هو من أفضل الممارسات أثناء تطوير تطبيقات عموما، حيث يضمن عدم التأثير على بياناتك الحقيقية ويوفر بيئة نظيفة لتجربة الكود واكتشاف الأخطاء.

في laravel إليك كيف تقوم بذلك:

الخطوات:
إنشاء قاعدة بيانات جديدة للاختبارات،

كيف؟

انشاء و تعديل ملف .env.testing ليحتوي على إعدادات قاعدة البيانات الجديدة، الذي ستكون قد أنشأتها. لا تحتاج لان تملئها بأي table، ال php artisan migrate --env=testing ستقوم اوتوماتيكيا بملأ قاعدة بيانات الاختبارات بال migrations الموجودة لديك.

ما الذي تكسبه من هذه الطريقة؟

- عزل بيانات الاختبار عن بيانات التطوير والإنتاج.

- تشغيل الاختبارات بأمان دون القلق من حذف أو تعديل بيانات حقيقية.

- تسريع وتسهيل عملية تصحيح الأخطاء

- إنشاء بيئة مخصصة للاختبار يمكن إعادة ضبطها بسهولة

#Laravel #TDD #testing #php
👍3👌1
الـ Eager Loading في أي ORM (Object-Relational Mapping) هو أسلوب لتحسين الأداء عند جلب البيانات المرتبطة (relations) من قواعد البيانات. يُستخدم لتقليل عدد ال queries التي تُنفذ، ويمنع مشكلة الـ N+1 queries.

غالبًا ما يُستخدم Eager Loading لاسترجاع بيانات من جدول رئيسي مع العلاقات المرتبطة به، والتي قد تكون مثلاً من خلال جداول Pivots في العلاقات من نوع many-to-many.

مثال:

بدلًا من تنفيذ query مثل:

FROM posts
INNER JOIN category_post ON posts.id = category_post.post_id
INNER JOIN categories ON categories.id = category_post.category_id
WHERE posts.status = 'published';


يمكنك في Laravel استخدام Eager Loading بهذه الطريقة:

Post::with('categories')->where('status', 'published')->get();


وإذا كنت تريد فقط جلب الـ Posts التي لها Categories تحقق شرطًا معينًا، يمكنك استخدام whereHas Clause:

$query->where('name', 'like', '%PHP%');
})->with('categories')->get();


- الـwith() تستخدم في Laravel للـ Eager Loading.
- الـwhereHas() تستخدم ل filter النتائج بناءً على شروط داخل العلاقة.
- الفكرة ليست اختصار Query معقدة فقط، بل تحسين الأداء وتجنب التكرار غير الضروري في الاستعلامات.. وجعلها readable

#Laravel #PHP #EagerLoading #SQL #ORM
لقد استخدمت beforeEach() في طريقي لاكتشاف PestPHP في بعض مشاريع التعلم، وهو مفيد حقًا،، خصوصا عندما تحتاج إلى تكوين مخصص لبعض الاختبارات (custom configuration).

Docs: https://pestphp.com/docs/pest-spicy-summer-release#content-describe-blocks

#testing #PHP
منشور لكل شركة او مطور يبنون منتجا عربيا مبنيا على PHP/Laravel

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

دوافعي لهذا:

- المساهمة في المشاريع العربية التقنية الجادة.
- تقوية مهاراتي عمووما في هندسة البرمجيات.
- التعلم المستمر

المرجوا مشاركة هذا المنشور لعله ينفعني و ينفع غيري.

#Laravel #PHP #opensource #non_profit
8