<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمد حسن اسماعیلی</title>
        <link>https://virgool.io/feed/@king_python</link>
        <description>برنامه نویس پایتون و توسعه دهنده وب و اپلیکیشن های تحت ویندوز، لینوکس، مک</description>
        <language>fa</language>
        <pubDate>2026-06-10 12:48:34</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1099233/avatar/QAHBN6.jpeg?height=120&amp;width=120</url>
            <title>محمد حسن اسماعیلی</title>
            <link>https://virgool.io/@king_python</link>
        </image>

                    <item>
                <title>کار با Hard Disk ها در Python</title>
                <link>https://virgool.io/@king_python/%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-hard-disk-%D9%87%D8%A7-%D8%AF%D8%B1-python-oqma1lp3tmpy</link>
                <description>کار با Hard Disk در پایتونشاید شما هم مثل من نیاز داشته باشید که در برنامه هایی که با پایتون می نویسید از وضعیت هارد دیسک ها و اطلاعات دقیق شون مطلع شوید و در واقع به زبان ساده تر با هارد دیسک ها در پایتون تعامل کنید. خوب باید بگم که این کار کاملا ممکنه و پایتون مثل همیشه این کار رو هم برامون آسون کردن.با من تا ادامه این آموزک همراه باشید :)نصب کتابخانهخوب برای کار با هارد دیسک ها باید کتابخانه psutil رو نصب کنید. پس دستور زیر رو در CMD می زنید.pip install -U psutilکتابخانه ی psutil یک کتابخانه چند پلتفرمی برای Processes و نظارت بر فعالیت های سیستمی است. مانند : فرایند های در حال اجرا در سیستم مثل CPU ، حافظه ، دیسک ها ، شبکه ، حسگرها و ...این کتابخانه عمدتا برای نظارت بر سیستم ، نمایه سازی ، محدود و مدیریت کردن منابع سیستم، مدیریت و بهینه سازی فرایند های در حال اجرا در سیستم استفاده می شود. همچنین این کتابخانه بسیاری از قابلیت های ارائه شده توسط ابزارهای خط فرمان UNIX را اجرا می کند. مانند : pstoplsofnetstatifconfigwhodfkillfreeniceioniceiostatiotopuptimepidofttytasksetpmapکتابخانه psutil در حال حاضر از سیستم عامل های زیر پشتیبانی می کند:LinuxWindowsmacOSFreeBSD, OpenBSD, NetBSDSun SolarisAIXالبته اینا فقط یه سری توضیحات معرفی بود و ما تو این آموزش هیچ کاری با اینا نداریم و فقط با استفاده از این کتابخانه یه سری اطلاعات در مورد هارد دیسک ها به دست می یاریم.یه توضیح خیلی کوتاهانواع هارد دیسک های ذخیره سازیدر این Script که اینجا نوشته خواهد شد شما قادر خواهید بود که اطلاعات هر نوع هاردی که هنگام اجرا آن به کامپیوتر وصل است را دریافت کنید. البته با این کتابخانه کار های بیشتری نیز می توان با هارد و خیلی چیز های دیگر انجام داد که در محوریت آموزک ما نیست.دریافت وضعیت فضای ذخیره سازی هارد دیسکبرای اینکه بفهمیم یک هارد دیسک چقدر فضای ذخیره سازی دارد، چه مقدار از آن استفاده شده، چه مقدار از آن آزاد است باید از تابع disk_usage از کتابخانه psutil استفاده کنیم.کد :import psutil
C_Drive = psutil.disk_usage(&#039;C:\\&#039;)
print(C_Drive)در Script بالا در خط اول کتابخانه psutil رو ایمپورت میکنیم و در خط دوم یک متغیر با نام C_Drive که حاوی خروجی (اطلاعات مورد نیاز) تابع disk_usage است را تعریف می کنیم. در نهایت هم آن را print میگیریم.نکته ای که این تابع داره اینکه باید بهش بگید که کدوم درایو رو بررسی کنه که ما در اینجا به صورت رشته، path درایو سی رو بهش می دیم. که شما می تونید با این حال ها بهش پاس بدید (فقط به جای C نام پارتیشن درایو مورد نظر را بنویسید.) :C:c:C:\\c:\\خروجی :اعداد و ارغام خروجی کد بالا در هر کامپیوتر متفاوت است. برای مثال در کامپیوتر من اطلاعات Drive سی بدین شکل است:sdiskusage(total=141157117952, used=105770504192, free=35386613760, percent=74.9)بیاید باهم این خروجی رو بررسی کنیم.پارامتر total کل فضای ذخیره سازی هارد دیسک را بر حسب بایت بر می گرداند.پارامتر used مقدار استفاده شده از کل فضای هارد دیسک را بر حسب بایت بر می گرداند.پارامتر free مقدار آزاد و استفاده نشده از کل فضای هارد دیسک را بر حسب بایت بر می گرداند.پارامتر percent مقدار استفاده شده فضا بر حسب درصد را به صورت تقریب گرد کردن تا یک رقم اعشار را نشان می دهد.(در سیستم عامل های لینوکسی شاید این پارامتر تا 5 واحد ضریب خطا داشته باشد.)دو تا نکته داره :1. اول اینکه اگه درایو پیدا نشه OSError بر می گردونه2. دوم اینکه خروجی به صورت یک نمونه از کلاس psutil._common.sdiskusage هستش و برای اینکه بتونیم در برنامه ازش استفاده کنیم دو راه داریم.راه اول : می تونیم ازش با کد زیر خروجی لیست بگیریم.C_Drive_List = list(C_Drive)
print(C_Drive_List)که خروجی ش به این شکلی یه :[ list Outpot ] -&gt; [141157117952, 105770504192, 35386613760, 74.9] راه دوم : به پارامتر هاش یکی یکی دسترسی پیدا کنیم (مثل کد زیر).print(f&#039;Total Disk : {C_Drive.total} Byte&#039;)
print(f&#039;Used Disk : {C_Drive.used} Byte&#039;)
print(f&#039;Free Disk : {C_Drive.free} Byte&#039;)
print(f&#039;Percent Disk : {C_Drive.percent} %&#039;)که خروجی ش این شکلی یه :Total Disk : 141157117952 Byte
Used Disk : 105770504192 Byte
Free Disk : 35386613760 Byte
Percent Disk : 74.9 %به دست آوردن پارتیشن ها و اطلاعات آنهاپارتیشن بندی یعنی اینکه یک یا چند هارد که به کامپیوتر وصل اند را به بخش های مختلف (درایو ها) تقسیم از آنها استفاده کنیم مثل نصب دو یا چند سیستم عامل بر روی یک هارد و ...حالا پارتیشن چیه؟ به هر کدوم از این بخش ها یه پارتیشن گفته میشه مثل درایو C، درایو D، درایو CD و DVD، هر فلش، هر هارد SD، هر هارد اکسترنالی که سیستم وصل میشه (البته هارد های اکسترنال رو هم میشه جدا گانه پارتیشن بندی کرد) و کلا به زبون خودمون پارتیشن ها همون درایو ها هستن.خوب حرف بسه، بریم سراغ کد.کد :import psutil
Drives = psutil.disk_partitions()
print(Drives)در Script بالا در خط اول کتابخانه psutil رو ایمپورت میکنیم و در خط دوم یک متغیر با نام Drives که حاوی خروجی (لیستی از پارتیشن های سیستم و اطلاعات آنهاست) تابع disk_partitions است را تعریف می کنیم. در نهایت هم آن را print میگیریم.نکته ای هم که این تابع داره اینکه خروجی یک لیست حاوی اطلاعات پارتیشن های سیستم که هر کدوم از آنها یک نمونه از کلاس psutil._common.sdiskpart هستن. البته جلوتر بهش می پردازیم.خروجی :این اطلاعات در هر کامپیوتر متفاوته ولی در کامیوتر من به این شکل عه[
sdiskpart(device=&#039;C:\\&#039;, mountpoint=&#039;C:\\&#039;, fstype=&#039;NTFS&#039;, opts=&#039;rw,fixed&#039;, maxfile=255, maxpath=260),
sdiskpart(device=&#039;D:\\&#039;, mountpoint=&#039;D:\\&#039;, fstype=&#039;NTFS&#039;, opts=&#039;rw,fixed&#039;, maxfile=255, maxpath=260),
sdiskpart(device=&#039;E:\\&#039;, mountpoint=&#039;E:\\&#039;, fstype=&#039;&#039;, opts=&#039;cdrom&#039;, maxfile=255, maxpath=260), sdiskpart(device=&#039;F:\\&#039;, mountpoint=&#039;F:\\&#039;, fstype=&#039;&#039;, opts=&#039;cdrom&#039;, maxfile=255, maxpath=260),
sdiskpart(device=&#039;G:\\&#039;, mountpoint=&#039;G:\\&#039;, fstype=&#039;FAT32&#039;, opts=&#039;rw,removable&#039;, maxfile=255, maxpath=260)
]خوب بیاید با هم دیگه این اطلاعات رو بررسی کنیم.این کد تمام درایو های من من را شناسایی کرده است. (درایو C، درایو D، درایو E که سی دی رام فیزیکی است، درایو F که سی دی رام مجازی است، درایو G که فلش است) می بینیم که همشون رو آورده و حالا بریم ببینیم که اطلاعات دورن هر کدوم چی هستن.پارامتر device : مسیر یا همون path دیوایس رو نشون میده، به زبون خودمون تو ویندوز ما بهش میگن درایو مثل &quot;\\:C&quot; در ویندوز و &quot;/dev/hda1&quot; در سیستم عامل های لینوکسی و macOSپارامتر mountpoint : یا همون نقطه اتصال که تو ویندوز بهش همون درایو میگن مثل &quot;\\:C&quot; . توی سیستم عمل های لینوکسی و macOS اگه بخوام ساده و مختصر توضیح بدم، وقتی که شما یک یا چند هارد رو پارتیشن بندی میکنید و برای مثال به سه Device به نام های sdb,sda و sdc تقسیم میکند. بعد این کار باید هر کدام را به یک دایرکتوری مانند / یا boot/ اتصال دهید. این پارامتر دایکتوری اتصال داده شده را نشان میدهد.پارامتر fstype : که مخفف File System Type هستش نوع سیستم فایل درایو یا همون دیوایس را نشان میدهد که میتواند اطلاعات مهمی را در اختیار ما بگذارد برای مثال میتوانیم از طریق این پارامتر تشخیص دهیم که نوع درایو ما چیست (فلش است، SD است، هارد کامپیوتری است و ...) برای مثال درایو G من یک فلش است که از نوع FAT32 آن میتوان این را تشخیص داد. البته تعداد این نوع ها در هر سیستم عامل متفاوت و زیاد است. باید بر روی آنها تحقیق کنید تا تشخیص بهتری داشته باشید.پارامتر opts : این پارامتر نیز مثل قبلی ها خیلی اطلاعات مهمی رو به ما میده ولی بسته به نوع سیستم عامل هستش و مقادیر خیلی زیادی داره و در هر سیستم عامل متفاوته، در کل یک رشته است که اطلاعات رو با  کاما جدا میکنه و به ما نشان میده مثل درایو C من که &#x27;rw,fixed&#x27; هستش. rw که مخفف reading and writing هست یعنی این هارد هم میتونه اطلاعات رو بنویسه و هم بخونه. fixed هم یعنی هارد ثابته و مثل فلش و هارد اکسترنال و ... نمیشه جابه جا ش کرد (یعنی درون کیس عه) یا درایو E که cdrom هستش یعنی که نوع این درایو سی دی خوان هست که درسته (البته اگه CD یا DVD وارد آن بشه این اطلاعات تغییر میکنه). یا درایو G من که &#x27;rw,removable&#x27; هستش یعنی هم میتونه اطلاعات رو بخونه و بنویسه و هم قابلیت جابه جایی داره.پارامتر maxfile : حداکثر طول کاراکتر های نام یک فایل در این درایو را مشخص می کند.پارامتر maxpath : حداکثر طول نام یک مسیر (نام دایرکتوری + نام فایل اصلی) که می تواند داشته باشد. را در این درایو مشخص می کند.همه این پارامتر ها اطلاعات مهمی را در اختیار ما می گذارند که میتواند خیلی مفید باشد. فقط تعداد این خروجی ها زیاد و در هر سیستم عامل متفاوت است که نمیتوان همه آنها را در این آموزک گفت. من پیشنهاد میکنم که در فرصتی مناسب در مورد همه آنها تحقیق کنی تا بتوانید از این اطلاعات بهترین استفاده را ببریدفقط میمونه استفاده از آنها در برنامه که چون خروجی به صورت لیستی از نمونه های کلاس sdiskpart هستن. میشه اونا رو تبدیل به لیست کرد. مثل کد زیر :Drives_list = []
for Drive in Drives:
    Drives_list.append(list(Drive))
print(Drives_list)که خروجی ش میشه این : [
[&#039;C:\\&#039;, &#039;C:\\&#039;, &#039;NTFS&#039;, &#039;rw,fixed&#039;, 255, 260],
[&#039;D:\\&#039;, &#039;D:\\&#039;, &#039;NTFS&#039;, &#039;rw,fixed&#039;, 255, 260],
[&#039;E:\\&#039;, &#039;E:\\&#039;, &#039;&#039;, &#039;cdrom&#039;, 255, 260],
[&#039;F:\\&#039;, &#039;F:\\&#039;, &#039;&#039;, &#039;cdrom&#039;, 255, 260]
[&#039;G:\\&#039;, &#039;G://&#039;, &#039;FAT32&#039;, &#039;rw,removable&#039;, 255, 260]
]یا اینکه می تونید به هر کدوم از پارامتر هاش تک تک دسترسی پیدا کرد مثل کد زیر :for Drive in Drives:
    print(f&#039;Drive {Drive.device[0:1]} :&#039;)
    print(f&#039;\tMount Point : {Drive.mountpoint[0:2]}&#039;)
    print(f&#039;\tFile System Type : {Drive.fstype if &amp;quot&amp;quot else None}&#039;)
    print(f&#039;\tOpts : {Drive.opts}&#039;)
    print(f&#039;\tMax File : {Drive.maxfile}&#039;)
    print(f&#039;\tMax Path : {Drive.maxpath}&#039;)
    print(&#039;\n&#039;)که خروجی ش این شکلی یه :Drive C :
        Mount Point : C:
        File System Type : None
        Opts : rw,fixed
        Max File : 255
        Max Path : 260


Drive D :
        Mount Point : D:
        File System Type : None
        Opts : rw,fixed
        Max File : 255
        Max Path : 260


Drive E :
        Mount Point : E:
        File System Type : None
        Opts : cdrom
        Max File : 255
        Max Path : 260


Drive F :
        Mount Point : F:
        File System Type : None
        Opts : cdrom
        Max File : 255
        Max Path : 260


Drive G :
         Mount Point : G:
         File System Type : FAT32
         Opts : rw,removable
         Max File : 255
         Max Path : 260

</description>
                <category>محمد حسن اسماعیلی</category>
                <author>محمد حسن اسماعیلی</author>
                <pubDate>Sat, 04 Sep 2021 18:49:52 +0430</pubDate>
            </item>
                    <item>
                <title>دیتابیس SQLite در Visual Studio Code</title>
                <link>https://virgool.io/@king_python/%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-sqlite-%D8%AF%D8%B1-visual-studio-code-u6ctvmnpouel</link>
                <description>کار با دیتابیس SQLite در VS codeهمه ما برنامه نویس ها با هر زبانی که کار کنیم بخش قابل توجهی از کارهامون رو با Visual Studio Code، این IDE قدرتمند و سبک و در عین حال کارآمد انجام میدیم.از طرفی امروزه ما در هر پروژه ای از Database ها برای ساخت برنامه های گوناگون استفاده میکنیم. و نیاز دارم با استفاده از اپلیکیشن های رابط با پایگاه داده ها به صورت گرافیکی کار کنیم و یا بر روی آنها کوئری بزنیم.حال این IDE قدرتمند به کمک ما آمده تا بدون نصب برنامه ای اضافه در همان محیط کد نویسی اقدام به تعامل با این دیتابیس ها بکنیم. من در این آموزش به شما یاد می دهم تا با دیتابیس SQLite در Visual Studio Code کار کنید و البته در آموزش های بعدی به سراغ بقیه دیتابیس ها هم خواهیم رفت.چی شد که من این مقاله رو نوشتم؟راستش من مثل همیشه داشتم توی Pycharm کد می زدم که یه روز یک پروژه به فکرم رسید که خیلی سنگین بود . ولی پروژه خوبی بود برای همین باید انجامش می دادم. اما یه مشکلی داشتم، اونم اینکه سیستم ام پروژه و نرم افزار های مورد نیازش رو نمی کشید. پس باید از یک IDE سبک تر و قدرتمند استفاده میکردم. خوب همه مون میدونم دارم در مورد کدوم IDE صحبت میکنم ولی یه مشکلی بود اونم اینکه باید با دیتابیس در تعامل می بودم و هر چی توی وبسایت های فارسی سرچ کردم به چیزی نرسیدم. دریغ از یه سایت، ولی مثل همیشه با جستجو در وبسایت های خارجی به نتیجه رسیدم. بعد از پایان پروژه به خودم گفتم که بهتره یه مقاله در این مورد بنویسم تا اگه کس دیگه ای مثل من دنبال این قابلیت می گشت از هفت خان رستم رد نشه.در آخر هم اگه سوالی داشتید ازم در نظرات بپرسید و حتما نظرتون رو در مورد مقاله بگید. لایک هم یادتون نره :)شروع کارلوگوی افزونه SQLiteهمه ما می دانیم که این IDE از خود چیزی ندارد و همین امر به او قدرت میدهد چون برای هر کاری یک extension یا همان افزونه دارد که آن را نصب و از امکانات آن استفاده میکنیم. پس برای کار با دیتابیس SQLite باید افزونه آن را با نام SQLite از بخش افزونه های این IDE نصب کنید که تا امروز که این مقاله را می نویسم حدود 700,000 نصب خورده است.برای نصب افزونه اینجا کلیک کن.باز کردن Databaseبرای باز کردن دیتابیس مورد نظر باید آن را به بخش EXPLORER کد ادیتور Visual Studio Code اضافه کنیم. (Open Folder یا Open File)راهنمای تصویری 1حال برای باز کردن پایگاه داده روی آن راست کلیک کرده و بر روی گزینه Open Database کلیک کنید. بعد این کار فیلد SQLITE EXPLORER باز میشود که میتوان با آن هر کاری که فکر اش را می کنید را انجام داد. (راهنمای تصویری 2)راهنمای تصویری 2برای بستن دیتابیس باز شده روی آن در بخش مدیریت پایگاه داده راست کلیک کرده و روی گزینه Close Database کلیک کنید.مشاهده جدول ها و اطلاعات آنها در Databaseبرای مشاهده لیست جدول ها بر روی دیتابیس کلیک کرده تا لیست جدول ها به صورت درختی نمایش یابد.راهنمای تصویری 3برای Refresh پایگاه داده میتوان از گزینه Refresh در بالای بخش SQLITE EXPLORER که در تصویر بالا (راهنمای تصویری 3) مشاهده می کنید استفاده کرد.برای مشاهده جدول به صورت گرافیکی (شبیه Excel) بر روی گزینه Play که در تصویر بالا (راهنمای تصویری 3) مشاهده می کنید و یا بر روی جدول راست کلیک کرده و بر روی گزینه Show Table کلیک کنید.بخش کوئری که میشه گفت پرکاربرد ترین بخش این ابزار هستش که در ادامه به آن می پردازیم.مشاهده ستون های جدول ها و اطلاعات آنها در Databaseبرای مشاهده لیست ستون ها بر روی جدول کلیک کرده تا لیست ستون ها به صورت درختی نمایش یابد.راهنمای تصویری 4شما در این بخش می توانید همه اطلاعات ستون ها را همان طور که در تصویر بالا (راهنمای تصویری 4) می بینید از نام، نوع، خواص و ... مشاهد کنید. و هم می توانید اسکرول موس را روی ستون نگه دارید و اطلاعات را مشاهده کنید.نمایش جدول به صورت گرافیکیخوب برای اینکه جدول رو مثل Excel به صورتی که قابل درک تر باشه نمایش بدیم همان طور که قبل تر گفتم باید روی گزینه Play (راهنمای تصویری 3) یا با راست کلیک کردن روی جدول و کلیک کردن روی گزینه Show Table آن را نمایش دهیم.راهنمای تصویری 5در این بخش شما میتوانید جدول را به صورت گرافیکی ببینید.شما قادر هستید که از جدول، خروجی TXT , HTML و حتی JSON بگیرید و آن را به صورت فایل ذخیره کنید. برای این کار همانند تصویر بالا (راهنمای تصویری 5) باید از دکمه های بالای جدول استفاده کنید.همچنین شما می توانید از بخش SQL که در تصویر بالا مشخص شده است کوئری SQL این جدول را ببنید. فقط برای باز و بسته کردن روی آن کلیک کنید.یه نکته ای رو اینجا بگم که اگه هر تغییری روی دیتابیس اعمال کردید باید این پنجره رو Refresh کنید که قبل تر گفتم چطوری میشه این کار رو کرد. حتی اگه باز و بسته ش کنید باز هم باید یک بار دیتابیس را Refresh کنید تا تغییرات نمایش داده بشه.یه صحبت کوتاهما تا الان با این ابزار آشنا شدیم و دیدم که چطور میشه یه Database رو توی اون باز کرد و دورن ش کاوش کرد ولی هیچ تغییر روی Database مون اعمال نکردیم. در واقع عملیات های ویرایش، حذف، انتخاب، و ... هم میشه در این ابزار انجام داد ولی با یک روش خواص، چه روشی؟خوب باید بگم با استفاده از کوئری زدن روی Database میشه این کار ها رو تو این ابزار انجام داد که در ادامه درباره کوئری زدن در این ابزار صحبت میکنم.راستی در ادامه آموزش از کوئری های SQL استفاده می کنیم پس بهتره زبان SQL رو بلد باشید.کوئری زدن روی Database (حذف، ایجاد، ویرایش، انتخاب، و ...)همان طور که قبلا گفتم برای اینکار باید بر روی علامت New Query در بخش SQLITE EXPLORER کلیک کنید. راهنمای تصویری 6بعد این کار فایلی ناشناس باز می شود که می توانید در آن کوئری SQL بزنید و بر روی دیتابیس خود هر نوع تغییری که می خواهید را اعمال کنید.شما می توانید کوئری خود را با فرمت sql ذخیره کنید.اجرا کوئری و دیدن نتیجه آنحال نوبت آن رسیده که کوئری خود را اجرا کنیم. برای اجرای کوئری خود باید در محیط کوئری نویسی راست کلیک کرده و کوئری خود را اجرا (Run) کنیم.راهنمای تصویری 7اصولا ما دو نوع روش Run کردن در این ابزار داریم.     ۱. Run Query     ۲. Run Query Selectedاز روش Run Query برای اجرای کوئری هایی که مقداری باز نمی گردانند ولی تغییری بر روی دیتابیس اعمال می کنند استفاده می شود. شما میتوانید برای اجرای کوئری تان با این روش از کلید های ترکیبی Ctrl + Shift + Q به صورت پیشفرض استفاده کنید. برای مشاهده تغییرات پنجره باز شده بعد اجرا را ببندید و دیتابیس را Refresh کرده و حالا می توانید تغییرات را مشاهده کنید. همچنین از روش Run Query Selected برای اجرای کوئری هایی که مقداری باز می گردانند ولی تغییری بر روی دیتابیس اعمال نمی کنند استفاده می شود. بعد از اجرا جدولی حاوی اطلاعاتی که Select کرده بودید نمایش می یابد.مثال :راهنمای تصویری 8خطا هازبان SQL مثل هر زبان دیگری اگر به آن دستورات اشتباهی وارد شود اجرا نشده و خطا بر میگرداند و از اسیب به اطلاعات به صورت ناخواسته جلوگیری می کند.حال فرض کنید که شما در بخش کوئری زدن، کوئری اشتباه وارد کنید. آنگاه ابزار خطایی را برای شما در بخش OUTPUT ترمینال برنامه با یک ری اطلاعات به شما باز می گرداند. پس اگر تغییرات یا انتخاب های شما نمایش داده یا اعمال نشد. حتما به این بخش یک نگاه بیندازید. البته اگر دستوری را اشتباه وارد کنید خود به شما می گوید پس نگران نباشید.مثلا من در تصویر زیر پرانتز ای را که باز کرده بودم در انتها نبست م و خطا برای من نمایش داده شد :راهنمای تصویری 9کلام آخر و پایانامیدوارم که از این آموزش لذت برده باشید و براتون مفید بوده باشه. اگه خوشتون اومد لایک بکنید. اگه سوالی یا نظری داشتید در بخش نظرات بگید حتما.و اخر کلامم اینکه سعی کردم ساده و گام به گام توضیح بدم. کسایی که در نرم افزار ها یا IDE های دیگه با این قابلیت کار کردن قطعا براشون راحت بود چون عین هموناست.و در نهایتقربان شما، خدافظ</description>
                <category>محمد حسن اسماعیلی</category>
                <author>محمد حسن اسماعیلی</author>
                <pubDate>Sat, 07 Aug 2021 19:42:53 +0430</pubDate>
            </item>
            </channel>
</rss>