<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Pouya Rezaei</title>
        <link>https://virgool.io/feed/@pooya.rezaee</link>
        <description>یک گیک و عاشق تکنولوژی, بکند دولوپر پایتون و دانشجوی مهندسی کامپیوتر</description>
        <language>fa</language>
        <pubDate>2026-06-10 12:20:29</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2200140/avatar/AIAqrZ.jpg?height=120&amp;width=120</url>
            <title>Pouya Rezaei</title>
            <link>https://virgool.io/@pooya.rezaee</link>
        </image>

                    <item>
                <title>درک سریع و ساده request تا response با محوریت  Restful API</title>
                <link>https://virgool.io/@pooya.rezaee/%D8%AF%D8%B1%DA%A9-%D8%B3%D8%B1%DB%8C%D8%B9-%D9%88-%D8%B3%D8%A7%D8%AF%D9%87-request-%D8%AA%D8%A7-response-%D8%A8%D8%A7-%D9%85%D8%AD%D9%88%D8%B1%DB%8C%D8%AA-restful-api-rdal1of39usl</link>
                <description>این پست به درد کسی میخوره که تازه میخواد به دنیای api ورود کنه و مخصوصا Restful یاد بگیره هدف اینه سریع مفاهیم اولیه رو یاد بگیرین تا ادامه راه سردرگم نشین برای اینکه بخام راجع به API صحبت کنم اول یکم عقب تر میریم مفاهیم ریشه ای تر رو درک کنیم بعد میریم سراغش اگه میدونین request تا response چجوری عمل میکنه گذر کنین و سروقت تایتل API بریمبه جایی که قراره درخواست بزنیم سرور میگن و به کسی که درخواست میزنه یعنی ما کلاینت میگنکلاینت به آدرس مشخصی همراه با یک سری داده ها درخواست (request) میفرسته اینجا نقطه شروع اتصال میشه و سرور اون آدرس رو دریافت میکنه یک پردازشی انجام میده و درنهایت پاسخی(response) به کلاینت برمیگردونه بعد از انجام این روند ارتباط قطع میشهاین رویکردی هس که پروتکل HTTP/HTTPS طی میکننوقتی شما به یه صفحه وب مثل https://google.com درخواست میفرستین ریکوئست شما حاوی ادرس(URL) ارسالیتون به همراه یک سری header ها هست مثالی از یک هدر GET /api/users/123 HTTP/1.1
Host: example.com
Accept: application/json
Authorization: Bearer Tokenrhueue7372uwyuwhJhs737
Content-Type: application/jsonسرور هدر هارو میخونه و میبینه شما روی کدوم مسیر ریکوئست زدین که در اینجا / هست و تصمیم میگیره با توجه به مسیر و هدر و باقی اطلاعات چی برگردونه که برای مثال مسیر / گوگل صفحه سرچ انجین گوگل رو ریسپانس میده و بصورت کد html هست مرورگر کد html رو میخونه پردازش میکنه و اون چیزی که باید رو بهتون نشون میدهشاید درباره اینکه گفتم مسیر ما / هست کمی گیج شده باشین، یک مثال از آدرس کاملhttps://blog.example.com/article/1?status=trueآدرس یا URL ما حاوی اطلاعات زیر هستپروتکل ارتباطی : HTTPS    ساب دامین : blog    دامین : example.com    مسیر : article/1/    پارامتر ها : status=trueفعلا در همین حد که بدونین هر بخش چی هست کافیه احتمالا بعدا بهشون جزئی بپردازیمحالا که عملکرد request تا response رو متوجه شدین میریم سراغ بخش بعدAPIبعضی وقتا به API میگن وب سرویس چون هدفش ارائه یک سرویس هست کاربردش به این صورت هست همین عملکرد request تا response رو داشته باشین اما قرار نیس به شما کد html برگرده بلکه نوعی دیتا برمیگرده قابل استفاده توی همه چیز باشه که معمولا اون دیتا بصورت json هست(کمی قدیم تر XML متداول بود)یک نمونه داده جیسانی:{
  &amp;quotname&amp;quot: &amp;quotJohn Doe&amp;quot,
  &amp;quotage&amp;quot: 30,
  &amp;quotemail&amp;quot: &amp;quotjohndoe@example.com&amp;quot,
  &amp;quotaddress&amp;quot: {
    &amp;quotstreet&amp;quot: &amp;quot123 Main St&amp;quot,
    &amp;quotcity&amp;quot: &amp;quotAnytown&amp;quot,
    &amp;quotcountry&amp;quot: &amp;quotUSA&amp;quot
  },
  &amp;quotinterests&amp;quot: [&amp;quotcoding&amp;quot, &amp;quotreading&amp;quot, &amp;quothiking&amp;quot]
}هرچیزی که میبینین انلاین شده از جمله برنامه های موبایل و دسکتاپ، بازی هایی حتی مثل pubg و خیلی از سایت ها بر بستر API دیتاشون رو بین اون چیز و سرورشون تبادل میکننانواع API ها داریم از جمله REST,GraphQL,SOAP که هرکدوم کاربرد و عملکرد متفاوت دارن ما اینجا Restful API رو بررسی میکنیموقتی میگیم API ما Restful هست یعنی از قوانین REST باید پیروی بکنیم که بصورت زیر هستدر Rest ما 4 دسته عملیات داریم که به اون کراد یا CRUD میگنC -&gt; CreateR -&gt; ReadU -&gt; UpdaeD -&gt; Deleteو متدای ریکوئست زدن متدوال به همراه عملکردشون به این صورت هستنGET : وظیفه خواندن یا ReadPOST : وظیفه ثبت رکورد جدید یا عملیات CreatePUT : وظیفه تغییر کامل یک رکورد یا UpdatePATCH : وظیفه اپدیت بخشی از رکورد یا مجدد UpdateDELETE : حذف یک رکورد یا همون Deleteاین نکته رو هم بگم غیر GET توی بقیه حالت ها اکثر اوقات چیزی تحت عنوان body هم براشون ارسال میشه که اون هم معمولا بصورت json هستبرای مثال میخایم پست شماره 4 رو حذف کنیمریکوئست میزنیم به https://example.com/post/delete با متد DELETE و به همراه این body :{
   post_id : 2
}این وظیفه ها بصورت قرار دادی هس و اجبار به رعایتش نیس اما رعایت نکردنش کار خوبی نیسبعد از زدن ریکوئستمون ریسپانسی که از سرور میگیریم حاوی اطلاعاتی هس مثل Header ای که استفاده کردیم و status codeاستتیوس کد ها اعداد سه رقمی هستن که مشخص میکنن چه اتفاقی توی پردازش انجام شدهدسته 1XX مثل یک اطلاعیه هستدسته 2XX به معنی موفق بودن عملیاتدسته 3XX نشون میده ما به صفحه دیگه انتقال پیدا کردیم یا باید بکنیمدسته 4XX مشکل از سمت کاربر هستدسته 5XX مشکل از سرور هستمعنی چند تا از مداول ترین ها200 : با موفقیت انجام شد201 : با موفقیت ایجاد شد400 : کاربر اطلاعات را اشتباه ارسال کرده401 : نیاز به احراز هویت هست403 : دسترسی غیر مجازاگه از این دسته صحبت ها دوست دارین میتونین در کانال تلگرامم جوین بشین https://t.me/P_R_Tech </description>
                <category>Pouya Rezaei</category>
                <author>Pouya Rezaei</author>
                <pubDate>Sat, 16 Mar 2024 15:23:16 +0330</pubDate>
            </item>
                    <item>
                <title>مرور ساده و سریع بر Python Types</title>
                <link>https://virgool.io/codenevis/%D9%85%D8%B1%D9%88%D8%B1-%D8%B3%D8%A7%D8%AF%D9%87-%D9%88-%D8%B3%D8%B1%DB%8C%D8%B9-%D8%A8%D8%B1-python-types-tr37uxodmhrt</link>
                <description>ما در پایتون مثل تقریبا تمام زبان های برنامه نویسی type annotations یا type hints رو داریم(از ورژن 3.5 به بعد اضافه شده) فقط با این تفاوت که داخل پایتون اجباری به رعایت این کار نیست اما این به این معنی نیست که نباید اینکارو انجام داد.اگه میخاید:کد استانداردی داشته باشیدماژول یا لایبرری بنویسیدبا تیم یا داخل شرکتی کارکنیدشما مجبورید از این ویژگی پایتون استفاده کنید و فکر استفاده نکردنشو از سرتون بیرون کنید.همیشه بهترین مرجع داکیومنت های رسمی هست که از این لینک میتونید بخش typing داکیومنت پایتون رو بخونید اما از اونجایی که زمان بر هست و ممکنه با انگلیسی بودنش مشکل داشته باشید من اینجا چیزای پایه ای و قسمت های مهمشو براتون توضیح میدم و برای یادگیری عمیق تر به داکیومنت مراجعه کنید.مشخص کردن نوع Typeدر حالت کلی اعلام کردن type متغییر به این صورت انجام میشه :var: type = valueمیتونیم به همین صورت متغییری را تعریف کنیم یا نوع property کلاس یا نوع ورودی فاکشن را اعلام کنیمage: int = 20

class Person:
    name: str

def f(item: str):
    passو همچنین نوع خروجی تابع را با علامت -&gt; سپس type مدنظر مشخص میشه :def say_hello(name: str) -&gt; str:
    return &#039;Hello &#039; + nameدر مثال بالا فانکشن ما یک پارامتر تحت اسم name داره که گفتیم از نوع str باید باشه و خروجی هم یک str هست.حالا بنظرتون اگه ما بجای string تایپ دیگ ای به آرگومان تابع بدیم چی میشه؟اتفاق خاصی نمیفته(فارق از اینکه Hello میتونه با اون تایپ جمع بشه یا نه)اجرای کد اروری به ما نمیده این اعلام کردن تایپ ها به دو دلیلهبرای مشخص بودن نوع متغییر بین خودمون یا سایر هم تیمی هایی که روی کد کار میکننباعث میشه IDE ما بفهمه چه چیزی باید فرستاده بشه یا برگردونده بشه که باز این خودش باعث بهتر کارکردن snippets و نشون دادن warning های  بهتر برای دیباگ کردن میشه.انواع typesشما میتونید از type های built-in پایتون استفاده کنید تایپ های زیر جزو تایپ های ساده  بحساب میاد و نکته خاصی نداردintfloatboolbytesتایپ های بعدی که در ادامه معرفی میشوند در ورژن های 3.8 و قبل تر باید از ماژول typing اون رو import میکردید اما از 3.9 و به بعد این کار منسوخ شده و باید مستقیم از همون تایپ بدون ایمپورت کردن استفاده کرد برای مثال تایپ لیست در 3.8 از typing.List استفاده میشد اما در 3.9 از list استفاده میشود#3.8 Version
from typing import List
def f(item: List):
    pass
#3.9 Version
def f(item: list):
    passlist:به چند صورت میتوان از لیست استفاده کردdef f(items1: list, items2: list[int], items3: list[list[int]]):
    passهر پارامتر به این صورت عمل میکندitems1 : هر نوع لیستی را میتوان فرستادitems2: لیستی که فقط اعداد صحیح داردitems3: لیستی که درون آن لیستی از عداد صحیح وجود دارد(میتوان یک ماتریس دو بعدی فرض کرد)و به همین صورت میتوان بسته به نیاز نوع لیست مدنظر اون رو تعریف کردtuple :def f(items1: tuple[int],items2: tuple[float,int,int]):
    passitems1: تاپلی از اعداد صحیحitems2: تاپلی که سه عضو دارد اولی عدد اعشاری دومی و سومی اعداد صحیحdict :def f(prices: dict[str,int]):
    passاین نوع تایپ برای پارامتر prices به این معنی هست که دیکشنری کلید های str و مقادیر int داردجزئیات بیشتر و سایر تایپ های دیگه رو میتونید داخل داکیومنت رسمی بخونید.قابلیت های بیشتر شما میتونید: چند حالت رو برای نوع تایپ اعلام کنیدdef f(item : str | int):
    passبرای تایپ مدنظر alias قرار بدینtype Matrix2d = list[list[int]]
def sum_matrix(m1: Matrix2d, m2: Matrix2d):
    passفقط مقادیر مشخصی رو بگیرینfrom typing import Literal
def open_helper(file: str, mode: Literal[&#039;r&#039;, &#039;rb&#039;, &#039;w&#039;, &#039;wb&#039;]) -&gt; str:
    ...مشخص کنید مقدار متغییر قرار نیست تغییر بکنهfrom typing import Final
MAX_SIZE: Final = 9000و بسیاری قابلیت فراوون دیگهتا اینجا فقط خواستم یه دیدگاهی بگیرین که این سیستم چطور کار میکنه و چه کارایی از پسش برمیاد, و چون سیستم تایپینگ پایتون توی هر ورژن دچار تغییرات زیادی میشه ممکنه بعضی از چیز های گفته شده توی ورژن های جدیدتر منسوخ بشه در حال حاضر تا ورژن 3.12 معتبر هست.</description>
                <category>Pouya Rezaei</category>
                <author>Pouya Rezaei</author>
                <pubDate>Sun, 17 Dec 2023 01:18:33 +0330</pubDate>
            </item>
                    <item>
                <title>ساخت چت بات مشابه ChatGpt در پایتون</title>
                <link>https://virgool.io/@pooya.rezaee/%D8%B3%D8%A7%D8%AE%D8%AA-%DA%86%D8%AA-%D8%A8%D8%A7%D8%AA-%D9%85%D8%B4%D8%A7%D8%A8%D9%87-chatgpt-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-jnuwyh6gbicx</link>
                <description>این روزا خیلی چت بات ها داغ شدن گفتم یاد بدم چجوری یک چت بات بسازین,بدون گفتن حرف های اضافه سریع بریم سر اصل مطلبچت بات چی هست؟ساده ترین توضیح به رباتی که باهاش چت میکنن چت بات میگن و اگه یکم با جزییات بیشتر بخوام بگم یک برنامه ای هست که بهش یک پیغامی رو میدیم پردازش میکنه و میخونه(یعنی میتونه متن رو درک کنه که چی توش گفته شده و خواسته چی هست) و بر اساس اون متن یک جوابی میدهحالا اگه قرار باشه یک چت بات خفن رو از صفر خودتون پیاده کنین خیلی چالشا هست از جمله:توانایی ایجاد یه مدل پردازش متن به همراه یه تیم حفن که روش زمان زیادی کار کنن شاید چنیدن سال و سرمایه مالی هنگفت.این که سخت شد !یه راه راحت تری هم وجود داره اونم استفاده از سرویس های ارایه دهنده چت بات که بر بستر api از اون میشه استفاده کرد(همون جمله معروف:همیشه که قرار نیس چرخو بسازیم)یکی از معروف ترین این سرویس ها کمپانی OpenAi که درواقع سازنده همین ChatGpt هستغیر از چت بات OpenAi سرویس های زیادی که با هوش مصنوعی کار میکنن داره از جمله تبدیل صدا به متن,تبدیل متن به عکس که از هرکدوم به راحتی میتونین استفاده بکنیندر ادامه میگم که چطور سوالاتونو رو به OpenAi برسونین و جواب بگیرین و باقی سرویس هارو به خودتون میسپرمدر این لینک میتونین داکیومنت رسمی خود OpenAi رو برای استفاده از سرویس ها ببینین.این نکته رو توجه داشته باشید که برای استفاده از این API نیاز به هزینه هست اما به بعضی اکانت ها چندین دلار استفاده رایگان میده برای مثال به اکانت من 18 دلار داد اما این مقدار شانسی هستاول از همه یک اکانت openai بسازید سپس در این لینک یک Secret Key بگیرید که در ادامه برای احراز هویت از اون استفاده  میکنیمسپس پکیج openai رو نصب میکنیمpip install openaiو در ادامه با این قطعه کد میتوانید پیام خود را ارسال کنیدimport openaicompletion = openai.Completion.create(api_key=&#039;Secret Key&#039;,engine=&#039;text-davinci-003&#039;,prompt=&#039;What is bnana? &#039;,max_tokens=1000,n=1,temperature=0.7)در اینجا ابتدا پکیج را وارد میکنیم کردیم و با استفاده از ابجکت Completion متد create را فراخوانی میکنیم و به این صورت پیام خود را ارسال میکنیم.ارگومان هایی که میگیره:api_key:سکرت کی که از سایت گرفتین اینجا قرار میدینengine:مدل انجینی که قراره از اپن استفاده بشه,openai برای ما مدل انجین های متنوعی قرار داده که هرکدوم برای کار های مختص خودش بهینه شده و هزینه های متفاوتی داره و میتونین از این لینک نگاهی به مدل ها بندازینprompt:پیغامی که قرار ارسال بکنیم کهmax_tokens:برای هر درخواست مقدار توکنی مصرف میشه که برای مشخص کردن اینکه حداکثر چقدر مصرف بشه مقدار ان را وارد میکنیم که باید یک عدد اینتیجر باشهn:تعدا پاسخ هایی که تولید کندtemperature:میزان خلاقیت را مشخص میکنیم که 0.1 تا 2 میشه مقدار داد و هرچه این عدد بیشتر باشه توکن بیشتری مصرف میشهپاسخ به کا یک json برمیگردونه که برای رسیدن مستقیم به جواب این مقدار رو قرار میدیمresponse = completion.choices[0].text.strip()در اینجا مقدار choices اولین ایندکس ان را میگیریم(اکر n را بیشتر از 1 بذاریم به همون تعداد جواب تولید میشه و در اینجا میشه حلقه فور زد و تمام جواب ها را در یک ارایه ریخت) سپس text ان را میگیریم و با متد strip فاصله های ان را حذف میکنیم در نهایت جواب خام ما در response قرار دارداین ساده ترین حالت ارسال یک متن و گرفتن جواب بود اپشن های زیادی وجود داره برای مثال چت هارو توی یک سشن قرار بدین تا به پیام های قبلی هم دسترسی داشته باشه یا خیلی اپشن های دیگ که برای مشاهده بیشتر میتونین داکیومنت رو مشاهده کنینیک پکیج پایتونی هم برای راحت تر کردن ساخت چت بات مشابه چت جی پی تی وجود به اسم  revChatGPT داره اما متاسفانه داکیومنت کاملی نداره ,برای دسترسی به این پکیج میتونین از این لینک به گیت هاب پروژه دسترسی پیدا کنین.شما میتونین چت باتتون رو به هر برنامه ای وصل کنید و هرطور که دوست داشتید کاستومایز کنین و برای نمونه میتونین این کد رو در گیت هابم ببینین که من با استفاده از html,tailwind.css,js در فرانت اند و python,flask در بکند یک چت بات ساده رو پیاده کردم</description>
                <category>Pouya Rezaei</category>
                <author>Pouya Rezaei</author>
                <pubDate>Sat, 18 Mar 2023 17:00:05 +0330</pubDate>
            </item>
                    <item>
                <title>کارکردن با داکر بدون نیاز به نصب</title>
                <link>https://virgool.io/@pooya.rezaee/%DA%A9%D8%A7%D8%B1%DA%A9%D8%B1%D8%AF%D9%86-%D8%A8%D8%A7-%D8%AF%D8%A7%DA%A9%D8%B1-%D8%A8%D8%AF%D9%88%D9%86-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%D9%86%D8%B5%D8%A8-xrq6tmxxnhfz</link>
                <description>چند وقتی بود درگیر این بودم چطور داکر رو بدون نیاز به نصب اجرا کنم(چون CPU من از قابلیت SLAT پشتیبانی نمیکنه)اما چون نیازم نشده بود خیلی پیگیر نشده بودم تا اینکه امروز لازمم شد و شروع به گشتن کردم تا ببینم چی گیرم میاداول طبق رسم هر متنی که نوشته میشه یه مقدمه ای بگم بعد بریم سراغ اصل مطلبداکر چی هست؟ مقاله های زیادی توی سطح وب هستن یا همین ویرگول خودمون هستن که میتونین توضیح کامل تری ببینین ازش اما بخام یه توضیح مختصری بدم داکر برای ما یه محیط های مجازی ایجاد میکنه که ما یه سری کارهایی رو داخل اون انجام بدیم مثل بالا اوردن یه سیستم عامل و اجرای یه سری برنامه های اماده یا برنامه های خودمون که به هر یک از این محیط ها کانتینر میگن و کانتینر ها ایزوله از هم هستنکاربردش چیه؟ همیشه این اتفاق زیاد پیش میاد که کد روی سیستم ما کار میکنه اما روی سیستم شخص دیگه,سرور,یا ... به ارور های عجیب غریب برخورد میکنهبرای حل این مشکل داکر یا پلتفرم های مشابه بوجود اومدن تا بتونن کد رو توی محیط و شرایط یکسان اجرا کنن تا در همه سیستم ها بدون مشکل کد کار بکنهبرای استفاده از داکر راه اصلیش و بهترین راه این هست که نصبش کنیم روی سیستممون که اموزش کاملش در سایت رسمی داکر وجود داره و میتونین به راحتی از روی اون پیش بریناما یه سری پیشنیاز هایی نیاز هست داشته باشین که اینم توی داکیومنت داکر برای ویندوز و لینوکس گفته شده اگر این پیشنیاز هارو ندارین یا به هر دلیلی نیمتونید نصب کنین نگران نباشیدچطور بدون نصب داکر ازش استفاده بکنم؟سایت های مختلفی برای کار با داکر بصورت انلاین وجود داره که در اینجا لیستی از این ها رو براتون میارم اما قبلش یه تشکر از ChatGpt هم بکنم که کمکم کرد تا این چند سروس پیدا کنم‌ :)قبل شروع یادآوری بکنم که ما از اکثر سرویس ها تحریم هستیم برای ادامه مسیر از شکن استفاده کنینDocker Playground برای استفاده از این سرویس نیاز به ثبت نام در داکرهاب و لاگین با اون اکانت دارین  Google Cloud Shellاین سرویس که مال گوگل هست درواقع شل در اختیار ما قرار میده که فقط مختص داکر نیست و کارهای زیادی میشه کرد که یک نمونش استفاده از داکر هستKatacodaراستش از این یکی هنوز استفاده نکردم و برای این اوردم اگه با دوتای بالا به مشکل خوردین گزینه سومی هم داشته باشینچند تا معایب این روش:ملموس ترینش نیاز به اینترنت هست مسلما با این وضع اینترنتی که داریم و تحریم و فیلترینگ و .. استفاده ازش سخت میتونه بشهمحدودیت نسبت به منابع دارین و معمولا مقدار کمی از سی پی یو و رم در اختیارتون قرار میدنمحدودیتایی توی ایجاد کانکشن بین سرویس ها و نتورکینگ وجود دارهشماهم اگه پیشنهادی دارین خوشحال میشم تو کامنت ها بگین تا من بقیه دوستان استفاده بکنیم</description>
                <category>Pouya Rezaei</category>
                <author>Pouya Rezaei</author>
                <pubDate>Sat, 18 Feb 2023 15:22:40 +0330</pubDate>
            </item>
            </channel>
</rss>