<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های ریبوار حسین پوری</title>
        <link>https://virgool.io/feed/@rebwar</link>
        <description>برنامه نویس ASP.NET  |  عکاس منظره</description>
        <language>fa</language>
        <pubDate>2026-06-16 13:08:53</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/47781/avatar/f005Vh.png?height=120&amp;width=120</url>
            <title>ریبوار حسین پوری</title>
            <link>https://virgool.io/@rebwar</link>
        </image>

                    <item>
                <title>استفاده از Custom Validation در ASP.NET Core</title>
                <link>https://virgool.io/@rebwar/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-custom-validation-%D8%AF%D8%B1-aspnet-core-iu0zm4hvrqc6</link>
                <description>در ASP.NET بصورت پیش فرض یک سری از Data Annotation ها وجود دارند که کافیه اونا رو روی پراپرتی که قصد اعمال اون محدودیت رو دارین بزارین برای نمونه اجبار کاربر به وارد کردن یک مقدار داخل یک فیلد یا پراپرتی [Required] و نمونه های پیش فرض دیگر...اگر به جزئیات تمامی این Data Annotation ها دقت کنید از کلاسی به نام ValidationAttribute مشتق شده اندحال فرض کنید میخواهید یک سری Validation  اعمال کنید که داخل ASP.NET وجود ندارند، برای دستیابی به این امکان کافیه یه کلاسی داشته باشین که از ValidationAttribute ارث بری کرده باشد ، بزارید با یک مثال ادامه دهیم: میخواهیم  از ورود یک سری کاراکتر توسط کاربر هنگام وارد کردن نام کاربری جلوگیری کنیم ، پس یک مدل به نام Student میسازیم که شامل پراپرتی های زیر میباشد:سپس کلاسی ساخته و آنرا از ValidationAttribute مشتق میکنیم و متد IsValid را بازنویسی میکنیم،با توجه به  داده های ورودی کاربر که بصورت رشته میباشد در سازنده کلاس مقدار این رشته را میگیریم تا عملیات جستجو داخل آنرا به منظور یافتن کارکترهای غیرمجاز انجام دهیم و در صورت وجود هر کارکتر مقدار بازگشتی متد بصورت زیر میباشد :return new ValidationResult(errorMessage);و در صورتی که کاربر از کارکترهای مجاز استفاده کرده باشد خروجی متد بصورت زیر میباشد:return ValidationResult.Success;شکل نهایی کلاسدر آخر پراپرتی که قصد اعمال این Custom Validation را داریم مشخص میکنیم:[ExcludeChar(&amp;quot@#$%&amp;*&amp;quot,ErrorMessage =&amp;quotنمیتوانید از  کارکترهای @#$%&amp;*  استفاده کنید&amp;quot)]public string UserName { get; set; }در کل به کمک استفاده از این امکان میتوان در سمت سرور محدودیتهای مختلفی بسته به سناریوی موجود روی مدلهای خود اعمال نمائید.کدهای استفاده شده: rebwar/CustomDataAnnotaion(github.com) </description>
                <category>ریبوار حسین پوری</category>
                <author>ریبوار حسین پوری</author>
                <pubDate>Sun, 08 Aug 2021 22:35:43 +0430</pubDate>
            </item>
                    <item>
                <title>ایجاد یک Custom Password Validator در ASP.NET Core</title>
                <link>https://virgool.io/@rebwar/%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%DB%8C%DA%A9-custom-password-validator-%D8%AF%D8%B1-aspnet-core-ugj0rb1oniso</link>
                <description>به همراه عرضه  Net Framework. وجود یکی از سیستم های قوی Identity همواره جزئی جدایی ناپذیر از ASP.NET بوده و با انتشار نسخه Core تغییرات ارزشمندی همچون استفاده از Claim ها ، شخصی سازی Entity های مربوط به کاربران و... را شاهد بودیم ، در این مقاله با چگونگی تنظیمات پایه مربوط به Identity و همچنین ایجاد کلاسی جهت اعمال قوانین سفارشی مربوط به Password ‌آشنا میشویم.قبل از هر چیز جهت استفاده از Identity باید کلاسی داشته باشیم که بتوان آنرا بعنوان  User Entity  در نظر بگیریم که این کلاس از کلاس IdentityUser ارث بری کرده باشد به همین منظور یک پراپرتی TwitterId هم جهت دیدن تغییرات به آن اضافه میکنیمبا اینکار جدول AspNetUsers شامل یک فیلد اضافی برابر TwitterId خواهد بودسپس به کلاس Startup رفته و کدهای زیر را به متد ConfigureServices اضافه میکنیم:همانطور که مشخص است لیست محدودیت هایی که میتوانیم روی Password اعمال کنیم محدود است و اگر به تنظیمات دیگری نیاز داشته باشیم بایستی یک کلاس جدا ایجاد کرده و تنظیمات لازم را در آن کلاس انجام دهیم، برای مثال در این کلاس مشخص میکنیم در صورتی که پسورد وارد شده شامل یوزر نیم کاربر باشد پیغام خطائی به کاربر نشان داده شود:در نهایت جهت استفاده از کلاس باید آنرا بعنوان سرویس رجیستر کنیم :همانطور که میدانید سناریوهای متعددی با استفاده از این روش قابل پیاده سازی هست و دیگر محدود به استفاده از کانفیگ های پیش فرض Password Identity نیستیم .مشکلی که این روش استفاده دارد ، تنظیمات کلاس ساخته شده را جایگزین تنظیمات پیش فرض سیستم میکند و آنها را در نظر نمیگیرد برای رفع این مشکل به جای پیاده سازی اینترفیس IPasswordValidator میتوان از کلاس PasswordValidator  ارث بری کردسورس های به کار رفته از طریق ریپازیتوری زیر در دسترس خواهد بود: https://github.com/rebwar/ASP.NET-Core-Identity-Samples </description>
                <category>ریبوار حسین پوری</category>
                <author>ریبوار حسین پوری</author>
                <pubDate>Tue, 27 Oct 2020 16:25:53 +0330</pubDate>
            </item>
                    <item>
                <title>آشنایی با Garbage Collector در سی شارپ و چگونگی کارکرد آن، قسمت سوم</title>
                <link>https://virgool.io/@rebwar/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-garbage-collector-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-%D9%88-%DA%86%DA%AF%D9%88%D9%86%DA%AF%DB%8C-%DA%A9%D8%A7%D8%B1%DA%A9%D8%B1%D8%AF-%D8%A2%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-esq4qzd2qa6r</link>
                <description>همانطور که در اینجا و اینجا توضیح دادم،Garbage Collector بعنوان بخشی از وظایف CLR مدیریت اتوماتیک حافظه را بر عهده دارد،استفاده از GC فواید زیادی دارد از جمله:برنامه نویس را از درگیر شدن با مدیریت حافظه در امان نگه میدارد! و میتواند با خیال راحت به توسعه نرم افزار بپردازدعملیات اختصاص اشیاء به Heap بسیار کارآمدتر میشود و از لحاظ پرفرمنسی بسیار به صرفه استبازپس گیری اشیاء غیر استفاده ، پاکسازی حافظه و حفظ حافظه در دسترس جهت تخصیص آن در آینده تامین امنیت حافظه با مطمئن شدن از اینکه آبجکت ها نتوانند محتوای یکدیگر را مورد استفاده قرار دهند در ادامه توضیح مقدماتی از حافظه و مفاهیم آنرا ذکر میکنملیست زیر خلاصه ای از مفاهیم مهم در مورد حافظه ست:هر پراسسی فضای حافظه مجازی(Virtual Memory Space) مختص به خود دارد و تمامی پراسس های روی یک کامپیوتر فضای حافظه فیزیکی و Page File(حافظه مجازی) را با یکدیگر به اشتراک میگذارنددر سیستم های 32 بیتی بصورت پیش فرض هر پراسس 2GB  از فضای آدرس مجازی داردیک دولوپر تنها با فضای آدرس مجازی کار میکند و هرگز مستقیما نمیتواند حافظه فیزیکی را دستکاری کند،GC بصورت پیش فرض وظیفه پاکسازی و اختصاص حافظه مجازی را برعهده دارد، مگر اینکه برنامه نویس کدهای مختص سیستم عامل را بنویسد(با زبانی مثل C++) که در این صورت فانکشنهای ویندوز را برای مدیریت حافظه بکار میگیرد و اینجا خبری از CLR نیست.حافظه مجازی میتواند سه وضعیت مختلف داشته باشد:1- آزاد باشد،حافظه برای اختصاص به اشیاء مهیاست و هیچ بلاکی رفرنسی به حافظه ندارد(خالیست)2- رزرو شده، بلاکی از حافظه در دسترس است و استفاده از این بلاک برای درخواست های اشیاء دیگر غیر قابل استفاده است، اگر چه هنوز امکان نوشتن در آن وجود ندارد3- اختصاص یافته،بلاکی از حافظه به حافظه فیزیکی اختصاص یافته استآدرسهای حافظه مجازی میتوانند تکه تکه شوند ،  بلاک های آزادی در آن وجود دارند که از آنها به گودال یاد میشود، هنگامی که در خواست اختصاص حافظه روی میدهد ، مدیریت حافظه مجازی سعی در یافتن تک بلاک آزادی میگردد که اط لحاظ اندازه به قدری بزرگ باشد که بتواند آنجا قرار گیرد ، در صورت درخواست فضائی برابر 2GB ،حتی اگر این مقدار از فضای آزاد داشته باشیم تا وقتی که تک بلاکی با این سایز وجود نداشته باشد عملیات اختصاص حافظه صورت نمیگیرد.شرایط استفاده از Garbage Collectorعملیات GC وقتی اتفاق می افتد که یکی از شرایط زیر وجود داشته باشد:سیستم با کمبود حافظه فیزیکی مواجه شود، که توسط سیستم عامل تشخیص داده شده باشدحافظه ای که توسط آبجکت مورد استفاده قرار گرفته از آستانه قابل قبولش فراتر رودمتد GC.Collect فراخوانی شود، تقریبا در تمامی موارد نیازی به صدا زدن این متد نیست ، چون GC  بصورت مکرر اجرا میشود، این متد تنها برای مواردی که خیلی ضروری باشد و یا هنگام تست حافظه بایستی اجرا شود و در استفاده از آن بایستی احتیاط کرد.</description>
                <category>ریبوار حسین پوری</category>
                <author>ریبوار حسین پوری</author>
                <pubDate>Wed, 01 Apr 2020 01:36:45 +0430</pubDate>
            </item>
                    <item>
                <title>ساختن صفحه شخصی در گیتهاب و اتصال دامنه به آن</title>
                <link>https://virgool.io/@rebwar/%D8%B3%D8%A7%D8%AE%D8%AA%D9%86-%D8%B5%D9%81%D8%AD%D9%87-%D8%B4%D8%AE%D8%B5%DB%8C-%D8%AF%D8%B1-%DA%AF%DB%8C%D8%AA-%D9%87%D8%A7%D8%A8-%D9%88-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%AF%D8%A7%D9%85%D9%86%D9%87-%D8%A8%D9%87-%D8%A2%D9%86-bwxlqgjojenz</link>
                <description>یکی از کارهایی که میتوانید تو گیت هاب انجام بدید ، ساختن یک صفحه(پروژه،رزومه و...) غیر تجاریست برای انجام اینکار یک ریپازیتوری جدید بسازید و نام آنرا برابر مقدار YourUserName.github.io قرار دهید، سپس تمپلیت یا پروژه خودتون رو به ریپازیتوری اضافه کنید.میتونید از این لینک برای دانلود تمپلیت های رایگان استفاده کنیدبا انجام اینکار یک صفحه شخصی در گیت هاب دارید که با آدرس YourUserName.github.io در دسترس می باشد.اتصال دامنه به گیت هاباگر از دامنه .ir  استفاده میکنید برای ست کردن دامنه و تغییر DNS های خود به لطف کنترل پنل قوی ایرنیک! نمیتوانید مستقیم اینکار رو انجام دهید(هر چند اگر دامنه ای غیر از ir هم دارید باز از این سرویس عالی استفاده کنید) و بایستی از سرویس هایی مثل Cloudflare استفاده کنید:اگر قبلا اکانت ندارید یک حساب کاربری برای خود بسازید و بعد از تایید ایمیل صفحه ای برایتان باز میشود که میتوانید نام سایت تان را وارد کرده و Add Site را کلیک کنیددر صورتیکه سایت Cloudflare قادر به یافتن سایت باشد و در دسترس باشد وارد صفحه ای میشود که DNS های پیشنهادیتان را برایتان نمایش میدهد، در صورتیکه اینکار انجام نشد با کلیک بر روی آیکون کاربری و انتخاب Account Name ، از صفحه نشان داده شده بر روی سایت مورد نظر کلیک کنیدسپس از صفحه باز شده ServerName های پیشنهادی cloudflare را کپی کرده و آنها را در قسمت تغییر کارگزار سایت ایرنیک وارد نمائید، مدت زمانی از چند دقیقه تا چند ساعت!! طول میکشد که اطلاعات کارگزار جدید در سایت اعمال و آپدیت شوند. پس از آپدیت شدن نام کارگزارهای جدید به CloudFlare برگشته و در قسمت DNS ، اطلاعات مربوط به هر رکورد را اضافه کنیدآی پی های مورد استفاده GitHub در این لینک موجودهدر مرحله آخر به Github رفته و بعد از انتخاب ریپازیتوری خود در قسمت Custom Domain دامنه خود را وارد کرده و روی Save کلیک کنید.امیدوارم براتون مفید بوده باشه</description>
                <category>ریبوار حسین پوری</category>
                <author>ریبوار حسین پوری</author>
                <pubDate>Tue, 31 Mar 2020 19:17:41 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با Garbage Collector در سی شارپ و چگونگی کارکرد آن، قسمت دوم</title>
                <link>https://virgool.io/@rebwar/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-garbage-collector-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-%D9%88-%DA%86%DA%AF%D9%88%D9%86%DA%AF%DB%8C-%DA%A9%D8%A7%D8%B1%DA%A9%D8%B1%D8%AF-%D8%A2%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-qmizogfmwnhk</link>
                <description>همانطور که در قسمت قبل توضیح دادم Garbage Collector  ابزاریست! که توسط CLR برای آزاد سازی حافظه  بلا استفاده اشیاء بکار گرفته میشود و ما را از انجام اینکار بصورت دستی بی نیاز میکند!هنگامی که یک شی(Reference Type) در سی شارپ ساخته میشود ، قسمتی از حافظه بنام Heap به آن اختصاص پیدا میکند ، مدیریت Heap تماما توسط CLR انجام میشود(اختصاص حافظه و باز پس گیری آن). صحبت از حافظه که میشود همتراز محدود بودن آن است و با توجه به این محدودیت ، بایستی اشیائی که بلا استفاده هستند از حافظه پاک شده و CLR برای اشیاء جدید حافظه اختصاص دهد.Heap Generationحافظه Heap به سه گروه بنام Generation 0,1,2 تقسیم میشود، CLR با استفاده از GC با این سه گروه برخورد میکند و آنها را مدیریت میکند.Generation 0 مکانیست که تمامی آشیاء جدید در آن نگه داری میشوند و به محض ساختن یک شی جدید درون این بخش قرار میگیرد و بعنوان اشیاء با طول عمر کوتاه شناخته میشونداما Generation 1  مکانیست شبیه بافر برای اشیائی که طول عمرشان کوتاه است  با اشیائی که طول عمر بالاتری دارند.و اما در نهایت اشیاء با طول عمر بالاتر در قسمت Generation 2 نگه داری میشوند، که شامل اشیاء استاتیک و متغیرهای با اسکوپ Global  میشود.همچنین هر شی با سایز بزرگتر از 85000 بایت در این قسمت قرار میگیرد.Garbage Collection بصورت مکرر روی قسمت اول حافظه Heap انجام میشود، جائی که اشیاء با طول عمر پایین در آن ذخیره شده اند، وقتی که یکی از این اشیاء مدت زمان زیادی مورد استفاده قرار گیرند ، آنرا به Generation1 انتقال میدهد که آنها را نجات یافتگان مینامیم!موقعی که GC  به generation 1  رسید تمامی اشیاء مورد استفاده آنجا را به G2 انتقال میدهد و این اشیاء تا اتمام  زمان اجرای برنامه آنجا باقی میمانندچگونگی اطلاع از آبجکتهای مورد استفاده توسط GCوقتیکه GC شروع بکار میکند تمامی Thread ها  بجز ترد ی که GC را احضار کرده ، معلق میشوند و GC شروع به اسکن Generation 0 از اشیاء بلا استفاده میکند و ساختاری از اشیاء مورد استفاده را برای خود میسازد، هر آبجکتی که در این ساختار وجود نداشته باشد را بعنوان یک شی بلا استفاده در برنامه میشناسد و حافظه اختصاص داده شده از آن پس میگیرد و حافظه را مجددا برای اشیاء جدید قابل استفاده میکند.در انتهای این پروسه GC وظیفه اختصاص آدرسهای حافظه از اشیاء حذف شده به اشیاء مورد استفاده را بر عهده دارد و با انجام اینکار حافظه برای استفاده اشیاء جدید جمع و جورتر میشودقسمت سوم</description>
                <category>ریبوار حسین پوری</category>
                <author>ریبوار حسین پوری</author>
                <pubDate>Sun, 29 Mar 2020 13:46:40 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با Garbage Collector در سی شارپ و چگونگی کارکرد آن، قسمت اول</title>
                <link>https://virgool.io/@rebwar/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-garbage-collector-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-%D9%88-%DA%86%DA%AF%D9%88%D9%86%DA%AF%DB%8C-%DA%A9%D8%A7%D8%B1%DA%A9%D8%B1%D8%AF-%D8%A2%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-fdldxqknjbw2</link>
                <description>garbage Collector چیست؟در یک تعریف عامیانه میتوان گفت Garbage Collector  که از این پس آنرا با GC میشناسیم ، راهیست برای پس گرفتن حافظه از اشیائی که در حال حاضر در برنامه مان بلا استفاده هستند، اما جدا از این تعریف اجازه دهید کمی وارد ساختار ذخیره داده ها در حافظه شویم و در مقاله ای دیگر تعریف GC را بازتر کنیم .از لحاظ تقسیم بندی زبانهای برنامه نویسی در لول پایین دو نوع را میتوان نام برد:-Unmanaged-Managedزبانهای مدیریت نشده ! زبانهایی هستند که برنامه نویس بصورت دیتیل جدا از بحث بیزینس بایستی درگیر مدیریت بزرگترین چالش پروژه های نرم افزاری یعنی حافظه باشد ، پس بیشتر این زبانها برای کارهایی همچون بازی سازی،توسعه سیستم عامل و ... مورد استفاده قرار میگیرند، مدیریت حافظه ها بصورت دستی توسط برنامه نویس انجام می شود(برنامه نویس موظف به کنترل نشت های حافظه ای ، مدیریت حافظه ها و... میباشد)در سوی دیگر زبانهای مدیریت شده همچون جاوا و سی شارپ رو داریم که هر کدام به لطف عملکردهایی که داخل هسته این زبانها (در مورد سی شارپ CLR ) وجود دارد تا حد زیادی مدیریت حافظه را بر عهده میگیرند و برنامه نویس را درگیر جزئیات نمیکنند.Heap و Stackدر سی شارپ با توجه به وجود دو نوع داده Value Type و Reference Type ، هر کدام از آنها موقع استفاده در قسمتی از حافظه قرار میگیرند برای Value Type ها این قسمت از حافظه Stack است ، ورود و خروج از Stack بصورت LIFO می باشد .محل قرار گیری انواع مقادیر مختلف در Stack و Heapدر مورد Reference Type ها قسمتی از حافظه که این نوع اشیا در آن قرار میگیرند Heap میباشد و برعکس Stack داده ها بصورت کاملا تصادفی  درون آن قرار میگیرند و  ترتیب و توالی منظمی مثل Stack را ندارد . طول عمر اشیاء: طول عمر انوع Value Type   مختص به پایان اجرای یک متد می باشد و با پایان پذیرفتن متد ، اشیا بصورت اتوماتیک از حافظه حذف میشوند.در مورد Reference Type ها، با توجه به نگهداری در Heap،  طول عمر اشیا داخل آن منوط به یک متد یا ریجین خاصی نیست  و تا اتمام اجرای برنامه در صورت حذف نکردن دستی درون آن نگه داشته میشوند، اینجاست که  Garbage Collector وارد صحنه شده و اشیا غیر قابل استفاده را از حافظه حذف میکند و برنامه نویس را از درگیر کردن در مورد جزئیات حافظه بی نیاز میکند هر چند با توجه به اکثر پروژه های نرم افزاری که با این زبانها انجام میشوند(پروژه های بیزنسی) ، شناسایی موارد نشتی حافظه و کنترل این نوع حافظه ها بایستی با دقت انجام گردد تا بتوان از سربارهای حافظه ای در طول کارکرد پروژه جلوگیری کرد.قسمت دوم این نوشته</description>
                <category>ریبوار حسین پوری</category>
                <author>ریبوار حسین پوری</author>
                <pubDate>Sun, 29 Mar 2020 12:13:39 +0430</pubDate>
            </item>
                    <item>
                <title>مروری بر کالکشن ها در سی شارپ</title>
                <link>https://virgool.io/@rebwar/collection-in-csharp-yytxoqmurfb6</link>
                <description>سلسله مراتب فضای نام کالکشن ها در سی شارپقسمت اول: استفاده از Listبرای اکثر پروژه های نرم افزاری لازمه که گروهی از آبجکت های مرتبط با هم بسازیم و یا آنها را مدیریت کنیم، دو راهکار پیش رو داریم:استفاده از آرایه هابکارگیری کالکشن ها آرایه ها انتخاب خوبی برای ساختن و کار با تعداد ثابتی از آبجکت هاست اما در روی دیگر قضیه کالکشن ها هستند که در کار با گروهی از آبجکت ها بسیار منعطفتر از آرایه ها هستند ، یکی از بزرگترین حسن آنها هنگامی که به تغییرات در پروژه نیاز است، تغییر سایز داینامیکی آنهاست. برخی از کالکشن ها به لطف Key Value بودن کافیه از کلید برای واکشی سریع داده آن استفاده نمود(پرفرمنس بالاتر).یک کالکشن در واقع کلاسی ست که برای استفاده از آن بایستی یک instance از آن ساخته شوداگر کالکشن تنها شامل عناصر یک نوع داده باشد میتوان از یکی از کلاسهای موجود در فضای نام System.Collections.Generic استفاده کرد، با توجه به Type Safetyبودن جنریک ها ، تضمین میکند تنها داده های مربوط به آن مورد استفاده قرار گیرند، موقع واکشی عناصر جنریک لازم نیست نوع آن ذکر شود و عملیات تبدیل نوع صورت نمیگیرد(در حالت عادی نیاز به عمل Boxing و UnBoxing میباشد که این پروسه در جنریکها حذف شده و لازم به اینکار نیست ، پس میتوان گفت جنریک ها از لحاظ پرفرمنسی انتخاب خوبی برای کار با داده ها هستند)استفاده از یک کالکشن ساده:مثال زیر از جنریک کلاس List&lt;T&gt; استفاده کرده که به ما امکان کار کردن با لیستی از اشیا Strongly Type را میدهد و همانطور که پیداست برای پیمایش آیتم های درون آن از یک حلقه foreach استفاده شدهساخت یک لیست، افزودن آیتم جدید و پیمایش اعضای آن توسط foreachبجای استفاده از حلقه foreach میتوان پیمایش را با یک حلقه for انجام داد ، که برای دسترسی به ایتم های درون لیست از موقعیت هر آیتم استفاده میکنیم و مانند دیگر موارد سی شارپ آیتم اول با شماره 0 شروع میشود .ساخت یک لیست، افزودن آیتم جدید و پیمایش اعضای آن توسط for جهت حذف یک آیتم از دو تابع پرکاربرد Remove(کافیه آیتم رو به آن پاس دهیم) و RemoveAt(بعنوان ورودی index اون آیتمی که میخوایم حذفش کنیم رو میگیره)حذف اعداد فرد از لیست تا حالا با انواعی که در سی شارپ موجود بودند مثالها رو بررسی کردیم ، میتوان انواع ساخته شده توسط خودمان(برای مثال کلاس) را هم بعنوان عناصر لیست در نظر بگیریم، مثال پایین لیستی از کلاس دانشجویان را نشان میدهدلیستی از دانشجویاننکته:هنگام ساخت لیست اگر ظرفیت آنرا مشخص نکرده باشیم بصورت پیش فرض 4 آیتم را در نظر میگیرد و به محض اینکه آیتم پنجم را به لیست اضافه کردیم این مقدار به 8 و همینطور بصورت تصاعدی افزایش میابد و در پروژه های بزرگ میتواند ما را با کمبود حافظه مواجه کند، پس بهتر است در صورت دانستن آن حتما ظرفیت قید شود(یک کانستراکتور دارد که ظرفیت را میگیرد و هم یک پراپرتی برای مشخص کردن ظرفیت یا Capacity آن)  ، در غیر اینصورت میتوان با دستور TrimExcess حافظه بلا استفاده را آزاد کرد </description>
                <category>ریبوار حسین پوری</category>
                <author>ریبوار حسین پوری</author>
                <pubDate>Tue, 10 Mar 2020 19:21:50 +0330</pubDate>
            </item>
                    <item>
                <title>عکاسی از کهکشان راه شیری ، بخش دوم</title>
                <link>https://virgool.io/@rebwar/%D8%B9%DA%A9%D8%A7%D8%B3%DB%8C-%D8%A7%D8%B2-%DA%A9%D9%87%DA%A9%D8%B4%D8%A7%D9%86-%D8%B1%D8%A7%D9%87-%D8%B4%DB%8C%D8%B1%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85-vkfm4dzljr4f</link>
                <description> در مطلب قبل  مسائل پایه ای و تجهیزات مورد استفاده جهت عکاسی شب و راه شیری رو براتون شرح دادم، در مطلبی که پیش رو دارید موضوع را بیشتر باز میکنم و در مورد جزئیات ثبت کهکشان راه شیری و یک منظره در شب حرف میزنم. شکوه راه شیری بر فراز دریاچه ارومیه و کاظم داشی(Nikon D800, Tamron 15-30  , iso 6400 , F2.8 , 20Sec ,15mm)   همیشه سعی کنید وقتتان را جوری بچینید که قبل از غروب آفتاب سر لوکیشن باشید و در این مدت ترکیب های مختلف را تست کنید ، و با توجه به محل ثبت خود کمپتان را برپا کنید .امیر شاهچراغیان از عکاسهای بسیار خوب آسمان شب مقاله ای در مورد کمپینگ و برپایی چادر داره که خوندنش رو شدیدا بهتون پیشنهاد میکنمراهنمای خرید و اصول برپایی چادر به لطف وجود اپلیکیشنهایی که در بخش قبل توضیح دادم موقعیت دقیق کهکشان را میتوانید پیدا کنید و با توجه به قرارگیری آن ، پیش زمینه خوب و یک ترکیب خوب را جهت ثبت شبانه داشته باشید . جدا از بحث ترکیب بندی و پیدا کردن یک پیش زمینه خوب بایستی نقطه فوکوس بی نهایت لنزتان را بدانید در صورتیکه اگر قصد انجام آنرا در شب دارید با چالش بزرگی روبرو هستید(هر چند روش انجام فوکوس در شب رو توضییح میدم)  نکته : از وجود حداکثر شارژ باتری دوربین تان مطمئن باشید و اسلات رم دوربینتان را چک کنید تا با یک دوربین خالی از حافظه روبرو نشید(چند ماه قبل یک فضانورد ناسا که میخواست با دوربین گوپرو از ماموریتش فیلم بگیرد متوجه شد که دوربینش فاقد حافظه است!!)شب فرا رسیده و شما تمام کارهای ممکن برای یک خروجی خوب رو انجام دادید و منتظرید که تاریکی حکمفرا شود!(تنها جائی که همیشه آرزوی یک شب تاریک را میکنید طبیعت شب است و بس. به قول یکی از دوستان هیچوقت انتظار نداشتم که آنقدر آرزوی یک شب بدون ماه کنم)بعد از طلوع راه شیری پشت فرمان دوربینتان هستید و میخواهید دکمه شاتر را فشار دهید ، اندکی صبر کنید تا موارد زیر رو با هم انجام بدیمتنظیم دوربین جهت عکاسی از راه شیری ( شات تست )دوربین را در مود دستی بگذاریدنوع خروجی عکستان را RAW یا خام انتخاب کنید تا دستتان در قسمت ویرایش و پردازش عکس بازتر باشد( به هیچوجه در عکاسی شب از نوع JPEG استفاده نکنید )ایزو را روی بیشترین عدد بگذاریدوایت بالانس را روی یکی از حالت های زیر بسته به شرایط نوری قرار دهید(میزان آلودگی نوری ، نوع پیش زمینه و …)راحترین کار سپردن اینکار به دوربینتان است ، آنرا روی مود اتوماتیک بگذاریدآنرا روی کلوین بگذارید و از عدد 3900 شروع کنید(پیشنهاد من)روی حالت تنگستن بگذاریدپیشنهاد میکنم حالت long exposure noise reduction را غیر فعال کنید تا هم عملیات پردازش عکس توسط دوربین و هم ذخیره آن روی حافظه سریعتر انجام شودفوکوس را در حالت دستی بگذارید و در صورتیکه نشانه بی نهایت روی لنزتان وجود دارد آنرا روی بی نهایت بگذارید، اما در صورتیکه روی لنز این نشانه وجود ندارد به قسمت فوکوس کردن در تاریکی مراجعه کنیدلنز را در وایدترین حالت خود قرار دهید تا هم از خطی شدن ستاره هنگام چرخش زمین جلوگیری کنید(هر چقدر لنزتان وایدتر باشد میتوانید از زمان نوردهی طولانی تری استفاده کنید) و هم نمای کاملتریی از کهکشان را در عکستان داشته باشدمدت زمان نورسنجی را روی عدد 10 ثانیه بگذارید(با تست کردن این عدد میتوانیم خروجی سریعی را با توجه به اندازه ایزو داشته باشیم و در مورد نوع ایزو و مدت زمان نور دهی تصمیم بگیریم)نکته : بحثی که در عکاسی از کهکشان راه شیری مهم است عدم خطی شدن ستاره ها با توجه به چرخش زمین می باشد و برای این مورد بسته به بدنه و لنز و اندازه اپرچر لنز از قانون 500 و یا از این ابزار استفاده کنید) قانون 500 :حداکثر میزان نورسنجی جهت جلوگیری از خطی شدن =500 تقسیم بر فوکال لنز (برای فول فریم) فوکوس در شب و تاریکی:همانطور که در بالا گفتم اگر لنزتان حالت بینهایت ندارد بایستی این نقطه را پیدا کنید :سه پایه تان را تراز کنیددوربین را روی لایو ویو بگذاریدروی یکی از ستاره های پر نور زوم کنید و در صورتیکه دوربین تونست فوکوس را درست انجام دهد به مرحله 5 بروید در غیر اینصورت موارد زیر رو انجام بدید.به یکی از دوستانتان بگویید که در فاصله حداقل 30 متری شما قرار بگیرید و چراغ قوه را روبروی خود بگیردروی دوستتان زوم کنید(منظور زوم دوربین است نه زوم روی لنز)در حالی که شاتر را تا نیمه فشار داده اید و دوربین فوکوس را درست انجام داده با دست دیگرتان مود فوکوس لنزتان را روی دستی بگذارید(میتوانید از قفل فوکوس روی دوربینتان هم برای این مورد استفاده کنید)با این روش تونستید فوکوس بی نهایت لنزتان را پیدا کنیدبعد از انجام موارد بالا حالا شما یک شات تست دارید که براساس آن میتوانید نورسنجی دوربینتان را انجام دهید ، هر بار ایزو را یک استاپ کمتر و میزان نور سنجی را چند ثانیه بیشتر کنید(حداکثر میزان نورسنجی را با توجه به قانون 500 انجام دهید)نکته :هر دوربینی عملکرد متفاوتی در ایزوی بالا از خود نشان میدهد همیشه ایزوی بالا مساوی نویز بیشتر نیست(این مورد را در مقاله ای مفصل شرح میدم) ، پس با توجه به نوع دوربین و عملکرد نویزی آن سعی کنید بجای استفاده از ایزوهای خیلی پایین از ایزوهای بالای 2500 استفاده کنید و بسته به نوع دوربین آنرا حتی تا مقادیر 10000 ! افزایش دهید(چه میکنه این سونی و نیکون D850 !) و از ترکیب چند شات و ادغام آنها در مرحله پردازش به جای یک شات با ایزوی پایین استفاده کنید( این مورد را هم سعی میکنم در مقاله براتون بزارم)پردازش عکس :مراحلی را که در در موردشون حرف زدم اصول و کمی هم تجربه شخصی برای ثبت عکس نجومی و کهکشان راه شیری بودن ، اما یکی از مهمترین مراحل پس از ثبت عکس مرحله پردازش آن می باشد ، عکسی که ثبت کردید یک عکس خام و  فاقد جزئیات می باشد و بایستی در مرحله پردازش جزئیات و زیبایی های آنرا بیرون بکشید به صورتیکه یک پردازش درست انجام داده و از پردازش تخریبی عکس جلوگیری کنید،خروجی دوربین بدون ویرایشخروجی نهایی پس از اعمال ویرایش</description>
                <category>ریبوار حسین پوری</category>
                <author>ریبوار حسین پوری</author>
                <pubDate>Sun, 19 May 2019 12:16:22 +0430</pubDate>
            </item>
                    <item>
                <title>عکاسی از کهکشان راه شیری ، بخش اول</title>
                <link>https://virgool.io/@rebwar/%D8%B9%DA%A9%D8%A7%D8%B3%DB%8C-%D8%A7%D8%B2-%DA%A9%D9%87%DA%A9%D8%B4%D8%A7%D9%86-%D8%B1%D8%A7%D9%87-%D8%B4%DB%8C%D8%B1%DB%8C-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-jflfjzffkhzx</link>
                <description> یکی از ژانرهای عکاسی منظره، عکاسی شب و ثبت کهکشان راه شیری می باشد، امروزه به لطف پیشرفتهای دوربین دیجیتال و قدرت سنسور این دوربینها ثبت این عکسها خیلی راحت شده است و حتی با ساده ترین دوربینهای دیجیتال میتوان عکسهای قابل قبولی از شب ثبت کرد،در این مقاله هدف از عکاسی شب ثبت کهکشان راه شیری می باشد و راههای دیگری شامل رد ستارگان یا عکاسی از عمق آسمان شب مدنظر نمی باشدشاید برای شما هم اتفاق افتاده باشد که در یک شب تاریک محو زیبایی آسمان شب شده باشید و برای لحظه ای آرزوی به اشتراک گذاری این همه زیبایی را با دوستانتان داشته باشید ، این مقاله برای شماست تا از یک ثبت ساده به یک ثبت عالی برسید.کهکشان راه شیری بر فراز ارتفاعات ارومیه   تجهیزات:همانطور که در بالا ذکر شد امروزه جهت ثبت زیبایی های آسمان شب و کهکشان راه شیری نیازی به خرید تجهیزات گرانقیمت ندارید در زیر لیست تجهیزات مورد نیاز برای اینکار را ذکر میکنمدوربین دیجیتال با قابلیت کنترل دستی تنظیمات(شامل ایزو ، اپرچر،مدت زمان نوردهی و …)یک لنز سریع، ترجیحا لنزی با گشادگی دیافراگم ۲٫۸ و پایین تر(هر چند با لنزهای عادی هم به نتایج قابل قبولی میرسید)سه پایه(مهمترین وسیله جهت ثبت آسمان شب یه سه پایه ی محکم می باشد)چراغ پیشانی (اختیاری)ریموت کنترل (اختیاری)استفاده از اپلیکیشن های مرتبط(اختیاری)و مهمتر از همه یه شب تاریک و بدور از آلودگی نوریدوربین دیجیتال :استفاده از واژه دیجیتال به دلیل تعدد دوربینهایی که از سنسورهای حساس به نور در مقابل فیلم استفاده میکنند اطلاق میشود و امروزه اکثر دوربینهای موجود در بازار از این نوع هستنددو گروه از این دوربینها در بازار وجود دارددوربین های کراپ فاکتور یا APS-Cفول فریم این تقسیم بندی به اندازه سنسور این دوربین ها اشاره دارد و هر چه اندازه سنسور در دوربین بزرگتر باشد دوربین از داینامیک رنج بیشتر و عکسهای با کیفیت تر و نویز کمتری برخوردار است(بحث در اینباره خارج از حوصله این مقاله می باشد) . این دو گروه بندی به دو زیرگروه بدون آینه ها و آینه دارها تقسیم میشوند.استفاده از کدام نوع از این دوربین ها به بودجه شما و نیاز شما برمیگردد(برای مثال اگر تنها میخواهید عکسهای ثبت شده تان را در شبکه های اجتماعی به اشتراک بگذارید و یا در ابعاد کوچک تا متوسط چاپ کنید میتوانید از دوربین های کراپ دار استفاده کنید و هزینه اصلی را برای خرید یک لنز سریع کنار بگذارید)در زیر لیستی از دوربین هایی که برای عکاسی شب مناسب هستند را لیست میکنمکراپدار:Canon 60D,70D,80DNikon D7100,7200,7500Sony Alpha A6500Fujifilm X-H1فول فریم:Canon 6D Mark 1 , 2 ,5D mark3,Mark4 Nikon D750,D810,D850 Sony alpha a7R2,3 لنز:همانطور که در بالا گفتم بهتره از لنزهای سریعی با اپرچر ۲٫۸ و یا پایین تر استفاده کرد در زیر لنزهای مناسب عکاسی نجومی به تفکیک نوع دوربین رو میارملنزهای مخصوص دوربین های کراپدار: Tokina 11-16  ۱۱-۲۰ F2.8 فول فریم: Tamron 15-30 F2.8, Samyang 14mm F2.8, Canon 16-35 F2.8, Nikon 14-24 F2.8, ZEISS Batis 18mm f/2.8(Sony Mount) سه پایه :یکی از مهمترین ابزارهای عکاسی منظره مخصوصا عکاسی شب استفاده از یک سه پایه محکم می باشد،به دلیل استفاده از نوردهی بالای ۱۰ ثانیه سه پایه ابزار بسیار حیاتی جهت داشتن ثبتی با جزئیات و شارپنس خوب می باشد چراغ پیشانی :راه رفتن در تاریکی مطلق و با تجهیزات سنگین چالش بزرگی برای شماست و بایستی حدالمقدور از یک چراغ پیشانی برای اینکار استفاده کنید ، ترجیحا از چراغ هایی با نور قرمز استفاده کنید ، نور قرمز کمک میکند که تاریکی  آسمان شب را از دست ندهید و مزاحمتی را برای دید خود و یا همراهانتان نداشته باشید. ریموت کنترل یا دکلانشور:جهت به حداقل رساندن تکانهای دوربین ناشی از فشردن دکمه شاتر استفاده از ریموت کنترل لازم میباشد ، بهتره  از ریموت هایی استفاده کنید که قابلیت تریگر داشته باشند(فرض کنید میخواهید هر ۵ ثانیه یک عکس با نوردهی ۳۰  ثانیه ثبت کنید و اینکار را میخواهید ۱۰۰ بار تکرار کنید، استفاده از تریگر باعث میشود که تنظیمات لازم را انجام داده و انجام اینکار را به ریموت بسپارید و خودتان از نوشیدن یک چایی یا نسکافه لذت ببرید) اپلیکیشن های موبایل جهت برنامه ریزی عکاسی شب:جهت برنامه ریزی و یافتن موقعیت ستاره ها ، سیارات و کهکشان راه شیری در روز، اپلیکیشن های بسیاری وجود دارند که در زیر لیست این اپلیکیشن های رو میارم.Photopills : بی شک یکی از قویترین و کاربردی ترین اپلیکیشن ها جهت برنامه ریزی عکاسی منظره و عکاسی در شب می باشد، هر چند این اپلیکیشن پولیست ولی هیچگاه از خرید آن پشیمان نمیشوید و به شخصه یک تجربه بسیار عالی رو در استفاده از این نرم افزار دارم دانلود از اپ استور دانلود از گوگل پلی  Light Pollution Map: قبل از مراجعه به لوکیشنی که قصد عکاسی از آنرا دارید بهتره از وضعیت آلودگی نوری آن منطقه باخبر شوید و این اپلیکیشن اینکار را برایتان انجام میدهد دانلود از اپ استور  دانلود از گوگل پلی SkyView  : در صورتیکه نمیخواهید برای نرم افزار PhotoPills هزینه کنید ، این نرم افزار تا حدودی نیازهای شما رو برطرف میکند  و میتونید از اون استفاده کنید دانلود از اپ استور دانلود از گوگل پلی وضعیت ماه :جهت ثبت کهکشان راه شیری بایستی در شبهایی که ماه در کوچکترین حالت از لحاظ اندازه قرار دارد و همچنین زمان  طلوع و غروب ماه رو دانست اقدام به عکاسی کرد ، اگر از نرم افزار PhotoPills استفاده کنید تمامی این موارد داخل اپ وجود دارند اما اگر نمیخواهید از آن استفاده کنید نرم افزار زیر به کمک شما میادMoon Plus: نسخه اندروید رو نتونستم پیداش کنم دانلود از اپ ستور  مراجعه به لوکیشن و شروع عکاسی:در مقاله بعدی آموزش شروع عکاسی از کهکشان راه شیری رو براتون میزارم</description>
                <category>ریبوار حسین پوری</category>
                <author>ریبوار حسین پوری</author>
                <pubDate>Sun, 19 May 2019 12:06:41 +0430</pubDate>
            </item>
            </channel>
</rss>