Forwarded from DevOps Labdon
رد پیشنهادهای چند میلیون دلاری؛ خالق VLC میخواهد نرمافزارش رایگان بماند
https://www.zoomit.ir/software-application/447008-skipping-multi-million-dollar-offer-vlc/
https://www.zoomit.ir/software-application/447008-skipping-multi-million-dollar-offer-vlc/
زومیت
رد پیشنهادهای چند میلیون دلاری؛ خالق VLC میخواهد نرمافزارش رایگان بماند
توسعهدهندهی ویالسی میگوید از پیشنهادهای چند میلیون دلاری شرکتهای مطرح چشمپوشی کرده است تا این نرمافزار رایگان بماند.
❤14 8
🔵 عنوان مقاله
has now released Omarchy 2.0
🟢 خلاصه مقاله:
**اومارچی ۲.۰ منتشر شده است و یک ویدئوی ۳۰ دقیقهای همراه آن ارائه شده که روند کار و ویژگیها را مرور میکند. این عرضه در روزهای اخیر با استقبال و توجه قابلتوجهی از سوی توسعهدهندگان در شبکههای اجتماعی روبهرو شده و بحثهای پررونقی را برانگیخته است.
🟣لینک مقاله:
https://golangweekly.com/link/173359/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
has now released Omarchy 2.0
🟢 خلاصه مقاله:
**اومارچی ۲.۰ منتشر شده است و یک ویدئوی ۳۰ دقیقهای همراه آن ارائه شده که روند کار و ویژگیها را مرور میکند. این عرضه در روزهای اخیر با استقبال و توجه قابلتوجهی از سوی توسعهدهندگان در شبکههای اجتماعی روبهرو شده و بحثهای پررونقی را برانگیخته است.
🟣لینک مقاله:
https://golangweekly.com/link/173359/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Hey
Omarchy 2.0
Omarchy 2.0 was released on Linux's 34th birthday as a gift to perhaps the greatest open-source project the world has ever known. Not only does Linux run 95% of all servers on the web, billions of devices as an embedded OS, but it also turns out to be an…
Forwarded from Bardia & Erfan
🚀 به دنیای توسعه و تکنولوژی خوش اومدی!
اگر به موضوعات زیر علاقهمندی:
🔹 Golang
🔹 Linux & DevOps
🔹 Software Engineering
🔹 AI & Machine Learning
🔹 فرصتهای شغلی ریموت (خارجی و داخلی)
ما برات یه مجموعه کانالهای تخصصی ساختیم تا همیشه بهروز، حرفهای و الهامبخش بمونی!
📚 یادگیری، فرصت، شبکهسازی و پیشرفت، همش اینجاست...
📌 از این لینک همه چنلهامونو یهجا ببین و جوین شو:
👉 https://t.iss.one/addlist/QtXiQlynEJwzODBk
اگر به موضوعات زیر علاقهمندی:
🔹 Golang
🔹 Linux & DevOps
🔹 Software Engineering
🔹 AI & Machine Learning
🔹 فرصتهای شغلی ریموت (خارجی و داخلی)
ما برات یه مجموعه کانالهای تخصصی ساختیم تا همیشه بهروز، حرفهای و الهامبخش بمونی!
📚 یادگیری، فرصت، شبکهسازی و پیشرفت، همش اینجاست...
📌 از این لینک همه چنلهامونو یهجا ببین و جوین شو:
👉 https://t.iss.one/addlist/QtXiQlynEJwzODBk
❤2
🔵 عنوان مقاله
html-to-markdown 2.4: Convert HTML to Markdown
🟢 خلاصه مقاله:
این ابزار با نام html-to-markdown 2.4 محتوای HTML را با پارسکردن واقعی ساختار آن به Markdown تبدیل میکند، نه با الگوهای regex؛ بنابراین در برابر موارد پیچیده و مرزی پایدارتر است. هم بهصورت ابزار خط فرمان و هم بهعنوان کتابخانه Go قابل استفاده است و برای سناریوهایی مثل مهاجرت محتوا و تولید وبسایتهای استاتیک مناسب است.
🟣لینک مقاله:
https://golangweekly.com/link/173347/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
html-to-markdown 2.4: Convert HTML to Markdown
🟢 خلاصه مقاله:
این ابزار با نام html-to-markdown 2.4 محتوای HTML را با پارسکردن واقعی ساختار آن به Markdown تبدیل میکند، نه با الگوهای regex؛ بنابراین در برابر موارد پیچیده و مرزی پایدارتر است. هم بهصورت ابزار خط فرمان و هم بهعنوان کتابخانه Go قابل استفاده است و برای سناریوهایی مثل مهاجرت محتوا و تولید وبسایتهای استاتیک مناسب است.
🟣لینک مقاله:
https://golangweekly.com/link/173347/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Html-To-Markdown
Convert entire websites to markdown | html-to-markdown
Accurate online converter. Convert any HTML input to Markdown output. Supports entire websites & emails. No invalid Markdown — it just works.
🤝2❤1
🔵 عنوان مقاله
his experiences at last week's GopherCon UK 2025.
🟢 خلاصه مقاله:
** این یادداشت در Golang Weekly گزارشی تأملمحور از تجربه نویسنده در GopherCon UK 2025 (هفته گذشته) است؛ بر بلوغ اکوسیستم Go، سادگی و قابلیت اتکا تأکید دارد و موضوعاتی مانند الگوهای همزمانیِ قابلفهم، بهینهسازی مبتنی بر پروفایلینگ، تست مقیاسپذیر، تجربه توسعهدهنده، و امنیت زنجیره تأمین را برجسته میکند. ارزش «hallway track» و گفتگوهای غیررسمی برای انتقال تجربههای عملی و اتخاذ تغییرات کوچک اما اثرگذار نیز پررنگ است. نویسنده با قدردانی از برگزارکنندگان، توصیههایی عملی مثل اولویت دادن به وضوح کد، شروع بهینهسازی با اندازهگیری، و سرمایهگذاری روی ابزارهای بازخورد سریع ارائه میکند و خوانندگان را به پیگیری منابع رسمی کنفرانس و آزمودن ایدهها در پروژههای خود تشویق میکند.
🟣لینک مقاله:
https://golangweekly.com/link/173082/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
his experiences at last week's GopherCon UK 2025.
🟢 خلاصه مقاله:
** این یادداشت در Golang Weekly گزارشی تأملمحور از تجربه نویسنده در GopherCon UK 2025 (هفته گذشته) است؛ بر بلوغ اکوسیستم Go، سادگی و قابلیت اتکا تأکید دارد و موضوعاتی مانند الگوهای همزمانیِ قابلفهم، بهینهسازی مبتنی بر پروفایلینگ، تست مقیاسپذیر، تجربه توسعهدهنده، و امنیت زنجیره تأمین را برجسته میکند. ارزش «hallway track» و گفتگوهای غیررسمی برای انتقال تجربههای عملی و اتخاذ تغییرات کوچک اما اثرگذار نیز پررنگ است. نویسنده با قدردانی از برگزارکنندگان، توصیههایی عملی مثل اولویت دادن به وضوح کد، شروع بهینهسازی با اندازهگیری، و سرمایهگذاری روی ابزارهای بازخورد سریع ارائه میکند و خوانندگان را به پیگیری منابع رسمی کنفرانس و آزمودن ایدهها در پروژههای خود تشویق میکند.
🟣لینک مقاله:
https://golangweekly.com/link/173082/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Jamie Tanna | Software Engineer
GopherCon UK 2025 · Jamie Tanna | Software Engineer
A writeup of the GopherCon UK 2025 conference.
❤2
🔵 عنوان مقاله
Josh W Comeau has a new, fantastic guide to SVG paths.
🟢 خلاصه مقاله:
**راهنمای تازهای از جاش دابلیو. کومو درباره مسیرهای SVG منتشر شده که درک نحو و ساخت مسیرها را ساده میکند و نشان میدهد چگونه با تغییرات کوچک میتوان گرافیکهای دقیق و کمحجم ساخت. همچنین جدیدترین مطلب معرفیشده در خبرنامه Golang Weekly مروری منتخب و کوتاه از تازههای دنیای Go، ابزارها و نکات کاربردی ارائه میدهد تا پیگیری اخبار و منابع پراکنده آسانتر شود.
🟣لینک مقاله:
https://golangweekly.com/link/173110/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Josh W Comeau has a new, fantastic guide to SVG paths.
🟢 خلاصه مقاله:
**راهنمای تازهای از جاش دابلیو. کومو درباره مسیرهای SVG منتشر شده که درک نحو و ساخت مسیرها را ساده میکند و نشان میدهد چگونه با تغییرات کوچک میتوان گرافیکهای دقیق و کمحجم ساخت. همچنین جدیدترین مطلب معرفیشده در خبرنامه Golang Weekly مروری منتخب و کوتاه از تازههای دنیای Go، ابزارها و نکات کاربردی ارائه میدهد تا پیگیری اخبار و منابع پراکنده آسانتر شود.
🟣لینک مقاله:
https://golangweekly.com/link/173110/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Joshwcomeau
An Interactive Guide to SVG Paths • Josh W. Comeau
SVG gives us many different primitives to work with, but by far the most powerful is the <path> element. Unfortunately, it’s also the most inscrutable, with its compact Regex-style syntax. In this tutorial, we’ll demystify this infamous element and see some…
Forwarded from Software Engineer Labdon
ا"Architecture Decision Record (ADR) Template" یعنی یک قالب (Template) برای ثبت و مستندسازی تصمیمهای معماری نرمافزار.
به طور ساده:
وقتی در طراحی یک سیستم نرمافزاری تصمیمهای مهمی مثل انتخاب دیتابیس، معماری میکروسرویسها، الگوی کشینگ، یا حتی انتخاب یک کتابخانه مهم گرفته میشود، این تصمیمها باید مستند شوند تا بعداً تیم یا افراد جدید بدانند چرا آن انتخاب انجام شده و چه گزینههایی رد شدهاند.
یک ADR Template کمک میکند این مستندسازی همیشه با یک ساختار مشخص و یکسان انجام شود.
---
### ساختار رایج یک ADR Template
معمولاً شامل بخشهای زیر است:
1. Title (عنوان تصمیم)
یک عنوان کوتاه و گویا.
2. Status (وضعیت)
مثلاً: Proposed, Accepted, Rejected, Superseded
3. Context (زمینه / دلیل نیاز به تصمیم)
توضیح اینکه چه مشکلی وجود داشته یا چه نیازی باعث شد که تصمیم گرفته شود.
4. Decision (تصمیم نهایی)
تصمیمی که گرفته شد (مثلاً "ما از PostgreSQL به جای MySQL استفاده میکنیم").
5. Consequences (پیامدها)
مزایا و معایب این تصمیم، و اثراتی که بر سیستم دارد.
---
### مثال ساده
➖➖➖➖➖➖➖➖
👑 @software_Labdon
به طور ساده:
وقتی در طراحی یک سیستم نرمافزاری تصمیمهای مهمی مثل انتخاب دیتابیس، معماری میکروسرویسها، الگوی کشینگ، یا حتی انتخاب یک کتابخانه مهم گرفته میشود، این تصمیمها باید مستند شوند تا بعداً تیم یا افراد جدید بدانند چرا آن انتخاب انجام شده و چه گزینههایی رد شدهاند.
یک ADR Template کمک میکند این مستندسازی همیشه با یک ساختار مشخص و یکسان انجام شود.
---
### ساختار رایج یک ADR Template
معمولاً شامل بخشهای زیر است:
1. Title (عنوان تصمیم)
یک عنوان کوتاه و گویا.
2. Status (وضعیت)
مثلاً: Proposed, Accepted, Rejected, Superseded
3. Context (زمینه / دلیل نیاز به تصمیم)
توضیح اینکه چه مشکلی وجود داشته یا چه نیازی باعث شد که تصمیم گرفته شود.
4. Decision (تصمیم نهایی)
تصمیمی که گرفته شد (مثلاً "ما از PostgreSQL به جای MySQL استفاده میکنیم").
5. Consequences (پیامدها)
مزایا و معایب این تصمیم، و اثراتی که بر سیستم دارد.
---
### مثال ساده
# ADR 001: انتخاب دیتابیس اصلی
## Status
Accepted
## Context
ما نیاز به یک دیتابیس داریم که قابلیت ذخیره دادههای ساختیافته و مقیاسپذیری داشته باشد. تیم تجربه خوبی با SQL دارد.
## Decision
انتخاب PostgreSQL به عنوان دیتابیس اصلی.
## Consequences
+ ویژگیهای پیشرفته (JSONB، Full-text search)
+ جامعه کاربری بزرگ
- یادگیری برخی قابلیتهای خاص برای اعضای تیم جدید
➖➖➖➖➖➖➖➖
👑 @software_Labdon
Forwarded from Gopher Job
🟢 اگر کارفرما یا کارجو هستی
و دنبال نیرو یا موقعیت شغلی توی حوزههای زیر هستی، به من پیام بده 👇
⚔️ DevOps Engineer
⚔️ Site Reliability Engineer (SRE)
⚔️ Linux SysAdmin
⚔️ Cloud Engineer (AWS/GCP/Azure)
⚔️ Infrastructure Engineer
⚔️ Security Engineer (DevSecOps/Linux)
⚔️ Automation Engineer
⚔️ Platform Engineer
⚔️ Software Security
⚔️ Software QA
⚔️ Backend
⚔️ AI Engineer / Machine Learning
⚔️ Database Engineer / DBA
📩 همین الان پیام بده و استارت بزن! تا هم بتونی نیروی خوب پیدا کنی و یا یتونی یه موقعیت شغلی مناسب پیدا کنی
به من پیام بده آگهی یا رزومه ات رو قرار بدم اینجا
@mrbardia72
و دنبال نیرو یا موقعیت شغلی توی حوزههای زیر هستی، به من پیام بده 👇
⚔️ DevOps Engineer
⚔️ Site Reliability Engineer (SRE)
⚔️ Linux SysAdmin
⚔️ Cloud Engineer (AWS/GCP/Azure)
⚔️ Infrastructure Engineer
⚔️ Security Engineer (DevSecOps/Linux)
⚔️ Automation Engineer
⚔️ Platform Engineer
⚔️ Software Security
⚔️ Software QA
⚔️ Backend
⚔️ AI Engineer / Machine Learning
⚔️ Database Engineer / DBA
📩 همین الان پیام بده و استارت بزن! تا هم بتونی نیروی خوب پیدا کنی و یا یتونی یه موقعیت شغلی مناسب پیدا کنی
به من پیام بده آگهی یا رزومه ات رو قرار بدم اینجا
@mrbardia72
🔵 عنوان مقاله
you can read it in article form.
🟢 خلاصه مقاله:
این نوشته دو مطلب فنی را معرفی میکند: نخست، ترور اسلاکِم به رفتاری ظریف در الحاق عناصر به اسلایسهای Go میپردازد؛ جایی که بهدلیل اشتراک آرایهٔ پشتیبان، append میتواند بهصورت غیرمنتظره دادهٔ اسلایسهای دیگر را تغییر دهد یا بسته به ظرفیت، باعث تخصیص جدید شود. نتیجه این است که باید حواسمان به ظرفیت، اشتراک حافظه و جداسازی داده با copy یا تخصیص هدفمند باشد. دوم، الی بندرسکی پیادهسازی یک مفسر کوچک Forth را در Go و C مقایسه میکند تا تفاوتهای عملی میان ایمنی و سهولت (در Go) و کنترل و سربار کم (در C) را نشان دهد. پیام کلی: با درک دقیق جزییات زبان و مدل حافظه، میتوان از خطاهای پنهان پرهیز کرد و انتخابهای بهینهتری انجام داد.
🟣لینک مقاله:
https://golangweekly.com/link/173338/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
you can read it in article form.
🟢 خلاصه مقاله:
این نوشته دو مطلب فنی را معرفی میکند: نخست، ترور اسلاکِم به رفتاری ظریف در الحاق عناصر به اسلایسهای Go میپردازد؛ جایی که بهدلیل اشتراک آرایهٔ پشتیبان، append میتواند بهصورت غیرمنتظره دادهٔ اسلایسهای دیگر را تغییر دهد یا بسته به ظرفیت، باعث تخصیص جدید شود. نتیجه این است که باید حواسمان به ظرفیت، اشتراک حافظه و جداسازی داده با copy یا تخصیص هدفمند باشد. دوم، الی بندرسکی پیادهسازی یک مفسر کوچک Forth را در Go و C مقایسه میکند تا تفاوتهای عملی میان ایمنی و سهولت (در Go) و کنترل و سربار کم (در C) را نشان دهد. پیام کلی: با درک دقیق جزییات زبان و مدل حافظه، میتوان از خطاهای پنهان پرهیز کرد و انتخابهای بهینهتری انجام داد.
🟣لینک مقاله:
https://golangweekly.com/link/173338/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Trevor's Tutorials
9. Building Ebitengine Games for Web Browsers
A guide on how to build Ebitengine games to run in web browsers.
❤3
🔵 عنوان مقاله
What is the Go Proxy Even Doing?
🟢 خلاصه مقاله:
گو برای پایداری و تکرارپذیری ساختها از یک پروکسی ماژول استفاده میکند که با کشکردن و سرویسدهی نسخهها، وابستگی توسعهدهندگان به مخازن مبدا را کاهش میدهد. اما همین طراحی میتواند باعث کلونهای تکراری و فشار اضافه بر سرورهای بالادستی شود؛ یعنی یک نسخه چندبار کلون میشود یا درخواستهای پشتسرهم برای همان تگها و کامیتها ثبت میگردد. تد با لاگهای واقعی نشان میدهد این الگو چگونه رخ میدهد و سپس توضیح میدهد برای محافظت از سرورش چه کرده است؛ از جمله گذاشتن محدودیت نرخ و فیلتر کردن ترافیک تکراری تا جلوی بار غیرضروری گرفته شود. جمعبندی: پروکسی به مصرفکنندگان بستهها کمک میکند، اما میتواند هزینه را به بالادست منتقل کند؛ بنابراین نگهدارندگان باید از این الگوها آگاه باشند و دفاعهای سبکوزنی برای پایداری سرویس خود در نظر بگیرند.
🟣لینک مقاله:
https://golangweekly.com/link/173087/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
What is the Go Proxy Even Doing?
🟢 خلاصه مقاله:
گو برای پایداری و تکرارپذیری ساختها از یک پروکسی ماژول استفاده میکند که با کشکردن و سرویسدهی نسخهها، وابستگی توسعهدهندگان به مخازن مبدا را کاهش میدهد. اما همین طراحی میتواند باعث کلونهای تکراری و فشار اضافه بر سرورهای بالادستی شود؛ یعنی یک نسخه چندبار کلون میشود یا درخواستهای پشتسرهم برای همان تگها و کامیتها ثبت میگردد. تد با لاگهای واقعی نشان میدهد این الگو چگونه رخ میدهد و سپس توضیح میدهد برای محافظت از سرورش چه کرده است؛ از جمله گذاشتن محدودیت نرخ و فیلتر کردن ترافیک تکراری تا جلوی بار غیرضروری گرفته شود. جمعبندی: پروکسی به مصرفکنندگان بستهها کمک میکند، اما میتواند هزینه را به بالادست منتقل کند؛ بنابراین نگهدارندگان باید از این الگوها آگاه باشند و دفاعهای سبکوزنی برای پایداری سرویس خود در نظر بگیرند.
🟣لینک مقاله:
https://golangweekly.com/link/173087/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
❤2
تابع
توضیح دقیقتر:
- پکیج: این تابع در پکیج
- کاربرد:
- ساختار:
-
-
مثال:
چرا از
- وقتی چندین گوروتین به یک متغیر مشترک دسترسی دارند، استفاده از عملیات معمولی (غیراتمیک) ممکن است به مشکلات همزمانی (concurrency issues) مثل race condition منجر شود.
-
نکات:
- این تابع فقط برای متغیرهای از نوع
- عملیات اتمیک معمولاً سریعتر از استفاده از قفلها (مثل
➖➖➖➖➖➖➖➖
👑 @gopher_academy
atomic.LoadInt32
در زبان برنامهنویسی Go (گولنگ) برای خواندن ایمن (safe) یک مقدار 32 بیتی از نوع int32
از حافظه به صورت اتمیک (atomic) استفاده میشود. عملیات اتمیک به این معناست که این عملیات به صورت کامل و بدون وقفه انجام میشود و از تداخل (race condition) بین گوروتینها (goroutines) جلوگیری میکند.توضیح دقیقتر:
- پکیج: این تابع در پکیج
sync/atomic
قرار دارد.- کاربرد:
atomic.LoadInt32
برای خواندن مقدار یک متغیر int32
از حافظه به صورت اتمیک استفاده میشود. این تابع تضمین میکند که مقدار خواندهشده دقیق و بدون تأثیر از تغییرات همزمان توسط گوروتینهای دیگر است.- ساختار:
func LoadInt32(addr *int32) (val int32)
-
addr
: اشارهگر به متغیر int32
که میخواهید مقدارش را بخوانید.-
val
: مقداری که از حافظه خوانده میشود و به عنوان خروجی برگردانده میشود.مثال:
package main
import (
"fmt"
"sync/atomic"
)
func main() {
var counter int32 = 42
// خواندن مقدار counter به صورت اتمیک
value := atomic.LoadInt32(&counter)
fmt.Println("Value:", value) // خروجی: Value: 42
}
چرا از
atomic.LoadInt32
استفاده کنیم؟- وقتی چندین گوروتین به یک متغیر مشترک دسترسی دارند، استفاده از عملیات معمولی (غیراتمیک) ممکن است به مشکلات همزمانی (concurrency issues) مثل race condition منجر شود.
-
atomic.LoadInt32
تضمین میکند که مقدار خواندهشده همیشه معتبر و بهروز است، بدون اینکه نیازی به قفل (lock) باشد.نکات:
- این تابع فقط برای متغیرهای از نوع
int32
کار میکند. برای انواع دیگر (مثل int64
یا uint32
) توابع مشابهی مثل atomic.LoadInt64
یا atomic.LoadUint32
وجود دارد.- عملیات اتمیک معمولاً سریعتر از استفاده از قفلها (مثل
sync.Mutex
) هستند، اما فقط برای عملیاتهای ساده مثل خواندن یا نوشتن مناسباند.➖➖➖➖➖➖➖➖
👑 @gopher_academy
کجا نباید از داداشمون RabbitMQ استفاده کنیم؟
1- وقتی نیاز به real-time response داریم.
چرا؟ چون RabbitMQ صف هست و ارسال/دریافت پیام ممکنه با تاخیر انجام شود.
پیشنهادم WebSocket، gRPC یا Redis Pub/Sub است.
2- وقتی به message replay یا history نیاز داریم
چرا؟ چون RabbitMQ پیامها رو بعد از مصرف حذف میکند. البته میشه کانفیگ کرد که نگه داره.
3- زمانی که پیامها حجمشون خیلی زیاد است.
چرا؟ چون در حجم بالا RabbitMQ دچار افت performance میشود. Kafka رو پیشنهاد میکنم برای اینجا.
4- وقتی ترتیب دقیق پردازش پیامها خیلی مهم است. چرا؟ چون RabbitMQ تضمین دقیقی برای ترتیب پیامها ندارد. اینجا هم پیشنهادم Kafka است.
<Amirhossein Dehghan/>
1- وقتی نیاز به real-time response داریم.
چرا؟ چون RabbitMQ صف هست و ارسال/دریافت پیام ممکنه با تاخیر انجام شود.
پیشنهادم WebSocket، gRPC یا Redis Pub/Sub است.
2- وقتی به message replay یا history نیاز داریم
چرا؟ چون RabbitMQ پیامها رو بعد از مصرف حذف میکند. البته میشه کانفیگ کرد که نگه داره.
3- زمانی که پیامها حجمشون خیلی زیاد است.
چرا؟ چون در حجم بالا RabbitMQ دچار افت performance میشود. Kafka رو پیشنهاد میکنم برای اینجا.
4- وقتی ترتیب دقیق پردازش پیامها خیلی مهم است. چرا؟ چون RabbitMQ تضمین دقیقی برای ترتیب پیامها ندارد. اینجا هم پیشنهادم Kafka است.
<Amirhossein Dehghan/>
👍4 3❤2🐳1
🔵 عنوان مقاله
GitHub MCP Server 0.13
🟢 خلاصه مقاله:
گیتهاب با انتشار GitHub MCP Server نسخهٔ 0.13 یک پیادهسازی رسمی و قابل اتکا از سرور MCP ارائه کرده است. این سرور با زبان Go نوشته شده تا کارایی، سادگی استقرار و قابلحمل بودن را فراهم کند. رسمی بودن آن، نقش مرجع را برای رفتار و سازگاری ایفا میکند و نسخهگذاری 0.13 نشاندهندهٔ توسعهٔ تدریجی و تمرکز بر بلوغ و پایداری است؛ بنابراین گزینهای مناسب برای تیمهایی است که به یک راهکار مطمئن و نگهداشتپذیر نیاز دارند.
🟣لینک مقاله:
https://golangweekly.com/link/173355/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub MCP Server 0.13
🟢 خلاصه مقاله:
گیتهاب با انتشار GitHub MCP Server نسخهٔ 0.13 یک پیادهسازی رسمی و قابل اتکا از سرور MCP ارائه کرده است. این سرور با زبان Go نوشته شده تا کارایی، سادگی استقرار و قابلحمل بودن را فراهم کند. رسمی بودن آن، نقش مرجع را برای رفتار و سازگاری ایفا میکند و نسخهگذاری 0.13 نشاندهندهٔ توسعهٔ تدریجی و تمرکز بر بلوغ و پایداری است؛ بنابراین گزینهای مناسب برای تیمهایی است که به یک راهکار مطمئن و نگهداشتپذیر نیاز دارند.
🟣لینک مقاله:
https://golangweekly.com/link/173355/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub
GitHub - github/github-mcp-server: GitHub's official MCP Server
GitHub's official MCP Server. Contribute to github/github-mcp-server development by creating an account on GitHub.
❤3
🔵 عنوان مقاله
Understanding Go Error Types: Pointer vs. Value
🟢 خلاصه مقاله:
تفاوت میان تعریف خطا با گیرنده مقداری و اشارهگری در Go میتواند به خطاهای پنهان منجر شود. اگر متد Error را با گیرنده مقداری تعریف کنید، هر دو T و *T اینترفیس error را پیادهسازی میکنند؛ اما با گیرنده اشارهگری فقط *T این کار را میکند. پیامدها: امکان ایجاد اینترفیس error غیرnil که حاوی اشارهگر nil است و بررسی err != nil را گمراه میکند، و شکست بیسروصدای errors.Is/As در صورت عدم تطابق نوع مقداری/اشارهگری. راهکارها: برای انواع کوچک و تغییرناپذیر از گیرنده مقداری استفاده کنید و فقط در صورت نیاز واقعی از گیرنده اشارهگری بهره ببرید؛ سازگاری در ساخت و بازگرداندن خطاها را رعایت کنید؛ با assertion کامپایلی اطمینان بگیرید نوع شما error را پیادهسازی میکند و تست رفتار nil را اضافه کنید.
🟣لینک مقاله:
https://golangweekly.com/link/173124/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Understanding Go Error Types: Pointer vs. Value
🟢 خلاصه مقاله:
تفاوت میان تعریف خطا با گیرنده مقداری و اشارهگری در Go میتواند به خطاهای پنهان منجر شود. اگر متد Error را با گیرنده مقداری تعریف کنید، هر دو T و *T اینترفیس error را پیادهسازی میکنند؛ اما با گیرنده اشارهگری فقط *T این کار را میکند. پیامدها: امکان ایجاد اینترفیس error غیرnil که حاوی اشارهگر nil است و بررسی err != nil را گمراه میکند، و شکست بیسروصدای errors.Is/As در صورت عدم تطابق نوع مقداری/اشارهگری. راهکارها: برای انواع کوچک و تغییرناپذیر از گیرنده مقداری استفاده کنید و فقط در صورت نیاز واقعی از گیرنده اشارهگری بهره ببرید؛ سازگاری در ساخت و بازگرداندن خطاها را رعایت کنید؛ با assertion کامپایلی اطمینان بگیرید نوع شما error را پیادهسازی میکند و تست رفتار nil را اضافه کنید.
🟣لینک مقاله:
https://golangweekly.com/link/173124/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🔥2❤1
Forwarded from Software Engineer Labdon
جدا از مهندسی پشت تلگرام که بهینه نوشته شده، تلگرام چیزی داره به اسم Update Queue. چیزی که ۱ سال از دوران جوونیم رو صرف مهندسی معکوسش کردم.
تلگرام برای پوش کردن تغییرات مثل پیام جدید، ادیت، ری اکشن، تایپینگ و… به کلاینتها از سرویس Updates تو پروتکل MTProto استفاده میکنه، ایده ی کلی و کلیدی خیلی ساده اس و اینه که کلاینت ها یه state محلی نگه میدارن و آپدیتارو دقیقا با ترتیب درست اعمال میکنن؛ اگه شکافی بینشون افتاد، Difference میگیرن و دوباره پرش میکنن.
چرا اینکارو کرده و کلا چالشا چیه؟
• ترتیبش مهمه چون ممکنه یه اپدیت وابسته به چیزی باشه که توی خود همون پچ میاد
• تحویل دقیق باید انجام بشه و هیچی گم نشه
• مقیاسش هم میلیونها کاربر همزمان باید بگیرنش، مثل کانال های بزرگ
از اونجایی که هر پیامرسان منبع عظیمی از اتفاقاتیه که هر لحظه میوفته ما میتونیم اسم این اتفاقات رو event بزاریم. تلگرام هم یه پیامرسان مولتی کلاینته، یعنی هر کاربر میتونه چندین دیوایس برای یه حساب داشته باشه، پس وقتی یه ایونت اتفاق میوفته که باید یه کاربر از اون خبردار بشه باید اون ایونت رو به دیوایس های دیگه ی کاربر هم بفرسته، حدودا با مرتبه زمانی On^2.
مکانیزم اینجوریه که وقتی دیوایسی انلاین باشه و سوکت همون سوکتی باشه که keep alive هست یا اخرین rpc رو کال کرده سرور ایونت رو توی queue برای اون دیوایس نگه نمیداره و مستقیم میفرسته به کلاینت، حالا از اونجایی که کلاینت های دیگه ممکنه افلاین باشن یا حتی توی بکگراند پروسسشون کیل شده باشه عقب میمونن. حالا وقتی اون دیوایسی که عقب مونده بود با باز شدن سوکتش درخواست گرفتن اپدیت هارو وقتی که افلاین بوده رو از سرور میکنه و اطلاعات لوکالش رو میفرسته به سرور، من برای ساده شدنش اینجوری میگم که دیوایس میاد به سرور میگه من تا این زمان t رو داشتم و بعد این رو بهم بده، سرور هم میاد حساب کتابش رو میکنه و جواب رو توی یه پچ میفرسته! حالا چی توی این پچ هست و چی رو میفرسته رو میتونم یه رشته توییت دیگه در موردش بزنم.
حالا اگه اعدادی که توی پچ میاد با اعداد توی کلاینت نخونه عملا میگیم گپ اتفاق افتاده، برای همین هم کلاینت باید رکویست getDiff رو بزنه.
رکویست updates.getDifference به کلاینت اجازه میده بگه:
من الان pts = X و seq = Y هستم و هر چی بین این و حالت جدید هست بهم بده.
• سرور ممکنه جواب بده:
difference: همه ی آپدیت های گمشده
differenceSlice: بخشی از آپدیت ها یعنی هنوز باید به فچ کردن ادامه بدی
differenceEmpty: چیزی تغییر نکرده
جالبترش اینه که توی نسخه های جدیدترش برای کانال ها مکانیسم جدا getChannelDifference هست، چون هر کانال pts مستقل داره و این باعث میشه شما فقط کانال هایی رو بگیری که تغییر کردن! برای سوپر گروه هم مکانیزم همینه.
این باعث میشه حتی اگر چند ساعت آفلاین باشی، بعد از اتصال دوباره دقیقاً همهچی رو بگیری و هیچ پیامی رو از دست ندی
حتی با packet loss یا reconnect، state کلاینت خراب نمیشه و سرور مجبور نیست برای هر کلاینت همه چی رو دوباره بفرسته. فقط gap ها sync میشن
<Abolfazl/>
تلگرام برای پوش کردن تغییرات مثل پیام جدید، ادیت، ری اکشن، تایپینگ و… به کلاینتها از سرویس Updates تو پروتکل MTProto استفاده میکنه، ایده ی کلی و کلیدی خیلی ساده اس و اینه که کلاینت ها یه state محلی نگه میدارن و آپدیتارو دقیقا با ترتیب درست اعمال میکنن؛ اگه شکافی بینشون افتاد، Difference میگیرن و دوباره پرش میکنن.
چرا اینکارو کرده و کلا چالشا چیه؟
• ترتیبش مهمه چون ممکنه یه اپدیت وابسته به چیزی باشه که توی خود همون پچ میاد
• تحویل دقیق باید انجام بشه و هیچی گم نشه
• مقیاسش هم میلیونها کاربر همزمان باید بگیرنش، مثل کانال های بزرگ
از اونجایی که هر پیامرسان منبع عظیمی از اتفاقاتیه که هر لحظه میوفته ما میتونیم اسم این اتفاقات رو event بزاریم. تلگرام هم یه پیامرسان مولتی کلاینته، یعنی هر کاربر میتونه چندین دیوایس برای یه حساب داشته باشه، پس وقتی یه ایونت اتفاق میوفته که باید یه کاربر از اون خبردار بشه باید اون ایونت رو به دیوایس های دیگه ی کاربر هم بفرسته، حدودا با مرتبه زمانی On^2.
مکانیزم اینجوریه که وقتی دیوایسی انلاین باشه و سوکت همون سوکتی باشه که keep alive هست یا اخرین rpc رو کال کرده سرور ایونت رو توی queue برای اون دیوایس نگه نمیداره و مستقیم میفرسته به کلاینت، حالا از اونجایی که کلاینت های دیگه ممکنه افلاین باشن یا حتی توی بکگراند پروسسشون کیل شده باشه عقب میمونن. حالا وقتی اون دیوایسی که عقب مونده بود با باز شدن سوکتش درخواست گرفتن اپدیت هارو وقتی که افلاین بوده رو از سرور میکنه و اطلاعات لوکالش رو میفرسته به سرور، من برای ساده شدنش اینجوری میگم که دیوایس میاد به سرور میگه من تا این زمان t رو داشتم و بعد این رو بهم بده، سرور هم میاد حساب کتابش رو میکنه و جواب رو توی یه پچ میفرسته! حالا چی توی این پچ هست و چی رو میفرسته رو میتونم یه رشته توییت دیگه در موردش بزنم.
حالا اگه اعدادی که توی پچ میاد با اعداد توی کلاینت نخونه عملا میگیم گپ اتفاق افتاده، برای همین هم کلاینت باید رکویست getDiff رو بزنه.
رکویست updates.getDifference به کلاینت اجازه میده بگه:
من الان pts = X و seq = Y هستم و هر چی بین این و حالت جدید هست بهم بده.
• سرور ممکنه جواب بده:
difference: همه ی آپدیت های گمشده
differenceSlice: بخشی از آپدیت ها یعنی هنوز باید به فچ کردن ادامه بدی
differenceEmpty: چیزی تغییر نکرده
جالبترش اینه که توی نسخه های جدیدترش برای کانال ها مکانیسم جدا getChannelDifference هست، چون هر کانال pts مستقل داره و این باعث میشه شما فقط کانال هایی رو بگیری که تغییر کردن! برای سوپر گروه هم مکانیزم همینه.
این باعث میشه حتی اگر چند ساعت آفلاین باشی، بعد از اتصال دوباره دقیقاً همهچی رو بگیری و هیچ پیامی رو از دست ندی
حتی با packet loss یا reconnect، state کلاینت خراب نمیشه و سرور مجبور نیست برای هر کلاینت همه چی رو دوباره بفرسته. فقط gap ها sync میشن
<Abolfazl/>
❤6 3🔥2👍1💯1
🔵 عنوان مقاله
From Go Code to Container Image with Depot API
🟢 خلاصه مقاله:
**این مطلب دو مسیر عملی را پوشش میدهد: ۱) تبدیل کد Go به ایمیج کانتینری با API دیپوت برای بیلدهای سریع، قابلتکرار و مناسب CI، و انتشار در رجیستری؛ ۲) استقرار سایت استاتیک Hugo در هتزنر با ساخت آرتیفکتها، راهاندازی وبسرور یا کانتینر، تنظیم دامنه و SSL، و خودکارسازی در CI/CD. هدف، سادهسازی مسیر از کد تا تولید با تکیه بر سرعت، پایداری نتایج و هزینه اثربخش است.
🟣لینک مقاله:
https://golangweekly.com/link/173630/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
From Go Code to Container Image with Depot API
🟢 خلاصه مقاله:
**این مطلب دو مسیر عملی را پوشش میدهد: ۱) تبدیل کد Go به ایمیج کانتینری با API دیپوت برای بیلدهای سریع، قابلتکرار و مناسب CI، و انتشار در رجیستری؛ ۲) استقرار سایت استاتیک Hugo در هتزنر با ساخت آرتیفکتها، راهاندازی وبسرور یا کانتینر، تنظیم دامنه و SSL، و خودکارسازی در CI/CD. هدف، سادهسازی مسیر از کد تا تولید با تکیه بر سرعت، پایداری نتایج و هزینه اثربخش است.
🟣لینک مقاله:
https://golangweekly.com/link/173630/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Depot
From Go code to container image with Depot API
Build a specialized container building system using Depot's low-level Go SDK to transform tar archives into container images. This advanced walkthrough demonstrates the three-step build flow: registering builds, acquiring ephemeral BuildKit machines, and…
❤2
🔵 عنوان مقاله
a fantastic illustrated introduction to Big O notation
🟢 خلاصه مقاله:
** این مقاله معرفیای تصویری و روان از نمادگذاری Big O ارائه میدهد و با تکیه بر مثالها، تفاوت مرتبههایی مانند O(1)، O(log n)، O(n) و موارد رایج دیگر را توضیح میدهد. هدف آن نشاندادن مفهوم رشد با بزرگشدن ورودی و مقایسهٔ مقیاسپذیری الگوریتمهاست، بدون درگیرشدن با جزئیات پیادهسازی یا ثابتها. برای هر کسی که تا به حال معنی O(1) و O(log n) برایش سؤال بوده، این نوشته یک شروع عالی است.
🟣لینک مقاله:
https://golangweekly.com/link/173358/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
a fantastic illustrated introduction to Big O notation
🟢 خلاصه مقاله:
** این مقاله معرفیای تصویری و روان از نمادگذاری Big O ارائه میدهد و با تکیه بر مثالها، تفاوت مرتبههایی مانند O(1)، O(log n)، O(n) و موارد رایج دیگر را توضیح میدهد. هدف آن نشاندادن مفهوم رشد با بزرگشدن ورودی و مقایسهٔ مقیاسپذیری الگوریتمهاست، بدون درگیرشدن با جزئیات پیادهسازی یا ثابتها. برای هر کسی که تا به حال معنی O(1) و O(log n) برایش سؤال بوده، این نوشته یک شروع عالی است.
🟣لینک مقاله:
https://golangweekly.com/link/173358/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🔥1🎉1 1
Forwarded from Software Engineer Labdon
امروز یکی از همکارانم سوال خوبی پرسید که فکر میکنم دغدغه خیلیهاست:
"فرق واقعی Async و Concurrency چیه؟ مگه هر دو به معنی انجام همزمان کارها نیستن؟"
این دو مفهوم اغلب با هم اشتباه گرفته میشن. بذارید با یک مثال ساده تفاوتشون رو باز کنم:
۱. Synchronous vs. Asynchronous
این مفاهیم درباره انتظار کشیدن هستن.
Sync
مثل اینه که بری کافه، قهوه سفارش بدی و همونجا جلوی پیشخوان منتظر بمونی تا آماده بشه و تحویل بگیری.
تا قهوه رو نگیری، هیچ کار دیگهای نمیکنی.
Async
سفارش میدی، یک پیجر (Pager) میگیری و میری سر میزت مینشینی.
در این فاصله میتونی ایمیلهاتو چک کنی.
هر وقت قهوهات آماده شد، پیجر بهت خبر میده.
تو منتظر نموندی و از زمانت استفاده کردی.
۲. Concurrency
این مفهوم درباره مدیریت چند کار در یک بازه زمانی هست.
باریستای کافه رو در نظر بگیرید:
اون همزمان هم سفارش شما رو آماده میکنه، هم سفارش نفر بعدی رو میگیره و هم شیر رو برای یک سفارش دیگه گرم میکنه.
در واقع اون با جابجایی سریع بین کارها (Context Switching)، چند وظیفه رو پیش میبره.
این یعنی همروندی.
نکته کلیدی
برنامهنویسی Async یکی از راههای رسیدن به Concurrency هست.
درک این تفاوت، در طراحی سیستمهای مدرن مثل میکروسرویسها یا پایپلاینهای پردازش دیتا، یک مزیت فوقالعاده است.
این درک به شما کمک میکنه تا بین ابزارهایی مثل Kafka, gRPC یا WebSockets انتخاب درستی داشته باشید و سیستمی بسازید که هم Scalable و هم Reliable باشه.
@ | <Ali Naseri/>
"فرق واقعی Async و Concurrency چیه؟ مگه هر دو به معنی انجام همزمان کارها نیستن؟"
این دو مفهوم اغلب با هم اشتباه گرفته میشن. بذارید با یک مثال ساده تفاوتشون رو باز کنم:
۱. Synchronous vs. Asynchronous
این مفاهیم درباره انتظار کشیدن هستن.
Sync
مثل اینه که بری کافه، قهوه سفارش بدی و همونجا جلوی پیشخوان منتظر بمونی تا آماده بشه و تحویل بگیری.
تا قهوه رو نگیری، هیچ کار دیگهای نمیکنی.
Async
سفارش میدی، یک پیجر (Pager) میگیری و میری سر میزت مینشینی.
در این فاصله میتونی ایمیلهاتو چک کنی.
هر وقت قهوهات آماده شد، پیجر بهت خبر میده.
تو منتظر نموندی و از زمانت استفاده کردی.
۲. Concurrency
این مفهوم درباره مدیریت چند کار در یک بازه زمانی هست.
باریستای کافه رو در نظر بگیرید:
اون همزمان هم سفارش شما رو آماده میکنه، هم سفارش نفر بعدی رو میگیره و هم شیر رو برای یک سفارش دیگه گرم میکنه.
در واقع اون با جابجایی سریع بین کارها (Context Switching)، چند وظیفه رو پیش میبره.
این یعنی همروندی.
نکته کلیدی
برنامهنویسی Async یکی از راههای رسیدن به Concurrency هست.
درک این تفاوت، در طراحی سیستمهای مدرن مثل میکروسرویسها یا پایپلاینهای پردازش دیتا، یک مزیت فوقالعاده است.
این درک به شما کمک میکنه تا بین ابزارهایی مثل Kafka, gRPC یا WebSockets انتخاب درستی داشته باشید و سیستمی بسازید که هم Scalable و هم Reliable باشه.
@ | <Ali Naseri/>
🔵 عنوان مقاله
The 9 Go Test Assertions I Use (and Why)
🟢 خلاصه مقاله:
این مقاله با تکیه بر بحثی قدیمی در دنیای Go بررسی میکند که آیا باید از پکیجهای Assertion استفاده کرد یا خیر. نویسنده میگوید بهجای چارچوبهای سنگین، از چند تابع کمکی ساده و دستساز برای آزمونها استفاده میکند؛ تابعهایی که کارهای رایجی مثل برابری/نابرابری، بررسی خطا (از جمله خطاهای انتظاررفته یا پیچیده)، nil بودن یا نبودن، شامل بودن، طول مجموعهها، مقایسه تقریبی اعداد/زمان و انتظار وقوع panic را پوشش میدهند و پیام خطای واضحی میدهند بدون اینکه وابستگی خارجی اضافه کنند. او به پرسش «آیا Assertionها ضدالگو هستند؟» پاسخ میدهد: وقتی منطق را پنهان کنند و به زنجیرهسازی و DSLهای مبهم تبدیل شوند، بله؛ اما اگر کوچک، هدفمند و شفاف باشند نهتنها ایرادی ندارند، بلکه خوانایی و نگهداشت را بهتر میکنند. در نهایت توصیه میکند Helperها حداقلی و محلی باشند، نامگذاری روشن داشته باشند، از اغراق در انتزاع پرهیز شود، و فقط در موارد لازم سراغ ابزارهایی مثل go-cmp یا testify برویم. نتیجهگیری: مشکل در خود Assertion نیست، در استفاده بیملاحظه از آن است.
🟣لینک مقاله:
https://golangweekly.com/link/173627/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
The 9 Go Test Assertions I Use (and Why)
🟢 خلاصه مقاله:
این مقاله با تکیه بر بحثی قدیمی در دنیای Go بررسی میکند که آیا باید از پکیجهای Assertion استفاده کرد یا خیر. نویسنده میگوید بهجای چارچوبهای سنگین، از چند تابع کمکی ساده و دستساز برای آزمونها استفاده میکند؛ تابعهایی که کارهای رایجی مثل برابری/نابرابری، بررسی خطا (از جمله خطاهای انتظاررفته یا پیچیده)، nil بودن یا نبودن، شامل بودن، طول مجموعهها، مقایسه تقریبی اعداد/زمان و انتظار وقوع panic را پوشش میدهند و پیام خطای واضحی میدهند بدون اینکه وابستگی خارجی اضافه کنند. او به پرسش «آیا Assertionها ضدالگو هستند؟» پاسخ میدهد: وقتی منطق را پنهان کنند و به زنجیرهسازی و DSLهای مبهم تبدیل شوند، بله؛ اما اگر کوچک، هدفمند و شفاف باشند نهتنها ایرادی ندارند، بلکه خوانایی و نگهداشت را بهتر میکنند. در نهایت توصیه میکند Helperها حداقلی و محلی باشند، نامگذاری روشن داشته باشند، از اغراق در انتزاع پرهیز شود، و فقط در موارد لازم سراغ ابزارهایی مثل go-cmp یا testify برویم. نتیجهگیری: مشکل در خود Assertion نیست، در استفاده بیملاحظه از آن است.
🟣لینک مقاله:
https://golangweekly.com/link/173627/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
www.alexedwards.net
The 9 Go test assertions I use (and why) - Alex Edwards
🤝3❤1
🎙 پادکست جدید
🚧 Go Improvement: 🫸 waitgroup.Go, json/v2, 🐍 new features for cobra apps, with Jeremy Foran
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🚧 Go Improvement: 🫸 waitgroup.Go, json/v2, 🐍 new features for cobra apps, with Jeremy Foran
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🔥2 1