<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Ali Taghani / علی طغانی</title>
        <link>https://virgool.io/feed/@taghaniali</link>
        <description>سلام علی هستم، کارشناس ارشد فناوری اطلاعات. علاقه مندم دانسته هام رو به اشتراک بگذارم</description>
        <language>fa</language>
        <pubDate>2026-04-15 10:30:40</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/106729/avatar/YSodLa.png?height=120&amp;width=120</url>
            <title>Ali Taghani / علی طغانی</title>
            <link>https://virgool.io/@taghaniali</link>
        </image>

                    <item>
                <title>ساخت و ارزیابی عامل‌های هوش مصنوعی کارآمد در دنیای واقعی</title>
                <link>https://virgool.io/@taghaniali/%D8%B3%D8%A7%D8%AE%D8%AA-%D9%88-%D8%A7%D8%B1%D8%B2%DB%8C%D8%A7%D8%A8%DB%8C-%D8%B9%D8%A7%D9%85%D9%84-%D9%87%D8%A7%DB%8C-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A2%D9%85%D8%AF-%D8%AF%D8%B1-%D8%AF%D9%86%DB%8C%D8%A7%DB%8C-%D9%88%D8%A7%D9%82%D8%B9%DB%8C-xwywwltb9c0f</link>
                <description>تبلیغ اغراق‌آمیز عامل‌ها را متوقف کنیدمقدمهسال ۲۰۲۵ با موجی از وعده‌ها و هیجانات پیرامون «عامل‌های هوش مصنوعی» آغاز شد. بسیاری ادعا می‌کنند که با ظهور مدل‌های زبانی بزرگ و معماری‌های جدید، ایجنت‌ها (Agent) به زودی قادر خواهند بود پیچیده‌ترین مسائل دنیای واقعی را — از توسعه نرم‌افزار تا خودکارسازی تعاملات آنلاین — حل کنند. اما در میان این هیاهو، تجربه عملی و نمونه‌های واقعی مانند گجت‌های پوشیدنی Rabbit R1 و Humane Pin نشان می‌دهند که فاصله قابل‌توجهی میان ادعاها و واقعیت وجود دارد.در چنین فضایی، سخنرانی سیاش کاپور (Sayash Kapoor) در AI Engineer Summit 2025 اهمیت ویژه‌ای پیدا می‌کند. او با نگاهی نقادانه و مبتنی بر پژوهش‌های سال‌ها فعالیت در حوزه سیاست‌گذاری فناوری و مهندسی هوش مصنوعی، تلاش می‌کند حقیقت را از هیجان تبلیغاتی جدا کند.پیام او روشن است:اگر می‌خواهیم عصر جدید عامل‌ها واقعاً فرا برسد، باید استانداردهای ارزیابی، شیوه‌های مهندسی، و نگاه‌مان به قابلیت‌های فعلی سیستم‌های هوشمند را از بنیاد بازنگری کنیم.کاپور پژوهشگر ارشد در Mozilla، برنده جایزه Laurance S. Rockefeller Graduate Prize در دانشگاه پرینستون و دانشجوی دکتری علوم کامپیوتر در مرکز سیاست‌گذاری فناوری اطلاعات این دانشگاه است. او یکی از نویسندگان کتاب تأثیرگذار AI Snake Oil است؛ اثری که مرز میان هیاهوی رسانه‌ای و پیشرفت واقعی در حوزه هوش مصنوعی را روشن می‌کند. نوشته‌های او در رسانه‌هایی مانند WIRED و Wall Street Journal منتشر شده و تحقیقاتش در New York Times ،The Atlantic ،Washington Post ،Bloomberg و دیگر رسانه‌های معتبر بازتاب یافته است. نام او همچنین در نخستین فهرست ۱۰۰ فرد تأثیرگذار حوزه هوش مصنوعی مجله TIME قرار گرفته است.مبنای این مقاله، سخنرانی پرمحتوای او در رویداد Agent Engineering Session Day در چارچوبAI Engineer Summit 2025 در نیویورک است؛ رویدادی که به شکل اختصاصی بر آینده مهندسی عامل‌ها و نقش مهندسان هوش مصنوعی در شکل‌دادن به موج بعدی فناوری تمرکز دارد.موج عظیم عامل‌ها: جذاب و در عین حال اغراق‌شدهامروزه انتظار می‌رود که عامل‌ها بخش بزرگی از آینده محصولات هوش مصنوعی باشند—نه لزوماً به شکل عامل‌های مستقل، بلکه به‌عنوان اجزای داخلی سیستم‌های بزرگ‌تر. شرکت‌ها و پژوهشگران تصورات جاه‌طلبانه‌ای از آینده دارند؛ تصویری شبیه فیلم Her که در آن عامل‌ها مانند موجودات هوشمند، مستقل و قابل‌اعتماد عمل می‌کنند.اما واقعیت فعلی چیز دیگری است. نمایش‌های اولیه جذاب‌اند، اما پروژه‌های جاه‌طلبانه یکی پس از دیگری شکست می‌خورند. فاصله میان رؤیا و واقعیت بسیار زیاد است.سه دلیل اصلی ناکارآمدی عامل‌هاالف) ارزیابی عامل‌ها فوق‌العاده سخت استمهم‌ترین مشکل این است که بسیاری از ادعاهای مربوط به توانایی عامل‌ها با ارزیابی‌های علمی مستقل سازگار نیست. چند نمونه مهم:مثال ۱: DoNotPay – وکیل خودکارشرکتی که ادعا داشت می‌تواند کار یک وکیل را کاملاً خودکار کند. بعدها FTC (کمیسیون فدرال تجارت آمریکا) این شرکت را جریمه کرد، زیرا تبلیغاتش «گمراه‌کننده» و نتایج واقعی‌اش «نادرست» بود.مثال ۲: شرکت‌های بزرگ LawTechLexisNexis و Westlaw محصولاتی با شعار «عاری از توهم‌زایی» منتشر کردند. اما پژوهش‌های استنفورد نشان داد حداقل ۱۶٪ خروجی‌ها غلط است، گاهی با تحریف کامل قانون یا خلق پاراگراف‌های ساختگی.مثال ۳: علم خودکار و شکست Sakana AIایده «دانشمند پژوهشگر خودکار» بسیار جذاب بود. اما در آزمایش‌های دانشگاهی:بهترین عامل‌ها تنها ۴۰٪ مقالات علمی را موفق به بازتولید شدند.محصول Sakana روی مسائل بسیار ساده، و با داوری مدل‌های زبانی (نه انسان) ارزیابی شده بود.به‌تازگی این شرکت ادعا کرد کرنل‌های CUDA را «۱۵۰ برابر سریع‌تر» کرده؛ اما بررسی‌ها نشان داد عامل در واقع، «سیستم پاداش» را دور زده است—نه کرنل را بهینه کرده.نتیجه:مشکل اصلی نه ضعف مدل‌ها، بلکه ضعف ارزیابی است.ب) بنچمارک‌های ایستا، تصویر غلط می‌دهندمدل‌های زبانی با ورودی و خروجی ثابت ارزیابی می‌شوند. اما ایجنت‌ها باید عمل انجام دهند، تصمیم بگیرند، به محیط واکنش نشان دهند و چندمرحله‌ای حرکت کنند. ارزیابی چنین سیستم‌هایی:زمان‌برترپرهزینه‌تربسیار پیچیده‌تراست.سه چالش بنیادین ارزیابی عامل‌ها:۱. ایستا بودن بنچمارک‌ها: عامل‌ها در دنیای واقعی با تغییرات مداوم مواجه‌اند، اما بنچمارک‌ها این پویایی را بازتاب نمی‌دهند.۲. هزینه: برخلاف LLMها، ایجنت‌ها ممکن است وارد حلقه بی‌پایان شوند، برنامه فراخوانی کنند و هزینه‌های گسترده تولید کنند.۳. تخصصی بودن کارها: عملکرد یک ایجنت برنامه‌نویسی را نمی‌توان با بنچمارک ایجنت مرورگر سنجید.حتی بنچمارک‌های مرسوم تبدیل شده‌اند به ابزار جذب سرمایه نه معیار علمی. مثال واضح: Devin، ایجنت برنامه‌نویس که ۱۷۵ میلیون دلار جذب کرد، در یک ارزیابی مستقل تنها ۳ کار موفق از ۲۰ کار واقعی انجام داد!ج) بحران قابلیت اطمینان: عامل‌ها پایدار نیستنددر سطح قابلیت (Capability)، مدل‌ها بسیار پیشرفت کرده‌اند.اما در کاربرد واقعی، آن‌چه اهمیت دارد پایداری (Reliability) است.قابلیت = «می‌تواند»پایداری = «هر بار درست انجام دهد»امروز مدل‌ها شاید ۹۰٪ توانایی داشته باشند. اما برای کاربرد در دنیای واقعی نیاز داریم به ۹۹.۹۹۹٪—سطح «پنج ۹» در صنعت. این دقیقاً همان جایی است که بسیاری محصولات شکست می‌خورند:Rabbit R1Humane AI Pinبسیاری از دستیارهای مبتنی بر LLMزیرا خروجی‌ها «گاهی» درست بود، اما «همیشه» درست نبود. چرا Verifierها هم کافی نیستند؟ایده ساخت «راستی‌آزمایی خودکار» جذاب است. اما تست‌ها مثل HumanEval حتی کدهای غلط را گاهی «درست» ارزیابی می‌کنند. این یعنی اگر سیستم فقط به Verifier تکیه کند، ممکن است خروجی‌های اشتباه را معتبر بداند. مهندسی عامل = مهندسی قابلیت اطمینانکاپور تأکید می‌کند که مهندسی هوش مصنوعی باید به سمت:مهندسی سیستمطراحی برای پایداریمدیریت ریسککنترل سامانه‌های تصادفیبهبود تدریجی قابلیت اعتمادحرکت کند.یک مثال تاریخی فوق‌العاده الهام‌بخش: نخستین رایانه الکترونیکی جهان ENIAC (۱۹۴۶)این رایانه با ۱۷٬۰۰۰ لامپ خلأ مدام خراب می‌شد—و نصف اوقات خاموش بود! مهندسان دو سال کامل فقط روی پایداری کار کردند تا محصول «به اندازه کافی قابل‌استفاده» شود. این دقیقاً همان مسیری است که عامل‌های امروز نیاز دارند. تغییر ذهنیتی ضروری برای یک مهندس هوش مصنوعیدر پایان، مهم‌ترین پیام سخنرانی چنین است:کار اصلی یک مهندس هوش مصنوعی ساختن محصول شگفت‌انگیز نیست—کار اصلی، ساختن محصول قابل‌اعتماد است.عامل‌ها ذاتاً تصادفی‌اند.مدل‌های زبانی غیرقطعی‌اند.پس مسئولیت ما این است که سیستم‌هایی بسازیم که روی این اجزای پرنویز پایداری ایجاد کنند. این همان تغییر ذهنیتی است که موج جدید رایانش به آن نیاز دارد.سه نکته نهایی۱. ارزیابی سخت است: بدون ارزیابی جدی، ادعاهای اغراق‌آمیز ادامه می‌یابد.۲. پایداری از قابلیت مهم‌تر است: قابلیت ۹۰٪ کافی نیست؛ باید به سطح صنعتی برسیم.۳. AI Engineering باید به Reliability Engineering تبدیل شود: مهندسان آینده کسانی‌اند که این سیستم‌ها را برای دنیای واقعی «قابل‌اتکا» می‌کنند.منبع:https://www.youtube.com/watch?v=d5EltXhbcfA</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Wed, 10 Dec 2025 15:04:21 +0330</pubDate>
            </item>
                    <item>
                <title>مهندس هوش مصنوعی؛ شغل طلایی دنیای فردا</title>
                <link>https://virgool.io/@taghaniali/%D9%85%D9%87%D9%86%D8%AF%D8%B3-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D8%B4%D8%BA%D9%84-%D8%B7%D9%84%D8%A7%DB%8C%DB%8C-%D8%AF%D9%86%DB%8C%D8%A7%DB%8C-%D9%81%D8%B1%D8%AF%D8%A7-yphnvkzyo9hj</link>
                <description>مقدمهتحولات دنیای نرم‌افزار با ظهور ChatGPT شتابی بی‌سابقه گرفته است. هر ماه مدل‌های هوش مصنوعی جدید، ابزارهای تازه، APIهای متنوع و حتی عنوان‌های شغلی نو وارد بازار می‌شوند. یکی از مهم‌ترین و جذاب‌ترین این عنوان‌ها، مهندس هوش مصنوعی (AI Engineer) است؛ نقشی که امروز در بسیاری از آگهی‌های استخدامی دیده می‌شود و آینده مشاغل حوزه فناوری را متحول خواهد کرد. اما مهندس هوش مصنوعی دقیقاً چه کاری انجام می‌دهد و چه تفاوتی با مهندس یادگیری ماشین (ML Engineer) دارد؟مهندس هوش مصنوعی در برابر مهندس یادگیری ماشینمهندس یادگیری ماشین وظیفه طراحی، ساخت و آموزش مدل‌های یادگیری ماشین را بر عهده دارد. این نقش بیشتر بر پایه ریاضی، الگوریتم‌ها و پژوهش متمرکز است: از پاک‌سازی داده و تنظیم معماری‌ها گرفته تا بهینه‌سازی فرآیندهای آموزش.اما مهندس هوش مصنوعی وظیفه‌ای متفاوت دارد. او به جای ساخت مدل از صفر، از مدل‌های از پیش آموزش‌دیده – به‌ویژه مدل‌های زبانی بزرگ (LLM) – برای ساخت اپلیکیشن‌های هوشمندتر استفاده می‌کند. هدف او استفاده از مدل‌ها و ادغام آن‌ها در نرم‌افزارهای واقعی است، نه حل معادلات پیچیده ریاضی. این نقش شباهت زیادی به استفاده از پایگاه داده دارد: همان‌طور که یک مهندس نرم‌افزار لزوماً نمی‌داند MySQL درون خود چگونه کار می‌کند، ولی می‌داند چگونه کوئری بزند و محصولی قابل‌اعتماد بسازد؛ مهندس هوش مصنوعی نیز باید بیاموزد چطور از مدل‌های هوشمند برای حل مسائل واقعی استفاده کند.نمونه‌های کاربردی از مهندسی هوش مصنوعیامروز شرکت‌های مختلف در سراسر دنیا به دنبال مهندسانی هستند که قابلیت‌های هوش مصنوعی را در محصولات پیاده‌سازی کنند. برخی کاربردهای مهم عبارتند از:آمازون: نمایش خلاصه‌ای هوش‌مصنوعی‌محور از نظرات کاربران در صفحه محصول، که زمان مشتری را کاهش داده و تصمیم‌گیری خرید را سریع‌تر می‌کند.ActiveCampaign: تولید کمپین‌های ایمیلی کامل تنها با چند دستور ساده، بدون نیاز به شروع از صفر.توییتر (X): ارائه گزینه ترجمه برای پست‌های چندزبانه به کمک مدل‌های زبانی بزرگ که به‌طور لحظه‌ای زبان را تشخیص داده و ترجمه ارائه می‌کنند.Freshdesk: دسته‌بندی و اولویت‌بندی خودکار درخواست‌های پشتیبانی مشتریان و ارسال مستقیم هر درخواست به تیم مربوطه.پلتفرم‌های املاک: دستیارهای گفت‌وگویی تعبیه‌شده که به سؤالات کاربران درباره هر ملک پاسخ می‌دهند و نیاز به انتظار برای پاسخ مشاور را کاهش می‌دهند.این مثال‌ها نشان می‌دهند که مهندسی هوش مصنوعی فقط یک قابلیت تزئینی نیست؛ بلکه به صرفه‌جویی در زمان، کاهش هزینه‌ها و بهبود تجربه کاربری منجر می‌شود.مهارت‌های موردنیاز یک مهندس هوش مصنوعیبرای ورود به این حوزه، مهندسان نرم‌افزار باید مجموعه‌ای از مهارت‌ها را بیاموزند، از جمله:آشنایی با مدل‌های زبانی بزرگ (LLMs)مهندسی پرامپت (Prompt Engineering)تکنیک RAG (Retrieval Augmented Generation)پایگاه داده‌های برداری (Vector Databases)طراحی و ساخت عامل‌های هوشمند (Agents)این دانش‌ها همان نقشی را در آینده ایفا می‌کنند که پایگاه‌های داده در دو دهه گذشته در توسعه نرم‌افزارها داشتند.نتیجه‌گیریمهندسی هوش مصنوعی نه‌تنها یک عنوان شغلی جدید، بلکه گامی اساسی در مسیر تکامل نرم‌افزارهاست. همان‌طور که روزی یادگیری کار با پایگاه داده به ضرورتی اجتناب‌ناپذیر برای مهندسان نرم‌افزار تبدیل شد، در آینده نزدیک نیز کار با مدل‌های هوش مصنوعی به مهارتی حیاتی بدل خواهد شد. شرکت‌ها هر روز بیشتر به سمت ساخت نرم‌افزارهای هوشمند حرکت می‌کنند و مهندسانی که امروز وارد این عرصه شوند، فردا جایگاهی کلیدی در صنعت خواهند داشت.بنابراین، اگر به آینده فناوری علاقه‌مند هستید، یادگیری مهارت‌های مهندسی هوش مصنوعی نخستین گام برای ورود به دنیایی است که نرم‌افزار را هوشمندتر، کارآمدتر و انسانی‌تر می‌سازد.</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Sun, 31 Aug 2025 08:45:56 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای انتخاب بین Workflow و Agent برای پروژه‌های هوش مصنوعی</title>
                <link>https://virgool.io/@taghaniali/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8-%D8%A8%DB%8C%D9%86-workflow-%D9%88-agent-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-qbwpfd4nlw0d</link>
                <description>در عصر پرشتاب هوش مصنوعی، مفاهیمی همچون «جریان کاری هوشمند» (AI Workflow) و «عامل هوشمند» (AI Agent) بیش از هر زمان دیگری بر سر زبان‌ها افتاده‌اند. هر یک از این رویکردها، دریچه‌ای تازه به دنیای خودکارسازی و تصمیم‌گیری باز می‌کند و مزایا و قابلیت‌های منحصربه‌فردی را به همراه دارد. اما پرسش کلیدی اینجاست: کدام‌یک انتخاب بهتری برای پروژه شماست؟ در این مطلب، با نگاهی دقیق و کاربردی، این دو جهان را کنار هم می‌گذاریم و بررسی می‌کنیم که در چه موارد کاربردی استفاده از هرکدام می‌تواند شما را به هدف نزدیک‌تر کند. AI Workflow چیست؟به زبان ساده، یک Workflow یا جریان کاری، مجموعه‌ای از مراحل از پیش تعیین‌شده است که به‌صورت خطی اجرا می‌شود. هر مرحله دقیقا مشخص است و ورودی‌ها و خروجی‌ها از قبل معلوم هستند.📌مثال:فرض کنید می‌خواهید اطلاعات کلیدی یک فاکتور PDF را استخراج کرده و در پایگاه داده ذخیره کنید. جریان کاری شما ممکن است به این صورت باشد:دریافت فایل PDFاستخراج اطلاعات (مثلا با کمک مدل زبانی بزرگ مانند GPT)انجام محاسبات جانبی (مثلا محاسبه مبلغ نهایی با مالیات)ذخیره‌سازی داده‌ها در پایگاه داده یا ارسال آن به کانال  Slackدر این مثال، حتی اگر از هوش مصنوعی در یک یا چند مرحله استفاده شود، باز هم کنترل کامل فرآیند در اختیار شماست و هیچ تغییری خارج از برنامه اتفاق نمی‌افتد. AI Agent چیست؟برخلاف  Workflow، یک Agent یا عامل هوشمند خودمختار است. شما به عامل هوشمند ابزارها و دسترسی‌هایی می‌دهید و او براساس ورودی دریافتی تصمیم می‌گیرد چگونه آن‌ها را برای انجام یک کار ترکیب و استفاده کند.📌مثال:یک Agent پیام دریافتی از یک کاربر در Slack را دریافت می‌کند. در پیام لینکی وجود دارد. Agent بررسی می‌کند که برای پردازش این لینک چه ابزارهایی در اختیار دارد:ابزار جستجوی وبابزار استخراج محتوا از سایتابزار خلاصه‌سازی متنسپس تصمیم می‌گیرد کدام ابزارها را چگونه استفاده کند تا بهترین پاسخ را به کاربر بدهد.شاید بدون اینکه بدانید، پیش از این با عامل‌های هوشمند تعامل داشته‌اید. ChatGPT، Google Gemini، Grok و Claude همه نمونه‌هایی از این عامل‌ها هستند. این چت‌بات‌ها صرفاً پاسخ‌دهنده‌های ساده نیستند؛ بلکه ساختاری عامل‌محور دارند که می‌توانند بسته به ورودی شما، ابزارهای مختلفی را فعال و از آن‌ها استفاده کنند.به عنوان مثال، اگر از ChatGPT بپرسید:&quot;چه مدل‌های هوش مصنوعی جدیدی در دو هفته گذشته معرفی شده‌اند؟&quot;این سامانه برای یافتن پاسخ مناسب، از ابزار «جست‌وجو در وب» که توسط OpenAI به آن اضافه شده استفاده می‌کند. در پشت‌صحنه، ChatGPT از این ابزار برای تکمیل درخواست شما بهره می‌گیرد؛ دقیقاً همان چیزی که یک عامل هوشمند انجام می‌دهد.✨ نکته مهم: برخلاف تصور رایج، یک مدل زبانی مانند GPT به‌تنهایی قادر نیست هیچ‌گونه عملیات اجرایی را مستقیماً انجام دهد. این مدل‌ها صرفاً نقش مغز متفکر سیستم را ایفا می‌کنند و وظیفه آن‌ها محدود به برنامه‌ریزی، تصمیم‌گیری و تولید دستورالعمل‌ها است. به بیان دیگر، GPT یا سایر مدل‌های مشابه نمی‌توانند فایل‌ها را باز کنند، داده‌ها را در پایگاه داده ذخیره کنند یا حتی یک ایمیل ارسال کنند. آن‌ها فقط تعیین می‌کنند چه کارهایی باید انجام شود و چه ابزارهایی برای انجام آن‌ها لازم است. این ابزارها که توسعه‌دهنده از قبل در اختیار مدل قرار داده است (مثل APIها یا توابع کمکی)، توسط خود مدل فراخوانی می‌شوند و کارهای واقعی را انجام می‌دهند. بنابراین، مدل زبانی در واقع یک مغز است که دست و پا ندارد و برای عمل کردن به بدنه‌ای از ابزارها و توابع وابسته است. تفاوت‌های Workflow و  Agentمیزان کنترل توسعه دهندهAI Workflow: بسیار زیاد (مراحل ثابت و قابل پیش‌بینی)AI Agent: متوسط یا کم (عامل تصمیم‌گیری می‌کند)ورودی/خروجیAI Workflow: شناخته‌شده و مشخصAI Agent: ممکن است ناشناخته یا متغیر باشدمورد کاربرد مناسبAI Workflow: کارهای تکراری و با چارچوب مشخصAI Agent: کارهای پویا و با ورودی‌های متنوعنمونه کاربردAI Workflow: پردازش فاکتورهای دریافتیAI Agent: پاسخگویی به سوالات مشتریانWorkflow برای وظایف با مسیر روشن عالی است.Agent برای شرایطی که نمی‌دانید ورودی بعدی چیست یا چگونه باید پاسخ دهید، بهترین گزینه است.این تمایز کلیدی است؛ چراکه در بسیاری از کاربردهای عملی، نمی‌توان از قبل تمام مسیرهای ممکن را پیش‌بینی کرد. عامل‌های هوشمند با توانایی استفاده از ابزارها و تصمیم‌گیری بر اساس زمینه، انعطاف‌پذیری لازم را فراهم می‌کنند.آنچه ChatGPT را به یک عامل تبدیل می‌کند و نه صرفاً یک جریان کاری، انعطاف‌پذیری آن است. توسعه‌دهندگان OpenAI نمی‌توانند از قبل بدانند که هر کاربر چه سوالی خواهد پرسید و چه مسیری را طی خواهد کرد. بنابراین، به‌جای تعریف یک توالی گام‌به‌گام ثابت (workflow)، سامانه‌ای طراحی کرده‌اند که بر اساس ورودی‌ها می‌تواند ابزارهای مناسب را انتخاب کرده و خروجی دلخواه را ارائه دهد.کدام یک بهتر است؟هیچ‌کدام لزوماً بهتر از دیگری نیستند؛ بلکه هرکدام برای سناریوهای متفاوت طراحی شده‌اند. در پروژه‌های واقعی:اگر وظیفه‌ای گام‌به‌گام و قابل پیش‌بینی دارید، یک AI Workflow ایجاد کنید.اگر نیاز به انعطاف‌پذیری و تصمیم‌گیری خودکار دارید، از AI Agent بهره بگیرید.و اگر پروژه پیچیده‌ای دارید، می‌توانید هر دو را با هم ترکیب کنید. جمع‌بندیAI Workflow و AI Agent دو ستون اصلی در معماری‌های نوین هوش مصنوعی هستند که هر یک نقش منحصربه‌فردی در حل مسائل پیچیده ایفا می‌کنند. جریان‌های کاری (Workflows) با توالی دقیق و از پیش‌تعریف‌شده‌ای از مراحل، برای انجام وظایف تکرارشونده و ساختارمند طراحی شده‌اند. در مقابل، عامل‌های هوشمند (Agents) با انعطاف‌پذیری بالا می‌توانند بسته به ورودی‌ها و شرایط محیط، مسیرهای متفاوتی را انتخاب کنند و ابزارهای گوناگون را به‌طور پویا به‌کار گیرند.درک تفاوت‌ها و هم‌پوشانی‌های این دو رویکرد، نه‌تنها به شما کمک می‌کند تا راه‌حل‌های خلاقانه‌تر و هوشمندانه‌تری طراحی کنید، بلکه مسیر موفقیت پروژه‌های پیچیده را هموار می‌سازد. با ترکیب این دو ابزار قدرتمند، می‌توان سیستم‌هایی ساخت که هم قابلیت پیش‌بینی‌پذیری جریان‌های کاری را دارند و هم انعطاف‌پذیری عامل‌های هوشمند را، تا پاسخگوی نیازهای متغیر و پویا در دنیای واقعی باشند.</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Sun, 20 Jul 2025 11:19:21 +0330</pubDate>
            </item>
                    <item>
                <title>آمار بازدید پست‌های من در سال ۹۹</title>
                <link>https://virgool.io/@taghaniali/%D8%A2%D9%85%D8%A7%D8%B1-%D8%A8%D8%A7%D8%B2%D8%AF%DB%8C%D8%AF-%D9%BE%D8%B3%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D9%86-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-%DB%B9%DB%B9-wvkwihnbxxtl</link>
                <description>در طول تاریخ از اعداد استفاده کردیم تا اغلب داد و ستد کنیم و آن‌چیزی که شمردنی است را بشماریم. برای هر عدد واحد درست کردیم تا عددهای زندگی قاطی نشوند و از اعداد، شفاف‌تر استفاده کنیم؛ مثلا وقتی می‌گوییم ده هزار تومان به پول اشاره داریم و وقتی می‌گوییم ده هزار بلیط به بلیط!روز به روز که در زندگی جلو‌تر رفتیم عددها فرقی نکردند ولی این واحدها بودند که زیاد شدند. واحد کریپتو، واحد اصله درخت، واحد فاصله و …«واحد» یک توافق عمومی است برای شمردن؛ تا همانطور که گفتم شمردن‌ها قاطی نشود. مشاهده افراد دارای ثروت (اجتماعی یا مالی) به من ثابت کرده اینکه چه چیزی را بشماریم از اینکه چطور بشماریم مهم‌تر است. هرکس با واحد خاصی مسائل زندگی را می‌شمارد. اینطور به نظرم آمده که مشخص کردن واحد یعنی مشخص کردن اینکه من در زندگی برای چه چیزهایی ارزش قائلم و می‌خواهم چه چیزهایی را در زندگی بشمارم. https://cdn.virgool.io/annual-report/1399/spa4y2jtu6tu-qUTTC.mp4 اعدادی که بدون واحد ثبت کردمبه ویدیویی که ویرگول برایم ساخته که نگاه می‌کنم میبینم که در سال ۹۹، من در مجموع ۱۰,۹۳۶ کلمه در ویرگول نوشتم و منتشر کردم و مخاطبین، پست‌های من را ۱۱۱ مرتبه پسندیدند و  ۳۵ بار هم نظر خود را روی پست‌های من به اشتراک گذاشتند. در سال ۹۹، ۵۲ نفر در ویرگول من را دنبال کردند تا پست‌های بعدیم را بخوانند. این اعداد نشان میدهند من کاری کرده‌ام. هرکدام به واحدی وصل هستند. از خودم می‌پرسم من کدام واحد را شمارش کرده‌ام؟ کدامیک از واحدهای بالا از همه برای من مهم‌تر است؟ ادامه ویدیو را می‌بینم.آمار از اثر بیرونی می‌گویندطبق آمار پست‌های من ۳,۳۸۶ بار خوانده شدند و ۴۴۱,۲۲۰ ثانیه صرف مطالعه آنها شده است، که با توجه به جمعیتی که در ایران به اینترنت دسترسی دارند، ویرگول به من می‌گوید که توانستم  ۰/۰۰۶۰۴۹۰۸۱ ثانیه، سرانه مطالعه دیجیتال کشور را بالا ببرم.از طرف دیگر ویرگول به من می‌گوید که اگر قرار بود پست‌هایم را چاپ و به دست تک تک خوانندگان برسانم باید ۴۲,۰۸۱ کاغذ مصرف می‌کردم.آن عددهای کوچک ابتدای ویدیو حالا تبدیل شده‌اند به عددهای بزرگ به اینکه من جلوی مصرف این تعداد کاغذ را گرفتم یا به اینکه من  ۰/۰۰۶۰۴۹۰۸۱ ثانیه، سرانه مطالعه دیجیتال کشور را جابه جا کرده‌ام. واحد این عددها برای من ملموس‌تر است.واحد نوشتن چیست؟همه عددهای بالا و همینطور اثر بیرونی که روی خوانندگان و همینطور در مقیاس بزرگتر طبیعت و جامعه اطرافم گذاشتم اعدادی هستند که من دوستشان دارم و به آنها افتخار می‌کنم. اگر چنین ویدیویی دست شما نیز رسید به شما بابت تک تک اعداد تبریک می‌گویم.اثر هر نوشته تا حدودی معلوم است، اگر بنویسید جلوی قطع درخت را می‌گیرید، به سرانه مطالعه کشور اضافه می‌کنید و خوانندگانی جذب می‌کنید که شما را از طریق نوشته‌هایتان می‌شناسند و …به نظرم می‌رسد که نوشته‌های من و شما واحد ندارند ولی اثر بیرونی دارند.</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Tue, 23 Mar 2021 10:45:31 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش نصب داکر در ویندوز بدون خون و خون ریزی</title>
                <link>https://virgool.io/@taghaniali/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%86%D8%B5%D8%A8-%D8%AF%D8%A7%DA%A9%D8%B1-%D8%AF%D8%B1-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-%D8%A8%D8%AF%D9%88%D9%86-%D8%AE%D9%88%D9%86-%D9%88-%D8%AE%D9%88%D9%86-%D8%B1%DB%8C%D8%B2%DB%8C-enn5ddg1wpn4</link>
                <description>داکر یا به طور دقیق تر پلتفرم متن باز داکر مطابق نظرسنجی سال 2019 سایت StackOverflow محبوب ترین فناوری کانتینریزاسیون در بین میلیون ها توسعه دهنده در سراسر دنیا می باشد. استفاده از کانتینرها برای استقرار اپلیکیشن ها را اصطلاحا کانتینریزاسیون[1] می نامند. اینکه داکر و کانتینر چه فناوری هایی هستند و اینکه چرا به آن ها نیاز داریم از حوصله و هدف این مقاله خارج است. اما اگر علاقه مند به کسب اطلاعات ساده و در عین حال دقیق و جامع درباره داکر، کانتینر، و مفاهیم مربوط به آن ها هستید پیشنهاد می کنم حتما مقاله های زیر را مطالعه کنید:داکر به زبان آدمیزادداکر زیر ذره بین - کانتینر ویندوزی یا کانتینر لینوکسی؟پلتفرم داکر را می توانیم بر روی سیستم عامل های مختلف شامل ویندوز (دسکتاپ و سرور)، لینوکس (دسکتاپ و سرور)، و مک نصب کنیم اما در مقاله پیش رو تنها به آموزش نحوه نصب پلتفرم داکر نسخه CE بر روی سیستم عامل ویندوز دسکتاپ مناسب برای محیط توسعه (غیر عملیاتی) می پردازیم.انواع بسته های نرم افزای نصاب پلتفرم داکر نسخه CEبه طور کاملا ساده و خلاصه بسته های نرم افزاری نصاب پلتفرم داکر نسخه CE در سیستم عامل های غیر سرور و مناسب محیط توسعه عبارتند از:سیستم عامل لینوکس: بسته نرم افزاری Docker Engineسیستم عامل ویندوز و مک: بسته های نرم افزاری Docker Toolbox و Docker Desktopآنچه باید قبل از دانلود داکر مد نظر قرار دهیداینکه برای نصب و راه اندازی پلتفرم داکر باید از کدام بسته نرم افزاری استفاده کنیم به دو عامل بستگی دارد:1. سیستم عامل: نسخه و ویرایش سیستم عامل (ویندوز، لینوکس، و مک)، و نوع سیستم عامل (دسکتاپ یا سرور)2. سیستم: منابع سخت افزاری شامل پردازنده و حافظه رمما در این مقاله، مبنا را برای انتخاب بسته نرم افزاری مناسب جهت نصب داکر  نسخه CE، مشخصات زیر قرار می دهیم:سیستم عامل ویندوز دسکتاپ 64 بیتی نسخه 10: ویرایش های Pro، Enterprise با شماره ساخت[2] 1607 به بالا، Education با شماره ساخت 16299 به بالا، ویرایش Home با شماره ساخت 1903 به بالاتوجه: در ویندوز 10 ویرایش Home بایستی حتما قابلیت WSL 2 را قبل از نصب داکر فعال کرده باشید (در ادامه راهنمایی لازم جهت فعالسازی قابلیت مذکور ارائه شده است).پردازنده‌ی 64 بیتی که از فناوری های مجازی سازی و نیز ترجمه‌ی آدرس سطح دو یاSecond Level Address Translation  پشتیبانی کند. این فناوری به اختصارSLAT  گفته می‌شود (در ادامه راهنمایی لازم جهت فعالسازی قابلیت مجازی سازی در بایوس[3] سیستم و Hyper-V در ویندوز ارائه شده است).4 گیگابایت حافظه رمحالا بر مبنای مشخصات بالا به عنوان پیش نیازها و به کمک اینفگرافیک ساده زیر، خیلی راحت می توانید بسته نرم افزاری مناسب جهت نصب پلتفرم داکر را انتخاب کنید.راهنمای انتخاب نصاب پلتفرم داکر نسخه CE در سیستم عامل ویندوزآخرین نسخه Stable بسته نرم افزاری Docker Desktop را می توانید از اینجا دانلود کنید (آخرین نسخه Edge را نیز می توانید از اینجا دانلود کنید). بسته نرم افزاری مذکور ابزارهای زیر را در ویندوز شما نصب خواهد کرد:Docker EngineDocker CLI clientDocker ComposeNotaryKubernetesCredential Helperتوجه: قبل از نصب Docker Desktop بایستی تنظیماتی را در سیستم و همچنین سیستم عامل فعال کرده باشید. (برای مطالعه آموزش مربوط، عنوان «آنچه باید قبل از نصب داکر مد نظر قرار دهید» را مطالعه کنید)اما کاربرانی که سیستم عامل ویندوز دسکتاپ آن ها 64 بیتی و جزو نسخه های 7، 8، 8.1 یا 10 (ویرایش Home با شماره ساخت ما قبل 1903) می باشد برای نصب و راه اندازی داکر در سیستم خود بایستی از بسته نرم افزاری Docker Toolbox استفاده کنند. بسته نرم افزاری Docker Toolbox را می توانید از اینجا دانلود کنید (متاسفانه در حال حاضر با آی پی ایران قادر به دانلود بسته نرم افزاری مذکور نیستید و باید به طریقی آن را دور بزنید!!).توجه: پروژه Docker Toolbox اصطلاحا منسوخ شده[4] می باشد و دیگر پشتیبانی نمی شود، لذا پیشنهاد می شود در صورت برخورداری از پیش نیازها، حتما از بسته نرم افزاری Docker Desktop برای نصب و راه اندازی پلتفرم داکر نسخه CE در محیط توسعه ویندوزی خود استفاده نمایید. به همین خاطر در مقاله پیش رو تنها به آموزش نحوه نصب و راه اندازی داکر با استفاده از Docker Desktop پرداخته شده است.  اگر مجبور به استفاده از Docker Toolbox هستید می توانید برای راهنمای نصب آن را، اینجا بخوانید.آنچه باید قبل از نصب داکر مد نظر قرار دهیدبرای نصب داکر در ویندوز 10 ابتدا باید قابلیت «مجازی سازی» را در تنظیمات بایوس یا UEFI سیستم، و سپس قابلیت های «Hyper-V» و «Container» را در ویندوز (نسخه 10 ویرایش های Pro، Enterprise با شماره ساخت1607 به بالا، Education با شماره ساخت 16299 به بالا) فعال نمایید.برای فعالسازی قابلیت مجازی سازی در سیستم، می‌بایست ابتدا آن را خاموش کرده و سپس روشن نمایید. بلافاصله بعد از روشن شدن با یکی از دکمه‌های Del‌ یا F2 و در برخی محصولات با یکی از دکمه‌های F1‌ یا F11، و یا F12 و حتی Esc  وارد محیط بایوس یا UEFI سیستم خود شوید. راهکار دقیق ورود به صفحه تنظیمات بایوس یا UEFI سیستم و همچنین ظاهر و ساختار آن صفحه، بسته به برند و مدل مادربورد یا لپ‌تاپ و سایر انواع کامپیوترها، متفاوت است! می‌بایست در قسمتی مثل تنظیمات پیشرفته (Advanced) و گاهی قسمت Security‌ به دنبال گزینه‌ای با عنوان Virtualization و یا نام‌های اختصاری آن مثل VT-x  در پردازنده های نوع اینتل و AMD-V در پردازنده های نوع AMD بگردید و آن را فعال (Enable) کنید. بعد از فعالسازی قابلیت مجازی سازی، کافیست تا تغییرات را ذخیره نموده و سیستم را مجددا راه اندازی نمایید.برای فعالسازی قابلیت Hyper-V در ویندوز کافیست تا ابزار PowerShell را با دسترسی مدیر سیستم اجرا کنید (بر روی ابزار PowerShell کلیک راست نموده و گزینه «Run as Administrator» را انتخاب نمایید) و دستور زیر را در آن وارد کرده و اجرا نمایید:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -Allبرای کسب اطلاعات بیشتر می توانید به مستندات رسمی مایکروسافت در اینجا مراجعه نمایید.توجه: به جای فعالسازی قابلیت فوق شما می توانید در صورت تمایل قابلیت جدید WSL 2 را در ویندوز دسکتاپ خود فعال نمایید. نصب و راه اندازی پلتفرم داکر در ویندوز 10 دسکتاپ بر پایه WSL 2 نسبت به Hyper-V عملکرد بسیار بهتری را برایتان به ارمغان خواهد آورد. همچنین Docker Desktop مبتنی بر قابلیت WSL 2، امکان توسعه کانتینرهای لینوکسی را به صورت بومی در محیط توسعه ویندوزی برایتان فراهم می کند.توجه: در داکر نصب شده بر مبنای قابلیت Hyper-V، ایمج[5] ها و کانتینرهای ایجاد شده توسط Docker Desktop بین تمامی حساب کاربری[6] های ویندوز مشترک خواهند بود چونکه تمام حساب های کاربری سیستم عامل ویندوز از یک ماشین مجازی مشترک برای ایجاد و اجرای کانتینرها استفاده می کنند. اما در صورت نصب داکر بر مبنای قابلیت WSL 2، شما نمی توانید ایمج ها و کانتینرها را بین حساب کاربری های ویندوز به اشتراک بگذارید.توجه: از آنجاییکه فعالسازی قابلیت WSL 2 در ویندوز 10 خود نیازمند یک راهنمای جداگانه و مشروح می باشد و از حوصله و هدف این مقاله خارج است، شما می توانید برای کسب اطلاعات کامل جهت فعالسازی قابلیت مذکور به مستندات رسمی مایکروسافت در اینجا مراجعه نمایید.برای فعالسازی قابلیت Container در ویندوز نیز کافیست در حالیکه ابزار PowerShell را با دسترسی مدیر سیستم اجرا کرده اید، دستور زیر را در آن وارد کرده و اجرایش کنید:Enable-WindowsOptionalFeature -Online -FeatureName containers –Allتوجه: در صورتیکه ویندوز دسکتاپ سیستم شما نسخه 10 ویرایش Home با شماره ساخت 1903 به بالا، می باشد حتمابایستی قابلیت WSl 2 را جهت نصب و راه اندازی پلتفرم داکر فعال نمایید.مراحل نصب داکر در ویندوز1. بر روی بسته نرم افزاری Docker Desktop Installer.exe که قبلا دانلود کرده اید دو بار کلیک کنید تا نصاب اجرا شود.2. در  پنجره آغازین فرایند نصب مطمئن باشید که تیک گزینه Enable Hyper-V Windows Features خورده باشد. سپس با زدن دکمه OK مجوز نصب داکر را صادر کرده و فرایند نصب را تا انتها مطابق دستورالعمل های خواسته شده توسط نصاب، کامل کنید.توجه: در صورتیکه قبلا قابلیت WSL 2 را در ویندوزتان فعال کرده اید می توانید گزینه Enable WSL 2 Windows Features را تیک بزنید. همچنین توجه داشته باشید که در ویندوز 10 وایریش Home انتخاب گزینه Enable WSL 2 Windows Features الزامیست، اما در سایر ویرایش های ویندوز 10 شما می توانید این گزینه را تیک نزنید که در این صورت نرم افزار Docker Desktop بر اساس قابلیت Hyper-V نصب خواهد شد.3. بعد از نصب موفق و مشاهده پیغام Installation Succeeded، دکمه  Close and Logout را انتخاب کنید تا فرایند نصب کامل شود. با انتخاب دکمه مذکور، شما به طور خودکار از حساب کاربری ویندوزتان خارج خواهید شد لذا لازم است مجددا وارد حساب کاربری ویندوزتان شوید.بعد از ورود مجدد به حساب کاربری ویندوزتان، Docker Desktop به طور خودکار شروع به اجرا شدن می کند و شکلک[7] متحرک وال در نوار وضعیت ویندوز نمایان خواهد شد. در صورتیکه شکلک وال در نوار وضعیت ویندوز دیده نمی شود، می توانید با کلیک بر روی پیکان رو به بالا، آن را مشاهده کنید.ثابت شدن شکلک وال در نوار وضعیت ویندوز بدان معناست که پلتفرم داکر هم اکنون آماده استفاده است، لذا شما می توانید از هر ابزار خط فرمانی (مثل CMD یا PowerShell، ...) برای اجرای دستورات داکر استفاده نمایید.در صورتیکه بعد از ورود مجدد به حساب کاربری ویندوزتان، نرم افزار Docker Desktop به طور خودکار اجرا نشد کافیست تا خودتان عبارت Docker را در ویندوز جستجو کنید و مورد Docker Desktop را از نتایج جستجو انتخاب کنید.بعد از تکمیل فرایند راه اندازی اولیه داکر و ثابت شدن شکلک وال در نوار وضعیت ویندوز، پنجره زیر بر روی صفحه نمایش داده خواهد شد.تبریک! شما موفق شدید نرم افزار Docker Desktop را اجرا کنید. در این پنجره و به منظور آشنایی اولیه، داکر یک تمرین تعاملی ساده شامل ایجاد یک ایمج داکر، اجرای آن به صورت کانتینر، ارسال  و ذخیره آن در هاب داکر را برایتان تدارک دیده است که با انتخاب دکمه Start می توانید به آن بپردازید یا اینکه با انتخاب نوشته Skip tutorial زیر همان دکمه، از آن رد شوید.توجه: در صورتیکه حساب کاربری ویندوزتان که با آن داکر را نصب کرده اید مدیر (Administrator) نیست، بایستی حساب کاربری خود را به گروه docker-users اضافه کنید.  برای اینکار کافیست Computer Management را با دسترسی مدیر (Run as Administrator) اجرا کرده و وارد زیرشاخه Local Users and Groups &gt; Groups &gt; docker-users شوید. سپس بر روی docker-users کلیک راست کرده و گزینه Add to Group را انتخاب نمایید.  برای اینکه تغییرات اعمال شود یکبار از ویندوز Log-Off (یا Sign-Out) کرده و مجددا به ویندوز Log-In (یا Sign-In) نمایید.بررسی نسخه داکربعد از نصب موفق داکر، یک ابزار خط فرمان مثل CMD یا PowerShell را باز کرده و با وارد کردن دستور زیر از نسخه داکر نصب شده بر روی سیستم عامل ویندوزتان مطلع شوید:بررسی نسخه داکر نصب شده در ویندوزبررسی وضعیت داکر نصب شدهدر صورتیکه فاقد شناسه کاربری داکر (Docker ID) هستید، ابتدا لازم است حتما با مراجعه به اینجا، در هاب داکر ثبت نام کرده و یک شناسه کاربری برای خود ایجاد کنید. بعد از ایجاد شناسه کاربری داکر و تایید ایمیل خود، لازم است تا از طریق نرم افزار Docker Desktop به حساب کاربری خود در داکر وارد شوید. برای اینکار کافیست تا بر روی شکلک وال در نوار وضعیت ویندوز، کلیک راست کرده و گزینه Sign In / Create Docker ID را انتخاب کنید. در پنجره باز شده، شناسه کاربری و رمز عبور خود را درج کرده و سپس وارد حساب کاربریتان شوید.بعد از ورود به حساب کاربری خود در هاب داکر، یک ابزار خط فرمان مثل CMD یا PowerShell را باز کنید و مراحل زیر را انجام دهید:برای اطمینان ازینکه داکر نصب شده بر روی سیستم تان به درستی کار می کند یا خیر، ایمج hello-world را مطابق تصویر زیر دانلود و اجرا کنید (سیستم شما باید به اینترنت متصل باشد):اجرای ایمج hello-world داکربرای مشاهده ایمج hello-world ایکه در مرحله قبل بر روی سیستم تان دانلود کردید (و به طور کلی لیست تمام ایمج های دانلود شده) از دستور docker image ls استفاده کنید:مشاهده لیست ایمج های داکربرای مشاهده کانتینر hello-world اجرا شده از روی ایمج مرحله قبل (و به طور کلی لیست تمام کانتینرهای در حال اجرا یا متوقف) از دستور docker ps --all یا docker ps -a استفاده کنید:مشاهد لیست کانتینرهای داکرنتیجه گیریتا به اینجا شما موفق شدید تا نرم افزار Docker Desktop نسخه CE را بر روی سیستم عامل ویندوز دسکتاپ (مناسب برای محیط توسعه) نصب کرده و نیز از وضعیت آمادگی پلتفرم داکر برای ساخت و مدیریت چرخه حیات ایمج ها و کانتینرها مطمئن شوید.[1] Containerization[2] برای آگاهی از نسخه و نیز شماره ساخت سیستم عامل ویندوز خود می توانید در پنجره Runویندوز، دستور winver را وارد کرده و دکمه ok را بفشارید.[3] Bios[4] Deprecated[5] Image[6] User Account[7] Icon</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Wed, 09 Dec 2020 00:30:00 +0330</pubDate>
            </item>
                    <item>
                <title>داکر زیر ذره بین - کانتینر ویندوزی یا کانتینر لینوکسی؟</title>
                <link>https://virgool.io/@taghaniali/%DA%A9%D8%A7%D9%86%D8%AA%DB%8C%D9%86%D8%B1-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2%DB%8C-%DB%8C%D8%A7-%DA%A9%D8%A7%D9%86%D8%AA%DB%8C%D9%86%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3%DB%8C-%D8%AF%D8%A7%DA%A9%D8%B1-%D8%B2%DB%8C%D8%B1-%D8%B0%D8%B1%D9%87-%D8%A8%DB%8C%D9%86-vf88exinq5jv</link>
                <description>امروزه مکانیزم ها و فناوری های مدیریت و استقرار اپلیکیشن های بزرگ نسبت به سالیان گذشته و حتی همین چند سال اخیر بسیار تفاوت پیدا کرده است. سازمان ها از اپلیکیشن های بزرگ با معماری قدیمی یک تکه[1] به اپلیکیشن هایی با معماری جدید به صورت میکرو سرویس های توزیع شده مهاجرت کرده اند. این فرا ساختار[2] جدید نه تنها عملیات استقرار و هماهنگی را پیچیده کرده است بلکه چالش های امنیتی بزرگتر و مهمتری را نیز پیش روی همه قرار داده است. لذا وجود فناوری هاییکه بتوانند به سازمان ها در رفع این چالش ها کمک کنند بسیار ضروریست. در همین راستا فناوری کانتینر در چند سال اخیر طرف داران بسیاری پیدا کرده است و توسعه دهندگان می توانند به کمک پلتفرم داکر ایده های خود را به سادگی به واقعیت تبدیل کنند. در نظرسنجی سال 2019 سایت StackOverflow، داکر رتبه اول &quot; پر طرف دار ترین[3] &quot; و رتبه دوم &quot; محبوب ترین[4] &quot; پلتفرم را در بین توسعه دهندگان به دست آورده است.مطابق آمارها در بین میلیون ها توسعه دهنده، امروز داکر عملا به یک استاندارد برای ساخت و انتشار اپلیکیشن های کانتینریزه شده تبدیل شده است. تا چند سال پیش فقط در لینوکس می توانستید از کانتینرها برای استقرار و مدیریت اپلیکیشن ها استفاده کنید. اما در حال حاضر شما می توانید داکر را بر روی پلتفرم های مختلف نصب و استفاده نمائید. امروز دیگر داکر در همه جا هست: لینوکس، ویندوز، دیتاسنترها، فضاهای ابری، و ...امروزه داکر در همه پلتفرم ها قابل استفاده استدر صورتیکه قصد دارید به سمت کانتینریزه کردن اپلیکیشن هایتان حرکت کنید چند تصمیم مهم اولیه هست که باید مد نظر قرار دهید:کدام نسخه داکر را استفاده کنیم؟از کانتینرهای ویندوزی برای کانتینریزه نمودن اپلیکیشن هایمان استفاده کنیم یا کانتینرهای لینوکسی؟برای خودکار سازی مدیریت و راه اندازی کانتینرهای داکر از یک ابزار هماهنگ کننده[5] استفاده کنیم یا خودمان به صورت دستی این کار را انجام دهیم؟مناسب ترین ابزار هماهنگ کننده کانتینرهای داکر برای هدف و کاربرد ما کدام است: داکر اس وارم یا کوبرنتیز؟این مقاله به بررسی و تبیین دو مورد اول لیست بالا می پردازد (باشد که در مقاله ای دیگر فرصتی برای بررسی و تبیین دو مورد آخر به وجود آید)کدام نسخه داکر را استفاده کنیم؟داکر در دو نسخه [6] CE و [7] EE در دسترس است. داکر در مارس 2017 نسخه EE را منتشر نمود و محصول سازمانی قبلی خود به نام Docker Datacenter را در آن ادغام کرد، همچنین نسخه رایگان و متن باز موتور خود را که از سال 2013 در دسترس عموم بود به نسخه CE تغییر نام داده و باز نشر داد. نسخه CE مناسب برای توسعه پروژه های نرم افزاری، و نسخه EE نیز مناسب برای استقرار آن هاست.نکته مهمی که باید بدانید آنست که نسخه CE به هیچ عنوان یک نسخه اصطلاحا رقیق شده از نسخه EE نیست، بلکه هر دو بر پایه پروژه متن باز موتور داکر می باشند، هر دوی آن ها قابلیت ها و کارکرد های اصلی دقیقا یکسانی دارند، هر دو به طور منظم به روز رسانی می شوند، و هر دو در طیف گسترده ای از سیستم های عامل قابل استفاده هستند.داکر نسخه CEرایگانقابل اجرا بر روی سیستم عامل های ویندوز دسکتاپ(نسخه 10) ، مک[8]، و لینوکس (CentOS، Debian، Fedora، Arch، Mint، و Ubuntu)داکر نسخه EEپولی (در سه طرح Basic، Standard، و Advanced که در هر طرح قیمت ها معمولا به صورت سالیانه و به ازاء هر نود داکر محاسبه می شود. البته نسخه EE را می توان برای مدت یکماه به صورت آزمایشی دانلود و استفاده نمود)برخورداری از پشتیبانی کاملقابلیت های بیشتر نسبت به نسخه CE : مثل دسترسی به ایمِج ها و پلاگین های رسمی داکر، امکان اسکن کردن ایمِج ها به منظور کشف آسیب پذیری های آن ها، پشتیبانی بومی[9] از کوبرنتیز، ابزار برای مدیریت متمرکز کلاستر های داکر، مکانیزم های توکار برای کنترل دسترسی و امنیت، و ...قابل اجرا بر روی سیستم عامل های ویندوز سرور (نسخه 2016 به بالا)، لینوکس (RedHat Enterprise Linux یا RHEL، SUSE Linux Enterprise Server یا SLES، Oracle Linux، و Ubuntu)، و پلتفرم های ابری (AWS، Azure، Google Cloud)امکان اجرای کنار هم نودهای ویندوزی و لینوکسی داکر در یک کلاستر: سازمان های می توانند طیف گسترده ای از اپلیکیشن های کانتینریزه شده (شامل اپلیکیشن های هیبریدی که هم به کانتینر ویندوزی و هم به کانتینر لینوکسی احتیاج دارند) را ضمن تامین امنیت، مدیریت نمایند. همچنین این نسخه از داکر تمام قابلیت های پیشرفته ای را که برای مدیریت کانتینرهای لینوکسی دارد برای کانتینرهای ویندوزی نیز ارائه می دهد مثل مدیریت کلیدهای خصوصی، امضاء دیجیتال ایمِج ها، و اسکن آن ها به منظور کشف آسیب پذیری ها، پشتیبانی از شبکه های همپوشان[10]، و...امکان کانتینریزه نمودن اپلیکیشن های قدیمی ویندوزی: شما می توانید برنامه های قدیمی ویندوزی سازمان خود را به کمک داکر و بدون تغییر حتی یک خط از کد یا تغییر معماری آن، در قالب کانتینرهای مبتنی بر ویندوز سرور 2016 به بالا بسته بندی نموده و شرایط مهاجرت آن ها به زیرساخت های ابری را سرعت دهید، امروزه به این شیوه اصطلاحا «بردار و جا به جا کن[11]» می گویند. قابلیتی که ضمن افزایش امنیت اپلیکیشن قدیمی شما، زمان و هزینه مورد نیاز جهت نگهداری آن اپلیکیشن را به طور بسیار قابل ملاحظه ای برایتان کاهش می دهد، توسعه، تست و استقرار آن آسان تر می شود و مهم تر از همه امکان اجرای چند نمونه از آن بدون ایجاد هر گونه ناسازگاری برای سایر اپلیکیشن ها برایتان فراهم می شود.نسخه جدید شامل به روز رسانی های امنیتی و رفع اشکال[12] های نرم افزاری هر سه ماه یکبار منتشر می شود، و آخرین تغییرات ارائه شده در هر نسخه نیز تا یک سال پشتیبانی می شونددوره های زمانی انتشار نسخه های جدید موتور داکراگر قالب شماره نسخه های مختلف موتور داکر را از سال 2013 تا 2017، و از سال 2017 به بعد بررسی کنید متوجه یک تفاوت عجیب در قالب شماره گذاری نسخه ها خواهید شد. تا قبل از ماه مارس سال 2017، شماره 1.13 آخرین نسخه موتور داکر بود. اما بعد از معرفی نسخه های CE و EE داکر در آن تاریخ، شماره نسخه موتور داکر به 17.03 تغییر یافت (این موضوع در تصویر بالا قابل مشاهده است). از نگاه کاربران اینطور به نظر می آمد که داکر یکباره از 16 شماره صرفنظر کرده است، اما واقعیت اینست که داکر قالب شماره گذاری نسخ موتور خود را به YY.MM یعنی سال و ماه تغییر داده است، درست مشابه شماره نسخه های سیستم عامل لینوکس ابونتو(مثل ابونتو 18.04 یا 20.04).داکر CE قبلا، در دو نسخه Edge/Beta و Stable به شرح ذیل منتشر و پشتیبانی می شد:- نسخه Edge/Beta : نسخه جدید شامل به روز رسانی های امنیتی و رفع اشکال های نرم افزاری به طور ماهانه منتشر می شد، و آخرین تغییرات ارائه شده در هر نسخه نیز تا یک ماه پشتیبانی می شدند- نسخه Stable : بعد از هر سه نسخه Edge یک نسخه Stable ارائه و تا چهار ماه پشتیبانی می شدتوجه: از تاریخ 10 دسامبر سال 2020 به بعد، داکر CE فقط در یک نسخه تجمیعی واحد منتشر و در اختیار تمام کاربران قرار می گیرد. علاوه بر این حجم آپدیت های ارائه شده نیز از چند 100 مگابایت به چند 10 مگابایت تقلیل و بهبود یافته است.داکر در ویندوزداکر و مایکروسافت در یک همکاری مشترک مهندسی سعی دارند تا یک تجربه منسجم و متداوم از کاربرد داکر را به توسعه دهندگان و کارشناسان عملیاتی ارائه دهند. ویندوز سرور از نسخه 2016 به بالا، و ویندوز دسکتاپ نسخه 10(البته برخی از ویرایش ها مثل Pro و Enterprise) از داکر به صورت بومی و مخصوص پشتیبانی می کنند.کانتینرهای ویندوزی داکر مشابه نوع لینوکسی خود هستند و از قابلیت های زیر برخوردارند:فراهم سازی تجربه ای همسان با تجربه نوع لینوکسی: در کانتینرهای ویندوزی از همان دستورات و نیز واسط کاربری محیط های لینوکسی استفاده می شود،رفع نا همخوانی نسخه ها: به لطف ایزوله بودن کانتینرها، نسخه های مختلف IIS/.NET می توانند با هم بر روی یک سیستم عامل وجود داشته باشند،برخورداری از محیط اجرای ایزوله تر و ایمن تری نسبت به نوع لینوکسی: کانتینرهای ویندوزی از دو حالت مختلف برای ایزوله نمودن محیط اجرا برخوردارند: حالت Process و حالت Hyper-V. موقع ساخت کانتینرها با استفاده از یک پارامتر مخصوص در خط فرمان کلاینت داکر می توانیم حالت مورد نظر را مستقیما انتخاب کنیم. به طور خلاصه حالت Process مشابه با حالت اجرای کانتینرها در لینوکس است و در این حالت هسته سیستم عامل بین خود سیستم عامل و کانتینرهای در حال اجرای بر روی آن مشترک خواهد بود، اما در حالت Hyper-V هر کانتینر درون یک ماشین مجازی مجزا، کمینه و بسیار بهینه شده اجرا می شود و لذا هر کانتینر هسته سیستم عامل مختص خود را دارد و از هسته سیستم عامل ماشین میزبان جدا خواهد بود به همین دلیل حالت Hyper-V نسبت به حالت Process محیط اجرای ایمن تر و ایزوله تری را برای کانتینرها فراهم می کند(برای کسب اطلاعات بیشتر در این باره به لینک مربوط در وب سایت شرکت مایکروسافت مراجعه کنید)،کوچک تر شدن ایمِج[13] های پایه: مایکروسافت در نسخه های 1709، ،1802 و 2019 ویندوز سرور حجم ایمِج های پایه مبتنی بر Windows Server Core و Nano Server خود را به طور قابل توجهی کاهش داده است (برای کسب اطلاعات بیشتر راجع به مدل نسخه های مختلف ویندوز سرور به لینک مربوط در وب سایت شرکت مایکروسافت مراجعه کنید).نرم افزار Docker Toolbox اولین ابزاری بود که در سال 2015 برای پشتیبانی از داکر در ویندوز تولید و منتشر شد. این ابزار در حقیقت یک ماشین مجازی مبتنی بر Virtual Box شرکت اوراکل است که توزیع boot2docker سیستم عامل لینوکس در آن نصب شده است. این ابزار مناسب اهداف یادگیری و یا تست کانتینرهای لینوکسی قبل از استقرار آن ها در محیط های عملیاتی لینوکسی می باشد. کاربرانی که سیستم عامل ویندوز دسکتاپ آن ها 64 بیتی و جزو نسخه های 7، 8، 8.1 یا 10 (ویرایش Home با شماره ساخت[14] ما قبل 1903) می باشد و امکان استفاده از ابزارهای جدیدتر داکر را ندارند، با نصب این ابزار می توانند کار با کانتینرهای لینوکسی داکر را در ویندوز تجربه نمایند. برای آشنایی با نحوه نصب Docker Toolbox بر روی ویندوز دسکتاپ می توانید به لینک مربوط در وب سایت داکر مراجعه نمائید.اما اگر شما جزء افرادی هستید که سیستم عامل ویندوز دسکتاپ آن ها 64 بیتی و نسخه 10 (ویرایش های Pro، Enterprise با شماره ساخت 1607 به بالا، Education با شماره ساخت 16299 به بالا) این خبر خوش برایتان هست که علاوه بر کانتینرهای لینوکسی، کانتینرهای ویندوزی نیز قابلیت اجرا شدن در نسخه های مذکور سیستم عامل ویندوز را دارند:کانتینرهای ویندوزی: کانتینرهای ویندوزی مکانیزم بومی و مخصوص خود ویندوز برای پشتیبانی از داکر می باشند. این نوع از کانتینرها بهترین گزینه برای سیستم عامل ویندوز است و مستقیما بر روی سیستم عامل ویندوز ماشین میزبان اجرا می شود و به آن ها اصطلاحا [15] WCOW گفته می شود.کانتینرهای لینوکسی: کانتینرهای لینوکسی مستقیما قابلیت اجرا بر روی سیستم عامل ویندوز را ندارند. لذا این نوع از کانتینرها بایستی بر روی یک لینوکس مجازی در سیستم عامل ویندوز اجرا شوند. پشتیبانی از کانتینرهای لینوکسی در ویندوز تا به امروز یک سیر تکاملی دارد که در ادامه به تشریح آن خواهم پرداخت.در سال 2016 داکر ابزار Docker for Windows را برای ویندوز دسکتاپ نسخه 10 (ویرایش های فوق الذکر) منتشر کرد. با نصب این نرم افزار، به طور خودکار یک ماشین مجازی لینوکسی به نام MobyLinuxVM که بر روی Hyper-V اجرا می شود، در ویندوز تان ساخته می شود (که بعد از نصب با مراجعه به نرم افزار Hyper-V Manager می توانید آن را مشاهده کنید). این نرم افزار در حقیقت نسخه CE پلتفرم داکر را به همراه تمام ابزارهای آن در سیستم عامل ویندوز نصب می کند. در این مدل، کلاینت داکر (یعنی همان Docker CLI) بر روی ویندوز دسکتاپ اجرا می شود و دیمن[16] داکر به همراه تمام وابستگی های مورد نیاز آن بر روی لینوکس مجازی Moby. نحوه کارکرد این مدل را می توانید در شکل زیر مشاهده کنید:مشکلی که مدل فوق دارد آنست که شما نمی توانید کانتینرهای لینوکسی و ویندوزی را همزمان با هم اجرا کنید، بلکه در هر لحظه فقط یکی از آن ها می توانند اجرا شوند. این مشکل در توسعه اپلیکیشن های هیبریدی[17] خود را نشان می دهد. مثلا اپلیکیشنی را در نظر بگیرید که خودش با زبان جاوا توسعه داده شده و در یک کانتینر لینوکسی بسته بندی شده است اما پایگاه داده آن با MS SQL Server طراحی و پیاده سازی شده و در یک کانتینر ویندوزی بسته بندی شده است. با استفاده از مدل فوق شما نمی توانید اپلیکیشن مذکور را در محیط توسعه لوکال ویندوزی خود به طور کامل تست کرده و اجرا نمائید.در سال 2017 داکر نوع جدیدی از کانتینرهای لینوکسی به نام [18] LCOW را برای ویندوز 10 معرفی نمود که مکانیزم بومی و مخصوص خود ویندوز برای پشتیبانی از کانتینرهای لینوکسی در ویندوز می باشد. قابلیت مهمی که LCOW با خود آورد این بود که یک موتور داکر به تنهایی قادر به اجرای ایمِج های چندین سیستم عامل مختلف باشد. با معرفی LCOW در سال 2017 و انتشار شماره 18.02.0-ce-rc1-win50 از نسخه Edge نرم افزار Docker Desktop (قبلا به آن Docker for Windows گفته می شد) در سال 2018 امکان اجرای همزمان کانتینرهای ویندوزی و لینوکسی در کنار هم برای سیستم عامل ویندوز 10 (ویرایش های Pro و Enterprise با شماره ساخت 1806 به بالا) فراهم شد. برای مشاهده راهنمای نصب نرم افزار Docker Desktop در ویندوز 10 (ویرایش های فوق الذکر) به لینک مربوط در وب سایت داکر مراجعه کنید. نصب نرم افزارDocker Desktop  در ویندوز 10 این امکان را برایتان فراهم می کند تا اولا نوع کانتینر خود را از ویندوزی به لینوکسی یا از لینوکسی به ویندوزی تغییر دهید (گزینه پیش فرض، کانتینر لینوکسی است)، و ثانیا کانتینرهای ویندوزی و لینوکسی را همزمان در کنار هم از داخل ویندوز اجرا نمائید. برای آشنایی با نحوه سوئیچ کردن بین کانتینرهای ویندوزی و لینوکسی در نرم افزار Docker Desktop به لینک مربوط در وب سایت داکر مراجعه کنید. همچنین برای مشاهده نحوه اجرای همزمان کانتینرهای ویندوزی و لینوکسی در کنار هم در سیستم عامل ویندوز 10 به کمک Docker Desktop، به این لینک در وب سایت مایکروسافت مراجعه نمائید.گام بعدی در سیر تکاملی پشتیبانی از کانتینرهای لینوکسی در ویندوز، انتشار نرم افزار Docker Desktop مبتنی بر قابلیت WSL 2 در سال 2020 با نام Docker Desktop WSL 2 backend می باشد. اینکه [19] WSL چیست و چه قابلیت های خاصی دارد خود نیازمند یک مقاله مفصل و جداگانه است. اما به طور خلاصه WSL یکی از قابلیت های جدید ویندوز ۱۰ است که می‌توانید با فعال کردن آن و نصب یک توزیع لینوکس از طریق فروشگاه مایکروسافت (Microsoft Store)، سیستم عامل لینوکس را بدون استفاده از یک ابزار مجازی سازی مثل VMware، به ‌صورت یک زیر سیستم لوکال در خود ویندوز اجرا کنید. برعکس نسخه اولیه WSL که از یک کرنل مجازی روی هسته ویندوز استفاده می‌کرد این بار در نسخه دوم WSL شاهد یک کرنل واقعی لینوکس در خود ویندوز هستیم که باعث افزایش سرعت اجرای دستورها، خواندن، و نوشتن اطلاعات در WSL می‌شود. در این نسخه از Docker Desktop، دیمن داکر درون همان توزیع لینوکسی که در WSL نصب کرده ایم اجرا خواهد شد و بر خلاف MobyLinuxVM که در نرم افزار Hyper-V Manager قابل مشاهده بود، توزیع نصب شده توسط WSL 2 در نرم افزار Hyper-V Manager قابل رویت نیست. علاوه بر آن WSL 2 بهبود های بسیار قابل توجهی را در اشتراک سیستم فایل، زمان بوت شدن سیستم عامل، تخصیص حافظه به صورت پویا، استفاده حداقلی از منابع پردازشی، زمان لازم برای راه اندازی دیمن داکر ارائه نموده است. WSL 2 ، آینده Docker Desktop برای سیستم عامل ویندوز خواهد بود. برای آشنایی بیشتر با Docker Desktop WSL 2 backend و نیز آموزش نحوه نصب آن به لینک مربوط در وب سایت داکر مراجعه نمائید.نصب Docker Desktop بر روی ویرایش Home ویندوز 10 (با شماره ساخت 1903 به بعد) با نصب آن بر روی سایر ویرایش های ویندوز 10 اندکی متفاوت است و ملاحظاتی نیاز دارد به عنوان مثال بایستی قابلیت WSL 2 بر روی ویندوز را از قبل فعال کرده باشید (برای مشاهده سایر نیازمندی ها و نیز راهنمای نصب نرم افزار Docker Desktop در ویرایش Home ویندوز 10 به لینک مربوط در وب سایت داکر مراجعه کنید). نکته قابل توجه اینکه در ویرایش Home ویندوز 10 شما فقط می توانید با کانتینرهای لینوکسی در نرم افزار Docker Desktop کار کنید نه کانتینرهای ویندوزی.توجه: از نسخه شماره 3.0.0 به بعد، نرم افزار Docker Desktop در یک نسخه تجمیعی واحد منتشر و در اختیار تمام کاربران قرار می گیرد و دیگر خبری از نسخه های Edge و Stable نیست.و اما ویندوز سرور. وقتی ویندوز سرور 2016 منتشر شد مایکروسافت با یک باز معماری مجدد امکان پشتیبانی از پروسه های ایزوله را در ویندوز فراهم ساخته بود. به لطف همین ویژگی جدید، ویندوز سرور نسخه 2016 به بالا، به صورت کاملا بومی و مخصوص و بدون اتکاء به هر گونه ابزار مجازی سازی مثل Hyper-V از داکر پشتیبانی می کند. همچنین لازم به ذکر است که ویندوز های سرور نسخه 2016 به بالا تنها نسخه هایی از سیستم عامل ویندوز (چه سرور چه دسکتاپ) هستند که به صورت کاملا بومی و بدون اتکا به ابزارهای ثالث از کانتینرهای ویندوزی پشتیبانی می کنند. پشتیبانی از کانتینرهای لینوکسی در ویندوز سرور به کمک Hyper-V فراهم می شود. در نسخه EE داکر و نیز با توجه به معرفی کانتینرهای لینوکسی نوع LCOW، امکان اجرای همزمان کانتینرهای ویندوزی و لینوکسی در کنار هم در ویندوز سرور 2016 به بالا فراهم است. نسخه EE داکر بدون هیچگونه هزینه اضافی در همان لایسنس خریداری شده برای ویندوز سرور ارائه می شود.اجرای همزمان کانتینرهای ویندوزی و لینوکسی در کنار هم در ویندوز سرور 2016 به بالا، به مدد نسخه CS یا تجاری [20] موتور داکر و نیز کانتینرهای لینوکسی نوع LCOWتوجه: وقتی از نرم افزار Docker Desktop استفاده می کنید، امکان استفاده از ابزارهای مجازی سازی مثل Virtual Box و VMWare فقط با ملاحظاتی امکان پذیر است به این معنی که همه نسخه های ابزارهای مذکور قابلیت کار کردن در کنار ابزار مجازی سازی Hyper-V ویندوز را ندارند. در صورتیکه از Virtual Box استفاده می کنید شماره نسخه آن حداقل باید 6 باشد، و همچنین در صورتیکه از VMWare استفاده می کنید شماره نسخه آن حداقل باید 15.5.5 باشد.توجه: اگر ویندوز تان جزو نسخه های 7، 8، 8.1 یا 10 (ویرایش Home با شماره ساخت ما قبل 1903) و نمی خواهید از ابزار Docker Toolbox استفاده کنید و علاقه مندید که کار با داکر را در لینوکس تجربه کنید و از طرف دیگر نصب لینوکس در کنار ویندوز به صورت بوت دوگانه[21] برایتان مشکل و دردسر ساز است کافیست تا از ابزار مجازی سازی VMWare استفاده کنید. لذا کافیست نرم افزار VMWare Player را نصب و آن را در حالت خاصی به نام «Unity Mode» اجرا نمائید. با اینکار شما می توانید ویندوز و لینوکس را یکجا کنار هم داشته باشید. سپس می توانید داکر را داخل ماشین مجازی لینوکس نصب و استفاده نمائید. کارایی این روش مناسب گزارش شده است و کل ابزارهای مورد اشاره نیز رایگان هستند.داکر در مکاگر از محصولات شرکت اپل استفاده می کنید و سیستم عامل شما از نوع OS X می باشد، شما هم می توانید کار با داکر را به مانند کاربران سیستم عامل های ویندوز و لینوکس تجربه کنید. در صورتیکه سیستم عامل مک شما ویرایش Yosemite با شماره نسخه 10.10.3 به بالاست (البته بهتر است سیستم عامل کامپیوتر خود را به شماره نسخه 10.11 به بالا ارتقا دهید، چونکه برای شماره نسخه های 10.10.X مسئولیت کار با خود شما خواهد بود و تضمینی نیست) می توانید نرم افزار Docker Desktop ویژه سیستم عامل خود را از وب سایت داکر دانلود و نصب کنید.اما در صورتیکه نسخه سیستم عامل شما از شماره نسخه 10.8 به پایین است و از نرم افزار Docker Desktop پشتیبانی نمی کند، می توانید مانند کاربران سیستم عامل ویندوز از ابزار Docker Toolbox برای کار با کانتینرهای لینوکسی استفاده نمائید.از کانتینرهای ویندوزی برای کانتینریزه نمودن اپلیکیشن هایمان استفاده کنیم یا کانتینرهای لینوکسی؟سرورهای ویندوزی و لینوکسی هر دو فناوری های تقریبا مشابهی را در سطح کرنل سیستم عامل های خود پیاده سازی می کنند. تفاوت بین کانتینرهای ویندوزی و لینوکسی از تفاوت بین پلتفرم ها و بار کاری ایکه در آن کانتینرها باید اجرا شود، ناشی می گردد نه چیز دیگری. به عنوان نمونه، وقتی کاربری از کانتینر مبتنی بر ویندوز سرور استفاده می کند می تواند یکپارچه سازی با فناوری های ویندوزی شامل .NET ، ASP.NET ، و PowerShell را داشته باشد.از طرف دیگر در توسعه اپلیکیشن های هیبریدی نیاز است تا شما هم از کانتینرهای ویندوزی استفاده کنید هم از کانتینرهای لینوکسی. مثلا همانطور که کمی بالاتر نیز اشاره شد، اپلیکیشنی را در نظر بگیرید که خودش با زبان جاوا توسعه داده شده و در یک کانتینر لینوکسی بسته بندی شده است اما پایگاه داده آن با MS SQL Server طراحی و پیاده سازی شده و در یک کانتینر ویندوزی بسته بندی شده است. به جز اپلیکیشن های هیبریدی، اپلیکیشن های بومی و مخصوص خود ویندوز نیز بایستی درون کانتینرهای ویندوزی بسته بندی شوند.یا حتی ممکن است شما اپلیکیشن های قدیمی ویندوزی داشته باشید که بخواهید آن ها را همانطور به فضاهای ابری منتقل کنید. در این صورت راه حل چیست؟ راه حل آنست که به کمک داکر نسخه EE ابتدا آن اپلیکیشن را در قالب یک کانتینر ویندوزی بسته بندی نمائید و سپس آن را به فضای ابری منتقل کنید.با توجه به مجموعه مطالبی که بیان شد، می توان موارد زیر را به عنوان جمع بندی مطرح نمود:پر واضح است که مایکروسافت و داکر در یک همکاری مشترک مهندسی در حال توسعه فناوری های مرتبط با پشتیبانی از داکر در ویندوز هستند اما بسیاری از قابلیت هایی که امروز در ویندوز در دسترس است در فاز آزمایشی هستند. لذا بهتر آنست تا گزینه اول شما برای کار با داکر، استفاده از کانتینرهای لینوکسی باشد.برای استقرار اپلیکیشن در محیط های عملیاتی، اگر کانتینر لینوکسی است حتما از لینوکس سرور، و اگر کانتینر ویندوزی است حتما از ویندوز سرور استفاده کنیم.از ابزارهای پشتیبانی داکر در سیستم عامل های مک و ویندوز دسکتاپ شامل Docker Toolbox و Docker Desktop فقط برای توسعه و تست اپلیکیشن های کانتینریزه شده استفاده کنیم نه برای استقرار در محیط های عملیاتی.با وجود اینکه ویندوز سرور نسخه 2016 به بالا از Docker Desktop پشتیبانی می کند، برای استقرار اپلیکیشن های کانتینریزه شده در محیط های عملیاتی هرگز از Docker Desktop استفاده نکنید. البته برخی از برنامه نویسان عادت دارند تا برای محیط توسعه لوکال خود نیز از ویندوز سرور استفاده کنند که در این حالت اگر نیاز باشد می توانند از Docker Desktop استفاده کنند.در حال حاضر برخی از ارائه دهندگان زیر ساخت های ابری از کانتینرهای ویندوزی پشتیبانی نمی کنند.در پایان اینکه، تهیه مطلبی به روز پیرامون نسخه های داکر و پشتیبانی از آن در سیستم عامل های مختلف کار بسیار دشواری بود که امیدوارم توانسته باشم از عهده آن بر آیم. لذا در صورت مفید واقع شدن مطلب خواهشمندم با نظرات ارزشمند و لایک های خود به هر چه بیشتر دیده شدن آن کمک کنید.در صورتیکه از داکر چیزی نمی دانید یا اینکه فکر می کنید دانسته هایتان از داکر به قدر کفایت نیست و مشتاقید بدانید که مفاهیمی مثل کانتینر و ایمج دقیقا چه هستند و به چه کار می آیند پیشنهاد می کنم مقاله ایکه قبلا در همین رابطه نوشته ام را مطالعه بفرمایید:داکر به زبان آدمیزاد[1] Monolithic[2] Paradigm[3] Most Wanted[4] Most Loved[5] Orchestrator[6] Community Edition[7] Enterprise Edition[8] Mac[9] Native[10] به انگلیسی Overlay Networking. شبکه ای رایانه‌ای است که به صورت منطقی در بالادست یک شبکه ی دیگر ساخته می‌شود. هر گره (شبکه) از این شبکه توسط یک لینک فیزیکی یا مجازی به گره ی متناظر در شبکه پایینی متصل است. به عنوان مثال خود شبکه اینترنت یک شبکه همپوشان بر روی شبکه تلفن  به عنوان شبکه پایین دستی است.[11] Lift and Shift[12] Bug Fix[13] Image[14] برای آگاهی از نسخه و نیز شماره ساخت سیستم عامل ویندوز خود می توانید در پنجره Run ویندوز، دستور winver را وارد کرده و دکمه ok را بفشارید.[15] Windows Containers on Windows[16] Daemon[17] Hybrid[18] Linux Containers on Windows[19] Windows Subsystem for Linux[20] Commercially Supported[21] Dual Boot</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Sat, 17 Oct 2020 17:34:01 +0330</pubDate>
            </item>
                    <item>
                <title>داکر به زبان آدمیزاد</title>
                <link>https://virgool.io/@taghaniali/%D8%AF%D8%A7%DA%A9%D8%B1-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A2%D8%AF%D9%85%DB%8C%D8%B2%D8%A7%D8%AF-i1tasscheoam</link>
                <description>اگر که یک برنامه نویس یا مدیر سیستم[1] هستید اما هنوز مهارت و تجربه کار با فناوری داکر را در رزومه خودتون ندارید، بدون شک در این برهه از زمان لازمه که این مهارت ضروری را کسب و به رزومه تون اضافه کنید. شما هم ممکنه مثل من همکاران یا دوستان برنامه نویسی داشته باشید که با حرارت خاصی از داکر صحبت می کنند و اینکه فلان پروژه را اصطلاحا داکریزه[2] کرده اند و چه و چه. ولی وقتی بخواهند داکر را به صورت قابل فهم برای یک فرد که سطح متوسطی از دانش فناوری اطلاعات رو داره توضیح بدن، دچار مضیقه می شوند. در این مقاله می خواهم از داکر و تمام عظمت آن به طور خلاصه و قابل فهم رمز زدایی کرده و آن را برایتان تبیین کنم.احتمالا شما نیز این جمله را زیاد از برنامه نویس های مختلف شنیده باشید که : «برنامه در کامپیوتر من کار می کنه ها، نمی دونم چرا در کامپیوتر شما کار نمی کنه». یکی از اهدافی که در روندهای جدید پروژه های توسعه نرم افزار دنبال می شود، آن است که بتوان نرم افزارها را به سرعت، به راحتی و قابل اعتماد[3] (یعنی بدون خرابی[4]) در پلتفرم[5]ها و محیط(شامل توسعه، بتا/تست، و عملیاتی) های مختلف توسعه داد، تست کرد، استقرار[6] داد و اجرا نمود.یکی از راه‌ کارهای تحقق این هدف استفاده از فناوری ماشین مجازی است. ماشین های مجازی به کمک هایپروایزر[7] (مدیر ماشین های مجازی) این امکان را به ما می دهند که یک سرور فیزیکی را به چندین سرور مجازی مجزا تقسیم کنیم به گونه ایکه هر ماشین مجازی می تواند یک کپی کامل از یک سیستم عامل را داشته باشد.فناوری ماشین مجازی و هایپروایزر با وجود اینکه ماشین های مجازی مزیت بزرگ امکان اجرای چندین سیستم عامل مختلف یا نسخه های مختلف یک سیستم عامل بر روی یک زیرساخت فیزیکی را فراهم می آورند اما مشکلاتی هم دارند. از جمله اینکه ماشین های مجازی نیاز به فضای ذخیره سازی بزرگی (چند گیگابایت) دارند، منابع محاسباتی زیادی را می توانند مصرف کنند، و زمان بوت شدن آن ها نیز طولانی (چند دقیقه) است.راه کار دیگر که امروزه بسیار محبوب و پرطرفدار است استفاده از فناوری کانتینر است. کانتینر مستقیما در کرنل[8] سیستم عامل اجرا می شود. از آنجاییکه که کانتینر ها در عین حالیکه در پروسه های ایزوله اجرا می شوند، می توانند هسته سیستم عامل را بین یکدیگر به اشتراک بگذارند بنابراین چندین کانتینر مختلف می توانند به طور همزمان بر روی یک سیستم عامل میزبان اجرا شوند. کانتینرها نسبت به ماشین های مجازی فضای ذخیره سازی کمتر(معمولا چند مگابایت) نیاز دارند، منابع محاسباتی کمتری را مصرف کنند، و زمان بوت شدن آن ها نیز کوتاه (چند ثانیه) است. بنابراین به کمک کانتینرها می توان حداکثر تعداد نرم افزارها را بر روی حداقل تعداد سرور ها اجرا نمود و در مصرف منابع محاسباتی صرفه جویی گسترده ای را رقم زد.با وجود مزایا و معایب هر یک از فناوری های مورد بحث در بالا، استفاده از کانتینرها و ماشین های مجازی با هم می تواند انعطاف پذیری ویژه ای را برای استقرار و مدیریت نرم افزارها به ارمغان آورد.کانتینر چیست؟به عبارت خیلی ساده یعنی: یک واحد استاندارد شده از یک نرم افزار خاص، درست مثل اینکه بگوییم یک واحد آپارتمان یا یک دستگاه اتومبیل.اما در یک تعریف کامل تر، کانتینر[9] نرم افزاری کوچک، سبک(با کمترین میزان استفاده از منابع محاسباتی) و سریع است که به کمک آن می توان کد یک نرم افزار را به همراه تمامی وابستگی ها و جزئیات پیکربندیش در قالب یک بسته استاندارد شده و قابل حمل جمع آوری نمود به گونه ایکه به سرعت، به راحتی و قابل اعتماد (یعنی بدون خرابی) بتوان آن را در پلتفرم ها و محیط(شامل توسعه، بتا/تست، و عملیاتی) های مختلف توسعه داد، تست کرد، استقرار داد و اجرا نمود.باید توجه داشته باشید که کانتینرها جزئی از اکوسیستم لینوکس هستند نه ویندوز. لینوکس سیستم عامل بهتری نسبت به ویندوز است، و معماری آن خصوصا کرنل و سیستم فایلش بسیار بهتر از ویندوز است.استفاده از کانتینرها برای استقرار اپلیکیشن ها را اصطلاحا کانتینریزاسیون[10] می نامند.فناوری کانتینر داکر کانتینریزاسیون به طور فزاینده ای درحال محبوب شدن است چونکه کانتینرها :انعطاف پذیرند: پیچیده ترین اپلیکیشن ها را نیز می توان کانتینریزه نمود،سبک اند: کانتینرها از هسته سیستم عامل ماشین میزبان استفاده می کنند و آن را در بین خود به اشتراک می گذارند، لذا نسبت به ماشین های مجازی از لحاظ منابع سیستمی مورد نیاز کارآمدترند،قابل حمل اند: می توانید آن ها را در محیط لوکال خود بسازید، در زیرساخت ابری استقرار دهید، و در هر جایی اجرایشان کنید.حداقل کوپل شدگی[11] را دارند: کانتینرها کاملا کپسوله[12] و بسیار خود بسنده[13] هستند، لذا شما می توانید یکی از آن ها را بدون مختل کردن عملکرد سایر کانتینرها جایگزین کنید یا ارتقا[14] دهید،مقیاس پذیر[15] ند: می توان نسخه های المثنی[16] برای کانتینرها ایجاد نمود و به طور خودکار آن ها را در یک دیتاسنتر نوعی توزیع و توزین نمود،ایمن اند: کانتینرها برای ایزوله سازی فرایند ها محدودیت های اجباری[17] را به کار می برند بدون اینکه نیاز باشد هیچگونه پیکر بندی خاصی توسط کاربر انجام شود.داکر چیست؟داکر[18] یک پلتفرم متن باز کانتینریزاسیون است. علاوه بر پلتفرم بودن، داکر یک مجموعه ابزار هم دارد که برنامه نویسان و مدیران سیستم[19] را قادر می سازد تا به کمک دستورات ساده و فرآیندهای خودکار اقدام به مدیریت چرخه حیات کانتینرها و به طور دقیق تر اقدام به ساخت، استقرار، اجرا، توقف، بروز رسانی، و حذف کانتینرها نمایند. هر چند که بدون داکر هم می توان مجموعه عملیات مذکور را انجام داد، اما داکر انجام آن ها را آسان تر، ساده تر، و ایمن تر می کند.یک کاربرد نوعی از داکر را می توان در قالب سناریوی زیر بیان کرد:توسعه دهندگان کد نرم افزار را در محیط توسعه لوکال خودشان می نویسند و کارشان را با استفاده از کانتینرهای داکر با سایر همکارانشان به اشتراک می گذارند،برای اجرای انواع تست های خودکار و غیرخودکار بر روی نرم افزار، تنها کافیست تا کانتینر مربوط را از محیط توسعه به محیط بتا/تست منتقل کرده و با استفاده از داکر آن را در آنجا استقرار دهند،اگر توسعه دهندگان، اشکال نرم افزاری خاصی را پیدا کنند، می توانند آن را در محیط توسعه لوکال خود برطرف کرده و مجددا کانتینر مربوط را به محیط تست منتقل، و آزمون های اعتبار سنجی لازم را بر روی آن اجرا کنند،تست نرم افزار که تمام شد، تحویل آن به مشتری به سادگی انتقال کانتینر به روز رسانی شده به محیط عملیاتی و نهایتا استقرار آن توسط داکر است.ماهیت سبک و قابل حمل داکر، مدیریت پویای بار و ظرفیت کاری[20] سیستم های نرم افزاری را بسیار ساده می کند، طوریکه می توان بر اساس نیاز های کسب و کار و به صورت تقریبا بلادرنگ، ظرفیت اپلیکیشن ها و سرویس ها را افزایش یا کاهش داد.کانتینر چیز جدیدی نیست، اما استفاده از آن برای استقرار آسان اپلیکیشن ها جدید است. نخستین فناوری های مرتبط با کانتینر سال ها و حتی دهه ها پیش از سال 2013 که داکر به صورت یک پروژه متن باز به نام «موتور داکر[21]» و تحت لیسانس Apache 2.0 برای عموم منتشر شود، وجود داشتند. در بین آن فناوری ها به طور ویژه می توان از (LXC (LinuX Containers که در سال 2008 در کرنل لینوکس پیاده سازی شده بود و امکان مجازی سازی کامل یک نمونه[22] از سیستم عامل لینوکس را فراهم می کرد، نام برد. در نسخه های اولیه داکر منحصرا از فناوری LXC استفاده می شد اما داکر خیلی زود فناوری اختصاصی کانتینریزاسیون خود را با ویژگی های منحصر به فرد توسعه داد.هر چند که در حال حاضر داکر محبوب ترین فناوری کانتینریزاسیون است، اما از دیگر گزینه های موجود برای کار با کانتینرها می توان به RKT از CoreOS، LXC، LXD از Canonical، OpenVZ، Jails، و کانتینرهای ویندوزی اشاره نمود.موتور داکرموتور داکر یک اپلیکیشن کلاینت-سروری و شامل مؤلفه های اصلی زیر می باشد:سرور: یک پروسه[23] که برای مدت طولانی در زمینه[24] در حال اجراست و وظیفه اش ساخت و مدیریت آبجکت های داکر مثل ایمِج[25] ها، کانتینرها، شبکه ها، و توده های داده[26] می باشد. به این پروسه اصطلاحا دیمن[27] داکر می گویند (دستور dockerd) که نقش قلب موتور داکر را ایفا می کند،واسط REST API: واسط لازم برای صحبت کردن با دیمن داکر و فرمان دادن به آن را تعیین می کند،کلاینت: یک اپلیکیشن از نوع واسط خط فرمان[28] است که آن را Docker CLI می نامند (دستور docker). ما برای کنترل یا تعامل با دیمن داکر، از طریق دستورات مستقیم یا اسکریپت[29] نویسی با کلاینت صحبت می کنیم، کلاینت هم به نوبه خود با REST API صحبت می کند، نهایتا REST API هم با دیمن داکر صحبت می کند. Docker CLI کلاینت رسمی داکر برای برقراری ارتباط با دیمن داکر است اما علاوه بر آن کلاینت های غیر رسمی دیگری مثل ترمینال Dry نیز برای این منظور وجود دارد که بعضا امکانات بیشتری هم نسبت به کلاینت رسمی داکر دارند مثل امکان مانیتورینگ کانتینرها در ترمینال.موتور داکرمعماری داکرداکر از یک معماری کلاینت-سرور بهره می برد. کلاینت داکر با دیمن که کار سنگین ساخت، اجرا و توزیع کانتینرهای داکر را به دوش دارد، صحبت می کند. کلاینت و دیمن داکر می توانند هر دو روی یک ماشین اجرا شوند، یا اینکه کلاینت داکر می تواند به یک دیمن ریموت متصل شود. داکر برای صحبت کردن با دیمن یک REST API و همچنین SDK-هایی مخصوص زبان های برنامه نویسی GO و Python (برای سایر زبان های برنامه نویسی نیز کتابخانه های غیر رسمی وجود دارد که توسط داکر تست نشده اند) فراهم کرده است. در صورتیکه زبان های برنامه نویسی GO و  Pythonمناسب کار شما نیست می توانید مستقیما REST API را بر روی سوکت های [30] UNIX یا سوکت های [31] TCP/IP استفاده کنید. برای فراخوانی این API می توان از یک کلاینت HTTP مثل wget یا curl، و یا از یک کتابخانه HTTP که امروزه دیگر بخشی از اکثر زبان های مدرن برنامه نویسی است، استفاده نمود. در ادامه به طور خلاصه به معرفی هر یک از مؤلفه های موجود در معماری داکر مطابق شکل زیر می پردازیم:معماری داکردیمن داکردیمن داکر (dockerd) به درخواست های فراخوانی API گوش می دهد و کار مدیریت آبجکت های داکر مثل ایمِج ها، کانتینرها، شبکه ها، و توده های داده را انجام می دهد. یک دیمن همچنین می تواند به منظور مدیریت سرویس های داکر، با دیمن های دیگر ارتباط برقرار کند.کلاینت داکرکلاینت داکر (docker) اصلی ترین مکانیزمی است که اکثر کاربران برای تعامل با دیمن داکر از آن استفاده می کنند. وقتی دستوراتی مثل docker run را در کلاینت وارد می کنیم، کلاینت نیز آن دستورات را برای اجرا شدن به dockerd ارسال می کند. دستور docker از API داکر استفاده می کند. یک کلاینت داکر همچنین می تواند با بیش از یک دیمن ارتباط برقرار کند.رجیستری های داکروظیفه یک رجیستری داکر ذخیره ایمِج های داکر است. هاب داکر[32] یک رجیستری عمومی است که هر شخصی می تواند از آن استفاده کند. برای توسعه دهندگان نرم افزارها، هاب داکر نقطه شروع است. با ایجاد یک حساب کاربری در هاب داکر می توانید از میلیون ها ایمِج داکر در دسترس از انجمن رسمی داکر و نیز ناشران مورد تایید آن استفاده نمائید یا اینکه ایمِج های خودتان را با سایرین به اشتراک بگذارید. داکر طوری پیکر بندی شده است که به طور پیش فرض ایمِج ها را در هاب داکر جستجو کند. اما علاوه بر رجیستری عمومی داکر می توانیم رجیستری خصوصی نیز برای خود داشته باشیم.وقتی از دستور docker pull یا docker run استفاده می کنید، ایمِج های مورد نیاز از رجیستری پیکر بندی شده توسط شما، واکشی خواهند شد. وقتی هم که از دستور docker push استفاده می کنیم، ایمِج مورد نظر در رجیستری پیکر بندی شده توسط شما قرار داده خواهد شد.آبجکت های داکرزمانیکه از داکر استفاده می کنیم، در حقیقت در حال ساخت و استفاده از ایمِج ها، کانتینرها، شبکه ها، توده های داده، پلاگین ها، و سایر آبجکت های داکر هستیم.ایمِج هاایمِج یک قالب از نوع فقط-خواندنی[33] است و دستورالعمل های ساخت یک کانتینر داکر را در خود جای می دهد. غالبا یک ایمِج نوعی، نسخه سفارشی سازی شده از یک ایمِج پایه دیگر است. به عنوان مثال، ممکن است شما یک ایمِج بر پایه ایمِج سیستم عامل ابونتو[34] بسازید، اما در آن وب سرور آپاچی و اپلیکیشن تان را به همراه جزئیات پیکر بندی مورد نیاز جهت اجرا شدن آن نیز نصب نمائید. بنابراین ایمِج یک بسته سبک، مستقل، و قابل اجرا از یک نرم افزار است و تمام مواردیکه برای اجرای آن نرم افزار نیاز است مثل کد، محیط اجرا[35]، ابزارهای سیستمی، کتابخانه ها و تنظیمات سیستمی، و فایل های پیکربندی را در خود دارد.ممکن است شما بخواهید ایمِج خودتان را بسازید یا اینکه فقط از ایمِج های ساخته شده و منتشر شده توسط دیگران بر روی یک رجیستری خاص داکر استفاده نمائید. برای ساخت ایمِج خودتان باید با استفاده از یک نحو[36] ساده مراحل مورد نیاز برای ساخت و اجرای ایمِج را به صورت یک فایل داکر[37] که یک فایل متنی خاص است، ایجاد کنید. هر دستورالعمل در فایل داکر، یک لایه مجزا در ایمِج ایجاد می کند. وقتی که تغییری در فایل داکر می دهید و آن ایمِج را بازسازی[38] می کنید، فقط لایه های تغییر داده شده از نو ساخته خواهند شد. این قابلیت جزئی از چیزیست که باعث می شود ایمِج ها نسبت به سایر فناوری های مجازی سازی سبک تر، کوچک تر، و سریع تر باشند.کانتینرهاکانتینر یک نمونه قابل اجرا از یک ایمِج است. شما می توانید با استفاده از API داکر یا CLI اقدام به ساخت، راه اندازی، توقف، جابجایی یا حذف یک کانتینر نمائید. یک کانتینر را می توان به یک یا چند شبکه متصل نمود، فضای ذخیره سازی به آن اضافه نمود، یا حتی ایمِج دیگری را بر اساس وضعیت کنونی آن ایجاد نمود.به طور پیش فرض، یک کانتینر به طور کامل از سایر کانتینرها و نیز ماشین میزبانش ایزوله است. شما می توانید چگونه ایزوله بودن شبکه، فضای ذخیره سازی یا حتی زیر سیستم های یک کانتینر از سایر کانتینرها یا از ماشین میزبان را کنترل کنید.یک کانتینر از روی ایمِج اش و نیز هر گونه پیکر بندی که موقع ساخت یا اجرا کردنش برایش فراهم می کنیم، تعریف می شود. وقتی کانتینری حذف می شود، هر گونه تغییری در وضعیت آن که بر روی فضای ذخیره سازی نگهداری نشده باشد، از بین خواهد رفت.گاهی از اوقات اصطلاحات کانتینر داکر و ایمِج داکر اشتباهی به جای یکدیگر استفاده می شوند، در صورتیکه با هم فرق دارند. همانطور که در بالا گفته شد کانتینر یک نمونه از ایمِج در محیط اجراست یعنی ایمِج ها وقتی توسط موتور داکر اجرا شوند تبدیل به کانتینر می شوند و در حافظه[39] قرار می گیرند. بنابراین به طور خلاصه وقتیکه فایل داکر نوشته شد با آن می توان ایمِج را ساخت و از روی ایمِج می توان کانتینر را ساخت و اجرا نمود که همه این کارها توسط موتور داکر انجام می شود.نمونه هایی از کانتینرهای داکر که هر کدام از روی یک ایمِج خاص ساخته شده اند.مثالی از دستور docker runدستور زیر یک کانتینر Ubuntu را اجرا می کند، و آن را به سشن[40] خط فرمان تان الصاق و مرتبط می کند، و /bin/bash که شل[41] پیش فرض برای لاگین کاربر به لینوکس است را اجرا می کند:$ docker run -i -t ubuntu /bin/bashزمانیکه این دستور را اجرا می کنید، موارد زیر رخ می دهند(فرض بر این است که شما در پیکر بندی تان از رجیستری پیش فرض داکر یعنی داکر هاب استفاده می کنید):1. در صورتیکه ایمِج ubuntu را در لوکال خودتان نداشته باشید، داکر ابتدا آن را از رجیستری پیکر بندی شده ی شما واکشی می کند، درست مثل اینکه خودتان به طور دستی دستور docker pull ubuntu را اجرا کرده باشید.2. داکر یک کانتینر جدید می سازد، درست مثل اینکه خودتان به طور دستی دستور docker container create را اجرا کرده باشید.3. داکر یک سیستم فایل با قابلیت خواندن-نوشتن را، به عنوان لایه پایانی به آن کانتینر اختصاص می دهد. این کار یک کانتینر در حال اجرا را قادر می سازد تا فایل ها و دایرکتوری ها را در سیستم فایل لوکال خودش ایجاد یا دست کاری کند،4. از آنجاییکه قبلا هیچ گزینه ای را برای پیکر بندی شبکه آن کانتینر مشخص ننموده اید، داکر برای آن یک واسط شبکه جهت اتصال به شبکه پیش فرض را ایجاد می کند. این عمل داکر شامل اختصاص آی پی به آن کانتینر هم می شود. به طور پیش فرض، کانتینرها می توانند از طریق ارتباط شبکه ای ماشین میزبان به شبکه های بیرونی نیز متصل شوند.5. داکر کانتینر را راه اندازی کرده و /bin/bash را اجرا می کند. از آنجاییکه کانتینر به صورت تعاملی در حال اجراست و ترمینال تان هم به آن متصل است (به خاطر پرچم های i- و t-)، شما می توانید از طریق صفحه کلید به آن ورودی بدهید و لاگ[42] خروجی را در ترمینال مشاهده نمائید.6. زمانیکه دستور exit را برای خاتمه دادن به /bin/bash بنویسید، کانتینر متوقف می شود ولی حذف نخواهد شد. شما می توانید مجددا آن را راه اندازی یا حذف کنید.سرویس هاسرویس ها به شما این امکان را می دهند که کانتینرها را در چندین دیمن داکر یا اصطلاحا نود[43] داکر توزین[44] کنید، در این حالت همه دیمن ها با هم به صورت یک کل به نام [45] swarm(بخوانید اس وارم) کار خواهند کرد و بهره بردار سرویس آن را به صورت یک اپلیکیشن واحد خواهد دید. هر دیمن داکر در حالت swarm یک نود مدیر[46] یا یک نود کارگزار[47] یا هر دوی آن ها خواهد بود. سرویس در حقیقت عبارتست از تعریف وظایفی[48] که باید در نودهای مدیر یا کارگزار اجرا شوند. کاربر می تواند به طور پویا یک نود را از نوع کارگزار به نوع مدیر ارتقا دهد یا اینکه یک نود از نوع مدیر را به نوع کارگزار تقلیل دهد. در سرویس علاوه بر خود وظایف، نحوه اجرا و به روز رسانی آن ها نیز تعریف می شود.حالت swarm داکرسرویس ساختار مرکزی سیستم swarm و نقطه اصلی تعامل کاربر با آن می باشد. داخل swarm دیمن ها از طریق API داکر با هم صحبت می کنند. swarm مکانیزم بومی و مخصوص[49] خود داکر برای هماهنگی[50] و مدیریت یک گروه[51] از موتور های داکر (یا اصطلاحا نود های داکر) است. کوبرنتیز[52] ابزار غیر بومی اما متن باز دیگریست که توسط شرکت گوگل توسعه داده شده است و معمولا در سناریوهای پیچیده مدیریت و هماهنگی گروهی از نودهای داکر استفاده می شود.از طریق سرویس ها می توان جزء به جزء حالت موردنظر را تعریف کرد. وقتی یک سرویس را ایجاد می کنیم در حقیقت حالت بهینه آن را تعریف می کنیم مثل تعداد نسخه های المثنی که بایستی در هر زمانی در دسترس باشند، منابع شبکه و ذخیره سازی که در دسترسش خواهد بود، پورت هاییکه برای بیرون باید باز باشد، و ... . به طور پیش فرض، اجرای سرویس بین تمام نودهای کارگزار توزیع بار می شود. نکته پایانی اینکه موتور داکر حالت swarm را در نسخه 1.12 به بعد داکر پشتیبانی می کند.فناوری های بنیادین و زیربنایی داکرقبل تر ذیل عنوان داکر توضیح داده شد که سال های پیش از آنکه داکر برای استفاده عموم منتشر شود فناوری های مرتبط با داکر وجود داشتند. در این قسمت به طور خلاصه به آن می پردازیم. داکر با زبان GO نوشته شده است و برای ارائه کارکردهایش از قابلیت های مختلف هسته سیستم عامل لینوکس بهره می برد.فضاهای نام[53]داکر برای فراهم نمودن فضاهای کاری ایزوله یا همان کانتینر، از یک فناوری به نام namespaces استفاده می کند. وقتی کانتینری را اجرا می کنید، داکر مجموعه ای از فضاهای نام را برای آن کانتینر ایجاد می کند.این فضاهای نام یک لایه ایزوله ایجاد می کنند. هر جنبه از یک کانتینر در یک فضای نام مجزا و با دسترسی محدود به آن اجرا می شود.موتور داکر از فضاهای نام لینوکسی زیر استفاده می کند:فضای نام pid : ایزوله سازی پروسه ها (PID: Process ID)فضای نام net : مدیریت واسط های شبکه (NET: Networking)فضای نام ipc : مدیریت دسترسی به منابع IPC یا همان منابع سیستم عامل مثل صف های پیام[54]، حافظه مشترک[55]، و سمافورها[56] (IPC: Inter-Process Communication)فضای نام mnt : مدیریت نقاط یا دایرکتوری های معرفی[57] سیستم فایل به سیستم عامل (MNT: Mount)فضای نام uts : به اشتراک گذاری هسته سیستم عامل بین فرآیندهای مختلف (UTS: Unix Timesharing System)گروه های کنترلی[58]موتور داکر در لینوکس به فناوری دیگری به نام cgroups نیز متکی است.  این فناوری در سال 2006 توسط مهندسان گوگل در سیستم عامل لینوکس ابداع شد. یک cgroup، یک اپلیکیشن را محدود به مجموعه خاصی از منابع می کند. گروه های کنترلی، موتور داکر را قادر می سازند تا منابع سخت افزاری موجود را بین کانتینرها به اشتراک بگذارد و به طور انتخابی محدودیت ها و قیدهایی را نیز برایشان الزام کند. به عنوان مثال شما می توانید ظرفیت حافظه در دسترس یک کانتینر خاص را محدود کنید.سیستم فایل های مجتمع[59]سیستم فایل های از نوع مجتمع یا اصطلاحا UnionFS، سیستم فایل هایی هستند که با مکانیزم لایه سازی عمل می کنند ویژگی ایکه آن ها را بسیار سبک و سریع می کند.  به طور خیلی ساده سیستم فایل مجتمع از یک سری لایه تشکیل شده است و هر زمانیکه تغییری در سیستم فایل (مثلا تغییر نام یک فایل یا دایرکتوری خاص) به وجود آید، آن تغییر در یک لایه جدید در بالای تمام لایه های دیگر ثبت می شود. به کمک این نوع از سیستم فایل می توان فایل ها و دایرکتوری های سیستم فایل های مجزا از هم را در اختیار گرفت و از محتوای آن ها یک اجتماع منسجم در بالاترین لایه ایجاد نمود به این صورت که در این لایه تمامی فایل ها و دایرکتوری های با نام و مسیر یکسان در سیستم فایل های مختلف، در یک مسیر جدید در بالاترین لایه ادغام و جایگزین خواهند شد. موتور داکر نیز در مؤلفه های تشکیل دهنده ی کانتینرها از UnionFS استفاده می کند (همانطور که ذیل عنوان ایمِج ها توضیح داده شد، هر دستورالعمل در فایل داکر، یک لایه مجزا در ایمِج ایجاد می کند، و زمانیکه تغییری در فایل داکر می دهید و آن ایمِج را بازسازی می کنید، فقط لایه های تغییر داده شده از نو ساخته خواهند شد). موتور داکر استفاده از چندین نوع UnionFS مختلف شامل AUFS، btrfs، vfs، و DeviceMapper را پشتیبانی می کند.فرمت کانتینرموتور داکر به منظور تعریف استاندارد مشخصات پیکر بندی کانتینرها و نیز مدیریت چرخه حیات آن ها، از ترکیب فضاهای نام، گروه های کنترلی و سیستم فایل مجتمع در قالب یک پوشش[60] جدید به نام Container Format استفاده می کند. در حال حاضر، libcontainer گزینه پیش فرض داکر برای این منظور است. در آینده ممکن است داکر با هم افزایی فناوری هایی مثل BSD Jails یا Solaris Zones، فرمت های دیگری را نیز پشتیبانی کند.آنچه در مقاله بعدی خواهید خواند:کانتینر ویندوزی یا کانتینر لینوکسی؟ داکر زیر ذره بین[1] Sysadmin[2] Dockerize[3] Reliable[4] Failure Free[5] پلتفرم متفاوت از زبان برنامه نویسی است و می تواند یک نرم افزار مثل مرورگر وب، سخت افزار، نرم افزار-سخت افزار، سیستم عامل، ماشین مجازی، ماشین فیزیکی، زیرساخت ابری، و یا هر ترکیبی از این موارد باشد.[6] Deploy[7] Hypervisor[8] Kernel[9] Container[10] Containerization[11] Loosely Coupled[12] Encapsulated[13] Self Sufficient[14] Upgrade[15] Scalable[16] Replica[17] Aggressive Constraints[18] Docker[19] Sysadmin[20] Workload[21] Docker Engine[22] Instance[23] Process[24] Background[25] Image[26] Data Volume[27] Daemon[28] Command Line Interface[29] اسکریپت‌ها برنامه‌های کوچکی هستند که به کمک آن‌ها به راحتی می‌توان برخی از وظایف تکراری و یا طولانی را به طور خودکار انجام داد.[30] سوکت یونیکس یا IPC Socket یک نوع درگاه مخابراتی داده است که از آن می توان برای انتقال داده ها به صورت دو طرفه بین دو فرایند که هر دو بر روی یک سیستم عامل میزبان اجرا می شوند، استفاده نمود.[31]  سوکت TCP/IP یک نوع درگاه مخابراتی داده است که از آن می توان برای انتقال داده ها به صورت دو طرفه بین دو فرایند بر روی شبکه، استفاده نمود. در برخی مواقع می توان برای انتقال داده ها بین دو فرایند که هر دو بر روی یک سیستم عامل میزبان اجرا می شوند نیز ازین نوع سوکت ها بهره برد اما توصیه می شود در این حالت از سوکت های یونیکس که به دلایل مختلف سریع تر هستند استفاده نمود.[32] Docker Hub[33] Read Only[34] Ubuntu[35] Runtime[36] Syntax[37] Docker file[38] Rebuild[39] Memory[40] Session[41] Shell[42] Log[43] Node[44] Scale[45] به فارسی یعنی خوشه، گروه[46] Manager[47] Worker[48] Tasks[49] Native[50] Orchestration[51] Cluster[52] Kubernetes[53] Namespaces[54] Message Queue[55] Shared Memory[56] به انگلیسی Semaphore و به فارسی اصطلاحا نشانبر. یکی از ساده ترین مفاهیم سیستم عامل است و به متغیری گفته می شود که در محیط های همروند از آن برای کنترل دسترسی فرآیندها به منابع مشترک استفاده می شود.[57] Mount[58] Control Groups[59] Union File Systems[60] Wrapper</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Fri, 09 Oct 2020 21:53:21 +0330</pubDate>
            </item>
                    <item>
                <title>مقدمه ای بر عملگرها در جاوا اسکریپت - قسمت آخر</title>
                <link>https://virgool.io/@taghaniali/%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1-%D8%B9%D9%85%D9%84%DA%AF%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%82%D8%B3%D9%85%D8%AA-%D8%A2%D8%AE%D8%B1-jw0sflbokayy</link>
                <description>عملگرهای بیتی (Bitwise) آخرین گروه از عملگرهای جاوا اسکریپت هستند که در این مطلب مورد بررسی قرار خواهند گرفت. بررسی عملگرهای بیتی نیارمند آنست که با مفاهیم علوم کامپیوتر نیز آشنایی نسبی داشته باشید. اما چون توضیح آن مفاهیم خارج از حوصله این دوره آموزشی ابتدایی است از پرداختن به آن ها صرفنظر می کنیم. البته این را هم در نظر داشته باشید که این گروه از عملگرها به نسبت سایر عملگرها کاربردهای کمتری در برنامه های واقعی دارند و بیشتر جنبه تئوری دارند و چیزهایی نیستند که شما همیشه در برنامه هایتان با آن ها سر و کار داشته باشید ولی به هر حال کاربرد خودشان را دارند. در پایان نیز مختصری به موضوع تقدم عملگرها (Operator Precedence) در جاوا اسکریپت اشاره خواهم نمود.سیستم اعداد دسیمال (دهدهی) و باینری (دودویی)ما انسان ها اعداد را در مبنای 10 (Decimal) به کار می بریم مثل اعداد 1، 2، 3، و ... . اما حتما می دانید که سیستم اعداد دهدهی برای کامپیوتر قابل فهم نیستند. کامپیوترها فقط قادر به درک و پردازش سیستم اعداد دودویی هستند. در این سیستم، همه چی به صورت ترکیبی از 0 و 1 ذخیره می شوند. برای ذخیره اعداد از بیت ها استفاده می کنیم هر 8 بیت داده تشکیل یک بایت (Byte) را می دهند. به عنوان مثال اگر بخواهیم برای ذخیره اعداد صحیح از یک بایت (هشت بیت) استفاده کنیم، 00000001 نمایش دودویی عدد 1، و 00000010 نمایش دودویی عدد 2 خواهد بود. اینکه چگونه می توانیم یک عدد دسیمال را به مبنای 2 و بالعکس ببریم را می توانید در گوگل جستجو کرده و مطالعه کنید.عملگرهای بیتیعملگرهای بیتی نیز مشابه عملگرهای منطقی هستند با این تفاوت که عملگرها بیتی همانطور که از اسمشان پیداست بر روی بیت ها عمل می کنند. در این مطلب به دو عملگر بیتی که بیش از سایر عملگرهای بیتی در برنامه های واقعی کاربرد دارند می پردازیم و بررسی مابقی آن ها را به خودتان واگذار می کنیم. این عملگرهای بیتی عبارتند از: عملگر بیتی OR : این عملگر را با کاراکتر | نمایش می دهند. اگر دو بیت توسط این عملگر با هم OR شوند،  در صورتیکه حداقل یکی از بیت ها مقدارش 1 باشد، نتیجه 1 خواهد بود مثل زیر:عملگر بیتی AND : این عملگر را با کاراکتر &amp; نمایش می دهند، اگر دو بیت توسط این عملگر با هم AND شوند، در صورتیکه هر دو بیت مقدارشان 1 باشد نتیجه 1 و در غیر اینصورت نتیجه 0 خواهد بود مثل زیر:نکته: هر وقت که یک عملگر بیتی بر روی دو عدد دسیمال اعمال شود، موتور جاوا اسکریپت ابتدا هر دو عدد را به اعداد باینری معادل تبدیل می کند، سپس عمل بیتی موردنظر را بر روی آن ها انجام می دهد و نهایتا نتیجه آن عمل بیتی را که یک عدد باینری است به عدد معادل دسیمال تبدیل کرده و بر می گرداند.به عنوان مثال نتیجه عمل بیتی OR بر روی اعداد دسیمال زیر برابر با عدد دسیمال 3 خواهد بود:console.log(1 | 2);در مثال بالا موتور جاوا اسکریپت عدد دسیمال 1 را به عدد باینری 00000001، و عدد دسیمال 2 را به عدد باینری 00000010 تبدیل می کند سپس عمل بیتی OR را بر روی آن ها انجام می دهد. حاصل عدد باینری 00000011 خواهد بود. حالا اگر این عدد باینری را به مبنای 10 ببریم معادل عدد 3 خواهد شد. البته در نظر داشته باشید که در این مثال تنها برای سادگی مطلب از 8 بیت برای نمایش اعداد باینری استفاده کردیم وگرنه در عمل جاوا اسکریپت از تعداد بیت های بیشتری برای ذخیره و نمایش اعداد صحیح استفاده می کند.حالا اگر همان مثال بالا را با عملگر بیتی AND تکرار کنیم نتیجه عملیات برابر با عدد دسیمال 0 خواهد شد:console.log(1 &amp; 2);نوبت شماست تا بررسی کنید و ببینید که حاصل عملیات بیتی بالا چطور برابر با عدد دسیمال 0 شده است. حالا که نحوه کارکرد عملگرهای بیتی را به درستی درک نمودید نوبت آنست تا به سراغ یک مثال واقعی برویم.یک سیستم کنترل سطح دسترسی کاربر در یک برنامه خاص را در نظر بگیرید. فرض کنید که سطوح دسترسی یک کاربر نوعی عبارت باشند از: Read، Write، و Executeما می توانیم برای نمایش این سطوح دسترسی خیلی راحت از سیستم اعداد باینری کمک بگیریم. چون سه سطح دسترسی مختلف داریم می توانیم فقط از 3 بیت آخر یک بایت داده استفاده کنیم مثلا بیت شماره شش را به سطح دسترسی Read، بیت شماره هفت را به سطح دسترسی Write، و بیت شماره هشت را به سطح دسترسی Execute اختصاص می دهیم. به این صورت که اگر آن سطح دسترسی وجود داشت بیت مربوطش 1 و در غیر اینصورت 0 می شود. بنابراین نمایش باینری سطح دسترسی Read عدد 00000100، نمایش باینری سطح دسترسی Write عدد 00000010، و نمایش باینری سطح دسترسی Execute عدد 00000001 خواهد شد.حالا ببینیم پیاده سازی منطق بالا در کد به چه صورت خواهد شد. ابتدا ما به سه ثابت (Constant) مختلف برای نگهداری سه سطح دسترسی مذکور نیاز داریم:const readPermission = 4;
const writePermission = 2;
const executePermission = 1;اولین سوال اینجاست که اعداد 4 و 2 و 1 از کجا آمدند؟ جواب خیلی ساده است. عدد 4 معادل دهدهی عدد 00000100، عدد 2 معادل دهدهی عدد 00000010، و عدد 1 معادل دهدهی عدد 00000001 است که در بالا به آن ها اشاره نمودیم. همچنین به یک متغیر احتیاج داریم که سطوح دسترسی یک کاربر در حال حاضر را نشان دهد و به طور پیش فرض آن را با صفر مقدار دهی می کنیم به این معنی که کاربر در ابتدا هیچ سطح دسترسی ای ندارد:let myPermission = 0;حالا برای افزودن سطوح دسترسی مورد نظرمان به کاربر، کافیست تا مقدار سطح دسترسی مورد نظر را با مقدار سطح دسترسی حال حاضر کاربر OR بیتی کنیم مثل زیر که سطوح دسترسی خواندن و نوشتن را به کاربر اعطا می کند:myPermission = myPermission | readPermission  | writePermission;بعد ازین هر جا نیاز بود تا بفهمیم که آیا کاربر فلان سطح دسترسی خاص را دارد یا خیر، کافیست تا مقدار متغیر myPermission را با مقدار سطح دسترسی مورد نظر AND بیتی کنیم. مثلا اگر می خواهیم ببینیم که کاربر بالا آیا سطح دسترسی خواندن دارد یا خیر باید به صورت زیر عمل کنیم:let message = (myPermission &amp; readPermission) ? &#039;yes&#039; : &#039;no&#039;;حالا اگر از متغیر message یک لاگ بگیریم، کلمه yes را در کنسول مشاهده خواهید نمود که نشان دهنده داشتن سطح دسترسی خواندن برای کاربر می باشد:console.log(message); //yesبنابراین برای افزودن سطح دسترسی از عملگر OR بیتی و برای بررسی اینکه آیا کاربر فلان سطح دسترسی خاص را دارد یا خیر از عملگر AND بیتی استفاده می کنیم.</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Sun, 16 Feb 2020 20:33:34 +0330</pubDate>
            </item>
                    <item>
                <title>مقدمه ای بر عملگرها در جاوا اسکریپت - قسمت دوم</title>
                <link>https://virgool.io/@taghaniali/%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1-%D8%B9%D9%85%D9%84%DA%AF%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-t8rem8zxjhft</link>
                <description>در قسمت اول مقدمه ای بر عملگرها در جاوا اسکریپت به تشریح عملگرهای حسابی (Arithmetic)، عملگرهای تخصیص یا انتساب (Assignment)، و عملگرهای مقایسه ای (Comparison) پرداختم. در این پست و در ادامه مبحث عملگرها به عملگرهای منطقی (Logical) در جاوا اسکریپت خواهم پرداخت.عملگرهای منطقی (Logical)ازین نوع عملگرها که بسیار هم پرکاربرد هستند زمانی استفاده می کنیم که چند شرط مختلف وجود دارد و ما می خواهیم بر اساس ترکیب آن شرایط، تصمیم گیری های مختلفی داشته باشیم. در جاوا اسکریپت سه نوع عملگر منطقی داریم: عملگر منطقی AND، عملگر منطقی OR، و عملگر منطقی NOT. در ادامه به ترتیب به هر کدام ازین عملگرها خواهم پرداخت:عملگر منطقی ANDاین عملگر را با &amp;&amp; نشان می دهند. نتیجه اعمال این عملگر زمانی دارای ارزش true خواهد بود که هر دو عملوندش دارای ارزش منطقی true باشند. مثال:console.log(true &amp;&amp; true); //true
اما اگر یکی از عملوندهایش دارای ارزش منطقی false باشد (فرقی ندارد کدامیک باشد چپ یا راست)، آنگاه مقدار بازگشتی این عملگر نیز دارای ارزش منطقی false خواهد بود. مثال:console.log(false &amp;&amp; true); //false
console.log(true &amp;&amp; false); //false
حالا حتما می پرسید کاربرد این عملگر در دنیای واقعی چیست؟فرض کنید برنامه ای می خواهیم بنویسیم که بر اساس شرایط عمومی زیر، درخواست افراد برای اخذ وام را تایید یا رد می کند:داشتن درآمد بالابرخورداری از امتیاز اعتباری خوباگر شرایط فردی با هر دو شرط بالا منطبق باشد آنگاه واجد شرایط لازم برای اخذ وام خواهد بود و درخواستش برای دریافت وام مورد تایید قرار می گیرد و در غیر اینصورت واجد شرایط لازم برای اخذ وام نخواهد بود و با درخواستش نیز موافقت نخواهد شد.یک پیاده سازی نوعی برای منطق این برنامه می تواند به صورت زیر باشد. ابتدا دو متغیر برای نگهداری مقدار دو شرط بالا تعریف می کنیم و آن ها را با یک مقدار پیش فرض مقدار دهی اولیه می کنیم:let highIncome = true;
let goodCreditScore = true;
حالا با استفاده از عملگر &amp;&amp; و ترکیب شرایط بالا می توانیم بفهمیم که فرد واجد شرایط لازم برای اخذ وام هست یا خیر:let eligibleForLoan = highIncome &amp;&amp; goodCreditScore;
console.log(eligibleForLoan); //true
عملگر منطقی ORاین عملگر را با || نشان می دهند. نتیجه اعمال این عملگر زمانی دارای ارزش true خواهد بود که حداقل یکی از دو عملوندش (فرقی ندارد کدامیک باشد چپ یا راست) دارای ارزش منطقی true باشند. همان مثال بالا را این بار با مقادیر اولیه متفاوت و نیز منطق متفاوت برای عملگر منطقی OR تکرار می کنیم به این معنی اگر فردی یکی از شرایط بالا را هم داشت بتواند وام بگیرد:let highIncome = true;
let goodCreditScore = false;

let eligibleForLoan = highIncome || goodCreditScore; 
console.log(eligibleForLoan); //true
عملگر منطقی NOTاین عملگر را با ! نشان می دهند. عملگر منطقی NOT، ارزش منطقی عملوند مقابل خود را معکوس می‌کند. یعنی اگر مقدار عملوندش دارای ارزش منطقی true باشد، مقدار false را به عنوان نتیجه باز می‌گرداند و اگر مقدار عملوندش دارای ارزش منطقی false باشد، آنگاه مقدار true را باز خواهد گرداند.متغیر دیگری به مثال بالا اضافه می کنیم تا نتیجه درخواست فرد برای اخذ وام را در آن ذخیره کنیم. سپس به کمک عملگر منطقی NOT آن را مقدار دهی می کنیم. بایستی کدمان را طوری بنویسیم که اگر فردی واجد شرایط لازم برای اخذ وام نبود آنگاه درخواستش رد شود:عملگر منطقی NOT در تمامی مثال هاییکه در بالا مشاهده نمودید، عملوندهاییکه به کار برده شده اند همگی از نوع Boolean (بولی) با مقادیر true یا false بودند. اما خوبست که بدانید ما می توانیم عملگرهای منطقی را علاوه بر مقادیر بولی بر روی مقادیر غیر بولی هم به کار ببریم.مثال های زیر را مستقیما در کنسول مرورگرتان بنویسید و نتیجه را مشاهده کنید:مطابق مثال های تصویر بالا ثابت می شود که:نکته: نتیجه یک عبارت محاسباتی منطقی، لزوما یک مقدار بولی یعنی true یا false نیست و نتیجه کاملا بستگی به مقدار عملوندها دارد.وقتی موتور جاوا اسکریپت اقدام به ارزیابی منطقی یک عبارت محاسباتی می کند، به عملوندها نگاه می کند اگر عملوندی از نوع Boolean نبود ابتدا آن عملوند را به یک مقدار معادل اصطلاحا Truthy (دارای ارزش درستی) یا Falsy (دارای ارزش نادرستی) تفسیر می کند. مفهوم مقدار Truthy با true، و مقدار Falsy با false متفاوت است. برای شناختن مقادیر Truthy ابتدا باید مقادیر Falsy را بشناسیم. انواع مقادیر Falsy در زبان برنامه نویسی جاوا اسکریپت عبارتند از: undefined، null، 0، false، &#x27; &#x27; (رشته تهی)، و NaNمقدار NaN یا Not-A-Number یک مقدار ویژه در جاوا اسکریپت است. از جمله مواردیکه نتیجه یک عبارت محاسباتی برابر با NaN می شود عبارتند از:تقسیم عدد صفر بر عدد صفرتقسیم بی نهایت (Infinity) بر بی نهایتضرب بی نهایت در صفرهر عبارت محاسباتی که یکی از عملوندهایش NaN باشدتبدیل نوع مقدار undefined یا هر مقدار رشته ای غیر عددی به یک مقدار از نوع Numberقانون بعدی عبارتست ازینکه هر چیزیکه مقدارش Falsy نیست پس حتما Truthy است. مثال زیر را در نظر بگیرید:console.log(false || &#039;Ali&#039;);مقدار Ali یک رشته غیر تهی است بنابراین مقدارش Falsy نیست و Truthy است. زمانیکه موتور جاوا اسکریپت این عبارت را ارزیابی می کند ابتدا به مقدار false برخورد می کند سپس ارزیابی را ادامه می دهد و با یک مقدار Truthy مواجه می شود چون عملگر این عبارت محاسباتی از نوع OR منطقی می باشد بلافاصله مقدار رشته ای Ali را به عنوان نتیجه ارزیابی باز می گرداند. در مورد مثال زیر هم به همین صورت است:console.log(false || 1);چون 1 مقدار عددی غیر صفر است بنابراین یک مقدار Truthy است و همان به عنوان نتیجه ارزیابی باز گردانده خواهد شد. اما در مورد مثال زیر چطور:console.log(false || 1 || 2);باز هم مقدار 1 به عنوان نتیجه ارزیابی بازگردانده خواهد شد. حتما می پرسید چرا؟ موتور جاوا اسکریپت ارزیابی را از اولین عملوند شروع می کند و به محض اینکه با اولین مقدار Truthy مواجه شود آن را به عنوان نتیجه ارزیابی باز خواهد گرداند و دیگر عملیات ارزیابی آن عبارت را ادامه نخواهد داد و در همان نقطه متوقف خواهد شد حتی اگر بعد از آن صدها عملوند دیگر هم وجود داشته باشد. به این ویژگی اصطلاحا اتصال کوتاه یا Short Circuting گفته می شود درست مشابه همان مفهوم اتصال کوتاه در مباحث الکتریسیته فیزیک.حالا که نحوه کاکرد عملگرهای منطقی بر روی عملوندهایی با مقادیر Falsy و Truthy را درک کردید نوبت آنست که به یک مثال واقعی بپردازیم. فرض کنید در یک برنامه کاربر بایستی از بین رنگ ها، رنگ مورد نظرش را انتخاب کند در غیر اینصورت رنگ پیش فرض توسط برنامه برایش انتخاب خواهد شد شاید این رنگ، رنگ پیراهنی باشد که می خواهد خریداری کند. ابتدا متغیری برای ذخیره رنگ پیش فرض برنامه و متغیری برای ذخیره کردن رنگ انتخابی کاربر تعریف می کنیم:let defaultColor = &#039;blue&#039;;
let userColor;حالا برای پیاده سازی منطق برنامه می توانیم خیلی ساده از عملگر منطقی || به صورت زیر استفاده کنیم:let currentColor = userColor || defaultColor;
console.log(currentColor);با اجرای کد فوق مقدار blue یا همان رنگ پیش فرض برنامه در خروجی نمایش داده خواهد شد چرا که کاربر رنگی را انتخاب نکرده است لذا مقدار متغیر userColor برابر با undefined است و چون undefined یک مقدار Falsy است و blue یک مقدار Truthy است بنابراین نتیجه، مقدار blue خواهد بود.حالا اگر کاربر مثلا رنگ red را انتخاب کرده باشد، مقدار red در خروجی نمایش داده خواهد شد. چرا که اگر یادتان باشد گفتیم موتور جاوا اسکریپت به محض دیدن اولین مقدار Truthy، ارزیابی را متوقف کرده و همان مقدار را به عنوان نتیجه باز خواهد گرداند. البته در نظر داشته باشید برای دستیابی به این نتیجه، بسیار مهم است که حتما متغیر userColor اولین عملوند عبارت باشد در غیر اینصورت همیشه مقدار رنگ پیش فرض برنامه انتخاب خواهد شد.آنچه که در مثال بالا دیدید قدرت عملگرهای منطقی را نشان می دهد. بنابراین به یاد داشته باشید که از عملگرهای منطقی معمولا برای تعیین مقادیر پیش فرض متغیرها، استفاده می شود.</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Wed, 12 Feb 2020 00:21:40 +0330</pubDate>
            </item>
                    <item>
                <title>مقدمه ای بر عملگرها در جاوا اسکریپت - قسمت اول</title>
                <link>https://virgool.io/coderlife/%D9%85%D9%82%D8%AF%D9%85%D9%87-%D8%A7%DB%8C-%D8%A8%D8%B1-%D8%B9%D9%85%D9%84%DA%AF%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-ualkqxv3fs5a</link>
                <description>در فصل دوم دوره آموزش جاوا اسکریپت برای مبتدی ها، راجع به متغیر (Variable) و ثابت (Constant) صحبت کردم. در جاوا اسکریپت انواع مختلفی از عملگر (Operator)ها وجود دارد که برای انجام عملیات مختلف حسابی و منطقی بر روی متغیرها و ثابت ها یعنی عملوند (Operand)ها استفاده می شوند. به کمک عملگرها می توانیم متغیرها و ثابت ها را با هم ترکیب کرده و Expression ها را ایجاد کنیم. Expression در حقیقت یک عبارت محاسباتی است که مقداری را تولید می کند مثلا x+y یک Expression است. به کمک Expression ها می توانیم اقدام به پیاده سازی منطق و الگوریتم های مختلف در برنامه مان کنیم. کاربرد عملگرها در برنامه نویسیانواع عملگرها در جاوا اسکریپت کدامند؟عملگرها در جاوا اسکریپت عبارتند از: حسابی، تخصیص یا انتساب، مقایسه ای، منطقی، و بیتی.انواع عملگرها در جاوا اسکریپتعملگرهای حسابی (Arithmetic)از عملگرهای حسابی همانطور که از نامشان پیداست برای انجام عملیات مختلف ریاضی استفاده می کنیم. گفته شد که عملگرها بر روی متغیرها و ثابت ها عمل می کنند. ابتدا دو متغیر به نام های x و y را به عنوان عملوند تعریف کرده و مقدار دهی اولیه می کنیم:let x = 10;
let y = 3;حالا با تمامی عملگرهای ساده حسابی شامل: جمع +، تفریق -، ضرب *، تقسیم /، باقیمانده تقسیم %، و توان ** بر روی عملوندهای x و y عملیات حسابی انجام داده و از نتیجه عملیات لاگ بگیرید و نتیجه را مثل زیر در کنسول مرورگر ببینید:عملگرهای ساده ریاضی در جاوا اسکریپتعملگرهای ساده حسابی که در بالا مشاهده کردید به حداقل دو عملوند نیاز دارند ولی دو تا عملگر حسابی دیگه هم وجود دارن که قدری پیچیده ترن.عملگر حسابی افزاینده (++) و کاهنده (--) این عملگرها فقط به یک عملوند احتیاج دارند و بسته به اینکه قبل یا بعد از عملوند خود قرار بگیرند، نتیجه متفاوتی رو تولید خواهند کرد. نحوه کارکرد دو عملگر افزاینده (Increment) و کاهنده (Decrement) مشابه هم است با این تفاوت که عملگر افزاینده مقدار عملوندش را یک واحد افزایش و عملگر کاهنده مقدار عملوندش را یک واحد کاهش می دهد. برای اینکه نحوه کارکرد این دو عملگر را در مثال های زیر بهتر متوجه شوید ابتدا قبل از هر گونه عملیات یک لاگ از متغیر x بگیرید تا مقدارش را ببینید:console.log(x);می بینیم که مقدار متغیر x برابر با همان مقدار اولیه اش یعنی 10 می باشد. حالا عملگر افزاینده را قبل از متغیر x قرار دهید و از آن لاگ بگیرید:console.log(++x);باید عدد 11 را در خروجی ببینید چونکه در این حالت ابتدا مقدار عملوند x یک واحد افزایش پیدا کرده و سپس نتیجه آن در کنسول نمایش داده خواهد شد. حالا خط بالا را به حالت کامنت در آورید و این بار عملگر افزاینده را بعد از عملوند x قرار دهید و دوباره از آن لاگ بگیرید:console.log(x++); باید عدد 10 را در کنسول ببینید. شاید بپرسید پس یک واحد افزایش کجا رفت؟ کافیه یک بار دیگه از متغیر x لاگ بگیرید. خواهید دید که عدد 11 در کنسول نمایش داده خواهد شد. این نشان می دهد که وقتی عملگر فوق بعد از عملوند قرار می گیرد ابتدا مقدارش در خروجی نمایش داده می شود و بعد از آن مقدارش یک واحد افزایش پیدا می کند به همین خاطر است که در اولین لاگ عدد 10 را در خروجی دیدیم نه مقدار افزایش یافته آن را.پیشنهاد می کنم برای عملگر کاهنده خودتان کدهای بالا را به جای ++ با -- تکرار کنید و نتیجه را مشاهده کنید.نکته: عملگر افزاینده/کاهنده اگر قبل از عملوندی قرار بگیرند ابتدا مقدار آن را یک واحد افزایش/کاهش داده و سپس حاصل آن Expression مورد استفاده قرار می گیرد. اما اگر بعد از عملوندی قرار بگیرند ابتدا مقدار آن Expression مورد استفاده قرار می گیرد و سپس مقدارش یک واحد افزایش/کاهش می یابد.عملگرهای تخصیص یا انتساب (Assignment)ازین عملگرها برای مقدار دهی استفاده می شود: let x = 10;در مثال بالا عملگر = مقدار 10 را به متغیر x اختصاص می دهد یا به عبارتی آن را با عدد 10 مقدار دهی می کند. عملگرهای افزاینده ++ و کاهنده -- نیز به نوعی عملگر = را در دل خود دارند. به عنوان مثال به جای ++x می توانین بنویسیم 1 + x = xاما اگر بخواهیم به جای یک واحد افزایش، مثلا 5 واحد را به متغیری بیافزاییم آنگاه چه باید بکنیم؟! ابتدایی ترین راه حلی که به ذهن می رسد عبارتست از: 5 + x = x اما راه حل ساده و خلاصه دیگه استفاده از عملگر تخصیص =+ هستش. مثل زیر:x += 5;
console.log(x); //15حالا اگه بخواهیم مقدار متغیر x را در 3 ضرب کنیم چه؟! می توانیم بنویسیم 3 * x = x ولی باز هم راه حل ساده و خلاصه تری هست مثل زیر:x *= 3; 
console.log(x); //30این موضوع راجع به تمام عملگرهای ساده حسابی صادق هستش:نکته: تمام عملگرهای ساده حسابی را می توانیم در ترکیب با عملگر تخصیص = به کار ببریم. در این صورت عملگرهای تخصیص جدید عبارت خواهند بود از: =+ ، =- ، =* ، =/ ، =% و =**عملگرهای مقایسه ای (Comparison)از عملگرهای مقایسه ای برای مقایسه دو Expression مختلف با یکدیگر استفاده می شود. مقدار حاصل از ارزیابی Expression-ایکه در آن عملگر مقایسه ای به کار رفته باشد یک مقدار Boolean یعنی true یا false خواهد بود. عملگرهای مقایسه ای به سه نوع Relational (رابطه ای)، Equality (برابری)، و Ternary (سه بخشی) تقسیم می شوند. مثال:let x = 1;
console.log(x &gt; 0);با اجرای کد مثال بالا مقدار true در خروجی کنسول ثبت خواهد شد. چونکه مقدار ذخیره شده در متغیر x از عدد صفر بزرگتر است. مابقی عملگرهای مقایسه ای رابطه ای را در مثال زیر مشاهده می کنید:console.log(x &gt;= 1); //true
console.log(x &lt; 1); //false
console.log(x &lt;= 0); //falseبنابراین:نکته: عملگرهای مقایسه ای نوع Relational عبارتند از: کوچک تر &gt; ، بزرگتر &lt; ، کوچک تر مساوی =&gt; و بزرگتر مساوی =&lt;از عملگرهای مقایسه ای نوع Equality نیز برای بررسی برابر بودن یا نبودن مقدار دو Expression مختلف با یکدیگر استفاده می شود. مثال:console.log(x === 1); // true
console.log(x !== 1); // falseاما علاوه بر دو عملگر Equality بالا دو نوع عملگر Equality دیگر هم هست که عبارتند از == و =! . تفاوت عملگرهای === و ==! با عملگرهای == و =! چیست؟اولا خوبه بدونیم که به عملگرهای === و ==! اصطلاحا عملگرهای Strict Equality و به عملگرهای == و =! اصطلاحا عملگرهای Lose Equality گفته می شود. تفاوت این دو نوع عملگر با هم آنست که در عملگرهای نوع Strict Equality هم برابری مقدار طرفین رابطه با هم مقایسه می شود و هم یکی بودن نوع داده ای آن ها. یعنی اینکه در عملگر === نتیجه مقایسه وقتی true خواهد بود که هم مقدار طرفین رابطه با هم برابر باشد و هم نوع داده ای آن ها مثل هم باشد یعنی مثلا نوع داده ای هر دو طرف عدد باشد یا هر دو طرف رشته باشد. به عنوان مثال نتیجه مقایسه توسط هر دو نوع عملگرها در مثال زیر برابر با true خواهد بود://Strict Equality
console.log(1 === 1); //true

//Lose Equality
console.log(1 == 1); //trueاما نتیجه مقایسه های زیر توسط دو نوع مختلف عملگرها متفاوت خواهد بود://Strict Equality 
console.log(&#039;1&#039; === 1); //false
  
//Lose Equality 
console.log(&#039;1&#039; == 1); //trueدر مثال 1 === &#x27;1&#x27; چونکه نوع داده ای طرفین رابطه یکی نیست و سمت چپ رابطه از نوع رشته و سمت راست رابطه از نوع عدد است بنابراین نتیجه مقایسه هم false خواهد بود. اما در مثال 1 == &#x27;1&#x27; چرا نتیجه مقایسه true می شود؟ علت این سوال به نحوه عملکرد عملگرهای مقایسه ای نوع Lose Equality بر می گردد.نکته: وقتی برای مقایسه مقدار دو Expression از عملگرهای مقایسه ای نوع Lose Equality استفاده کنیم ابتدا نوع داده ای طرفین رابطه با هم مقایسه می شود اگر نوع داده ای آن ها با هم متفاوت بود ابتدا مقدار سمت راست رابطه به مقداری با نوع داده ای سمت چپ رابطه تبدیل می شود و سپس مقدار طرفین با هم مقایسه می شود.مثال زیر را در نظر بگیرید:console.log(&#039;1&#039; == 1);در مثال بالا چون نوع داده ای طرفین رابطه با هم یکی نیست، ابتدا مقدار سمت راست رابطه به مقداری از نوع رشته تبدیل می شود سپس مقدارشان با هم مقایسه می شود و چون بعد از تبدیل، مقدار هر دو طرف رابطه عبارتست از &#x27;1&#x27; بنابراین نتیجه مقایسه true می شود. یک مثال دیگر را هم در نظر بگیرید:console.log(true == 1);نتیجه مقایسه بالا هم true خواهد بود. چون نوع داده ای طرفین رابطه یکی نیست بنابراین ابتدا مقدار سمت راست رابطه به مقداری با نوع داده ای Boolean تبدیل می شود سپس مقایسه انجام می شود و چون مقدار هر دو طرف عبارتست از true بنابراین نتیجه مقایسه هم true می شود.عملگر Ternaryعملگر Ternary یکی از محبوب ترین عملگرها در زبان جاوا اسکریپت است.نکته: به عملگر Ternary یا سه بخشی اصطلاحا عملگر Conditional یا شرطی هم می گویند.فرض کنید که می خواهیم قاعده زیر را در یک برنامه پیاده سازی کنیم:مثال: اگر امتیاز یک مشتری بیش از 100 باشد آن را جزو مشتریان طلایی (Gold) و در غیر اینصورت وی را جزو مشتریان نقره ای (Silver) طبقه بندی می کنیم.ابتدا یک متغیر به نام مثلا points تعریف می کنیم تا بتوانیم مقدار امتیازاتی که یک مشتری دارد را نگهداری کنیم سپس آن را با یک مقدار پیش فرض اولیه مقدار دهی می کنیم:let points = 110;همچنین به یک متغیر دیگر هم احتیاج داریم تا بتوانیم بعد از تعیین نوع مشتری آن را ذخیره کنیم در این مثال آن را type نامگذاری می کنیم. برای پیاده سازی قاعده دسته بندی مشتری نیز می توانیم خیلی ساده از عملگر Ternary به صورت زیر استفاده کنیم:let type = points &gt; 100 ? &#039;Gold&#039; : &#039;Silver&#039;;ابتدا عبارت 100 &lt; points ارزیابی می شود، نتیجه ارزیابی یک مقدار Boolean خواهد بود، سپس بر اساس آن تعیین می شود که مقدار Gold یا مقدار Silver به عنوان نوع مشتری در متغیر type ذخیره شود. اگر مقدار آن عبارت true بود، رشته Gold در متغیر type قرار داده می شود و اگر مقدارش false بود، رشته Silver در متغیر type ذخیره می گردد.حالا از متغیر type یک لاگ بگیرید:console.log(type);خواهید دید که رشته Gold در خروجی کنسول ثبت خواهد شد. حالا کافیست مقدار متغیر points را به عدد 90 تغییر دهید و یکبار دیگر از متغیر type لاگ بگیرید خواهید دید که این بار رشته Silver به خروجی خواهد رفت. بنابراین نگارش دستور (Syntax) عملگر سه بخشی یا Ternary به صورت زیر است:;عبارت محاسباتی 2 : عبارت محاسباتی 1 ? (عبارت شرطی) = متغیرنحوه عملکرد عملگر شرطی سه بخشی به این صورت است که اگر عبارت شرطی دارای ارزش true باشد، آنگاه مقدار حاص از عبارت محاسباتی 1 ارزیابی شده و در متغیر سمت چپ دستور تخصیص قرار داده می شود، و اگر عبارت شرطی دارای ارزش false باشد مقدار عبارت محاسباتی 2 ارزیابی شده و در متغیر سمت چپ دستور تخصیص قرار می گیرد.در مقاله بعدی فصل سوم دوره آموزش جاوا اسکریپت برای مبتدی ها، به ادامه مبحث عملگرها خواهم پرداخت:مقدمه ای بر عملگرها در جاوا اسکریپت - قسمت دوم</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Mon, 27 Jan 2020 23:08:53 +0330</pubDate>
            </item>
                    <item>
                <title>مفاهیم پایه جاوا اسکریپت - تابع</title>
                <link>https://virgool.io/@taghaniali/%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85-%D9%BE%D8%A7%DB%8C%D9%87-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D8%AA%D8%A7%D8%A8%D8%B9-uqztlo3dqazs</link>
                <description>تا به اینجا از بین انواع داده ای ارجاعی، نوع های آبجکت و آرایه را شناختیم و حالا نوبت تابع (function) است. توابع یکی از مهمترین ارکان جاوا اسکریپت هستند.تابع (Function) چیست؟به صورت خیلی ساده تابع عبارتست از قطعه کدیکه وظیفه ای را انجام می دهد یا مقدار/مقادیری را محاسبه کرده و بر می گرداند. یک برنامه واقعی شامل صدها یا هزاران تابع مختلف است که در ارتباط با هم کارکردهای مختلف یک برنامه را پیاده سازی می کنند. برای تعریف یک تابع از کلمه کلیدی و رزرو شده function استفاده می کنیم مثل زیر که تابعی به نام greet را تعریف می کند:function greet() {
}قطعه کدیکه مابین کمانک های باز و بسته { }  قرار می گیرد اصطلاحا بدنه تابع نامیده می شود. بدنه تابع یک سری statement است که منطقی را پیاده سازی می کند. مثلا ما می خواهیم در تابع ()greet منطقی را ایجاد کنیم که یک پیغام را در خروجی نمایش دهد:function greet() {
     console.log(&#039;Hello World&#039;);
}به قطعه کد بالا اصطلاحا اعلان تابع (Function Declaration) گفته می شود.توجه: بعد از کمانک بسته { نبایستی نقطه ویرگول قرار دهیم.بعد از اینکه یک تابع تعریف شد می توانیم آن را هر جا که نیاز شد و به دفعات مختلف فراخوانی (Call) کرده و اجرایش کنیم. برای فراخوانی یک تابع مثل زیر باید عمل کنیم:greet();حالا اگر به کنسول بروید عبارت Hello World را در خروجی خواهید دید.اما تابع فوق ساده ترین نوع یک تابع است. توابع می توانند یک یا چندین مقدار ورودی (Input) داشته باشند. این ورودی ها می توانند رفتار تابع را تغییر دهند. فرض کنید بخواهیم بجای عبارت ساده و ثابت Hello World، به صورت پویا و بر اساس یک مقدار ورودی مثل نام که به تابع ()greet پاس می دهیم، عبارت متناسبی را در خروجی نمایش دهیم آنگاه باید به صورت زیر تابع را اعلان کنیم:function greet(name) {
     console.log(&#039;Hello &#039; + name);
}به متغیر ورودی name، اصطلاحا پارامتر (Parameter) گویند. پارامتر ها فقط داخل بدنه همان تابعی که به آن پاس داده می شوند معنا و کاربرد دارند لذا خارج از بدنه آن تابع نمی توانیم به مقدار آن ها دسترسی داشته و از آن ها استفاده کنیم.نکته: برای اتصال چندین مقدار رشته ای به هم از عملگر + استفاده می کنیم.سوال اینجاست که توابعی که پارامتر دارند را چگونه فراخوانی کنیم. ببینیم اگر تابع ()greet بالا را که یک پارامتر دارد به صورت زیر فراخوانی کنیم چه می شود:greet();در این صورت مقدار Hello undefined در خروجی نمایش داده خواهد شد. چون همانطور که قبلا در مبحث متغیرها گفتیم، اگر یک متغیر را مقدار دهی نکنیم، مقدارش به طور پیش فرض undefined خواهد بود. بنابراین برای عملکرد صحیح تابع ()greet باید موقع فراخوانی آن، مقداری را به عنوان ورودی به آن پاس بدهیم مثل زیر:greet(&#039;Ali&#039;);حالا مقدار Hello Ali در خروجی نمایش داده خواهد شد.نکته: به مقداریکه موقع فراخوانی تابع به آن پاس می دهیم اصطلاحا آرگومان (Argument) می گویند مثل رشته Ali در تابع ()greet. اما به متغیریکه هنگام تعریف تابع به آن می دهیم اصطلاحا پارامتر (Parameter) گفته می شود مثل متغیر name در تابع ()greet.این نکته ایست که خیلی از برنامه نویس ها نمی دانند. بنابراین آرگومان عبارتست از آن مقدار واقعی ایکه در زمان فراخوانی یک تابع برای پارامتر متناظرش به آن تابع پاس می دهیم.یک تابع می تواند چندین پارامتر داشته باشد. در صورتیکه یک تابع چندین پارامتر داشت باید آن ها را در اعلان تابع با ویرگول از هم جدا کنیم مثل زیر:function greet(name, lastName) { 
     console.log(&#039;Hello &#039; + name + &#039; &#039; + lastName); 
}

greet(&#039;Ali&#039;, &#039;Taghani&#039;);با اجرای کد بالا عبارت Hello Ali Taghani در خروجی ثبت خواهد شد. بعدا که راجع به Template Literal صحبت کردم خواهید دید که می شود بدنه تابع بالا را ساده تر و کوتاه تر هم نوشت.در ابتدای این پست آنجاییکه تابع را تعریف کردیم گفتیم تابع یا وظیفه ای را انجام می دهد یا اینکه مقداری را محاسبه کرده و بر می گرداند. حالا یک نمونه از تابعی مثال بزنیم که یک مقدار را محاسبه کرده و بر می گرداند:function square(number) {
     return number * number;
}حالا اگر این تابع را فراخوانی کرده و آرگومانی را به آن پاس دهیم، توان دوم آن را محاسبه کرده و به ما برخواهد گرداند. برای بازگرداندن مقدار محاسبه شده در بدنه تابع از کلمه کلیدی و رزرو شده return  استفاده می کنیم.با مقدار برگشتی از یک تابع هر کاری می توانیم انجام دهیم مثل اینکه آن را در جایی نمایش دهیم یا با آن متغیری را مقدار دهی کنیم مثل زیر:let result = square(2);
console.log(result);اگر خروجی تابع ()square را به صورت زیر در خروجی نمایش دهیم، دو تا فراخوانی تابع خواهیم داشت که به صورت تو در تو هستند، یکی فراخوانی تابع ()square و دومی فراخوانی تابع ()log از آبجکت console:console.log(square(2));آنچه که در این مطلب آموختید تنها مقدمه ای بر مفهوم تابع بود. در آینده مباحث مفصل تری راجع به توابع در جاوا اسکریپت خواهیم داشت.با پایان یافتن این مطلب، فصل دوم دوره آموزش جاوا اسکریپت برای مبتدی ها نیز به پایان رسید. در فصل بعدی این دوره به آموزش مبحث عملگرها (Operators) در جاوا اسکریپت خواهم پرداخت.</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Sun, 19 Jan 2020 19:04:37 +0330</pubDate>
            </item>
                    <item>
                <title>مفاهیم پایه جاوا اسکریپت - آرایه</title>
                <link>https://virgool.io/@taghaniali/%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85-%D9%BE%D8%A7%DB%8C%D9%87-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-f623rrqzoqbb</link>
                <description>گاهی در برنامه مان با لیستی از اقلام یا اصطلاحا آیتم ها مواجه هستیم مثل لیست محصولات در سبد خرید یا لیست رنگ های انتخاب شده توسط کاربر. برای ذخیره و نگهداری یک لیست، از آرایه استفاده می کنیم.چگونه در جاوا اسکریپت یک آرایه ایجاد کنیم؟فرض کنید که می خواهیم لیست رنگ های انتخاب شده توسط کاربر را ذخیره و نگهداری کنیم. مطابق کد زیر متغیری به نام selectedColors تعریف کنید. یادآوری می کنم نام هاییکه برای متغیرها انتخاب می کنید حتما توصیفی و معنادار باشند:let selectedColors = [];مقدار [ ] را اصطلاحا یک Array Literal گویند. ما بین [ ] عناصر آرایه قرار می گیرند. آرایه selectedColors را مطابق زیر مقداردهی اولیه کنید و سپس یک لاگ از آن بگیرید:let selectedColors = [&#039;red&#039;, &#039;blue&#039;];
console.log(selectedColors);حالا اگر به کنسول مرورگرتان مراجعه کنید آرایه selectedColors را در خروجی مشاهده خواهید نمود. بر روی علامت مثلثی شکل سمت چپ آرایه در کنسول کلیک کنید تا مقدار آرایه در خروجی به صورت مبسوط نمایش داده شود:نمایش آرایه در خروجیاگر دقت کنید در کنار هر آیتم ذخیره شده در آرایه یک شاخص (اندیس/index) عددی می بینید. این شاخص شماره خانه ای از آرایه که آیتم در آن قرار گرفته است را نشان می دهد. شماره خانه های یک آرایه از عدد صفر شروع می شود بنابراین:نکته: شماره/اندیس اولین خانه هر آرایه برابر صفر است.احتمالا می پرسید این اندیس ها به چه کار می آیند؟ از اندیس ها برای دستیابی به آیتم های ذخیره شده در یک آرایه استفاده می شود مثلا اگر بخواهیم اولین آیتم آرایه selectedColors  را در خروجی نمایش دهیم به صورت زیر عمل می کنیم:console.log(selectedColors[0]);اگر به کنسول مروگر بروید مقدار red را در خروجی خواهید دید.سایز (Length) یک آرایه مقداری پویاست یعنی به موازات حذف/اضافه آیتم به آن، سایز/طول آن نیز تغییر می یابد. تا بدینجا طول آرایه selectedColors برابر با 2 می باشد. حالا اگر بخواهیم آیتم سومی را به آن اضافه کنیم، می نویسیم:selectedColors[2] = &#039;green&#039;;چون شماره گذاری خانه های آرایه از صفر شروع می شود بنابراین شماره خانه سوم آرایه برابر با 2 خواهد بود.در پست مفاهیم پایه جاوا اسکریپت - نوع های داده ای، گفت شد که جاوا اسکریپت یک زبان برنامه نویسی پویاست به این معنی که نوع داده ای متغیرها در زمان اجرا و براساس مقدارشان تعیین می شود. نوع داده ای آیتم هاییکه در یک آرایه قرار می گیرند نیز پویاست و می تواند با یکدیگر متفاوت باشد و برخلاف سایر زبان های برنامه نویسی که تمامی عناصر یک آرایه بایستی هم نوع باشند، در جاوا اسکریپت آیتم هایی با نوع های داده ای متفاوت را می توان در یک آرایه ذخیره نمود. بر همین اساس شما می توانید مثلا مقدار خانه سوم آرایه selectedColors را به آیتمی با نوع داده ای متفاوت از مابقی آیتم ها تغییر دهید مثلا آیتمی با نوع داده ای Number:selectedColors[2] = 1;
console.log(selectedColors);به لحاظ فنی در جاوا اسکریپت، آرایه در حقیقت یک آبجکت است. برای اثبات این موضوع کافیست تا از آرایه selectedColors یک typeof بگیرید:console.log(typeof selectedColors);می بینید که در خروجی کنسول مرورگر مقدار object نمایش داده می شود. حالا که هر آرایه یک آبجکت است پس حتما دارای یک سری property هم هست اما بر خلاف آبجکت مثال person که در پست مفاهیم پایه جاوا اسکریپت - آبجکت ایجاد کردیم، این property ها را ما صراحتا برای آرایه تعریف نمی کنیم بلکه هربار که آرایه ای تعریف می کنیم خودش به طور خودکار آن ها را به طریقی از جایی به ارث می برد. آینده که به موضوع prototype ها پرداختم درباره نحوه ی این ارث بری نیز توضیحات لازم را بیان خواهم نمود. برای مشاهده لیست property ها و متدهای یک آرایه کافیست نام آرایه موردنظر را نوشته و مقابل آن کاراکتر نقطه را درج کنیم تا لیست آن ها برایمان نمایش داده شود مثل زیر:لیست property های آرایهبنابراین برای دسترسی به property های یک آرایه می توانیم از روش Dot Notation استفاده کنیم. به عنوان مثال خصوصیت length، طول/سایز آرایه را نشان می دهد یعنی تعداد عناصر ذخیره شده در آرایه:console.log(selectedColors.length);مقدار 3 را در خروجی مشاهده خواهید نمود. در آینده راجع به انواع عملیات قابل اجرا بر روی یک آرایه به طور مفصل صحبت خواهم کرد اما برای آشنایی با آرایه به عنوان یکی از مفاهیم پایه جاوا اسکریپت همین حد کفایت می کند. خلاصه اینکه آرایه یک ساختار داده ای (Data Structure) می باشد که از آن برای ذخیره و نگهداری لیستی از آیتم ها استفاده می شود.در مقاله بعدی فصل دوم دوره آموزش جاوا اسکریپت برای مبتدی ها، به موضوع زیر خواهیم پرداخت :مفاهیم پایه جاوا اسکریپت - تابع</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Fri, 17 Jan 2020 15:13:57 +0330</pubDate>
            </item>
                    <item>
                <title>مفاهیم پایه جاوا اسکریپت - آبجکت</title>
                <link>https://virgool.io/coderlife/%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85-%D9%BE%D8%A7%DB%8C%D9%87-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D8%A2%D8%A8%D8%AC%DA%A9%D8%AA-drujgdg34pva</link>
                <description>در قسمت دوم آموزش مفاهیم پایه جاوا اسکریپت، مبحث نوع های داده ای (Data Types) در جاوا اسکریپت را مطرح کردم و سپس درباره جزئیات انواع داده ای اصلی/مقداری صحبت کردم. در این پست انواع داده ای ارجاعی را خدمت شما دوستان عزیزم معرفی خواهم کرد و از بین آن ها نوع داده ای آبجکت را در ادامه همین پست و مابقی آن ها را در پست های بعدی تشریح خواهم نمود.انواع داده ای ارجاعی (Reference Types) در جاوا اسکریپت کدامند؟آبجکت ها (Objects)آرایه ها (Arrays)توابع (Functions)انواع داده ای ارجاعی (Reference Types) در جاوا اسکریپتآبجکت (Object) چیست؟مفهوم آبجکت (شیء) در جاوا اسکریپت و نیز در سایر زبان های برنامه نویسی دقیقا مشابه مفهوم شیء در دنیای واقعی است. یک شخص نوعی را در نظر بگیرید. هر شخصی دارای نام، سن، آدرس و ... است. این متغیرها همگی خصوصیات یک شخص هستند. همین مفهوم را عینا در برنامه نویسی هم داریم. وقتی راجع به چندین متغیر به هم مرتبط صحبت می کنیم می توانیم آن متغیرها را داخل یک مجموعه واحد به نام آبجکت قرار دهیم.مثال:let name = &#039;Ali&#039;;
let age = 30;در مثال بالا دو تا متغیر به هم مرتبط را می بینید که خصوصیات یک شخص نوعی را تعریف می کنند. هر جا که یک سری متغیر به هم مرتبط دیدیم می توانیم آن متغیرها را در قالب یک آبجکت تعریف کنیم و بعد از آن به جای ارجاع به متغیرهای مختلف، فقط به آن آبجکت ارجاع دهیم. با این کار کدی که می نویسیم هم ساده تر و هم گویاتر خواهد شد. برای شروع ابتدا یک متغیر به نام person تعریف می کنم و آن را برابر با مقدار یک آبجکت خالی قرار می دهم:let person = { }گرامر (Syntax)-ایکه در بالا برای تعریف آبجکت person استفاده کردم را اصطلاحا Object Literal می نامند. حالا می توانیم بین دو کمانک یک یا چند جفت کلید-مقدار (Key-Value Pair) قرار دهیم. به هر کلید اصطلاحا یک Property می گویند. این کلیدها در حقیقت همان متغیرها هستند:let person = {
     name: &#039;Ali&#039;,
     age: 30
}همانطور که مشاهده می کنید جفت های کلید-مقدار را با ویرگول از هم جدا می کنیم.همچنین بعد از کلید باید کاراکتر : و سپس مقدار متناظر آن نوشته شود. از آبجکت person یک لاگ بگیرید و خروجی را در کنسول مرورگر مشاهده کنید:console.log(person);خواهید دید که آبجکت person به صورت مقداری یا همان object literal در خروجی کنسول ثبت خواهد شد:نمایش یک object literal در خروجی کنسول مرورگرچگونه مقدار property-های یک آبجکت را تغییر دهیم یا بخوانیم؟برای کار کردن با property های یک آبجکت دو روش وجود دارد:Dot Notationدر این روش برای دسترسی به یک property از یک آبجکت خاص، ابتدا نام آن آبجکت سپس کاراکتر نقطه و بعد از آن نام property مورد نظر را می نویسیم. مثلا فرض کنید که بخواهیم مقدار خصوصیت name در آبجکت person را تغییر دهیم:person.name = &#039;Hassan&#039;;برای خواندن مقدار یک property هم از همان روش بالا استفاده می کنیم:console.log(person.name);Bracket Notationدر این روش برای دسترسی به یک property از یک آبجکت خاص، ابتدا نام آن آبجکت سپس یک جفت قلاب باز و بسته می نویسیم بعد از آن نام property مورد نظر را به صورت یک رشته (string) داخل قلاب باز و بسته درج می کنیم. مثال:person[&#039;name&#039;] = &#039;Hossein&#039;;برای خواندن مقدار یک property هم به همان روش بالا عمل می کنیم:console.log(person[&#039;name&#039;]);نکته: رشته ایکه به عنوان property داخل قلاب باز و بسته می نویسیم را می توانیم مابین کاراکترهای &#x27; &#x27; یا کاراکترهای &quot; &quot; قرار دهیم. مرسوم آنست که رشته را مابین کاراکترهای &#x27; &#x27; قرار دهیم.کدام روش برای کار کردن با property-های یک آبجکت بهتر است؟روش Dot Notation دقیق تر و کوتاه تر است و انتخاب پیش فرض شما هم باید همین روش باشد. اما روش Bracket Notation هم کاربردهای خاص خود را دارد. حالت هایی هست که تا زمان اجرا (Runtime) نام property آبجکت موردنظرمان مشخص نیست لذا در این حالت نمی توانیم برای دسترسی به آن property از روش Dot Notation استفاده کنیم. مثلا فرض کنید که Property را کاربر باید در واسط کاربری برنامه انتخاب کند پس ما نمی توانیم قبل از زمان اجرا و در سطح کدنویسی به آن دسترسی داشته باشیم چرا که قرار است آن Property در زمان اجرا و توسط کاربر انتخاب شود. به عنوان نمونه در نظر بگیرید که متغیری به نام selection داریم که property انتخابی توسط کاربر را در آن ذخیره می کنیم و این مقدار در زمان اجرا مشخص می شود:let selection = &#039;name&#039;; در چنین مواقعی به صورت پویا با استفاده از روش Bracket Notation  می توانیم بدان دسترسی پیدا کنیم:person[selection] = &#039;Hadi&#039;;در صورتیکه با وجود توضیحات بالا، همچنان موضوع برایتان گنگ است نگران نباشید در آینده که تجربه ی بیشتری در برنامه نویسی با جاوا اسکریپت کسب نمودید با مثال های بیشتری مواجه خواهید شد. اما برای سادگی کار می توانید تا نیاز نشده از همان روش Dot Notation استفاده کنید که هم ساده تر است و هم گویاتر.در مقاله بعدی فصل دوم دوره آموزش جاوا اسکریپت برای مبتدی ها، به موضوع زیر خواهیم پرداخت :مفاهیم پایه جاوا اسکریپت - آرایه</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Thu, 16 Jan 2020 00:35:09 +0330</pubDate>
            </item>
                    <item>
                <title>مفاهیم پایه جاوا اسکریپت - نوع های داده ای</title>
                <link>https://virgool.io/coderlife/%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85-%D9%BE%D8%A7%DB%8C%D9%87-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%86%D9%88%D8%B9-%D9%87%D8%A7%DB%8C-%D8%AF%D8%A7%D8%AF%D9%87-%D8%A7%DB%8C-jwetwl2myy56</link>
                <description>در پست قبلی از فصل دوم آموزش جاوا اسکریپت برای مبتدی ها آموختیم که چطور می تونیم یک متغیر و ثابت رو تعریف کنیم. شاید حالا برایتان این سوال باشد که مقادیر داده ایکه به یک متغیر یا ثابت اختصاص می دهیم از چه نوع هایی می تواند باشد. در پست آموزشی قبلی با مقادیر از نوع رشته (String) آشنا شدید اما مسلما انواع داده ای (Data Types) بیشتری وجود دارند. انواع داده ای در زبان های برنامه نویسی مختلف، متفاوت هستند. در ادامه به انواع داده ای در زبان جاوا اسکریپت می پردازیم.انواع داده ای (Data Types) در جاوا اسکریپت چه هستند؟ در زبان برنامه نویسی جاوا اسکریپت دو نوع داده ای کلی داریم : نوع داده ای اصلی یا مقداری (Primitives/Value Types)، و نوع داده ای ارجاعی (Reference Types). اینکه نوع داده ای مقداری با نوع داده ای ارجاعی چه تفاوتی دارد جزو مباحث پیشرفته تر هست و به آن نمی پردازیم.هر کدام ازین نوع های داده ای نیز خود شامل موارد مختلفی هستند. انواع داده های اصلی یا مقداری عبارتند از : String, Number, Boolean, undefined, nullانواع داده ای در جاوا اسکریپتحالا هر کدام از انواع داده ای اصلی یا مقداری را در عمل با مثال ببینیم:let name = &#039;Ali&#039;; //String literal
let age = 31; //Number literal
let isApproved = true; //Boolean literalچند نکته در مورد نوع داده ای Boolean:نکته 1: نوع داده ای Boolean می تواند شامل مقدار true یا false باشد. نکته 2: از این نوع داده ای وقتی استفاده می کنیم که بخواهیم یک منطقی را در کد پیاده سازی کنیم. مثلا اگر سفارش مشتری تایید شد، کالا به آدرس او ارسال شود.نکته 3: کلمات true و false جزو کلمات کلیدی رزرو شده هستند و نمی توانیم از آن ها برای نامگذاری متغیرها و ثابت ها استفاده کنیم.در پست قبلی آموختیم که اگر به یک متغیر صریحا (explicitly) مقدار اولیه ای اختصاص ندهیم، مقدار آن به طور ضمنی (implicitly) و پیش فرض برابر با undefined خواهد بود. البته می توانیم صریحا هم به یک متغیر مقدار undefined اختصاص دهیم ولی این کار متداول نیست و توصیه هم نمی شود:let firstName; //implicit undefined
//or
let firstName = undefined; //explicit undefinedبر خلاف نوع داده ای undefined که اختصاص صریح آن به یک متغیر توصیه نمی شود، نوع داده ای null وجود دارد که باید آن را صریحا به یک متغیر نسبت دهیم:let lastName = null;چه موقع از نوع داده ای null استفاده کنیم؟نکته: از نوع داده ای null وقتی استفاده می کنیم که صریحا (explicitly) بخواهیم مقدار یک متغیر را پاک کنیم.مثلا فرض کنید می خواهیم فهرستی از رنگ ها را به کاربر نمایش دهیم و کاربر می تواند از بین آن ها یکی یا هیچ کدام را انتخاب کند. رنگ انتخاب شده توسط کاربر را باید در یک متغیر ذخیره کنیم. در صورتیکه کاربر رنگی را انتخاب نکند یا اینکه رنگ انتخاب شده خود را از حالت انتخاب در بیاورد مقدار متغیر مربوط را برابر null قرار می دهیم و در غیر اینصورت آن را برابر رنگ انتخاب شده وی قرار می دهیم:let selectedColor = &#039;red&#039;;
//if the user cleared his selected color
selectedColor = nullانواع String, Number, Boolean, undefined, null همگی جرو نوع داده ای مقداری هستند. در جاوا اسکریپت نسخه ES6 یک نوع داده ای مقداری جدید به نام Symbol هم اضافه شده است که در آینده به آن خواهم پرداخت.تعیین نوع داده ای در زمان اجرا (Dynamic Typing)ویژگی مهمی که زبان جاوا اسکریپت را متمایز می کند آنست که جاوا اسکریپت یک زبان برنامه نویسی پویا (Dynamic) است، یعنی چه؟به طور کلی زبان های برنامه نویسی از لحاظ شیوه تعیین نوع داده ای متغیرها به دو دسته تقسیم می شوند:استاتیک (Static)پویا (Dynamic)در زبان های استاتیک مثل جاوا و #C وقتی می خواهیم متغیری را تعریف کنیم حتما باید نوع داده ای آن را هم صریحا مشخص کنیم و نوع داده ای آن متغیر پس از تعریف به هیچ وجه قابل تغییر نخواهد بود. اما در زبان های پویا مثل جاوا اسکریپت و PHP نوع داده ای یک متغیر در زمان تعریف آن متغیر تعیین نمی شود بلکه نوع داده ای آن در زمان اجرا و بر اساس مقدار داده ایکه به آن متغیر اختصاص داده شده است تعیین خواهد شد. زبان های برنامه نویسی از لحاظ Type Checkingحالا پویا بودن تعیین نوع داده ای در زبان جاوا اسکریپت را با یک مثال در کد نویسی بررسی می کنیم:let name = &#039;Ali&#039;;گفتیم که در این نوع زبان ها، نوع داده ای متغیر از روی مقدارش تعیین می شود. همانطور که می بینیم مقدار اختصاص داده شده به متغیر name از نوع رشته (String) می باشد. در زبان جاوا اسکریپت یک عملگر(Operator) داریم به نام typeof که به کمک آن می توانیم نوع داده ای یک متغیر را در زمان اجرا بفهمیم:console.log(typeof name);اگر کنسول رو باز کنید مشاهده می کنید که نوع داده ای String را در خروجی ثبت می کند. حالا مقدار متغیر name را به نوع داده ای دیگری تغییر دهید و یکبار دیگر از آن typeof بگیرید:name = 1;
console.log(typeof name);این بار نوع داده ای Number در خروجی نمایش داده خواهد شد. پس:نکته: در زبان های پویا نوع داده ای یک متغیر در زمان اجرا و براساس آخرین مقداری که به آن اختصاص داده شده است تعیین خواهد شد نه در زمان تعریف متغیر.نکته: کلمه typeof جزو کلمات کلیدی رزرو شده است و در نامگذاری ها قابل استفاده نیست.به عنوان مثالی دیگر، از متغیر age که در بالا تعریف کردیم یک typeof بگیرید:console.log(typeof age);در کنسول نوع داده ای Number برایتان نمایش داده خواهد شد. حالا مقدار متغیر age را از عدد صحیح 31 به عدد اعشاری 30.1 تغییر دهید و یکبار دیگر از آن typeof بگیرید:age= 30.1; 
console.log(typeof age);باز هم نوع داده ای Number در خروجی نمایش داده خواهد شد، پس:نکته: در جاوا اسکریپت بر خلاف سایر زبان های برنامه نویسی نوع های داده ای جداگانه ای برای اعداد صحیح و اعداد اعشاری نداریم و اعداد همگی از نوع Number هستند.در ادامه، از سایر متغیرهاییکه در بالا تعریف کرده بودیم هم typeof بگیرید و نوعشان را بررسی کنید:console.log(typeof isApproved); //Boolean
console.log(typeof firstName); //undefinedهمانطور که می بینید متغیر firstName هم مقدارش و هم نوع داده ایش برابر undefined است بنابراین:نکته: undefined هم یک نوع داده ایست و هم یک مقدار داده ای.به عنوان مثال آخر مقدار متغیر selectedColor را برابر null قرار داده و از آن یک typeof بگیرید:selectedColor = null;
console.log(typeof selectedColor);خواهید دید که Object به عنوان نوع داده ای این متغیر در خروجی نمایش داده خواهد شد. حالا اگر می خواهید بدانید که Object چیست و چه کاربردی دارد پست آموزشی بعدی این فصل را از دست ندهید.در مقاله بعدی فصل دوم دوره آموزش جاوا اسکریپت برای مبتدی ها، به موضوع زیر خواهیم پرداخت :مفاهیم پایه جاوا اسکریپت - آبجکت</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Fri, 10 Jan 2020 13:50:23 +0330</pubDate>
            </item>
                    <item>
                <title>مفاهیم پایه جاوا اسکریپت - متغیرها و ثابت ها</title>
                <link>https://virgool.io/coderlife/%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85-%D9%BE%D8%A7%DB%8C%D9%87-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D9%85%D8%AA%D8%BA%DB%8C%D8%B1%D9%87%D8%A7-yxfalw0diyty</link>
                <description>متغیرها (Variables) و ثابت ها (Constants) از پایه ای ترین مباحث در زبان جاوا اسکریپت و نیز سایر زبان های برنامه نویسی هستند. در این مطلب ابتدا به مفهوم متغیر و در ادامه آن به مفهوم ثابت می پردازم.متغیر چیست و چه کاربردی دارد؟خیلی ساده اینکه از متغیر ها برای ذخیره سازی و نگهداری موقت داده (Data)ها در حافظه کامپیوتر استفاده می کنیم. یعنی اینکه داده رو در مکانی مشخص از حافظه قرار داده و به اون مکان مشخص از حافظه یک نام یا اصطلاحا شناسه اختصاص می دهیم. نامگذاری بهمون این امکان رو میده که در برنامه مون هر وقت به داده های ذخیره شده در حافظه احتیاج پیدا کردیم بتونیم اون ها رو فراخوانی کرده و به مقدارشون دسترسی داشته باشیم.نگهداری موقت داده در حافظه با تعریف متغیرهابرای اینکه مفهوم متغیر بیشتر براتون روشن بشه یک مثال براتون می زنم.فرض کنید که دارید لوازم منزلتون رو برای جابجایی به یک ساختمون جدید با کارتن های مختلف بسته بندی می کنید. هر کارتن نقش یک مکان از حافظه کامپیوتر رو داره. احتمالا شما برای اینکه بتونید بعد اسباب کشی وسایلتون رو راحت پیدا کنید به هر کارتن یک برچسب می زنید و نامگذاریش می کنید. این برچسب ها هم نقش نام متغیرها رو دارن. وسایلی که داخل هر کارتن قرار می گیره هم نقش مقداری رو داره که به یک متغیر اختصاص می دهیم یعنی همون داده ( Data)ها. حالا ببنیم متغیرها در کدنویسی به چه صورت هستند. توجه: اگه خوب یادتون باشه در فصل قبل یک پروژه ساده ایجاد کرده بودیم. در اون پروژه یه پوشه درست کردیم به اسم js-basics و داخل اون هم دو تا فایل ایجاد کرده بودیم: index.html و index.js. داخل فایل index.html هم به فایل index.js ارجاع داده بودیم. حالا برای تمرین کدهای این قسمت کافیه تا محتوای داخل فایل index.js رو پاک کنید و کدهای این جلسه رو داخلش بنویسید.تعریف متغیر در جاوا اسکریپتتا قبل از انتشار جاوا اسکریپت نسخه ES6 برای تعریف یک متغیر از کلمه کلیدی var استفاده می شد. اما استفاده از var برای تعریف یک متغیر ممکن است مشکلاتی را به همراه داشته باشد که در آینده بدان می پردازم. به همین علت از نسخه ES6 به بعد بهترین روش (Best Practice) برای تعریف یک متغیر در جاوا اسکریپت استفاده از کلمه کلیدی let می باشد:let name;بعد از let نام متغیر را می آوریم. در این مثال متغیرمان رو name نامگذاری کردیم. حالا از متغیری که تعریف کردید یک خروجی در کنسول بگیرید:console.log(name);تغییرات را ذخیره کرده و مطابق پست آموزشی جاوا اسکریپت در مرورگرها، برنامه رو اجرا کنید و کنسول مرورگر را باز کنید و به خروجی توجه کنید. مقدار undefined را در خروجی مشاهده خواهید کرد پس:نکته: به طور پیش فرض هر متغیری را که در جاوا اسکریپت تعریف می کنیم مقدار اولیه اش برابر با undefined می باشد.می توانید مقدار پیش فرض متغیریکه تعریف می کنید را تغییر داده و اصطلاحا آن را مقدار دهی اولیه (Initialization) کنید:let name = &#039;Ali&#039;;

console.log(name);حتما از فصل قبل به یاد دارید که مقادیر رشته ای (String Literal) را باید بین کاراکترهای &#x27; &#x27;  یا &quot; &quot; قرار دهید. به عنوان بهترین روش توصیه می شود برای تعریف مقادیر رشته ای از کاراکترهای &#x27; &#x27; استفاده نمائید. حالا اگر تغییرات را ذخیره کنید و به کنسول مرورگر بروید مقدار Ali را در خروجی خواهید دید.قوانینی که برای نامگذاری متغیرها باید رعایت کنیدنامی که انتخاب می کنید نمی تواند هم نام با کلمات کلیدی رزرو شده در زبان جاوا اسکریپت مثل let، if، else، و ... باشد. نیازی به حفظ کردن کلمات کلیدی رزرو شده نیست چون هربار که شما اشتباها ازین کلمات در نامگذاری هایتان استفاده کنید خطای مربوط به شما اعلام خواهد شد. این خطا با قرار دادن خط قرمز زیر نام متغیر برایتان نشان داده خواهد شد.نامی که انتخاب می کنید بهتر است حتما معنا دار باشد. برخی ها برای نامگذاری متغیر ها از کلماتی مثل a، b، a1، x و ... استفاده می کنند. همانطور که می بینید ازین نام ها پیدا نیست که چه مقداری در آن متغیرها ذخیره شده است. بنابراین اکیدا توصیه می شود که از کلمات معنادار و توصیفی (Descriptive) برای نامگذاری ها استفاده کنید.نام هاییکه انتخاب می کنید نمی توانند با عدد شروع شوند. مثلا نمی توانیم متغیری رو 1name نامگذاری کنیم.نام هاییکه انتخاب می کنید نمی توانند شامل کاراکترهای فاصله (Space) و خط تیره (Hyphen) باشند. پس اگر نامیکه انتخاب می کنید از چند کلمه تشکیل شده است بایستی آن ها را به هم بچسبانید. مثلا فرض کنید می خواهیم متغیری برای ذخیره نام خانوادگی تعریف کنیم:let lastName = &#039;Taghani&#039;;برای نوشتن نام متغیر در این مثال از قرارداد Camel Notation استفاده شده است. طبق این قرارداد (Convention) بایستی حرف اول نخستین کلمه با حرف کوچک انگلیسی و حرف اول مابقی کلمات با حرف بزرگ انگلیسی نوشته شود.نام متغیرها حساس به حروف کوچک و بزرگ (Case Sensitive) هستند. لذا متغیرهای زیر با هم فرق دارند و در حقیقت دو متغیر مجزا از هم خواهند بود:let lastName = &#039;Taghani&#039;;let LastName = &#039;Taghani&#039;;در این مثال هر چند مقدار هر دو متغیر برابر با رشته Taghani می باشد اما در حقیقت دو متغیر متفاوت هستند و به دو مکان جداگانه در حافظه اشاره می کنند. اگر قرارداد Camel Notation را در نامگذاری ها رعایت کنیم با این مشکل مواجه نخواهیم شد.چطور چندین متغیر تعریف کنیم؟برای تعریف چند متغیر، دو روش وجود دارد که یکی از آن ها به عنوان بهترین روش توصیه می شود:همه چند متغیر را در یک خط پشت سر هم تعریف کنیم و آن ها را با ویرگول از هم جدا کنیم:let firstName, lastName = &#039;Taghani&#039;;همانطور که مشاهده می کنید یکبار از کلمه کلیدی let برای همه متغیرها استفاده نمودیم. همچنین می توانیم به متغیری مقدار اولیه بدهیم یا اینکه نه مقدارش همان مقدار پیش فرض undefined باشد.هر متغیر را در خط جداگانه ای تعریف کنیم. این روش به عنوان بهترین شیوه توصیه می شود لذا شما هم از آن پیروی کنید:let firstName;let lastName = &#039;Taghani&#039;;ثابت ها (Constants) چه هستند و چه فرقی با متغیرها دارند؟خود کلمه های ثابت و متغیر گویای این دو مفهوم در برنامه نویسی هستند و لذا چیز پیچیده ای نیستند. اما برای توضیح مفهوم ثابت در جاوا اسکریپت با یک مثال شروع می کنم. در فایل index.js متغیری را برای ذخیره داده ای به نام نرخ بهره تعریف کرده و آن را مقدار دهی اولیه کنید:let interestRate = 0.3;مقدار اولیه یک متغیر رو می توانیم هر جا و هر وقت که نیاز باشد دوباره تغییر بدهیم لذا اگر مقدار این متغیر را برابر با عدد 1 قرار دهیم و یک لاگ از آن بگیریم مقدار 1 را در کنسول خواهیم دید نه عدد 0.3 را:interestRate = 1;console.log(interestRate);اما در برنامه هاییکه توسعه می دهیم، حالت هایی هستند که نمی خواهیم مقدار اولیه ایکه به یک داده اختصاص می دهیم، قابل تغییر باشد چرا که در اثر تغییر مقدار آن ممکن است خطاهای متعددی در برنامه ایجاد شوند. اگر با چنین حالتی روبرو شدید حتما بایستی به جای متغیر از ثابت استفاده کنید.برای تعریف یک مقدار از نوع ثابت کافیست به جای کلمه کلیدی let از کلمه کلیدی const استفاده نمایید:const interestRate = 0.3;حالا سعی کنید مقدار این ثابت را تغییر دهید و سپس یک لاگ از آن گرفته و خروجی را در کنسول مشاهده کنید:interestRate = 1;console.log(interestRate);حالا اگر به کنسول مرورگر بروید خواهید دید که یک خطا رخ داده است:این خطا از نوع Uncaught TypeError می باشد و همانطور که از توضیح خود خطا پیداست، در اثر تغییر مقدار یک ثابت رخ داده است. همچنین اگر دقت کنید مشاهده می کنید (index.js:2) که خود خطا می گوید به خاطر کدام خط از کدام فایل است. در این مثال، خطا در خط دوم فایل index.js ایجاد شده است که اگر روی آن کلیک کنید شما را به خط دوم آن فایل برده و خطا را نشان خواهد داد.نکته: اگر مقدار داده ایکه تعریف می کنیم قرار است دوباره بشود آن را تغییر داد بایستی از متغیر برای تعریفش استفاده کنید در غیر اینصورت اگر مقدار داده ای قرار است در طول کل برنامه تغییر نکند، از ثابت برای تعریف آن استفاده نمائید.در مقاله بعدی فصل دوم دوره آموزش جاوا اسکریپت برای مبتدی ها، به موضوع زیر خواهیم پرداخت :مفاهیم پایه جاوا اسکریپت - نوع های داده ای</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Wed, 08 Jan 2020 23:12:36 +0330</pubDate>
            </item>
                    <item>
                <title>جاوا اسکریپت در Node</title>
                <link>https://virgool.io/coderlife/%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D8%AF%D8%B1-node-t8vas1exoftv</link>
                <description>در پست آموزش جاوا اسکریپت برای مبتدی ها، به محیط های اجرای (Runtime Environments) جاوا اسکریپت اشاره کردم و گفتم که قبل ترها جاوا اسکریپت فقط در مرورگرها امکان اجرا شدن داشت اما امروزه جاوا اسکریپت را هم در مرورگر و هم خارج از آن در Node می توان اجرا کرد. در قسمت سوم این دوره آموزشی به اجرای جاوا اسکریپت در مرورگرها پرداختم. در این پست کوتاه نیز به اجرای جاوا اسکریپت در محیط Node خواهم پرداخت. توجه داشته باشید که در این دوره آموزشی، بیش ازین به Node نمی پردازم چرا که خودش مبحث کاملا مفصل و جداگانه هستش و یه دوره آموزشی کامل رو می طلبه.چگونه کدهای جاوا اسکریپتی را در Node اجرا کنیم؟اگر از پست اصل SoC و جداسازی کدها به خاطر داشته باشید، کدهای جاوا اسکریپت پروژه مون رو از کدهای html اون جدا کرده و در فایل جاوا اسکریپتی جداگانه ای به نام index.js ذخیره کردیم. این جداسازی امکان اجرا در محیط های مختلف رو برامون فراهم می کنه.فرض بر اینه که شما برنامه Node رو از قبل بر روی کامپیوترتون نصب کردید. برای اطمینان ازینکه Node رو نصب کردید کافیه تا اگه در ویندوز هستید در برنامه خط فرمان (CMD) دستور زیر رو وارد کنید:node -vاگر در پاسخ به دستور فوق، نسخه برنامه Node در خروجی برایتان نشان داده شد یعنی اینکه آن را نصب کرده اید در غیر اینصورت می تونید آخرین نسخه پایدار (LTS Version) متناسب با سیستم عامل کامپیوترتون رو از آدرس https://nodejs.org دانلود کرده و نصب کنید.حالا در خط فرمان وارد مسیری که پوشه js-basics در آن قرار دارد شوید. برای اینکار به طور خیلی ساده کافیست تا فرمان cd را در خط فرمان نوشته و دکمه فاصله (space) رو از صفحه کلید فشار دهید سپس پوشه js-basics رو با ماوس گرفته و به روی پنجره برنامه cmd کشیده و رها کنید. می بینید که مسیر آن پوشه در ادامه فرمان cd درج می شود. حالا دکمه Enter را فشار دهید تا تغییر مسیر مورد نظر انجام شود.حالا خیلی ساده کافیه تا Node رو اجرا کرده و نام فایل جاوا اسکریپتمون رو اصطلاحا به اون پاس بدیم. مطابق دستور زیر:node index.jsمشاهده خواهید کرد که عبارت Hello World در خروجی برایتان نمایش داده می شود. به همین سادگی می تونید کدهای جاوا اسکریپت رو با Node خارج از مرورگر اجرا کنید چونکه Node موتور جاوا اسکریپت V8 گوگل کروم رو در خود دارد.در پایان می خواهم نکته ای رو خدمتتون نشون بدم. اگر از ویرایشگر VS Code استفاده می کنید خوبه بدونید که یک نسخه از ترمینال یا ابزار خط فرمان در این ویرایشگر قرار داده شده و لذا دیگه نیازی نیست که شما برای نوشتن دستورات خط فرمان از برنامه جداگانه ای (مثل CMD در ویندوز)  استفاده کنید. برای باز کردن ترمینال در VS Code از منوی View گزینه Integrated Terminal رو انتخاب کنید یا اینکه از کلیدهای &#x60; + Ctrl استفاده کنید. وقتی این ترمینال رو باز کنید می بینید که خودش به طور خودکار وارد مسیر پوشه مربوط به پروژه ایکه هم اکنون در VS Code باز هست، خواهد شد. لذا نیازی نیست که صریحا به آن مسیر برویم. کافیست یکبار دیگر دستور بالا را اینجا هم وارد کنید و نتیجه رو مشاهده کنید.ابزار ترمینال در ویرایشگر VS Codeبا پایان یافتن این مطلب، به انتهای فصل اول دوره آموزش جاوا اسکریپت برای مبتدی ها رسیدیم. در فصل بعدی این دوره به آموزش موارد پایه ای (Basics) در جاوا اسکریپت شامل موارد زیر خواهم پرداخت:متغیر ها (Variables)ثابت ها (Constants)نوع های داده ای اصلی (Primitive Types) تعیین نوع داده ای در زمان اجرا (Dynamic Typing)آبجکت ها (Objects)آرایه ها (Arrays)توابع (Functions)</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Mon, 06 Jan 2020 23:00:16 +0330</pubDate>
            </item>
                    <item>
                <title>اصل SoC و جداسازی کدها</title>
                <link>https://virgool.io/@taghaniali/%D8%A7%D8%B5%D9%84-soc-%D9%88-%D8%AC%D8%AF%D8%A7%D8%B3%D8%A7%D8%B2%DB%8C-%DA%A9%D8%AF%D9%87%D8%A7-mkayiqces8an</link>
                <description>در مقاله جاوا اسکریپت در مرورگرها، اولین کد جاوا اسکریپتی که خیلی ساده بود و فقط پیام Hello World را در کنسول ثبت می کرد، نوشتیم و اون رو در مرورگر اجرا کردیم. اما واقعیت اینه که در یک برنامه واقعی ممکنه هزاران یا حتی در برنامه های بزرگ سازمانی (Enterprise) میلیون ها خط کد جاوا اسکریپتی داشته باشیم. کاملا بدیهی هستش که این مقدار کد رو نباید مستقیما به صورت اصطلاحا توکار (Inline) داخل فایل html بنویسیم. پس راه حل چیه؟ راه حل پیروی از یک اصل در برنامه نویسی به نام SoC یا Separation of Concerns (جداسازی قابلیت ها یا رفتارها) است. این اصل به مقدار خیلی زیادی قابلیت استفاده مجدد از کد، تست پذیری و نگهداری پذیری نرم افزار را افزایش می دهد.کدنویسی بر طبق اصل SoCبگذارید با یک مفهوم استعاری یا انتزاعی شروع کنیم تا موضوع قابل فهم تر بشه. فضای منزلتون رو در نظر بگیرید. در یک منزل نوعی اتاق های متعددی وجود داره. حالا بگید جای تخت خواب داخل اتاق خواب هستش یا داخل آشپزخونه؟ مطمئنا جای تخت خواب در اتاق خواب هستش. این مثال، مصداق همون مفهومی هستش که در برنامه نویسی اون را SoC می گیم.در یک صفحه وب، محتوا (Content) به کمک html پیاده سازی می شه، نقش جاوا اسکریپت هم پیاده سازی رفتار (Behavior) هاست. مثلا اینکه وقتی نشانگر ماوس رو بر روی المانی از محتوای صفحه بردیم، آن المان اندازه اش تغییر کند یا اینکه پنهان شود یا اینکه کادری به صورت pop-up نمایش داده شود. پر واضح هستش که محتوا و رفتار دو مقوله جدا از هم هستن پس باید اون ها رو از هم جدا کنیم.پوشه js-bascis که در پست های آموزشی قبلی ایجاد کرده بودیم رو با ماوس کشیده و روی ویرایشگر VS Code رها کنید. در تب اکسپلور، داخل پوشه js-basics و در کنار فایل index.html یک فایل جدید به نام index.js ایجاد کنید. حالا فایل index.html را باز کرده و کدهای جاوا اسکریپتی که در پست قبل داخل تگ script نوشته بودیم رو برداشته و به داخل فایل index.js منتقل کنید و اون رو ذخیره کنید.جداسازی کدهای html و javascript در این مثال خیلی ساده ما فقط یک فایل جاوا اسکریپت داریم اما در برنامه های واقعی بزرگ ممکنه صدها یا حتی هزاران فایل جاوا اسکریپتی مجزا داشته باشیم. در آموزش های آتی به شما خواهم گفت که چطور می تونیم فایل های مجزای جاوا اسکریپتی یک برنامه رو بعد از توسعه کامل برنامه، به صورت یک فایل یکپارچه (Bundle) در بیاریم و اون رو برای اجرا به سمت کلاینت یا همون مرورگر بفرستیم.حالا که کدهای html و javascript برنامه رو از هم جدا کردیم. بایستی در فایل index.html به فایل index.js ارجاع بدیم. برای اینکار کافیه تا به تگ script که کدهای داخلش رو اخیرا به فایل دیگه ای منتقل کردیم، یک خصوصیت به نام src اضافه کرده و مقدارش رو برابر با آدرس محل قرار گیری فایل index.js نسبت به محل فایل index.html قرار بدیم. مثل زیر:ارجاع به فایل js به کمک خصوصیت src در تگ scriptبا این کار به مرورگر می گیم که کدهای جاوا اسکریپت برنامه هم اکنون در فایل index.js قرار دارند. تغییرات فایل index.html را ذخیره کنید. سپس بر روی فایل index.html در تب اکسپلورر کلیک راست کرده و گزینه Open With Live Server را انتخاب کنید. مرورگر پیش فرض شما باز شده و به طور خودکار به آدرس http://127.0.0.1:5500/index.html هدایت خواهد شد. داخل مرورگر بر روی یک فضای خالی کلیک راست کرده و گزینه Inspect را انتخاب کنید یا از دکمه های میانبر Ctrl + Shift + I (در ویندوز) استفاده نمائید. پنجره Developer Tools برایتان باز می شود. در پنجره باز شده بر روی تب Console کلیک نمائید. حالا مشاهده خواهید کرد که عبارت Hello World در خط فرمان برایتان ثبت (Log) شده است. این نشان می دهد که برنامه ساده ما بعد از جداسازی کدها نیز به درستی کار می کند.در مقاله بعدی دوره آموزش جاوا اسکریپت برای مبتدی ها، به موضوع زیر خواهیم پرداخت :اجرای جاوا اسکریپت در Node</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Wed, 01 Jan 2020 23:56:38 +0330</pubDate>
            </item>
                    <item>
                <title>جاوا اسکریپت در مرورگرها</title>
                <link>https://virgool.io/coderlife/%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D8%AF%D8%B1-%D9%85%D8%B1%D9%88%D8%B1%DA%AF%D8%B1%D9%87%D8%A7-f19ppviglp7g</link>
                <description>سلام. اگه دو مقاله قبلی این دوره آموزشی با عنوان های آموزش جاوا اسکریپت برای مبتدی ها و راه اندازی محیط کد نویسی برای جاوا اسکریپت را دنبال کرده باشید، حالا دیگه همه چی برای اینکه بتونید اولین کد جاوا اسکریپتی خودتون رو بنویسید آماده و مهیاست. اگه یادتون باشه گفتیم که جاوا اسکریپت رو هم می شه در مرورگر اجرا کرد و هم خارج از اون در Node. در این مقاله به اجرای جاوا اسکریپت در مرورگرها خواهم پرداخت.کاربرد اِلِمان یا عنصر script در htmlدر مقاله قبلی، تا آنجا پیش رفتیم که یک فایل میزبان (host) به نام index.html در پوشه js-basics ایجاد کردیم. برای اینکه بتونیم کدهای جاوا اسکریپت رو در این فایل میزبان قرار بدیم یا بنویسیم بایستی از المان script استفاده کنیم. این المان رو در دو جای سند html-مون می تونیم قرار بدیم: 1- قسمت head2- قسمت bodyبه عنوان بهترین شیوه عمل (Best Practice) پیشنهاد می شود که المان script حاوی کدهای جاوا اسکریپت را در قسمت body بعد از همه المان های داخل آن و ما قبل تگ بسته &lt;body/&gt; قرار دهیم. دو دلیل برای اینکار وجود دارد:الف- مرورگر کدهای درون سند html را از بالا به پایین خوانده و تجزیه-تحلیل می کند (Parsing).لذا اگر کدهای جاوا اسکریپت را در قسمت head قرار دهیم و احیانا میزان کدهای جاوا اسکریپتی که نوشته ایم زیاد باشد، وقتی مرورگر به آن قسمت می رسد مادامیکه مشغول خواندن و اجرا کردن آن قسمت از کدهاست، قادر نخواهد بود تا محتوای صفحه را تولید کرده (Rendering) و به کاربر نمایش دهد. در نتیجه یک تجربه کاربری (User Experience = UX) بدی برای کاربر در پی خواهد داشت و کاربر در طول زمانیکه مرورگر مشغول خواندن و اجرا کردن کدهای جاوا اسکریپت است با یک صفحه خالی سفید رنگ مواجه خواهد شد.ب- تقریبا در اکثر مواقع کدهای جاوا اسکریپتی که می نویسیم نیاز دارند تا با المان ها یا عناصر صفحه (اصطلاحا DOM) صحبت کنند. به عنوان مثال فرض کنید که بخواهیم به کمک جاوا اسکریپت المانی از صفحه را مخفی کرده یا اینکه اگر مخفی هست، آن را نمایش دهیم. در صورتیکه کدهای جاوا اسکریپت را در قسمت body قرار داده باشیم می توانیم مطمئن باشیم که پیش ازین تمامی المان های محتوای صفحه توسط مرورگر تولید (Render) شده اند. استثنائاتی هم هست که حتما کدهای جاوا اسکریپت باید در قسمت head سند html قرار گیرند تا عملکرد درستی داشته باشند مثلا بعضی از کتابخانه های جاوا اسکریپتی ثالث (Third-Party JS Libraries). به مرور که با جاوا اسکریپت بیشتر آشنا شده و کار کردید حتما با این موارد هم روبرو خواهید شد، پس عجله نکنید. اما این ها فقط استثناء هستند و همانطور که گفتم و دلایلش را توضیح دادم به عنوان بهترین شیوه عمل بایستی کدهای جاوا اسکریپت را در انتهای قسمت body قرار دهیم.حالا همان کد جاوا اسکریپتی را که برای اولین بار در مقاله آموزش جاوا اسکریپت برای مبتدی ها مستقیما داخل کنسول جاوا اسکریپت مرورگر نوشتیم، اینجا به کمک المان script درون سند html می نویسیم. انتهای قسمت body و ما قبل تگ بسته آن کلمه script را بنویسید و کلید Tab را از صفحه کلید فشار دهید تا المان کامل script برایتان ایجاد شود و مطابق زیر کد جاوا اسکریپتی لازم برای نمایش عبارت Hello World در کنسول مرورگر را درون آن بنویسید:بهترین شیوه عمل برای استفاده از المان scriptبا فشردن کلیدهای ترکیبی Ctrl + S تغییرات را ذخیره کنید. بر روی فایل index.html کلیک راست کرده و گزینه Open with Live Server را انتخاب کنید. مرورگر پیش فرض شما باز شده (برای اینکه با هم هماهنگ باشیم لطفا از مرورگر گوگل کروم استفاده کنید) و به طور خودکار به آدرس وب http://127.0.0.1:5500/index.html هدایت خواهد شد. داخل مرورگر بر روی یک فضای خالی کلیک راست کرده و گزینه Inspect را انتخاب کنید یا از دکمه های میانبر Ctrl + Shift + I (در ویندوز) استفاده نمائید. پنجره Developer Tools برایتان باز می شود. در پنجره باز شده بر روی تب Console کلیک نمائید. حالا مشاهده خواهید کرد که عبارت Hello World در خط فرمان برایتان ثبت (Log) شده است. تبریک می گم شما موفق شدید اولین کد جاوا اسکریپتی خودتون را بنویسید.حالا یه کمی بیشتر راجع به جزئیات کدی که نوشتیم توضیح بدم:به console.log(&#x27;Hello World&#x27;) اصطلاحا یک statement می گویند. هر statement در حقیقت یک قطعه کد است و عملیاتی را نشان می دهد که باید انجام شود. مثلا در کد بالا statement-ایکه نوشتیم بایستی یک پیام را در کنسول ثبت کند.هر خط کد در جاوا اسکریپت بایستی با کاراکتر ; (نقطه ویرگول یا semicolon) تمام شود.آنچه مابین دو کاراکتر &#x27; &#x27; (نقل قول تک یا single quote) قرار می گیرند را اصطلاحا string (رشته) می نامند.رشته یا string در حقیقت یک دنباله از کاراکترهاست.در جاوا اسکریپت هم مثل همه زبان های برنامه نویسی دیگر برای کدهاییکه می نویسیم، می توانیم توضیحات (comment) درج کنیم. برای درج توضیحات از // (double forward slash) استفاده می کنیم. ویژگی ایکه توضیحات دارند آنست که موتور جاوا اسکریپت حین خواندن کدها آن ها را نادیده گرفته و اجرایشان نخواهد کرد.کاربرد توضیحات برای مستندسازی کدهاست و برای آنست که به سایر توسعه دهندگان بگوییم چرا به این صورت کد نوشته ایم.نکته مهمی که باید بدونیم اینه که در توضیحاتی که برای کدهامون درج می کنیم به لحاظ مفهومی و نه از لحاظ فنی و گرامری، باید «چرا (Why)» ها و «چگونگی (How)» ها را بیان کنیم و نباید بگوییم این قطعه کد چه کار می کند، چون آن عملیاتی که کد قرار است انجام دهد خودش باید از کدی که نوشته ایم به وضوح قابل درک و دریافت باشد. البته اگه اینطور هم عمل نکنیم مشکلی پیش نمیاد تنها ایرادش اینه که از فلسفه کاربرد توضیحات فاصله گرفتیم. بنابراین اگر بخواهیم برای قطعه کد جاوا اسکریپت بالا توضیحات درج کنیم نمونه توضیحات اشتباه و نمونه توضیحات صحیح می تواند به صورت زیر باشد:نمونه توضیحات اشتباه:    
     //logging something on the console       
     console.log(&#039;Hello World&#039;);
 
نمونه توضیحات صحیح:         
      //This is my first javascript code             
      console.log(&#039;Hello World&#039;);  
 
در مقاله بعدی دوره آموزش جاوا اسکریپت برای مبتدی ها، به موضوع زیر خواهیم پرداخت :اصل SOC و جداسازی کدها</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Tue, 31 Dec 2019 00:08:13 +0330</pubDate>
            </item>
                    <item>
                <title>راه اندازی محیط کد نویسی برای جاوا اسکریپت</title>
                <link>https://virgool.io/coderlife/%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%D9%85%D8%AD%DB%8C%D8%B7-%DA%A9%D8%AF-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-zfogvvsxketj</link>
                <description>در مقاله آموزش جاوا اسکریپت برای مبتدی ها گفته شد که چون هر مرورگری درون خود یک موتور جاوا اسکریپت اختصاصی دارد پس ما می تونیم داخل کنسول جاوا اسکریپت مرورگر و بدون نیاز به ابزارهای ثالث (Third-Party Tools) کدهای معتبر جاوا اسکریپتی بنویسیم و اجراشون کنیم. اما در ادامش این رو هم  اضافه کردیم که برای توسعه برنامه های واقعی باید طور دیگری عمل کنیم. یعنی چی؟ یعنی اینکه ابتدا باید به کمک ابزار های ثالث بر روی کامپیوترمون یک محیط کدنویسی (Local Development Environment) مناسب راه اندازی کنیم.گام اول : نصب ویرایشگر کد (Code Editor)برای برنامه نویسی با زبان جاوا اسکریپت قبل از هر چیز به یک ویرایشگر کد مدرن و مناسب نیاز داریم. در حال حاضر ویرایشگر های متعددی وجود دارند که بسته به ترجیحاتتون می تونید از اون ها استفاده کنید از جمله: ویرایشگر Visual Studio Code یا VS Code، ویرایشگر Sublime Text، ویرایشگر Atom، و ... .ویرایشگرهای کدویرایشگر مورد علاقه من و شاید خیلی از برنامه نویس ها، ویرایشگر VS Code هستش. شما می توانید این ویرایشگر پر طرفدار، ساده، سبک و قدرتمند رو از آدرس https://code.visualstudio.com دانلود کنید. یکی از خوبی هاش اینه که شما می تونید اون رو بسته به سیستم عامل کامپیوتر خودتون (ویندوز، لینوکس، و مک) دانلود و نصب کنید یعنی VS Code یک ویرایشگر اصطلاحا Cross Platform می باشد.گام دوم : نصب برنامه Nodeبه لحاظ فنی، برای اجرای جاوا اسکریپت حتما الزامی به نصب کردن Node نداریم چون همونطور که قبلا در مقاله آموزش جاوا اسکریپت برای مبتدی ها گفتیم، می شه کدهای جاوا اسکریپت را هم در مرورگر و هم خارج از اون در Node اجرا کنیم. لذا هر دوی اون ها محیط اجرای جاوا اسکریپت هستند.اما پیشنهاد ما اینه که حتما Node رو در کامپیوترتون نصب کنید. چون ما از Node برای نصب کتابخانه های ثالث (Third-Party Libraries) استفاده می کنیم. در مقاله های بعدی در آینده نزدیک حتما یک پیش نمایشی از Node ارائه خواهم کرد.بنابراین اگر Node را قبلا در کامپیوترتان نصب نکرده اید پیشنهاد می کنیم حتما اون را از آدرس https://nodejs.org دانلود کرده و نصب کنید.گام سوم : نصب سرویس دهنده وب محلی (Local Web Server)اینکه چرا وقتی رو کامپیوتر خودمون در حال کدنویسی هستیم (Local Development) به نصب یک سرویس دهنده وب محلی (یعنی سرویس دهنده ایکه روی کامپیوتر خودمان باشد) نیاز داریم، بعدها که مهارت های بیشتری کسب کردید و به دانسته هاتون اضافه شد خودتون متوجه خواهید شد. پیشنهاد می کنم وب سروری که انتخاب و نصب می کنیم حتما قابلیت پیشرفته live reload هم داشته باشه. خیلی ساده اگه بخوام بگم، ما به این قابلیت احتیاج داریم تا بتونه وقتی تغییری در کدها می دیم به طور خودکار خودش اون تغییرات را اعمال کنه و مجددا نتیجه جدید رو در مرورگر نشونمون بده بدون اینکه نیاز باشه ما به صورت دستی صفحه وب رو مجددا بارگذاری کنیم. این قابلیت مهم سرعت کدنویسی شما را بسیار سریع تر خواهد کرد.برای راه اندازی سرویس دهنده وب محلی با قابلیت live reload ساده ترین روش اینه که بعد از نصب ویرایشگر VS Code اون رو اجرا کنید و با کلیدهای ترکیبی Ctrl + Shift + X  به تب Extensions بروید. سپس در باکس Search Extensions in Marketplace عبارت Live Server رو جستجو کنید. از بین نتایج جستجو افزونه Live Server توسعه داده شده توسط Ritwick Dey را انتخاب و نصب کنید. بعد از نصب افزونه بایستی ویرایشگر را یکبار راه اندازی مجدد کنید. برای اینکار می توانید بر روی دکمه reload که بعد از نصب زیر افزونه نصب شده نمایان می شود استفاده کنید یا اینکه یکبار ویرایشگر را بسته و مجددا اجرایش کنید.نصب افزونه Live Server بر روی ویرایشگر VS Code با اتمام گام سوم، محیط توسعه برای کدنویسی با جاوا اسکریپت بر روی کامپیوتر شما آماده است. پیشنهاد می کنیم در مسیر مناسبی بر روی کامپیوترتون پوشه ای برای نگهداری فایل های پروژه ها و تمرین های این دوره آموزشی ایجاد کنید. برای اینکه با هم هماهنگ باشیم اگر از ویندوز استفاده می کنید بر روی دسکتاپ خود پوشه جداگانه ای به نام js-basics ایجاد نمائید. ویرایشگر VS Code رو باز کنید. سپس پوشه js-basics رو از روی دسکتاپ با ماوس بر روی ویرایشگر VS Code بکشید و رها کنید تا پوشه در ویرایشگر باز شود. داخل پوشه یک فایل جدید ایجاد کنید و آن را index.html نامگذاری کنید. برای ایجاد یک فایل جدید می تونید از کلیدهای ترکیبی Ctrl + N استفاده کنید.در داخل فایل index.html که به تازگی ایجاد نمودید کاراکتر ! رو تایپ کرده و بلافاصله کلید Tab را در صفحه کلید فشار دهید. با اینکار، اصطلاحا ساختار اولیه (Boilerplate) یا اسکلت (Skeleton) یک سند html به طور خودکار برای شما ایجاد می شود. هدفمون اینه که ازین فایل به عنوان میزبان (host) کدهای جاوا اسکریپت استفاده کنیم.تکمیل خودکار کدها در ویرایشگرها به لطف افزونه بسیار ارزشمندی به نام Emmet انجام می شود. قبل ترها این افزونه Zen Coding نام داشت. کاریکه این افزونه میکنه اینه که با نوشتن یک سری عبارت های خلاصه و از پیش تعریف شده و سپس زدن دکمه Tab، یک قطعه کد کامل متناظر رو براتون ایجاد می کنه. در ویرایشگر VS Code این افزونه برای کدهای html و css از پیش نصب شده است. این افزونه به شدت بهره وری شما را افزایش خواهد داد.بر روی فایل index.html در تب اکسپلورر کلیک راست کرده و گزینه Open With Live Server را انتخاب کنید. مرورگر پیش فرض شما باز شده و به طور خودکار به آدرس http://127.0.0.1:5500/index.html هدایت خواهد شد. تا اینجای کار یعنی سرویس دهنده وبی که نصب کردیم به درستی کار می کنه و برنامه وب ما رو اجرا می کنه. حالا برای اینکه مطمئن شیم قابلیت live reload اون هم کار میکنه کافیه داخل تگ body صفحه مون یه تگ h1 ایجاد کنیم و یه عبارت دلخواه مثل Hello World داخلش بنویسیم و با زدن Ctrl + S تغییرات رو ذخیره کنیم.&lt;h1&gt;Hello World&lt;/h1&gt;حالا اگه به صفحه وب در مرورگر برگردیم بایستی صفحه به طور خودکار بارگذاری مجدد شده باشه و عبارت Hello World روی صفحه بهمون نمایش داده بشه.در مقاله بعدی دوره آموزش جاوا اسکریپت برای مبتدی ها، به موضوع زیر خواهیم پرداخت :جاوا اسکریپت در مرورگرها</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Sat, 28 Dec 2019 22:26:43 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش جاوا اسکریپت برای مبتدی ها</title>
                <link>https://virgool.io/coderlife/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%A8%D8%AA%D8%AF%DB%8C-%D9%87%D8%A7-hgk7tfuogibi</link>
                <description>سلام، به دوره آموزش جاوا اسکریپت برای مبتدی ها خوش آمدید. من علی طغانی هستم و می خوام طی یک سری مقاله کاربردی و تا حد امکان ساده و روان، جاوا اسکریپت مقدماتی (خصوصا قسمت هایی از زبان جاوا اسکریپت که استفاده از اون ها رایج هستش) رو خدمتتون آموزش بدم. خودم برای انجام این کار خیلی هیجان زده ام، امیدوارم که نتیجه کار شما رو هم هیجان زده کنه.بسیار خوب روده درازی کافیه. برای شروع خیلی ساده و خلاصه وار به چهار تا سوال مهم می پردازیم. این سوال ها کمک می کنن تا شما به یک تصویر کلی (Big Picture) از جاوا اسکریپت دست پیدا کنید.سوال اول : جاوا اسکریپت چیست؟در حال حاضر، جاوا اسکریپت یکی از محبوب ترین و پر استفاده ترین زبان های برنامه نویسی دنیاست که خیلی سریع تر از زبان های برنامه نویسی دیگر در حال رشد و توسعه است. برای اینکه این حرفم رو به صورت مستند بهتون نشون بدم، شما رو به آمار سایت stackoverflow در همین زمینه که مربوط به سال 2019 هستش، ارجاع می دم.محبوب ترین زبان های برنامه نویسی در سال 2019برای مشاهده آمار تفصیلی،بهتره به سایت stackoverflow مراجعه کنید. علاوه بر این آمار، جالبه که بدونید امروزه کمپانی های بزرگی در دنیا مثل Netflix، PayPal، و Walmart تمامی برنامه های خود را با استفاده از زبان برنامه نویسی جاوا اسکریپت توسعه داده اند. شگفتانه تر اینکه طبق آمار ارائه شده در سایت glassdoor.com درآمد سالیانه یک برنامه نویس جاوا اسکریپت در آمریکا چیزی حدود 72 هزار دلار هستش. بنابراین با یادگیری زبان برنامه نویسی جاوا اسکریپت موقعیت های شغلی بسیار خوبی (حتی در ایران) شامل برنامه نویس Front-end، برنامه نویس Back-end، و برنامه نویس Full-stack (که هم Front-end بلد است و هم Back-end) پیش روی شماست.سوال دوم : با جاوا اسکریپت چه کارهایی می توانیم انجام دهیم؟برای مدت ها بود که جاوا اسکریپت فقط در مرورگرها و آن هم برای افزودن قابلیت های تعاملی به صفحات وب (شامل اسلایدر تصاویر، منوها، نمایش تایمر یا شمارنده معکوس، تصاویر متحرک و انیمیشن‌ها، تصاویر گرافیکی دو بعدی و سه بعدی، نقشه‌ها، پخش فایل‌های صوتی و ویدیویی، و خیلی چیزهای دیگه) استفاده می شد. آن روز ها بسیاری از برنامه نویس ها به زبان جاوا اسکریپت به دیده ی یک زبان اسباب بازی نگاه می کردند. اما امروزه با توجه به پشتیبانی جامعه بسیار عظیم توسعه دهندگان جاوا اسکریپت و نیز سرمایه گذاری کمپانی های بزرگی مثل گوگل و فیسبوک، آن روزها سپری شده و شرایط کاملا تغییر کرده است. امروزه شما می توانید با استفاده از جاوا اسکریپت طیف وسیعی از برنامه ها شامل برنامه های موبایل، برنامه های تحت وب، برنامه های بلادرنگ تحت شبکه مثل برنامه های چت و استریم ویدئو، ابزار های خط فرمان و حتی انواع بازی ها را توسعه دهید.کاربردهای جاوا اسکریپت سوال سوم: کدهای جاوا اسکریپت کجا اجرا می شوند؟ابتدا که جاوا اسکریپت به وجود آمد هدف اصلی آن بود که فقط در مرورگرها اجرا شود. به همین خاطر هر مرورگری یک موتور جاوا اسکریپت دارد که می تواند کدهای جاوا اسکریپت را اجرا کند. به عنوان مثال موتور جاوا اسکریپت چندتا از مرورگر های معروف عبارتند از:FireFox: SpiderMonkeyGoogle Chrome: V8Microsoft Edge: Chakraدر سال 2009 میلادی یک مهندس بسیار باهوش به نام رایان دال (Ryan Dahl) با ++C یک برنامه نوشت و موتور جاوا اسکریپت V8 گوگل کروم را (که یک موتور متن باز یا کد منبع باز - Open Source - است) داخل اون قرار داد و امروزه ما آن برنامه بسیار پیشرفته را به نام Node یا Node.js می شناسیم.موتور جاوا اسکریپت با استفاده از Node می توانیم کدهای جاوا اسکریپت را خارج از مرورگر اجرا کنیم. این قابلیت بسیار پیشرفته و مهم بدان معناست که ما می تونیم علاوه بر کد های قسمت Frontend، کدهای قسمت Backend برنامه های موبایل یا تحت وبمون را هم به کمک Node با زبان جاوا اسکریپت توسعه بدیم.نتیجه اینکه، کدهای جاوا اسکریپت می توانند هم در مرورگر و هم خارج از آن، در Node اجرا شوند یعنی هر دوی آن ها محیط اجرا (JS Runtime Environment) جاوا اسکریپت هستند.سوال چهارم: تفاوت بین JavaScript و ECMAScript چیست؟اکما اسکریپت فقط و فقط یک استاندارد است یعنی یک قرارداد حاوی مشخصات فنی است، اما جاوا اسکریپت یک زبان برنامه نویسی است که مطابق با آن استاندارد توسعه داده شده است. استاندارد اکما اسکریپت توسط یک انجمن بین المللی به نام ECMA تهیه می شود. تفاوت اکما اسکریپت و جاوا اسکریپت نخستین نسخه این استاندارد نسخه شماره 1 می باشد که در سال 1997 میلادی منتشر شد. از سال 2015 میلادی به بعد هر سال یک نسخه جدید برای این استاندارد منتشر می شود. به عنوان مثال نسخه منتشر شده در سال 2015 نسخه ES2015 یا ES6 نامیده می شود. آخرین نسخه در دست توسعه این استاندارد هم طبق قرارداد، ES.Next نامیده می شود.نسخه های مختلف ECMAScriptحالا که با دنیای جاوا اسکریپت آشنا شدید و به یک تصویر کلی از اون دست پیدا کردید، می تونیم کد نویسی رو هم شروع کنیم. گفته شد که هر مرورگری یک موتور جاوا اسکریپت دارد پس ما می تونیم داخل خود مرورگر و بدون نیاز به هیچ ابزار دیگری کد جاوا اسکریپت بنویسیم و اجراش کنیم. البته توجه کنید که این فقط برای شروع و نشون دادن نمونه هستش و برای برنامه های واقعی اینطور کد نمی نویسیم.مرورگر گوگل کروم را باز کنید. داخل مرورگر بر روی یک فضای خالی کلیک راست کرده و گزینه Inspect را انتخاب کنید یا از دکمه های میانبر Ctrl + Shift + I (در ویندوز) استفاده نمائید. پنجره Developer Tools برایتان باز می شود. در پنجره باز شده بر روی تب Console کلیک نمائید. اینجا کنسول جاوا اسکریپت است و شما می توانید هر کد معتبر جاوا اسکریپتی را داخل آن بنویسید و اجرا کنید.کنسول جاوا اسکریپت مرورگر گوگل کرومبرای شروع کد زیر را در آن بنویسید:console.log(&#039;Hello World!&#039;);دکمه Enter را فشار دهید. عبارت !Hello World را در خروجی مشاهده خواهید کرد.در این کنسول شما حتی می توانید عملیات ریاضی انجام دهید. مثلا در یک خط جدید بنویسید:2 + 2دکمه Enter را فشار دهید. عدد 4 را در خروجی مشاهده خواهید کرد.به عنوان مثالی دیگر، کد زیر را در یک خط جدید بنویسید:alert&#40;&#039;JavaScript is cool!&#039;&#41;;دکمه Enter را فشار دهید. یک پنجره باز می شود و عبارت !JavaScript is cool را به شما نمایش می دهد.در مقاله بعدی دوره آموزش جاوا اسکریپت برای مبتدی ها، به موضوع زیر خواهیم پرداخت :راه اندازی محیط کد نویسی برای جاوا اسکریپت</description>
                <category>Ali Taghani / علی طغانی</category>
                <author>Ali Taghani / علی طغانی</author>
                <pubDate>Thu, 26 Dec 2019 23:11:26 +0330</pubDate>
            </item>
            </channel>
</rss>