Python Hints
Kanalga Telegram’da o‘tish
Python tips and tricks The Good, Bad and the Ugly توی این کانال فقط قرار هست در مورد core python صحبت کنیم. این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی بیش از ۱۰ سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازهکار) Admin: @Abbasi_ai
Ko'proq ko'rsatish9 995
Obunachilar
+1124 soatlar
+427 kunlar
+16930 kunlar
Ma'lumot yuklanmoqda...
O'xshash kanallar
Taglar buluti
Kirish va chiqish esdaliklari
---
---
---
---
---
---
Obunachilarni jalb qilish
Avgust '26
Avgust '26
+246
0 kanalda
Iyul '26
+277
3 kanalda
Get PRO
Iyun '26
+289
2 kanalda
Get PRO
May '26
+187
1 kanalda
Get PRO
Aprel '26
+97
0 kanalda
Get PRO
Mart '26
+32
0 kanalda
Get PRO
Fevral '26
+131
1 kanalda
Get PRO
Yanvar '26
+455
19 kanalda
Get PRO
Dekabr '25
+175
5 kanalda
Get PRO
Noyabr '25
+138
1 kanalda
Get PRO
Oktabr '25
+152
0 kanalda
Get PRO
Sentabr '25
+220
1 kanalda
Get PRO
Avgust '25
+305
3 kanalda
Get PRO
Iyul '25
+232
4 kanalda
Get PRO
Iyun '25
+188
6 kanalda
Get PRO
May '25
+196
4 kanalda
Get PRO
Aprel '25
+171
3 kanalda
Get PRO
Mart '25
+299
4 kanalda
Get PRO
Fevral '25
+276
9 kanalda
Get PRO
Yanvar '25
+258
3 kanalda
Get PRO
Dekabr '24
+373
4 kanalda
Get PRO
Noyabr '24
+410
2 kanalda
Get PRO
Oktabr '24
+454
7 kanalda
Get PRO
Sentabr '24
+382
5 kanalda
Get PRO
Avgust '24
+572
7 kanalda
Get PRO
Iyul '24
+382
8 kanalda
Get PRO
Iyun '24
+285
4 kanalda
Get PRO
May '24
+307
1 kanalda
Get PRO
Aprel '24
+815
5 kanalda
Get PRO
Mart '24
+537
6 kanalda
Get PRO
Fevral '24
+461
5 kanalda
Get PRO
Yanvar '24
+580
6 kanalda
Get PRO
Dekabr '23
+599
2 kanalda
Get PRO
Noyabr '23
+106
1 kanalda
Get PRO
Oktabr '23
+223
1 kanalda
Get PRO
Sentabr '23
+123
0 kanalda
Get PRO
Avgust '23
+158
0 kanalda
Get PRO
Iyul '23
+89
0 kanalda
Get PRO
Iyun '23
+221
0 kanalda
Get PRO
May '23
+1 677
0 kanalda
| Sana | Obunachilarni jalb qilish | Esdaliklar | Kanallar | |
| 28 Avgust | +9 | |||
| 27 Avgust | +12 | |||
| 26 Avgust | +9 | |||
| 25 Avgust | +5 | |||
| 24 Avgust | +15 | |||
| 23 Avgust | +5 | |||
| 22 Avgust | +7 | |||
| 21 Avgust | +7 | |||
| 20 Avgust | +9 | |||
| 19 Avgust | +9 | |||
| 18 Avgust | +11 | |||
| 17 Avgust | +9 | |||
| 16 Avgust | +14 | |||
| 15 Avgust | +11 | |||
| 14 Avgust | +7 | |||
| 13 Avgust | +9 | |||
| 12 Avgust | +7 | |||
| 11 Avgust | +5 | |||
| 10 Avgust | +20 | |||
| 09 Avgust | +8 | |||
| 08 Avgust | +5 | |||
| 07 Avgust | +8 | |||
| 06 Avgust | +5 | |||
| 05 Avgust | +8 | |||
| 04 Avgust | +4 | |||
| 03 Avgust | +14 | |||
| 02 Avgust | +10 | |||
| 01 Avgust | +4 |
Kanal postlari
داشتم دنبال یک ویدئو میگشتم که ببینم کسی ماژولهای مهم رو برای پایتون توضیح داده ؟
یک بخشی از داکیومنت رو خوندم و فهمیدم ماژول چیزی هست که دنبالشم و توی این سرچ متوجه شدم ۳ سال قبل با این ابزار آشنا شدم؛ یا اون موقع بدردم نمیخورده یا پروژههام همه رو اسکریپت بوده و کار میکرده یا ایراداتی داشته که نتونستم استفاده کنم.
خواستم این نکته رو هم اضافه کنم که :
هرچیزی به زمانش و به وقت نیاز بهش خوبه؛ چیزی که امروز خیلی راجبش هیجان دادم و خوشم اومد از پیدا کردنش
۳ سال قبل (کل ویدئو رو دیده بودم) هیجان زدم نکرده شاید به این فکر کردم که خودم با اسکریپت دارم همینکارو میکنم دیگه باقیشم که
.env و پایتون انجام میده
امروز نیاز و نگاهم عوض شده
اگر جونیور هستید و توی تیم میخواید ابزار جدیدی رو پیشنهاد بدید یادتون باشه باید نشون بدید :
۱- این ابزار جایگزین روش قبلی هست
۲- جایگزین کردن ابزار قدیم چقدر هزینه داره (یادگیری نیروهای دیگه هم در نظر بگیرید)
۳- مزیتهاش چیه
که بازم بر میگرده به یکی از مهمترین چیزایی که قبلا گفتم حتما یاد بگیرید یعنی نوشتن ADR اونم صادقانه هم مزایا و هم معایب| 2 | این دقیقا یکی از اون جاهایی هست که گفتم نیروی جونیور توی تیم لازم هست.
مسئله این هست که من اسکریپتهام و راهاندازی کانتینر dev برای ابزارها و کانفیگشون با اسکریپت و ... رو شاید ۱-۲ ماه بعد از یادگیری داکر (اوایل معروف شدن) شروع کردم همین امروز هم اگر تنبلی باعثش نبود عمرا همچین چیزی رو سرچ نمیکردم.
حتی اگر احمق بودن بیش از حد LLM ها نبود هم اینکار رو نمیکردم؛فیچرهایی که خواستم تست کنم جدید بود و البته چون نمیدونستم رفتار درست ابزارها روی فیچرهای جدید چی هست و چطوری عمل میکنه اعتمادی به LLM برای نوشتن این اسکریپت نداشتم دلیلش هم واضح هست :
از کجا بفهمم خطا توی کدم هست؛ یا توی اسکریپت LLM یا حتی اون فیچر رو اشتباه درک کردم یا اشتباه استفاده کردم و ...
این باعث شد سرچ کنم و testcontainers رو پیدا کنم؛ من همیشه محیط تست و توسعهام یکی هست همه چیزش.
روی پروداکشن هم سرور dev, stage و prod همیشه یکسان کانفیگ میشه حتی تا سطح دسترسی و جزئیاتی مثل firewall , ...
فقط تفاوت این میشه که مثلا prod با ۱۰ تا سرور میاد بالا dev با ۱ سرور و stage با ۳ تا سرور اگر جنبه distribute بودن چیزی باشه که برامون مهم هست تست شدنش.
خلاصه اینا معمولا دانشی هست که یک جونیور خوب به تیم اضافه میکنه؛ توی جلسات هفتگی یا حتی ماهانه راهکارهای جدید و به روز شده رو جونیورها معمولا به تیم اضافه میکردند وگرنه من و مثل من که ۱۰ سال هست یک راهکار رو دنبال میکنیم و همیشه جواب داده چرا باید دنبال راه دیگهای بگردیم ؟
جونیورهای تیم رو نگه دارید؛ چونیور درست و خوب تیم رو آپدیت نگه میداره. | 1 923 |
| 3 | من همیشه دیتابیس تست و ... رو براش اسکریپت مینویسم (دستی) بعد توی کدهام از اون موارد استفاده میکنم کار تمیزی هست ولی زمانبر
الان همینطوری یک سرچ زدم آنلاین ببینم روش دیگری هست ؟
پروژهای که دستم هست خیلی سادهاس و فقط میخواستم چندتا فیچر جدید رو هم تست کنم اینکه یک سری اسکریپت دقیق بنویسم و کانفیگ کنم بنظرم زیاد بود
testcontainer
رو پیدا کردم که بنظر میاد دقیقا برای همچین وقتایی هست گفتم معرفی کنم برای دوستان دیگری که مثل من شاید نیازشون باشه و راجب این پروژه چیزی نشنیده باشند. | 2 015 |
| 4 | اینم برای دوستان دانشجو یا علاقمندای به
Data Structure & Algorithm
این سایت با انیمیشن بهتون نحوه کار هر اگوریتم رو نشون میده (برای دانشگاه سنگاپور هست) و برای هر کدوم :
۱- کوئیز داره (نمره نداره یک سری سوال رندم برای درک میزان یادگیری هست)
۲- یک بخش پرینت داره که خلاصهی کامل رو بهتون میده مثل یک cheat sheet که توی چند مورد که من خوندم خیلی خوب و درست نوشته شده.
خلاصه این رو روزی ۱ بار بهش سر بزنید. | 2 093 |
| 5 | داشتم داستان ۲ هفته troubleshoot کردنم برای یک شرکت رو مینوشتم و اینکه ۷ نفر قبل من رفته بودند و راهکاری پیدا نشده بود.
حتی بهشون جابجایی استک پایتون رو هم پیشنهاد داده بودند.
و حتی اینکه خرید سرور تا ۳ برابر قویتر هم کمکی نکرده بود.
که سیستمم خاموش شد (نوسان برق)
خلاصهاش رو بگم،
تیبل refresh token رو براش بکگراند جاب بنویسید تمیز کنه.
که اگر یکی refresh token رو اشتباهی گذاشت روی 1 ساعت و ۵ میلیون یوزر داشتید
توی چندین ساعت تیبل بزرگ نشه، شما اون باگ رو توی ۳ ساعت بعدش حل میکنید
ولی ماها بعد حجم اون تیبل چندین برابر میشه و سرچ کردن توش تمام کوئریها رو کند میکنه و میشه چیزی که نباید بشه و خفت میشید.
تقریباً داشتم از پیدا کردن راهکار ناامید میشدم که مشکل رو پیدا کردم.
پینوشت:
۱- دسترسی گرفتن به سرور پروداکشن سخت بود، شاید تنبلی شایدم هرچیز دیگری نفرات قبلی اینکار رو نکرده بودند.
۲- من بعد از اطمینان از کد و البته تست لود و پروفایل روی سرور dev مطمئن شدم باید روی پروداکشن دنبالش بگردم
۳- حتی فکرشم نمیکردم مشکل از refresh باشه چون کد تغییری نکرده بود (۱ سال این بخش کدها دست نخورده بود، گیتلاگ) و البته آخرین تغییر فایل .env روی سرور هم برای ۷ ماه قبل بود ولی مشکل ۲ ماه پیش شروع شده بود.
۴- اگر سوال پیش اومد چرا refresh رو توی دیتابیس داریم در مورد jti, family id توی jwt بخونید. | 3 760 |
| 6 | بنظرم ویدئوهای کنفرانس امسال خیلی کم داره دیده میشه
PyData Youtube | 4 129 |
| 7 | یک آپشن روی sqlalchemy برای relationship هست که شخصا خیلی دوسش دارم؛ باعث میشه به کوئری که سمت دیتابیس میفرستم فکر کنم بجای اینکه سادهترین راه رو انتخاب کنم.
هرجا هم که نیاز دارم دولوپرها به کوئریهاشون دقت کنند حتما ازش استفاده میکنند.
lazy = "raise"
الان داشتم خروجی پروفایلینگ یک پروژه رو نگاه میکردم؛ توی RandRng گفتم راجبش.
دیدم خیلی کوئریهای دیتابیس زمان بر هست؛ ی سرچ توی مدلهای دیتابیس زدم و همهی relationship هارو بهش؛
lazy = "raise"
اضافه کردم؛ تا دلتون بخواد ارور میگیریم حالا ولی باعث میشه همه به کوئریهاشون فکر کنند.
گفتم اینجا هم بذارم شاید بدرد کسی خورد. | 5 437 |
| 8 | این ترکیب به راحتی میتونه خیلی از پروژهها رو از Postgres به Sqlite منتقل کنه؛
Sqlite + Litestream
توی خیلی پروژهها برای خودم پیش اومده که یک دیتابیس نیاز داشتم؛ شاید ۵-۱۰ تا جدول ولی اینکه فقط روی یک سرور نباشه هم برام مهم بوده که خب سرویسهای کلاد رو استفاده میکردم.
همزمان هم Latency میرفت بالا هم کلی هزینه پرفورمنس واسه سربارهایی کار کردن با Postgres میدادم درحالی که به ۹۰٪ اون ویژگیها نیازی نداشتم.
الان داشتم دنبال یک راهکار برای یک پروژه دیگه میگشتم و واقعا دلم نمیخواد Latency و Throughput ام بخاطر استفاده از Postgres کم بشه و بعد بشینم اپتیمایز کنم. بخصوص اینکه این دیتابیس هیچ دیتای حساسی نداره و فقط همین که دیتاها از بین نره برام مهم هست.
به چندتا راهکار رسیدم که بنظرم این ترکیب برای کار من برنده هست بخصوص اینکه RustFS رو همین الان داریم :
Turso + Litestream + Rustfs
بعد از پروژه یادم باشه نتایجش رو هم میذارم. | 5 766 |
| 9 | اینو یادداشت کرده بودم که بذارم:
تقریبا ۱.۵ سال پیش یک پروژهای روی یک پروژهای کار میکردم (فکر کنم گفتم جزو معدود پروژههایی بود که از اول توی پروژه بودم)
امشب با مدیرعامل شرکت و صاحب پروژه صحبت میکردم (شاید پروژه دوم) میگفت علاوه بر دولوپرهای بعدی ادمین دیتابیس هر چندوقت یکبار که روی دیتابیس کار میکنه ی دمش گرم هم به ما میگه.
من استانداردهای زیادی رو رعایت کردم روی اون پروژه ولی این ۵ خط بنظر میاد خیلی بچههایی که روی دیتابیس کار میکنند رو راضی نگهداشته
class Base(AsyncAttrs, DeclarativeBase):
metadata = sa.MetaData(
naming_convention={
"ix": "ix_%(column_0_label)s",
"uq": "uq_%(table_name)s_%(column_0_name)s",
"ck": "ck_%(table_name)s_%(column_0_name)s",
"fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
"pk": "pk_%(table_name)s",
}
)
من همیشه اینکار رو برای خودم میکنم که توی همه پروژههام یک استاندارد رعایت شده باشه و راحت بتونم دیباگ کنم و بخونم؛ خلاصه برای راحتی خودم هست.
این حرفا رو که امشب شنیدم گفتم بذارم شما هم توی پروژههاتون رعایت کنید.
امیدوارم مفید باشه | 4 633 |
| 10 | Background jobs
رو توی دو مرحله پیادهسازی کن
مرحله اول رو با خود
Fastapi
پیاده سازی کن ببرش زیر لود تست بعد ببین چه اتفاقی میوفته
ADR-0015
رو نمیدونم چی هست ولی اینکه بدونی تا چه زمانی از خود
Fastapi
میتونی استفاده کنی خیلی مهمه بعدش برو روی Dramatiq
——————
Auth
رو با
Argon2
هم چک کن (خیلی واجب نیست فقط برای اینکه بهش آشنا باشی)
————————
برای متریک
prometheus_client
استاندارد اصلی هست
————————
چندتا چیز دیگه که بهتره اضافه کنی :
۱- لاگ رو وقتی با structlog زدی بعدش باید قابل خوندن و تحلیل هم باشه اما لزوما این کار رو روی سروری که اپ لانچ هست ممکنه انجام ندی :
پس یک چیزی برای جمع کردن لاگ همه اپها لازم میشه (توی پروداکشن معمولا) یک نسخه خیلی خوب و سبک و عالی :
https://vector.dev/
هست
۲- نمایش همه اینها؛ خیلی وقتا لاگ - تریس - متریک جمع میکنیم ولی تا وقتی آنالیزش نکنیم نمیدونیم درست هست یا نه
https://grafana.com/
گرافانا برای این وقتا خیلی خوبه (البته نیازی نیست ساخت داشبورد و ... توش رو یاد بگیری اون کار تیمهای دیگهاس)
ولی همین که ببینی دیتات توی این داشبورد چطوری نشون داده میشه نکته خوبی هست
پینوشت:
اگر از نظرت مشکلی نداره plan رو بذارم تو کانال به اسم خودت.
بعنوان نمونه اگر کسی خواست انجام بده | 3 774 |
| 11 | #Backend_RoadMap
#Sample_Project
زحمت این فایل رو شایان عزیز کشیده (با استفاده درست از AI) و توی گروه گذاشت من چندتا نکته رو اضافه کردم و با اجازهاش گفتم بعنوان نمونه اینجا منتشر کنم | 3 181 |
| 12 | یادآوری :
https://t.me/pyHints/423 | 3 531 |
| 13 | #Quick
from pydantic import SecretStr
لطفا ازین مورد استفاده کنید؛ نشستم لاگ سرور یک پروژه رو میخونم تمام اطلاعات سرور و اطلاعات کاربراش خیلی زیبا و خوانا توی لاگ هست.
قبلا هم یک موردی رو توی
@pyhints
یاد دادم برای لاگ نویسی موارد مهم.
لطفا از هر دو استفاده کنید؛ هیچ چیز مهمی نباید توی لاگ نوشته بشه.
بخصوص ایمیل و شمارهتماس کاربر. | 2 845 |
| 14 | LLM
قراره جای برنامه نویسهارو بگیره ؟
من که کدم رو + دستورالعمل ریفکتور دادم تا برام تمیز کنه و خروجی که توی تصویر هست
نصف باگهای مدلهای LLM رو من درآوردم باید بهم هزینه پرداخت کنند واقعا
پینوشت:
تازه ۳۵ دقیقه هم طول کشید. خودم میزدم ۲۰ دقیقهای تموم میشد. | 4 332 |
| 15 | گزارش تیم مهندسی یکی دیگه از شرکتها برای سالی بین ۲۰۲۳-۲۰۲۵ توی اون رنج بود که شرکت خیلی خیلی بزرگی هم هست و تعداد درخواستهاش تازه به ۵۰۰۰ رسیده
توی دوران جنگ اخیر توی گروه گذاشتم ولی متاسفانه الان پیداش نکردم؛ حتما اگر پیدا کردم اون مورد رو هم اضافه میکنم.
ولی بنظرم همین مورد Stackoverflow هم مورد به اندازه ملموسی هست برای درک این موضوع.
خلاصه مشکل سواد و معماری هست؛ نه فریمورک و زبان برنامهنویسی | 5 788 |
| 16 | تا ۱۰۹ هزار درخواست در ثانیه رو میتونه جواب بده روی این بچمارک من اگر سرویسم به ۶۰۰۰ درخواست در ثانیه هم برسه یک چیزی در حد Stackoverflow هستم (بر اساس مصاحبه Roberta Arcoverde میگم)
برای تعجب بیشتر شما؛ توی مصاحبه به monolithic بودن معماری سیستم اشاره میشه و البته به اینکه on-permise هم هست.
اگر کار نیاز به صفحه ادمین و استانداردهای خارج از مایکروسرویس داشته باشه و تیم کوچیک باشه ۱۰۰٪ میرم سراغ جنگو.
عکس دوم هم از اینجا اومده و برای websocket هست
۱۰ هزار کانکشن با حجم دیتای ۱ کیلوبایت تعداد درخواست حداقل ۲۰ هزارتا (تازه روی fastapi که میگن برای وبساکت با حجم بایت بالا خوب نیست)
چیزایی که زیاد میبینم :
آدما هیچ درکی از معماری مونولوتیک و میکروسرویس ندارند و یکی رو میزنند؛ اینم بگم رندر صفحات استک اورفلو توی ۱۲ میلی ثانیه هست.
برید مصاحبه رو ببینید واقعا
آدما هیچ درکی از تعداد درخواست در ثانیه ندارند و زرتی عدد ۱ میلیون درخواست در ثانیه رو تو مصاحبه و ... اینور و اونور پرت میکنند
آدما هیچ درکی از هیچکدوم ندارند و حتی توانایی فهمیدن کد رو هم ندارند و فقط فریمورک پروژه رو میخوان عوض کنند 🤬🤬 | 5 173 |
| 17 | یکبار برای همیشه؛ زرتی نرید استک بکند رو عوض کنید تا تعداد درخواستهاتون به ۵۰ تا در ثانیه رسید.
اگر سرویس بکند شما نمیتونه این تعداد درخواست رو جواب بده مشکل شما پایتون نیست؛ مشکل شما سواد هست.
واقعا خسته شدم طرف تعداد درخواست در ثانیهاش به ۳۰ تا هم نمیرسه میگه ما باید به Go مهاجرت کنیم.
حتما روی ۱۰۰ تا هم باید به Rust مهاجرت کنی ؟
من دوتا تصویر میذارم؛ تصویر اول بر اساس این بنچمارک مستقل با chatgpt جدول شده
برای هر کدوم تعداد درخواست بر ثانیه رو مینویسم:
1) Django + Postgresql: 31,000 - 33,000
2) Fastapi: 11,000 - 109,000
مثلا توی همون بنچمارک کانفیگهای مختلف Fastapi رو ببینید چقدر تفاوت داره از ۱۱ هزار درخواست برای یک مورد تا ۱۰۹۰۰۰ درخواست.
بدون تغییر فریمورک اصلی و کد
3) Gin: 110,000
و در نهایت فریمورک مورد علاقه خودم :
4) Axum + Postgres: 1,115,000
بله میلیون
با اینکه من خیلی به Axum علاقه دارم و بسیار هم توی کد زدن روش راحت هستم ولی تا الان نشده مشاور یا مدیر فنی تیمی باشم و Axum رو پیشنهاد بدم حتی روی بکندهای با تعداد درخواست بسیار بالا گزینه اول همیشه FastAPI هست. | 4 384 |
| 18 | class Engine():
_instance = None
_lock = threading.Lock()
def __new__(cls):
if cls._instance is None:
with cls._lock:
if cls._instance is None:
....
توی کد بالا بنظر شما چرا
if cls._instance
دوبار استفاده شده ؟
اگر بلد نیستید اشکالی نداره (قراره یاد بگیرید)
قبل از دیدن راهنماییها با دقت بهش فکر کنید ببینید متوجه دلیلش میشید ؟
راهنمایی:
به حالت async اجرای این Singleton فکر کنید
اسم این پترن : double check locking هست
یک سری موارد رو چندوقت پیش توی مصاحبههام با شرکتهای بزرگ دیدم؛ الان دارم روی یک پروژه کار میکنم این مورد رو نیاز داشتم پیادهسازی کنم گفتم همینارو سوال جواب کنم برای یادگیری دوستان. | 3 760 |
| 19 | 95% of enterprise AI deployments fail to deliver value
در یک حرکتی چندتا از این شرکتهای AI فروش داخلی (کاسبان تحریم) روی موجهای اخیر درحال تلاش برای خوروندن LLM به شرکتهای دیگر هستند. شرکتهایی که همینطوری بخاطر تحریم؛ جنگ؛ قطعی اینترنت و تعطیلی به زور سرپا موندند.
برای همین خواستم دوتا مورد رو یادآوری کنم:
اولین مورد گزارش MIT روی میزان سودآوری AI (که ۹۵٪ میزان بازگشت 0 داشتند)
legal.io
مورد دوم؛
تجربه شخصی بنده توی کار با تیمی از مهندسها که مدتی قبل منتور اونها بودم.
( استفاده درست از LLM ها برای مهندسی کامپیوتر )
با نهایت احترام به شرکتهای AI داخلی که واقعا innovation دارند و در تلاش برای پیشرفت جامعهی ایرانی هم هستند. | 2 925 |
| 20 | 95% of enterprise AI deployments fail to deliver value
در یک حرکتی چندتا از این شرکتهای AI فروش داخلی (کاسبان تحریم) روی موجهای اخیر درحال تلاش برای خوردوندن LLM به شرکتهای دیگر هستند. شرکتهایی که همینطوری بخاطر تحریم؛ جنگ؛ قطعی اینترنت و تعطیلی به زور سرپا موندند.
برای همین خواستم دوتا مورد رو یادآوری کنم:
اولین مورد گزارش MIT روی میزان سودآوری AI (که ۹۵٪ میزان بازگشت 0 داشتند)
legal.io
مورد دوم؛
تجربه شخصی بنده توی کار با تیمی از مهندسها که مدتی قبل منتور اونها بودم.
( استفاده درست از LLM ها برای مهندسی کامپیوتر )
با نهایت احترام به شرکتهای AI داخلی که واقعا innovation دارند و در تلاش برای پیشرفت جامعهی ایرانی هم هستند. | 22 |
