Gopher Academy
3.33K subscribers
914 photos
40 videos
279 files
1.95K links
🕸 Gopher Academy

🔷interview golang
https://github.com/mrbardia72/Go-Interview-Questions-And-Answers

حمایت مالی:
https://www.coffeete.ir/mrbardia72

ادمین:
@mrbardia72

ادمین تبلیغات:
@labdon_ads
Download Telegram
🔵 عنوان مقاله
♟️ Running a Million-Board Chess MMO in a Single Process

🟢 خلاصه مقاله:

این مقاله به توضیح دقیقی پرداخته است در رابطه با نحوه ساخت یک بازی شطرنج چندنفره بزرگ توسط یک توسعه‌دهنده بازی، که با استفاده از زبان برنامه‌نویسی Go در پشت‌صحنه، بدون هیچ مشکلی در عملکرد، انجام شده است. توسعه‌دهنده این فرایند را از طریق ویدیویی در یوتیوب به اشتراک گذاشته که هم آموزشی است و هم نمایشی از کاربرد Go در توسعه بازی‌های زمان-واقعی پیچیده. عبارت "Go Blue" به استفاده و حمایت از زبان Go در جامعه فناوری یا بازی‌سازی اشاره دارد.

🟣لینک مقاله:
https://golangweekly.com/link/171243/web


👑 @gopher_academy
3🔥2
🔴قابلیت Container-aware GOMAXPROCS ویژگی های جدید گولنگ نسخه 1.25


در Go 1.25، رفتار پیش‌فرض GOMAXPROCS (تعداد هسته‌های مجازی که به اجرای goroutineها اختصاص داده می‌شود) اکنون آگاه به محدودیت‌های cont GOMAXPROCS هم شده 1
* اگر quota عددی کسری ainer/cgroup است:

🧠 چه تغییری ایجاد شده؟

1. پیش‌فرض هوشمندانه در محیط‌های container

قبل از Go 1.25، اگر داخل یک کانتینر با CPU quota=1 اجرا می‌کردید، GOMAXPROCS برابر با تعداد کل CPU های میزبان (مثلاً 8 یا 32) بود.
حالا این مقدار با توجه به quota واقعی کانتینر تنظیم می‌شود:

* اگر quota برابر 1 باشد،باشد (مثلاً 2.3)، با گرد کردن به بالا مقدار 3 می‌گیرد
* حداقل مقدار، حتی برای quota=1 هم 2 خواهد بود، مگر اینکه affinity یا CPU فیزیکی کمتر باشد

2. بروزرسانی پویا در حین اجرای برنامه

اگر پس از شروع برنامه quota تغییر کند (مثلاً از Kubernetes)، runtime به‌صورت دوره‌ای (معمولاً هر ثانیه) مقدار GOMAXPROCS را به‌روز می‌کند .

3. امکان غیرفعال‌سازی

* اگر مقدار GOMAXPROCS دستی تنظیم شده یا در env مشخص شده باشد، این رفتار جدید غیرفعال می‌شود .
* همچنین می‌توانید با تنظیم Gontainermaxprocs=0 یا updatemaxprocs=0 رفتار را خاموش یا بروزرسانی پویا را متوقف کنید ([tip.golang.org][1]).

- 📚 مثال واقعی

فرض کنید در Kubernetes اجرای زیر را داریم:

kubectl run go-app --image=golang:1.25rc1 \
--limits="cpu=1"


درون برنامه:

fmt.Println("GOMAXPROCS:", runtime.GOMAXPROCS(0))


خروجی قبل از Go 1.25:

GOMAXPROCS: 8   // مثلاً روی یک نود ۸ هسته‌ای


در Go 1.25:

GOMAXPROCS: 1


اگر quota = 2.3 باشد، مقدار:

GOMAXPROCS: 3


و اگر quota = 1، ولی نود بزرگتر باشد، مقدار:

GOMAXPROCS: 2


حالا اگر حجم CPU محدودیت افزایش یابد، مثلاً از 1 به 2، مقدار نیز بدون نیاز به ری‌استارت برنامه بروزرسانی می‌شود

برای بازگرداندن به حالت پیش‌فرض پس از تنظیم دستی، می‌توانید بنویسید:

runtime.SetDefaultGOMAXPROCS()


چرا این مهم است؟

1. هماهنگی با منابع کانتینری – دیگر نیازی به تعیین دستی یا بسته شدن برنامه ندارید.

2. کاهش throttling – با منطبق شدن با quota، احتمال deschedule شدن threadها و تأخیر کاهش پیدا می‌کند .

3. کارایی بهتر GC و scheduler – هرچه GOMAXPROCS کمتر به real CPU نزدیک‌تر باشد، مصرف حافظه و context switch کاهش می‌یابد

4. مناسب برای Kubernetes و سرورلس – نیازی نیست ابزار اضافی مثل automaxprocs استفاده شود؛ همین رفتار در runtime تعبیه‌شده کافی است .

✳️ جمع‌بندی

در Go 1.25 به‌صورت هوشمندانه GOMAXPROCS را بر اساس محدودیت واقعی CPU در کانتینر تنظیم و بروزرسانی می‌کند. این ویژگی باعث اجرای بهینه‌تر برنامه‌ها در Kubernetes و محیط‌های مشابه می‌شود و نیاز به تنظیمات اضافی را حذف می‌کند. اگر در پروژه شما محدودیت CPU تعریف نکرده‌اید یا به رفتار پیشین نیاز دارید، می‌توانید با GODEBUG یا runtime.SetDefaultGOMAXPROCS() کنترل کنید.


👑 @gopher_academy
2👍1🎉1
🔵 عنوان مقاله
The Evolution of Caching Libraries in Go

🟢 خلاصه مقاله:

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

🟣لینک مقاله:
https://golangweekly.com/link/171241/web


👑 @gopher_academy
3
🔵 عنوان مقاله
An Interactive Tour of Go 1.25

🟢 خلاصه مقاله:

نسخه نهایی Go 1.25 قرار است در ماه آگوست منتشر شود، و فرآیند توسعه آن طبق برنامه پیش می‌رود. نخستین نسخه آزمایشی، RC1، منتشر شده و نسخه دوم، RC2، انتظار می‌رود هفته آینده عرضه شود. یادداشت‌های پیش‌نویس انتشار داده شده و شامل اطلاعات مفیدی درباره ویژگی‌ها و بهبود‌های جدید است. علاوه بر این، آنتون، شخصیت شناخته‌شده در جامعه Go، تور‌های تعاملی خود را ارائه می‌دهد که در آن‌ها می‌توان به ویرایش و اجرای نمونه‌های کد مستقیماً از طریق مرورگر پرداخت.

🟣لینک مقاله:
https://golangweekly.com/link/171237/web


👑 @gopher_academy
1👍1
🔴قابلیت 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 است و می‌توانید آن را به‌صورت آزمایشی با:


  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
👍31
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
🔵 عنوان مقاله
Cross-Compiling 10,000+ Go CLI Packages Statically

🟢 خلاصه مقاله:

مقاله به بررسی رویکرد جدید و غیرمعمول در ساخت ابزارهای خط فرمان Go به عنوان باینری‌های استاتیک با استفاده از زنجیره ابزار Zig می‌پردازد. این روش با هدف ساده‌سازی استفاده از این ابزارها برای کاربرانی که زنجیره ابزار Go را نصب نکرده‌اند، انتخاب شده‌است. استفاده از باینری‌های استاتیک باعث حذف نیاز به مدیریت وابستگی‌ها و پیکربندی‌های مرتبط با محیط Go می‌شود، و در نتیجه تجربه کاربری آسان‌تری را فراهم می‌آورد. این رویکرد نه تنها روند استقرار نرم‌افزار را ساده‌تر می‌کند بلکه دسترسی گسترده‌تری به ابزارهای CLI Go را برای تعداد بیشتری از کاربران فراهم می‌آورد.

🟣لینک مقاله:
https://golangweekly.com/link/171250/web


👑 @gopher_academy
2🔥1
Forwarded from AI Labdon
✍️Alireza KiakojouriAlireza Kiakojouri

بنیانگذار تلگرام: ChatGPT فکر نمی‌کند، فقط حرف می‌زند!/ پروژه‌ی مخفی برادران دورف چیست؟

پاول دورف به نشریه فرانسوی «لو پوئن» گفت: «مدل‌های هوش مصنوعی مثل ChatGPT فکر نمی‌کنند. فقط مقدار زیادی متن خوانده‌اند و پاسخی می‌دهند که به نظر درست می‌آید. اما واقعاً نمی‌فهمند و ما انسان‌ها چون زبان پیچیده را نشانه هوش می‌دانیم، فریب می‌خوریم. مدل‌های زبانی فقط حرف می‌زنند. اما این به معنای فهمیدن یا فکر کردن نیست.»

پاول می‌گوید برادرش (نیکلای دورف) اکنون روی ساخت مدلی کار می‌کند که واقعاً بتواند منطق را درک کند، تصمیم بگیرد و دنیای واقعی را بفهمد. او مدعی است این پروژه چیزی فراتر از مدل‌های زبانی فعلی است.

در حالی که غول‌هایی مانند OpenAI، گوگل، متا و حتی چین و روسیه در حال رقابت برای ساخت نسل بعدی هوش مصنوعی (AGI) هستند، پروژه نیکلای دورف می‌تواند معادلات را تغییر دهد.

اگر پروژه نیکلای موفق شود، ما شاهد تولد هوش مصنوعی‌ای خواهیم بود که فقط «هوشمندانه صحبت نمی‌کند»، بلکه واقعاً می‌فهمد، فکر می‌کند و تصمیم می‌گیرد.
2🔥2🕊2
New Feature in Go 1.25 version 🤔
🎉18👍64🍾2🕊1
🔵 عنوان مقاله
Depot Ships Gocache v2 for 4x Faster Go Builds

🟢 خلاصه مقاله:

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

🟣لینک مقاله:
https://golangweekly.com/link/171251/web


👑 @gopher_academy
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
3
اصطلاح STW یا Stop The World یکی از مفاهیم مهم در پیاده‌سازی Garbage Collector (GC) در زبان‌هایی مثل Go، Java و… هست. در ادامه با جزییات کامل بهش می‌پردازیم:

---

تعریف 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، برنامه‌ات رو با تنظیم متغیر 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
1🔥1🍾1
🔵 عنوان مقاله
😅 (Ab)using Channels to Implement a 3D Pipe Game

🟢 خلاصه مقاله:

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

🟣لینک مقاله:
https://golangweekly.com/link/171245/web


👑 @gopher_academy
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())
}
```

🧪 رفتارها:
درخواست محلی معتبر
:


  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
🔴قابلیت 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
3
Forwarded from 𓄂 Bardia 𓆃
🤖 علاقه‌مند به دنیای هوش مصنوعی هستی؟

دنبال می‌کنی که چطور 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
2