Syntax | سینتکس
Відкрити в Telegram
Focus: Web Lan: Python & Go Website: https://syntaxfa.ir Quick connect: https://quick-connect.syntaxfa.ir Github: https://github.com/syntaxfa Group: https://t.me/Syntax_fa_group
Показати більше3 185
Підписники
Немає даних24 години
-27 днів
+1230 день
Архів дописів
3 183
Context awareness
در بکاند، مفهوم context awareness به توانایی یک سیستم برای درک و پاسخ به شرایط و اطلاعات موجود در یک درخواست اشاره دارد. این ویژگی به توسعهدهندگان کمک میکند تا اپلیکیشنهایی بسازند که به صورت پویا و کارآمد با درخواستهای مختلف تعامل داشته باشند. چند جنبه مهم از context awareness:
دسترسی به مقادیر درخواست
در یک اپلیکیشن بکاند، دسترسی به مقادیر مختلف در یک درخواست (مثل هدرها، پارامترهای کوئری، و بدنه درخواست) بسیار مهم است. این مقادیر میتوانند برای احراز هویت، و پردازش دادهها و ... استفاده شوند.
مدیریت لغو درخواست
گاهی اوقات نیاز است که در صورت لغو درخواست از سمت کلاینت، پردازشهای در حال انجام در سرور متوقف شوند.
برای مثال:
- پایان دادن به کوئریهای دیتابیس: وقتی درخواست لغو میشود، بهتر است کوئریهای در حال اجرا در دیتابیس را متوقف کنید تا منابع سیستم آزاد شوند.
- لغو پردازشهای سنگین: اگر پردازشی طولانی در حال انجام است، لغو آن میتواند به بهبود کارایی سیستم کمک کند.
پیادهسازی در گولنگ:
در زبان Go، از context.Context استفاده میشود که به شما اجازه میدهد درخواستها را ردیابی کرده و در صورت لغو، عملیات مرتبط را متوقف کنید.
در Go، استفاده از context.Context به صورت زیر است:
func HandleRequest(ctx context.Context, db *sql.DB) {
query := "SELECT * FROM users"
rows, err := db.QueryContext(ctx, query)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
// پردازش دادهها
}
}
در این مثال، اگر ctx کنسل شود، کوئری دیتابیس هم متوقف خواهد شد.
#contex_awareness
@Syntax_fa3 183
یچی جالب که تو نسخه 12 پستگرس اضافه کرده بودن قابلیت rest api بودش
مثلا میتونستید با استفاده از rest api ها بیاید عملیات crud رو انجام بدید قابلیت authorization با jwt توکن هم داره
https://docs.postgrest.org/en/v12/tutorials/tut0.html
#fun
@Syntax_fa
3 183
الگوی Retry (Retry Pattern)
الگوی Retry به برنامهنویسان کمک میکند تا در مواجهه با خطاهای موقتی، بهطور خودکار تلاش مجدد کنند. این الگو به ویژه در تعاملات شبکهای، مانند درخواستهای HTTP یا دسترسی به پایگاه داده، مفید است. هدف این است که اگر یک عملیات ناموفق بود، بهجای شکست فوری، چند بار دیگر نیز امتحان شود.
مزایای الگوی Retry
- افزایش قابلیت اطمینان: کاهش احتمال شکست به دلیل مشکلات موقتی.
- بهبود تجربه کاربری: کاربران با خطاهای موقتی مواجه نمیشوند.
- مدیریت بهینه منابع: میتوان به جای تلاشهای بیپایان، تعداد تلاشها را محدود کرد.
نحوه استفاده در پایتون
در پایتون، میتوان از یک حلقه و استثناها برای پیادهسازی این الگو استفاده کرد. در زیر یک مثال ساده از نحوه استفاده از الگوی Retry آورده شده است.
مثال:
import time
import random
def unreliable_function():
if random.random() < 0.7:
raise Exception("an error occurred")
return "OK"
def retry(func, retries=3, delay=2):
for attempt in range(retries):
try:
result = func()
return result
except Exception as e:
print(f"try again. retry time: %d" % retries)
time.sleep(delay)
raise Exception("unexpected error")
# Retry Pattern
result = retry(unreliable_function)
print(result)
### توضیحات کد:
- unreliable_function: تابعی که 70% احتمال خطا دارد.
- retry: تابعی که عملیات را دوباره امتحان میکند. تعداد تلاشها و تأخیر بین آنها را میتوان تعیین کرد.
- حلقه: در صورتی که عملیات ناموفق باشد، یک پیام خطا چاپ میشود و برنامه به مدت مشخصی منتظر میماند و دوباره تلاش میکند.
- نتیجه: در نهایت، یا نتیجه موفقیتآمیز تابع اصلی برمیگردد یا پیامی مبنی بر ناموفق بودن همه تلاشها.
با استفاده از این الگو، میتوانید به راحتی عملیات خود را در مواجهه با خطاهای موقتی بهبود بخشید.3 183
یه رابطه عاطفی خوب از نگاه یه برنامه نویس😒:
1. ریسپانس تایم پایین:
هر بار که پیامی به پارتنرت میفرستی، باید تو چند ثانیه پاسخ بده. اصلا یدونه تایم اوت یه دقیقه بذار اگه بعد یه دقیقه پاسخی دریافت نکردی کلا راه ارتباطی بلاک شه!
2. دیباگ کردن مشکلات:
هر وقت مشکلی پیش میاد، به جای نادیده گرفتن، باید بشینیم دیباگ کنیمش و ببینیم مشکل کجاست تا فیکسش کنیم. اگه مشکلاتو نادیده بگیریم بعدا ممکنه کل سیستمو نابود کنه
3. ورژن کنترل:
هر تصمیم مهمی باید توی یک سیستم ورژن کنترل ثبت بشه. اینطوری میتونیم به راحتی برگردیم و تغییرات رو بررسی کنیم.
4. فایروال:
برای جلوگیری ورود بیگانه، یه فایروال قوی باید داشته باشیم که هر آدم بیمورد رو بلاک کنه.
5. آپتایم رابطه:
سرور رابطه باید همیشه آپتایم باشه. اگر داونتایم زیادی داشته باشه، ممکنه کاربران (هر دو نفر) نارضایتی پیدا کنن.
6. پچهای امنیتی:
هر چند وقت یکبار باید پچهای امنیتی برای رفع باگهای قدیمی اعمال بشه تا هیچوقت به مشکل نخوریم.
7. پشتیبانگیری منظم:
از خاطرات خوب باید بهصورت منظم بکآپ گرفته بشه تا در مواقع سخت بتونیم بهشون رجوع کنیم.
8. UI/UX دلپذیر:
هیچوقت فقط بخاطر ui جذاب یکیو انتخاب نکن. خیلی مهمه در کنار ui حتما ux خوبیم داشته باشه.
شدنیه فقط بخاطر ux بشه کنار اومد ولی فقط ui شدنی نیست.
#fun
@Syntax_fa
3 183
یبار برا همیشه Cron expressions رو یاد بگیر
برای زمانبندی خودکار دستورات یا اسکریپتها استفاده میشود. این ابزار در سیستمعاملهای یونیکس و لینوکس رایج است و در ابزارهایی مثل Jenkins، Kubernetes و غیره هم کاربرد دارد. Cron expressions از پنج یا شش فیلد تشکیل شدهاند که هر کدام بیانگر یک واحد زمانی است:
* * * * * [دستور]
| | | | |
| | | | +--- روزهای هفته (۰-۷) (۰ و ۷ برای یکشنبه)
| | | +----- ماه (۱-۱۲)
| | +------- روز ماه (۱-۳۱)
| +--------- ساعت (۰-۲۳)
+----------- دقیقه (۰-۵۹)
مثالها
1. اجرای دستور هر دقیقه:
* * * * * [دستور]
2. اجرای دستور هر روز در ساعت ۳:۳۰ صبح:
30 3 * * * [دستور]
3. اجرای دستور هر یکشنبه ساعت ۵ عصر:
0 17 * * 0 [دستور]
4. اجرای دستور در روز اول هر ماه ساعت ۱۲ ظهر:
0 12 1 * * [دستور]
5. اجرای دستور هر ۵ دقیقه:
*/5 * * * * [دستور]
6. اجرای دستور هر دو ساعت:
0 */2 * * * [دستور]
علائم خاص
- **ستاره (*)**: همه مقادیر ممکن را شامل میشود
خط فاصله (-)-): برای تعیین بازه از-تا استفاده میشود. مثلاً 1-5
کاما (,),): برای تعیین مقادیر مختلف در یک فیلد استفاده میشود. مثلاً 1,3,5 یعنی روز ۱، ۳ و ۵
اسلش (/)/): برای تعیین گامهای تکرار استفاده میشود. مثلاً */15 در فیلد دقیقه یعنی هر ۱۵ دقیقه.
مثال پیچیدهتر
اجرای یک دستور در ساعت ۱:۱۵ بعد از ظهر هر دوشنبه و چهارشنبه:
15 13 * * 1,3 [دستور]
همچنین اکثر scheduler ها از cron expressions پشتیبانی میکنن. پس یبار یاد بگیر همه جا استفاده کن🍸
#cron_expression
@Syntax_fa3 183
مراحل دپلوی:
مرحله اول
1. نوشتن کد ها
2. ران کردن تست با استرس
موفقیت آمیز:
- به جدم کسی نیست در حدم
ناموفق:
- من چقدر برنامه نویس بدبختی هستم 😔
مرحله دوم
1. تصحیح کد ها
2. ران کردن تست با استرس فراوان
موفقیت:
- خدایا شکرت
ناموفق:
خشم فروان
مرحله سوم
1. تصحیح دوباره کد ها
2. ران کردن تست
3. تستا چه موفق بود چه ناموفق دپلوی کن بره
#fun
@Syntax_fa
3 183
Gracefully shutdown
در برنامهنویسی، فرآیند "gracefully shutdown" به معنی خاموش کردن برنامه بهصورتی است که از بروز اختلالات و از دست رفتن دادهها جلوگیری شود. این موضوع در سیستمهای توزیعشده، سرورها و برنامههای بلادرنگ اهمیت بیشتری پیدا میکند.
مدیریت سیگنالها
- سیگنالها: سیستمعاملها سیگنالهایی مثل
SIGTERM یا SIGINT را برای اطلاعرسانی به برنامهها ارسال میکنند که باید خاموش شوند.
لیستی از سیگنال های LINUX. هر سیگنال معنی خاص خودش رو داره. SIGTERM به معنی سیگنالی هستش که برای Process termination ارسال شده است.
https://faculty.cs.niu.edu/~hutchins/csci480/signals.htm
- واکنش به سیگنالها: برنامه باید این سیگنالها را مدیریت کرده و فرآیند خاموشی را آغاز کند.
پردازش درخواستهای جاری
- تکمیل درخواستها: برنامه باید مطمئن شود که تمامی درخواستهای در حال پردازش به اتمام میرسند و پاسخها بهطور کامل ارسال میشوند.
- پذیرش درخواست جدید: ممکن است لازم باشد که پذیرش درخواستهای جدید متوقف شود تا منابع آزاد شوند.
مدیریت منابع
- بستن اتصالات: همهی اتصالات باز به پایگاههای داده و سوکتها باید بهصورت ایمن بسته شوند.
- آزادسازی حافظه: برنامه باید تمام حافظههای تخصیص دادهشده را آزاد کند تا از نشت حافظه جلوگیری شود.
ذخیرهسازی وضعیت
- ذخیرهسازی وضعیت برنامه: در برنامههای حالتگرا، وضعیت فعلی باید ذخیره شود تا در راهاندازی مجدد قابل بازیابی باشد.
- ثبت لاگها: ثبت وقایع و لاگهای مهم برای عیبیابی ضروری است.
هماهنگی با سرویسهای دیگر
- اطلاعرسانی به سرویسهای وابسته: اگر برنامه با سرویسهای دیگر تعامل دارد، باید به آنها اطلاع دهد که در حال خاموش شدن است تا آنها بتوانند اقدامات لازم را انجام دهند.
پیادهسازی در زبانهای مختلف
- جاوا: استفاده از Shutdown Hook برای اجرای کد لازم در زمان خاموشی.
- پایتون: استفاده از کتابخانه signal برای مدیریت سیگنالها و اجرای فرآیندهای نهایی.
- Node.js: مدیریت خاموشی با استفاده از رویدادهای process مانند SIGINT.
#gracefully_shutdown
@Syntax_fa3 183
polymorphism in relational database
این پست درباره یکی از مفاهیم ساده ای هستش که خیلی بدرد بخوره.
بیاید با مثال بررسی کنیم.
فرض کنید ما یک مدل order داریم که انواع مختلفی از محصولات رو میفروشیم.
برای مثال اشتراک میفروشیم که وقتی اشتراک رو میخرن به یه سری سرویس هامون دسترسی خواهند داشت.
در کنار اشتراک یک سری محصولات فیزیکی هم میفروشیم.
در کنار همه اینا یه سری خدمات دیگه هم داریم که پرداخت نیاز دارن.
خب شاید اولین چیزی که بهش فکر میکنیم این باشه بیایم داخل تیبل order فیلد هایی مثل plan و product و ... رو قرار بدیم بعد اگه هرکدوم null نبود یعنی order مربوط به اون خدمات یا محصول هستش:
CREATE TABLE order (
id INT PRIMARY KEY AUTO_INCREMENT,
...
plan_id INT NULL,
product_id INT NULL,
)
اما روش بهتر اینه بیایم دوتا فیلد به اسم type_name و type_id ذخیره کنیم. اگه type_name مثلا plan بود پس order مربوط به پلن با آیدی فلان هستش پس موقعی که خرید موفقیت آمیز بود میدونیم باید چه اکشنی داشته باشیم.
توسعه در آینده هم برامون خیلی راحت تر میشه بدون اینکه نیازی باشه تیبل order تغییری کنه.
#note
@Syntax_fa3 183
از اونجا که بچه های گروه زیادی از جنگو خوششون میاد، اینم چند تا نکته جنگویی(قسمت اول):
۱. چطور از ایمپورت circular تو مدل هامون جلوگیری کنیم؟
برای جلوگیری از این مشکل، جنگو برامون یه راه حل گذاشته. فرض کنید به یه مدل دیگه فارن کی زدید. بجای اینکه مستقیم ایمپورتش کنید. میایم داخل استرینگ بهش میگیم که به کدوم مدل فارن کی بخوره.
مثال:
app1/models.py
class ModelOne(models.Model):
...
app2/models.py
class ModelTwo(models.Model):
model_one = models.ForeignKey("app1.ModelOne")
2. مدل های داخل یک اپ رو بشکنید!
پیشنهاد اینه مدل های یک اپ خیلی زیاد نشه. اما اگه دلایل مشخصی دارید، بهتره مدل هارو داخل یک پکیج قرار بدید تا زیادی شلوغ نشه.
برای اینکار داخل اپ یک پکیج به اسم models میسازیم و داخل فایل های مختلف مدل هامون رو قرار میدیم. در نهایت داخل init ایمپورتشون میکنیم:
#### blog_app/models/__init__.py
from .comment import Comment
from .post import Post
#### blog_app/models/comment.py
class Comment(models.Model):
# comment fields
#### blog_app/models/post.py
3. کوئری هامون چقدر بهینه هستن؟
خب بیاید با نوشتن یدونه دکوریتور بررسی کنیم:
from django.db import connection
from django.db import reset_queries
def database_debug(func):
def inner_func(*args, **kwargs):
reset_queries()
results = func(*args, **kwargs)
query_info = connection.queries
print(f'function_name: {func.__name__}')
print(f'query_count: {len(query_info)}')
queries = [f'{ query["sql"]}\n' for query in query_info]
print(f'queries: \n{"".join(queries)}')
return results
return inner_func
خروجی دکوریتور در دو حالت مختلف:
@database_debug
def regular_query():
blogs = models.Blog.objects.all()
return [blog.author.name for blog in blogs]
## OUTPUT
function_name: regular_query
query_count: 4
queries:
SELECT "blog_blog"."id", "blog_blog"."title",
"blog_blog"."content", "blog_blog"."author_id",
"blog_blog"."created_at", "blog_blog"."updated_at" FROM
"blog_blog"
SELECT "author_author"."id", "author_author"."name",
"author_author"."email", "author_author"."bio" FROM
"author_author" WHERE "author_author"."id" = 1 LIMIT 21
SELECT "author_author"."id", "author_author"."name",
"author_author"."email", "author_author"."bio" FROM
"author_author" WHERE "author_author"."id" = 2 LIMIT 21
SELECT "author_author"."id", "author_author"."name",
"author_author"."email", "author_author"."bio" FROM
"author_author" WHERE "author_author"."id" = 2 LIMIT 21
میبینیم که پدر دیتابیسو درآورده. ولی با استفاده از select_related تعداد کوئری ها از 4 تا به یکی میرسه.
پس همیشه از روش هایی استفاده کنید برای اینکه کوئری هایی که میزنید رو بررسی کنید.
#django
@Syntax_fa3 183
Foodanywhere
پروژه Foodanywhere یک پروژه food delivery جنگویی هستش.
- از Postgis برای ثبت اطلاعات جغرافیایی استفاده میکنه.
- این پروژه برای مانیتورینگ از prometheus استفاده میکنه.
- برای مدیریت لاگ ها از loki استفاده میکنه.
- برای دیپلویمنت از kubernetes استفاده میشه و برای ci/cd از github actions.
- اکثر بخش ها هم تست شده و تمامی تستا با pytest نوشته شدن
لطفاً نظراتتون رو جهت بهتر کردن پروژه، حتما در میون بذارید🙏
سورس کد پروژه:
(برای حمایت از محمد، استار فراموش نشه🍸)
https://github.com/mohamad-liyaghi/FoodAnywhere
#django #project
@Syntax_fa
3 183
دنیای تکنولوژی و Buzzwordها: حقیقت پشت واژههای پر زرق و برق
در دنیای پر سرعت و پیچیده تکنولوژی، واژههای پر زرق و برق یا همان buzzwordها همواره نقش مهمی ایفا کردهاند. این واژهها اغلب به عنوان نمادهای نوآوری و پیشرفت معرفی میشوند، اما واقعیت این است که بسیاری از آنها چیزی جز بازتعریف مفاهیم قدیمی با نامهای جدید نیستند.
Buzzword
به واژه یا عبارتی گفته میشود که بهطور گسترده در رسانهها و گفتگوهای عمومی استفاده میشود و به نظر میرسد که نشاندهنده یک مفهوم جدید و پیشرفته است. این واژهها اغلب برای جلب توجه، ایجاد هیجان و فروش محصولات یا خدمات استفاده میشوند.
واژههای پر زرق و برق در صنعت تکنولوژی سابقه طولانی دارند. از دهه ۱۹۶۰ میلادی، وقتی که واژههایی مانند "cybernetics" و "artificial intelligence" برای اولین بار مطرح شدند، buzzwordها همواره بخشی از تبلیغات و بازاریابی تکنولوژی بودهاند.
چگونه Buzzwordها شکل میگیرند؟
1. بازتعریف مفاهیم قدیمی
بسیاری از buzzwordها در واقع چیزی جز بازتعریف مفاهیم قدیمی با نامهای جدید نیستند. برای مثال، مفهوم "cloud computing" در واقع بازتعریفی از ایده قدیمی "remote hosting" یا "shared services" است.
2. بازاریابی و تبلیغات
شرکتهای تکنولوژی اغلب از buzzwordها به عنوان ابزاری برای بازاریابی استفاده میکنند. این واژهها به ایجاد هیجان و جذب مشتریان جدید کمک میکنند. به عنوان مثال، واژه "Big Data" به مجموعه دادههای بزرگ اشاره دارد که نیاز به تحلیل پیچیده دارند، اما این مفهوم از دههها پیش وجود داشته است.
3. موجهای نوآوری
هرچند برخی buzzwordها تنها بازتعریفی از مفاهیم قدیمی هستند، اما برخی دیگر واقعاً نمایانگر نوآوریهای جدید هستند. به عنوان مثال، "Blockchain" یک تکنولوژی جدید است که واقعاً تغییرات بزرگی در حوزههای مختلف ایجاد کرده است.
تاثیرات Buzzwordها بر صنعت
1. ایجاد انتظارات غیرواقعی
یکی از مشکلات اصلی buzzwordها ایجاد انتظارات غیرواقعی است. مشتریان و کاربران ممکن است تصور کنند که یک فناوری جدید همه مشکلاتشان را حل میکند، اما در واقعیت، این فناوریها ممکن است محدودیتها و مشکلات خاص خود را داشته باشند.
2. سرمایهگذاریهای نادرست
شرکتها و سازمانها ممکن است به دلیل هیجان و تبلیغات پیرامون یک buzzword، سرمایهگذاریهای نادرستی انجام دهند. این سرمایهگذاریها ممکن است به نتایج مطلوب نرسند و منابع مالی و زمانی زیادی را هدر دهند.
ما برنامه نویسا وقتی با یه buzzword مواجه میشیم بهترین کار اینه اول به اندازه کافی تحقیق کنیم بعد اگه دیدیم واقعا ابزار و تکنولوژی بدرد بخوری برای کارمون هستش، بریم سمتش.
@Syntax_fa
3 183
زبون برنامه نویسیت پرحرفه یا کم حرفه ؟🤏
موقع صحبت از کد زبانهای برنامهنویسی، کلمات verbose و concise زیاد به گوشمان میخورند.
Verbose:
هرچقدر یک زبان برنامهنویسی بیشتر با شما حرف بزند، برای مثال برای انجام یک کار، استپهایی که طی کرده بیشتر در کد دیده شوند و بهصراحت نوشته شوند، آن زبان پرحرفتر است و به آن زبان verbose میگویند.
Concise:
از طرف دیگر، هرچقدر یک زبان برنامهنویسی برای انجام یک سری کارها، استپهایی که انجام شده کمتر در کد بیایند یا بهعبارتی ضمنی انجام شوند، به آن زبان کمحرف یا concise میگویند.
حالا یک مثال از نحوه خواندن خط به خط فایل در 🥰 و 🐍 ببینیم:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
file, err := os.Open("example.txt")
if err != nil {
fmt.Println("Error opening file:", err)
return
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Println("Error reading file:", err)
}
}
بسیاری از استپها بهطور صریح در کد آمدهاند. فایل را باز میکنیم و یک اسکنر تعریف میکنیم و ...
حالا اگر میخواستیم از فایل بخوانیم و در یک متغیر بریزیم، باید درباره این تصمیم میگرفتیم که چطور انجامش دهیم. مثلاً یک آرایه خالی میسازیم، سپس حلقه میزنیم و یک آرایه با ظرفیت مشخص (مثلاً صد تا) تعریف میکنیم. سپس صد تا صد تا از فایل میخوانیم. چک میکنیم ببینیم تعداد بایتهایی که خواندیم چقدر بودهاند و به همان تعداد در آرایه نهایی میریزیم. اگر خطا از نوع End of File بود، یعنی بدون مشکل کل فایل را خواندهایم و...
خب حالا ببینیم در پایتون چطور خط به خط از فایل میخوانیم:
with open("example.txt", "r") as file:
for line in file:
print(line.strip())
در Python، تمام مراحل خواندن فایل بهطور خلاصه و با کد کمتری انجام میشود. فایل را با استفاده از with باز میکنیم که بهطور خودکار فایل را بعد از اتمام عملیات میبندد. سپس با یک حلقه for، خط به خط فایل را میخوانیم و چاپ میکنیم.
شما بگید زبونی که پرحرف باشه رو میپسندید یا زبونی که کم حرف باشه؟
@Syntax_fa3 183
تست سرعت serialization و deserialization جی سان در پکیج های پایتونی:
drf serializatio
Standard json serialization
Pydantic json serialization
Pydantic with ujson serilization
اگه بخوایم عادلانه بررسی کنیم. standard json رو میتونیم با ujson بررسی کنیم. مارشال کردن دیتا توی ujson تقریبا سه و نیم برابر سریع تر از standard json انجام میشه و عملیات unmarshal تقریبا یکونیم برابر توی ujson سریع تر انجام میشه.
همچنین pydantic با pydantic with ujson هم کمی با ujson بهتر عمل میکنه. اگه قراره از پایدانتیک استفاده کنید. بهتره برای json serialization کانفیگش رو روی ujson تنظیم کنید.
و اما نتیجه تست روی 100 هزار تا داده به چه صورت هستش:
DRF Deserialization: 27.931873083114624 .DRF Serialization: 20.0464129447937 .Pydantic Deserialization: 3.9613752365112305 .Pydantic Serialization: 1.3248841762542725 .Pydantic with ujson Deserialization: 3.9036169052124023 .Pydantic with ujson Serialization: 1.321913719177246 .Standard Deserialization: 0.6196784973144531 .Standard Serialization: 0.8552639484405518 .ujson Deserialization: 0.6136562824249268 .ujson Serialization: 0.2362501621246338و اما drf serilization چرا کند هستش؟ 1. معماری و پیچیدگی به دلیل یکپارچگی عمیق با Django و ویژگیهای متعدد، دارای لایههای مختلفی از انتزاع و پیچیدگی است. این امر باعث میشود که پردازشهای بیشتری برای هر درخواست انجام شود. Pydantic: به گونهای طراحی شده که ساده و سبک باشد، و بهینهسازیهای خاصی برای سرعت در آن انجام شده است. این کتابخانه از تایپهای پایتونی به صورت مستقیم استفاده میکند که باعث بهبود عملکرد میشود. 2. اعتبارسنجی دادهها اعتبارسنجی دادهها در DRF به صورت خودکار و با استفاده از روشهای مختلفی انجام میشود که شامل فیلترها، اعتبارسنجها و مبدلهای داده میشود. این فرایندها نیازمند زمان بیشتری برای پردازش هستند. Pydantic: از تایپهای پایتونی و انوتیشنها برای اعتبارسنجی دادهها استفاده میکند که کارایی بالاتری دارد. 3. مدیریت مدلها و QuerySetها DRF: به طور معمول با مدلهای Django و QuerySetها کار میکند که این خود به پیچیدگی و زمان پردازش اضافه میکند. Pydantic: به صورت مستقیم با دادههای ساده کار میکند و نیازی به پردازشهای اضافی مرتبط با QuerySetها ندارد. در نهایت باید بگیم برای بررسی کردن و بنچمارک گرفتن، باید تو شرایط واقعی تری انجام داد. سورس کد رو توی کامنت میذارم. #python #serialization @Syntax_fa
3 183
Gitmoji
وبسایت [Gitmoji](https://gitmoji.dev/) یک منبع آنلاین است که به توسعهدهندگان کمک میکند تا از ایموجیها در پیامهای کامیتهای خود استفاده کنند. این وبسایت مجموعهای از ایموجیها را فراهم میکند که هر یک به یک نوع تغییر یا فعالیت خاص در کد اشاره دارند. به عنوان مثال:
- 🐛: برای فیکس کردن باگها
- ✨: برای اضافه کردن یک ویژگی جدید
- 📝: برای بهروزرسانی مستندات
- 🎨: برای بهبود ساختار یا ظاهر کد بدون تغییر عملکرد
استفاده از Gitmoji باعث میشود که تاریخچه کامیتها خواناتر و قابل فهمتر شود و اعضای تیم توسعهدهنده بتوانند با نگاه به ایموجیها به سرعت متوجه نوع تغییرات اعمال شده شوند. این ابزار بهخصوص برای پروژههای متنباز و تیمهای بزرگی که بر روی یک کدبیس کار میکنند، مفید است.
مثال:
git commit -m ":bug: fix a bug"
#note #gitmoji
@Syntax_Fa3 183
هفت روش برای پیاده سازی dto ها در پایتون:
https://dev.to/izabelakowal/some-ideas-on-how-to-implement-dtos-in-python-be3
#python #dto
@Syntax_fa
3 183
GHOFLE
قفله یک پروژه اپن سورس جنگویی است.
تمرکز اصلی پروژه کار با AWS S3 و Authentication و Payment service هستش.
از اساتید و افراد باتجربه درخواست میکنم اگه میتونن یه نگاه به سورس کد پروژه بندازن و مشکلاتش رو تو کامنت همین پست یا پیوی بگن🙏
نهایت هدف اینه تبدیل به یه پروژه اپن سورس خوب بشه تا بدرد بقیه افراد بخوره
(همچنین اگه دوست دارید برای توسعه پروژه مشارکت داشته باشید، پیوی پیام بدید)
https://github.com/alireza-fa/ghofle
3 183
با پیشرفت فنّاوری و توسعه روزافزون استفاده از نرمافزارها و هوش مصنوعی، استفاده از ابزارها و مکانیزمهای مختلفی برای توسعهٔ سریع و باکیفیت نرمافزارها ضروری است. در این کتاب مجموعه مواردی بیان شده است که به معرفی و پیادهسازی این روشها میپردازند. چه برای افزایش دانش در حوزه نرمافزار و چه برای آشنایی با ابزارها و روشهای پیادهسازی نرمافزارهای مدرن و چه برای آمادگی برای مصاحبههای شغلی برای مهندسی نرمافزار، این کتاب برای شما بسیار مناسب است.
لینک دانلود کتاب
آدرس گیتهاب این کتاب برای بروزرسانیها
https://system-design.ir
Source:
@GoInsights
#book
@Syntax_fa
