Python BackendHub
7.38K subscribers
308 photos
46 videos
11 files
427 links
Learning python & Backend Engineering, with Mani!

Youtube: https://www.youtube.com/@GitOverHere
Github: https://github.com/ManiMozaffar
Linkedin: https://www.linkedin.com/in/manimozaffar

تبلیغات نداریم

Admin: @Mani_nikou
Download Telegram
چند هفته قبل یک سمینار یک ساعته داشتم در خصوص استفاده از chatgpt میتونید از لینک زیر‌ خلاصش رو بخونید.
https://github.com/ManiMozaffar/use-chatgpt-like-a-pro
حتی میتونید شما data های روز رو اینجکت کنید. مثلا ذاتا برای chatgpt جنگو نسخه ۴ تعریف نشده ولی میتونید براش تعریف کنید.


اگه دسترسی ندارین به سایت chatgpt یا میخواین از مدل turbo 3.5 استفاده کنید که تو حالت رایگان ازش استفاده نمیشه میتونید از theb.ai استفاده کنید. یکی از کامل ترین سایت های alternative ای هست که دیدم دقیقا مارک داون های مختلف chatgpt مثل تیبل و کد نویسی رو ساپورت میکنه و خود صاحبشم هزینه turbo 3.5 رو از جیبش میده, حالا به چه هدفی رو اطلاعی ندارم :))

الان ابزار های بهتری اومده که با استفاده از همون API چت جی پی تی پیاده شده که بهترینش autogpt هست. برای این نیاز به openai api key دارین که فقط تو اکانت پرمیوم 20 دلاری فکر کنم بشه گرفت.
https://github.com/Significant-Gravitas/Auto-GPT


مثال: اگه برای یک شرکت دارین چت بات یا پشتیبانی زنده با chatgpt مینویسید یادتون باشه که مدل هارو بخونید و راجب هر کدوم خوب تحقیق کنید. صرفا chatgpt 3.5 turbo بهترین نیست و اگه prompt طولانی دارین و میخواین مثل تپسی چت باتتون تبلیغ اسنپ رو نکنه باید از Fine-tuning model استفاده کنید که هم هزینه رو کاهش میده و هم قیمتش کمتر میشه و هم پرفومنس بهتری داره براتون و هم جوابای سمی به کاربراتون نمیده.
https://platform.openai.com/docs/models


@ManifoldsPython
👍1
Forwarded from Meysam
چت جی پی پلاگین سرچ رو برای کاربرای پلاس فعال داره، یعنی چیزی بپرسید می‌ره سرچ می‌کنه جواب بهتر میده.
حتی اگه مربوط به زمانی بعد از تاریخ ترینش باشه.

(بعضیا هنوز ندارنش، شاید به مرور برای همه موقعیت های مکانی ریلیز میشه)
یک تکنیک خیلی باحال امروز کشف کردم و اونم استفاده از chatgpt بود برای اینکه رزومتون رو کاستومایز تر کنید.

مثلا برای این شغل به من 8 از 10 داده و گفته این موارد رو missing داری ✌️

خیلی بهتون کمک میکنه که سریع برید سراغ major point هایی که میتونید برای اون شغل کاستومایز کنید.

خلاصه اینکه از chatgpt غافل نشید 😅

پی نوشت: اگه متوجه نشدین داستان چیه حتما ریپو زیر بخش snipe advertisement رو بخونید.
https://github.com/ManiMozaffar/awesome-resumes

@ManifoldsPython
👍1
نکته: سعی کنید تو جمله بندی از chatgpt استفاده نکنید یا اخرش از AI های دیگه هم برای rephrase متنتون استفاده کنید.
دوستانی که به دلیل تحریم دسترسی ندارن به GCP یا AWS
یکی از راه هایی که میتونید دسترسی مستقیم به صورت رایگان بگیرین 30 day challenge هست
https://go.qwiklabs.com/30-day-challenge-120

معمولا qwiklabs یا سایت های مشابه همچین چیزی میذارن که به شما 30 روز تریال مجانی همراه با اموزش و به صورت interactive با دسترسی مستقیم به cloud های مختلف میدن که متاسفانه اینی که براتون فرستادم ژانویه تموم شده ولی احتمالا بازم در آینده بذارن. فقط کافیه تو چند پلتفورم دنبالشون کنید تا بهتون این دسترسی رو بدن.
تو گوگلم بگردین learning platform های مختلف برای جذب مخاطب زیاد از این حرکتا میزنن

@ManifoldsPython
2👍1
همچین پستی دیدم تو لیندکین، ولی اصلا حال نکردم 🤷‍♂️ به شخصه روش جونیور رو ترجیح میدم،

Simple is better than complex
کمتر تایپ میکنید
دستتون باز تره و میتونید لاگ بندازین

نظر شما چیه؟ کامنت کنید
👍8🔥1
اگه از دوره دیدن خوشتون میاد, این 4 دوره مجموعا 100 ساعته. به هیچ وجه از دستش ندین, خیلی فوق العاده هست و سبک تدریس مدرسشو خیلی دوست دارم, پروژه تمرینی هم داره. نمیدونم پروژه های تمرینیش تو git.ir باشه یا نه ولی قاعدتا باید باشه.
بدون شک, بهترین مدرسی هست که دیدم. از نمرات دوره باید این موضوع بدیهی باشه!

لینک
@ManiFoldsPython
👍7👎1
خودم 5-6 ماه پیش دیدم, الان دوباره برگشتم سراغش 😁
از همین کورس,
یک بحثی تو پایتون هست به نام circular reference که خلاصه بخوام بگم میشه همچین سناریویی:
class MyClass:
def __init__(self, value):
self.value = value
self.next = None

def set_next(self, obj):
self.next = obj

obj1 = MyClass(1)
obj2 = MyClass(2)
obj1.set_next(obj2)
obj2.set_next(obj1)
حالا فکر کنید داندر متود del رو داره کلسمون. (دیستراکتر) که معمولا برای clean up میتونیم تعریف کنیم مثلا برای بستن کانکشن دیتابیس یا پاک کردن فایل یا..
خب اگه دو آبجکتی که دیستراکتر دارن داخل circular reference, برای پاک کردن حتی یکیشون از کجا gc میفهمه که اول باید کدوم دیستراکتر رو اجرا کنه؟ تو ورژن قبل تر از پایتون 3.4, میگفتن بیخیال پاکش نمیکنیم این uncollectable هست و هرچی از این reference ها بیشتر میشد باعث مموری لیک بیشتری میشد تا جایی که کار دستتون میداد این مموری لیک.

حالا برای اصلاحش تو ورژن 3.4 چیکار کردن؟ اومدن از الگوریتمی به اسم Deferred Finalization استفاده کردن که تو لینک زیر مفصل تر توضیح داده و میتونید بخونید, امیدوارم که کنجکاوتون کرده باشم 😁
لینک
👍6
Python BackendHub
از همین کورس, یک بحثی تو پایتون هست به نام circular reference که خلاصه بخوام بگم میشه همچین سناریویی: class MyClass: def __init__(self, value): self.value = value self.next = None def set_next(self, obj): self.next = obj obj1…
از من سوال پرسیدن که ایا این همون Generational GC نیست؟

تفاوت اصلی اینجاست که در Generational GC، تمرکز بیشتر روی مدیریت حافظه برای object با طول عمر کوتاه تره. برای همین به جای اینکه تمامی object ها (از جمله آن‌هایی که lifetime زیادی داشتن) مورد بررسی قرار بگیرن, اونایی که لایف تایم کوتاه تری داره بیشتر مورد بررسی قرار میگیرن تا مدیریت حافظه بهینه تر پیاده سازی شه. اتفاقا تو مموری لیک هم کاربرد داره و جلوگیری میکنه چندین جا ولی اینجا نه اصلا ربطی نداره.

ولی Deferred Finalization بیشتر یک تکنیکه که اجازه میده gc میاد ابجکت هایی که داندر متود دیلیت یا همون دیستراکتر رو دارن به صورت امن و سیف کالکت کنه که تا اونجایی که من فهمیدم میاد از نسخه 3.4 گاربیج کالکتور میاد ابجکت هارو دو دسته میکنه. اونایی که del دارن و اونایی که ندارن. اونایی که ندارن که هیچ تکلیفشون معلومه.

اونایی که دارن, میاد تلاش میکنه که کانکشن دو آبجکت رو از بین ببره. چطوری؟ از دو طرف چک میکنه که از کدوم طرف اون آبجکت در دسترس هست. از اون طرفی که تلاشش موفقیت امیز بود وارد میشه و reference cycle رو کلا از بین میبره.
وقتی دو تا ابجکت دیگه reachable نبودن حالا میاد gc جفتشونو جدا جدا کالت میکنه و حالا del رو اجرا میکنه.


حالا قسمت جذاب اینجاست, اگه تلاش کرد ولی نشد چی؟
اگه نشد یعنی اینکه این دوتا دیستراکتور این دو آبجکت باهم ارتباط داشتن. اون موقع مقصر خودتونید یعنی pattern design ای استفاده کردین که تو کار gc تداخل ایجاد میکنه و مموری لیک میشه چون وقتی gc نتونه این reference cycle رو از بین ببره اونوقت دیگه مموری لیک داریم و خدا اون روزو نیاره که بخواین memory leak رو دیباگ کنید 😅

برای همین میگن که خیلی دیستراکتور reliable نیست و وقتی ازش استفاده میکنید باید حداقل dependacy رو داشته باشه رو variable و ابجکت های دیگه.
👍1
حالا برسیم به چالش پروژش که برای من بود و هنوزم هست :))

https://github.com/ultrafunkamsterdam/undetected-chromedriver

این لایبری رو میبینید؟ جناب آقای ultrafunkamsterdam که اونرشیپشو دارن, بسیارم تو حوضه خودشون مهارت دارن ولی متاسفانه هرجا دستشون میرسیده اومدن از دیستراکتور استفاده کردن. نتیجش چی شده؟ سوکتایی که تو chrome devtool protocol باز میشن دیگه بسته نمیشن :)) چرا؟ چون دیستراکتور هیچوقت اجرا نمیشه و gc هیچوقت کالتکشون نمیکنه. چه اتفاقی میفته ؟ کانکشن لیک میشه و port exhaustion, تمام پورت های سیستم مشغول میشه و شما تا اسکریپت رو متوقف نکنی و دوباره راه نندازی کار نخواهد کرد.

من چیکار کردم؟ process id رو میفرستم سمت سرور خودم بعد با bash script چک میکنم که ایا این process id باید سوکتاش بسته میشده یا نه؟ اگه بسته میشده که force kill میکنم. اگه نه در حال رانه که کاری ندارم باهاش.

خلاصه کلام, تا وقتی memory management و gc رو خوب تو پایتون درک نکردین با __del__ ور نرید 😁

و سورس کد لایبری هایی که هم استفاده میکنید و contributor کمی داره حتما بخونید. یا حداقل متود هایی که ازش استفاده میکنید یا کلس هایی که استفاده میکنید. برای همین همیشه توصیه میکنم برای بحث data scraping با مرورگر اگه میخواین دیتکت نشین از playwright استفاده کنید مثل پروژه لینکدین من.
چون بخواین از سلنیوم استفاده کنید یا باید
1. کد کثیف این آقا رو تمیز کنید که خودش زمان زیادی میبره
2. یا باید چرخه رو دوباره درست کنید و یک لایبری شبیه لایبری ایشون درست کنید


(حالا این یک قسمت داستانه, بقیه قسمتای سمش رو باید برید تو سورس کد بخونید. هردفعه میاد یک کروم دانلود میکنه بعد آپش میکنه :)) خب مرد مومن همونو ذخیره کن رو هارد دیسک که برای بالا اومدن هر کروم چند دقیقه معطل نباشیم. چرا اینکارو کرده؟ خدا میدونه. البته executable path هم میگیره که دیگه دانلود نمیکنه ولی اونوقت کروم آپدیت شه کرومتون بالا نمیاد. اون موقع حالا باید bash اسکریپت بنویسید که جلوی آپدیت کروم رو بگیره که خود این موضوع در تضاده با هدف اصلی لایبری, که میشه دیتکت نشدن! )
تو کدوم مورد reference count بیشتره؟
a یا c یا e?
چرا؟

@ManiFoldsPython
Python BackendHub
تو کدوم مورد reference count بیشتره؟ a یا c یا e? چرا؟ @ManiFoldsPython
تو کامنتا به جواب نسبتا درست اشاره کردن
Integer caching (-5, 256) in python

اما یک ایرادی داره, به این کار میگن integer interning. تفاوتش با کشینگ چیه؟

تو کشینگ شما reference میسازین به آبجکتی که ساختین تا دوباره آبجکت ساخته نشه
ولی تو interning شما از reference ای استفاده نمیکنید, بلکه مستقیم از همون memory address و آبجکت استفاده میکنید. یعنی این وسط دیگه reference ای ساخته نمیشه که طبیعتا سریعتر هم هست! که خب تو پایتون اومدن این رنجی که دوستمون گفتن رو intern کردن چون خیلی استفاده میشد و جای اینکه هربار بخواد اون آبجکت ساخته شه و کالکت شه گفتن دیگه یکبار ساخته شه برای همیشه.

حالا به چه کار شما میاد اصلا این اطلاعات؟ فکر کنید تو پروژه ای دارین کار میکنید که مثلا NPL هست. دیتا زیادی دارین و استرینگ هست. خب تو حالت عادی بخواین هربار برای هر کلمه که استفاده میشه و صدا میشه شما یک memory address بهش اختصاص بدین اونوقت مموریتون پر میشه از string های تکراری. یعنی چی؟
مثلا
a = 'Hello World'
b = 'Hello World'
این دو تا ذاتا استرینگ هستن, ولی وقتی equal test رو انجام میدین متوجه میشین که پایتون اومده a رو یکجایی ذخیره کرده و b رو یکجای دیگه. وقتی از is استفاده میکنید درواقع پایتون میاد چک میکنه که
a is b
> False

ولی
a = 2
b = 2
a is b
> True

a = 257
b = 257
a is b
> False

توجه کنید که interning جدا از مموری کمتری که میگیره پرفومنس هم تا 30 برابر تو test ای که خودم نوشتم سریعتر میکرد (نسبت به __eq__ ). حالا تو NPL چطور از interning استفاده میکنن؟

import sys
a = sys.intern("Hello World")
b = sys.intern("Hello World")
a is b
> True

c = "Hello World"
a is c
> False

میتونه برای data mining هم خیلی مفید باشه و crawler هایی بنویسید که حجم زیادی رو از دیتا scrap میکنن و تو مموری نگه میدارن بدون اینکه مموری خیلی سریع پر شه تا اون پروسه write/read ریزالت هم به صورت منظم تر و efficient تر انجام شه.


حالا بازم بگین چرا بشینم 130 ساعت دوره ببینم 😁
@ManiFoldsPython
👍4
یکی از فیلم هایی هست که من تو bookmark ام سیو دارم و هر هفته میبنیم!

https://www.youtube.com/watch?v=u_ktRTWMX3M

حتما ببینید. دیدنش رو به هرکسی توصیه میکنم. بهترین speech ای هست که عمرم شنیدم.

میگه من وقتی شمارش رو شروع میکردم که موقع ست زدن, بدنم درد میگرفت. بنظرم اینکه بگید من روزی میشینم یک ساعت دو ساعت میبینم یا 10 ساعت فرقی نمیکنه, اینکه خودتون رو به یک عدد محدود میکنید جالب نیست. تا جایی ادامه بدین که دردتون بگیره, اون موقع شروع کنید به شمردن :) حالا میخواد 1 ساعت باشه یا 10 ساعت.
@ManiFoldsPython
👍7
Forwarded from SorousH
تقریبا یه حرف رو دارن میزنن. چون این اعداد بیشترین استفاده رو دارن، توی startup عه interpreter پایتون میاد یه array از این اعداد رو همون اول میسازه و از اون به بعد به جای اینکه مثلا یه ۵ جدید بسازه میاد رفرنس به اون ۵ رو که قبلا ساخته شده برمیرگرده. این کارو میکنه تا درگیر از بین بردن آبجکت و دوباره ساختنش نشه. (همه این حرفایی که میزنم برای محیط REPL هست چون توی ماژول یکم چیزای دیگه هم داریم). حالا intern کردن string ها به همون دو منظوری که خودتون توضیح دادید هست. اینجوریه که یه تیبل هست از استرینگ هایی که intern میکنیم داره. هر string ای که پاس میدیم اول نگاه میکنه ببینه اونتو هست یا نه اگه بود رفرنس برمیگردونه.
البته پایتون یه سری استرینگ ها رو اتوماتیک خودش intern میکنه بدون اینکه بهش بگیم ولی خب implementation details هست. مثلا کافیه اسپیس بین hello world رو حذف کنید و دوباره تست کنید میبینید که intern شدن. (اسامی شبیه identifier ها intern میشن، قدیم شرط طول کاراکتر هم داشت ۲۰ تا بود الانو نمیدونم)

ولی موضوعی که در کل هست اینه که پایتون فقط با رفرنس کار میکنه. اگه sys.intern یا چمیدونم اون اعدادی که cache شدن و اینا رفرنسشون نیاد ، در سطح پایتون نمیشه باهاشون کار کرد متغیری هم که شما میسازید درواقع خودش یه رفرنس هست. متغیر ها یه اسم یا symbol هستن که اشاره میکنن به یه آبجکت توی مموری
یکی از حق ترین حرفایی که شنیدم

django allows you to write acceptable code with no studying of architecture principles. It does not allow you to write good code, but it protects you from writing very bad code. In fastapi you have ability to go both ways

@ManiFoldsPython
👍9
یک مشکلی که تو رزومه نویسی خیلی میبینم اینه که شما بولت پوینت مینویسید باید 2 نکته رو در نظر بگیرین:
1. حتما باید achievement تو رزومتون مشخص باشه. اینکه چیکار کردین فقط مهم نیست, اینکه چرا و چطور اونکارو انجام دادین هم خیلی مهمه.

2. اولین کسی که رزومتون رو میخونه HR هست, استفاده از کلمه های قلبمه سلمبه باعث نمیشه ایشون رزومتون رو بفرسته برای تیم بک اند یا IT. باید متقاعدشون کنید که این کلمات قلمبه سلمبه به چه دردی میخورده برای کسی که technical نیست.

حالا از رزومه خودم مثال میزنم:
•Constructed a systematized transaction system with PostgreSQL replication, indexing and materialized views, for efficiency and high volumes.


خب HR وقتی اینو میخونه متوجه میشه برای efficiency and high volumes و scale بیشتر این کارا رو انجام دادم با استفاده از PostgreSQL. (مثلا فرض میگیریم PostgreSQL تو متن آگهی بوده)
به چه دردی میخورده؟ یک سیستم تراکنش بوده


و تیم IT حالا میخونه که شما چطور اینکارو انجام دادین. replication, indexing and materialized views


حالا من خیلی ترویجه که میبینم:
Used replication, indexing and materialized views


خب این خیلی بده! نه HR میفهمه چی گفتین نه تیم بک اند میفهمه چرا اینکارو کردین.

@ManiFoldsPython
👍7