<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های حسین سلیمانی</title>
        <link>https://virgool.io/feed/@hossien014</link>
        <description>برنامه نویس hossien014.github.io</description>
        <language>fa</language>
        <pubDate>2026-06-22 12:11:38</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1343596/avatar/34IBV9.jpg?height=120&amp;width=120</url>
            <title>حسین سلیمانی</title>
            <link>https://virgool.io/@hossien014</link>
        </image>

                    <item>
                <title>تسلط بر خواب</title>
                <link>https://virgool.io/@hossien014/%D8%AA%D8%B3%D9%84%D8%B7-%D8%A8%D8%B1-%D8%AE%D9%88%D8%A7%D8%A8-hb5gijlissvc</link>
                <description>بسم الله الرحمن الرحیم این مطلب خلاصه قسمتی از پادکست huberman lab درباره خواب است. https://www.youtube.com/watch?v=nm1TxQj9IsQ&amp;pp=ygUSaHViZXJtYW4gbGFiIHNsZWVw رابطه Adenosine  و caffein ؟ماده Adenosine یک نوع ترکیب شیمیایی است که در تمام سلول‌های بدن وجود دارد و در فرآیندهای متابولیکی و طبیعی بدن نقش دارد. این ترکیب دارای خواص آرام‌بخش و خواب‌آور است و با اتصال به گیرنده‌های مغزی adenosine در اعصاب، باعث تولید خواب و آرامش می‌شود.هر چه بیشتر بیدار بمانیم این ماده در بدن بیشتر میشود و در هنگام خواب این ماده کمتر میشود.در مقابل، caffein یا کافئین یک ماده محرک است که در موجوداتی مانند قهوه، چای و درخت بید معمولی یافت می‌شود. این ماده تشدیدکننده سیستم عصبی مرکزی است و با اتصال به گیرنده‌های مغزی adenosine، عملکرد آنها را مسدود می‌کند. در نتیجه، تولید خواب و آرامش مهار می‌شود و موجب افزایش استمرار و بیداری می‌شود.هورمن epinephrine چیست ؟هورمون اپینفرین یا همان آدرنالین یک هورمون است که توسط غده آدرنالین در بدن تولید می‌شود. این هورمون بیشتر در شرایط استرس و هیجانی ترشح می‌شود و مهمترین وظیفه آن افزایش ضربان قلب و فشار خون، افزایش هوشیاری و تمرکز، افزایش تنفس و افزایش انرژی بدن است. به عبارتی دیگر، هورمون اپینفرین باعث آماده سازی بدن برای مواجهه با موقعیت‌های استرس زا و تهدیدکننده می‌شود. به طور مثال، در مواجهه با خطر، اپینفرین سیستم عصبی را فعال می‌کند و باعث افزایش ضربان قلب و تنگی در عروق می‌شود تا بدن بتواند بهتر به این وضعیت واکنش نشان دهد.هورمون کورتیزول cortisol چیست ؟هورمون کورتیزول، یا همان هورمون استرس، یک هورمون است که توسط غده آدرنالین در بدن تولید می‌شود. وظیفه اصلی کورتیزول مدیریت و کنترل استرس بدن است. وقتی بدن با موقعیت‌های استرس زا مواجه می‌شود، کورتیزول ترشح می‌شود تا باعث افزایش انرژی، افزایش توانایی بدن در مقابله با استرس و حفظ تعادل بدن در طول زمان شود.صبح ها قبل از بیداری مقدار کمی از این ماده در بدن ترشح میشود که باعث بیداری ما میشود.ترشح این مقدار کم در صبح لازم است.هورمون ملاتونین melatonin چیست ؟هورمون ملاتونین یا همان هورمون خواب، یک هورمون طبیعی است که توسط غده پینه‌چشم در مغز ترشح می‌شود. همانند سایر هورمون‌ها، وظیفه ملاتونین نظم‌بخشی فعالیت‌های فیزیولوژیک بدن است. ملاتونین به شکل سیکلیک تولید می‌شود و نسبت به تاریکی شب زمانی که ترشح آن بیشتر می‌شود.  مهمترین وظیفه ملاتونین در بدن کنترل الگوی خواب و بیداری است. زمانی که تاریک شب می‌شود، ملاتونین به سیستم عصبی ارسال می‌شود و باعث افزایش خوابآوری و احساس خواب‌آلودگی می‌شود. در واقع، ملاتونین که به عنوان &quot;هورمون خواب&quot; شناخته می‌شود، به بدن کمک می‌کند تا به راحتی و بطور متعادل خواب برود و باززمانده کاهش یابد.در مواجهه با نور روز، ترشح ملاتونین کاهش می‌یابد که به بدن اطلاع می‌دهد که زمان بیداری است. به همین دلیل، استفاده از دستگاه‌های الکترونیکی قبل از خواب و تمام نورهای روشن در اتاق خواب، ممکن است ترشح ملاتونین را کاهش داده و الگوی خواب را تحت تأثیر قرار دهد.دریافت نور مناسب بدن ما یک ساعت داخلی دارد (circadian rhythm,)که ترشح خیلی از هورمن ها را در زمانبندی مناسب انجام دهد.برای اینکه این ساعت داخلی درست کار کند باید در ساعت های مختلف نور مناسب آن زمان را دریافت کنیم.نور خورشید در ابتدای روز یک نیاز حیاتی برای تنظیم ماندن این ساعت داخلی بدن است.در عین حال دریافت نور در شب باعث اختلال در سیستم خواب ما میشود.بعد از بیداری که هورمن cortisol ترشح شد بلافاصله بدن ساعت خود را برای ترشح هورمن melatonin که هورمن خواب است تنظیم میکند.کیفیت نوری که در این زمان دریافت میکنید بسیار مهم است.در این زمان از برای بهتر انجام شدن این سیستم باید بیرون بروید و نور افتاب را دریافت کنید.برای تنظیم کردن این ریتم به غیر از دریافت نور مناسب عوامل دیگری مثل زمانبدی مناسب غذا خوردن و ورزش کردن و مصرف بعضی از مکمل ها موثر هستند.مثلا برای سحر خیزی میتوانید هر صبح بعد از دریافت نور مناسب کمی ورزش کنید و بعد از چند روز به صورت طبیعی بدن شما تمایل به بیدار شدن در آن زمان دارد.به غیر تماشای نور افتاب در اول صبح دیدن نور افتاب هنگام غروب به مغز کمک میکند تا در زمان مناسب هورمن melatonin را ترشح کند.نوری که تقریبا از ساعت 11شب تا 4صبح به چشم ما میرسد ترشح دوپامین را مختل می کند.این  هورمن که باعث شادی و از افسردگی جلوگیری میکند در صورت مختل شدن میتواند توانایی یادگیری ما را مختل و اثرات مخرب زیادی داشته باشد.جهت نور در عصرگاه به بعد باید از سمت پایین باشد یعنی بهتر از چراغ هایی روی زمین داشته باشید یا حتی بهتر از از شمع استفاده کنید.بد ترین نور در عصر ها نور سقفی است.خواب یوگا Yoga nidra چیست؟یوگا نیدرا یا خواب عارضی، یک روش تمرینی در یوگا است که بر اساس خواب عمیق و آگاهی استوار است. در این روش، فرد به طور آگاهانه و به صورت غیرمتمرکز به خود و تمام وجود خود تمرکز می‌کند. هدف اصلی یوگا نیدرا، تجربه آرامش عمیق و راحتی است.در حین تمرین یوگا نیدرا، فرد به صورت آرام و آگاه با تمرکز بر نفس خود، انواع حالات بدنی و ذهنی را تجربه می‌کند. این تجربه به فرد کمک می‌کند تا به آرامش، تعادل و قدرت خود بیشتر برسد. همچنین، این روش به فعال سازی مراکز انرژی در بدن کمک می‌کند و باعث نیروبخشی و تجدید آرامش می‌شود.در کل، یوگا نیدرا به فرد اجازه می‌دهد تا با تمام توانایی‌های خود در حالت آرام و آگاه بودن به استراحت و تجدید انرژی بپردازد.روش های مثل یوگا نیدار مغز شما را تمرین میدهد تا در هر زمانی به ارمش برسد.میتوانید این روش را روزی از 10 دقیقه تا 60 دقیقه انجام دهید.مکمل های مفید برای خواب منیزیم Magnesium یکی از مکمل هایی که خوردن آن قبل از خواب به ترشح ملتونین کمک میکند و باعث میشود راحت بخواب بروید .انواع مختلفی از منیزیم ها وجود دارد که بهترین آن برای خواب magnesium threonate است .ممکل theanine :تئانین یک آمین آلفا دروازه ای است که در برخی از گونه های گیاهی، به ویژه در برگ های سبز چای، یافت می شود. این ترکیب به طور گسترده ای برای خواص آرامش بخش و استرس آور بدون عوارض جانبی معروف است. اثر آرامش بخش تئانین مربوط به تمایز بینفردی است و ممکن است با توجه به واکنش های شخصی متفاوت باشد.  یکی از جوانبی که تئانین بر آن تأثیر دارد، خواب است. تحقیقات نشان می دهد که تئانین می تواند به خوابکی و آرامش کمک کند. مصرف تئانین می تواند مانع از بروز استرس و اضطراب شود، که معمولاً دلیلی برای بی خوابی است. علاوه بر این، تئانین می تواند سطح هورمون دستیابی به آرامش و خواب را افزایش دهد و منجر به افزایش مدت زمان خواب و بهبود کیفیت خواب شود.مکمل Apigenin هم میتواند به خواب شما کمک کند.این مکمل میتواند هورمن استروژن را مختل کند برای خانم ها خیلی مناسب نیست.</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Wed, 31 Jul 2024 21:06:11 +0330</pubDate>
            </item>
                    <item>
                <title>تست زنی در سی شارپ-Test and Mock in C#</title>
                <link>https://virgool.io/@hossien014/%D8%AA%D8%B3%D8%AA-%D8%B2%D9%86%DB%8C-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-test-and-mock-in-c-kk9fhcm7pcti</link>
                <description>بسم الله الرحمن الرحیم در دنیای برنامه نویسی تست نوشتن یعنی کدی بنویسیم که کد های اصلی رو تست کنه! مثلا در یک پروژه بزرگ که چندین هزار خط و ده ها فانکشن وجود داره,یک غلط املایی یا یک نا همانگی کوچیک تو یکی از بخش ها میتونه کل برنامه رو مختل کنه.برای اینکه این مشکل پیش نیاد ما تست مینویسم تا مطمعن بشیم همه بخش های برنامه اونطور که باید کار می کنن. در دنیای برنامه نویسی ما سه نوع تست داریم :یونت تست unit test :به تست کردن بخش های کوچک برنامه به صورت مستقل unit test میگویند.منظورم از مستقل این هست که این دست ها به دیتا بیس و اطلاعات هارد... نباید وصل بشن و فقط منطق یک فانشکن رو تست کنن.اینتگریشن تست integration test : تفاوت این نوع تست با unit test در استفاده از داده های خارجی است. در این نوع تست دیتا بیس و ... نیز دخلیل هستند.تست end to end : در این نوع تست برنامه با همه وابستگی ها و رابط کاری تست می شود. بیشترین تستی که نوشته می شود unit test و بعد از ان integration test و بعد از ان end to end تست است .ماک Mockچیست ؟ماک کردن یعنی ساخت یک نسخه فیک از یک فانکشن برای تست کردن.فرض کنید یک فانشکن برای تست دارید.در جایی از این فانشکن نیاز است که اطلاعاتی را از دیتا بیس فراخوانی یا دستکاری کنید.اینکار قطعا خطرناک است و ممکن است اطلاعات شما از بین برود.برای حل این مشکل ما از Mock کردن استفاده میکنیم و یک دیتا بیس فیک میسازیم و برنامه را با همان تست میکنیم.با دیدن مثال ها بهتر این مفهوم را درک خواهید کرد.ابزار تست در سی شارپ :من یک نرم افزار تحت وب asp .net دارم و قصد دارم چند تست برای این نرم افزار بنویسم .ابزار انتخابی من برای اینکار xunit است و برای ماک کردن کردن من از moq استفاده میکنم.ابتدا پکیج های زیر را نصب کنید. coverlet.collectorMicrosoft.EntityFrameworkCore.InMemoryMicrosoft.NET.Test.SdkMoqTestEssentials.Xunitxunitxunit.runner.consolexunit.runner.visualstudioفرض کنید این مدل ها و دیتا بیس کانتس شما در efcore باشد .توجه داشته باشید که DBSet ها باید به صورت virtual باشد تا بتوانیم از mock استفاده کنیم . https://gist.github.com/hossien014/d136953feb210abde252c65541973df5#file-gistfile1-txt و یک کلاس logic داریم که یک فانکشن gethossien دارد که از دیتا بیس اولین یوزر را برمیگرداند. https://gist.github.com/hossien014/6a2ae181e74914f95b592aebf00953aa تست که مینوسیم به این شکل باید باشد  https://gist.github.com/hossien014/b42ad25dd3217cef31746f4d216cb206 </description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Sat, 27 Jul 2024 21:12:00 +0330</pubDate>
            </item>
                    <item>
                <title>توضیح solution و project در c شارپ</title>
                <link>https://virgool.io/@hossien014/%D8%AA%D9%88%D8%B6%DB%8C%D8%AD-solution-%D9%88-project-%D8%AF%D8%B1-c-%D8%B4%D8%A7%D8%B1%D9%BE-kimwaqz12vf9</link>
                <description>بسم الله الرحمن الرحیم در سی شارپ و دات نت solution ها نگه دارنده پروژه های مختلف هستند.یک solution میتواند شامل چندین پروژه باشد.solution ها یک فایل (.sln) دارند که با استفاده از این فایل پروژه های مختلف درون خود را به هم وصل میکنند.پروژه ها یک فایل (.csproj) دارند که رفرنس ها و اطلاعات مورد نیاز پروژه را درون خود دارند.ساخت یک solution و اضافه کردن چند پروژه به آن در vscodبرای ساخت یک solution از دستور زیر استفاده کنید dotnet new sln -n MySolutionحالا میتوانید در همان پوشه چندین پروژه مختلف درست کنیدپروژه اول :dotnet new console -o MyConsoleAppپروژه دوم:dotnet new classlib -o MyLibraryحالا با استفاده از دستور زیر میتوانید پروژه ها را به solution اضافه کنید dotnet sln MySolution.sln add MyConsoleApp/MyConsoleApp.csproj dotnet sln MySolution.sln add MyLibrary/MyLibrary.csproj</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Tue, 16 Jul 2024 19:28:06 +0330</pubDate>
            </item>
                    <item>
                <title>پابلیش کردن asp net وب اپلیکشن بر روی سرور لینوکس</title>
                <link>https://virgool.io/@hossien014/%D9%BE%D8%A7%D8%A8%D9%84%DB%8C%D8%B4-%DA%A9%D8%B1%D8%AF%D9%86-asp-net-%D9%88%D8%A8-%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%D8%B4%D9%86-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-vkiam3sa0xco</link>
                <description>بسم الله ارحمن الرحیمبرای اولین بار قصد دارم یک وب اپلیکشن که با استفاده از فریم ورک  asp dotnet توسعه داده ام را روی یک سرور منتشر کنم..نصب dotnetاول باید روی سرور skd و runtime مربوط به فریم ورک دات نت را روی سرور لینوکسی نصب کنم.مایکروسافت در لینک زیر اموزش نصب رو برای هر کدام از توزیع های لینوکس قرار داده که چالش خاصی هم نداره.https://learn.microsoft.com/en-us/dotnet/core/install/linuxدر قدم بعدی باید در پوشه برنامه از دستور زیر استفاده کنیم تا یک پوشه انتشار (publish) که شامل نسخه نهایی برنامه شما است بسازد.به روش زیر عمل کنید.dotnet publish -c Release -o /path/to/publish/folderبعد از فلگ -o مسیری که میخواهید فایل ها در انجا ایجاد شود را انتخاب کنید. کمی بیشتر درباره دستور dotnet publishدستور dotnet publish برنامه را کامپایل می‌کند، از وابستگی‌های آن که در فایل پروژه مشخص شده است، می‌گذرد و مجموعه‌ای از فایل‌های حاصل را در یک پوشه منتشر می‌کند. خروجی شامل موارد زیر است:  - کد Intermediate Language (IL) در یک اسمبلی با پسوند dll. - فایل .deps.json که شامل تمام وابستگی‌های پروژه است. - فایل .runtimeconfig.json که مشخص می‌کند کدام نسخه از shared runtime برنامه انتظار می‌رود و همچنین سایر گزینه‌های پیکربندی برای runtime (مانند نوع garbage collection). - وابستگی‌های برنامه که از کش NuGet به پوشه خروجی کپی می‌شوند. - خروجی دستور dotnet publish آماده استفاده در یک سیستم میزبان (مانند سرور، کامپیوتر شخصی، مکینتاش، لپتاپ) برای اجرا می‌باشد. این تنها روشی است که به صورت رسمی برای آماده‌سازی برنامه برای نصب و استفاده است. بسته به نوع نصبی که در پروژه مشخص شده است، ممکن است سیستم میزبان دارای shared runtime .NET نصب شده باشد یا نباشد. برای کسب اطلاعات بیشتر، به مقاله Publish .NET apps with the .NET CLI مراجعه کنید.اجرای برنامه حالا به پوشه ایی که به عنوان خروجی انتخاب کرده اید بروید و فایل اجرایی برنامه را با استفاده از دستور dotnet اجرا کنید.مثلا اگر اسم برنامه شما myapp باشد فایل اجرایی با نام myapp.dll را پیدا کنید و دستور زیر را اجرا کنید.dotnet myapp.dllحالا برنامه شما روی پورت که مشخص کرده ایید اجرا میشود.اگر به تنظیمات دست نزده باشید برنامه روی پورت 5000 اجرا میشود.بعد از این بهتر است که برنامه را تبدیل به یک سروریس لینوکسی کنید تا در زمینه اجرا شود و هنگام ریست شدن به صورت خودکار بالا بیاید. اما قبل از آن با استفاده از اموزش زیر یک reverse proxy ایجاد و Sll برای سرور خود بگیرید.تنظیم nginx به عنوان reverse proxy و دریافت ssl رایگانبرای ساخت سرویس باید یک فایل در مسیر sudo nano /etc/systemd/system/yourapp.service ایجادکنید  ولی بجای yorapp نام موردنظر خود را بنویسید.درون فایل سرویسی که ساختید تنظیمات زیر را اعمال کنید [Unit] Description=توضحیات برنامه را اینجا بنویسید[Service]  WorkingDirectory=/path/to/deployment/folder مسیر برنامه ExecStart=/usr/bin/dotnet /path/to/deployment/folder/yourapp.dll  مسیر فایل اجراییRestart=always # Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 KillSignal=SIGINTSyslogIdentifier=dotnet-yourapp User=www-data نام یوزری که برنامه را اجرا میکند Environment=ASPNETCORE_ENVIRONMENT=Production  [Install] WantedBy=multi-user.targetحالا با استفاده از دستورات زیر میتوانید این سرویس را اجرا کنید sudo systemctl enable yourapp.service sudo systemctl start yourapp.serviceیکی از مشکلاتی که من در مسیر منتشر کردن برنامه داشتم درست کار نکردن دیتا بیس بود.من از sqlite3 استفاده میکردم ولی در فایل ریلیز این دیتا بیس کار نمیکرد.برای حل این مشکل دیتا بیس را به صورت دستی از پوشه توسعه به پوشه انتشار منتقل کردم و مشکل حل شد ولی قطعا این راه حل خوبی نیست و باید دلیل این مشکل را پیدا کنم.</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Sun, 14 Jul 2024 15:43:18 +0330</pubDate>
            </item>
                    <item>
                <title>تنظیم nginx به عنوان reverse proxy و دریافت ssl رایگان</title>
                <link>https://virgool.io/@hossien014/%D8%AA%D9%86%D8%B8%DB%8C%D9%85-nginx-%D8%A8%D9%87-%D8%B9%D9%86%D9%88%D8%A7%D9%86-reverse-proxy-%D9%88-%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-ssl-%D8%B1%D8%A7%DB%8C%DA%AF%D8%A7%D9%86-a8hxayyxgbko</link>
                <description>بسم الله ارحمن الرحیم من یک وب اپلیکیشن روی سرور لینوکس خودم دارم که روی پورت 5143 اجرا میشه حالا میخوام از nginx استفاده کنم و هر درخواستی که روی پورت 80 سرور من میاد رو منتقل کنم به پورت 5143.برای اینکار اول باید nginx رو نصب کنم sudo apt update 
sudo apt install nginxساخت یک کانفیگوریشن جدید برای سایت فرض کنید که سرور شما به یک دامنه وصل است &quot;example.ir&quot; برای ساخت کانفیگ nginx باید یک فایل جدید هم نام دامنه در مسیر &quot;/etc/nginx/sites-available/&quot;بسازید با دستور زیر میتوانید اینکار را انجام دهید.بجای example.ir نام دامنه خود را بنویسید sudo nano /etc/nginx/sites-available/example.irدرون فایل بالا تنظیمات زیر را وارد کنید و ذخیره کنید.server {    listen 80;    server_name example.ir www.example.ir;    location / {        proxy_pass http://localhost:5143;        proxy_http_version 1.1;        proxy_set_header Upgrade $http_upgrade;        proxy_set_header Connection &#x27;upgrade&#x27;;        proxy_set_header Host $host;        proxy_cache_bypass $http_upgrade;    }}برای فعال کردن این تنظیمات باید یک نمونه در پوشه  sites-enabled از این کافنیگ ایجاد کنید برای اینکار از دستور زیر استفاده کنید. بجای example.ir نام دامنه خود را وارد کنید.sudo ln -s /etc/nginx/sites-available/example.ir /etc/nginx/sites-enabled/
با استفاده از nginx -t مطمعن شوید که اشتباهی در تنظیمات وجود ندارد و در اخر با استفاده از systemctl reload nginx برنامه را ریلود کنید تا تنظیمات جدید اعمال شود. از این پس هر ورودی که به پورت 80 می آید به صورت مستقیم به پورت 5143 منتقل میشود.اضافه کردن ssl به سایت با استفاده از nginxابتدا باید certbot را نصب کنید sudo apt install certbot python3-certbot-nginxدریافت گواهی  ssl .بجای example.ir نام دامنه خود را بنویسیدsudo certbot --nginx -d example.ir -d www.example.irو تمام.شما به همین راحتی یک گواهی Ssl رایگان دریافت میکنید و میتوانید سایت خود را به صورت امن بالا بیاورید.</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Sat, 13 Jul 2024 21:55:45 +0330</pubDate>
            </item>
                    <item>
                <title>مفاهیم OAuth2 و Open ID connect به صورت خلاصه</title>
                <link>https://virgool.io/@hossien014/%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85-oauth2-%D9%88-open-id-connect-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D8%AE%D9%84%D8%A7%D8%B5%D9%87-dtrtfxmxuify</link>
                <description>بسم الله الرحمن الرحیم پروتکل OAuth 2 چیست؟به صورت خلاصه OAuth2 یه دسترسی محدود به اکانت شما رو به برنامه های دیگه میده.بذارید یه مثال بزنم.مثال :یه برنامه ایی هست به اسم &quot;اتو ایمیل &quot;این برنامه یه لیستی از ایمیل ها رو میگره و به صورت گروهی برای اعضای این لیست ایمیل می فرسته. مثلا اگه بخواید به تمام همکارهاتون یه ایمیل تبریک سال نو بفرسید لیست ایمیل همه رو توی این برنامه وارد می کنید و به صورت گروهی ایمیل می فرستید . حالا اگه شما هم مثل من حال نداشته باشید همه ایمیل ها رو تک تک وارد کنید, این برنامه میتونه به حساب جیمیل شما وصل بشه و خودش ایمیل تمام همکاری شما رو استخراج کنه.به روشی که برنامه &quot;اتو ایمیل &quot; به حساب جیمل شما وصل میشه OAuth 2 میگن .اما دقیقا چطور کار میکنه :وقتی شما دکمه وصل کردن برنامه &quot;اتو ایمیل &quot; به جیمل رو میزنید شما رو میفرسته به authorization server. داخل authorization server هویت شما با وارد کردن رمز و نام کاربری تایید میشه .بعدش از اینکه هویت شما تایید شد صفحه ایی به شما نمایش داده میشه که مشخص میکنه چه دسترسی هایی میخواهید به برنامه &quot;اتو ایمیل&quot; بدهید. مثلا شما دسترسی به تمام مخاطبان جیمل را به برنامه &quot;اتو ایمیل&quot; تایید می کنید .در مرحله بعد authorization server شما را به همراه یک authorization code به صفحه مخصوصی در سایت &quot;اتو ایمیل&quot; می فرستد . authorization code یک کد موقت است.از اینجا بعد بعد سرور های &quot;اتو ایمیل&quot; بدون نیاز به شما با سرور های جیمیل ارتباط برقرار می کنند .ابتدا  کدی که در محله قبل دریافت شده به اضافه ایدی شما و سکرت شما را به authorization server ارسال می کند.authorization server بعد از تایید اطلاعات یک Access Token به سرور &quot;اتو ایمیل&quot; می فرستد. از این به بعد سرور های &quot;اتو ایمیل&quot; با استفاده از Access Token به صورت مستقیم می توانند به مخاطب های شما در جیمیل دسترسی داشته باشند. اما این توکن ها محدوده زمانی دارد و بعد از مدتی از کار می افتد و نیاز به گرفتن توکن جدید است .ولی Open ID Connect  (OIDC) چیه:این پروتکل یکسری ویژگی ها به OAuth2 اضافه میکند .در OAuth2 فقط اجازه استفاده از یکسری از داده ها به برنامه های مختلف داده می شود ولی با استفاده از OIDC اطلاعات هوییتی نیز ارسال می شود مثلا اگر با استفاده از اکانت گوگل وارد حساب کاربری ویروگل خودتون میشید گوگل بر اساس همین OIDC یکسری از اطلاعات هویتی شما رو برای ویرگول میفرسته و ویرگول با استفاده از همون اطلاعات یک اکانت برای شما میسازه.این اطلاعات از طریق فرمتی به اسم jwt یا همون Json Web Token ارسال میشه میشه. اما JWT چییست :این توکن مثل یک نامه است که زیرش رو سرور امضا کرده. توی این نامه اطلاعاتی مختلفی که میتونه باشه از جمله نام کاربری و رول کاربر و تاریخ انقضا توکن.برای اینکه کسی این توکن رو دستکاری نکنه یه امضا هم زیرش زده شده.این امضا رو سرور با استفاده از ترکیب تمام اطلاعات و رمزنگاری کردن اونا با یک کلید مخفی انجام میده که نتیجه یه سری کد درهم بر هم میشه.وقتی سرور میخواد توکن رو تایید کنه دوباره همین رمزنگاری رو انجام میده و اگه نتیجه با امضای توکن یکی بود اون رو تایید میکنه .بعضی از اصطلاحات مربوطه :ا-resource owner : کسی که صاحب اطلاعات است .مثلا شما که یک کانال یوتیوب دارید یک resource owner محسوب می شوید.ا- client : نرم افزار سوم شخصی که نیاز به دسترسی به اطلاعات شما دارد مثلا برنامه ایی که برای کار کردن باید قابلیت دسترسی به ویدو های یویتوب شما و ایجاد تغییرات در آنها را داشته باشد .ا- authorization server : نرم افزاری که شما را میشناسد و اطلاعات اکانت شما را دارد. client باید از authorization server مجوز دسترسی به اطلاعات شما را بگیرد.ا- resource server : جایی که اطلاعات شما ذخیره شده است مثلا سرور های گوگل که ویدو های شما در آنجا قرار دارد. client بعد از گرفتن مجوز از authorization server میتواند به  resource server متصل شود .ا-redirect uri :بعد از اینکه  authorization server کاربر را تایید با استفاده از یک ادرس به نام redirect uri کاربر یا همان resource owner به صفحه client باز میگرداند .ا- response type : فرمت جوابی که client انتظار دارد دریافت کند.ا- scope : به اجازه هایی که client به انها نیاز دارد می گویند مثلا دسترسی به مخاطبین یا عکس ها .ا-consent : عملیاتی که شما به عنوان resource owner باید مجوز هایی که client درخواست کرده را تایید کنید.برای اطلاعات بیشتر :An Illustrated Guide to OAuth and OpenID Connectjwt token صفحه من در یوتیوب</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Tue, 06 Feb 2024 19:27:28 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت یک foreign key  در entity framwork</title>
                <link>https://virgool.io/@hossien014/%D8%B3%D8%A7%D8%AE%D8%AA-%DB%8C%DA%A9-foreign-key-%D8%AF%D8%B1-entity-framwork-eu5ioh8rzpgy</link>
                <description>بسم الله الرحمن الرحیم فرض کنید که یک جدول برای مشتریان(Customers) و یکی برای درخواست های مشتری ها (Orders)  میخواهید.جدول مشتری ها نیاز به ستون های [Id] [Name] [City] [BrithDay] دارد.و جدول Orders نیاز به ستون های [Id][CustomerId][OrderDate] دارد. رابطه این دو جدول به صورت One-To-Many است یعنی یک Customer می تواند تعداد مختلفی Order داشته باشد ولی Order فقط می تواند یک Coustomer داشته باشد.برای اینکه این رابطه را با استفاده از EF-core ایجاد کنیم باید از Navigation property استفاده کنیم.در جدول Customer که می تواند تعداد زیادی order داشته باشد یک کالکشن از نوع Order اضافه می کنیم مانند کد زیر  https://gist.github.com/hossien014/a7d227cd3ee15bc3def813e549dedf4e و برای order باید یک ستون به اسم CoustomerId بسازیم که در واقع foreign key برای وصل کردن این دو جدول به هم است.ولی برای اینکه به نرم افزار بفهمانیم CustomerId به کدام جدول ربط دارد باید یک Navigation Property به صورت زیر نیز اضافه کنیم.متغیر Customer که از جنس Customer است فقط برای این است که نحوه اتصال دو جدول را نشان دهد. https://gist.github.com/hossien014/85cc06dac9ceae5210ad9b5571141fce ورودی های ممنوعه اگر بخواهید برای مقادیر ورودی به دیتا بیس یکسری محدویت ها وضع کنید باید از اتربیوت DeniedValues استفاده کنید.مثلا فرض کنید که نمی خواهید کسی عبارت &quot;trump&quot;را به عنوان نام وارد کند.برای اینکار باید به روش زیر عمل کنید.  https://gist.github.com/hossien014/07f5d626d7af988781794efcb8bda97a نکته : این محدویت ها در سطح برنامه اتفاق می افتد نه در سطح دیتا بیس.یعنی برای کسی که به صورت مستقیم با دیتابیس در ارتباط است محدودیتی نیست .اضافه کردن مقدار پیشفرض مثلا اگر کاربر سفارشی را ثبت کرد به صورت پیشفرض از تاریخ سیستم برای تاریخ ثبت سفارش استفاده شود.اسان ترین روش این است که هنگام ساخت مانند مثال زیر از عبارت DateTime.Now استفاده کنید. https://gist.github.com/hossien014/e92c62b7b3e963c41670c73d247d9bd3 اما راه بهتر اضافه کردن این مقدار پیشفرض در سطح دیتا بیس است .برای اینکار باید تغییراتی در فایل کانتکس خود که معمولا در پوشه Data است ایجاد کنید .  https://gist.github.com/hossien014/069a09ddf68ac2cc100222e29753c6de برای مطالعه بیشتر:  Entity Propertiesشبکه های اجتماعی : یوتیوب https://www.youtube.com/@BA_HOSSIEN</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Sun, 04 Feb 2024 16:50:18 +0330</pubDate>
            </item>
                    <item>
                <title>مفهوم Tracking در EFCore</title>
                <link>https://virgool.io/@hossien014/%D9%85%D9%81%D9%87%D9%88%D9%85-tracking-%D8%AF%D8%B1-efcore-nciootfjcutb</link>
                <description>بسم الله الرحمن الرحیم وقتی طلاعات را با استفاده از efcore از دیتا بیس به صورت ابجکت دریافت میکنید به صورت پیش فرض efcore اطلاعات شما را track می کند یعنی اینکه هر تغییری که شما در ان متغیر ایجاد کنید بعد از سیو کردن در دیتا بیس نیز اعمال می شود.نکته : track کردن فقط شامل جدول هایی می شود که key داشته باشند . مثال :در مثال زیر ما جدول Blogs ردیفی که ایدی 1 را دارد را فراخوانی می کنیم و در متغیری به اسم blog قرار می دهیم. در خط دوم ما تغییراتی در متغیر که ساختیم ایجاد میکنیم و از انجایی که ef هر کاری که ما با این متغیر می کنیم را رصد می کند بعد از ذخیره تغییرات در خط سوم با دستور &quot;SaveChanges&quot; دیتا بیس نیز اپدیت می شود.  https://gist.github.com/hossien014/0f6af82741bd8a279d3ac175bcee501f#file-gistfile1-txt اگر بخواهیم اطلاعات track نشود باید از  فانکشن  AsNoTracking() استفاده کنیم.  https://gist.github.com/hossien014/09357aaa7f3392ba91b89eaad7d1906e اگر بخواهید به صورت پیشرف برای یک کانتکس no tracking داشته باشیم باید مانند کد زیر عمل کنیم  https://gist.github.com/hossien014/ca61e270a693f76959c02ef6f25abea7 برای اینکه tracking را به صورت کلی از حالت پیشفرض برداردید باید در فایل dbcontext خود مانند زیر عمل کنید  https://gist.github.com/hossien014/b0dad5a4d6853f56e448386fc2f4734a </description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Fri, 02 Feb 2024 14:09:18 +0330</pubDate>
            </item>
                    <item>
                <title>چه اتفاقی برای[ خالق ردیت] افتاد ؟</title>
                <link>https://virgool.io/@hossien014/%DA%86%D9%87-%D8%A7%D8%AA%D9%81%D8%A7%D9%82%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AE%D8%A7%D9%84%D9%82-%D8%B1%D8%AF%DB%8C%D8%AA-%D8%A7%D9%81%D8%AA%D8%A7%D8%AF-dyz1ymyz8mfr</link>
                <description>ارون سوارتز نابعه جوان علوم کامپیوتر. هم بنیاگذار ردیت یکی از محبوب ترین شبکه های اجتماعی ,خالق زبان مارک داون , توسعه دهنده  rss, و ده ها پروژه بزرگ دیگر . برنامه نویس,کار افرین,فعال اجتماعی,ارون سوارتز(aaron swartz )در سن 26 سالگی با نوعی از مرگ که کسی فکرش رو نمیکرد از دنیا رفت. اما واقعا چه اتفاقی برای ارون افتاد !!شما میتوانید این مقاله را به صورت تصویری از یوتیوب تماشا کنید. https://www.youtube.com/watch?v=mlTktwqxidY ارون سوارتز در سن 12 سالگی سایت info network را خلق کرد ..یک دانشنامه انلاین که محتوی آن توسط کاربر ها تولید میشد.این سایت در آن سال برنده جایزه  ArsDigita شد. جایزه ایی که به افراد جوانی داده میشود که یک محصول کاربردی,اموزشی, و رایگان تولید می کنند.ارون سوارتز در کودکیاین اتفاق باعث شاخته شدن زود هنگام  ارون به عنوان یک استعداد نو ظهور در عرصه علوم کامپیوتر و برنامه نویسی شد. در سن 14 سالگی او عضو working group که سازنده rss هستند شد و تاثیر زیادی در توسعه rss داشت.یکسال بعدهمکاری خود را با سازمان  Creative Commons شروع کرد.در سال 2005 او در دانشگاه استنفورد وارد شد ولی بعد از یکسال ترک دانشگاه کرد.ارون سوارتزیکی از مهم ترین فعالیت های ارون سوارتز هم بنیانگذاری ردیت است . ردیت با 2 هزار کارمند و 70میلیون کاربر یکی از محبوب ترین شبکه های اجتماعی دنیاست . این سایت در سال 2023 هجدهمین سایت پربازید جهان بوده است و این ساخته ارون در سن 19 سالگی امروز میلیارد ها دلار ارزش دارد.بعد از فروش ردیت در سال 2006 سوارتز بیشتر درگیر فعالیت های اجتماعی  و سیاسی شد. او با تمام وجود به آزادی اطلاعات معتقد بود. ارون پلتفرم های مختلفی برای انتشار ازاد اطلاعات به وجود آورد از جمله سایت SecureDrop .این سایت یک ارتباط امن بین خبرنگاران و منتشر کننده گان اطلاعات به وجود می آورد.او در زمینه اوپن سورس بسیار فعال بود و ذکر فعالیت های اوپن سورس او نیاز به یک مقاله دیگر دارد.اما چرا شخصی با این وِیژگی ها , استعداد و ثروت بدون هیچ مشکل روحی و روانی به چنین مرگی تن می دهد؟اروان سوارتزارون سوارتز در اقدامی اعتراضی به سیاست‌های حقوقی در آمریکا و به خصوص سامانه PACER شرکت کرد. SWARTZ در سال 2008 به همراه دیگر فعالان، به طور غیرقانونی اسناد PACER را دانلود کرد. او اعتقاد داشت که این اطلاعات، که در اصل متعلق به عموم است، نباید با هزینه‌های بالایی برای دسترسی به آنها محدود شوند. این اقدام به عنوان یک نهضت غیرقانونی اعتراضی در جهت آزادی اطلاعات و دسترسی عمومی به اطلاعات بود.به اشاخصی با این نوع فعالیت جتماعی سیاسی هکتیویست می گویند .او به قدری به ازادی اطلاعات معتقد بود که در سال 2010 از دانشگاه  mit  به سایت jstor نفوذ و هزار مقاله علمی که برای دسترسی به انها نیاز به پرداخت هزینه بود را دانلود می کند. اما دوربین ها تمام اقدامات سوارتز را ظبط کرده اند و پس از مدتی او دستگیر می شود. Jstor اما به شرط پس دادن اطلاعات از شکایت ا صرف نظر می کند .ارون سوارتز در انبار ام ای تیبا اینکه jstor شکایتی انجام نداد ولی وکلای دولتی امریکا به رهبری Carmen Ortiz، بعدها او را به تهمت های  کلاهبرداری و سوءاستفاده از رایانه متهم کرده‌اند، که جمعاً منجر به جریمه‌هایی به مبلغ یک میلیون دلار، ۳۵ سال حبس، تصرفات  همه دارایی ها و جبران خسارت بود.گفته میشود که دادگاه به پیشنهاد داده بود که در ازای اعتراف به جرم فقط 6 ما زندان برای او تعیین می کند ولی او این پیشنهاد را رد کرد. و بعد از چند روز جسد بی جان او در اپارتمان شخصی اش پیدا شد . گفته می شود که او با حلق اویز کردن به زندگی  خود پایان داده .ُاما چه اتفاقی پس از مرگ اررون سواترز افتادگرافیتی یادبود ارون سوارتزبعد از مرگ سوارتز دادستانی دولتی امریکا  او رو کنار گذاشت و چند ماه بعد به دلیل قانون ازادی اطلاعات چندین سند مرتبط با این پروند توسط سرویس مخفی منتشر شد از جمله ویدو ورورد سوارتز به محل ذخیره اطلاعت mit.مرگ او باعث ایجاد موجی از حسرت و تأثر در جامعه فعالان اینترنت و مدافعان حقوق دیجیتال شد. این حادثه نه تنها موجب تأسف و تأثر بر فعالان اینترنتی شد بلکه منجر به بحرانی در مورد سیاست‌ها و روش‌های قانونی در حوزه حقوق دیجیتال و دسترسی به اطلاعات گردید.از طرف دیگر، برخی از مطالب در مورد او تحت تأثیر سانسور و محدودیت‌هایی قرار گرفت اما به طور کلی این حادثه به عنوان یکی از مواجهات مهم حقوق دیجیتال و حقوق دسترسی به اطلاعات به شدت مورد توجه جامعه قرار گرفت.اروان سوارتزامروز که 10 سال از مرگ او میگذرد صحبت کردن درباره این موضوع آسان تر شده.نظر شما درباره سرنوشت و فعالیت های ارون سوارتز چیست؟ نظر شما درباره انتشار عمومی و رایگان اطلاعات چیست ؟شبکه های اجتماعی یوتیوب اپارات اینستاگرام</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Fri, 26 Jan 2024 19:59:05 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش کامل sql دیتا بیس + ویدئو</title>
                <link>https://virgool.io/@hossien014/sqldatabase-fw26kufqss0o</link>
                <description>دیتا بیسبسم الله الرحمن الرحیم در این مطلب قصد دارم تمام دستورات  SQLرا به صورت کلی و خلاصه پوشش بدهم و در کنار متن تا جایی که بشود ویدئو هم اپلود کنم.برای تماشای ویدئو ها باید از فیلتر عبور کنید پایگاه داده رابطه ایی یا SQL چیست؟رهنمای SQL پایگاه دادهپایگاه داده رابطه ایی یک نوع پایگاه داده است که داده‌ها را در قالب جداول ذخیره می‌کند. هر جدول شامل یکسری سطر و ستون است که هر سطر یک رکورد از داده‌ها را نشان می‌دهد و هر ستون یک ویژگی از داده‌ها را مشخص می‌کند. برای مثال، یک جدول می‌تواند اطلاعات مشتریان یک فروشگاه را نگهداری کند که شامل ستون‌هایی مانند نام، آدرس، شماره تلفن و ایمیل باشد.برای دسترسی و کار با پایگاه داده رابطه ایی، از زبان پرس و جوی ساختاریافته یا SQL استفاده می‌شود. SQL یک زبان قدرتمند و استاندارد برای مدیریت داده‌ها و اجرای کوئری محسوب می‌شود و با یادگیری آن، می‌توانید مواردی همچون حذف، درج، به‌روزرسانی و استخراج داده‌ها از پایگاه داده را انجام دهید و ساختار جداول و رابطه‌ها را تعریف کنید.پایگاه داده رابطه ایی دارای برخی مزایا و معایب است. مزایای آن عبارتند از:ساختار منطقی و یکنواخت داده‌هاامکان اعمال قوانین و محدودیت‌های انسجام داده‌هاامکان ایجاد انواع رابطه‌ها بین جداولامکان استفاده از ابزارهای مختلف برای تحلیل و گزارش‌گیری داده‌هاامکان استفاده از SQL به عنوان یک زبان استاندارد و مشهورمعایب آن عبارتند از:نیاز به طراحی دقیق و پیچیده پایگاه دادهنیاز به تغییر ساختار پایگاه داده در صورت تغییر نیازهای کاربرانعدم انعطاف‌پذیری در برابر داده‌های ناهمگن و نامنظمعدم کارایی در برابر حجم بالای داده‌ها و تراکنش‌ها https://www.youtube.com/watch?v=cN8uQSiQDkM&amp;t=14s دستور SELECT درSQLدستور SQL SELECT برای بازیابی داده‌ها از یک یا چند جدول پایگاه داده استفاده می‌شود. این دستور می‌تواند تمام یا بخشی از ستون‌ها و سطرهای جدول را انتخاب کند، با استفاده از شرط‌ها، ترتیب‌بندی‌ها، گروه‌بندی‌ها و توابع تجمیعی. برای نمونه، فرض کنید دو جدول داریم که اطلاعات دانشجویان و کلاس‌های آن‌ها را نگهداری می‌کنند:جدول در پایگاه دادهاگر بخواهیم نام و نام خانوادگی دانشجویانی را بدست آوریم که در کلاس ریاضی شرکت می‌کنند، می‌توانیم از دستور SELECT به شکل زیر استفاده کنیم:SELECT fname, sname
FROM students
WHERE class_id = 1;این دستور از جدول students فقط دو ستون fname و sname را انتخاب می‌کند و از بین سطرها، فقط آن‌هایی را که مقدار class_id آن‌ها برابر با 1 است. خروجی این دستور به شکل زیر خواهد بود:جدول در پایگاه داده اگر بخواهیم نام و نام خانوادگی دانشجویان را به همراه نام کلاس و معلم آن‌ها بدست آوریم، می‌توانیم از دستور SELECT به همراه JOIN استفاده کنیم. JOIN یک عملیات است که دو یا چند جدول را بر اساس یک ستون مشترک به هم متصل می‌کند. برای مثال، دستور زیر از JOIN بین جدول‌های students و classes بر اساس ستون class_id استفاده می‌کند:SELECT fname, sname, class_name, teacher
FROM students
JOIN classes
ON students.class_id = classes.class_id;این دستور از هر دو جدول چهار ستون را انتخاب می‌کند و بر اساس شرطی که در بخش ON مشخص شده است، سطرهایی را که مقدار class_id آن‌ها یکسان است، به هم می‌چسباند. خروجی این دستور به شکل زیر خواهد بود:جدول در پایگاه داده برای مطالعه بیشترblog.faradars.org https://www.youtube.com/watch?v=wP-EYQGnhsg&amp;t=31s دستور های CREATE و DROP در SQL https://youtu.be/XIz_bqwCTXQ?si=6j3kIFYAD1u3bgjK  https://virgool.io/p/fw26kufqss0o/%D8%AF%D8%B3%D8%AA%D9%88%D8%B1CREATE%D8%A8%D8%B1%D8%A7%DB%8C%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF%DB%8C%DA%A9%D8%B4%DB%8C%D8%A1%D8%AC%D8%AF%DB%8C%D8%AF%D8%AF%D8%B1%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87%D8%AF%D8%A7%D8%AF%D9%87%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87%D9%85%DB%8C%E2%80%8C%D8%B4%D9%88%D8%AF.%D8%A7%DB%8C%D9%86%D8%B4%DB%8C%D8%A1%D9%85%DB%8C%E2%80%8C%D8%AA%D9%88%D8%A7%D9%86%D8%AF%DB%8C%DA%A9%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87%D8%AF%D8%A7%D8%AF%D9%87%D8%8C%DB%8C%DA%A9%D8%AC%D8%AF%D9%88%D9%84%D8%8C%DB%8C%DA%A9%D8%AA%D8%A7%D8%A8%D8%B9%D8%8C%DB%8C%DA%A9%D9%86%D9%85%D8%A7%DB%8C%D8%B4%D8%8C%DB%8C%DA%A9%D8%A7%D9%86%D8%AF%DB%8C%D8%B3%D9%88%D8%BA%DB%8C%D8%B1%D9%87%D8%A8%D8%A7%D8%B4%D8%AF.%D8%A8%D8%B1%D8%A7%DB%8C%D9%85%D8%AB%D8%A7%D9%84%D8%8C%D8%A7%DA%AF%D8%B1%D8%A8%D8%AE%D9%88%D8%A7%D9%87%DB%8C%D9%85%DB%8C%DA%A9%D8%AC%D8%AF%D9%88%D9%84%D8%AC%D8%AF%DB%8C%D8%AF%D8%A8%D9%87%D9%86%D8%A7%D9%85customers%D8%A8%D8%A7%D8%B3%D9%87%D8%B3%D8%AA%D9%88%D9%86id%D8%8Cname%D9%88email%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D9%85%D8%8C%D9%85%DB%8C%E2%80%8C%D8%AA%D9%88%D8%A7%D9%86%DB%8C%D9%85%D8%A7%D8%B2%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%B2%DB%8C%D8%B1%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87%DA%A9%D9%86%DB%8C%D9%85: CREATE TABLE customers (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  email VARCHAR(50)
);دستور DROP برای حذف یک شیء موجود از پایگاه داده استفاده می‌شود. این شیء می‌تواند هر چیزی باشد که با دستور CREATE ساخته شده باشد. برای مثال، اگر بخواهیم جدول customers را از پایگاه داده حذف کنیم، می‌توانیم از دستور زیر استفاده کنیم:DROP TABLE customers;توجه کنید که با اجرای دستور DROP، همه داده‌ها و ساختار شیء مورد نظر از بین می‌روند و برگشت‌پذیر نیستند. بنابراین، قبل از اجرای این دستور، باید از داشتن نسخه پشتیبان از پایگاه داده مطمئن شوید.برای مطالعه بیشتر :عبارت های CREATE و ALTER در SQL — راهنمای جامعاعمال CONSTRAINT ها در SQL  https://www.youtube.com/watch?v=1pvr8RLIFVM اعمالCONSTRAINT ها در SQL، قوانینی هستند که برای محدود کردن نوع و مقدار داده‌هایی که می‌توان در یک جدول ذخیره کرد، اعمال می‌شوند. این قوانین به اطمینان از دقت و اعتبار داده‌ها کمک می‌کنند و هرگونه تغییری را که با آن‌ها در تناقض باشد، ممنوع می‌کنند. برای مثال، اگر بخواهیم یک جدول برای ذخیره اطلاعات مشتریان یک فروشگاه بسازیم، می‌توانیم از CONSTRAINT های زیر استفاده کنیم:عبارت NOT NULL: این CONSTRAINT اجازه نمی‌دهد که مقدار NULL در یک ستون وارد شود. برای مثال، می‌توانیم بگوییم که ستون‌های id، name و email نباید خالی باشند.عبارت UNIQUE: این CONSTRAINT اجازه نمی‌دهد که مقدار تکراری در یک ستون وجود داشته باشد. برای مثال، می‌توانیم بگوییم که ستون‌های id و email باید منحصر به فرد باشند.عبارت PRIMARY KEY: این CONSTRAINT ترکیبی از NOT NULL و UNIQUE است و یک ستون را به عنوان شناسه اصلی یک جدول مشخص می‌کند. برای مثال، می‌توانیم بگوییم که ستون id کلید اصلی جدول است.عبارت FOREIGN KEY: این CONSTRAINT یک ستون را به عنوان کلید خارجی یک جدول مشخص می‌کند و ارتباط بین دو جدول را برقرار می‌کند. برای مثال، اگر بخواهیم یک جدول دیگر برای ذخیره اطلاعات سفارشات مشتریان بسازیم، می‌توانیم بگوییم که ستون customer_id کلید خارجی جدول است و به ستون id جدول مشتریان اشاره می‌کند.عبارت CHECK: این CONSTRAINT یک شرط را برای مقدار یک ستون تعیین می‌کند و اجازه نمی‌دهد که مقداری خارج از محدوده مشخص شده وارد شود. برای مثال، می‌توانیم بگوییم که ستون age باید بزرگتر یا مساوی 18 باشد.با استفاده از این CONSTRAINT ها، می‌توانیم جدول مشتریان را به شکل زیر ایجاد کنیم:CREATE TABLE customers (
  id INT PRIMARY KEY,
  name VARCHAR(50) NOT NULL,
  email VARCHAR(50) UNIQUE NOT NULL,
  age INT CHECK (age &gt;= 18)
);و جدول سفارشات را به شکل زیر ایجاد کنیم:CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT FOREIGN KEY REFERENCES customers(id),
  date DATE NOT NULL,
  amount DECIMAL(10,2) NOT NULL
);برای مطالعه بیشتر constraints (محدودیت ها) در SQLدستور WHERE در SQL https://www.youtube.com/watch?v=aPUqQ_r3Gb4&amp;t=7s دستور WHERE در SQL برای فیلتر کردن داده‌ها در جداول استفاده می‌شود. با استفاده از دستور WHERE، می‌توانید فقط ردیف‌هایی را که شرایط مشخصی را برآورده می‌کنند را به عنوان خروجی دریافت کنید. دستور WHERE در SQL شامل یک عبارت منطقی است که شرایطی را برای فیلتر کردن داده‌ها مشخص می‌کند.برای استفاده از دستور WHERE، باید آن را پس از دستور SELECT و تعیین ستون‌ها از جدول مورد نظر به کار ببرید. ساختار یک دستور SQL که در آن از بند WHERE استفاده می‌شود به صورت زیر است:SELECT * FROM table_name WHERE column_name = &#039;criteria&#039;;این دستور دو بخش دارد. بخش نخست (* SELECT) مشخص می‌کند که چه ستون‌هایی را می‌خواهیم انتخاب کنیم. علامت ستاره به این معنی است که می‌خواهیم همه ستون‌های جدول را انتخاب کنیم. بخش دوم (FROM table_name) به موتور پایگاه داده اعلام می‌کند که می‌خواهیم داده‌ها را از کجا دریافت کنیم. در استفاده‌های عملی باید به‌جای کلمه «table»، نام جدولی را بنویسیم که قصد داریم داده‌ها را از آن دریافت کنیم. بخش سوم (WHERE column_name = ‘criteria’) شرطی را برای فیلتر کردن داده‌ها تعیین می‌کند. در این بخش، باید نام ستونی را که می‌خواهیم بر اساس آن فیلتر کنیم و مقداری را که می‌خواهیم با آن مقایسه کنیم را مشخص کنیم. می‌توانیم از عملگرهای مختلفی مانند =، &lt;، &gt;، &lt;&gt;، BETWEEN، IN، LIKE و غیره برای مقایسه استفاده کنیم.برای مثال، فرض کنید دو جدول داریم که اطلاعات دانشجویان و کلاس‌های آن‌ها را نگهداری می‌کنند:اگر بخواهیم نام و نام خانوادگی دانشجویانی را بدست آوریم که در کلاس ریاضی شرکت می‌کنند، می‌توانیم از دستور SELECT به همراه WHERE به شکل زیر استفاده کنیم:SELECT fname, sname
FROM students
WHERE class_id = 1;این دستور از جدول students فقط دو ستون fname و sname را انتخاب می‌کند و از بین سطرها، فقط آن‌هایی را که مقدار class_id آن‌ها برابر با 1 است. خروجی این دستور به شکل زیر خواهد بود:اگر بخواهیم نام و نام خانوادگی دانشجویان را به همراه نام کلاس و معلم آن‌ها بدست آوریم، می‌توانیم از دستور SELECT به همراه JOIN و WHERE استفاده کنیم. JOIN یک عملیات است که دو یا چند جدول را بر اساس یک ستون مشترک به هم متصل می‌کند. برای مثال، دستور زیر از JOIN بین جدول‌های students و classes بر اساس ستون class_id استفاده می‌کند و فقط دانشجویانی را که در کلاس ریاضی هستند را نمایش می‌دهد:SELECT fname, sname, class_name, teacher
FROM students
JOIN classes
ON students.class_id = classes.class_id
WHERE class_name = &#039;Math&#039;;این دستور از هر دو جدول چهار ستون را انتخاب می‌کند و بر اساس شرطی که در بخش ON مشخص شده است، سطرهایی را که مقدار class_id آن‌ها یکسان است، به هم می‌چسباند. سپس با استفاده از بخش WHERE، فقط سطرهایی را که مقدار class_name آن‌ها برابر با ‘Math’ است را فیلتر می‌کند. خروجی این دستور به شکل زیر خواهد بود: برای مطالعه بیشتر : دستور شرطی WHERE در sqlدستور ORDER BY در SQLدستور &#x60;ORDER BY&#x60; در SQL برای مرتب‌سازی نتایج یک کوئری استفاده می‌شود. این دستور به شما این امکان را می‌دهد که نتایج را بر اساس یک یا چند ستون مشخص شده مرتب کنید. می‌توانید از آن برای مرتب‌سازی به صورت صعودی (ASC) یا نزولی (DESC) استفاده کنید.مثال:فرض کنید که شما جدولی به نام &#x60;employees&#x60; با ستون‌های &#x60;employee_id&#x60;، &#x60;first_name&#x60; و &#x60;last_name&#x60; دارید و می‌خواهید لیست کارمندان را بر اساس نام خانوادگی آن‌ها مرتب کنید.
SELECT employee_id, first_name, last_name
FROM employees
ORDER BY last_name;در این مثال، دستور &#x60;ORDER BY last_name&#x60; باعث مرتب‌سازی نتایج بر اساس ستون &#x60;last_name&#x60; می‌شود، و نتایج به صورت صعودی (از A به Z) نمایش داده می‌شوند. اگر می‌خواهید نتایج به صورت نزولی نمایش داده شوند، می‌توانید از &#x60;ORDER BY last_name DESC&#x60; استفاده کنید.SELECT employee_id, first_name, last_name
FROM employees
ORDER BY last_name DESC;در این حالت، نتایج به صورت نزولی (از Z به A) نمایش داده می‌شوند.دستور های AND -OR -NOT دستورات &#x60;AND&#x60;، &#x60;OR&#x60; و &#x60;NOT&#x60; در SQL برای ایجاد شرایط پیچیده در جملات &#x60;WHERE&#x60; یا &#x60;HAVING&#x60; استفاده می‌شوند.دستور AND:   دستور&#x60;AND&#x60; برای افزودن یک شرط اضافی به جمله &#x60;WHERE&#x60; استفاده می‌شود و هر دو شرط باید درست باشند تا یک ردیف در نتیجه قرار گیرد.   مثال:   &#x60;&#x60;&#x60;sql   SELECT *
   FROM employees
   WHERE department = &#039;IT&#039; AND salary &gt; 50000   این کوئری تمام کارمندانی را که در بخش IT کار می‌کنند و حقوقشان بیشتر از 50000 دلار است را باز می‌گرداند.دستور OR:دستور   &#x60;OR&#x60; برای افزودن یک شرط جدید به جمله &#x60;WHERE&#x60; استفاده می‌شود و حداقل یکی از شرایط باید درست باشد تا یک ردیف در نتیجه قرار گیرد.   مثال:   &#x60;&#x60;&#x60;sql   SELECT *
   FROM employees
   WHERE department = &#039;HR&#039; OR department = &#039;Finance&#039;;   این کوئری تمام کارمندانی را که در بخش HR یا Finance کار می‌کنند را باز می‌گرداند.دستور NOT:  دستور  &#x60;NOT&#x60; برای منفی کردن یک شرط استفاده می‌شود، یعنی ردیف‌هایی که شرط داخل &#x60;NOT&#x60; آن درست نیستند.   مثال:  SELECT *
   FROM employees
   WHERE NOT dep
artment = &#039;IT&#039;;   این کوئری تمام کارمندانی را باز می‌گرداند که در بخش IT کار نمی‌کنند.این دستورات را می‌توانید با هم ترکیب کرده و از پرانتزها برای اولویت در اجرا استفاده کنید تا شرایط مورد نظر خود را ایجاد کنید.دستور  INSERT INTOدستور &#x60;INSERT INTO&#x60; در SQL برای افزودن ردیف جدید به یک جدول استفاده می‌شود. این دستور به شما این امکان را می‌دهد که داده‌های جدید را به یک جدول اضافه کنید. فرمت کلی دستور به این صورت است:INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);ا- &#x60;table_name&#x60;: نام جدول که می‌خواهید داده را به آن اضافه کنید.ب- &#x60;column1, column2, column3, ...&#x60;: نام ستون‌هایی که می‌خواهید داده را در آن‌ها قرار دهید.د- &#x60;value1, value2, value3, ...&#x60;: مقادیر متناظر با ستون‌ها که می‌خواهید اضافه کنید.مثال:فرض کنید یک جدول به نام &#x60;employees&#x60; با ستون‌های &#x60;employee_id&#x60;، &#x60;first_name&#x60; و &#x60;last_name&#x60; دارید و می‌خواهید یک کارمند جدید به این جدول اضافه کنید.&#x60;&#x60;&#x60;sqlINSERT INTO employees (employee_id, first_name, last_name)
VALUES (101, &#039;John&#039;, &#039;Doe&#039;);در این مثال، یک ردیف جدید با مقادیر مشخص شده به ستون‌های &#x60;employee_id&#x60;، &#x60;first_name&#x60; و &#x60;last_name&#x60; اضافه شده است. می‌توانید برای افزودن ردیف‌های دیگر نیز از همین الگو استفاده کنید.اگر مقادیر برای تمام ستون‌ها مشخص نشوند، باید مطمئن شوید که مقادیری که برای ستون‌های الزامی هستند (مانند کلید اصلی) وارد شده باشند یا مقدار پیش‌فرض برای آن‌ها تعیین شده باشد.دستور UPDATE  https://www.youtube.com/watch?v=Qq0AUcYaWUs دستور &#x60;UPDATE&#x60; در SQL برای به‌روزرسانی داده‌های موجود در یک جدول استفاده می‌شود. این دستور به شما این امکان را می‌دهد که مقادیر یک یا چند ستون در یک ردیف را تغییر دهید. فرمت کلی دستور به این صورت است:&#x60;&#x60;&#x60;sqlUPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;&#x60;&#x60;&#x60;- &#x60;table_name&#x60;: نام جدول که می‌خواهید داده‌ها را در آن به‌روزرسانی کنید.- &#x60;column1, column2, ...&#x60;: نام ستون‌هایی که می‌خواهید مقدار آن‌ها را تغییر دهید.- &#x60;value1, value2, ...&#x60;: مقادیر جدیدی که به جای مقادیر فعلی ستون‌ها قرار گیرند.- &#x60;WHERE condition&#x60;: شرطی که مشخص می‌کند که کدام ردیف‌ها باید به‌روزرسانی شوند. اگر این بخش حذف شود، تمام ردیف‌های جدول به‌روزرسانی می‌شوند.مثال:فرض کنید یک جدول به نام &#x60;employees&#x60; با ستون‌های &#x60;employee_id&#x60;، &#x60;first_name&#x60; و &#x60;last_name&#x60; دارید و می‌خواهید نام یک کارمند را به‌روزرسانی کنید.&#x60;&#x60;&#x60;sqlUPDATE employeesSET first_name = &#x27;Robert&#x27;WHERE employee_id = 101;&#x60;&#x60;&#x60;در این مثال، نام کارمند با &#x60;employee_id&#x60; برابر با 101 به &quot;Robert&quot; تغییر می‌کند. حتماً از شرط &#x60;WHERE&#x60; استفاده کنید تا فقط ردیف‌های مورد نظر به‌روزرسانی شوند و تمام جدول تحت تأثیر قرار نگیرد.دستور DELETEدستور &#x60;DELETE&#x60; در SQL برای حذف ردیف‌های داده از یک جدول استفاده می‌شود. این دستور به شما این امکان را می‌دهد که یک یا چند ردیف از یک جدول را حذف کنید. فرمت کلی دستور به این صورت است:&#x60;&#x60;&#x60;sqlDELETE FROM table_name
WHERE condition;- &#x60;table_name&#x60;: نام جدول که می‌خواهید از آن ردیف‌ها را حذف کنید.- &#x60;WHERE condition&#x60;: شرطی که مشخص می‌کند که کدام ردیف‌ها باید حذف شوند. اگر این بخش حذف شود، تمام ردیف‌های جدول حذف می‌شوند.مثال:فرض کنید یک جدول به نام &#x60;employees&#x60; با ستون‌های &#x60;employee_id&#x60;، &#x60;first_name&#x60; و &#x60;last_name&#x60; دارید و می‌خواهید یک کارمند خاص را حذف کنید.&#x60;&#x60;&#x60;sqlDELETE FROM employees
WHERE employee_id = 101;در این مثال، ردیفی که &#x60;employee_id&#x60; برابر با 101 است، از جدول &#x60;employees&#x60; حذف می‌شود. همچنین می‌توانید از شرایط مختلفی برای حذف ردیف‌ها استفاده کنید، مانند حذف تمام ردیف‌هایی که حقوق آن‌ها زیر 50000 دلار است و غیره. اطمینان حاصل کنید که از شرط &#x60;WHERE&#x60; استفاده کنید تا تنها ردیف‌های مورد نظر حذف شوند و داده‌های کل جدول از دست نروند.دستور SELECT TOPدستور &#x60;SELECT TOP&#x60; در SQL برای بازیابی تعداد محدودی ردیف از نتایج یک کوئری استفاده می‌شود. این دستور معمولاً با پایگاه‌های داده مایکروسافت SQL Server و Access استفاده می‌شود. فرمت کلی دستور &#x60;SELECT TOP&#x60; به این صورت است:&#x60;&#x60;&#x60;sqlSELECT TOP (n) column1, column2, ...
FROM table_name
WHERE condition;- &#x60;n&#x60;: تعداد ردیف‌هایی که می‌خواهید بازیابی کنید.- &#x60;column1, column2, ...&#x60;: ستون‌هایی که می‌خواهید از آن‌ها اطلاعات را بازیابی کنید.- &#x60;table_name&#x60;: نام جدول که می‌خواهید اطلاعات از آن را بازیابی کنید.- &#x60;WHERE condition&#x60;: شرطی که مشخص می‌کند کدام ردیف‌ها باید در نتیجه قرار گیرند.مثالفرض کنید یک جدول به نام &#x60;employees&#x60; با ستون‌های &#x60;employee_id&#x60;، &#x60;first_name&#x60; و &#x60;last_name&#x60; دارید و می‌خواهید سه نفر اول را بازیابی کنید.&#x60;&#x60;&#x60;sqlSELECT TOP 3 employee_id, first_name, last_name
FROM employees
ORDER BY employee_id;در این مثال، &#x60;TOP 3&#x60; به معنای بازیابی سه ردیف اول است و این ردیف‌ها بر اساس مقدار &#x60;employee_id&#x60; مرتب شده‌اند. می‌توانید از هر ستون دیگری نیز برای مرتب‌سازی استفاده کنید.توجه داشته باشید که استفاده از &#x60;TOP&#x60; به تنهایی برخی پایگاه‌های داده ممکن است پشتیبانی نکنند. در این صورت، معمولاً از &#x60;LIMIT&#x60; یا &#x60;FETCH FIRST&#x60; (برخی از پایگاه‌های داده مانند MySQL و PostgreSQL) استفاده می‌شود.دستور  MIN و MAXدستورهای &#x60;MIN&#x60; و &#x60;MAX&#x60; در SQL برای گرفتن مقدار کمترین و بیشترین مقدار یک ستون به ترتیب استفاده می‌شوند. این دستورات به شما این امکان را می‌دهند که مقادیر حداقل و حداکثر یک ستون را در یک جدول بازیابی کنید. MIN:&#x60;&#x60;&#x60;sqlSELECT MIN(column_name)
FROM table_name
WHERE condition;- &#x60;column_name&#x60;: نام ستونی که می‌خواهید مقدار کمترین آن را بررسی کنید.- &#x60;table_name&#x60;: نام جدولی که در آن می‌خواهید جستجو کنید.- &#x60;WHERE condition&#x60;: شرطی که مشخص می‌کند چه ردیف‌هایی در نظر گرفته شوند (اختیاری).مثال &#x60;MIN&#x60;:&#x60;&#x60;&#x60;sqlSELECT MIN(salary)FROM employeesWHERE department = &#x27;IT&#x27;;&#x60;&#x60;&#x60;این کوئری کمترین حقوق کارمندان بخش IT را بازیابی می‌کند.MAX:&#x60;&#x60;&#x60;sqlSELECT MAX(column_name)
FROM table_name
WHERE condition;- &#x60;column_name&#x60;: نام ستونی که می‌خواهید مقدار بیشترین آن را بررسی کنید.- &#x60;table_name&#x60;: نام جدولی که در آن می‌خواهید جستجو کنید.- &#x60;WHERE condition&#x60;: شرطی که مشخص می‌کند چه ردیف‌هایی در نظر گرفته شوند (اختیاری).مثال &#x60;MAX&#x60;:&#x60;&#x60;&#x60;sqlSELECT MAX(salary)
FROM employees
WHERE department = &#039;HR&#039;;این کوئری بیشترین حقوق کارمندان بخش HR را بازیابی می‌کند.استفاده از &#x60;MIN&#x60; و &#x60;MAX&#x60; به شما این امکان را می‌دهد که به سرعت به مقدار حداقل یا حداکثر یک ستون دسترسی پیدا کنید و از این اطلاعات در کوئری‌های خود استفاده کنید.دستورات COUNT ,SUM ,AVGدستورات &#x60;COUNT&#x60;, &#x60;SUM&#x60;, و &#x60;AVG&#x60; در SQL برای انجام عملیات تجمیع بر روی داده‌های یک ستون می‌باشند. این دستورات به شما این امکان را می‌دهند که تعداد ردیف‌ها، جمع مقادیر یک ستون، و میانگین این مقادیر را به دست آورید. &#x60;COUNT&#x60;:&#x60;&#x60;&#x60;sqlSELECT COUNT(column_name)
FROM table_name
WHERE condition;- &#x60;column_name&#x60;: نام ستون یا عبارتی که تعداد ردیف‌ها بر اساس آن محاسبه می‌شود (می‌تواند &#x60;*&#x60; هم باشد که به تعداد کل ردیف‌ها اشاره دارد).- &#x60;table_name&#x60;: نام جدولی که در آن می‌خواهید تعداد ردیف‌ها را حساب کنید.- &#x60;WHERE condition&#x60;: شرطی که مشخص می‌کند چه ردیف‌هایی در نظر گرفته شوند (اختیاری).مثال &#x60;COUNT&#x60;:&#x60;&#x60;&#x60;sqlSELECT COUNT(employee_id)
FROM employees
WHERE department = &#039;Sales&#039;;این کوئری تعداد کارمندانی را که در بخش فروش (&#x60;Sales&#x60;) مشغول به کار هستند را برمی‌گرداند. &#x60;SUM&#x60;:&#x60;&#x60;&#x60;sqlSELECT SUM(column_name)
FROM table_name
WHERE condition;- &#x60;column_name&#x60;: نام ستونی که می‌خواهید جمع مقادیر آن را بررسی کنید.- &#x60;table_name&#x60;: نام جدولی که در آن می‌خواهید جمع مقادیر را حساب کنید.- &#x60;WHERE condition&#x60;: شرطی که مشخص می‌کند چه ردیف‌هایی در نظر گرفته شوند (اختیاری).مثال &#x60;SUM&#x60;:&#x60;&#x60;&#x60;sqlSELECT SUM(salary)
FROM employees
WHERE department = &#039;Finance&#039;;این کوئری جمع حقوق کارمندان بخش مالی (&#x60;Finance&#x60;) را برمی‌گرداند. &#x60;AVG&#x60;:&#x60;&#x60;&#x60;sqlSELECT AVG(column_name)
FROM table_name
WHERE condition;- &#x60;column_name&#x60;: نام ستونی که می‌خواهید میانگین مقادیر آن را بررسی کنید.- &#x60;table_name&#x60;: نام جدولی که در آن می‌خواهید میانگین مقادیر را حساب کنید.- &#x60;WHERE condition&#x60;: شرطی که مشخص می‌کند چه ردیف‌هایی در نظر گرفته شوند (اختیاری).مثال &#x60;AVG&#x60;:&#x60;&#x60;&#x60;sqlSELECT AVG(salary)
FROM employees
WHERE department = &#039;IT&#039;;
این کوئری میانگین حقوق کارمندان بخش IT را برمی‌گرداند.استفاده از این دستورات به شما این امکان را می‌دهد که اطلاعات خلاصه‌ای از داده‌های جدول را به دست آورید و از آن در تحلیل‌ها و گزارش‌های خود استفاده کنید.دستور LIKE در SQLدستور &#x60;LIKE&#x60; در SQL برای جستجوی الگویی در مقدار یک ستون با استفاده از عبارات باقی‌مانده (wildcards) می‌باشد. این دستور به شما این امکان را می‌دهد که الگوهای مشخصی را در داده‌ها جستجو کنید.فرمت کلی دستور &#x60;LIKE&#x60; به این صورت است:&#x60;&#x60;&#x60;sqlSELECT column1, column2, ...
FROM table_name
WHERE column_name LIKE pattern;- &#x60;column1, column2, ...&#x60;: ستون‌هایی که می‌خواهید اطلاعات را دریافت کنید.- &#x60;table_name&#x60;: نام جدولی که در آن می‌خواهید جستجو کنید.- &#x60;column_name&#x60;: ستونی که در آن می‌خواهید الگو را جستجو کنید.- &#x60;pattern&#x60;: الگویی که می‌خواهید در ستون مشخص شده جستجو کنید.در الگوها، می‌توان از دو عبارت باقی‌مانده استفاده کرد:- &#x60;%&#x60;: باقی‌مانده‌ای از هر تعداد کاراکتر.- &#x60;_&#x60;: یک کاراکتر.مثال:فرض کنید یک جدول به نام &#x60;employees&#x60; با ستون‌های &#x60;employee_id&#x60; و &#x60;first_name&#x60; دارید و می‌خواهید تمام کارمندانی را بازیابی کنید که نام آن‌ها با حرف &quot;J&quot; شروع می‌شود.&#x60;&#x60;&#x60;sqlSELECT employee_id, first_name
FROM employees
WHERE first_name LIKE &#039;J%&#039;;&#x60;&#x60;&#x60;این کوئری تمام کارمندانی را که نامشان با حرف &quot;J&quot; شروع می‌شود را بازمی‌گرداند.مثال با &#x60;_&#x60;اگر بخواهید کارمندانی با نام دقیقاً سه حرف داشته باشند، می‌توانید از &#x60;_&#x60; استفاده کنید.&#x60;&#x60;&#x60;sqlSELECT employee_id, first_name
FROM employees
WHERE first_name LIKE &#039;___&#039;; -- نام سه حرفیدر این مثال، کارمندانی با نام دقیقاً سه حرف را بازمی‌گرداند.ا- WILDCARD ها در SQLWildcards یا باقی‌مانده‌ها در SQL برای جستجوی مقادیر با الگوهای مشخص و انعطاف‌پذیر استفاده می‌شوند. این باقی‌مانده‌ها در دستورات &#x60;LIKE&#x60; و دستورات مشابه استفاده می‌شوند. برخی از اصطلاحات باقی‌مانده‌ها عبارتند از:&#x60;%&#x60;: باقی‌مانده هر تعداد کاراکتر**   - مثال: &#x27;J%&#x27; (هر چیزی که با J شروع شود)&#x60;_&#x60;: یک کاراکتر   - مثال: &#x60;&#x27;_ohn&#x27;&#x60; (هر چیزی که با یک حرف شروع شده و سپس ohn داشته باشد)&#x60;[ ]&#x60;: باقی‌مانده از یک مجموعه از کاراکترها   - مثال: &#x60;&#x27;[JM]ohn&#x27;&#x60; (هر چیزی که با J یا M شروع شده و سپس ohn داشته باشد)&#x60;[^]&#x60;: باقی‌مانده از کاراکترهای غیر از مجموعه مشخص   - مثال: &#x27;[^A-M]ohn&#x27; (هر چیزی که با یک حرف از A تا M شروع نشده و سپس ohn داشته باشد)ا-&#x60;[a-z]&#x60;, &#x60;[0-9]&#x60;: باقی‌مانده از یک محدوده کاراکتر یا اعداد   - مثال: &#x60;&#x27;[0-9]ohn&#x27;&#x60; (هر چیزی که با یک عدد شروع شده و سپس ohn داشته باشد)مثال:فرض کنید که یک جدول به نام &#x60;products&#x60; با ستون &#x60;product_name&#x60; دارید و می‌خواهید تمام محصولاتی را که با حرف &quot;C&quot; شروع شده و دقیقاً 3 کاراکتر دارند بازیابی کنید.&#x60;&#x60;&#x60;sqlSELECT product_name
FROM products
WHERE product_name LIKE &#039;C__&#039;;در این مثال، باقی‌مانده &#x60;__&#x60; به معنای دقیقاً دو کاراکتر برای جایگزینی است.دستور INدستور &#x60;IN&#x60; در SQL برای جستجوی داده‌ها بر اساس مقادیر چندگانه یا یک زیرکوئری (subquery) می‌باشد. این دستور به شما این امکان را می‌دهد تا بتوانید ردیف‌هایی که مقدار یک ستون در میان یک مجموعه مقادیر مشخص شده است یا در نتیجه یک زیرکوئری قرار دارد را انتخاب کنید. با استفاده از مقادیر چندگانه:&#x60;&#x60;&#x60;sqlSELECT column1, column2, ...
FROM table_name
WHERE column_name IN (value1, value2, ...);- &#x60;column1, column2, ...&#x60;: ستون‌هایی که می‌خواهید اطلاعات را دریافت کنید.- &#x60;table_name&#x60;: نام جدولی که در آن می‌خواهید جستجو کنید.- &#x60;column_name&#x60;: نام ستونی که مقدار آن با مقادیر مشخص شده مقایسه می‌شود.- &#x60;(value1, value2, ...)&#x60;: یک مجموعه از مقادیر که می‌خواهید مقدار ستون مشخص شده با آن‌ها مقایسه شود.**مثال&#x60;&#x60;&#x60;sqlSELECT product_name, price
FROM products
WHERE category IN (&#039;Electronics&#039;, &#039;Clothing&#039;, &#039;Home&#039;);این کوئری تمام محصولاتی را بازمی‌گرداند که دسته بندی آن‌ها برابر با &#x27;Electronics&#x27;، &#x27;Clothing&#x27; یا &#x27;Home&#x27; باشد. با استفاده از زیرکوئری:&#x60;&#x60;&#x60;sqlSELECT column1, column2, ...
FROM table_name
WHERE column_name IN (SELECT column_name FROM another_table WHERE condition);در این حالت، &#x60;IN&#x60; از نتایج یک زیرکوئری برای مقایسه با مقادیر ستون استفاده می‌شود.مثال:&#x60;&#x60;&#x60;sqlSELECT product_name, price
FROM products
WHERE category IN (SELECT category FROM categories WHERE is_popular = 1);این کوئری تمام محصولاتی را بازمی‌گرداند که دسته بندی آن‌ها در جدول &#x60;categories&#x60; با مقدار &#x60;is_popular&#x60; برابر با 1 است.استفاده از &#x60;IN&#x60; مفید است زمانی که می‌خواهید از یک مجموعه مقادیر یا نتایج یک زیرکوئری برای فیلتر کردن نتایج یک کوئری استفاده کنید.دستور BETWEENدستور &#x60;BETWEEN&#x60; در SQL برای جستجوی مقادیر در یک محدوده خاص از مقادیر نمایش داده شده است. این دستور به شما این امکان را می‌دهد تا مقادیر یک ستون را بین دو مقدار مشخص شده (حد پایین و حد بالا) در یک محدوده جستجو کنید.فرمت کلی دستور &#x60;BETWEEN&#x60; به این صورت است:&#x60;&#x60;&#x60;sqlSELECT column1, column2, ...
FROM table_name
WHERE column_name BETWEEN value1 AND value2;- &#x60;column1, column2, ...&#x60;: ستون‌هایی که می‌خواهید اطلاعات را دریافت کنید.- &#x60;table_name&#x60;: نام جدولی که در آن می‌خواهید جستجو کنید.- &#x60;column_name&#x60;: نام ستونی که مقدار آن بین دو مقدار مشخص شده در &#x60;BETWEEN&#x60; جستجو می‌شود.- &#x60;value1&#x60; و &#x60;value2&#x60;: مقدار حد پایین و حد بالای محدوده.مثال:فرض کنید یک جدول به نام &#x60;sales&#x60; با ستون‌های &#x60;sale_date&#x60; و &#x60;amount&#x60; دارید و می‌خواهید تمام فروش‌هایی را بازیابی کنید که در تاریخ بین دو روز مشخص شده انجام شده است.&#x60;&#x60;&#x60;sqlSELECT sale_date, amount
FROM sales
WHERE sale_date BETWEEN &#039;2022-01-01&#039; AND &#039;2022-01-31&#039;;در این مثال، تمام فروش‌هایی که در ماه ژانویه 2022 انجام شده‌اند، بر اساس مقادیر &#x60;sale_date&#x60; بین &#x27;2022-01-01&#x27; و &#x27;2022-01-31&#x27; بازیابی می‌شوند.دستور &#x60;BETWEEN&#x60; مفید است زمانی که می‌خواهید داده‌هایی را در یک بازه زمانی یا بازه مقداری مشخص کنید و در نتیجه فقط آنهایی که در این محدوده قرار دارند، نمایش داده شوند.دستور JOIN و انوع آنانواع JOIN در SQLدستور &#x60;JOIN&#x60; در SQL برای ادغام داده‌ها از چندین جدول بر اساس شرایط مشخص استفاده می‌شود. این دستور به شما این امکان را می‌دهد که اطلاعات مرتبط از چند جدول را در یک نتیجه ترکیب کرده و از آن در یک کوئری استفاده کنید.نوع‌های مختلف &#x60;JOIN&#x60; عبارتند از:دستور &#x60;INNER JOIN&#x60; (JOIN):این نوع &#x60;JOIN&#x60; تنها ردیف‌هایی را بازمی‌گرداند که مطابقت دارند.   &#x60;&#x60;&#x60;sql   SELECT column1, column2, ...
   FROM table1
   INNER JOIN table2 ON table1.column_name = table2.column_name;
ا. LEFT JOIN (یا &#x60;LEFT OUTER JOIN&#x60;):این نوع &#x60;JOIN&#x60; تمام ردیف‌های از جدول سمت چپ (table1) را با ردیف‌های مطابق از جدول سمت راست (table2) نمایش می‌دهد. اگر مطابقت نداشته باشد، مقادیر از جدول سمت راست &#x60;NULL&#x60; خواهند بود.   &#x60;&#x60;&#x60;sql   SELECT column1, column2, ...
   FROM table1
   LEFT JOIN table2 ON table1.column_name = table2.column_name;دستور RIGHT JOIN&#x60; (یا &#x60;RIGHT OUTER JOIN&#x60;): این نوع &#x60;JOIN&#x60; تمام ردیف‌های از جدول سمت راست (table2) را با ردیف‌های مطابق از جدول سمت چپ (table1) نمایش می‌دهد. اگر مطابقت نداشته باشد، مقادیر از جدول سمت چپ &#x60;NULL&#x60; خواهند بود.   &#x60;&#x60;&#x60;sql   SELECT column1, column2, ...
   FROM table1
   RIGHT JOIN table2 ON table1.column_name = table2.column_name;دستور&#x60;FULL JOIN&#x60; (یا &#x60;FULL OUTER JOIN&#x60;): این نوع &#x60;JOIN&#x60; تمام ردیف‌های هر دو جدول را با یکدیگر نمایش می‌دهد. اگر مطابقت نداشته باشد، مقادیر مربوطه &#x60;NULL&#x60; خواهند بود.   &#x60;&#x60;&#x60;sql   SELECT column1, column2, ...
   FROM table1
   FULL JOIN table2 ON table1.column_name = table2.column_name;   &#x60;&#x60;&#x60;دستور &#x60;CROSS JOIN&#x60;: این نوع &#x60;JOIN&#x60; همه ردیف‌های یک جدول را با همه ردیف‌های جدول دیگر ترکیب می‌کند، بدون در نظر گرفتن هیچ شرطی.   &#x60;&#x60;&#x60;sql   SELECT column1, column2, ...
   FROM table1
   CROSS JOIN table2;در هر یک از نوع‌های &#x60;JOIN&#x60;، شرط اتصال (&#x60;ON&#x60;) مشخص کننده این است که کدام ستون‌ها از جداول مختلف با یکدیگر مطابقت دارند. استفاده از &#x60;JOIN&#x60;‌ها به شما این امکان را می‌دهد که اطلاعات مرتبط از چندین جدول را به هم پیوند داده و نتایج پیچیده‌تری را به دست آورید.دستور UNION در SQLدستور &#x60;UNION&#x60; در SQL برای ادغام (ترکیب) نتایج دو یا چند کوئری با حذف تکرارها استفاده می‌شود. این دستور به شما این امکان را می‌دهد تا نتایج مشابه از چندین کوئری را در یک نتیجه ترکیب کنید.فرمت کلی دستور &#x60;UNION&#x60; به این صورت است:&#x60;&#x60;&#x60;sqlSELECT column1, column2, ...
FROM table1
WHERE condition
UNION
SELECT column1, column2, ...
FROM table2
WHERE condition;
- &#x60;column1, column2, ...&#x60;: ستون‌هایی که می‌خواهید اطلاعات را دریافت کنید.- &#x60;table1&#x60;, &#x60;table2&#x60;, ...: نام جدول یا جدول‌هایی که از آن‌ها اطلاعات را می‌خواهید.- &#x60;condition&#x60;: شرایطی که مشخص می‌کنند که کدام ردیف‌ها در نتیجه قرار گیرند (اختیاری).**مثال:**فرض کنید دو جدول به نام &#x60;customers1&#x60; و &#x60;customers2&#x60; دارید که اطلاعات مشابهی در آن‌ها ذخیره شده است ولی در دو جدول جداگانه. می‌خواهید نتایج مشابه این دو جدول را با حذف تکرارها ترکیب کنید.&#x60;&#x60;&#x60;sqlSELECT customer_id, first_name, last_name
FROM customers1
UNION
SELECT customer_id, first_name, last_name
FROM customers2;دستور &#x60;UNION&#x60; نتایج مشابه از هر دو کوئری را ترکیب کرده و تکرارها را حذف می‌کند. اگر می‌خواهید تمام ردیف‌ها را با تکرارها نیز نمایش دهید، می‌توانید از &#x60;UNION ALL&#x60; استفاده کنید.&#x60;&#x60;&#x60;sqlSELECT customer_id, first_name, last_name
FROM customers1
UNION ALL
SELECT customer_id, first_name, last_name
FROM customers2;استفاده از &#x60;UNION&#x60; مفید است زمانی که می‌خواهید نتایج مشابه از چندین جدول یا کوئری را در یک نتیجه ترکیب کنید و تکرارها را حذف کنید.دستور GROUP BY در SQLدستور &#x60;GROUP BY&#x60; در SQL برای گروه‌بندی ردیف‌های نتیجه کوئری بر اساس مقادیر خاص در یک یا چند ستون استفاده می‌شود. این دستور به شما این امکان را می‌دهد تا داده‌های خود را بر اساس یک یا چند ویژگی گروه‌بندی کرده و سپس عملیات تجمیع مانند محاسبه مجموع، میانگین، تعداد و ... را بر روی هر گروه انجام دهید.فرمت کلی دستور &#x60;GROUP BY&#x60; به این صورت است:&#x60;&#x60;&#x60;sqlSELECT column1, column2, ..., aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column1, column2, ...;- &#x60;column1, column2, ...&#x60;: ستون‌هایی که می‌خواهید نتایج را بر اساس آن‌ها گروه‌بندی کنید.- &#x60;aggregate_function(column_name)&#x60;: توابع تجمیعی (مانند SUM، AVG، COUNT و ...) که روی ستون‌های گروه‌بندی شده اعمال می‌شوند.- &#x60;table_name&#x60;: نام جدولی که از آن اطلاعات را می‌خواهید.- &#x60;condition&#x60;: شرایطی که مشخص می‌کنند چه ردیف‌هایی در نتیجه گروه‌بندی شوند (اختیاری).**مثال:**فرض کنید یک جدول به نام &#x60;orders&#x60; با ستون‌های &#x60;customer_id&#x60;, &#x60;order_date&#x60; و &#x60;total_amount&#x60; دارید و می‌خواهید مجموع مقدار هر سفارش بر اساس هر مشتری را بدست آورید.&#x60;&#x60;&#x60;sqlSELECT customer_id, SUM(total_amount) AS total_order_amount
FROM orders
GROUP BY customer_id;این کوئری مجموع مقدار هر سفارش بر اساس هر مشتری را بازمی‌گرداند. &#x60;SUM(total_amount)&#x60; به عنوان تابع تجمیعی بر روی ستون &#x60;total_amount&#x60; استفاده شده است.دستور &#x60;GROUP BY&#x60; مفید است زمانی که می‌خواهید داده‌های خود را بر اساس یک یا چند ویژگی مشترک گروه‌بندی کرده و سپس محاسبات تجمیعی بر روی هر گروه انجام دهید.دستور HAVING در SQLدستور &#x60;HAVING&#x60; در SQL به همراه &#x60;GROUP BY&#x60; برای فیلتر کردن نتایج گروه‌بندی شده بر اساس شرایط خاص استفاده می‌شود. این دستور به شما این امکان را می‌دهد که شرایط فیلتر را بر روی گروه‌ها اعمال کنید.فرمت کلی دستور &#x60;HAVING&#x60; به این صورت است:SELECT column1, column2, ..., aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column1, column2, ...
HAVING aggregate_function(column_name) condition;
- &#x60;column1, column2, ...&#x60;: ستون‌هایی که می‌خواهید نتایج را بر اساس آن‌ها گروه‌بندی کنید.- &#x60;aggregate_function(column_name)&#x60;: توابع تجمیعی (مانند SUM، AVG، COUNT و ...) که روی ستون‌های گروه‌بندی شده اعمال می‌شوند.- &#x60;table_name&#x60;: نام جدولی که از آن اطلاعات را می‌خواهید.- &#x60;condition&#x60;: شرایطی که مشخص می‌کنند چه ردیف‌هایی در نتیجه گروه‌بندی شوند (اختیاری).- &#x60;HAVING aggregate_function(column_name) condition&#x60;: شرایط فیلتر بر روی نتایج گروه‌بندی شده.**مثال:**فرض کنید یک جدول به نام &#x60;orders&#x60; با ستون‌های &#x60;customer_id&#x60;, &#x60;order_date&#x60; و &#x60;total_amount&#x60; دارید و می‌خواهید مجموع مقدار هر سفارش بر اساس هر مشتری را بدست آورید، اما فقط آن گروه‌هایی را نمایش دهید که مجموع مقادیرشان بیشتر از 1000 باشد.&#x60;&#x60;&#x60;sqlSELECT customer_id, SUM(total_amount) AS total_order_amount
FROM orders
GROUP BY customer_id
HAVING SUM(total_amount) &gt; 1000;دستور &#x60;HAVING&#x60; در اینجا بر روی نتایج گروه‌بندی شده اعمال شده و فقط گروه‌هایی که مجموع مقادیرشان بیشتر از 1000 است نمایش داده می‌شود.استفاده از &#x60;HAVING&#x60; مفید است زمانی که شما نیاز دارید تا شرایط فیلتر را بر روی گروه‌های گروه‌بندی شده اعمال کنید.دستور های ANYوALL در SQLدستورهای &#x60;ANY&#x60; و &#x60;ALL&#x60; در SQL برای مقایسه مقدار یک ستون با یک زیرکوئری استفاده می‌شوند. این دستورها به شما این امکان را می‌دهند تا مقایسه‌های پیچیده‌تری با داده‌ها انجام دهید.دستور ANY&#x60; (همچنین نامیده می‌شود &#x60;SOME&#x60;):   - &#x60;ANY&#x60; باعث مقایسه مقدار یک ستون با تمام مقادیر مجموعه‌ای از یک زیرکوئری می‌شود و اگر حداقل یک مقدار مطابقت داشته باشد، شرط صحیح می‌شود. مثال:   فرض کنید که می‌خواهید بدانید آیا حداقل یک سفارش با مقدار بیشتر از 1000 وجود دارد یا نه.   &#x60;&#x60;&#x60;sql   SELECT *
   FROM orders
   WHERE total_amount &gt; ANY (SELECT total_amount FROM orders WHERE order_date &gt; &#039;2022-01-01&#039;);   در این مثال، &#x60;ANY&#x60; باعث مقایسه مقدار ستون &#x60;total_amount&#x60; با تمام مقادیر بزرگتر از 1000 در زیرکوئری می‌شود و اگر حداقل یک مقدار مطابقت داشته باشد، شرط انتخاب می‌شود.دستور ALL   دستور- &#x60;ALL&#x60; باعث مقایسه مقدار یک ستون با تمام مقادیر مجموعه‌ای از یک زیرکوئری می‌شود و اگر تمام مقادیر مطابقت داشته باشند، شرط صحیح می‌شود.   **مثال:**   فرض کنید که می‌خواهید بدانید آیا تمام سفارش‌ها مقدار بیشتر از 1000 دارند یا نه.   &#x60;&#x60;&#x60;sql   SELECT *
   FROM orders
   WHERE total_amount &gt; ALL (SELECT 1000 FROM orders);   در این مثال، &#x60;ALL&#x60; باعث مقایسه مقدار ستون &#x60;total_amount&#x60; با تمام مقادیر 1000 در زیرکوئری می‌شود و اگر تمام مقادیر مطابقت داشته باشند، شرط انتخاب می‌شود.در واقع، &#x60;ANY&#x60; بررسی می‌کند که آیا حداقل یک مقدار مطابقت دارد، در حالی که &#x60;ALL&#x60; اطمینان حاصل می‌کند که تمام مقادیر مطابقت دارند. استفاده از این دستورها بستگی به نیازهای خاص کوئری شما دارد.دستور SELECT INTO درSQLدستور &#x60;SELECT INTO&#x60; در SQL برای ایجاد یک جدول جدید با استفاده از نتایج یک کوئری &#x60;SELECT&#x60; استفاده می‌شود. این دستور به شما این امکان را می‌دهد که نتایج یک کوئری را به صورت خودکار در یک جدول جدید ذخیره کنید.فرمت کلی دستور &#x60;SELECT INTO&#x60; به این صورت است:&#x60;&#x60;&#x60;sqlSELECT column1, column2, ...
INTO new_table
FROM existing_table
WHERE condition;- &#x60;column1, column2, ...&#x60;: ستون‌هایی که می‌خواهید در جدول جدید باشند.- &#x60;new_table&#x60;: نام جدول جدید که می‌خواهید ایجاد کنید.- &#x60;existing_table&#x60;: نام جدولی که اطلاعات را از آن برداشته و در جدول جدید ذخیره کنید.- &#x60;condition&#x60;: شرایطی که مشخص می‌کنند چه ردیف‌هایی از جدول مبدا به جدول جدید منتقل شوند (اختیاری).**مثال:**فرض کنید یک جدول به نام &#x60;employees&#x60; دارید و می‌خواهید تمام کارمندانی که حقوقشان بیشتر از 50000 دلار است را در یک جدول جدید به نام &#x60;high_salary_employees&#x60; ذخیره کنید.&#x60;&#x60;&#x60;sqlSELECT employee_id, first_name, last_name, salary
INTO high_salary_employees
FROM employees
WHERE salary &gt; 50000;این دستور &#x60;SELECT INTO&#x60; باعث ایجاد یک جدول به نام &#x60;high_salary_employees&#x60; می‌شود و تمام کارمندان با حقوق بیشتر از 50000 دلار را در این جدول ذخیره می‌کند.توجه داشته باشید که &#x60;SELECT INTO&#x60; باید اجازه نوشتن در مکان مورد نظر را داشته باشد و به عنوان نتیجه، برخی پایگاه‌های داده ممکن است نیاز به اجازه کافی برای ایجاد جدول داشته باشند.دستور INSERT INTO SELECT در SQLدستور &#x60;INSERT INTO SELECT&#x60; در SQL برای درج (وارد کردن) داده‌ها به یک جدول از نتایج یک کوئری &#x60;SELECT&#x60; استفاده می‌شود. این دستور به شما این امکان را می‌دهد که داده‌هایی را از یک یا چند جدول موجود به یک جدول جدید درج کنید.فرمت کلی دستور &#x60;INSERT INTO SELECT&#x60; به این صورت است:&#x60;&#x60;&#x60;sqlINSERT INTO destination_table (column1, column2, ...)
SELECT source_column1, source_column2, ...
FROM source_table
WHERE condition;- &#x60;destination_table&#x60;: نام جدولی که می‌خواهید داده‌ها در آن درج شوند.- &#x60;(column1, column2, ...)&#x60;: لیست ستون‌هایی که می‌خواهید داده‌ها در آنها درج شوند (اختیاری).- &#x60;source_column1, source_column2, ...&#x60;: ستون‌هایی که می‌خواهید اطلاعات از آنها در آنها درج شوند.- &#x60;source_table&#x60;: نام جدول یا جدول‌هایی که اطلاعات از آنها در آنها درج شوند.- &#x60;condition&#x60;: شرایطی که مشخص می‌کنند چه ردیف‌هایی از جدول مبدا در جدول مقصد درج شوند (اختیاری).**مثال:**فرض کنید که یک جدول به نام &#x60;employees&#x60; دارید و می‌خواهید تمام کارمندان با حقوق بیشتر از 50000 دلار را به یک جدول جدید به نام &#x60;high_salary_employees&#x60; درج کنید.&#x60;&#x60;&#x60;sqlINSERT INTO high_salary_employees (employee_id, first_name, last_name, salary)
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary &gt; 50000;دستور &#x60;INSERT INTO SELECT&#x60; باعث درج تمام کارمندان با حقوق بیشتر از 50000 دلار از جدول &#x60;employees&#x60; به جدول &#x60;high_salary_employees&#x60; می‌شود. لازم به ذکر است که ستون‌های مقصد باید با ستون‌های مبدا هماهنگ باشند، اما اینکه از چه ستون‌هایی استفاده شود می‌تواند متفاوت باشد.دستور CASE و WHEN در SQLدستور &#x60;CASE&#x60; در SQL برای ایجاد شرایط چندگانه در یک کوئری استفاده می‌شود. این دستور به شما این امکان را می‌دهد که بر اساس مقدار یک ستون یا عبارت خاص، نتیجه مختلفی را دریافت کنید.فرمت کلی دستور &#x60;CASE&#x60; به این صورت است:&#x60;&#x60;&#x60;sqlCASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE result_else
END- &#x60;condition1, condition2, ...&#x60;: شرایطی که بر اساس آنها تصمیم گیری می‌شود.- &#x60;result1, result2, ...&#x60;: نتایج متناظر با هر شرط.- &#x60;result_else&#x60;: نتیجه در صورتی که هیچ یک از شروط مطابقت نداشته باشد (اختیاری).**مثال:**فرض کنید که یک جدول به نام &#x60;employees&#x60; دارید که شامل ستون‌های &#x60;employee_id&#x60;, &#x60;first_name&#x60;, &#x60;last_name&#x60;, و &#x60;salary&#x60; است و می‌خواهید بر اساس میزان حقوق، هر کارمند را به یکی از چند گروه تقسیم کنید.&#x60;&#x60;&#x60;sqlSELECT employee_id, first_name, last_name, salary,
    CASE
        WHEN salary &lt; 50000 THEN &#039;Low Salary&#039;
        WHEN salary &gt;= 50000 AND salary &lt; 100000 THEN &#039;Medium Salary&#039;
        ELSE &#039;High Salary&#039;
    END AS salary_group
FROM employees;در این مثال، &#x60;CASE&#x60; بر اساس میزان حقوق (salary) هر کارمند، آنها را به یکی از سه گروه (&#x27;Low Salary&#x27;, &#x27;Medium Salary&#x27;, &#x27;High Salary&#x27;) تقسیم می‌کند.می‌توانید دستور &#x60;CASE&#x60; را همچنین در جملات &#x60;UPDATE&#x60; و &#x60;INSERT INTO&#x60; نیز استفاده کنید.&#x60;&#x60;&#x60;sqlUPDATE employees
SET salary_group = CASE
                     WHEN salary &lt; 50000 THEN &#039;Low Salary&#039;
                     WHEN salary &gt;= 50000 AND salary &lt; 100000 THEN &#039;Medium Salary&#039;
                     ELSE &#039;High Salary&#039;
                   END;در این مثال، &#x60;CASE&#x60; بر اساس میزان حقوق، مقدار ستون &#x60;salary_group&#x60; را برای تمام کارمندان به‌روز می‌کند.دستور  Stored Procedures در SQLدر SQL، Stored Procedure یک گروه از دستورات SQL است که به صورت گروهی درون یک نام ثابت تعریف شده و می‌توان آن را به صورت مکرر فراخوانی کرد. Stored Procedure‌ها می‌توانند شامل تعدادی دستور SQL، شرایط منطقی، حلقه‌ها، و دستورات تراکنشی باشند.یک Stored Procedure به صورت زیر تعریف می‌شود:&#x60;&#x60;&#x60;sqlCREATE PROCEDURE procedure_name
    @parameter1 datatype,
    @parameter2 datatype,
    ...
AS
BEGIN
    -- SQL statements
END;- &#x60;procedure_name&#x60;: نام Stored Procedure.- &#x60;@parameter1, @parameter2, ...&#x60;: پارامترهای ورودی برای Stored Procedure (اختیاری).- &#x60;datatype&#x60;: نوع داده هر پارامتر.- &#x60;AS&#x60;: بخش شروع بلاک اجرای Stored Procedure.- &#x60;BEGIN&#x60; و &#x60;END&#x60;: بلاک اجرایی که دستورات SQL داخل آن قرار می‌گیرند.**مثال:**فرض کنید یک Stored Procedure به نام &#x60;GetEmployeeBySalary&#x60; را تعریف کنیم که بر اساس حقوق، اطلاعات کارمندان را بازگرداند:&#x60;&#x60;&#x60;sqlCREATE PROCEDURE GetEmployeeBySalary
    @min_salary INT,
    @max_salary INT
AS
BEGIN
    SELECT employee_id, first_name, last_name, salary
    FROM employees
    WHERE salary BETWEEN @min_salary AND @max_salary;
END;حالا می‌توانیم این Stored Procedure را با استفاده از دستور &#x60;EXEC&#x60; یا &#x60;EXECUTE&#x60; صدا بزنیم:&#x60;&#x60;&#x60;sqlEXEC GetEmployeeBySalary @min_salary = 50000, @max_salary = 80000;یا&#x60;&#x60;&#x60;sqlEXECUTE GetEmployeeBySalary @min_salary = 50000, @max_salary = 80000;دستور Stored Procedure می‌تواند پارامترهای ورودی و خروجی داشته باشد. همچنین می‌تواند دستورات شرطی، حلقه‌ها، و سایر عناصر پیچیده را شامل شود. Stored Procedure‌ها به ایجاد یک لایه مجزا از منطق کسب و کار در پایگاه داده کمک می‌کنند و امکان استفاده مکرر از یک قطعه کد را فراهم می‌کنند.لینک ها :کانال یوتیوب من : @BA_HOSSIENگیت هاب</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Thu, 11 Jan 2024 00:31:06 +0330</pubDate>
            </item>
                    <item>
                <title>قلاب های گیت به زبان ساده -git hooks and pre-commit</title>
                <link>https://virgool.io/@hossien014/%D9%82%D9%84%D8%A7%D8%A8-%D9%87%D8%A7%DB%8C-%DA%AF%DB%8C%D8%AA-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-git-hooks-and-pre-commit-iechgih7uvym</link>
                <description>بسم الله الرحمن الرحیمقلاب های گیت-git hook چیست ؟شما می توانید کدی بنویسید که در عملیات های مختلف گیت اجرا شود.مثلا کدی بنویسید که قبل از هر بار commit اجرا شود .به این کد ها git hooks می گویند. این قلاب ها (hooks) خصوصا در پروژه های بزرگتر میتواند خیلی کاربردی باشد.میتوانند قبل از commit شدن کد ها از لحاظ امنیتی کد را چک کنند یا حتی از لحاظ زیبایی و رعایت استایل کد شما را برسی کنند.قلاب ها(git hooks)کجا هستد؟هر کجا که یک گیت ریپازتوری باشد یک پوشه مخفی به اسم &quot;.git&quot; وجود دارد که اگر وارد آن بشوید پوشه دیگری به اسم &quot;hooks&quot; وجود دارد که کد های مربوطه در آن است..git/hooksدرون پوشه hooks فایل های مختلفی وجود دارد که در تصویر زیر مشاهده می کنید.تمام این فایل ها پسوند.sample را دارند و هر فایلی این پسوند را داشته باشد اجرا نمی شود.چگونه یک قلاب بسازیم : pre-commitبه عنوان مثال میخواهیم فایلی بسازیم که قبل از هر commit یک پیام خسته نباشید به ما بگویید.برای اینکار در پوشه hooks یک فایل به نام pre-commit ایجاد می کنیم. توجه داشته باشید که این فایل هیچ پسوندی ندارد.حالا می توانیم کد هایی که میخواهیم قبل از هر commit اجرا شود را در این فایل بنویسم.من قصد دارم کدی به زبان bash بنویسم که قبل از هر کامییت بگوید &quot;good job&quot;. #!/bin/sh  باید د راینجا زبان مورد نظر را انتخاب کنیدecho &amp;quotgood job&amp;quot کدی که قبل از هر کامییت اجرا میشودحالا برای تست یک commit انجام میدهم و همانطور که در تصویر زیر می بینید قبل از کامیت پیام good job را به من نشان می دهد. </description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Thu, 28 Dec 2023 11:09:24 +0330</pubDate>
            </item>
                    <item>
                <title>اضافه کردن sql migration و در asp.net core</title>
                <link>https://virgool.io/@hossien014/dbmigration-k7mjsvbm9af2</link>
                <description>دیتا بیس مایگریشندیتا بیس مایگریشن -sql migration چیست ؟دیتا بیس مایگریشن -sql migration به فرایند تغییر یا به روز رسانی ساختار یا داده های یک دیتابیس اطلاق می شود. این کار به منظور هماهنگ کردن دیتابیس با نیازهای جدید یا تغییرات اعمال شده در برنامه نویسی انجام می شود. برای مثال، اگر شما یک جدول جدید به دیتابیس خود اضافه کنید یا یک ستون را تغییر نام یا حذف کنید، شما یک مایگریشن انجام داده اید. مایگریشن‌ها به شما امکان می دهند که تاریخچه و نسخه بندی دیتابیس خود را ذخیره و مدیریت کنید و بتوانید بین حالت های مختلف دیتابیس جابجا شوید. برای انجام مایگریشن‌ها، معمولا از ابزارهای خاصی استفاده می شود که به شما امکان می دهند که دستورات SQL مربوط به تغییرات دیتابیس را تولید، اجرا و لغو کنید.پکیج های مورد نیازMicrosoft.AspNetCore.Mvc.Razor.RuntimeCompilationMicrosoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.Tools1-ساخت یک مدل قبل از هر چیز مسلماً باید Sql-server نصب و اماده باشد.اما قدم بعد این است که در پوشه modles یک کلاس جدید ایجاد کنید و اطلاعات جدولی که قصد اضافه کردن ان به دیتا بیس را دارید را به شکل زیر وارد کنید. using System.ComponentModel.DataAnnotations;namespace radnom_web.Models{    public class Custumer    {        [Key]         public int id {  get; set; }        [Required] // NOTNUll        public string Name { get; set; }        public int Age {  get; set; }        public DateTime BrithDay {  get; set; } =DateTime.Now;    }
}هر کدام از متغیر های بالا ستون های جدول ما را می سازد یعنی با کد بالا ما یک جدول میسازیم که یک id دارد و یک Name دارد و یک Age دارد و  یک BrithDay دارد. تربیوت Key به معنی آن است که id یک primary key است و اتربیوت Required  همان notnull در sql است. اما فایل بالا به تنهایی کاری کاری نمی کند و فقط یک مدل است.2-اضافه کردن ConnectionStringsبرای وصل شدن به دیتا بیس نیاز به ConnectionStrings داریم.این اطلاعات را باید در فایل appsettings.json نوشته بشود.من متن زیر را به این فایل اضافه کردم:  &amp;quotConnectionStrings&amp;quot: {    &amp;quotDefultConnection&amp;quot: &amp;quotServer=DESKTOP-ND9E5MT;Database=test;Trusted_Connection=True;&amp;quot  }نام سرور خود را جلوی server بنویسید و اسم دیتا بیس را جلوی Database.اگر دیتا بیس شما پسورد و موارد اضافه دیگری نیاز داشت باید در همین فایل اضافه کنید.3-اضافه کردن DbContextدر این مرحله یک پوشه جدید به اسم Data ایجاد کنید و درون آن یک کلاس به اسم انتخابی خود بسازید من اسم کلاس را ApplicationDbContext قرار دادم.کد زیر را در فایل نوشتم :using Microsoft.EntityFrameworkCore;using radnom_web.Models;namespace radnom_web.Data{    public class ApplicationDbContext :DbContext    {  public ApplicationDbContext(DbContextOptions&lt;ApplicationDbContext&gt; options) :base(options) {    }    public DbSet&lt;Custumer&gt; Custumers { get; set; }    }}   کلاس بالا از DbContext ارث بری میکند و کانستکتور باید دقیقا به همان شکلی که در بالا اماده باشد.از اینجا به بعد باید برای هر جدولی که میخواهیم در دیتا بیس داشته باشیم یک DbSet بسازیم.در مثال بالا ما برای یک جدول جدید به اسم Custumers ساختیم که از نوع cutumer است که در مرحله اول ساختیم. 4-اضافه کردن Db context در سرویس هافایل program.cs را باز کنید و این خط را پیدا کنید var builder = WebApplication.CreateBuilder(args);و بعد از آن این خط را اضافه کنیدbuilder.Services.AddDbContext&lt;ApplicationDbContext&gt;(options =&gt; options.UseSqlServer(    builder.Configuration.GetConnectionString(&amp;quotDefultConnection&amp;quot)    ));5-اعمال تغییراتحالا Package Manager Console را در ویژوال استدیو باز کنید و دستور add-migration yourName را بنویسید.بجای yourName نام موردنظر خود را وارد کنید.این دستور یک پوشه به اسم Migrations برای شما میسازد.اما هنوز هیچ تغییری در دیتا بیس ایجاد نشده شده است.برای اعمال تغییرات در دیتا بیس باید از دستور update-database استفاده کنید.لینک های مرتبط :Migrations Overviewatriya.comblog.faradars.orgbarnamenevis.org</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Thu, 28 Dec 2023 10:54:16 +0330</pubDate>
            </item>
                    <item>
                <title>اموزش git rebase به زبان ساده با مثال</title>
                <link>https://virgool.io/@hossien014/%D8%A7%D9%85%D9%88%D8%B2%D8%B4-git-rebase-%D8%A8%D9%87-%D8%B2%D8%A8%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%A7-%D9%85%D8%AB%D8%A7%D9%84-gdgryejlto9x</link>
                <description>بسم الله الرحمن الرحیمگیت ریبیس&#x27;Git rebase&#x27; چیست؟با استفاده از git rebase  میتوانید مسیج یک commit را تغییر دهید و یا دو commit مختلف را با هم یکی کنید و یا اینکه ترتیب قرار commit ها را عوض کنید.مثلا یک commit را با دیگری جابجا کنید. و حتی میتوانید محتوی یک commit را به صورت کلی تغییر دهید .برای درک بهتر به مثال های زیر توجه کنید.ریپازتوری که برای مثال استفاده میکنم به شکل زیر است . پنج commit دارد که میخواهیم git rebase را روی آنها تمرین کنیم.برای شروع باید از دستور زیر استفاده کنید.git rebase --interactive HEAD~4عددی که بعد از HEAD می آید باید حداقل یک عدد کمتر از تعداد commit های شما باشد مثلا در اینجا ما از 4 استفاده کردیم زیرا تعداد commit های ما 5 عدد است.دستور بالا در یک ترمینال تکست ادیتور ,چیزی شبیه فایل زیر باز میکند که شما با تغییر متن این فایل تغییراتی در commit ها و تاریخچه آنها ایجاد می کنید.
در این مثال ما میخواهیم &quot;fourth commit add newfile&quot; را قبل از &quot;second commit قرار دهیم&quot; برای این کار باید این فایل متنی را به ترتیب زیر تغییر دهیم و خارج شویم.pick 8363f75 fourth commit add newfile
pick 6ba07f0 second commit
pick 2c0568b third commit
pick c311512 fifth commitوقتی پیام &quot;Successfully rebased and updated refs/heads/master.&quot; را دریافت کردیم,یعنی اینکه عملیات با موفقیت انجام شد و شکل ریپازتوری ما به شکل زیر تغییر کرد و &quot;fourth commit add newfile&quot; به رده دوم انتقال پیدا کرده است.تغییر مسیج یک commit با استفاده از rewordحالا میخواهیم &quot;fourth commit add newfile&quot; را تغییر نام بدهیم و مسیج آن را به  &quot;my custom message&quot; تغییر دهیم.برای اینکار دوباره از دستور &quot;git rebase --interactive HEAD~4&quot; استفاده می کنیم .در این فایل مانند تصویر زیر دستور پشت &quot;fourth commit add newfile&quot; را که دستورpick است را به reword تغییر دهید و فایل را سیو کنید و خارج شوید.استفاده از دستور reword در git rebaseبعد از سیو و خروج از فایل بالا یک فایل دیگر مانند تصویر زیر باز می شود که در آنجا می توانید message جدید برای commit خود انتخاب کنید .کافی است بجای  &quot;fourth commit add newfile&quot; پیام جدید خود را بنویسید که من قصد دارم این متن را   &quot;my custom message&quot; جایگزین قبلی کنم. سپس فایل را ذخیره و خارج شوید.تغییر پیام یک کامییتبعد از از انجام عملیات بالا ریپازتوری ما به شکل زیر تغییر می کند.ویرایش محتوی یک commit با استفاده از editاگر بخواهیم به یک commit قدیمی برگردیم مثلا  &quot;my custom message&quot; و تغییراتی در آنجا انجام بدهیم و دوباره به HEAD که در مثال ما &quot;fifth commit&quot; است برگردیم و کار را ادامه دهیم باید از دستور  edit در git rebase  استفاده کنیم. دوباره از دستور &quot;git rebase --interactive HEAD~4&quot; استفاده می کنیم تا فایل rebase باز شود و در پشت &quot;my custom message&quot; دستور edit را می نویسیم.استفاده از دستور edit در git rebaseبعد از اجرای این دستور باید بروید و تغییراتی که میخواهید را اعمال کنید .مثلا من در فایل newfile.md یک خط جدید اضافه می کنم.اضافه کردن خط جدید بعد از اعمال تغییرات برای ذخیره باید  این تغییر را ابتدا با استفاده از  دستور زیر اضافه کنید.git add .سپس با دستور زیر ان را commit کنید .git commit --amendسپس برای اینکه از rebase خارج شوید دسور زیر را اجرا کنید. البته بعضی مواقع به بعد از commit به صورت خودکار از rebase خارج می شود .git rebase --continue یکی کردن دو commit با استفاده از squashدر این مرحله می خواهیم &quot;second commit&quot; را با &quot;third commit&quot; یکی کنیم. برای اینکار دوباره با استفاده از &quot;git rebase --interactive HEAD~4&quot; فایل rebase را باز می کنیم . پشت &quot;third commit&quot; از دستور squash استفاده می کنیم. این دستور به بالای سر خود نگاه می کند و اگر commit با دستور pick وجود داشت آن را با خودش یکی می کند . در تصویر زیر می بیند که بالا  &quot;third commit&quot; دقیقا  &quot;second commit&quot;  با دستور pick قرار دارد پس این دو بعد از ذخیره این فایل باید یکی بشوند. دستور squash در git rebaseبعد از ذخیره فایل بالا یک فایل جدید مانند تصویر زیر باز می شود که به شما می گویید پیام message ترکیب این دو commit باید چه باشد . شما میتوانید پیام دلخواه خود را بنویسید یا بدون انجام تغییر این فایل را ذخیره کنید.بعد از ذخیره فایل بالا این دو commit با هم یکی میشود و شکل ریپازتوری ما به شکل زیر تغییر می کند.بعد از squashیکی کردن دو commit با دستور fixupدستور fixup مانند squash است با این تفاوت که دیگر از شما نمیخواهد که message  را مشخص کنید. این دستور به صورت خودکار message کامییت بالایی را انتخاب می کند.برای اینکار ابتدا دستور &quot;git rebase --interactive HEAD~3&quot; را اجرا می کنیم . توجه داشته باشید که عدد بعد از HEAD را به 3 تغییر دادم زیرا در مرحله قبل یکی از تعداد commit ها کم شد .دستور  fix up کامییت &quot;second commit&quot;  را با commit بالایی خود که دستور pick دارد یعنی &quot;my custom message&quot; ترکیب می کند و از پیام commitبالایی استفاده می کند. استفاده از fixup در git rebaseبعد از اجرای دستور بالا شکل ریپازتوری ما به شکل زیر تغییر می کند. بعد از استفاده از fixupدر این مطلب سعی کردم تمام دستورات git rebase را(pick ,squash ,fixup ,reword ,edit) را با مثال توضیح بدهم که امیدوارم برای شما مفید بوده باشد.</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Sun, 03 Dec 2023 19:10:53 +0330</pubDate>
            </item>
                    <item>
                <title>روند ساخت سایت ایه تصادفی</title>
                <link>https://virgool.io/@hossien014/%D8%B1%D9%88%D9%86%D8%AF-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%A7%DB%8C%D9%87-%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C-fcvwqkwmiany</link>
                <description>توی این پست میخوام بهتون بگم چطور تو چند ساعت سایت ایه تصادفی رو ساختم و به صورت رایگان منشتر کردم.داشتم تو سایت codepen  طراحی های مختلف رو میدیدم که یکی از طراحی ها برام جالب بود .این ایده به ذهنم رسید که اون طراحی رو پیاده کنم و برای محتوی یک ایه تصادفی از قران قرار بدم.طراحی html و css خیلی طول نکشید و قدم بعدی اضافه کردن یک ایه تصادفی به صفحه بود. یک سایتی هست  به اسم https://alquran.cloud/api که api قران رو به صورت رایگان در اختیار شما میذاره. مثلا اگه سوره 2 ایه 255 رو میخواید میتونید این درخواست رو بفرستید  http://api.alquran.cloud/v1/ayah/2:255 از همین api استفاده کردم تا ایات رو بگریم .در اخر هم یک ریپازتوری توی گیت ها درست کردم که از اونجا میتونید به تمام کد های این سایت دسترسی پیدا کنید اینم ادرسش https://github.com/hossien014/random-quran/tree/gh-pagesبرای انتشار صفحه هم از قابلیت خود گیت هاب استفاده کردم.اگه تو گیت هاب یک برانچ به اسم gh-pages بسازید و یک فایل به اسم index.html  داخل اون داشته باشید اون به عنوان یک صفحه وب برای شما منتشر میکنه .در نهایت میتونید به  سایت ایه تصادفی از این لینک دسترسی داشته باشید یا اگه خواستید چیزی بهش اضافه کنید میتونید از طریق گیت هاب تغیریش بدید.</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Mon, 25 Sep 2023 15:33:34 +0330</pubDate>
            </item>
                    <item>
                <title>چرا به وجود خدا ایمان دارم</title>
                <link>https://virgool.io/@hossien014/%DA%86%D8%B1%D8%A7-%D8%A8%D9%87-%D9%88%D8%AC%D9%88%D8%AF-%D8%AE%D8%AF%D8%A7-%D8%A7%DB%8C%D9%85%D8%A7%D9%86-%D8%AF%D8%A7%D8%B1%D9%85-bibtreyee7il</link>
                <description>بسم الله الرحمن الرحیماگه به خاطر ایرانی بودن یا خانواده مسلمان به وجود خدا اعتقاد داشته باشم یعنی یکجای کار من میلنگه. بخاطر همین تصمیم گرفتم که درباره وجود خدا تحقیق کنم و نظرات مخالف و موافق را بشونم وبعد تصمیم بگیرم.  قوانین ریاضی و فیزیکتا حالا به جبر در ریاضی فکر کردید ؟ هر چیزی که سمت راست مساوی است برابر است با سمت چپ مساوی و هر چیزی را اگر با قاعده از سمت راست به سمت چپ ببرید معادله را بهم نمی ریزد. یا قوانین و فرمول های فیزیک که با استفاده از انها ماهواره ها و موشک ها را به هوا میفرستیم .یا این هماهنگی و دقت نجوم که در حدی دقیق است که همین الان میتوانید مشخص کنید که 200 سال دیگر چه زمانی خورشید طول می کند.این قوانین را چه کسی وضع کرده ؟ دلیل این شدت از هماهنگی و دقت در این قوانین چیست ؟  کسی که میگوید همه اینها اتفاقی است وخودبه خود ایجاد شده به اندازه کافی درباره دقت علم ریاضی و فیزیک و نجوم تفکر نکرده.بنظر من قانون گذار این سیستم دقیق و هماهنگ قطعا خدا است .پیچیدگی خلقت چند وقت پیش مستندی درباره سیاره مریخ تماشا میکردم که نشان میداد دانشمندان عکس هایی از مریخ گرفته و از حالت سنگ ها تشخیص داده اند که قبل ها آن قسمت رودخانه بوده .یعنی انها از روی نشانه ها به وجود اب در ان نقطه پی برده بودند .ما اگر به اطراف خود نگاه کنیم موجودات زیادی با خلقت پیچیده ,دقیق و منطقی می بینیم .چطور ممکن است که اینها همه خود به خود به جود امده باشند .ساده ترین نقاشی دنیا هم خالقی دارد,پس چطور باور میکنید که مغز پیچیده انسان بدون خالق باشد.خواب های صادقه من  خواب هایی که میبینم را جدی نمیگیرم و همیشه با دوستانی که خواب را جدی میگرن و برای هر خوابی دنبال تعبیر هستند بحث و مشکل دارم.و از نظر من خواب حجت نیست اما اینجا بحث چیز دیگری است.منظور من از خواب های صادقه خواب هایی است که عینا اتفاق می افتند.خیلی از کسانی که من میشناسم حداقل یکبار خواب هایی از این قبیل دیده اند. مثلا فرض کنید خوابی ببینید که در آن مادربزرگ شما به صورت سر زده از روستا به خانه شما می اید و یک پیراهن به شما هدیه می دهد و دقیقا این اتفاق در دنیای واقعی هم می افتد.این یعنی چیزی به اسم غیب وجود دارد,چیزی به غیر از دنیای فیزیکی و مادی ما . نشانه هایی الهی مثلا جایی هایی از قران یا روایت های اهل بیت علیهم السلام, مطالبی بیان شده که امروزه درست بودن آنها به صورت علمی ثابت شده است.وقتی ما به این مطالب اعجاز گونه برخورد میکنم حداقل باید به فکر فرو برویم و وقتی را برای تحقیق و تفکر درباره وجود خدا کنار بگذاریم.برای مثال ایه &quot;وَالشَّمْسُ تَجْرِي لِمُسْتَقَرٍّ لَّهَا ذَلِكَ تَقْدِيرُ الْعَزِيزِ الْعَلِيمِ&quot; که درباره حرکت خورشید صحبت می کند. این ایه برای سال ها مورد تمسخر افراد ضد دین بوده.ولی تحقیقات جدید نشان می دهد که خورشید واقعا حرکت دارد,هم به دور خودش میچرخد و هم با منظومه شمسی با سرعت 720 هزار کیلومتر در ساعت در حال حرکت است[منبع].منطقی بودنزمان با سرعت زیادی در حال گذر است و سن ما در حال افزایش است . وقتی به گذشته فکر میکنم انگار که همه چیز در کسری از ثانیه اتفاق افتاد است.با همین سرعت عمر ما تمام می شود و خواهیم مرد.حالا اگر در یک سناریو ما به وجود خدا پی ببریم و به دستورات دین عمل کنیم, به هیچ عنوان ضرر نکرده ایم,چون  دستورات دینی ما را به زندگی سالم و پاک هدایت می کند و از پلیدی ها دور میکند.در این سناریو چه خدا وجود داشته باشد چه نداشته باشد ما سود کرده ایم.اما کسی که به دین و خدا باور ندارد و حتی درباره این موضوع تحقیق و تفکر نکرده است .در این سناریو باز هم دو حالت وجود دارد یا خدا هست یا نیست . اگر خدا نباشد که هیچ ولی اگر خدایی وجود داشته باشد وضع این ادم بشدت خراب خواهد بود .</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Sat, 16 Sep 2023 20:39:57 +0330</pubDate>
            </item>
                    <item>
                <title>پروژه اموزشی  flask_ نمایش اوقات شرعی</title>
                <link>https://virgool.io/@hossien014/flaskexample-xnhiwbblgsnq</link>
                <description>اگه دارید این مطلب رو میخوانیدپس حتما میدونید فلسک یا همون flask چیه .پس بدون توضیح اضافه بریم سراغ اصل مطلب.این پروژه برای آشنایی با فلسک خیلی مناسبه چون قابلیت های اصلی که برای ساخت یک وب اپیکیشن نیاز هست رو با فلسک اجرا میکنه.توی این پروژه چه چیز هایی یاد میگیرم؟این در واقع یک وب اپیکیشن ساده است که فایل اصلی آن فقط 299 خط دارد و اوقات شرعی شهر مورد نظر شما رو بهتون نشون میده.چه چیز هایی از این پروژه یاد خواهید گرفت:*نحوه ساخت یک فلسک اپیکیشن*ساخت مسیر (rout)برای سایت*هندل کردن درخواست های post و get در فلش *استفاده از کوکی ها برای شناسایی کاربران*استفاده از api دیگران برای گرفتن اوقات شرعی*انوع روش ساخت api برای اپیکیشن*نحوه کانفیگ کردن فلسک*قابلیت اپلود کردن فایل توسط کاربران در سایت *اجرا قابلیت ثبت نام و ورود کاربران*استفاده و مدیریت دیتا بیس *استفاده از فانکشن abort*قابلیت نوشتن یاداشت *استفاده از قابلیت flasher فلسک برای بازخورد دادن به یوزر*استفاده از جینجا در ساخت صفحات html*و...از کجا دانلودش کنم؟اینو میتونید از گیت هاب من به این ادرس https://github.com/hossien014/flask_example_farsi/ دانلود کنید </description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Tue, 05 Sep 2023 14:37:58 +0330</pubDate>
            </item>
                    <item>
                <title>لینک لیست (Linked List) چیست ؟</title>
                <link>https://virgool.io/@hossien014/%D9%84%DB%8C%D9%86%DA%A9-%D9%84%DB%8C%D8%B3%D8%AA-linked-list-%DA%86%DB%8C%D8%B3%D8%AA-y7lg6r5tvpld</link>
                <description>لینک لیست (Linked List) یک ساختار داده است که به وسیلهٔ پیوندها (یا اشاره‌گرها) اجزا داده‌ها را به یکدیگر متصل می‌کند. این ساختار به ازای هر عنصر داده‌ای (مانند عدد یا رشته) یک گره (Node) ایجاد می‌کند و هر گره دارای دو بخش اصلی است:1. **محتویات (Data):** این بخش داده‌ی واقعی را که می‌خواهید در لینک لیست ذخیره کنید، نگه می‌دارد. این محتویات می‌تواند هر نوع داده‌ای باشد (عدد، رشته، ساختار، و غیره).2. **پیوند به گره بعدی (Next Pointer):** این بخش یک اشاره‌گر به گره بعدی در لینک لیست است. این پیوند نشان می‌دهد که گره کنونی با کدام گره در ادامه متصل شده است. در آخرین گره از لیست، این پیوند به مقدار تهی (NULL یا nullptr در بعضی زبان‌ها) تنظیم می‌شود تا نشان دهد که لیست به پایان رسیده است.این ساختار اجازه می‌دهد تا داده‌ها به صورت پیاپی در حافظه ذخیره شوند و از این رو لینک لیست انعطاف‌پذیری بیشتری نسبت به آرایه‌ها دارد. با افزودن یک گره جدید به لینک لیست، می‌توانیم به سرعت داده جدید را درج کرده و پیوندها را به درستی تنظیم کنیم.مزیت اصلی لینک لیست در این است که درج و حذف داده‌ها در مواقع مختلف بسیار ساده و کارآمد است و نیازی به تغییر اندازه لیست نداریم. به عنوان مثال، در لیست پیوندی می‌توانیم به راحتی داده جدیدی را در وسط یا ابتدای لیست درج کنیم بدون نیاز به تغییر حافظه‌ی مخصوصیت‌ها.همچنین، لینک لیست در برخی موارد به عنوان پایه برای ساختارهای داده پیچیده‌تر مانند درخت‌ها (مانند درخت‌های دودویی جستجوی متوازن) استفاده می‌شود.#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;struct Node {    int data;    struct Node* next;};int main() {    // ایجاد سه گره برای لینک لیست    struct Node* firstNode = NULL;    struct Node* secondNode = NULL;    struct Node* thirdNode = NULL;    // تخصیص حافظه برای گره‌ها    firstNode = (struct Node*)malloc(sizeof(struct Node));    secondNode = (struct Node*)malloc(sizeof(struct Node));    thirdNode = (struct Node*)malloc(sizeof(struct Node));    // تخصیص داده به گره‌ها و متصل کردن آن‌ها به یکدیگر    firstNode-&gt;data = 1;    firstNode-&gt;next = secondNode;    secondNode-&gt;data = 2;    secondNode-&gt;next = thirdNode;    thirdNode-&gt;data = 3;    thirdNode-&gt;next = NULL;    }    return 0;}</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Sat, 12 Aug 2023 07:21:26 +0330</pubDate>
            </item>
                    <item>
                <title>دانلود و نصب ndk اندروید در یونیتی بدون یونیتی هاب</title>
                <link>https://virgool.io/@hossien014/unity-android-ndksetup-hrrmrslvh3mp</link>
                <description>بسم الله الرحمن الرحیم با استفاده از یونیتی هاب و گزینه AddModules میتوانید مورد نیاز های خروجی گرفتن برای اندروید را دانلود و نصب کنید ولی از اونجایی که یونیتی همیشه یه جای کارش میلنگه ممکنه نیاز پیدا کنید که به صورت دستی اینکارو انجام بدید .مثلا امروز به هر دلیلی ndk اندروید رو برای من دانلود نکرد. پیدا کردن نسخه ndk مناسب برای اینکار به این صفحه از داکیومنتیشن یونیتی برید و ببینید نسخه یونیتی شما به چه ndk نیاز داره .مثلا من از نسخه 2022 استفاده میکنم پس نسخه ndk مورد نیاز من r23b هست. قدم بعدی اینه که توی نت بگردیم و این ndk رو دانلود کنیم پس سرچ کنید  download r23b ndk و اولین سایت درست حسابی که پیدا کردید روی دکمه دانلود بزنید.اضافه کردن ndk به یونیتی اول ndk رو از حالت فشرده خارج کنید و یه جای درست ذخیره کنید. حالا یونیتی رو باز کنید و از Edit گزینه Preferences رو انتخاب کنید.و مثل تصویر زیر از بخش External Tools تیک گزینه android NDK را بر دارید و ادرس محلی که ndk را ذخیره کردید وارد کنید. امیدوارم مفید بوده باشه موفق باشید.</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Sat, 08 Jul 2023 02:24:46 +0330</pubDate>
            </item>
                    <item>
                <title>منحنی(Curve) همه چی تمام در یونیتی _CinemachinePath</title>
                <link>https://virgool.io/@hossien014/cinemachinepath-hhvstwtt1o3n</link>
                <description>بسم الله الرحمن الرحیم بنظر من داخل بازی یک منحی خوب از نون شب واجب تره.از حرکت دوربین گرفتن تا انیمیشن ابجکت ها ,مسیر یابی و ... شما به منحی ها نیاز پیدا می کنید.منحنی bezier curve برای ساخت منحنی (Curve) مفهومی به اسم bezier curve وجود دارد که یک فرمول ریاضی است که خط صاف شما را به یک منحنی تبدیل می کند . در کل دو نوع bezier curve  داریم نوع اول quadratic bezier نام دارد  که در واقع یک منحنی با یک کنترلر است و نوع دوم که خیلی هم رایج تر است cubic bezier نام دارد که از دو کنترلر برای ساخت منحنی استفاده می کند . در تصویر زیر یکcubic bezier  به همراه فرمول  آن را مشاهده می کنید . در تصویر p0 نقطه شروع خط است و p3 نقطه پایان خط . اما برای ساخت یک cubic bezier شما نیاز دارید که دو نقطه ی دیگر هم اضافه کنید که نقطه p1 و p2 هستند.قدم بعدی گرفتن lerp بین نقطه هاست که در فرومولی که سمت چپ تصویر نشان داده شد ترتیب آن مشخص است. (lerp چیست ؟) در اخر هم نقطه ایی که به دست می اورید نقطه p است که یکی از نقاط منحنی شما است cubic bezierدر نهایت برای بدست اوردن جهت و سرعت منحنی در نقطه خاص باید متشق فرمول بالا را بگیرید .اما CinemachinePath چیست ؟_CinemachinePathاما بجای اینهمه ریاضی و عدد و رقم میتوانید خیلی راحت از کمپوننت  CinemachinePath استفاده کنید.این کمپوننت برای هدایت دوربین طراحی شده ولی تقریبا هر کاری بخواهید میتوانید بهاش انجام بدید و از همه مهم تر اینه که یک ادیتور خیلی خوب داره که این امکان رو میده از طریق سین ویو (scene view) منحنی رو دستکاری و طراحی کنید.نکته مثبت اینه که کد هاش کاملا اوپن سورس و قابل دستکاری هست.ودر انتها یک سری از قابلیت های این طلای ناب رو اینجا براتون مینویسم.تمام موارد زیر از طریق کد قابل تنظیم هستند.فقط کافی است یک رفرنس به کمپوننت cinemachine path ایجاد کنید.ء m_Resolution که از طریق اینسپکتور هم قابل تنظیم است مشخص می کند که بین هر خط چند نقطه بساز و هر چه بیشتر باشید منحنی شما دقیق تر است . ءEvaluatePosition(Evaluate) این فانکشن به شما مختصات نقطه مورد نظر در منحی را می دهد  مثلا فرض کنید که یک منحنی دارید که از سه نقطه تشکیل شده است. اگر بخواهید مختصات نقطه اول را بگیرید کافی است عدد یک را به این فانکشن بفرسید و برای نقطه دوم و سوم به همین ترتیب.اما اگر بخواهید چیزی بین نقطه ها را بگیرید مثلا مختصات بین نقطه 1 و نقطه 2 باید عدد 1.5 را به این فانکشن ارسال کنید .برای مثال من با همین فانکشن ماشینی که در گیف زیر می بینید را به حرکت در اوردم. برای روتیشن ماشین در نقطه های مختلف هم از فانکشن EvaluateOrientation(Evaluate) استفاده کردم که جهت چرخ در نقطه را بر میگرداند. برای فهم بهتر به نمونه کد دقت کنید.[SerializeField] GameObject Car; // رفرنس به ابجکت ماشین [SerializeField] CinemachinePath cinemachinePath; // رفرنس به کمپوننت [SerializeField] float Evaluate;  // عددی که مشخص می کند چه نقطه ایی از خط را برگرداندprivate void Update(){Evaluate= (Evaluate+ Time.deltaTime);  هر فریم  یک نقطه جلو تر می رود 
// پوزیشن ماشین  را ست می کندCar.transform.position = cinemachinePath.EvaluatePosition(Evaluate); 
// روتیشن ماشین را ست می کندCar.transform.rotation = cinemachinePath.EvaluateOrientation(Evaluate);}کمپوننتcinemachinePath قابلیت های زیادی دارد که هدف در اینجا فقط معرفی این ابزار بود برای مطالعه بیشتر به این صفحه  مراجعه کنید. </description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Sun, 19 Mar 2023 15:44:07 +0330</pubDate>
            </item>
                    <item>
                <title>سرعت و جهت (velocity) در یونیتی+نحوه محاسبه</title>
                <link>https://virgool.io/@hossien014/velocity-lnjiljsfxqez</link>
                <description>بسم الله الرحمن الرحیم  چیست velocity در دنیای سه بعدی یک وکتور 3 است که نشان می دهد جسم با چه سرعتی و در چه جهتی حرکت می کند .مثلا وقتی می گوییم velocity یک ماشین =&gt; ( car_velocity = 3,0,0) است به این معنی است که این ماشین در جهت مثبت محور x با سرعت 3 در حال حرکت است که به زبان ساده می شود ماشین در حال حرکت به سمت راست با سرعت 3 است .چه استفاده هایی از velocity  میشوددر جاهای زیادی velocity  به کارتان خواهد امد مثلا فرض کنید میخواید اگر کارکتر بی حرکت بود انیمیشن ایدل اجرا شود در این صورت کافی است  بگویید if (player_Velocity == vector3.zero) idle_Animtion.play();چگونه velocity را در یونیتی به دست بیاوریم؟راه های مختلفی برای اینکار وجود دارد . اگر ابجکت شما از سیستم فیزیک یونیتی استفاده می کند میتوانید از rigidbody برای گرفتن یا تنظیم کردن  velocity  استفاده کنید (rigidbody .velocity). using UnityEngine;
using System.Collections;

// کد زیر ابجکت را با استفاده از  
//حرکت می دهدvelocity 

public class ExampleClass : MonoBehaviour
{
    public Rigidbody rb;

    private float time = 0.0f;
    private bool isMoving = false;
    private bool isJumpPressed = false;


    void Start()
    {
        rb = GetComponent&lt;Rigidbody&gt;();
    }

    void Update()
    {
        isJumpPressed = Input.GetButtonDown(&amp;quotJump&amp;quot);
    }

    void FixedUpdate()
    {
        if (isJumpPressed)
        {
            //ابجکت با سرعت ده واحد در ثانیه به سمت بالا می رود
            rb.velocity = new Vector3(0, 10, 0);
            isMoving = true;
            Debug.Log(&amp;quotjump&amp;quot);
        }

        if (isMoving)
        {
            // when the cube has moved for 10 seconds, report its position
            time = time + Time.fixedDeltaTime;
            if (time &gt; 10.0f)
            {
                Debug.Log(gameObject.transform.position.y + &amp;quot : &amp;quot + time);
                time = 0.0f;
            }
        }
    }
}
https://docs.unity3d.com/ScriptReference/Rigidbody-velocity.htmlاما اگر از navmesha استفاده میکنید با استفاده از NavMeshAgent.velocity  به آن دسترسی پیدا کنید.محاسبه velocity بدون Rigidbody  پوزیشن کارکتر در فریم قبلی را از فریم فعلی کم کنیدمقدار به دست امده را تقسیم بر دلتا تایم کنیدمحاسبه بالا به شما velocity را به نسبت World شما نشان میدهد. اما برای بدست اوردن velocity نبست به لوکال ابجکت از transform.InverseTransformDirection(WorldSpace_Vlocity); استفاده کنیدمثال :// کد زیر را در اپدیت اجرا کنید 
// این کد سرعت حرکت ابجکت به جلو را بدون نیاز به فیزیک محاسبه کی کند.
Vector3 previous_frame = Vector3.zero;
private void _velocity(){var current_frame = transform.localPosition;var WorldSpace_velocity= (current_frame - previous_frame);var Local_velocity = transform.InverseTransformDirection(WorldSpace_Vlocity);print(Local_velocity.z / Time.deltaTime + &amp;quotdif&amp;quot);previous_frame = current_frame;}</description>
                <category>حسین سلیمانی</category>
                <author>حسین سلیمانی</author>
                <pubDate>Thu, 16 Mar 2023 11:42:35 +0330</pubDate>
            </item>
            </channel>
</rss>