<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های Dev Stream</title><link>https://virgool.ir/feed/@dev.stream</link><description>جایی برای یادگرفتن و گپ برنامه نویس ها</description><language>fa</language><pubDate>2026-11-11 04:15:53</pubDate><image><url>https://files.virgool.ir/upload/users/205389/avatar/C6qCkM.jpeg</url><title>Dev Stream</title><link>https://virgool.ir/@dev.stream</link></image><item><title>مدیریت ریسک در  پروژه های نرم افزاری</title><link>https://virgool.ir/@dev.stream/مدیریت-ریسک-در-پروژه-های-نرم-افزاری-kf3evxkh8h90</link><description>قبل از هر صحبتی باید بگم که:دنیای مهندسی نرم افزار هم مثل هر کسب و کار دیگه ای پر از خطرات و ریسک های بالقوه هستش!اما به قول استاد ما (دکتر  تنهایی): توی کسب و کار های دیگه، شما نهایتا فرصت کاری پیش روی خودتون رو از دست بدید اما توی دنیای نرم افزار شما نه تنها پروژه رو از دست میدید بلکه اعتبار خودتون یا حتی در موارد خطرناک تر ممکنه به زندان بیوفتید یا چندین برابر هزینه پروژه غرامت پرداخت کنید. پس ریسک های پیش روی یک مدیر پروژه، قطعا ساده نیست!همیشه شرکت هایی که دنبال جاه طلبی هستن با ریسک هایی به مراتب خطرناک تر و پیچیده تر روبرو هستن که باید این ریسک ها رو با کمترین هزینه مدیریت کنن.و خب توی این پست من میخوام در مورد مدیرت ریسک باهاتون گپ بزنم و چیزایی که یاد گرفتم رو بهتون بگم البته با زبان رسمی و حرفای قلمبه سلمبه اما به ساده ترین شکل ممکن...!خوشحال میشم اگه جایی رو غلط غلوط گفتم بهم بگید. (;اگر از مدیران پروژه موفق بپرسیم بهترین توصیه شما برای کسانی که می خواهند کار مدیریت یک پروژه را برعهده بگیرند چیست؟ قطعا می گویند قبل از هر کاری یک  برنامه مدیریت ریسک درست و حسابی داشته باشید!ریسک به چه معناست؟ریسک، پیشامدی احتمالی و مخاطره آمیز است که در صورت وقوع، دارای اثرات مثبت یا منفی بر اهداف کسب و کار و یا پروژه می باشد.  در هر زمان و مکان این مخاطرات محتمل هستند و هیچ محدودیتی یا ملاحظه ای در رخداد آنها وجود ندارد.البته ریسک به طور مطلق همیشه به معنای از دست دادن نیست. در تئوری بازی و سرمایه‌گذاری ریسک تنها یک مقیاس برای ناسازگاری نتایج پیش‌آمده است. بیمه یک مثال کلاسیک از سرمایه‌گذاری است که ریسک تولید می‌کند. خریداران مبلغی را به عنوان ضمانت می‌پردازند تا از آنها در برابر از دست دادن کالایشان محافظت شود یا مثلا ریسک شرکت در لاتاری‌ها و خریدن بلیت‌های بخت‌آزمایی است.مدیریت ریسکمدیریت ریسک فرآیند پیش بینی ، ارزیابی ،  شناسایی، برنامه ریزی و پیمایش خطرات بالقوه و فعال است که می تواند بر پروژه یا  کسب و کار شما تأثیر بگذارد. حال این تاثیر یا مثبت است یا منفی.مدیریت ریسک، از طریق پذیرش، انتقال و یا کاهش عوامل ریسک منفی یا تهدیدات و ارتقای محرک های ریسک مثبت یا فرصت ها انجام می شود. اثربخشی مدیریت ریسک نیز با تحلیل مدیریت این عوامل و کنترل انحراف از برنامه های پیش بینی شده برای مدیریت این فرصت ها و تهدیدات صورت می پذیرد.در واقع ارزیابی مدیریت ریسک همه چیز را بررسی می کند ، از خطرات مالی ، خطرات قانونی ، خطرات ایمنی محصول ، عدم اطمینان اقتصادی ، حوادث یا بلایا و موارد دیگر.توجه داشته باشید که نقطه مقابل مدیریت ریسک، ویرانی است!ویرانی هایی مثل: خرابی کانال پاناما، یا خطای معروف  Y2K یا مثلا خطای ازکار افتادن شبکه AT&amp;T یا خطای بیمارستان St. Mary’s Mercy و...تهدیدهای مدیریت نشده و عدم مدیریت صحیح ریسک های منفی، می توانند منجر به عوامل چالش آفرین دیگری مانند تاخیر، هزینه های اضافی، قصور و نقص در عملکرد محصولات و خدمات کسب و کار و یا پروژه و در بدترین حالت آن نیز باعث از دست رفتن اعتبار یا آسیب های جانی و مالی شود و از طرفی مدیریت صحیح ریسک های مثبت هم مزایای زیادی از جمله صرفا جویی در هزینه و زمان و همچنین عملکرد درست محصول  که در نتیجه سبب افزایش اعتبار شرکت در بازار می شود.نکته مهم در مدیریت ریسک این است که اطمینان حاصل کنید که شما صرفاً از اشتباهات خود درس نمی گیرید بلکه آماده اید که هنگام وقوع مخاطرات به موقع به آنها رسیدگی کنید.بنابراین ، مدیران از برنامه های پروژه ، جدول زمانی و بودجه برای کاهش آنچه ما &#34;ریسک اجرایی&#34; می نامیم استفاده می کنند. این بدان معنی نیست که فعالیت های تعیین شده به درستی انجام می شوند. چرا که، آنها اغلب از دو خطر مهم دیگر غافل می شوند:مورد اول “white space risk”  که ناشی از این واقعیت است که برخی از فعالیت های مورد نیاز از قبل شناسایی نخواهند شد ، و باعث ایجاد شکاف هایی در برنامه پروژه می شود.مورد دوم: “integration risk”  که به این معنی است که فعالیتهای متفاوت در پایان جمع نخواهند شد. بنابراین ، تیم های پروژه می توانند وظایف خود را بی عیب و نقص ، به موقع و با بودجه انجام دهند ، اما با این وجود پروژه کلی هنوز نمی تواند نتایج مورد نظر را ارائه دهد.از جمله خطرات دیگر میتوان موارد زیر را نام برد:استفاده از فناوری پیشرفته و در بعضی موارد، در پروژه های توسعه نرم افزار ، خطرات پیش بینی نشده بسیاری را به دنبال دارد. برای تکمیل یک پروژه پیچیده توسعه نرم افزار در موارد برنامه ریزی شده ، خطر پروژه باید به خوبی درک شده و  در عین حال کاهش یابد. همچنین جنبه های جزئی پروژه های توسعه نرم افزار می تواند تحت تأثیر خطرات قرار گیرد ، که در نهایت می تواند منجر به شکست پروژه شود. به عنوان مثال ، توسعه دهنده ای ممکن است درخواست تعطیلات یا مرخصی استعلاجی کند ، در صورتی که هیچ کس نتواند وظیفه او را بر عهده بگیردکه  در این صورت، موفقیت پروژه را تهدید می کند. یا در حالت دیگر ، برآورد هزینه از ابتدا کاملاً اشتباه بوده است زیرا معماری سیستم برای همگام شدن با بارگذاری صفحه وب مشتری به یک نسخه سخت افزاری اضافی نیاز دارد. علاوه بر این ، خطرات احتمالی دیگر به دلیل عدم وجود سیاست پشتیبان گیری یا سیاست امنیتی می تواند رخ دهد.مناطق اصلی موثر بر ریسکبه طور رسمی ، خطر را می توان به عنوان متغیرهای پروژه توصیف کرد که موفقیت فرآیند را مشخص می کنند. خطر در این مورد ، احتمال متحمل شدن ضرر است که تأثیر آن را بر روی پروژه توصیف می کند ، به عنوان مثال کیفیت پایین نرم افزار ، یوزر فرندلی نبودن، افزایش هزینه ،  مقیاس ناپذیر ، یک راه حل سخت مشکل عمومی که نیاز به بازنویسی نرم افزار اصلی دارد ، تکمیل تأخیر دارد. به همین دلیل مدیریت ریسک باید یک قسمت اساسی در یک پروژه توسعه نرم افزار باشد.برای بیشتر پروژه های توسعه نرم افزار ، ما می توانیم پنج حوزه اصلی تأثیر ریسک را تعریف کنیم:اجتناب از خطر در طول پروژه های توسعهبا استفاده از تکنیک های مختلف ، تغییر الزامات یا برنامه های پروژه می توان از خطرات متعددی به طور کامل جلوگیری کرد. خطر را می توان محدود کرد تا محدوده تأثیر ریسک فقط در قسمت کوچکی از توسعه نرم افزار تأثیر بگذارد یا فقط درصد کمی از مشتریانی را که از محصول استفاده می کنند تحت تأثیر قرار دهد. یک مثال استفاده از به اصطلاح &#34;خط مشی بازگشت&#34; است. این بدان معناست که اگر پس از استقرار مشکلی پیش آمده باشد ، حتی قبل از اینکه مشتری تحت تأثیر خطا قرار گیرد ، انتشار خطرات می تواند لغو شود. این استراتژی می تواند هنگام استفاده از انتشار در خارج از ساعات کاری (به عنوان مثال در شب) اعمال شود. با این وجود ، خطرات زیادی وجود دارد که نمی توان از آنها جلوگیری کرد یا آنها را محدود کرد. در این موارد ، خطر باید کاهش یابد یا کنترل شود. برخی از خطرات در طول یک پروژه را می توان با ایجاد یک اثبات مفهوم (POC) و نمونه های اولیه نرم افزار کاهش داد تا آزمایش کند که چه خطری می تواند بر روی آن قسمت از نرم افزار تأثیر بگذارد و چقدر احتمال دارد در حین تولید تحقق یابد.خطر را می توان در مراحل مختلف چرخه عمر نرم افزار شناسایی و برطرف کرد. با این وجود ، شناسایی خطرات در اسرع وقت و رفع سریع آنها ضروری است زیرا هزینه های مربوطه می تواند بسیار زیاد باشد.مدیریت ریسک نرم افزارروند مدیریت ریسک باید با شناسایی ریسک آغاز شود. هدف از شناسایی ریسک کشف کلیه عواملی است که می توانند منجر به شکست پروژه شوند. عوامل احتمالی ممکن است مربوط به فناوری و زبان نرم افزاری مورد استفاده در پروژه ، فرآیند توسعه نرم افزار (Scrum ، Kanban ، Waterfall ، RURP و غیره) یا عوامل سازمانی باشد. این مناطق باید رصد و ارزیابی شود تا کلیه خطرات احتمالی مورد استفاده قرار گیرد.مرحله دوم فرایند مدیریت ریسک نرم افزار ارزیابی سطح قرار گرفتن در معرض هر ریسک و اولویت بندی آنها بر اساس تاثیری است که بر روی پروژه دارند. به اندازه کافی واضح ، خطر با تأثیر مخرب باید قبل از خطر با تأثیر کم ارزیابی شود.مرحله بعدی کاهش خطر است. کاهش خطر ، تلاشی است برای جلوگیری یا جلوگیری از عواقب تحقق خطر. سه راهکار اصلی برای کاهش خطر وجود دارد:جلوگیری از خطرکاهش خطرانتقال خطربهترین راه برای جلوگیری از خطر، سازماندهی کامل پروژه توسعه نرم افزار است ، که گاهی اوقات غیرممکن است. کاهش ریسک دومین روش بهترین و مربوط به از پیش برنامه ریزی کردن پروژه توسعه نرم افزار است. این امر به کاهش احتمال وقوع ، معرفی انعطاف پذیری نرم افزار ، نظارت بر عملکرد نرم افزار و سایر استراتژی ها کمک می کند. انتقال ریسک را می توان به عنوان یک استراتژی سازماندهی مجدد پروژه توصیف کرد. هدف این است که خطر را به مناطقی هدایت کنیم که آسیب کمتری داشته باشد.آخرین مرحله در روند مدیریت ریسک نتیجه گیری ریسک است. این مرحله بعد از تعریف برنامه کاهش خطر برداشته می شود و در تمام اقدامات مورد نیاز برای جلوگیری از خطر یا اقداماتی که پس از تحقق خطر لازم است ، شامل می شود. اقدامات انجام شده در مرحله نظارت و گزارش باید در برنامه احتمالی تعریف شود. در برنامه احتمالی باید اقداماتی را توصیف کرد که با تحقق یک خطر ، انجام می شود.نتیجه گیری پارامتری از بحثمدیریت ریسک بخشی ضروری از هر پروژه موفق توسعه نرم افزار است.مدیریت ریسک بخشی ضروری از هر پروژه موفق توسعه نرم افزار است.بسیار توصیه می شود که کار را از قبل انجام دهید ، لیست کنید ، دسته بندی کنید و برای هر مشکل احتمالی یک برنامه عملیاتی ایجاد کنید.همچنین باید به خاطر داشته باشید که هیچ وقت هیچ چیز سنگ تمام نمی شود و شرایط ممکن است به سرعت در پروژه نرم افزاری شما تغییر کند. اطمینان حاصل کنید که خطرات را مرتباً ارزیابی مجدد می کنید تا همیشه از تأثیر احتمالی و عواقب آن آگاه باشید.آخرین (نه مهمترین) بخش، برقراری ارتباط آزاد بین اعضای تیم خود و بین شما و پیمانکار خود است.باتشکر از شما (:نوشته شده توسط: علی آخی‍‍‍‍‍‍‍‍‍</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Fri, 30 Jul 2021 04:17:03 +0430</pubDate></item><item><title>آپلود لوگو در ناپ‌کامرس</title><link>https://virgool.ir/@dev.stream/آپلود-لوگو-در-ناپ-کامرس-s9vkaymtr3ak</link><description>لوگو سایت شما معمولاً در هر صفحه سایت در هدر صفحه نمایش داده می‌شود. صرف نظر از اینکه کدام تم را انتخاب می‌کنید و هر چند وقت یکبار آن را تغییر می‌دهید، لوگو شما در اکثر تم‌های nopCommerce عالی به نظر می‌رسد. مراحل بعدی را برای آپلود لوگو جدید در سایت خود دنبال کنید:به پیکربندی --&gt; تنظیمات --&gt; تنظیمات عمومی بروید. پنجره تنظیمات عمومی نمایش داده می‌شود:آپلود لوگو در ناپ‌کامرسدر قسمت Logo، روی دکمه آپلود فایل کلیک کرده و یک فایل تصویری را انتخاب کنید. تصویر انتخاب شده آپلود می‌شود. با کلیک روی دکمه حذف تصویر می‌توانید تصویر آپلود شده را حذف کنید.برای فعال کردن لوگو در سایت، روی دکمه ذخیره در بالا سمت راست کلیک کنید.لوگو شما ثبت و جایگزین می‌شود.ممنون از همراهیتون.نوشته شده توسط: خانم مینو علیمحمدیمنبع</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Sun, 25 Apr 2021 13:36:19 +0430</pubDate></item><item><title>سفارشی کردن تم ناپ‌کامرس</title><link>https://virgool.ir/@dev.stream/سفارشی-کردن-تم-ناپ-کامرس-alsqmq9pnxnn</link><description>این مقاله ما به صورت کلی نحوه سفارشی کردن قسمت‌های مختلف تم ناپ‌کامرس را بررسی می‌کنیم.سفارشی کردن تم ناپ‌کامرسآپلود کردن لوگو فروشگاهبرای آپلود کردن لوگو در فروشگاه ناپ‌کامرس دو روش وجود دارد:روش اول:آپلود کردن از طریق منوی ادمین. توضیحات بیشتر را در این مقاله مطالعه کنید.روش دوم:در پوشه ناپ‌کامرس در این مسیر بروید./Themes/YOUR THEME/Content/images/فایل عکس logo.png را پیدا کنیدفایل لوگو خود را با همین نام با فایل مربوطه جابجا کنید.(اندازه لوگو باید 50*50 باشد)اگر می‌خواهید تغییراتی در stylesheet لوگو ایجاد کنید کد زیر را در فایل styles.css سرچ کنید:.header-logo { &#xA;    margin: 0 0 20px; &#xA;    text-align: center; &#xA;} &#xA;.header-logo a { &#xA;    display: inline-block; &#xA;    max-width: 100%; &#xA;    line-height: 0; /*firefox line-height bug fix*/ &#xA;} &#xA;.header-logo a img { &#xA;    max-width: 100%; &#xA;    opacity: 1; &#xA;}مهم: برای دیدن تغییرات لوگو و css احتمالا باید کش مرورگر خود را پاک کنید (ctrl+f5)تغییر Layout1. اگر قصد تغییر در ساختار Layout ناپ‌کامرس دارید (Root.cshtml_) در فایل styles.css این کدها را سرچ کنید:.master-wrapper-content { &#xA;    position: relative; &#xA;    z-index: 0; &#xA;    width: 90%; &#xA;    margin: 0 auto; &#xA;} &#xA;.master-column-wrapper { &#xA;    position: relative; &#xA;    z-index: 0; &#xA;} &#xA;.master-column-wrapper:after { &#xA;    content: &#34;&#34; &#xA;    display: block; &#xA;    clear: both; &#xA;}2. اگر قصد تغییر در ColumnOne.cshtml_ دارید، این کد را در فایل styles.css سرچ کنید:.center-1 { &#xA;    margin: 0 0 100px; &#xA;}3. اگر قصد تغییر در ColumnTwo.cshtml_ دارید، این کد را در فایل styles.css سرچ کنید:.center-2, .side-2 { &#xA;    margin: 0 0 50px; &#xA;} &#xA;.side-2:after { &#xA;    content: &#34;&#34;  &#xA;   display: block; &#xA;    clear: both; &#xA;}تغییر در منوی هدر (منوی بالا)اگر قصد تغییر در منوی هدر وب‌سایت ناپ‌کامرس خود دارید به آدرس زیر برید:/Views/Shared/Components/TopMenu/Default.cshtmlفایل Default.chtml باز کنید و با توجه به نیازهاتون منوی مورد نظر خود &lt;li&gt; را اضافه یا حذف کنید.تغییر در فوتراگر قصد تغییر در فوتر (لینک‌های فوتر) وب‌سایت ناپ‌کامرس خود دارید به آدرس زیر برید:/Views/Shared/Components/TopMenu/Default.cshtmlفایل Default.chtml باز کنید و با توجه به نیازهاتون منوی مورد نظر خود &lt;li&gt; را اضافه یا حذف کنید.ممنون از همراهیتون.ممنون از همراهیتون.نوشته شده توسط: خانم مینو علیمحمدیقسمت سوممنبع</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Sat, 24 Apr 2021 02:18:15 +0430</pubDate></item><item><title>بررسی Layout/Design (ناپ‌کامرس)</title><link>https://virgool.ir/@dev.stream/بررسی-layoutdesign-ناپ-کامرس-ywr16y3ubdli</link><description>Layoutمفهوم Layout چیست؟ هر توسعه‌دهنده یا طراحی مایل است تمام صفحات وب‌سایت ظاهری ثابت داشته باشد. در گذشته مفهوم &#34;MasterPages&#34; در ASP.NET 2.0 معرفی شد که با حفظ ظاهر و سازگار به وب، آن را به صفحات aspx متصل می‌کرد.همچنین Razor مشابه این کانسپت را با نام &#34;Layout&#34; پشتیبانی می‌کند. به شما این امکان می‌دهد یک قالب مشترک را تعریف کرده و در تمام صفحات وب‌سایت از آن ارث‌بری کنید.در ناپ‌کامرس دو نوع layout وجود دارد:_ColumnsOne.cshtml_ColumnsTwo.cshtmlهر دو Layout از یک Layout دیگری به نام Root.cshtml_ ارث‌بری کرده است. این Root.cshtml_ خود از یک Layout دیگری به نام _Root.Head.cshtml ارث‌بری کرده است.در Root.Head.cshtml_ فایل‌های مورد نیاز پیوست شده است در صورتی که نیاز به اضافه کردن فایل css و js دارید در این فایل باید اضافه کنید. محل همه‌ی فایل‌های Layout در آدرس زیر می‌باشد:[nopCommerce root directory]/Views/Shared/...اگر از سورس کد ناپ‌کامرس استفاده می‌کنید:\Presentation\Nop.Web\Views\Shared\..._Root.cshtml_Root.cshtml_Root.cshtml(با توجه به css کلاس)root-layout-cssحالا دو Layout که از Root.cshtml_ اورراید می‌شود را بررسی می‌کنیم:_ColumnsOne.cshtmlدراین حالت تغییری در Layout نمی‌دهد و ساختارش خیلی شبیه به Root.cshtml_ می‌باشد._ColumnsOne.cshtml_ColumnsTwo.cshtmlدر این حالت ساختار Body دو ستون وجود دارد:_ColumnsTwo.cshtmlممنون از همراهیتوننوشته شده توسط: خانم مینو علیمحمدیقسمت دوممنبع:لینک وب سایت</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Wed, 21 Apr 2021 01:46:13 +0430</pubDate></item><item><title>نحوه ایجاد تم برای ناپ‌کامرس (با استفاده از تم پیش‌فرض)</title><link>https://virgool.ir/@dev.stream/نحوه-ایجاد-تم-برای-ناپ-کامرس-با-استفاده-از-تم-پیش-فرض-xz2nwrwauluk</link><description>در این مقاله چند قسمتی قصد داریم ابتدا روند ایجاد تم را بررسی کنیم و بعد با ساختار کلی دیزاین ناپ‌کامرس آشنا می‌شویم. با من همراه باشید.در این مقاله چند قسمتی قصد داریم ابتدا روند ایجاد تم را بررسی کنیم و بعد با ساختار کلی دیزاین ناپ‌کامرس آشنا می‌شویم. با من همراه باشید.\Nop.Web\Themes\اگر از نسخه وب ناپ‌کامرس استفاده می‌کنید\[Project Root]\Themes\1. تم دیفالت را انتخاب کنید.2. راست کلیک کرده و Copy را انتخاب کنید.3. حالا روی پوشه Theme راست کلیک کرده و Paste را انتخاب کنید.4. نتیجه نهایی چیزی شبیه به عکس زیر می‌باشد.5. اسم پوشه را به هر اسمی که مد نظرتون است تغییر دهید برای مثال MyFirstTheme.6. داخل پوشه تم MyFirstTheme رفته و فایل theme.json را باز کنید.7. به صورت زیر نام تم را تغییر دهید.8. داخل پوشه تم در مسیر&#34;MyFirstTheme&#34; → Content → Imagesتصویر مد مورد نظر خود را اضافه کنید و با توجه به نیازهاتون شروع به تغییر و کاستوم کردن فایل style.css کنید.برای تست تغییرات تم، به قسمت ادمین رفته و تم خود را انتخاب کرده و save کنید.به همین راحتی، بهتون تبریک می‌گم شما اولین تم خودتان را ایجاد کردید.نوشته شده توسط: خانم مینو علیمحمدیقسمت اولمنبع:لینک وب سایت</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Sun, 18 Apr 2021 02:35:47 +0430</pubDate></item><item><title>اضافه کردن منو به قسمت ادمین ناپ کامرس توسط پلاگین</title><link>https://virgool.ir/@dev.stream/اضافه-کردن-منو-به-قسمت-ادمین-ناپ-کامرس-توسط-پلاگین-oqkist9q3jqy</link><description>منوی‌های ناپ کامرس از فایلی به نام sitemap.config ساخته و تنظیم می‌شود.src\Presentation\Nop.Web\Areas\Adminبرای انجام اینکار توسط پلاگین، در فایل cs پلاگین اینترفیس IAdminMenuPlugin برای کلاس پلاگین خود پیاده‌سازی کرده و از کد زیر استفاده کنید.همچنین می‌توانید برای این قسمت از ACL برای مدیریت دسترسی پلاگین استفاده کنید و اینجا قرار دهید.public class CustomPlugin : BasePlugin, IAdminMenuPlugin &#xA; { &#xA;     public Task ManageSiteMapAsync(SiteMapNode rootNode) &#xA;    { &#xA;        var menuItem = new SiteMapNode() &#xA;        { &#xA;            SystemName = &#34;YourCustomSystemName&#34;, &#xA;            Title = &#34;Plugin Title&#34;, &#xA;            ControllerName = &#34;ControllerName&#34;, &#xA;            ActionName = &#34;List&#34;, &#xA;            Visible = true, &#xA;            RouteValues = new RouteValueDictionary() { { &#34;area&#34;, null } },         }; &#xA;        var pluginNode = rootNode.ChildNodes.FirstOrDefault(x =&gt; x.SystemName == &#34;Third party plugins&#34;); &#xA;        if(pluginNode != null) &#xA;            pluginNode.ChildNodes.Add(menuItem); &#xA;        else &#xA;            rootNode.ChildNodes.Add(menuItem); &#xA;        return Task.CompletedTask; &#xA;    } &#xA; }برای ورژن 2.00 تا 3.50 از کد زیر استفاده کنید:public bool Authenticate() &#xA;{ &#xA;    return true; &#xA;} &#xA;public  SiteMapNode BuildMenuItem() // SiteMapNode is Class in Nop.Web.Framework.Menu &#xA;{ &#xA;   var menuItemBuilder = new SiteMapNode() &#xA;   { &#xA;       Title = &#34;Title For Menu item&#34;,   // Title for your Custom Menu Item &#xA;       Url = &#34;Path of action link&#34;, // Path of the action link        Visible = true, &#xA;       RouteValues = new RouteValueDictionary() { {&#34;Area&#34;, &#34;Admin&#34;} } &#xA;   }; &#xA;    var SubMenuItem = new SiteMapNode()   // add child Custom menu &#xA;   { &#xA;       Title =  &#34;Title For Menu Child menu item&#34;, //   Title for your Sub Menu item &#xA;       ControllerName = &#34;Your Controller Name&#34;, // Your controller Name &#xA;       ActionName = &#34;Configure&#34;, // Action Name        Visible = true, &#xA;       RouteValues = new RouteValueDictionary() { {&#34;Area&#34;, &#34;Admin&#34;} }, &#xA;   }; &#xA;   menuItemBuilder.ChildNodes.Add(SubMenuItem); &#xA;   return menuItemBuilder; &#xA;}در کد بالا، باتوجه به کامنت‌ها لازم به جایگزینی مقادیر بسته به نیاز خود دارید. علاوه بر این، کد نحوه ایجاد زیر منو در منوی اصلی که ایجاد می‌کنید را نشان می‌دهد.ممنون از توجهتون.نوشته شده توسط: خانم مینو علیمحمدیمنبع:لینک منبع</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Fri, 16 Apr 2021 16:49:50 +0430</pubDate></item><item><title>چگونه ناپ‌کامرس را با داکر روی لینوکس اجرا کنیم؟</title><link>https://virgool.ir/@dev.stream/چگونه-ناپ-کامرس-را-با-داکر-روی-لینوکس-اجرا-کنیم-h3dzf9h7tbp9</link><description>ناپ‌کامرس یک پلتفرم اپن سورس، که با فناوری ماکروسافت طراحی شده است. ناپ‌کامرس ورژن 4.20 با فریم‌ورک دات‌نت کور می‌باشد و مایل هستیم روی لینوکس اجرا کنیم. راه‌های مختلفی برای این کار وجود دارد ولی راحت‌ترین آن استفاده از داکر می‌باشد. در این مقاله می‌خواهیم یاد بگیریم به چه صورت ناپ‌کامرس را روی لینوکس با استفاده داکر اجرا کنیم؟قبل از اینکه شروع کنیم، در مورد داکر و اجزای آن که قراره در این مقاله ازشون استفاده کنیم آشنا بشیم.Dockerداکر یک پلت‌فرم سبک، اوپن سورس و ایمن می‌باشد. داکر راهی برای ساده‌سازی روند ساخت پروژه، جابجای و اجرای برنامه‌ها در یک محیط متفاوت است. Docker تمام وابستگی‌های یک برنامه را جمع می‌کند و آن را در یک container (ظرف) اجرا می‌کند، در یک جمله ساده، شانس استفاده از MSSQL، بدون نیاز به دانلود، نصب و مدیریت آن را بهمون می‌دهد، کافیست container را با Docker اجرا کرده و از آن استفاده کنید - به همین سادگی.Imageاز یک image برای ساخت یک container استفاده می‌شود، که دارای فایل‌های لازم برای اجرای چیزی روی سیستم عامل، که مانند ویندوز یا اوبونتو است و دارای فریم‌ورک برنامه شما، به همراه فایل‌های پایگاه داده است که از آن پشتیبانی می‌کند. بنابراین، اگر از ASP.NET، NodeJS یا Python استفاده می‌کنید، imageها دارای کد معمول هستند.Containerایمیج‌ (image) ها فقط تعاریفی هستند که به طور مستقیم قابل اجرا نیستند. برای اجرای image ها، ما به containers(ظرف) نیاز داریم. containerها اینستنس‌های هستند که به اجرای image با تنظیمات متفاوت مانند پورت، آدرس IP و غیره کمک می‌کنند.Docker Composeبرای اجرای چندین کانتینر در یک نمونه استفاده می‌شود. Docker Compose یک شبکه با کانتینرهای مختلف ایجاد می‌کند، از طریق این شبکه کانتینرها می‌توانند با یکدیگر ارتباط برقرار کنند. بنابراین، اگر برنامه به کانتینرهای دیگری وابسته باشد، Docker Compose مناسب است.می‌خواهیم برنامه nopCommerce با سرور MS SQL اجرا کنیم، پس از Docker Compose استفاده خواهیم کرد.فرضیاتتمام دستورات موجود در این پست فرض را بر این می گذاریم که:شما در حال اجرا لینوکس هستیدداکر روی سیستم شما نصب استمرحله 1- از دستور Docker بدون Sudo استفاده کنید.اجرای دستور Docker به root privileges و افزودن privilege احتیاج دارد، برای اجرای دستور باید پیشوند &#34;sudo&#34; را اضافه کنیم. برای سهولت کار، نام کاربری خود را به گروه Docker اضافه کنید تا هر زمان از دستور Docker استفاده می‌کنید، نیازی به پاس دادن &#34;sudo&#34; نباشد.$sudo usermod -aG docker ${USER}برای اعمال تغییرات‌، از سیستم خارج شوید و دوباره وارد سیستم شوید.مرحله 2 - نسخه Docker را بررسی کنید.از آنجا که Docker قبلاً روی سیستم نصب شده است، نسخه را با استفاده از دستور زیر بررسی کنید:docker –vنتیجهadminvm@adminvm-VirtualBox:~$ docker -v &#xA;Docker version 18.09.7, build 2d0083dاگر نسخه بدون پیام خطا نمایش دهد، آماده هستید تا مرحله بعدی را انجام دهید.مرحله 3 - Docker Compose را نصب کنید.از آنجا که باید nopCommerce با کانتینر SQL Server ارتباط برقرار کند، باید Docker Compose را روی دستگاه نصب کنیم. به خاطر داشته باشید که Docker Compose باید جداگانه نصب شود. با نصب پیش فرض داکر نصب نمی‌شود.با دستورات زیر نصب کنید:sudo curl -L &#34;https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m)&#34;  -o /usr/local/bin/docker-compose &#xA;sudo mv /usr/local/bin/docker-compose /usr/bin/docker-compose &#xA;sudo chmod +x /usr/bin/docker-composeپس از آن، نسخه Docker Compose را با دستورات زیر بررسی کنید:docker-compose -vنتیجهadminvm@adminvm-VirtualBox:~$ docker-compose -v &#xA;docker-compose version 1.22.0, build f46880feمرحله 4 – فایل &#34;docker-compose.yml&#34;کد nopCommerce 4.20 را بر روی دستگاه خود دانلود کنید و فایل docker-compose.yml را در فایل اصلی باز کنید.مرحله 5 - اجرای Docker Composeدر محل فایل &#34;docker-compose.yml&#34; ترمینال (terminal ) را باز کنید و دستور زیر را بزنید:با این کار ایمیج‌های مورد نیاز دانلود می‌شود، پروژه ساخته می‌شود و کانتینرها استارت می‌خورند. مدتی طول خواهد کشید - آرام بنشینید و آرام باشید!پس از اتمام مراحل، باید صفحه زیر با لاگ‌ها مربوط را مشاهده کنید.مرحله 6 - کانتینرهای در حال اجرا را بررسی کنید.ترمینال دوم را باز کرده و دستور زیر را اجرا کنید. تمام کانتینرها در حال اجرا را لیست می‌کند. باید ببینید که هر دو کانتینر nopCommerce و SQL Server اکنون در حال اجرا هستند.[docker ps]مرحله 7 - فروشگاه nopCommerce را در یک مرورگر اجرا کنید.یک تب در مرورگر باز کنید و لینک زیر را بزنید. صفحه نصب nopCommerce را باز می‌کند.http://localhost:80مرحله 8 - اتصال به دیتابیس.نام کانتینر و رمز عبور پایگاه داده را که در فایل yml تعریف شده است، منتقل کنید.مرحله 9 - وضعیت کانتینر را بررسی کنید.پس از نصب، باید صفحه تنظیم مجدد اتصال را ببینید زیرا عملکرد کانتینر برنامه ما متوقف شده است.دوباره دستور زیر را اجرا کنید تا کانتینرهای در حال اجرا را ببینید. باید ببینید که فقط یک کانتینر MSSQL در حال اجرا است.[docker ps]برای دریافت لیستی از تمام کانتینرها، دستور زیر را اجرا کنید.[docker ps -a]مرحله 10 - دوباره کانتینر وب را بالا ببرید.برای اجرای دوباره کانتینر وب، دستور[docker container start &lt;container-id&gt;]را اجرا کنید. به راحتی می‌توانید سه کاراکتر اول شناسه کانتینر را بدهید.با دستور زیر لیست کانتینرها در حال اجرا را دنبال کنید. باید ببینید اکنون هر دو کانتینر در حال اجرا هستند.‍‍‍مرحله 11 - به پنجره مرورگر بروید و فروشگاه nopCommerce را بررسی کنید.به localhost بروید و Refresh را بزنید. تا صفحه اصلی nopCommerce لود شود.تبریک می‌گویم! شما اولین فروشگاه nopCommerce خود را در Linux اجرا می‌کنید !!ممنون از همه خوانندگان.نوشته شده توسط: خانم مینو علیمحمدیمنبع:لینک منبع</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Wed, 07 Apr 2021 17:55:51 +0430</pubDate></item><item><title>چگونه برای ناپ‌کامرس پلاگین بنویسیم؟</title><link>https://virgool.ir/@dev.stream/چگونه-برای-ناپ-کامرس-پلاگین-بنویسیم-xfkqkylsijym</link><description>ساختن پلاگین برای ناپ‌کامرسپلاگین‌ها برای گسترش عملکرد ناپ‌کامرس ورژن 4.3 استفاده می‌شود، این پلاگین‌ها انواع مختلفی دارند به عنوان مثال روش پرداخت (مثل پی‌پال، درگاه‌های پرداخت بانکی)، سیستم مالیات، روش محاسبه حمل و نقل و دیگر ابزارهای مثل گفتگوی زنده و موارد دیگر. برای ناپ‌کامرس پلاگین‌های مختلفی توزیع شده که می‌توانید آن‌ها را در سایت رسمی آن جستجو کنید تا اگر کسی متناسب با نیاز شما پلاگینی ایجاد کرده از آن استفاده نمایید، اگر نه که این مقاله این روند را توضیح می‌دهد.ساختار پلاگین، فایل‌های مورد نیاز و مکان‌ها1. اولین کاری که باید انجام بدید ایجاد یک کلاس لایبراری در سولوشن است. بهتره که لوکیشن این کلاس لایبراری در پوشه plugins باشد. (نکته: با پوشه Plugins در زیر شاخه Nop.Web\ قاتی نکنید، پابلیش پلاگین‌ها در این پوشه قرار می‌گیرد). قرار دادن همه پلاگین‌ها در پوشه &#34;Plugins&#34; بهترین حالت است. نامگذاری پیشنهادی برای پروژه پلاگین شما به این شکل است:&#34;Nop.Plugin.{Group}.{Name}&#34;{Group}:گروه پلاگین شما رو مشخص می‌کند برای مثال( &#34;Payment&#34; or &#34;Shipping&#34;)یعنی پلاگین شما مربوط به پرداخت یا حمل و نقل و ... . برای مثال پلاگین (PayPalStandard) نام سولوشن آن (Nop.Plugin.Payments.PayPalStandard) است.اما این نکته را توجه داشته باشید که این اجباری نیست و هر نامی که دوست دارید را می‌توانید برای پلاگین خود انتخاب کنید.2. پس از ایجاد پروژه پلاگین، باید فایل csproj. آن را در ویرایشگر متنی باز کرده و محتوای آن را با مورد زیر جایگزین کنید:‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍جای PLUGIN_OUTPUT_DIRECTORY را با نام پلاگین جایگزین شود، به عنوان مثال، Payments.PayPalStandardما از این روش برای اضافه کردن رفرنس‌های دات‌نت کور به پروژه‌مون استفاده می‌کنیم و به این صورت لایبراری‌های که رفرنسش را گذاشتیم در فایل بطور خودکار لود می‌شوند و بسیار راحت است اما این روش اجباری نیست.3. مرحله بعدی ایجاد یک فایل plugin.json مورد نیاز برای پلاگین است. این فایل شامل اطلاعات توصیف کننده پلاگین شما است. فقط کافی است این فایل را از هر پلاگین موجود دیگه کپی کرده و متناسب با نیاز خود اصلاح کنید. برای اطلاعات در مورد فایل plugin.json، لطفاً به فایل plugin.json در پروژه‌های دیگه پلاگین‌ها مراجعه کنید.4. آخرین مرحله ایجاد یک کلاسی است که اینترفیس IPlugin را پیاده‌سازی کند. ناپ‌کامرس یک کلاس BasePlugin دارد که برخی متدهای IPlugin را پیاده‌سازی کرده که از تکرار کد جلوگیری کرده است. ناپ‌کامرس برخی از اینترفیس‌های مشتق شده از IPlugin را در اختیار شما قرار داده است. به عنوان مثال، ما اینترفیس &#34;IPaymentMethod&#34; داریم که برای ایجاد پلاگین‌های پرداخت استفاده می‌شود که شامل برخی از متدهای است که فقط برای پرداخت استفاده می‌شود برای مثال ()ProcessPayment یا ()GetAdditionHandlingFee. در حال حاضر ناپ‌کامرس دارای اینترفیس‌های پلاگین زیر است:&lt;Project Sdk=&#34;Microsoft.NET.Sdk&#34;&gt; &#xA;    &lt;PropertyGroup&gt; &#xA;        &lt;TargetFramework&gt;netcoreapp3.1&lt;/TargetFramework&gt; &#xA;        &lt;Copyright&gt;SOME_COPYRIGHT&lt;/Copyright&gt; &#xA;        &lt;Company&gt;YOUR_COMPANY&lt;/Company&gt; &#xA;        &lt;Authors&gt;SOME_AUTHORS&lt;/Authors&gt; &#xA;        &lt;PackageLicenseUrl&gt;PACKAGE_LICENSE_URL&lt;/PackageLicenseUrl&gt; &#xA;        &lt;PackageProjectUrl&gt;PACKAGE_PROJECT_URL&lt;/PackageProjectUrl&gt; &#xA;        &lt;RepositoryUrl&gt;REPOSITORY_URL&lt;/RepositoryUrl&gt; &#xA;        &lt;RepositoryType&gt;Git&lt;/RepositoryType&gt; &#xA;        &lt;OutputPath&gt;..\..\Presentation\Nop.Web\Plugins\PLUGIN_OUTPUT_DIRECTORY&lt;/OutputPath&gt; &#xA;        &lt;OutDir&gt;$(OutputPath)&lt;/OutDir&gt; &#xA;        &lt;!--Set this parameter to true to get the dlls copied from the NuGet cache to the output of your    project. You need to set this parameter to true if your plugin has a nuget package to ensure that   the dlls copied from the NuGet cache to the output of your project--&gt; &#xA;        &lt;CopyLocalLockFileAssemblies&gt;true&lt;/CopyLocalLockFileAssemblies&gt;     &lt;/PropertyGroup&gt; &#xA;    &lt;ItemGroup&gt; &#xA;        &lt;ProjectReference &#xA;Include=&#34;..\..\Presentation\Nop.Web.Framework\Nop.Web.Framework.csproj&#34; /&gt; &#xA;        &lt;ClearPluginAssemblies Include=&#34;$(MSBuildProjectDirectory)\..\..\Build\ClearPluginAssemblies.proj&#34; /&gt; &#xA;    &lt;/ItemGroup&gt; &#xA;    &lt;!-- This target execute after &#34;Build&#34; target --&gt; &#xA;    &lt;Target Name=&#34;NopTarget&#34; AfterTargets=&#34;Build&#34;&gt; &#xA;        &lt;!-- Delete unnecessary libraries from plugins path --&gt; &#xA;        &lt;MSBuild Projects=&#34;@(ClearPluginAssemblies)&#34; Properties=&#34;PluginPath=$(MSBuildProjectDirectory)\$(OutDir)&#34; Targets=&#34;NopClear&#34; /&gt; &#xA;    &lt;/Target&gt; &#xA;&lt;/Project&gt;IExternalAuthenticationMethodبرای متدهای احراز هویت کاربر مانند Facebook ،Twitter ،OpenID و غیره استفاده می‌شود.IWidgetPluginبه شما امکان می‌دهد ابزار (ویجت) ایجاد کنید. ابزارها در برخی از قسمت‌های سایت شما ارائه می‌شوند. به عنوان مثال، می‌تواند یک بلوک &#34;چت زنده&#34; در ستون سمت چپ سایت شما باشد.IExchangeRateProviderبرای دریافت نرخ ارز استفاده می شود.IDiscountRequirementRuleبه شما امکان می‌دهد قوانین تخفیف جدید خود را ایجاد کنید.IPaymentMethodپلاگین‌هایی که برای پرداخت استفاده می‌شوند.IShippingRateComputationMethodاین پلاگین‌ها برای متدهای پرداخت و نرخ حمل و نقل استفاده می‌شود.ITaxProviderبرای گرفتن نرخ مالیات استفاده می‌شود.IMiscPluginاگر پلاگین شما با هیچ یک از اینترفیس‌های بالا در رابطه نیست از این استفاده کنید.نکته مهم: پس از ساخت پروژه قبل از هر تغییری پروژه را clean کنید. بعضی از رفرنس‌ها کش می‌شود و باعث خطا و دیوانه شدن دولوپر می‌شود!ممکنه بعد از اضافه کردن پروژه پلاگین به سلوشن، نیاز باشه که یکبار rebuild کنید. اگر شما Dll پلاگین خود را در Nop.Web\Plugins\PLUGIN_OUTPUT_DIRECTORY ندیدید لازمه که یکبار دیگه سولوشن را rebuild کنید. اگر dll پلاگین شما در پوشه درست در Nop.Web نباشد ناپ‌کامرس پلاگین را در لیست خودش نمیاره.بررسی requests. Controllers ,models ,viewsاکنون می‌توانید پلاگین را با رفتن به Admin area → Configuration → Local Plugins مشاهده کنید. اما همانطور که حدس زدید پلاگین ما هیچ کاری نمی‌کند. برای تنظیمات آن حتی رابط کاربری وجود ندارد. بیایید یک صفحه برای پیکربندی پلاگین ایجاد کنیم.ایجاد یک مدل: یک فولدر به اسم models در پلاگین خودتون ایجاد کنید و کلاس مربوط به مدلتون تنظیم کنید.ایجاد یک ویو: یک فولدر در پلاگین خود به اسم views ایجاد کنید و فایل chtml به نام Configure.chtml ایجاد نمایید. پراپرتی Build Action روی Content و پراپرتی Copy to Output Directory روی copy always تنظیم کنید. توجه داشته باشید صفحه configuration باید از لی‌اوت (Layout) &#34;ConfigurePlugin_&#34; استفاده کند.مطمئن شوید که فایل ViewImports.cshtml_ در پوشه ویو وجود داشته باشد در صورتی که وجود نداشت از پلاگین‌های دیگه ناپ‌کامرس کپی کنید.ایجاد کنترلر: فولدری به نام controllers در پلاگین خود ایجاد کنید و کنترلر جدید را ایجاد کنید.روش خوب این است که نام گذاری controllerها به این شکل باشد {Group}{Name}Controller.cs . برای مثال PaymentPayPalStandardControllerالبته که اجباری نیست برای این نوع نامگذاری و یک توصیه است.اکشن متد مناسب برای صفحه configuration ایجاد کنید (در area admin). نام متد را configure بزارید. کلاس مدل را برای متد ارسال کنید به ویو با آدرس فیزیکی زیر:~/Plugins/{PluginOutputDirectory}/Views/Configure.cshtmlبرای متد خود از attribute زیر استفاده کنید:[AuthorizeAdmin] //confirms access to the admin panel  [Area(AreaNames.Admin)] //specifies the area containing a controller or actionبرای نمونه پلاگین پرداخت PayPalStandard باز کنید و نحوه پیاده سازی کنترلرهای آن را ببینید.سپس برای هر پلاگین که یک صفحه پیکربندی یا configuration دارد باید url آن را مشخص کنید. کلاس BasePlugin متدی به نام GetConfigurationPageUrl دارد که url آن را برمی‌گرداند.public override string GetConfigurationPageUrl() &#xA;  { &#xA;     return $&#34; {_webHelper.GetStoreLocation()}Admin/{CONTROLLER_NAME}/{ACTION_NAME}&#34; &#xA;  }وقتی که پلاگین نصب می‌شود و متد بالا رو هم اضافه کرده باشید لینک پیکربندی یا configure اضافه می‌شود در زیر Admin → Configuration → Local Pluginsنکته: راحترین کار برای انجام مراحل بالا باز کردن پلاگین‌های دیگه و کپی کردن این فایل‌ها در پروژه خودتون است و بعد از آن نام‌ها را تغییر بدید.برای مثال پلاگین PayPalStandard ساختار پروژه به این شکل است:متدهای Install,Uninstall,Updateاین مرحله اختیاری است. برخی از پلاگین‌ها می‌توانند در هنگام نصب منطق اضافی داشته باشند. به عنوان مثال، یک پلاگین می‌تواند ریسورس جدیدی را وارد کند. بنابراین پیاده‌سازی IPlugin خود را باز کنید (در بیشتر موارد از کلاس BasePlugin مشتق خواهد شد) و متدهای زیر را نادیده بگیرید:Installاین متد در زمان نصب فراخوانی می‌شود. می‌توانید تنظیمات اولیه پلاگین خود را انجام دهید مثلا اضافه کردن ریسورس جدید یا جدول در دیتابیس در صورتی که ضروری است.Uninstallاین متد زمانی که پلاگین را حذف نصب می‌کنید فراخوانی می‌شود مانند بالا اگر منابعی دارید که باید حذف شود می‌توانید اینجا تنظیم کنید.Updateاین متد در زمان آپدیت پلاگین فراخوانی می‌شود (وقتی که نسخه پلاگین در فایل Plugin.json تغییر کرده باشد).نکته مهم: اگر متدهای بالا را تغییر ندادید نباید پیاده‌سازیش را در کلاس حذف کنید. برای مثال در متد install باید ()base.install صدا زده شود. متد install پلاگین PayPalStandard به شکل زیر است:public override void Install() &#xA;{ &#xA;    var settings = new PayPalStandardPaymentSettings() &#xA;    { &#xA;        UseSandbox = true &#xA;    }; &#xA;    _settingService.SaveSetting(settings); &#xA;    ... &#xA;    base.Install(); &#xA;}نکته: لیست پلاگین‌های نصب شده در این آدرس است، این لیست هنگام نصب ایجاد می‌شودRoutesاینجا نگاهی داریم به نحوه ثبت مسیرهای پلاگین. ASP.NET Core Routing مسئول نگاشت درخواست‌ها از مرورگر به اکشن خاص آن می‌باشد.برای اطلاع بیشتر به این اینجا مراجعه کنید.در صورتی نیاز به تنظیم route یک فایل به نام RouteProvider.cs ایجاد کنید. به عنوان مثال، کلاس RouteProvider زیر، یک مسیر جدید اضافه می‌کند که با باز کردن مرورگر وب و رفتن به آن می‌توانید به آن دسترسی پیدا کنید.http://www.yourStore.com/Plugins/PaymentPayPalStandard/PDTHandlerpublic partial class RouteProvider : IRouteProvider &#xA; { &#xA;    public void RegisterRoutes(IEndpointRouteBuilder endpointRouteBuilder) &#xA;    { &#xA;        //PDT  endpointRouteBuilder.MapControllerRoute(&#34;Plugin.Payments.PayPalStandard.PDTHandler&#34;, &#34;Plugins/PaymentPayPalStandard/PDTHandler&#34;,                 new { controller = &#34;PaymentPayPalStandard&#34;, action = &#34;PDTHandler&#34; }); &#xA;    } &#xA;    public int Priority =&gt; -1; &#xA; }آپدیت ناپ‌کامرس ممکن است پلاگین را خراب کندبرخی از پلاگین‌ها ممکن است منسوخ شده و دیگر با نسخه جدید nopCommerce کار نکنند. اگر پس از ارتقا به نسخه جدید با مشکلی روبرو شدید، پلاگین را حذف کرده و به وب سایت رسمی nopCommerce مراجعه کنید تا ببینید نسخه جدیدتری در دسترس است یا خیر. بسیاری از نویسندگان پلاگین‌ها برای جایگزینی نسخه جدیدتر، پلاگین‌های خود را ارتقا می‌دهند، با این حال، برخی از آنها این کار را نمی‌کنند و با پیشرفت nopCommerce، پلاگین آنها منسوخ می‌شود. اما در بیشتر موارد، می‌توانید به سادگی فایل plugin.json را باز کرده و قسمت SupportedVersions را بروز کنید.نتیجه‌گیریامیدوارم این مقاله به شما کمک کرده باشه که کار با ناپ‌کامرس شروع کنید و شما را برای ساخت پلاگین‌های پیچیده‌تر آماده کند.پلاگین تمپلیتبرای پلاگین‌های جدید nopCommerce می‌توانید از Visual Studio Template ما استفاده کنید. این مورد می‌تواند در زمان شما صرفه جویی کند، زیرا اکنون نیازی به انجام دستی تمام مراحل اولیه ندارید. مانند ایجاد پوشه‌ها (کنترلرها ، ویوها ، مدل‌ها و غیره)، سایر فایل‌های مورد نیاز (DependencyRegistrar.cs , _ViewImports.cshtml ، ObjectContex ، plugin.json و غیره)، پیکربندی، ریسورس پروژه و غیره). لطفاً آن را پیدا کنید و دستورالعمل نصب را اینجا پیدا کنید.خیلی ممنون از توجهتون. نظرات و پیشنهادتون رو برام بنویسید.نوشته شده توسط: خانم مینو علیمحمدیمنبع:لینک منبع</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Tue, 06 Apr 2021 15:27:06 +0430</pubDate></item><item><title>چگونه در ناپ کامرس 4.3، در تنظیمات ادمین، تب ایجاد کنیم؟</title><link>https://virgool.ir/@dev.stream/چگونه-در-ناپ-کامرس-43-در-تنظیمات-ادمین-تب-ایجاد-کنیم-yffyvbdzjaho</link><description>در این مقاله، می‌خواهیم با استفاده از پلاگین، در سمت مدیریت ناپ‌کامرس یک تب اضافه کنیم. سریع به قسمت پیاده‌سازی آن می‌پردازیم چون من معتقدم وقتی توسعه‌دهنده ناپ‌کامرس این نوع مقاله‌ها جستجو می‌کند که به دنبال راه‌حلی هستند که بهشون کمک کنه که یاد بگیرند و مشکلشون را خطایابی و حل کنند.پیداکردن WidgetZoneابتدا مشخص کنید که می‌خواهید در کدام صفحه سمت مدیریت برنامه یک تب اضافه کنید، در این مقاله من صفحه ویرایش سفارش را انتخاب کردم. بنابراین اول باید صفحه ویرایش سفارش را در سورس کد پیدا کنیم تا WidgetZone صفحه را بررسی نماییم. در این ویجت زون ویو تب جدید ما (return) برگردانده می‌شود.در این صفحه به آدرس (Presentation\Nop.Web\Areas\Admin\Views\Order\Edit.cshtml)ویجت زون ما (AdminWidgetZones.OrderDetailsBlock) می‌باشد.اضافه کردن ViewComponent و نام WidgetZoneدر اینجا ما از پلاگین موجود NivoSlider استفاده می‌کنیم، البته که می‌تونید پلاگین جدید خود را ایجاد کنید. ابتدا به فایل NivoSliderPlugin.cs موجود در آدرس زیر می رویم!(Plugins\Nop.Plugin.Widgets.NivoSlider\NivoSliderPlugin.cs)اگر افزونه جدید ایجاد کردید مطمئن شوید که پلاگین شما از IWidgetPlugin ارث بری کرده باشد.در متد ()GetWidgetZones، ویجت زون مورد نظرمون را اضافه می‌کنیم./// &lt;summary&gt; &#xA;/// Gets widget zones where this widget should be rendered &#xA;/// &lt;/summary&gt; &#xA;/// &lt;returns&gt;Widget zones&lt;/returns&gt; &#xA;public IList &lt;string&gt; GetWidgetZones() {&#xA;   return new List &lt;string&gt; {&#xA;     PublicWidgetZones.HomepageTop,&#xA;     AdminWidgetZones.OrderDetailsBlock &#xA;     // this we added for custom order&#xA;   };&#xA;}در قدم بعدی، در متد GetWidgetViewComponentName ،ViewComponentname را اضافه می‌کنیم. ما ویو کامپوننتی با نام WidgetAdminOrderDetails اضافه می‌کنیم. هنگامی که صفحه ویرایش سفارش مدیر را مشاهده می‌کنیم، این viewcomponent صدا زده می‌شود. این viewcomponent لیستی از تب‌های که می‌خواهیم بهش اضافه کنیم را برمی‌گرداند./// &lt;summary&gt; &#xA;/// Gets a name of a view component for displaying widget &#xA;/// &lt;/summary&gt; &#xA;/// &lt;param name=&#34;widgetZone&#34;&gt;Name of the widget zone&lt;/param&gt;&#xA;/// &lt;returns&gt;View component name&lt;/returns&gt; &#xA;public string GetWidgetViewComponentName(string widgetZone) {&#xA;   if (widgetZone == AdminWidgetZones.OrderDetailsBlock)&#xA;       return &#34;WidgetsAdminOrderDetails&#34;&#xA;   return &#34;WidgetsNivoSlider&#34;&#xA;}ایجاد فایل ViewComponent و TabList و TabContentویو کامپوننت WidgetsAdminOrderDetailsViewComponent.cs ایجاد می‌کنیم در این آدرسNop.Plugin.Widgets.NivoSlider\Components\WidgetsAdminOrderDetailsViewComponent.csnamespace Nop.Plugin.Widgets.NivoSlider.Components {&#xA;              [ViewComponent(Name = &#34;WidgetsAdminOrderDetails&#34;)]&#xA;              public class WidgetsAdminOrderDetailsViewComponent:&#xA;NopViewComponent {&#xA;                      public WidgetsAdminOrderDetailsViewComponent() {}&#xA;                      public IViewComponentResult Invoke(string widgetZone, object additionalData) {&#xA;                                   return View(&#34;~/Plugins/Widgets.NivoSlider/Views/WidgetsAdminOrderDetails/AdminOrderTabList.cshtml&#34;);&#xA;                      }&#xA;              }&#xA;}&#xA;فایل AdminOrderTabList.cshtml را ایجاد می‌کنیم، در این فایل لیستی از تب‌ها با فایل محتوای آنرا ارائه می‌دهیم.مکان ذخیره فایل در آدرس زیر می‌باشد.(Plugins\Nop.Plugin.Widgets.NivoSlider\Views\WidgetsAdminOrderDetails\AdminOrderTabList.cshtml)همان طور که مشاهده می‌کنید یک پوشه جدید در ویو ایجاد کردیم.@using Nop.Services.Common &#xA;@using Nop.Core  &#xA;@* You can add above 2 namespace in _ViewImport.cshtml. This 2 namespace required for workcontext and generic attribute service.*@ &#xA;@inject IWorkContext workContext  &#xA;@inject IGenericAttributeService genericAttributeService  &#xA;@{&#xA;       const string hideCustomBlockAttributeName = &#34;CustomOrderPage.HideCustomBlock&#34; &#xA;         var hideCustomBlock = genericAttributeService.GetAttribute&lt;bool&gt; (workContext.CurrentCustomer, hideCustomBlockAttributeName);&#xA; }  &#xA;&lt;nop-panel asp-name=&#34;custom-order-tab&#34; asp-icon=&#34;fa fa-th-list&#34;&#xA;      asp-title=&#34;CustomTabTitle&#34; &#xA;      asp-hide-block-attribute-name=&#34;@hideCustomBlockAttributeName&#34; &#xA;      asp-hide=&#34;@hideCustomBlock&#34; asp-advanced=&#34;true&#34;&gt;&#xA;                 @await  Html.PartialAsync(&#34;/Plugins/Widgets.NivoSlider/Views/WidgetsAdminOrderDetails/_CustomTab.Order.cshtml&#34;) &#xA;&lt;/nop-panel&gt;اگر می‌خواهید چندین تب در صفحه ویرایش سفارش ایجاد کنین، این کد را در همان پوشه تکرار کنید و مکان مختلفی را برای محتوای تب (Content cshtml file) ایجاد کنید.(نکته: من این کد را از فایل order/edit.cshtml ناپ‌کامرس کپی کردم)آدرس فایل محتوا تب (Plugins/Widgets.NivoSlider/Views/WidgetsAdminOrderDetails/_CustomTab.Order.cshtml&lt;div class=&#34;panel-body&#34;&gt;&#xA;     &lt;div class=&#34;panel panel-default sub-panel&#34;&gt;&#xA;          &lt;div class=&#34;panel-body&#34;&gt;&#xA;              Custom Body content&#xA;          &lt;/div&gt;&#xA;      &lt;/div&gt;&#xA; &lt;/div&gt;مطمئن شوید هر دو فایل مانند تصویر این تنظیم (کپی شدن فایل در زمان پابلیش)، انجام شده باشد. اگر از VSCode استفاده می‌کنید، به صورت دستی باید این مورد را در فایل plugin.csproject اضافه کنید.(Plugins\Nop.Plugin.Widgets.NivoSlider\Nop.Plugin.Widgets.NivoSlider.csproj)پلاگین را بیلد کنید و به صفحه ویرایش سفارش بروید و طبق تصویر زیر نتیجه را ببینید. تب با نام CustomTabTitle ایجاد شده است.در تصویر زیر فایل‌های که تغییر دادم یا اضافه کردم را می‌توانید مشاهده کنید.در این مقاله در مورد کدها توضیح داده نشده است چون هدف اصلی مقاله نشان دادن مراحل اضافه کردن تب از اول تا اخر بودش.خیلی ممنون از توجهتون. نظرات و پیشنهادتون رو برام بنویسید.نوشته شده توسط: خانم مینو علیمحمدیمنبع : https://dzone.com/articles/how-to-add-tab-on-admin-side-using-the-plugin-in-n </description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Sun, 04 Apr 2021 15:37:53 +0430</pubDate></item><item><title>رژه ی مرگ</title><link>https://virgool.ir/Dev-Stream-Ali-Akhi/رژه-ی-مرگ-pf93kfw2cmbo</link><description>برای ساخت هر سازه نرم افزاری(وب سایت، اپلیکیش و..) ما به سه موجودیت نیاز داریم:-framework-Component-Patternاما مهم ترین بخش از میان این سه موجودیت، Pattern است.اصلا Pattern چیست؟!در حقیقت Pattern یا همان الگو، راه حل های خوب، کارا و مشخصی هستند که قبلا بارها و بارها برای حل مشکلات مشخص به کار رفته اند و استفاده از آنها کاملا موفقیت آمیز بوده.در واقع به کسی مهندس نرم افزار گفته می شود که Pattern های بیشتری بلد باشد. آیا شناخت Pattern ها کافی است؟!پس آنچه شرط است شامل موارد زیر است:۱. باید Pattern های زیادی را بشناسد.۲. ارتباط بین Patternها را بداند.۳. نه تنها Patternها را بشناسد بلکه باید بر antiPatternها نیز واقف باشد.۴. تیم را با Patternهایی که می شناسد جلو ببرد.۵-متدلوژی ها را بشناسد و با آنها کار کرده باشد.اما قصد ما از طرح این مطلب، معرفی یک antiPattern در حوزه مدیریت پروژه است نه صرفا بیان تعاریف مشخص و...اگر بخواهیم تعریفی ساده از antiPattern داشته باشیم:در واقع راه حل یا الگویی است که در ابتدا مشکل را حل کرده ولی در ادامه پس از گذشت مدتی تاثیر عکس داشته و خود باعث بروز مشکلی دیگر شده است!مثلا استفاده از داروهای شیمیایی قوی برای درمان سردرد، ممکن است سردرد شما خوب کند اما پس از استفاده مداوم تاثیر مخربی رو کلیه های شما خواهد داشت و خود سبب دردی شدید تر خواهد شد!پس antiPattern خودش قبلا Pattern بوده، ولی بعد از گذشت مدتی تبدیل به مشکل شده است!رژه مرگ(مدیریت پروژه)شاید برای شما هم پیش آمده باشد، به عنوان عضوی از تیم توسعه، از سوی مدیران پروژه مجبور به افزایش غیر معمول ساعت کار یا انجام کار های خارج از انتظار  و توانایی شوید  درحالی که پروژه رو به شکست است و یا شاید  توسط مدیران ارشد به سخت کار کردن روی پروژه ای که انتهایش شکست است، تشویق شده باشید و یا از این دست اتفاقات که در ایران به وفور دیده می شود.امید همیشه خوب است، اما نه برای کاری که به اشتباه شروع شده و پایان خوشی ندارد!چه بسا تلاش بیشتر روی این چنین پروژه ها پس از مدتی نتیجه عکس به دنبال خواهد داشت به ویژه در پروژه های امنیتی یا پروژه های دولتی ریسک کار به طرز وحشتناکی افزایش خواهد یافت و قطعا شکست در این پروژه ها عواقب مالی و حقوقی سختی به دنبال خواهد داشت.شاید علت این گونه مشکلات، عدم پیش بینی ریسک های پروژه یا مشکل در تحلیل اشتباه یا شناخت ناقص سیستم باشد و یا هر دلیل سطح بالای دیگری می تواند این فاجعه را به بار بیاورد.اما شما به عنوان عضو تیم توسعه چه کاری می توانید انجام دهید؟!در ایران عملا کاری جز اطاعت کردن و گرفتن حقوق بیشتر ندارید و بهترین کار این است که بلافاصله پس از اتمام پروژه محل را ترک کنید و همکاری خود را با مدیران پروژه قطع کنید.و به عنوان تجربه ی تلخ با شرکت های باتجربه تر و قوی تر کار کنید.اما این اتفاق به ویژه برای شرکت های تازه تاسیس امری طبیعی است و این تجربه به عنوان یک antiPattern در حافظه همه باقی خواهد ماند و احتمال تکرار آن کاهش می یابد.اما آنچه در این بین قابل ملاحظه است تلاش های ناامیدانه ی تیم توسعه جهت براورده کردن خواسته های بی جای مدیران است ولی در نهایت این تلاش ها راه به جایی نخواهند برد، گویی طالع پروژه نحس است و باید شکست بخورد چون نتیجه ی یک عملکرد اشتباه است و محصولی که تولید خواهد شد محصولی شکست خورده است.گویی مدیران پروژه، تیم توسعه و را وادار به افتخار آفرینی می کنند، اما زهی خیال باطل،این رژه ای به سمت مرگ است!و در نهایت نه تنهاافتخاری کسب نمی کنند بلکه لکه ننگ پروژه شکست خورده تا ابد بر دامن آنها باقی خواهد ماند و فقط باید نظاره گر این شکست باشند.قسمت دردناک این تراژدی زمانی است که شما به عنوان عضو تیم توسعه نمی توانید اعتراضی داشته باشید و اگر هم اعتراضی کنید به عنوان یک فرد بدبین و ناامید مورد هجمه مدیران یا توسعه دهندگان ارشد قرار خواهید گرفت یا از کار خود برکنار می شوید، پس بهترین کار این است که مثل یک بچه مودب کار خود را انجام دهید و با همراهی گروه به سمت مرگ پروژه در حرکت باشید تا اینکه پروژه به اتمام می رسد.اما این دید شما نسبت به این پروژه ها هم جای بحث دارد.گاها دیده شده افرادی از انجام کار در این پروژه ها لذت می برند و پول های کلانی از کار در این پروژه ها به دست می آورند امابه قول استاد ما:&#34;پروژه ها مث بچه های آدمن تا آخر عمر دنبالت میان&#34; پس پول در این پروژه ها برای افراد حرفه ای چندان مطرح نیست.اما به عنوان یک توسعه دهنده ی حرفه ای چه کارهایی باید انجام داد؟!۱- وظایف خود به عنوان عضوی از تیم به درستی انجام دهید.۲- از انجام کارهای جانبی خود داری کنید.۳- از اضافه کاری خودداری کنید.۴- مشکلات موجود در حیطه کاری خود را به ارشد گزارش دهید.۵- از گرفتن تشویقی های نابجا خود داری کنید(این مورد خود سبب ایجاد توقع در مدیران میشود)اصطلاح &#34;رژه مرگ&#34;نخستین بار توسط توسعه دهندگان و مهندسان نرم افزار ابداع شد و سپس در سایر حرفه ها نیز به کار رفت و رایج شد اما به طور خاص در مدیریت پروژه های نرم افزاری به کار می رود.باتشکر از شما(:نوشته شده توسط: علی آخی</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Mon, 04 Jan 2021 05:33:36 +0330</pubDate></item><item><title>چگونه داکر در scalable کردن microservice ها به ما کمک می کند؟!</title><link>https://virgool.ir/@dev.stream/چگونه-داکر-در-scalable-کردن-microservice-ها-به-ما-کمک-می-کند-znw390gyor4o</link><description>پارت چهارمدر پارت قبلی ما با پدیده ای بنام docker آشنا شدیم و سعی کردیم از یک چیزی بنام Virtual Machines شما را با docker آشنا کنیم که یکسری مزیت ها نسبت به Virtual Machines داشت که چند مورد از آنها را ذکر کردیم.در این بخش ما قصد داریم با docker بیشتر آشنا شویم و آن را از جوانب دیگر هم بررسی کنیم. و در ادامه از خود این سوال اساسی را می پرسیم:آیا با استفاده کردن از داکر،ما دیگر مشکلی با ارائه سرویس ها به مشتری نداریم؟! یا بهتر بگوییم آیا مفهوم scalability آنطور که باید و شاید پیاده سازی شده است؟داکر و کانتینر، که اخیرا در جامعه ی Dev Ops ها به شدت مورد بحث است و با سرعت درحال گسترش و پیشروی است و در مراحل Build و test مورد استفاده اکثریت شرکت ها و گروه های حرفه ای قرار می گیرد. علت این مهاجرت شرکت ها را، اگر بخواهیم به طور خلاصه توضیح دهیم(در پارت قبلی بطور مفصل مطرح شده) دستیابی شرکت ها و اپ ها و... به تحول های مداوم و افزودن فیچرها به برنامه است.اما این microservice با استفاده از داکر چگونه اجرا می شوند؟!در واقع microservice ها در محیطی بنام Container اجرا می شوند. کانتینرها محیط هایی مستقل، ایزوله و مشخص هستند که از IMAGE ساخته می شود. برای درک بهتر این موضوع فرض کنید: Docker Image نقشه ی ساختمان باشد، آنگاه Docker Container آن زمین و پی است که برای آن نقشه و ساختمان در نظر گرفته شده.در واقع کانتینر نرم افزار را از فضای اطراف ایزوله می کند و این کار سبب می شود تا تداخل بین تیم های مختلف که روی نرم افزار کار می کنند کاهش یابد.آنچه در مورد Docker Container از اهمیت برخوردار است شکل واحد و مستقل اجرا شدن آن است.توضیح بیشتر این مبحث نیازمند نصب داکر و استفاده از ابزار های آن است. نصب و راه اندازی داکر خیلی پیچیده و زمانبر نیست ولی برای ما ایرانی ها تحریم شده است و از طریق راه های دیگر ما هم می توانیم از این سرویس بهره مند شویم((:آیا با استفاده کردن از داکر،ما دیگر مشکلی با ارائه سرویس ها به مشتری نداریم؟! یا بهتر بگوییم آیا مفهوم scalability آنطور که باید و شاید پیاده سازی شده است؟آیا با استفاده کردن از داکر،ما دیگر مشکلی با ارائه سرویس ها به مشتری نداریم؟! آیا مفهوم scalability آنطور که باید و شاید پیاده سازی شده است؟جواب خیر است!!چند دلیل اساسی برای این مطلب می توان بیان کرد:۱- ما در مورد microservice ها صحبت کردیم اما در مورد پیچیدگی ارتباط بین آنها حرفی نزدیم.۲- چالش دیگری که پیش روی ماست تعداد این کانتینرها و نحوه ی مدیریت آنهاست که سبب می شود با پای Container manager ها به میان بیاید مثلا: Docker Swarm و Kubernetes و... ۳- اگر ارتباط بین microservice ها به طور ناهمزمان صورت گیرد چه؟! برای رضایت هر چه بیشتر مشتری سرویس ها باید کاملا در دسترس باشند، اما اگر در ارائه ی یکی از این سرویس ها مشکلی بروز پیدا کرد چه؟! نمی شود که یک درخواست را نگه داشت و منتظر دیگری ماند!! به همین دلیل پای سرویس هایی مانند RabbitMQ به میان می آید.بنابراین ما با انتخاب microservice ها با کلی پیچیدگی مواجهه هستیم و حل این پیچیدگی و مشکلات در صورتی کاربردی و به صرفه است که سرویس ها و خدمات ما قابل شکستن باشند و به اندازه ی کافی وسیع باشند.باید به این نکته هم دقت داشت که استفاده از microservice ها، همیشه هم بهترین گزینه نیست و استفاده از ابزار ها تابع شرایط پروژه است و مولفه های زیادی را شامل می شود که در این مقاله، مورد بحث ما نیست اما برای استفاده از آن باید دلیل منطقی و خوبی داشت در غیر این صورت کار شما بیهوده بوده و با پیچیدگی های زیادی روبرو هستید.ما سعی داریم  مواردی که معمولا در مباحث تئوری کمتر مورد توجه قرار می گیرند(البته در مباحث عملیاتی به طور مفصل مورد بررسی قرار می گیرد.) را توضیح دهیم.شبکه ی داکر در واقع، شامل ارتباطات بین چندین کانتینر در یک هاست(میزبان) است که خود این کانتینرها هم با هاست  یا هاست های دیگر در ارتباط هستند و از طرفی با یکدیگر هم در ارتباط هستند و در این حالت کار خیلی پیچیده و سطح بالا می شود.درست کردن و مدیریت چنین شبکه ای نیازمند دانش و مهارت و هزینه های زیاد است.خب در اینجا به پایان داستان داکر و scalability می رسیم، اما همچنان یادگیر گرفتن و آموختن در جریان هست!امیدوارم از این مطالب لذت برده باشید و براتون مفید فایده بوده باشه(:با آرزوی موفقیت.نوشته شده توسط: علی آخی</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Mon, 05 Oct 2020 18:13:48 +0330</pubDate></item><item><title>چگونه داکر در scalable کردن microservice ها به ما کمک می کند؟!</title><link>https://virgool.ir/@dev.stream/چگونه-داکر-در-scalable-کردن-microservice-ها-به-ما-کمک-می-کند-vcvk6v7q3m8i</link><description>پارت سومبه هر حال ما برای حل این مشکل می توانیم سیستم عامل های مختلف را با وابستگی های مورد نیاز برای هر microservice روی سیستم عامل ایجاد کنیم و این microservice ها را در همان سرور بر روی ماشین های مجازی مختلف اجرا کنیم. با انجام این کار، اگر هر microservice به درستی کار کند در واقع کل سیستم درست به فعالیت خودش ادامه می دهد البته با یک چالش روبرو خواهیم شد که در ادامه به آن می پردازیم.بنابراین در این ماشین های مجازی پس از اعمال تغییرات مجدد microservice ها را به کار می گیریم.اما انجام این تغییرات کند و زمانبر است و علاوه بر آن این VMs ها نیازمند حافظه زیادی هستند زیرا ما یک سیستم عامل کامل داریم که فقط فرایند های خاص سیستم عامل که نیازی به آنها نیست را ندارد.و این دقیقا همان چیزی است که داکر به ما ارائه می دهد.در مقایسه ی داکر و ماشین مجازی عکس بالا گویای همه چیز هست!در واقع، در داکر برخلاف ماشین های مجازی، که در حقیقت سخت افزار شما را مجازی می کنند ما مجازی سازی سیستم عامل را شاهد هستیم.خب فایده ی استفاده از داکر چیست؟!در واقع با استفاده کردن از داکر ما در مصرف منابع صرفه جویی می کنیم که این مورد از اهمیت ویژه ای برخوردار است و همچنین استفاده از داکر سریع تر است در حقیقت شما در زمان هم صرفه جویی می کنید.اما چطور از داکر استفاده کنیم؟!هدف ما از بیان این مقاله آشنایی کامل با داکر نیست به هر حال توقع شرح کامل را نداشته باشید!۱- برای هر یک از microservice ها یک داکر فایل ایجاد می کنیم. که در واقع کانفیگ های لازم جهت ساخت داکر در داخل آنها تعریف می شود.۲- ساخت یک IMAGE از داکر فایل براساس کانفیگ های اعمال شده یا کانفیگ های دیفالت.بنابراین ما تمام سرویس های خود را فعال می کنیم و مشتری ها می توانند با استفاده از این IMAGE ها درخواست های خود را ارسال کنند.در واقع با استفاده کردن از داکر ما تا حد زیادی در منابع و زمان صرفه جویی می کنیم.این مطلب ادامه دارد...نوشته شده توسط: علی آخی</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Wed, 16 Sep 2020 00:33:23 +0430</pubDate></item><item><title>چگونه داکر در scalable کردن microservice ها به ما کمک می کند؟!</title><link>https://virgool.ir/@dev.stream/چگونه-داکر-در-scalable-کردن-microservice-ها-به-ما-کمک-می-کند-uhajir9s0i1d</link><description>پارت دوم(مفاهیم)در پارت قبلی در مورد scalability صحبت کردیم و تا حدودی با مفهوم آن آشنا شدیم و همچنین روش های آن را بررسی کردیم. اما در این پارت و پارت های بعدی با مفاهیمی مثل docker , microservice و نیز کاربردهای آنها آشنا می شویم.توجه داشته باشید که هدف از این مقاله آشنایی کامل با این مفاهیم نیست پس کاربرد های دیگری نیز برای docker وجود دارد که در اینجا هدف ما معرفی این کاربردها نیست.پس به خاطر داشته باشید که scalability و microservice تنها دلیل استفاده از docker نیستند!و همچنین برعکس این مورد هم منظور ما نیست یعنی تنها راه پیاده سازی microserviceها استفاده از داکر نیست اما می توان گفت که راه خوبی است.توصیه می شود قبل از مطالعه ی این مطلب پارت قبلی را با دقت بخوانید!طرح مشکل: بررسی یک مثال فرض کنید که شما یک اپلیکیشن نوشته اید و آن را روی یک سرور یا فضای ابری host کرده اید و چون هنوز تبلیغات انجام نداده اید فعلا در هر ثانیه ۵۰۰۰ کاربر می گیرید(خیلی فضایی به نظر میرسه) و بااین تعداد کاربر سرور شما به راحتی می تواند تمام کاربران را سروریس دهد.حال فرض کنید که می خواهید فیچری جدید به اپ اضافه کنید و همزمان تبلیغات خود را شروع می کنید و حسابی اپلیکیشن شما معروف و محبوب می شود و پس از ارائه ی نسخه ی جدید تعداد درخواست ها در هر ثانیه به ۶۰ هزار درخواست افزایش می یابد و سرور شما دیگر قادر نخواهد بود که این تعداد را هندل کند و timeout رخ می دهد و این در کیفیت خدمات اپلیکیشن شما تاثیر زیادی خواهد داشت! پس راه حل این مشکل چیست؟ جواب در پارت قبلی است استفاده از روش های scalability یعنی Vertical scaling و Horizontal scalingدر مورد این دو روش در پارت قبلی صحبت کردیم.اما همین طور که اپلیکیشن شما بزرگ تر می شود و فیچر های آن بیشتر می شوند حجم کدها و داده ها هم زیاد می شوند و شما مجبور می شوید که آنها را در چندین سرور نگه دارید اما همین کار خود سبب به وجود آمدن پیچیدگی می شود.در حقیقت هر بار که شما یک فیچر جدید اضافه می کنید سه کار را باید انجام دهید:۱- کل اپلیکیشن را از روی سرور پایین بیاورید.۲-فیچر جدید را به اپلیکیشن خود اضافه کنید.۳-دوباره روی سرور ببرید.همین توسعه ی مجدد گاهی سبب می شود تا downtime شما بیش از ۲۰ دقیقه باشد و این خیلی بد است و عملا شما مشتریان خود را از دست می دهید. البته تکنیک هایی برای کاهش این زمان هست اما خیلی کار ساز نیستند.اما این مشکل را چگونه باید حل کرد؟ پاسخ microservice است. اصلا تعریف microservice چیست ؟میکروسرویس فقط یک الگوی معماری است که سرویس های بزرگ را به سرویس های خرد تبدیل می کند.و یکسری ویژگی های خاص دارد مثلا:-قابل تست و بسیار قابل نگه داری است.-به طور مستقل قابل استفاده است.-امکان تحویل سریع ، مکرر و قابل اعتماد برنامه های پیچیده و بزرگ را فراهم می کند.-سیستم را قادر می سازد تا technology stack خود را توسعه دهد. و....بنابراین شما به آرامی و به صورت اصولی شروع به شکستن برنامه ی عظیم خود می کنید و آنرا به سرویس های مستقل و کوچک تر تبدیل می کنید که می توانند با هم صحبت کنند و در نهایت به هدف مشترک خود برسند.برای فهم بهتر این موضوع یک مثال آشنا را بررسی می کنیم:فرض کنید که شما یک اپلیکیشن فروشگاهی نوشته اید؛ و داخل آن کاربر می خواهد کالایی را به سبد خرید اضافه کند.چه اتفاقی می افتد؟!1- کاربری که درخواست را ارسال کرده در مرحله ی اول اعتبار سنجی می شود در صورت تایید اعتبار وارد مرحله بعدی می شود.۲-پس از انجام اعتبار سنجی و دریافت تاییدیه ها رکوردی برای این کاربر ثبت می شود که فلان کالا را می خواهد.۳- سپس سفارش کاربر برای شرکت یا فروشگاه مورد نظر ارسال می شود.۴- پس از آن نتجه سفارش برای کاربر ارسال می شود.(موجود یا ناموجود بودن کالا. البته در فروشگاه های اینترنتی ایران این مورد وجود دارد)۵- پس از انجام تمام این کار ها پیغامی برای کاربر با عنوان ثبت سفارش ارسال می گردد یا در صورت بروز مشکل پیغام بروز خطا ارسال می شود.انجام این مراحل به صورت واحد یکسری مشکلات دارد و  پس از آن یکسری مشکلات دیگر را به همراه دارد:-اول اینکه طی شدن این مراحل نگهداری از پروژه های بزرگ را پیچیده و دست و پا گیر می کند و همچنین در انجام این مراحل ما تکرار کد هم داریم. زیرا اکثر عملکردهای شما که درخواست های کاربر را برآورده می کنند هر بار در حال تکرار شدن هستند.-دوم اینکه؛ هر بارتأیید اعتبار کاربر می تواند منجر به افزایش اندازه کدهای شما شود.پس راه حل مناسب برای حل این مشکلات شکستن یکپارچه ی این سرویس است به شرط مستقل بودن هر مرحله و کنترول عملکرد در هر مرحله.پس مراحل را به صورت زیر اصلاح می کنیم:۱- ابتدا یک سرویس تایید اعتبار برای Authentication کاربران ایجاد می کنیم.۲-در مرحله بعد یک سرویس خرید کالا ایجاد می کنیم که بگوید که کدام کاربر کدام کالا یا کالا ها را می خواهد.۳- در مرحله بعد یک سرویس اعلان ایجاد می کنیم که اعلان ها را ارسال کند.اما راستی گواهینامه های SSL چه می شود؟!خب ما برای آن سرویس خاصی ایجاد نمی کنیم. اما برای آن از API Gateway استفاده می کنیم. API Gateway را به عنوان یک پروکسی معکوس پیشرفته در نظر بگیرید.بنابراین API Gateway اکنون تأیید گواهینامه های SSL را انجام می دهد. علاوه بر آن، با استفاده از این API Gateway  ، نیازی به پیاده سازی احراز هویت و سروریس های خرد نداریم. اگرچه به خاطر این مثال ، اجازه دهید آن را به عنوان یک سرویس کوچک در نظر بگیریم.خب حالا چطور این microservices ها را پیاده سازی کنیم؟!خب جواب معمول به این صورت است که ما این سرویس ها را روی پورت های جداگانه اجرا می کنیم مثلا سرویس Authentication روی پورت ۳۰۰۰ و سرویس اطلاع رسانی(notification) روی پورت ۴۰۰۰ وهمین ترتیب سرویس های دیگر را روی پورت های دیگر پیاده سازی می کنیم.مگر این روند مشکلی دارد؟!فرض کنید شما می خواهید یک فیچر جدید به اپلیکیشن خود اضافه کنید و این کار را با آخرین نسخه زبانی که آن را توسعه داده اید انجام می دهید و  همچنین توسعه خود را نیز آپدیت کرده اید ): پس از آن متوجه می شود که سایر microservices هایی که با استفاده از نسخه ی قدیمی ساخته شده اند دیگر کار نمی کنند(لحظه ی خیلی سختی خواهد بود) خب اصلا چرا این اتفاق افتاد؟!!ببینید وقتی شما از نسخه ی جدید استفاده می کنید این نسخه برخی از API های نسخه های قدیمی را ندارد چرا؟ چون آن API ها در این microservices ها حذف شده اند و یا مشکلات ناشی از استفاده از نسخه های مختلف روی نرم افزاری هایی مختلف در کنار هم. مثلا فرض کنید یک نرم افزار به پایتون نسخه ی ۲ نیاز دارد  و یک نرم افزار به پایتون نسخه ۳ نیاز دارد و شما فقط می توانید روی سیستم خود تنها یک نسخه نصب کنید.خب باید چه کاری انجام داد؟!جواب کوتاه و ساده است!! استفاده از ماشین های مجازیفکر کنم تا حدودی با ماشین مجازی (Virtual Machines) آشنایی دارید به هر حال بررسی VMs موضوع بحث ما نیست. اینجا می تونید در موردش بخونید!درواقع با VMs ما می توانیم  یک محیط جدا شده در بالای سیستم عامل یا مستقیما روی سخت افزار ایجاد کنیم!این مطلب ادامه دارد...نوشته شده توسط: علی آخی</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Tue, 15 Sep 2020 01:32:23 +0430</pubDate></item><item><title>مقیاس پذیری(Scalability)</title><link>https://virgool.ir/@dev.stream/مقیاس-پذیریscalability-chnchdgrd1o9</link><description>نوشته شده توسط: علی آخیسلام به همگی بعد از یه وقفه ی تقریبا دوماهه در خدمت شما هستیم!این بار با انرژی بیشتر و خب کلی ایده ی باحال و جالب که به کمک شما اونا رو پیش می بریم (:و اینکه من علی آخی هستم یکی از اعضای گروه Dev Stream که به تازگی فعالیتمون رو شروع کردیم و امیدوارم که ما بتونیم به کمک شما این حرکت رو ادامه بدیم!و یه خبر خوب هم دارم، البته دوتا (: اول اینکه فایل کامل مقاله ی NGINX به زودی داخل کانال تلگرام قرار می گیره و اینکه این مقاله به اسم گروه Dev Stream هستش و نویسندگان و منابع آن کاملا مشخص هستن!دوم اینکه به زودی یه مقاله دیگه رو شروع می کنیم (: فعلا در مورد موضوعش و چند و چونش چیزی نمیگم!و اما Scalabilityاین واژه ی تخصصی به معنای  -مقیاس پذیری-  است. تعریف این واژه ی فنی به صورت زیر است ! در علم ارتباطات راه دور و مهندسی نرم‌افزار مقیاس‌پذیری (به انگلیسی: Scalability)، ویژگی مطلوبی از یک سامانه، شبکه یا فرایند است که به توانایی آن برای پاسخگویی به افزایش میزان بار کاری به سهولت دلالت می‌کند به زبان ساده میزان آمادگی سیستم را برای افزایش بار کاری را نشان می‌دهد بد نیست که به اصطلاح Load Scalability هم اشاره کنیم.در واقع توانایی دردسترس بود، برای پاسخ به درخواست ها را مقیاس پذیری میگیم که البته خیلی تعریف سخت و گنگی هست و من میخوام براتون به طور ساده و قابل فهم بیانش کنم. اما قبل از اون میخوام بپرسم که اصلا  چرا ما به مقیاس پذیری نیاز داریم و چرا باید ازش استفاده کنیم؟! به لحاظ تکنیکال میزان قدرت ارائه دهنده ی سرویس با تعداد درخواست ها برای سرویس رابطه ی مستقیم داره. مثلا اگر سایتی مثل آمازون توی یک روز خیلی خاص مثل Black Friday که خب مشتری هاش خیلی بیشتر از سایر روز ها هستن و به خاطر اعتبار و صد البته قانون، باید به همه ی مشتری هاش خدمات شایانی ارائه بده. پس باید در برابر حجم بالای درخواست ها، مقیاس پذیری  بالایی داشته باشه پس مقیاس پذیری یک پاسخ خیلی منطقیه، حالا این مقیاس پذیری در هر سطحی قابل تعریف و دفاع است و چه منابع سخت افزاری و چه منابع نرم افزاری و یاهر موضوعی که به بحث کارایی اهمیت میده.اما این پاسخ منطقی به افزایش درخواست ها به چه شکلیه یا بهتر بگم استراتژی ما برای scalability چیه؟برای توضیح ساده تر بیاین یه مثال خیلی ملموس و باحال بزنیم: فرض کنید شما مسئول سلف سرویس دانشگاه هستید و توی تعطیلات تابستون به سر می برین و یه روز صبح از طرف اداره ی رفاه دانشجویان با شما تماس می گیرن  و میگن که قراره ظرفیت ورودی دانشگاه از این ترم بیشتر بشه و باید ظرفیت سلف رو برای سرویس دادن به تعداد بیشتری دانشجو آماده کنید! خب شما چه کار می کنید؟! راه حل این مشکل چیه؟! اول یه نفس عمیق می کشیم و میگیم کاری نداره که (: خب باید تعداد خدمه ی آشپز خونه و سالن بیشتر بشن و منابع و مواد اولیه هم باید افزایش پیدا کنه. اما یک مشکل بزرگ داریم!!!! اگر تعداد دانشجو ها بیشتر بشه باید سرعت سرویس دادن هم زیاد بشه و گرنه صدای دانشجو های بیچاره درمیاد و حق هم دارن کلاسشون دیر میشه! راه حل چیه؟! چه باید کرد؟!!خب کاری نداره دو راه حل کلی وجود داره: ۱- تعداد گیت های توزیع رو بیشتر کنیم! مثلا اگه ۵ گیت داریم تعداد اونارو به نسبت دانشجوها بیشتر کنیم مثلا ۷ تا  ۲-تعداد افرادی که داخل هر گیت سرویس میدن رو بیشتر کنیم! مثلا اگه توی هر گیت ۷ نفر هستن که خدمت رسانی میکنن تعدادشون رو به نسبت دانشجوها بیشتر کنیم مثلا هر گیت ۱۰ نفراما اگه تعداد دانشجوها بیشتر از انتظار شد چی ؟! خب هم تعداد گیت ها را بیشتر می کنیم و هم  تعداد خدمه ی هر گیت رو بیشتر می کنیم!   واینگونه شما مشکل رو حل می کنید خیلی ساده و سریع و بی درد سر(:حالا اگه بخوایم به طور تخصصی تر موضوع رو بررسی کنیم:  برای مقیاس پذیر شدن یک پدیده به دو یا شایدم سه روش باید عمل کرد:  ۱-روش Vertical scaling or scaling up:  مثل روش اضافه کردن خدمه در مثال فوق بود.  در این روش ماتوان ارائه دهنده ی سرویس را افزایش می دهیم مثل افرایش cpu , ram,... که به لحاظ سخت افزاری  scaling را انجام می دهیم!  ۲-روش Horizontal scaling or scaling out:  مثل اضافه کردن گیت های بیشتر در مثال فوق بود.  در این روش با اضافه کردن نود های سرویس دهنده به طور هماهنگ و پیوسته به نود های قبلی عمل scaling را انجام می دهیم!۳- روش Diagonal Scaling:این روش تلفیقی است یعنی همزمان از روش Horizontal scaling و Vertical scaling استفاده می شود.این مطلب ادامه دارد... </description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Sat, 29 Aug 2020 06:16:20 +0430</pubDate></item><item><title>NGINX Unit</title><link>https://virgool.ir/@dev.stream/nginx-unit-evd6hndypa0j</link><description>نوشته شده توسط علی آخی و بردیا اکبریتیم NGINX  پیشنهاد جدیدی با هدف حل برخی از چالش های مشترک فرآیندهای توسعه مدرن با نام NGINX Unit را مطرح کرد.در واقع ابزار NGINX Unit یک application server پویا است ،که هم در کنار NGINX Plus و NGINX  قابل اجرا است و هم به طور مستقل کار میکند. NGINX Unit تغییرات پیکربندی را بدون ایجاد اختلال در سرویس اعمال می کند و برنامه های ساخته شده با چندین زبان و چارچوب را اجرا می کند. از ابتدا طراحی شده که به نیازهای distributed application  پاسخ بدهد،  همچنین پایه  service mesh را تشکیل می دهد. خب تا حالا با nginx و nginx Pluse آشنا شدیم اما اصلا چه نیازی به استفاده از این ابزار هست؟!اما آنچه شما را در پاسخ به این سوال متقاعد می کند شامل مواد زیر است :1- پویا بودن این ابزار:به کمک ابزار nginx Unit برنامه های خود را real time پیکربندی کنید. NGINX Unit متناسب با microservices های جدید تنظیم شده است.2-  تر و تمیز بودن:ابزار NGINX Unit با ارائه ی یک پشته، تنظیمات واحد(configuration stack) از  الزامات و دردسرهای مرتبط با چندین application servers جلوگیری کنید. 3- قابل اعتماد بودن: درست مثل سایر محصولات nginx تیم فوق العاده ی nginx به صورت تمام قد از شما حمایت می کند.*** قابلیت های NGINX Unitچند زبانی در nginx Unit:پشتیبانی یکنواخت از زبان های بک اند Go ، Node.js ، Perl ، PHP ، Python و Ruby و برنامه های نوشته شده به زبان های مختلف در همان سرور اجرا می شوند .همچنین نسخه های مختلف یک زبان با هم اجرا می شوند مثلا php5 با php7 یا مثلا Python2.7 با Python3. با این کار شما همه برنامه ها را با یک رابط کاربری ساده پیکربندی می کنید.قابلیت انعطاف پذیری nginx Unit:با توجه به گستردگی NGINX ، برای جا نماندن از قافله باید در سال چند config file را مطالعه کنید تا با   قابلیت های جدید nginx آشنا شوید همچنین حافظه خود را درمورد دستورات nginx تازه نگه دارید. اما همان طور که می دانید هر بار که باید مهندسی معکوس کنید.ابزار NGINX Unit این مدل پیکربندی ضروری را در خود حفظ کرده و در عوض یک مدل پیکربندی اعلانی را در خود دارد. مسلماً ،NGINX Unit به مراتب کمتر از یک فایل پیکربندی NGINX قابل تنظیم است .مدل تنظیمات اعلانی باعث می شود NGINX Unit برای افرادی که تجربه پیکربندی سرویس های ابری و سیستم عامل هایی مانند Kubernetes را دارند ، بسیار آسان شود.قابلیت Service Mesh در nginx Unit:شبکه پشته یکپارچه برای ارتباط سریع service-to-service پیکربندی شبکه را از کد برنامه تا پشتیبانی SSL / TLS داخلی  بارگیری می کند.نقاط ضعف استفاده از nginx Unit:1- هیچ پورت ویندوزی وجود ندارد که NGINX Unit را فقط به مخازن های لینوکس و MacOS محدود کند.2- برای کار با NGINX Unit ، باید کد های پایگاه داده Go و Node.js اصلاح شوند.3- اگر عملکردهای ارائه شده توسط NGINX Unit  امروز پاسخگوی نیازهای شما باشد ، انتخاب طبیعی برای استفاده از سرویس سنتی NGINX است.4- ابزار NGINX Unit برای فرآیندی که مدیریت می کند ،health checks ارائه نمی دهد.یک سوال ؟!ابزار nginx Unit همان nginx نیست؟!!!این مدل پیکربندی مبتنی بر JSON را ارائه می دهد ، و پیکربندی را از طریق HTTP API در معرض دید قرار می دهد و یک مدل اعلانی را برای پیکربندی رایج ترین موارد استفاده در شبکه ایجاد می کند ، همه ی اینها در عین حال سبک و ساده است.این رویکرد به این معنی است که برخی موارد استفاده که در حال حاضر توسط NGINX پشتیبانی می شوند ، در NGINX Unit امکان پذیر نیست ، اما با انتشار جدید هر چند ماه ، انتظار می رود عملکرد  NGINX Unit رشد کند.اگر عملکردهای ارائه شده توسط NGINX Unit  امروز پاسخگوی نیازهای شما باشد ، انتخاب طبیعی برای استفاده از سرویس سنتی NGINX است.نتیجه گیری از آنچه گفته شد...آنچه ما در این مقاله به دنبال آن بودیم و در حقیقت ایده اصلی این مقاله هم براساس آن شکل گرفت این بود که ، توجه ها بیشتر به سمت nginx  و قابلیت های مختلف NGINX و همچنین پشتیبانی و نحوه عملکرد این کمپانی در ساپورت محصولاتش جلب شود هر چند کوتاه و هرچند مختصر اما به دور از هر گونه مقایسه بی جا و نا روا .می دانیم که نتیجه گیری خلاصه ای از کل مطلب است اما ما می خواهیم سنت شکنی کرده و این نتیجه گیری را به تجربیات دیگران بسپاریم چرا که قضاوت این مسئله از عهده ما خارج است و امکان دارد بطور ناخواسته در ادای مطلب، غرض شخصی ما اعمال شود. ناگفته نماند ما با این کار قصد نداریم فقط نظرات مثبت را بازگو کنیم .این مطلب ادامه دارد...باتشکر فراوان!</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Fri, 19 Jun 2020 17:40:41 +0430</pubDate></item><item><title>NGINX WAF</title><link>https://virgool.ir/@dev.stream/nginx-waf-stlxg7w5etid</link><description>نوشته شده توسط: علی آخی و بردیا اکبریخب NGINX WAF همانطور که از اسمش پیداست یک Web Application Firewall است که بر پایه ModSecurity 3.0 می باشد، و مانند دیگر WAF ها کار جلوگیری و متوقف کردن حملات لایه هفتم مدل OSI  را انجام می دهد.اما کمی بیشتر درباره  ModSecurity بیاموزیم، یک WAF  که اولین بار در سال 2002 به عنوان ماژولی برای Apache ایجاد شد، به همین دلیل ModSecurity، برای استفاده از آن، به Dependency های Apache نیز، نیاز داشت. اما در سال 2010 که ModSecurity توسط شرکت Trustwave خریداری شد و تحت مجوز Apache License 2.0 قرار گرفت، این امر باعث شد تا سال 2012، ماژول هایی برای NGINX و IIS ایجاد شده و بسیاری از شرکت ها در محصولات خود از ModSecurity استفاده کنند.علاوه بر دیگر وابسته نبودن ModSecurity 3.0 به Apache (چه در Compilation و چه در Runtime)،  رفع کردن مشکل تعداد زیاد False-Positive ها در گذشته، و پشتیبانی از ماژول های Dynamic در ModSecurity 3.0 از دیگر ویژگی های آن بود.پشتیبانی از ماژول های Dynamic به این معناست که شما می توانید خود ماژول هایی را ایجاد کنید که به گونه ای Compile شوند، که بدون نیاز به Recompile شدن خود NGINX بتوانند با آن کار کنند.گفتیم که WAF ها از مجموعه قوانین و یا Rule Set هایی برای بررسی درخواست ها استفاده می کنند، اما این قوانین دقیقا در چه قسمتی از درخواست استفاده می شوند؟این قوانین در سربرگ درخواست (Request Header)، بدنه درخواست (Request Body) و سربرگ پاسخ (Response Header) استفاده می شوند، بدنه پاسخ (Response Body) دیگر در WAF NGINX بررسی نشده و این عمل توسط ماژول Sub Filter در NGINX انجام می شود.و اما Syntax این قوانین، هر قانون با فرمت زیر و توسط SecRule تعریف می شود:سه قسمت اصلی این فرمت را با هم مرور می کنیم:اول Variables :در این قسمت مشخص می‌شود که دقیقاً چه قسمتی از دخواست و پاسخ HTTP بررسی می‌شود که خود شامل انواع متفاوتی است که در ادامه به تعدادی از آن‌ها اشاره می‌کنیم:متغیرهای Request:ARGREQUEST_HEADERS، REQUEST_COOKIESمتغیر های Response : RESPONSE_HEADERS، RESPONSE_BODYمتغیر های Server : REMOTE_ADDR، AUTH_TYPEمتغیر های Time : TIME، TIME_EPOCH، TIME_HOURمتغیر های Collection : TX، IP، SESSION، GEOدیگر متغیر ها : HIGHEST_SEVERITY، MATCHED_VARموارد بیشتر در این لینک !دوم OPERATOR :کلیدواژه را که قرار است در متغیر ها مورد بررسی قرار گیرد را مشخص می کنیم،به عنوان مثال :مثلا : Rx، pm، beginsWith، contains، endsWith، streq،within، geoLookup، inspectFileبرای مطالعه بیشتر درباره هر یک از عملگر ها می توانید به این آدرس مراجعه کنیدسوم و به عنوان آخری ACTIONS و TRANSFORMATIONS: در این قسمت عمل هایی تعریف می شوند که در صورت پیدا شدن الگوی تعریف شده (OPERATOR) در بخش مورد بررسی (VARIABLES)، می بایست انجام شوند.عمل های Disruptive : block، drop، deny، proxyعمل های Flow : chain، skip، skipAfterعمل های Metadata : phase، id، msg، severity، tagعمل های Variable : capture، setvar، initcolعمل های Logging : log، auditlog، nolog، sanitiseArgدیگر عمل ها : ctl، multiMatch، exec، pause، append/prependحال قبل از بررسی چند مثال از قانون یا SecRule ها، چند نکته که باید در نوشتن بک قانون رعایت شوند را ذکر می کنیم:1- هر SecRule باید یک VARIABLE یا متغیر داشته باشد.2- هر SecRule باید یک OPERATOR یا عملگر داشته باشد، در غیر اینصورت @rx به عنوان پیشفرض ست خواهد شد.3- هر SecRule باید یک ACTION یا عمل داشته باشد و تنها عمل الزامی id می باشد.4- هر SecRule باید یک عمل phase داشته باشد، این عمل مشخص کرده که چه زمانی و در چه فازی، قانون باید بررسی شود.5- هر SecRule باید یک باید یک عمل از نوع disruptive داشته باشد، این نوع عمل مشخص می کند که با درخواست یا پاسخ باید چه کاری انجام داد، آن را متوقف کرد و یا صرفاً هشدار داده و به آن اجازه عبور داد.                                           6) استفاده از TRANSFORMATIONS اختیاری بوده اما برای جلوگیری از Bypass شدن قانون پیشنهاد می شود.در مثال اول قانونی ساده نوشته شده که برای جلوگیری از حملات XSS می‌باشددر این SecRule از متغیرهایARGS که تمام پارامتر ها و REQUEST_HEADERS که تمام سربرگ های درخواست ها را مورد بررسی قرار می دهند، استفاده شده است.در قسمت OPERATOR، عملگر rx یک جستجوی کلی در بخش های ذکر شده انجام داده و در صورت یافتن عبارت  عمل های نوشته شده را انجام  می دهد.در بخش عمل ها ابتدا  idیا شناسه قانون ذکر شده است، سپس ‘XSS Attack’ به عنوان پیامی که قانون در صورت رخ دادن بر می گرداند آورده شده، Severity نیز شدت و درجه حمله را مشخص می کند که پارامتر های آن عبارت است از :EMERGENCY (0)، ALERT (1)، CRITICAL (2)، ERROR (3)، WARNING (4)، NOTICE (5)، INFO (6)  و (7) DEBUG در آخر مهمترین عمل ها یعنی deny و status آورده شده که به ترتیب درخواست را رد کرده و به آن اجازه گذر نمی دهد و پاسخی با کد 404 بر می گرداند.یکی از عمل های پرکاربرد در NGINX WAF عمل chain می باشد، با استفاده از این عمل شما می توانید زنجیره ای از قوانین بسازید که اگر درخواستی تمامی قوانین را فعال کرد، عمل disruptive تعریف شده در قانون اول اعمال شود، حتی اگر درخواستی تنها یکی از آن قوانین را فعال نکند، عمل disruptive اعمال نخواهد شد.  در واقع شما یک AND منطقی میان قانون های خود پیاده سازی می کنید.مثال زیر توسط NGINX برای نمایش نحوه کارکرد این عمل ارائه شده است.در قانون اول آدرس درخواست ها بررسی شده و اگر درخواستی به /secret دریافت شد، WAF آنرا متوقف خواهد کرد. عمل deny به عنوان عمل disruptive برای کل زنجیره استفاده خواهد شد. در آخر نیز با استفاده از عمل chain این قانون و قانون بعد را به عنوان یک زنجیره قوانین تعریف می کنیم.لازم به ذکر است که id در قانون مربوط به زنجیره قوانین است، در نتیجه نیازی به تعریف آن در قوانین دیگر زنجیره نمی باشد.در قانون بعدی با قراردادن &amp; در ابتدای متغیر، تعداد آن را برای سنجیده شدن توسط عملگر مشخص می کنیم، سپس اگر تعداد آن برابر با صفر بود، یعنی هیچ کوکی به اسم user_id ست نشده بود، این قانون فعال می شود. عمل chain نیز برای ادامه زنجیره، وارد شده است.در ادامه قانونی تعریف شده است که سربرگ User-Agent را بررسی می کند و اگر اسم این User-Agent برای مثال attacker باشد و دستگاهی باشد که چنین User-Agent دارد،قانون فعال می شود. عمل chain نیز برای ادامه زنجیره، وارد شده است.در آخر نیز سربرگ X-Forwarded-For چک شده و همانند قانون دوم اگر تعداد آن صفر باشد و ست نشده باشد، قانون فعال شود. نهایتاً اگر تمامی قوانین زنجیره فعال شوند، عمل deny برا درخواست اعمال می شود و در غیر اینصورت اعمال نخواهد شد.در مثال آخر نمونه ای از استفاده از لیست ها در قوانین را آورده‌ایم:در این قانون همانند قبل، متغیر ما سربرگ  User-Agent می باشد، اما این بار از لیستی شامل User-Agent هایی که نمی خواهیم به آنها اجازه دسترسی دهیم، استفاده می کنیم. قانون در صورت وجود داشتن User-Agent درخواست در این لیست، عمل deny را با پیام Blacklisted برای این درخواست اعمال خواهد کرد.درباره ی OWASP Top 10 و OWASPقبل از صحبت درباره بخش بعدی نیاز به شناخت OWASP داریم، OWASP یک سازمان بین المللی غیر انتفاعی است که تماماً به امنیت برنامه های وب می پردازد. تمامی محصولات این سازمان بصورت رایگان بر روی وبسایت آن قرار گرفته است که شامل فیلم ها، اسناد و استاندارد ها، و فروم ها می شود. معروف ترین محصول آنها یعنی پروژه OWASP Top 10، لیستی از ده مشکل امنیتی برتر برنامه های وب می باشد که همواره در حال بروزرسانی است. شرکت ها و ارگان های فرآوانی در دنیا از این استاندارد برای کمک در ساخت مدل امنیتی خود استفاده می کنند.این ده مشکل امنیتی شامل موارد زیر می شوند:InjectionBroken AuthenticationSensitive Data ExposureXML External Entities (XXE)Broken Access ControlSecurity MisconfigurationCross-Site Scripting (XSS)Insecure DeserializationUsing Components with Known VulnerabilitiesInsufficient Logging &amp; Monitoringخب OWASP CRS مجموعه ای از قوانین کلی تشخیص حملات برای ModSecurity و دیگر WAF ها می‌باشد.هدف این مجموعه محافظت از برنامه های وب در مقابل طیف وسیعی از حملات است که ممکن است برنامه وب ما را تهدید کنند. در این مجموعه تمرکز بر مقابله با حملات لیست OWASP Top 10 می باشد.این Rule Set حفاظت در برابر انواع مختلف حملات را فراهم میکند، که از جمله آنها می توان به موارد زیر اشاره کرد:SQL Injection (SQLi)Cross Site Scripting (XSS)Local File Inclusion (LFI)Remote File Inclusion (RFI)Remote Code Execution (RCE)PHP Code InjectionHTTP Protocol ViolationsHTTPoxyShellshockSession FixationScanner DetectionMetadata/Error LeakagesProject Honey Pot BlacklistGeoIP Country Blockingاین CRS رایگان بوده و تحت مجوز Apache License 2.0 می باشد.استفاده از CRS بجای قوانینی که خود قصد نوشتن آنها را داریم، پیشنهاد می شود. زیرا ممکن است قوانین ما مقدار زیادی از حملات را پوشش ندهد، درحالی که OWASP CRS با هدف حفاظت و پوشش حداکثری حملات پدید آمده است و تعداد قوانین بسیار زیادی را در خود جای داده است. همچنین، همزمان با کشف آسیب پذیری ها و حملات جدید، قوانین CRS نیز بروزرسانی می شود.لازم به ذکر است اگرچه به طور کلی،  بدون قوانین و پوشش وسیع آن لایه حفاظت را محکم تر خواهد کرد، اما به این معنی نیز می باشد که امکان متوقف کردن درخواستی مشروع، به اشتباه، بالا می رود. جهت اطلاع بیشتر لطفا به صفحه github پروژه OWASP CRS به این آدرس، مراجعه فرمایید.همچنین برای مشاهده قوانین تعریف شده در مجموعه OWASP CRS به این آدرس مراجعه فرمایید.در هسته ModSecurity نیز یک Rule Set وجود دارد، که علاوه بر مقابله با حملات مرسوم و معروف همچون SQL Injection،Java  و PHP Exploits، و XSS، قوانینی سازگار با دو CMS معروف، WordPress و Drupal نیز دارد، و یک Rule Set کامل به حساب می آید.در نتیجه تصمیم استفاده از OWASP CRS یا دیگر Rule Set ها، و یا استفاده از  Rule Set Core ModSecurity (CRS) و یا حتی تعریف قوانین از پایه توسط فرد، کاملا بر عهده شماست و حتی می توانید ترکیبی از این گزینه ها را انتخاب کنید.در پایان به مقایسه نکات مثبت و منفی NGINX WAF می پردازیم:از نکات مثبت آن می توان به :مقابله و متوقف کردن حملات مرسوم و پوشش گسترده ی آسیب پذیری هاپشتیبانی از Virtual Patching فراهم کردن امکان شخصی سازی بالا ,... اشاره کرد، در مقابل آن:استفاده زیاد از منابعنگه داری و مدیریت Rule Set ها از نکات منفی آن به حساب می آید.و این مطلب ادامه دارد ...با تشکر فراوان!</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Sat, 13 Jun 2020 17:22:43 +0430</pubDate></item><item><title>NGINX PLUS(پارت 2)</title><link>https://virgool.ir/@dev.stream/nginx-plusپارت-2-b97fp2ltpwcr</link><description>نوشته شده توسط: علی آخی و بردیا اکبریچطور کار میکند؟!ابزار TCP Load Balancer  برای برنامه هایی است که از HTTP استفاده نمی کنند. یک TCP Load Balancer وقتی که در مقابل یک کلاستر پایگاه داده (database cluster) مستقر می شود ، درخواست ها را در تمام پیکربندی های موجود در سرور پخش می کند. هر نوع برنامه کاربردی برای سرور از طریق اتصال جدید TCP به سرور موجود ارسال می  شود. در Separating یا (proxying) مشتری با اتصالات سرور امکان افزایش امنیت ، از جمله پاکسازی پروتکل TCP یا کاهش DoS را فراهم می کند. همچنین عملکرد بهتر سرور و اتصالات client را فراهم می کند.پس فرق بین HTTP Load Balancer و TCP Load Balancer در چیست؟تعادل بار HTTP یک معماری ساده درخواست / پاسخ HTTP برای ترافیک HTTP است. اما یک تعادل بار TCP برای برنامه هایی است که در آنها از HTTP صحبت نشده است.       درمورد UDP Load Balancer NGINX:اتصالات UDP فقط مدت کوتاهی طول می کشند ، به همین دلیل ترافیک مبتنی بر UDP شامل جستجوی آدرس های کوتاه مدت سیستم, نام دامنه (DNS) و پروتکل زمان شبکه (NTP) می باشد. پروتکل UDP از شماره گذاری توالی اتصال برای نظارت بر انتقال و دریافت داده ها استفاده نمی کند. اما اتصالات UDP از طریق آدرس IP و شماره پورت قابل ردیابی است. اما این تعیین نمی کند که داده ها به کدام ارتباط تعلق دارند. این امر به دلیل کمبود جزئیات در مورد سرورهای ارسال درخواست ، چالشی برای توازن بار است. از آنجا که UDP بی سیم است ، بسته های داده مستقیماً به سرور Load Balancer منتقل می شوند. تصمیم تعادل بار در اولین بسته از مشتری گرفته می شود و آدرس IP منبع به آدرس IP متعادل کننده بار تغییر می یابد. تعادل بار UDP نوعی از load balancer ها است که از پروتکل UserDatagram استفاده می کند ، که در لایه 4 (لایه حمل و نقل) در مدل اتصال سیستم های باز (OSI) عمل می  کند. ترافیک UDP در یک سطح متوسط ​​بین یک برنامه کاربردی و پروتکل اینترنت (IP) برقرار می شود.خب کاربرد استفاده از این پروتکل برای کارهایی است که سرعت انتقال داده فوق العاده مهم است، مثلا در پخش های زنده یا بازی های آنلاین که کاربر باید با کمترین تاخیر سرویس خود را دریافت کند یا سایر پلتفرم ها که سرویس آنلاین و فوری می دهند.اما فرق TCP Load Balancer با UDP Load Balancer در چیست؟بزرگترین تفاوت بین آنها نحوه ردیابی داده ها است. TCP انتقال و دریافت داده ها را با سفارش و شماره گذاری data packet ها تضمین می کند. سپس گیرنده تحویل data packet را تأیید می کند. یک TCP Load Balancer  همچنین بسته های داده را برای خطا بررسی می کند.یک TCP Load Balancer مطمئن تر است زیرا داده ها در هنگام انتقال ردیابی می شوند تا اطمینان حاصل شود که هیچ گونه گم شدن یا خرابی اطلاعاتی صورت نگرفته.در حالی که:یک UDP Load Balancer فقط داده را ارسال می کند و هیچ تأییدی در مورد دریافت وجود ندارد.پس هیچ ردیابی خطایی هم در کار نیست و تمام داده ها ، چه داده  های خراب و چه داده های سالم، به سادگی وارد می شوند. نکته ترسناک اینجاست که اگر داده ها روی سرورهای UDP از بین رفته باشند، راهی برای یافتن آنها وجود ندارد. البته عدم تأیید صحت داده ها سبب می شود تا عمل  load balancing سریع تر انجام شود و زمانی که صرف تایید صحت داده ها می شود ذخیره شود. ابزار NGINX Plus همچنین می تواند برنامه های TCP مانند MySQL و برنامه های UDP مانند DNS و RADIUS را به تعادل برساند. ابزار NGINX Plus اتصالات TCP را خاتمه می  دهد و اتصالات جدیدی را به backend ایجاد می کند.ابزار NGINX Web application firewall  در حقیقت یک فایروال مبتنی بر ModSecurance 3.0 است.NGINX WAF می تواند برای متوقف کردن طیف گسترده ای از حملات لایه ی 7 و پاسخ به تهدیدات جدید با وصله ی مجازی  استفاده شود!توجه: قبل از هر توضیح دیگری لازم است تا با یکسری مفاهیم  به طور مختصر آشنا شویم !اول باید با مفهومی بنام firewall آشنا می شویم:                                                          خب Firewall یا دیوار آتش چیست؟چه کاری انجام می دهد؟به زبان ساده Firewall اولین خط دفاعی در امنیت شبکه قلمداد می شود و در شبکه کار کنترل و نظارت بر ترافیکی که دریافت و یا فرستاده می شود را انجام می دهد، حال این شبکه می تواند یک شبکه خصوصی که از تعداد کمی دستگاه تشکیل شده باشد، می تواند بزرگترین شبکه ی جهان یعنی اینترنت باشد. این کنترل و نظارت منطبق بر مجموعه ای از قوانین انجام می گیرد که در ادامه، بیشتر راجع به آنها توضیح می  دهیم. در ضمن Firewall ها می توانند به صورت نرم افزاری، سخت افزاری و یا هر دو، وجود داشته باشند. مدل (Open System Interconnection):در سال 1980، سازمان استاندارد سازی، مدل OSI را معرفی کرد، در این مدل ارتباطات میان دستگاه های یک شبکه، بدون در نظر گرفتن اینکه از چه تکنولوژی هایی در آنها استفاده شده است، به هفت لایه تقسیم بندی شده است: 7. لایه ی کاربرد – فراهم کردن رابط برای سایر لایه ها از طریق دادن دسترسی به نرم افزار ها برای استفاده از منابع شبکه.6. لایه ی نمایش – این لایه وظیفه فشرده سازی، وافشاری، رمزنگاری و رمزگشایی داده را بر عهده دارد و داده را در لایه کاربرد نمایش می دهد.5. لایه ی نشست – این لایه اطمینان حاصل می کند که داده درخواست شده در شبکه به همان برنامه درخواست کننده برسد و میان برنامه ها پخش نمی  شود.4. لایه ی انتقال – در این لایه است که با استفاده از پروتکل های TCP و UDP، داده در شبکه از یک دستگاه به دستگاه دیگری ارسال می شود.3. لایه ی شبکه – این لایه با مشخص کردن مکان دستگاه ها در شبکه مسیر داده ها برای رسیدن به دستگاه مربوطه را مشخص می کند. پروتکل های IP و IPv6 در این لایه مورد استفاده قرار می گیرند.2. لایه ی پیوند داده – این لایه با استفاده از آدرس سخت افزاری MAC عمل انتقال فیزیکی داده را انجام داده و آن را به بیت هایی جهت انتقال در لایه ی فیزیکی تبدیل می کند.1. لایه ی فیزیکی – در این لایه انتقال داده در پایین ترین سطح یعنی سیگنال ها و بیت ها انجام می شود، مانند استفاده از ولتاژ low و high.خب Web Application Firewall و تفاوت آن با Network Firewall:  اما Network Firewall ها در لایه های 3 و 4 مدل OSI  قرار می گیرند و همانطور که گفته شد کاربرد اصلی آنها نظارت و کنترل درخواست ها و ترافیک داخل شبکه می باشد، این عمل نظارت و کنترل در Network Firewall ها بر اساس اطلاعات پروتکلی درخواست ها انجام می شود.به بیان دیگر، تمرکز فیلتر هایی که برای اجازه، قطع و کنترل دسترسی ها در Network Firewall ها وجود دارند، بر روی مجموعه قوانینی (Rule Sets) می باشد که در آن IP Range ها، پورت های TCP و UDP، انواع ICMP و ... تعریف شده است، که برخی اجازه دسترسی دارند و به برخی دیگر اجازه داده نمی شود.برای مثال یک Network Firewall را در نظر بگیرید که در Rule Set آن قانونی تعیین کرده    ایم که به IP های از قبل تعیین شده، اجازه دسترسی به پورت TCP 80 و یا 443 را بدهد، حال اگر یک IP که در قانون ذکر نشده است اقدام به اتصال به پورت 80 کند، Network Firewall از آن جلوگیری می کند.  اما Network Firewall ها یک مشکل اساسی داشتند، اگر درخواستی طبق Rule Set اجازه دسترسی داشت ولی در محتوای درخواست اطلاعات مخربی بود چطور؟ برای مثال حملاتی همچون HTTP Flood، Slow Loris و حملات لیست شده در OWASP Top 10، رفتار یک درخواست HTTP مشروع را از خود نشان می دهند و چون هدف اصلی آنها برنامه ها وب می باشد و نه خود شبکه، Network Firewall با توجه به Rule Set تعریف شده و ماهیت طراحی خود، قادر به جلوگیری و متوقف کردن اینگونه حملات نمی باشد.در نتیجه نیاز به حضور Firewall هایی که بصورت جداگانه و انحصاری به اینگونه حملات رسیدگی و از بروز آنها جلوگیری کنند، منجر به ایجاد WAF ها شد.قبل از پرداختن به WAF ها نیاز داریم تعریفی از Reverse Proxy ها داشته باشیم، Reverse Proxy یا پراکسی معکوس، یک سرور است که برخلاف پراکسی های معمولی که جلوی یک و یا گروهی از کاربران قرار می گیرند، در جلوی یک و یا گروهی از سرور ها قرار گرفته و درخواست های کاربران به سرور ها را در لبه ی شبکه قطع کرده و آن ها را از جانب سرور ها دریافت می کند. از کاربرد های پراکسی معکوس می توان به: Load Balancing، حافظه پنهان سازی یا Caching، محافظت از سرور ها در مقابل حملات، اشاره کرد که نهایتاً به بالا بردن امنیت، عملکرد و اطمینان پذیری سرور ها کمک می کنند.  در واقع Web Application Firewall یک نوع Reverse Proxy می باشند که در مدل OSI در لایه های 3 تا 7 کار کرده و با قرار گرفتن بین یک و یا چندین برنامه وب و ترافیک ورودی، از بروز حملاتی که هدف آنها منحصراً لایه ی هفتم است، جلوگیری می کند.در‌واقع WAF ها با فیلتر کردن، بررسی و آنالیز محتوای درخواست های HTTP می توانند درخواست هایی را که ممکن است حاوی کد های مخرب باشند را از رسیدن به برنامه وب باز می دارند و حملاتی که Network Firewall ها توان مقابله با آنها را نداشتند، در همان سطح WAF و خارج از برنامه وب متوقف کرده و به آنها اجازه گذر نخواهند داد.یکی از راه های جالبی که می توان از WAF ها استفاده کرد، دادن نقش بافر مانند به آن است، به شکل که برنامه وبی را در نظر بگیرید که در آن باگ امنیتی کشف شده و هر لحظه امکان سو استفاده از آن توسط مهاجمان وجود دارد و رفع این مشکل ممکن است زمان بر باشد، در نتیجه می توان در WAF قانونی را تعریف کرد که دسترسی تمام ترافیک ورودی به قسمتی که دارای مشکل است قطع کند و به نحوی آن را ایزوله کند، بدون اینکه دیگر بخش های برنامه وب از دسترس خارج شود، در این مدت توسعه دهندگان می توانند مشکل را برطرف کنند.عمل فیلتر کردن درخواست ها مخرب توسط WAF همچون دیگر Firewall ها از طریق مجموعه قوانین از قبل تعیین شده انجام می پذیرد، این Rule Set ها هستند که به WAF می گویند که در چه بخش هایی از درخواست های HTTP به دنبال چه چیزی بگردند و چه قسمت هایی را مخرب تشخیص دهند.این Rule Set ها در WAF با استفاده از سه مدل، پیاده سازی می شوند: اول: Whitelisting (لیست سفید) : در این روش WAF بصورت پیشفرض تمامی درخواست ها را متوقف کرده و تنها به درخواست هایی اجازه گذر می دهد که از قبل ثابت شده هستند، و از طرف IP هایی آمده اند که به آنها اطمینان داریم.این روش از منابع کمتری نسبت به روش لیست سیاه استفاده می کند اما نکته منفی آن این است امکان جلوگیری از درخواست هایی که مشکل امنیتی نداشته زیاد است و کاملا دقیق نمی باشد.دوم: Blacklisting (لیست سیاه): این روش برخلاف روش لیست سفید، بصورت پیشفرض به تمامی درخواست های ورودی اجازه گذر می دهد و تنها از عبور درخواست هایی جلوگیری کرده که طبق الگو های تعیین شده، مخرب تشخیص داده شونداین روش برای برنامه های وبی که مخاطبان زیادی دارند مناسب است، زیرا اینگونه برنامه ها درخواست های بسیاری از IP های ناشناخته دریافت می کنند و استفاده از روش لیست سفید در اینجا کارآمد نیست، نکته منفی این روش  وابستگی زیاد آن به منابع است.سوم: Hybrid Security (امنیت ترکیبی): در این روش عنصر هایی از هر دو روش لیست سفید و لیست سیاه با هم تلفیق شده و استفاده می شوند.گفتیم که تمرکز WAF ها بیشتر بر روی حملات لایه هفتم است، این لیست شامل چه حملاتی می شود و آیا از حملات دیگری جلوگیری می شود؟ در ادامه چند مورد از حملاتی را ذکر می کنیم که می توان از WAF برای مقابله و جلوگیری از آنها استفاده کرد:حملات Distributed Denial of Service =&gt; Ddosحملات SQL InjectionحملاتCross-Site Scripting  &lt;=XSSحملات  Zero-dayحملات Business Logicحملات Man-in-the-middleبدافزار هاو Defacement ها خب WAF ها بطور کلی به سه گروه دسته بندی می شوند:اول Network-Based WAFs : این نوع از WAF ها بر روی شبکه محلی و تا جای ممکن نزدیک به برنامه نصب می شوند و اکثر آنها منطبق بر سخت افزار می باشند، به همین دلیل تاخیر بسیار کمی را در پردازش درخواست ها فراهم می کنند. اینگونه از WAF ها همراه با هزینه بالا خرید و نگهداری می باشند. دوم Host-Based WAFs : اینگونه از WAF ها اکثراً به عنوان ماژول هایی برای وب سرور ها به وجود آمده اند، و هزینه بسیار کمتری نسبت به Network-Based ها ارائه می دهند. هرچند نرم افزاری بودن این نوع از WAF ها به استفاده بیشتر از منابع سرور و کاهش کارایی منجر شود...سوم Cloud-Hosted WAFs : در این نوع از WAF ها، همان داشتن هزینه پایین و نیاز نداشتن به نگهداری محلی که درباره Host-Based ها بیان شد، مشاهده می شود، اما برخلاف آنها از منابع بسیار کمتری برای پیاده سازی و مدیریت استفاده می کند و در بیشتر موارد تنها به یک DNS و یا تغییر پروکسی برای راه اندازی و Redirect کردن ترافیک برنامه وب، به خود نیاز دارد.در نهایت می توان نتیجه گرفت که WAF ها نقشی اساسی در مدل امنیتی برنامه های وب ایفا می کنند که توسط Network Firewall ها قابل جبران نیست. البته لازم به ذکر است که WAF به هیچ عنوان جایگزینی برای Network Firewall ها نمی باشد، بلکه می توان گفت که مکمل یکدیگر می باشند و همواره پیشنهاد می شود که از هر دو آنها استفاده شود. نیاز به وجود WAF چه در راه حل های امنیتی شرکت های بزرگ و سازمان ها و چه در برنامه های وب کوچک و شخصی احساس شده و با توجه به افزایش سرسام آور آمار حملات به برنامه های وب در لایه هفتم، به نوعی ضرورت تبدیل شده است. و این مطلب ادامه دارد...با تشکر از شما!</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Wed, 10 Jun 2020 15:35:19 +0430</pubDate></item><item><title>NGINX PLUS</title><link>https://virgool.ir/@dev.stream/nginx-plus-putymelrfepl</link><description>نوشته شده توسط علی آخی و بردیا اکبریآشنایی با NGINX PLUS :به طور خلاصه میتوان گفت که nginx pluse نمونه ای مشتق شده از nginx است به طوری که خود وب سایت nginx در این مورد می گوید: If You Like NGINX, You&#39;ll Love NGINX Plus ابزار NGINX Plus یک load balancer بار نرم افزار ، web server و hidden content است که بر روی NGINX ساخته شده است. NGINX Plus دارای ویژگی های منحصر به فرد در سطح  سیستم و فراتر از بستر متن باز است ، که شامل session resilience ، پیکربندی از طریق API و بررسی active health  است. از NGINX Plus به جای load balancer سخت افزاری نیز می توانید استفاده کنید و بدون محدود کردن زیرساخت های خود ، آزادانه نوآوری خود را پیاده سازی کنید.همان طور که گفته شد nginx plus نمونه ای مشتق شده از nginx است اما چرا ؟!نکته قابل توجه این است که ابزار NGINX Plus  کاملاً توسط NGINX، Inc پشتیبانی می شود و طیف وسیعی از ویژگی های پیشرفته را ارائه می دهد.در این مقاله ما قرار است با قابلیت load balacing و یکسری مطالب دیگر که در این جا آن ها را اسپویل نمی کنیم، آشنا شویم. مزایای NGINX Plus :۱- مقرون به صرفه بودن: در مقایسه با ADC های سخت افزاری ، بیش از 80٪ صرفه جویی می کنید ، بدون اینکه عملکردی را قربانی کنید، همچنین NGINX Plus برای سازمان هایی که در حال حاضر از load balancer مبتنی بر سخت افزار استفاده می کنند ، مجموعه ی کاملی از ویژگی های ADC را در قالب یک فرم نرم افزاری بسیار انعطاف پذیرتر ، با هزینه ای مقرون به صرفه ارائه می دهد.۲- انعطاف پذیری: قابلیت استقرار در هر پلتفرمی از جمله:  private cloud ,public cloud ,ماشین مجازی, bare metal, در بحث docker و  container و...۳- عملکرد خودکار: با انجام کارهای مشترک از طریق API  ساخته شده در NGINX Plus  در وقت صرفه جویی کنید.۴- برای سیستم هایی که در حال حاضر از NGINX استفاده می کنند ، NGINX Plus پیچیدگی مدیریت یک زنجیره از فرآیند های به اصطلاح &#34;do-it-yourself&#34; از پروکسی ها، load balancer و سرورهای ذخیره را در یک محیط برنامه از بین می برد.۵- ابزار NGINX Plus برای سیستم هایی که نیاز به راه حلی برای تحویل ویدیوی HTTP با قابلیت مقیاس پذیری گسترده دارند ، از پشتیبانی پیشرفته ی ویدیویی برخوردار است.(این مورد در وب سرورها از اهمیت ویژه ای برخوردار است).آشنایی با قابلیت های NGINX Plus :Load Balancer  &amp; Load Balancingابتدا Load Balancer  &amp; Load Balancingبرای این که با قابلیت load balancing و load balancer  بهتر آشنا شویم باید نقش یک پلیس راهنمایی و رانندگی را متصور شد که وظیفه دارد تا ماشین ها را به مسیرهای باز و خلوت هدایت کند و ترافیک را در خیابان های منتهی به چهار راه متعادل سازد. کاری که آقای پلیس انجام می دهد را load balancing و خود پلیس را load balancer نامیم.خب حالا آقای پلیس یا همان load balancer برای هدایت ترافیک باید چکار کند؟البته موارد زیر بیشتر به load balancer شبکه اشاره دارد تا آقای پلیس!۱- تقاضای مشتری یا بار شبکه را به صورت کارآمد در چندین سرور توزیع کند.۲- با ارسال درخواست فقط به سرورهایی که آنلاین هستند ، در دسترس بودن و قابلیت اطمینان بالایی را تضمین کند.۳- انعطاف پذیری برای اضافه کردن یا کم کردن سرورها، به طریقی تقاضا را فراهم کند.لازم به ذکر است که الگوریتم های مختلفی برای load balancing وجود دارد و انتخاب روش load balancing به شما بستگی دارد.تعادل بار به توزیع موثر ترافیک شبکه ی ورودی به گروهی از سرور ها، که به عنوان server  pool (منبع سرور) نیز شناخته می شود، اشاره دارد. در مورد یک web-app ، درخواست های HTTP در میان سرورهای برنامه متعادل می شوند. وب سایت های جدید با ترافیک بالا باید به صدها هزار درخواست پاسخ بدهند و همچنین نیاز میلیون ها کاربر و مشتری را برطرف کنند, البته بخش عظیمی از این نیاز به صورت  متن ، تصویر ، فیلم یا داده های صحیح است که به روشی سریع و قابل اعتماد باید جابجا شوند.حجم این داده ها با تعداد سرورهای مورد نیاز برای جابجایی این دیتاها رابطه ی مستقیم دارد.خب این چالش چگونه باید مدیریت شود؟!آیا راه حل، اضافه کردن سرور های بیشتر است؟!!دو تعادل اصلی وجود دارد :یکی این است که با یک سرور واحد، تعداد بیشتری از کاربران را مدیریت کنید. حالت دوم افزونگی است - اگر سرور از کار بیفتد، دیگر سرور ها برای اطمینان از ماندن برنامه بصورت آنلاین، در دسترس هستند.مزایای load balancing :1-کاهش downtime2-مقیاس پذیری(Scalable)3-افزونگی(Redundancy)4-انعطاف پذیری5-بهره وری6-تعادل ترافیک سرور جهانیهر دو منبع آزاد NGINX و NGINX Plus می توانند ترافیک HTTP ، TCP و UDP را تعادل بخشند.گفتیم که NGINX Plus منبع بازی است که از NGINX مشتق شده است و شامل session persistence ،active health checks که با تنظیم مجدد و پویای مجموعه ی سرورها بدون راه اندازی مجدد سرورها، سبب گسترش سرور ها می شود.قبل از هر کار دیگری اول با  session persistence  و active health checks آشنا می شویم: به طور خلاصه session persistence منبع باز nginx pluse می تواند user sessions را شناسایی کرده و کلیه درخواست ها را در یک client session به همان سرور بالادست ارسال کند. این می تواند از خطاهای مهلکی جلوگیری کند که در این مقاله اصلا مورد بحث نیستند. در غیر اینصورت سرورهای برنامه، در حالت local ذخیره می شوند و load balancer  درخواستی را برای user sessions در حال پیشرفت، به یک سرور دیگر ارسال می کند. همچنین session persistence می تواند  وقتی برنامه ها اطلاعات را در یک کلاستر به اشتراک می گذارند عملکرد را بهبود بخشد.به طور خلاصه active health checks: در حقیقت  NGINX  بررسی های اساسی در مورد پاسخ های سرورهای بالادست را انجام می دهد و در صورت امکان ,درخواست های ناموفق را امتحان می کند. NGINX Plus به بررسی active health برنامه های کاربردی خارج از باند (همچنین به عنوان Artificial transactions نیز شناخته می شود) و یک شروع آرام برای اضافه کردن سرورهای جدید و بازیابی شده به گروه سرور های load balancing شده است.اگر کد وضعیت برگردانده شده &#34;سالم یا همان healthy&#34; باشد ، پیشخوان &#34;Successes&#34; را برای target  افزایش می دهد و تمام شمارنده های دیگر آن را پاک می کند.اگر نتواند اتصال برقرار کند ، پیشخوان &#34;TCP failures&#34; را برای target افزایش می دهد و پیشخوان &#34;Successes&#34; را پاک می کند.در صورت خاموش شدن ، پیشخوان &#34;timeout&#34; را برای target افزایش می دهد و پیشخوان &#34;Successes&#34; را پاک می کند.اگر کد وضعیت برگشتی به عنوان &#34;unhealthy&#34; تنظیم شده باشد ، پیشخوان &#34;خرابی های  HTTP&#34;  یا اصطلاحا &#34;HTTP failures&#34; را برای target افزایش می دهد و پیشخوان &#34;Successes&#34; را پاک می کند.در صورت خاموش شدن ، پیشخوان &#34;timeout&#34; را برای target افزایش می دهد و پیشخوان &#34;Successes&#34; را پاک می کند.اگر کد وضعیت برگشتی به عنوان &#34;unhealthy&#34; تنظیم شده باشد ، پیشخوان &#34;خرابی های  HTTP&#34;  یا اصطلاحا &#34;HTTP failures&#34; را برای target افزایش می دهد و پیشخوان &#34;Successes&#34; را پاک می کند.قبل از هر کار دیگری، اگر مدل شبکه OSI را برای همه لایه های شبکه می دانید ، شکل زیر را بررسی کنید.                خب حالا (HTTP Load Balancer(S (لایه ی 7) به عنوان یک پروکسی معمولی عمل می کند که اغلب بین یک روتر خارجی و سرویس های backend شما قرار می گیرد.شکل زیر ،  نمایش جریان برنامه برای یک L7-LB معمولی است که در آن  بسته A از روتر وارد می شود و توسط Load Balancer مونتاژ ، پردازش و دستکاری می شود.بخش  LB به دلیل Manipulation(دست کاری) های مختلفی که در داخل LB اتفاق می افتد بسته های شماره 1 تا N را نیز تولید می کند. بسته های اضافی می توانند برای تکمیل اطلاعات برای سرور backend ایجاد شوند ، یا این بسته ها می توانند در بسته های کوچک تر با  metadata غنی شده تقسیم شوند. L7-LB ها می توانند انواع مختلف Manipulation هایی مانند Manipulation HTTP header را انجام دهند.در مورد  HTTP load balancer NGINX :هنگام تعادل بار در ترافیک HTTP ، NGINX Plus هر اتصال HTTP را خاتمه می دهد و هر درخواست را بصورت جداگانه پردازش می کند.شما  این امکان را دارید که رمزگذاری SSL / TLS را حذف کنید ، درخواست را بازرسی و دستکاری کنید ، استفاده از محدودیت نرخ درخواست را صف کنید و سپس سیاست متعادل کردن بار را انتخاب کنید یا خود آن را تنظیم کنید! البته انجام پیکربندی درست و همچنین الگوریتمی که شما استفاده می کنید همه و همه به کاربرد شما بستگی دارد. مثلا هر شرکت یا سامانه ای بنا به نیازهای خود nginx  را کانفیگ می کند.اظهار نظر در مورد HTTP Load Balancer بیشتر نیاز به دانش عملی دارد!اما در مورد TCP Load Balancer NGINXتعادل بار TCP نوعی از load balancer هاست که از پروتکل کنترل و انتقال (TCP) استفاده می کند ، که در لایه ی 4 (لایه ی حمل و نقل) در مدل اتصال سیستم های باز (OSI) عمل می کند. ترافیک TCP در یک سطح متوسط ​​بین یک برنامه کاربردی و پروتکل اینترنت (IP) برقرار می شود. پیکربندی تعادل بار TCP ، یک جریان مطمئن و باخطا, از بسته ها را به آدرس های IP فراهم می کند ، که در غیر این صورت به راحتی از بین می روند یا خراب می شوند. به هر برنامه یک شماره پورت TCP منحصر به فرد اختصاص داده شده است تا بتواند برنامه صحیح را تحویل دهد تا health checks را انجام دهد.و این مطلب ادامه دارد...با سپاس فراوان از شما!</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Sat, 06 Jun 2020 02:26:41 +0430</pubDate></item><item><title>NGINX</title><link>https://virgool.ir/coderlife/nginx-fn0yft3ihbeh</link><description> نوشته شده توسط علی آخی و بردیا اکبریسلام و درود خدمت همه دوستان!در این مقاله ، ما سعی کرده ایم با اتکا به مطالعات و تجربیات خود در زمینهْ سرویس های NGINX و قابلیت های مختلف آ ن نقش هر چند کوچکی در زمینهٔ معرفی این ابزار فوق العاده داشته باشیم. همچنین امید واریم با انتشار این مقاله و سایر مطالبی که در زمینه ی ابزار های متن  باز که توسط ما یا سایر دوستان نوشته می شود، از جامعه نرم افزار آزاد  ایران حمایت کنید که در سایه ی این حمایت های شما بتوانیم به جایگاهی شایسته در دنیای تکنولوژی برسیم.خب خب! بریم سر بحث خودمون:خیلی هم داستان عجیب و غریبی نداره، مدتی بود در حال تحقیق روی وب سرور  های شرکت های مختلف  بودیم مثل: APACHE ,  LightSpeed  و حتی IIS اما  در این بین توجه ما به NGINX دوست داشتنی و خدماتش جلب شد و شیفته انعطاف پذیری و سایر ویژگی های آن شدیم و وقتی روی این موضوع دقیق تر شدیم با سایر قابلیت ها و ابزار های nginx آشنا شدیم و خواستیم شما را بیشتر با این قابلیت ها و ابزار ها آشنا کنیم. پس تصمیم به نوشتن این مطلب گرفتیم . اصلا NGINX چی هست؟!  از کجا اومده؟!ابزار  متن باز Nginx (البته بهتر است تلفط کنید Engine-x )نوعی وب سرور  open source یا منبع باز می باشد که البته می تواند به عنوان Reverse Proxy نیز استفاده گردد. پیدایش Nginx به سال 2002 برمیگردد که در آن زمان وب سرور ها بسیار کند بوده و معمولا در درخواست های بالا و پردازش های زیاد دچار مشکل بودند. اولین خط های Nginx توسط Igor Sysoev در سال ۲۰۰۲ نوشته شد و در سال ۲۰۰۴ به عرضه عمومی رسید. در جولای سال ۲۰۱۱ شرکت به نام Nginx, Inc در سان فرانسیسکو، کالیفرنیا تغییر شکل داد. این شرکت در واقع یک کمپانی information technology می باشد که نرم  افزار های وب سرور را تولید و ارائه می دهد.در مدت 13 سال گذشته بیش از 12 درصد از سهم وب سرور های دنیا را به خود اختصاص داده است.  بـر اساس بررسی های Netcraft در اگوست سال ۲۰۱۴، nginx به عنوان دومین وب سرور  پرطرفدار در سایت های فعال شناخته شد.به دلیل توانایی فوق العاده در مدیریت بسیاری از اتصالات و سرعت ، بسیاری از وب  سایت های پر ترافیک از خدمات NGINX استفاده کرده اند. برخی از این غول های آنلاین گوگل ، نتفلیکس ، ادوبی ،  Cloudflare ، WordPress.com و بسیاری دیگر هستند.راستی علت این سرعت چیست؟! به طور خلاصه! تازمانی که با قابلیت های nginx آشنا نشده اید درک پاسخ این سوال کمی دشوار است اما به زبان ساده می توان گفت که: سرورهای وب قدیمی برای هر درخواست یک موضوع connection ایجاد می کنند ، اما NGINX به این روش کار نمی کند. ابزار NGINX با معماری Asynchronous و رویداد محور اجرا می شود. این بدان معناست که موضوعات مشابه تحت یک فرآیند worker اداره می شوند و هر فرآیند worker شامل connectionهای کوچکتر به نام اتصالات worker است. این connection کل مسئولیت رسیدگی به موضوعات درخواست را بر عهده دارد. اتصالات worker درخواست ها را به یک فرآیند worker تحویل می دهد، که آن را به روند master ارسال می کند. سرانجام ، روند master نتیجه آن درخواست ها را ارائه می دهد.اگر کمی سردرگم شدید حق دارید، اما کلیت عملکرد nginx  در پاسخگویی به  هر درخوست این گونه است پس اصلا نگران نباشید.  ویژگی ها و قابلیت های nginx :در این مقاله ما می خواهیم با یکسری از ابزار های nginx آشنا شویم و همچنین قابلیت  های هر یک از این ابزار ها را بشناسیم و هر جا لازم شد یکسری تعاریف و مفاهیم پیش نیاز را بازگو کنیم پس اصلا دغدغه ی سرچ کردن در مورد کلی چیز عجیب را نداشته باشید.ابزار هایی که ما آن ها را بررسی خواهیم کرد شامل:NGINX PlusNGINX UnitLoad Balancer &amp; Load BalancingControllerNGINX WAFاین مطلب ادامه دارد...انتشار در روز های آتی (:</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Thu, 04 Jun 2020 00:08:46 +0430</pubDate></item><item><title>با هم شروع می کنیم!...</title><link>https://virgool.ir/@dev.stream/با-هم-شروع-می-کنیم-uy6c9pfjciow</link><description>سلام به همه دوستان عزیز ,امیدوارم حالتون خوب باشه(:اینجا قراره کلی کارای خفن و جذاب داشته باشیم و قراره کلی چیز به درد بخور و باحال از هم یاد بگیریم٪من علی, به کمک دوست خوبم بردیا قراره به کمک شما, چنتا مطلب جدید و کاربردی رو اینجا ارائه بدیم و شما هم با حمایتتون به ما انرژی و انگیزه بدین.مرسی از تک تک شما دوستان!</description><category>Dev Stream</category><author>Dev Stream</author><pubDate>Wed, 03 Jun 2020 23:30:49 +0430</pubDate></item></channel></rss>