جنگولرن
3.8K subscribers
288 photos
74 videos
31 files
556 links
آموزش Django و بستگان
Download Telegram
Media is too big
VIEW IN TELEGRAM
تولید نرم افزار کار سختی هست.

چند دقیقه از کلاس درس مهندسی اینترنت
مدرس: رامتین خسروی/دانشگاه تهران
☑️حتما این ویدئو رو ببینید.

لینک دوره توی مکتب خونه
👍7
📣 تبلیغ رایگان/من شرکتش رو نمیشناسم. کارشون حضوری و فول تایمه

تیم پینگی جهت تکمیل تیم توسعه خود به دنبال جذب برنامه نویسان بک اند (کارشناس) با شرایط زیر می‌باشد.


◼️تسلط کامل بر فریموورک Django

◼️آشنایی با Redis و Celery

◼️تسلط بر مفاهیم سرویس گرایی، طراحی REST API و چار چوب توسعه Django REST Framework

◼️آشنایی با ساختار SYNC و ASYNC

◼️آشنایی با ساختارهای Atomic

☎️ تلفن تماس : 09027776670
🏢 محل شرکت : اصفهان ، سیتی سنتر ، طبقه سوم
🌐 لینک آگهی : www.jobinja.ir/773114ر
1👍1
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (SeYeD.Dev)
This media is not supported in your browser
VIEW IN TELEGRAM
می‌دونی که اینستاگرام از جنگو استفاده می‌کنه؟
جنگو واقعا بهترین گزینه برای همه چیز نیست. از نظر سرعت، ممکنه مشکلاتی داشته باشه، مخصوصا وقتی تعداد زیادی درخواست میاد. ولی یادت باشه که سرعت فقط یه قسمت کوچیک از داستانه، اموری مثل امنیت و توانایی کنترل ترافیک هم مهمن. و جنگو واقعا توی این دو مورد خیلی خوب عمل می‌کنه.

حالا بیا بفهمیم جنگو چجوری کار می‌کنه:

اولاً درخواست به سرور میره. سرور Nginx اولین گامه که درخواست رو دریافت می‌کنه و یه جورایی بهش سرویس می‌ده. بعد از اون، درخواست به فرآیند WSGI میره. این فرآیند واسه تبدیل درخواست‌هایی که به شکل http اومدن، به زبون برنامه نویسی پایتون تبدیلشون می‌کنه. بعد میان افزار‌های مختلف هم کنترل درخواست رو به دست می‌گیرن، مثلاً چک می‌کنن که آیا کاربر احراز هویت شده یا آیا آی‌پی‌اش مجازه یا نه.

بعد از این مرحله، ما به مسیریابی می‌رسیم. این قسمت تصمیم می‌گیره که درخواست به کجا بره. بر اساس آدرسی که توی URL هست، مسیر مناسب انتخاب می‌شه و درخواست به اونجا میره. اینجا کسی که درخواست رو فرستاده نمی‌دونه دقیقاً چه چیزی پشت اون آدرسه.

@SEYED_BAX
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4👎1
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (SeYeD.Dev)
🐱 گیت چطور کار میکنه ؟

گیت: ابزار کنترل نسخه توزیع‌شده‌ای است که تغییرات اعمال‌شده به کد شما را در طول زمان رصد می‌کند. گیت امکان پیگیری تغییرات به مخزن کد شما را ساده می‌کند و امکان همکاری در پروژه‌ها با دیگران را فراهم می‌کند. این ابزار توسط لینوس توروالدز در سال ۲۰۰۵ برای توسعه کرنل لینوکس ایجاد شد، و سایر توسعه‌دهندگان کرنل به توسعه اولیه آن کمک کردند.

این امکان را به ما می‌دهد که تغییرات را در کد خود ردیابی کرده و با همکاران به صورت توزیع‌شده در قسمت‌های مختلفی از مخزن کد کار کنیم. هنگامی که از توزیع‌شده بودن صحبت می‌کنیم، ممکن است فکر کنیم که کد ما در دو مکان، یعنی سرور از راه دور و محلی، وجود دارد، اما داستان کمی پیچیده‌تر است.

گیت سه فضای ذخیره‌سازی دارد: دایرکتوری کاری، محیط استیجینگ و مخزن محلی.

1. 𝗪𝗼𝗿𝗸𝗶𝗻𝗴 𝗗𝗶𝗿𝗲𝗰𝘁𝗼𝗿𝘆:
اینجا جایی است که کار می‌کنید و فایل‌های شما زندگی می‌کنند (همچنین "بدون پیگیری" نیز نامیده می‌شوند). تمام تغییرات فایل‌ها در اینجا علامت‌گذاری خواهند شد؛ اگر به گیت ذخیره نشوند، آنها را از دست خواهید داد. دلیل این امر این است که گیت از این فایل‌ها آگاه نیست.

2. 𝗦𝘁𝗮𝗴𝗶𝗻𝗴 𝗔𝗿𝗲𝗮:
وقتی تغییرات خود را با دستور git add ذخیره می‌کنید، گیت شروع به پیگیری و ذخیره تغییرات شما با فایل‌ها می‌کند. این تغییرات در دایرکتوری .git ذخیره می‌شوند. سپس، فایل‌ها از دایرکتوری کاری به محیط استیجینگ منتقل می‌شوند. با این حال، اگر این فایل‌ها را تغییر دهید، گیت از آنها خبر نخواهد داشت؛ شما باید به گیت اعلام کنید که این تغییرات را توجه کند.

3. 𝗟𝗼𝗰𝗮𝗹 𝗥𝗲𝗽𝗼𝘀𝗶𝘁𝗼𝗿𝘆:
اینجاست که همه چیز (کمیت‌ها) در دایرکتوری .git ذخیره می‌شود. وقتی می‌خواهید فایل‌های خود را از محیط استیجینگ به مخزن محلی انتقال دهید، می‌توانید از دستور git commit استفاده کنید. پس از این کار، محیط استیجینگ شما خالی خواهد شد. اگر بخواهید ببینید چه چیزی در مخزن محلی وجود دارد، دستور git log را امتحان کنید.

بعضی از دستورات اصلی گیت عبارتند از:

- git init: ایجاد یک مخزن جدید گیت در دایرکتوری
- git branch: ایجاد یک شاخه محلی جدید
- git checkout: تغییر شاخه‌ها
- git add: افزودن یک فایل جدید به محیط استیجینگ
- git commit: افزودن تغییرات استیجینگ شده به مخزن محلی
- git pull: برداشتن کد از مخزن از راه دور به دایرکتوری محلی
- git push: ارسال تغییرات مخزن محلی به مخزن از راه دور
- git status: نمایش فایل‌هایی که در حال پیگیری هستند (و غیرپیگیری شده‌اند)
- git diff: مشاهده تفاوت‌های واقعی در کد بین دایرکتوری کاری و محیط استیجینگ

.
@SEYED_BAX
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
تبدیل هگزا دسیمال به دسیمال توی آموزش Html css

حتی توی html css هم به درد میخوره. البته توی آزمون دبیری آموزش و پروش امسال هم یه سوال ازش اومده بود😉🤫
👍6
Forwarded from Python Hints
امکان نداره شما پروژه پایتونی رو کد بزنید و اطلاعات درست پروژه رو ندید
Readme.md

حداقل باید شامل ۳ مورد باشه :
۱- سیستم عاملی که روش کد زدید یا تست گرفتید :
OS: Ubuntu 20.04
۲- ورژن پایتونی که دارید استفاده می‌کنید:
Python: CPython 3.10.12
پایتون نسخه‌های مختلفی داره اگر از نسخه سایت python.org استفاده می‌کنید به اسم CPython شناخته می‌شه (توی شرکت‌هایی که از نسخه‌های دیگه مثل IronPython - Pypy - IntelPython استفاده می‌کنند رعایت این نکته بسیار مهم هست)

۳- دستور اصلی به جهت اجرای پروژه :
$ python main.py —help


فقط تحت ۱ شرابط حق دارید ۲ مورد اول رو جایی گزارش نکنید و کسی هم بهتون سخت نگیره (هرچند بازم خوب نیست ولی خب) :
Docker

اگر Dockerfile یا docker image استفاده می‌کنید توی پروژه می‌تونید به ترتیب هر ۳ مورد یا ۲ مورد اول رو توی گزارش ننویسید.
👍9👎1
Forwarded from Python BackendHub
راجب اصول تست نویسی, یک مقاله پیدا کردم, میخوندمش مفید و کلی بود
به عنوان یک software engineer حداقل باید با مفاهیم اشنا باشین که وقتی با کلمه های زیر خوردین فکر نکنید چیز خیلی عجیب و فضایی هستند. نمیگم بلدشون باشید ولی باید بدونید چی هستند. دونستن این موارد کمک میکنه بهتون که به عنوان یک SE بهتر کد بنویسید و بهتر تست بنویسید.

- Testing Strategy
- Test policy
- Test scenario & Test case
- Software requirements, and requirements review
- Types of automated testing (A/B, smoke, unit, integration, e2e, exploratory, stress, load, perfomance, regression, cross-device, crowss-browser, acceptance, black box, Operational acceptance, conctract acceptance)
- Types of manual testing (exploratory testing, ad hoc testing)
- Software quality indicators
- Test Metrics


لینک مقاله:
https://www.altexsoft.com/blog/engineering/software-testing-qa-best-practices/


@ManiFoldsPython
👍3
Forwarded from Django Expert (Sepehr Akbarzadeh)
https://medium.com/@sepehrakbarzadeh/revolutionize-your-data-handling-with-the-unit-of-work-design-pattern-in-python-and-django-14895d147cdc

در این مقاله راجع به دیزاین پترن Unit of Work در جنگو صحبت شده. در رابطه با اینکه چطور transaction هاتون رو بهتر مدیریت کنید در پروژه‌هایی که پیچیدگی نسبتا بالایی دارند. می‌تونه در پروژه‌های با scale بالا و همچنین در مصاحبه‌های فنی کمکتون کنه.
👍2
Forwarded from ‌BenDev
ویس در مورد اینکه چرا جنگو (فریم
ورک )نباید استفاده کنید!
@BenDevelop
👍12
‌BenDev
Voice message
بعد از اینکه این ویس امیربهادر رو که گوش دادید. نا امید نشید
اتفاقا راهنمایی های خوبی داشت و خودش یه roadmap ع
البته بعد از گوش دادن به این ویس بیشتر می فهمیم که کمتر بلدیم

در مورد بعضی نکاتی که در مورد دیتابیس گفت. به نظرم بعضی شون از وظایف db admin هست. اما متاسفانه اکثر شرکت ها انتظار دارن برنامه نویس back-end به sql (منظورم فقط زبانش نیست) مسلط باشن.
که البته این اشتباه باعث شده که خیلی ها احساس کنن به db admin نیاز ندارن. کار db admin ها فقط مدیریت بکاپ و یوزرها و کارهای زیرساختی نیست. گاهی اوقات مشورت با اونا میتونه پرفورمنس رو بالا ببره. (صحبتش در مورد جنگو بود. من رفتم سمت دیتابیس 😅 )
👍8
جنگولرن
با عرض پوزش از همه دوستان من باز سوزنم روی html css گیر کرده لذا این پست رو میزارم و بقیه مطالب مرتبط اش رو توی کامنت می نویسم. شاید به درد کسی خورد. ✔️ اولین نکته مهم: html رو برای structure استفاده میکنیم. و css رو برای style گاهی اوقات ما با استفاده بیخودی…
سلام به همه
اون border رو uncomment کنید و بگید چرا رفتار browser اینجوریه.
#سوزن_گیر_کرده_روی_html
کد html برای راحتی شما:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>test</title>
<style>
#yek, #do{
width: 50px;
height: 50px;
margin: 50px;
}
#yek{
background-color: aqua;
/* border: 1px solid black; */
}
#do{
background-color: red;
}
</style>
</head>
<body>
<div id="yek">
<div id="do"></div>
</div>
</body>
</html>
👍1
مقاله ای از @TadavomnisT_channel

مقایسه سرعت خوندن/نوشتن RAM و HDD

چند سال پیش توی یه فرومی توی یه تایپیکی مربوط به برنامه‌نویسی من به این نکته اشاره کردم که سرعت خوندن/نوشتن توی هارددیسک بطور متوسط 100 هزار بار از رم کمتره..!
برای بسیاری از برنامه‌نویسها این حرف عجیب بود، و خیلیا قبولش نمیکردن، برای همین من مجبور شدم تکنولوژی هر دو رو توضیح بدم و با زبان تخصصی بگم که چرا چنین حرفی زدم.
با این مقاله همراه باشین تا ببینیم چرا میگم هارد دیسک بطور متوسط صد هزار بار از رم کند تره.

خودم هنوز وقت نکردم کامل بخونمش (خیلی مفصل توضیح داده)
لینک:
https://tadavomnist.github.io/Articles/4-RAM-vs-HDD-Pr/4-RAM-vs-HDD-Pr.html
3
جنگولرن
سلام به همه اون border رو uncomment کنید و بگید چرا رفتار browser اینجوریه. #سوزن_گیر_کرده_روی_html کد html برای راحتی شما: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0">…
بهترین جواب:
هرجا سی اس اس اذیت میکنه بیاین پیش خودم احتمال خیلی زیاد بتونم کمک کنم :)

این موردی که دوستمون بهش برخورده موضوعی هستش به اسم
Margin collapsing

که کلا هر زمان دو عنصر در مجاورت هم باشن در راستای عمود بدون اینکه هیچ فاصله ای بینشون باشه مرورگر فقط یکی از مارجین ها رو در نظر میگیره و دیگری رو حذف یا به اصطلاح کلپس میکنه.

بحثش طولانی هستش ولی همین عنوان رو سرچ کنین کلی مقاله و ویدیو میاد که مورد های مختلف رو بررسی میکنه.

دوتا نکته:‌
اول اینکه این رفتار توی استانداردها هستش و مرورگرها موظف هستن که اینطوری پیاده ش کنن.
دوم اینکه من گفتم راستای عمود برای اینکه فهمش راحت تر باشه و الا درستش اینه بگیم راستای
block

که این هم باز یک بحث دیگه رو باز میکنه که جاش اینجا نیست :)
👍3😁2
Forwarded from Python BackendHub
این meme رو دیدم خیلی جالب بود… عمق دانشنتون از PostgreSQL تا چه حدیه؟ یکم حس بی سوادی دست داد بهم :)) تو یکی از پستا چند روز پیش راجب یکیش پرداخته بودم 😁

Every sql operator is actually a join? WTF?😂

@ManiFoldsPython
👍10😁1🤔1
Python BackendHub
این meme رو دیدم خیلی جالب بود… عمق دانشنتون از PostgreSQL تا چه حدیه؟ یکم حس بی سوادی دست داد بهم :)) تو یکی از پستا چند روز پیش راجب یکیش پرداخته بودم 😁 Every sql operator is actually a join? WTF?😂 @ManiFoldsPython
سلام به همه
پیرو این پست باید بگم که قرار نیست برنامه نویس همه اینارو بلد باشه. چون بیشتر سمت دیتابیس هست. اما تا اون دو تا سطح اول که هنوز کمرش خم نشده رو دیگه باید بلد باشیم.

به نظرم یه نگاهی به کتابهایی مثل مهندسی نرم افزار، ساختمان داده ها، طراحی الگوریتم داشته باشید بد نیست.

منظورم این نیست که من اینارو بلدم. خودمم با 10 پاس کردم رفته. خودمم باید دوباره بخونمشون
👏8👍2
Forwarded from مطالب رایگان و آزاد🎈 ( behrad)
هش کردن پسورد چیست؟
نمک زدن به پسورد چیست؟
جدول رنگین‌کمونی چیست؟

توی سیستمهای وب / اینترنت / سوشال مدیا و...، پسوردها عموما توی دیتابیس ذخیره میشن.
دیتابیس یکی از فیلدهای مورد علاقه منه، چند بار گفتم ازش حرف میزنیم ولی حرف نزدم هنوز... شما اگه علاقه دارین، تاکید مکرر میکنم که کتاب استاد آبراهام رو بخونین.

در این باره که این سیستمها میتونن پسورد صریح و plain شمارو داشته باشن که شکی نیست، اما یه عرفی هست، یک سیاست و یه اصل امنیتی که:

پسوردهایی که قراره توی دیتابیس ذخیره بشن، بصورت هش (هش کریپتوگرافیک- یا با آنتروپی بالا) ذخیره بشن.

این چه فایده‌ای داره؟
اگر روزی، هر اتفاقی برای سیستم افتاد و دیتابیس هک شد، پسورد صریح کاربرا اونجا نیست... و بجاش هشش هست، و از روی اون هش نمیشه پسورد رو بدست آورد (چون آنتروپیش بالاست - قبلا توضیح دادم)

دیتابیسها طراحی نشدن که امن باشن، طراحی شدن که بهینه و با سرعت زیاد و با هزینه کم کار کنن، از طرفی هیچ سیستمی امن نیست.
فرض کنید یکی با گونی بیاد توی دیتاسنترها و دیسکهارو بریزه توی گونی با خودش ببره🥴
به هر حال ریسک وجود داره، با رعایت کردن این عرف - ریسک لو رفتن پسورد مردم از بین میره.

برای همینه که توی اکثر سیستمها یا رمز رو براتون ریست میکنن، یا ازتون میخوان که با ایمیل برین توی یه لینک خودتون ریست کنین، چون خودشونم پسورد شمارو ندارن.

چرا هش میکنن؟ چرا رمزنگاری نمیکنن؟
چون که هش کریپتوگرافیک یه طرفه هست کلید هم نمیخواد، رمزنگاری دوطرفه هست کلید هم میخواد - خود کلیدو کجا ذخیره کنن؟
اگه لو بره همه پسوردها دیکریپت میشه.
+ اورهد و سربار محاسباتی هم داره.

هش راهکار زیرکانه و عملی خوبی هست
=+=+=+=+=+=+=+=+=+=+=+=+

از چه هشهایی میتونیم استفاده کنیم؟
یک هش کریپتوگرافیک - قبلا توضیح دادم، هش هایی که آنتروپی بالایی دارن. یک ذره دیتای ورودی تغییر کنه، کل خروجی هش عوض میشه ...
خروجیش قابل مدلسازی و حدس و الگویابی نیست، یه حالت شبه‌رندوم داره.
به اینا میگن هش کریپتوگرافیک - قدیما مسیج‌دایجست معروف بود (MD5 نسخه 5) مثلا، اما الان دیگه بخاطر کالیژنهایی که میزنه ناامنه...
الان
SHA : Secure Hash Algorithm
امن تلقی میشه - توضیح دادم قبلا.
=+=+=+=+=+=+=+=+=+=+=+=+

حالا... تا اینجا یاد گرفتیم که برای سیستم اعتبارسنجیمون، پسورد رو هش کنیم و بعد ذخیره کنیم.
حالا فرض کنیم یکی با گونی اومد و دیسکهارو دزدید و دیتابیس لیک شد...

هکرهای خبیث و خطرناک، هش های پسوردهای متداول رو از پیش حساب کردن و همیشه توی جیبشون دارن، به محض اینکه ی دیتابیس لیک شده میبینن سریع تست میکنن که مثلا کیا هش پسوردشون
827ccb0eea8a706c4c34a16891f84e7b
هست، یهو میبینن که عه 40 درصد دیتابیس همینه...
چون این هش "12345" هست.

این میشه نوعی بروتفورس تعمیم یافته - هش پسوردهای متداول رو قبلا حساب کردن و مثلا میتونن تا 95 درصد کل پسوردهای دیتابیس رو بفهمن اصلش چی بوده....
چون مردم از پسورد متداول استفاده میکنن.

اون هکرایی که خیلی خیلی خفن هستن (هکرای بیترتبیت و بی‌ادب و خبیث منظورمه) عموما بجای لیست هشها یا فایلش، یه جدول رنگین کمونی 🌈 دارن که عموما روی دیتابیس به شکلی مستقر شده که سرعت جستجوی هش رو خیلی زیاد میکنه و زمان رو کم میکنه.

چیز خیلی ساده‌ایه، ما این هشهایی که حساب کردیم رو میایم با یه راهکار ریاضیاتی جوری توی یه جدول (مثلا دیتابیس) مینویسیم که با کمترین هزینه در دسترس باشن و الگوریتم جستجومون با یه بار سیک کردن بتونه رنج زیادی از هشهای موجود رو بازیابی کنه.
در موردش بخونین...

یسری ابزار هست اصلا که rainbow-table ها توش امبد شده... و استفاده میشه کرد.
فکر کنم این کالی کوچولوی من توش پر از ایناس... اگه داشت نیشون میدم:3

خلاصه با این کار گفتیم میتونن خیلی سریع 95 هشهارو کرک کنن.
پس چیکار کنیم؟؟؟؟
=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
مفهومی توی رمزنگاری هست به اسم نمک🧂😬

ما روی داده صریحمون (پسورد) قبل از اینکه هش بشه یخورده نمک (salt) میزنیم، این نمک یه دیتای رندومی هست ممکنه هر جوری ساخته شده باشه... این میتونه بچسبه به ته پسورد، یا اصلا مثل یه ادویه واقعی باهاش ایکسور بشه یا هرجوری بپاشیمش روی پسورد.

چون هشمون کریپتوگرافیک بوده، خروجی خیـــــلی تغییر بزرگی میکنه و کلا یه چیز رندوم دیگه میشه.

هکر نمیدونه من چه جور نمکی پاشیدم، چجوری پاشیدمش و چقدر پاشیدم!
جدول رنگین کمونی‌ش دیگه کار نمیکنه:))
این میشه نمک زدن به پسورد.

توی رمزنگاری هم استفاده میشه، زمانی که ما سایز کلیدمونو استاندارد کنیم، که بدیمش به انکریپشن- مثلا AES، باید هشش کنیم، عموما بهش نمک هم میزنن و نمک رو هم بعدا کنار سایفر میذارن:)) (چرا؟ بهش فکر کنید)

=+=+=+=+=+=+=+=+=+=+=+
👏8👍41
Forwarded from Python BackendHub
ویدیو خیلی خوبی بود، توصیه میکنم حتما ببینید. من داخل یک جایی دیدم دوستان متاسفانه برداشت کردن که امیربهادر گفته <کلا جنگو بدرد نمیخوره> 😂 خودم کارایی که میکنم و واقعا به قدرت حل مسئله ام جواب داده:

۰. اولین و مهم ترین نکته: همیشه query رو روی دیتابیس مینویسم، تا بهینه ترین کوئری ممکن رو بتونم بنویسم. بعد ترجمش میکنم به کد ORM. خیلی دیدم این مسیرو برعکس میرن که باعث وابستگی به ORM میشه.

۱. اولا کدای لایبری رو میخونم همونطور که اشاره کرد. خیلی وقتا داکیومت نمیخونم. واقعا لایبریا خیلی کوچیکن اکثرا، مثلا فلسک کلا ۱۵-۲۰ فایله پایتونیه تو ۲ فولدر 😁 تستاشم میخونم حتی. خیلی کمکم کرده این موضوع

۲. سخترین تسکایی که تو شرکت ممکنه به من assign نشه اخر هفته یواشکی انجام میدم :)) واقعا کمکتون میکنه این موضوع 😁

۳. تسکایی که قبلا حل کردم بازنویسی مجدد میکنم که بهترش کنم

۴. سعی میکنم تولز ها و لایبری های جدید یاد بگیرم. مثل propan یا rocketry.و خیلی چیزای دیگه که تو شرکت استفاده میشه و نمیتونم اشاره کنم، چون سولوشن هایی که میدن اکثرا راه حل خیلی خلاقانه ای پشتشونه. حتی کدشونم میخونم.

۵. وقتی با یک چیزی کار میکنم، سعی میکنم بهش فکر کنم. مثلا واقعا برام سوال شده بود Kafka چطور fault tolerance ای داره و چه مزیت و ضرری داره نسبت به rabbitmq، که چند تا مقاله راجب دیزاین اینترنالش خوندم و واقعا جالب بود.

۶. تا یک چیزیو حل نکنم ولش نمیکنم 😂 قبلا اینطور بودم که اگه میدیدم یک shortcut میانبر هست که مثلا صورت سوال رو پاک میکنم از اون میرم، ولی الان خیلی به ندرت پیش میاد همچین کاری کنم

@ManiFolsPython
👍3