TorhamDev | تورهام 😳
Photo
تست کردن کانکارنسی در جنگو
دیشب داشتم تسک مصاحبه شرکت صرافی تبدیل میزدم. داخل تسک لازم بود یک api رو تست کنم که مشکل race condition نداشته باشه. برای اینکار با استفاده از pytest-django شروع کردم تسک های معمول نوشتن و همچی اوکی بود. برای تستهام هم یک fixture نوشتم که برام یک Seller بسازه و با استفاده از اون ریکوئست بزنم به api. همین api نباید حساب seller بیشتر از چیزی که درخواست داده تایید کنه. مثلا اگر درخواست داده ۱۰۰ تومن زیاد تر بشه اگر همزمان ۲۰ تا درخواست برای تایید این افزایش بیاد فقط یکدونه باید تایید بشه.
مشکل این تایید شدن نیست شما برای این جلوگیری از این ماجرا میتونید lock دیتابیس بگیرید.
مشکل اونجایی پیش اومد که من برای تست این race condition اومدم ۲۰ تا ترد ساختم و اون ۲۰ تا همزمان ریکوئست میزدن به این view ولی اتفاقی که افتاد این بود که Seller ای که من داخل فیکسچر ساخته بودم داخل این تردها انگار وجود نداشت. زمانی که ریکوئست خارج از thread میخورد همچی اوکی بود و api میتونستد sellerای که براش درخواست داده بودم رو پیدا کنه. اما تمام درخواستهای داخل تردها به ارور ۴۰۴ میرسیدن چون seller وجود نداشت.
بعد از فحشها و تلاشهای فراوان و تحقیق فهمیدم که جنگو عزیز برای هر تست یک transaction باز میکنم و تغییراتی که ایجاد میشه به خاطر اینکه داخل یک ترنزاکشن هستن کامیت نمیشن :) در نتیجه دیتابیس همچین ابجکتی برای تردهایی که ساختم نداره :) و باید همونطور که در عکس میبینید جنگو فورس کنید که تغییرات کامیت کنه تا داخل تردها هم بتونید دیتایی که ساختید ببینید.
و تمام اینا تو محیط تست بود دیگه.
@TorhamDevCH
دیشب داشتم تسک مصاحبه شرکت صرافی تبدیل میزدم. داخل تسک لازم بود یک api رو تست کنم که مشکل race condition نداشته باشه. برای اینکار با استفاده از pytest-django شروع کردم تسک های معمول نوشتن و همچی اوکی بود. برای تستهام هم یک fixture نوشتم که برام یک Seller بسازه و با استفاده از اون ریکوئست بزنم به api. همین api نباید حساب seller بیشتر از چیزی که درخواست داده تایید کنه. مثلا اگر درخواست داده ۱۰۰ تومن زیاد تر بشه اگر همزمان ۲۰ تا درخواست برای تایید این افزایش بیاد فقط یکدونه باید تایید بشه.
مشکل این تایید شدن نیست شما برای این جلوگیری از این ماجرا میتونید lock دیتابیس بگیرید.
مشکل اونجایی پیش اومد که من برای تست این race condition اومدم ۲۰ تا ترد ساختم و اون ۲۰ تا همزمان ریکوئست میزدن به این view ولی اتفاقی که افتاد این بود که Seller ای که من داخل فیکسچر ساخته بودم داخل این تردها انگار وجود نداشت. زمانی که ریکوئست خارج از thread میخورد همچی اوکی بود و api میتونستد sellerای که براش درخواست داده بودم رو پیدا کنه. اما تمام درخواستهای داخل تردها به ارور ۴۰۴ میرسیدن چون seller وجود نداشت.
بعد از فحشها و تلاشهای فراوان و تحقیق فهمیدم که جنگو عزیز برای هر تست یک transaction باز میکنم و تغییراتی که ایجاد میشه به خاطر اینکه داخل یک ترنزاکشن هستن کامیت نمیشن :) در نتیجه دیتابیس همچین ابجکتی برای تردهایی که ساختم نداره :) و باید همونطور که در عکس میبینید جنگو فورس کنید که تغییرات کامیت کنه تا داخل تردها هم بتونید دیتایی که ساختید ببینید.
و تمام اینا تو محیط تست بود دیگه.
@TorhamDevCH
👍11❤1🔥1
https://youtu.be/PgDaJEjlBuI
ویدئو امروز، تفاوت بین مولتی پروسسینگ و مولتی ترد. چی هست، تو پایتون چطوریه کجا کدوم استفاده کنیم.
#vid_per_day
@TorhamDevCH
ویدئو امروز، تفاوت بین مولتی پروسسینگ و مولتی ترد. چی هست، تو پایتون چطوریه کجا کدوم استفاده کنیم.
#vid_per_day
@TorhamDevCH
YouTube
Multithreading vs Multiprocessing | System Design
https://systemdesignschool.io/ 👈 Best place to learn and practice system design
In this video, we dive into the key differences between multithreading and multiprocessing, two powerful approaches to achieving concurrency in programming. Whether you're building…
In this video, we dive into the key differences between multithreading and multiprocessing, two powerful approaches to achieving concurrency in programming. Whether you're building…
👍6
TorhamDev | تورهام 😳 pinned «https://youtu.be/PgDaJEjlBuI ویدئو امروز، تفاوت بین مولتی پروسسینگ و مولتی ترد. چی هست، تو پایتون چطوریه کجا کدوم استفاده کنیم. #vid_per_day @TorhamDevCH»
pyproject.toml
قبلاها وقتی میخواستید یک پروژه رو یکسری کانفیگ براش بزارید باید یک عالمه فایل پختلف براش میساختید، برای مثال فایلهایی مثل setup.py, toxic.ini, mympy.cfg و یک خروار فایل دیگه، تقریبا هر ابزاری کانفیگ فایل خودش داشت. این باعث میشد یک عالمه فایل مختلف ایجاد بشه که تهش میخواستن چندتا ابزار کانفیگ کنن.
در pep 518 اومدن pyproject.toml معرفی کردن.
از به بعد تمام کانفیگهای خود پروژه، متادیتاهای پروژه و کانفیگ ابزارها همه داخل همین یکدونه فایل خواهد بود.
این روزها اگر نگم همه اکثر ابزارها مدرن پایتونی مثل ruff, uv, peotry و ... از این فایل پیروی میکنن و اگر کانفیگی داخلش قرار بدید و این فایل در root پروژه باشه ازش پیروی میکنن.
اینطوری تمام کانفیگها و تنظیمات لازم یک پروژه داخل یک فایل جمع میشه و دیگه نیازی به چندین فایل و کانفیگ متفاوت نیست.
اگر با uv کار کرده باشید بعد از اینکه یک پروژه رو باهاش init کنید براتون این فایل میسازه و میتونید باهاش یکم بازی کنید :)
مثلا میتونید ruff رو کانفیگ کنید که هرکسی که پروژه شما رو باز کرد و خواست روش کار کنه از استایل و قوانین شما رعایت کنه، در غیر این صورت ruff بهش ارور میده.
@TorhamDevCH
قبلاها وقتی میخواستید یک پروژه رو یکسری کانفیگ براش بزارید باید یک عالمه فایل پختلف براش میساختید، برای مثال فایلهایی مثل setup.py, toxic.ini, mympy.cfg و یک خروار فایل دیگه، تقریبا هر ابزاری کانفیگ فایل خودش داشت. این باعث میشد یک عالمه فایل مختلف ایجاد بشه که تهش میخواستن چندتا ابزار کانفیگ کنن.
در pep 518 اومدن pyproject.toml معرفی کردن.
از به بعد تمام کانفیگهای خود پروژه، متادیتاهای پروژه و کانفیگ ابزارها همه داخل همین یکدونه فایل خواهد بود.
این روزها اگر نگم همه اکثر ابزارها مدرن پایتونی مثل ruff, uv, peotry و ... از این فایل پیروی میکنن و اگر کانفیگی داخلش قرار بدید و این فایل در root پروژه باشه ازش پیروی میکنن.
[tool.ruff]
select = ["E", "F", "I"]
ignore = ["E501"]
اینطوری تمام کانفیگها و تنظیمات لازم یک پروژه داخل یک فایل جمع میشه و دیگه نیازی به چندین فایل و کانفیگ متفاوت نیست.
اگر با uv کار کرده باشید بعد از اینکه یک پروژه رو باهاش init کنید براتون این فایل میسازه و میتونید باهاش یکم بازی کنید :)
مثلا میتونید ruff رو کانفیگ کنید که هرکسی که پروژه شما رو باز کرد و خواست روش کار کنه از استایل و قوانین شما رعایت کنه، در غیر این صورت ruff بهش ارور میده.
@TorhamDevCH
👍9❤1🔥1
۳.۱۴ اومد، GIL هم برداشتن دیگه حالا میتونیم بریم بگیم. "ببین نه کی گفته پایتون کنده"
میتونید تغییرات جدید و خرتوپرتاشو اینجا بخونید یا اینکه داک رسمی خود پایتون بخونید. من ریالپایتون ترجیح میدم
https://realpython.com/python314-new-features/
@TorhamDevCH
میتونید تغییرات جدید و خرتوپرتاشو اینجا بخونید یا اینکه داک رسمی خود پایتون بخونید. من ریالپایتون ترجیح میدم
https://realpython.com/python314-new-features/
@TorhamDevCH
Realpython
Python 3.14: Cool New Features for You to Try – Real Python
Learn what's new in Python 3.14, including an upgraded REPL, template strings, lazy annotations, and subinterpreters, with examples to try in your code.
😁2
https://youtu.be/0vFgKr5bjWI
ویدیو دیشب :)
کمی با detail بیشتر درباره sync, async multi thread and multiprocessing
#vid_per_day
@TorhamDevCH
ویدیو دیشب :)
کمی با detail بیشتر درباره sync, async multi thread and multiprocessing
#vid_per_day
@TorhamDevCH
YouTube
Asynchronous vs Multithreading and Multiprocessing Programming (The Main Difference)
In this video, I explain the main difference between asynchronous execution, multithreading and multiprocessing programming. There are advantages and disadvantages of each approach.
* Synchronous 0:30
* Multithreading a process have many threads shared…
* Synchronous 0:30
* Multithreading a process have many threads shared…
👍2❤1
ویدیو امروز :)
https://youtu.be/nuML9SmdbJ4
اگه هیچ ایده از برنامه نویسی فانکشنال ندارید حتما این ویدیو رو ببینید. یکسری از ابزارهایی که این روزا داخل کدهامون استفاده میکنیم از برنامهنویسی فانکشنال میان و احتمالا نمیدونستید.
البته کاملا فانکشنال کد زدن میتونه بد و سخت باشه اما استفاده ازش داخل یک کد معمولی میتونه زیبایی به همراه بیاره :)
#vid_per_day
@TorhamDevCH
https://youtu.be/nuML9SmdbJ4
اگه هیچ ایده از برنامه نویسی فانکشنال ندارید حتما این ویدیو رو ببینید. یکسری از ابزارهایی که این روزا داخل کدهامون استفاده میکنیم از برنامهنویسی فانکشنال میان و احتمالا نمیدونستید.
البته کاملا فانکشنال کد زدن میتونه بد و سخت باشه اما استفاده ازش داخل یک کد معمولی میتونه زیبایی به همراه بیاره :)
#vid_per_day
@TorhamDevCH
YouTube
Dear Functional Bros
Access experiments at CodeAesthetic.io
Discord, deleted scenes, song names and more at patreon.com/CodeAesthetic
Discord, deleted scenes, song names and more at patreon.com/CodeAesthetic
❤2✍1
تفاوت fetch و pull در گیت.
هر دوشون برای سینک کردن ریپازیتوری با ریپازیتوری ریموت استفاده میشن ولی یک فرقی دارن
وقتی git fetch میکنید صرفا تغییرات دانلود میکنید ولی اونها رو اعمال نمیکنید در نتیجه میتونید قبل اینکه تغییرات اعمال کنید فرقشون رو ببینید و اگه خواستید این کار انجام بدید، زمانهایب هست تغییراتی رخ داده ولی شما هنوز اماده ادقامش با کد خودتشون نیستید از fetch استفاده میکنید.
اما وقتی pull میکنید در حقیقت چندتا کار رو انجام میدید. اول همون fetch رو انجام میدید و تغییرات رو دانلود میکنید و بعدش merge یا rebase میکنید و تغییرات رو ادغام میکنید.
در نتیجه fetch فقط تغییرات دانلود میکنه ولی pull هم تغییرات دانلود و هم اعمال میکنه حالا با rebase یا merge
رفتار پیشفرض fetch اینطوری که تغییرات کل برنچها دانلود میکنه. و رفتار پیشفرض pull اینکه بعد از دانلود همه تغییرات اون برنچی که هستید رو مرج یا ریبیس میکنه و به بقیه برنچها کاری نداره
تو مصاحبه پرسیده بودن بلد نبودم :)
@TorhamDevCH
هر دوشون برای سینک کردن ریپازیتوری با ریپازیتوری ریموت استفاده میشن ولی یک فرقی دارن
وقتی git fetch میکنید صرفا تغییرات دانلود میکنید ولی اونها رو اعمال نمیکنید در نتیجه میتونید قبل اینکه تغییرات اعمال کنید فرقشون رو ببینید و اگه خواستید این کار انجام بدید، زمانهایب هست تغییراتی رخ داده ولی شما هنوز اماده ادقامش با کد خودتشون نیستید از fetch استفاده میکنید.
اما وقتی pull میکنید در حقیقت چندتا کار رو انجام میدید. اول همون fetch رو انجام میدید و تغییرات رو دانلود میکنید و بعدش merge یا rebase میکنید و تغییرات رو ادغام میکنید.
در نتیجه fetch فقط تغییرات دانلود میکنه ولی pull هم تغییرات دانلود و هم اعمال میکنه حالا با rebase یا merge
رفتار پیشفرض fetch اینطوری که تغییرات کل برنچها دانلود میکنه. و رفتار پیشفرض pull اینکه بعد از دانلود همه تغییرات اون برنچی که هستید رو مرج یا ریبیس میکنه و به بقیه برنچها کاری نداره
تو مصاحبه پرسیده بودن بلد نبودم :)
@TorhamDevCH
✍14❤6👍1😁1😐1
حل مشکل race condition با F expression
تو جنگو و قالب جاهای دیگه وقتی بحث race condition میشه اولین راه حلی که به ذهن همه میاد اینکه از lock دیتابیس استفاده کنیم، حالا نوع لاکی که به کارمون میاد.
داخل جنگو قالبا برای lock کرد یک resource میایید از select_for_update استفاده میکنید.
چیز جالبی که امروز یاد گرفتم اینه که میتونید فقط از F اکپرشن استفاده کنید بدون لاک کردن دیتابیس ولی یک سری نکته داره.
دوتا سناریو مختلف فرض کنید. یک جا ما قرار یک رکورد دیتابیس رو بگیریم یک مقداری رو چک کنیم مثلا فیلد state باید برابر pending باشه و اون کار تموم نشده باشه و حالا یکسری کار انجام میدیم و در نهایت اون state رو میزاریم done و دیتا رو آپدیت میکنیم. تو این مورد از select_for_update و لاک استفاده میکنیم که طی اون فرایند هیچ کسی به اون ریسورس دسترسی نداشته باشه و تغییرش نده.
حالا اگر ما بخواییم صرفا یک فیلدی آپدیت کنیم و قرار نیست هیچ چیزی رو بعد از درخواست دیتابیس زدن چک کنیم. مثلا میخواییم به موجودی یک کاربر ۱۰ دلار اضافه کنیم و این چک و بررسی مهمی هپ نداریم فقط میخواییم این کار انجام بدیم. برای این کار لازم نیست لاک بگیریم، زمانی که هیچ چک و بررسی نداریم و قرار نیست ابجکت دیتابیس بگیریم کاری باهاش کنیم میتونیم اون فرایند اضافه کردن با یک F اکسپرشن حل کنیم و اینطوری فقط و فقط یک کوئری آپدیت میزنیم برای اون فیلد خاص که همینطوری که میتونید استقاده از F یعنی مقداری که در لحضه در دیتابیس داره و به علاوه ( یا منها یا هرچی) این مقدار جدید کن و ذخیرش کن. این حالت یک کوئری اپدیت میخوره و درجا دیتا آپدیت میشه بدون اینکه چیزی ازش بخونیم. :)))
@TorhamDevCH
تو جنگو و قالب جاهای دیگه وقتی بحث race condition میشه اولین راه حلی که به ذهن همه میاد اینکه از lock دیتابیس استفاده کنیم، حالا نوع لاکی که به کارمون میاد.
داخل جنگو قالبا برای lock کرد یک resource میایید از select_for_update استفاده میکنید.
چیز جالبی که امروز یاد گرفتم اینه که میتونید فقط از F اکپرشن استفاده کنید بدون لاک کردن دیتابیس ولی یک سری نکته داره.
دوتا سناریو مختلف فرض کنید. یک جا ما قرار یک رکورد دیتابیس رو بگیریم یک مقداری رو چک کنیم مثلا فیلد state باید برابر pending باشه و اون کار تموم نشده باشه و حالا یکسری کار انجام میدیم و در نهایت اون state رو میزاریم done و دیتا رو آپدیت میکنیم. تو این مورد از select_for_update و لاک استفاده میکنیم که طی اون فرایند هیچ کسی به اون ریسورس دسترسی نداشته باشه و تغییرش نده.
حالا اگر ما بخواییم صرفا یک فیلدی آپدیت کنیم و قرار نیست هیچ چیزی رو بعد از درخواست دیتابیس زدن چک کنیم. مثلا میخواییم به موجودی یک کاربر ۱۰ دلار اضافه کنیم و این چک و بررسی مهمی هپ نداریم فقط میخواییم این کار انجام بدیم. برای این کار لازم نیست لاک بگیریم، زمانی که هیچ چک و بررسی نداریم و قرار نیست ابجکت دیتابیس بگیریم کاری باهاش کنیم میتونیم اون فرایند اضافه کردن با یک F اکسپرشن حل کنیم و اینطوری فقط و فقط یک کوئری آپدیت میزنیم برای اون فیلد خاص که همینطوری که میتونید استقاده از F یعنی مقداری که در لحضه در دیتابیس داره و به علاوه ( یا منها یا هرچی) این مقدار جدید کن و ذخیرش کن. این حالت یک کوئری اپدیت میخوره و درجا دیتا آپدیت میشه بدون اینکه چیزی ازش بخونیم. :)))
@TorhamDevCH
✍8👍2
یکی از احمقانه ترین چیزهایی که امروز در Django Rest Framework دیدم رفتار سریالایزر روی فیلد Boolean بود.
شما اگر داخل سریالایزر یک فیلد boolean داشته باشید که required=False باشه یعنی اگر فیلد ورودی داده نشده بود که داخل دیتایی که میدی نیارش.
یعنی اگر من
delivered = serializers.BooleanField(required=False)
name = serializers.CharField(required=False)
داشته باشم و کاربرد ورودی هیچ چیزی بهم نده توقعام اینکه که یک دیکشنری خالی از سریالایزر بگیرم چون هردو فیلد required=False هستن. اما سریالایزر drf همیشه فیلد boolean رو میفرسته :/
یعنی حتی با اینکه شما گفتید این فیلد required=False میاد تو خروجی بهتون delivred میده ولی مقدارش False میکنه :/
ولی فیلد name اگه ورودی نده کلا تو خروجی نمیاد و تنها و تنها این کار برای boolean فیلدها میکنه :) WTF؟
مشکل جدیای به نظرم چون شما توقع دارید این فیلد وجود نداشته باشه اگر به عنوان ورودی نیومده باشه و میایید برای False بودن و یا True بودنش داخل کدتون یک لاجیک خاص مینویسید. و ایده شما اینه که این فیلد اگر ورودی نیاد قرار نیست لاجیک Treu یا False من ران شه دیگه. حالا اگر اومد یا true ران میشه یا false. ولی با این کار DRF تقریبا همیشه منطقی که برای حالت False نوشتید اجرا میشه :)))))
مگر اینکه یک فیلد کاستوم بسازید برای boolean و جلوش رو خودتون بگیرید.
دلیلش هم اینکه drf فیلدها ولیدیت میکنه و اگر ورودی که به delivered دادید به اصطلاح Falsy باشه اون false میکنه اگه برعکسش باشه True میشه و از اونجایی که ورودی ندادن میشه '' یک استرینگ خالی و این عمل فالسی هست اون فیلد برابر با False میشه همیشه :)
واقعا این همه سال هیچ کس نرفته این مشکل حل کنه؟ 😂 اصلا چرا وقتی فیلد ورودی نیومده روش ولیدیشن ران میکنه؟😂
@TorhamDevCH
شما اگر داخل سریالایزر یک فیلد boolean داشته باشید که required=False باشه یعنی اگر فیلد ورودی داده نشده بود که داخل دیتایی که میدی نیارش.
یعنی اگر من
delivered = serializers.BooleanField(required=False)
name = serializers.CharField(required=False)
داشته باشم و کاربرد ورودی هیچ چیزی بهم نده توقعام اینکه که یک دیکشنری خالی از سریالایزر بگیرم چون هردو فیلد required=False هستن. اما سریالایزر drf همیشه فیلد boolean رو میفرسته :/
یعنی حتی با اینکه شما گفتید این فیلد required=False میاد تو خروجی بهتون delivred میده ولی مقدارش False میکنه :/
ولی فیلد name اگه ورودی نده کلا تو خروجی نمیاد و تنها و تنها این کار برای boolean فیلدها میکنه :) WTF؟
مشکل جدیای به نظرم چون شما توقع دارید این فیلد وجود نداشته باشه اگر به عنوان ورودی نیومده باشه و میایید برای False بودن و یا True بودنش داخل کدتون یک لاجیک خاص مینویسید. و ایده شما اینه که این فیلد اگر ورودی نیاد قرار نیست لاجیک Treu یا False من ران شه دیگه. حالا اگر اومد یا true ران میشه یا false. ولی با این کار DRF تقریبا همیشه منطقی که برای حالت False نوشتید اجرا میشه :)))))
مگر اینکه یک فیلد کاستوم بسازید برای boolean و جلوش رو خودتون بگیرید.
دلیلش هم اینکه drf فیلدها ولیدیت میکنه و اگر ورودی که به delivered دادید به اصطلاح Falsy باشه اون false میکنه اگه برعکسش باشه True میشه و از اونجایی که ورودی ندادن میشه '' یک استرینگ خالی و این عمل فالسی هست اون فیلد برابر با False میشه همیشه :)
واقعا این همه سال هیچ کس نرفته این مشکل حل کنه؟ 😂 اصلا چرا وقتی فیلد ورودی نیومده روش ولیدیشن ران میکنه؟😂
@TorhamDevCH
🤣7👍5❤1
https://youtu.be/WpXs7e7kEoI
تفاوت بین json و gRPC و اینکه gRPC چطور کار میکنه و کجا خوبه ازش استفاده کنیم، خوبی و بدیهاش چی میتونه باشه.
#vid_per_day
@TorhamDevCH
تفاوت بین json و gRPC و اینکه gRPC چطور کار میکنه و کجا خوبه ازش استفاده کنیم، خوبی و بدیهاش چی میتونه باشه.
#vid_per_day
@TorhamDevCH
YouTube
Now I Know Why Most People Don’t Use gRPC
✅ Learn how to build robust and scalable software architecture: https://arjan.codes/checklist.
In this video, I’m exploring gRPC, a compelling alternative to REST that’s gaining traction in distributed systems. Watch until the end of the video to find out…
In this video, I’m exploring gRPC, a compelling alternative to REST that’s gaining traction in distributed systems. Watch until the end of the video to find out…
❤5
Creep
Radiohead
❤🔥7
یادم بندازید فردا تمپلیت روزمهام براتون بفرستم. بچهها خواسته بودن :)
❤24👍3
Torham Mohammadian.docx
439.5 KB
تمپلیت رزومهام ترجیحا همین فایل با گوگل داک باز کنید، خودش رو هم با گوگل داک ساختم.
امیدوارم به دردتون بخوره. سوالی داشتید بپرسید
@TorhamDevCH
امیدوارم به دردتون بخوره. سوالی داشتید بپرسید
@TorhamDevCH
❤14🍾2
https://youtu.be/suATPK45sjk
از چندین توسعه دهنده خفن و تکلید میپرسن که پندی که دارن چیه. واقعا نکتههای خفنی گفتن حتماااا ببینید
#vid_per_day
@TorhamDevCH
از چندین توسعه دهنده خفن و تکلید میپرسن که پندی که دارن چیه. واقعا نکتههای خفنی گفتن حتماااا ببینید
#vid_per_day
@TorhamDevCH
YouTube
How to Become a Great Software Developer — Best Advice from Top-Notch Engineers
👉 Check our documentary "Beyond The Success Of Kotlin: https://youtu.be/E8CtE7qTb-Q
👉 Integrate GitHub Copilot and ChatGPT into your daily work for streamlined, efficient development.
https://aw.club/global/en/courses/ai-supported-software-engineering
Leverage…
👉 Integrate GitHub Copilot and ChatGPT into your daily work for streamlined, efficient development.
https://aw.club/global/en/courses/ai-supported-software-engineering
Leverage…
👍3❤1🖕1
همجا گیتهاب شده کوپایلت.
البته ابزار خوبیه. چند وقتی پک گیتهاب گرفتم و از کوپایلت استفاده میکنم کمک میکنه سریعتر کد پیش ببری. بعدا دربارش مینویسم.
@TorhamDevCH
البته ابزار خوبیه. چند وقتی پک گیتهاب گرفتم و از کوپایلت استفاده میکنم کمک میکنه سریعتر کد پیش ببری. بعدا دربارش مینویسم.
@TorhamDevCH
❤2🖕1