<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Peyman</title>
        <link>https://virgool.io/feed/@Peymanfazeli</link>
        <description>از برنامه نویسی مینویسم،سعی میکنم مفاهیم سختش رو جوری که خودم یادمیگیرم توضیحشو بذارم شاید به درد کسی خورد.چون به جاوااسکریپت علاقمندم مثالهام بیشترشون حول جاوااسکریپت میچرخن</description>
        <language>fa</language>
        <pubDate>2026-04-15 01:35:05</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>Peyman</title>
            <link>https://virgool.io/@Peymanfazeli</link>
        </image>

                    <item>
                <title>تغییر بزرگ Android 16 در حالت Edge-to-Edge و راه‌حل برای React Native</title>
                <link>https://virgool.io/@Peymanfazeli/%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D8%A8%D8%B2%D8%B1%DA%AF-android-16-%D8%AF%D8%B1-%D8%AD%D8%A7%D9%84%D8%AA-edge-to-edge-%D9%88-%D8%B1%D8%A7%D9%87-%D8%AD%D9%84-%D8%A8%D8%B1%D8%A7%DB%8C-react-native-vlewzeklhkuy</link>
                <description>اندروید ۱۶ (API سطح ۳۶) یه تغییر اساسی آورده که شاید در نگاه اول ساده به‌نظر بیاد،ولی واقعاً تأثیر زیادی روی ظاهر و رفتار اپ‌هامون می‌ذاره — مخصوصاً برای ما که با React Native کار می‌کنیم.بیاین باهم ببینیم دقیقاً چی عوض شده، چرا مهمه، و چطور می‌تونیم باهاش کنار بیایم.💡 داستان از کجا شروع شد؟از اندروید ۱۵ (API 35) گوگل تصمیم گرفت که اپ‌ها باید edge-to-edge بشن.یعنی محتوای اپ از بالا تا پایینِ واقعی صفحه (زیر نوار وضعیت و نوار ناوبری) کشیده بشه.ولی اون موقع یه راه فرار وجود داشت — اگه توی تم اپ می‌نوشتی:&lt;item name=&quot;windowOptOutEdgeToEdgeEnforcement&quot;&gt;true&lt;/item&gt;می‌تونستی بگی:&quot;نه گوگل! من نمی‌خوام محتوای اپم تا لبه بره، بذار پایینش فاصله باشه.&quot;اما حالا توی Android 16 گوگل گفته:تمومه. دیگه نمی‌تونی از edge-to-edge فرار کنی.اون attribute به‌طور کامل حذف و بی‌اثر شده.📱 Edge-to-Edge یعنی چی دقیقاً؟یعنی اپت کل صفحه رو می‌گیره — از زیر نوار وضعیت تا زیر gesture bar (نوار پایین گوشی).خود سیستم UI مثل نوار پایین یا بالای گوشی روی محتوای تو می‌افته، نه اینکه براش فضا نگه داره.یه نگاه تصویری:قدیما (Android 13 و پایین‌تر):+--------------------------+
| Status Bar (24px)        |
|--------------------------|
| App Content              |
|--------------------------|
| Navigation Bar (48px)    |
+--------------------------+
الان (Android 16):+--------------------------+
| Status Bar (overlay)     |
|--------------------------|
| App Content (زیر status bar) |
|--------------------------|
| Gesture Bar (overlay)    |
+--------------------------+
یعنی محتوای اپت تا ته صفحه کشیده می‌شهو اگه خودت فاصله‌ی لازم رو ندی، مثلاً متن یا دکمه‌هات ممکنه برن زیر gesture bar.⚙️ چرا این موضوع مهمه برای React Nativeتوی React Native خیلی وقت‌ها برای تشخیص ارتفاع صفحه از این دو استفاده می‌کنیم:Dimensions.get(&#039;screen&#039;)
Dimensions.get(&#039;window&#039;)
قبلاً فرق بین این دوتا معمولاً ارتفاع نوار ناوبری (Navigation Bar) بود.اما از اندروید ۱۶ به بعد، چون اپ تا لبه می‌ره، این دوتا یکی می‌شن.یعنی این تیکه کد:const screenHeight = Dimensions.get(&#039;screen&#039;).height;
const windowHeight = Dimensions.get(&#039;window&#039;).height;
const navBarHeight = screenHeight - windowHeight;
دیگه به‌جای ۴۸ یا ۲۴، عدد صفر برمی‌گردونه 😅و در نتیجه کلی از تنظیمات ظاهری‌مون مثل bottom sheet یا modal اشتباه کار می‌کنن.🧠 راه‌حل:  یه Helper بنویسمن برای اینکه این مشکل رو توی کل پروژه به‌صورت یکدست حل کنم، یه ساختار مرکزی طراحی کردم.اول باید ارتفاع نوار وضعیت (StatusBar) و نوار ناوبری (NavigationBar) رو بگیریم:NAVIGATION_BAR_HEIGHT: initialWindowMetrics?.insets?.bottom,
STATUS_BAR_HEIGHT: StatusBar.currentHeight,بعد دو بخش اصلی توی فایل کانفیگ ساختم:SCREEN_METADATA → اطلاعات مربوط به وضعیت صفحه و دستگاه (مثل notch، fullscreen و API level)OffsetCalculator → تابعی که با توجه به نوع کامپوننت و موقعیت (بالا/پایین) مقدار فاصله رو محاسبه می‌کنه🧱 مرحله ۱ — تعریف Screen Metadata{
  API_LEVEL: 36,
  SCREEN_METADATA: {
    HAS_NOTCH: DeviceInfo.hasNotch(),
    STATUS_BAR_HEIGHT: StatusBar.currentHeight,
    OS_NAVIGATION_BAR_HEIGHT: initialWindowMetrics?.insets?.bottom,
    IS_FULL_SCREEN:
      API_LEVEL &gt; 34
        ? initialWindowMetrics?.insets?.bottom &lt; 48
        : true,
  },
}این اطلاعات به من کمک می‌کنه تا در همه‌جا بدون نگرانی از جزئیات دستگاه، به‌صورت یکدست با layout کار کنم.⚙️ مرحله ۲ — ساخت Offset Calculatorحالا یه تابع نوشتم که دوتا  ورودی می‌گیره:component: اسم بخشی از اپ (مثلاً drawer، tabbar، chat و غیره)section: کدوم قسمت (بالا یا پایین)نمونه ساده‌ش:export default function OffsetCalculator(component = &#039;&#039;, section = &#039;bottom&#039;) {
  const { API_LEVEL, SCREEN_METADATA } = AppConfig;
  const { HAS_NOTCH, IS_FULL_SCREEN, OS_NAVIGATION_BAR_HEIGHT } = SCREEN_METADATA;
  let offset = 0;

  switch (component) {
    case &#039;drawer&#039;:
      offset = section === &#039;top&#039;
        ? (HAS_NOTCH ? AppSizes[15] : 0)
        : (IS_FULL_SCREEN ? AppSizes[15] : AppSizes[45]);
      break;
    case &#039;tabBarContainer&#039;:
      if (API_LEVEL &gt; 34) {
        offset = IS_FULL_SCREEN
          ? -OS_NAVIGATION_BAR_HEIGHT / 1.5
          : OS_NAVIGATION_BAR_HEIGHT / 1.2;
      } else {
        offset = IS_FULL_SCREEN
          ? -OS_NAVIGATION_BAR_HEIGHT * 2.5
          : -OS_NAVIGATION_BAR_HEIGHT * 1.2;
      }
      break;
    // ... و همین‌طور برای سایر کامپوننت‌ها
  }

  return offset;
}حالا هر جای اپ (از Splash گرفته تا Chat و Drawer)، فقط کافیه این تابع رو صدا بزنم تا فاصله مناسب خودش رو حساب کنه.🚀 مزایای این روش✅ فقط یک نقطه مرکزی برای تنظیم Offsetها✅ راحت برای آپدیت در نسخه‌های آینده Android✅ سازگار با گوشی‌های دارای Notch یا بدون اون✅ یکپارچگی کامل بین Android 14، 15 و 16✅ دیگه لازم نیست برای هر کامپوننت جداگانه safe area بنویسی💭 جمع‌بندیتغییر Edge-to-Edge در Android 16 فقط یه تغییر ظاهری نیست — یه تحول ساختاری در نحوه تعامل اپ با سیستم UI محسوب میشه.با مدیریت برنامه‌نویسی‌شده و متمرکز Offsetها، می‌تونی اپ React Native خودت رو در برابر نسخه‌های آینده هم آینده‌نگر و مقاوم کنی.دفعه بعدی که دیدی یه دکمه یا تب‌بار چسبیده به Gesture Bar، نترس 😄فقط OffsetCalculator رو صدا بزن!</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Tue, 04 Nov 2025 13:57:37 +0330</pubDate>
            </item>
                    <item>
                <title>چرا پیچ گوشتی تو جیب نگه داشتن ایده بدیه (و چطور این مشکل رو تو کامپیوتر حل کنیم!)</title>
                <link>https://virgool.io/@Peymanfazeli/%DA%86%D8%B1%D8%A7-%D9%BE%DB%8C%DA%86-%DA%AF%D9%88%D8%B4%D8%AA%DB%8C-%D8%AA%D9%88-%D8%AC%DB%8C%D8%A8-%D9%86%DA%AF%D9%87-%D8%AF%D8%A7%D8%B4%D8%AA%D9%86-%D8%A7%DB%8C%D8%AF%D9%87-%D8%A8%D8%AF%DB%8C%D9%87-%D9%88-%DA%86%D8%B7%D9%88%D8%B1-%D8%A7%DB%8C%D9%86-%D9%85%D8%B4%DA%A9%D9%84-%D8%B1%D9%88-%D8%AA%D9%88-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-%D8%AD%D9%84-%DA%A9%D9%86%DB%8C%D9%85-pmiyhj7dimkq</link>
                <description>بعضی کارها انقدر ساده‌ان که انجام دادنشون مشکلی نداره، اما وقتی مجبور میشی روزی ده بار انجامشون بدی، رسماً روان آدمو بهم می‌ریزن. 😵‍💫مثلاً فرض کن پیچ گوشتی لازم داری، ولی هربار باید از ته خونه بری برش داری و برگردونی (مثلا توی اتاقت که انتهای خونست و از توی کمد دیواری دوم سمت راست )برش داری بیاری استفاده کنی و بعدش برش گردونی سرجاش . مثلا: تو آشپزخونه نیاز به پیچ گوشتی داری پس گردش بیخودی اول، بعد از ده دقیقه توی پارکینگ نیاز به پیچ گوشتی داری پس گردش بیخودی دوم،بعد از نیم ساعت تو ماشینت نیاز به پیچ گوشتی داری پس گردش بیخودی سومو...هر بار که این اتفاق میفته، یه &quot;گردش بیخودی&quot; رقم می‌خوره!حالا این فقط یه مثال فیزیکیه. تو دنیای کامپیوتر هم دقیقاً همین ماجرا رو داریم. باید هر بار برای اجرای یه ابزار یا استفاده از یه API، مسیر طولانی یا کلید رو دستی وارد کنیم. خسته‌کننده‌س، نه؟ 😬فرض کن می‌خوای توی پروژه‌ات از ابزارهای مختلف مثل Android Emulator یا Node.js استفاده کنی. هر بار که بخوای این ابزارها رو اجرا کنی، باید مسیر کاملشون رو بنویسی. مثلاً برای اجرای Android Emulator، باید چیزی شبیه این تایپ کنی: C:\Users\YourName\AppData\Local\Android\Sdk\emulator\emulator -avd Pixel_4_API_33حالا اگه ده بار نیاز باشه که از ابزار Emulator استفاده بشه که شبیه ساز اندروید مربوط به Pixel_4 رو برات اجرا کنه که پوست آدم کنده میشه چون خیلی طولانیه و هر بار نوشتنش واقعاً خسته‌کننده می‌شه. حالا مشکل اینجاست که اگر این مسیر تغییر کنه یا پروژه به سیستم دیگه منتقل بشه، دوباره باید همه جا این مسیر رو اصلاح کنی.ولی نگران نباش! راه‌حلش رو داریم: متغیرهای محیطی!کافیه بیای این مسیر طولانی رو یک بار به متغیر محیطی (مثل PATH) اضافه می‌کنی. مثلاً در ویندوز مسیر C:\Users\YourName\AppData\Local\Android\Sdk\emulator رو به متغیر PATH اضافه می‌کنی.وقتی این کار رو کردی، می‌تونی فقط با نوشتن دستور زیر توی ترمینال یا powershell یا ... ، بدون نیاز به مسیر کامل، Emulator رو اجرا کنی:emulator -avd Pixel_4_API_33مثال دیگه ای هم هست:فرض کن توی پروژه‌ای نیاز به یک کلید API داری (مثل کلید Google Maps). اگر این کلید رو مستقیم توی کد بذاری، این مشکلات پیش میاد:اگر کدت رو روی گیت (Git) آپلود کنی، کلیدت لو میره.اگر بخوای محیط پروژه رو تغییر بدی (تست، توسعه یا پروداکشن)، باید هر بار کلید رو دستی توی کد عوض کنی.راه‌حل اینه که کلید رو به یک متغیر محیطی مثل API_KEY اضافه کنی. بعد توی کدت به‌جای نوشتن مستقیم کلید، از این متغیر استفاده می‌کنی:const apiKey = process.env.API_KEY</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Wed, 25 Dec 2024 20:13:04 +0330</pubDate>
            </item>
                    <item>
                <title>برنامه نویسی، قیمه ها تو ماست ها، و تجربه...</title>
                <link>https://virgool.io/@Peymanfazeli/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%82%DB%8C%D9%85%D9%87-%D9%87%D8%A7-%D8%AA%D9%88-%D9%85%D8%A7%D8%B3%D8%AA-%D9%87%D8%A7-%D9%88-%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-llb7sygsl2mn</link>
                <description>این نوشته صرفا تجربه شخصی من از مشکلیه که برام پیش اومد شما میتونین زرنگ تر باهوش تر و باسواد تر از من باشین و توی کارتون دچار این مشکل نشیناز اونجایی که تعداد کتابخونه ها و پلاگین هایی که توی برنامه نویسی به کمکمون میان انقدر زیاده که به نظر غیر قابل شمارش میاد ولی طبیعتا بعضی از اونها خیلی معروف میشن مثل Eslint که احتمالا اگر دلتون بخواد کدتون تر و تمیز باشه محاله که اسمش رو نشنیده باشین و انقدری جدی و سختگیر وامیسته بالاسر کدتون انگار که یه معلم خیلی جدی داره ایراداتونو میگیره حتی کوچکترین موارد رو هم بهتون اخطار میده اگه فاصله کمو زیاد بذارین زیر همون قسمت به صورت خط چین بهتون اخطار میده و هزاران مورد دیگه از طرفی اگه برنامه نویس وب باشین و با Javascript سر و کله زده باشین میدونین که یکی از ویژگیهاش که اوایل به عنوان نقطه قوتش شناخته میشد الان به طرز عجیبی توی دسته بندی نقاط ضعفش محسوب میشه و اون هم اینه که متغیرهای شما نیازی به اینکه نوع داده مشخص داشته باشن ندارنولی خب این افسانه بعد از گسترده شدن این زبان و همچنین بوجود اومدن کتابخونه ها و فریمورک های متنوع دیگه ای مثل vue , angular, react, node  و .... که هم فرانت و هم بکند دولوپر ها ازشون بی بهره نیستن تبدیل شد به یک سری عذاب ادامه دار که وسط کار میدیدی که برنامه ای که براش کلی وقت گذاشتی و اجراش کردی مرد و یه صفحه سفید اومد بالا و اصطلاحا crash کرد حالا چرا؟ چون یکی از متغیر هات که باید عدد میگرفت رشته گرفته 😒حالا این مرض چطوری درمان میشد؟ به عنوان یه برنامه نویس از جلو توی ری اکت باید یه بسته نرم افزاری نصب میکردی به اسم Proptype که بعدتوی کامپوننتی که توسعه دادی و نوع داده ای اون پراپ هایی که کامپوننتت از بقیه کامپوننت ها میگیره رو توش تعریف میکردی اما این راه حل جلوی بروز مشکل رو نمیگرفت عملا یچیزی مثل مسکن بود ولی درمان نبود و از اونجایی که بهترین درمان پیشگیریه جهان رفت به سمت توسعه جاوا اسکریپت برمبنای &quot; نوع داده ای&quot; که عملا وارد تایپ اسکریپت شدیم.اینکه دقیقا typescript چی هست و چیکار و میکنه و چیا نیاز داره که در این مقال نمیگنجد ولی  تعریف عمومیش همینه که همون جاوااسکریپته که باید نوع داده ای رو مشخص کنی و اگر نکنی و یا اگر متغیرت رشته ای باشه بیای بهش عدد بدی همونجا کلی ارور و ... میگیری و میفهمی داری اشتباه میزنیاما Typescript چه ربطی به Eslint داشت؟درموارد خیلی نادر پیش میاد که این دوتا باهم سازگار نیستن هر کدومو که فعال میکنی اون یکی غیر فعال میشهقضیه آشپز که دوتا شد غذا یا شور میشه یا بی نمکبرای من هم این اتفاق افتاد و یکی دوروزی گشتم دنبال یه کتابخونه خوب که بتونم مشکل رو حل کنم،  اگه برای شما هم این اتفاق افتاد که بعد از نصب Typescript، دیگه ارور Eslint نگرفتین بدونین اونقدری حرفه ای نشدین که Eslint ارور ها تون رو نگیره و اون وسط یه تداخلی پیش اومده که باید رفع شه 😊چطوری؟ با نصب typescript-eslint/eslint-plugin  و typescript-eslint/parser  عملا این دوتا کار رو براتون درمیارن و دوباره با ارور های Eslint مواجه میشین</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Thu, 28 Nov 2024 16:50:41 +0330</pubDate>
            </item>
                    <item>
                <title>تراوشات ذهنی در باب چالش، امید، قهوه</title>
                <link>https://virgool.io/@Peymanfazeli/%D8%AA%D8%B1%D8%A7%D9%88%D8%B4%D8%A7%D8%AA-%D8%B0%D9%87%D9%86%DB%8C-%D8%AF%D8%B1-%D8%A8%D8%A7%D8%A8-%DA%86%D8%A7%D9%84%D8%B4-%D8%A7%D9%85%DB%8C%D8%AF-%D9%82%D9%87%D9%88%D9%87-u905v3x3fge1</link>
                <description>خیلی از اوقات که توی زندگی دچار روز مرگی میشیم، از شرایط موجود ناراحتیم و غر میزنیم و دنبال یه راه حلی برای ایجاد یک تغییر توی موقعیتمون هستیم تصمیم میگیریم پامونو از منطقه امنمون بیرون بذاریم خب در نظر اول خیلی تصمیم خوبیه و چرا که نه؟ ولیمنطقه امنمون چی میتونه باشه؟میتونه رابطه ای که درگیرشیم، شغلی که توشیم حتی جایی که زندگی میکنیم باشه، خیلی هیجان انگیزه که به امید یه تغییر خونمون رو عوض کنیم و مستقل شیم، رشته ای که بهش خیلی هم علاقه نداریم رو رها کنیم و بریم پی چیزی که حس میکنیم رسالت ما توی این دنیاست رو انجام بدیم از شغلمون بیایم بیرون و بدوییم سمت شغلی که برای دی ان ای کوفتی ما ساخته شده و اصلا اگه من هستم به این دلیله که اون کار مخصوص رو انجام بدم  اما زهی خیال باطل...چرا؟ چون دنیا واقعا اینقدرا هم رنگی رنگی نیست چون ما فکرمیکنیم که اماده تغییر شرایط هستیم و سختی ها از دور کوچیک به نظر میان میدونی من فکر میکنم زندگی کلا همین افت و خیز هاست یعنی صبح بلند شی بری یه مساله ای رو حل کنی که شرایط پیش اومدن مساله بزرگ تر برات بوجود بیاد و عملا توی یک چرخه حل مشکل کوچیک برای ایجاد شدن یک مشکل بزرگ و حل اون برای ایجاد یک مشکل بزرگتر و الی آخر بیفتیماصلا کلا کدوم ما تو زندگی رفتیم تلاش کردیم و بردیم؟ تاجاییکه یادمه زندگی اینجوری بوده: برنامه ریزی کن، تلاش کن، ببازدوباره برنامه ریزی کن تلاش کن ببازسه باره برنامه ریزی کن تلاش کن ببازته تهش سه سانت جلو میریم دوسانت عقب برمیگردیمواسه همینه که وقتی از خیلیا میپرسی اگه برگردی عقب استارتاپتو میزنی؟ ازدواج میکنی؟ شغلتو عوض میکنی؟ فلان رشته رو میخونی؟ معمولا میگن نهحالا ما چیکار کنیم؟ با انرژی بد و بی هیچ نور و انگیزه ای رشته زندگی رو پیش ببریم و تو تاریکی قدم بزنیم؟ خب نه ما یه مفهوم انتزاعی خیلی سطحی ای به نام امید داریم که عملا باهاش هیچ کاری هم نمیشه کرد تنها کاری که ازش برمیاد اینه که چایی تلخ حقایق رو با اون شیرینی خیلی کمی که داره قابل تحمل کنه عملا نقشش درحد همون تیکه شکلاتیه که کنار قهوه میذارن قرار نیست تلخی قهوه ات کم شه و این حقیقت من رو یاد اون ضرب المثل انگلیسی میندازه که اگه داره بهت تجاوز میشه لااقل شل کن لذت ببری، امید اینجا نقشش همون شل کنندهست</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Sun, 24 Nov 2024 12:27:18 +0330</pubDate>
            </item>
                    <item>
                <title>مهارت از طریق تجربه یا تئوری؟</title>
                <link>https://virgool.io/@Peymanfazeli/%D9%85%D9%87%D8%A7%D8%B1%D8%AA-%D8%A7%D8%B2-%D8%B7%D8%B1%DB%8C%D9%82-%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%DB%8C%D8%A7-%D8%AA%D8%A6%D9%88%D8%B1%DB%8C-svlshjrkhkzd</link>
                <description>وقتی که واقعا وارد دنیای برنامه نویسی میشیم مسایلی پیش میاد که ما حتی اگر استاد تئوریات هم باشیم مواجهه باهاشون خارج از انتظارات ماست و اینجاست که میگن بسوزه پدر تجربه. و این تجربیات راهی برای کسب ندارن مگر با کار کنجکاوی کردن در مورد زوایای مختلفشون.اگر مدتی برنامه نویسی کرده باشید و مخصوصا توی جاوا اسکریپت و یا کتابخونه های مربوطش سرو کله زده باشین احتمالا با ternary expression یا short circuiting آشنا هستید و همونطور که میدونید دونستن اینکه truthy یا falsy بودن یعنی چی از بدیهیات هست.و احتمالا هر کسی که به تازگی وارد دنیای برنامه نویسی شده هم میدونه که خروجی یک عبارت شرطی با &amp;&amp; در شرایطی که یکی از متغیر های درگیر false باشه همیشه false خواهد بود:false &amp;&amp; true ===  falseحالا اگر برنامه نویس سمت فرانت اند باشین خیلی پیش میاد که شرط رندر شدن یک کامپوننت رو truthy بودن عملوند و operand دیگری قرار بدین یعنی چی؟ let a= true;
a &amp;&amp; &lt;p&gt; Every thing is all right &lt;/div&gt; ازونجایی که a یک مقدار truthy هست تگ p در خروجی رندر میشه و ما با جمله Every thing is all right روبرو میشیم. در حالیکه اگر مقدار a برابر با false, undefined و یا  هر مقدار falsy دیگه ای بود تگ p برای ما رندر نمیشد.اما آیا واقعا تمام مقادیر falsy شرط بالا رو در همه موقعیت ها دارند؟جواب تئوریک : بلهجواب مبتنی بر خبرگی و تجربه: خیراما در چه موقعیت هایی تجربه با تئوری متناقض درمیاد؟ مثال زیر رو در نظر بگیرید؟{numberOfPeople &amp;&amp; &lt;loadSocietySection /&gt;}بافرض اینکه اگر numberOfPeople عددی بجز صفر بود انتظار داریم &lt;loadSocietySection /&gt; رندر شه و در غیر این صورت هیچ چیزی رندر نشه (که با فرضیات تئوریک ما، انتظاری جز این هم نمیره).ولی توی React همچین کدی در خروجی مقدار 0 رو رندر میکنه. درحالیکه 0 یک مقدار falsy هست.چرا؟ چون React تمام مقادیر عددی و رشته ای رو توی خروجی نمایش میده بنابراین اگر numberOfPeople مقدار false و یا undefined برمیگردوند همه چیز طبق انتظار ما پیش میرفت ولی چون داره 0 برمیگردونه، حتی با اینکه 0 مقدار falsy هست ولی چون نوعش عددی و number  هست در خروجی 0 برای ما نمایش داده میشه.برای بررسی بیشتر این مورد  و راه های جایگزین میتونین بجای short-circuiting از ternary expression  ها استفاده کنید و یا از boolean cast  استفاده کنیدضمنا برای مثال های بیشتر میتونین به  استک اور فلو مراجعه کنید.</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Fri, 21 Jun 2024 14:13:13 +0330</pubDate>
            </item>
                    <item>
                <title>React Life Cycle</title>
                <link>https://virgool.io/@Peymanfazeli/react-life-cycle-urxjtsnjhhqx</link>
                <description>توی مدت زمانی که داریم از یک کامپوننت توی برناممون استفاده میکنیم این کامپوننت وارد فاز های مختلفی از طول حیاتش میشه دقیقا عین هر آیتم دیگه ای توی دنیای واقعی.Mount:اولین لایف سایکل یا چرخه حیات مربوط به زمانیه که یک کامپوننت بوجود میاد و برای اولین بار رندر میشه اصطلاحا بهش میگنMount  شده. این جا نقطه ایه که state  ها و props های اولیه ساخته میشن و یجورایی کامپوننت ما تازه متولد میشه.Rerender:حالا که کامپوننت ما رندر شده و میشه روی صفحه دیدش این امکان وجود داره که بارها و بارها این کامپوننت ری رندر بشه اما دقیقا چه زمانی این اتفاق میفته؟ طبیعتا هر زمانی که state ها تغییر پیدا کنن اما این تنها زمانی نیس که کامپوننت ما ری رندر میشه بلکه هر زمان که:1- props ای توسط کامپوننت دریافت شه2- کامپوننت والد مربوط به کامپوننت ما ری رندر شه ویا3- context  تغییر بکنه کامپوننت ما دچار ری رندر میشه اما نکته ای که هست اینه که این فاز الزاما نیاز نیست برای تمام کامپوننت ها اتفاق بیفته گاها مواردی وجودداره که کامپوننت بوجود میاد و ازبین میره بدون اینکه حتی یک بار ری رندر صورت بگیرهUnmount:و طبیعتا فاز عمر کامپوننت که توی این مرحله برنامه ما نه با این کامپوننت و نه با هیچ یک از state و یا Props هاش هیچ کاری نداره و این کامپوننت و تمام متعلقاتش ازبین میرن توی این فاز.</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Sat, 24 Feb 2024 16:23:34 +0330</pubDate>
            </item>
                    <item>
                <title>هوک زیر یک دقیقه</title>
                <link>https://virgool.io/@Peymanfazeli/%D9%87%D9%88%DA%A9-%D8%B2%DB%8C%D8%B1-%DB%8C%DA%A9-%D8%AF%D9%82%DB%8C%D9%82%D9%87-j1wit7pzmirf</link>
                <description>برای اینکه بدونیم هوک چیه فقط کافیه حواسمون به یه نکته باشه، اون چیه؟ اینه که ماداریم راجبه ری اکت صحبت میکنیم نه بوکس یا ابزار😂 اما در واقع اینه که خیلی قدیما مثلا قبل از عرضه نسخه 16.8ری اکت، قابلیت هاییکه توی class component های ری اکت داشتیم توی function component ها نمیتونستیم پیاده کنیممثلا چه قابلیت هایی؟ 1- استیت ها. عملا تا زمانیکه هوک ها معرفی نشده بودن function component ها نمیتونستن از استیت ها استفاده کنن یا به قول معروف stateless بودن2- لایف سایکل ها. که این مورد هم با اضافه شدن useEfftect توی فانکشن کامپوننت ها حل شداما حالا نه تنها میشه کدهای خواناتری نوشت بلکه کدهامون به روز تره و به نظر من فهم راحت تری هم داره البته میگن فهم هوک ها شروع راحتی داره ولی ادامه داشتن این فهمیدن پروسه سختیه.😂چطوری از useState استفاده کنیم؟کل چیزی که در مورد این هوک باید بدونیم اینه که خروجیش یه آرایست که خونه اول مقدار استیت فعلی رو توش نگه میداره و خونه دوم یه تابعیه که میاد و استیت رو آپدیت میکنهاما بین setState توی کلاس کامپوننت ها و useState توی فانکشن کامپوننت ها چه فرقی وجودداره؟خب عملا هدفشون یکیه اما توی کلاس ها وقتی که ما از setstate استفاده میکنیم استیت جدید اصطلاحا merge میشه و به استیت قبلی اضافه میشه در صورتیکه توی useState استیت جدید میاد و جایگزین استیت قبلی میشه (replace)پس اگه توی استیتمون یه آبجکتی داشته باشیم که فقط یدونه از المان هاش رو بخوایم تغییر بدیم با useState اگر حواسمون به المان های دیگه نباشه عملا بعد ازآپدیت شدن یه دونه آبجکت با یدونه المان خواهیم داشتstate = {
  instance={id: &#039;sth&#039;,  name: &#039;abc&#039; }
}
 که اگه بی دقتی کنیم و حین آپدیت فقط یکیشونو تغییر بدیم خروجی میشه :
state = {   instance={name: &#039;def&#039; } }مشخصا توی مثال بالا فقط اومدیم و name رو آپدیت کردیم نظریه نامحبوب نامطلوب : هرچند که به طور کلی استفاده از هوک ها خیلی جذاب و راحت به نظر میاد ولی یه ری اکت کار واقعی اونیه که خاک کلاس کامپوننت ها و this.stateهارو چشیده باشه😂</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Wed, 21 Feb 2024 17:27:49 +0330</pubDate>
            </item>
                    <item>
                <title>کلوچه ای که نقطه ضعف اعصابم شد</title>
                <link>https://virgool.io/@Peymanfazeli/%DA%A9%D9%84%D9%88%DA%86%D9%87-%D8%A7%DB%8C-%DA%A9%D9%87-%D9%86%D9%82%D8%B7%D9%87-%D8%B6%D8%B9%D9%81-%D8%A7%D8%B9%D8%B5%D8%A7%D8%A8%D9%85-%D8%B4%D8%AF-c1uusokcqpte</link>
                <description>کلا وقتی که میری سمت سرور کد بزنی سروکله زدن با مفاهیمی مثل Cookie, session,jwt و این دست مسایل به یچیز روتین و عادی تبدیل میشه در کل من بعید میدونم کسی بگه من بکند / سرور کارم ولی بلد نیستم با این آیتم ها کار کنم . اما داستان من در این باره به کجا میرسه و چرا اعصابمو بردم به یه شهر قشنگ؟ چون فکرمیکردم میدونم دقیقا دارم چیکار میکنم ولی خب دقیقا نمیدونستم دارم چه غلطی میکنم (یه حس کاملا روتین توی کدنویسی)قضیه کجا دارک میشه؟ اونجایی که فریمورک یا زبانی که داری باهاش کار میکنی رو تسلط نداری و خب اصولا نیازی هم نیست که مسلط به سرتاپای زبانت باشی صرفا باید بلد باشی کد بزنی و سینتکس رو میسپری به هنر سرچ(نظر کاملا شخصی) و خب همین رویکرد دهنمو صاف کرد چون مفهوم کوکی رو از روزی که مرورگرمو باز کردم میدونم چه کوفتیه و اصلا کیه که ندونه ؟ کوکی ها باعث میشن وبسایت ها شمارو به خاطر بیارن و دیگه هر بار که وارد اون وب سایت میشی نیاز نباشه لاگین کنی یا اگه توی فروشگاه اینترنتی رفتی و سبد خریدت رو پر کردی اگه برق رفت و بعد یه ساعت برگشتی نبینی که سبد خریدت صفر شده و از اول بری سراغ پر کردنش پس اگه بخوام جمع بندی کنم یه سری فایلای تکستی هستن که توش یه چوسه دیتاهای دم دستی از یوزر رو نگه میدارن و خب روی خود کلاینت ست میشن (برخلاف سشن که میره سمت سرور)اما چطوری از کوکی ها توی Node js  یا Express js (یه فریمورکی از نود جی اس) استفاده کنیم؟از اونجایی که من خودم اخیرا با این فریمورک دارم یه کارای جزیی میکنم و خب بگی نگی هم باهاش حال کردم رفتم سمت استفاده از کوکی اگه نمیدونین middleware ها چین ، path تو اکسپرس چیه یا اصلا چطوری یه سرور اکسپرسی رو باید بالا بیاریم که خب یه سرچ بزنین چون ساده تر از چیزیه که فکرمیکنین احتمالا یه سری پست راجبه اکسپرس بذارم چون باحالهاما واسه اینکه بتونیم تو نود کوکی ست کنیم یکی دوتا راه خیلی ساده داره ، من از اولیش میگم:const express=require(&#039;express&#039;);
const app=express();
app.get(&#039;/cookie&#039;,(request,response)=&gt;{
response.setHeader(&#039;set-cookie&#039;,&amp;quotname=value)
response.send(&#039;cookie is set&#039;)
}
app.listen(5000,()=&gt;console.log(&#039;Server ☑&#039;))اگه همچین کدی رو پیاده کنین خب اول یه سرور اکسپرسی میسازین  بعد یه نمونه از سرور میگیرین به اسم app ،روش یه middleware برای متد get از http  میسازین که اگه آدرس cookie/ رو get کردیم یه سرور بیاد یه هدر set-cookie با اسم name و مقدار value  بسازه و در نهایت هم این سرور قراره روی پورت 5000 ران بشه و وقتی که ران شد یه پیام  ☑Server توی ترمینال بهمون نشون بده. خروجی یچیزی مثل زیر میشه:سرور اکسپرس رو پورت مدنظر ست شدهکوکی ای که ست شدهممکنه این سوال پیش بیاد که خب این کوکی ای که ست شده تا کی اعتبار داره که خب تواین حالت همونطور ک توی Expires/Max-age اپلیکیشن میبینیم مادامی که این سشن (صفحه مرورگر) فعاله این کوکی هم فعاله و وقتی صفحه بسته شه خب اون هم ازبین میره راه دوم برای ست کردن کوکی:راه دیگه ای هم وجود داره که بتونیم کوکی ست کنیم کافیه که پکیج cookie-parser رو نصب کنیم. بعد از نصب تو سرور اکسپرس یه بار با middleware صداش میزنیم و دیگه هرجایی که با کوکی ها کار داشتیم میتونیم ازش استفاده کنیم:const express=require(&#039;express&#039;);
**const cookieParser=require(&#039;cookie-parser&#039;)
const app=express(); 
**app.use(cookieParser())
app.get(&#039;/cookie&#039;,(request,response)=&gt;{ 
**response.cookie(name,value)
 response.send(&#039;cookie is set&#039;)
 } 
app.listen(5000,()=&gt;console.log(&#039;Server ☑&#039;))فقط کافیه کدهای ** رو تو پروژمون پیاده کنیم همونطور که مشخصه دیگه با ست هدر برای کوکی کاری نداریم و فقط کافیه که به response تابع cookie رو ست کنیم:response.cookie(name,value,{maxAge:10000})این امکانو بهمون میده که به کوکی ایکه داریم ست میکنیم یسری آپشن هم اضافه کنیم مثل maxAge,sameSite,secretو... که خب چیزی که در حال حاضر بهش نیاز داریم یه maxAge هست که مدت زمانی که کوکی ما قراره زنده باشه رو نشونمون میده:حالا اگه بخوایم به این کوکی هایی که ست کردیم دسترسی داشته باشیم چی؟ یعنی مثلا وقتی که میخوایم وارد سایت میشیم سرور بدونه که ما نیم ساعت پیش هم همینجا بودیم و بهمون دیتای اضافه نشون نده/یاازمون دیتای اضافه نخواد.خب در این صورت باید کوکی ای که ست شده رو به سرور برگردونیم قاعدتا با یچیزی مثل cookie-parser کد ما خیلی چیز خاصی نیاز نداره :app.get(&#039;/cookie&#039;,(request,response)=&gt;{  
res.send(request.cookies)
}بدون cookie-parser هم که فقط کافیه از هدر هایی که ست شده استفاده کنیم و به کوکی ها برسیم:app.get(&#039;/cookie&#039;,(request,response)=&gt;{  
 res.send(request.headers.cookie)
 }اما یه چیزی که منو خیلی درگیر خودش کرد این بود که خب من توی کدم فقط دنبال ساخت کوکی و گرفتنش نبودم در اصل توی کار داشتم این قضیه رو چک میکردم که اگر کاربر وارد شده دیگه نیاز نباشه که صفحه لاگین رو ببینه ولی هر کاری میکردم کوکی ست نمیشد که نمیشد. اینجا دقیقا جایی بود که به هرچی کلوچس تو دنیا لعنت فرستادم اصلا لعنت به کسی که کلوچه رو وارد تکنولوژی کرد یچیز خمیری شیرین چرا باید بیاد تو برنامه نویسیخلاصه که منطقا نمیشه دیگه کدمو اینجا بذارم اما اشاره کنم که من کوکی پارسر روداشتم و واسه ریکوست زدن به سرورم داشتم از fetch استفاده میکردم و خب در این موارد معمولا مرورگر ها ارور میدن که از CORS جلوگیری کنن و نصب یه اکستنشن CORS Unblock مشکل رو حل میکنه اما نباید یادتون بره که هروقت به این مورد برخوردید کوکیتون ست نمیشه مگر اینکه ((   credentials  ))  رو ست کرده باشید:const sent = await fetch(`http://localhost:روت/پورت?sth=${**}&amp;password=${**}`,
{
method: &amp;quotGET&amp;quot,
headers: {
&amp;quotContent-Type&amp;quot: &amp;quotapplication/json&amp;quot,
},
credentials: &amp;quotinclude&amp;quot,
}و بعد ست کردن credentials بود که کوکی منم ست شد?</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Thu, 13 Jul 2023 16:16:04 +0330</pubDate>
            </item>
                    <item>
                <title>از اسپاگتی و نوشابه تا ادمین</title>
                <link>https://virgool.io/@Peymanfazeli/%D8%A7%D8%B2-%D8%A7%D8%B3%D9%BE%D8%A7%DA%AF%D8%AA%DB%8C-%D9%88-%D9%86%D9%88%D8%B4%D8%A7%D8%A8%D9%87-%D8%AA%D8%A7-%D8%A7%D8%AF%D9%85%DB%8C%D9%86-m8bglii0jnnu</link>
                <description>اصلا چرا باید درگیر مفهومی مثل شی گرایی یا OOP بشیم ؟ این پارادایم توسعه داده شد تا ما راحتتر بتونیم کد ها رو دسته بندی کنیم ، نگهداری کنیم و حتی بهتر از همه اینا ، با این پارادایم کد های ما خیلی منعطف تر میشنقبل از اینکه با این پارادایم آشناشیم همیشه کدها در هم و برهم بود،احتمالا برای اینکه یه کارو انجام بدیم چهار بار یک تیکه کدو تکرار میکردیم و تازه بدتر ازهمه این بود که اگر میخواستیم بریم سراغ یه پروژه دیگه احتمالا هیچ کدوم از دستوراتی که توی کد قبلی زده بودیم بدردمون نمیخورد و باید از اول شروع میکردیم به نوشتن چون انقدر همه چیز در هم و برهم بود که احتمالا اگر بعد یک ماه میرفتیم سراغش هیچی ازش نمیفهمیدیم ، انگار یه ظرف ماکارونی جلومونه که هرچند که خوشمزس ولی معلوم نیست چی توشه اصلا واسه همین اون مدل کد زدن معروف شد به Spaghetti code اما لب کلام OOP چیه؟ یه راهی جلوپامون میذاره که یک سری شی object رو از کدمون بسازیم . اما چطوری؟ قبلا از کلاس استفاده میکردیم.کلاس چیه؟کلاس نقشست ، اون اشیایی که قراره بسازیم یه ساختار دارن قاعده و قانون دارن مثلا شرایطوقوانینی که تو تولید شیر کاکائو وجود داره تو تولید نوشابه وجود نداره حالا هی بیایم به این خط تولید(کدمون) بگیم شیرکاکائو(شی) بساز ولی دستور ساخت(کلاس) نوشابه رو بهش بدیم!!!هرچند این قوانین مفهومی و انتزاعی باشن اما همونطور که گفتم اصل و اساس ایجاد آبجکت ها تو دنیای واقعی هستند، نقشه ای که برای ساختن خونه طراحی میشه هم یک کلاسه و خونه هایی که تو دنیای واقعی بر اساس اون نقشه درست میشن هم شی هستند. اما این اشیایی که از کلاس ها ایجاد میشن یک اسم دیگه هم دارن و معروفند به نمونه یا instance.  ما میتونیم هزاران instance متفاوت داشته باشیم که از یک کلاس دارن استفاده میکنن مثل کلاس ماشین که یک نمونش میشه بنز یک نمونش هم میشه پراید(!!!) هردوشون وسیله نقلیه هستند اما(این کجا و آن کجا) تفاوت های فاحشی هم باهم دارن ولی خب با توجه به تفاوت هاشون هردو چهارتا چرخ دارن، یک فرمون، موتور و ...پس چطور باید این کلاس ها رو طراحی کنیم؟چطور باید مسایل دنیای واقعی رو توی کلاس ها پیاده سازی کنیم؟بصورت کلی 4 تا قاعده اساسی توی شی گرایی وجود دارن که میتونن به ما کمک کنن که یک کلاس رو به خوبی بتونیم پیاده سازی کنیم :1)انتزاع یا abstraction: یعنی ساده سازی، یعنی یک سری فرآیند هایی که دستو پا گیرن رو از جلوی دستو پا برداریم مثلا چی؟مثلا ما میخوایم یه صفحه نمایش داشته باشیم اگر از انتزاع استفاده نکنیم باید برای هر عملی که توی یک صفحه نمایش اتفاق میفته یک دکمه برای کاربر اضافه کنیم مثلا تنظیم نور،دکمه خاموش و روشن کردن صفحه،میزان سردی و گرمی رنگ ها ، دمای صفحه نمایش چقدر شده ، پورت ورودیش چندتا خالی مونده ، و هزاران مسایل مربوط به داخل و خارج اون صفحه نمایش که اصلا در حالت عادی یک کاربر نیازی نداره بدونه در دنیای واقعی تمام این فعالیت ها ازدید کاربر پنهان شدن و کاربر فقط با دکمه روشن و خاموش کردن صفحه نمایش کار داره و بقیه موارد نه اینکه بدرد نخور باشند، فقط دم دست کاربر نیستن2) کپسوله سازی encapsulation: یعنی بیایم قسمت های مختلف یک کلاس رو خصوصی کنیم که از بیرون از کلاس به اون بخش ها دسترسی نداشته باشیم به مثال بالا دقت کنیم یک بار دیگه ، صفحه نمایش ما قابلیت اندازه گیری دمای داخل خودش رو داره بنابراین یک متد و فرآیندی برای این قضیه داخل این صفحه نمایش فعاله ولی آیا این فرآیند باید از خارج از صفحه نمایش بشه کنترلش کرد ؟ قطعا پاسخ نه خواهد بود.3)ارث بری inheritance: برای این مورد بیاین مثال رو به یک مثال واضح تر تبدیل کنیم، درنظربگیرید که ما موجودیتی به اسم یوزر توی برناممون داریم همچنین به جز اون موجودیتی به عنوان ادمین هم داریم خب قاعدتا بدون شک ، موجودیت ادمین موارد مشترک زیادی با یوزر داره مثل نام کاربری پسورد و...user{
username
password
email
login(password){
// some code
}
makeCall(){
// some code
}
}==================================================
admin{
username
password
email
permissions
login(password , Auth){
// some code
}
makeCall(){
// some code
}
runningSessions(user){
//some code
}
}توی oop وقتی دو تا کلاس داریم که خیلی شبیه به همدیگه هستن و پراپرتی های  یکسان دارن از ارث بری استفاده میکنیم توی این حالت یک کلاس والد parent و یک کلاس فرزند یا child داریم کلاس فرزند از والد ارث میبره، توی مثال ما {}()username password email login(password){ } makeCall تماما از یوزر به ادمین به ارث رسیدن4)چندریختی polymorphism: وقتی میگیم چندریختی منظورمون دقیقا همون چندتا شکل وقیافه داشتنه این قابلیت کمکی که میتونه بهمون کنه اینه که میتونه متد هایی که از والدش به ارث برده رو بازنویسی (overwrite)کنه مثلا موجودیت ادمین برای لاگین شدن به کد دو عاملی هم نیاز داره  و برخلاف والدش که تنها یک پارامتر password رو برای متد لاگین نیازداشت {}(login(password، توی ادمین میبینیم که پارامتر auth هم اضافه شده{}login(password , Auth).</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Wed, 22 Feb 2023 12:38:51 +0330</pubDate>
            </item>
                    <item>
                <title>چه رویداد هایی دارن پشت صحنه یک صفحه وب اتفاق میفتن؟</title>
                <link>https://virgool.io/@Peymanfazeli/%DA%86%D9%87-%D8%B1%D9%88%DB%8C%D8%AF%D8%A7%D8%AF-%D9%87%D8%A7%DB%8C%DB%8C-%D8%AF%D8%A7%D8%B1%D9%86-%D9%BE%D8%B4%D8%AA-%D8%B5%D8%AD%D9%86%D9%87-%DB%8C%DA%A9-%D8%B5%D9%81%D8%AD%D9%87-%D9%88%D8%A8-%D8%A7%D8%AA%D9%81%D8%A7%D9%82-%D9%85%DB%8C%D9%81%D8%AA%D9%86-fsdf0mmb7ujy</link>
                <description>توی این بلاگ قصد دارم در مورد چند تا Dom Event که در چرخه حیات یک صفحه وب اتفاق میفتن صحبت کنم اما نکته اول اینه که اصلا چرخه حیات یا life cycle یعنی چی؟ازلحظه اولی که یک صفحه وب در دسترس قرار میگیره تا لحظه ای که از اون صفحه خارج بشیم رو اصطلاحا چرخه حیات اون صفحه میدونیمDomContentLoadedاولین رویدادی که میخوایم راجع بهش صحبت کنیم Dom Content Loaded هست که به محض این که سند HTML کاملا پارس میشه( فرآیند دانلود شدن کامل صفحه HTML و تبدیل شدن به DOM tree)  توسط خود document فراخونی میشه اما قبل ازاینکه Dom Content Loaded بتونه اتفاق بیفته تمام اسکریپت ها باید دانلود و اجرا بشن بنابراین سایر منابع مثل تصاویر یا هر منبع دیگه ای (به جزhtml و js scripts همونطوریکه بالاتر هم اشاره کردم)خیلی مورد توجه این Event  نیست#code1
document.addEventListener(&#039;DOMContentLoaded&#039;,(e)=&gt;{
console.log(&#039;Html parsed&#039;,e);
});حالا دقیقا بعد ازاین خطه که میتونیم کدهایی رو بنویسیم که نیاز داریم بعد از  اینکه DOM لود شده اجرابشن و خب ما تقریبا میخوایم تمام کدمون دقیقا بعد از اینکه DOM آماده شد اجرا بشه. اما این جمله معنیش این نیست که ما وابسته کد بالاییم که وب اپلیکیشنمون کار کنه. اما چرا؟چون ما تگ رویایی script  رو داریم که معمولا قبل ازاینکه تگ body  رو ببندیم فراخونیش میکنیم و این تگه که میاد و جاوا اسکریپت رو به HTML ایمپورت میکنهپس آخرین چیزی که HTML میخونه ایمپورت کردن جاوااسکریپته#code2
&lt;script src=&#039;script.js&#039;&gt;
&lt;/body&gt;
&lt;/html&gt;پس اساسا مرورگر زمانی اسکریپت مارو پیدا میکنه که تمام HTML پارس شده.پس دیگه نیازی به شنیدن رویداد DomContentLoded نداریم (code1).اما شبیه به این فرآیند رو توی jquery هم داریم یعنی دقیقا جایی که میایم و تمام فرآیندمون رو وابسته به document.ready میکنیم این فرایند دقیقا کاریکه DomContentLoded  توی جاوااسکریپت خام میکنه رو انجام میدهLoadEvent اما ما یک رویداد دیگه تحت عنوان LoadEvent هم داریم که بعداز اینکه تمام منابع مثل عکس ها یا css یا هر منبع خارجی دیگه ای دانلود شدن ، توسط window فراخونی میشه به عبارتی این رویداد زمانی فراخونی میشه که تمام صفحه تمام و کمال لود شده باشهwindow.addEventListener(&amp;quotload&amp;quot, (e) =&gt; {
console.log(&amp;quotPage fully loaded&amp;quot, e);
});تفاوت رویداد های  DomContentLoaded و LoadEventbeforeunload یک رویداد خیلی جالب دیگه ای که وجود داره معروفه به beforeunload که دقیقا زمانی فراخونی میشه که کاربرداره از صفحه خارج میشه مثلا زمانیکه کاربر روی X مربوط به تب صفحه ما توی مرورگر کلیک میکنه تا از صفحه ما خارج شه یا مثلا زمانیکه صفحه رو میخواد بارگذاری مجدد کنه بنابراین میتونیم از این رویداد استفاده کنیم و از کاربر بپرسیم که آیا مطمئنه که میخواد صفحه رو ترک کنه یا نه و خب قاعدتا هم روی window فراخونی میشهمثال رایج برای همچین رویدادی میتونه صفحات درگاه پرداخت بانکی باشه که هر فعالیتی مربوط به لود مجدد یا ترک صفحه باشه مرورگر بهتون اخطار میدهwindow.addEventListener(&amp;quotbeforeunload&amp;quot, (e) =&gt; {
e.returnValue = &amp;quot &quot;
});مقدار e.returnValue هرچیزی میتونه باشه اما تغییری توی مقدار پیش فرضی که برای این رویداد وجود داره نخواهد داشت بنابراین خالی میمونه و این که برای بعضی از مرور گرها حتما باید از e.preventdefault()استفاده کنیم ولی توی کروم نیازی بهش نیستفراخونی beforeunload در لحظه  reload کردن صفحهفراخونی beforeunload در لحظه  ترک کردن صفحهاما خیلی مهمه که ازاین رویداد سو استفاده نکنیم چون واقعا برای کاربرهامون آزار دهنده میشه بنابراین جاهاییکه واقعا احساس میکنیم کاربر ممکنه به طور تصادفی از یک صفحه بیاد بیرون و زحماتش با یک اشتباه به هدر بره از این event استفاده میکنیم</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Sat, 18 Feb 2023 14:56:37 +0330</pubDate>
            </item>
                    <item>
                <title>Gaurd Clause چیه</title>
                <link>https://virgool.io/@Peymanfazeli/gaurd-clause-%DA%86%DB%8C%D9%87-ost3xe4anxzp</link>
                <description>هرچند که این نوشته قراره راجعبه برنامه نویسی و مخصوصا جاوا اسکریپت باشه اما مفهومی که میخوام راجع بهش بنویسم چیزیه که ماها زیاد توی جامعمون دیدیم.قطعا برای هممون پیش اومده که رفتیم کارخاصی انجام بدیم و شرایط اصلی انجام اون کار رو داریم ولی جلومون گرفته میشه چون توی همون قانون یک تبصره وجود داره که مارو از انجام دادن اون کار خاص منع میکنه .مثلا قراره بریم وارد یک شرکت بشیم و شغلی رو اختیار کنیم که شرط اصلیش داشتن حداقل مدرک لیسانسه و شماهم اون مدرک رو دارید پس شرط اصلی احراز شده ولی شغل به کسی تعلق میگیره که علاوه بر مدرک دانشگاهی ، تجربه کار هم داشته باشه. پس گاها شرکت ها میان دوره های کارآموزی قرار میدن که تبصره تجربه کار هم یجورایی احراز شهحالا توی دنیای برنامه نویسی به این تبصره میگن Gaurd Clause. فرض کنید که یک گروه از دکمه هارو داریم و قراره وقتی رو هرکدوم کلیک میکنیم محتوای خاصی رو بهمون نشون بده:HTML:
&lt;div class=&amp;quotbtnContainer flex flex-col w-[140px] justify-center&amp;quot&gt;
&lt;button class=&amp;quotbtn bg-cyan-500 rounded&amp;quot&gt;
&lt;span&gt;item1&lt;/span&gt;
&lt;/button&gt;
&lt;button class=&amp;quotbtn bg-red-500 rounded mt-4&amp;quot&gt;
&lt;span&gt;item2&lt;/span&gt;
&lt;/button&gt;...
&lt;/div&gt;
Js:
const btnContainer = document.querySelector(&amp;quot.btnContainer&amp;quot);
const btns = document.querySelectorAll(&amp;quot.btn&amp;quot);همونطور که احتمالا میخوایم کدمون بهینه باشه باید از Event Deligation استفاده کنیم و پس :btnContainer.addEventListener(&#039;click&#039;,(e)=&gt;{حالا نکته اینه که ما باید بریم سراغ Dom traversal که اگرروی span ایکه توی هر  دکمه قرار داره کلیک کردیم همون دکمه ای که والدش هست عملیات رو انجام بده و بهترین متدبرای این مورد closest هست:const clicked = e.target.closest(&amp;quot.btn&amp;quot);
console.log(clicked);
}تا اینجای کار به نظر همه چیز مرتبه و مشکلی نیست و هر بار که کاربر روی دکمه یا span هر دکمه ای کلیک کنه توی کنسول خروجی رو میبینه اما مشکل جایی پیش میاد که کاربر بیاد و جایی کلیک کنه که Js نتونه نزدیکترین والد (closest(&#x27;.btn&#x27;)) رو تشخیص بده مثلا بین دکمه ها کلیک کنهاینجاست که برنامه کار نمیکنه و توی کنسول ارور زیر رو میبینیمscript.js:151 Uncaught TypeError: Cannot read properties of null (reading &#039;classList&#039;)     at HTMLDivElement.&lt;anonymous&gt; (script.js:151:11)یعنی ما شرط لازم که عملیاتی رو انجام بده (کلیک کردن توی محوطه btnContainer) رو داریم ولی تبصره اینه که مشخص به JS بفهمونیم که دقیقا کدوم دکمه مد نظرمونه وگرنه به ارور میخوریم اینجاست که مفهوم Gaurd Clause معنی پیدا میکنه کافیه یک شرط بذاریم و جلوی این ارور رو بگیریم:if(clicked){
console.log(clicked)
}که البته شکل مدرن ترش به صورت زیره:if(!clicked)return;
console.log(clicked)این کار به این معنی نیست که کلیک توی جای نامربوط خروجیش null نخواهد بود، بلکه به این معنیه که دیگه اروری وجود نخواهد داشت.پس شکل کلی کدمون در نهایت میشه:const btnContainer = document.querySelector(&amp;quot.btnContainer&amp;quot);
const btns = document.querySelectorAll(&amp;quot.btn&amp;quot);
btnContainer.addEventListener(&amp;quotclick&amp;quot, (e) =&gt; {
const clicked = e.target.closest(&amp;quot.btn&amp;quot);
if(!clicked)return; 
console.log(clicked)
});</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Sun, 12 Feb 2023 10:33:02 +0330</pubDate>
            </item>
                    <item>
                <title>Dom Traversal چیه</title>
                <link>https://virgool.io/@Peymanfazeli/dom-traversal-%DA%86%DB%8C%D9%87-szpdsiy3dmon</link>
                <description>به طور کلی وقتی که با Dom سرو کار داریم باید بتونیم راحت بین عناصر مختلف جابجا شیم و برای انجام این کار به مفهومی مثل Dom Traversal میرسیم یعنی چی؟ یعنی از طریق Dom Traversal ما میتونیم یک عنصر رو بر مبنای یک عنصر دیگه انتخاب کنیم . گاهی اوقات ممکنه که نیاز داشته باشیم که عنصری رو که به یک اِلِمان مهم دیگه مرتبطه انتخاب کنیم مثلا به عنصر فرزند یا والد (direct child / direct parent element ) برسیم یا حتی ممکنه که اصلا ندونیم که ساختار Dom در حالت اجرا به چه صورته تمامی این شرایط باعث میشن که ما به Dom Traversal  نیاز داشته باشیم.به عنوان مثال کد زیر رو در نظر بگیرید:const span=document.querySelector(span);
console.log(span.querySelectorAll(&#039;.name)خروجی کد بالا یک nodeList  حاوی تمام عناصری هست که کلاس name  دارند.NodeList(2) [div.name, h1.name]حالا اگر Direct child  هارو بخوایم باید از متد childNodes مثل زیر استفاده کنیم:span.childNodesاین کد میاد تمام node هایی که داخل span ما وجود دارند رو به همراه Typeشون میریزه توی یک nodeList مثل زیر:NodeList(5) [text, div.name, text, h1.name, text]حالا اگر ما بخوایم فقط به عناصر html که توی اون span خاص مد نظر ماوجود دارند که نقش فرزند رو دارند  برسیم متد children رو باید انتخاب کنیم:span.childNodesدر این صورت خروجی ما یک htmlCollection خواهد بودHTMLCollection(2)[div.name, h1.name]اما js دوتا متد دیگه هم برای ما تعریف کرده که ما بتونیم به اولین/آخرین عنصرفرزند توی Dom برای بخش مد نظرمون هم دسترسی داشته باشیم که متدشون به ترتیب هست:span.firstElementChildspan.lastElementChildاما تا اینجا رویکرد ما از بالا به پایین (downWard) بود یعنی از سمت والد به سمت فرزند میرسیدیم ولی ما متد هایی هم داریم که میتونیم  upWard یا از فرزندان به والد و یا حتی سایر فرزند ها در یک سطح (siblings)برسیم span
span.parentElement
span.closest(&#039;.name&#039;)خب همونطورکه میشه حدس زد این متدها دقیقا بر خلاف متد های downWard هستن ولی نکته جالبی که وجود داره در مورد متد closest هست که دقیقا مثل querySelector نیاز به تعیین یک سلکتور داره ولی با این تفاوت که اون سلکتور رو توی عناصر parent میگرده و متدهای آخر هم مربوط به عناصر هم سطح  یا sibling ها هستنspan.previousElementSibling
span.nextElementSiblingبرای اینکه node های هم سطح رو هم ببینیم کافیه که element رو از عبارات بالا حذف کنیم یعنی:span.previousSibling 
span.nextSibling</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Sat, 11 Feb 2023 17:49:51 +0330</pubDate>
            </item>
                    <item>
                <title>مفهوم absraction و Call back function</title>
                <link>https://virgool.io/@Peymanfazeli/%D9%85%D9%81%D9%87%D9%88%D9%85-absraction-%D9%88-call-back-function-no9ttpflwh6n</link>
                <description>خب همونطوریکه توضیح دادیم Higher-order function ها چی هستن و یدونه اختصاصیش رو هم برای خودمون ساختیم حالا وقتشه که بیشتر وارد جزییات بشیم و ببینیم توابع callback چی هستنقبل از هرچیزی بهتره بدونیم که صدا کردن یا Call کردن یه فانکشن یعنی عملیاتی کردن اون تابع در همون لحظه درحالیکه پاس دادن مقدار اون تابع به معنای عملیاتی کردن در همون لحظه نیست مثلا:const lowerLetter= fucntion (str) {
    str.toLowerCase()
} ما لحظه ایکه از تابع .toLowerCase استفاده میکنیم میخوایم اون تابع رو عملیاتی کنیم پس صداش میکنیم برای همین هم هست که از () استفاده میکنیم اما برای استفاده از تابع lowerLetter باید با مفهوم callBack آشنابشیم:جاوااسکریپت همیشه از این callback function ها داره استفاده میکنه مثلا زمانیکه ما از متد addEventListener یا forEach استفاده میکنیم. تابع زیر رو در نظر بگیرید:const sayHello= funciton( ) {
    console.log( &amp;quot hello &amp;quot);
}حالا اگر بیایم و اون رو به عنوان یک آرگومان به تابع addEventListener  بفرستیم:btn.addEventListener (&#039;click&#039;, sayHello)یعنی به محض اینکه رویدادی click روی btn اتفاق افتاد addEventListener بیاد و مقدار تابع sayHello رو پاس بده یا توی مثال زیر:[&amp;quotPeyman&amp;quot, &amp;quotReza&amp;quot, &amp;quotNima&amp;quot].forEach(sayHello)برنامه میاد  و به تعداد عناصر موجود توی آرایه مقدار تابع sayHello رو پاس میدهاما چرا باید از call back function ها استفاده کرد؟بهمون اجازه میده که کدهامون رو به اجزای کوچیک تر که بارها قابل استفاده هستن تبدیل کنیم اما دلیل دوم و مهمتر اینه که ما میتونیم abstraction  بسازیماما abstraction چیه؟یعنی ما جزییات پیاده سازی کدها رو پنهان کنیم چون همه اون جزییات برای ما مهم نیستن بنابراین میتونیم به مسایل مهمتری توی کدمون بپردازیم به کد زیر توجه کنین:const transformer = function (str, fn) {
   console.log(` Original strign: ${str}`);
   console.log(` Transformed strign: ${ fn ( str ) }`);
}حالا اگر ما بیایم و یک رشته ای به این تابع Transformer بدیم و یک تابع هم مثل onWord یا firstUpper هم به عنوان تابع براش مشخص کنیم:transformer(&amp;quotHi this is peyman&amp;quot, onWord)
======&gt;&gt;&gt; hithisispeyman
transformer(&amp;quotjavascript is fun&amp;quot, firstUpper )
=======&gt;&gt;&gt; JAVASCRIPT is funدیگه تابع transformer کاری نداره که توابعی که به صورت آرگومان بهش پاس داده میشن چطور قراره عملیات خودشون رو انجام بدن یا چه جزییاتی دخیل هستن ، تنها وظیفه ای که تابع transformer  به عنوان یک تابع مرتبه بالا Higher-order function داره اینه که رشته رو بگیره و اون رو در اختیار توابعی که وظیفشون اعمال تغییرات روی اون رشته هستندقرار بده(اصطلاحا به این کار میگن deligate)امیدوارم مفید بوده باشه</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Sun, 01 Jan 2023 14:24:07 +0330</pubDate>
            </item>
                    <item>
                <title>توضیح اجمالی راجع به First class و توابع مرتبه بالاتر(Higher-Order Function)</title>
                <link>https://virgool.io/@Peymanfazeli/%D8%AA%D9%88%D8%B6%DB%8C%D8%AD-%D8%A7%D8%AC%D9%85%D8%A7%D9%84%DB%8C-%D8%B1%D8%A7%D8%AC%D8%B9-%D8%A8%D9%87-first-class-%D9%88-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D9%85%D8%B1%D8%AA%D8%A8%D9%87-%D8%A8%D8%A7%D9%84%D8%A7%D8%AA%D8%B1higher-order-function-g507eghclhrs</link>
                <description>همونطوریکه احتمالا میدونید  جاوااسکریپت یکسری توابع first class داره که بهشون fist citizen هم گفته میشه معنیش اینه که یک سری توابعی وجود دارن که مثل value ها باهاشون برخورد میشه، یعنی چی ؟ تابع زیر رو در نظر بگیرید :function fn1(){
console.log(&amp;quotFirst class citizens&amp;quot)};1- میتونیم به عنوان مقدار یه متغیر باهاشون برخورد کنیم :const variable = fn1;دقت کنید که ما تابع fn1 رو صدا نزدیم فقط بهش ارجاع کردیم یا اصطلاحا fn1 رو call  نکردیم. variable رو به  fn1 ارجاع دادیم)2- میتونیم از این توابع به عنوان آرگومان ورودی توابع دیگه استفاده کنیم:function fn2(fn){
console.log(fn());
};
fn2(fn1);حتی توابع خود جاوا اسکریپت هم از این خصوصیت استفاده میکنن:btn.addEventListener(&#039;click&#039;, function) 3- میتونیم ازشون به عنوان خروجی توابع دیگه استفاده کنیم:funcntion fn3(){
return function () {
//do something
}};
const op=fn3();
خروجی اجرای fn در متغیر  op خودش یک تابع خواهد بود که باید اجرا بشه ، یعنی یک تابع به op اطلاق داده شده پس :const finally=op();اما چرا؟همونطوریکه اینجا هم توضیح دادیم توابع یا function ها خودشون نوعی از اشیا یا object ها توی جاوااسکریپت هستند و از اونجایی که خود object ها value محسوب میشن پس همین قاعده روی توابع هم قابل تعمیمه و اصلا بهمین خاطره که هر کاری که دوس داریم میتونیم  روشون پیاده کنیم.حتی بعنوان Property یاخصوصیات یک Object  ازشون استفاده کنیم:const counter={ 
    value: 23;
    Inc: function( ) { this.value++ };
}به همین دلیله که همونطور که بالاتر هم اشاره کردم  به توابع  first class citizen هم گفته میشه.بنابراین همونطور که متدهایی برای هرنوع Object  وجود داره ، برای توابع هم متد هایی وجود داره مثلا:counter.Inc.bin(some other obejct)اما Higher-Order function :تابعی که یک تابع دیگه رو به عنوان آرگومان ورودی میگیره و یا چیزی که return میکنه یک تابع دیگست. مثلا:const greet=function(){ 
console.log(&#039;Hello&#039;) 
}
btn.addEventListener(&#039;click&#039;, greet)در مثال بالا تابعaddEventListener تابع greet رو به عنوان ورودی میگیرهبنابراین به محض اینکه click انجام بشه addEventListener که خودش یک Higher-Order function  هست میاد و تابع greet رو صدا میزنه و چون عملیاتی شدن greet منوط به صدا شدن توسط addEventListener هست به greet اصطلاحا  call-back function هم گفته میشه حالا که میدونیم Higher-order function  ها چین میتونیم یه اختصاصیشو برای خودمون بنویسیم که نشون بدیم چطور کار میکننconst oneWord=fucntion(str) { 
    return str.replaceAll(  &#039;   &#039; , &#039; &#039; ).toLowerCase();
}تابع یک تابع عمومی یا Generic function هست که میاد و هررشته ای با هر طولی که بهش بدیم رو به یک کلمه(رشته بدون فاصله) باحروف کوچیک تبدیل میکنه  بعنوان مثال:oneWord(&#039;Hi this is peyman&#039;) ====&gt;&gt;&gt; hithisispeymanتابع زیر هم میاد و اولین حرف رشته رو به حرف بزرگتر تبدیل میکنهconst firstUpper= fucntion (str) {
    const [first, ...others]=str.split(&#039;   &#039;);
    return [first.toUpperCase(), ...others].join(&#039;   &#039;);
}خروجی:firstUpper(&#039;hi this is peyman&#039;) =====&gt;&gt;&gt; Hi this is peymanحالا ما دوتا  تابع عمومی داریم که هر کدوم یک کار خاص انجام میدن و میخوایم که یک Higher-order  هم داشته باشیم:const transformer= fucntion (str, fn) { } همونطور که توی تابع transformer میبینیم دوتا آرگومان میگیره که اولی رشته(str) هست و دومی یک تابع(fn)  بنابراین به این تابع transformer  یک تابع مرتبه بالا یا Higher-order function میگناز اونجایی که نمیخوام بلاگ هام خیلی طولانی و خسته کننده بشه توی بلاگ بعدی از همین تابع استفاده میکنم تا توضیحاتی راجع به call back function هاو مفهوم abstraction بدم</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Sun, 01 Jan 2023 12:41:55 +0330</pubDate>
            </item>
                    <item>
                <title>اتصال کوتاه یا Short Circuit</title>
                <link>https://virgool.io/@Peymanfazeli/%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%DA%A9%D9%88%D8%AA%D8%A7%D9%87-%DB%8C%D8%A7-short-circuit-nykplkyqfa4h</link>
                <description>اتصال کوتاه_short-circuitهمیشه وقتی میخوایم از عملگرهای منطقی مثل and (&amp;&amp;) و or (||) استفاده کنیم اینطور برداشت میشه که نتیجه خروجی یا باید false باشه یا True یا بعبارتی ما دنبال نتیجه ای با نوع داده ای Boolean میگردیم پس مهمه که بدونیم توی جاوااسکریپت کدوم مقادیر غلط یا falsy value در نظر گرفته میشنfalsy values حالا بیایم ببینیم اگر کد ما مثل زیر باشه نتیجه چی میشه:const compare= 3 || &#039;A&#039; ;
resault ==&gt; 3خب طبیعتا در این حالت خروجی ما نمیتونه false یا true باشه یا بعبارتی الزامی وجود نداره که نتیجه یک عملگر منطقی همیشه Boolean باشه سه تا ویژگی برای عملگر های منطقی وجود داره :1) میتونن از هر نوع داده ای یا Data Type استفاده کنن=&gt; همونطور که توی مثال ما از نوع داده ای عددی و رشته ای استفاده شده2)میتونن هر نوع داده ای رو برگردونن یا return کنن =&gt; همونطور که خروجی مثال ما هم نوع عددی و 3 هستprimitive data types in javascript3) میتونن محاسبات اتصال کوتاه یا Short Circuit Evaluation انجام بدن یعنی چی؟ یعنی اینکه برنامه میاد و میبینه که عملگر اصلی ما || هست یا &amp;&amp; اگر || هست بررسی میکنه که آیا اولین مقدار یا value ایکه باهاش مواجه میشه یک مقدار صحیح  یا truthy value هست یا نه؟اگر truthy value بود همون رو میفرسته رو خروجی و اصلا دیگه سراغ عملوند یا operand دوم نمیرهحالا مثال های زیرو درنظر بگیریم:console.log( &#039; &#039; || &#039;A&#039;) =====&gt; &#039;A&#039;
هست بنابراین خروجی ما اولین مقدار صحیحهfalsy value ازاونجاییکه عبارت رشته خالی یک مقدار غلط یا 
console.log( true || 0) =====&gt; true
عملوند اول ما یک مقدار صحیحه وبرنامه به سراغ عملوند های بعدی نمیره و همونو میفرسته به خروجی
console.log( undefined || null) =====&gt; null
هردو عملوند ما مقدار غلط دارن در اینصورت  آخرین مقدار به خروجی فرستاده میشهحالا با توجه به مثال و توضیحات بالا میشه متوجه شد که اگر یک عبارتی داشته باشیم که هزارتا عملوند هم داشته باشه به محض رسیدن به اولین truthy value بقیه عبارات نادیده گرفته میشن و خروجی مشخص میشهconsole.log(undefined || 0 || &#039;hello&#039; || 23 || null)
result ====&gt; hello حالا اگر بخوایم از short circuiting توی عملگر &amp;&amp; استفاده کنیم دقیقا برعکس عملگر || کارمیکنه .یعنی چی؟یعنی اینکه توی &amp;&amp; همیشه خروجی false هست مگر اینکه تمام عملوند ها ، True باشن پس اینجا برنامه میاد و دنبال اولین false میگرده تا به خروجی بفرستهconsole.log( 0  &amp;&amp;  &#039;A&#039; ) ====&gt; 0
هست پس خروجی ما 0 خواهد بود falsy value عملوند اول یک مقدار غلط  یا 
console.log(7 &amp;&amp; &#039;A&#039;) ===&gt;A
هردو عملوند ما مقدار صحیح هستن در اینصورت آخرین مقدار به خروجی میرهNullish coalescing حالا درنظر داشته باشین که ما نمیخوایم 0 و رشته خالی رو به عنوان مقادیر غلط یا falsy value در نظر بگیریم مثلا ما یک متغیری داریم که مقدار پیشفرضش 0 یا  &#x27; &#x27;  هست در اینصورت برنامه ما میاد و اونهارو false درنظر میگیره که این خلاف خواسته ماست:let number=0;
console.log(number || 10);
=====&gt; 10برای حل این مشکل یک عملگری به اسم Nullish coalescing operator  توی ES2020 تعریف شد که میاد مشکل رو حل میکنه فقط کافیه بجای علامت || از ?? استفاده کنیم :let number=0;
 console.log(number ?? 10) 
=====&gt; 0امیدوارم مفید بوده باشه</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Thu, 22 Dec 2022 15:11:48 +0330</pubDate>
            </item>
                    <item>
                <title>مفهوم برنامه نویسی برمبنای نمونه(Prototype)</title>
                <link>https://virgool.io/@Peymanfazeli/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%B1%D9%85%D8%A8%D9%86%D8%A7%DB%8C-%D9%86%D9%85%D9%88%D9%86%D9%87prototype-f2becwvefpma</link>
                <description>به عنوان مقدمه خوبه که بدونیم برنامه نویسی بر پایه نمونه، خودش یک نوعی از برنامه نویسی شی گراست که کلاس در اون وجود نداره ولی وراثت توسط شبیه سازی اشیایی که از قبل وجود دارند صورت میگیره و به خاطر همینه که بهش میگن برنامه نویسی برمبنای نمونه یا Prototyped Based Programmingهمه عناصر توی جاوااسکریپت شی(object) هستن بجز اعداد(numbers)، رشته ها(strings) و به طور کل  مقادیر اولیه یا primitive values . بنابر این حتی آرایه ها هم توی جاوا اسکریپت یک نوع شی محسوب میشناحتمالا میدونید که ما میتونیم حتی بعد از اینکه یک آرایه ساختیم بهش المان جدید اضافه کنیم این کار با متد Push انجام میشه:const arr=[1, 2];arr.push(3);این قابلیت بخاطر وجود اصل وراثت نمونه اولیه یا Prototyped Inheritance . اساسا ما آرایه هارو بر اساس یک نمونه ی از پیش ساخته شده یا اصطلاحا template میسازیم، که بهش Prototype هم میگیم.این Prototype حاوی تمامی متد های آرایه هست و بنابراین تمام آرایه هایی که توسط ما ایجاد میشن در اصل متد هاشون رو از نمونه اولیه به ارث بردن که ما میتونیم ازشون استفاده کنیمخیلی سعی کردم که مفهوم برنامه نویسی بر مبنای Prototype رو ساده سازی کنم امیدوارم موفق بوده باشم اما برای درک عمیق تر و بهتر این مفهوم  همونطور که توی مقدمه هم اشاره کردم حتما باید با پارادایم شی گرایی آشنا بشیم که توی بلاگ های بعدی سعی میکنم توضیح مختصری دربارش بدم </description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Tue, 20 Dec 2022 20:21:34 +0330</pubDate>
            </item>
                    <item>
                <title>مفهوم پارادایم توی برنامه نویسی</title>
                <link>https://virgool.io/@Peymanfazeli/%D9%85%D9%81%D9%87%D9%88%D9%85-%D9%BE%D8%A7%D8%B1%D8%A7%D8%AF%D8%A7%DB%8C%D9%85-%D8%AA%D9%88%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-s5unpz4tndl5</link>
                <description>یکی از مفاهیمی که به نظر من اصلا خوب توضیح داده نمیشه و مفهومش رو نمیشه راحت توی آموزش های برنامه نویسی درک کرد عنوان پارادایم (Paradigm) هست ، شاید هم این فقط یک تجربه شخصی بوده ولی در هر حال فکر میکنم یک توضیح مختصر در باره مفهوم پارادایم ممکنه توی راه برنامه نویسی کمک کننده باشهاگر به معنی لغوی پارادایم که میشه الگو توجه کنیم احتمالا میتونیم یک سری سرنخ از مفهومش پیدا کنیم ولی توی برنامه نویسی پارادایم یعنی:رویکرد کلی ساختار کد های ما یعنی وقتی داریم کد میزنیم از یک ساختار و قاعده خاصی برای پروژمون استفاده کنیم.حالا ما چندتا پارادایم یا الگوی معروف توی برنامه نویسی داریم که عبارتند از:برنامه نویسی دستوری یا imperative که دوتا زیر مجموعه داره : 1-1)برنامه نویسی رویه ای یا procedural و 2-1)برنامه نویسی شی گرا یا object orientedبرنامه نویسی اعلانی یا declarative  که شامل 2-1)برنامه نویسی تابعی functional و 2-2)منطقی یا logical  میشنحالا یک زبان برنامه نویسی مثل جاوا اسکریپت از چند پارادایم و الگو استفاده میکنه واسه همین معروفه به Multi Paradigm Language یعنی شما با هر ساختاری که دلت میخواد کد بزن و خیالت راحت باشه که جاوااسکریپت میاد و پشتیبانی میکنه</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Sun, 11 Dec 2022 12:53:26 +0330</pubDate>
            </item>
                    <item>
                <title>کامپایلر  و مفسر چی هستن تفاوتشون چیه؟</title>
                <link>https://virgool.io/@Peymanfazeli/%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1-%D9%88-%D9%85%D9%81%D8%B3%D8%B1-%DA%86%DB%8C-%D9%87%D8%B3%D8%AA%D9%86-%D8%AA%D9%81%D8%A7%D9%88%D8%AA%D8%B4%D9%88%D9%86-%DA%86%DB%8C%D9%87-dyub4visfcvc</link>
                <description>وقتی وارد رشته کامپیوتر میشیم با یک سری عناوین مواجه میشیم که شاید در نگاه اول برامون سخت باشه که بتونیم به درکشون کنیم یکی از این عناوین مفسر(interpreter) و کامپایلر(compiler) هستن ، که خیلی اوقات به این دوتا کلمه برمیخوریم مخصوصا اگر علاقمند به حوزه نرم افزار و برنامه نویسی باشیم . بنابراین هدفم از این بلاگ صرفا توضیح معنا و مفهوم این لغاته پردازنده های کامپیوتر فقط صفر و یک رو میفهمن پس درنهایت همه برنامه ها باید به صفر و یک تبدیل بشن که بهش میگن زبان ماشین. بنابراین وقتی که ما از زبان هایی مثل #C که برای انسان قابل فهم هستند استفاده میکنیم.یعنی وقتی با یک زبان برنامه ای مینویسیم اون زبان خودش انتزاعی از زبان ماشینه (یعنی زبان ماشین تعمیم داده شده و تبدیل شده به زبانی که برای ما قابل فهمه) بنابراین وقتی که پردازشگر میخواد این زبان رو بفهمه باید به زبان خودش که زبان ماشینه تبدیل کنه به این عمل اصطلاحا میگن تفسیر کردن یا کامپایل کردناما تفاوت مفسر و کامپایلر چیه؟ توی کامپایلر برنامه ما اول میاد به زبان ماشین تبدیل میشه و بعد هربار که بخواد اجرا بشه از روی فایل کامپایل شده اجرا میشهاما مفسر یا interpreter   میاد و خط به خط اجرا میشه. حتی اگر هزار  بار هم از برناممون اجرا بگیریم عینا خط به خط برنامه خونده و اجرامیشه </description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Thu, 08 Dec 2022 11:41:44 +0330</pubDate>
            </item>
                    <item>
                <title>جاوااسکریپت یک زبان سطح بالاست یعنی چی؟</title>
                <link>https://virgool.io/@Peymanfazeli/%D8%AC%D8%A7%D9%88%D8%A7%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%DB%8C%DA%A9-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%B7%D8%AD-%D8%A8%D8%A7%D9%84%D8%A7%D8%B3%D8%AA-%DB%8C%D8%B9%D9%86%DB%8C-%DA%86%DB%8C-pmlgi6owby1j</link>
                <description>توی جاوااسکریپت و به طورکلی  برنامه نویسی همیشه تعاریفی وجود دارن که خواه ناخواه باعث میشن نسبت بهشون گارد داشته باشیم و خوب درکش نکنیم ، از طرفی هم هرچقدر بخوایم از این تعاریف و یا به اصطلاح تئوری ها بگذریم در نهایت یه جایی گذرمون بهشون میفته و گیر میکنیم بنابراین تصمیم دارم توی یک سری پاراگراف های کوتاه بعضی از این عناوین رو که مخصوصا توی جاوااسکریپت خیلی باهاشون درگیریم به زبون ساده تری شرح بدمخب اولین ویژگی ای که زبون جاوا اسکریپت داره اینه که یک زبان سطح بالاست . یعنی چی؟همونطور که احتمالا میدونین هر برنامه ای که ما روی سیستممون اجرا میکنیم برای اینکه بتونه کارشو انجام بده به یه سری منابع سخت افزاری مثل CPU و Memory نیاز داره، توی زبان های سطح پایین مثل C شما این منابع رو باید به صورت دستی مدیریت کنید. مثلا از  کامپیوتر بخواین که یه متغیر جدید براتون ایجاد کنه. از طرف دیگه زبون هایی مثل جاوااسکریپت و پایتون وجود دارن که سطح بالان و هیچ نیازی به این که ما خودمون بخوایم منابع رو مدیریت کنیم وجود نداره پس قاعدتا هم راحتتر میشه یادشون گرفت و هم راحتتر میشه ازشون استفاده کرد. ولی برنامه هایی که با زبان های سطح بالا نوشته میشن (مثل جاوا اسکریپت)هیچوقت به اندازه برنامه های با زبان سطح پایین(مثل C) پرسرعت و بهینه نیستن.حالا جاوا اسکریپت چطوری این منابع سخت افزاری رو مدیریت میکنه؟یکی از ابزارهای خیلی مفیدی که میتونه شر مدیریت حافظه رو از برنامه نویس ها جدا کنه معروفه به garbage-collection . که در اصل یه الگوریتم توی موتور جاوا اسکریپته که میاد و بصورت خودکار اشیائ قدیمی و بلااستفاده رو از رو حافظه کامپیوتر پاک میکنه که اجازه نده حافظه با خرتوپرتای الکی پرشه پس نیازی نیست ما به صورت دستی بیایم و توی کدمون این کارو انجام بدیم</description>
                <category>Peyman</category>
                <author>Peyman</author>
                <pubDate>Tue, 06 Dec 2022 16:43:26 +0330</pubDate>
            </item>
            </channel>
</rss>