Hard Coding
به معنای استفاده از مقادیر ثابت و تعریفشده درون کد یک برنامه، بهجای استفاده از ورودیهای داینامیک، متغیرها یا منابع خارجی (مثل فایلهای کانفیگ یا پایگاههای داده). در این روش، مقادیر بهصورت مستقیم در کد قرار میگیرند و برای تغییر آنها نیاز به ویرایش دستی کد است.
مثال ساده:
مزایای Hard Coding
1. سادگی اولیه: کدنویسی سریعتر و آسانتر است، زیرا نیازی به ایجاد ساختارهای پیچیده برای مدیریت مقادیر نیست.
2. کاهش پیچیدگی در پروژههای کوچک: در برنامههای کوچک و ساده، ممکن است نیازی به طراحی سیستمهای دینامیک برای مدیریت مقادیر نباشد.
3. کاهش وابستگی به منابع خارجی: در صورت hard coding، نیازی به مدیریت فایلهای پیکربندی، پایگاه داده یا ورودیهای خارجی وجود ندارد.
معایب Hard Coding
1. کاهش انعطافپذیری: تغییر مقادیر ثابت نیازمند تغییر کد منبع و بازنویسی یا بازسازی برنامه است، که میتواند زمانبر باشد.
2. نگهداری سختتر: در برنامههای بزرگ، مدیریت مقادیر hard coded دشوار است و میتواند باعث افزایش احتمال بروز خطا شود.
3. محدودیت در تنظیمات داینامیک: برنامههای مبتنی بر hard coding نمیتوانند به راحتی خود را با شرایط یا محیطهای مختلف سازگار کنند.
جایگزینها برای Hard Coding
1. استفاده از فایلهای تنظیمات (Config Files): ذخیره مقادیر در فایلهای خارجی مانند
2. دیتابیس: استفاده از دیتابیس برای مدیریت مقادیر پویا.
3. متغیرهای محیطی (Environment Variables): استفاده از متغیرهای سیستمعامل برای ذخیره مقادیر حساس مانند secret key.
4. ورودیهای پویا از کاربر: گرفتن مقادیر از کاربر بهصورت runtime.
متغیر هایی که حساس نیستند بهتره براشون fallback تعریف کنیم.
برای مثال اول چک بشه اگه بصورت دستی داخل کانفیگ مقداری براشون ست شده، از اونجا بخونه ولی اگه نبود با مقدار پیشفرض کار کنه و اروری نده. تا برناممون برای استفاده راحت تر باشه و برای شخصی سازی هم دستمون رو باز بذاره.
#hard_coding
@Syntax_fa
به معنای استفاده از مقادیر ثابت و تعریفشده درون کد یک برنامه، بهجای استفاده از ورودیهای داینامیک، متغیرها یا منابع خارجی (مثل فایلهای کانفیگ یا پایگاههای داده). در این روش، مقادیر بهصورت مستقیم در کد قرار میگیرند و برای تغییر آنها نیاز به ویرایش دستی کد است.
مثال ساده:
# Hard coded example
deposit = 0.1
price = 100
final_price = price + (price * deposit)
print(final_price)
مزایای Hard Coding
1. سادگی اولیه: کدنویسی سریعتر و آسانتر است، زیرا نیازی به ایجاد ساختارهای پیچیده برای مدیریت مقادیر نیست.
2. کاهش پیچیدگی در پروژههای کوچک: در برنامههای کوچک و ساده، ممکن است نیازی به طراحی سیستمهای دینامیک برای مدیریت مقادیر نباشد.
3. کاهش وابستگی به منابع خارجی: در صورت hard coding، نیازی به مدیریت فایلهای پیکربندی، پایگاه داده یا ورودیهای خارجی وجود ندارد.
معایب Hard Coding
1. کاهش انعطافپذیری: تغییر مقادیر ثابت نیازمند تغییر کد منبع و بازنویسی یا بازسازی برنامه است، که میتواند زمانبر باشد.
2. نگهداری سختتر: در برنامههای بزرگ، مدیریت مقادیر hard coded دشوار است و میتواند باعث افزایش احتمال بروز خطا شود.
3. محدودیت در تنظیمات داینامیک: برنامههای مبتنی بر hard coding نمیتوانند به راحتی خود را با شرایط یا محیطهای مختلف سازگار کنند.
جایگزینها برای Hard Coding
1. استفاده از فایلهای تنظیمات (Config Files): ذخیره مقادیر در فایلهای خارجی مانند
JSON`، `YAML`، یا `INI.2. دیتابیس: استفاده از دیتابیس برای مدیریت مقادیر پویا.
3. متغیرهای محیطی (Environment Variables): استفاده از متغیرهای سیستمعامل برای ذخیره مقادیر حساس مانند secret key.
4. ورودیهای پویا از کاربر: گرفتن مقادیر از کاربر بهصورت runtime.
متغیر هایی که حساس نیستند بهتره براشون fallback تعریف کنیم.
برای مثال اول چک بشه اگه بصورت دستی داخل کانفیگ مقداری براشون ست شده، از اونجا بخونه ولی اگه نبود با مقدار پیشفرض کار کنه و اروری نده. تا برناممون برای استفاده راحت تر باشه و برای شخصی سازی هم دستمون رو باز بذاره.
#hard_coding
@Syntax_fa
👍12🔥2👻2
نمونههایی از وبسایتها و شرکتهای بزرگ که استانداردهای مشخصشده را رعایت نکردهاند
1. Dropbox
- مشکل: استفاده از یک متد HTTP (POST) برای همه درخواستها
- توضیح:
در نسخههای اولیه API خود، تقریباً همه درخواستها (حتی موارد مربوط به خواندن دادهها) را با متد POST انجام میداد. این در حالی است که طبق استاندارد HTTP، متدهای GET باید برای دریافت دادهها استفاده شوند و نیازی به ارسال داده در بدنه (Body) نیست.
2. Twitter
- مشکل: استفاده از Query String برای ارسال اطلاعات حساس
- توضیح:
در نسخههای اولیه API توییتر، برخی از درخواستهای احراز هویت (مانند ارسال کلید API یا Access Token) از طریق Query String انجام میشد. این روش باعث میشد که اطلاعات حساس در URL ذخیره شوند و در لاگهای سرور یا مرورگر ثبت شوند.
چرا استاندارد نیست؟
طبق اصول امنیتی، اطلاعات حساس باید در بدنه درخواست (Body) یا هدر (Header) ارسال شوند، نه در Query String.
3. GitHub
- مشکل: استفاده از Status Code 404 برای پنهان کردن اطلاعات
- توضیح:
گیت هاب در برخی از APIهای خود، وقتی کاربری به یک منبع غیرمجاز دسترسی پیدا میکند (مثلاً یک ریپازیتوری خصوصی)، به جای استفاده از کد وضعیت 403 Forbidden، کد 404 Not Found را برمیگرداند. این کار برای جلوگیری از افشای وجود منابعی که کاربر به آنها دسترسی ندارد انجام میشود.
4. Facebook
- مشکل: عدم استفاده صحیح از محدودیت نرخ (Rate Limit) در برخی نسخههای اولیه API
- توضیح:
در نسخههای اولیه API فیسبوک، محدودیت نرخ (Rate Limit) به صورت یکنواخت برای همه کاربران اعمال نمیشد و رفتار مشخصی برای درخواستهای بیش از حد وجود نداشت. گاهی درخواستهای اضافی به صورت موفقیتآمیز پاسخ داده میشدند، اما در برخی موارد دیگر خطای غیرشفاف بازگردانده میشد.
5. Instagram
- مشکل: استفاده از کد وضعیت 200 برای خطاها
- توضیح:
در API اینستاگرام، در برخی از نسخههای قدیمی، خطاها (مانند درخواستهای نامعتبر) با کد وضعیت 200 OK بازگشت داده میشدند و جزئیات خطا در بدنه پاسخ قرار میگرفت.
6. PayPal
- مشکل: استفاده از کدهای وضعیت غیررایج
- توضیح:
در برخی پاسخهای APIهای قدیمی PayPal، کدهای وضعیت غیررایج یا غیرمستند (مانند 490) ارسال میشدند. این کدها در مستندات HTTP تعریف نشدهاند و کلاینتها نمیتوانند به درستی آنها را پردازش کنند.
7. Amazon S3
- مشکل: استفاده از کد وضعیت 200 برای پاسخهای جزئی
- توضیح:
در برخی از عملیات S3 (مانند لیست کردن اشیاء در یک باکت بزرگ)، اگر پاسخ به دلیل محدودیت اندازه به صورت چندبخشی باشد (Partial Response)، همچنان کد وضعیت 200 OK بازگردانده میشود.
چرا استاندارد نیست؟
برای پاسخهایی که تنها بخشی از دادهها را شامل میشوند، استاندارد HTTP کد 206 Partial Content را پیشنهاد میکند.
8. LinkedIn
- مشکل: ساختار غیریکسان در پاسخهای JSON
- توضیح:
در برخی از نسخههای قدیمی APIهای لینکدین، ساختار پاسخهای JSON در درخواستهای مختلف یکنواخت نبود. مثلاً کلیدها در یک پاسخ به صورت snake_case و در پاسخ دیگر به صورت camelCase بودند.
چرا استاندارد نیست؟
یکی از اصول طراحی API این است که ساختار پاسخها باید یکنواخت باشد تا توسعهدهندگان بتوانند به راحتی آنها را پردازش کنند.
9. Google Maps API
مشکل: ارسال دادههای غیرضروری در پاسخها
- توضیح:
در برخی پاسخهای Google Maps API، مقادیر غیرضروری و اضافی که گاهی هیچ ارتباطی با درخواست کاربر ندارند، بازگردانده میشدند. این میتواند باعث افزایش حجم داده و تأخیر در پردازش شود.
@Syntax_fa
1. Dropbox
- مشکل: استفاده از یک متد HTTP (POST) برای همه درخواستها
- توضیح:
در نسخههای اولیه API خود، تقریباً همه درخواستها (حتی موارد مربوط به خواندن دادهها) را با متد POST انجام میداد. این در حالی است که طبق استاندارد HTTP، متدهای GET باید برای دریافت دادهها استفاده شوند و نیازی به ارسال داده در بدنه (Body) نیست.
2. Twitter
- مشکل: استفاده از Query String برای ارسال اطلاعات حساس
- توضیح:
در نسخههای اولیه API توییتر، برخی از درخواستهای احراز هویت (مانند ارسال کلید API یا Access Token) از طریق Query String انجام میشد. این روش باعث میشد که اطلاعات حساس در URL ذخیره شوند و در لاگهای سرور یا مرورگر ثبت شوند.
چرا استاندارد نیست؟
طبق اصول امنیتی، اطلاعات حساس باید در بدنه درخواست (Body) یا هدر (Header) ارسال شوند، نه در Query String.
3. GitHub
- مشکل: استفاده از Status Code 404 برای پنهان کردن اطلاعات
- توضیح:
گیت هاب در برخی از APIهای خود، وقتی کاربری به یک منبع غیرمجاز دسترسی پیدا میکند (مثلاً یک ریپازیتوری خصوصی)، به جای استفاده از کد وضعیت 403 Forbidden، کد 404 Not Found را برمیگرداند. این کار برای جلوگیری از افشای وجود منابعی که کاربر به آنها دسترسی ندارد انجام میشود.
4. Facebook
- مشکل: عدم استفاده صحیح از محدودیت نرخ (Rate Limit) در برخی نسخههای اولیه API
- توضیح:
در نسخههای اولیه API فیسبوک، محدودیت نرخ (Rate Limit) به صورت یکنواخت برای همه کاربران اعمال نمیشد و رفتار مشخصی برای درخواستهای بیش از حد وجود نداشت. گاهی درخواستهای اضافی به صورت موفقیتآمیز پاسخ داده میشدند، اما در برخی موارد دیگر خطای غیرشفاف بازگردانده میشد.
5. Instagram
- مشکل: استفاده از کد وضعیت 200 برای خطاها
- توضیح:
در API اینستاگرام، در برخی از نسخههای قدیمی، خطاها (مانند درخواستهای نامعتبر) با کد وضعیت 200 OK بازگشت داده میشدند و جزئیات خطا در بدنه پاسخ قرار میگرفت.
6. PayPal
- مشکل: استفاده از کدهای وضعیت غیررایج
- توضیح:
در برخی پاسخهای APIهای قدیمی PayPal، کدهای وضعیت غیررایج یا غیرمستند (مانند 490) ارسال میشدند. این کدها در مستندات HTTP تعریف نشدهاند و کلاینتها نمیتوانند به درستی آنها را پردازش کنند.
7. Amazon S3
- مشکل: استفاده از کد وضعیت 200 برای پاسخهای جزئی
- توضیح:
در برخی از عملیات S3 (مانند لیست کردن اشیاء در یک باکت بزرگ)، اگر پاسخ به دلیل محدودیت اندازه به صورت چندبخشی باشد (Partial Response)، همچنان کد وضعیت 200 OK بازگردانده میشود.
چرا استاندارد نیست؟
برای پاسخهایی که تنها بخشی از دادهها را شامل میشوند، استاندارد HTTP کد 206 Partial Content را پیشنهاد میکند.
8. LinkedIn
- مشکل: ساختار غیریکسان در پاسخهای JSON
- توضیح:
در برخی از نسخههای قدیمی APIهای لینکدین، ساختار پاسخهای JSON در درخواستهای مختلف یکنواخت نبود. مثلاً کلیدها در یک پاسخ به صورت snake_case و در پاسخ دیگر به صورت camelCase بودند.
چرا استاندارد نیست؟
یکی از اصول طراحی API این است که ساختار پاسخها باید یکنواخت باشد تا توسعهدهندگان بتوانند به راحتی آنها را پردازش کنند.
9. Google Maps API
مشکل: ارسال دادههای غیرضروری در پاسخها
- توضیح:
در برخی پاسخهای Google Maps API، مقادیر غیرضروری و اضافی که گاهی هیچ ارتباطی با درخواست کاربر ندارند، بازگردانده میشدند. این میتواند باعث افزایش حجم داده و تأخیر در پردازش شود.
@Syntax_fa
👍20🔥3👻3❤1👎1
ساختار پروژه های جنگویی تیم سینتکسفا
در پروژههای نرمافزاری، به ویژه پروژههای بزرگ، ساختار مناسب کد نقش کلیدی داره. ساختار پروژه تأثیر مستقیمی به خوانایی، قابلیت نگهداری، و مقیاسپذیری کد داره.
در جنگو، یک ساختار مناسب تضمین میکنه که تیم توسعهدهنده به راحتی میتونن کد رو گسترش بدن اشکالات رو رفع کنن و ویژگیهای جدیدی به پروژه اضافه کنن. بدون معماری منسجم و اصولی، مدیریت کد پیچیده و زمانبر میشه.
تیم سینتکس در حال حاضر از ساختاری که توی این ریپو بصورت پابلیک قرار دادیم استفاده میکنه.
امیدوارم براتون مفید باشه 🙏
اگه اشکالی توی ساختار میبینید و جای بهبود داره حتما پول ریکوئست بزنید یا بهمون اطلاع بدید.
همچنین به مرور زمان داکیومنت رو هم اضافه میکنیم و سعی میکنیم همیشه آپدیت باشه.
برای حمایت از ما ستاره فراموش نشه🍸
https://github.com/syntaxfa/django-structure
#django #structure
@Syntax_fa
در پروژههای نرمافزاری، به ویژه پروژههای بزرگ، ساختار مناسب کد نقش کلیدی داره. ساختار پروژه تأثیر مستقیمی به خوانایی، قابلیت نگهداری، و مقیاسپذیری کد داره.
در جنگو، یک ساختار مناسب تضمین میکنه که تیم توسعهدهنده به راحتی میتونن کد رو گسترش بدن اشکالات رو رفع کنن و ویژگیهای جدیدی به پروژه اضافه کنن. بدون معماری منسجم و اصولی، مدیریت کد پیچیده و زمانبر میشه.
تیم سینتکس در حال حاضر از ساختاری که توی این ریپو بصورت پابلیک قرار دادیم استفاده میکنه.
امیدوارم براتون مفید باشه 🙏
اگه اشکالی توی ساختار میبینید و جای بهبود داره حتما پول ریکوئست بزنید یا بهمون اطلاع بدید.
همچنین به مرور زمان داکیومنت رو هم اضافه میکنیم و سعی میکنیم همیشه آپدیت باشه.
برای حمایت از ما ستاره فراموش نشه
https://github.com/syntaxfa/django-structure
#django #structure
@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - syntaxfa/django-structure: In this repository, you will learn about the structure used by the Syntax team.
In this repository, you will learn about the structure used by the Syntax team. - syntaxfa/django-structure
🔥14👍9❤3👻2👎1😱1
Forwarded from Kereshme | کِرِشمه
Media is too big
VIEW IN TELEGRAM
قبل اینکه روشن بشه بگو کدوم نقاشیه 😏
اینم یکی از خاص ترین تابلو لومن هامون، شب پر ستاره ونگوگ
ــــــــــــــــــــــــــــــــ
همچنین عکس و طرح دلخواه خودتونم میزنیم😀
سفارش از طریق آیدی زیر:
@ayeef
#محصول@kereshme_tel
#تابلو_لومن@kereshme_tel
@Kereshme_tel
ــــــــــــــــــــــــــــــــ
همچنین عکس و طرح دلخواه خودتونم میزنیم
سفارش از طریق آیدی زیر:
@ayeef
#محصول@kereshme_tel
#تابلو_لومن@kereshme_tel
@Kereshme_tel
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥6🔥4👍2🥰1
Kereshme | کِرِشمه
قبل اینکه روشن بشه بگو کدوم نقاشیه 😏 اینم یکی از خاص ترین تابلو لومن هامون، شب پر ستاره ونگوگ ــــــــــــــــــــــــــــــــ همچنین عکس و طرح دلخواه خودتونم میزنیم 😀 سفارش از طریق آیدی زیر: @ayeef #محصول@kereshme_tel #تابلو_لومن@kereshme_tel @Kereshme_tel
ادمینتون از این کارام میکنه
کسی خواست بخره با تخفیف سینتکسی در خدمتم🍸
کسی خواست بخره با تخفیف سینتکسی در خدمتم
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍4
قبل از DNS
بذارید یه نگاه به دوران قبل از DNS بندازیم. اون زمان خبری از این راحتیای که الان داریم نبود. اینترنت بود، ولی به جای اینکه اسم سایتها رو وارد کنید، باید با یه مشت عدد و رقم سر و کله میزدید. حالا ببینیم اون روزا مردم چطوری با اینترنت کار میکردن:
1. حفظ کردن آدرسهای IP
قبل از DNS، شما برای باز کردن سایتها مجبور بودید آدرسهای IP مثل
2. فایل HOSTS
کامپیوترها اون زمان یه فایل به اسم `hosts` داشتن که مثل دفترچه تلفن عمل میکرد. تو این فایل، آدرس IPها به اسمهای خاصی (اگه وجود داشت) نگاشت میشدن. مثلاً نوشته میشد:
این فایل هم بهصورت دستی بهروزرسانی میشد. حالا تصور کنید اگه یه سایت جدید اضافه میشد یا سرور یه سایت تغییر میکرد، دوباره باید فایل رو باز میکردید، خط جدید اضافه میکردید یا آدرس قدیمی رو عوض میکردید. یه کار خستهکننده و وقتگیر!
3. کشف سایتها؟ یه چالش واقعی!
یادمون باشه که اون زمان خبری از موتورهای جستجو مثل گوگل یا یاهو نبود. شما یا باید آدرس IP یه سایت رو از کسی میشنیدید، یا توی یه مجله یا کتاب میدیدید. اگه یه سایت جدید میخواستید پیدا کنید، باید امیدوار میبودید که کسی آدرسش رو بهتون بده.
4. مشکل هماهنگی
هر شبکهای نسخه خودش از فایل
#fun
@Syntax_fa
بذارید یه نگاه به دوران قبل از DNS بندازیم. اون زمان خبری از این راحتیای که الان داریم نبود. اینترنت بود، ولی به جای اینکه اسم سایتها رو وارد کنید، باید با یه مشت عدد و رقم سر و کله میزدید. حالا ببینیم اون روزا مردم چطوری با اینترنت کار میکردن:
1. حفظ کردن آدرسهای IP
قبل از DNS، شما برای باز کردن سایتها مجبور بودید آدرسهای IP مثل
192.168.1.1 یا 216.58.214.14 رو تایپ کنید. مثلاً اگه میخواستید به یه سایت خاص برید، باید آدرس IP اون رو از جایی پیدا میکردید و دستی وارد میکردید. کاملاً منطقیه که خیلیها دفترچهای کنار دستشون داشتن و توش آدرسهای IP مهم رو مینوشتن، چون حفظ کردن این اعداد اصلاً کار سادهای نبود.2. فایل HOSTS
کامپیوترها اون زمان یه فایل به اسم `hosts` داشتن که مثل دفترچه تلفن عمل میکرد. تو این فایل، آدرس IPها به اسمهای خاصی (اگه وجود داشت) نگاشت میشدن. مثلاً نوشته میشد:
93.184.216.34 example.com
216.58.214.14 google.com
این فایل هم بهصورت دستی بهروزرسانی میشد. حالا تصور کنید اگه یه سایت جدید اضافه میشد یا سرور یه سایت تغییر میکرد، دوباره باید فایل رو باز میکردید، خط جدید اضافه میکردید یا آدرس قدیمی رو عوض میکردید. یه کار خستهکننده و وقتگیر!
3. کشف سایتها؟ یه چالش واقعی!
یادمون باشه که اون زمان خبری از موتورهای جستجو مثل گوگل یا یاهو نبود. شما یا باید آدرس IP یه سایت رو از کسی میشنیدید، یا توی یه مجله یا کتاب میدیدید. اگه یه سایت جدید میخواستید پیدا کنید، باید امیدوار میبودید که کسی آدرسش رو بهتون بده.
4. مشکل هماهنگی
هر شبکهای نسخه خودش از فایل
hosts رو داشت. حالا اگه یه سایت جدید اضافه میشد یا تغییری توی یه آدرس IP رخ میداد، باید اون تغییر رو دستی به همه شبکهها اطلاع میدادید. این هماهنگی برای شبکههای بزرگتر شبیه یه کابوس بود.#fun
@Syntax_fa
👍10😱6❤1👏1🤣1👻1
تایپهای مختلف DNS رکورد و کاربردهای آنها
1. A Record (Address Record)
کاربرد:
این رکورد، نام دامنه را به آدرس IPv4 تبدیل میکند. این نوع رکورد یکی از رایجترین و مهمترین رکوردها در DNS است.
مثال:
اگر کاربری آدرس
موارد استفاده:
- اتصال نام دامنه به آدرس IPv4 سرور
2. AAAA Record
کاربرد:
مشابه رکورد A است، اما برای آدرسهای IPv6 استفاده میشود.
مثال:
اگر نام دامنه
موارد استفاده:
- اتصال دامنه به آدرس IPv6
3. CNAME Record (Canonical Name Record)
کاربرد:
این رکورد نام یک دامنه را به دامنه دیگری اشاره میدهد. به جای ذخیره مستقیم آدرس IP، از این رکورد برای هدایت به نام دامنهای دیگر استفاده میشود.
مثال:
اگر
موارد استفاده:
- تغییر مسیر زیردامنهها.
- سادهسازی مدیریت DNS در صورت تغییر آدرس IP.
4. MX Record (Mail Exchange Record)
کاربرد:
این رکورد برای مشخص کردن سرورهای ایمیل دامنه استفاده میشود. رکورد MX مشخص میکند که ایمیلهای ارسالی به دامنه باید به کدام سرور ارسال شوند.
مثال:
اگر رکورد MX برای
موارد استفاده:
- تنظیم سرور ایمیل.
- مدیریت اولویت ارسال ایمیل (اولویتها با اعداد مشخص میشوند).
5. TXT Record
کاربرد:
این رکورد برای ذخیره اطلاعات متنی استفاده میشود. معمولاً از آن برای تأیید مالکیت دامنه و اطلاعات امنیتی استفاده میشود.
مثال:
- تأیید مالکیت دامنه برای Google Search Console.
- پیادهسازی پروتکلهای امنیتی مانند SPF، DKIM، و DMARC.
موارد استفاده:
- جلوگیری از اسپم و جعل هویت ایمیل.
- تأیید سرویسهای خارجی.
6. NS Record (Name Server Record)
کاربرد:
این رکورد مشخص میکند که کدام سرورهای DNS مسئول مدیریت رکوردهای دامنه هستند.
مثال:
برای دامنه
موارد استفاده:
- تعیین سرورهای DNS اصلی یک دامنه.
- مدیریت و نگهداری رکوردهای دامنه.
7. SOA Record (Start of Authority)
کاربرد:
این رکورد اطلاعات پایهای درباره دامنه و سرور DNS اولیه ارائه میدهد. SOA رکورد شامل اطلاعاتی مانند آدرس ایمیل مدیر دامنه و زمان بهروزرسانی رکوردها است.
موارد استفاده:
- مشخص کردن سرور اصلی DNS.
- مدیریت بهروزرسانی رکوردهای DNS.
8. PTR Record (Pointer Record)
کاربرد:
این رکورد برای جستجوی معکوس DNS استفاده میشود (تبدیل آدرس IP به نام دامنه). برخلاف رکورد A که دامنه را به IP تبدیل میکند، PTR آدرس IP را به نام دامنه تبدیل میکند.
موارد استفاده:
- تأیید هویت سرورها.
- جلوگیری از ارسال ایمیلهای اسپم.
#DNS_records
@Syntax_fa
1. A Record (Address Record)
کاربرد:
این رکورد، نام دامنه را به آدرس IPv4 تبدیل میکند. این نوع رکورد یکی از رایجترین و مهمترین رکوردها در DNS است.
مثال:
اگر کاربری آدرس
example.com را وارد کند، DNS با استفاده از رکورد A، آدرس IP مربوط به آن (مثلاً 93.184.216.34) را برمیگرداند.موارد استفاده:
- اتصال نام دامنه به آدرس IPv4 سرور
2. AAAA Record
کاربرد:
مشابه رکورد A است، اما برای آدرسهای IPv6 استفاده میشود.
مثال:
اگر نام دامنه
example.com از رکورد AAAA استفاده کند، ممکن است به آدرس IPv6 مانند 2606:2800:220:1:248:1893:25c8:1946 اشاره کند.موارد استفاده:
- اتصال دامنه به آدرس IPv6
3. CNAME Record (Canonical Name Record)
کاربرد:
این رکورد نام یک دامنه را به دامنه دیگری اشاره میدهد. به جای ذخیره مستقیم آدرس IP، از این رکورد برای هدایت به نام دامنهای دیگر استفاده میشود.
مثال:
اگر
www.example.com یک رکورد CNAME داشته باشد که به example.com اشاره کند، تمامی درخواستها به www.example.com به آدرس example.com هدایت میشوند.موارد استفاده:
- تغییر مسیر زیردامنهها.
- سادهسازی مدیریت DNS در صورت تغییر آدرس IP.
4. MX Record (Mail Exchange Record)
کاربرد:
این رکورد برای مشخص کردن سرورهای ایمیل دامنه استفاده میشود. رکورد MX مشخص میکند که ایمیلهای ارسالی به دامنه باید به کدام سرور ارسال شوند.
مثال:
اگر رکورد MX برای
example.com به mail.example.com اشاره کند، تمامی ایمیلها به سرور mail.example.com ارسال میشوند.موارد استفاده:
- تنظیم سرور ایمیل.
- مدیریت اولویت ارسال ایمیل (اولویتها با اعداد مشخص میشوند).
5. TXT Record
کاربرد:
این رکورد برای ذخیره اطلاعات متنی استفاده میشود. معمولاً از آن برای تأیید مالکیت دامنه و اطلاعات امنیتی استفاده میشود.
مثال:
- تأیید مالکیت دامنه برای Google Search Console.
- پیادهسازی پروتکلهای امنیتی مانند SPF، DKIM، و DMARC.
موارد استفاده:
- جلوگیری از اسپم و جعل هویت ایمیل.
- تأیید سرویسهای خارجی.
6. NS Record (Name Server Record)
کاربرد:
این رکورد مشخص میکند که کدام سرورهای DNS مسئول مدیریت رکوردهای دامنه هستند.
مثال:
برای دامنه
example.com، رکورد NS ممکن است به ns1.example.com و ns2.example.com اشاره کند.موارد استفاده:
- تعیین سرورهای DNS اصلی یک دامنه.
- مدیریت و نگهداری رکوردهای دامنه.
7. SOA Record (Start of Authority)
کاربرد:
این رکورد اطلاعات پایهای درباره دامنه و سرور DNS اولیه ارائه میدهد. SOA رکورد شامل اطلاعاتی مانند آدرس ایمیل مدیر دامنه و زمان بهروزرسانی رکوردها است.
موارد استفاده:
- مشخص کردن سرور اصلی DNS.
- مدیریت بهروزرسانی رکوردهای DNS.
8. PTR Record (Pointer Record)
کاربرد:
این رکورد برای جستجوی معکوس DNS استفاده میشود (تبدیل آدرس IP به نام دامنه). برخلاف رکورد A که دامنه را به IP تبدیل میکند، PTR آدرس IP را به نام دامنه تبدیل میکند.
موارد استفاده:
- تأیید هویت سرورها.
- جلوگیری از ارسال ایمیلهای اسپم.
#DNS_records
@Syntax_fa
👍13💋6🔥4❤1👻1
📊 رشد چشمگیر دادههای بدون ساختار
در دنیای امروز، دادههای بدون ساختار (Unstructured Data) به بخش عظیمی از تولید و ذخیرهسازی اطلاعات تبدیل شدهاند. این دادهها شامل انواع محتوای دیجیتال مانند فیلمها، تصاویر، صداها، متون غیرساختاریافته (مانند پیامهای شبکههای اجتماعی) و حتی دادههای حسگرهای اینترنت اشیا (IoT) هستند. برخلاف دادههای ساختاریافته که در قالبهای منظم (مانند جداول پایگاه داده) ذخیره میشوند، دادههای بدون ساختار از تنوع و پیچیدگی بالایی برخوردارند، اما مدیریت و تحلیل آنها چالشبرانگیز است.
افزایش حجم دادههای بدون ساختار: یک روند بیسابقه
گزارشها و تحقیقات نشان میدهند که حجم دادههای بدون ساختار سالانه با نرخ متوسطی در حدود ۳۰ تا ۴۰ درصد رشد میکند. این میزان رشد در برخی صنایع، مانند رسانههای دیجیتال، شبکههای اجتماعی و فناوریهای مبتنی بر IoT، حتی از این رقم هم فراتر میرود. این افزایش به دلایل متعددی رخ میدهد.
چالشهای مدیریت دادههای بدون ساختار
با وجود ارزش بالقوه این دادهها، مدیریت و پردازش آنها چالشهای خاص خود را دارد:
- حجم بالا:
دادههای بدون ساختار معمولاً حجیمتر از دادههای ساختاریافته هستند؛ مثلاً یک ویدئوی باکیفیت یا مجموعهای از تصاویر میتواند صدها گیگابایت فضا اشغال کند.
- تنوع دادهها:
این دادهها از نظر فرمت و نوع بسیار متنوع هستند. مدیریت دادههای متنی، صوتی، تصویری و ویدئویی نیازمند ابزارها و الگوریتمهای متفاوت است.
- تحلیل پیچیده:
برخلاف دادههای ساختاریافته که به راحتی قابل جستجو و تحلیل هستند، دادههای بدون ساختار نیازمند فناوریهای پیشرفتهای مانند پردازش زبان طبیعی (NLP)، بینایی کامپیوتر (Computer Vision) و تحلیل صوت هستند.
تأثیر بلندمدت دادههای بدون ساختار
رشد سریع دادههای بدون ساختار نشاندهنده تغییر چشمگیر در نحوه تولید، ذخیره و استفاده از اطلاعات در دنیای دیجیتال است. با توجه به اینکه این دادهها بیش از ۸۰ درصد کل دادههای جهان را تشکیل میدهند، سازمانها و کسبوکارها ناگزیرند که به ابزارها و راهکارهای پیشرفته برای مدیریت و تحلیل آنها روی بیاورند.
#unstructured_data
@Syntax_fa
در دنیای امروز، دادههای بدون ساختار (Unstructured Data) به بخش عظیمی از تولید و ذخیرهسازی اطلاعات تبدیل شدهاند. این دادهها شامل انواع محتوای دیجیتال مانند فیلمها، تصاویر، صداها، متون غیرساختاریافته (مانند پیامهای شبکههای اجتماعی) و حتی دادههای حسگرهای اینترنت اشیا (IoT) هستند. برخلاف دادههای ساختاریافته که در قالبهای منظم (مانند جداول پایگاه داده) ذخیره میشوند، دادههای بدون ساختار از تنوع و پیچیدگی بالایی برخوردارند، اما مدیریت و تحلیل آنها چالشبرانگیز است.
افزایش حجم دادههای بدون ساختار: یک روند بیسابقه
گزارشها و تحقیقات نشان میدهند که حجم دادههای بدون ساختار سالانه با نرخ متوسطی در حدود ۳۰ تا ۴۰ درصد رشد میکند. این میزان رشد در برخی صنایع، مانند رسانههای دیجیتال، شبکههای اجتماعی و فناوریهای مبتنی بر IoT، حتی از این رقم هم فراتر میرود. این افزایش به دلایل متعددی رخ میدهد.
چالشهای مدیریت دادههای بدون ساختار
با وجود ارزش بالقوه این دادهها، مدیریت و پردازش آنها چالشهای خاص خود را دارد:
- حجم بالا:
دادههای بدون ساختار معمولاً حجیمتر از دادههای ساختاریافته هستند؛ مثلاً یک ویدئوی باکیفیت یا مجموعهای از تصاویر میتواند صدها گیگابایت فضا اشغال کند.
- تنوع دادهها:
این دادهها از نظر فرمت و نوع بسیار متنوع هستند. مدیریت دادههای متنی، صوتی، تصویری و ویدئویی نیازمند ابزارها و الگوریتمهای متفاوت است.
- تحلیل پیچیده:
برخلاف دادههای ساختاریافته که به راحتی قابل جستجو و تحلیل هستند، دادههای بدون ساختار نیازمند فناوریهای پیشرفتهای مانند پردازش زبان طبیعی (NLP)، بینایی کامپیوتر (Computer Vision) و تحلیل صوت هستند.
تأثیر بلندمدت دادههای بدون ساختار
رشد سریع دادههای بدون ساختار نشاندهنده تغییر چشمگیر در نحوه تولید، ذخیره و استفاده از اطلاعات در دنیای دیجیتال است. با توجه به اینکه این دادهها بیش از ۸۰ درصد کل دادههای جهان را تشکیل میدهند، سازمانها و کسبوکارها ناگزیرند که به ابزارها و راهکارهای پیشرفته برای مدیریت و تحلیل آنها روی بیاورند.
#unstructured_data
@Syntax_fa
👍7💋2👻2😱1
📢 معرفی
متغیر
🔍
- مقدار
- اگر مقدار آن روی ۰ تنظیم شود، اتصال به پایگاه داده پس از هر درخواست بسته میشود (رفتار پیشفرض).
- اگر مقدار
⚙️ مقدار پیشفرض
به صورت پیشفرض، مقدار
✏️ نحوه تنظیم
مقدار
✅ چند سناریو برای تنظیم
1. پروژه کوچک یا محیط توسعه
- سناریو: اگر پروژه شما تعداد کمی از درخواستها را مدیریت میکند یا در حال توسعه هستید.
- مقدار پیشنهادی:
- توضیح: اتصال پس از هر درخواست بسته میشود. این کار به شما کمک میکند که رفتار واقعی برنامه را در محیط توسعه مشاهده کنید.
2. پروژه با بار متوسط
- سناریو: اگر برنامه شما درخواستهای متوسطی (نه کم، نه زیاد) دارد و پایگاه داده شما برای تعداد اتصالات زیاد محدودیت خاصی ندارد.
- مقدار پیشنهادی:
- توضیح: این تنظیم باعث میشود که اتصالات برای چندین درخواست استفاده شوند و هزینه باز و بسته کردن اتصال کاهش یابد.
3. پروژه با بار زیاد (High Traffic)
- سناریو: اگر برنامه شما تعداد زیادی درخواست دارد و میخواهید عملکرد را بهینه کنید.
- مقدار پیشنهادی:
- توضیح: این مقدار کمک میکند که هزینه باز و بسته کردن مکرر اتصالات کاهش یابد، اما همچنان اتصالات پس از مدتی بسته میشوند تا از مشکلات احتمالی جلوگیری شود.
4. پروژههای با درخواستهای خیلی کم
- سناریو: اگر برنامه شما به ندرت به پایگاه داده متصل میشود (مثلاً به دلیل استفاده از کش یا تعامل کم با پایگاه داده).
- مقدار پیشنهادی:
- توضیح: نگهداشتن اتصال در این موارد منطقی نیست و بهتر است اتصال پس از هر درخواست بسته شود.
5. استفاده از Connection Pooling خارجی
- سناریو: اگر از ابزارهای خارجی مدیریت اتصال مانند pgbouncer (برای PostgreSQL) یا ProxySQL (برای MySQL) استفاده میکنید.
- مقدار پیشنهادی:
- توضیح: در این حالت، مدیریت اتصالات به ابزارهای خارجی سپرده شده است و Django نیازی به بستن اتصالات ندارد.
⚠️ نکات مهم:
1. مراقب تعداد اتصالات باشید:
اگر مقدار
2. محیط production:
در محیط تولید، معمولاً مقدار
3. ابزارهای خارجی مدیریت اتصال:
اگر از Connection Pooling خارجی استفاده میکنید، مقدار
conn_max_age
#database #django
@Syntax_fa
CONN_MAX_AGE در Djangoمتغیر
CONN_MAX_AGE یکی از تنظیمات مهم Django است که برای مدیریت اتصالات پایدار (Persistent Connections) به پایگاه داده استفاده میشود. این تنظیم مشخص میکند که یک اتصال به پایگاه داده برای چه مدت زمان زنده بماند و پس از آن بسته شود.🔍
CONN_MAX_AGE چیست و چگونه عمل میکند؟- مقدار
CONN_MAX_AGE نشاندهنده مدت زمان (بر حسب ثانیه) است که یک اتصال به پایگاه داده در حالت باز باقی میماند.- اگر مقدار آن روی ۰ تنظیم شود، اتصال به پایگاه داده پس از هر درخواست بسته میشود (رفتار پیشفرض).
- اگر مقدار
CONN_MAX_AGE روی `None` تنظیم شود، اتصال به پایگاه داده هرگز بسته نمیشود و دائماً زنده میماند (تا زمانی که فرآیند Worker یا برنامه بسته شود).⚙️ مقدار پیشفرض
CONN_MAX_AGEبه صورت پیشفرض، مقدار
CONN_MAX_AGE برابر با ۰ است. یعنی Django پس از پایان هر درخواست، اتصال به پایگاه داده را میبندد و برای درخواست جدید، اتصال دیگری باز میکند. این رفتار برای پروژههای کوچک یا آزمایشی مناسب است ولی در محیط تولید (Production) ممکن است باعث کاهش عملکرد شود.✏️ نحوه تنظیم
CONN_MAX_AGEمقدار
CONN_MAX_AGE در تنظیمات پایگاه داده تعریف میشود. مثال زیر نحوه استفاده از آن را نشان میدهد:DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'your_database',
'USER': 'your_user',
'PASSWORD': 'your_password',
'HOST': 'your_host',
'PORT': 'your_port',
'CONN_MAX_AGE': 600, # 600 seconds
}
}✅ چند سناریو برای تنظیم
CONN_MAX_AGE1. پروژه کوچک یا محیط توسعه
- سناریو: اگر پروژه شما تعداد کمی از درخواستها را مدیریت میکند یا در حال توسعه هستید.
- مقدار پیشنهادی:
'CONN_MAX_AGE': 0
- توضیح: اتصال پس از هر درخواست بسته میشود. این کار به شما کمک میکند که رفتار واقعی برنامه را در محیط توسعه مشاهده کنید.
2. پروژه با بار متوسط
- سناریو: اگر برنامه شما درخواستهای متوسطی (نه کم، نه زیاد) دارد و پایگاه داده شما برای تعداد اتصالات زیاد محدودیت خاصی ندارد.
- مقدار پیشنهادی:
'CONN_MAX_AGE': 300 # 5 minutes
- توضیح: این تنظیم باعث میشود که اتصالات برای چندین درخواست استفاده شوند و هزینه باز و بسته کردن اتصال کاهش یابد.
3. پروژه با بار زیاد (High Traffic)
- سناریو: اگر برنامه شما تعداد زیادی درخواست دارد و میخواهید عملکرد را بهینه کنید.
- مقدار پیشنهادی:
'CONN_MAX_AGE': 600 # 10 minutes
- توضیح: این مقدار کمک میکند که هزینه باز و بسته کردن مکرر اتصالات کاهش یابد، اما همچنان اتصالات پس از مدتی بسته میشوند تا از مشکلات احتمالی جلوگیری شود.
4. پروژههای با درخواستهای خیلی کم
- سناریو: اگر برنامه شما به ندرت به پایگاه داده متصل میشود (مثلاً به دلیل استفاده از کش یا تعامل کم با پایگاه داده).
- مقدار پیشنهادی:
'CONN_MAX_AGE': 0 # each http request
- توضیح: نگهداشتن اتصال در این موارد منطقی نیست و بهتر است اتصال پس از هر درخواست بسته شود.
5. استفاده از Connection Pooling خارجی
- سناریو: اگر از ابزارهای خارجی مدیریت اتصال مانند pgbouncer (برای PostgreSQL) یا ProxySQL (برای MySQL) استفاده میکنید.
- مقدار پیشنهادی:
'CONN_MAX_AGE': None
- توضیح: در این حالت، مدیریت اتصالات به ابزارهای خارجی سپرده شده است و Django نیازی به بستن اتصالات ندارد.
⚠️ نکات مهم:
1. مراقب تعداد اتصالات باشید:
اگر مقدار
CONN_MAX_AGE را روی مقدار زیاد یا None تنظیم کنید، مطمئن شوید که سرور پایگاه داده شما میتواند تعداد زیادی اتصال همزمان را مدیریت کند. در غیر این صورت ممکن است با خطای "too many connections" مواجه شوید.2. محیط production:
در محیط تولید، معمولاً مقدار
CONN_MAX_AGE روی چند دقیقه (مثلاً ۵ تا ۱۰ دقیقه) تنظیم میشود تا عملکرد بهینه باشد و اتصالات مکرر ایجاد نشوند.3. ابزارهای خارجی مدیریت اتصال:
اگر از Connection Pooling خارجی استفاده میکنید، مقدار
CONN_MAX_AGE را روی None تنظیم کنید تا Django اتصال را مدیریت نکند.conn_max_age
#database #django
@Syntax_fa
Django Project
Databases | Django documentation
The web framework for perfectionists with deadlines.
❤19👍8🔥1
آشنایی با File and Directory Permissions در لینوکس یکبار برای همیشه
در لینوکس، هر فایل و دایرکتوری دارای سطوح دسترسی (Permissions) است که مشخص میکند چه کسی میتواند به فایل یا دایرکتوری دسترسی داشته باشد و چه کاری با آن انجام دهد. این سطوح دسترسی برای سه دسته اصلی تعریف میشوند:
1. Owner (مالک فایل یا دایرکتوری)
2. Group (گروهی که فایل یا دایرکتوری به آن تعلق دارد)
3. Others (سایر کاربران سیستم)
ساختار دسترسیها
در ابتدای هر فایل یا دایرکتوری در خروجی دستور
این سطح دسترسی از 10 کاراکتر تشکیل شده است:
1. اولین کاراکتر: نوع فایل را مشخص میکند:
-
-
-
2. 9 کاراکتر بعدی (سه گروه سهتایی): سطح دسترسی برای مالک، گروه و سایرین را نشان میدهد:
-
-
-
جدول باینری و مقادیر اعداد
هر سطح دسترسی را میتوان به یک عدد باینری و سپس یک مقدار عددی تبدیل کرد. جدول زیر این مفهوم را نشان میدهد:
| مقدار عددی | سطح دسترسی | باینری |
|------------|------------|---------|
| 7 | rwx | 111 |
| 6 | rw- | 110 |
| 5 | r-x | 101 |
| 4 | r-- | 100 |
| 3 | -wx | 011 |
| 2 | -w- | 010 |
| 1 | --x | 001 |
| 0 | --- | 000
مثال: chmod 777
دستور
- اولین عدد
- دومین عدد
- سومین عدد
سطح دسترسی هر عدد به صورت زیر تعریف میشود:
این به این معناست که:
- مالک: میتواند بخواند، بنویسد و اجرا کند.
- گروه: میتواند بخواند، بنویسد و اجرا کند.
- سایرین: میتوانند بخوانند، بنویسند و اجرا کنند.
دسترسیهای محدودتر
حال اگر بخواهیم دسترسی محدودتری تعریف کنیم، میتوانیم از مقادیر پایینتر استفاده کنیم:
-
- مالک:
- گروه:
- سایرین:
-
- مالک:
- گروه:
- سایرین:
-
دسترسی execute به مالک و گروه و دیگر کاربران
-
دسترسی read رو از مالک و گروه و دیگر کاربران میگیریم
نکته درباره دایرکتوریها
برای دایرکتوریها:
-
به کاربر اجازه میدهد محتویات دایرکتوری را مشاهده کند.
-
به کاربر اجازه میدهد فایلها را حذف یا اضافه کند.
-
اجازه ورود به دایرکتوری را میدهد.
#file_and_directory_permission
@Syntax_fa
در لینوکس، هر فایل و دایرکتوری دارای سطوح دسترسی (Permissions) است که مشخص میکند چه کسی میتواند به فایل یا دایرکتوری دسترسی داشته باشد و چه کاری با آن انجام دهد. این سطوح دسترسی برای سه دسته اصلی تعریف میشوند:
1. Owner (مالک فایل یا دایرکتوری)
2. Group (گروهی که فایل یا دایرکتوری به آن تعلق دارد)
3. Others (سایر کاربران سیستم)
ساختار دسترسیها
در ابتدای هر فایل یا دایرکتوری در خروجی دستور
ls -l، سطح دسترسی آن به صورت زیر نمایش داده میشود:drwxrwxrwx
این سطح دسترسی از 10 کاراکتر تشکیل شده است:
1. اولین کاراکتر: نوع فایل را مشخص میکند:
-
- : فایل معمولی-
d : دایرکتوری-
l : لینک سمبلیک2. 9 کاراکتر بعدی (سه گروه سهتایی): سطح دسترسی برای مالک، گروه و سایرین را نشان میدهد:
-
r : اجازه خواندن (Read)-
w : اجازه نوشتن (Write)-
x : اجازه اجرا (Execute)جدول باینری و مقادیر اعداد
هر سطح دسترسی را میتوان به یک عدد باینری و سپس یک مقدار عددی تبدیل کرد. جدول زیر این مفهوم را نشان میدهد:
| مقدار عددی | سطح دسترسی | باینری |
|------------|------------|---------|
| 7 | rwx | 111 |
| 6 | rw- | 110 |
| 5 | r-x | 101 |
| 4 | r-- | 100 |
| 3 | -wx | 011 |
| 2 | -w- | 010 |
| 1 | --x | 001 |
| 0 | --- | 000
مثال: chmod 777
دستور
chmod برای تغییر سطح دسترسی فایلها و دایرکتوریها استفاده میشود. در مثال chmod 777:- اولین عدد
7: سطح دسترسی مالک (Owner) است.- دومین عدد
7: سطح دسترسی گروه (Group) است.- سومین عدد
7: سطح دسترسی سایرین (Others) است.سطح دسترسی هر عدد به صورت زیر تعریف میشود:
rwx | rwx | rwx
این به این معناست که:
- مالک: میتواند بخواند، بنویسد و اجرا کند.
- گروه: میتواند بخواند، بنویسد و اجرا کند.
- سایرین: میتوانند بخوانند، بنویسند و اجرا کنند.
دسترسیهای محدودتر
حال اگر بخواهیم دسترسی محدودتری تعریف کنیم، میتوانیم از مقادیر پایینتر استفاده کنیم:
-
chmod 644:- مالک:
rw- (خواندن و نوشتن)- گروه:
r-- (فقط خواندن)- سایرین:
r-- (فقط خواندن)-
chmod 755:- مالک:
rwx (خواندن، نوشتن و اجرا)- گروه:
r-x (خواندن و اجرا)- سایرین:
r-x (خواندن و اجرا)-
chmod +x:دسترسی execute به مالک و گروه و دیگر کاربران
-
chmod -r:دسترسی read رو از مالک و گروه و دیگر کاربران میگیریم
نکته درباره دایرکتوریها
برای دایرکتوریها:
-
r: به کاربر اجازه میدهد محتویات دایرکتوری را مشاهده کند.
-
w: به کاربر اجازه میدهد فایلها را حذف یا اضافه کند.
-
x:اجازه ورود به دایرکتوری را میدهد.
#file_and_directory_permission
@Syntax_fa
👍9🔥4👌2❤1
Forwarded from Normal Developer
یه مدتی هست دارم سعی میکنم ترید کردن یاد بگیرم و پوزیشن های خیلی کوچیک باز میکنم و الان حدودا ۱۰ دلار تو اکانتم دارم. البته با ۱۵ دلار شروع کرده بودم :(
میخوام یه کانال سیگنال دهی بزنم و برعکس هرکاری خودم کردمو بذارم اونجا ملت استفاده کنن.
@normal_developer
میخوام یه کانال سیگنال دهی بزنم و برعکس هرکاری خودم کردمو بذارم اونجا ملت استفاده کنن.
@normal_developer
😁30👍4🍌4
مقاله زیر به ما آموزش میده چطور 1,000,000 رکورد دیتا رو در 4 ثانیه در PostgreSQL ذخیره کنیم!
https://www.timescale.com/learn/testing-postgres-ingest-insert-vs-batch-insert-vs-copy?ref=timescale.com
#postgresql
#database
source
@Syntax_fa
https://www.timescale.com/learn/testing-postgres-ingest-insert-vs-batch-insert-vs-copy?ref=timescale.com
#postgresql
#database
source
@Syntax_fa
Timescale
Testing Postgres Ingest: INSERT vs. Batch INSERT vs. COPY | Timescale
There are many ways to insert data into Postgres. But which is faster? We benchmarked Postgres INSERT vs. batch INSERT vs. COPY to find out.
👍7👻6🔥3❤1
This media is not supported in your browser
VIEW IN TELEGRAM
6 الگوی برتر معماری نرمافزار
معماری مونولیتیک (Monolithic Architecture)
در معماری مونولیتیک، تمام اجزای یک برنامه در یک کدبیس واحد و یکپارچه ترکیب میشوند. این رویکرد، فرآیند استقرار (Deployment) را ساده کرده و برای برنامههای کوچک مدیریت آن آسانتر است. با این حال، با رشد برنامه، این معماری میتواند سنگین و پیچیده شود، به طوری که مقیاسپذیری و نگهداری آن دشوار میگردد. هر تغییری در بخشی از برنامه ممکن است نیازمند استقرار دوباره کل سیستم باشد.
این معماری برای پروژههای کوچک و تیمهای کوچک مناسب است، اما برای پروژههای بزرگتر، به دلیل وابستگیهای زیاد میان اجزاء، مدیریت تغییرات بسیار دشوار میشود.
الگوی (Controller-Worker Pattern)
این الگو منطق کنترل (Control Logic) را از منطق پردازش (Processing Logic) جدا میکند. کنترلر وظیفه مدیریت درخواستهای ورودی، جریان دادهها و تخصیص وظایف به اجزای کارگر (Worker) را بر عهده دارد. اجزای کارگر وظایف پردازشی واقعی را انجام میدهند. این الگو برای مدیریت وظایف غیرهمزمان (Asynchronous Tasks) مفید است و میتواند مقیاسپذیری را با امکان اجرای همزمان چندین نمونه از اجزای کارگر بهبود بخشد.
مناسب برای سیستمهایی است که بار پردازشی غیرهمزمان دارند، مانند پردازش صفها (Queues) یا مدیریت درخواستهای سنگین.
معماری میکروسرویسها (Microservices Architecture)
معماری میکروسرویسها برنامه را به سرویسهای کوچک و مستقل تقسیم میکند که از طریق APIهای مشخص با یکدیگر ارتباط برقرار میکنند. هر سرویس مسئول یک قابلیت خاص از کسبوکار است و میتواند بهطور مستقل توسعه، استقرار و مقیاسپذیری شود. این معماری انعطافپذیری بیشتری فراهم میکند و امکان استفاده از فناوریهای مختلف برای سرویسهای مختلف را میدهد. اما مدیریت سرویسها و ارتباط بین آنها میتواند پیچیدگیهایی به همراه داشته باشد.
این معماری مناسب سازمانهایی است که نیاز به توسعه سریع و مقیاسپذیری خدمات دارند. اما نیازمند ابزارهای مناسب برای نظارت، هماهنگی و مدیریت ارتباطات میان سرویسها است.
مدل (Model-View-Controller یا MVC)
الگوی MVC یک برنامه را به سه بخش مرتبط تقسیم میکند:
- مدل (Model): وظیفه مدیریت دادهها و منطق کسبوکار را دارد.
- نما (View): دادهها را به کاربر نمایش میدهد.
- کنترلر (Controller): ورودی کاربر را مدیریت کرده و با مدل تعامل دارد.
این جداسازی باعث سازماندهی بهتر کد میشود و مدیریت و مقیاسپذیری برنامه، بهویژه در توسعه وب، را آسانتر میکند.
این الگو در اکثر فریمورکهای وب مانند Django و Ruby on Rails استفاده میشود و برای پروژههایی که نیاز به تعامل زیاد با کاربر دارند، ایدهآل است.
معماری رویداد-محور (Event-Driven Architecture)
در معماری رویداد-محور، اجزا از طریق تولید و مصرف رویدادها با یکدیگر ارتباط برقرار میکنند. هنگامی که یک رویداد رخ میدهد (مانند یک اقدام کاربر یا تغییری در سیستم)، رویداد های خاصی در سیستم ایجاد میشود و دیگر اجزای سیستم نسبت به رویداد ها اکشن مناسبی که نیاز دارند را انجام می دهند. این معماری بسیار جدا از هم (Decoupled) است و مقیاسپذیری و انعطافپذیری بیشتری فراهم میکند، چرا که اجزا میتوانند بهطور مستقل تکامل یابند.
این معماری در سیستمهای توزیعشده بسیار مفید است.
معماری لایهای (Layered Architecture)
در معماری لایهای، برنامه به لایههای مجزا با وظایف مشخص تقسیم میشود. لایههای رایج شامل موارد زیر هستند:
- لایه ارائه (Presentation Layer): وظیفه نمایش داده به کاربر.
- لایه منطق کسبوکار (Business Logic Layer): مدیریت منطق اصلی برنامه.
- لایه دسترسی به داده (Data Access Layer): مدیریت تعامل با پایگاه داده.
هر لایه تنها با لایه مجاور خود ارتباط برقرار میکند که باعث جداسازی وظایف (Separation of Concerns) میشود. این الگو نگهداری را آسان کرده و به تیمها اجازه میدهد بهطور مستقل روی لایههای مختلف کار کنند. با این حال، وجود لایههای متعدد ممکن است باعث کاهش عملکرد به دلیل سربار ناشی از ارتباط میان لایهها شود.
این معماری برای سیستمهای بزرگ و تیمهای توسعه که به تفکیک وظایف نیاز دارند، مناسب است. اما باید بهینهسازی لازم برای جلوگیری از کاهش عملکرد انجام شود.
source
@Syntax_fa
معماری مونولیتیک (Monolithic Architecture)
در معماری مونولیتیک، تمام اجزای یک برنامه در یک کدبیس واحد و یکپارچه ترکیب میشوند. این رویکرد، فرآیند استقرار (Deployment) را ساده کرده و برای برنامههای کوچک مدیریت آن آسانتر است. با این حال، با رشد برنامه، این معماری میتواند سنگین و پیچیده شود، به طوری که مقیاسپذیری و نگهداری آن دشوار میگردد. هر تغییری در بخشی از برنامه ممکن است نیازمند استقرار دوباره کل سیستم باشد.
این معماری برای پروژههای کوچک و تیمهای کوچک مناسب است، اما برای پروژههای بزرگتر، به دلیل وابستگیهای زیاد میان اجزاء، مدیریت تغییرات بسیار دشوار میشود.
الگوی (Controller-Worker Pattern)
این الگو منطق کنترل (Control Logic) را از منطق پردازش (Processing Logic) جدا میکند. کنترلر وظیفه مدیریت درخواستهای ورودی، جریان دادهها و تخصیص وظایف به اجزای کارگر (Worker) را بر عهده دارد. اجزای کارگر وظایف پردازشی واقعی را انجام میدهند. این الگو برای مدیریت وظایف غیرهمزمان (Asynchronous Tasks) مفید است و میتواند مقیاسپذیری را با امکان اجرای همزمان چندین نمونه از اجزای کارگر بهبود بخشد.
مناسب برای سیستمهایی است که بار پردازشی غیرهمزمان دارند، مانند پردازش صفها (Queues) یا مدیریت درخواستهای سنگین.
معماری میکروسرویسها (Microservices Architecture)
معماری میکروسرویسها برنامه را به سرویسهای کوچک و مستقل تقسیم میکند که از طریق APIهای مشخص با یکدیگر ارتباط برقرار میکنند. هر سرویس مسئول یک قابلیت خاص از کسبوکار است و میتواند بهطور مستقل توسعه، استقرار و مقیاسپذیری شود. این معماری انعطافپذیری بیشتری فراهم میکند و امکان استفاده از فناوریهای مختلف برای سرویسهای مختلف را میدهد. اما مدیریت سرویسها و ارتباط بین آنها میتواند پیچیدگیهایی به همراه داشته باشد.
این معماری مناسب سازمانهایی است که نیاز به توسعه سریع و مقیاسپذیری خدمات دارند. اما نیازمند ابزارهای مناسب برای نظارت، هماهنگی و مدیریت ارتباطات میان سرویسها است.
مدل (Model-View-Controller یا MVC)
الگوی MVC یک برنامه را به سه بخش مرتبط تقسیم میکند:
- مدل (Model): وظیفه مدیریت دادهها و منطق کسبوکار را دارد.
- نما (View): دادهها را به کاربر نمایش میدهد.
- کنترلر (Controller): ورودی کاربر را مدیریت کرده و با مدل تعامل دارد.
این جداسازی باعث سازماندهی بهتر کد میشود و مدیریت و مقیاسپذیری برنامه، بهویژه در توسعه وب، را آسانتر میکند.
این الگو در اکثر فریمورکهای وب مانند Django و Ruby on Rails استفاده میشود و برای پروژههایی که نیاز به تعامل زیاد با کاربر دارند، ایدهآل است.
معماری رویداد-محور (Event-Driven Architecture)
در معماری رویداد-محور، اجزا از طریق تولید و مصرف رویدادها با یکدیگر ارتباط برقرار میکنند. هنگامی که یک رویداد رخ میدهد (مانند یک اقدام کاربر یا تغییری در سیستم)، رویداد های خاصی در سیستم ایجاد میشود و دیگر اجزای سیستم نسبت به رویداد ها اکشن مناسبی که نیاز دارند را انجام می دهند. این معماری بسیار جدا از هم (Decoupled) است و مقیاسپذیری و انعطافپذیری بیشتری فراهم میکند، چرا که اجزا میتوانند بهطور مستقل تکامل یابند.
این معماری در سیستمهای توزیعشده بسیار مفید است.
معماری لایهای (Layered Architecture)
در معماری لایهای، برنامه به لایههای مجزا با وظایف مشخص تقسیم میشود. لایههای رایج شامل موارد زیر هستند:
- لایه ارائه (Presentation Layer): وظیفه نمایش داده به کاربر.
- لایه منطق کسبوکار (Business Logic Layer): مدیریت منطق اصلی برنامه.
- لایه دسترسی به داده (Data Access Layer): مدیریت تعامل با پایگاه داده.
هر لایه تنها با لایه مجاور خود ارتباط برقرار میکند که باعث جداسازی وظایف (Separation of Concerns) میشود. این الگو نگهداری را آسان کرده و به تیمها اجازه میدهد بهطور مستقل روی لایههای مختلف کار کنند. با این حال، وجود لایههای متعدد ممکن است باعث کاهش عملکرد به دلیل سربار ناشی از ارتباط میان لایهها شود.
این معماری برای سیستمهای بزرگ و تیمهای توسعه که به تفکیک وظایف نیاز دارند، مناسب است. اما باید بهینهسازی لازم برای جلوگیری از کاهش عملکرد انجام شود.
source
@Syntax_fa
👍8❤🔥6❤1🔥1
دوستان اگه اپلیکیشن رو بصورت مونولیت مینیوسید، کار خوبی میکنید، اما aggregation pattern رو جدی بگیرید، کمک بزرگی میکنه به حفظ loosely coupled بودن ماژول و سرویس هاتون.
یه اشتباه رایجی که باعث میشه خیلی راحت همه چیز در هم تنیده و coupled بشه نیازهای بیزینسی ای هست که دیتای aggregate شده از چند domain مختلف رو میخواد از شما. تو حالت مونولیت خیلی ساده ست که شما در هر domain به دیتابیس یه domain دیگه درخواست بزنی و یا حتی تو interactor/service دیگه یه متد جدید تعریف کنی که دیتای مد نظر رو بده. که معمولا باعث در هم تنیده شدن و چاق شدن سرویس هاتون میشه.
بهتره سرویس یا همون interactorهاتون کارهای خیلی کوچیک و well-definedی رو انجام بدن و اگه نیازمندی های aggregationطور دارید، یه سری service دیگه بسازید که وابستگی خواهد داشت به سرویس های مختلف و دیتاهای raw رو میگیره و پردازش میکنه که دیتای نهایی رو آماده کنه.
بعضی وقت ها از طریق gateway هم ممکنه بتونید aggregate کنید. بعضی وقت ها ممکنه تو همون لایه دلیوری (کنترلر) تون بتونید دو تا سرویس رو فراخوانی کنید و کار رو در بیارید، گاهی هم پیچیده تر میشه و لازمه یه سرویس(interactor) بنویسید که کار aggregation رو انجام بده
https://learn.microsoft.com/en-us/azure/architecture/patterns/gateway-aggregation
باز خود aggregate کردن حالت های مختلفی داره، اینجا میتونید بیشتر بخونید در موردش
https://medium.com/geekculture/design-patterns-for-microservices-aggregation-pattern-1b8994516fa2
Source:
https://news.1rj.ru/str/gocasts
@Syntax_fa
یه اشتباه رایجی که باعث میشه خیلی راحت همه چیز در هم تنیده و coupled بشه نیازهای بیزینسی ای هست که دیتای aggregate شده از چند domain مختلف رو میخواد از شما. تو حالت مونولیت خیلی ساده ست که شما در هر domain به دیتابیس یه domain دیگه درخواست بزنی و یا حتی تو interactor/service دیگه یه متد جدید تعریف کنی که دیتای مد نظر رو بده. که معمولا باعث در هم تنیده شدن و چاق شدن سرویس هاتون میشه.
بهتره سرویس یا همون interactorهاتون کارهای خیلی کوچیک و well-definedی رو انجام بدن و اگه نیازمندی های aggregationطور دارید، یه سری service دیگه بسازید که وابستگی خواهد داشت به سرویس های مختلف و دیتاهای raw رو میگیره و پردازش میکنه که دیتای نهایی رو آماده کنه.
بعضی وقت ها از طریق gateway هم ممکنه بتونید aggregate کنید. بعضی وقت ها ممکنه تو همون لایه دلیوری (کنترلر) تون بتونید دو تا سرویس رو فراخوانی کنید و کار رو در بیارید، گاهی هم پیچیده تر میشه و لازمه یه سرویس(interactor) بنویسید که کار aggregation رو انجام بده
https://learn.microsoft.com/en-us/azure/architecture/patterns/gateway-aggregation
باز خود aggregate کردن حالت های مختلفی داره، اینجا میتونید بیشتر بخونید در موردش
https://medium.com/geekculture/design-patterns-for-microservices-aggregation-pattern-1b8994516fa2
Source:
https://news.1rj.ru/str/gocasts
@Syntax_fa
👍9👏2😁1👻1👀1
استاد سنیور فول استک دولوپر میفرماید:
هر کی تو گیتهاب فعاله برنامه نویس نیست
حالا تو هعی پروژه بزن بذار تو گیتهاب
#fun
@Syntax_fa
هر کی تو گیتهاب فعاله برنامه نویس نیست
حالا تو هعی پروژه بزن بذار تو گیتهاب
#fun
@Syntax_fa
😁35🍌11💩8👍3
سوال مصاحبه ای درباره ذاکر با توضیح کامل
چرا وقتی یک کانتینر از یک ایمیجی رو بالا میاریم، نمیتونیم اون ایمیج رو پاک کنیم؟
زمانی که شما یک کانتینر را از یک ایمیج (Image) در Docker بالا میآورید، امکان حذف آن ایمیج تا زمانی که کانتینر مرتبط با آن در حال اجرا یا وجود داشته باشد امکان پذیر نیست. این رفتار به دلیل معماری Docker و نحوه مدیریت دادهها از طریق مکانیزمهایی مانند Copy-on-Write (COW) و UnionFS اتفاق میافتد.
در Docker، ایمیجها بهعنوان قالبهای فقط خواندنی (Read-Only) عمل میکنند که شامل تمام فایلها، نرمافزارها و تنظیمات مورد نیاز برای اجرای یک برنامه هستند. وقتی یک کانتینر از یک ایمیج بالا میآید:
- ایمیج بهعنوان پایه (Base) عمل میکند.
- کانتینر یک لایه نوشتنی (Writable Layer) به بالای ایمیج اضافه میکند.
این لایه نوشتنی به کانتینر اجازه میدهد تغییراتی مانند ایجاد فایلها یا تغییر تنظیمات را انجام دهد، بدون اینکه لایههای فقط خواندنی ایمیج اصلی تغییر کنند.
Copy-on-Write (COW)
داکر برای مدیریت تغییرات کانتینر از مکانیزم Copy-on-Write (COW) استفاده میکند. به این معنا که:
- تا زمانی که نیازی به تغییر دادهها نباشد، کانتینر از لایههای موجود در ایمیج بهصورت مستقیم استفاده میکند.
- وقتی تغییری در یک فایل لازم باشد، آن فایل از لایه فقط خواندنی ایمیج به لایه نوشتنی کانتینر کپی میشود و سپس تغییرات اعمال میگردد.
این روش باعث صرفهجویی در منابع میشود، زیرا تا زمانی که نیازی به تغییر نباشد، ایمیج و کانتینر از همان نسخه دادهها استفاده میکنند.
UnionFS
سیستم فایل UnionFS (Union File System) برای ترکیب چندین لایه سیستم فایل در یک نمای واحد (Single View) استفاده میشود. Docker از UnionFS برای ساخت ایمیجها و کانتینرها استفاده میکند. نحوه کار به این صورت است:
- ایمیجها از چندین لایه تشکیل شدهاند.
- این لایهها فقط خواندنی هستند و هر لایه تغییرات و افزودههایی نسبت به لایه قبلی دارد.
- وقتی یک کانتینر ایجاد میشود، یک لایه نوشتنی به بالای این لایههای فقط خواندنی اضافه میشود.
بنابراین، از دید کانتینر، تمام این لایهها بهصورت یک سیستم فایل یکپارچه دیده میشوند. اما در واقعیت، لایه نوشتنی و لایههای فقط خواندنی جدا از هم هستند.
https://en.wikipedia.org/wiki/UnionFS
چرا ایمیج حذف نمیشود؟
وقتی یک کانتینر از یک ایمیج ایجاد میشود، آن کانتینر به لایههای ایمیج وابسته است. به همین دلیل، تا زمانی که کانتینر وجود دارد (حتی اگر متوقف شده باشد):
- لایههای فقط خواندنی ایمیج در حال استفاده هستند.
- اگر ایمیج حذف شود، کانتینر نمیتواند به لایههای مورد نیاز خود دسترسی پیدا کند و در نتیجه خراب میشود.
Docker برای جلوگیری از این مشکل، اجازه حذف ایمیجهایی که در حال استفاده هستند را نمیدهد و در نهایت فقط میتوانید تگ آن را حذف کنید نه بادی ایمیج را.
ارتباط Copy-on-Write و UnionFS
- UnionFS امکان استفاده از چندین لایه سیستم فایل را فراهم میکند و باعث میشود ایمیجها و کانتینرها بهصورت مؤثری مدیریت شوند.
- Copy-on-Write تضمین میکند که تنها زمانی تغییرات در دادهها ایجاد شوند که واقعاً لازم باشد، بدون تغییر لایههای اصلی (فقط خواندنی) ایمیج.
این دو مکانیزم با هم کار میکنند تا Docker بتواند ایمیجها و کانتینرها را بهصورت کارآمد مدیریت کند.
چگونه ایمیج را حذف کنیم؟
اگر بخواهید یک ایمیج را حذف کنید، ابتدا باید تمام کانتینرهای وابسته به آن را حذف کنید. مراحل کلی عبارتند از:
1. لیست کانتینرهای وابسته به ایمیج:
2. حذف کانتینرهای وابسته:
3. حذف ایمیج:
#docker #copy_on_write #union_file_system
@Syntax_fa
چرا وقتی یک کانتینر از یک ایمیجی رو بالا میاریم، نمیتونیم اون ایمیج رو پاک کنیم؟
زمانی که شما یک کانتینر را از یک ایمیج (Image) در Docker بالا میآورید، امکان حذف آن ایمیج تا زمانی که کانتینر مرتبط با آن در حال اجرا یا وجود داشته باشد امکان پذیر نیست. این رفتار به دلیل معماری Docker و نحوه مدیریت دادهها از طریق مکانیزمهایی مانند Copy-on-Write (COW) و UnionFS اتفاق میافتد.
در Docker، ایمیجها بهعنوان قالبهای فقط خواندنی (Read-Only) عمل میکنند که شامل تمام فایلها، نرمافزارها و تنظیمات مورد نیاز برای اجرای یک برنامه هستند. وقتی یک کانتینر از یک ایمیج بالا میآید:
- ایمیج بهعنوان پایه (Base) عمل میکند.
- کانتینر یک لایه نوشتنی (Writable Layer) به بالای ایمیج اضافه میکند.
این لایه نوشتنی به کانتینر اجازه میدهد تغییراتی مانند ایجاد فایلها یا تغییر تنظیمات را انجام دهد، بدون اینکه لایههای فقط خواندنی ایمیج اصلی تغییر کنند.
Copy-on-Write (COW)
داکر برای مدیریت تغییرات کانتینر از مکانیزم Copy-on-Write (COW) استفاده میکند. به این معنا که:
- تا زمانی که نیازی به تغییر دادهها نباشد، کانتینر از لایههای موجود در ایمیج بهصورت مستقیم استفاده میکند.
- وقتی تغییری در یک فایل لازم باشد، آن فایل از لایه فقط خواندنی ایمیج به لایه نوشتنی کانتینر کپی میشود و سپس تغییرات اعمال میگردد.
این روش باعث صرفهجویی در منابع میشود، زیرا تا زمانی که نیازی به تغییر نباشد، ایمیج و کانتینر از همان نسخه دادهها استفاده میکنند.
UnionFS
سیستم فایل UnionFS (Union File System) برای ترکیب چندین لایه سیستم فایل در یک نمای واحد (Single View) استفاده میشود. Docker از UnionFS برای ساخت ایمیجها و کانتینرها استفاده میکند. نحوه کار به این صورت است:
- ایمیجها از چندین لایه تشکیل شدهاند.
- این لایهها فقط خواندنی هستند و هر لایه تغییرات و افزودههایی نسبت به لایه قبلی دارد.
- وقتی یک کانتینر ایجاد میشود، یک لایه نوشتنی به بالای این لایههای فقط خواندنی اضافه میشود.
بنابراین، از دید کانتینر، تمام این لایهها بهصورت یک سیستم فایل یکپارچه دیده میشوند. اما در واقعیت، لایه نوشتنی و لایههای فقط خواندنی جدا از هم هستند.
https://en.wikipedia.org/wiki/UnionFS
چرا ایمیج حذف نمیشود؟
وقتی یک کانتینر از یک ایمیج ایجاد میشود، آن کانتینر به لایههای ایمیج وابسته است. به همین دلیل، تا زمانی که کانتینر وجود دارد (حتی اگر متوقف شده باشد):
- لایههای فقط خواندنی ایمیج در حال استفاده هستند.
- اگر ایمیج حذف شود، کانتینر نمیتواند به لایههای مورد نیاز خود دسترسی پیدا کند و در نتیجه خراب میشود.
Docker برای جلوگیری از این مشکل، اجازه حذف ایمیجهایی که در حال استفاده هستند را نمیدهد و در نهایت فقط میتوانید تگ آن را حذف کنید نه بادی ایمیج را.
ارتباط Copy-on-Write و UnionFS
- UnionFS امکان استفاده از چندین لایه سیستم فایل را فراهم میکند و باعث میشود ایمیجها و کانتینرها بهصورت مؤثری مدیریت شوند.
- Copy-on-Write تضمین میکند که تنها زمانی تغییرات در دادهها ایجاد شوند که واقعاً لازم باشد، بدون تغییر لایههای اصلی (فقط خواندنی) ایمیج.
این دو مکانیزم با هم کار میکنند تا Docker بتواند ایمیجها و کانتینرها را بهصورت کارآمد مدیریت کند.
چگونه ایمیج را حذف کنیم؟
اگر بخواهید یک ایمیج را حذف کنید، ابتدا باید تمام کانتینرهای وابسته به آن را حذف کنید. مراحل کلی عبارتند از:
1. لیست کانتینرهای وابسته به ایمیج:
docker ps -a --filter ancestor=<image_name_or_id>
2. حذف کانتینرهای وابسته:
docker rm <container_id>
3. حذف ایمیج:
docker rmi <image_name_or_id>
#docker #copy_on_write #union_file_system
@Syntax_fa
❤🔥8👍5🔥4❤2😁1
توی پایتون بجای isinstance از singledispatch استفاده کن!
۱. ابتدا دو کلاس با استفاده از
اینها دو نوع ایونت هستند: یکی برای زمانی که کاربر مشترک میشود و دیگری برای زمانی که اشتراکش را لغو میکند.
۲. روش اول با استفاده از
در این روش، برای هر نوع رویداد یک شرط
۳. روش دوم با استفاده از
در این روش، برای هر نوع رویداد یک تابع جداگانه تعریف میشود که فقط برای آن نوع خاص اجرا میشود.
مزایای استفاده از
۱. کد تمیزتر: به جای زنجیرهای از `if/elif`، هر منطق در یک تابع جداگانه قرار میگیرد.
۲. قابلیت توسعه بهتر: اضافه کردن نوع جدید فقط نیاز به اضافه کردن یک تابع جدید دارد، نه تغییر کد موجود.
۳. جداسازی مسئولیتها: هر تابع فقط مسئول پردازش یک نوع خاص است.
۴. کاهش پیچیدگی: به جای یک تابع بزرگ با شرطهای متعدد، چندین تابع کوچک و ساده داریم.
نحوه کار:
-
یک تابع پایه تعریف میکند
-
توابع مختلف را برای انواع مختلف ورودی ثبت میکند
- در زمان اجرا، بر اساس نوع ورودی، تابع مناسب فراخوانی میشود
کاربرد این الگو در مواردی مثل:
- پردازش انواع مختلف پیامها یا رویدادها
- تبدیل دادهها بین فرمتهای مختلف
- اعمال عملیاتهای متفاوت روی انواع مختلف داده
- پیادهسازی الگوی Observer یا Event Handler
نمونه استفاده نهایی:
این کد به طور خودکار تابع مناسب را برای هر نوع رویداد فراخوانی میکند.
#python #singledispatch
@Syntax_fa
۱. ابتدا دو کلاس با استفاده از
@dataclass تعریف میکنیم:@dataclass
class UserCanceledSubnoscription:
username: str
@dataclass
class UserSubscribed:
username: str
اینها دو نوع ایونت هستند: یکی برای زمانی که کاربر مشترک میشود و دیگری برای زمانی که اشتراکش را لغو میکند.
۲. روش اول با استفاده از
isinstance:def process(event):
if isinstance(event, UserSubscribed):
print(f"Enable access to user {event.username}")
elif isinstance(event, UserCanceledSubnoscription):
print(f"Disable access to user {event.username}")
در این روش، برای هر نوع رویداد یک شرط
if نوشته شده که نوع رویداد را چک میکند.۳. روش دوم با استفاده از
singledispatch:@singledispatch
def process(event):
pass
@process.register(UserCanceledSubnoscription)
def _(event):
print(f"Disable access to user {event.username}")
@process.register(UserSubscribed)
def _(event):
print(f"Enable access to user {event.username}")
در این روش، برای هر نوع رویداد یک تابع جداگانه تعریف میشود که فقط برای آن نوع خاص اجرا میشود.
مزایای استفاده از
singledispatch:۱. کد تمیزتر: به جای زنجیرهای از `if/elif`، هر منطق در یک تابع جداگانه قرار میگیرد.
۲. قابلیت توسعه بهتر: اضافه کردن نوع جدید فقط نیاز به اضافه کردن یک تابع جدید دارد، نه تغییر کد موجود.
۳. جداسازی مسئولیتها: هر تابع فقط مسئول پردازش یک نوع خاص است.
۴. کاهش پیچیدگی: به جای یک تابع بزرگ با شرطهای متعدد، چندین تابع کوچک و ساده داریم.
نحوه کار:
-
@singledispatch یک تابع پایه تعریف میکند
-
@process.register() توابع مختلف را برای انواع مختلف ورودی ثبت میکند
- در زمان اجرا، بر اساس نوع ورودی، تابع مناسب فراخوانی میشود
کاربرد این الگو در مواردی مثل:
- پردازش انواع مختلف پیامها یا رویدادها
- تبدیل دادهها بین فرمتهای مختلف
- اعمال عملیاتهای متفاوت روی انواع مختلف داده
- پیادهسازی الگوی Observer یا Event Handler
نمونه استفاده نهایی:
events = [
UserSubscribed(username="johndoe"),
UserCanceledSubnoscription(username="johndoe"),
]
for event in events:
process(event)
این کد به طور خودکار تابع مناسب را برای هر نوع رویداد فراخوانی میکند.
#python #singledispatch
@Syntax_fa
👍17❤🔥2🔥1😁1
در وینوز خبیث چگونه داکر که یک linux container هستش اجرا میشه؟
قبل از 2016:
در ابتدا، Docker فقط برای Linux طراحی شده بود و روی Windows قابل اجرا نبود🫠 . در آن زمان، توسعهدهندگان Windows برای استفاده از Docker مجبور بودند:
1. یا از یک ماشین مجازی Linux جداگانه استفاده کنند
2. یا از ابزارهایی مثل VirtualBox استفاده کنند
3. یا تصمیم عاقلانه میگرفتن لینوکسی میشدن
2016 - معرفی Docker for Windows:
در سال 2016، Docker یک راهکار رسمی برای Windows ارائه کرد که شامل دو بخش اصلی بود:
1. Docker Desktop for Windows:
- یک نرمافزار یکپارچه که شامل تمام اجزای مورد نیاز برای اجرای Docker بود
- از Hyper-V (مجازیساز رسمی Microsoft) استفاده میکرد
- یک Moby VM (ماشین مجازی سبک Linux) را به صورت خودکار مدیریت میکرد
2. معماری دو لایه:
- لایه Windows: شامل Docker Client که رابط کاربری و CLI را در اختیار کاربر قرار میداد
- لایه Linux (Moby VM): شامل Docker Daemon که مسئول اصلی مدیریت کانتینرها بود
نحوه کار:
1. کاربر در Windows دستورات Docker را اجرا میکند
2. Docker Client
این دستورات را به Moby VM منتقل میکند
3. Docker Daemon
در Moby VM دستورات را پردازش کرده و کانتینرها را مدیریت میکند
4. تمام کانتینرهای Linux در این VM اجرا میشوند و از kernel آن استفاده میکنند
مزایای این معماری:
- کانتینرهای Linux دقیقاً مثل Linux اصلی کار میکنند
- مدیریت منابع بهتر و کارایی بالاتر نسبت به استفاده از VirtualBox
- یکپارچگی بهتر با Windows
- نصب و راهاندازی سادهتر
تغییرات بعدی:
بعد از 2016، Docker قابلیتهای جدیدی اضافه کرد:
1. Windows Containers:
امکان اجرای کانتینرهای native ویندوزی
2. WSL2 Integration:
یکپارچگی با Windows Subsystem for Linux نسخه 2
3. Hyper-V Isolation:
لایه امنیتی اضافه برای جداسازی بهتر کانتینرها
در نمودار بالا هم دقیقاً همین معماری نشان داده شده:
- سمت چپ: محیط Windows که Docker Client در آن قرار دارد
- سمت راست: Moby VM که Docker Daemon و کانتینرهای Linux را میزبانی میکند
- ارتباط بین این دو از طریق یک پروتکل شبکه انجام میشود
توضیحات مایکروسافت خبیث
#docker
@Syntax_fa
قبل از 2016:
در ابتدا، Docker فقط برای Linux طراحی شده بود و روی Windows قابل اجرا نبود
1. یا از یک ماشین مجازی Linux جداگانه استفاده کنند
2. یا از ابزارهایی مثل VirtualBox استفاده کنند
3. یا تصمیم عاقلانه میگرفتن لینوکسی میشدن
2016 - معرفی Docker for Windows:
در سال 2016، Docker یک راهکار رسمی برای Windows ارائه کرد که شامل دو بخش اصلی بود:
1. Docker Desktop for Windows:
- یک نرمافزار یکپارچه که شامل تمام اجزای مورد نیاز برای اجرای Docker بود
- از Hyper-V (مجازیساز رسمی Microsoft) استفاده میکرد
- یک Moby VM (ماشین مجازی سبک Linux) را به صورت خودکار مدیریت میکرد
2. معماری دو لایه:
- لایه Windows: شامل Docker Client که رابط کاربری و CLI را در اختیار کاربر قرار میداد
- لایه Linux (Moby VM): شامل Docker Daemon که مسئول اصلی مدیریت کانتینرها بود
نحوه کار:
1. کاربر در Windows دستورات Docker را اجرا میکند
2. Docker Client
این دستورات را به Moby VM منتقل میکند
3. Docker Daemon
در Moby VM دستورات را پردازش کرده و کانتینرها را مدیریت میکند
4. تمام کانتینرهای Linux در این VM اجرا میشوند و از kernel آن استفاده میکنند
مزایای این معماری:
- کانتینرهای Linux دقیقاً مثل Linux اصلی کار میکنند
- مدیریت منابع بهتر و کارایی بالاتر نسبت به استفاده از VirtualBox
- یکپارچگی بهتر با Windows
- نصب و راهاندازی سادهتر
تغییرات بعدی:
بعد از 2016، Docker قابلیتهای جدیدی اضافه کرد:
1. Windows Containers:
امکان اجرای کانتینرهای native ویندوزی
2. WSL2 Integration:
یکپارچگی با Windows Subsystem for Linux نسخه 2
3. Hyper-V Isolation:
لایه امنیتی اضافه برای جداسازی بهتر کانتینرها
در نمودار بالا هم دقیقاً همین معماری نشان داده شده:
- سمت چپ: محیط Windows که Docker Client در آن قرار دارد
- سمت راست: Moby VM که Docker Daemon و کانتینرهای Linux را میزبانی میکند
- ارتباط بین این دو از طریق یک پروتکل شبکه انجام میشود
توضیحات مایکروسافت خبیث
#docker
@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥14👍8😁2🔥1
Forwarded from Normal Developer
This media is not supported in your browser
VIEW IN TELEGRAM
این ویدیو از آتیش سوزی لس آنجلس رو اگه از یه کانال اطلاع رسانی بازی میدیدیم فک میکردم با آنریل انجین برای سری جدید Resident Evil ساختن
@normal_developer
@normal_developer
👍10👀3🔥2😁1