تا حالا با متد avg تو لاراول کار کردید یا می‌دونستید چه کاربردی داره؟

این متد میانگین یه فیلد مشخص رو حساب میکنه..

فرض کنید یه محصول داریم و چندتا review براش ثبت شده، هر review شامل این فیلدهاست:

[
  ['rating' => 4, 'comment' => 'خوب بود', 'approved' => true],
  ['rating' => 5, 'comment' => 'عالی 👌', 'approved' => true],
  ['rating' => 3, 'comment' => 'می‌تونست بهتر باشه', 'approved' => false],
]

اگه با Collection کار می‌کنید:

$avgRating = $product->reviews
    ->where('approved', true)
    ->avg('rating');

و اگه با Query Builder:

$avgRating = $product->reviews()
    ->where('approved', true)
    ->avg('rating');

هم Collection و هم Query Builder، میانگین رو به‌سادگی محاسبه می‌کنن:

// خروجی هر دو:
4.5

یه واقعیتی که باهاش روبه‌رو شدم این بوده که
زندگی وقتی شرطی میشه، یواش‌یواش از دست میره.

اینکه همه‌چی رو بذاری برای وقتی که اوضاع بهتر شد،
وقتی خیالت راحت‌تر شد،
وقتی فلان چیز درست شد.

واقعیت اینه که اوضاع هیچ‌وقت کامل درست نمیشه.
زندگی هم منتظر نمیمونه.
یا الان زندگی می‌کنی، یا همش میذاریش برای بعد.

اگه قراره چیزی شروع بشه،
احتمالاً همین امروز زمان خوبیه..

زندگیتونو شرطی نکنید :)

اگه توی سایت ثبت‌نام کنی،
یه آواتار گرادینتی به‌صورت خودکار برات ساخته میشه 👀

برای این کار از avatars.laravel.cloud استفاده می‌کنم.
آواتار با یه seed ثابت ساخته میشه
(مثلاً id یا هر مقدار یونیک)،
پس برای هر کاربر همیشه همونه.

البته من تصویر رو دانلود هم می‌کنم و روی سرور خودم ذخیره می‌کنم
نه اینکه مستقیم به سرویس خارجی لینک بدم.

$seed = $user->id;

https://avatars.laravel.cloud/{$seed}?vibe=sunset

چند تا vibe آماده هم داره:
sunset، ocean، daybreak، bubble،
forest، fire، crystal، ice، stealth

ساده و خوشگل ✨

💡 Dynamic Import در React چیه و چرا مهمه؟

به جای اینکه همه‌ی کامپوننت‌ها رو یکجا توی bundle اصلی بفرستید، می‌تونید lazy load کنید: فقط وقتی کاربر نیاز داشت، بارگذاری بشه.
کد به چند بخش تقسیم میشه و هر بخش فقط وقتی نیاز باشه بارگذاری میشه.

چطوری کار می‌کنه؟

const LazyComponent = React.lazy(() => import('./HeavyComponent'));

<Suspense fallback={<LoadingSpinner />}>
  <LazyComponent />
</Suspense>

🎯 کاربردها:

  • کاهش حجم bundle اولیه → لود سریع‌تر صفحه

  • Route-based splitting → هر صفحه فقط وقتی کاربر رفت اونجا لود میشه

  • Conditional load → مودال‌ها و بخش‌های سنگین فقط موقع نیاز

نکات مهم:

  • همیشه با Suspense استفاده کنید

  • fallback می‌تونه Skeleton loading یا Spinner باشه

  • برای خطاها از Error Boundary استفاده کنید

💡 مثال عملی:

// مودال فقط وقتی کاربر کلیک کرد لود میشه
const handleClick = async () => {
  const Modal = await import('./HeavyModal');
  // نمایش مودال
};

این کار باعث میشه:

  • کاهش حجم اولیه

  • بهبود Lighthouse score

  • تجربه کاربری روان‌تر

⚠️ فقط کامپوننت‌های سنگین رو lazy کنید، زیاده‌روی نکنید.

📚 کتاب‌های خوب این توانایی رو دارن که زاویه نگاه ما به دنیا رو تغییر بدن.

وقتی یه کتاب‌ رو می‌خونیم و بهش عمل می‌کنیم، تازه می‌فهمیم که چقدر می‌تونستیم متفاوت فکر کنیم و رشد کنیم.

📖 کتاب‌هایی مثل ۴۸ قانون قدرت یا اثر مرکب نمونه‌های خوبی هستن.

خوندن این کتاب‌ها می‌تونه باعث بشه:

  • تصمیم‌گیری‌هامون دقیق‌تر بشه ✅

  • دیدمون نسبت به روابط و موقعیت‌ها شفاف‌تر بشه 👀

  • انگیزه و اعتماد به نفس برای حرکت به سمت اهداف واقعی‌مون بیشتر بشه 🚀

در واقع، خوندن و عمل کردن با هم، به ما کمک می‌کنه که نسخه‌ی بهتری از خودمون بشیم ✨

اگه بخواید بر اساس مقادیر مختلف یه متغیر، کارای مختلف انجام بدید،

به جای if یا switch طولانی، از Object Lookup استفاده کنید: یعنی یه object بسازید که هر key = کار مورد نظر باشه، بعد صداش کنید.

const action = 'delete';
const actions = {
  create: () => console.log('ایجاد شد'),
  update: () => console.log('به‌روز شد'),
  delete: () => console.log('حذف شد')
};
(actions[action] || (() => console.log('نامشخص')))();

✅ حالا برای اضافه کردن یه حالت جدید، فقط کافیه یه key جدید به object اضافه کنید.

یکی از مواردی که کتاب Clean Code برای کدنویسی تمیز بهش تأکید میکنه اینه که اسم‌ها باید واضح باشن! اسم متغیر، پارامتر، فانکشن یا کلاس باید دقیقاً بگه که کارش چیه.

مثال‌ها:

// متغیر بد
const n = 10;
// متغیر خوب
const unreadNotificationsCount = 10;

// پارامتر بد
function add(p) {
  cart.push(p);
}

// پارامتر خوب
function addToCart(product) {
  cart.push(product);
}

// فانکشن بد
function f(items) { return items.map(i => i.p * i.q); }
// فانکشن خوب
function calculateCartTotal(cartItems) {
  return cartItems.reduce((total, item) => total + item.price * item.quantity, 0);
}

// کلاس بد
class M {}
// کلاس خوب
class ShoppingCart {}

اسم درست = کد تمیز + نگهداری راحت‌تر ✨

یه ترفند کاربردی ترمینال براتون آوردم :)

با Brace Expansion می‌تونی چند فولدر و فایل رو با یه دستور بسازی:

mkdir -p project/{css,js,images} 
touch project/css/{style,reset}.css
touch project/js/{app,utils}.js

اون -p در mkdir باعث می‌شه اگر مسیر وجود نداشت، خودش ساخته بشه.

یه توضیح درباره این بخش از SpaceDev بهتون بدم :)

اینجا قراره چیزایی که براتون جالب و مفید میتونه باشه رو باهاتون به اشتراک بذارم!

میتونه شامل:

  • معرفی ابزارها و تکنولوژی‌های جدید

  • نکات فنی و ترفندهای برنامه‌نویسی

  • مقالات تخصصی و منابع یادگیری

  • گزیده‌ای از کتاب‌های مفید

  • محتوای آموزشی و سرگرمی مرتبط

  • تجربیات شخصی من

هدفم اینه که اینجا یه منبع مفید برای یادگیری و پیشرفتتون باشه.

با هم بهتر می‌شیم ❤️

با جمله‌ی معروف برنامه‌نویس‌ها شروع می‌کنیم:

Hello World! 🌍✨

البته من هنوز در حال دیباگ کردن ارتباطم با World هستم! 😅