Dev Perfects
40 subscribers
9.23K photos
1.26K videos
468 files
13K links
بخوام خیلی خلاصه بگم
این کانال میاد مطالب کانالای خفن تو حوزه تکنولوژی و برنامه نویسی رو جمع میکنه

پست پین رو بخونید
https://t.iss.one/dev_perfects/455


ارتباط:
https://t.iss.one/HidenChat_Bot?start=936082426
Download Telegram
Forwarded from 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
برای درک بهتر از مکانیزم داخلی 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 Future Pulse Persian
تأثیر دانش زبان انگلیسی در دنیای برنامه‌نویسی از نگاه موسسه زبان آفاق

https://www.zoomit.ir/pr/428701-afagh-lc/


👑 @labdon_academy
Forwarded from memealloc
پاسخ من به یک سوال در مورد 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 ببینم مزیتش چیه.


پ.ن :
سورس توی کامنت؛ اگر نمی‌تونید فونت رو بخونید.
This media is not supported in your browser
VIEW IN TELEGRAM
سوال خبرنگار از سخنگوی دولت اینه که چه کاری و چطور قراره انجام بشه؟ در واقع دنبال اطلاعات بیشتر درباره چگونگی روند رفع فیلتر در دولتیه که یکی از مهم‌ترین وعده‌هاش همین بود! اما ایشون هیچ پاسخی به این پرسش نمی‌ده و فقط می‌فهمیم خودش هم از #فیلترشکن استفاده می‌کنه!

© Nima Akbarpour

🔍 ircf.space
@ircfspace‏⁧
Forwarded from TechTube 𝕏 تک توب
This media is not supported in your browser
VIEW IN TELEGRAM
میدونستین یوتوب از فرمتهای پیشرفته زیرنویس مثل ass. پشتیبانی میکنه؟!

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

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

📍 @TechTube
Forwarded from CleverDevs (CleverDevs Ads)
🔥🔥🔥
▪️ فروش ویژه اکانت GitHub Copilot
💸 فقط با ۹۹ هزار تومن

🌟 با اکانت GitHub Copilot چی گیرت میاد؟
سریع‌تر و حرفه‌ای‌تر کد بزن!
پیشنهادای هوشمندانه و دقیق برای کدهات
کمتر وقت بذار روی دیباگ و بیشتر کد بزن!
از هوش مصنوعی یاد بگیر و ایده بگیر

فرصت عالی واسه برنامه‌نویسای خفن!🚀
همین الان بخر و لذت یه کدنویسی حرفه‌ای رو تجربه کن.

نکته: این پلن فقط روی اکانت‌هایی که قبلاً تریال نداشتن فعال می‌شه.

⭐️ واسه خرید و راهنمایی به این آیدی پیام بده
🆔 @GeekGroveSupport

نکات برنامه نویسی مفید
🆔 @geek_grove
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
خب امروز چه پستی بسازم که برنامه نویسا فکر کنن هیچی بلد نیستن و من خیلی خفنم بیان فالون کنن ؟

- ایول فهمیدم

۵ تا سوال مسخره میپرسم که تعداد کمی از برنامه نویسا همشو میدونن 😃

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

🔸 در کل ایسنتاگرام تا حد خیلی خوبی فضای سمی داره و یکی از دلایلشم اینه که ارتباط مستقیم با دوپامین مغز داره و سطح دوپامینتون رو بالا و بالاتر میبره 🔸

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


شاید جالب باشه براتون ولی چند وقت پیش جادی توییت زد که از دید ایسنتاگرام من هنوز برنامه نویس خوبی نشدم چون دو تا از این موارد رو نمیدونستم ؛)

𝗖𝗛𝗔𝗡𝗡𝗘𝗟  |  𝗚𝗥𝗢𝗨𝗣
#نکته از #ویم


برای حذف کردن کل بافر (کل متن‌هایی که توی یک سند هست) کافیه که

:%d

رو بزنید.

@SohrabContents
Forwarded from ASafaeirad
Someone actually used git blame on the Git source code... to blame the creator of Git itself :))

Nice article BTW

https://www.jonathancreamer.com/how-we-shrunk-our-git-repo-size-by-94-percent/

#article #git
Forwarded from Linuxor ?
توی این پست لینوکسور درباره اینکه eBPF چیه صحبت کردیم

حالا اگه براتون سواله که چطوری یه برنامه eBPF نوشته میشه آقای prateak به صورت ساده یه برنامه پایتونی eBPF نوشته و اونو توی کرنل لود کرده.

https://prateek-singh.hashnode.dev/first-ebpf-program


🐧 @Linuxor
Forwarded from  (Amir Hossein "Amiria" Maher)
سرگرمی‌شان شده که دیپلمات‌ها را در حین مذاکرات زیر فشار بگذارند که میز مذاکره را ترک کنند و نظامیان را در شرایط جنگی زیر فشار بگذارند که عملیات انجام دهند.‌ اینها نه تخصصی در سیاست دارند، نه در امور نظامی. فقط به هیجان و آدرنالین اعتیاد دارند و ۹۰ میلیون نفر باید هزینه‌ش را بدهند.

علی نصری

#note #quote
@amiria703_channel
یک چندتا ادیت روی این مورد بدم؛ همونطور که گفتم من تازه داشتم اینجا داکرفایل رو برای پروژه‌ام می‌نوشتم که توی گروه یکی از دوستان سوال پرسید و ترجیح دادم روی نمونه جواب بدم.
اینکه این dockerfile درست هست خوبه یا نه هدف نبود و هدف درک multi-stage بود.

اما چندتا نکته (بر خلاف دنیای پایتون) :
۱- استفاده از اسم src قطعا اینجا مناسب نیست؛ من حواسم نبود ولی cargo, rustc رو این اسم حساب می‌کنند پس app رو جای
Forwarded from  (Amir Hossein "Amiria" Maher)
آدمایی که شطرنج بازی می‌کنن، به وضعیّت مهره‌ها مثل چینش و داخل یا بیرون صفحه بودن، اهمیّتی نمی‌دن امّا مهره‌ها، با همدیگه، فقط برای اینکه داخل صفحهٔ بازی بیشتر بمونن و اینکه طرف خودشون ببره، می‌جنگن.
این بازی از اونی که به نظر می‌رسه، پلیدتره. مواظب خودتون باشید. 💟

#note
@amiria703_channel
Forwarded from  (Amir Hossein "Amiria" Maher)
politicalcompass.org

اگه دوست دارید بدونید، من اینجام:

#note
@amiria703_channel
Forwarded from 🎄 یک برنامه نویس تنبل (  MΞ)
🔶 ابزار Extension.js

با این پروژه میتونید یه افزونه بنویسید و توی همه مرورگرها اجرا کنید!
قبل ازین پروژه نوشتن افزونه‌ها دردسر خودشو داشت نمیتونستی افزونه کروم توی فایرفاکس بالا بیاری و بالعکس
در حالی که کدها یکی بودن فقط api هر مرورگر فرق داشت
از همه مهمتر که تایپ اسکریپت هم ساپورت میکنه و در ابتدا خودش یه ساختار خوبی از پروژه ایجاد میکنه دیگه نیازی به کانفیگ خاصی نیست خودش راحت بیلد میگیره 😍

https://github.com/extension-js/extension.js

#معرفی

@TheRaymondDev
یک چندتا ادیت روی این مورد بدم؛ همونطور که گفتم من تازه داشتم اینجا داکرفایل رو برای پروژه‌ام می‌نوشتم که توی گروه یکی از دوستان سوال پرسید و ترجیح دادم روی نمونه جواب بدم.
اینکه این dockerfile درست هست خوبه یا نه هدف نبود و هدف درک multi-stage بود.

اما چندتا نکته (بر خلاف دنیای پایتون) :

۱- استفاده از اسم src قطعا اینجا مناسب نیست؛ من حواسم نبود ولی cargo, rustc رو این اسم حساب می‌کنند پس app رو جایگزین کردم

۲- از cargo-chef استفاده کردم به ۲ دلیل :
۲-۱: توی کد بالا من compile انجام نمیدادم و فقط پکیج‌هارو دانلود میکردم؛ قصدم این بود توی استپ بعدی سراغش برم ولی خب توی بعضی شرایط خاص دردسرش زیاد میشه که الان فرصتش رو نداشتم.
۲-۲: توی همون شرایط و crate های خاص (که اتفاقا یکی از دوستان توی پروژه‌اش بهم نشون داد) باعث میشه قابلیت cache رو از دست بدید؛ دلیل اصلیش رو نمی‌دونم.

۳- بجای استفاده از اداکر ایمیج‌های معرفی شده توسط پروژه cargo-chef از همون rust:1.82.0 استفاده کردم و فقط یک استیج بیشتر ساختم که دستورات زیر رو داشته باشه :
RUN apt update && apt install lld clang -y && cargo install cargo-chef


۴- وقتی sqlx رو توی پروژه دارم؛ توی استیج runtime حتما باید sqlx migrate runtime رو اجرا کنم. (برایحجم کمتر این مورد رو با migrate macro اجرا کردم.

۵- خیلی بهتره موقع استفاده از cargo build —release توی استیج builder باید از فلگ:
—bin <appname>
استفاده کنم


نهایتا شد این :
FROM rust:1.82.0 AS chef
WORKDIR /app
RUN apt update && apt install lld clang -y && cargo install cargo-chef

FROM chef as planner
COPY . .
RUN cargo chef prepare --recipe-path recipe.json

FROM chef AS builder
COPY --from=planner /app/recipe.json recipe.json
RUN cargo chef cook --release --recipe-path recipe.json
COPY . .
ENV SQLX_OFFLINE true
RUN cargo build --release --bin XYZ

FROM debian:bookworm-slim AS runtime
WORKDIR /app
RUN apt update -y \
&& apt install -y --no-install-recommends openssl ca-certificates \
&& apt autoremove -y \
&& apt clean -y \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/release/XYZ XYZ
COPY .env .env
ENTRYPOINT [ "./XYZ" ]