Forwarded from Gopher Academy
🏆3✍1👨💻1
🔐 مفهوم Mutex در Go
ا
---
🧠 وضعیتهای مختلف Mutex
میتوان عملکرد آن را با وضعیتهای زیر توضیح داد:
ا
ا* Unlocked (حالت اولیه): Mutex آزاد است و هر goroutine میتواند با فراخوانی
ا* Locked: وقتی یک goroutine
ا* Waiting: در صورت تلاش همزمان چند goroutine برای گرفتن قفل، بقیه به صف انتظار اضافه میشوند.
ا* Starvation Mode: اگر یک goroutine بیش از \~۱ms نتواند قفل را بگیرد، سیستم وارد حالت گرسنگی (fair mode) شده و به ترتیب به goroutineهای قدیمیتر اجازه دسترسی میدهد ([CSDN Blog][3], [Zhihu Zhiwan][4]).
---
⚙️ عملکرد درونی Mutex
* از عملیات غیرقابل قطع (CAS) برای کنترل فیلد
* در شرایط کمرقابت ابتدا بهصورت spinning تلاش میکند تا حد ممکن بدون خوابیدن lock را بگیرد.
* در سطوح بالای رقابت، goroutineها به صف انتظار اضافه میشوند و بیدار میشوند وقتی قفل آزاد شد.
* حالت starvation زمانی فعال میشود که یک goroutine مدت طولانی در انتظار است تا از حالت FIFO استفاده شود
---
✅ نکات کاربردی و بهترین شیوهها
1. هیچ گاه Mutex را کپی نکنید؛ حتی تصادفاً**—مستقیماً باید از pointers استفاده شود
2. هیچگاه موضعی در struct آن را جاسازی (embed) نکنید، چون باعث در دسترسپذیری ناخواسته متدهای Lock/Unlock میشود
3. از
4. بخش قفلشده باید حداقل زمان ممکن طول بکشد؛ انجام عملیات بلندمدت در آن ممکن است باعث کاهش concurrency و تأخیر جدی شود.
---
⚠️ مشکلات رایج و اشتباهات متداول
* **کپی ناخواسته Mutex: حذف ایمنی synchronization و موجب رفتار نامشخص.
ا* embedding Mutex: باعث انتشار متدهای داخلی قفل به بیرون struct میشود — روش اشتباهی است
ا* Double Unlock یا Unlock بدون Lock قبلی → panic.
* عدم رعایت defer → ممکن است در صورت خطا یا exit، قفل آزاد نشود و deadlock رخ دهد.
ا* Deadlock ناشی از تداخل دو یا چند goroutine با mutexهای متفاوت و انتظار متقابل بر مبنای نظم اشتباهی بین
ا
sync.Mutex
یک اصل اساسی برای کنترل دسترسی امن به منابع مشترک بین goroutineها است. این نوع قفل تضمین میکند که در هر لحظه تنها یک goroutine به بخش حیاتی از کد (critical section) دسترسی دارد ---
🧠 وضعیتهای مختلف Mutex
میتوان عملکرد آن را با وضعیتهای زیر توضیح داد:
ا
ا* Unlocked (حالت اولیه): Mutex آزاد است و هر goroutine میتواند با فراخوانی
Lock()
آن را بگیرد.ا* Locked: وقتی یک goroutine
Lock()
میزند، دیگران باید منتظر بمانند.ا* Waiting: در صورت تلاش همزمان چند goroutine برای گرفتن قفل، بقیه به صف انتظار اضافه میشوند.
ا* Starvation Mode: اگر یک goroutine بیش از \~۱ms نتواند قفل را بگیرد، سیستم وارد حالت گرسنگی (fair mode) شده و به ترتیب به goroutineهای قدیمیتر اجازه دسترسی میدهد ([CSDN Blog][3], [Zhihu Zhiwan][4]).
---
⚙️ عملکرد درونی Mutex
* از عملیات غیرقابل قطع (CAS) برای کنترل فیلد
state
استفاده میشود.* در شرایط کمرقابت ابتدا بهصورت spinning تلاش میکند تا حد ممکن بدون خوابیدن lock را بگیرد.
* در سطوح بالای رقابت، goroutineها به صف انتظار اضافه میشوند و بیدار میشوند وقتی قفل آزاد شد.
* حالت starvation زمانی فعال میشود که یک goroutine مدت طولانی در انتظار است تا از حالت FIFO استفاده شود
---
✅ نکات کاربردی و بهترین شیوهها
1. هیچ گاه Mutex را کپی نکنید؛ حتی تصادفاً**—مستقیماً باید از pointers استفاده شود
2. هیچگاه موضعی در struct آن را جاسازی (embed) نکنید، چون باعث در دسترسپذیری ناخواسته متدهای Lock/Unlock میشود
3. از
defer m.Unlock()
برای اطمینان از آزادسازی قفل حتی در صورت panic یا return زودهنگام استفاده کنید 4. بخش قفلشده باید حداقل زمان ممکن طول بکشد؛ انجام عملیات بلندمدت در آن ممکن است باعث کاهش concurrency و تأخیر جدی شود.
---
⚠️ مشکلات رایج و اشتباهات متداول
* **کپی ناخواسته Mutex: حذف ایمنی synchronization و موجب رفتار نامشخص.
ا* embedding Mutex: باعث انتشار متدهای داخلی قفل به بیرون struct میشود — روش اشتباهی است
ا* Double Unlock یا Unlock بدون Lock قبلی → panic.
* عدم رعایت defer → ممکن است در صورت خطا یا exit، قفل آزاد نشود و deadlock رخ دهد.
ا* Deadlock ناشی از تداخل دو یا چند goroutine با mutexهای متفاوت و انتظار متقابل بر مبنای نظم اشتباهی بین
Lock()
ها.❤6👍1
مقالهی «Top 6 Golang Logging Best Practices» در HackerNoon توسط Lane Wagner در سال ۲۰۲۲ منتشر شده و به بررسی نکاتی اساسی ولی کاربردی دربارهی لاگنویسی در زبان Go پرداخته است. در ادامه، خلاصهای مختصر
---
## نکات کلیدی مقاله
1. استفاده از `error` بجای رشتهها (strings)
از نوع استاندارد
2. Wrap کردن خطاها
بجای لاگ فقط پیام خطا، آن را wrap کن تا محل دقیق رخداد خطا (stack trace یا خط کد) حفظ شود و دیباگ آسانتر شود.
3. استفاده از `fmt.Errorf()` برای قالببندی
4. قالبدهی structها (Format Structs)
وقتی structها در لاگها استفاده میشن، آنها را قالبمند کن تا خواناتر و مفیدتر باشند؛ مثلاً با فرمت:
5. استفاده از نسخه variadic توابع مانند `fmt.Println()`
ورژن variadic بهت اجازه میدهد مولفههای مختلف را بدون تلاش برای concatenation دستی به هم بچسبونی. خوانا و منعطفتره.
6. استفاده از بستهی استاندارد `log`
برای شروع خوبه، خصوصاً برای پروژههای ساده یا کوچک.
---
جمعبندی سریع
اینها اصولی هستند که در بسیاری از آموزشها و بحثهای Go توصیه میشن: استفاده از سیستم خطای داخلی، پیروی از استانداردها در wrap خطا، قالبدهی مناسب، و استفاده از امکانات داخلی زبان قبل از رفتن به راهحلهای پیچیدهتر.
---
توصیههای عملی
* لاگنویسی رو با استفاده از خطاهای داخلی Go شروع کن.
* ورودیها رو wrap کن؛ structها رو مرتب قالب بده.
* برای لاگهای پیشرفتهتر، از structured logging استفاده کن (مثل Zap یا Zerolog).
* همیشه context مهم رو مثل request ID در لاگها نگهدار.
* حجم لاگ رو کنترل کن: نه خیلی زیاد باشه که کارایی رو پایین بیاره، نه خیلی کم که مفید نباشه.
---
## نکات کلیدی مقاله
1. استفاده از `error` بجای رشتهها (strings)
از نوع استاندارد
error
برای نشان دادن خطاها استفاده کن تا از رفتارهای نادرست مانند نادیدهگرفتن خطا یا پراکندگی سازوکار خطا جلوگیری شود.2. Wrap کردن خطاها
بجای لاگ فقط پیام خطا، آن را wrap کن تا محل دقیق رخداد خطا (stack trace یا خط کد) حفظ شود و دیباگ آسانتر شود.
3. استفاده از `fmt.Errorf()` برای قالببندی
fmt.Errorf()
با قابلیت %w
به تو اجازه میدهد خطاها را قالببندی و wrap کنی:return fmt.Errorf("failed to open file: %w", err)
4. قالبدهی structها (Format Structs)
وقتی structها در لاگها استفاده میشن، آنها را قالبمند کن تا خواناتر و مفیدتر باشند؛ مثلاً با فرمت:
fmt.Printf("%+v", myStruct)
5. استفاده از نسخه variadic توابع مانند `fmt.Println()`
ورژن variadic بهت اجازه میدهد مولفههای مختلف را بدون تلاش برای concatenation دستی به هم بچسبونی. خوانا و منعطفتره.
6. استفاده از بستهی استاندارد `log`
برای شروع خوبه، خصوصاً برای پروژههای ساده یا کوچک.
log
پایدار و سبک هست و کافی برای کاربردهای ابتدایی است.---
جمعبندی سریع
اینها اصولی هستند که در بسیاری از آموزشها و بحثهای Go توصیه میشن: استفاده از سیستم خطای داخلی، پیروی از استانداردها در wrap خطا، قالبدهی مناسب، و استفاده از امکانات داخلی زبان قبل از رفتن به راهحلهای پیچیدهتر.
---
توصیههای عملی
* لاگنویسی رو با استفاده از خطاهای داخلی Go شروع کن.
* ورودیها رو wrap کن؛ structها رو مرتب قالب بده.
* برای لاگهای پیشرفتهتر، از structured logging استفاده کن (مثل Zap یا Zerolog).
* همیشه context مهم رو مثل request ID در لاگها نگهدار.
* حجم لاگ رو کنترل کن: نه خیلی زیاد باشه که کارایی رو پایین بیاره، نه خیلی کم که مفید نباشه.
🤝4👍1
📌 چرا به جای sync.Mutex از sync/atomic استفاده کنیم؟
سریعتره چون نیازی به قفل کردن نداره.
اما فقط برای عملیات ساده مثل افزایش/خواندن مقدار مناسبه.
برای عملیات پیچیدهتر، هنوز باید از sync.Mutex یا sync.RWMutex استفاده کنی.
سریعتره چون نیازی به قفل کردن نداره.
اما فقط برای عملیات ساده مثل افزایش/خواندن مقدار مناسبه.
برای عملیات پیچیدهتر، هنوز باید از sync.Mutex یا sync.RWMutex استفاده کنی.
❤2
Forwarded from DevOps Labdon
یکی از فوق العاده ترین ابزارهای مدیریت کلاستر kubernetes که هرروز باهاش کار میکنم و واقعا لذت میبرم k9s هست:
https://github.com/derailed/k9s
<Mohsen Khodabakhshi/>
https://github.com/derailed/k9s
<Mohsen Khodabakhshi/>
GitHub
GitHub - derailed/k9s: 🐶 Kubernetes CLI To Manage Your Clusters In Style!
🐶 Kubernetes CLI To Manage Your Clusters In Style! - derailed/k9s
❤6
Forwarded from Software Engineer Labdon
اگه یه چیزی مثل curl برای gRPC میخواین میتونین از این استفاده کنین:
https://github.com/fullstorydev/grpcurl
<بلک استیت />
https://github.com/fullstorydev/grpcurl
<بلک استیت />
GitHub
GitHub - fullstorydev/grpcurl: Like cURL, but for gRPC: Command-line tool for interacting with gRPC servers
Like cURL, but for gRPC: Command-line tool for interacting with gRPC servers - fullstorydev/grpcurl
🔥2🍾2❤1
💐امکانات جدید در GoLand 2025.2
۱. تحلیل جریان داده برای جلوگیری از nil dereference
اGoLand اکنون از تحلیل بینتابعی (interprocedural) استفاده میکند تا جریان دادههای nil را در حلقههای فراخوانی تابع، فایلها و بستهها دنبال کند. در نتیجه، هشدارهایی برای استفادههای ناایمن از اشارهگرها (dereference) به شکل مستقیم در ادیتور نمایش داده میشود. علاوه بر این، تب جدیدی به نام Data Flow Analysis در پنجره Problems اضافه شده که مسیر دقیق جریان nil را نشان میدهد.
۲. صفحه خوشآمدگویی غیرمسدودکننده (Non‑blocking Welcome screen)
صفحه خوشآمدگویی (Welcome Screen) حالا به صورت تب (tab) در IDE باز میشود، بدون آنکه اجرای محیط توسعه را متوقف کند. این امکان را دارید که بدون باز کردن پروژه به ترمینال، ابزار HTTP، Docker، Kubernetes یا پایگاهداده دسترسی داشته باشید و حتی فایلهای مستقل را ویرایش کنید.
۳. کشف هوشمندانهتر endpointها و تولید درخواست (Request) خودکار
ابزار Endpoints بهبود یافته تا الگوهای مدرن ServeMux را بهتر بشناسد؛ از جمله مسیرهای wildcard یا آنهایی که با HTTP method همراه هستند، مانند GET /task/{id}/.
علاوه بر این، متد HTTP در کنار هر endpoint نمایش داده شده، autocomplete برای ساخت آسانتر request فعال شده و پشتیبانی از فریمورکهایی مانند Chi, Gin, Gorilla نیز بهبود یافته است.
۴. اJunie؛ عامل هوشمند داخل IDE
عامل هوشمند Junie حالا سریعتر شده (حدود ۳۰٪ افزایش سرعت)، از پروتکل MCP (Model Context Protocol) پشتیبانی میکند و امکان کار در محیط Remote Development را فراهم میآورد—همه اینها در دل IDE برای تسهیل کارهای حرفهایتر.
۵. ارتقا در پشتیبانی از golangci-lint نسخه ۲
ادغام با golangci-lint بهبود یافته، به طوری که نسخهی جدید آن (v2) در تحلیل بلادرنگ (real-time) بهتر و مطمئنتر عملکرد دارد.
---
خلاصه کاربردی
ویژگی جدید کاربرد
تحلیل Nil با DFA جلوگیری از خطاهای اشارهگری قبل از runtime
صفحه خوشآمدگویی غیرمسدودکننده دسترسی سریعتر به ابزارها بدون باز کردن پروژه
کشف و Request خودکار endpointها تسهیل تعامل با HTTP در توسعه وب
اJunie با MCP و پشتیبانی Remote افزایش سرعت و قابلیت هوشمند برای توسعه حرفهای
ارتقاء golangci‑lint integration تحلیل کد دقیقتر و قابلاعتمادتر در زمان توسعه
---
در مجموع، نسخه 2025.2 تمرکزش را روی بهبود تجربه توسعهدهنده معطوف کرده—از تشخیص هوشمند خطا تا دسترسی سریع به ابزارها و هوشمندسازی کمکها در IDE.
۱. تحلیل جریان داده برای جلوگیری از nil dereference
اGoLand اکنون از تحلیل بینتابعی (interprocedural) استفاده میکند تا جریان دادههای nil را در حلقههای فراخوانی تابع، فایلها و بستهها دنبال کند. در نتیجه، هشدارهایی برای استفادههای ناایمن از اشارهگرها (dereference) به شکل مستقیم در ادیتور نمایش داده میشود. علاوه بر این، تب جدیدی به نام Data Flow Analysis در پنجره Problems اضافه شده که مسیر دقیق جریان nil را نشان میدهد.
۲. صفحه خوشآمدگویی غیرمسدودکننده (Non‑blocking Welcome screen)
صفحه خوشآمدگویی (Welcome Screen) حالا به صورت تب (tab) در IDE باز میشود، بدون آنکه اجرای محیط توسعه را متوقف کند. این امکان را دارید که بدون باز کردن پروژه به ترمینال، ابزار HTTP، Docker، Kubernetes یا پایگاهداده دسترسی داشته باشید و حتی فایلهای مستقل را ویرایش کنید.
۳. کشف هوشمندانهتر endpointها و تولید درخواست (Request) خودکار
ابزار Endpoints بهبود یافته تا الگوهای مدرن ServeMux را بهتر بشناسد؛ از جمله مسیرهای wildcard یا آنهایی که با HTTP method همراه هستند، مانند GET /task/{id}/.
علاوه بر این، متد HTTP در کنار هر endpoint نمایش داده شده، autocomplete برای ساخت آسانتر request فعال شده و پشتیبانی از فریمورکهایی مانند Chi, Gin, Gorilla نیز بهبود یافته است.
۴. اJunie؛ عامل هوشمند داخل IDE
عامل هوشمند Junie حالا سریعتر شده (حدود ۳۰٪ افزایش سرعت)، از پروتکل MCP (Model Context Protocol) پشتیبانی میکند و امکان کار در محیط Remote Development را فراهم میآورد—همه اینها در دل IDE برای تسهیل کارهای حرفهایتر.
۵. ارتقا در پشتیبانی از golangci-lint نسخه ۲
ادغام با golangci-lint بهبود یافته، به طوری که نسخهی جدید آن (v2) در تحلیل بلادرنگ (real-time) بهتر و مطمئنتر عملکرد دارد.
---
خلاصه کاربردی
ویژگی جدید کاربرد
تحلیل Nil با DFA جلوگیری از خطاهای اشارهگری قبل از runtime
صفحه خوشآمدگویی غیرمسدودکننده دسترسی سریعتر به ابزارها بدون باز کردن پروژه
کشف و Request خودکار endpointها تسهیل تعامل با HTTP در توسعه وب
اJunie با MCP و پشتیبانی Remote افزایش سرعت و قابلیت هوشمند برای توسعه حرفهای
ارتقاء golangci‑lint integration تحلیل کد دقیقتر و قابلاعتمادتر در زمان توسعه
---
در مجموع، نسخه 2025.2 تمرکزش را روی بهبود تجربه توسعهدهنده معطوف کرده—از تشخیص هوشمند خطا تا دسترسی سریع به ابزارها و هوشمندسازی کمکها در IDE.
🔥5❤1👍1
«به جای اینکه توی benchmark از
توضیح
در تستهای بنچمارک گولنگ (یعنی تابعهایی که با
ولی از نسخههای جدیدتر Go، متد [`b.Loop()`](https://pkg.go.dev/testing#B.Loop) اضافه شده که همین کار رو به شکل مدرن و کمی بهینهتر انجام میده و خوانایی رو هم بهتر میکنه:
فرق اصلی
* کد کوتاهتر و خواناتر
* جلوگیری از اشتباهات احتمالی در حلقه شمارشی
* خود Go در آینده ممکنه بهینهسازیهای بیشتری روی
مثال تبدیل
قدیم:
جدید:
پس پیغام `b.N can be modernized using b.Loop()` یعنی «لطفاً حلقه
for i := 0; i < b.N; i++ { ... }
استفاده کنی، میتونی از متد جدیدتر b.Loop()
استفاده کنی.»توضیح
در تستهای بنچمارک گولنگ (یعنی تابعهایی که با
func BenchmarkXxx(b *testing.B)
نوشته میشن)، معمولاً برای اجرای کد به تعداد کافی و گرفتن میانگین زمان اجرا، از این الگو استفاده میشه:for i := 0; i < b.N; i++ {
// کدی که باید بنچمارک بشه
}
ولی از نسخههای جدیدتر Go، متد [`b.Loop()`](https://pkg.go.dev/testing#B.Loop) اضافه شده که همین کار رو به شکل مدرن و کمی بهینهتر انجام میده و خوانایی رو هم بهتر میکنه:
b.Loop(func() {
// کدی که باید بنچمارک بشه
})
فرق اصلی
* کد کوتاهتر و خواناتر
* جلوگیری از اشتباهات احتمالی در حلقه شمارشی
* خود Go در آینده ممکنه بهینهسازیهای بیشتری روی
b.Loop
انجام بدهمثال تبدیل
قدیم:
func BenchmarkSomething(b *testing.B) {
for i := 0; i < b.N; i++ {
doWork()
}
}
جدید:
func BenchmarkSomething(b *testing.B) {
b.Loop(func() {
doWork()
})
}
پس پیغام `b.N can be modernized using b.Loop()` یعنی «لطفاً حلقه
for
رو به b.Loop
تغییر بده».🍓4👨💻1
دیدگاه جامعه درباره استفاده از Enum در Go
اهمیت خاص گذاشتن روی مقدار Invalid در صفر:
هشدار نسبت به وابستگی زیاد به iota وقتی این مقادیر در دیتابیس ذخیره میشن:
برخی هم در بحثهای Reddit اشاره کردهاند که enumهای واقعی مثل Rust’s sum types در Go وجود ندارند و هرچقدر هم شبیهسازی شوند، محدودیتهایی دارند.
اهمیت خاص گذاشتن روی مقدار Invalid در صفر:
“New go devs from Java tend to forget that the enum doesn’t default to null… defining 0 as unknown saves a lot of confusing bugs!”
هشدار نسبت به وابستگی زیاد به iota وقتی این مقادیر در دیتابیس ذخیره میشن:
“Reordering/removing cases also doesn't cause any big problem… unless you are using the number representation of enums in the database.”
برخی هم در بحثهای Reddit اشاره کردهاند که enumهای واقعی مثل Rust’s sum types در Go وجود ندارند و هرچقدر هم شبیهسازی شوند، محدودیتهایی دارند.
👌7
Forwarded from AI Labdon
تاجگذاری OpenAi در میدان شطرنج هوش مصنوعی ؛ ChatGPT گراک رو به زمین زد!
▪️در اولین دوره مسابقات شطرنج هوش مصنوعی در Kaggle Game Arena، مدل o3 از OpenAI با یک نمای قاطع 4 بر 0 مقابل Grok 4 (xAI) پیروز شد.
▪️مدل o3 با دقت 90.8% و بازیهای حسابشده، حریف رو به اشتباهات سخت کشوند؛ در حالی که Grok 4 با دقت 80.2% نتونست جلوی سقوط مهرهها رو بگیره.
▪️ردهبندی نهایی :
🥇 OpenAI - o3 (قهرمان)
🥈 xAI - Grok 4 (نایبقهرمان)
🥉 Gemini 2.5 Pro (مقام سوم)
▪️در اولین دوره مسابقات شطرنج هوش مصنوعی در Kaggle Game Arena، مدل o3 از OpenAI با یک نمای قاطع 4 بر 0 مقابل Grok 4 (xAI) پیروز شد.
▪️مدل o3 با دقت 90.8% و بازیهای حسابشده، حریف رو به اشتباهات سخت کشوند؛ در حالی که Grok 4 با دقت 80.2% نتونست جلوی سقوط مهرهها رو بگیره.
▪️ردهبندی نهایی :
🥇 OpenAI - o3 (قهرمان)
🥈 xAI - Grok 4 (نایبقهرمان)
🥉 Gemini 2.5 Pro (مقام سوم)
🏆3 1
🆗 چیستی SBOM و اهمیتش؟
ا* SBOM یا Software Bill of Materials، لیستی ساختاریافته از تمام اجزای تشکیلدهنده نرمافزار مثل پکیجها، ماژولها و کتابخانههاست. این لیست کمک میکنه تیمها بر زنجیره تأمین نرمافزاری، وابستگیها و ریسکهای امنیتی تسلط بهتری داشته باشن
* در پروژههای Go، فایل
---
مزایای SBOM
| مزیت | توضیح |
| --------------- | ------------------------------------------------------ |
| امنیت | شناسایی سریع آسیبپذیریهای وابستگیها |
| تطابق با مجوزها | بررسی مجوزهای وابستگیها قبل از انتشار |
| استانداردسازی | استفاده از فرمتهای مشترک و قابل تحلیل |
| الزامات قانونی | کاربرد در پروژههایی با نیازهای compliance مثل FedRAMP |
---
نحوهی تولید SBOM در پروژههای Go
1. نصب ابزار CycloneDX برای Go:
2. تولید SBOM با فرمت JSON:
3. تحلیل SBOM با ابزارهایی مثل Grype:
4. بررسی تطابق مجوزها:
* برای پروژههایی که از Go Workspace استفاده میکنن، باید بهطور موقت آن را غیرفعال کرد (مثلاً با
---
جمعبندی کوتاه
*ا SBOM یک نقشهٔ دقیق از تمام اجزای نرمافزار شماست—وقت نگرانی دربارهٔ نسخهها، آسیبپذیریها یا مجوزهای حقوقی شون داشته باشی.
* ابزار CycloneDX for Go سادهترین راه برای تولید SBOM در پروژههای Go است.
* پس از تولید، ابزارهایی مثل Grype و CycloneDX خود ابزار خوبی برای تحلیل و بررسی و آسیبپذیری یا مجوزها فراهم میکنن.
ا* SBOM یا Software Bill of Materials، لیستی ساختاریافته از تمام اجزای تشکیلدهنده نرمافزار مثل پکیجها، ماژولها و کتابخانههاست. این لیست کمک میکنه تیمها بر زنجیره تأمین نرمافزاری، وابستگیها و ریسکهای امنیتی تسلط بهتری داشته باشن
* در پروژههای Go، فایل
go.mod
فقط وابستگیهای مستقیم رو فهرست میکنه، اما SBOM برای پوششدهی وابستگیهای غیرمستقیم (transitive) و تولید خروجی در قالبهای استاندارد بسیار کاربردیتره ---
مزایای SBOM
| مزیت | توضیح |
| --------------- | ------------------------------------------------------ |
| امنیت | شناسایی سریع آسیبپذیریهای وابستگیها |
| تطابق با مجوزها | بررسی مجوزهای وابستگیها قبل از انتشار |
| استانداردسازی | استفاده از فرمتهای مشترک و قابل تحلیل |
| الزامات قانونی | کاربرد در پروژههایی با نیازهای compliance مثل FedRAMP |
---
نحوهی تولید SBOM در پروژههای Go
1. نصب ابزار CycloneDX برای Go:
go install github.com/CycloneDX/cyclonedx-go@latest
2. تولید SBOM با فرمت JSON:
cyclonedx-go mod -json -output sbom.json
3. تحلیل SBOM با ابزارهایی مثل Grype:
grype sbom.json
4. بررسی تطابق مجوزها:
cyclonedx-go mod -licenses -json -output licenses.json
* برای پروژههایی که از Go Workspace استفاده میکنن، باید بهطور موقت آن را غیرفعال کرد (مثلاً با
GO111MODULE=off
) تا ابزار بتواند SBOM را به درستی تولید کند ---
جمعبندی کوتاه
*ا SBOM یک نقشهٔ دقیق از تمام اجزای نرمافزار شماست—وقت نگرانی دربارهٔ نسخهها، آسیبپذیریها یا مجوزهای حقوقی شون داشته باشی.
* ابزار CycloneDX for Go سادهترین راه برای تولید SBOM در پروژههای Go است.
* پس از تولید، ابزارهایی مثل Grype و CycloneDX خود ابزار خوبی برای تحلیل و بررسی و آسیبپذیری یا مجوزها فراهم میکنن.
👌4👍1🔥1
یه محیط خفن گرافیکی جذاب برای یادگیری الگوهای Concurrency
Go Concurrency Explorer
https://www.concurrency.rocks
Go Concurrency Explorer
https://www.concurrency.rocks
Go Concurrency Rocks
Interactive exploration of Go concurrency patterns
❤1👌1🍾1
Forwarded from Linux Labdon
لینوس توروالدز: کد مهندس گوگل «آشغال محض» بود!
▪️همه فکر میکنن مهندسای گوگل در قله کیفیت هستن، اما خالق لینوکس یه شوک اساسی داد! لینوس توروالدز بدون هیچ تعارف، کد یکی از برنامهنویسای گوگل رو «به درد نخور» خطاب کرد و اون رو با خاک یکسان کرد.
▪️ماجرا از یه Pull Request مربوط به پشتیبانی RISC-V در لینوکس 6.17 شروع شد. پالمر دابلت از تیم اندروید، تغییرات رو فرستاد، ولی:
1. کیفیت کدنویسی افتضاح!
2. ارسال دیرهنگام در «پنجره ادغام»!
▪️همه فکر میکنن مهندسای گوگل در قله کیفیت هستن، اما خالق لینوکس یه شوک اساسی داد! لینوس توروالدز بدون هیچ تعارف، کد یکی از برنامهنویسای گوگل رو «به درد نخور» خطاب کرد و اون رو با خاک یکسان کرد.
▪️ماجرا از یه Pull Request مربوط به پشتیبانی RISC-V در لینوکس 6.17 شروع شد. پالمر دابلت از تیم اندروید، تغییرات رو فرستاد، ولی:
1. کیفیت کدنویسی افتضاح!
2. ارسال دیرهنگام در «پنجره ادغام»!
✍4🔥1
Forwarded from Bardia & Erfan
🎯 آمادگی کامل IELTS با تدریس خصوصی و آنلاین
👑به دنبال نمره بالا در آیلتس هستی؟
🟢با استاد Mansourian، مدرس با تجربه مهارتهای
🩵Speaking
🩵Writing
🩵Reading
🩵Listening
رو به بهترین شکل تقویت کن.
📌 کلاسها به صورت آنلاین، خصوصی و روزانه برگزار میشه.
📈 پیشرفت سریع + برنامهریزی دقیق برای رسیدن به هدفت.
💬 همین الان فالو کن و مسیر موفقیتت رو شروع کن!
👇پیج استاد توی انستاگرام 👇
https://www.instagram.com/english_razi_ielts
👑به دنبال نمره بالا در آیلتس هستی؟
🟢با استاد Mansourian، مدرس با تجربه مهارتهای
🩵Speaking
🩵Writing
🩵Reading
🩵Listening
رو به بهترین شکل تقویت کن.
📌 کلاسها به صورت آنلاین، خصوصی و روزانه برگزار میشه.
📈 پیشرفت سریع + برنامهریزی دقیق برای رسیدن به هدفت.
💬 همین الان فالو کن و مسیر موفقیتت رو شروع کن!
👇پیج استاد توی انستاگرام 👇
https://www.instagram.com/english_razi_ielts
در ادامه، یک خلاصه کاربردی و بهروز از مقاله Matthias Endler با عنوان «How To Review Code» (منتشرشده در ۶ آگوست ۲۰۲۵) آورده شده است
نکات کلیدی برای بررسی کد با رویکرد حرفهای
۱. به چشمانداز کلی فکر کن
بررسی کد نباید فقط به خطهای تغییر یافته محدود شود. بهتر است به این سوالها پاسخ بدهیم:
کد جدید چگونه با سیستم فعلی تعامل دارد؟
تستها، مستندات و دیتا تایپها بهروز شدهاند؟
آیا معماری کلی را تضعیف نمیکند؟
۲. نامگذاری اهمیت زیادی دارد
نامگذاری بد نهتنها کد را سختفهم میکند، بلکه میتواند نشانهای از مشکلات ساختاری بزرگ باشد. انتخاب نامهایی واضح، با مفهوم و هماهنگ با دامنه کاربرد حیاتی است.
مثال ارائهشده روی یک نسخه نامناسب از تابع update_player_stats تأکید دارد.
۳. اگر ممکن است، کد را اجرا کن
داشتن نسخه محلی برای اجرای کد، تستها و linters خیلی کمک میکند. جابهجایی و آزمودن کد به فهم بهتر منطق کمک میکند (مخصوصاً برای تغییرات UI یا پیامهای خطا).
۴. درباره دسترسپذیری خود صادق باش
بررسی کد ممکن است زمانبر باشد. اگر فرصت انجامش را نداری، صادق باش و به نویسنده اطلاع بده — تا فرایند توسعه متوقف نشود.
۵. هیچوقت دست از یادگیری بر ندار
هر بررسی کد فرصتی برای یادگیری الگوها، کتابخانهها یا رویکردهایی است که شاید نمیدانستی. هدف فقط اصلاح نیست، رشد تیمی نیز هست.
۶. حسّی رفتار نکن — فقط نقدهای اصلمحور
اformat و whitespace را به ابزارهای قالبزن (formatter) بسپار. انرژی خود را برای بررسی منطق، طراحی و نگهداریپذیری صرف کن. اگر تغییری کاربردی ندارد یا باعث سردرگمی نخواهد شد، نادیدهاش بگیر.
۷. روی چرا تمرکز کن، نه چگونه
بهتر است سؤالهای راهگشا درباره دلیل انتخاب یک راه حل مطرح شود، تا صرفاً گفتن "اشتباه است". این رویکرد ماندگارتر و آموزندهتر است.
۸. پرسیدن سؤالهای ساده هیچ اشکالی ندارد
اگر چیزی را نمیفهمی، حتماً سؤال بپرس. ممکن است شخص دیگری هم همانطور فکر کند. این کمک میکند نویسنده ببینند بخشهایی از کد بیدلیل گیجکنندهاند.
۹. به بررسی سبک خودت هم گوش بده
بپرس: "آیا نقدم خیلی سختگیرانه بود؟ مفید بود؟ باعث پیشرفت شد؟"
احتمالاً خودت هم در حال یادگیری هستی و تکامل در روند بررسی خیلی ارزشمند است.
جمعبندی: بررسی کد حرفهای یعنی چه؟
علاوه بر خطهای تغییر، به تأثیر تغییر در کل سیستم توجه کن.
نامگذاری صحیح، درک جریان و معماری را سادهتر میکند.
وقتی میشود کد را اجرا کرد، حتماً امتحانش کن.
اگر وقت نداری یا چیزی را نفهمیدی، صادق باش و سؤال بپرس.
مهمتر از اصلاح، کمک به رشد است.
نکات کلیدی برای بررسی کد با رویکرد حرفهای
۱. به چشمانداز کلی فکر کن
بررسی کد نباید فقط به خطهای تغییر یافته محدود شود. بهتر است به این سوالها پاسخ بدهیم:
کد جدید چگونه با سیستم فعلی تعامل دارد؟
تستها، مستندات و دیتا تایپها بهروز شدهاند؟
آیا معماری کلی را تضعیف نمیکند؟
۲. نامگذاری اهمیت زیادی دارد
نامگذاری بد نهتنها کد را سختفهم میکند، بلکه میتواند نشانهای از مشکلات ساختاری بزرگ باشد. انتخاب نامهایی واضح، با مفهوم و هماهنگ با دامنه کاربرد حیاتی است.
مثال ارائهشده روی یک نسخه نامناسب از تابع update_player_stats تأکید دارد.
۳. اگر ممکن است، کد را اجرا کن
داشتن نسخه محلی برای اجرای کد، تستها و linters خیلی کمک میکند. جابهجایی و آزمودن کد به فهم بهتر منطق کمک میکند (مخصوصاً برای تغییرات UI یا پیامهای خطا).
۴. درباره دسترسپذیری خود صادق باش
بررسی کد ممکن است زمانبر باشد. اگر فرصت انجامش را نداری، صادق باش و به نویسنده اطلاع بده — تا فرایند توسعه متوقف نشود.
۵. هیچوقت دست از یادگیری بر ندار
هر بررسی کد فرصتی برای یادگیری الگوها، کتابخانهها یا رویکردهایی است که شاید نمیدانستی. هدف فقط اصلاح نیست، رشد تیمی نیز هست.
۶. حسّی رفتار نکن — فقط نقدهای اصلمحور
اformat و whitespace را به ابزارهای قالبزن (formatter) بسپار. انرژی خود را برای بررسی منطق، طراحی و نگهداریپذیری صرف کن. اگر تغییری کاربردی ندارد یا باعث سردرگمی نخواهد شد، نادیدهاش بگیر.
۷. روی چرا تمرکز کن، نه چگونه
بهتر است سؤالهای راهگشا درباره دلیل انتخاب یک راه حل مطرح شود، تا صرفاً گفتن "اشتباه است". این رویکرد ماندگارتر و آموزندهتر است.
۸. پرسیدن سؤالهای ساده هیچ اشکالی ندارد
اگر چیزی را نمیفهمی، حتماً سؤال بپرس. ممکن است شخص دیگری هم همانطور فکر کند. این کمک میکند نویسنده ببینند بخشهایی از کد بیدلیل گیجکنندهاند.
۹. به بررسی سبک خودت هم گوش بده
بپرس: "آیا نقدم خیلی سختگیرانه بود؟ مفید بود؟ باعث پیشرفت شد؟"
احتمالاً خودت هم در حال یادگیری هستی و تکامل در روند بررسی خیلی ارزشمند است.
جمعبندی: بررسی کد حرفهای یعنی چه؟
علاوه بر خطهای تغییر، به تأثیر تغییر در کل سیستم توجه کن.
نامگذاری صحیح، درک جریان و معماری را سادهتر میکند.
وقتی میشود کد را اجرا کرد، حتماً امتحانش کن.
اگر وقت نداری یا چیزی را نفهمیدی، صادق باش و سؤال بپرس.
مهمتر از اصلاح، کمک به رشد است.
❤2👍1🍾1
Forwarded from Software Engineer Labdon
پایان استقلال گیتهاب؛ مایکروسافت همهچیز را میبلعد!
▪️گیتهاب، بزرگترین مخزن کد جهان و خانه میلیونها توسعهدهنده، بعد از استعفای مدیرعاملش دیگه مستقل نیست! مایکروسافت رسماً این پلتفرم محبوب رو قورت داد و انداختش وسط تیم Core AI خودش.
▪️«توماس دومکه» مدیرعامل گیتهاب گفت تا آخر امسال میره دنبال استارتاپ جدیدش، اما درست بعد از اعلام رفتنش، خبر اومد که گیتهاب از این به بعد بخشی از پروژههای AI مایکروسافته؛ یعنی همه راهها مستقیم میره سمت GitHub Copilot...
+ اما برنامهنویس ها نگرانن همون بلایی که سر اسکایپ اومد سر گیتهاب هم بیاد!
▪️گیتهاب، بزرگترین مخزن کد جهان و خانه میلیونها توسعهدهنده، بعد از استعفای مدیرعاملش دیگه مستقل نیست! مایکروسافت رسماً این پلتفرم محبوب رو قورت داد و انداختش وسط تیم Core AI خودش.
▪️«توماس دومکه» مدیرعامل گیتهاب گفت تا آخر امسال میره دنبال استارتاپ جدیدش، اما درست بعد از اعلام رفتنش، خبر اومد که گیتهاب از این به بعد بخشی از پروژههای AI مایکروسافته؛ یعنی همه راهها مستقیم میره سمت GitHub Copilot...
+ اما برنامهنویس ها نگرانن همون بلایی که سر اسکایپ اومد سر گیتهاب هم بیاد!
❤2💊2👀1
Forwarded from AI Labdon
یک مثال شبیه به تستهای SWE-bench Verified می زنیم تا تفاوت رو بین سه مدل Claude Opus 4.1**، **Claude Sonnet 4 و Claude Haiku 3.5 ببینیم.
---
📌 سناریو
پروژه: یک سیستم مدیریت سفارش ساده (Python)
مشکل: یک تابع برای محاسبه قیمت کل سفارش نوشته شده، ولی تخفیف بهدرستی اعمال نمیشود.
کد اولیه (دارای باگ):
هدف:
* تخفیف باید بر اساس درصد اعمال شود، نه کم کردن مستقیم عدد از مبلغ کل.
* باید اطمینان حاصل شود که نتیجه کمتر از صفر نشود.
---
🔍 خروجی مدلها
ا Opus 4.1 (قدرت استدلال بالا)
✅ تغییرات:
* استفاده از comprehension برای خوانایی.
* محاسبه تخفیف بهصورت درصدی.
* جلوگیری از منفی شدن قیمت.
* گرد کردن به دو رقم اعشار (برای واحد پولی).
---
ا Sonnet 4 (تعادل سرعت و کیفیت)
✅ تغییرات:
* درست کردن محاسبه تخفیف.
* جلوگیری از عدد منفی.
⚠️ کمی کمتر از Opus در توجه به جزئیات (مثلاً گرد کردن و Docstring بهبود یافته).
---
ا Haiku 3.5 (سریع ولی سادهتر)
✅ تغییرات:
* محاسبه درست تخفیف.
⚠️ اما:
* حفاظت در برابر منفی شدن قیمت را اضافه نکرده.
* بهینهسازی یا بهبود ساختار کد انجام نداده.
---
📊 نتیجهگیری
| مدل | کیفیت کد | توجه به جزئیات | سرعت |
| ------------- | --------- | ---------------- | ---------- |
| Opus 4.1 | عالی | بسیار بالا | متوسط |
| Sonnet 4 | خوب | متوسط رو به بالا | سریعتر |
| Haiku 3.5 | قابل قبول | پایین | بسیار سریع |
---
📌 سناریو
پروژه: یک سیستم مدیریت سفارش ساده (Python)
مشکل: یک تابع برای محاسبه قیمت کل سفارش نوشته شده، ولی تخفیف بهدرستی اعمال نمیشود.
کد اولیه (دارای باگ):
def calculate_total_price(items, discount_percentage):
"""
items: list of tuples (price, quantity)
discount_percentage: float between 0 and 100
"""
total = 0
for price, qty in items:
total += price * qty
total -= discount_percentage
return total
هدف:
* تخفیف باید بر اساس درصد اعمال شود، نه کم کردن مستقیم عدد از مبلغ کل.
* باید اطمینان حاصل شود که نتیجه کمتر از صفر نشود.
---
🔍 خروجی مدلها
ا Opus 4.1 (قدرت استدلال بالا)
def calculate_total_price(items, discount_percentage):
"""
items: list of tuples (price, quantity)
discount_percentage: float between 0 and 100
"""
total = sum(price * qty for price, qty in items)
discount_amount = total * (discount_percentage / 100)
final_total = max(total - discount_amount, 0)
return round(final_total, 2)
✅ تغییرات:
* استفاده از comprehension برای خوانایی.
* محاسبه تخفیف بهصورت درصدی.
* جلوگیری از منفی شدن قیمت.
* گرد کردن به دو رقم اعشار (برای واحد پولی).
---
ا Sonnet 4 (تعادل سرعت و کیفیت)
def calculate_total_price(items, discount_percentage):
total = sum(price * qty for price, qty in items)
discount = total * (discount_percentage / 100)
return max(total - discount, 0)
✅ تغییرات:
* درست کردن محاسبه تخفیف.
* جلوگیری از عدد منفی.
⚠️ کمی کمتر از Opus در توجه به جزئیات (مثلاً گرد کردن و Docstring بهبود یافته).
---
ا Haiku 3.5 (سریع ولی سادهتر)
def calculate_total_price(items, discount_percentage):
total = 0
for price, qty in items:
total += price * qty
return total - (total * discount_percentage / 100)
✅ تغییرات:
* محاسبه درست تخفیف.
⚠️ اما:
* حفاظت در برابر منفی شدن قیمت را اضافه نکرده.
* بهینهسازی یا بهبود ساختار کد انجام نداده.
---
📊 نتیجهگیری
| مدل | کیفیت کد | توجه به جزئیات | سرعت |
| ------------- | --------- | ---------------- | ---------- |
| Opus 4.1 | عالی | بسیار بالا | متوسط |
| Sonnet 4 | خوب | متوسط رو به بالا | سریعتر |
| Haiku 3.5 | قابل قبول | پایین | بسیار سریع |
❤5👌1🍾1