TorhamDev | تورهام 😳 – Telegram
TorhamDev | تورهام 😳
2.84K subscribers
421 photos
49 videos
21 files
591 links
code, linux and anything related.

• YouTube
youtube.com/@techwithtori

• CodeNaline Podcast
@CodeNaline

• Group
@GothamProgrammers

• Github
github.com/TorhamDev

• Email
torhamdev@gmail.com
Download Telegram
Forwarded from Python BackendHub
یک نکته ای داخل این ویدیو بود که نتونستم توی ویدیو بگم چون خیلی طولانی میشد و ربط مستقیم به تایتل ویدیو هم نداشت.. به عنوان یک برنامه نویس باید بفهمید چیکار دارین میکنید.

نظر شخصیم اینه که این مهم ترین اصل برنامه نویسیه. هر کدی که شما مینویسید باید بفهمید که دلیلش چی بوده؟ چرا اینکارو کردین؟ نکته ای که من متوجه شدم اینه که خیلی از دوستان واقعا دلایلی برای کاری که میکنند ندارن... . یعنی یک reasoning ای همیشه داشته باشید حتی به غلط. چون بالاخره هممون اشتباه میکنیم دیگه.. ولی باید بدونیم داشتیم چیکار میکردیم!

مثال میگم, کسی که کتاب two scopes django رو خونده باشه اونجا نویسنده میگه که تو جنگو تمام assert ها رد میشن موقعی که دیباگ رو false میذارین. دلیلش چیه؟ دلیلش اینه که شما وقتی پایتون رو آپتیمایز ران میکنید (و خود پایتونم از حالت دیباگ خارج میشه که با داندر دیباگ میتونید ببینید) یکی از کار هایی که میکنه تمام assertion هارو ایگنور میکنه. پس شما وقتی two scopes رو دارید میخونید باید بعد اون جمله ای که نوشته یک چرا بذارید و گوگلش کنید. چرا اینکارو میکردن؟‌ قطعا یک دلیلی دارن دیگه... جنگو core دولوپر ها که الکی کدی وارد جنگو نمیکنن... عمق اطلاعاتتون هم در همین راستا زیاد میشه.

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

مثال دیگه وقتی شما مینویسی router.post باید بدونید داره چه اتفاقی میفته. اینکه میاین validation حجم باینری فایل input رو توی خود روتر مینویسید یعنی عمق سواد HTTP نداشتین.
مثال دیگه اینکه داریم کد رو decouple میکنیم که reusable شه باید بدونید چرا داریم اینکارو میکنیم. برنامه نویسی جغرافی نیست. من دیدم بعضیا میگن چون فلان کتاب یا فلان شخص گفته, دنبال راه حل اونا نباشید تو مرحله اول شما باید صورت سوال رو درک کنید تا بعد بتونید راه حل اونا رو درک کنید.

اگه دارید یک تابع مینویسید باید دلیل بیارین که چرا تابع نوشتین. چرا کلس ننوشتین؟ خلاصه سعی کنید خط به خط همیشه فکر کنید که دارید چیکار میکنید و خودتون رو توجیح کنید. من شخصا اینکارو کردم و خیلی نتیجه مثبتی گرفتم تا از زمانی که اینکارو نمیکردم.

@ManiFoldsPython
👍7👌1🌚1
Forwarded from Nima Tech Talk 💻
🚀 خبر هیجان‌انگیز! 🚀

اولین محتوای انگلیسی خودم رو تو یوتیوب منتشر کردم با عنوان “چطور یک پروژه فرانت‌اند رو با استفاده از CDKTF روی AWS پیاده‌سازی کنیم”. این ویدیو یک راهنمای جامع برای کمک به توسعه‌دهنده‌ها، چه تازه‌کار و چه حرفه‌ای، برای پیاده‌سازی اپلیکیشن‌های فرانت‌اند روی AWS با استفاده از Cloud Development Kit for Terraform (CDKTF) هست.

🔗 الان ببینید:

How to deploy a Frontend project to "AWS", using " CDKTF"?
https://youtu.be/P1ZUJrzJNcs
5
Forwarded from Python BackendHub (Mani)
‌BenDev
درود دوستان مصاحبه سطح جونیور با آقا بهداد عزیز سری جدید ماک اینترویو رو داریم شروع می‌کنیم و لطفا در این فرآیند هرگونه ‍نظر مثبت و منفی دارین برام بنویسین که توی مصاحبه های بعد تغییر بدیم @BenDevelop https://www.youtube.com/watch?v=DJ6lHSp7gUo
یک پلی لیست عالی از امیربهادر 👌
دیدن ماک یکی از بهترین روش های یادگیریه.
مصاحبه انجام دادن مثل رزومه نوشتن یک اسکیله. لزوما کسی که دانش تکنیکال خوبی داره خوب مصاحبه نمیکنه. بخش خیلی زیادی از مصاحبه اسکیل communication هست که خیلی مهمه. لزوما کسی که بره تو یک مصاحبه ۳ تا سوال الگوریتمی حل کنه استخدام نمیشه و FAANG و شرکت های بزرگ تر برای اینکه فرصت چک کردن assignment ندارن و هزینه زیادی براشون میبره و لایو هم نیست رو به پرسیدن سوال های الگوریتمی آوردن‍, که البته هدفشون استخدام یک leet coder نیست‌(ولی سولوشن بهتری براشون وجود نداره یا هنوز پیدا نشده که بتونن یک سوالی رو طرح کنند و طرف بتونه با کد زدن حلش کنه و اسکیل communication اش هم نشون بده و عمق دانشش هم نشون بده)
و البته سوالای system design ای که میپرسن هم دوباره یک مکانیزمه که leet coder ای استخدام نکنن که communication خوبی هم داره.

من میخواستم خیلی وقت پیش یک repo بنویسم برای مصاحبه دادن (مثل رزومه نویسی)
ولی بعدش فهمیدم که اونقدر مصاحبه objective نیست و تا کسی مصاحبه ماک خوب نبینه چند تا مصاحبه نده قلقش دستش نمیاد. ولی نوشتن resume خیلی آبجکتیو هست که یک ریپو دارم در خصوص تکنیک های نوشتن رزومه.

یک نکته که اخیرا کشف کردم برای اپلای, اگه سطح زبانتون خوبه حتما درج کنید (مثلا اگه c1 هستین بنویسید که c1 هستین) چون واقعا خیلیا (حتی اروپایی و خارجی ها) خیلی خوب حرف نمیزنن. البته دروغ ننویسید چون قطعا باعث ریجکتتون میشه اگه بنویسید c1 بلدید ولی تو مصاحبه اول نتونید در حد c1 حرف بزنید.
@PyBackendHub
👍2
ساعت ۷ صبح بهتون خوش بگذره 🥰
😁6😭2🔥1🥰1🌚1
دوستان شهریار پس از سالها بلاخره پخت

حل کردن بازی Wordle با پایتون

https://shahriarshm.com/?p=104


@TorhamDevCH
😁5👍1👎1
دوستان همینک وب سرور خودم رو معرفی میکنم. آینده وب سرورها.
https://github.com/TorhamDev/its-a-webserver

فقط متد GET از HTTP/1.1 رو ساپورت میکنه 😂✌️
@TorhamDevCH
Houdini
Eminem
#music

خواستم بگم امینم برگشت 💀
https://youtu.be/22tVWwmTie8
موزیک ویدیوش حتما ببینید
❤‍🔥1👎1
Media is too big
VIEW IN TELEGRAM
Learn PostgreSQL Tutorial - Full Course for Beginners

دانلود کرده بودم برای مصارف شخصی گفتم شاید به دردتون بخوره. نسخه یوتیوبش هست. این برای اونایی که نت درست و درمون ندارن.
15
Forwarded from Sadra Codes
توی نسخه 0.6.3 پای‌اکشن، سرعت اجرای اکشن به دلیل Dependency Management بهینه‌تر، بهبود پیدا کرده و سریعتر شده.

و اینکه خروجی کامند pyaction run تمیزتر و بهتر شده. :))


More >> https://pyaction.imsadra.me/
1👍1
شاید برای شما هم سوال بود که چطور SQL کوئری‌هایی که با ORM جنگو میزنیم رو ببینیم؟

https://b0uh.github.io/django-show-me-the-sql.html

@TorhamDevCH
👍41
به نظرم یکی از بهترین اسکیل(مهارت؟)هایی که به عنوان یک برنامه‌نویس میتونید داشته باشید، توانایی تحقیق و جست‌وجو، یعنی چی؟
یعنی وقتی یک سوالی براتون پیش میاد سریع نرید دنبال اینکه جواب چیه. منظورم اینه که بدون درک کردن جواب صرفا جواب بدونید. مثل اون موقع‌هایی که داری گیم بازی میکنی تو یک مرحله میمونی و گوگل و بقیه جاهارو میگردی که فقط مرحله رو رد کنی، دقیقا هرکاری که طرف میکنه رو انجام میدی تا مرحله رو رد کنی:).
ولی خب شاید بهتر بود از همون اول دیالوگ NPCهارو میخوندی XD.
موضوع اینه که آدم فضایی‌ها نمیان به اون آدم‌ها بگن که چطوری اون مرحله کار میکنه یا راه حل فلان مشکل چیه، اون آدم‌ها صرفا انقدر صبور و کنجکاو بودن که دیالوگ NPCها رو بخونن. در نتیجه شماهم اگه سعی کنی دفعه بعد که مشکلی رو خوردید به جای جواب مستقیم به سمت جواب غیر مستقیم برید و اول موضوع و مشکل رو درک کنید احتمالا خیلی چیزهای بیشتری یاد میگیرید.

روشش هم ساده است.
به یک مشکل میخورید، مثلا ارور، اینجا دوتا مسیر پیش‌رو داریم.
مسیر اول ارور کپی میکنی گوگل یا این‌روزا با کلاس‌ترها GPTمیکنن و جواب مستقیم در میارید دوتا خط کد هم کپی میکنید یا تغییر میدید و پایان.

مسیر دوم: نوع ارور رو گوگل میکنید و سعی میکنید بفهمید اصلا چرا همچین اروری رخ میده، چه دلایلی هست که باعث این ارور میشه، اون دلیل اولی خودش چرا اتفاق میوفته؟ یکهو میفهمید کامپیوترا فلان چیز این‌شکلی هندل میکنن برای همون که شما این رو ایشکلی دادید بهش نتونسته هندل کنه و ارور خوردید، همینطوری پیش میرید و به یک دریا بینهایت از محتوا و دانش دست پیدا میکنید :)
خلاصه سعی ‌کنید ماهیگیری یادبگیرید.

@TorhamDevCH
👍15🔥11❤‍🔥11
ایونت لوپ چیست؟ درسته داخل js توضیح میده ولی این مفهوم همجا یک چیزه ما داخل Async پایتون هم ایونت لوپ رو داریم. و البته که یکم js یادگرفتن بد نیست :)

اگه یک نفر اینطوری js یاد میده، من برم js دولوپر شم 😂💔

https://www.youtube.com/watch?v=8aGhZQkoFbQ
👍1
یک نکته درباره primary key داخل #جنگو اینه که شما میتونید برای هر app به شکل خاص primary key خاص خودش رو داشته باشید. مثلا برای یک app از big integer استفاده کنید و برای یکی از UUID این رفتار رو برای هر اپ میتونید به مشخص کردن AppConfig.default_auto_field مشخص کنید. حالا #django این قابلیت رو هم بهتون میده که جدا از انتخاب دونه دونه برای هر اپ یک حالت گلوبال در نظر بگیرید که اگر مخصوص اپ ست نکرده باشید از اون استفاده میکنه که پیش‌فرض خود جنگو BigIntegerField در نظر میگیره و میشه با تغییر دادن DEFAULT_AUTO_FIELD داخل settings.py به شکل گلوبال تغییرش داد

@TorhamDevCH
❤‍🔥22👍2
TorhamDev | تورهام 😳
یک نکته درباره primary key داخل #جنگو اینه که شما میتونید برای هر app به شکل خاص primary key خاص خودش رو داشته باشید. مثلا برای یک app از big integer استفاده کنید و برای یکی از UUID این رفتار رو برای هر اپ میتونید به مشخص کردن AppConfig.default_auto_field…
این توانایی که خود #جنگو بهتون میده ولی از trick دیگه هم میتونید استفاده کنید و اون هم ساختن یک مدل ابسترکت و بقیه مدل‌ها ازش ارث ببرن.
مثال:

from django.db import models 
from uuid import uuid4


class Base(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True)

class Meta:
abstract = True


از اونجایی که اگه داخل مدل #django فیلدی داشته باشید که داخلش primary_key مقدار True داشته باشه جنگو دیگه از اون مقدار دیفالتی که مشخص کردید (هردو حالت دو پیام بالا) استفاده نمیکنه و میاد از این فیلد استفاده میکنه. حالا شما میتونید بقیه مدل‌هاتون رو از این مدل ارث بری کنید و دیگه نگران مقدار id نباشید.

@TorhamDevCH
41👍1
کوئری‌های #جنگو lazy هستند

اما این یعنی چی؟ کلا برای فهمیدن موضوع lazy فکر کنم این ویدیو شهریار شریعتی (Laziness in Python تنبلی در پایتون ) خوب باشه و بتونید بفهمیدش، یا اینکه نسخه انگلیسی از Computerphile.

به این مثال توجه کنید:

>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)


این مثال خود داکیومنت جنگوعه. اینجا با ۳ تا کوئری زدیم و یکچیزی از دیتابیس درخواست کردیم، حالت عادی با خودتون میگید خب الان ۳ بار دیتابیس hit شده (درخواست رفته براش) اما در حقیقت فقط یک بار دیتابیس هیت شده و اون هم تو خط آخر جایی که کوئری رو پرینت کردیم. جنگو تنها و تنها زمانی دیتابیس رو با کوئری که شما زدید hit میکنه که دیتا رو درخواست کرده باشید. حالا چه پرینت باشه چه حلقه بزنید روش و ... و این نتیجه لیزی بودن کوئری هاست. تو کد بالا در حقیقت خط اول یک کوئری ساختیم، خط دوم یک فیلتر به همون کوئری اضافه کردیم و در نتیجه یک کوئری جدید ساخته شده و خط سوم هم همینطور و در نهااااااااااایت در خط چهارم یک کوئری به دیتابیس زدیم که داخش گفته هدلاین با what شروع شده باشه تاریخ پابلیش کوچیکتر از امروز باشه اونایی رو میخام که داخل بدنه شو کلمه food وجود داره.

@TorhamDevCH
6👍2
خب من یک چیز خیلی جالب و در این حال گیج‌کننده درباره ORM #جنگو فهمیدم.

تو پیام قبلی گفتم که کوئری‌های #django دقیقا چه زمانی واقعا اجرا میشن. اما اینجا یک نکته دیگه‌ای هم هست، جنگو نتیجه کوئری‌هارو کش میکنه.

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

اول این قانون تو ذهنتون داشته باشید: هر چیزی که باعث ایجاد یک QuerySet جدید بشه، باعث هیت به دیتابیس خواهد شد اگر اون کوئری اجرا بشه.

به مثال زیر دقت کنید:

users = User.objects.all()
print(users)

if users:
for u in users:
print(u)


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

اما اگر من بگم فقط دو بار دیتابیس هیت میکنه چی؟

بزارید توضیح بدم. تو خط اول ما صرفا کوئری رو ساختیم و هیچ هیتی به دیتابیس نزدیم. تو خط دوم ما کوئری پرینت کردیم و اینجا اولین هیت به دیتابیس خورده میشه، ولی یک نکته اینجاست وقتی شما یک کوئری رو پرینت میکنید جنگو نمیاد کل کوئری رو اجرا کنه چون منطقی نیست!، مثلا اگر کوئری شما هزارتا خروجی داشته باشه شما اون هزارتا رو که داخل پرینت نمیخایید، در نتیجه جنگو فقط یک بخش از کوئری رو ران میکنه یا به عبارت دیگه از LIMIT استفاده میکنه!. تو این خط هیچ کش کردنی اتفاق نمیوفته(جلوتر میگم چرا)

خط بعدی ما از if استفاده کردیم و اینجا یک هیت دیگه به دیتابیس میخوره اما این‌بار کل کوئری اجرا میشه و اینجاست که جنگو ریزالت کوئری میگیره و داخل کش ذخیره میکنه. تو خط بعدی که اومدیم حلقه زدیم روی کوئری جنگو دیگه نمیاد به دیتابیس درخواست بزنه و از کش استفاده میکنه!

در نتیجه اینجا فقط ۲ بار دیتابیس هیت میخوره.

ادامه داخل پیام بعد...

@TorhamDevCH
👍11❤‍🔥3🆒21
TorhamDev | تورهام 😳
خب من یک چیز خیلی جالب و در این حال گیج‌کننده درباره ORM #جنگو فهمیدم. تو پیام قبلی گفتم که کوئری‌های #django دقیقا چه زمانی واقعا اجرا میشن. اما اینجا یک نکته دیگه‌ای هم هست، جنگو نتیجه کوئری‌هارو کش میکنه. و این خیلیییییییییییی مهمه، یعنی بعضی از جاها…
خب از ماجرا و گفته‌های خود داکیومنت جنگو میتونیم نتیجه بگیریم که جنگو زمانی یک ریزالت یک کوئری رو کش میکنه که کوئری کاملا اجرا بشه. یعنی داخل پرینت که بخشیش فقط اجرا شد کش اتفاق نمیوفته ولی داخل if کش اتفاق میوفته.
حالا شاید براتون سوال بشه کش رو چطوری میشه دید؟ میتونید با استفاده از _result_cache ببینیدش، اینطوری:


users = User.objects.all()
print(users)
print("Cache: ", users._result_cache)

if users:
print("Cache: ", users._result_cache)
for u in users:
print(u)


خروجی این خواهد بود: ( اگر فقط یک یوزر داشته باشیم)


<QuerySet [<User: torham>]>
Cache: None
Cache: [<User: torham>]
torham



همینطور که میبینید بعد از اجرا کردن پرینت رو کوئری کش هنوز None ( اینجا یکم شاید فهمیدنش سخت بشه با یکدونه یوزر ولی فکر کن هزارتا یوزر داریم پرینت فقط ۱۰ تاشو نشون خواهد داد)
پس بعد پرینت کش اتفاق نیوفتاد. ولی بعد از اینکه if اجرا شد کش پر شد و از اون به بعد جنگو از کش استفاده میکنه. البتهههههههه یک سری نکته هست که برمیگرده به قانونی که تو پست قبل گفتم. برای مثال:


users = User.objects.all()
print(users)

if users:
for u in users.values("username"):
print(u)



تو این کد اینبار ۳ بار کوئری به دیتابیس میخوره. چرا؟ چون وقتی از .values استفاده میکنید یک QurySet جدید میسازید و اون کوئری‌ست کش جدا خودش رو داره و از اونجایی که کشش خالیه در اون لحظه جنگو یک درخواست دیگه به دیتابیس خواهد زد :)

پایان\

@TorhamDevCH
👍7🆒41