🔵 عنوان مقاله
♟️ Running a Million-Board Chess MMO in a Single Process
🟢 خلاصه مقاله:
این مقاله به توضیح دقیقی پرداخته است در رابطه با نحوه ساخت یک بازی شطرنج چندنفره بزرگ توسط یک توسعهدهنده بازی، که با استفاده از زبان برنامهنویسی Go در پشتصحنه، بدون هیچ مشکلی در عملکرد، انجام شده است. توسعهدهنده این فرایند را از طریق ویدیویی در یوتیوب به اشتراک گذاشته که هم آموزشی است و هم نمایشی از کاربرد Go در توسعه بازیهای زمان-واقعی پیچیده. عبارت "Go Blue" به استفاده و حمایت از زبان Go در جامعه فناوری یا بازیسازی اشاره دارد.
🟣لینک مقاله:
https://golangweekly.com/link/171243/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
♟️ Running a Million-Board Chess MMO in a Single Process
🟢 خلاصه مقاله:
این مقاله به توضیح دقیقی پرداخته است در رابطه با نحوه ساخت یک بازی شطرنج چندنفره بزرگ توسط یک توسعهدهنده بازی، که با استفاده از زبان برنامهنویسی Go در پشتصحنه، بدون هیچ مشکلی در عملکرد، انجام شده است. توسعهدهنده این فرایند را از طریق ویدیویی در یوتیوب به اشتراک گذاشته که هم آموزشی است و هم نمایشی از کاربرد Go در توسعه بازیهای زمان-واقعی پیچیده. عبارت "Go Blue" به استفاده و حمایت از زبان Go در جامعه فناوری یا بازیسازی اشاره دارد.
🟣لینک مقاله:
https://golangweekly.com/link/171243/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
eieio.games
Running a million-board chess MMO in a single process · eieio.games
How one million chessboards works
❤3🔥2
🔴قابلیت Container-aware GOMAXPROCS ویژگی های جدید گولنگ نسخه 1.25
در Go 1.25، رفتار پیشفرض
* اگر quota عددی کسری ainer/cgroup است:
🧠 چه تغییری ایجاد شده؟
1. پیشفرض هوشمندانه در محیطهای container
قبل از Go 1.25، اگر داخل یک کانتینر با CPU quota=1 اجرا میکردید،
حالا این مقدار با توجه به quota واقعی کانتینر تنظیم میشود:
* اگر quota برابر 1 باشد،باشد (مثلاً 2.3)، با گرد کردن به بالا مقدار 3 میگیرد
* حداقل مقدار، حتی برای quota=1 هم 2 خواهد بود، مگر اینکه affinity یا CPU فیزیکی کمتر باشد
2. بروزرسانی پویا در حین اجرای برنامه
اگر پس از شروع برنامه quota تغییر کند (مثلاً از Kubernetes)، runtime بهصورت دورهای (معمولاً هر ثانیه) مقدار
3. امکان غیرفعالسازی
* اگر مقدار
* همچنین میتوانید با تنظیم
- 📚 مثال واقعی
فرض کنید در Kubernetes اجرای زیر را داریم:
درون برنامه:
خروجی قبل از Go 1.25:
در Go 1.25:
اگر quota = 2.3 باشد، مقدار:
و اگر quota = 1، ولی نود بزرگتر باشد، مقدار:
حالا اگر حجم CPU محدودیت افزایش یابد، مثلاً از 1 به 2، مقدار نیز بدون نیاز به ریاستارت برنامه بروزرسانی میشود
برای بازگرداندن به حالت پیشفرض پس از تنظیم دستی، میتوانید بنویسید:
✅ چرا این مهم است؟
1. هماهنگی با منابع کانتینری – دیگر نیازی به تعیین دستی یا بسته شدن برنامه ندارید.
2. کاهش throttling – با منطبق شدن با quota، احتمال deschedule شدن threadها و تأخیر کاهش پیدا میکند .
3. کارایی بهتر GC و scheduler – هرچه
4. مناسب برای Kubernetes و سرورلس – نیازی نیست ابزار اضافی مثل
✳️ جمعبندی
در Go 1.25 بهصورت هوشمندانه
➖➖➖➖➖➖➖➖
👑 @gopher_academy
در 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
The Evolution of Caching Libraries in Go
🟢 خلاصه مقاله:
توسعهدهنده کتابخانه کش Otter، به بررسی تاریخچه کتابخانههای کش در زبان برنامهنویسی Go پرداخته است. او مشکلاتی که توسعهدهندگان در گذشته با آن روبرو بودهاند و دلایل به وجود آمدن Otter را شرح داده است. کتابخانههای کش قبلی با مشکلاتی مانند استفاده ناکارآمد از حافظه و سختی در گسترش بر روی چندین دستگاه مواجه بودند. Otter به عنوان راهحلی برای این مشکلات طراحی شده، با ویژگیهایی نظیر الگوریتمهای بهتر برای حذف دادهها و مدیریت حافظه پیشرفته، تا عملکرد بهتری در محیطهای توزیعشده ارائه دهد.
🟣لینک مقاله:
https://golangweekly.com/link/171241/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
maypok86.github.io
The Evolution of Caching Libraries in Go - Otter
❤3
🔵 عنوان مقاله
An Interactive Tour of Go 1.25
🟢 خلاصه مقاله:
نسخه نهایی Go 1.25 قرار است در ماه آگوست منتشر شود، و فرآیند توسعه آن طبق برنامه پیش میرود. نخستین نسخه آزمایشی، RC1، منتشر شده و نسخه دوم، RC2، انتظار میرود هفته آینده عرضه شود. یادداشتهای پیشنویس انتشار داده شده و شامل اطلاعات مفیدی درباره ویژگیها و بهبودهای جدید است. علاوه بر این، آنتون، شخصیت شناختهشده در جامعه Go، تورهای تعاملی خود را ارائه میدهد که در آنها میتوان به ویرایش و اجرای نمونههای کد مستقیماً از طریق مرورگر پرداخت.
🟣لینک مقاله:
https://golangweekly.com/link/171237/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
An Interactive Tour of Go 1.25
🟢 خلاصه مقاله:
نسخه نهایی Go 1.25 قرار است در ماه آگوست منتشر شود، و فرآیند توسعه آن طبق برنامه پیش میرود. نخستین نسخه آزمایشی، RC1، منتشر شده و نسخه دوم، RC2، انتظار میرود هفته آینده عرضه شود. یادداشتهای پیشنویس انتشار داده شده و شامل اطلاعات مفیدی درباره ویژگیها و بهبودهای جدید است. علاوه بر این، آنتون، شخصیت شناختهشده در جامعه Go، تورهای تعاملی خود را ارائه میدهد که در آنها میتوان به ویرایش و اجرای نمونههای کد مستقیماً از طریق مرورگر پرداخت.
🟣لینک مقاله:
https://golangweekly.com/link/171237/web
➖➖➖➖➖➖➖➖
👑 @gopher_academy
antonz.org
Go 1.25 interactive tour
Fake clock, new GC, flight recorder and more.
❤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 است و میتوانید آن را بهصورت آزمایشی با:
فعال کنید .
* هدف این است که بتوان آن را در 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