Forwarded from DevTwitter | توییت برنامه نویسی
فوت و فن مدیریت امنیت:
برای سازمانها و شرکتهای کوچک تامین هزینه برای خرید تجهیزاتی مانند hashtag#waf بسیار بالا بوده و بعضا با مقاومت مدیران روبرو میشه.
پیشنهاد میشه از ابزار open source برای اینکار استفاده کنید و در ادامه با ارائه گزارش لاگهای فعالیت و رفع مخاطرات و تصویر سازی سناریو های ممکن مدیران را از ریسک نبود تجهیز مطلوب آگاه کنیم.
ابزار bunkerweb رو برای waf داشته باشید
https://github.com/bunkerity/bunkerweb
@DevTwitter | <Peyman khodabandeh/>
برای سازمانها و شرکتهای کوچک تامین هزینه برای خرید تجهیزاتی مانند hashtag#waf بسیار بالا بوده و بعضا با مقاومت مدیران روبرو میشه.
پیشنهاد میشه از ابزار open source برای اینکار استفاده کنید و در ادامه با ارائه گزارش لاگهای فعالیت و رفع مخاطرات و تصویر سازی سناریو های ممکن مدیران را از ریسک نبود تجهیز مطلوب آگاه کنیم.
ابزار bunkerweb رو برای waf داشته باشید
https://github.com/bunkerity/bunkerweb
@DevTwitter | <Peyman khodabandeh/>
Forwarded from Yasha
This media is not supported in your browser
VIEW IN TELEGRAM
مسابقات المپیک فناوری
Forwarded from LearnPOV | لرن پی او وی
من از این برنامه استفاده میکنم که هر بیست دقیقه یکبار صفحه رو ازم میگیره که برم یه دوری بزنم و بشینم:
https://slgobinath.github.io/SafeEyes/
https://slgobinath.github.io/SafeEyes/
Forwarded from Armon technical logs (armon Taheri)
X (formerly Twitter)
Hooman (@MyMazinLife) on X
میانسالی دوران عجیب و متفاوتی از زندگی است. مدتها است در فکرم است از چیزهای که در ذهنم و احساسم میگذره بنویسم. بعد با خودم فکر میکنم الان شاید وقتش نباشه. این تویت باشه اینجا، برای اینکه یادم بمونه که به تدریج زیرش بنویسم. شاید بقیه هم تشویقش شدند بنویسند…
Forwarded from Laravel News
Creating a CLI Application With Laravel and Docker https://laravel-news.com/creating-a-cli-app-with-laravel-and-docker
Laravel News
Creating a CLI Application With Laravel and Docker - Laravel News
While Laravel is traditionally used to create web applications, some applications need robust CLI commands that you can run via Docker in production environments. Learn how to configure your Docker image to run the Artisan CLI, which will give you a foundation…
Forwarded from Laravel News
Laravel Herd Adds Native MongoDB Support https://laravel-news.com/laravel-herd-adds-native-mongodb-support
Laravel News
Laravel Herd Adds Native MongoDB Support - Laravel News
Laravel Herd has added native MongoDB support, making it super easy to integrate MongoDB into your Laravel applications.
Forwarded from Syntax | سینتکس (𝙰𝚖𝚒𝚛𝚑𝚘𝚜𝚜𝚎𝚒𝚗)
This media is not supported in your browser
VIEW IN TELEGRAM
😂😔
#fun
#fun
Forwarded from Gopher Academy
✍️Amir NiloofariAmir Niloofari
آشنایی با Garbage Collector در Go
: مدیریت حافظه کارآمد برای نرمافزارها با کارایی بالا - قسمت ۱
همانطور که در پست قبل اشاره شد یکی از تمایزهای کلیدی Go، جمع آوری زباله همزمان(Concurrent Garbage collector) آن است که به طور هدفمند برای محیط های ابری و سرورهای مدرن ساخته شده است.
با Go، توسعهدهندگان میتوانند برنامههایی با کارایی بالا بسازند و در عین حال مدیریت حافظه را به یک جمعآوری زباله بسیار بهینه و کم تأخیر بسپارند.
در این پست قرار است نگاهی عمیقتر به دلیل متمایز شدن Go’s GC و نحوه عملکرد آن بیندازیم:
- الگوریتم Mark-and-Sweep همزمان:
Go از فرآیند جمعآوری زباله Mark-and-Sweep استفاده میکند که همزمان با برنامه اجرا میشود. در مرحله Mark، لایو آبجکتها (آبجکتی که حداقل یک مرجع به آن وجود دارد) شناسایی و علامت گذاری می شوند. سپس در مرحله Sweep حافظه را برای آبجکتهایی که دیگر به آنها ارجاع داده نمی شود اختصاص می دهد. زیبایی این فرآیند این است که به موازات اجرای برنامه اتفاق میافتد که برای ساخت برنامههای حساس به عملکرد مانند سرورهای وب یا سیستمهای توزیع شده که در آن وقفهها میتوانند مستقیماً بر تاخیر (latency) تاثیر بگذارند، بسیار مهم است.
- تأخیر کم:
GC Go برای سناریوهای Low latency بهینه شده است که این برای برنامه هایی که نیاز به زمان پاسخ سریع دارند، مانند سیستم های بلادرنگ یا API هایی که حجم زیادی از ترافیک را مدیریت می کنند، ایده آل است. جمعآوری زباله به گونهای طراحی شده است که مکثها را به حداقل میرساند و حجم کاری خود را در چندین هسته CPU توزیع میکند و عملکرد برنامه را صاف و بدون وقفه نگه میدارد.
- الگوریتم علامت گذاری سه رنگ(Tricolor Marking):
اگر بخواهیم پشت پرده عملکرد زبان گو در مدیریت آبجکتها را ببینیم از الگوریتم علامت گذاری سه رنگ برای مدیریت کارآمد چرخه عمر اشیا استفاده می کند.
آبجکتها به عنوان سفید (غیرقابل دسترسی)، خاکستری (قابل دسترسی اما به طور کامل کاوش نشده)، یا سیاه (کاملا قابل دسترسی و کاوش شده) طبقه بندی می شوند. این رویکرد تضمین میکند که آبجکتها زنده به درستی علامتگذاری میشوند، در حالی که آبجکتها غیرقابل دسترس کنار گذاشته میشوند، حفظ حافظه غیر ضروری را کاهش میدهد و استفاده کارآمدتر از حافظه را تضمین میکند.
- نوشتن موانع برای اصلاحات حافظه ایمن:
Go در مرحله علامتگذاری از write barriers استفاده میکند تا هنگام تغییر آبجکتها در حافظه، دقت را حفظ کند.
این موانع بهعنوان نقاط بازرسی عمل میکنند و اطمینان میدهند که جمعآورنده زباله از تغییرات در ارجاعات آبجکتها حتی زمانی که برنامه هنوز در حال اجرا است، آگاه است.
این مکانیسم از Memory corruption جلوگیری می کند (هنگامی که محتویات یک مکان حافظه به دلیل رفتار برنامهای که از قصد برنامهنویس اصلی یا سازههای برنامه/زبان فراتر میرود، تغییر میکند.) و تضمین می کند که آبجکتها زنده به اشتباه جابجا نمی شوند و کل سیستم را انعطاف پذیرتر و پاسخگوتر می کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
آشنایی با Garbage Collector در Go
: مدیریت حافظه کارآمد برای نرمافزارها با کارایی بالا - قسمت ۱
همانطور که در پست قبل اشاره شد یکی از تمایزهای کلیدی Go، جمع آوری زباله همزمان(Concurrent Garbage collector) آن است که به طور هدفمند برای محیط های ابری و سرورهای مدرن ساخته شده است.
با Go، توسعهدهندگان میتوانند برنامههایی با کارایی بالا بسازند و در عین حال مدیریت حافظه را به یک جمعآوری زباله بسیار بهینه و کم تأخیر بسپارند.
در این پست قرار است نگاهی عمیقتر به دلیل متمایز شدن Go’s GC و نحوه عملکرد آن بیندازیم:
- الگوریتم Mark-and-Sweep همزمان:
Go از فرآیند جمعآوری زباله Mark-and-Sweep استفاده میکند که همزمان با برنامه اجرا میشود. در مرحله Mark، لایو آبجکتها (آبجکتی که حداقل یک مرجع به آن وجود دارد) شناسایی و علامت گذاری می شوند. سپس در مرحله Sweep حافظه را برای آبجکتهایی که دیگر به آنها ارجاع داده نمی شود اختصاص می دهد. زیبایی این فرآیند این است که به موازات اجرای برنامه اتفاق میافتد که برای ساخت برنامههای حساس به عملکرد مانند سرورهای وب یا سیستمهای توزیع شده که در آن وقفهها میتوانند مستقیماً بر تاخیر (latency) تاثیر بگذارند، بسیار مهم است.
- تأخیر کم:
GC Go برای سناریوهای Low latency بهینه شده است که این برای برنامه هایی که نیاز به زمان پاسخ سریع دارند، مانند سیستم های بلادرنگ یا API هایی که حجم زیادی از ترافیک را مدیریت می کنند، ایده آل است. جمعآوری زباله به گونهای طراحی شده است که مکثها را به حداقل میرساند و حجم کاری خود را در چندین هسته CPU توزیع میکند و عملکرد برنامه را صاف و بدون وقفه نگه میدارد.
- الگوریتم علامت گذاری سه رنگ(Tricolor Marking):
اگر بخواهیم پشت پرده عملکرد زبان گو در مدیریت آبجکتها را ببینیم از الگوریتم علامت گذاری سه رنگ برای مدیریت کارآمد چرخه عمر اشیا استفاده می کند.
آبجکتها به عنوان سفید (غیرقابل دسترسی)، خاکستری (قابل دسترسی اما به طور کامل کاوش نشده)، یا سیاه (کاملا قابل دسترسی و کاوش شده) طبقه بندی می شوند. این رویکرد تضمین میکند که آبجکتها زنده به درستی علامتگذاری میشوند، در حالی که آبجکتها غیرقابل دسترس کنار گذاشته میشوند، حفظ حافظه غیر ضروری را کاهش میدهد و استفاده کارآمدتر از حافظه را تضمین میکند.
- نوشتن موانع برای اصلاحات حافظه ایمن:
Go در مرحله علامتگذاری از write barriers استفاده میکند تا هنگام تغییر آبجکتها در حافظه، دقت را حفظ کند.
این موانع بهعنوان نقاط بازرسی عمل میکنند و اطمینان میدهند که جمعآورنده زباله از تغییرات در ارجاعات آبجکتها حتی زمانی که برنامه هنوز در حال اجرا است، آگاه است.
این مکانیسم از Memory corruption جلوگیری می کند (هنگامی که محتویات یک مکان حافظه به دلیل رفتار برنامهای که از قصد برنامهنویس اصلی یا سازههای برنامه/زبان فراتر میرود، تغییر میکند.) و تضمین می کند که آبجکتها زنده به اشتباه جابجا نمی شوند و کل سیستم را انعطاف پذیرتر و پاسخگوتر می کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Forwarded from Gopher Academy
آشنایی با Garbage Collector در Go: مدیریت حافظه کارآمد برای نرمافزارها با کارایی بالا - قسمت ۲
میتوانید قسمت ۱ را در پست قبلی مطالعه کنید. ادامه:
- جمع آوری زباله قابل تنظیم:
یکی از ویژگی های برجسته Go، جمع آوری زباله قابل تنظیم آن است. توسعهدهندگان میتوانند فرکانس GC را با استفاده از متغیر محیطی «GOGC» تنظیم کنند، که تعداد دفعات کار جمعآور زباله را نسبت به رشد پشته کنترل میکند.
مقدار پیش فرض 100 است، به این معنی که GC پس از دو برابر شدن اندازه پشته فعال می شود. افزایش مقدار «GOGC» فرکانس جمعآوری زباله را کاهش میدهد، مصرف حافظه را با وقفههای کمتر عوض میکند، در حالی که کاهش آن باعث میشود GC بیشتر اجرا شود و کنترل دقیقتری بر استفاده از حافظه تضمین میکند.
export GOGC=200 // رشد پشته را افزایش می دهد و باعث می شود GC کمتر اجرا شود
- Escape Analysis برای تخصیص پشته در مقابل هیپ:
کامپایلر Go از تحلیل گریز استفاده میکند، که تعیین میکند متغیرها میتوانند در کدام ساختار داده stack یا heap تخصیص داده شوند. متغیرهایی که از محدوده خود "فرار" نمی کنند (مانند متغیرهای محلی در یک تابع) به صورت پشته ای تخصیص داده می شوند که سریعتر است و از جمع آوری زباله به طور کلی جلوگیری می کند. از سوی دیگر، تخصیص هیپ توسط جمع کننده زباله ردیابی می شود و تحلیل فرار استفاده غیر ضروری از هیپ را به حداقل می رساند و مدیریت حافظه را برای بسیاری از برنامه ها بهینه می کند.
- Profiling and Monitoring عملکرد GC:
Go ابزارهای قوی برای نظارت و بهینه سازی عملکرد GC فراهم می کند. بسته «زمان اجرا» به توسعه دهندگان اجازه می دهد تا آمار دقیق GC را ردیابی کنند، در حالی که "pprof" پروفایل CPU و حافظه را برای شناسایی و رفع تنگناهای عملکرد ارائه می دهد. این به ویژه برای برنامههایی با تنظیمات دقیق که نیاز به کار در مقیاس یا زیر بار سنگین دارند، ارزشمند است و این امکان را میدهد الگوهای استفاده از حافظه را مشخص کرد و رفتار برنامه را بهینه نمود.
- کارایی حافظه در Go:
ترکیبی از جمعآوری همزمان زباله، Escape Analysis و موانع نوشتن تضمین میکند که Go در مدیریت حافظه بسیار کارآمد است، و آن را به یک انتخاب قدرتمند برای سیستمهای بکاند، میکروسرویسها و سرورهای با توان بالا تبدیل میکند.
چه در حال ساخت یک برنامه بومی ابری یا یک API با کارایی بالا باشید، GC به شما آرامش می دهد که مدیریت حافظه بدون نیاز به مداخله دستی بهینه شده است.
در نتیجه، جمعآوری زباله Go یکی از جذابیتهای این زبان برای توسعه سیستمهای پیشرفته و توزیعشده مدرن است که به توسعه دهنده این امکان را می دهد بدون نگرانی در مورد مدیریت حافظه سطح پایین، بر روی ساخت برنامه های مقیاس پذیر و با کارایی بالا تمرکز کند. با گزینههای تنظیم دقیق، ابزارهای پروفایل قوی و حداقل وقفهها، GC Go تضمین میکند که حافظه به صورتی کارآمد به گونهای که برای توسعهدهنده شفاف باشد، مدیریت میشود.
اگر با Go کار میکنید، زمانی را صرف درک نحوه عملکرد جمعکننده زباله آن کنید این میتواند به شما در تصمیمگیری بهتر در مورد عملکرد، مقیاسپذیری و بهینهسازی حافظه کمک کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
میتوانید قسمت ۱ را در پست قبلی مطالعه کنید. ادامه:
- جمع آوری زباله قابل تنظیم:
یکی از ویژگی های برجسته Go، جمع آوری زباله قابل تنظیم آن است. توسعهدهندگان میتوانند فرکانس GC را با استفاده از متغیر محیطی «GOGC» تنظیم کنند، که تعداد دفعات کار جمعآور زباله را نسبت به رشد پشته کنترل میکند.
مقدار پیش فرض 100 است، به این معنی که GC پس از دو برابر شدن اندازه پشته فعال می شود. افزایش مقدار «GOGC» فرکانس جمعآوری زباله را کاهش میدهد، مصرف حافظه را با وقفههای کمتر عوض میکند، در حالی که کاهش آن باعث میشود GC بیشتر اجرا شود و کنترل دقیقتری بر استفاده از حافظه تضمین میکند.
export GOGC=200 // رشد پشته را افزایش می دهد و باعث می شود GC کمتر اجرا شود
- Escape Analysis برای تخصیص پشته در مقابل هیپ:
کامپایلر Go از تحلیل گریز استفاده میکند، که تعیین میکند متغیرها میتوانند در کدام ساختار داده stack یا heap تخصیص داده شوند. متغیرهایی که از محدوده خود "فرار" نمی کنند (مانند متغیرهای محلی در یک تابع) به صورت پشته ای تخصیص داده می شوند که سریعتر است و از جمع آوری زباله به طور کلی جلوگیری می کند. از سوی دیگر، تخصیص هیپ توسط جمع کننده زباله ردیابی می شود و تحلیل فرار استفاده غیر ضروری از هیپ را به حداقل می رساند و مدیریت حافظه را برای بسیاری از برنامه ها بهینه می کند.
- Profiling and Monitoring عملکرد GC:
Go ابزارهای قوی برای نظارت و بهینه سازی عملکرد GC فراهم می کند. بسته «زمان اجرا» به توسعه دهندگان اجازه می دهد تا آمار دقیق GC را ردیابی کنند، در حالی که "pprof" پروفایل CPU و حافظه را برای شناسایی و رفع تنگناهای عملکرد ارائه می دهد. این به ویژه برای برنامههایی با تنظیمات دقیق که نیاز به کار در مقیاس یا زیر بار سنگین دارند، ارزشمند است و این امکان را میدهد الگوهای استفاده از حافظه را مشخص کرد و رفتار برنامه را بهینه نمود.
- کارایی حافظه در Go:
ترکیبی از جمعآوری همزمان زباله، Escape Analysis و موانع نوشتن تضمین میکند که Go در مدیریت حافظه بسیار کارآمد است، و آن را به یک انتخاب قدرتمند برای سیستمهای بکاند، میکروسرویسها و سرورهای با توان بالا تبدیل میکند.
چه در حال ساخت یک برنامه بومی ابری یا یک API با کارایی بالا باشید، GC به شما آرامش می دهد که مدیریت حافظه بدون نیاز به مداخله دستی بهینه شده است.
در نتیجه، جمعآوری زباله Go یکی از جذابیتهای این زبان برای توسعه سیستمهای پیشرفته و توزیعشده مدرن است که به توسعه دهنده این امکان را می دهد بدون نگرانی در مورد مدیریت حافظه سطح پایین، بر روی ساخت برنامه های مقیاس پذیر و با کارایی بالا تمرکز کند. با گزینههای تنظیم دقیق، ابزارهای پروفایل قوی و حداقل وقفهها، GC Go تضمین میکند که حافظه به صورتی کارآمد به گونهای که برای توسعهدهنده شفاف باشد، مدیریت میشود.
اگر با Go کار میکنید، زمانی را صرف درک نحوه عملکرد جمعکننده زباله آن کنید این میتواند به شما در تصمیمگیری بهتر در مورد عملکرد، مقیاسپذیری و بهینهسازی حافظه کمک کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Forwarded from Linuxor ?
این پروژه هم باحال بود با Go یه برنامه تحت وب نوشتن که از طریق LAN فایل هارو بشه جابجا کرد
https://github.com/aziis98/mup
🐧 @Linuxor
https://github.com/aziis98/mup
🐧 @Linuxor
Forwarded from Armon technical logs (armon Taheri)
چرا نالج شیرینگ بیشتر از اینکه کمک به بقیه باشه کمک به خودش شخص هست
Forwarded from Gopher Academy
کلیدیترین تفاوتهای بین
### 1. مبنای زمانبندی
- **
یک بازه زمانی ثابت مشخص میکند. Context پس از گذشت مدت زمان مشخص از زمان فراخوانی این تابع، منقضی میشود.
- مثال: اگر
- **
یک زمان مشخص در آینده تعیین میکند. Context دقیقا در لحظهی مشخص شده در deadline منقضی میشود.
- مثال: اگر
مورد استفادهستفاده**
- **
زمانی که مدت زمان اجرای یک عملیات برای شما مهم است و میخواهید پس از مدت مشخصی عملیات خاتمه یابد، از
- **
زمانی که به یک deadline دقیق نیاز دارید (مانند زمانی که میخواهید قبل از یک لحظهی دقیق، عملیاتی خاتمه یابد)، از
### 4. **انعطافپذیری بیشتر
- در مواردی که زمان دقیق (مربوط به یک deadline خاص) برای شما مهم است،
- **
### مثالها:
در نهایت، انتخاب بین این دو تابع بستگی به نوع نیاز شما به زمانبندی و مدیریت زمان اجرای عملیاتها دارد.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
context.WithTimeout و context.WithDeadline در نحوهی مدیریت زمانبندی و خاتمهی contextها در Go است:### 1. مبنای زمانبندی
- **
context.WithTimeout**:یک بازه زمانی ثابت مشخص میکند. Context پس از گذشت مدت زمان مشخص از زمان فراخوانی این تابع، منقضی میشود.
- مثال: اگر
context.WithTimeout(ctx, 5*time.Second) فراخوانی شود، context پس از ۵ ثانیه منقضی میشود.- **
context.WithDeadline**:یک زمان مشخص در آینده تعیین میکند. Context دقیقا در لحظهی مشخص شده در deadline منقضی میشود.
- مثال: اگر
context.WithDeadline(ctx, time.Now().Add(5*time.Second)) فراخوانی شود، context در لحظهی دقیق مشخص شده (۵ ثانیه بعد) منقضی میشود.مورد استفادهستفاده**
- **
WithTimeout**: زمانی که مدت زمان اجرای یک عملیات برای شما مهم است و میخواهید پس از مدت مشخصی عملیات خاتمه یابد، از
WithTimeout استفاده میشود.- **
WithDeadline**:زمانی که به یک deadline دقیق نیاز دارید (مانند زمانی که میخواهید قبل از یک لحظهی دقیق، عملیاتی خاتمه یابد)، از
WithDeadline استفاده پیادهسازی داخWithTimeout **WithTimeout** به عنوان یک shortcut برای WithDeadline عمل میکند و در واقع از WithDeadline استفاده میکند تا زمانی که مدت مشخص شده به پایان برسد. به این معنا که WithTimeout(ctx, d) معادل WithDeadline(ctx, time.Now().Add(d)) است.### 4. **انعطافپذیری بیشتر
WithDeadline**- در مواردی که زمان دقیق (مربوط به یک deadline خاص) برای شما مهم است،
WithDeadline انعطاف بیشتری فراهم میکند، زیرا میتوانید زمان مشخصی را به عنوان نقطکاربردهای رایج. **کاربردهای رایج**- **
context.WithTimeout** معمولاً برای تعیین یک بازه زمانی ثابت برای خاتمه دادن به عملیاتی مانند درcontext.WithDeadline**context.WithDeadline** اغلب در سیستمهای توزیع شده یا عملیاتی که یک زمانبندی خاص برای اتمام دارند، کاربرد دارد.### مثالها:
// WithTimeout: منقضی شدن پس از 5 ثانیه
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// WithDeadline: منقضی شدن در یک زمان دقیق
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(5*time.Second))
defer cancel()
در نهایت، انتخاب بین این دو تابع بستگی به نوع نیاز شما به زمانبندی و مدیریت زمان اجرای عملیاتها دارد.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Forwarded from Gopher Academy
برای درک بهتر از مکانیزم داخلی
این دو تابع هر دو بر اساس
### 1. ساختار Context
هر دو
- **
این تابع مدت زمانی به عنوان ورودی میگیرد و به کمک آن یک تایمر تنظیم میکند. تایمر از زمان فعلی (
- تایمر در واقع یک goroutine راهاندازی میکند که بعد از گذشت زمان، یک سیگنال خاتمه (
- **
مشابه
مکانیزم استفاده از تایمرهاایمرها**
در هر دو روش، تایمرها با استفاده از
نحوهی لغو Contextontext**
هر دو تابع به همراه یک تابع
نحوهی بررسی انقضای Contextontext**
هنگامی که عملیات در جریان است، شما میتوانید با استفاده از
### 5. **پیادهسازی داخلی
در کد داخلی کتابخانه
این تابع فقط زمان حال (
### 6. **زمانبندی دقیقتر با
در
### نتیجهگیری:
-
-
- هر دو تابع مکانیزمهای مشابهی از تایمرهای Go استفاده میکنند و هر دو به کمک goroutineها برای ارسال سیگنال خاتمه عمل میکنند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
context.WithTimeout و context.WithDeadline، باید به نحوهی پیادهسازی آنها در کتابخانهی context و چگونگی استفاده از تایمرها در Go توجه کنیم. این دو تابع هر دو بر اساس
context پایهای ساخته میشوند، اما تفاوت اصلی آنها در نحوهی مدیریت زمان و استفاده از تایمرهای داخلی است.### 1. ساختار Context
هر دو
WithTimeout و WithDeadline با ایجاد یک derived context (مشتقشده از context اصلی) کار میکنند. این context جدید مشابه context اصلی است، اما به جای آن که تا انتهای عمر برنامه معتبر باشد، در یک زمان مشخص منقضی میشود. مکانیزم داخلی به این صورت است:- **
WithTimeout**: این تابع مدت زمانی به عنوان ورودی میگیرد و به کمک آن یک تایمر تنظیم میکند. تایمر از زمان فعلی (
time.Now()) شروع به شمارش میکند و بعد از اتمام مدت زمان مشخص شده، context منقضی میشود. - تایمر در واقع یک goroutine راهاندازی میکند که بعد از گذشت زمان، یک سیگنال خاتمه (
Done) ارسال میکند.- **
WithDeadline**: مشابه
WithTimeout است، اما به جای این که مدت زمان از حالا محاسبه شود، زمانی ثابت برای خاتمه داده میشود. Goroutine مشابهی برای زمان دقیق پایان شروع میشود. این تابع میتواند مفید باشد در مواقعی که باید عملیات حتماً قبل از یک زمان خاص خاتمه یابد.مکانیزم استفاده از تایمرهاایمرها**
در هر دو روش، تایمرها با استفاده از
time.AfterFunc یا time.NewTimer در Go پیادهسازی میشوند. تایمر بهگونهای عمل میکند که وقتی زمان مشخص شده به پایان برسد، کانال Done فعال شده و پیام خاتمه ارسال میشود. در این زمان، عملیات مرتبط باید متوقف شود و با بررسی کانال Done از ادامهی کار بازماند.نحوهی لغو Contextontext**
هر دو تابع به همراه یک تابع
cancel بازگردانده میشوند. این تابع cancel به شما اجازه میدهد به صورت دستی context را قبل از پایان زمان آن لغو کنید. وقتی cancel فراخوانی شود، تایمر مربوط به context متوقف شده و کانال Done نیز بسته میشود. این مکانیزم به شما کمک میکند تا منابع استفادهشده توسط تایمرها را پاکسازی کنید و از اجرای بیمورد جلوگیری نمایید.نحوهی بررسی انقضای Contextontext**
هنگامی که عملیات در جریان است، شما میتوانید با استفاده از
ctx.Done() بررسی کنید که آیا context منقضی شده یا خیر. این تابع یک کانال بازمیگرداند که در صورت انقضای context، بسته میشود و به goroutineها سیگنال میدهد که عملیات فعلی را خاتمه دهند. این سیگنالدهی از طریق select یا بررسی مستقیم کانال انجام میشود.### 5. **پیادهسازی داخلی
WithTimeout به کمک WithDeadline**در کد داخلی کتابخانه
context، پیادهسازی WithTimeout به صورت مستقیم از WithDeadline استفاده میکند:func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
return WithDeadline(parent, time.Now().Add(timeout))
}این تابع فقط زمان حال (
time.Now()) را به timeout اضافه کرده و آن را به WithDeadline ارسال میکند. به همین دلیل، WithTimeout در واقع یک shortcut برای WithDeadline است.### 6. **زمانبندی دقیقتر با
WithDeadline**در
WithDeadline شما میتوانید یک زمان دقیق برای انقضا مشخص کنید. مثلاً میتوانید تعیین کنید که context در ساعت مشخصی منقضی شود، بدون توجه به این که در حال حاضر چقدر زمان باقیمانده است. این ویژگی برای مواردی مفید است که نیاز دارید چندین عملیات به طور همزمان و هماهنگ با یک deadline خاص به پایان برسند.### نتیجهگیری:
-
WithTimeout برای محدود کردن مدت زمان یک عملیات مفید است.-
WithDeadline برای تعیین یک زمان دقیق (مانند یک deadline واقعی) استفاده میشود.- هر دو تابع مکانیزمهای مشابهی از تایمرهای Go استفاده میکنند و هر دو به کمک goroutineها برای ارسال سیگنال خاتمه عمل میکنند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Forwarded from DevTwitter | توییت برنامه نویسی
پست موقت
تبلیغات خود تلگرام دست ما نیست، ممکنه هر چیزی نمایش داده بشه، ما حتی خودمون نمیبینیم.
مراقب باشید اسکم نشید.
ممکنه پروژههای کلاهبرداری و اسکم بخوان تبلیغ کنن.
قبل از هر جور پول دادنی حتما همه چیز رو بررسی کنید.
تبلیغات خود تلگرام دست ما نیست، ممکنه هر چیزی نمایش داده بشه، ما حتی خودمون نمیبینیم.
مراقب باشید اسکم نشید.
ممکنه پروژههای کلاهبرداری و اسکم بخوان تبلیغ کنن.
قبل از هر جور پول دادنی حتما همه چیز رو بررسی کنید.
Forwarded from Future Pulse Persian
تأثیر دانش زبان انگلیسی در دنیای برنامهنویسی از نگاه موسسه زبان آفاق
https://www.zoomit.ir/pr/428701-afagh-lc/
➖➖➖➖➖➖➖➖
👑 @labdon_academy
https://www.zoomit.ir/pr/428701-afagh-lc/
➖➖➖➖➖➖➖➖
👑 @labdon_academy
Forwarded from Rust for Python developers
پاسخ من به یک سوال در مورد
——————————————————————————————
توی این داکرفایل من اول اومدم از یک ایمیج کامل
یک توی خط ۴ دارم پکیجهای دیگهای که برای کامپایل سریعتر نیاز دارم رو نصب میکنم؛ نکته مهم هم همینجاس من اینها رو فقط برای کامپایل نیاز دارم و نه برای اجرای کد نهایی
توی خط ۵
پس خط ۶ رو دارم که یک
اگر سورس کد من ی خط تغییر کرد ولی
همینجا اضافه کنم ی
خط ۸ و ۹ پروژه خودم رو کپی و کامپایل میکنم.
توی خط ۱۲ دارم از یک ایمیج دیگه استفاده میکنم که اصلا
خط ۱۴ تا ۱۸ پکیجهایی که این ایمیج نداره و نیاز دارم رو نصب میکنم مثل
در نهایت از مرحله قبل نتیجه
حجم نهایی کانتینر پروژه روی
اضافه کنم :
راجب
پ.ن :
سورس توی کامنت؛ اگر نمیتونید فونت رو بخونید.
multi-stage dockerfile که توی گروه بحث آزادمون شده بود دیدم روی rust دارم مثال میزنم گفتم اینجا هم بذارم.——————————————————————————————
توی این داکرفایل من اول اومدم از یک ایمیج کامل
rust استفاده کردم برای بخش اول اسم این بخش رو گذاشتم builder؛ این ایمیج شامل همه چیزهایی که من لازم دارم هست مثل یک لینوکس دبیان کامل و اگر سایزش رو هم ببینید بصورت خام 1.47 GB هست.یک توی خط ۴ دارم پکیجهای دیگهای که برای کامپایل سریعتر نیاز دارم رو نصب میکنم؛ نکته مهم هم همینجاس من اینها رو فقط برای کامپایل نیاز دارم و نه برای اجرای کد نهایی
توی خط ۵
Cargo.toml, Cargo.lock رو کپی میکنم که dependency هارو داشته باشم ولی Rust مثل python نیست؛ یعنی نمیشه بدون داشتن سورس کد dependency هارو دانلود کرد و cache کرد یا بگی روی این environment نصبش کن و ...پس خط ۶ رو دارم که یک
main.rs خالی میسازم برای اینکه بتونم dependency هارو بگیرم و cache کنم مراحل رو ایده هم اینه :اگر سورس کد من ی خط تغییر کرد ولی
dependency عوض نشد نباید مجبور بشم dependency هارو مجدد دانلود کنم و ...همینجا اضافه کنم ی
crate داریم به اسم cargo chef که برای همین کار هست؛ من تا جایی که مجبور نباشم ازش استفاده نمیکنم که یک dependency کمتر برای داکر داشته باشم.خط ۸ و ۹ پروژه خودم رو کپی و کامپایل میکنم.
توی خط ۱۲ دارم از یک ایمیج دیگه استفاده میکنم که اصلا
rust, rustc, cargo , ... رو هم نداره و image مرحله قبل بر پایه این هست حجم این ایمیج فقط و فقط 75MB هست.خط ۱۴ تا ۱۸ پکیجهایی که این ایمیج نداره و نیاز دارم رو نصب میکنم مثل
openssl, ca-certificates اینم برای دسترسی به سرویس دیتابیس هست چون روی یک سرور دیگه هست.در نهایت از مرحله قبل نتیجه
compile رو بر میدارم + .env پروژه و پروژه رو اجرا میکنم حجم نهایی کانتینر پروژه روی
200MB هست درحالی که اگر از multi-stage استفاده نمیکردم و میخواستم روی ایمیج 1.47GB اجراش کنم حجمش به بیش از 3GB میرسید و با هر تغییر توی کدهام باید حتی منتظر دانلود شدم پکیجها و .. هم میموندم.اضافه کنم :
راجب
cargo-chef هم مزیتش رو نمیفهمم (بنظرم یک bottleneck و یک نگرانی اضافه هست) قطعا یک discussion جدید میسازم روی rust community ببینم مزیتش چیه.پ.ن :
سورس توی کامنت؛ اگر نمیتونید فونت رو بخونید.
Forwarded from IRCF | اینترنت آزاد برای همه
This media is not supported in your browser
VIEW IN TELEGRAM
سوال خبرنگار از سخنگوی دولت اینه که چه کاری و چطور قراره انجام بشه؟ در واقع دنبال اطلاعات بیشتر درباره چگونگی روند رفع فیلتر در دولتیه که یکی از مهمترین وعدههاش همین بود! اما ایشون هیچ پاسخی به این پرسش نمیده و فقط میفهمیم خودش هم از #فیلترشکن استفاده میکنه!
© Nima Akbarpour
🔍 ircf.space
@ircfspace
© Nima Akbarpour
🔍 ircf.space
@ircfspace