زبون برنامه نویسیت پرحرفه یا کم حرفه ؟🤏
موقع صحبت از کد زبانهای برنامهنویسی، کلمات verbose و concise زیاد به گوشمان میخورند.
Verbose:
هرچقدر یک زبان برنامهنویسی بیشتر با شما حرف بزند، برای مثال برای انجام یک کار، استپهایی که طی کرده بیشتر در کد دیده شوند و بهصراحت نوشته شوند، آن زبان پرحرفتر است و به آن زبان verbose میگویند.
Concise:
از طرف دیگر، هرچقدر یک زبان برنامهنویسی برای انجام یک سری کارها، استپهایی که انجام شده کمتر در کد بیایند یا بهعبارتی ضمنی انجام شوند، به آن زبان کمحرف یا concise میگویند.
حالا یک مثال از نحوه خواندن خط به خط فایل در🥰 و 🐍 ببینیم:
بسیاری از استپها بهطور صریح در کد آمدهاند. فایل را باز میکنیم و یک اسکنر تعریف میکنیم و ...
حالا اگر میخواستیم از فایل بخوانیم و در یک متغیر بریزیم، باید درباره این تصمیم میگرفتیم که چطور انجامش دهیم. مثلاً یک آرایه خالی میسازیم، سپس حلقه میزنیم و یک آرایه با ظرفیت مشخص (مثلاً صد تا) تعریف میکنیم. سپس صد تا صد تا از فایل میخوانیم. چک میکنیم ببینیم تعداد بایتهایی که خواندیم چقدر بودهاند و به همان تعداد در آرایه نهایی میریزیم. اگر خطا از نوع End of File بود، یعنی بدون مشکل کل فایل را خواندهایم و...
خب حالا ببینیم در پایتون چطور خط به خط از فایل میخوانیم:
در Python، تمام مراحل خواندن فایل بهطور خلاصه و با کد کمتری انجام میشود. فایل را با استفاده از
شما بگید زبونی که پرحرف باشه رو میپسندید یا زبونی که کم حرف باشه؟
@Syntax_fa
موقع صحبت از کد زبانهای برنامهنویسی، کلمات 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_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥5❤1
دنیای تکنولوژی و 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 مواجه میشیم بهترین کار اینه اول به اندازه کافی تحقیق کنیم بعد اگه دیدیم واقعا ابزار و تکنولوژی بدرد بخوری برای کارمون هستش، بریم سمتش.
#buzzword
@Syntax_fa
در دنیای پر سرعت و پیچیده تکنولوژی، واژههای پر زرق و برق یا همان 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 مواجه میشیم بهترین کار اینه اول به اندازه کافی تحقیق کنیم بعد اگه دیدیم واقعا ابزار و تکنولوژی بدرد بخوری برای کارمون هستش، بریم سمتش.
#buzzword
@Syntax_fa
👍8👌1
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣23😱5😁2❤🔥1
Foodanywhere
پروژه Foodanywhere یک پروژه food delivery جنگویی هستش.
- از Postgis برای ثبت اطلاعات جغرافیایی استفاده میکنه.
- این پروژه برای مانیتورینگ از prometheus استفاده میکنه.
- برای مدیریت لاگ ها از loki استفاده میکنه.
- برای دیپلویمنت از kubernetes استفاده میشه و برای ci/cd از github actions.
- اکثر بخش ها هم تست شده و تمامی تستا با pytest نوشته شدن
لطفاً نظراتتون رو جهت بهتر کردن پروژه، حتما در میون بذارید🙏
سورس کد پروژه:
(برای حمایت از محمد، استار فراموش نشه🍸 )
https://github.com/mohamad-liyaghi/FoodAnywhere
#django #project
@Syntax_fa
پروژه Foodanywhere یک پروژه food delivery جنگویی هستش.
- از Postgis برای ثبت اطلاعات جغرافیایی استفاده میکنه.
- این پروژه برای مانیتورینگ از prometheus استفاده میکنه.
- برای مدیریت لاگ ها از loki استفاده میکنه.
- برای دیپلویمنت از kubernetes استفاده میشه و برای ci/cd از github actions.
- اکثر بخش ها هم تست شده و تمامی تستا با pytest نوشته شدن
لطفاً نظراتتون رو جهت بهتر کردن پروژه، حتما در میون بذارید
سورس کد پروژه:
(برای حمایت از محمد، استار فراموش نشه
https://github.com/mohamad-liyaghi/FoodAnywhere
#django #project
@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👏2❤1❤🔥1🎉1
از اونجا که بچه های گروه زیادی از جنگو خوششون میاد، اینم چند تا نکته جنگویی(قسمت اول):
۱. چطور از ایمپورت circular تو مدل هامون جلوگیری کنیم؟
برای جلوگیری از این مشکل، جنگو برامون یه راه حل گذاشته. فرض کنید به یه مدل دیگه فارن کی زدید. بجای اینکه مستقیم ایمپورتش کنید. میایم داخل استرینگ بهش میگیم که به کدوم مدل فارن کی بخوره.
مثال:
2. مدل های داخل یک اپ رو بشکنید!
پیشنهاد اینه مدل های یک اپ خیلی زیاد نشه. اما اگه دلایل مشخصی دارید، بهتره مدل هارو داخل یک پکیج قرار بدید تا زیادی شلوغ نشه.
برای اینکار داخل اپ یک پکیج به اسم models میسازیم و داخل فایل های مختلف مدل هامون رو قرار میدیم. در نهایت داخل init ایمپورتشون میکنیم:
3. کوئری هامون چقدر بهینه هستن؟
خب بیاید با نوشتن یدونه دکوریتور بررسی کنیم:
خروجی دکوریتور در دو حالت مختلف:
میبینیم که پدر دیتابیسو درآورده. ولی با استفاده از select_related تعداد کوئری ها از 4 تا به یکی میرسه.
پس همیشه از روش هایی استفاده کنید برای اینکه کوئری هایی که میزنید رو بررسی کنید.
#django
@Syntax_fa
۱. چطور از ایمپورت 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"."noscript",
"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_fa
🔥6👍3
polymorphism in relational database
این پست درباره یکی از مفاهیم ساده ای هستش که خیلی بدرد بخوره.
بیاید با مثال بررسی کنیم.
فرض کنید ما یک مدل order داریم که انواع مختلفی از محصولات رو میفروشیم.
برای مثال اشتراک میفروشیم که وقتی اشتراک رو میخرن به یه سری سرویس هامون دسترسی خواهند داشت.
در کنار اشتراک یک سری محصولات فیزیکی هم میفروشیم.
در کنار همه اینا یه سری خدمات دیگه هم داریم که پرداخت نیاز دارن.
خب شاید اولین چیزی که بهش فکر میکنیم این باشه بیایم داخل تیبل order فیلد هایی مثل plan و product و ... رو قرار بدیم بعد اگه هرکدوم null نبود یعنی order مربوط به اون خدمات یا محصول هستش:
اما روش بهتر اینه بیایم دوتا فیلد به اسم type_name و type_id ذخیره کنیم. اگه type_name مثلا plan بود پس order مربوط به پلن با آیدی فلان هستش پس موقعی که خرید موفقیت آمیز بود میدونیم باید چه اکشنی داشته باشیم.
توسعه در آینده هم برامون خیلی راحت تر میشه بدون اینکه نیازی باشه تیبل order تغییری کنه.
#note
@Syntax_fa
این پست درباره یکی از مفاهیم ساده ای هستش که خیلی بدرد بخوره.
بیاید با مثال بررسی کنیم.
فرض کنید ما یک مدل 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_fa
👍4🔥1👌1
Gracefully shutdown
در برنامهنویسی، فرآیند "gracefully shutdown" به معنی خاموش کردن برنامه بهصورتی است که از بروز اختلالات و از دست رفتن دادهها جلوگیری شود. این موضوع در سیستمهای توزیعشده، سرورها و برنامههای بلادرنگ اهمیت بیشتری پیدا میکند.
مدیریت سیگنالها
- سیگنالها: سیستمعاملها سیگنالهایی مثل
لیستی از سیگنال های LINUX. هر سیگنال معنی خاص خودش رو داره. SIGTERM به معنی سیگنالی هستش که برای Process termination ارسال شده است.
https://faculty.cs.niu.edu/~hutchins/csci480/signals.htm
- واکنش به سیگنالها: برنامه باید این سیگنالها را مدیریت کرده و فرآیند خاموشی را آغاز کند.
پردازش درخواستهای جاری
- تکمیل درخواستها: برنامه باید مطمئن شود که تمامی درخواستهای در حال پردازش به اتمام میرسند و پاسخها بهطور کامل ارسال میشوند.
- پذیرش درخواست جدید: ممکن است لازم باشد که پذیرش درخواستهای جدید متوقف شود تا منابع آزاد شوند.
مدیریت منابع
- بستن اتصالات: همهی اتصالات باز به پایگاههای داده و سوکتها باید بهصورت ایمن بسته شوند.
- آزادسازی حافظه: برنامه باید تمام حافظههای تخصیص دادهشده را آزاد کند تا از نشت حافظه جلوگیری شود.
ذخیرهسازی وضعیت
- ذخیرهسازی وضعیت برنامه: در برنامههای حالتگرا، وضعیت فعلی باید ذخیره شود تا در راهاندازی مجدد قابل بازیابی باشد.
- ثبت لاگها: ثبت وقایع و لاگهای مهم برای عیبیابی ضروری است.
هماهنگی با سرویسهای دیگر
- اطلاعرسانی به سرویسهای وابسته: اگر برنامه با سرویسهای دیگر تعامل دارد، باید به آنها اطلاع دهد که در حال خاموش شدن است تا آنها بتوانند اقدامات لازم را انجام دهند.
پیادهسازی در زبانهای مختلف
- جاوا: استفاده از
- پایتون: استفاده از کتابخانه
- Node.js: مدیریت خاموشی با استفاده از رویدادهای
#gracefully_shutdown
@Syntax_fa
در برنامهنویسی، فرآیند "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_fa
👍5❤1🔥1
مراحل دپلوی:
مرحله اول
1. نوشتن کد ها
2. ران کردن تست با استرس
موفقیت آمیز:
- به جدم کسی نیست در حدم
ناموفق:
- من چقدر برنامه نویس بدبختی هستم😔
مرحله دوم
1. تصحیح کد ها
2. ران کردن تست با استرس فراوان
موفقیت:
- خدایا شکرت
ناموفق:
خشم فروان
مرحله سوم
1. تصحیح دوباره کد ها
2. ران کردن تست
3. تستا چه موفق بود چه ناموفق دپلوی کن بره
#fun
@Syntax_fa
مرحله اول
1. نوشتن کد ها
2. ران کردن تست با استرس
موفقیت آمیز:
- به جدم کسی نیست در حدم
ناموفق:
- من چقدر برنامه نویس بدبختی هستم
مرحله دوم
1. تصحیح کد ها
2. ران کردن تست با استرس فراوان
موفقیت:
- خدایا شکرت
ناموفق:
خشم فروان
مرحله سوم
1. تصحیح دوباره کد ها
2. ران کردن تست
3. تستا چه موفق بود چه ناموفق دپلوی کن بره
#fun
@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣20👍7😁3
یبار برا همیشه Cron expressions رو یاد بگیر
برای زمانبندی خودکار دستورات یا اسکریپتها استفاده میشود. این ابزار در سیستمعاملهای یونیکس و لینوکس رایج است و در ابزارهایی مثل Jenkins، Kubernetes و غیره هم کاربرد دارد. Cron expressions از پنج یا شش فیلد تشکیل شدهاند که هر کدام بیانگر یک واحد زمانی است:
مثالها
1. اجرای دستور هر دقیقه:
2. اجرای دستور هر روز در ساعت ۳:۳۰ صبح:
3. اجرای دستور هر یکشنبه ساعت ۵ عصر:
4. اجرای دستور در روز اول هر ماه ساعت ۱۲ ظهر:
5. اجرای دستور هر ۵ دقیقه:
6. اجرای دستور هر دو ساعت:
علائم خاص
- **ستاره (
خط فاصله (-)
کاما (,)
اسلش (/)
مثال پیچیدهتر
اجرای یک دستور در ساعت ۱:۱۵ بعد از ظهر هر دوشنبه و چهارشنبه:
همچنین اکثر scheduler ها از cron expressions پشتیبانی میکنن. پس یبار یاد بگیر همه جا استفاده کن🍸
#cron_expression
@Syntax_fa
برای زمانبندی خودکار دستورات یا اسکریپتها استفاده میشود. این ابزار در سیستمعاملهای یونیکس و لینوکس رایج است و در ابزارهایی مثل 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_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13💋4🔥2👌1
یه رابطه عاطفی خوب از نگاه یه برنامه نویس😒 :
1. ریسپانس تایم پایین:
هر بار که پیامی به پارتنرت میفرستی، باید تو چند ثانیه پاسخ بده. اصلا یدونه تایم اوت یه دقیقه بذار اگه بعد یه دقیقه پاسخی دریافت نکردی کلا راه ارتباطی بلاک شه!
2. دیباگ کردن مشکلات:
هر وقت مشکلی پیش میاد، به جای نادیده گرفتن، باید بشینیم دیباگ کنیمش و ببینیم مشکل کجاست تا فیکسش کنیم. اگه مشکلاتو نادیده بگیریم بعدا ممکنه کل سیستمو نابود کنه
3. ورژن کنترل:
هر تصمیم مهمی باید توی یک سیستم ورژن کنترل ثبت بشه. اینطوری میتونیم به راحتی برگردیم و تغییرات رو بررسی کنیم.
4. فایروال:
برای جلوگیری ورود بیگانه، یه فایروال قوی باید داشته باشیم که هر آدم بیمورد رو بلاک کنه.
5. آپتایم رابطه:
سرور رابطه باید همیشه آپتایم باشه. اگر داونتایم زیادی داشته باشه، ممکنه کاربران (هر دو نفر) نارضایتی پیدا کنن.
6. پچهای امنیتی:
هر چند وقت یکبار باید پچهای امنیتی برای رفع باگهای قدیمی اعمال بشه تا هیچوقت به مشکل نخوریم.
7. پشتیبانگیری منظم:
از خاطرات خوب باید بهصورت منظم بکآپ گرفته بشه تا در مواقع سخت بتونیم بهشون رجوع کنیم.
8. UI/UX دلپذیر:
هیچوقت فقط بخاطر ui جذاب یکیو انتخاب نکن. خیلی مهمه در کنار ui حتما ux خوبیم داشته باشه.
شدنیه فقط بخاطر ux بشه کنار اومد ولی فقط ui شدنی نیست.
#fun
@Syntax_fa
1. ریسپانس تایم پایین:
هر بار که پیامی به پارتنرت میفرستی، باید تو چند ثانیه پاسخ بده. اصلا یدونه تایم اوت یه دقیقه بذار اگه بعد یه دقیقه پاسخی دریافت نکردی کلا راه ارتباطی بلاک شه!
2. دیباگ کردن مشکلات:
هر وقت مشکلی پیش میاد، به جای نادیده گرفتن، باید بشینیم دیباگ کنیمش و ببینیم مشکل کجاست تا فیکسش کنیم. اگه مشکلاتو نادیده بگیریم بعدا ممکنه کل سیستمو نابود کنه
3. ورژن کنترل:
هر تصمیم مهمی باید توی یک سیستم ورژن کنترل ثبت بشه. اینطوری میتونیم به راحتی برگردیم و تغییرات رو بررسی کنیم.
4. فایروال:
برای جلوگیری ورود بیگانه، یه فایروال قوی باید داشته باشیم که هر آدم بیمورد رو بلاک کنه.
5. آپتایم رابطه:
سرور رابطه باید همیشه آپتایم باشه. اگر داونتایم زیادی داشته باشه، ممکنه کاربران (هر دو نفر) نارضایتی پیدا کنن.
6. پچهای امنیتی:
هر چند وقت یکبار باید پچهای امنیتی برای رفع باگهای قدیمی اعمال بشه تا هیچوقت به مشکل نخوریم.
7. پشتیبانگیری منظم:
از خاطرات خوب باید بهصورت منظم بکآپ گرفته بشه تا در مواقع سخت بتونیم بهشون رجوع کنیم.
8. UI/UX دلپذیر:
هیچوقت فقط بخاطر ui جذاب یکیو انتخاب نکن. خیلی مهمه در کنار ui حتما ux خوبیم داشته باشه.
شدنیه فقط بخاطر ux بشه کنار اومد ولی فقط ui شدنی نیست.
#fun
@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18😁5👍4💋4👎3🤣3🥰2
الگوی Retry (Retry Pattern)
الگوی Retry به برنامهنویسان کمک میکند تا در مواجهه با خطاهای موقتی، بهطور خودکار تلاش مجدد کنند. این الگو به ویژه در تعاملات شبکهای، مانند درخواستهای HTTP یا دسترسی به پایگاه داده، مفید است. هدف این است که اگر یک عملیات ناموفق بود، بهجای شکست فوری، چند بار دیگر نیز امتحان شود.
مزایای الگوی Retry
- افزایش قابلیت اطمینان: کاهش احتمال شکست به دلیل مشکلات موقتی.
- بهبود تجربه کاربری: کاربران با خطاهای موقتی مواجه نمیشوند.
- مدیریت بهینه منابع: میتوان به جای تلاشهای بیپایان، تعداد تلاشها را محدود کرد.
نحوه استفاده در پایتون
در پایتون، میتوان از یک حلقه و استثناها برای پیادهسازی این الگو استفاده کرد. در زیر یک مثال ساده از نحوه استفاده از الگوی Retry آورده شده است.
مثال:
### توضیحات کد:
- unreliable_function: تابعی که 70% احتمال خطا دارد.
- retry: تابعی که عملیات را دوباره امتحان میکند. تعداد تلاشها و تأخیر بین آنها را میتوان تعیین کرد.
- حلقه: در صورتی که عملیات ناموفق باشد، یک پیام خطا چاپ میشود و برنامه به مدت مشخصی منتظر میماند و دوباره تلاش میکند.
- نتیجه: در نهایت، یا نتیجه موفقیتآمیز تابع اصلی برمیگردد یا پیامی مبنی بر ناموفق بودن همه تلاشها.
با استفاده از این الگو، میتوانید به راحتی عملیات خود را در مواجهه با خطاهای موقتی بهبود بخشید.
الگوی 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: تابعی که عملیات را دوباره امتحان میکند. تعداد تلاشها و تأخیر بین آنها را میتوان تعیین کرد.
- حلقه: در صورتی که عملیات ناموفق باشد، یک پیام خطا چاپ میشود و برنامه به مدت مشخصی منتظر میماند و دوباره تلاش میکند.
- نتیجه: در نهایت، یا نتیجه موفقیتآمیز تابع اصلی برمیگردد یا پیامی مبنی بر ناموفق بودن همه تلاشها.
با استفاده از این الگو، میتوانید به راحتی عملیات خود را در مواجهه با خطاهای موقتی بهبود بخشید.
💋5👍4🔥3❤1🥰1
یچی جالب که تو نسخه 12 پستگرس اضافه کرده بودن قابلیت rest api بودش
مثلا میتونستید با استفاده از rest api ها بیاید عملیات crud رو انجام بدید قابلیت authorization با jwt توکن هم داره
https://docs.postgrest.org/en/v12/tutorials/tut0.html
#fun
@Syntax_fa
مثلا میتونستید با استفاده از rest api ها بیاید عملیات crud رو انجام بدید قابلیت authorization با jwt توکن هم داره
https://docs.postgrest.org/en/v12/tutorials/tut0.html
#fun
@Syntax_fa
PostgREST 12.2
Tutorial 0 - Get it Running
author, begriffs,. Welcome to PostgREST! In this pre-tutorial we’re going to get things running so you can create your first simple API. PostgREST is a standalone web server which turns a PostgreSQL database into a RESTful API. It serves an API that is customized…
👍10💋6👀4❤2👎1
Context awareness
در بکاند، مفهوم context awareness به توانایی یک سیستم برای درک و پاسخ به شرایط و اطلاعات موجود در یک درخواست اشاره دارد. این ویژگی به توسعهدهندگان کمک میکند تا اپلیکیشنهایی بسازند که به صورت پویا و کارآمد با درخواستهای مختلف تعامل داشته باشند. چند جنبه مهم از context awareness:
دسترسی به مقادیر درخواست
در یک اپلیکیشن بکاند، دسترسی به مقادیر مختلف در یک درخواست (مثل هدرها، پارامترهای کوئری، و بدنه درخواست) بسیار مهم است. این مقادیر میتوانند برای احراز هویت، و پردازش دادهها و ... استفاده شوند.
مدیریت لغو درخواست
گاهی اوقات نیاز است که در صورت لغو درخواست از سمت کلاینت، پردازشهای در حال انجام در سرور متوقف شوند.
برای مثال:
- پایان دادن به کوئریهای دیتابیس: وقتی درخواست لغو میشود، بهتر است کوئریهای در حال اجرا در دیتابیس را متوقف کنید تا منابع سیستم آزاد شوند.
- لغو پردازشهای سنگین: اگر پردازشی طولانی در حال انجام است، لغو آن میتواند به بهبود کارایی سیستم کمک کند.
پیادهسازی در گولنگ:
در زبان Go، از context.Context استفاده میشود که به شما اجازه میدهد درخواستها را ردیابی کرده و در صورت لغو، عملیات مرتبط را متوقف کنید.
در Go، استفاده از context.Context به صورت زیر است:
در این مثال، اگر
#contex_awareness
@Syntax_fa
در بکاند، مفهوم 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_fa
👍13💋11🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
بچم از طریق اینستا با یه استاد برنامه نویسی آشنا شده داره برنامه نویسی یاد می گیره😍 😍
محتوای آموزشی استاد اینستاییش:
#fun
@Syntax_fa
محتوای آموزشی استاد اینستاییش:
#fun
@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
💋27🤣16🥰1
Syntax | سینتکس
بچم از طریق اینستا با یه استاد برنامه نویسی آشنا شده داره برنامه نویسی یاد می گیره😍 😍 محتوای آموزشی استاد اینستاییش: #fun @Syntax_fa
#موقت
پستای آخر چقدر بوسم میکنید خبریه؟
پستای آخر چقدر بوسم میکنید خبریه؟
💋35🔥2👀2
از پایتون 3.13 چخبر؟ 🍸
1. یک مفسر تعاملی (Interactive Interpreter) بهتر
پایتون 3.13 بهبودهای قابل توجهی در مفسر تعاملی به همراه پیامهای خطای پیشرفته معرفی میکند. مفسر تعاملی جدید اکنون از رنگبندی پشتیبانی میکند و تجربهای بصریتر ارائه میدهد. این پشتیبانی از رنگ به tracebacks و خروجی doctest نیز گسترش مییابد. کاربران میتوانند رنگبندی را از طریق متغیرهای محیطی PYTHON_COLORS و NO_COLOR غیرفعال کنند.
علاوه بر این، پایتون 3.12 شامل یک کامپایلر JIT (Just-In-Time) اولیه بر اساس PEP 744 است. اگرچه در حال حاضر بهطور پیشفرض غیرفعال است، این کامپایلر نشاندهنده بهبودهای عملکردی امیدوارکنندهای است و برنامههایی برای بهبودهای بیشتر در نسخههای بعدی وجود دارد.
2. کامپایل آزمایشی Just-in-Time (JIT)
پایتون یک کامپایلر آزمایشی just-in-time (JIT) معرفی میکند که در صورت فعالسازی، میتواند برخی برنامههای پایتون را سریعتر کند. کامپایلر JIT با ترجمه bytecode تخصصی Tier 1 به یک نمایش میانی داخلی Tier 2 جدید کار میکند که برای ترجمه به کد ماشین بهینه شده است. چندین مرحله بهینهسازی به Tier 2 IR اعمال میشود قبل از اینکه تفسیر یا به کد ماشین ترجمه شود. گزینههای پیکربندی (–enable-experimental-jit) به کاربران اجازه میدهد تا رفتار JIT را در زمان ساخت و اجرا کنترل کنند، از جمله فعال یا غیرفعال کردن JIT و مفسر Tier
مزایای بالقوه کامپایلر JIT:
بهبود عملکرد قابل توجه برای بخشهای خاصی از کد که از اجرای کد ماشین سود میبرند.
امکان بهینهسازیهای آینده که قبلاً با تفسیر bytecode ممکن نبودند.
3. سی پایتون (CPython) آزمایشی بدون GIL
سی پایتون اکنون از اجرای بدون Global Interpreter Lock (GIL) پشتیبانی میکند، که امکان اجرای multithreadding آزاد را با پیکربندی –disable-gil فراهم میسازد. اجرای چندریسمانی آزاد به بهرهبرداری بهتر از هستههای CPU موجود از طریق اجرای موازی ریسمانها کمک میکند و به برنامههایی که برای threading طراحی شدهاند، سود میرساند.
ماژولهای توسعه C-API باید بهطور خاص برای ساختار چندریسمانی آزاد ساخته شوند و باید با استفاده از مکانیزمهای مناسب، پشتیبانی از اجرای بدون GIL را نشان دهند.
4. گزارشدهی و راهنمایی خطای بهبود یافته
ردیابی خطا در پایتون در نسخه جدید بهبود یافته است. مفسر اکنون پیامهای خطا را بهطور پیشفرض هنگام نمایش tracebacks رنگی میکند. در ویژگی دیگر، پیام خطا در صورت ارسال یک کلیدواژه اشتباه به یک تابع، کلیدواژه صحیح را پیشنهاد میدهد.
گاهی اوقات که یک اسکریپت همنام یک ماژول کتابخانه استاندارد است، پایتون اکنون پیام خطای دقیقی ارائه میدهد و پیشنهاد میکند برای درک بهتر، نام ماژول تغییر کند.
5. جمعآوری زباله افزایشی
پایتون 3.12 جمعآوری زباله افزایشی را معرفی میکند که زمان توقف حداکثر را برای هیپهای بزرگتر به طور قابل توجهی کاهش میدهد. این بهبود بهویژه برای برنامههایی با تخصیص و آزادسازی حافظه زیاد مفید است.
این ویژگی به برنامههای پایتون اجازه میدهد تا روانتر اجرا شوند و تأثیر توقفهای جمعآوری زباله کاهش یابد، که به بهبود عملکرد کلی و واکنشپذیری منجر میشود.
6. بهینهسازی حافظه برای Docstrings
پایتون 3.13 تغییری ظریف اما مؤثر برای بهبود کارایی حافظه معرفی میکند: بهینهسازی حافظه برای Docstrings. این ویژگی منبع پنهانی از استفاده حافظه و اندازه فایل مرتبط با docstrings در کد پایتون را هدف قرار میدهد.
محدودیتهای Docstrings سنتی در پایتون به شرح زیر است:
بهطور سنتی، docstrings در پایتون شامل هر گونه فاصله تورفتگی ابتدایی بودند. در حالی که این فضاهای اضافی به نظر بیضرر میآیند، به اندازه کلی فایلهای bytecode کامپایلشده (.pyc) افزوده و احتمالاً استفاده از حافظه را هنگام اجرای کد افزایش میدادند.
مزایای بهینهسازی حافظه برای Docstrings:
بهینهسازی حافظه برای Docstrings این ناکارآمدی را برطرف میکند. بهطور خودکار هر گونه تورفتگی ابتدایی را از docstrings قبل از فرآیند کامپایل حذف میکند.
این اطمینان میدهد که تنها محتوای واقعی docstring ذخیره میشود، که منجر به:
کاهش استفاده از حافظه برای فایلهای bytecode کامپایلشده.
احتمالاً کاهش استفاده از حافظه در هنگام اجرای برنامه، بهویژه برای پروژههایی با docstring گسترده.
Source
#python
@Syntax_fa
1. یک مفسر تعاملی (Interactive Interpreter) بهتر
پایتون 3.13 بهبودهای قابل توجهی در مفسر تعاملی به همراه پیامهای خطای پیشرفته معرفی میکند. مفسر تعاملی جدید اکنون از رنگبندی پشتیبانی میکند و تجربهای بصریتر ارائه میدهد. این پشتیبانی از رنگ به tracebacks و خروجی doctest نیز گسترش مییابد. کاربران میتوانند رنگبندی را از طریق متغیرهای محیطی PYTHON_COLORS و NO_COLOR غیرفعال کنند.
علاوه بر این، پایتون 3.12 شامل یک کامپایلر JIT (Just-In-Time) اولیه بر اساس PEP 744 است. اگرچه در حال حاضر بهطور پیشفرض غیرفعال است، این کامپایلر نشاندهنده بهبودهای عملکردی امیدوارکنندهای است و برنامههایی برای بهبودهای بیشتر در نسخههای بعدی وجود دارد.
2. کامپایل آزمایشی Just-in-Time (JIT)
پایتون یک کامپایلر آزمایشی just-in-time (JIT) معرفی میکند که در صورت فعالسازی، میتواند برخی برنامههای پایتون را سریعتر کند. کامپایلر JIT با ترجمه bytecode تخصصی Tier 1 به یک نمایش میانی داخلی Tier 2 جدید کار میکند که برای ترجمه به کد ماشین بهینه شده است. چندین مرحله بهینهسازی به Tier 2 IR اعمال میشود قبل از اینکه تفسیر یا به کد ماشین ترجمه شود. گزینههای پیکربندی (–enable-experimental-jit) به کاربران اجازه میدهد تا رفتار JIT را در زمان ساخت و اجرا کنترل کنند، از جمله فعال یا غیرفعال کردن JIT و مفسر Tier
مزایای بالقوه کامپایلر JIT:
بهبود عملکرد قابل توجه برای بخشهای خاصی از کد که از اجرای کد ماشین سود میبرند.
امکان بهینهسازیهای آینده که قبلاً با تفسیر bytecode ممکن نبودند.
3. سی پایتون (CPython) آزمایشی بدون GIL
سی پایتون اکنون از اجرای بدون Global Interpreter Lock (GIL) پشتیبانی میکند، که امکان اجرای multithreadding آزاد را با پیکربندی –disable-gil فراهم میسازد. اجرای چندریسمانی آزاد به بهرهبرداری بهتر از هستههای CPU موجود از طریق اجرای موازی ریسمانها کمک میکند و به برنامههایی که برای threading طراحی شدهاند، سود میرساند.
ماژولهای توسعه C-API باید بهطور خاص برای ساختار چندریسمانی آزاد ساخته شوند و باید با استفاده از مکانیزمهای مناسب، پشتیبانی از اجرای بدون GIL را نشان دهند.
4. گزارشدهی و راهنمایی خطای بهبود یافته
ردیابی خطا در پایتون در نسخه جدید بهبود یافته است. مفسر اکنون پیامهای خطا را بهطور پیشفرض هنگام نمایش tracebacks رنگی میکند. در ویژگی دیگر، پیام خطا در صورت ارسال یک کلیدواژه اشتباه به یک تابع، کلیدواژه صحیح را پیشنهاد میدهد.
گاهی اوقات که یک اسکریپت همنام یک ماژول کتابخانه استاندارد است، پایتون اکنون پیام خطای دقیقی ارائه میدهد و پیشنهاد میکند برای درک بهتر، نام ماژول تغییر کند.
>>> sys.version_info
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'sys' is not defined. Did you forget to import 'sys'!
5. جمعآوری زباله افزایشی
پایتون 3.12 جمعآوری زباله افزایشی را معرفی میکند که زمان توقف حداکثر را برای هیپهای بزرگتر به طور قابل توجهی کاهش میدهد. این بهبود بهویژه برای برنامههایی با تخصیص و آزادسازی حافظه زیاد مفید است.
# Python 3.12
import gc
gc.isincremental() # Returns True
این ویژگی به برنامههای پایتون اجازه میدهد تا روانتر اجرا شوند و تأثیر توقفهای جمعآوری زباله کاهش یابد، که به بهبود عملکرد کلی و واکنشپذیری منجر میشود.
6. بهینهسازی حافظه برای Docstrings
پایتون 3.13 تغییری ظریف اما مؤثر برای بهبود کارایی حافظه معرفی میکند: بهینهسازی حافظه برای Docstrings. این ویژگی منبع پنهانی از استفاده حافظه و اندازه فایل مرتبط با docstrings در کد پایتون را هدف قرار میدهد.
محدودیتهای Docstrings سنتی در پایتون به شرح زیر است:
بهطور سنتی، docstrings در پایتون شامل هر گونه فاصله تورفتگی ابتدایی بودند. در حالی که این فضاهای اضافی به نظر بیضرر میآیند، به اندازه کلی فایلهای bytecode کامپایلشده (.pyc) افزوده و احتمالاً استفاده از حافظه را هنگام اجرای کد افزایش میدادند.
مزایای بهینهسازی حافظه برای Docstrings:
بهینهسازی حافظه برای Docstrings این ناکارآمدی را برطرف میکند. بهطور خودکار هر گونه تورفتگی ابتدایی را از docstrings قبل از فرآیند کامپایل حذف میکند.
این اطمینان میدهد که تنها محتوای واقعی docstring ذخیره میشود، که منجر به:
کاهش استفاده از حافظه برای فایلهای bytecode کامپایلشده.
احتمالاً کاهش استفاده از حافظه در هنگام اجرای برنامه، بهویژه برای پروژههایی با docstring گسترده.
Source
#python
@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13💋3👍2❤1🥰1
اولین نسخه از زبون GoSharp منتشر شد 👍
زبان GoSharp یک فورک از Golang هستش
تبریک به سی هشتگ ها که یک رقیب جدید پیدا کردن و گو هشتگ هم اضافه شد.
با اولین فیچری که اضافه شد، شما میتونید فقط با نوشتن یک '?' ، خطا رو بدون نوشتن if err != nil برگردونید.
مخزن گیتهاب
https://github.com/0x9n0p/gosharp
source
#news
@Syntax_fa
زبان GoSharp یک فورک از Golang هستش
تبریک به سی هشتگ ها که یک رقیب جدید پیدا کردن و گو هشتگ هم اضافه شد.
با اولین فیچری که اضافه شد، شما میتونید فقط با نوشتن یک '?' ، خطا رو بدون نوشتن if err != nil برگردونید.
مخزن گیتهاب
https://github.com/0x9n0p/gosharp
source
#news
@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
💋8😁3🔥2🤣2👍1
بنظر دو ماه پیش سینتکس یساله شده بود تازه متوجه شدم.
سعی کردم به این شکل پیش بریم که محتوای کانال نه خیلی جدی باشه نه خیلی اینستایی
جمعی دوستانه که در کنار هم یاد بگیریم و بخندیم
تشکر برای همه حمایت ها
از جمله:
هومن تصادف، امینعلی بلخی، امیرحسین سنجاب، حمید توسعه دهنده ی انتهای پشت، سیاوش توسعه دهنده ی انتهای جلو، اوستا مهندس سعید رضایی، امیرحسین مزدور، مجتبی رابطه ای، بهزاد تری دی، مهریماه مرغی، برادر رضا، علی بامرام، معین سیگما، علی تعصبی، جز کرشمه
و جمع دیگری از اساتید که اسمشونو نبردم.
سعی کردم به این شکل پیش بریم که محتوای کانال نه خیلی جدی باشه نه خیلی اینستایی
جمعی دوستانه که در کنار هم یاد بگیریم و بخندیم
تشکر برای همه حمایت ها
از جمله:
هومن تصادف، امینعلی بلخی، امیرحسین سنجاب، حمید توسعه دهنده ی انتهای پشت، سیاوش توسعه دهنده ی انتهای جلو، اوستا مهندس سعید رضایی، امیرحسین مزدور، مجتبی رابطه ای، بهزاد تری دی، مهریماه مرغی، برادر رضا، علی بامرام، معین سیگما، علی تعصبی، جز کرشمه
و جمع دیگری از اساتید که اسمشونو نبردم.
🤣19❤4💋4👀3🎉2👍1🔥1🤨1
پروتکل بافر (Protocol Buffers)
پروتکل بافر یک روش سریالیزیشن دادهها است که به شما اجازه میدهد دادهها را به صورت ساختاریافته و بهینه ذخیره و منتقل کنید. این روش بهویژه در سیستمهای توزیعشده و میکروسرویسها کاربرد فراوانی دارد.
مزایای پروتکل بافر:
- فشردهسازی: دادهها به صورت باینری ذخیره میشوند، که باعث کاهش حجم میشود.
- قابلیت توسعه: میتوانید به سادگی فیلدهای جدید به پیامها اضافه کنید.
- پشتیبانی از چندین زبان: از زبانهای مختلفی پشتیبانی میکند و میتوانید کد های زبان های مختلفی رو با کامپایر پروتکل بافر ایجاد کنید.
از پروتکل بافر می توانیم در هسته سیستم خودمون، تو شرایط مختلفی که نیاز به سریالیزیشن و انتقال دیتا داریم، استفاده کنیم حتی اگر grpc هم استفاده نکنیم.
مثال: استفاده از پروتکل بافر در یک سیستم Message Driven
بیایید یک سناریو فرضی بسازیم که در آن از پروتکل بافر برای سریالیزیشن پیامها در یک سیستم مبتنی بر پیام استفاده میکنیم. ما یک سرویس داریم که دادههای کاربر را دریافت میکند و آنها را به یک صف پیام ارسال میکند.
۱. تعریف پیامها
ابتدا ساختار پیامها را در یک فایل
۲. تولید کد گولنگ
برای تولید کد گولنگ، ابتدا باید ابزار
سپس، کد گولنگ را با دستور زیر تولید کنید:
۳. ارسال پیام به سیستم Message Driven
حالا بیایید یک تولیدکننده پیام ایجاد کنیم که یک کاربر را سریالیزه کرده و به یک صف پیام (مثل Kafka) ارسال کند.
۴. کانسیوم پیام از سیستم Message Driven
حالا بیایید یک consumer پیام بسازیم که پیامهای دریافتی را دیسریالیزه کند:
#protocol_buffer
@Syntax_fa
پروتکل بافر یک روش سریالیزیشن دادهها است که به شما اجازه میدهد دادهها را به صورت ساختاریافته و بهینه ذخیره و منتقل کنید. این روش بهویژه در سیستمهای توزیعشده و میکروسرویسها کاربرد فراوانی دارد.
مزایای پروتکل بافر:
- فشردهسازی: دادهها به صورت باینری ذخیره میشوند، که باعث کاهش حجم میشود.
- قابلیت توسعه: میتوانید به سادگی فیلدهای جدید به پیامها اضافه کنید.
- پشتیبانی از چندین زبان: از زبانهای مختلفی پشتیبانی میکند و میتوانید کد های زبان های مختلفی رو با کامپایر پروتکل بافر ایجاد کنید.
از پروتکل بافر می توانیم در هسته سیستم خودمون، تو شرایط مختلفی که نیاز به سریالیزیشن و انتقال دیتا داریم، استفاده کنیم حتی اگر grpc هم استفاده نکنیم.
مثال: استفاده از پروتکل بافر در یک سیستم Message Driven
بیایید یک سناریو فرضی بسازیم که در آن از پروتکل بافر برای سریالیزیشن پیامها در یک سیستم مبتنی بر پیام استفاده میکنیم. ما یک سرویس داریم که دادههای کاربر را دریافت میکند و آنها را به یک صف پیام ارسال میکند.
۱. تعریف پیامها
ابتدا ساختار پیامها را در یک فایل
.proto تعریف میکنیم:syntax = "proto3";
package user;
message User {
string name = 1;
int32 age = 2;
}
۲. تولید کد گولنگ
برای تولید کد گولنگ، ابتدا باید ابزار
protoc و پلاگین Go را نصب کنید:go get google.golang.org/protobuf/cmd/protoc-gen-go
سپس، کد گولنگ را با دستور زیر تولید کنید:
protoc --go_out=. user.proto
۳. ارسال پیام به سیستم Message Driven
حالا بیایید یک تولیدکننده پیام ایجاد کنیم که یک کاربر را سریالیزه کرده و به یک صف پیام (مثل Kafka) ارسال کند.
package main
import (
"log"
"github.com/confluentinc/confluent-kafka-go/kafka"
"google.golang.org/protobuf/proto"
"your_project/user"
)
func main() {
producer, err := kafka.NewProducer(&kafka.ConfigMap{"bootstrap.servers": "localhost:9092"})
if err != nil {
log.Fatal(err)
}
defer producer.Close()
// create user
user := &user.User{
Name: "Alice",
Age: 30,
}
// serialize data
data, err := proto.Marshal(user)
if err != nil {
log.Fatal("Failed to serialize user:", err)
}
// publish a message
topic := "users"
err = producer.Produce(&kafka.Message{
TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny},
Value: data,
}, nil)
if err != nil {
log.Fatal("Failed to send message:", err)
}
producer.Flush(15 * 1000)
log.Println("User sent to Kafka:", user.Name)
}
۴. کانسیوم پیام از سیستم Message Driven
حالا بیایید یک consumer پیام بسازیم که پیامهای دریافتی را دیسریالیزه کند:
package main
import (
"log"
"github.com/confluentinc/confluent-kafka-go/kafka"
"google.golang.org/protobuf/proto"
"your_project/user"
)
func main() {
consumer, err := kafka.NewConsumer(&kafka.ConfigMap{
"bootstrap.servers": "localhost:9092",
"group.id": "user_group",
"auto.offset.reset": "earliest",
})
if err != nil {
log.Fatal(err)
}
defer consumer.Close()
consumer.SubscribeTopics([]string{"users"}, nil)
for {
msg, err := consumer.ReadMessage(-1)
if err != nil {
log.Println("Error reading message:", err)
continue
}
// deserialization
receivedUser := &user.User{}
if err := proto.Unmarshal(msg.Value, receivedUser); err != nil {
log.Println("Failed to unmarshal user:", err)
continue
}
// use info
log.Printf("Received User: Name: %s, Age: %d\n", receivedUser.Name, receivedUser.Age)
}
}
#protocol_buffer
@Syntax_fa
pkg.go.dev
protoc-gen-go command - google.golang.org/protobuf/cmd/protoc-gen-go - Go Packages
The protoc-gen-go binary is a protoc plugin to generate Go code for both proto2 and proto3 versions of the protocol buffer language.
💋8👍5❤🔥3😁1
تو چند دقیقه نحوه کار با Redis Pub/Sub رو تو پایتون یاد بگیر
Pub/Sub
(انتشار/اشتراک) یک الگوی معماری است که به برنامهها اجازه میدهد تا به صورت غیرمستقیم با یکدیگر ارتباط برقرار کنند. در این الگو، تولیدکنندگان اطلاعات (Publisher) پیامها را منتشر میکنند و مصرفکنندگان (Subscriber) به موضوعات (Topics) خاصی که به آنها علاقهمند هستند، اشتراک میگذارند. این سیستم اجازه میدهد تا بدون نیاز به وابستگی مستقیم با یکدیگر، اطلاعات را تبادل کنند.
مزایای Pub/Sub
- کاهش وابستگیها: تولیدکنندگان و مصرفکنندگان نیازی به شناخت یکدیگر ندارند.
- مقیاسپذیری: میتوان به سادگی مصرفکنندگان و تولیدکنندگان جدیدی اضافه کرد.
- توزیعپذیری: میتوان سیستمها را به صورت توزیعشده پیادهسازی کرد.
مثال ساده با Redis Pub/Sub
در این مثال، از Redis به عنوان سیستم Pub/Sub استفاده خواهیم کرد. ابتدا باید Redis را نصب و راهاندازی کنید.
نصب Redis
تو ریپازیتوری ای که لینکشو آخر پست میذارم، سرویس ردیس رو توی docker-compose.yml مشخص کردم و روی داکر اجراش میکنیم.
همچنین داخل فایل .env تنظیمات ردیس رو میتونید مشخص کنید.
پیادهسازی در پایتون
برای این کار به کتابخانه
در این مثال، یک Publisher و یک Subscriber خواهیم داشت.
Publisher (server.py):
در قدم اول کانکشن با ردیس رو می سازیم.
با متد ping میتونیم چک کنیم وضعیت کانگشنمون اوکی هست یا نه(جنبه آموزشی نوشتمش)
بعد مشخص کردیم که topic ما اسمش چیه.
دیتایی که قراره داخل payload مسیج قرار بدیم رو مشخص کردیم که بصورت دیکشنری هستش و بعدش اومدیم به json تبدیلش کردیم و مسیح رو پابلیش کردیم.
Subscriber (client.py):
در قدم اول یک کانکشن ردیس گرفتیم. بعد تاپیکی که subscribe میکنیمش رو مشخص کردیم(میتونیم چندین تا تاپیک رو سابسکرایب کنیم)
در قدم بعدی داخل یک long running میایم به مسیج های جدیدی که میاد گوش میدیم و یک switch case زدیم و براساس تاپیک ها میتونیم کارهای خاص خودش رو انجام بدیم.
نحوه اجرا
1. در یک ترمینال،
2. در یک ترمینال دیگه server.py رو اجرا کنید که با هربار اجرا یک مسیج رو پابلیش میکنه.
سورس کد:
https://github.com/alireza-fa/redis-pub-sub-example
#redis_pub_sub #pub_sub #event_driven #python
@Syntax_fa
Pub/Sub
(انتشار/اشتراک) یک الگوی معماری است که به برنامهها اجازه میدهد تا به صورت غیرمستقیم با یکدیگر ارتباط برقرار کنند. در این الگو، تولیدکنندگان اطلاعات (Publisher) پیامها را منتشر میکنند و مصرفکنندگان (Subscriber) به موضوعات (Topics) خاصی که به آنها علاقهمند هستند، اشتراک میگذارند. این سیستم اجازه میدهد تا بدون نیاز به وابستگی مستقیم با یکدیگر، اطلاعات را تبادل کنند.
مزایای Pub/Sub
- کاهش وابستگیها: تولیدکنندگان و مصرفکنندگان نیازی به شناخت یکدیگر ندارند.
- مقیاسپذیری: میتوان به سادگی مصرفکنندگان و تولیدکنندگان جدیدی اضافه کرد.
- توزیعپذیری: میتوان سیستمها را به صورت توزیعشده پیادهسازی کرد.
مثال ساده با Redis Pub/Sub
در این مثال، از Redis به عنوان سیستم Pub/Sub استفاده خواهیم کرد. ابتدا باید Redis را نصب و راهاندازی کنید.
نصب Redis
تو ریپازیتوری ای که لینکشو آخر پست میذارم، سرویس ردیس رو توی docker-compose.yml مشخص کردم و روی داکر اجراش میکنیم.
همچنین داخل فایل .env تنظیمات ردیس رو میتونید مشخص کنید.
docker-compose up -d
پیادهسازی در پایتون
برای این کار به کتابخانه
redis نیاز داریم. میتوانید آن را با pip نصب کنید:pip install redis
در این مثال، یک Publisher و یک Subscriber خواهیم داشت.
Publisher (server.py):
import json
from redis import StrictRedis
server = StrictRedis(host="localhost", port=6399, password="redis_password", db=0)
# redis ping
print(server.ping())
topic = "example_topic"
data = {
"name": "alireza",
"age": 22,
}
server.publish(channel=topic, message=json.dumps(data))
در قدم اول کانکشن با ردیس رو می سازیم.
با متد ping میتونیم چک کنیم وضعیت کانگشنمون اوکی هست یا نه(جنبه آموزشی نوشتمش)
بعد مشخص کردیم که topic ما اسمش چیه.
دیتایی که قراره داخل payload مسیج قرار بدیم رو مشخص کردیم که بصورت دیکشنری هستش و بعدش اومدیم به json تبدیلش کردیم و مسیح رو پابلیش کردیم.
Subscriber (client.py):
import json
from redis import StrictRedis
client = StrictRedis(host="localhost", port=6399, password="redis_password", db=0)
topic = "example_topic"
pubsub = client.pubsub()
pubsub.subscribe(topic)
print("waiting for message...")
while True:
for message in pubsub.listen():
if message["data"] == 1:
continue
match message["type"]:
case topic:
# TODO - change serialization. json is not good
data = json.loads(message["data"])
print("received message", data["name"], data["age"])
در قدم اول یک کانکشن ردیس گرفتیم. بعد تاپیکی که subscribe میکنیمش رو مشخص کردیم(میتونیم چندین تا تاپیک رو سابسکرایب کنیم)
در قدم بعدی داخل یک long running میایم به مسیج های جدیدی که میاد گوش میدیم و یک switch case زدیم و براساس تاپیک ها میتونیم کارهای خاص خودش رو انجام بدیم.
نحوه اجرا
1. در یک ترمینال،
client.py را اجرا کنید2. در یک ترمینال دیگه server.py رو اجرا کنید که با هربار اجرا یک مسیج رو پابلیش میکنه.
سورس کد:
https://github.com/alireza-fa/redis-pub-sub-example
#redis_pub_sub #pub_sub #event_driven #python
@Syntax_fa
🔥6💋4👍3❤1👎1🙏1