🔴قابلیت New GC ویژگی های جدید گولنگ نسخه 1.25
در Go 1.25، یک جمعآورندهٔ زباله (GC) جدید به نام "Green Tea" معرفی شده که طراحی آن انقلابیست، مخصوص برنامههایی با تولید انبوه اشیاء کوچک و اجرا در سیستمهای چندهستهای مدرن:
🍵 چرا "Green Tea"؟
*درواقع GC فعلی Go مبتنی بر الگوریتم "tri-color parallel marking" است که اشیاء را جداگانه اسکن میکند؛ این باعث میشود حافظه بهشکل تصادفی خوانده شود و کش پر کاربرد (L1/L2) زیاد miss شود
* این Green Tea بهجای اسکن هر شیء، اسکن بلوکهای حافظه بزرگتر (span) را انجام میدهد تا locality حافظه حفظ شود، contention بین threadها کاهش یابد، و دسترسیها به حافظه سریعتر شود .
⚙️ نحوه عملکرد:
1. در spans (بلاک ۸ کیلوبایتی حافظه با اشیاء هماندازه)، دو نشانگر gray و black برای مدیریت حالت marking استفاده میشود. spans به صف عملگرها اضافه و بعد پردازش میشوند .
2. این ساختار باعث کاهش شدید فعالیت حافظه و افزایش همزمانی در محیطهای خیلی هستهای میشود .
📊 عملکرد و نتایج:
* در بنچمارکهای GC‑محور، کاهش ۱۰–۵۰٪ در مصرف CPU مربوط به GC مشاهده شده؛ مخصوصاً روی ماشینهای چندهستهای
* باعث کاهش بیش از ۵۰٪ در cache missها (L1/L2) شده
* البته در برخی بنچمارکها (مثلاً کامپایلر Go) ممکن است کمی افت عملکرد (\~۰.۵٪) دیده شود که در حال بررسی است
🧪 نحوه استفاده و فعالسازی:
* ویژگی Experimental است و میتوانید آن را بهصورت آزمایشی با:
فعال کنید .
* هدف این است که بتوان آن را در Go 1.25 بهعنوان یک گزینه فعالشدنی استفاده کرد، و ارزیابی واقعی روی پروژهها صورت گیرد
✍️ مثال فرضی استفاده:
فرض کنید برنامهای سرویسمحور دارید که بهطرز چشمگیری اشیاء کوچک ایجاد میکند (مثلاً در لایهی JSON/API). با فعال کردن Green Tea:
درواقعه * GC حافظه را بلوکی اسکن میکند، نه شیء به شیء.
* بار CPU مربوط به GC کاهش مییابد و کارایی کلی اپلیکیشن بهتر میشود.
بهعنوان مثال ساده:
وقتی quotaی garbage ایجاد میشود، جدیدترین GC بهجای اسکن ۱۰۰۰ شیء، spans را اسکن میکند و locality را حفظ میکند، بهینهتر عمل مینماید.
✅ جمعبندی:
* این Green Tea GC الگوریتمی توپولوژی-آگاه است که با توجه به ساختار حافظه سیستم، عملکرد marking را بهینه میکند.
* برای برنامههایی که اشیاء کوچک زیادی ایجاد میکنند و به performance حساس هستند، میتواند ۱۰–۵۰٪ کاهش در overhead GC فراهم کند.
* هنوز آزمایشیست؛ برای فعالسازی از
➖➖➖➖➖➖➖➖
👑 @gopher_academy
در Go 1.25، یک جمعآورندهٔ زباله (GC) جدید به نام "Green Tea" معرفی شده که طراحی آن انقلابیست، مخصوص برنامههایی با تولید انبوه اشیاء کوچک و اجرا در سیستمهای چندهستهای مدرن:
🍵 چرا "Green Tea"؟
*درواقع GC فعلی Go مبتنی بر الگوریتم "tri-color parallel marking" است که اشیاء را جداگانه اسکن میکند؛ این باعث میشود حافظه بهشکل تصادفی خوانده شود و کش پر کاربرد (L1/L2) زیاد miss شود
* این Green Tea بهجای اسکن هر شیء، اسکن بلوکهای حافظه بزرگتر (span) را انجام میدهد تا locality حافظه حفظ شود، contention بین threadها کاهش یابد، و دسترسیها به حافظه سریعتر شود .
⚙️ نحوه عملکرد:
1. در spans (بلاک ۸ کیلوبایتی حافظه با اشیاء هماندازه)، دو نشانگر gray و black برای مدیریت حالت marking استفاده میشود. spans به صف عملگرها اضافه و بعد پردازش میشوند .
2. این ساختار باعث کاهش شدید فعالیت حافظه و افزایش همزمانی در محیطهای خیلی هستهای میشود .
📊 عملکرد و نتایج:
* در بنچمارکهای GC‑محور، کاهش ۱۰–۵۰٪ در مصرف CPU مربوط به GC مشاهده شده؛ مخصوصاً روی ماشینهای چندهستهای
* باعث کاهش بیش از ۵۰٪ در cache missها (L1/L2) شده
* البته در برخی بنچمارکها (مثلاً کامپایلر Go) ممکن است کمی افت عملکرد (\~۰.۵٪) دیده شود که در حال بررسی است
🧪 نحوه استفاده و فعالسازی:
* ویژگی Experimental است و میتوانید آن را بهصورت آزمایشی با:
GOEXPERIMENT=greenteagc go test ./...
فعال کنید .
* هدف این است که بتوان آن را در Go 1.25 بهعنوان یک گزینه فعالشدنی استفاده کرد، و ارزیابی واقعی روی پروژهها صورت گیرد
✍️ مثال فرضی استفاده:
فرض کنید برنامهای سرویسمحور دارید که بهطرز چشمگیری اشیاء کوچک ایجاد میکند (مثلاً در لایهی JSON/API). با فعال کردن Green Tea:
درواقعه * GC حافظه را بلوکی اسکن میکند، نه شیء به شیء.
* بار CPU مربوط به GC کاهش مییابد و کارایی کلی اپلیکیشن بهتر میشود.
بهعنوان مثال ساده:
func handler(w http.ResponseWriter, r *http.Request) {
// بارگذاری و پردازش داده های کوچک متعدد
blobs := make([]*MyStruct, 1000)
for i := range blobs {
blobs[i] = &MyStruct{/*...*/}
}
// استفاده از blobs
}
وقتی quotaی garbage ایجاد میشود، جدیدترین GC بهجای اسکن ۱۰۰۰ شیء، spans را اسکن میکند و locality را حفظ میکند، بهینهتر عمل مینماید.
✅ جمعبندی:
* این Green Tea GC الگوریتمی توپولوژی-آگاه است که با توجه به ساختار حافظه سیستم، عملکرد marking را بهینه میکند.
* برای برنامههایی که اشیاء کوچک زیادی ایجاد میکنند و به performance حساس هستند، میتواند ۱۰–۵۰٪ کاهش در overhead GC فراهم کند.
* هنوز آزمایشیست؛ برای فعالسازی از
GOEXPERIMENT=greenteagc
استفاده کنید و توصیه میشود تستهای منتها اجرا دقیق انجام دهید.➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍3❤1
Forwarded from DevOps Labdon
🔵 عنوان مقاله
How Google Cloud is securing open-source credentials at scale (3 minute read)
🟢 خلاصه مقاله:
Google Cloud ابزار اسکنی را توسعه داده است که به صورت خودکار اطلاعات کاربری فاششده را در آثار متنباز، از جمله بستهها و تصاویر داکر، شناسایی میکند. این امر به حفاظت از سوء استفاده و بهبود امنیت در زنجیره تامین نرمافزار کمک میکند. این سیستم امکان رفع سریع موارد فاششده دادههای کاربری را فراهم میآورد. به زودی، این ابزار توسعه یافته و شامل اعتبارات طرفهای ثالث و پوشش گستردهتری از پلتفرمهای متنباز خواهد شد. این پیشرفتها عناصر کلیدی هستند که به بهبود قابل توجهی در امنیت توزیع نرمافزار کمک میکنند و به مدیریت بهتر ریسکهای امنیتی مرتبط با نشت اطلاعات محرمانه و احراز هویت میپردازند.
🟣لینک مقاله:
https://cloud.google.com/blog/products/identity-security/securing-open-source-credentials-at-scale/?utm_source=tldrdevops
➖➖➖➖➖➖➖➖
👑 @DevOps_Labdon
How Google Cloud is securing open-source credentials at scale (3 minute read)
🟢 خلاصه مقاله:
Google Cloud ابزار اسکنی را توسعه داده است که به صورت خودکار اطلاعات کاربری فاششده را در آثار متنباز، از جمله بستهها و تصاویر داکر، شناسایی میکند. این امر به حفاظت از سوء استفاده و بهبود امنیت در زنجیره تامین نرمافزار کمک میکند. این سیستم امکان رفع سریع موارد فاششده دادههای کاربری را فراهم میآورد. به زودی، این ابزار توسعه یافته و شامل اعتبارات طرفهای ثالث و پوشش گستردهتری از پلتفرمهای متنباز خواهد شد. این پیشرفتها عناصر کلیدی هستند که به بهبود قابل توجهی در امنیت توزیع نرمافزار کمک میکنند و به مدیریت بهتر ریسکهای امنیتی مرتبط با نشت اطلاعات محرمانه و احراز هویت میپردازند.
🟣لینک مقاله:
https://cloud.google.com/blog/products/identity-security/securing-open-source-credentials-at-scale/?utm_source=tldrdevops
➖➖➖➖➖➖➖➖
👑 @DevOps_Labdon
Google Cloud Blog
Securing open-source credentials at scale | Google Cloud Blog
We’ve developed a powerful tool to scan open-source package and image files by default for leaked Google Cloud credentials. Here’s how to use it.
🔵 عنوان مقاله
Cross-Compiling 10,000+ Go CLI Packages Statically
🟢 خلاصه مقاله:
مقاله به بررسی رویکرد جدید و غیرمعمول در ساخت ابزارهای خط فرمان Go به عنوان باینریهای استاتیک با استفاده از زنجیره ابزار Zig میپردازد. این روش با هدف سادهسازی استفاده از این ابزارها برای کاربرانی که زنجیره ابزار Go را نصب نکردهاند، انتخاب شدهاست. استفاده از باینریهای استاتیک باعث حذف نیاز به مدیریت وابستگیها و پیکربندیهای مرتبط با محیط Go میشود، و در نتیجه تجربه کاربری آسانتری را فراهم میآورد. این رویکرد نه تنها روند استقرار نرمافزار را سادهتر میکند بلکه دسترسی گستردهتری به ابزارهای CLI Go را برای تعداد بیشتری از کاربران فراهم میآورد.
🟣لینک مقاله:
https://golangweekly.com/link/171250/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Cross-Compiling 10,000+ Go CLI Packages Statically
🟢 خلاصه مقاله:
مقاله به بررسی رویکرد جدید و غیرمعمول در ساخت ابزارهای خط فرمان Go به عنوان باینریهای استاتیک با استفاده از زنجیره ابزار Zig میپردازد. این روش با هدف سادهسازی استفاده از این ابزارها برای کاربرانی که زنجیره ابزار Go را نصب نکردهاند، انتخاب شدهاست. استفاده از باینریهای استاتیک باعث حذف نیاز به مدیریت وابستگیها و پیکربندیهای مرتبط با محیط Go میشود، و در نتیجه تجربه کاربری آسانتری را فراهم میآورد. این رویکرد نه تنها روند استقرار نرمافزار را سادهتر میکند بلکه دسترسی گستردهتری به ابزارهای CLI Go را برای تعداد بیشتری از کاربران فراهم میآورد.
🟣لینک مقاله:
https://golangweekly.com/link/171250/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Package Forge
Cross-Compiling 10,000+ Go CLI Packages Statically
The Largest Collection of Pre-Compiled Go Static Binaries
❤2🔥1
Forwarded from AI Labdon
✍️Alireza KiakojouriAlireza Kiakojouri
بنیانگذار تلگرام: ChatGPT فکر نمیکند، فقط حرف میزند!/ پروژهی مخفی برادران دورف چیست؟
پاول دورف به نشریه فرانسوی «لو پوئن» گفت: «مدلهای هوش مصنوعی مثل ChatGPT فکر نمیکنند. فقط مقدار زیادی متن خواندهاند و پاسخی میدهند که به نظر درست میآید. اما واقعاً نمیفهمند و ما انسانها چون زبان پیچیده را نشانه هوش میدانیم، فریب میخوریم. مدلهای زبانی فقط حرف میزنند. اما این به معنای فهمیدن یا فکر کردن نیست.»
پاول میگوید برادرش (نیکلای دورف) اکنون روی ساخت مدلی کار میکند که واقعاً بتواند منطق را درک کند، تصمیم بگیرد و دنیای واقعی را بفهمد. او مدعی است این پروژه چیزی فراتر از مدلهای زبانی فعلی است.
در حالی که غولهایی مانند OpenAI، گوگل، متا و حتی چین و روسیه در حال رقابت برای ساخت نسل بعدی هوش مصنوعی (AGI) هستند، پروژه نیکلای دورف میتواند معادلات را تغییر دهد.
اگر پروژه نیکلای موفق شود، ما شاهد تولد هوش مصنوعیای خواهیم بود که فقط «هوشمندانه صحبت نمیکند»، بلکه واقعاً میفهمد، فکر میکند و تصمیم میگیرد.
بنیانگذار تلگرام: ChatGPT فکر نمیکند، فقط حرف میزند!/ پروژهی مخفی برادران دورف چیست؟
پاول دورف به نشریه فرانسوی «لو پوئن» گفت: «مدلهای هوش مصنوعی مثل ChatGPT فکر نمیکنند. فقط مقدار زیادی متن خواندهاند و پاسخی میدهند که به نظر درست میآید. اما واقعاً نمیفهمند و ما انسانها چون زبان پیچیده را نشانه هوش میدانیم، فریب میخوریم. مدلهای زبانی فقط حرف میزنند. اما این به معنای فهمیدن یا فکر کردن نیست.»
پاول میگوید برادرش (نیکلای دورف) اکنون روی ساخت مدلی کار میکند که واقعاً بتواند منطق را درک کند، تصمیم بگیرد و دنیای واقعی را بفهمد. او مدعی است این پروژه چیزی فراتر از مدلهای زبانی فعلی است.
در حالی که غولهایی مانند OpenAI، گوگل، متا و حتی چین و روسیه در حال رقابت برای ساخت نسل بعدی هوش مصنوعی (AGI) هستند، پروژه نیکلای دورف میتواند معادلات را تغییر دهد.
اگر پروژه نیکلای موفق شود، ما شاهد تولد هوش مصنوعیای خواهیم بود که فقط «هوشمندانه صحبت نمیکند»، بلکه واقعاً میفهمد، فکر میکند و تصمیم میگیرد.
❤2🔥2🕊2
🔵 عنوان مقاله
Depot Ships Gocache v2 for 4x Faster Go Builds
🟢 خلاصه مقاله:
مقالهی مذکور به بررسی تکنیکهای باندلینگ در محیطهای CI میپردازد که تعداد فراخوانیهای شبکهای را در پروژههای برنامهنویسی با زبان Go از هزاران به صدها مورد کاهش میدهد. این امر منجر به افزایش چشمگیر سرعت و کارایی فرآیندهای ساخت میشود و در نتیجه، زمان لازم برای تکمیل ساختها کاهش مییابد و خطاهای مرتبط با مشکلات شبکه کمتر میشود. این پیشرفت، سرعت و کارایی را در محیطهای توسعهی نرمافزاری که به CI بستگی دارند، بهبود میبخشد.
🟣لینک مقاله:
https://golangweekly.com/link/171251/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Depot Ships Gocache v2 for 4x Faster Go Builds
🟢 خلاصه مقاله:
مقالهی مذکور به بررسی تکنیکهای باندلینگ در محیطهای CI میپردازد که تعداد فراخوانیهای شبکهای را در پروژههای برنامهنویسی با زبان Go از هزاران به صدها مورد کاهش میدهد. این امر منجر به افزایش چشمگیر سرعت و کارایی فرآیندهای ساخت میشود و در نتیجه، زمان لازم برای تکمیل ساختها کاهش مییابد و خطاهای مرتبط با مشکلات شبکه کمتر میشود. این پیشرفت، سرعت و کارایی را در محیطهای توسعهی نرمافزاری که به CI بستگی دارند، بهبود میبخشد.
🟣لینک مقاله:
https://golangweekly.com/link/171251/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Depot
Now available: Gocache v2 for improved Golang build performance
We’re excited to announce Gocache v2, a major step forward in build caching for Go developers. Gocache v2 dramatically reduces build times by efficiently bundling and caching compile and test artifacts, and it’s now available in Depot Cache.
❤1
✍️Behnam Mohammadzadeh
اگر تو زبان Go عمیق شده باشین و سعی کرده باشین با نحوه عملکرد Scheduler آشنا بشین احتمالا Asynchronous Preemption به گوشتون خورده. تو این پست میخوام توضیح بدم که این اتفاق چطور میافته و نحوه عملکردش به چه شکله.
برای شروع شاید بد نباشه که بدونیم asynchronous preemption برای چی به وجود اومد و اصلا چه مشکلی رو حل میکنه؛ به همین منظور با یه مثال پیش میرم.
زمانی که GC میخواد اجرا بشه نیاز به (STW)Stop the World داره که تو این وضعیت باید همه گوروتین ها تو یه safe point متوقف بشن؛ کال شدن فانکشن یک safe point هست که گوروتین در این نقطه میتونه متوقف بشه تا GC کارش رو بدرستی انجام بده. ولی بعضی از گوروتین ها ممکنه موقع اجرا اصلا فانکشن کال نداشته باشن که به این حالت میگن tight loop.
تو این حالت گوروتین وقتی ۱۰ میلی ثانیه اجرا شد یه ترد به اسم sysmon که همیشه بصورت مستقل اجرا میشه میاد تشخیص میده که فلان گوروتین زیادی داره اجرا میشه و باید متوقف بشه تا نوبت به بقیه هم برسه و برای اینکه اون گوروتین رو متوقف کنه یه سیگنال SIGURG میفرسته.
از اونطرف یه گوروتین به اسم gSignal که هر ترد(M) یکی مخصوص خودش رو داره و میاد این سیگنالها رو دریافت و هندل میکنه .
وقتی gSignal میبینه سیگنال دریافتی از نوع SIGURG هست متوجه میشه که باید preemption اتفاق بیافته و میاد چک میکنه که آیا این اتفاق باید بیافته یا نه؟ (از لینک پایین هم میتونید این فانکشن رو ببینید)
https://lnkd.in/d-cad4-C
بعدش میاد چک کنه ببینه که اگه preempt کنیم مشکلی پیش میاد یا نه؟ پس این فانکشن رو کال میکنه
https://lnkd.in/d5HV8Sh9
دلیلش هم اینه که ممکنه این گوروتین در حال کال کردن بعضی از فانکشن های runtime باشه که نباید وسط اجرای اون فانکشن ها preemption اتفاق بیافته؛ و همچنین چک میکنه ببینه stack فضای کافی داره یا نه(چون مرحله بعد بهش نیاز داره).
حالا که به یه safe point رسیدیم میاد و کار خفن اصلی رو انجام میده.
❓همونطور که قبلا دیدیم tight loop هیچ فانکشن کالی نداره! پس چجوری باید گوروتین رو مجبور به اینکار کرد؟
✅ جواب، پوش کردن یک function call instruction به stack frame و تغییر PC هست!
این فانکشن این کار رو انجام میده:
https://lnkd.in/dcReVmHt
این فانکشن اول میاد برای یک instruction جدید داخل stack frame جا باز میکنه و بعد رجیسترهای RSP و RIP رو دستکاری میکنه تا PC به asyncPreempt تغییر کنه و بعد از اینکه اون اجرا شد کد قبلی بطور نرمال مثل گذشته به کارش ادامه بده.
لینک پست در ویرگول:
https://vrgl.ir/CLOKC
اگر تو زبان Go عمیق شده باشین و سعی کرده باشین با نحوه عملکرد Scheduler آشنا بشین احتمالا Asynchronous Preemption به گوشتون خورده. تو این پست میخوام توضیح بدم که این اتفاق چطور میافته و نحوه عملکردش به چه شکله.
برای شروع شاید بد نباشه که بدونیم asynchronous preemption برای چی به وجود اومد و اصلا چه مشکلی رو حل میکنه؛ به همین منظور با یه مثال پیش میرم.
زمانی که GC میخواد اجرا بشه نیاز به (STW)Stop the World داره که تو این وضعیت باید همه گوروتین ها تو یه safe point متوقف بشن؛ کال شدن فانکشن یک safe point هست که گوروتین در این نقطه میتونه متوقف بشه تا GC کارش رو بدرستی انجام بده. ولی بعضی از گوروتین ها ممکنه موقع اجرا اصلا فانکشن کال نداشته باشن که به این حالت میگن tight loop.
تو این حالت گوروتین وقتی ۱۰ میلی ثانیه اجرا شد یه ترد به اسم sysmon که همیشه بصورت مستقل اجرا میشه میاد تشخیص میده که فلان گوروتین زیادی داره اجرا میشه و باید متوقف بشه تا نوبت به بقیه هم برسه و برای اینکه اون گوروتین رو متوقف کنه یه سیگنال SIGURG میفرسته.
از اونطرف یه گوروتین به اسم gSignal که هر ترد(M) یکی مخصوص خودش رو داره و میاد این سیگنالها رو دریافت و هندل میکنه .
وقتی gSignal میبینه سیگنال دریافتی از نوع SIGURG هست متوجه میشه که باید preemption اتفاق بیافته و میاد چک میکنه که آیا این اتفاق باید بیافته یا نه؟ (از لینک پایین هم میتونید این فانکشن رو ببینید)
https://lnkd.in/d-cad4-C
بعدش میاد چک کنه ببینه که اگه preempt کنیم مشکلی پیش میاد یا نه؟ پس این فانکشن رو کال میکنه
https://lnkd.in/d5HV8Sh9
دلیلش هم اینه که ممکنه این گوروتین در حال کال کردن بعضی از فانکشن های runtime باشه که نباید وسط اجرای اون فانکشن ها preemption اتفاق بیافته؛ و همچنین چک میکنه ببینه stack فضای کافی داره یا نه(چون مرحله بعد بهش نیاز داره).
حالا که به یه safe point رسیدیم میاد و کار خفن اصلی رو انجام میده.
❓همونطور که قبلا دیدیم tight loop هیچ فانکشن کالی نداره! پس چجوری باید گوروتین رو مجبور به اینکار کرد؟
✅ جواب، پوش کردن یک function call instruction به stack frame و تغییر PC هست!
این فانکشن این کار رو انجام میده:
https://lnkd.in/dcReVmHt
این فانکشن اول میاد برای یک instruction جدید داخل stack frame جا باز میکنه و بعد رجیسترهای RSP و RIP رو دستکاری میکنه تا PC به asyncPreempt تغییر کنه و بعد از اینکه اون اجرا شد کد قبلی بطور نرمال مثل گذشته به کارش ادامه بده.
لینک پست در ویرگول:
https://vrgl.ir/CLOKC
lnkd.in
LinkedIn
This link will take you to a page that’s not on LinkedIn
❤3
اصطلاح STW یا Stop The World یکی از مفاهیم مهم در پیادهسازی Garbage Collector (GC) در زبانهایی مثل Go، Java و… هست. در ادامه با جزییات کامل بهش میپردازیم:
---
✅ تعریف STW (Stop The World)
> به زبان ساده: GC میگه «همه وایسید! من باید حافظه رو مرتب کنم».
---
📦 چرا GC نیاز به STW داره؟
Garbage Collector برای اینکه بتونه حافظهی بدون استفاده رو شناسایی و آزاد کنه، باید بدونه که:
* چه آبجکتهایی در حال حاضر در دسترس هستن (reachable)
* چه آبجکتهایی دیگه استفاده نمیشن (unreachable)
برای اینکه بتونه این بررسی رو دقیق انجام بده، باید:
* بررسی کنه که stack و heap در هر گوروتین در چه حالتی هستن
* مطمئن باشه که گوروتینها در نقطهای امن (safe point) قرار دارن، یعنی وسط نوشتن یا تغییر دادهای نیستن که باعث اشتباه در تحلیل بشه.
---
🧩 Safe Point یعنی چی؟
Safe point به جایی از اجرای کد گفته میشه که:
* وضعیت حافظه کاملاً قابل پیشبینیه
* گوروتین در حال اجرای عملیات بحرانی نیست
* GC میتونه بدون نگرانی از race condition، وضعیت حافظه رو بررسی و اصلاح کنه
مثلاً:
* موقع فراخوانی تابع
* موقع خروج از تابع
* قبل یا بعد از تخصیص حافظه
---
⚙️ فرآیند STW چطوری کار میکنه در Go؟
1. GC تصمیم میگیره که وقت پاکسازی حافظهست.
2. سیگنالی به تمام گوروتینها میده که باید به safe point برن.
3. وقتی همه گوروتینها به safe point رسیدن، برنامه وارد حالت STW میشه:
* هیچ کدی (حتی گوروتینها) اجرا نمیشن
4. GC با خیال راحت تحلیل حافظه (mark and sweep یا mark and compact) انجام میده.
5. بعد از اتمام کار GC، گوروتینها ادامهی اجرای خودشون رو از سر میگیرن.
---
🕐 STW در Go چقدر طول میکشه؟
در نسخههای جدید Go (مثلاً Go 1.18 به بعد):
* STW بسیار کوتاهه (در حد microsecond)
* Go از تکنیکهای پیشرفته مثل concurrent GC استفاده میکنه تا اکثر مراحل GC همزمان با اجرای برنامه انجام بشن
* فقط بخشهایی مثل شروع و پایان GC نیاز به STW دارن
---
🎯 چرا STW ممکنه مشکلساز بشه؟
اگر STW طولانی بشه:
* زمان پاسخدهی (latency) سیستم زیاد میشه
* در اپلیکیشنهای real-time یا interactive مثل گیم یا APIهای حساس، این تاخیر ممکنه قابلتحمل نباشه
* در برنامههای بزرگ با حافظه زیاد، ممکنه pauseها محسوس بشن
---
✅ تعریف STW (Stop The World)
STW
به وضعیتی در اجرای برنامه گفته میشه که اجرای تمام گوروتینها (یا تردها) متوقف میشن تا Garbage Collector بتونه کار خودش رو انجام بده.> به زبان ساده: GC میگه «همه وایسید! من باید حافظه رو مرتب کنم».
---
📦 چرا GC نیاز به STW داره؟
Garbage Collector برای اینکه بتونه حافظهی بدون استفاده رو شناسایی و آزاد کنه، باید بدونه که:
* چه آبجکتهایی در حال حاضر در دسترس هستن (reachable)
* چه آبجکتهایی دیگه استفاده نمیشن (unreachable)
برای اینکه بتونه این بررسی رو دقیق انجام بده، باید:
* بررسی کنه که stack و heap در هر گوروتین در چه حالتی هستن
* مطمئن باشه که گوروتینها در نقطهای امن (safe point) قرار دارن، یعنی وسط نوشتن یا تغییر دادهای نیستن که باعث اشتباه در تحلیل بشه.
---
🧩 Safe Point یعنی چی؟
Safe point به جایی از اجرای کد گفته میشه که:
* وضعیت حافظه کاملاً قابل پیشبینیه
* گوروتین در حال اجرای عملیات بحرانی نیست
* GC میتونه بدون نگرانی از race condition، وضعیت حافظه رو بررسی و اصلاح کنه
مثلاً:
* موقع فراخوانی تابع
* موقع خروج از تابع
* قبل یا بعد از تخصیص حافظه
---
⚙️ فرآیند STW چطوری کار میکنه در Go؟
1. GC تصمیم میگیره که وقت پاکسازی حافظهست.
2. سیگنالی به تمام گوروتینها میده که باید به safe point برن.
3. وقتی همه گوروتینها به safe point رسیدن، برنامه وارد حالت STW میشه:
* هیچ کدی (حتی گوروتینها) اجرا نمیشن
4. GC با خیال راحت تحلیل حافظه (mark and sweep یا mark and compact) انجام میده.
5. بعد از اتمام کار GC، گوروتینها ادامهی اجرای خودشون رو از سر میگیرن.
---
🕐 STW در Go چقدر طول میکشه؟
در نسخههای جدید Go (مثلاً Go 1.18 به بعد):
* STW بسیار کوتاهه (در حد microsecond)
* Go از تکنیکهای پیشرفته مثل concurrent GC استفاده میکنه تا اکثر مراحل GC همزمان با اجرای برنامه انجام بشن
* فقط بخشهایی مثل شروع و پایان GC نیاز به STW دارن
---
🎯 چرا STW ممکنه مشکلساز بشه؟
اگر STW طولانی بشه:
* زمان پاسخدهی (latency) سیستم زیاد میشه
* در اپلیکیشنهای real-time یا interactive مثل گیم یا APIهای حساس، این تاخیر ممکنه قابلتحمل نباشه
* در برنامههای بزرگ با حافظه زیاد، ممکنه pauseها محسوس بشن
❤3
برای دیدن نمودار و لاگهای واقعی اجرای GC در برنامه Go (و بررسی دقیق زمانهای STW)، میتونید از ابزارهای داخلی خود Go استفاده کنید..
🔧 مرحله 1: فعالسازی لاگ GC در Go
برای گرفتن لاگ دقیق GC، برنامهات رو با تنظیم متغیر
یا اگه داخل کد میخوای فعال کنی:
---
📜 نمونه لاگ واقعی GC در Go:
مثال خروجی لاگ با
🧩 تحلیل این لاگ:
|
|
|
|
|
|
|
|
---
📊 مرحله 2: گرفتن نمودار GC (با
1. اضافه کردن HTTP profiling:
2. اجرای برنامه و گرفتن پروفایل GC:
در ترمینال جدید:
یا برای لاگ GC دقیقتر:
سپس داخل مرورگر:
میتونی نمودارهای flamegraph، timeline و heap را ببینی.
---
✅ خلاصه
|
|
|
|
🔧 مرحله 1: فعالسازی لاگ GC در Go
برای گرفتن لاگ دقیق GC، برنامهات رو با تنظیم متغیر
GODEBUG
اجرا کن:GODEBUG=gctrace=1 ./your_program
یا اگه داخل کد میخوای فعال کنی:
import "runtime/debug"
func main() {
debug.SetGCPercent(100) // یا مقدار دلخواه
// بقیه کدها
}
---
📜 نمونه لاگ واقعی GC در Go:
مثال خروجی لاگ با
GODEBUG=gctrace=1
:gc 1 @0.004s 8%: 0.48+1.5+0.015 ms clock, 1.4+0.72/1.8/0+0.045 ms cpu, 4->4->2 MB, 5 MB goal, 4 P
🧩 تحلیل این لاگ:
|
gc 1
| شمارنده اجرای GC (این بار اولیه) ||
@0.004s
| زمان اجرای GC (۴ میلیثانیه بعد از شروع برنامه) ||
8%
| درصد زمانی که GC نسبت به زمان اجرای برنامه گرفته ||
0.48+1.5+0.015 ms clock
| ۳ فاز GC به ترتیب: STW شروع + Marking (concurrent) + STW پایان ||
1.4+0.72/1.8/0+0.045 ms cpu
| مصرف CPU در مراحل مختلف ||
4->4->2 MB
| حجم heap قبل، بعد از marking، بعد از sweep ||
5 MB goal
| هدف بعدی برای heap ||
4 P
| تعداد پردازندههای منطقی (GOMAXPROCS) |---
📊 مرحله 2: گرفتن نمودار GC (با
pprof
)1. اضافه کردن HTTP profiling:
import _ "net/http/pprof"
import "net/http"
go func() {
http.ListenAndServe("localhost:6060", nil)
}()
2. اجرای برنامه و گرفتن پروفایل GC:
در ترمینال جدید:
go tool pprof http://localhost:6060/debug/pprof/heap
یا برای لاگ GC دقیقتر:
go tool pprof -http=:8080 http://localhost:6060/debug/pprof/goroutine
سپس داخل مرورگر:
http://localhost:8080
میتونی نمودارهای flamegraph، timeline و heap را ببینی.
---
✅ خلاصه
|
GODEBUG=gctrace=1
| لاگ دقیق از اجرای GC و زمان STW ||
runtime/pprof
+ net/http/pprof
| ساختن پروفایلهای گرافیکی ||
go tool pprof
| بررسی گرافیکی یا CLI لاگها و ساخت flamegraph ||
debug.SetGCPercent
| تنظیم حساسیت GC |❤5🍾1
🔵 عنوان مقاله
Open Source Outbound Webhooks Infrastructure
🟢 خلاصه مقاله:
مقاله به بررسی ابزار نرمافزاری ساخته شده با زبان برنامهنویسی Go میپردازد که دارای ویژگیهای متعددی از جمله مقصدهای رویداد، تلاشهای مجدد، اشتراک در موضوعات، OpenTelemetry، هشدارهای خطا و پورتال کاربری است. این ابزار با فراهم کردن قابلیتهایی برای بهبود کارایی و اطمینان سیستم، امکان مدیریت بهتر و موثرتر دادهها و رویدادها را به کاربران میدهد.
🟣لینک مقاله:
https://golangweekly.com/link/170945/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Open Source Outbound Webhooks Infrastructure
🟢 خلاصه مقاله:
مقاله به بررسی ابزار نرمافزاری ساخته شده با زبان برنامهنویسی Go میپردازد که دارای ویژگیهای متعددی از جمله مقصدهای رویداد، تلاشهای مجدد، اشتراک در موضوعات، OpenTelemetry، هشدارهای خطا و پورتال کاربری است. این ابزار با فراهم کردن قابلیتهایی برای بهبود کارایی و اطمینان سیستم، امکان مدیریت بهتر و موثرتر دادهها و رویدادها را به کاربران میدهد.
🟣لینک مقاله:
https://golangweekly.com/link/170945/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Hookdeck
Outpost - Open source outbound webhooks and event destinations infrastructure
Manage and deliver platform events directly to your users' preferred event destinations: Webhooks, Hookdeck Event Gateway, AWS SQS, RabbitMQ, GCP Pub/Sub, Amazon EventBridge, and Kafka.
❤1🔥1🍾1
🔵 عنوان مقاله
😅 (Ab)using Channels to Implement a 3D Pipe Game
🟢 خلاصه مقاله:
مقالهای که بررسی شده، به بررسی استفاده از کانالها به عنوان "لولهها" در بازیها میپردازد. کانالها در برنامهنویسی برای انتقال اطلاعات بین فرآیندها به کار میروند. این مقاله پیشنهاد میکند که از این کانالها برای انتقال دادههای بازی مانند امتیازات، دادههای بازیکنان، یا اطلاعات حالت بازی استفاده شود که میتواند به سادهسازی جریان دادهها و افزایش انعطافپذیری و قابلیت گسترش معماری بازی کمک کند. همچنین، این رویکرد میتواند تجربههای بازی نوآورانهای را فراهم آورد و بازیها را دینامیکتر و جذابتر برای بازیکنان کند.
🟣لینک مقاله:
https://golangweekly.com/link/171245/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
😅 (Ab)using Channels to Implement a 3D Pipe Game
🟢 خلاصه مقاله:
مقالهای که بررسی شده، به بررسی استفاده از کانالها به عنوان "لولهها" در بازیها میپردازد. کانالها در برنامهنویسی برای انتقال اطلاعات بین فرآیندها به کار میروند. این مقاله پیشنهاد میکند که از این کانالها برای انتقال دادههای بازی مانند امتیازات، دادههای بازیکنان، یا اطلاعات حالت بازی استفاده شود که میتواند به سادهسازی جریان دادهها و افزایش انعطافپذیری و قابلیت گسترش معماری بازی کمک کند. همچنین، این رویکرد میتواند تجربههای بازی نوآورانهای را فراهم آورد و بازیها را دینامیکتر و جذابتر برای بازیکنان کند.
🟣لینک مقاله:
https://golangweekly.com/link/171245/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
jro.sg
(Ab)using channels to implement a 3D pipe game
Channels? Did you mean 'fancy pipes'?
❤3🍾1
🔴قابلیت Anti‑CSRF protection ویژگی های جدید گولنگ نسخه 1.25
در Go 1.25، قابلیت جدیدی با نام Anti‑CSRF protection (محافظت در برابر CSRF) از طریق نوع جدید `http.CrossOriginProtection` معرفی شده است. این ویژگی بدون نیاز به توکن یا کوکی اضافی، حملات CSRF را با استفاده از اطلاعات Fetch metadata مرورگر مهار میکند.
---
🧠 چطوری کار میکنه؟
* این محافظ درخواستهای ناامن cross-origin را بلاک میکند**، خصوصاً برای متدهایی مثل `POST`, `PUT`, یا `DELETE`
* با استفاده از هدر `Sec-Fetch-Site` برای تشخیص اینکه درخواست واقعاً متعلق به دامنه میزبان است یا خیر
* در صورتی که این هدر موجود نباشد، از هدر `Origin` استفاده میکند و آن را با `Host` مقایسه میکند ([tip.golang.org][1], [antonz.org][2])
* متدهای `GET`, `HEAD` و `OPTIONS` همیشه مجاز هستند چون تغییر حالت سرور محسوب نمیشن
💻 مثال کاربردی
``` go
package main
import (
"io"
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/get", func(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "GET ok\n")
})
mux.HandleFunc("/post", func(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "POST ok\n")
})
anti := http.NewCrossOriginProtection()
anti.AddTrustedOrigin("https://example.com")
anti.AddTrustedOrigin("https://*.example.com")
srv := &http.Server{
Addr: ":8080",
Handler: anti.Handler(mux),
}
log.Fatal(srv.ListenAndServe())
}
```
🧪 رفتارها:
درخواست محلی معتبر:
→ خروجی:
* درخواست cross-origin با هدر sec-fetch-site اشتباه:
→ پاسخ:
* درخواست Origin متفاوت از Host و بدون sec-fetch-site:
→ پاسخ:
* درخواست از یک origin مورد اعتماد:
→ خروجی:
* درخواست GET از هر origin:
→ خروجی:
---
✅ جمعبندی
| 💡 استفاده آسان | فقط wrap کردن
| 🔐 بدون توکن اضافی | با استفاده از دادههای Fetch metadata |
| 🔄 فعالسازی برای همه
| 🎯 امکان تعریف originهای قابلاعتماد | با
| 🧭 پشتیبانی مرورگرهای مدرن و fallback برای مرورگرهای قدیمی | استفاده از
در Go 1.25، قابلیت جدیدی با نام Anti‑CSRF protection (محافظت در برابر CSRF) از طریق نوع جدید `http.CrossOriginProtection` معرفی شده است. این ویژگی بدون نیاز به توکن یا کوکی اضافی، حملات CSRF را با استفاده از اطلاعات Fetch metadata مرورگر مهار میکند.
---
🧠 چطوری کار میکنه؟
* این محافظ درخواستهای ناامن cross-origin را بلاک میکند**، خصوصاً برای متدهایی مثل `POST`, `PUT`, یا `DELETE`
* با استفاده از هدر `Sec-Fetch-Site` برای تشخیص اینکه درخواست واقعاً متعلق به دامنه میزبان است یا خیر
* در صورتی که این هدر موجود نباشد، از هدر `Origin` استفاده میکند و آن را با `Host` مقایسه میکند ([tip.golang.org][1], [antonz.org][2])
* متدهای `GET`, `HEAD` و `OPTIONS` همیشه مجاز هستند چون تغییر حالت سرور محسوب نمیشن
💻 مثال کاربردی
``` go
package main
import (
"io"
"log"
"net/http"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/get", func(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "GET ok\n")
})
mux.HandleFunc("/post", func(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "POST ok\n")
})
anti := http.NewCrossOriginProtection()
anti.AddTrustedOrigin("https://example.com")
anti.AddTrustedOrigin("https://*.example.com")
srv := &http.Server{
Addr: ":8080",
Handler: anti.Handler(mux),
}
log.Fatal(srv.ListenAndServe())
}
```
🧪 رفتارها:
درخواست محلی معتبر:
curl -X POST http://localhost:8080/post \
-H "sec-fetch-site:same-origin"
→ خروجی:
POST ok
* درخواست cross-origin با هدر sec-fetch-site اشتباه:
curl -X POST http://localhost:8080/post \
-H "sec-fetch-site:cross-site"
→ پاسخ:
cross-origin request detected from Sec-Fetch-Site header
* درخواست Origin متفاوت از Host و بدون sec-fetch-site:
curl -X POST http://localhost:8080/post \
-H "origin:https://evil.com" \
-H "host:localhost"
→ پاسخ:
cross-origin request detected, and/or browser is out of date: Sec-Fetch-Site is missing, and Origin does not match Host
* درخواست از یک origin مورد اعتماد:
curl -X POST http://localhost:8080/post \
-H "origin:https://example.com" \
-H "host:localhost"
→ خروجی:
POST ok
* درخواست GET از هر origin:
curl http://localhost:8080/get \
-H "origin:https://evil.com"
→ خروجی:
GET ok
---
✅ جمعبندی
| 💡 استفاده آسان | فقط wrap کردن
http.Handler
با CrossOriginProtection
|| 🔐 بدون توکن اضافی | با استفاده از دادههای Fetch metadata |
| 🔄 فعالسازی برای همه
non-safe
متدها | بهصورت پیشفرض || 🎯 امکان تعریف originهای قابلاعتماد | با
AddTrustedOrigin
|| 🧭 پشتیبانی مرورگرهای مدرن و fallback برای مرورگرهای قدیمی | استفاده از
Origin
در صورت نبود Sec-Fetch-Site
|❤2🍾1
🔴قابلیت
در Go نسخه 1.25، ویژگی جدیدی به نام
ابزاری سبک برای ثبت رخدادهای اخیر اجرای برنامه، بدون نیاز به فعال بودن کامل `trace` در تمام مدت.
---
🧠 این FlightRecorder چیه؟
📌 بهصورت خلاصه:
* یک (circular buffer) برای traceهای اجرا است.
* همیشه در پسزمینه اجرا میشود، اما فقط دادههای اخیر را نگه میدارد.
* زمانی که نیاز داری (مثلاً هنگام خطا یا کندی)، میتونی trace لحظهای رو ازش دریافت کنی.
این ویژگی برای debug کردن اتفاقاتی که چند ثانیه قبل از یک مشکل رخ دادهاند بسیار مفیده.
---
⚙️ چطور کار میکنه؟
1. ابتدا
2. و
3. برنامه اجرا میشود و FlightRecorder رخدادهای اخیر را ذخیره میکند.
4. در لحظهای خاص (مثلاً هنگام خطا)، میتونیم trace را در فایل بنویسیم با
---
✨ مثال کامل:
🔍 بررسی trace
برای مشاهده خروجی
یک رابط گرافیکی در مرورگر باز میشود که:
* goroutineها
* block/wait
* garbage collection
* system callها
* و delayها را نمایش میدهد.
---
🟢 مزایا
| سبک و کمهزینه | همیشه در حال اجرا است اما فقط بخشی از اطلاعات را نگه میدارد. |
| برای production مناسب | نیاز به فعالسازی trace کامل نیست. |
| ابزار عالی برای تحلیل post-mortem | مخصوصاً وقتی crash یا slowdown بدون هشدار قبلی رخ داده. |
| کاملاً سازگار با `go tool trace` | بدون نیاز به ابزار جدید. |
FlightRecorder
ویژگی های جدید گولنگ نسخه 1.25در Go نسخه 1.25، ویژگی جدیدی به نام
FlightRecorder
در پکیج `runtime/trace` معرفی شده ابزاری سبک برای ثبت رخدادهای اخیر اجرای برنامه، بدون نیاز به فعال بودن کامل `trace` در تمام مدت.
---
🧠 این FlightRecorder چیه؟
📌 بهصورت خلاصه:
* یک (circular buffer) برای traceهای اجرا است.
* همیشه در پسزمینه اجرا میشود، اما فقط دادههای اخیر را نگه میدارد.
* زمانی که نیاز داری (مثلاً هنگام خطا یا کندی)، میتونی trace لحظهای رو ازش دریافت کنی.
این ویژگی برای debug کردن اتفاقاتی که چند ثانیه قبل از یک مشکل رخ دادهاند بسیار مفیده.
---
⚙️ چطور کار میکنه؟
1. ابتدا
trace.NewFlightRecorder(config)
را میسازیم.2. و
rec.Start()
را فراخوانی میکنیم.3. برنامه اجرا میشود و FlightRecorder رخدادهای اخیر را ذخیره میکند.
4. در لحظهای خاص (مثلاً هنگام خطا)، میتونیم trace را در فایل بنویسیم با
rec.WriteTo()
.---
✨ مثال کامل:
package main
import (
"fmt"
"log"
"os"
"runtime/trace"
"time"
)
func main() {
// ۱. پیکربندی Recorder
cfg := trace.FlightRecorderConfig{
MinAge: 5 * time.Second, // حداقل مدت نگهداری اطلاعات
MaxBytes: 3 << 20, // 3 مگابایت بافر
}
rec := trace.NewFlightRecorder(cfg)
// ۲. شروع ضبط
if err := rec.Start(); err != nil {
log.Fatal(err)
}
defer rec.Stop()
// ۳. شبیهسازی اجرای برنامه
fmt.Println("⏳ برنامه در حال اجراست...")
time.Sleep(7 * time.Second) // این زمان trace میشود
// ۴. ذخیره trace هنگام رخداد خاص
f, _ := os.Create("flight.out")
defer f.Close()
if n, err := rec.WriteTo(f); err != nil {
log.Fatal("❌ خطا در نوشتن trace:", err)
} else {
fmt.Printf("✅ trace نوشته شد (%d bytes)\n", n)
}
}
🔍 بررسی trace
برای مشاهده خروجی
.out
:go tool trace flight.out
یک رابط گرافیکی در مرورگر باز میشود که:
* goroutineها
* block/wait
* garbage collection
* system callها
* و delayها را نمایش میدهد.
---
🟢 مزایا
| سبک و کمهزینه | همیشه در حال اجرا است اما فقط بخشی از اطلاعات را نگه میدارد. |
| برای production مناسب | نیاز به فعالسازی trace کامل نیست. |
| ابزار عالی برای تحلیل post-mortem | مخصوصاً وقتی crash یا slowdown بدون هشدار قبلی رخ داده. |
| کاملاً سازگار با `go tool trace` | بدون نیاز به ابزار جدید. |
❤7
🔵 عنوان مقاله
How to Manage Configuration Settings in Go Webapps
🟢 خلاصه مقاله:
در مقالهای توسط الکس، روشهای مختلف ارسال پیکربندی به یک برنامه تشریح شدهاست که شامل استفاده از پارامترهای CLI، متغیرهای محیطی، و فایلهای پیکربندی میشود. هر کدام از این روشها مزایا و قابلیتهای خاص خود را دارند و انتخاب مناسب بستگی به ترجیحات شخصی و نیازهای برنامه دارد. الکس با بررسی مزایا و معایب هر روش، ترجیحات خود را بیان میکند و ذکر میکند که انتخاب روش پیکربندی بستگی به نیازهای خاص برنامهای که روی آن کار میشود، دارد.
🟣لینک مقاله:
https://golangweekly.com/link/171246/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
How to Manage Configuration Settings in Go Webapps
🟢 خلاصه مقاله:
در مقالهای توسط الکس، روشهای مختلف ارسال پیکربندی به یک برنامه تشریح شدهاست که شامل استفاده از پارامترهای CLI، متغیرهای محیطی، و فایلهای پیکربندی میشود. هر کدام از این روشها مزایا و قابلیتهای خاص خود را دارند و انتخاب مناسب بستگی به ترجیحات شخصی و نیازهای برنامه دارد. الکس با بررسی مزایا و معایب هر روش، ترجیحات خود را بیان میکند و ذکر میکند که انتخاب روش پیکربندی بستگی به نیازهای خاص برنامهای که روی آن کار میشود، دارد.
🟣لینک مقاله:
https://golangweekly.com/link/171246/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
www.alexedwards.net
How to manage configuration settings in Go web applications - Alex Edwards
❤3
Forwarded from 𓄂 Bardia 𓆃
🤖 علاقهمند به دنیای هوش مصنوعی هستی؟
دنبال میکنی که چطور AI داره دنیا رو متحول میکنه؟
پس جای درستی اومدی!
🎯 در کانال ما هر روز:
🔍 جدیدترین اخبار و دستاوردهای دنیای AI
🧠 تحلیل تخصصی در حوزه یادگیری ماشین، دیپ لرنینگ و مدلهای زبانی
💼 بررسی کاربردهای هوش مصنوعی در پزشکی، صنعت، آموزش، امنیت و اقتصاد
🛠 معرفی ابزارها، دورهها و منابع یادگیری
📈 بررسی ترندها و آینده فناوریهای مرتبط با هوش مصنوعی
همهی اینها به زبان ساده، خلاصه و قابل فهم برای همه علاقهمندان — از مبتدی تا حرفهای
👇👇👇👇👇
https://t.me/ai_labdon
دنبال میکنی که چطور AI داره دنیا رو متحول میکنه؟
پس جای درستی اومدی!
🎯 در کانال ما هر روز:
🔍 جدیدترین اخبار و دستاوردهای دنیای AI
🧠 تحلیل تخصصی در حوزه یادگیری ماشین، دیپ لرنینگ و مدلهای زبانی
💼 بررسی کاربردهای هوش مصنوعی در پزشکی، صنعت، آموزش، امنیت و اقتصاد
🛠 معرفی ابزارها، دورهها و منابع یادگیری
📈 بررسی ترندها و آینده فناوریهای مرتبط با هوش مصنوعی
همهی اینها به زبان ساده، خلاصه و قابل فهم برای همه علاقهمندان — از مبتدی تا حرفهای
👇👇👇👇👇
https://t.me/ai_labdon
❤2
🔵 عنوان مقاله
Fix Go Bugs and Bottlenecks Fast with AppSignal
🟢 خلاصه مقاله:
AppSignal یک ابزار مفید برای برنامه نویسان زبان Go است که به آنها امکان تشخیص و رفع اشکال، پیگیری مشکلات عملکردی و انتشار برنامهها با اعتماد به نفس را میدهد. این ابزار، که استفاده از آن آسان و مخصوص تیمهایی است که به کد خود اهمیت میدهند، به راحتی نصب میشود. AppSignal به کاربران جدید اجازه میدهد تا با یک دوره آزمایشی رایگان که نیاز به اطلاعات کارت اعتباری ندارد، شروع به کار کنند.
🟣لینک مقاله:
https://golangweekly.com/link/171236/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Fix Go Bugs and Bottlenecks Fast with AppSignal
🟢 خلاصه مقاله:
AppSignal یک ابزار مفید برای برنامه نویسان زبان Go است که به آنها امکان تشخیص و رفع اشکال، پیگیری مشکلات عملکردی و انتشار برنامهها با اعتماد به نفس را میدهد. این ابزار، که استفاده از آن آسان و مخصوص تیمهایی است که به کد خود اهمیت میدهند، به راحتی نصب میشود. AppSignal به کاربران جدید اجازه میدهد تا با یک دوره آزمایشی رایگان که نیاز به اطلاعات کارت اعتباری ندارد، شروع به کار کنند.
🟣لینک مقاله:
https://golangweekly.com/link/171236/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Application Monitoring for Ruby on Rails, Elixir, Node.js & Python
AppSignal APM offers error tracking, performance monitoring, dashboards, host metrics, and alerts. Built for Ruby, Ruby on Rails, Elixir, Node.js, and JavaScript.
❤2
🔴قابلیت sync.WaitGroup ویژگی های جدید گولنگ نسخه 1.25
در نسخه Go 1.25**، یک متد جدید به `sync.WaitGroup` اضافه شده به نام
🧠 چرا
در نسخههای قبلی برای اجرای goroutine همراه با شمارنده
روش قدیمی:
اگر
---
✅ روش جدید:
در Go 1.25، این الگو ساده شده:
همزمان
✨ مثال کامل
خروجی ممکن:
📌 مزایای
| مزیت | توضیح |
| -------------------------------------- | ---------------------------- |
| ✅ کد تمیزتر | نیازی به
| 🧠 جلوگیری از خطاهای رایج | مثل فراموشی
| 🧵 مناسب برای patternهای goroutine سبک | موازیسازی سریع و امن |
---
⚠️ نکته مهم
*
* برای استفاده از آن، باید مطمئن باشید که پروژهتان با Go 1.25 یا بالاتر کامپایل میشود.
* این متد دقیقاً مثل
در نسخه Go 1.25**، یک متد جدید به `sync.WaitGroup` اضافه شده به نام
Go()
** که هدفش سادهسازی اجرای goroutineها همراه با شمارندهی WaitGroup است.🧠 چرا
WaitGroup.Go()
اضافه شده؟در نسخههای قبلی برای اجرای goroutine همراه با شمارنده
WaitGroup`، باید دستی `Add()
و Done()
را بنویسید:روش قدیمی:
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
doWork()
}()
اگر
Add
یا Done
را فراموش میکردی یا ترتیبش اشتباه بود، ممکن بود برنامه بنبست (deadlock) بشه یا goroutineها نشمارده بشن.---
✅ روش جدید:
wg.Go(fn)
در Go 1.25، این الگو ساده شده:
var wg sync.WaitGroup
wg.Go(func() {
doWork()
})
همزمان
Add(1)
انجام میشه و داخل goroutine بهطور خودکار Done()
صدا زده میشه—دیگه لازم نیست دستی چیزی بنویسی.✨ مثال کامل
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
i := i // capture variable
wg.Go(func() {
fmt.Println("working on task", i)
})
}
wg.Wait()
fmt.Println("All tasks done.")
}
خروجی ممکن:
working on task 0
working on task 1
working on task 2
All tasks done.
📌 مزایای
Go()
| مزیت | توضیح |
| -------------------------------------- | ---------------------------- |
| ✅ کد تمیزتر | نیازی به
Add
و Done
نیست || 🧠 جلوگیری از خطاهای رایج | مثل فراموشی
Done()
|| 🧵 مناسب برای patternهای goroutine سبک | موازیسازی سریع و امن |
---
⚠️ نکته مهم
*
Go()
فقط از Go 1.25 در دسترس است.* برای استفاده از آن، باید مطمئن باشید که پروژهتان با Go 1.25 یا بالاتر کامپایل میشود.
* این متد دقیقاً مثل
go func(){...}()
عمل میکند، فقط با مدیریت داخلی Add
و Done
.👍4❤3🔥3🎉1
Forwarded from Software Engineer Labdon
فهرستی ارزشمند برای برنامهنویسان حرفهای. مناسب برای توسعهدهندگان بکاند، فرانتاند، دواپس و برنامهنویسان عمومی.
https://github.com/charlax/professional-programming
https://github.com/charlax/professional-programming
🍾3🔥1
🔵 عنوان مقاله
🎨 Colorspace: Color Space Conversion Library
🟢 خلاصه مقاله:
این مقاله با بررسی فضاهای رنگی مختلف مانند sRGB و sRGB خطی، فضای رنگی CIE XYZ و فضاهای رنگی نوظهور OKLAB و OKLCH به بررسی پیشرفتها در تکنیکهای دستکاری رنگ میپردازد. هدف از این بررسیها، بهبود تبدیلهای رنگی و ایجاد امکان تنظیمات رنگی دقیقتر است. به خصوص، فضاهای رنگی جدید مانند OKLAB و OKLCH، به منظور تسهیل در اجرای تغییرات رنگی منظم و دقیقتر، طراحی شدهاند. این مقاله تاثیرات آنها را در مدیریت رنگ دیجیتال و طراحی گرافیک به تصویر میکشد.
🟣لینک مقاله:
https://golangweekly.com/link/171249/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🎨 Colorspace: Color Space Conversion Library
🟢 خلاصه مقاله:
این مقاله با بررسی فضاهای رنگی مختلف مانند sRGB و sRGB خطی، فضای رنگی CIE XYZ و فضاهای رنگی نوظهور OKLAB و OKLCH به بررسی پیشرفتها در تکنیکهای دستکاری رنگ میپردازد. هدف از این بررسیها، بهبود تبدیلهای رنگی و ایجاد امکان تنظیمات رنگی دقیقتر است. به خصوص، فضاهای رنگی جدید مانند OKLAB و OKLCH، به منظور تسهیل در اجرای تغییرات رنگی منظم و دقیقتر، طراحی شدهاند. این مقاله تاثیرات آنها را در مدیریت رنگ دیجیتال و طراحی گرافیک به تصویر میکشد.
🟣لینک مقاله:
https://golangweekly.com/link/171249/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
GitHub
GitHub - soypat/colorspace: Color space definitions in Go: sRGB, OKLAB/OKLCH and CIE spaces.
Color space definitions in Go: sRGB, OKLAB/OKLCH and CIE spaces. - soypat/colorspace
👍1
🔴قابلیت
در Go 1.25**، رابط جدیدی در بسته `hash` معرفی شده با نام
---
🧠این
رابط ساده زیر را دارد:
این متد وضعیت داخلی هش فعلی را کپی کرده و یک نمونهی مستقل جدید از همان نوع (
---
🔧 چرا مفید است؟
* صرفهجویی در زمان و CPU: کپی وضعیت داخلی، نیاز به محاسبه مجدد هش را حذف میکند.
* سازگاری با الگوریتمهای ترکیبی: وقتی میخواهید چند هش متفاوت را روی یک دنباله شروع کرده و بعداً ادامه دهید.
* کاربرد در HMAC، Merkle‑Tree، بررسی تکرارشونده بودن دادهها.
---
✅ مثال کاربردی
فرض کنید میخواهیم هش SHA256 بسازیم تا دادهها را در چند مرحله هش کنیم، ولی بخشی آغازین مشترک دارند:
📌 *پویا بودن نوع Cloner*: در runtime هش شونده است و نیاز به
---
⚖️ نکات
* نوع برگشتی دقیقاً همان نوع هش است؛ بدون downcast اضافی.
* هیچ اثر جانبی روی هش اصلی ندارد.
* متد روند هش را متوقف میکند و وضعیت فعلی را مکان جداگانه ذخیره مینماید.
---
🧭 جمعبندی
*این `hash.Cloner` در Go 1.25 به
* با
* برای ساخت هشهای موازی، HMAC یا الگوریتمهایی با بخش مشترک واقعاً کاربردی است.
Cloner
ویژگی های جدید گولنگ نسخه 1.25در Go 1.25**، رابط جدیدی در بسته `hash` معرفی شده با نام
Cloner
که به انواع `hash.Hash` اجازه میدهد **وضعیت داخلی (state) خود را کپی کند. این برای مواقعی بسیار مفید است که بخواهید از یک هش، مقدار میانی را ذخیره کرده و ادامه دهید، بدون آنکه کل روند هش را دوباره اجرا کنید.---
🧠این
hash.Cloner
چیست؟رابط ساده زیر را دارد:
type Cloner interface {
Clone() Hash
}
این متد وضعیت داخلی هش فعلی را کپی کرده و یک نمونهی مستقل جدید از همان نوع (
Hash
) بازمیگرداند. تمام پیادهسازیهای استاندارد Go مثل hash/maphash
این رابط را پیادهسازی کردهاند. ([tip.golang.org][1])---
🔧 چرا مفید است؟
* صرفهجویی در زمان و CPU: کپی وضعیت داخلی، نیاز به محاسبه مجدد هش را حذف میکند.
* سازگاری با الگوریتمهای ترکیبی: وقتی میخواهید چند هش متفاوت را روی یک دنباله شروع کرده و بعداً ادامه دهید.
* کاربرد در HMAC، Merkle‑Tree، بررسی تکرارشونده بودن دادهها.
---
✅ مثال کاربردی
فرض کنید میخواهیم هش SHA256 بسازیم تا دادهها را در چند مرحله هش کنیم، ولی بخشی آغازین مشترک دارند:
package main
import (
"crypto/sha256"
"fmt"
"hash"
)
func main() {
base := []byte("header")
h1 := sha256.New()
h1.Write(base) // وضعیت میانی
// کپی وضعیت هش
h2 := h1.(interface{ Clone() hash.Hash }).Clone()
// ادامه روی نسخه اول
h1.Write([]byte(" payload1"))
sum1 := h1.Sum(nil)
// ادامه روی نسخه دوم
h2.Write([]byte(" payload2"))
sum2 := h2.Sum(nil)
fmt.Printf("sum1: %x\n", sum1)
fmt.Printf("sum2: %x\n", sum2)
}
📌 *پویا بودن نوع Cloner*: در runtime هش شونده است و نیاز به
import "hash"
است.---
⚖️ نکات
* نوع برگشتی دقیقاً همان نوع هش است؛ بدون downcast اضافی.
* هیچ اثر جانبی روی هش اصلی ندارد.
* متد روند هش را متوقف میکند و وضعیت فعلی را مکان جداگانه ذخیره مینماید.
---
🧭 جمعبندی
*این `hash.Cloner` در Go 1.25 به
hash.Hash
امکان میدهد وضعیت داخلی خودش را کپی کند.* با
Clone()
میتوانید چند ریزهکاری هش را از همان نقطه شروع ادامه دهید—بدون محاسبه دوباره.* برای ساخت هشهای موازی، HMAC یا الگوریتمهایی با بخش مشترک واقعاً کاربردی است.
❤7