Syntax | سینتکس – Telegram
پکیج `python-decouple`

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

ویژگی‌ها
- مدیریت متغیرهای محیطی: متغیرهای محیطی را از فایل .env بارگذاری می‌کند.
- پشتیبانی از انواع داده‌ها: قابلیت تبدیل مقادیر متغیرها به انواع داده‌ای مختلف مانند int`، `float`، `bool و ...
- مقدار پیش‌فرض: امکان تعریف مقادیر پیش‌فرض برای متغیرهایی که ممکن است در محیط تنظیم نشده باشند.

نصب

برای نصب پکیج python-decouple می‌توانید از دستور زیر استفاده کنید:
pip install python-decouple


نحوه استفاده

1. ایجاد فایل `.env`:
ابتدا یک فایل با نام .env در ریشه پروژه خود ایجاد کنید و تنظیمات مورد نظر خود را در آن وارد کنید. برای مثال:

   DEBUG=True
SECRET_KEY=mysecretkey
DATABASE_URL=postgres://user:password@localhost:5432/mydatabase


2. استفاده از `config` در کد پایتون:
در کد پایتون خود، پکیج decouple را وارد کرده و از Config استفاده کنید:

   from decouple import config

DEBUG = config('DEBUG', default=False, cast=bool)
SECRET_KEY = config('SECRET_KEY')
DATABASE_URL = config('DATABASE_URL')


3. توضیحات بیشتر:
- config('DEBUG', default=False, cast=bool):
این خط مقدار متغیر DEBUG را از فایل .env می‌خواند و آن را به نوع bool تبدیل می‌کند. اگر این متغیر در فایل .env موجود نباشد، مقدار پیش‌فرض False استفاده می‌شود.
- config('SECRET_KEY'):
این خط مقدار متغیر SECRET_KEY را از فایل .env می‌خواند.
- config('DATABASE_URL'):
این خط مقدار متغیر DATABASE_URL را از فایل .env می‌خواند.

مثال کامل

فرض کنید یک پروژه ساده دارید که از Flask استفاده می‌کند و می‌خواهید تنظیمات خود را با استفاده از python-decouple مدیریت کنید.

1. ایجاد فایل `.env`:

   DEBUG=True
SECRET_KEY=mysecretkey
DATABASE_URL=sqlite:///mydatabase.db


2. کد پایتون:

   from flask import Flask
from decouple import config

app = Flask(__name__)

app.config['DEBUG'] = config('DEBUG', default=False, cast=bool)
app.config['SECRET_KEY'] = config('SECRET_KEY')
app.config['SQLALCHEMY_DATABASE_URI'] = config('DATABASE_URL')

@app.route('/')
def home():
return "Hello, World!"

if __name__ == '__main__':
app.run()


این کد یک برنامه ساده Flask ایجاد می‌کند که تنظیمات خود را از فایل .env می‌خواند. با این کار، می‌توانید به راحتی تنظیمات خود را تغییر دهید بدون اینکه نیاز به تغییر در کد داشته باشید.

#python_decouple

@Syntax_fa
👍3🔥21👌1
سوال مصاحبه جنگویی:

سطح: سخت

تو جنگو میخوایم هر درخواست HTTP بصورت خودکار توی یک تراکنس دیتابیس قرار بگیره. یعنی اگه هرکدوم از عملیات های دیتابیس در طول پردازش یک درخواست HTTP با خطا مواجه بشه، تموم تغییراتی که توی دیتابیس اعمال شده rollback شه.
بنظرت چیکار میتونیم بکنیم؟

قبل اینکه جوابو ببینی یکم فکر کن یا سرچ کن 😒:
و اما جواب:

میتونیم با اضافه کردن این خط تو settings.py این قابلیت رو اضافه کنیم:
DATABASES["default"]["ATOMIC_REQUESTS"] = True

و اما یه جواب خفن و درست تر توسط [abbasi_ai]:
Atomic request
جواب اصلی سوال نیست، بنظرم چیزی جا افتاده

با توجه به صورت سوال؛ فکر می‌کنم یک session manager هم نیاز هست.
و اگر توی درخواست‌های بعدی یوزر هم چیزی به خطا بخوره تا درخواست اصلی همه چیز باید
Rollback
بخوره


اگه فقط بخوایم تو ویو های خاصی atomic requets رو داشته باشیم چیکار کنیم؟
و جواب این سوال:
میتونیم از دکوریتور atomic استفاده کنیم:
from django.db import transaction
from django.views import View

class MyView(View):

@transaction.atomic
def get(self, request, *args, **kwargs):
...


#interview_question #django

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
👀8👍6👌32
This media is not supported in your browser
VIEW IN TELEGRAM
از اونجا که بعضیاتون گفتید چرا همش درباره سی شارپو پی اچ پی میم میذاری. اینم یه میم درباره پایتون

#fun

@Syntax_fa
🤣28❤‍🔥4👎3👍2👌1
اگه کدی که مینویسی، این ویژگی هارو نداره، یه فکری به حال خودت کن 😔:

۱. کدتون مستقل از فریم ورک باشه:
معماری شما نباید وابسته به یه فریم ورک خاص باشه.
کدتون این امکانو بده از فریم ورک ها مثل ابزار ها استفاده کنید بدون اینکه وابسته به محدودیت های یک فریم ورک خاص بشید.

۲. کدتون قابل تست کردن باشه:
قابل تست بودن به این معنیه که بتونید business logic هارو بدون یو آی، دیتابیس، وب سرور یا هر چی وابستگی خارجی که هست، تست کنید.

۳. نباید به ui وابستگی داشته باشید!
قسمت ui رو باید بتونید به راحتی جایگزینش کنید.
مثلا از یک وب ui بتونید بدون اینکه قسمت های دیگه کدتون تغییره کنه، به کنسول و برنامه cli تغییرش بدید.

۴. معماریتون باید مستقل از دیتابیس باشه!
برای مثال: میتونید دیتابیستون رو به راحتی از mysql به mongodb تغییر بدید؟

۵. نباید به یک سرویس خارجی وابستگی داشته باشید!
برای مثال اگه از سرویس اس ام اس استفاده میکنید، آیا میتونید به راحتی بجای کاوه نگار از یه سرویس دیگه استفاده کنید؟

منبع:
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

#note

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13👌4👎3🔥21
با پیشرفت فنّاوری و توسعه روزافزون استفاده از نرم‌افزارها و هوش مصنوعی، استفاده از ابزارها و مکانیزم‌های مختلفی برای توسعهٔ سریع و باکیفیت نرم‌افزارها ضروری است. در این کتاب مجموعه مواردی بیان شده است که به معرفی و پیاده‌سازی این روش‌ها می‌پردازند. چه برای افزایش دانش در حوزه نرم‌افزار و چه برای آشنایی با ابزارها و روش‌های پیاده‌سازی نرم‌افزارهای مدرن و چه برای آمادگی برای مصاحبه‌های شغلی برای مهندسی نرم‌افزار، این کتاب برای شما بسیار مناسب است.

لینک دانلود کتاب

آدرس گیتهاب این کتاب برای بروزرسانی‌ها

https://system-design.ir

Source:
@GoInsights

#book

@Syntax_fa
👍92🔥1
GHOFLE
قفله یک پروژه اپن سورس جنگویی است.
تمرکز اصلی پروژه کار با AWS S3 و Authentication و Payment service هستش.

از اساتید و افراد باتجربه درخواست میکنم اگه میتونن یه نگاه به سورس کد پروژه بندازن و مشکلاتش رو تو کامنت همین پست یا پیوی بگن🙏

نهایت هدف اینه تبدیل به یه پروژه اپن سورس خوب بشه تا بدرد بقیه افراد بخوره

(همچنین اگه دوست دارید برای توسعه پروژه مشارکت داشته باشید، پیوی پیام بدید)

https://github.com/alireza-fa/ghofle
🔥72👍2👏1
Gitmoji

وب‌سایت [Gitmoji](https://gitmoji.dev/) یک منبع آنلاین است که به توسعه‌دهندگان کمک می‌کند تا از ایموجی‌ها در پیام‌های کامیت‌های خود استفاده کنند. این وب‌سایت مجموعه‌ای از ایموجی‌ها را فراهم می‌کند که هر یک به یک نوع تغییر یا فعالیت خاص در کد اشاره دارند. به عنوان مثال:

- 🐛: برای فیکس کردن باگ‌ها
- : برای اضافه کردن یک ویژگی جدید
- 📝: برای به‌روزرسانی مستندات
- 🎨: برای بهبود ساختار یا ظاهر کد بدون تغییر عملکرد

استفاده از Gitmoji باعث می‌شود که تاریخچه کامیت‌ها خواناتر و قابل فهم‌تر شود و اعضای تیم توسعه‌دهنده بتوانند با نگاه به ایموجی‌ها به سرعت متوجه نوع تغییرات اعمال شده شوند. این ابزار به‌خصوص برای پروژه‌های متن‌باز و تیم‌های بزرگی که بر روی یک کدبیس کار می‌کنند، مفید است.

مثال:
git commit -m ":bug: fix a bug"


#note #gitmoji

@Syntax_Fa
👍9🔥31👎1
زبون برنامه نویسیت پرحرفه یا کم حرفه ؟🤏

موقع صحبت از کد زبان‌های برنامه‌نویسی، کلمات 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🔥51
دنیای تکنولوژی و 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
👍8👌1
This media is not supported in your browser
VIEW IN TELEGRAM
در صدا و سیما چه میگذرد
اون دختره ندونه بازم منطقیه

ولی آخه جواب درست html ؟ 😠

#fun

@Syntax_fa
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
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👏21❤‍🔥1🎉1
از اونجا که بچه های گروه زیادی از جنگو خوششون میاد، اینم چند تا نکته جنگویی(قسمت اول):

۱. چطور از ایمپورت 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 مربوط به اون خدمات یا محصول هستش:
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" به معنی خاموش کردن برنامه به‌صورتی است که از بروز اختلالات و از دست رفتن داده‌ها جلوگیری شود. این موضوع در سیستم‌های توزیع‌شده، سرورها و برنامه‌های بلادرنگ اهمیت بیشتری پیدا می‌کند.

مدیریت سیگنال‌ها

- سیگنال‌ها: سیستم‌عامل‌ها سیگنال‌هایی مثل 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
👍51🔥1
مراحل دپلوی:

مرحله اول
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. اجرای دستور هر روز در ساعت ۳:۳۰ صبح:

 
   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
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥18😁5👍4💋4👎3🤣3🥰2
الگوی 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: تابعی که عملیات را دوباره امتحان می‌کند. تعداد تلاش‌ها و تأخیر بین آن‌ها را می‌توان تعیین کرد.
- حلقه: در صورتی که عملیات ناموفق باشد، یک پیام خطا چاپ می‌شود و برنامه به مدت مشخصی منتظر می‌ماند و دوباره تلاش می‌کند.
- نتیجه: در نهایت، یا نتیجه موفقیت‌آمیز تابع اصلی برمی‌گردد یا پیامی مبنی بر ناموفق بودن همه تلاش‌ها.

با استفاده از این الگو، می‌توانید به راحتی عملیات خود را در مواجهه با خطاهای موقتی بهبود بخشید.
💋5👍4🔥31🥰1
یچی جالب که تو نسخه 12 پستگرس اضافه کرده بودن قابلیت rest api بودش
مثلا میتونستید با استفاده از rest api ها بیاید عملیات crud رو انجام بدید قابلیت authorization با jwt توکن هم داره

https://docs.postgrest.org/en/v12/tutorials/tut0.html

#fun

@Syntax_fa
👍10💋6👀42👎1
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_fa
👍13💋11🔥1