<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمدحسین عباداللهی</title>
        <link>https://virgool.io/feed/@mhe</link>
        <description>CTO at liara.ir</description>
        <language>fa</language>
        <pubDate>2026-06-27 08:43:35</pubDate>
        <image>
            <url>https://static.virgool.io/images/default-avatar.jpg</url>
            <title>محمدحسین عباداللهی</title>
            <link>https://virgool.io/@mhe</link>
        </image>

                    <item>
                <title>کارهای احمقانه‌ای که در ساخت اولین استارت‌آپم انجام دادم</title>
                <link>https://virgool.io/@mhe/%DA%A9%D8%A7%D8%B1%D9%87%D8%A7%DB%8C-%D8%A7%D8%AD%D9%85%D9%82%D8%A7%D9%86%D9%87%D8%A7%DB%8C-%DA%A9%D9%87-%D8%AF%D8%B1-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%A7%D8%B3%D8%AA%D8%A7%D8%B1%D8%AA%D8%A2%D9%BE%D9%85-%D8%A7%D9%86%D8%AC%D8%A7%D9%85-%D8%AF%D8%A7%D8%AF%D9%85-nog6nxvtsd3y</link>
                <description>پرهیز از کارهای احمقانه یه روش قدرتمنده تا بتونی به اهداف‌ات برسی و موفق بشی. لازم نیست که همیشه کارهای بزرگ و چشم‌گیری انجام بدی، همین‌که اشتباهات احمقانه نکنی باعث می‌شه تا مسیر طولانی‌ای رو پیش بری.در این نوشته، درمورد کارهای احمقانه‌ای که هنگام ساختن اولین استارت‌آپم انجام دادم، صحبت می‌کنم.اسم استارت‌آپ ما مارکت‌فاکس بود که من با رویای این‌که قراره آینده‌ی بزرگی رو بسازیم، بهش ملحق شدم.بعد از این‌که Ycombinator که یکی از بهترین شتاب‌دهنده‌های استارت‌آپ‌هاست، روی ما سرمایه‌گذاری کرد، ما این فرصت بهمون داده شد که به سیلیکون‌ولی (Silicon Valley) که آرزوی خیلی‌هاست، نقل مکان کنیم. این یه رویا بود که به حقیقت تبدیل شده‌بود.دو سال بعد، مجبور شدیم که شرکت‌مون رو به‌خاطر چند دلیل تعطیل کنیم - یکی از اون‌ها سودآور نبودن بود.در ادامه، چند مورد از کارهای احمقانه‌ی من زمانی که داشتم اون استارت‌آپ رو می‌ساختم، می‌خونید.مراقب سلامتی خودمون نبودیماجاره‌ها توی منطقه‌ای که دفتر کار ما داخلش قرار داشت، خیلی بالا بود. ما خیلی پول نداشتیم. سرمایه‌مون رو بودجه‌بندی کرده بودیم - هر چند که فکر می‌کنم می‌تونستیم با پولی که داشتیم بعضی چیزهای خاص رو بهتر انجام بدیم.ما روی کف زمین، روی فرش می‌خوابیدیم، تخت نداشتیم. کل چیزی که داشتیم، یک میز و چند صندلی بود.در بیشتر اوقات، ما روی زمین می‌نشستیم و کار می‌کردیم. که هم لازم می‌شد که با سرمای اول صبح دست و پنجه نرم کنیم و هم بازدهی کارمون رو به‌شدت کاهش می‌داد.عکس زیر رو شریک و درواقع کسی که با اون استارت‌آپ رو راه‌انداختیم ازم گرفته - داشتم کد می‌زدم که خوابم برده.کارکردن روزانه بین ۱۵ تا ۱۶ ساعت در روزتوی دنیای استارت‌آپ‌ها، سخت کارکردن خیلی ایده‌آل‌گرایانه نشون‌داده شده. یادم هست که درمورد ساعاتی که در روز کار می‌کردم لاف می‌زدم، انگار که به دست‌آورد بزرگی رسیدم.امیدوارم که منظورم رو اشتباه متوجه نشده باشید - کار مداوم و پایدار برای این‌که موفق بشید بسیار مهمه.اما تعداد ساعت‌هایی که صرف کاری شده، ربط مستقیمی به خروجی‌ای که بدست میاد نداره. بدن ما نیاز به‌استراحت و غذای خوب داره.بعد از مدتی، گذر شب و روز رو نمی‌فهمیدیم. در زمان‌های نامشخصی می‌خوابیدیم، ساعت‌های نامشخصی از خواب بیدار می‌شدیم و کار رو ادامه می‌دادیم.عدم تعادل در گرفتن تصمیم‌هااکثر تصمیم‌ها توسط یک نفر گرفته می‌شد، بدون هم‌فکری سایر اعضای تیم. که خب روش خوبی برای کارکردن نیست.تصمیم‌گیری سریع در استارت‌آپ‌ها بسیار مهمه.اما این نکته هم مهمه که افراد کلیدی و تاثیرگذار هم فرصت ابراز نظرات خودشون رو قبل از گرفتن تصمیم‌ها داشته باشن.درمورد چیزهایی که فکر می‌کنی اشتباه هستن، حرف بزن. اگه تو ارزشی برای نظر و دیدگاه خودت قائل نیستی، از بقیه انتظاری نداشته باش.اجازه نده که بقیه کنترل‌ات کنن. اجازه نده که به‌جای تو تصمیم‌بگیرن.عدم تحرک کافیمدتی طول کشید تا اهمیت سبک زندگی سالم رو درک کنم. هنوز خیلی‌ها تاثیرات ورزش روی سلامت ذهن رو نمی‌دونن.اون روزهای اول، فقط کار می‌کردیم و می‌خوابیدیم. فقط همین. به‌مرور زمان، پیاده‌روی رو هم شروع کردیم.ما همیشه غذاهای ناسالم و فست‌فود می‌خوردیم (که البته خیلی هم ازش پشیمون نیستم، چون خیلی خوش‌مزه بودن) و به‌اندازه‌ی کافی هم ورزش نمی‌کردیم.تا اینجای صحبت‌هام، درمورد اشتباهات شخصی گفتم. اما ما یک‌سری از اشتباهات رایج استارت‌آپ‌ها رو هم انجام دادیم که در ادامه می‌گم.با مشتری‌هامون صحبت نمی‌کردیمما با سرعت خیلی بالایی امکانات جدیدی رو به محصول‌مون اضافه می‌کردیم. اما هیچ‌وقت با تعداد کافی‌ای از مشتری‌هامون صحبت نمی‌کردیم که آیا اضافه‌کردن این امکانات ضروری‌بودن یا نه. ما با فرضیات خودمون محصول رو می‌ساختیم - بعد از چند ماه، محصولی داشتیم که از لحاظ مهندسی و برنامه‌نویسی باورنکردنی بود، اما کسی ازش استفاده نمی‌کرد.بیش از حد مشغول ساختن محصول و عدم تمرکز روی فروش اونمن هنوزم که به‌گذشته نگاه می‌کنم، سرعتی که داشتیم باهاش امکانات جدید رو به‌محصول اضافه می‌کردیم، برام قابل احترام و جذابه. اما این چیزا مهم نیست وقتی که نتونی محصول رو بفروشی.ما روی فروش محصول، خیلی کم تمرکز کردیم که این اشتباه بزرگی بود.ما خیلی تازه‌کار بودیم که فکر می‌کردیم ساختن نرم‌افزار سخت‌ترین قسمت ساختن یه استارت‌آپه.کپی‌کردن از رقباهمه‌ی شرکت‌ها این کار رو می‌کنن. مثلا قابلیت استوری‌گذاشتن رو Snapchat معرفی کرد اما الان تو اکثر شبکه‌های اجتماعی وجود داره.اما وقتی که امکانات محصول‌ات رو از رقبا کپی می‌کنی، باید حواست باشه که کاربرای تو هم اون رو می‌خوان یا نه. اینستاگرام با موفقیت استوری‌گذاشتن رو کپی‌کرد، اما وقتی Medium هم همین‌کار رو کرد، نتیجه‌ی خوبی نگرفت.کپی‌کردن از رقبا، تو رو تا هم‌رده‌ی اون‌ها شدن پیش می‌بره. در حالی‌که تو باید چیزهای بهتر از اون‌ها بسازی تا مردم رو قانع‌کنی که به‌جای رقبا، از محصول تو استفاده کنن.تا زمانی که محصول تو فوق‌العاده نباشه، مردم به‌خودشون زحمت جابه‌جایی رو نمی‌دن.نداشتن دید کافیهمیشه خوبه که وقتی سرمایه می‌گیریم، برای شرکت‌مون و آینده‌اش دید کافی داشته باشیم.ما چشم‌بسته فقط امکانات جدیدی رو می‌ساختیم و اضافه می‌کردیم، بدون این‌که دیدی داشته باشیم.سوال ساده‌ای که باید از خودمون بپرسیم اینه: کاربرای هدف تو کیا هستن؟ اونا با استفاده از محصول تو چه چیزی رو می‌خوان بدست بیارن؟ما کلی امکانات توی محصول‌مون داشتیم، شاید امکاناتی که ۵ تا محصول مختلف ممکن بود جداگونه بسازن‌شون. ولی این امکانات رو حتی یه‌کاربر هم نمی‌خواست.صحبت‌های پایانیبعضی وقت‌ها برنده می‌شی، بعضی وقت‌ها هم یاد می‌گیری. این استارت‌آپ، تجربه‌ای بود که زندگی من رو به‌سمت مثبتی تغییر داد. خوش‌حالم که انجامش دادم. خوش‌حالم که تلاشم رو کردم و شکست خوردم.خیلی چیزها یاد گرفتم. درمورد آدم‌ها، اعتماد و استارت‌آپ‌ها.دوتا دوست فوق‌العاده هم پیدا کردم...... و کلی خاطره.من تونستم استارت‌آپ دومم رو با تمام چیزهایی که توی این مسیر یاد گرفتم، بسازم.این نوشته، ترجمه‌ای روان از مقاله‌ی زیر بود:Stupid things I did while building my first startup</description>
                <category>محمدحسین عباداللهی</category>
                <author>محمدحسین عباداللهی</author>
                <pubDate>Fri, 06 Nov 2020 14:47:21 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش اجرا کردن لاراول در هاست یا سرور</title>
                <link>https://virgool.io/liara-ir/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%AC%D8%B1%D8%A7-%DA%A9%D8%B1%D8%AF%D9%86-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%AF%D8%B1-%D9%87%D8%A7%D8%B3%D8%AA-%DB%8C%D8%A7-%D8%B3%D8%B1%D9%88%D8%B1-r40qxgypwhuc</link>
                <description>توسعه‌دهنده‌ی لاراول باشی و دسترسی به artisan نداشته باشی! مگر می‌شود؟ و یا باید کلی منتظر آپلودشدن پوشه‌ی vendor باشی! آخر مگر این پوشه را هم آپلود می‌کنند؟ این پوشه را داخل gitignore قرار داده‌اند که چه؟ که یک‌وقت آپلودش نکنیم!هاست‌های اشتراکی فعلی چندان جواب‌گوی نیازهای برنامه‌نویس‌ها و توسعه‌دهندگان امروزی نیستند. کافیست ترکیب‌های «هاست لاراول» و یا «هاست اشتراکی» را در گوگل جستجو کنید. سرویس‌های بسیاری را مشاهده خواهید کرد که از فرایند خرید سرویس، منظورم همان WHMCS معروف است، تا اجرای پروژه به واسطه‌ی cPanel، کاملا مشابه یکدیگر هستند و هیچ‌کدام ارزش‌افزوده‌ی دیگری را ارائه نمی‌کنند. حتی اگر دقت کنید، از لحاظ قیمتی هم تفاوت چندانی ندارند. تنها ترکیب‌های مختلفی از پلن‌ها را ارائه می‌کنند.این را هم می‌دانیم که هاست‌های cPanel امروزی، مناسب تکنولوژی‌هایی که استفاده می‌کنیم، نیستند. ما از Git استفاده می‌کنیم، از NodeJS برای FrontEnd کمک می‌گیریم و از فریم‌ورک Laravel برای BackEnd قدرت می‌گیریم. دستورات php artisan را اجرا می‌کنیم و از composer برای نصب پکیج‌های‌مان و جلوگیری از کدهای تکراری بهره می‌گیریم.اما در نهایت، وقتی که توسعه‌ی پروژه به نقطه‌ی مطلوبی رسیده باشد و به دنبال قراردادن پروژه‌ی‌تان روی یک سرویس هاست لاراول باشید، ناامید خواهد شد. چرا که عملا این هاستینگ‌ها به صورت اختصاصی برای لاراول طراحی نشده‌اند و شما باید ابزارهایی که در بند قبل گفته شد را کنار بگذارید و به شیوه‌ی سنتی پروژه‌ی‌تان را روی هاست آپلود کنید. حتی گاها لازم است که تغییراتی را هم در فایل‌های اصلی خود لاراول ایجاد کنید تا بتواند در این سرویس‌ها اجرا شود و همیشه باید مواظب باشید که این تغییرات را اشتباها از بین نبرید.اجرای لاراول در هاست اشتراکی کار ساده‌ای نیست.اگر خودم VPS و سرور تهیه کنم، چه؟حتما قبلا با لینوکس کار کردید. می‌دانید چطور باید SSH بزنید. می‌دانید که چه توزیعی از لینوکس را انتخاب کنید. تفاوت‌های بین CentOS و Ubuntu را می‌دانید. کار با Firewall را یاد گرفته‌اید و می‌دانید که چطور دسترسی‌ها را مدیریت کنید. می‌دانید که چطور منابع مصرفی سرورتان را مانیتور کنید. اگر مشکلی پیش بیاید، می‌دانید که چطور باید رفع کنید. می‌دانید که چگونه Apache یا Nginx را نصب کنید و چگونه PHP و اکستنشن‌های آن را روی سرور کامپایل و نصب کنید. می‌دانید که چگونه پروژه‌ی لاراول‌تان را به سرور منتقل کنید و می‌دانید که چگونه برای Apache باید Virtual Host بسازید.اجرای لاراول در سرور و یا VPS هم کار ساده‌ای نیست.نه نمی‌دانم! وقت کافی هم ندارم!در بند قبلی فقط بخشی از دانستی‌ها را گفتیم. دانشی که قبل از تهیه‌ی VPS و سرور خودتان نیاز دارید. پس خرید VPS برای لاراول هم چندان گزینه‌ی ایده‌آلی به نظر نمی‌رسد. سخت، وقت‌گیر و در نهایت طاقت‌فرساست.چه کنیم؟ در نهایت، هاست مناسب لاراول هم داریم؟خبر خوب این است که بله. سرویس ابری لیارا، هاستینگی با تمرکز روی لاراول و تکنولوژی‌های مدرن است. در این هاست ابری، خبری از cPanel نیست و شما با روش‌هایی کاملا مدرن پروژه‌ی‌تان را روی سرور قرار داده و مدیریت می‌کنید.سرویس ابری لیاراسرویس ابری لیارا یک استارت‌آپ ایرانی است که سرویس‌های ابری مختلفی را ارائه می‌کند. نه تنها می‌توانید پروژه‌های لاراول‌تان را با یک دستور روی سرورهای ابری لیارا اجرا کنید، بلکه امکان اجرای پروژه‌های NodeJS و React و Vue و... هم هست.در سرویس ابری لیارا ثبت نام کنید و ۵۰۰۰ تومان اعتبار هدیه دریافت کنید. و این یعنی می‌توانید از هاست لاراول، دیتابیس‌های MySQL و یا MongoDB و سایر خدمات سرویس ابری لیارا برای چند روز به رایگان استفاده کنید.این هاست لاراول، به شما قابلیتی شبیه به دسترسی SSH ارائه می‌کند که می‌توانید از آن برای اجرای دستورات artisan و یا composer استفاده کنید.بعد از ثبت نام، یک پروژه با نام دلخواه‌تان بسازید. هر نامی که انتخاب کنید، پروژه‌ی‌تان با آن نام در دسترس خواهد بود. برای مثال، اگر نام my-project را انتخاب کنید، سرویس ابری لیارا آدرس my-project.liara.run را به شما اختصاص خواهد داد. دامنه‌ی شخصی و دلخواه خودتان را هم هر زمان که نیاز داشتید، می‌توانید به رایگان اضافه کنید.خبر خوب این است که زیردامنه‌ی liara.run به صورت پیش‌فرض HTTPS است. حتی اگر دامنه‌ی دلخواه خودتان را نیز اضافه کنید، با یک کلیک و به صورت کاملا رایگان، گواهی HTTPS رایگان دریافت می‌کنید.برای این که بتوانید از قابلیت هاست Laravel سرویس ابری لیارا استفاده کنید، لازم است که Liara CLI را از طریق npm نصب کنید:npm i -g @liara/cliو حالا دستور زیر را برای ورود به حساب کاربری‌ای که در سرویس ابری لیارا ساختید، وارد کنید:liara loginدر نهایت وارد پوشه‌ی پروژه‌ی‌تان شوید و دستور دیپلوی را وارد کنید:liara deployتوضیحات بیشتر درباره‌ی این فرایند را می‌توانید در مستندات سرویس ابری لیارا مطالعه کنید.از لینک زیر وارد سرویس ابری لیارا شوید و با دریافت ۵۰۰۰ تومان اعتبار هدیه، این سرویس را امتحان کنید: https://liara.ir/ جمع‌بندیدر این نوشته، از ایرادات هاست‌های اشتراکی PHP و لاراول گفتیم. این که چرا نباید cPanel به عنوان هاست لاراول استفاده کنیم و سرویس ابری لیارا را به عنوان جایگزینی مدرن معرفی کردیم.نظر شما چیست؟ شما از چه روشی برای استقرار پروژه‌های‌تان روی هاست یا سرور استفاده می‌کنید؟ آیا سرویس ابری لیارا را می‌شناختید؟ از آن استفاده می‌کنید؟</description>
                <category>محمدحسین عباداللهی</category>
                <author>محمدحسین عباداللهی</author>
                <pubDate>Sun, 15 Sep 2019 14:57:06 +0430</pubDate>
            </item>
                    <item>
                <title>آمار بازدید مطالب من در سال ۹۷</title>
                <link>https://virgool.io/@mhe/%D8%A2%D9%85%D8%A7%D8%B1-%D8%A8%D8%A7%D8%B2%D8%AF%DB%8C%D8%AF-%D9%85%D8%B7%D8%A7%D9%84%D8%A8-%D9%85%D9%86-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-%DB%B9%DB%B7-j2z9ipegd6hc</link>
                <description>من در سال گذشته، در مجموع ۳ مقاله در ویرگول منتشر کردم. در طول این سال مقالات من ۵۴ مرتبه لایک شدند و ۱۴ نظر نیز بر روی آن‌ها ارسال شد. با مطالعه این مقالات، ۶۰ نفر تصمیم گرفتند تا من را در ویرگول دنبال کنند تا از مقالات بعدی من باخبر شوند.مخاطبیندر طول این سال، مقالات من توسط ۱,۹۷۴ نفر در ویرگول مطالعه شده است. مدت زمانی که این افراد در حال مطالعه‌ی آن‌ها بوده‌اند برابر با ۱۳۰,۸۵۱ ثانیه است. اگر فرض کنیم در حال حاضر جمعیت ایران ۸۰ میلیون نفر است، این یعنی من توانسته‌ام سرانه مطالعه کشورم ایران را ۰/۰۰۱۶۳۶ ثانیه افزایش دهم. شاید بتوانیم این عدد را به «اثر پروانه‌ای» تشبیه کنیم؛ چرا که هر کدام از نویسندگان در ویرگول توانسته‌ایم عددی کوچک را به سرانه مطالعه کشور اضافه کنیم اما مجموعِ تک تکِ این اعداد، یک عدد بزرگ شده است. من در کنار سایر کاربرانِ ویرگول توانستیم در سال ۹۷، سرانه مطالعه ایران را ۴/۱۲۲۳۴۳ ثانیه افزایش دهیم.می‌توانیم برای سال ۹۸، اتفاقات بزرگتری را رقم بزنیم.ویدیوی آمار مخاطبین من را ببینید: https://cdn.virgool.io/annual-report-97/ucqsjjaetk3z-ngWZ.mp4 </description>
                <category>محمدحسین عباداللهی</category>
                <author>محمدحسین عباداللهی</author>
                <pubDate>Fri, 29 Mar 2019 13:15:55 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش ساخت پیام‌رسان با Socket.io و Vue از صفر تا صد</title>
                <link>https://virgool.io/liara-ir/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B3%D8%A7%D8%AE%D8%AA-%D9%BE%DB%8C%D8%A7%D9%85%D8%B1%D8%B3%D8%A7%D9%86-%D8%A8%D8%A7-socketio-%D9%88-vue-%D8%A7%D8%B2-%D8%B5%D9%81%D8%B1-%D8%AA%D8%A7-%D8%B5%D8%AF-rnjgkwfknyh9</link>
                <description>با استفاده از ویژگی‌های رویدادگرای NodeJS می‌توان سرویس‌های مختلفی از جمله پیام‌رسان‌ها را پیاده‌سازی کرد. در این نوشته، با استفاده از کتاب‌خانه‌ی Socket.io، قابلیت آنی و لحظه‌ای بودن پیام‌ها را پیاده می‌کنیم. برای سمت کاربری، از فریم‌ورک جذاب VueJS استفاده می‌کنیم. این فریم‌ورک، کتاب‌خانه‌ای به نام ElementUI دارد که از آن برای ظاهر پروژه استفاده می‌کنیم. در نهایت، پروژه را روی سرور مستقر می‌کنیم تا بتوانیم آن را به اشتراک بگذاریم و استفاده کنیم.خروجی نهایی پروژهشروع به کاریک پوشه با نام دلخواه‌تان بسازید. من نام پوشه‌ام را fara-chat قرار می‌دهم. دستور زیر را در این پوشه وارد کنید تا فایل package.json ایجاد شود:npm init -yدر ادامه، پکیج Express را نصب می‌کنیم که بتوانیم فایل‌های استاتیک مثل HTML و CSS را برای کاربران‌مان سرو کنیم و نمایش دهیم:npm install expressبعد از اتمام دستور بالا، یک فایل package-lock.json هم باید برای‌تان ساخته شده‌باشد. این فایل جزئیات پکیج‌هایی که نصب می‌کنیم را در خودش ذخیره می‌کند و کاری به کارش نخواهیم داشت. ضمن این‌که اگر فایل package.json را مشاهده کنید، یک فیلد با نام dependencies در آن وجود دارد که نشان می‌دهد کتاب‌خانه‌ی Express نصب شده‌است.یک فایل با نام server.js ایجاد کنید و کدهای زیر را داخل آن قرار دهید:const express = require(&#039;express&#039;);

const app = express();

const server = app.listen(3000, function () {
 console.log(&#039;Server is listening on http://localhost:3000&#039;);
});در کد بالا، در ابتدا ماژول express را فراخوانی کرده و یک app ایجاد کرده‌ایم که به پورت 3000 گوش می‌دهد. این یعنی این‌که با اجرای این برنامه، باید بتوانید وارد http://localhost:3000 شده و خروجی آن را ببینید. برای اجرای این برنامه، دستور زیر را در خط فرمان وارد کنید:node server.jsهمان‌طور که مشاهده می‌کنید، پیام Server is listening on http://localhost:3000 روی خط فرمان چاپ می‌شود و نشان از صحت عملکرد کد بالا دارد.برای این که اصولی‌تر کار کنیم، فایل package.json را باز کرده و در قسمت scripts یه فیلد دیگر با نام start ایجاد کنید و مقدار آن را برابر node server.js قرار دهید. در نهایت، فایل package.json شما باید شبیه این شده باشد:{
 &amp;quotname&amp;quot: &amp;quotfara-chat&amp;quot,
 &amp;quotversion&amp;quot: &amp;quot1.0.0&amp;quot,
 &amp;quotdescription&amp;quot: &amp;quot&amp;quot,
 &amp;quotmain&amp;quot: &amp;quotserver.js&amp;quot,
 &amp;quotscripts&amp;quot: {
 &amp;quotstart&amp;quot: &amp;quotnode server.js&amp;quot,
 &amp;quottest&amp;quot: &amp;quotecho \&amp;quotError: no test specified\&amp;quot &amp;&amp; exit 1&amp;quot
  },
 &amp;quotkeywords&amp;quot: [],
 &amp;quotauthor&amp;quot: &amp;quot&amp;quot,
 &amp;quotlicense&amp;quot: &amp;quotISC&amp;quot,
 &amp;quotdependencies&amp;quot: {
 &amp;quotexpress&amp;quot: &amp;quot^4.16.4&amp;quot
  }
}از این پس، می‌توانیم با استفاده از دستور npm start پروژه را اجرا کنیم.نمایش اولین خروجی قابل فهم!خب فکر می‌کنم از این همه دستور و خط فرمان خسته شده‌اید. برویم سراغ خروجی‌های جذاب‌تر و قابل فهم‌تر. اول از همه، باید از Express بخواهیم که فایل‌های HTML و CSS و JS ما را که مرتبط با سمت کاربری هستند را سرو کرده و نمایش دهد. برای این کار، فقط کافیست دو خط دیگر به فایل server.js اضافه کنیم:const staticPath = __dirname + &#039;/static&#039;;
app.use(express.static(staticPath));در خط اول، مسیر فایل‌های استاتیک‌مان را مشخص کرده‌ایم، که در اینجا به پوشه‌ی static اشاره می‌کند. پس همین الان یک پوشه با نام static ایجاد کنید. در خط دوم، یک middleware که خود ماژول express در اختیارمان قرار داده را با استفاده از متد use مورد استفاده قرار دادیم. در نهایت،‌ فایل server.js شما باید شبیه این شده باشد:const express = require(&#039;express&#039;);

const app = express();

const staticPath = __dirname + &#039;/static&#039;;
app.use(express.static(staticPath));

const server = app.listen(3000, function () {
 console.log(&#039;Server is listening on http://localhost:3000&#039;);
});و حالا برای این که مطمئن شویم همه چیز به درستی کار می‌کند، یک فایل با نام index.html ایجاد کرده و داخل آن، کد HTML زیر را اضافه کنید:&lt;html&gt;
&lt;head&gt;
  &lt;meta charset=&amp;quotUTF-8&amp;quot&gt;
  &lt;title&gt;Chat App&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h1&gt;Hello from our Chat app :)&lt;/h1&gt;
&lt;/body&gt;
&lt;/html&gt;و در نهایت، برای دیدن خروجی، آدرس http://localhost:3000 را در مرورگرتان باز کنید. توجه داشته باشید که قبل از آن، باید دستور npm start قبلی را متوقف کرده و دوباره npm start بزنید.نوبتی هم که باشه، نوبت Socket.io هستو حالا برویم سراغ جذاب‌ترین قسمت این پروژه. با دستور زیر، پکیج socket.io را نصب کنید:npm install socket.ioو برای راه‌اندازی سرور سوکت‌مان، همانی که قرار است ارتباط آنی و لحظه‌ای کاربران را به عهده بگیرد، تکه کد زیر را به انتهای فایل server.js اضافه کنید:const io = require(&#039;socket.io&#039;)(server);همان‌طور که می‌بینید، برای صرفه‌جویی در سرانه‌ی مصرف کد، در یک خط، هم socket.io را وارد پروژه کرده و هم با پاس‌دادن server، آن را راه‌اندازی کرده‌ایم.برویم سراغ رابط کاربریخب، امیدوارم تا به اینجا خسته نشده‌باشید. اگر خسته شده‌اید، یک فنجان چای یا قهوه بنوشید تا بعد از آن برویم سراغ رابط کاربری، VueJS و style ها.برای نصب Vue، فقط کافیست اسکریپت زیر را قبل از بسته‌شدن تگ body به انتهای فایل index.html اضافه کنید:&lt;script src=&amp;quothttps://cdn.jsdelivr.net/npm/vue&amp;quot&gt;و حالا یک فایل با نام app.js داخل پوشه‌ی static ایجاد کنید تا کدهای جاوا اسکریپت رابط کاربری‌مان را داخل آن قرار بدهیم. داخل این فایل، با کد زیر، Vue را راه‌اندازی می‌کنیم:new Vue({
  el: &#039;#chat-app&#039;,
})همان‌طور که مشاهده می‌کنید، به سادگی و فقط با ساختن یک نمونه از شئ Vue، توانستیم آن را راه‌اندازی کنیم. در ادامه پارامترهای بیشتری را ایجاد خواهیم کرد، اما حداقل باید پارامتر el را در ابتدا ایجاد کرده و مقداردهی کنیم. Vue نیاز دارد که بداند کدام بخش صفحه را در اختیار آن قرار می‌دهیم که بتواند آن بخش را در اختیار گرفته و کنترل کند. من در اینجا یک عنصر با شناسه‌ی chat-app را تعریف کرده‌ام. بنابراین، وارد فایل index.html شده و یک div یا این شناسه ایجاد کنید:&lt;div id=&amp;quotchat-app&amp;quot&gt;&lt;/div&gt;برای این که مطمئن شویم که همه چیز به درستی کار می‌کند، پارامتر data را هم به Vue اضافه کنید:new Vue({
  el: &#039;#chat-app&#039;,
    data: {
      message: &#039;Hello World!&#039;
    }
})و حالا برای این که message را داخل صفحه نمایش دهیم، فایل index.html را مانند تکه کد زیر تغییر دهید:&lt;div id=&amp;quotchat-app&amp;quot&gt; {{ message }} &lt;/div&gt;صفحه را رفرش کنید. پیام Hello World را باید مشاهده کنید. اگر همه چیز تا به اینجا خوب پیش رفته، خودتان را تشویق کنید :)یک فایل با نام style.css هم داخل پوشه‌ی static ایجاد کنید که بتوانیم ظاهر صفحه را بهتر کنیم. برای شروع، می‌توانید تکه کد زیر را داخل این فایل قرار دهید:body {
 background-color: #f1f1f1;
 font-family: &amp;quotHelvetica Neue&amp;quot, Helvetica, Arial;
}در نهایت، ساختار پروژه‌ی شما باید مانند تصویر زیر شده باشد:ساختار پروژهاولین پیام را ارسال کنیمبرای این‌که بتوانیم پیام‌مان را نوشته و ارسال کنیم، به یک فیلد متنی و یک دکمه نیاز داریم:&lt;div id=&amp;quotchat-app&amp;quot&gt;
  Enter your message: &lt;input type=&amp;quottext&amp;quot v-model=&amp;quottext&amp;quot /&gt;
  &lt;button @click=&amp;quotsendText()&amp;quot&gt;Send&lt;/button&gt;
&lt;/div&gt;فایل app.js را هم به این صورت تغییر دهید:new Vue({
  el: &#039;#chat-app&#039;,
  data: {
    text: &#039;&#039;
  },
  methods: {
    sendText() {
      alert&#40;this.text&#41;
    }
  }
})بدین ترتیب، با استفاده از خاصیت v-model که روی input قرار دادیم، ارتباط ۲ طرفه‌ای بین ورودی‌های کاربر و دیتای سمت جاوا اسکریپت برقرار کردیم. این قابلیت در Vue با نام Two Way Data Binding معروف است.با کلیک روی دکمه‌ی Send، با یک هشدار باید مواجه شوید که حاوی متنی است که داخل input نوشتید. بنابراین با this.text به متنی که کاربر نوشته، دسترسی داریم.اگر به خاطر داشته باشید، چند پاراگراف بالاتر، سرور socket.io را ایجاد کردیم. اما در سمت کلاینت هم، لازم هست که کتاب‌خانه‌ی socket.io-client را به صفحه اضافه کنیم:&lt;script src=&amp;quothttps://cdnjs.cloudflare.com/ajax/libs/socket.io/2.1.1/socket.io.js&amp;quot&gt;کد بالا را هم قبل از بسته‌شدن تگ body، قرار دهید. حالا می‌توانیم با استفاده از این کتاب‌خانه، به socket.io در سمت سرور متصل شویم.برای برقراری اتصال، داخل فایل app.js، متد mounted را تعریف کرده و socket.io را راه‌اندازی می‌کنیم:new Vue({
  el: &#039;#chat-app&#039;,
  data: {
    text: &#039;&#039;
  },
  mounted() {
    this.socket = io.href);
  },
  ...با استفاده از متغیر .href، آدرس صفحه‌ی فعلی که برابر http://localhost:3000 است را به کلاینت socket.io می‌دهیم که بتواند به سرور متصل شود. mounted توسط خود Vue بعد از بارگذاری کامل صفحه و راه‌افتادن Vue صدا زده می‌شود.در ادامه، پیامی که کاربر وارد کرده را به سمت سرور با استفاده از متد emit ارسال می‌کنیم:methods: {
  sendText() {
    this.socket.emit(&#039;message&#039;, this.text);
  }
}در سمت سرور، باید پیام را گرفته و به همه‌ی کاربران ارسال کنیم. بنابراین، تکه کد زیر را در انتهای فایل server.js اضافه کنید:io.on(&#039;connection&#039;, function (socket) {
  console.log(&#039;New user connected.&#039;);

  socket.on(&#039;message&#039;, function (data) {
    io.emit(&#039;message&#039;, data);
  });
});در این کد، بعد از این که کاربری connection جدیدی ایجاد کرد، به رویداد message گوش فرا می‌دهیم و اگر پیامی دریافت شد، از سمت سرور، به تمام کاربران، آن پیام را با متد emit ارسال می‌کنیم.بنابراین، باید در سمت کلاینت هم این پیام را گرفته و نمایش دهیم: new Vue({
   el: &#039;#chat-app&#039;,
   data: {
     text: &#039;&#039;,
     messages: []
   },
   mounted() {
     this.socket = io.href);
   
     this.socket.on(&#039;message&#039;, text =&gt; {
       this.messages.push(text);
   });
  },
  methods: {
    sendText() {
      this.socket.emit(&#039;message&#039;, this.text);
    }
  }
})و در فایل index.html:&lt;div id=&amp;quotchat-app&amp;quot&gt;
  &lt;div v-for=&amp;quotmessage in messages&amp;quot&gt;
      {{ message }}
  &lt;/div&gt;
  
  &lt;hr&gt;
  
  Enter your message: &lt;input type=&amp;quottext&amp;quot v-model=&amp;quottext&amp;quot /&gt;
  &lt;button&gt;Send&lt;/button&gt;
&lt;/div&gt;بدین ترتیب، با ارسال هر پیام، سرور پیام را گرفته و به تمام کاربران تحویل می‌دهد. ما هم پیام‌هایی که دریافت می‌کنیم را داخل لیستی به نام messages ریخته و بعد در صفحه نمایش می‌دهیم.چگونه این برنامه را تا به این مرحله، روی سرور مستقر کنیم؟اگر می‌خواهید پروژه‌ی‌تان را روی سرور قرار داده و آن را با کاربران‌تان به اشتراک بگذارید، می‌توانید با استفاده از سرویس ابری لیارا این کار را به راحتی انجام دهید. در ابتدا وارد سایت https://liara.ir شده و ثبت نام کنید. سپس یک پروژه با ساب‌دامنه‌ی دلخواه‌تان ایجاد کنید. پروژه‌ی شما با این ساب‌دامنه در دسترس خواهد بود. مثلا اگر نام پروژه‌ی‌تان را my-chat قرار بدهید، پروژه‌ی شما در آدرس my-chat.liara.run در دسترس خواهد بود. این امکان هم وجود دارد که از دامنه‌ی اصلی خودتان استفاده کنید.بعد از ایجاد پروژه، با استفاده از دستور زیر، Liara CLI را روی کامپیوترتان نصب کنید:npm install -g @liara/cliبعد از نصب CLI، دستور زیر را وارد کنید تا وارد حساب کاربری‌تان شوید:liara loginو حالا کافیست که دستور زیر را در پوشه‌ی پروژه‌ی‌تان وارد کنید:liara deployو تمام! عملیات استقرار آغاز خواهد شد. ابتدا از شما نام پروژه‌ای که در داشبورد سرویس ابری لیارا ایجاد کردید را خواهد پرسید. سپس پورتی که پروژه در آن در حال اجرا است، پرسیده می‌شود. در این پروژه ما پورت را روی 3000 قرار دادیم. سرویس ابری لیارا به صورت خودکار تشخیص خواهد داد که پروژه‌ی شما با NodeJS نوشته شده‌است و آن را در بستر مناسبی قرار داده و دستور npm start را وارد می‌کند تا پروژه‌ی‌تان اجرا شود.اگر در ویندوز هستید، از نرم‌افزار Git Bash برای وارد کردن دستورات استفاده کنید. بهتر و مطمئن‌تر از CMD ویندوز است. این نرم‌افزار با نصب‌کردن Git روی کامپیوترتان، همراه با آن نصب می‌شود.در نهایت، پروژه‌ی شما در سرویس ابری لیارا مستقر شده و در دسترس خواهد بود. من هم پروژه‌ام را روی آدرس fara-chat.liara.run مستقر کردم. http://liara.ir حرف آخربستر NodeJS این امکان را برای‌مان فراهم می‌کند که بتوانیم به راحتی برنامه‌های آنی بنویسیم. Vue هم آن‌قدر ساده‌است که  خیلی سریع می‌توانیم کارهای پیچیده را با آن انجام دهیم. در قسمت دوم این مقاله، این پروژه را کامل‌تر کرده و مانند نمونه‌ای که تصویر آن در اول مقاله قرار داده شده، این پروژه را تکمیل می‌کنیم. اگر قابلیت خاصی مدنظرتان است، در بخش نظرات مطرح کنید تا در قسمت‌های بعد به آن‌ها هم بپردازیم.سورس این پروژه، به صورت متن‌باز در Github قرار گرفته‌است:https://github.com/mhemrg/socketio-vue-chat</description>
                <category>محمدحسین عباداللهی</category>
                <author>محمدحسین عباداللهی</author>
                <pubDate>Wed, 28 Nov 2018 21:43:47 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه در سال ۱۳۹۷ یک برنامه‌نویس Front End عالی باشیم؟</title>
                <link>https://virgool.io/JavaScript8/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-%DB%B1%DB%B3%DB%B9%DB%B7-%DB%8C%DA%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%D9%86%D9%88%DB%8C%D8%B3-front-end-%D8%B9%D8%A7%D9%84%DB%8C-%D8%A8%D8%A7%D8%B4%DB%8C%D9%85-achtyvci1qn5</link>
                <description>اگر نگاهی به وب‌سایت‌های کاریابی آنلاین مثل جابینجا داشته باشید، خیلی زود متوجه می‌شوید که انبوهی از شرکت‌ها به دنبال برنامه‌نویس Front End هستند. از آن‌جایی که امروزه رابط کاربری وب‌سایت‌ها و وب‌اپلیکیشن‌ها بسیار جذاب‌تر از گذشته شده و این جذابیت لایه‌هایی از پیچیدگی را به این حرفه اضافه کرده‌است، نیاز به نیروهای متخصص در این زمینه بیشتر از گذشته حس می‌شود.و اما چگونه می‌توان یک برنامه‌نویس Front End قدرتمند شد؟ برنامه‌نویسی که بتواند با یک حقوق خوب از شغل خود لذت ببرد و با چیزهایی که می‌سازد،‌ دنیا را جای بهتری برای زندگی کند.۱) با HTML شروع کنید.هر ساختمانی نیاز به یک بدنه دارد. اول از همه این زبان را به خوبی یاد بگیرید. سعی کنید دست کم ۵ صفحه با HTML ایجاد کنید. به ساختار و چیدمان تگ‌های‌تان توجه کنید. Semantic Tags را بشناسید و نحوه‌ی استفاده از آن‌ها را یاد بگیرید. نگران ظاهر صفحه‌ی‌تان نباشید، فقط روی استفاده‌ی درست از تگ‌ها تمرکز کنید.۲) و حالا CSS را شروع کنید.ساختمان شما نیاز به یک ظاهر زیبا دارد. CSS را خوب مطالعه کنید. بدانید که CSS Box Model چیست. درمورد Flexbox و CSS Grid مطالعه کنید. می‌دانید فرق padding با margin چیست؟سعی کنید صفحات‌تان جذاب باشند. در این زمینه Animations و Transitions را مطالعه کنید.کاربران موبایل و تبلت را فراموش نکنید. CSS Media Queries به شما کمک می‌کنند که صفحات خود را برای دستگاه‌های مختلف بهینه کنید.با دانشی که کسب کردید، ۵ صفحه‌ای که در مرحله‌ی قبل ایجاد کردید را زیباتر کنید.۳) پایه‌های جاوا اسکریپت را یاد بگیرید.وب‌اپلیکیشن شما باید بتواند با کاربران تعامل کند و به رفتار آن‌ها پاسخ مناسب دهد. اگر کاربری رو دکمه‌ای کلیک کرد، چه اتفاقی باید بیافتد؟ اگر داخل یک فیلد متنی نوشت، چه؟برای این گونه موارد، لازم است که پایه‌های جاوا اسکریپت را خوب یاد بگیرید. جاوا اسکریپت به صفحات شما جان می‌بخشد.می‌دانید که DOM چیست؟ یاد بگیرید که چطور با استفاده از DOM می‌توانید عناصر داخل صفحه را تغییر دهید. مفاهیمی مانند Hoisting و Event Bubbling و Prototype را یاد بگیرید.مفاهیم دیگری مانند Scope و Context هم هستند که دانستن آن‌ها، کمک شایانی به شما می‌کند.باید بدانید که XHR چیست و چگونه با آن می‌توان یک درخواست Ajax ایجاد کرد. درمورد XML و JSON مطالعه کنید و تفاوت‌های آن‌ها را بدانید.درمورد ES6 و نسخه‌های جدیدتر آن مانند ES7 و ES8 مطالعه کنید. دانستن ES6 شما را یک برنامه‌نویس Front End متمایز می‌کند.یاد بگیرید که چگونه می‌توانید برنامه‌های جاوا اسکریپتی‌تان را به تکه‌های کوچک‌تر و قابل استفاده‌ی مجدد تبدیل کنید. به عبارت دیگر، Writing modular JavaScript را گوگل کنید.۴) چند وب‌سایت ایجاد کنید، آن‌ها را ریسپانسیو کنید و کمی هم با جاوا اسکریپت آن‌ها را پویا و زنده کنید.برای این کار، می‌توانید وب‌سایت‌هایی که روزانه به آن‌ها سر می‌زنید و به آن‌ها علاقه‌مند هستید را یک‌بار دیگر خودتان ایجاد کنید. می‌توانید سایت Dribbble را ببینید، یکی از طرح‌ها را انتخاب کرده و آن را پیاده‌سازی کنید.۵) شما آماده‌ی استخدام شدن هستید.در این مرحله، با توجه به دانشی که کسب کرده‌اید به راحتی می‌توانید پروژه‌های تجاری بگیرید و آن‌ها را انجام بدهید. با اولین درآمدتان، لطفا من را به صرف یک لیوان شکلات داغ دعوت کنید :)ما در باسلام هم به دنبال نیروهای Front End هستیم. اگر مایلید که همراه با تیم باسلام، نقشی در حل مشکلات اقتصادی کشور داشته باشید، بسیار استقبال می‌کنیم.۶) برای کار تیمی، لازم است که Git را یاد بگیرید.برای یاد گرفتن Git نگران نباشید. به جرأت می‌توانم بگویم که ساده‌تر از تمامی مواردی است که تا به این مرحله یاد گرفتید. چند ساعتی را برای مباحث پایه‌ای گیت، مانند نحوه‌ی commit کردن، نحوه‌ی ایجاد پروژه در Github و نحوه‌ی push و pull کردن صرف کنید. مابقی را می‌توانید سر فرصت و هر زمان که نیاز داشتید یاد بگیرید.۷) با NodeJS آشنا شوید و به آن محبت کنید.برای یک برنامه‌نویس Front End خوب، NodeJS یک دوست بسیار گران‌بها و ارزشمند است. کمی برای آن وقت بگذارید. اما نه برای این که پروژه‌های Back End بزنید، بلکه بتوانید از قدرت آن برای انجام کارهای مختلف‌تان استفاده کنید.۸) تا کی می‌خواهید همه چیز را خودتان بسازید؟ با استفاده از NPM از کدهای دیگران استفاده کنید.ابزاری مانند NPM به شما کمک می‌کند که ماژول‌ها و کتابخانه‌هایی که برنامه‌نویس‌های دیگر به زبان جاوا اسکریپت نوشته‌اند را به پروژه‌ی‌تان اضافه کرده و از آن‌ها استفاده کنید. با این کار، سرعت‌تان در انجام پروژه‌ها بسیار بالاتر می‌رود و جلوی اختراع دوباره‌ی چرخ را می‌گیرید.بعد از یادگیری NPM، به صورت خودکار Yarn را هم می‌آموزید.ادامه دارد...</description>
                <category>محمدحسین عباداللهی</category>
                <author>محمدحسین عباداللهی</author>
                <pubDate>Sat, 27 Oct 2018 22:00:37 +0330</pubDate>
            </item>
                    <item>
                <title>آیا واقعا عمر Redux به سر رسیده است؟</title>
                <link>https://virgool.io/iran-react-community/react-new-context-api-and-redux-bbomomhhyvlo</link>
                <description>چند روزیست که در جامعه‌ی توسعه‌دهندگاه React، درمورد قابلیت‌های جدید نسخه‌ی 16.3 این کتاب‌خانه، صحبت می‌کنند. لباس جدیدی که Context بر تن خود کرده، از قابلیت‌هایی است که حسابی جلب توجه کرده است. اگر مایل هستید درمورد تمام اتفاقاتی که قرار است در این نسخه بیافتد، مطلع شوید، این مقاله را مطالعه کنید.مقالات و بازخوردهای مختلفی درباره‌ی API جدیدی که برای Context طراحی شده، منتشر شده‌است. یکی از مباحثی که در این مقالات و بازخوردها به آن اشاره شده، جایگزین کردن ریداکس (Redux) با Context بوده‌است. سوالی که می‌خواهیم در این نوشته به پاسخ آن برسیم، این است که آیا واقعا عمر ریداکس به سر رسیده است؟مرغ اول وجود داشت یا تخم مرغ؟ممکن است فکر کنید که قابلیت Context، قابلیتی است که به تازگی قرار است به React اضافه شود. اما این‌گونه نیست. شاید بتوان گفت که از همان اول با React همراه بوده. اما چیزی که در نسخه‌ی 16.3 مطرح شده، شکل جدیدی از این قابلیت است. با API جدیدی که React برای کار با Context در اختیارمان قرار می‌دهد، استفاده از این قابلیت بسیار ساده‌تر شده و مشکلات خاصی هم که قبلا وجود داشت، حل خواهند شد. پس می‌توان گفت که: زمانی که ریداکس معرفی شد، قابلیت Context در React وجود داشت. پس چرا در آن زمان، کسی مستقیما از Context استفاده نمی‌کرد؟چرا باید از Context استفاده کنیم؟اگر به برنامه‌ای که با React نوشته شده نگاهی بیاندازیم، خیلی راحت می‌شود جریانی که داده‌ها طی می‌کنند را مشاهده و دنبال کرد. وقتی کامپوننتی را بررسی کنید، می‌توانید ببینید که چه داده‌هایی از طریق prop به آن پاس داده شده است.اما آیا تا به حال شما هم بابت منتقل کردن یک prop به چندین لایه پایین‌تر اذیت شده‌اید؟ زمانی که یک prop را مجبوریم از بین کامپوننت‌های میانی انتقال دهیم تا به آن کامپوننتی که آن را لازم دارد، برسد؟کامپوننت بنفشی که در پایین قرار دارد، نیاز دارد color و size را از کامپوننت قرمز رنگی که در اول درخت وجود دارد، بگیرد. کامپوننت‌های میانی مجبورند این prop ها را منتقل کنند، با این‌که خودشان به آن‌ها نیازی ندارند!در این زمان، کتاب‌خانه‌های مدیریت‌کننده‌ی وضعیت برنامه (State Managers)، مثل ریداکس به چشم می‌آیند. با استفاده از ریداکس، در هر نقطه‌ای از برنامه، می‌توانیم یک کامپوننت را به store وصل یا همان connect کنیم تا بتواند داده‌های مورد نیازش را از آن بخواند. برای این‌کار، فقط باید کل برنامه را، داخل کامپوننتی به نام Provider قرار دهیم. بیشتر شبیه جادوست.گراف سمت راست، از ریداکس استفاده می‌کند. ببینید که چگونه همه‌ی کامپوننت‌ها، از store در حال خواندن وضعیت خودشان هستند. کامپوننت بنفش رنگ، قصد ایجاد تغییر در store را دارد.اما جادویی در کار نیست!لازم است که بدانیم ریداکس با استفاده از Context این کار را می‌کند. کل state برنامه را داخل Context قرار می‌دهد و Context همان چیزیست که می‌توان از آن برای انتقال غیر مستقیمِ داده‌ها و توابع استفاده کرد.تا به امروز، استفاده کردن از Context در برنامه‌ها نهی شده‌است. اگر نگاهی به مستندات React بیاندازید، متوجه می‌شوید که توسعه‌دهندگانِ محترمِ React سه بارِ متوالی هشدار می‌دهند که از این قابلیت به‌صورت مستقیم در برنامه‌ی‌تان استفاده نکنید. چون این قابلیت آزمایشی است و ممکن است در آینده تغییر کند. ضمنا باعث پیچیدگی‌هایی هم خواهد شد و نوشتن unit test را هم سخت‌تر می‌کند.این سر و صدایی که این روزها بابت تغییراتی که در Context رخ داده، به‌پا شده است، بیشتر برای شکل جدید و جذابی است که به خود گرفته:React new context APIبا استفاده از این شکل و شمایل جدید و همچنین پایدار شدن آن، دیگر خبری از هشدارهای React نخواهد بود و می‌توان از آن با خیالت راحت استفاده کرد. در چنین شرایطی، می‌توانیم امیدوار باشیم که لازم نیست بابت مشکلِ انتقال prop ها به لایه‌های پایین‌تر، از ریداکس و سایر State Manager ها استفاده کنیم. بدین ترتیب، بسیاری از پروژه‌ها، خیلی‌زود درگیر Redux نخواهند شد و شاید فقط آن زمانی که به ویژگی‌های خاص آن نیاز داشته باشند، سراغ آن بروند.و این یعنی خداحافظ Redux؟نه! این قابلیت جدید، به هیچ عنوان قرار نیست که جای Redux را بگیرد.مشکلی که ریداکس قصد حل کردن آن را داشت، دلپذیرتر کردن Flux بود. مشکلی هم که Flux قصد حل کردن آن را داشت، Predictable State Flow یا همان «جریان قابل پیش‌بینی وضعیت برنامه» است. که این باعث بهبود فرآیند دیباگ کردن وضعیت برنامه می‌شود و می‌توان به‌راحتی تغییراتی که در وضعیت برنامه رخ می‌دهد را دنبال کرد.اگر برای‌تان مهم است که بدانید چه زمانی، قسمت خاصی از state تغییر کرد و آن تغییر از کجا آمد؟ چه چیزی باعث آن شد؟ می‌توانید از ریداکس بهترین نتیجه را بگیرید. ریداکس برای فراهم کردن چنین امکانی، با شما قراردادی می‌بندد:وضعیت برنامه (application state) را در قالب object و array های ساده تعریف کنید.تغییراتی که باید در state رخ دهد را با استفاده از object های ساده تعریف کنید. (actions)منطقی که باید به تغییرات در state رسیدگی کند را با pure function ها تعریف کنید. (reducers)رعایت هیچ کدام از این قوانین و محدودیت‌ها برای ساختن یک برنامه ضروری نیستند، چه با React و چه بدون آن. در واقع این‌ها قوانین و محدودیت‌های سخت‌گیرانه‌ای هستند و قبل از رعایت آن‌ها، باید فکر کنید که آیا برنامه‌ی شما نیازی به آن‌ها دارد یا نه.آیا دلایلی دارید که این قوانین سرسختانه را در برنامه‌ی‌تان اعمال کنید؟این محدودیت‌ها، زمانی جذاب می‌شوند که بخواهید چنین چیزهایی را انجام دهید:وضعیت برنامه (state) را داخل Local Storage ذخیره کنید تا وقتی دوباره وارد صفحه می‌شوید، از همان نقطه بتوانید ادامه دهید. یعنی با refresh کردن، چیزی از دست نرود.وضعیت برنامه (state) را در سرور تعیین کنید، آن را به کلاینت داخل HTML بفرستید و سپس از همان نقطه کاربر بتواند با برنامه کار کند (Server Rendering).تمام عمل‌هایی که کاربر انجام می‌دهد یا به عبارتی تمام action هایی که ایجاد می‌کند را به همراه یک نسخه از وضعیت برنامه (state) را می‌توانید در کنار هم قرار داده و در جایی ذخیره کنید. در این صورت، توسعه‌دهندگان محصول می‌توانند دقیقا همان action ها را اجرا کنند تا ببیند کاربر چه مراحلی را طی کرده و به مشکل برخورده است تا بهتر بتوانند خطاها را رفع کنند.قابلیت Undo کردن را به کاربر بدهید. وقتی کاربر عملی را انجام داد، بتواند به وضعیت قبلی برگردد.در هنگام توسعه، می‌توانید بین action ها جابه‌جا شوید، به آینده بروید یا به گذشته برگردید. به نظر می‌رسد سفر در زمان با Redux به واقعیت تبدیل شده‌است.در هر حال، زمانی به سراغ Redux بروید که دیگر متد setState جواب‌گو نیست. ریداکس فرآیند توسعه‌ی برنامه‌ی‌تان را بسیار تحت تاثیر قرار خواهد داد، بنابراین در انتخاب این چارچوب برای پروژه‌تان، احتیاط کنید.اگر برای انجام دادن چیزهای مختلف به روشی که Redux پیشنهاد می‌دهد، دچار فشار و سختی می‌شوید، احتمالا شما یا هم‌تیمی‌های‌تان، آن‌را بسیار جدی گرفته‌اید. Redux فقط یک ابزار است، مثل سایر ابزارهای‌تان.حرفِ آخرشکل و شمایل تازه‌ای که Context به خود گرفته، باعث از بین رفتن Redux نخواهد شد. در واقع می‌توانیم امیدوار باشیم که از ریداکس در جای مناسبِ خود استفاده خواهد شد و لازم نخواهد بود که توسعه‌دهندگان برای مشکل انتقال prop ها به لایه‌های پایین‌تر، از آن استفاده کنند. ریداکس قوانینی تعریف کرده تا بتواند مشکلات خاصی را که در بعضی برنامه‌ها وجود دارد را حل کند. برای حل این مشکلات، خودِ ریداکس هم از Context استفاده می‌کند. به نوعی، یک لایه‌ی جدید روی Context است که یک‌سری قابلیت‌های جدید را به شما می‌دهد.هر ابزاری قابلیت‌های خاص خودش را دارد و اگر بدون منطق و فقط از روی معروفیت و شهرتی که آن ابزار دارد بخواهیم از آن استفاده کنیم، ممکن است هم خودمان را اذیت کنیم و هم پروژه‌ی‌مان را درگیر پیچیدگی‌های بی‌مورد کنیم.منابعReact’s ⚛️ new Context APIReplacing Redux with the new React context APIContextYou Might Not Need ReduxApplication State Management</description>
                <category>محمدحسین عباداللهی</category>
                <author>محمدحسین عباداللهی</author>
                <pubDate>Thu, 22 Mar 2018 11:49:29 +0430</pubDate>
            </item>
                    <item>
                <title>روزی که دیگر console.log کافی نیست.</title>
                <link>https://virgool.io/@mhe/node-js-console-log-jzgrldh4lgn4</link>
                <description>معمولا برای یادگیریِ لاگ گرفتن یا همان Logging زمان زیادی صرف نمی‌کنیم. چون یک console.log نوشتن، آن‌قدرها هم سخت نیست. شاید اگر بخواهید جاوا اسکریپت یاد بگیرید، اولین چیزی که از این زبان عجیب ببینید، یک لاگ ساده باشد:console.log(&#039;Hello World!&#039;);اما حقیقت این است که وقتی اپلیکیشن‌تان بزرگ و بزرگ‌تر می‌شود، این console.log ساده و جذاب تبدیل به ابزاری ناکارآمد می‌شود که لازم می‌شود فکری به حالش کنیم.از بین بردن باگ‌ها با console.logفرض کنید تابعی نوشتید که درست کار نمی‌کند یا همان به قول اهل فن، باگ دارد. شاید اولین قدمی که برای حل مشکل یا همان دیباگ کردن این تابع برداریم، لاگ گرفتن از تک‌تک ورودی‌ها و خروجی این تابع است. شاید آن وسط‌ها هم لاگ‌های دیگری قرار دهیم تا بهتر متوجه شویم که برنامه‌ی‌مان چگونه پیش‌روی می‌کند و یا باز به قول اهل فن، flow برنامه را مشاهده کنیم.خب، لاگ‌ها را نوشتیم. تا به این‌جا همه چیز خوب است، باگ را هم یافتیم و همه چیز به خیر و خوشی تمام شد. حالا با این همه عبارت console.log چه کنیم؟ اضافه و دست و پا گیر هستند. پاک‌شان می‌کنیم و می‌رویم سراغ قابلیت یا حتی باگ بعدی. برای حل این باگ، نیاز است که دوباره با flow برنامه آشنا شویم و ببینیم که بدنه‌ی if اجرا می‌شود یا else؟ آن تابعی که پیش از این دیباگش کردیم، چه خروجی می‌دهد؟ ۵ یا ۱۵؟ در این حالت، مجبوریم دوباره چند console.log بنویسیم. شاید همان‌هایی که چند لحظه‌ی پیش پاک‌شان کردیم.حالا فرض کنید اپلیکیشن را نوشتیم و قرار است روی سرور مستقر کنیم تا کاربرهای‌مان از این اَپ فوق‌العاده استفاده کنند. چگونه مطمئن می‌شویم همه چیز درست کار می‌کند؟ همه‌ی سرویس‌ها اجرا شده‌اند و برنامه‌ی ما هم به سرویس‌های مورد نظر با موفقیت وصل شده است؟ از کجا متوجه می‌شویم که چه زمانی خطایی رخ داد؟ در کجا؟ وقتی خطا رخ داد، تابع‌مان چه چیزی را ورودی گرفته بود؟اگر به این پاراگراف رسیدید، فرض می‌کنم Logging برای‌تان مهم است و نمی‌خواهید با صورت سرخ شده‌ی مدیرتان، وقتی که در حال پرس و جو از مشتری هستید که دقیقا چه چیزا را وارد کرد که به خطا خورد، مواجه شدید، در ادامه با من همراه باشید.یکی از دلایلی که لاگ‌های‌مان را پاک می‌کنیم، برای این است که خروجی واضح‌تری داشته باشیم. وقتی تعداد لاگ‌ها زیاد باشد و هر لاگ هم اطلاعات زیادی را در صفحه، نمایش دهد، عملا نمی‌توانیم لاگ مورد نظرمان را به خوبی ببینیم و این همه لاگ، اذیت کننده خواهند بود.استفاده از console.log راه حل خوبی برای لاگ گرفتن نیست. چون تنظیماتی ندارد که بخواهید در شرایط مختلف لاگ را کنترل کنید. یا شاید لازم باشد که لاگ‌ها را به سرویس‌هایی که آن‌ها را ذخیره و دسته‌بندی می‌کنند ارسال کنید. console.log هیچ‌کدام از این قابلیت‌ها را ندارد.وینستون (Winston)، یک ابزار حرفه‌ای برای لاگ گرفتنبا افتخار، معرفی می‌کنم: پکیج Winston، ابزاری حرفه‌ای با قابلیت‌هایی که تمام ضعف‌های console.log را می‌پوشاند. Winston معروف‌ترین پکیج Logging برای Node.js است که به برخی از قابلیت‌هایش اشاره می‌کنم:قابلیت انتقال و یا همان Transport کردن لاگ‌ها به سرویس‌های مختلفقابلیت ایجاد انتقال‌دهنده‌های دلخواهاستریم کردن لاگ‌هاقابلیت گشتن و کوئری‌زدن روی لاگ‌ها برای یافتن لاگ‌های خاصلاگ گرفتن در سطوح مختلف، مانند error، warning و یا infoقابلیت ایجاد سطوح دلخواهنصب و راه‌اندازی Winstonوینستون با دستور زیر نصب می‌شود:npm install winstonحالا فقط کافیست هر جایی که لازم دارید، آن را وارد کنید و لاگ بگیرید: const winston = require(&#039;winston&#039;);
 
 winston.info(&#039;Hello World!&#039;);و شاید هم لازم داشته باشید وینستون را تنظیم کنید که لاگ‌ها را به فایل خاصی انتقال دهد:winston.configure({
    transports: [
        new (winston.transports.File)({ filename: &#039;myLogs.log&#039; }),
    ]
});همان‌طور که می‌بینید، transports در واقع یک آرایه است، یعنی می‌توانید هم‌زمان به مقاصد مختلف لاگ‌ها را هدایت کنید. شاید بخواهید هم‌زمان علاوه بر این‌که لاگ‌ها را داخل فایلی ذخیره می‌کنید، آن‌ها را به سرویس‌های Sentry.io و یا Loggly.com هم هدایت کنید.سطوح مختلف لاگ در Winstonحتما می‌پرسید که وینستون چطور می‌خواهد لاگ‌ها را مدیریت کند؟ وقتی قرار است هیچ لاگی را پاک نکنیم، چون بعدها به درد خواهند خورد.وینستون با استفاده از استانداری که در RFC5424 تعریف شده است، از شما می‌خواهد که لاگ‌ها را در سطوح مختلی قرار دهید. بعدا، می‌توانید بخواهید که کدام سطح را هنگام نمایش لاگ‌ها، نمایش دهد. در واقع، ما از ۶ سطح مختلف صحبت می‌کنیم:سطح Fatal: اپلیکیشن در موقعیت بحرانی قرار گرفته است و قادر به انجام عملیات کنونی نیست. معمولا در چنین شرایطی، برنامه این خطا را در سطح Fatal، لاگ می‌کند و خود را خاموش می‌کند.سطح Error: یک خطای مهم، زمانی که اپلیکیشن در حال انجام عملیاتی بوده، رخ داده است. معمولا بعد از گزارش این خطا، لازم است که کاربر با برنامه بیشتر کار کند تا بتواند مشکل را حل کند. استثناها یا همان Exceptions، معمولا از این دسته هستند، چون تقریبا معنای مشابهی دارند. مثلا وقتی در نظر نگرفته بودیم که ممکن است کاربر در username اش از کاراکترهای غیر مجاز استفاده کند و دیتابیس از این بابت خطایی تولید کند. اگر نمی‌دانید بعد از گذاشتن try/catch، با خطایی که داخل catch دارید باید چه کنید، خیلی راحت می‌توانید در این سطح آن را لاگ کنید و رد شوید.سطح Warning: این نوع لاگ‌ها برای زمانی هستند که خطای رخ داده، چندان تاثیری روی عملیات کنونی نمی‌گذارند و اپلیکیشن در حالت معمول خودش است. معمولا این نوع لاگ‌ها را زمانی بررسی می‌کنیم که برنامه در حالت production مستقر است.سطح Info: این نوع از لاگ‌ها معمولا برای گزارش دادن پیش‌روی اپلیکیشن و وضعیت‌های مختلفی که در آن قرار می‌گیرد استفاده می‌شود. مثلا ممکن است لاگ بگیریم که برنامه با موفقیت به دیتابیس وصل شد، یا مثلا فلان عملیات آغاز شد و یا به پایان رسید. و یا حتی ممکن است لاگ بگیریم که فلان کار، ۱۰ ثانیه طول کشید تا انجام شود.سطح Debug: این نوع لاگ‌ها، برای خطایابی برنامه استفاده می‌شوند که معمولا با توضیحات بیشتری همراه هستند. مثلا ممکن است صدا کردن یک تابع مهم، مقادیر ورودی آن تابع و حتی خروجی‌اش را در این سطح لاگ بگیرید. حتی مقادیر یک‌سری متغیر خاص و مهم را که برای دیباگ کردن لازم می‌شوند را در این سطح لاگ بگیرید.سطح Trace: در این سطح لاگ‌هایی با اطلاعات بسیار زیاد (یا حتی به‌صورت افراطی) را گزارش می‌دهند. لاگ‌هایی در این سطح، قدم به قدم وضعیت برنامه را شرح می‌دهند، حتی کوچک‌ترین اتفاقات، همراه با جزئیات. توجه داشته باشید که وینستون، به‌جای warning از verbose و به جای trace از عبارت silly استفاده می‌کند. هر چند که می‌توانید حتی سطوح خودتان را هم تعریف کنید.با استفاده از وینستون، در شرایط مختلف می‌توانید، یک لاگ در سطح مورد نظرتان ایجاد کنید:winston.error(&#039;An error occurred&#039;);
winston.info(&#039;Connected to database.&#039;);و حالا خیلی راحت، می‌توانید از وینستون بخواهید که لاگ‌های کدام سطح را نمایش دهد:winston.level = &#039;warning&#039;;وقتی یک سطح یا level را تعیین می‌کنید، وینستون سعی می‌کند تمام لاگ‌های آن سطح و بالاتر از آن را نمایش دهد. مثلا در نمونه‌ی بالا، چون سطح را روی warning تنظیم کردیم، تمام لاگ‌های مرتبط با warning و error و fatal نمایش داده خواهند شد.با استفاده از این پکیج و تنظیم کردن آن، کارهای مختلفی می‌توانید انجام دهید. حتی می‌توانید از وینستون بخواهید که لاگ‌ها را در فرمت JSON خروجی دهد و یا برای نمونه، خطاها را به رنگ قرمز نمایش دهد.بخش‌هایی از این نوشته، با ترجمه‌ی Node Logging Basics شکل گرفته است.</description>
                <category>محمدحسین عباداللهی</category>
                <author>محمدحسین عباداللهی</author>
                <pubDate>Sat, 03 Mar 2018 12:44:28 +0330</pubDate>
            </item>
                    <item>
                <title>اگه اذیتت می‌کنه، می‌تونی هدفون بذاری!</title>
                <link>https://virgool.io/@mhe/%D8%A7%DA%AF%D9%87-%D8%A7%D8%B0%DB%8C%D8%AA%D8%AA-%D9%85%DB%8C%E2%80%8C%DA%A9%D9%86%D9%87-%D9%85%DB%8C%E2%80%8C%D8%AA%D9%88%D9%86%DB%8C-%D9%87%D8%AF%D9%81%D9%88%D9%86-%D8%A8%D8%B0%D8%A7%D8%B1%DB%8C-qaixvieg9of3</link>
                <description>با این تفکر که «مرد باید بیرون از خونه کار کنه.» همیشه مشتاق بودم یک کار تمام‌وقتِ حضوری پیدا کنم. وقتی اولین جایی که برای مصاحبه رفتم، قبول شدم انگار تمام دنیا مال من بود. روز اول کاریم رو چندان واضح به خاطر ندارم. چون راستش نه برای من مهم بود و نه برای مدیرانم. مهم این بود که یک همکاری رو آغاز کردیم.از اونجایی که زیاد غر نمی‌زنم و سعی می‌کنم با محیط، خودم رو سازگار کنم، روزهای کاریم رو سپری می‌کردم. شاید هفته‌ی دوم بود که یه سری چیزا باعث شده بود واقعا محیط کاری برام تبدیل به هیولایی بشه که یه کودک فکر می‌کنه قراره تو تاریکی وارد اتاقش بشه و بخورتش. با توهم این که الان قراره وارد گوگل بشم، وارد شرکت شده بودم و وقتی چیزایی که می‌دیدم اون چیزایی نبودن که می‌خواستم، ناامید می‌شدم.شاید اولین لازمه‌ی عملکردِ خوبِ یه تیم برنامه‌نویسی، داشتن تمرکز هست. تمرکزی که وقتی یه شرکت، تیم برنامه‌نویسی رو با تیم‌های دیگه در یک اتاق قرار میده از بین میره. طبق تجربه‌ای که من داشتم حتی وقتی واحد اختصاصی هم در اختیار تیم برنامه‌نویسی قرار می‌گیره، باز هم زمان‌هایی هست که خودِ تیم باعث حواس‌پرتی میشه که فکر می‌کنم شرکت‌ها چاره‌ای هم براش ندارن.عرض می‌کردم خدمتتون. هفته‌ی دوم بابت سر و صدایی که در واحدمون وجود داشت اعتراض کردم. بحث تمرکز رو مطرح کردم و بلافاصله بعد جوابی گرفتم که باعث شد تا آخرین روز کاریم نسبت به امور این‌چنینی خنثی باشم: «اگه اذیتت می‌کنه، می‌تونی هدفون بذاری!». مشکل سر و صدا رو به پیشنهادِ مدیر محترم، با هدفون حل کردم. در حدی که در بعضی از روزهای کاری، از شدت گوش‌درد، از هدفون جدا می‌شدم.البته تو این عکسی که از گوگل گیر آوردم، به نظر نمی‌رسه اونقدرها هم اوضاع وخیم باشه :Dشرکتی که داخلش کار می‌کردم شرکت کوچیکی بود. یعنی من دومین برنامه‌نویسی بودم که رسما استخدام شده بودم. بعد از حدود ۶ ماه، شرکت اونقدر بزرگ شده بود که تعداد برنامه‌نویس‌ها از انگشتان دو دست هم بیشتر شده بود و این امر باعث شد واحدهایی مثل بازاریابی، منابع انسانی، تحقیق و توسعه و... به مجموعه اضافه بشه. در این مرحله، شاهد پیدایش پدیده‌ای به اسم «جلسه» بودیم. جلساتی که وقت و بی‌وقت برگزار می‌شدند و نمی‌شد با کمک اختراع مفید بشر، هدفون، از شرشون خلاص شد.هر چی که می‌گذشت، بیشتر به اوضاع این «کارِ حضوری» مشکوک می‌شدم تا این که اولین تجربه‌ی «دور‌کاریم» رو کسب کردم. عصرها به صورت پاره‌وقت و دورکاری با مجموعه‌ای مشغول همکاری شدم. نمی‌تونم اون میزان از افزایش عملکردم رو در مقایسه با کار تمام‌وقتم، در قالب کلمات توصیف کنم. این اتفاق باعث شد شرایط کاریم رو مدام مورد بازنگری قرار بدم و حتی باعث شد یک ماه بعد از این تجربه، از شغل تمام وقتم استعفا بدم.در تجربه‌ی دورکاری، خبری از جلسات طولانی مدت که طرفین هم نمی‌دونن چرا بحث‌ها کِش پیدا می‌کنن، نبود. خبری از بحث‌های بین همکاران و سرک کشیدن‌های مدیر پروژه نبود. می‌شد توی تاریکی کد زد و شرایط هوا و نور اذیت کننده نبود. از همه مهمتر، نیاز به هدفون نبود و البته می‌شد موسیقی رو با میزان‌صدای مطلوب گوش کرد.همه‌ی این‌ها باعث شد دیدگاهم نسبت به کار حضوری و البته اون نقلی که اول بحثم مطرح کردم، مرد باید بیرون از خونه کار کنه، تغییر کنه. تصمیم گرفتم که حداقل تا وقتی که شرایط شرکت‌ها برای کار حضوری، به این شکل هست، دورکاری کنم. شاید سخت‌ترین بخشِ این تصمیم، اینه که مدیران رو قانع کنم که این بحث منافاتی با «کار تیمی» نداره. هرچند که خودِ این کار تیمی هم توی شرکت‌ها، بحث طولانی‌ای داره.</description>
                <category>محمدحسین عباداللهی</category>
                <author>محمدحسین عباداللهی</author>
                <pubDate>Sat, 28 Oct 2017 00:18:07 +0330</pubDate>
            </item>
            </channel>
</rss>