loading...

لذت برنامه نویسی

بازدید : 4
چهارشنبه 2 اسفند 1402 زمان : 0:18

قابلیت NAT Extendable در IOS های شرکت سیسکو این قابلیت را به ما می دهد تا بتوانیم یک آی پی آدرس پرایوت یا داخلی را به بیش از یک آی پی پابلیک ترجمه کنیم.بگذارید راه اندازی قابلیت NAT Extendable را در قالب یک سناریو یاد بگیریم.به توپولوژی زیر نگاه کنید:

در این توپولوژی روتر S1 را بعنوان یک سرور در نظر گرفته ایم که روی آن یک وب سرور قرار دارد و می خواهیم که در اینترنت قابل دسترس باشد. برای این کار روتر R1 را که به دو ISP متصل شده را برای NAT پیکربندی می کنیم.

بیشتر بخوانید: آموزش تصویری آشنایی و پیکربندی انواع NAT

در این مثال فرض کنیم که آی پی 192.168.12.100 یک آی پی پابلیک مربوط به ISP1 است و آی پی 192.168.13.100 هم یک آی پی پابلیک مربوط به ISP2 می باشد و قرار است آی پی 192.168.1.1 را از اینترنت ببینیم.

پیکربندی یا Configuration:

ابتدا روتر S1 را کانفیگ می کنیم. به دلیل اینکه هیچ راه دیگری برای S1 بجز اتصال به R1 وجود ندارد، روتینگ را غیرفعال و فقط یک default-gateway برای دسترسی به روتر R1 برایش تنظیم می کنیم:

S1(config)#no ip routing
S1(config)#ip default-gateway 192.168.1.254

حالا NAT های Inside و Outside را برای اینترفیس های R1 تعریف می کنیم.

R1(config)#interface GigabitEthernet 0/1
R1(config-if)#ip nat inside

R1(config)#interface GigabitEthernet 0/2
R1(config-if)#ip nat outside

R1(config)#interface GigabitEthernet 0/3
R1(config-if)#ip nat outside

حالا فکر کنید که میخواهیم آی پی سرور را از اینترنت مربوط به ISP1 که آی پی پابلیک 192.168.12.100 دارد ببینیم. این کار را به راحتی با دستور زیر می توانیم انجام دهیم:

R1(config)#ip nat inside source static 192.168.1.1 192.168.12.100

با این دستور یک NAT یک به یک 1:1 بین آی پی 192.168.1.1 و 192.168.12.100 ایجاد کردیم که تا به اینجا مسیر درستی بوده. اما اگر بخواهیم همین کار را با آی پی پابلیک 192.168.13.100 انجام بدهیم چطور؟ روتر این اجازه را به ما می دهد؟

بگذارید تست کنیم:

R1(config)#ip nat inside source static 192.168.1.1 192.168.13.100
% 192.168.1.1 already mapped (192.168.1.1 -> 192.168.12.100)

با توجه به اینکه قبلا آی پی 192.168.1.1. به آی پی 192.168.12.100 ترجمه شده بود، روتر امکان ترجمه مجدد این آی پی پرایوت را به آی پی پابلیک دیگری به ما نمی دهد.

اما یک راه دیگر برای اینکه بتوانیم دو آی پی پابلیک را به یک آی پی پرایوت در یک روتر ترجمه کنیم وجود دارد.

ابتدا برویم و دستور NAT قبلی را برداریم:

R1(config)#no ip nat inside source static 192.168.1.1 192.168.12.100

الان مجددا دستور قبلی را تکرار می کنیم با این فرق که از کلمه extendable در انتهای دستور استفاده میکنیم تا روتر متوجه بشود که نیازمند این هستیم تا دو NAT برای یک آی پی در نظر بگیریم:

R1(config)#ip nat inside source static 192.168.1.1 192.168.12.100 extendable 
R1(config)#ip nat inside source static 192.168.1.1 192.168.13.100 extendable

دیدید؟ سیسکو دیگر ایرادی به دستور ما نگرفت.

بیشتر بخوانید: جامع ترین دوره آموزشی CCNP Enterprise به زبان فارسی

بررسی یا Verification:

ببینیم که آیا این تنظیمات به درستی کار می کنند یا خیر؟

R1#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
--- 192.168.12.100     192.168.1.1        ---                ---
--- 192.168.13.100     192.168.1.1        ---                ---

می بینیم که آی پی 192.168.1.1 به هر دو آی پی 192.168.12.100 و 192.168.13.100 ترجمه شده. بریم ببینیم آیا روتر های ISP1 و ISP2 می توانند به سرور ما دسترسی داشته باشند یا خیر.

ابتدا Debugging را روی روتر فعال می کنیم تا تمام اتفاقاتی که روی روتر R1 می افتد را بتوانیم مانیتور کنیم:

R1#debug ip nat
IP NAT debugging is on

یک پینگ از ISP1 به آی پی 192.168.12.100 می گذاریم: (توجه کنید که آی پی 192.168.12.100 روی هیچ اینترفیسی ست نشده است)

ISP1#ping 192.168.12.100
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.12.100, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 2/3/4 ms

ارتباط ما برقرار است. اگر به روتر R1 بر گردیم میبینیم که NAT به درستی در حال کار کردن است:

R1#
NAT*: s=192.168.12.2, d=192.168.12.100->192.168.1.1 [33]
NAT*: s=192.168.1.1->192.168.12.100, d=192.168.12.2 [33]

آی پی 192.168.1.1 به درستی به آی پی 192.168.12.100 ترجمه شده. حالا برویم و از ISP2 همین تست را تکرار کنیم:

ISP2#ping 192.168.13.100
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.13.100, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 2/2/3 ms

و در روتر R1 می بینیم که الان این ترجمه از IP جدید در حال انجام است:

R1#
NAT*: s=192.168.13.3, d=192.168.13.100->192.168.1.1 [20]
NAT*: s=192.168.1.1->192.168.13.100, d=192.168.13.3 [20]

تا اینجای کار به درستی پیش رفته است و آی پی 192.168.1.1 از هر دو آی پی 192.168.12.100 و 192.168.13.100 قابل دسترس است.

اما اگر از روتر S1 ترافیکی ایجاد شود از کدام NAT استفاده می کند؟

S1#ping 192.168.12.2
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.12.2, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 2/4/6 ms

ارتباط بین S1 و ISP1 که به درستی برقرار است. اما با چه NAT ای؟

R1#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
icmp 192.168.12.100:5  192.168.1.1:5      192.168.12.2:5     192.168.12.2:5
--- 192.168.12.100     192.168.1.1        ---                ---
--- 192.168.13.100     192.168.1.1        ---                ---

خب در جدول NAT روتر R1 می بینیم که آدرس 192.168.1.1 به 192.168.12.100 ترجمه شده. اما در مورد پینگ به آی پی 192.168.13.3 چطور؟ مجدد به روتر S1 بر میگردیم:

S1#ping 192.168.13.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.13.3, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)

پینگ این آی پی کار نکرد. چرا؟ جدول NAT روتر R1 را نگاه می کنیم:

R1#show ip nat translations 
Pro Inside global      Inside local       Outside local      Outside global
icmp 192.168.12.100:5  192.168.1.1:5      192.168.12.2:5     192.168.12.2:5
icmp 192.168.12.100:6  192.168.1.1:6      192.168.13.3:6     192.168.13.3:6
--- 192.168.12.100     192.168.1.1        ---                ---
--- 192.168.13.100     192.168.1.1        ---                ---

در جدول بالا می بینیم که این ترافیک هم به آی پی 192.168.12.100 ترجمه شد. اما چرا؟ آیا به خاطر این است که ابتدا به ISP1 پینگ ارسال کردیم؟ بگذارید جدول NAT را خالی کنیم و مجددا تست کنیم:

R1#clear ip nat translation *

و مجددا این بار به روتر ISP2 پینگ ارسال می کنیم:

S1#ping 192.168.13.3
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.13.3, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)

پینگ این بار هم به مقصد نرسید. اما چرا؟ به نظرتون به خاطر ترتیب NAT ها در تنظیمات است؟

R1#show running-config | include nat inside source
ip nat inside source static 192.168.1.1 192.168.12.100 extendable
ip nat inside source static 192.168.1.1 192.168.13.100 extendable

در خروجی بالا می بینیم که Inside NAT مربوط به آی پی 192.168.12.100 در ابتدای دستورات قرار گرفته و سیسکو هم همیشه از این دستور برای NAT هایی که ترافیک مبدا آن از آی پی 192.168.1.1 است استفاده می کند.

پس باید این مورد که دستور اول NAT در تنظیمات بعنوان آدرس اصلی برای آدرس هایی که از داخل شبکه به بیرون ترافیک ارسال می کنند استفاده می شود را در راه اندازی Extendable NAT مورد توجه قرار بدهید.

بیشتر بخوانید: اولین و کاملترین دوره آموزش پیشرفته BGP به زبان فارسی

بازدید : 5
سه شنبه 1 اسفند 1402 زمان : 21:40

فایل سیستم در GNU/Linux بر اساس یک ساختار سلسله مراتبی سازماندهی شده است. اگر شما با محیط و سیستم عامل ویندوز شرکت مایکروسافت کار کرده باشد و بخواهید با لینوکس کار کنید شاید اولین تفاوتی که در استفاده از این دو سیستم عامل متوجه شوید همین متفاوت بودن ساختار File System است.

بر خلاف سیستم عامل ویندوز که برای هر پارتیشن یک سلسله مراتب با Hierarchy متفاوت در نظر می گیرد در سیستم عامل های تابع GNU/Linux همگی پارتیشن ها در نهایت از یک ساختار سلسله مراتبی واحد پیروی می کنند. در دوره آموزش لینوکس اسنشیالز و قسمت بررسی ساختار لینوکس به بررسی دایرکتوری های لینوکس هم می پردازیم. بالاترین سطح در فایل سیستم لینوکس دایرکتوری ریشه یا root directory می باشد که به شکل یک علامت اسلش یا / شناسایی می شود.سایر دایرکتوری های موجود در لینوکس زیرمجموعه این پوشه می باشند. لیست دایرکتوری های پیشفرض در لینوکس را به همراه توضیحات در ادامه مشاهده می کنید :

  1. / : تمامی دایرکتوری های موجود در لینوکس زیرمجموعه این دایرکتوری ریشه هستند ، / بالاترین سطح فایل سیستم در لینوکس می باشد.

  2. bin/ : ابزارهای خط فرمان کاربردی و ضروری لینوکس در این دایرکتوری قرار دارند

  3. boot/ : در این دایرکتوری فایل های startup لینوکس که شامل فایل های Kernel نیز می شوند وجود دارند

  4. dev/ : فایل های مربوط به دستگاه ها یا Device Files در این دایرکتوری قرار دارند

  5. etc/ : بیشتر فایل های تنظیمات لینوکس در این دایرکتوری قرار گرفته است

  6. home/ : تقریبا تمام دایرکتوری های خانگی home folder ها که محل ذخیره فایل های همه کاربران است در این دایرکتوری است

  7. lib/ : برخی از ابزاهای خط فرمانی و از طرفی اکثر کتابخانه ها یا Library های مورد استفاده در Kernel در این دایرکتوری قرار دارد

  8. media/ : نقط اتصال یا mount point رسانه های ذخیره سازی removable از قبیل فلاپی دیسک ، DVD و فایل های Zip دیسک می باشد

  9. mnt/ : کاربردی شبیه به همان media دارد با این تفاوت که قدیمی است و معمولا از رسانه های جدید پشتیبانی نمی کند

  10. net/ : نقطع اتصال یا mount point پیشفرض دایرکتوری های تحت شبکه است ، چیزی شبیه به map در سیستم عامل ویندوز

  11. opt/ : محل پیشفرض قرارگیری فایل های نرم افزارهای جانبی سیستم

  12. proc/ : این قسمت در واقع یک فایل سیستم مجازی است که در حال حاضر پردازش های مربوط به Kernel را انجام می دهد که شامل اختصاص IRQ ها ، آدرس های I//O ، کانال های DMA و تنظیمات IP Forwarding و ... می باشد.

  13. root/: دایرکتوری پیشفرض کاربر root یا همان کاربر superuser می باشد

  14. sbin/ : دستورات مدیریتی سیستم یا System Administration Commands از این دایرکتوری صادر می شود

  15. selinux/ : تنظیمات امنیتی لینوکس که بهتر است با عنوان Security Enhanced Linux در نظر گرفته شود

  16. tmp/ : پوشه موقتی یا Temporary لینوکس است که در سیستم عامل RHEL بصورت متناوب حذف می شود

  17. usr/ : برنامه ها ، کتابخانه ها ، مستندات و ... مربوط به نرم افزارهای نصب شده توسط کاربران در این دایرکتوری قرار می گیرد

  18. var/ : داده های مربوط به متغیرها یا Variable ها شامل فایل های لاگ و Spool های پرینتر از این دایرکتوری استفاده می کند.

بازدید : 3
سه شنبه 1 اسفند 1402 زمان : 19:45

در دنیا امنیت طی هر مدتی که میگذرد اصطلاحات و مفاهیم جدیدی معرفی میشوند که به گوش افراد این حوزه نا آشنا هستند. یکی از این مفاهیم و اصطلاحات جدید ارائه شده Adversary Emulation میباشد. در این مقاله ما قصد داریم به معرفی اصطلاح Adversary Emulation و ابزارهای که در این حوزه فعالیت میکنند بپردازیم.

اصطلاح Adversary Emulation چیست؟

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

پاسخ این سوال را نمی‌توانیم با صبرکردن برای حمله شدن به ما به دست بیاوریم زيرا این احتمال وجود دارد که تکنیک های مورد استفاده ما توانایی جلوگیری از آن حملات را نداشته باشند و آسیب جدی به زیرساخت ما وارد شود. از این جهت امروزه اصطلاح جدیدی بر روی کار آمده است که به عنوان Adversary Emulation شناخته میشود.

این اصطلاح دراصل به روش ها و تکنیک‌ های اشاره دارد که به صورت شبیه سازی شده حملاتی را پیاده سازی میکنند که تکنیک ها و تجهیزات امنیتی سازمان را آزمايش کنند. از طریق این روش ما به شبیه سازی حملات و شبیه سازی رفتارهای مهاجمین‌ میپردازیم و تجهیزات را از لحاظ اینکه چقدر توانایی مقاومت و جلوگیری از تهدیدات دارند مورد بررسی قرار میدهیم.

  • بیشتر بخوانید: معرفی 15 ابزار پرکاربرد در تیم های آبی (BlueTeams)

ابزارهای Adversary Emulation کدامند؟

برای پیاده سازی Adversary Emulation ما نیاز به استفاده از ابزارهای داریم که این فرآيند را برایمان پیاده سازی کند. در این مقاله ما به چندتا از معروف ترین ابزاره های Adversary Emulation میپردازیم.

معرفی ابزار Atomic Red Team

ابزار Atomic Red Team جزوه یکی از ابزارهای بسیار کاربردی در حوزه Adversary Emulation میباشد که توسط شرکت امنیتی Red Canary به صورت رایگان و Open Source ارایه شده است. ابزار Atomic Red Team در سال 2017 ارائه شده است و تا به الان پیشرفت های بسیاری کرده است. این ابزار یک ابزار برای بررسی عملکرد کنترل های امنیتی و تجهیزات امنیتی در برابر حملات مختلف میباشد. این ابزار به راحتی میتواند با پیاده سازی حملات مختلف برپایه MITRE ATT&CK کنترل های امنیتی را آزمایش کند. ART توانایی اجرا سازی بر روی سیستم های متعددی از جمله MacOS, Linux و Windows را دارد و همچنین دارای یک PowerShell Module به نام Invoke-AtomicRedTeam میباشد که میتواند Adversary Emulation را برایمان خودکار سازی کند. .بیشتر بخوانید: حمله DNS Exfiltration چیست و چگونه پیاده سازی میشود؟

معرفی APT Simulator

دراصل APT Simulator فقط یک Batch Script ویندوزی میباشد که می‌تواند با اجرا شدن بر روی سیستم های ویندوزی به شکل خیلی خوبی سیستم ویندوزی را به یک سیستم در معرض خطر تبدیل کند. این ابزار با شبیه سازی حملات میتواند به شکل خوبی درمعرض خطر بودن سیستم را واقعی جلوه بدهد. برای دانلود این Batch Script بر روی اینجا کلیک کنید.

معرفی Red Team Automation

این ابزار یکی از ابزارهای Adversary Emulation بسیار کاربردی برای EDR ها میباشد. RTA توسط Endgame به صورت کاملا رایگان و متن باز ارائه شده است و حاوی حدود پنجاه Script میباشد که توانایی ایجاد مصنوعات مطابق با MITRE ATT&CK را دارند. به گفته توسعه دهندگان این ابزار این تعداد Script ها در آینده افزایش پیدا خواهد کرد.درک مفاهیم بیشتر: تست نفوذ شبکه از پایه تا پیشرفته | دوره کامل SANS Security 560 | تست نفوذ به شبکه و زیرساخت سازمانی | 25 ساعت آموزش به همراه سناریو های عملی

معرفی ATTPwn

ابزار ATTPwn به مراتب یکی از ابزارهای خوب در حوزه Adversary Emulation میباشد که توانایی شبیه سازی حملات متعدد توصیف شده توسط MITRE ATT&CK را دارد. این ابزار دراصل میتواند کارای و مقاومت سیستم ها و‌ کنترل های امنیتی را بر روی سیستم های مایکروسافتی تست و بررسی کند. ATTPwn از PowerShell و Python برای اینکار استفاده میکند و حملات مختلفی را میتواند برایمان پیاده سازی کند که علاوه بر اینها ما توانایی شخصی سازی حملات و سناریوهای سفارشی شده را هم در این بستر داریم.بیشتر ببینید: دوره SANS Security 573 | خودکارسازی امنیت اطلاعات با Python | نزدیک به 30 ساعت آموزش

بازدید : 7
دوشنبه 30 بهمن 1402 زمان : 23:28

در دنیای طراحی وب سایت هفت قانون طراحی که اصطلاحاً به آن ها 7c گفته می شود وجود دارد. این قوانین بیشتر برای وب سایت های تجاری کاربرد دارد که که با توجه به این هفت قانون می توانید وب سایتی را طراحی کنید که کاربران را به سمت خود جذب کند. در این مطلب می خواهیم به بررسی این هفت قانون بپردازیم و ببینیم رعایت این قوانین چه تاثیری در وب سایت شما خواهند داشت؟
قانون اول: Contextبه عنوان اولین قانون، باید به ظاهر وب سایت و طراحی آن بسیار اهمیت بدهید. زمانی که کاربری به صورت مستقیم و مخصوصاً از طریق موتورهای جستجو وارد سایت شما می شود، اولین چیزی که می بیند ظاهر وب سایت و طراحی آن است. وب سایتی با طراحی زیبا و چیدمان مناسب المان ها می تواند به جذب کاربر و ماندگار آن کمک کند. برای ظاهر وب سایت و طراحی آن به نکات زیر توجه کنید:
1. استفاده از رنگ بندی مناسب با فعالیت وب سایت
2. طراحی مناسب برای دستگاه های مختلف
3. ساختار مناسب منوها و لینک به بخش های مختلف وب سایت
4. خوانایی مناسب متون داخل صفحه و عدم استفاده از رنگ هایی که خوانایی متون رو دچار مشکل می کند

قانون دوم: Content

قانون بعدی محتوایی است که به کاربر ارائه می شود، برای این موضوع حتماً صفحه باید شامل محتوایی باشد که کاربر به دنبال آن وارد سایت شما شده است. در کنار این موضوعات می توان از تصاویر مناسب، فایل های صوتی و همچنین ویدیوها برای جذب بیشتر کاربر استفاده کرد.

قانون سوم: Connection

وقتی کاربری وارد سایت شما شد، مخصوصاً زمانی که کاربر به قصد خرید وارد سایت شما شده است، باید از هر گونه ارتباط با صفحه یا صفحاتی که کاربر را از روند جذب برای خرید منصرف می کند خودداری کنید. همچنین اگر کاربر وارد صفحه ای شد می توانید بوسیله ساخت لینک ها در صفحه کاربر را به سمت محصول مرتبط هدایت کنید. برای مثال شما در وب سایت خود هم محصول دارید و هم وبلاگ. می توانید کاربری که وارد وبلاگ شما شده را به سمت محصولاتی که دارید هدایت کنید.

قانون چهارم: Community

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

قانون پنجم: Commerce

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

قانون ششم: Communication

در وب سایت خود حتماً راهی برای ارتباط کاربران با خود در نظر بگیرید. این کار را می توانید بوسیله بخش های پشتیبانی، اطلاعات بخش تماس، آدرس شرکت خود، ارسال ایمیل در قالب خبرنامه و بخش چت مستقیم با کاربران انجام دهید. با انجام این موارد حس اطمینان را در کاربران خود ایجاد خواهید کرد.

قانون هفتم: Customization

بعضی سایت ها این قابلیت را به کاربران خود می دهند تا بخش هایی از سایت رو بر اساس سلیقه خود تغییر دهند، مواردی مانند تغییر رنگ بندی بخش های از سایت، داشتن پروفایل های کاربری با قابلیت شخصی سازی، قابلیت حالت تاریک یا Dark mode یا امکان تغییر زبان وب سایت مواردی است که می تواند به کاربر در شخصی سازی وب سایت کمک کند.
امیدوارم که این مطلب مورد استفاده شما دوستان عزیز قرار گرفته باشد و با رعایت این موارد بتوانید وب سایتی مناسب طراحی کنید و در اختیار کاربران قرار دهید. یادگیری زبان برنامه نویسی PHP و آموزش MySQL شما را از هر نوع آموزش دیگر در خصوص برنامه نویسی پی اچ پی بی نیاز می کند. شما با یادگیری دوره PHP تبدیل نیز به یک برنامه نویس حرفه ای PHP خواهید شد و پس از پایان دوره می توانید پروژه های برنامه نویسی PHP دریافت و انجام دهید.در پایان این دوره آموزش طراحی سایت ، شما براحتی می توانید پروژه های طراحی وب بصورت فریلسنر بگیرید و انجام دهید.

بازدید : 6
دوشنبه 30 بهمن 1402 زمان : 22:21

امروزه کمتر کسی هست که خطوط VOIP را نشیده باشد. با توجه به توسعه روز افزور شبکه و نیاز انتقال صدا در بستر شبکه این نیاز به VOIP روز به روز رو به افزایش است. بنابراین باید هر کس در حوزه IT حداقل دانش رو در این خصوص کسب کند و پیش نیاز های VOIP را خوب بشناسد. در این مقاله سعی کردم به صورت جامع مقدمات VOIP را ارائه کنم تا در کمترین زمان حداقل دانش مورد نیاز را خواننده کسب کند.

تعریف مرکز تلفن

خوب ابتدا یک تعریفی از مرکز تلفن (سانترال،PBX،Call Center، Call Manager و ...) رو داشته باشیم.

مرکز تلفن : دستگاه یا سروری که می تواند ارتباط تلفنی یا ویدیویی را بین افراد برقرار کند. خوب به زبان ساده تر دستگاه یا سروری که تماس های داخلی شرکت رو برقرار میکند رو میگن.

این نکته توجه کنید اگر جایی کلمه PBX (Private Branch Exchange) رو دید منظور همون مرکز تلفن هست که جلوتر باهاش آشنا خواهیم شد.

یکی از اصلی ترین سوالات مهم چرا مراکز تلفن در شرکت ها راه اندازی میشود؟

مزایا راه اندازی مرکز تلفن : خوب مزایایی مرکز تلفن انقدر زیاده فقط خودش به تنهایی یک مقاله میشه بنابراین به چند مزیت برتر اشاره میکنیم.

  1. ایجاد تماس های داخلی رایگان بین کارکنان شرکت
  2. کنترل و نظارت بر استفاده از خطوط
  3. مدیریت تماس های ورودی شرکت
  4. ایجاد یک منشی دیجیتال جهت راهنمایی مشتری
  5. ایجاد صف های انتظار برای پاسخگویی
  6. و ....

انواع مراکز تلفن (دسته بندی کلی مراکز تلفن)

مراکز تلفن PBX هارو اگه بخوایم دسته بندی کلی این مراکز رو بگیم می توانیم به چهار دسته بندی اصلی تقسیم کنیم:

  1. مرکز تلفن آنالوگ ( خطوط شهری که الان در اکثر منازل در حال استفاده )
  2. مرکز تلفن دیجیتال ( صدای دریافتی به دیجیتال تبدیل می شوند و کیفیت خوبی نسبت به آنالوگ دارند)
  3. مرکز تلفن هایبرید ( مراکزی که از تمامی خطوط پشتیبانی می کنند.)
  4. مرکز تلفن IP PBX/VOIP PBX (انتقال صدا بر بستر IP که مبحث اصلی ما است)

البته در اینجا ما قصد معرفی مراکز تلفن نداریم جهت آشنایت به عنوان مثال مرکز تلفن پاناسونیک 824 یک مرکز تلفن آنالوگ و دیجیتال است که از این خطوط پشتیانی می کند.

یکی دیگر از مراکز تلفن معروف که در دسته بندی مرکز تلفن هایبرید می تواند قرار بگیرد مدل پاناسونیک TDE این شرکت است که از تمای خطوط آنالوگ ، دیجیتال و IP پشتیبانی میکند. مراکز تلفن سری NS500 این شرکت تحت شبکه می باشند.

شرکت پاناسونیک یکی از تولید کنندگان اصلی مراکز تلفن می باشد که در ایران هم در بسیاری شرکت ها دستگاه های آن در حال استفاده است که امنیت و پایداری بالایی دارند. مراکز تلفن پاناسونیک از نظر ظرفیت می توان به دو دسته تقسیم کرد:

  1. مراکز تلفن کم ظرفیت ( مراکز تلفن TEM-824 )
  2. مراکز تلفن پر ظرفیت ( سری TDA-TDE )

از نظر اقتصادی مراکز تلفن را می توان به دو دسته کلی تقسیم کرد :

  1. مراکز تلفن تجاری ( شرکت های بزرگی مانند پاناسونیک ، سیسکو و ... سرمایه گذاری می کنند در این زمینه و این مراکز تلفن امنیت و پایداری بالای نسبت به دیگر مراکز تلفن دارند. معایب این سری مراکز تلفن قیمت بالا و جهت استفاده از قابلیت ها باید لایسنس ها مختلف تهیه کرد.
  2. مراکز تلفن غیر تجاری ( این سری مراکز تلفن رایگان Open source می باشند و جهت پایداری و امنیت به پای کارشناس IT اون شرکت هست . مراکز تلفن مثل Asterisk و Freeswitch که جلوتر در موردش صحبت خواهیم کرد در این دسته بندی قرار میگردن. خیلی از شرکت های داخلی پلتفرم های برای این هسته مراکز تلفن ایجاد میکنن و به عنوان مرکز تلفن بومی به فروش می رسانند.)

بررسی تفاوت بستر مخابراتی آنالوگ با VOIP

تفاوت های اصلی voip با خطوط انالوگ رو به صورت کلی بیان میکنیم:

  1. اصلی تفاوت بستر ارتباطی این دو تکنولوژی هست که آنالوگ بر بستر زوج سیم استفاده می شود اما voip بر روی کابل شبکه استفاده می شود.اگه شما یک بستر شبکه داخلی داشته باشین در ساختمان به راحتی می توانید از همان بستر voip را راه اندازی نمایید اما برای راه اندازی آنالوگ باید به صورت جداگانه در ساختمان زوج سیم مخابراتی کشیده شود که این امر هزینه هم افزایش پیدا میکند.
  2. بنابراین تفاونت هزینه دومین نکته ما می شود که راه اندازی کلی voip ارزونتر از بستر انالوگ می باشد.
  3. کیفیت سرویس مهمترین مسئله تکنولوژی های روز دنیا هست که viop با توجه به استفاده بستر ip کیفیت بهتری نسبت به خطوط انالوگ ارائه می دهد.
  4. در خطوط انالوگ ارتباط تصویری ندارید اما در voip می توانید ارتباط کنفرانس تصویری داشته باشین.
  5. همیشه ارتباط بین شعب و فاصله ارتباطی در تلفن یک نکته اصلی است که با دارا بودن بستر voip به راحتی می توان شعب مختلف رو با یکدیگر متصل کرد و محدودیت فاصله نداریم فقط نیازه یک شبکه ارتباطی بین شعب وجود داشته باشد اما در آنالوگ فاصله کمتر و محدودیت در ارتباط با مراکز تلفن مختلف رو داریم و مشکلات زیادی رو ایجام میکند.
  6. یکی از مزیت های خطوط آنالوگ نسبت به voip میتوان پایداری بالا خطوط داخلی رو گفت که نسبت به voip دارد.اگر در شبکه داخلی اختلالی ایجاد شود خطوط voip شما قطع می شود.
  7. و اخرین نکته امکانات حرفه ای که voip می تواند به شما بدهد مثل گزارشگیری، ضبط تماس ها و ... می دهد.

با یک نگاه سطحی به تفاوت آنالوگ و voip می توان گفت رقابت آینده خطوط تلفن از آن خطوط voip خواهد بود.

بنابراین پیشنهادم اینه در شرکت جدیدی خواستین خطوط تلفن راه اندازی کنید حتما Voip رو انتخاب کنید.

معرفی VOIP و تاریخچه

VOIP مخفف Voice Over Internet Protocol است، یعنی ارسال صدا بر روی بستر IP.

تاریخچه voip ارتباط تنگاتنگی با تاریخچه اینترنت دارد که یکی از موضوعات شرکت ARPANET در سال 1960 بوده است. اولین تماس توسط VOIPNVP در سال 1973 در بستر IP برقرار شد.

نحوه کار این تکنولوژی بدون صورت است که ابتدا صدا را دریافت می کند و با استفاده از کدک(فشرده سازی) می کند و تبدیل به دیتا میکند و در بستر شبکه ارسال میکند و مقصد همین فرایند را برعکس انجام می دهد.

از اونجایی که هر کجا اسم ارتباط شبکه ای میاد اسم شرکت سیسکو در میون هست این شرکت در بحث VOIP در سال 2000 اولین شرکت تولید کننده تجهیزات VOIP محصوب می شود و امروزه هم تجهیزات بسیار باکیفیت ، پایداری و امنیت بالایی رو تولید می کند.

معرفی مراکز تلفن Asterisk - freeswitch- Issabel - FreePBX

استریسک ASTERISK :

یک نرم افزار متن باز که در سالم 1999 توسط مارک اسپنسر که مشغول کار در شرکت دیجیوم بوده است طراحی و تولید شده است.

استریسک به عنوان یک مرکز تلفن قدرتمند Open Source در جهان محصوب می شود و کاربران زیادی را جهت کار توانسته است به خودش جذب کند.

در اصل استریسک را می توان یک هسته اصلی برای مراکز تلفن VOIP شناخت که پلتفرم های مختلفی که جلوتر با آن ها آشنا خواهیم شد برای این هسته ساخته شد.

  • FreeSwitch :

این نرم افزار هم مانند استریسک یک هسته رایگان برای مراکز VOIP هست.ویژگی منحصر به فرد این نرم افزار هماهنگی کامل با بیشتر زبان های برنامه نویسی را دارد و می توان قدرتمند ترین هسته مراکز VOIP حساب کرد.

2 هسته اصلی مراکز VOIP برای اجرا نیاز به یک سیستم عام دارند که به صورت پیش فرض بر روی Linux پیاده می شوند اما می توان بر روی سیستم عاملی های دیگر مانند FreeBSD , ... هم پیاده نمائید.

  • FreePBX :

یک پلتفرم متن باز می باشد که برای مدیریت راحت تر گرافیکی استریسک طراحی و پیاده شده است. این رابط گرافیکی در سال 2004 طراحی شده است و در سال 2006 به ثبت رسید و در سال 2015 شرکت سنگوما اصلی ترین اسپانسر مالی این شرکت شد .این پلتفرم یکی از محبوب ترین پلتفرم های دنیا جهت کار با استریسک می باشد که بیش از 2 میلیون نسخه فعال در 225 کشور جهان دارد .شرکت سنگوما شروع به ساخت مراکز تلفن سخت افزاری سنگوما کرد که هسته نرم افزاری این سخت افزار از FreePBX با ظرفیت ها مختلف کرده است که پشتیبانی کارشناسان شنگوما را نیز دارد.

  • Issabel :

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

معرفی پروتکل های مهم VOIP (SIP-IAX-RTP-H323)

در شبکه های voip پروتکل های مختلفی در حال استفاده می شود که نیازمند آشنایی اولیه با این چهار پروتکل مهم این شبکه آشنایی پیداکنید.

  • پروتکل SIP :

SIP مخفف Session Initiation Protocol است.این پروتکل شروع کارش در سال 1996 بوده است که در سال 1999 بازنگری در این پروتکل انجام شده است.در زمان ابتدا SIP استفاده چندانی در شبکه voip نداشت اما پس از گسترش این شبکه و مزایایی که این پروتکل ارائه داد محبوب ترین پروتکل مورد استفاده در voip محسوب می شود. این پروتکل در ارتباط بین مراکز تلفن و ارتباط تلفن رومیزی با مرکز تلفن مورد استفاده قرار میگیرد.

پروتکل SIP از پروت 5060 / TCP-UTP به صورت پیش فرض استفاده می کند و جهت احراز هویت از روش MD5 استفاده می کند. در بحث امنیت این پروتکل بیشتر حمله در این پروتکل DOS است .

این پروتکل جهت تکمیل فرایند ارتباطی از دو پروتکل RTP و SDP به صورت مکمل استفاده می کند.

  • پروتکل H323 :

این پروتکل در اوایل ایجاد شبکه voip جهت انتقال صدا مورد استفاده قرار میگرد که امروز کمتر استفاده می شود.محبوب ترین پروتکل مورد استفاده sip و iax در استفاده می شود.این پروتکل مانند پروتکل sip از پروتکل RTP برای تکمیل فرایند انتقال صدا در خود استفاده می کند.

  • پروتکل IAX :

IAX مخفف Inter-Asterisk Exchange است.این پروتکل هم یکی از محبوب ترین پروتکل ها هسته استریسک است که سازنده این پروتکل تیم توسعه استریسک است که جهت برطرف کردن چندین نقطه ضعف sip طراحی و مورد استفاده قرار گرفت که در حال توسعه و رقابت با sip می باشد.جدید ترین ورژن IAX2 نیز ارائه شده است. IAX برای انتقال صدا از باینتری 0 و 1 استفاده می کند در حالی که sip از Plain Text استفاده می کند که این کار باعث هماهنگی بیشتر با کدک ها و پهنای باند کمتری استفاده می شود. یکی از مشکلات اصلی این پروتکل در برقرای اولیه ارتباط عمل handshaking را انجام نمی دهد که میتوان حملات DOS روی این پروتکل اجرا شود و سریع از دسترس خارج شود.

  • پروتکل RTP :

این پروتکل جهت انتقال صدا می باشد که در لایه 4 پروتکل OSI استفاده می شود. همانطوری که در قسمت بالا گفتیم این پروتکل مکمل دیگر پروتکل ها می باشد و درست پس از برقرای ارتباط شبکه استفاده می شوند. وظیفه این پروتکل جمع آوری اطلاعات که بین مبدا و مقصد می باشد که جهت آنالیز و ... مورد استفاده قرار میگیرد.

RTP سه پارامتر مهم دارد time stamp - squeis number - poulood type که عمل بافر کردن -شماره گذاری پکت ها - نوع rtp استفاده می شود. پروتکل RTP یک پروتکل یک طرفه می باشد .

کدک (Codec) VOIP

یک مسئله اصلی در شبکه همیشه پهنای باند می باشد که این مسئله نیز در voip بسیار مهم بوده است که پهنای باند استفاده شده چه مقدار باشد.

Codec مخفف coder-decoder است. کدک جهت تبدیل انالوگ به دیجیتال و فشرده سازی صدا در بستر شبکه را می باشد.این عمل در لایه 6 مدل OSI انجام می شود.

  • کدک G.711 :

یک کدک اصلی در PSTN (آنالوگ) می باشد که عمل فشرده سازی انجام نمی شود. بنابراین نیازمند پردازش زیادی برای انتقال صدا انجام نمی شود و پهنای باند زیادی نیاز می باشد برای این مدل کدک .

  • کدک G.726 :

این کدک در استریسک استفاده می شود و عمل فشرده سازی و تبدیل انجام می شود. کیفیت صدای دریافتی در این کدک کیفیت خوب مانند G.711 دارد اما پهنای باند نصب کدک G.711 را اشغال می کند بنا براین نیازمند مقداری پردازش زیادی می باشد.

  • کدک G.729 :

این کدک هم در استریسک استفاده می شود و عمل فشرده سازی بیشتری انجام می شود کیفیت صدا پایین تر از مدل G.711 به ما می دهد و پردازش بیشتری نسبت به کدک G.726 بر روی این بسته ها انجام می شود و پهنای باند بسیار کمی استفاده می کند.

  • کدک GSM :

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

عملکرد کلی مراکز تلفن

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

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

پس از دو تنظیم اولیه ذکر شده به صورت کلی می توان داخلی های سازمانی را راه اندازی کنیم .

یکی از موارد اصول عملکرد دیگر مراکز تلفن تعیین مسیر تماس ها می باشد که به دو دسته می توان تقسیم کرد:

  • تماس های وردی : تعیین مسیر برای تماس های ورودی مرکز تلفن می شود و مسیر مورد نظر را برای آن ها مشخص نمایید.
  • تماس های خروجی : تعیین مسیر برای تماس های خروجی مرکز تلفن می باشد که مسیر مورد نظر جهت خروج تماس مشخص نمایید.

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

  • ایجاد ارتباط بین مراکز تلفن مختلف بین شعب با استفاده از Trunk
  • ایجاد منشی دیجیتال جهت تماس های ورودی
  • ضبط مکالمات و .....

تجهیزات مورد نیاز جهت راه اندازی VOIP :

راه اندازی VOIP نیازمند یک سری تجهیزات می باشد که به صورت کلی ما آن را به پنج دسته تقسیم کرده ایم :

  • بستر ارتباطی :
    • جهت ارتباط داخلی ها با مرکز تلفن نیازمند یک بستر ارتباطی IP در سازمان هستیم.
      1. بستر کابلی: استفاده از کابل شبکه داخلی موجود در سازمان یا کابل کشی جدا شبکه درون سازمان.
      2. بستر بی سیم : استفاده از بستر شبکه بی سیم داخلی موجود در سازمان یا راه اندازی ارتباط بی سیم درون سازمان.
    • استفاده از سوئیچ ها شبکه درون سازمان
      1. استفاده از سوئیچ های فاقد قابلیت POE
      2. استفاده از سوئیچ های دارای قابلیت POE جهت تامین برق تلفن های سخت افزاری
    • استفاده از دیگر تجهیزات شبکه جهت تامین امنیت و استفاده از قابلیت های بیشتر voip سازمان
  • سرور IPPBX VOIP :

سرور های VIOP را می توان به دو دسته بندی کلی تقسیم کرد.

      1. سرور نرم افزاری : راه اندازی سرورPBX به صورت مجازی در سازمان مانند نرم افزار ایزابل و ...
      2. سرور سخت افزاری : استفاده از سرورPBX به صورت سخت افزاری که شرکت های بزرگی مثل پاناسونیک ، سیسکو و ... ارائه می دهند.
  • تلفن تحت شبکه :

تلفن های VOIP را نیز می توان به دو دسته بندی کلی تقسیم کرد.

      1. تلفن های سخت افزاری : تلفن های رومیزی سخت افزاری که توسط شرکت های بزرگی مانند پاناسونیک ، سیسکو و .... ارائه می شوند استفاده کرد.
      2. تلفن های نرم افزاری : تلفن های مجازی که بر روی کامپوتر های نصب می شوند و می توان از ان ها استفاده کرد.
  • گیت وی ها :

گیت وی ها از نظر کارایی می توان به دو دسته بندی کلی تقسیم کرد.

      1. FXO : این گیت وی برای تبدیل خطوط آنالوگ به دیجتال استفاده می شود و برای استفاده از خطوط شهری انالوگ در ایزابل مورد استفاده قرار میگیرد.
      2. FXS : این گیت وی بر عکس FXO برای تبدیل خطوط دیجیتال دریافتی به آنالوگ مورد استفاده قرار میگیرد.

از این دو دستگاه همزمان نیز برای انتقال یک خط آنالوگ از نقطه A به نقطه B در بستر شبکه استفاده کرد.

  • تخصص VOIP :

اخرین و مهمترین نیازمندی راه اندازی VOIP ، داشتن یک نیروی متخصص VOIP می باشد.

شما با گذراندن این دوره آموزشی ویپ ( VoIP ) به لحاظ علمی و کیفی می توانید پروژه های VoIP شرکت های کوچک و بزرگ را انجام میدهید.

همچنین دوره آموزش نتورک پلاس (Network+) ( آموزش صفر تا صد Network+ ) شرکت کامپتیا که در آن تمامی مفاهیم برای یادگیری عمیق و بهتر طبق آخرین سرفصل های بین المللی آموزش شبکه و بر اساس آزمون بین المللی CompTIA Network+ N10-008 طراحی و تدوین شده است. شرکت کرده تا مفاهیم رو راحتر درک کنید.

بازدید : 6
يکشنبه 29 بهمن 1402 زمان : 22:02

حرفه Prompt Engineering یکی از مهارت‌های کلیدی برای بهره‌برداری از قدرت مدل‌های زبانی Generative یا ژنراتیو است. این مدل‌ها با استفاده از شبکه‌های عصبی عمیق و روش‌های یادگیری ماشینی قادر هستند به صورت خودکار متن‌های متنوع و معنادار تولید کنند. اما چطور می‌شه با این مدل‌ها ارتباط برقرار کرد و ازشون خروجی‌های مورد نظرمون رو گرفت؟ جواب این سوال در Prompt Engineering نهفته است.

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

در این مقاله قصد داریم به شما نشان بدیم که چطور می‌تونید Prompt Engineering رو به عنوان یک ابزار قدرتمند برای استفاده از مدل‌های زبانی ژنراتیو به کار بگیرید. ما انواع مختلف Prompt رو معرفی می‌کنیم و نحوه‌ی استفاده از هر کدوم رو با مثال نشون می‌دیم. همچنین بهترین شیوه‌ها و راهبردهای Prompt Engineering رو با شما در میان می‌گذاریم و به چالش‌ها و فرصت‌هایی که در این زمینه وجود داره اشاره می‌کنیم. امیدواریم این مقاله برای شما مفید و جذاب باشه.

انواع Prompt

مفهوم Prompt یک سوال یا یک درخواست است که به یک مدل زبانی ژنراتیو داده می‌شود تا از آن یک خروجی متنی یا تصویری بسازد. انواع مختلفی از Prompt وجود دارند که بسته به نوع و هدف مدل و خروجی مورد نظر می‌توان از آن‌ها استفاده کرد. در این بخش به معرفی چهار نوع اصلی از Prompt می‌پردازیم:

  1. Direct Prompting: این نوع از Prompt ساده‌ترین و مستقیم‌ترین روش برای ارتباط با مدل‌های زبانی است. در این روش، فقط یک سوال یا یک جمله به مدل داده می‌شود و مدل سعی می‌کند به آن پاسخ دهد یا آن را تکمیل کند. مثلا می‌توان از مدل خواست که یک جمله را با یک کلمه تمام کند یا یک تعریف را بیان کند. مثال:

    تکمیل جمله: ایران یک کشور در قاره ... است.

    تعریف: Prompt Engineering چیست؟

  2. Prompting with Examples: این نوع از Prompt شبیه به آموزش مدل با مثال است. در این روش، چند مثال از ورودی و خروجی مورد نظر به مدل داده می‌شود و سپس یک ورودی جدید به مدل داده می‌شود تا خروجی متناسب با آن را تولید کند. این روش می‌تواند برای انجام کارهایی مثل ترجمه، خلاصه‌سازی، تبدیل سبک، و غیره مفید باشد. مثال:
    ترجمه:
    انگلیسی: Hello, how are you؟
    فارسی: سلام، حال شما چطور است؟
    انگلیسی: I am fine, thank you.
    فارسی: من خوبم، ممنون.
    انگلیسی: What is your name؟

  3. Chain-of-Thought Prompting: این نوع از Prompt برای تولید متن‌های طولانی و پیوسته مثل داستان، مقاله، شعر، و غیره مناسب است. در این روش، به مدل یک موضوع یا یک شروع داده می‌شود و مدل باید متن را با ادامه‌دادن افکار و ایده‌های مرتبط با آن تولید کند. مثال:

    داستان: شروع داستان: یک روز صبح، مهدی با صدای زنگ گوشیش بیدار شد. وقتی گوشی را برداشت، صدایی که شنید، او را شوکه کرد. صدای ...

    مقاله: موضوع مقاله: اثرات مثبت Prompt Engineering بر روی یادگیری ماشینی. مقاله باید شامل مقدمه، بدنه، و نتیجه‌گیری باشد. مقدمه: در سال‌های اخیر، مدل‌های زبانی ژنراتیو با استفاده از شبکه‌های عصبی عمیق و روش‌های یادگیری ماشینی قدرتمند شده‌اند و می‌توانند متن‌های متنوع و معنادار تولید کنند. اما چطور می‌توان از این مدل‌ها به بهترین نحو استفاده کرد و خروجی‌های مورد نظر را از آن‌ها گرفت؟ در این مقاله قصد داریم نشان بدهیم که Prompt Engineering یکی از راه‌های موثر برای ارتباط با مدل‌های زبانی است و چگونه می‌توان با استفاده از آن یادگیری ماشینی را بهبود بخشید. ...

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

    نقش: یک مشاور تحصیلی

    کاربر: سلام، من می‌خوام برای ادامه‌ی تحصیل به خارج از کشور برم. چه کشورها و دانشگاه‌هایی رو پیشنهاد می‌کنید؟

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

شیوه ها و راهبردهای مناسب Prompt Engineering:

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

  1. ساختارمند بودن: یکی از راه‌هایی که می‌تونه به مدل کمک کنه تا Prompt رو بهتر درک کنه و خروجی مناسب‌تری تولید کنه، اینه که Prompt رو به صورت ساختارمند و قابل فهم بنویسیم. مثلا می‌تونیم از علائم نگارشی مثل نقطه، ویرگول، دونقطه، پرانتز، و غیره استفاده کنیم تا جملات و بخش‌های مختلف Prompt رو از هم جدا کنیم. همچنین می‌تونیم از عنوان‌ها، شماره‌گذاری، و لیست‌ها استفاده کنیم تا Prompt رو به بخش‌های کوچک‌تر و مرتب‌تر تقسیم کنیم. این کار باعث می‌شه مدل بتونه Prompt رو بهتر تحلیل کنه و خروجی رو با توجه به ساختار Prompt تنظیم کنه.

  2. محدود بودن: یکی از چالش‌هایی که مدل‌های زبانی با آن روبرو هستند، اینه که ممکنه خروجی‌هایی تولید کنند که با Prompt مطابقت ندارند یا از حدود مورد نظر خارج می‌شوند. برای جلوگیری از این مشکل، می‌تونیم از محدودیت‌هایی استفاده کنیم تا مدل رو راهنمایی کنیم که چه نوع و چه مقدار خروجی باید تولید کنه. مثلا می‌تونیم از عباراتی مثل «با حداکثر ۵۰۰ کلمه» یا «به صورت شعر» یا «با استفاده از فقط حروف الفبای فارسی» استفاده کنیم تا مدل رو محدود کنیم. مثال:

    Prompt با محدودیت: تولید یک داستان کوتاه در مورد یک سفر فضایی با حداکثر ۵۰۰ کلمه.

    Prompt بدون محدودیت: تولید یک داستان در مورد یک سفر فضایی.

  3. خلاقانه بودن: یکی از راه‌هایی که می‌تونه به مدل کمک کنه تا Prompt رو بهتر فهمیده و خروجی جذاب‌تری تولید کنه، اینه که Prompt رو به صورت خلاقانه و جالب بنویسیم. مثلا می‌تونیم از سوالات باز، مقایسه‌ها، تصاویر، مثال‌ها، و غیره استفاده کنیم تا مدل رو به چالش بکشیم و ازش خروجی‌هایی بگیریم که از حد انتظارمون بیشتر باشه. مثال:

    Prompt خلاقانه: تولید یک شعر در مورد این تصویر (بارگذاری تصویر برای مدل زبانی)

    Prompt عادی: تولید یک شعر در مورد غروب خورشید.

Prompt Engineering یکی از مهارت‌های کلیدی برای بهره‌برداری از قدرت مدل‌های زبانی ژنراتیو است. در این مقاله با انواع مختلف Prompt آشنا شدیم و نحوه‌ی استفاده از هر کدوم رو با مثال نشون دادیم. همچنین به برخی از بهترین شیوه‌ها و راهبردهای Prompt Engineering اشاره کردیم و چند نکته برای نوشتن Prompt‌های ساختارمند، محدود، و خلاقانه رو با شما در میان گذاشتیم. امیدواریم این مقاله برای شما مفید و جذاب بوده باشه و بتونید از Prompt Engineering به عنوان یک ابزار قدرتمند برای استفاده از مدل‌های زبانی به کار ببرید.

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

برای درک مفاهیم بیشتر و یادگیری عمیق به دوره آموزشی سی شارپ که دارای سرفصل های اصلی دوره مقدماتی سی شارپ و دوره پیشرفته سی شارپ را که در قالب یک مجموعه جامع ارائه شده اند مراجعه کنید. در کنار این دوره می توانید برای تقویت دانش بانک اطلاعاتی ، به دوره آموزش SQL Server نیز مراجعه کنید.

بازدید : 7
يکشنبه 29 بهمن 1402 زمان : 16:44

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

برای پیاده‌سازی برنامه‌نویسی غیرهمزمان در زبان C#، دو روش اصلی وجود دارد: استفاده از Thread ها و استفاده از کلمات کلیدی Async و Await. بو صورت ساده، Thread ها واحدهای کوچک از کد هستند که می‌توانند به صورت موازی و مستقل از هم اجرا شوند. در مقابل، Async و Await کلمات کلیدی هستند که به برنامه‌نویس امکان می‌دهند که به راحتی برنامه‌نویسی غیرهمزمان را با استفاده از Task ها پیاده‌سازی کند. Task ها شبیه به Thread ها هستند اما با این تفاوت که مدیریت و هماهنگی آن‌ها توسط کتابخانه‌های زبان C# انجام می‌شود.

در این مقاله قصد داریم تفاوت این دو روش را بررسی کنیم و نشان دهیم که در چه مواردی از هر یک از آن‌ها استفاده کنیم. برای این منظور ابتدا تعریف و ویژگی‌های Thread ها و Async و Await را شرح می‌دهیم و سپس نقاط تمایز اصلی بین آن‌ها را مورد بحث قرار می‌دهیم. در نهایت نتیجه‌گیری و توصیه‌هایی برای انتخاب روش مناسب برای برنامه‌نویسی غیرهمزمان ارائه می‌کنیم.

آشنایی با تردها

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

برای استفاده از Thread ها در زبان C#، می‌توانیم از کلاس‌ها و روش‌های موجود در فضای نام System.Threading استفاده کنیم. این فضای نام شامل کلاس Thread است که نماینده یک Thread در برنامه است. برای ایجاد یک Thread جدید، می‌توانیم یک شیء از کلاس Thread با پاس دادن یک شیء از نوع Delegate به سازنده آن ایجاد کنیم. Delegate یک شیء است که به یک متد اشاره می‌کند و مشخص می‌کند که Thread باید چه متدی را اجرا کند. برای شروع اجرای Thread، می‌توانیم از متد Start شیء Thread استفاده کنیم. برای متوقف کردن اجرای Thread، می‌توانیم از متد Abort شیء Thread استفاده کنیم. همچنین جهت انتظار برای پایان یافتن یک Thread، می‌توانیم از متد Join شیء Thread استفاده کنیم. برای مثال، کد زیر یک Thread جدید ایجاد می‌کند که متد PrintNumbers را اجرا می‌کند:

using System;
using System.Threading;

class Program
{
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(PrintNumbers));
t.Start();
t.Join();
Console.WriteLine("End of application.");
}

static void PrintNumbers()
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
}
}
}

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

1
2
3
4
5
6
7
8
9
10
End of application!

استفاده از Thread ها مزایایی مانند افزایش کارایی و بهبود تجربه کاربر را دارد. اما همچنین چالش‌هایی مانند مدیریت و هماهنگی Thread ها، رفع خطاها و ایجاد امنیت را نیز به همراه دارد. برای حل این چالش‌ها، می‌توانیم از ابزارهایی مانند Lock، Monitor، Mutex، Semaphore، AutoResetEvent و ManualResetEvent استفاده کنیم. این ابزارها به ما کمک می‌کنند که دسترسی به منابع مشترک بین Thread ها را کنترل کنیم و از بروز تداخل و ناهماهنگی جلوگیری کنیم. در بخش بعدی، می‌توانید با کلمات کلیدی Async و Await و نحوه استفاده از آن‌ها برای برنامه‌نویسی غیرهمزمان آشنا شوید.

آشنایی با Async و Await

Async و Await کلمات کلیدی هستند که در زبان C# از نسخه 5 به بعد اضافه شده‌اند. این کلمات کلیدی به برنامه‌نویس امکان می‌دهند که به راحتی برنامه‌نویسی غیرهمزمان را با استفاده از Task ها پیاده‌سازی کند. Task ها شبیه به Thread ها هستند اما با این تفاوت که مدیریت و هماهنگی آن‌ها توسط کتابخانه‌های زبان C# انجام می‌شود. Task ها به ما امکان می‌دهند که یک عملیات غیرهمزمان را به صورت یک شیء مدیریت کنیم و بتوانیم به آن ارجاع دهیم، از وضعیت آن باخبر شویم و از آن نتیجه بگیریم.

برای استفاده از Async و Await در زبان C#، می‌توانیم از کلاس‌ها و روش‌های موجود در فضای نام System.Threading.Tasks استفاده کنیم. این فضای نام شامل کلاس Task است که نماینده یک Task در برنامه است. برای ایجاد یک Task جدید، می‌توانیم از متد Run شیء Task استفاده کنیم. این متد یک شیء از نوع Delegate می‌گیرد و یک شیء از نوع Task برمی‌گرداند. برای اجرای یک Task، می‌توانیم از کلمه کلیدی Async در تعریف یک متد استفاده کنیم. این کلمه کلیدی به ما امکان می‌دهد که یک متد را به صورت غیرهمزمان تعریف کنیم و از کلمه کلیدی Await در بدنه آن استفاده کنیم. کلمه کلیدی Await به ما امکان می‌دهد که برای یک Task منتظر بمانیم و نتیجه آن را دریافت کنیم. برای مثال، کد زیر یک Task جدید ایجاد می‌کند که متد PrintNumbersAsync را اجرا می‌کند:

using System;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
// ایجاد یک Task جدید با استفاده از متد Run
Task t = Task.Run(PrintNumbersAsync);
await t;
Console.WriteLine("End of application!");
}

static async Task PrintNumbersAsync()
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);

// انتظار برای یک ثانیه
await Task.Delay(1000);
}
}
}

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

1
2
3
4
5
6
7
8
9
10
End of application!

استفاده از Async و Await مزایایی مانند ساده‌سازی برنامه‌نویسی غیرهمزمان، افزایش خوانایی و نگهداری کد و بهبود عملکرد برنامه را دارد. اما همچنین مواردی وجود دارد که استفاده از Async و Await کافی نیست و نیاز به استفاده از Thread ها داریم. برای مثال، اگر برنامه‌ای داریم که باید یک عملیات سنگین و محاسباتی را انجام دهد که زمان زیادی طول می‌کشد و منابع سیستم را به شدت مصرف می‌کند، می‌توانیم از یک Thread جدید برای انجام این عملیات استفاده کنیم تا از بلوک شدن Thread اصلی برنامه جلوگیری کنیم. در بخش بعدی، می‌توانید با تفاوت اصلی بین Thread ها و Async و Await آشنا شوید.

تفاوت Thread و Async/Await

Thread ها و Async/Await دو روش مختلف برای پیاده‌سازی برنامه‌نویسی غیرهمزمان در زبان C# هستند. این دو روش در برخی جنبه‌ها شباهت و در برخی جنبه‌ها تفاوت دارند. در این بخش قصد داریم نقاط تمایز اصلی بین این دو روش را مورد بحث قرار دهیم. برای این منظور از جدول زیر برای مقایسه این دو روش استفاده می‌کنیم:

Async/Await Thread
نحوه ایجاد با استفاده از کلاس Thread و پاس دادن یک Delegate به سازنده آن با استفاده از کلمه کلیدی Async در تعریف یک متد و استفاده از متد Run شیء Task
نحوه اجرا با استفاده از متد Start شیء Thread با استفاده از کلمه کلیدی Await در بدنه یک متد غیرهمزمان
نحوه متوقف کردن با استفاده از متد Abort شیء Thread با استفاده از متد Cancel شیء CancellationTokenSource
نحوه انتظار | با استفاده از متد Join شیء Thread با استفاده از متد Join شیء Thread با استفاده از کلمه کلیدی Await در بدنه یک متد غیرهمزمان
نحوه دریافت نتیجه با استفاده از خصوصیت Result شیء Thread با استفاده از خصوصیت Result شیء Task
مزایا امکان اجرای عملیات سنگین و محاسباتی که زمان زیادی طول می‌کشند و منابع سیستم را به شدت مصرف می‌کنند امکان اجرای عملیات سبک و وابسته به منابع خارجی مانند فایل، شبکه، دیتابیس و غیره که زمان زیادی طول می‌کشند اما منابع سیستم را به شدت مصرف نمی‌کنند
معایب امکان بروز تداخل و ناهماهنگی بین Thread ها و نیاز به استفاده از ابزارهای هماهنگ‌سازی امکان بلوک شدن Thread اصلی برنامه اگر عملیات سنگین و محاسباتی را به صورت غیرهمزمان اجرا کنیم

از جدول بالا می‌توانیم ببینیم که Thread ها و Async/Await در برخی جنبه‌ها مانند نحوه ایجاد، اجرا، متوقف کردن، انتظار و دریافت نتیجه تفاوت دارند. این تفاوت‌ها باعث می‌شوند که در چه مواردی از هر یک از این روش‌ها استفاده کنیم. به طور کلی، می‌توان گفت که اگر برنامه‌ای داریم که باید یک عملیات سنگین و محاسباتی را انجام دهد که زمان زیادی طول می‌کشد و منابع سیستم را به شدت مصرف می‌کند، می‌توانیم از یک Thread جدید برای انجام این عملیات استفاده کنیم تا از بلوک شدن Thread اصلی برنامه جلوگیری کنیم. اما اگر برنامه‌ای داریم که باید یک عملیات سبک و وابسته به منابع خارجی مانند فایل، شبکه، دیتابیس و غیره را انجام دهد که زمان زیادی طول می‌کشد اما منابع سیستم را به شدت مصرف نمی‌کند، می‌توانیم از کلمات کلیدی Async و Await برای انجام این عملیات استفاده کنیم تا از ساده‌سازی برنامه‌نویسی غیرهمزمان بهره ببریم.

در نتیجه، می‌توان گفت که Thread ها و Async/Await دو روش مختلف برای پیاده‌سازی برنامه‌نویسی غیرهمزمان در زبان C# هستند که در برخی جنبه‌ها شباهت و در برخی جنبه‌ها تفاوت دارند. این تفاوت‌ها باعث می‌شوند که در چه مواردی از هر یک از این روش‌ها استفاده کنیم. در بخش بعدی، می‌توانید با نتیجه‌گیری و توصیه‌هایی برای انتخاب روش مناسب برای برنامه‌نویسی غیرهمزمان آشنا شوید.

نتیجه‌گیری

در این مقاله با مفهوم برنامه‌نویسی غیرهمزمان و اهمیت آن در توسعه نرم‌افزار آشنا شدیم. همچنین با دو روش اصلی برای پیاده‌سازی برنامه‌نویسی غیرهمزمان در زبان C# یعنی استفاده از Thread ها و استفاده از کلمات کلیدی Async و Await آشنا شدیم. برای هر یک از این روش‌ها تعریف، ویژگی، مزایا و معایب را شرح دادیم و سپس نقاط تمایز اصلی بین آن‌ها را مورد بحث قرار دادیم. در نهایت به این نتیجه رسیدیم که این دو روش در برخی موارد با هم قابل جایگزینی هستند و در برخی موارد نیاز به استفاده از هر یک به طور مجزا دارند. برای انتخاب روش مناسب برای برنامه‌نویسی غیرهمزمان، باید به نوع عملیاتی که می‌خواهیم انجام دهیم، زمانی که آن عملیات طول می‌کشد، منابع سیستمی که آن عملیات مصرف می‌کند و همچنین سادگی و خوانایی کدی که می‌نویسیم توجه کنیم. به طور کلی، می‌توان گفت که اگر برنامه‌ای داریم که باید یک عملیات سنگین و محاسباتی را انجام دهد که زمان زیادی طول می‌کشد و منابع سیستم را به شدت مصرف می‌کند، می‌توانیم از یک Thread جدید برای انجام این عملیات استفاده کنیم تا از بلوک شدن Thread اصلی برنامه جلوگیری کنیم. اما اگر برنامه‌ای داریم که باید یک عملیات سبک و وابسته به منابع خارجی مانند فایل، شبکه، دیتابیس و غیره را انجام دهد که زمان زیادی طول می‌کشد اما منابع سیستم را به شدت مصرف نمی‌کند، می‌توانیم از کلمات کلیدی Async و Await برای انجام این عملیات استفاده کنیم تا از ساده‌سازی برنامه‌نویسی غیرهمزمان بهره ببریم.

بازدید : 6
يکشنبه 29 بهمن 1402 زمان : 16:43

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

برای پیاده‌سازی برنامه‌نویسی غیرهمزمان در زبان C#، دو روش اصلی وجود دارد: استفاده از Thread ها و استفاده از کلمات کلیدی Async و Await. بو صورت ساده، Thread ها واحدهای کوچک از کد هستند که می‌توانند به صورت موازی و مستقل از هم اجرا شوند. در مقابل، Async و Await کلمات کلیدی هستند که به برنامه‌نویس امکان می‌دهند که به راحتی برنامه‌نویسی غیرهمزمان را با استفاده از Task ها پیاده‌سازی کند. Task ها شبیه به Thread ها هستند اما با این تفاوت که مدیریت و هماهنگی آن‌ها توسط کتابخانه‌های زبان C# انجام می‌شود.

در این مقاله قصد داریم تفاوت این دو روش را بررسی کنیم و نشان دهیم که در چه مواردی از هر یک از آن‌ها استفاده کنیم. برای این منظور ابتدا تعریف و ویژگی‌های Thread ها و Async و Await را شرح می‌دهیم و سپس نقاط تمایز اصلی بین آن‌ها را مورد بحث قرار می‌دهیم. در نهایت نتیجه‌گیری و توصیه‌هایی برای انتخاب روش مناسب برای برنامه‌نویسی غیرهمزمان ارائه می‌کنیم.

آشنایی با تردها

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

برای استفاده از Thread ها در زبان C#، می‌توانیم از کلاس‌ها و روش‌های موجود در فضای نام System.Threading استفاده کنیم. این فضای نام شامل کلاس Thread است که نماینده یک Thread در برنامه است. برای ایجاد یک Thread جدید، می‌توانیم یک شیء از کلاس Thread با پاس دادن یک شیء از نوع Delegate به سازنده آن ایجاد کنیم. Delegate یک شیء است که به یک متد اشاره می‌کند و مشخص می‌کند که Thread باید چه متدی را اجرا کند. برای شروع اجرای Thread، می‌توانیم از متد Start شیء Thread استفاده کنیم. برای متوقف کردن اجرای Thread، می‌توانیم از متد Abort شیء Thread استفاده کنیم. همچنین جهت انتظار برای پایان یافتن یک Thread، می‌توانیم از متد Join شیء Thread استفاده کنیم. برای مثال، کد زیر یک Thread جدید ایجاد می‌کند که متد PrintNumbers را اجرا می‌کند:

using System;
using System.Threading;

class Program
{
static void Main(string[] args)
{
Thread t = new Thread(new ThreadStart(PrintNumbers));
t.Start();
t.Join();
Console.WriteLine("End of application.");
}

static void PrintNumbers()
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);
}
}
}

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

1
2
3
4
5
6
7
8
9
10
End of application!

استفاده از Thread ها مزایایی مانند افزایش کارایی و بهبود تجربه کاربر را دارد. اما همچنین چالش‌هایی مانند مدیریت و هماهنگی Thread ها، رفع خطاها و ایجاد امنیت را نیز به همراه دارد. برای حل این چالش‌ها، می‌توانیم از ابزارهایی مانند Lock، Monitor، Mutex، Semaphore، AutoResetEvent و ManualResetEvent استفاده کنیم. این ابزارها به ما کمک می‌کنند که دسترسی به منابع مشترک بین Thread ها را کنترل کنیم و از بروز تداخل و ناهماهنگی جلوگیری کنیم. در بخش بعدی، می‌توانید با کلمات کلیدی Async و Await و نحوه استفاده از آن‌ها برای برنامه‌نویسی غیرهمزمان آشنا شوید.

آشنایی با Async و Await

Async و Await کلمات کلیدی هستند که در زبان C# از نسخه 5 به بعد اضافه شده‌اند. این کلمات کلیدی به برنامه‌نویس امکان می‌دهند که به راحتی برنامه‌نویسی غیرهمزمان را با استفاده از Task ها پیاده‌سازی کند. Task ها شبیه به Thread ها هستند اما با این تفاوت که مدیریت و هماهنگی آن‌ها توسط کتابخانه‌های زبان C# انجام می‌شود. Task ها به ما امکان می‌دهند که یک عملیات غیرهمزمان را به صورت یک شیء مدیریت کنیم و بتوانیم به آن ارجاع دهیم، از وضعیت آن باخبر شویم و از آن نتیجه بگیریم.

برای استفاده از Async و Await در زبان C#، می‌توانیم از کلاس‌ها و روش‌های موجود در فضای نام System.Threading.Tasks استفاده کنیم. این فضای نام شامل کلاس Task است که نماینده یک Task در برنامه است. برای ایجاد یک Task جدید، می‌توانیم از متد Run شیء Task استفاده کنیم. این متد یک شیء از نوع Delegate می‌گیرد و یک شیء از نوع Task برمی‌گرداند. برای اجرای یک Task، می‌توانیم از کلمه کلیدی Async در تعریف یک متد استفاده کنیم. این کلمه کلیدی به ما امکان می‌دهد که یک متد را به صورت غیرهمزمان تعریف کنیم و از کلمه کلیدی Await در بدنه آن استفاده کنیم. کلمه کلیدی Await به ما امکان می‌دهد که برای یک Task منتظر بمانیم و نتیجه آن را دریافت کنیم. برای مثال، کد زیر یک Task جدید ایجاد می‌کند که متد PrintNumbersAsync را اجرا می‌کند:

using System;
using System.Threading.Tasks;

class Program
{
static async Task Main(string[] args)
{
// ایجاد یک Task جدید با استفاده از متد Run
Task t = Task.Run(PrintNumbersAsync);
await t;
Console.WriteLine("End of application!");
}

static async Task PrintNumbersAsync()
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine(i);

// انتظار برای یک ثانیه
await Task.Delay(1000);
}
}
}

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

1
2
3
4
5
6
7
8
9
10
End of application!

استفاده از Async و Await مزایایی مانند ساده‌سازی برنامه‌نویسی غیرهمزمان، افزایش خوانایی و نگهداری کد و بهبود عملکرد برنامه را دارد. اما همچنین مواردی وجود دارد که استفاده از Async و Await کافی نیست و نیاز به استفاده از Thread ها داریم. برای مثال، اگر برنامه‌ای داریم که باید یک عملیات سنگین و محاسباتی را انجام دهد که زمان زیادی طول می‌کشد و منابع سیستم را به شدت مصرف می‌کند، می‌توانیم از یک Thread جدید برای انجام این عملیات استفاده کنیم تا از بلوک شدن Thread اصلی برنامه جلوگیری کنیم. در بخش بعدی، می‌توانید با تفاوت اصلی بین Thread ها و Async و Await آشنا شوید.

تفاوت Thread و Async/Await

Thread ها و Async/Await دو روش مختلف برای پیاده‌سازی برنامه‌نویسی غیرهمزمان در زبان C# هستند. این دو روش در برخی جنبه‌ها شباهت و در برخی جنبه‌ها تفاوت دارند. در این بخش قصد داریم نقاط تمایز اصلی بین این دو روش را مورد بحث قرار دهیم. برای این منظور از جدول زیر برای مقایسه این دو روش استفاده می‌کنیم:

Async/Await Thread
نحوه ایجاد با استفاده از کلاس Thread و پاس دادن یک Delegate به سازنده آن با استفاده از کلمه کلیدی Async در تعریف یک متد و استفاده از متد Run شیء Task
نحوه اجرا با استفاده از متد Start شیء Thread با استفاده از کلمه کلیدی Await در بدنه یک متد غیرهمزمان
نحوه متوقف کردن با استفاده از متد Abort شیء Thread با استفاده از متد Cancel شیء CancellationTokenSource
نحوه انتظار | با استفاده از متد Join شیء Thread با استفاده از متد Join شیء Thread با استفاده از کلمه کلیدی Await در بدنه یک متد غیرهمزمان
نحوه دریافت نتیجه با استفاده از خصوصیت Result شیء Thread با استفاده از خصوصیت Result شیء Task
مزایا امکان اجرای عملیات سنگین و محاسباتی که زمان زیادی طول می‌کشند و منابع سیستم را به شدت مصرف می‌کنند امکان اجرای عملیات سبک و وابسته به منابع خارجی مانند فایل، شبکه، دیتابیس و غیره که زمان زیادی طول می‌کشند اما منابع سیستم را به شدت مصرف نمی‌کنند
معایب امکان بروز تداخل و ناهماهنگی بین Thread ها و نیاز به استفاده از ابزارهای هماهنگ‌سازی امکان بلوک شدن Thread اصلی برنامه اگر عملیات سنگین و محاسباتی را به صورت غیرهمزمان اجرا کنیم

از جدول بالا می‌توانیم ببینیم که Thread ها و Async/Await در برخی جنبه‌ها مانند نحوه ایجاد، اجرا، متوقف کردن، انتظار و دریافت نتیجه تفاوت دارند. این تفاوت‌ها باعث می‌شوند که در چه مواردی از هر یک از این روش‌ها استفاده کنیم. به طور کلی، می‌توان گفت که اگر برنامه‌ای داریم که باید یک عملیات سنگین و محاسباتی را انجام دهد که زمان زیادی طول می‌کشد و منابع سیستم را به شدت مصرف می‌کند، می‌توانیم از یک Thread جدید برای انجام این عملیات استفاده کنیم تا از بلوک شدن Thread اصلی برنامه جلوگیری کنیم. اما اگر برنامه‌ای داریم که باید یک عملیات سبک و وابسته به منابع خارجی مانند فایل، شبکه، دیتابیس و غیره را انجام دهد که زمان زیادی طول می‌کشد اما منابع سیستم را به شدت مصرف نمی‌کند، می‌توانیم از کلمات کلیدی Async و Await برای انجام این عملیات استفاده کنیم تا از ساده‌سازی برنامه‌نویسی غیرهمزمان بهره ببریم.

در نتیجه، می‌توان گفت که Thread ها و Async/Await دو روش مختلف برای پیاده‌سازی برنامه‌نویسی غیرهمزمان در زبان C# هستند که در برخی جنبه‌ها شباهت و در برخی جنبه‌ها تفاوت دارند. این تفاوت‌ها باعث می‌شوند که در چه مواردی از هر یک از این روش‌ها استفاده کنیم. در بخش بعدی، می‌توانید با نتیجه‌گیری و توصیه‌هایی برای انتخاب روش مناسب برای برنامه‌نویسی غیرهمزمان آشنا شوید.

نتیجه‌گیری

در این مقاله با مفهوم برنامه‌نویسی غیرهمزمان و اهمیت آن در توسعه نرم‌افزار آشنا شدیم. همچنین با دو روش اصلی برای پیاده‌سازی برنامه‌نویسی غیرهمزمان در زبان C# یعنی استفاده از Thread ها و استفاده از کلمات کلیدی Async و Await آشنا شدیم. برای هر یک از این روش‌ها تعریف، ویژگی، مزایا و معایب را شرح دادیم و سپس نقاط تمایز اصلی بین آن‌ها را مورد بحث قرار دادیم. در نهایت به این نتیجه رسیدیم که این دو روش در برخی موارد با هم قابل جایگزینی هستند و در برخی موارد نیاز به استفاده از هر یک به طور مجزا دارند. برای انتخاب روش مناسب برای برنامه‌نویسی غیرهمزمان، باید به نوع عملیاتی که می‌خواهیم انجام دهیم، زمانی که آن عملیات طول می‌کشد، منابع سیستمی که آن عملیات مصرف می‌کند و همچنین سادگی و خوانایی کدی که می‌نویسیم توجه کنیم. به طور کلی، می‌توان گفت که اگر برنامه‌ای داریم که باید یک عملیات سنگین و محاسباتی را انجام دهد که زمان زیادی طول می‌کشد و منابع سیستم را به شدت مصرف می‌کند، می‌توانیم از یک Thread جدید برای انجام این عملیات استفاده کنیم تا از بلوک شدن Thread اصلی برنامه جلوگیری کنیم. اما اگر برنامه‌ای داریم که باید یک عملیات سبک و وابسته به منابع خارجی مانند فایل، شبکه، دیتابیس و غیره را انجام دهد که زمان زیادی طول می‌کشد اما منابع سیستم را به شدت مصرف نمی‌کند، می‌توانیم از کلمات کلیدی Async و Await برای انجام این عملیات استفاده کنیم تا از ساده‌سازی برنامه‌نویسی غیرهمزمان بهره ببریم.

بازدید : 6
يکشنبه 29 بهمن 1402 زمان : 13:43

برای رفع مشکل Save As در فتوشاپ کافیست این مراحل را انجام دهید. اگر در گزینه Save As در فتوشاپ امکان ذخیره کردن عکس با فرمت JPEG یا JPG یا سایر فرمت ها وجود ندارد ، به احتمال زیاد شما فتوشاپ خود را به آخرین نسخه به روز رسانی کرده این و قابلیت Legacy Save As آن غیرفعال شده است ، در این حالت تنها چند گزینه برای ذخیره فایل به عنوان تصویر وجود دارد که بسیار محدود است ، برای حل این مشکل به مسیر زیر در فتوشاپ بروید :

  • ابتدا وارد منوی Edit و Preferences شوید ، سپس وارد گزینه File Handling شوید ( مشابه تصویر زیر )

مطابق تصویر بالا تیک گزینه Enable Legacy "Save As" را بزنید و OK کنید ، خروجی های Save AS قدیمی و JPG را مجدد می توانید ببینید. در دوره آموزش فتوشاپ توسینسو می توانید بصورت حرفه ای ترفندها و نکات مهم فتوشاپ را به خوبی آموزش ببینید.

بازدید : 4
يکشنبه 29 بهمن 1402 زمان : 13:42

برای رفع مشکل Save As در فتوشاپ کافیست این مراحل را انجام دهید. اگر در گزینه Save As در فتوشاپ امکان ذخیره کردن عکس با فرمت JPEG یا JPG یا سایر فرمت ها وجود ندارد ، به احتمال زیاد شما فتوشاپ خود را به آخرین نسخه به روز رسانی کرده این و قابلیت Legacy Save As آن غیرفعال شده است ، در این حالت تنها چند گزینه برای ذخیره فایل به عنوان تصویر وجود دارد که بسیار محدود است ، برای حل این مشکل به مسیر زیر در فتوشاپ بروید :

  • ابتدا وارد منوی Edit و Preferences شوید ، سپس وارد گزینه File Handling شوید ( مشابه تصویر زیر )

مطابق تصویر بالا تیک گزینه Enable Legacy "Save As" را بزنید و OK کنید ، خروجی های Save AS قدیمی و JPG را مجدد می توانید ببینید. در دوره آموزش فتوشاپ توسینسو می توانید بصورت حرفه ای ترفندها و نکات مهم فتوشاپ را به خوبی آموزش ببینید.

تعداد صفحات : 12

درباره ما
موضوعات
لینک دوستان
آمار سایت
  • کل مطالب : 129
  • کل نظرات : 0
  • افراد آنلاین : 1
  • تعداد اعضا : 0
  • بازدید امروز : 1
  • بازدید کننده امروز : 1
  • باردید دیروز : 0
  • بازدید کننده دیروز : 0
  • گوگل امروز : 0
  • گوگل دیروز : 0
  • بازدید هفته : 11
  • بازدید ماه : 64
  • بازدید سال : 657
  • بازدید کلی : 2111
  • <
    پیوندهای روزانه
    آرشیو
    اطلاعات کاربری
    نام کاربری :
    رمز عبور :
  • فراموشی رمز عبور؟
  • خبر نامه


    معرفی وبلاگ به یک دوست


    ایمیل شما :

    ایمیل دوست شما :



    کدهای اختصاصی