Syntax | سینتکس – Telegram
توضیح درباره Htmx

htmx چیست؟
یک کتابخانه جاوا اسکریپت است که امکان دسترسی به ویژگی‌های مدرن مرورگرها را مستقیماً از طریق HTML فراهم می‌کند. این کتابخانه با استفاده از ویژگی‌هایی مانند AJAX، CSS Transitions، WebSockets و Server Sent Events، توسعه رابط کاربری مدرن را با سادگی و قدرت هایپرتکست امکان‌پذیر می‌سازد.

نصب htmx
برای استفاده از htmx، می‌توانید از CDN استفاده کنید یا فایل htmx.min.js را به پروژه خود اضافه کنید.

به عنوان مثال:
<noscript src="https://unpkg.com/htmx.org@1.9.11"></noscript>

مثال‌های htmx
در زیر چند مثال از کاربرد htmx آورده شده است:

AJAX
<!-- دکمه‌ای که با کلیک کردن، یک درخواست AJAX ارسال می‌کند -->
<button hx-post="/clicked" hx-swap="outerHTML">کلیک کنید</button>

این دکمه با استفاده از ویژگی‌های hx-post و hx-swap، به htmx می‌گوید که با کلیک کردن روی دکمه، یک درخواست AJAX به آدرس /clicked ارسال کند و محتوای دکمه را با پاسخ HTML جایگزین کند¹.

مثال 2:
بارگزاری lazy
<!-- محتوایی که به صورت lazy بارگذاری می‌شود -->
<div hx-get="/lazy-content" hx-trigger="revealed">
  More content...
</div>

این مثال نشان می‌دهد که چگونه می‌توان محتوایی را با استفاده از hx-get و hx-trigger به صورت lazy بارگذاری کرد، به طوری که هنگامی که کاربر به انتهای صفحه می‌رسد، محتوای جدید بارگذاری می‌شود.

برای مثال‌های بیشتر و جزئیات کامل‌تر، می‌توانید به مستندات htmx مراجعه کنید.

Documentation:
https://htmx.org/docs

Examples:
https://htmx.org/examples/

(6) آشنایی با HTMX – دیگر به جاوا اسکریپت نیازی ندارید! - راکت.
https://roocket.ir/articles/htmx

#htmx

@Syntax_fa
👍8
در اکثر پروژه های نرم افزاری این که یک مشکلی چطور حل میشه اصلا برای کارفرما مهم نیست، اونا به دنبال نتیجه و راهکار هستند. راهکاری که درد و مشکلشون رو رفع کنه.
اگر در ارتباط با کارفرما بیش از حد به مسائل فنی و جزئیات پیاده سازی بپردازید، اون رو می ترسونید و به شکایت کارفرما نزدیکتر خواهید شد.

10 توصیه مهم هم از من بشنوید برای اینکه ارتباط بهتری با کارفرما بگیرید و در نهایت حال خوب شما و اون بیشتر باشه:

1. اول از همه، وقت بذارید تا بفهمید کارفرما دقیقاً چی از شما میخواد. این یعنی سؤالات دقیق بپرسید و با تمام وجود گوش کنید، فعالانه گوش کنید!

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

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

4. روی این تمرکز کنید که چطور راهحلهاتون میتونند به کارفرما کمک کنند تا به اهدافش برسه. در نهایت باید درد اون برطرف شه.

5. به کارفرما گزینههای مختلفی ارائه بدید و برای هر کدوم مزایا و معایب رو شرح بدهید تا بتونه یک تصمیم آگاهانه بگیره. می خواید کاریزماتیک تر باشی، نظر قاطعانه خودتون در مورد گزینه ای که برای کارفرما بهتر هست رو هم مطرح کنید.

6. توی جلسات به موقع حاضر بشید، ارائههاتون رو منظم و حرفهای انجام بدهید و باز اینجا مراقب باشید فنی گویی بیش از حد نداشته باشید!

7. از کارفرما بخواید تا در طول فرایند، نظراتش رو با شما به اشتراک بذاره. این طوری اونها حس میکنن که واقعاً بهشون اهمیت میدید.

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

9. صبور باشید و برای پاسخگویی به سؤالات، همیشه آماده باشید.

10. و در آخر اینکه، نشون بدید که شما به دنبال یادگیری و بهبود مداوم هستید تا بتونید بهترین خدمات رو به کارفرما ارائه بدید.

link

#note

@Syntax_fa
👍11
چند نکته طلایی موقعی که دارید از django orm استفاده می کنید.

(قسمت اول)

1. کوئری ست هارو کاربردی بزنید:
از filters و annotations و aggregation استفاده کنید تا فیلد هایی که نیاز دراید رو با کمترین سربار دریافت کنید.
همچنین از متد defer و only برای محدود کردن فیلد هایی که قراره از دیتابیس بگیرید استفاده کنید تا optimize تر بشه کوئری شما و همچنین مصرف مموری نیز کمتر بشه.

# Fetches specific fields to avoid unneccessory fields fetch and store into the memory
blogs = Blog.objects.only('noscript', 'is_active').filter(category='tech')


2. ایندکس کردن:
استفاده کردن از ایندکس کلید افزایش کارامدی و سرعت کوئری های شما هستش.
هر فیلدی که قراره زیاد توی Where استفاده کنید رو پیشنهاد میشه ایندکس کنید.

# Adding an index to the "category" column for faster searches via category
class Blog(models.Model):
noscript = models.CharField(max_length=100)
category = models.CharField(max_length=50, db_index=True)
# ...


همچنین ممکنه ایندکس کردن مخرب هم باشه. به این لینک سر بزنید:
https://python.plainenglish.io/mastering-the-art-of-meeting-database-indexing-needs-8b891e74794b

3. کوئری ها بصورت defer اجرا میشن!!
جنگو orm از این روش استفاده می کند تا کوئری ها تنها زمانی اجرا بشن که شما بهشون نیاز دارید. یعنی وقتی شما مینویسید
users = User.objects.all()
این کوئری اجرا نمیشود، تا زمانی که شما از مقدار users استفاده کنید.
همچنین اگه شما حواستون نباشه ممکنه یک اشتباه خیلی بزرگ انجام بدید. به مثال زیر دقت کنید:

# Queries are executed when data is actually needed, minimizing unnecessary hits
blogs = Blog.objects.all()
for blog in blogs:
print(blog.author) # Each blog's author query is executed here

تو این مثال هربار که blog.author رو میزنیم، یک hint سمت دیتابیس زده میشه.

4. از select_related و prefetch_related استفاده کنید.
این دو متد میتونن وقتی که توی مدلتون related دارید، تعداد کوئری هایی که سمت دیتابیس زده میشن رو خیلی کاهش بدن.
از select_related زمانی استفاده میشه که شما یک تک رابطه دارید. و از prefetch_related زمانی استفاده میشه که شما چندین رابطه دارید. مثلا:

# Reduces database queries using select_related when accessing related objects 
blogs = Blog.objects.select_related('author').all()
for blog in blogs:
print(blog.author)


# Retrieves related objects in separate queries using prefetch_related, improving performance
authors = Author.objects.prefetch_related('blogs').all()
for author in authors:
for blog in author.blogs.all():
print(post)


5. از n + 1 اجتناب کنید!
مشکل n + 1 زمانی اتفاق میوفته که شما میخواید مجموعه از آبجکت هارو بگیرید. مثلا فرض کنید مدل پست رو داریم. مدل پست n تا کامنت داره.
زمانی که شما میخواید تک تک کامنت هارو بگیرید و اطلاعاتش رو نشون بدید با n + 1 مواجه میشوید.
یک یعنی کوئری که برای گرفتن پست زده شده، و n تعداد کوئری هایی که برای گرفتن کامنت ها زده شده. از این قبیل مشکلات رو خیلی راحت میتونیم با select_related و prefetch_related برطرف کنیم و با یک کوئری اطلاعات تمامی کامنت هارو هم بگیریم(این رو هم در نظر بگیرید هر چقدر کامنت ها بیشتر باشه، کوئری که میزنیم سنگین تر میشه).
# Using prefetch_related to fetch related comments efficiently
blogs = Blog.objects.prefetch_related('comments').all()
for blog in blogs:
for comment in blog.comments.all():
print(comment)


link

#django #orm

@Syntax_fa
🔥11
Syntax | سینتکس
چند نکته طلایی موقعی که دارید از django orm استفاده می کنید. (قسمت اول) 1. کوئری ست هارو کاربردی بزنید: از filters و annotations و aggregation استفاده کنید تا فیلد هایی که نیاز دراید رو با کمترین سربار دریافت کنید. همچنین از متد defer و only برای محدود کردن…
چند نکته طلایی موقعی که داری از django orm استفاده می کنی.

(قسمت دوم)

6. افزایش پرفورمنس با استفاده از کش کردن.
کش کردن باعث میشه تعداد کوئری هایی که سمت دیتابیس میزنیم کاهش پیدا کنه. همچنین ریسپانس تایم دریافت اطلاعات خیلی کمتر بشه.
براش کش کردن می تونید از کش فریم ورک built-in جنگو استفاده کنید.
from django.core.cache import cache

# Retrieve posts from cache, if available
cached_posts = cache.get('all_posts')
if cached_posts is None:
cached_posts = list(Post.objects.all())
cache.set('all_posts', cached_posts)


7. وقتی صحبت از آپدیت کردن و دیلیت کردن چندین row می شه، جنگو دو متد به اسم delete و update در اختیار ما قرار داده تا با پرفورمنس بهتر و سربار کمتر عملیات آپدیت و دیلیت کردن رو انجام بدیم.
# Updating multiple posts' status in a single query
Blog.objects.filter(category='draft').update(status='published')


8. بررسی و آنالیز کردن:
برای بررسی و دیباگ کردن، ابزار های زیادی در جنگو وجود دارد. مانند django debug toolbar. آنالیز کردن کوئری ها باعث میشه متوجه باتل نک ها شویم و بتونیم پرفومنس کوئری هارو افزایش بدیم.

9. از متد explain جنگو orm استفاده کن!!
همیشه از این متد استفاده کنید تا مطمئن شوید کوئری sql که orm برای شما ساخته است بهینه است و همان چیزی است که شما می خواهید.

10. عملیات هارو داخل دیتابیس انجام بده، نه توی زبان برنامه نویسی!!
کار های پایه رو میتونی با متد filter و exclude جنگو orm انجام بدی.
انجام یک سری عملیات ها روی فیلد هارو با F expression انجام بده
از annotation و aggregation استفاده کن

link

#django #orm

@Syntax_fa
👍11
متد iterator در django orm

در Django ORM، متد iterator() یک ابزار کارآمد برای پردازش مجموعه‌های داده بزرگ است. این متد یک ایتراتور (iterator) را برمی‌گرداند که می‌توانید آن را برای دسترسی تدریجی به رکوردهای جدول استفاده کنید. این روش در مقایسه با متدهای معمولی مانند all() یا values() که تمام رکوردها را یکباره در حافظه بارگذاری می‌کنند، کارآمدتر است.

مثال کاربردی:
فرض کنید می‌خواهید یک فایل CSV را از رکوردهای یک جدول در پایگاه داده پر کنید. اگر تعداد رکوردها بسیار زیاد باشد، بارگذاری همه آنها در حافظه ممکن است باعث مشکلات مربوط به مصرف حافظه شود. در چنین مواردی، می‌توانید از iterator() استفاده کنید تا رکوردها را به صورت تدریجی پردازش کنید.

from django.core.files import File
from myapp.models import MyModel

# باز کردن فایل CSV برای نوشتن
csv_file = open('data.csv', 'w')

# نوشتن سرآیند (headers) در فایل CSV
csv_file.write('field1,field2,field3\n')

# استفاده از iterator() برای دسترسی تدریجی به رکوردها
for obj in MyModel.objects.iterator():
# نوشتن هر رکورد در فایل CSV
csv_file.write(f'{obj.field1},{obj.field2},{obj.field3}\n')

# بستن فایل CSV
csv_file.close()


در این مثال، ما از MyModel.objects.iterator() برای دریافت یک ایتراتور استفاده می‌کنیم. سپس با یک حلقه `for`، هر رکورد را به صورت تدریجی پردازش می‌کنیم و آن را در فایل CSV می‌نویسیم.

مزایای استفاده از iterator():

1. کارآمدی حافظه: رکوردها به صورت تدریجی در حافظه بارگذاری می‌شوند، بنابراین حافظه کمتری مصرف می‌شود.
2. پردازش تدریجی: می‌توانید رکوردها را یکی یکی پردازش کنید، بدون نیاز به بارگذاری همه آنها در حافظه.
3. سرعت بالا: معمولاً سریعتر از بارگذاری همه رکوردها در حافظه و سپس پردازش آنهاست.

توجه داشته باشید که iterator() فقط یک بار قابل استفاده است و پس از پایان حلقه، دیگر قابل استفاده نیست. همچنین، شما نمی‌توانید از فیلترها یا سورت‌کردن رکوردها با iterator() استفاده کنید. برای این کارها، باید ابتدا یک QuerySet معمولی ایجاد کنید و سپس از iterator() روی آن استفاده کنید.


وقتی از iterator استفاده می کنیم، سمت دیتابیس چه اتفاقی می افتد؟

زمانی که از iterator() در Django ORM استفاده می‌کنید، Django در سمت پایگاه داده یک "Server-side Cursor" را ایجاد می‌کند. این کارسر (Cursor) در واقع یک ابزار در سمت سرور پایگاه داده است که به شما امکان می‌دهد رکوردها را یکی یکی و به صورت تدریجی از پایگاه داده بخوانید، بدون اینکه نیاز باشد همه رکوردها را یکباره در حافظه بارگذاری کنید.

فرآیند کار با Server-side Cursor به این شرح است:

1. ایجاد کارسر: زمانی که از iterator() استفاده می‌کنید، Django یک درخواست SQL برای ایجاد یک کارسر در سمت سرور پایگاه داده ارسال می‌کند.

2. اجرای درخواست: سرور پایگاه داده درخواست SQL را اجرا می‌کند و یک کارسر ایجاد می‌کند که به صورت تدریجی می‌تواند رکوردها را بازیابی کند.

3. بازیابی تدریجی رکوردها: در هر بار که در حلقه for به رکورد بعدی می‌رسید، Django از طریق کارسر ایجاد شده، درخواست بازیابی رکورد بعدی را به سرور پایگاه داده ارسال می‌کند.

4. دریافت رکورد: سرور پایگاه داده رکورد بعدی را از طریق کارسر بازیابی می‌کند و آن را به Django برمی‌گرداند.

5. تکرار گام 3 و 4: این فرآیند تا زمانی که همه رکوردها بازیابی شوند یا حلقه for متوقف شود، ادامه می‌یابد.

6. بستن کارسر: پس از اتمام حلقه، Django درخواست بستن کارسر را به سرور پایگاه داده ارسال می‌کند.

استفاده از Server-side Cursor به این معنی است که رکوردها به صورت تدریجی از پایگاه داده بازیابی می‌شوند، بدون اینکه نیاز باشد همه آنها یکباره در حافظه لود شوند. این امر باعث صرفه‌جویی در مصرف حافظه و افزایش کارایی می‌شود، به ویژه زمانی که با مجموعه‌های داده بزرگ سروکار دارید.

#django #cursor

@Syntax_fa
👍11
چرا باید از F expression توی django orm استفاده کنیم؟

در Django ORM، F expressions یا عبارات F، یک راه قدرتمند برای انجام عملیات روی فیلدهای مدل در سطح پایگاه داده هستند. با استفاده از عبارات F، می‌توانید مقادیر فیلدها را در پایگاه داده بدون بازیابی و بروزرسانی در سطح کد Python تغییر دهید. این امر می‌تواند منجر به افزایش کارایی و جلوگیری از رخ دادن مشکلات race condition شود.

مثال کاربردی:
فرض کنید یک برنامه فروشگاه آنلاین دارید و می‌خواهید در هنگام خرید، تعداد موجودی کالا را کاهش دهید. می‌توانید این کار را با استفاده از عبارات F در Django ORM به شکل زیر انجام دهید:

from django.db.models import F

# مدل Product
class Product(models.Model):
name = models.CharField(max_length=100)
stock = models.PositiveIntegerField()

# مثال خرید یک محصول
product = Product.objects.get(name='iPhone')
product.stock = F('stock') - 1
product.save()


در این مثال، ما از F('stock') استفاده می‌کنیم تا به Django بگوییم که مقدار فعلی فیلد stock را از پایگاه داده بخواند. سپس، عملگر - را به این مقدار اعمال می‌کنیم تا یک واحد از آن کم شود. در نهایت، با استفاده از `product.save()`، مقدار جدید را در پایگاه داده ذخیره می‌کنیم.

مزیت استفاده از عبارات F در این مثال این است که عملیات کاهش موجودی در سطح پایگاه داده انجام می‌شود، نه در سطح کد Python. این امر از بروز مشکلات race condition جلوگیری می‌کند، زیرا اگر چندین کاربر همزمان سعی در خرید یک محصول داشته باشند، عملیات کاهش موجودی به درستی انجام خواهد شد.

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

from django.db.models import F

product.price = F('price') * (1 - F('discount_percent') / 100)
product.save()


در این مثال، ما از عبارات F برای محاسبه قیمت جدید محصول با توجه به درصد تخفیف آن استفاده می‌کنیم.

عبارات F همچنین با عملگرهای انضمامی (annotated aggregates) و عملگرهای مقایسه‌ای قابل استفاده هستند، که می‌تواند آنها را به ابزاری قدرتمند برای پردازش داده‌ها در سطح پایگاه داده تبدیل کند.

#django #orm

@Syntax_fa
🔥12
قبل مصاحبه یکاری هست که بنظرم حتما انجامش بدید!

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

اکثرا با خوشرویی بهتون جواب میدن و شمارو راهنمایی می کنن. همچنین اینکه پیگیر شرکت بودید یک پوینت مثبت به حساب میاد.

#interview

@Syntax_fa
👍25🏆2
چند تا سوال خوب تو سطح میدلول به بالا برای Back-end developer(python & django)

1. چگونه از race condition در برنامه‌های چند نخی (multi-threaded) یا چند کاربره (multi-user) جلوگیری می‌کنید؟ از چه تکنیک‌ها یا ابزارهایی استفاده می‌کنید؟

این سوال از متقاضی می‌خواهد تا درک خود را از مفهوم race condition و راه‌حل‌های آن نشان دهد. او باید به مواردی مانند قفل‌ها (locks)، عبارات F در Django ORM، عملیات‌های اتمیک (atomic) و همچنین استفاده از سیستم‌های صف (queuing systems) اشاره کند.

2. برای بهینه‌سازی پرس‌وجوهای پایگاه‌داده در Django چه تکنیک‌هایی را پیشنهاد می‌کنید؟ مزایا و معایب هر یک را توضیح دهید.

این سوال از متقاضی می‌خواهد تا دانش خود را در زمینه بهینه‌سازی پرس‌وجوهای پایگاه‌داده در Django نشان دهد. او باید به مواردی مانند ایندکس‌گذاری، انتخاب صحیح فیلدها، استفاده از select_related و prefetch_related، و همچنین کش‌کردن (caching) اشاره کند.

3. چگونه می‌توانید از حملات (Cross-Site Scripting یا XSS) و حملات (Cross-Site Request Forgery یا CSRF) در برنامه Django خود جلوگیری کنید؟

این سوال از متقاضی می‌خواهد تا دانش خود را در زمینه امنیت وب و جلوگیری از حملات رایج نشان دهد. او باید به مواردی مانند استفاده از django.utils.html.escape برای خروجی‌های HTML، تنظیمات SECURE_BROWSER_XSS_FILTER و `X_FRAME_OPTIONS`، استفاده از توکن‌های CSRF در Django، و همچنین تکنیک‌های دیگر مانند اعتبارسنجی ورودی‌ها اشاره کند.

4. چگونه از یک وضعیت deadlock در برنامه‌های چند نخی یا چند کاربره جلوگیری می‌کنید؟ راه‌حل‌های پیشنهادی شما برای مدیریت deadlock چیست؟

این سوال از متقاضی می‌خواهد تا درک خود را از مفهوم deadlock و راه‌حل‌های آن نشان دهد. او باید به مواردی مانند جلوگیری از اشتراک منابع، اولویت‌بندی درخواست‌ها، استفاده از الگوریتم‌های پیشگیری از deadlock مانند الگوریتم بانکر (Banker's Algorithm)، و همچنین استفاده از تایم‌اوت‌ها (timeouts) اشاره کند.

5. چگونه می‌توانید از مشکلات مربوط به حافظه در برنامه‌های Python خود جلوگیری کنید؟ راه‌حل‌های پیشنهادی شما برای مدیریت حافظه چیست؟

این سوال از متقاضی می‌خواهد تا دانش خود را در زمینه مدیریت حافظه در Python نشان دهد. او باید به مواردی مانند استفاده از ژنراتورها (generators) و ایتراتورها (iterators) برای پردازش داده‌های بزرگ، آزادسازی منابع به موقع، استفاده از کتابخانه‌های مدیریت حافظه مانند `tracemalloc`، و همچنین تکنیک‌های دیگر مانند پروفایل‌گیری (profiling) و بهینه‌سازی الگوریتم‌ها اشاره کند.

6. چگونه می‌توانید از مشکل N+1 Query در Django ORM جلوگیری کنید؟ راه‌حل‌های پیشنهادی شما برای این مشکل چیست؟

این سوال از متقاضی می‌خواهد تا درک خود را از مشکل N+1 Query و راه‌حل‌های آن در Django ORM نشان دهد. او باید به مواردی مانند استفاده از select_related و `prefetch_related`، بهینه‌سازی پرس‌وجوها با استفاده از ایندکس‌ها، و همچنین تکنیک‌های دیگر مانند کش‌کردن (caching) اشاره کند.

7. چگونه می‌توانید از مشکلات مربوط به مقیاس‌پذیری (scalability) در برنامه‌های وب جلوگیری کنید؟ راه‌حل‌های پیشنهادی شما برای بهبود مقیاس‌پذیری چیست؟

این سوال از متقاضی می‌خواهد تا دانش خود را در زمینه طراحی و پیاده‌سازی سیستم‌های مقیاس‌پذیر نشان دهد. او باید به مواردی مانند استفاده از معماری‌های چند لایه (multi-tier architecture)، پخش بار (load balancing)، افزونگی (redundancy)، کش‌کردن (caching)، شارد کردن (sharding) پایگاه داده، و همچنین تکنیک‌های دیگر مانند استفاده از سیستم‌های توزیع‌شده (distributed systems) و محاسبات ابری (cloud computing) اشاره کند.

8. چگونه می‌توانید از مشکلات مربوط به امنیت در برنامه‌های وب جلوگیری کنید؟ راه‌حل‌های پیشنهادی شما برای بهبود امنیت چیست؟

این سوال از متقاضی می‌خواهد تا دانش خود را در زمینه امنیت در برنامه‌های وب نشان دهد. او باید به مواردی مانند استفاده از رمزگذاری قوی، اعتبارسنجی ورودی‌ها، جلوگیری از حملات تزریق (injection attacks)، استفاده از پروتکل‌های امن مانند HTTPS، مدیریت دقیق دسترسی‌ها (access control)، و همچنین تکنیک‌های دیگر مانند به‌روزرسانی منظم سیستم‌ها اشاره کند.

#interview #backend

@Syntax_fa
👍15
Django ORM Tips Part 2.pdf
452.9 KB
نکته های کاربردی در Django ORM (بخش دوم)

خوب در ادامه تکنیک های استفاده از Django ORM رسیدیم به اینکه چطور میشه از annotate و aggregate استفاده کرد. به قطعیت توی پروژه های بزرگتر و عموما مبتنی بر اطلاعات کاربر و شخصی سازی ها میرسید به نقطه ای که لازم باشه فیلد های متفاوتی داشته باشید که بتونید در لحظه ایجاد و مبتنی بر اونها فیلتر سازی و یا حتی مرتب سازی انجام بدید که خوب annotate این کار رو براتون انجام میده و یا اینکه بخواید محاسباتی رو مبتنی بر داده های موجود انجام بدید و در جایی دیگر استفاده کنید که در این شرایط قطعا aggregate مناسبترین هستش.
اما در شرایطی پیش میاد که اصلا از orm استفاده نکنید ولی بتونین query مستقیم به دیتابیس بزنین در این صورت می تونین با استفاده از متد raw این کار رو انجام بدید. البته که بیشتر مواقع توصیه نمیشه ولی دونستنش بد نیست. یه زمانی دیده بودم که query raw لزوما سریعتر عمل می کرد.

موارد بررسی شده:

- aggregate
- annotate
- raw query

در نظر داشته باشید که این متد ها بر اساس نیاز شما قابل تغییر هستن و مثال ها فقط در جهت یادگیری هستش.

link

#django

@Syntax_fa
👍6
سوال مصاحبه: Sharding چیست؟

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

Sharding:

1.Range-based Sharing:
  در این روش در هر Shard بازه خاصی از مقادیر ذخیره میشوند. 

مثال: یک فروشگاه ممکن از order date یعنی زمان سفارش برای Sharding استفاده کند. داده هر ماه یا هر سال در یک Shard ذخیره میشود و وقتی query بیاید می دانیم که در کدام Shard دنبال داده بگردیم.

2. Hash-based Sharding
در این روش از یک تابع Hash برای تبدیل Partition Key به یک مقدار Hash شده استفاده می کنیم که مشخص می کند که هر داده را در کدام Shard ذخیره کنیم. 

مثال: یک شبکه اجتماعی را در نظر بگیرید که UserID را hash می کند و با توجه به مقدار آن داده کاربر را در آن shard ذخیره می کند. مزیت این روش این است که با استفاده از تابع hash، داده ها به صورت مساوی بین shard ها تقسیم میشوند.

3. Directory-based Sharding
در این روش یک جدول جدید به اسم lookup table ایجاد می کنید و در آن جدول ذخیره می کنیم که هر partition key در کدام shard ذخیره شده است. مزیت این روش انعطاف بالای آن است چون می توان shard ها را حذف و اضافه کرد و تغییر داد بدون اینکه کل دیتاست را تغییر دهیم. اما یک لایه پیچیدگی به سیستم اضافه میکند، چون نیاز است از جدول جدید نگهداری کنیم.

مثال: یک پلتفرم بازی آنلاین با استفاده از یک جدول تعیین می کند که هر username در کدام shard ذخیره شده است و وقتی در یک کوری اطلاعات یک کاربر نیاز است، ابتدا از آن جدول shard مورد نظر پیدا میشود.

4. Geographic Sharding:
در این روش با استفاده از مکان جغرافیایی داده ها توزیع میشوند. باعث می شود performance افزایش و latency کاهش پیدا کند.

مثال: یک سرویس streaming، داده هر کاربر را با توجه به کشورش در دیتاسنتر نزدیک به او ذخیره می کند.

5. Dynamic Sharding:
در این روش تعداد shard ها با توجه به سایز داده و الگوی های دسترسی آن تغییر می کند. در این روش برای بهینه کردن استفاده از منابع و performance در صورتی که داده زیاد شود می توانیم shard اضافه کنیم یا آنها را split کنیم و اگر داده کم شود می توانیم shard ها را merge کنیم.

مثال: یک پلتفرم IoT که از تعداد زیادی سنسور داده جمع می کند از dynamic sharding برای حذف و اضافه کردن shard با کم و زیاد شدن تعداد دستگاه ها استفاده می کند.

6. Hybrid Sharding: The best of many worlds
می توان چند روش Sharding را با هم ترکیب کرد. مثلا ترکیب روش geo-based و directory-based. در این روش می توان با توجه به نیاز های سیستم به بهترین performance رسید.

مثال: خیلی از cloud provider ها از روش hybrid sharding برای ارائه سرویس با سرعت بالا استفاده می کنند.

تمرین عملی۱: یکی از روش های sharding را در postgresql پیاده سازی کنید.

تمرین عملی۲: یکی از روش های sharding را در mongoDB پیاده سازی کنید.

link

#sharding

@Syntax_fa
👍7
چه زمانی از gettex_lazy استفاده کنیم و چه زمانی از pgettext_lazy !

در جنگو، pgettext_lazy و gettext_lazy هر دو برای ترجمه متن‌ها استفاده می‌شوند، اما با یک تفاوت کلیدی:

gettext_lazy:
این تابع برای ترجمه ساده متن‌ها استفاده می‌شود. هنگامی که یک متن را با gettext_lazy فراخوانی می‌کنید، جنگو آن را برای ترجمه در زمان اجرا نگه می‌دارد.

مثال:
from django.utils.translation import gettext_lazy as _

my_text = _("Hello, World!")


pgettext_lazy:
این تابع برای ترجمه متن‌هایی استفاده می‌شود که در زمینه‌های مختلف معانی متفاوتی دارند. برای مثال، کلمه "book" می‌تواند به معنی "کتاب" یا "رزرو کردن" باشد. pgettext_lazy به شما امکان می‌دهد تا زمینه (context) را برای متن تعریف کنید تا مترجم بتواند ترجمه صحیح را انتخاب کند.

مثال:
from django.utils.translation import pgettext_lazy

book_obj = pgettext_lazy("Noun", "book") # معنی "کتاب"
book_verb = pgettext_lazy("Verb", "book") # معنی "رزرو کردن"


در این مثال، pgettext_lazy اولین آرگومان را به عنوان زمینه و دومین آرگومان را به عنوان متن برای ترجمه در نظر می‌گیرد.

#django

@Syntax_fa
👍10🔥1
سیستم عامل چی انتخاب کنم؟

#fun

@Syntax_fa | @gentoomemes
🔥9🤣5😁1
مهارت‌های نرم.pdf
1.2 MB
کتاب soft skills یا مهارت نرم

اکثر برنامه نویسا تو این مورد ضعف دارن.

#book #soft_skill

@Syntax_fa
👍8🔥2
سوال پایتونی:
در مورد مفهوم Context Managers در Python توضیح دهید. چگونه می‌توان یک Context Manager سفارشی ایجاد کرد؟ یک مثال عملی ارائه دهید.

Context Managers
در Python ابزارهایی برای مدیریت منابع (مانند فایل‌ها، قفل‌ها و اتصالات پایگاه داده) هستند. آن‌ها اطمینان حاصل می‌کنند که منابع به درستی آزاد شوند، حتی در صورت رخ دادن خطا یا استثنا.

برای ایجاد یک Context Manager سفارشی، شما باید یک کلاس ایجاد کنید که دو متد __enter__ و __exit__ را پیاده‌سازی می‌کند. متد __enter__ باید منبع را آماده کند و آن را برگرداند. متد __exit__ باید منبع را آزاد کند و با استثناهای رخ داده به درستی برخورد کند.

مثال عملی: فرض کنید می‌خواهیم یک Context Manager برای باز کردن و بستن فایل‌ها بنویسیم:

class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode

def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file

def __exit__(self, exc_type, exc_value, traceback):
self.file.close()

with FileManager('data.txt', 'w') as f:
f.write('Hello, World!')


در این مثال، FileManager یک کلاس Context Manager است. متد __enter__ فایل را باز می‌کند و شیء فایل را برمی‌گرداند. متد __exit__ فایل را می‌بندد، حتی اگر استثنایی در بلوک with رخ دهد.

#python #context_manager

@Syntax_fa
👍5🔥1
نحوه ذخیره کردن slug تو یکی از پکیج های معروف جنگویی رو با هم ببینیم.

توضیح پست بعدی

#django

@Syntax_fa
😱4👍1
Syntax | سینتکس
نحوه ذخیره کردن slug تو یکی از پکیج های معروف جنگویی رو با هم ببینیم. توضیح پست بعدی #django @Syntax_fa
1. if self._state.adding and not self.slug:
- قسمت اول چک کردن یعنی self._state.adding اگر در حال ساختن یک شی جدید در دیتابیس باشیم مساوی با True هستش همچنین اسلاگ هم باید None باشه.

2. self.slug = self.slugify(self.name)
- این خط یک slug جدید را بر اساس فیلد name با استفاده از تابع slugify تولید می‌کند.

3. using = kwargs.get("using" or router.db_for_write(type(self), instance=self))
- این خط مشخص می‌کند که داده‌ها باید در کدام پایگاه داده ذخیره شوند، با استفاده از router.db_for_write.
(درباره B router بعدا توضیح میدم)

4. kwargs["using"] = using
- این خط، پارامتر using را در kwargs قرار می‌دهد تا در ادامه به super().save منتقل شود.

5. try: ... except IntegrityError:
- این بلوک try/except یک تراکنش atomic را برای ذخیره داده‌ها ایجاد می‌کند.
- اگر خطای IntegrityError (مانند تکراری بودن slug) رخ دهد، بلوک except اجرا می‌شود.

6. slugs = set(...)
- در صورت رخ دادن `IntegrityError`، این خط تمام `slug`‌های موجود در پایگاه داده که اولشون شبیه به اسلاگ ما هستش رو بازیابی می کنه.

7. while True: ... i += 1
- این حلقه یک slug جدید تولید می‌کند تا زمانی که یک slug منحصر به فرد پیدا شود.- slug جدید با افزودن یک شماره انتهایی به slug قبلی تولید می‌شود (مانند my-slug-1, my-slug-2, و غیره).

8. return super().save(*args, **kwargs)
- بعد از یافتن یک slug منحصر به فرد، شیء با فراخوانی متد save پایه ذخیره می‌شود.

9. else: return super().save(*args, **kwargs)
- اگر شیء در حال به‌روزرسانی است (نه ایجاد)، متد save پایه بدون هیچ تغییری فراخوانی می‌شود.

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

#django

@Syntax_fa
👍7
زمان و حافظه خود را با list comprehension، map و generator نجات دهید!
سلام رفقا!

سطح = مقدماتی

امروز می خواهم به شما 3 ابزار قدرتمند در پایتون را معرفی کنم که می توانند به شما در صرفه جویی در زمان و حافظه هنگام کار با لیست ها و داده ها کمک کنند:

1. list comprehension:

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

به جای استفاده از for loop های سنتی، می توانید از list comprehension برای فیلتر کردن، نگاشت و تغییر عناصر لیست به طور همزمان استفاده کنید.

مثال:
numbers = [1, 2, 3, 4, 5]
squared_numbers = [n * n for n in numbers]
print(squared_numbers) # Output: [1, 4, 9, 16, 25]

بااحتیاط از کد استفاده کنید.
2. map:

این تابع به شما امکان می دهد یک عملکرد را به هر عنصر لیست اعمال کنید و نتیجه را به عنوان یک لیست جدید برگردانید.

map برای تغییر یا نگاشت داده ها در یک لیست به طور یکسان مفید است.

مثال:
def double(x):
return x * 2

numbers = [1, 2, 3, 4, 5]
doubled_numbers = list(map(double, numbers))
print(doubled_numbers) # Output: [2, 4, 6, 8, 10]

بااحتیاط از کد استفاده کنید.
3. generator:

ژنراتورها به شما امکان می دهند به طور متوالی مقادیر را از یک مجموعه داده تولید کنید بدون اینکه کل مجموعه داده را به یکباره در حافظه نگه دارید.

این امر آنها را برای کار با مجموعه داده های بزرگ که ممکن است در حافظه شما جا نشوند، ایده آل می کند.

مثال:
def even_numbers(start, end):
for n in range(start, end + 1):
if n % 2 == 0:
yield n

for even_number in even_numbers(1, 20):
print(even_number) # Output: 2 4 6 8 10 12 14 16 18 20

بااحتیاط از کد استفاده کنید.
با استفاده از این 3 ابزار قدرتمند، می توانید کد خود را کارآمدتر و مختصرتر کنید و در عین حال از حافظه و زمان خود به طور موثرتر استفاده کنید.

درضمن یه نکته رو خودم اضافه کنم که استفاده از list comprehension و map
نسبت به حلقه‌های for معمولی در پایتون ، ۲ الی ۳ برابر در زمان و حافظه صرفه جویی می‌کنه!
منبع:
Learn web development with python

[amirhossein]

#python

@Syntax_fa
👍11🔥3😁1
سوال پایتونی:
1. توضیح دهید که چگونه می‌توان از decorators در Python استفاده کرد. یک مثال عملی از کاربرد decorators ارائه دهید.

پاسخ: Decorators در Python یک الگوریتم قدرتمند برای تغییر رفتار تابع‌ها یا کلاس‌ها در زمان اجرا هستند. آن‌ها به شما امکان می‌دهند تا کدهای قابل استفاده مجدد بنویسید و از طریق (Wrapper) تابع‌ها را گسترش دهید. برای استفاده از آن‌ها، شما یک تابع دیگر را تعریف می‌کنید که تابع اصلی را در برمی‌گیرد و کدهای اضافی قبل یا بعد از اجرای تابع اصلی اضافه می‌کند.

مثال عملی: فرض کنید می‌خواهیم یک decorator بنویسیم که زمان اجرای یک تابع را لاگ می‌کند:

import time

def log_execution_time(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function {func.__name__} took {end_time - start_time} seconds to execute.")
return result
return wrapper

@log_execution_time
def my_function(n):
result = 0
for i in range(n):
result += i
return result

my_function(10000000)


در این مثال، log_execution_time یک decorator است که یک تابع دیگر را می‌پذیرد (در اینجا my_function) و یک تابع جدید با نام wrapper را برمی‌گرداند که تابع اصلی را فرا می‌خواند و زمان اجرای آن را لاگ می‌کند.

#python #decorators

@Syntax_fa
👍11🔥21
خب :))
https://github.com/bepass-org/oblivion

https://github.com/bepass-org/bepass

کمک به هموطنا برای دور زدن فیلتر مبارک :))))

یکم توضیحات بزار بدم:
Oblivion
کلاینت غیر رسمی وارپ با یک سری تغییرات هست که نسخه اندرویدش(iOS و دسکتاپ گرافیکی بزودی) منتشر کردیم و میتونید تقریبا با اکثریت اینترنت ها راحت دور بزنین فیلترو و وصل بشین

Bepass
اینو توضیحش نمیدم زیاد😁چون فعلا در استیج بتا هست(ولی قابل استفاده هست) و قراره تغییرات خوب و بزرگی توش ایجاد بشه

https://news.1rj.ru/str/danielcoderx

#freedom

@Syntax_fa
🔥7
سوال پایتونی 🔥:
مفهوم Generators و Coroutines در Python را توضیح دهید. یک مثال کاربردی از استفاده از آن‌ها ارائه دهید.

Generators:
در Python توابعی هستند که مقادیر را یکی پس از دیگری تولید می‌کنند، به جای محاسبه و بازگرداندن یک لیست کامل. این امر منجر به صرفه‌جویی در حافظه و کارایی بهتر می‌شود.

Coroutines:
در Python نوعی توابع ویژه‌ای هستند که می‌توانند در طول اجرای خود چندین بار متوقف و از سر گرفته شوند. آن‌ها برای انجام عملیات‌های همزمان و غیرمتوالی مانند برنامه‌نویسی شبکه یا برنامه‌نویسی رویدادی مفید هستند.

مثال کاربردی: فرض کنید می‌خواهیم یک تابع بنویسیم که اعداد فیبوناچی را تا یک حد مشخص تولید کند. می‌توانیم از یک generator برای این کار استفاده کنیم:

def fibonacciGenerator(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

for num in fibonacciGenerator(10):
    print(num)


در این مثال، fibonacciGenerator یک generator است که در هر بار فراخوانی، عدد بعدی در دنباله فیبوناچی را تولید می‌کند. این روش کارآمدتر از محاسبه و ذخیره کل دنباله در یک لیست است.

یک مثال از استفاده از coroutines:

def consumer():
    while True:
        received = yield
        print(f"Received: {received}")

def producer(consumer_coroutine):
    consumer = consumer_coroutine
    next(consumer)  # Advance to the yield keyword
    n = 0
    while True:
        n += 1
        print(f"Producing: {n}")
        consumer.send(n)
        if n == 5:
            break

consumer_cor = consumer()
producer(consumer_cor)


در این مثال، consumer یک coroutine است که داده‌های دریافتی را چاپ می‌کند. producer یک تابع است که داده‌ها را به coroutine consumer ارسال می‌کند. این نمونه‌کد نشان می‌دهد چگونه می‌توان از coroutines برای ارتباط و مبادله داده‌ها بین دو تابع استفاده کرد.

#generators #coroutines

@Syntax_fa
🔥10👍4