Python Hints
8.63K subscribers
172 photos
11 videos
9 files
141 links
Python tips and tricks
The Good, Bad and the Ugly

توی این کانال فقط قرار هست در مورد core python صحبت کنیم.

این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی بیش از ۱۰ سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار)

Admin: @Abbasi_ai
Download Telegram
یک ساعت نوشتم کنسل زدم پاک شد :/ (متن آپدیت میشه)

این هم یک روش استفاده زا line_profiler هست که دیدم استفاده می‌شه برای اینکه نیاز نباشه از دستور kernprof -l -v استفاده کنید.
که خب قطعا من طرفدارش نیستم به دو دلیل :

۱- کدهای بیشتری لازمه؛ طبعا بعد از اتمام هم پاک کردنش دردسر بیشتری داره.
توی مورد decorator (قبلی) فقط کافی همون رو search & replace بزنید با هیچی

۲- خروجی profiling رو ذخیره نمی‌کنید با این روش (که قبلا گفتم حداقل دو نسخه دارید یکی قبل تغییر یکی بعد از تغییر)

حالا شاید بگید خودت گفتی اصولی اینه که line_profile بعد از cProfile اجرا بشه و خروجی cProfile رو هم داریم ذخیره می‌کنید پس نیازی نداریم دیگه ؟
نکته خوبیه ولی سطحی نبینیم :
من تا حالا پروژه‌ای رو ندیدم که با تفییر یک خط کد توی یک تابع optimize بشه و تمام پس نیاز میشه این فایل‌ها؛ نکته بعدی حجم خروجی line_profile چیزی نیست که بعد سر نداشتنش بخواهید با تیم سر اینکه چرا یک خط کد ناخواناتر شده بحث کنید (توی مثال بالا ۲۷۲ بایت هست)
👍1722🆒2
این یکی واقعاً جالبه، جایگزین
Flake8, isort, black, pyupgrade, ...

با سرعت خیلی بیشتر.

Ruff
که با Rust نوشته شده، و پروژه
Scipy, Pandas, FastApi, ...
هم سمتش رفتند.
🔥24👍511
چندروز پیش یکی از دوستان ازم کمک خواست روی بررسی جوابی که به سوال مصاحبه داده بود؛ سوال برای سطح
mid-level, senior
مطرح شده بود (ولی سطحش بالاتر از مدیور هست.)
ساده شده صورت مساله این بود :
اصل سوال بصورت توضیحات بخشی از یک پروژه بود که یادم نیست و شخص باید خودش تشخیص می‌داد چیکار کنه که من اون بخش رو هم توی ساده‌سازی گفتم دقیقا چی میخوام

پیاده‌سازی یک Ring Buffer در پایتون بطوریکه بجای استفاده از لیست‌ها از Circular Double Linked List استفاده کنید؛ (پیاده سازی هر ۲ مورد با خود کاربر هست)
این Circular Double Linked List شما باید یک ویژگی مهم رو داشته باشه :
پشتیبانی از اضافه کردن node ها با استفاده از ایندکس دهی منفی.


همیشه فکر میکردم سوالات سخت همواره از مباحث درخت و ... هست (نه چیزهای ساده مثل مورد بالا) اما جوری توی پروژه واقعی گنجانده شده بود؛ صورت مساله اصلی رو میگم. که تبدیلش به اینکه دقیقا خود مساله چی میخواد حدود ۲۰ دقیقه وقت گرفت.
کل جلسه مصاحبه ۲ ساعت بود.

چندتا راهنمایی :
Ring Buffer = Circular Queue
———
Circular Double Linked List

رو باید اول پیاده‌سازی کنید؛ سریعترین راهکار اینه که اول linked list رو پیاده سازی کنید؛ بعد همین رو تبدیل به نسخه circular کنید بعد همین کد رو به double linked list تبدیل کنید و در نهایت توی متد insert ایندکس‌های منفی رو هم پشتیبانی کنید.

بعد از همین مورد برای Ring Buffer استفاده کنید (خیلی معقول بنظر نمیاد و دقیقا هم موضوع همین هست؛ قطعا چیزی که معقول نیست رو کتابی راجبش صحبت نکرده - شما هم روش تمرینی نداشتید)

واقعا بنظرم سوال پر چالشی بود و توی این مصاحبه می‌شد به راحتی :
۱- نحوه حل مسئله
۲- میزان تمرکز
۳- میزان دقت
۴- نحوه کد زدن
۵- سواد پایتون
۶- سواد ساختمان داده و الگوریتم
۷- کنترل فشار عصبی و ...
رو تماما امتیاز‌دهی کرد؛ بسیار سوال هوشمندانه و زیرکانه‌ای بود بنظر من برای همین خواستم با شما هم به اشتراک بذارم (البته یک سری شرط‌ها و شرایط خاص هم داشت که من از اون‌ها گذشتم که خیلی طولانی نشه متن)
👍3041
Python Hints
چندروز پیش یکی از دوستان ازم کمک خواست روی بررسی جوابی که به سوال مصاحبه داده بود؛ سوال برای سطح mid-level, senior مطرح شده بود (ولی سطحش بالاتر از مدیور هست.) ساده شده صورت مساله این بود : اصل سوال بصورت توضیحات بخشی از یک پروژه بود که یادم نیست و شخص باید…
اضافه کردن node با ایندکس منفی
۱- چیزی که پیاده‌سازی نکنم رو راجبش پست نمیذارم (البته منم مثل شرایط مصاحبه همون لحظه کد زدم)

۲- یک راهنمایی دیگه؛ حتما len رو پیاده سازی کنید برای
Overflow (Ring buffer)
بهش نیاز دارید

۳- اگر کمکی لازم بود توی پیاده سازی حتما بپرسید (خوشحال میشم بتونم کمک کنم)
13👍7
متن این تصویر نصف ایران رو بدبخت کرده
نصف دیگه هم که نکرده، تو عمرشون برنامه‌نویس نبودند.

برنامه‌نویس سرمایه گذار شرکت شما نیست، به اندازه شما مطمئن به کار و ایده شما برای پیشرفت نیست (توی بهترین حالت اگر شما ۱۰۰٪ مطمئن از پیشرفت هستید برنامه‌نویس باید روی ۶۰-۷۰٪ بشینه بیش از اینش توهم و حرف هست)

این حق هر برنامه‌نویسی هست که موقع همکاری با شما با هرجایی که فکر می‌کنه بهتر هست و به پیشرفتش بیشتر کمک می‌کنه مصاحبه بده.

حتی اگر پیشرفتی هم نباشه براش و هم سطح کار شما باشه، برنده شرکتی هست که مزایا + برخورد بهتر + امنیت فکری بیشتری رو به نیرو ارائه میده

به همه‌ی برنامه‌نویس ها هم باید بگم :
قبل از جابجایی مطمئن بشید ۲ بار فکر می‌کنید، جابجایی توی بهترین حالت هم همیشه ۱۰-۲۰٪ ریسک هست

اما پایندی به شرکتی لطف شما هست نه وظیفه شما.

پ.ن : این تصاویر هوشمندانه انتخاب میشه‌ها، ارتباط شما با شرکت رو مثل روابط عاطفی و خانوادگی نشون میده (اون جمله احمقانه، ماها یک خانواده هستیم هم همین بود)
البته رابطه عاطفی کاملاً یکطرفه، شما پایبند می‌مونید ولی شرکت به وقت بی‌نیازی شمارو اخراج می‌کنه
👍599
توی ادامه بحث profiling اینبار میرسیم به اهمیت حافظه؛ وقتی از یک تازه سنیور شده از پروفایلینگ بپرسید راجب cpu و ... صحبت می‌کنه از یک با تجربه بپرسید اهمیت مصرف حافظه در کنار زمان اجرا رو هم بهتون می‌گه
مثل منم باشید profiling GPU رو هم گذارش میدید (البته به قدرت قبلی‌ها نیست ولی از نداشتنش بهتره)
برای پروفایلینگ مموری معمولا از کتابخونه
memory_profiler
استفاده می‌شه ؛ اما حقیقتا شخصا ۶ ماه هست که جایگزین پیدا کردم و چقدر خوشحالم بابت این موضوع :
memray 
که تصویر بالا خروجی اجرای live هست واقعا پروردگار اطلاعات دقیق مصرف مموری هست.
دقت کنید مصرف مموری کتابخونه C, Rust, ... هم که ایمپورت کردید توی پروژه و داره استفاده می‌شه رو نشون میده که خیلی خیلی مهمه.
اما چطور ازش استفاده کنیم ؟
$ pip install memray


همینجا یک موضوع دیگه رو هم بگم (خودتون بخونید) یک پلاگین هم برای pytest داره که می‌توندی بعدا دنبال کنید
pytest-memray
25👍3❤‍🔥2
Python Hints
توی ادامه بحث profiling اینبار میرسیم به اهمیت حافظه؛ وقتی از یک تازه سنیور شده از پروفایلینگ بپرسید راجب cpu و ... صحبت می‌کنه از یک با تجربه بپرسید اهمیت مصرف حافظه در کنار زمان اجرا رو هم بهتون می‌گه مثل منم باشید profiling GPU رو هم گذارش میدید (البته…
ساده‌ترین راه اجرای memray استفاده از دستور run هست + flamegraph
همونطور که قبلا گفتم خروجی تمام پروفایلینگ‌هارو باید نگه دارید و نمودار لایو اینکار رو نمی‌کنه پس قبل از استفاده از نمودار لایو (حین اجرای برنامه تمام دستورات و مصرف مموری‌هارو نشون میده)
ازین دستورات استفاده کنید :

$ memray run <my-script>.py

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

memray flamegraph <some-naming>.bin

بعد از اجرای دستور بالا یک فایل html برای شما ایجاد میشه که اگر با مرورگر باز کنید چیزی مشابه تصویر بالا خواهید داشت. تنها نکته‌ای که راجب این تصویر لازمه بگم بخش stats هست که
peak memory usage
(بیشترین مصرف مموری در طول اجرای کد) رو بهتون نشون میده.
باقی موارد به ازای هر خط کد یا import , .... مصرف مموری رو نشون میده (مثال من شاید خیلی خوب نباشه)


پ.ن: همیشه فایل .html رو همراه با .bin روی سیستم خودتون خروجی بگیرید و نگهدارید.
توی پست‌های بعدی می‌گم چرا .
1911
Python Hints
ساده‌ترین راه اجرای memray استفاده از دستور run هست + flamegraph همونطور که قبلا گفتم خروجی تمام پروفایلینگ‌هارو باید نگه دارید و نمودار لایو اینکار رو نمی‌کنه پس قبل از استفاده از نمودار لایو (حین اجرای برنامه تمام دستورات و مصرف مموری‌هارو نشون میده) ازین…
دستور run چندتا option هم داره که هرکدوم توی شرایط خاص استفاده می‌شه :

memray run --native <my-script>.py

این حالت برای وقتایی هست که می‌خواید اثبات کنید numpy, pandas , ... هستند که دارند ازین میزان رم استفاده می‌کنند یا اینکه می‌خواهید بین توابع مختلفی که پیکج‌ها ارائه می‌دهند مقایسه انجام بدید.
گرفتن ریپورت html روی این حالت می‌تونه طولانی باشه (جزو حالاتی هست که هم bin هم html بهتره روی یک سیستم خروجی گرفته بشه)

memray run --trace-python-allocators <my-script>.py

بجای گزارشات کلی که توی تغییر سایز memory pool گرفته می‌شه به ازای ایجاد و از بین رفتن هر آبجکت براتون گزارش مموری میده که باز هم خروجی خیلی کندتری خواهد داشت؛ و البته اطلاعات بسیار بیشتر.

memray run --follow-fork <my-script>.py


همونطور که از اسمش پیداس می‌گه اگر از parent process فورک گرفته شد وضعیت مموری اون child process رو هم توی ریپورت بیار.

از بین ۳ تا آپشن بالا توی این مدت شخصا فقط از native استفاده کردم چندبار (باقی موارد رو نیاز نداشتم)

اما دوتا آپشن دوست داشتنی دیگه هم وجود داره :
memray run --live <my-script>.py


همیشه بعد از اینکه دستور run رو اجرا کردم (ذخیره بشه) و بعد گزارش html رو آماده کردم؛ تا وقتی دارم روی memory optimization کار می‌کنم تنها دائما از live option استفاده می‌کنم

PID, Thread, Samples, Duration, Max heap size, current heap size
و ... رو بهم میده (برای current heap size) چون توی حالت لایو سریع تغییر می‌کنه از

time.sleep(10)
استفاده می‌کنم توی جایی که مشکوک هستم به میزان مصرف مموری و اینجوری ی پنجره ۱۰ ثانیه‌ای برای خودم باز می‌کنم تا دقیق بررسی کنم توی رم چه اتفاقی داره رخ میده.

memray run --live-remote <my-script>.py

هم همین کار رو می‌کنه اما گزارشات رو روی یک port خاص میفرسته (بازم من ازش استفاده نکردم)

memray run --live --native <my-script>.py

پر استفاده‌ترین حالت بعد از live option برای من استفاده ترکیبی از live و native هست (البته که حوصله آدم سر میره بعضی وقت‌ها تا گزارشش آماده بشه)

حتما برای کاستومایز کردن خروجی‌ها و بررسی دقیق‌تر داکیومنتش رو نگاه کنید (سعی کردم مهمترین مواردی که شخصا استفاده می‌کنم رو بگم فقط).
👍1481🌚1
برای دوستانی که بهونه سابقه کاری می‌آوردند
همونطور که تو جلسه رزومه نویسی گفتم، اگر یاد بگیرید و نکاتی که گفتم رو رعایت کنید، در حداقل حالت باید به مصاحبه دعوت بشید.

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

پ.ن : از ایشان برای اشتراک گذاری تصویر اجازه گرفته شد.
👍29👏122🤪1
این فقط یک شوخی هست
ولی جامعه پایتون، جاوااسکریپت و .... همگی مدیون زبان‌های سطح پایین هستیم ♥️
😁36👍108🎃1
وقتی قبل جلسه می‌خوای باگ فیکس بزنی.
و گیت‌هاب میگه پروژه‌ات وجود نداره
درحالی که همه چیز هست.

مشکل سمت گیت‌هاب هست؛ دست به تنظیمات نزنید.

پ.ن: برای من بعد از ۱۰ دقیقه حل شد.
😁32👍2
Search term:

1) IBM north pole chip

2) ResNet50 performance comparison IBM northpole results
👍112
#Security_Alert

مک بازها (آیپد و آیفون هم شامل میشه) :
iLeakage
رو مراقب باشید
مقاله‌اش هم اومده، که خیلی هم اتک ساده‌ای هست
و اپل هم میگه ۱ ساله می‌دونیم وجود داره ولی راهی براش نداریم. (امن هستیم چون کسی اسکریپت رو ننوشته)

فکر می‌کنم مشکل از سخت‌افزار اپل باشه (بخصوص M1) فرصت کنم مقاله‌اش رو می‌خونم و اطلاع میدم.

خلاصه که خودتونید و خودتون، خیلی مراقب باشید 😂

بعد از استیو جابز و اون تیم خفن قدیمی، عملکرد اپل مثل ایران بود همش میگه اینو نداریم در عوضش امنیت داریم و ...
که اونم توی سال‌های اخیر یکی پس از دیگری داره به فنا میره
بعنوان مثال زمان ارائه
Jailbreak
روی iOS, iPadOS رو مقایسه کنید با قبل.
👍22😁53🗿2👎1🙏1💔1
توی این هفته ۴ بار، یک سوال مصاحبه قدیمی رو در موردش صحبت پیش اومده؛
داستان چیه، من چندین سال پیش با یک شرکت مصاحبه داشتم و مصاحبه کننده ازم یک سوال
Data structure & Algorithm
پرسید، من سوال رو خیلی سریع توضیح دادم و بعد خیلی سریع هم پاسخ صحیح رو نوشتم، در نهایت از تعجب مصاحبه کننده شک کردم که اشتباهی شده و توضیح دادم که من سطح جونیور نیستم و ... (اشتباه سمت HR بود، چون توی جلسه اول هم پیش اومده بود)
طرف ازم خواست که سوال دیگری رو مطرح کنه و دیدم داره طول می‌کشه روی همون سوال قبلی بهش یک پیشنهادی دادم که واقعاً خودمم تا اون لحظه کار نکرده بودم و برام جذاب بود چالش قضیه
در نهایت ایشون هم قبول کرد و رفتیم سراغ مسئله (کل جلسه همین سوال طول کشید و درنهایت هم من قبول شدم)

توی این هفته (شایدم ۲ هفته)، یکبار بعنوان مصاحبه کننده، دوبار دوستانه و یکبار هم راهنمایی بعد از مصاحبه برای یکی از دوستان بحث سوال مطرح شد :

همین‌جا بگم، هیچکس جواب درست حالت سخت‌تر رو نداد.

۱- سوال اصلی مصاحبه خودم :
با استفاده از ساختار داده لیست؛ یک کلاس stack پیاده سازی کنید که یک عدد ورودی به اسم n بگیره و به تعداد n استک ایجاد کنه بطوری که دیتای تمام این استک‌ها داخل فقط و فقط ۱ لیست ذخیره بشه.

سوال خیلی ساده‌اس اما دوتا پرسش داره :
۱- آیا طول لیست از پیش تعریف شده هست؟ (که قطعاً میگن بله)

۲- آیا طول stack ها باهم برابر هست ؟ (جواب اینم بله هست)

که خب شما لیست رو به n قسمت تقسیم می‌کنید و هر قسمت رو به یک استک می‌دید.


نسخه‌ای که من به ذهنم رسید (خودمم توی مصاحبه‌هام می‌پرسم) :
۱- فرض کنید طول لیست از قبل مشخص نیست و stack ها می‌تونند تا بی‌نهایت ادامه داشته باشند (فرض کنید رم بی‌نهایت داریم)

دوتا راهکاری که به ذهن خودم رسید و هنوز توی این چندسال راه دیگه‌ای بهم نگفتند :
۱- هر عنصر لیست، یک tuple باشه که ایندکس اول tuple اندیس stack باشه و ایندکس دوم، داده‌ایی که ذخیره شده

اما بازم سختش کنیم، شما غیر از نوع داده‌های اصلی :
int, float, decimal, ...
چیزی نمی‌تونید داخل stack نگه دارید (یعنی فقط دیتا)

راهنمای کوچیک راهکار دوم : از Remainder طول فعلی لیست بر‌ n استفاده کنید و ببینید کدوم اندیس برای کدوم stack هست.

بحث سر راهکار من روی آخرین حالت سوال (که خب سوال مصاحبه یکی از دوستان هم بوده، کاملاً اتفاقی) من رو به اینجا رسوند که این موارد مثل جلسه امشب رو یک کاری باهاش بکنیم،

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

اسپانسر : چندباری پیش اومده، اما نهایتاً هدفشون یا تبلیغ برای فروش دیگر محصولات آموزشی هست، یا اینکه میخوان یک بخشی رایگان باشه و باقی بفروش برسه و ...
خلاصه درآمدی (پول خوبی هم داره)

لایو : که خب محدودیت ۱۰۰ نفر و زمان و ... داریم و خیلی‌ها فرصت نمی‌کنند شرکت کنند و چون ذخیره هم نمیشه خیلی چیز قشنگی نمیشه نهایتاً

متن و کانال : برای آموزش‌های این چنینی واقعاً خوب نیست و خیلی خیلی سخت هست

یوتیوب : مزایایی که داره اینه که شما با دیدن؛ کامنت؛ لایک انگار دارید دوره رو می‌خرید و پشتیبانی مالی می‌کنید.
معایب : زمان زیادی می‌گیره - من واقعاً بلد کار نیستم - subscribe,like,comment نداشته باشه انگیزه خیلی پایین میاد - درآمدی نداره (حداقل اوایل کار) - درصورت عدم حمایت برندسازی خودم خراب می‌شه - از همه بدتر با توجه به اوضاع اینترنت ایران می‌ترسم خیلی دوستان نتونند روی یوتیوب تماشا کنند و همه موارد قبلی اتفاق بیوفته

اما خیلی دوست دارم یک راهکاری پیدا کنم که حداقل میزانی که خودم بلد هستم مطالب مورد نیاز رو منتقل کنم به دوستان.

همچنان به دنبال راهکار
(ساعت دقیقاً ۵:۳۱ دقیقه صبح هست، و من به تازگی جلسه‌ام تموم شد و این متن رو داغ داغ نوشتم)
51👍101👎1
Python Hints
توی این هفته ۴ بار، یک سوال مصاحبه قدیمی رو در موردش صحبت پیش اومده؛ داستان چیه، من چندین سال پیش با یک شرکت مصاحبه داشتم و مصاحبه کننده ازم یک سوال Data structure & Algorithm پرسید، من سوال رو خیلی سریع توضیح دادم و بعد خیلی سریع هم پاسخ صحیح رو نوشتم،…
پیشنهاد، انگلیسی بودن ویدئوها بیشترین پیشنهاد بود
ولی نه ممنون،
منبع انگلیسی به وفور پیدا می‌شه با آدم‌هایی که فن بیان و تجربه تدریس بسیار بسیار بیشتری از من دارند.

هدف من جامعه برنامه‌نویسی ایرانی هست، بخصوص تازه‌کار‌ها و افرادی که به زبان انگلیسی مسلط نیستند (دارند یاد میگیرند یا ...)

پ.ن :
یوتیوب رو هنوز خیلی روش نیستم البته
خیلی دوس داشتم ی جای بزرگی داشتم، همه بچه‌ها رو جمع میکردم اونجا و همونجا دور هم تمرین می‌کردیم (طوریکه کرایه اتوبوس تا تهران رو هم حتی خودم میدادم)
اینجوری مطمئن بودم هرکسی علاقه داره حتماً می‌تونه یاد بگیره (اینترنت و ... محدودیتش نیست)

پیشنهاد پلتفرم پولی به من ندید، ممنون ♥️
32👍25👏41
پیشنهاد یوتیوب با توضیحات مختلف و مشورت‌هایی که از دوستان گرفتم بهترین مدل هست :

حقیقتش هنوز شخصا شک دارم به این موضوع (بهترین بودن)

اما یکی از دوستان که توی این زمینه کار کرده قرار شد بهم آموزش بده (احتمال زمان زیادی می‌بره) ولی فعلا گانال رو ایجاد کردم تا شروع کنم به یادگیری اگر واقعا یوتیوب گزینه خوبی باشه و چیزی که میخوام ازش در بیاد همین رو می‌تونیم ادامه بدیم

اینم آدرس یوتبوب (خواستم رزرو کنم تا کسی زیرش نزده؛ شماهم فعلا سابسکرایب کنید انگیزه بگیریم.)
اگر کسی هم تجربه داره خوشحال میشم ازش یاد بگیرم.

PyHints Youtube Channel Link

مرسی از همه دوستان و نظرات (تمام موارد رو درنظر گرفتم و درنظر خواهم داشت)
58👍10❤‍🔥1
Channel photo updated
Channel photo updated
روی هیچی پشتیبانی گرفتن
فقط جای تشکر داره ❤️

پ.ن : نمی‌دونم چرا ولی تعداد
subscribers
به یکباره از ۷۰ اومده روی ۱۹ (هنوز با قوانین و ... یوتیوب آشنایی ندارم و نمی‌دونم برای چی این اتفاق افتاده)
جالبه همچنان داره کمتر می‌شه 🧐
49❤‍🔥21👎1
#خارج_از_بحث

احتمالا شما هم با anti-adblock detector یوتیوب مواجه شدید و متوجه شدید تقریبا هیچکدوم از adblocker های معروف نمی‌تونند دورش بزنند.

شخصا دنبال این بودم که popup مربوط به بلاک شدن adblocker رو فیلتر کنم (اینجوری دیگه اخطار نمیاد و ویدئو رو میشه اجرا کرد) : اگر بررسی کنید یوتیوب با اینکه اون اخطار رو نشون میده اما توی پس زمینه ویدئو رو هم درخواست می‌کنه

این مورد رو پیدا کردم امیدوارم مفید باشه :
۱- اول uBlock رو نصب کنید
۲- بعد از نصب روی آیکونش کلیک کنید و به بخش dashboard برید (گوشه پایین سمت راست با علامت ۳ تا چرخ‌دنده)
۳- از منوی بالای صفحه وارد بخش My Filters بشید.
۴- توی ادیتور پایین همون صفحه این دستورات رو بزنید :
youtube.com##+js(set, yt.config_.openPopupConfig.supportedPopups.adBlockMessageViewModel, false)

youtube.com##+js(set, Object.prototype.adBlocksFound, 0)

youtube.com##+js(set, ytplayer.config.args.raw_player_response.adPlacements, [])

youtube.com##+js(set, Object.prototype.hasAllowedInstreamAd, true)


۵- روی گزینه apply changes کلیک کنید و یوتیوب رو بدون تبلیغات ببینید و لذت ببرید.

@PyHints
👍38933🌚3👎2