Gopher Academy
3.82K subscribers
962 photos
45 videos
282 files
2.79K links
🕸 Gopher Academy

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

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

ادمین:
@mrbardia72
Download Telegram
Forwarded from Software Engineer
امکان تغییر آدرس ایمیل 📧

اگر این قابلیت برای حسابت فعال شده باشد، می‌توانی آدرس @gmail.com خودت را بدون ساختن حساب جدید تغییر بدهی. این قابلیت به‌صورت تدریجی برای کاربران منتشر شده و ممکن است هنوز برای همه فعال نباشد. (Google Help)

روش اول (کامپیوتر - پیشنهاد گوگل) 💻🔍

وارد حساب گوگلت شو:
Google Account
از منوی سمت چپ روی Personal info (اطلاعات شخصی) کلیک کن.
بخش Contact info را باز کن.
روی Email کلیک کن.
گزینه Google Account email را انتخاب کن.
اگر گزینه Change Google Account email یا تغییر آدرس ایمیل گوگل را می‌بینی:
روی آن کلیک کن.
نام جدید دلخواهت را وارد کن.
اگر آزاد باشد، ادامه بده.
کد تأیید یا مراحل امنیتی را انجام بده. 🔒

بعد از تأیید:
ایمیل جدید، آدرس اصلی حسابت می‌شود.
ایمیل قبلی به‌عنوان Alternate Email (آدرس جایگزین) باقی می‌ماند.
ایمیل‌هایی که به آدرس قدیمی ارسال شوند نیز همچنان به همان Inbox می‌رسند. (Google Help)

اگر این گزینه را نمی‌بینی 🚫
اگر در مرحله ۶ گزینه Change Google Account email وجود ندارد، یعنی هنوز این قابلیت برای حسابت فعال نشده است. گوگل آن را به‌صورت مرحله‌ای منتشر می‌کند و ممکن است چند هفته یا چند ماه دیگر برای حسابت فعال شود. (Google Help)

قبل از تغییر این نکات را بدان 📝👀
همه ایمیل‌ها، فایل‌های Drive، عکس‌های Photos و اطلاعات حسابت حفظ می‌شوند. 💾
می‌توانی با ایمیل قدیمی و جدید وارد حسابت شوی. 🔑
برخی تنظیمات دستگاه یا برنامه‌ها ممکن است نیاز به ورود مجدد داشته باشند.
فقط هر ۱۲ ماه یک‌بار می‌توانی آدرس را تغییر دهی و تعداد تغییرها نیز محدود است. (Google Help)
🔵 عنوان مقاله
soup 2.0: A Beautiful Soup-Inspired Web Scraper

🟢 خلاصه مقاله:
در دنیای توسعه وب و تحلیل داده‌ها، ابزارهای قدرتمند برای استخراج اطلاعات از صفحات اینترنتی نقش مهمی ایفا می‌کنند. یکی از معروف‌ترین این ابزارها، کتابخانه "بیوتیفول سوپ" (Beautiful Soup) در زبان پایتون است که برای جمع‌آوری و تجزیه و تحلیل محتواهای وب بسیار پرکاربرد است. این کتابخانه قابلیت بارگذاری صفحات، تفکیک عناصر HTML و ناوبری آسان در میان عناصر صفحه را فراهم می‌کند، به گونه‌ای که کاربر می‌تواند اطلاعات مورد نیاز خود را به سادگی استخراج کند و تحلیل‌های خود را انجام دهد.

در پاسخ به نیازهای توسعه‌دهندگان و تحلیل‌گران داده، ابزار جدیدی با نام "سوپ ۲.۰" طراحی شده است که کاملاً الهام‌گرفته از قدرت و سادگی بیوتیفول سوپ است. این ابزار امکاناتی از قبیل بارگذاری صفحات وب، تجزیه و تحلیل ساختارهای HTML و ناوبری در میان عناصر آن را ارائه می‌دهد. هدف اصلی این پروژه، تسهیل فرآیند استخراج داده‌های وب و فراهم کردن یک رابط کاربری ساده و کارآمد برای کاربران است تا بدون صرف زمان زیاد، بتوانند اطلاعات مورد نیاز خود را به‌درستی و کارآمد استخراج کنند.

این ابزار نه تنها برای برنامه‌نویسان و توسعه‌دهندگان وب، بلکه برای پژوهشگران حوزه تحلیل داده و علاقه‌مندان به جمع‌آوری اطلاعات از وب نیز بسیار مناسب است. به این ترتیب، "سوپ ۲.۰" با ارائه قابلیت‌هایی مشابه نمونه‌های محبوب و با امکانات توسعه یافته‌تر، حالا گزینه‌ای مطمئن و موثر برای کاربری آسان و سریع در پروژه‌های مختلف محسوب می‌شود.

#وباسکریپینگ #تحلیل_وب #استخراج_داده #برنامه‌نویسی

🟣لینک مقاله:
https://github.com/anaskhan96/soup


👑 @gopher_academy
Forwarded from AI
آیا باید کلاً دست از خوندن کد برداشت و اجازه داد Agentها همه تصمیم‌ها رو به‌صورت Autonomous بگیرن؟ دِکس از HumanLayer می‌گه: «نه، دیگه نه!»

کامنت‌های بیشتر، کامنت‌های طولانی‌تر و تعداد زیادی PR که بدون هیچ Reviewای Merge می‌شن.
تعداد Incidentها به شکل محسوسی افزایش پیدا کرده.
تعداد Bug به ازای هر Developer هم به‌مراتب بیشتر شده.

این‌ها بخشی از نکات جالبی هستند که از گزارش‌های چند تیم به دست اومده؛ تیم‌هایی که تلاش کردن به‌صورت کامل یا تا حدی Autonomous بشن و انجام همه کارها رو به Agentها بسپارن. نتیجه این بوده که خیلی زود (یا گاهی با کمی تأخیر) مشخص شده این رویکرد در Codebaseهای Production و پیچیده می‌تونه از کنترل خارج بشه.

بخشی از محدودیت‌های فعلی به این موضوع برمی‌گرده که Coding Modelهای امروزی عمدتاً برای Functional Correctness در کوتاه‌مدت آموزش داده و ارزیابی می‌شن، نه برای Long-term Maintainability.

این یعنی هنوز فاصله قابل‌توجهی در حوزه Software Design وجود داره و یک Design ضعیف ممکنه تا هفته‌ها یا حتی ماه‌ها خودش رو نشون نده؛ مثلاً زمانی که Incidentی رخ بده یا نیاز به Modificationهای پیچیده به وجود بیاد. Evaluationهای جدیدتری مثل SWE-Marathon و Frontier Code در حال ظهور هستند که Taskهای طولانی‌تر و Workflowهای چند-PRی رو پوشش می‌دن، اما این مسئله آن‌قدر پیچیده است که گاهی حتی فراتر از این چارچوب‌ها می‌ره.

تشبیه «Software Factory» و تأکید بر اهمیت Human Review بسیار جالبه. تجربه تیم‌هایی که در هفته‌های اخیر با ابزارهایی مثل Fable کار کرده‌اند هم تا حد زیادی همین موضوع رو تأیید می‌کنه، البته از زاویه‌ای متفاوت.

در این رویکرد، نقش Developer کمتر شبیه فردی است که مستقیماً کنترل همه چیز را در دست دارد و بیشتر به نقش یک Coach شباهت پیدا می‌کند که تصمیم‌های Architectural را هدایت می‌کند. بخش قابل‌توجهی از زمان نیز صرف یادگیری رویکردهای جدید و هوشمندانه‌ای می‌شود که شاید در حالت عادی به ذهن نرسند.

بر این اساس، ارزش خوندن کدها (یا Artifactها) فقط در این نیست که مطمئن بشیم مسیر اشتباهی طی نمی‌شه؛ بلکه این کار کمک می‌کنه تغییرات سریع Codebase بهتر درک بشن و مهم‌تر از اون، امکان یادگیری دانشی فراهم بشه که به نظر می‌رسه دامنه و عمقش از چیزی که قبلاً از Developerها انتظار می‌رفت، بسیار گسترده‌تر شده است.

لینک گزارش
https://github.com/humanlayer/advanced-context-engineering-for-coding-agents/blob/main/wsff.md

@ | <Reza Jafari/>
اگه از لاراول اومدی سمت گو و دلت برای متدهای Collection تنگ شده، سراغ gods برو
یه کتابخونه‌ی کامل از ساختمون‌داده‌های آماده - لیست، ست، استک، مپ، درخت، صف - همه با یه اینترفیس یکدست و بدون هیچ dependency خارجی.

معادل جمع‌وجورِ Illuminate\Support برای دنیای Go

github.com/emirpasic/gods

@
1
🔵 عنوان مقاله
Goph 2.0: A Native Go SSH Client Library

🟢 خلاصه مقاله:
در نسخه‌ی جدید Goph 2.0، یک کتابخانه‌ی بومی زبان Go برای ارتباطات SSH ارائه شده است که امکانات متنوعی را در اختیار توسعه‌دهندگان قرار می‌دهد. این کتابخانه از روش‌های مختلفی برای اتصال به سرورها پشتیبانی می‌کند، از جمله استفاده از پسورد، کلیدهای خصوصی، و کلیدهای با عبارت عبور، که کار با آن را بسیار راحت‌تر می‌سازد. علاوه بر این، امکاناتی مانند انتقال فایل، اجرای دستورات با آگاهی از context و مدیریت وضعیت‌های مختلف شبکه نیز در این نسخه گنجانده شده است.

نسخه‌ی ۲ Goph تحولات خوبی را در بخش API ایجاد کرده است؛ به طور خاص، این نسخه از API گزینه‌های عملیاتی (functional options API) بهره‌مند است که به توسعه‌دهندگان امکان تنظیم و سفارشی‌سازی بیشتر را می‌دهد. همچنین، با افزودن قابلیت commands مبتنی بر context، کنترل و مدیریت فرآیندها و عملیات‌های شبکه بسیار ساده‌تر شده است. پشتیبانی از پراکسی SOCKS5، امکان استفاده از سرورهای Jump Host، و امکانات پیشرفته دیگر، انعطاف‌پذیری و کارایی این کتابخانه را به شکل چشمگیری افزایش داده است.

در مجموع، Goph 2.0 به عنوان یک ابزار قدرتمند و قابل اعتماد برای تعاملات SSH در زبان Go، امکانات کاربرپسندی ارائه می‌دهد که توسعه‌دهندگان را قادر می‌سازد عملیات انتقال فایل، اجرای دستورات و اتصال‌های امن را به سادگی و با کدهای تمیز انجام دهند و پروژه‌های خود را سریع‌تر و موثرتر توسعه دهند.

#برنامه_نویسی #جی_او #امنیت_شبکه #کتابخانه_رایگان

🟣لینک مقاله:
https://github.com/melbahja/goph


👑 @gopher_academy
🔵 عنوان مقاله
webp-go-pure: Pure Go WebP Encoding and Decoding

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

در این راستا، پروژه "webp-go-pure" یک گزینه عالی است؛ یک انکودر و دیکدر WebP کاملاً بر پایه زبان برنامه‌نویسی Go است که بدون نیاز به Cgo و کتابخانه‌های خارجی مانند libwebp عمل می‌کند. این کاهش وابستگی‌ها، باعث سادگی، انعطاف‌پذیری و بهبود امنیت در توسعه نرم‌افزار می‌شود. این ابزار مخصوصاً زمانی مفید است که توسعه‌دهندگان بخواهند از وابستگی‌های سیستم‌عامل صرف‌نظر کرده و تمرکز خود را بر توسعه سریع و بدون تداخل‌های خارجی نگه دارند.

با استفاده از "webp-go-pure"، می‌توان به راحتی تصاویر WebP را در برنامه‌های خود رمزگشایی و کدگذاری کرد، بدون اینکه نگرانی درباره سازگاری و کارایی در محیط‌های مختلف داشته باشید. این پروژه صرفاً برای مواردی که نیاز به مهندسی سبک و خودکفا بودن دارید، طراحی شده است و تجربه کاربری بی‌نظیری ارائه می‌دهد، در عین حال چون بر پایه زبان Go است، سرعت و کارایی قابل توجهی را تضمین می‌کند.

در نهایت، "webp-go-pure" گزینه‌ای مناسب برای توسعه‌دهندگانی است که به دنبال راه‌حلی سبک، امن و بدون وابستگی‌های خارجی برای مدیریت تصاویر WebP هستند، و قصد دارند پروژه‌های خود را با حداقل دردسر مدیریت کنند.

#هوشمندسازی_تصاویر #توسعه_نرم‌افزار #برنامه‌نویسی_Go #تصاویر_وبپ

🟣لینک مقاله:
https://github.com/SeriousBug/webp-go-pure


👑 @gopher_academy
یه تسک داشتم در مورد
b.N can be modernized using b.Loop() (bloop default)

باید اصلاح میکردم به b.loop کنجکاو شدم که داره اون پشت چیکار میکنه به چیز های جالبی خوردم گفتم براتون توصیح بدم قضیه پشت صحنه رو

func (b *B) Loop() bool {
// This is written such that the fast path is as fast as possible and can be
// inlined.
//
// There are three cases where we'll fall out of the fast path:
//
// - On the first call, both i and n are 0.
//
// - If the loop reaches the n'th iteration, then i == n and we need
// to figure out the new target iteration count or if we're done.
//
// - If the timer is stopped, it poisons the top bit of i so the slow
// path can do consistency checks and fail.
if b.loop.i < b.loop.n {
b.loop.i++
return true
}
return b.loopSlowPath()
}

از دو تا تکنیک استفاده میکنه
۱- تکنیک "poison کردن بیت بالای
۲- کالیبراسیون

این دوتا مفهوم چیه؟

دو مفهوم کاملاً جدا و هرکدوم برای حل یه مشکل متفاوت

بذار جدا جدا توضیح بدم:

۱. کالیبراسیون (Calibration)

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

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

یه تعداد کوچیک تکرار (مثلاً n=1) رو امتحان می‌کنه.
می‌بینه چقدر طول کشید.
اگه کافی نبود (کمتر از زمان هدف، مثلاً ۱ ثانیه)، n رو بزرگ‌تر می‌کنه و دوباره تلاش می‌کنه.
این کار تا رسیدن به یه n که زمان کافی بده ادامه پیدا می‌کنه.
به این فرآیندِ "پیدا کردن تعداد تکرار درست" می‌گن کالیبراسیون.

فرقش بین b.N و b.Loop():

توی سبک قدیمی (b.N)، هر بار که کالیبراسیون تصمیم می‌گیره N رو بزرگ‌تر کنه، کل تابع بنچمارک از اول اجرا می‌شه

یعنی setup هم دوباره اجرا می‌شه (برای همین باید ResetTimer می‌ذاشت تا زمان setup حساب نشه).

توی b.Loop()، این کار هوشمندانه‌تره: به‌جاش که از اول شروع کنه، همون حلقه رو ادامه می‌ده و فقط سقف n رو بالا می‌بره (این همون چیزیه که توی بلاگ گو بهش میکنن

"one-shot ramp-up"

یعنی setup فقط یه‌بار اجرا می‌شه، نه چندبار.
توی کد loopSlowPath دقیقاً همین تصمیم گرفته می‌شه:

وقتی i == n می‌رسه، چک می‌کنه "زمان کافی گذشته؟

اگه نه، n رو بزرگ‌تر کن و بذار fast path ادامه بده".

۲.حال بریم سراغ Poison کردن

این یه تکنیک سطح‌پایینه برای گزارش خطا بدون اضافه کردن هزینه به مسیر سریع (fast path). سورس واقعیش اینه:
const (
loopPoisonTimer = uint64(1 << (63 - iota))

loopPoisonMask = ^uint64((1 << (63 - (iota - 1))) - 1)
)

یعنی b.loop.i و b.loop.n از نوع uint64 هستن، و بیت شماره‌ی ۶۳ (بالاترین بیت ممکن) به‌عنوان یه پرچم خطا رزرو شده، نه یه بخش عادی از شمارنده.

سناریو:
اگه کسی وسط استفاده از b.Loop() اشتباهاً b.StopTimer() رو صدا بزنه (که با فلسفه‌ی b.Loop() در تضاده، چون خودش تایمر رو مدیریت می‌کنه)، کد داخلی این کار رو می‌کنه:
b.loop.i |= loopPoisonTimer  
// بیت ۶۳ رو روشن کن

چون 1 << 63 یه عدد فوق‌العاده بزرگ (نزدیک به 2^63) هست، بعد از این OR، مقدار b.loop.i به‌شدت بزرگ می‌شه

خیلی بزرگ‌تر از هر n معقولی که توی یه بنچمارک واقعی داری
(که معمولاً چند میلیون حداکثره).

نتیجه: شرط مسیر سریع
if b.loop.i < b.loop.n {

دیگه هیچ‌وقت true نمی‌شه (چون i مصنوعاً غول‌پیکر شده)، پس اجرا مجبور می‌شه بره سراغ loopSlowPath(). اونجا، با استفاده از loopPoisonMask، چک می‌کنه که آیا این بیت خاص روشنه یا نه، و اگه بود، می‌فهمه "آها، تایمر به‌اشتباه متوقف شده" و می‌تونه panic بده با یه پیام خطای واضح، به‌جای این‌که رفتار عجیب و بی‌صدا (silent) داشته باشه.

چرا این‌طوری طراحی شده؟
چون مسیر سریع (fast path) قراره میلیون‌ها بار در ثانیه اجرا بشه، هر شرط اضافه (مثل if timerStopped { ... }) روی این مسیر هزینه‌ی محسوسی به بنچمارک اضافه می‌کنه. با "قایم کردن" وضعیت خطا داخل همون متغیری که already چک می‌شه (i)، هیچ شرط جدیدی به fast path اضافه نمی‌شه خودِ مقایسه‌ی عادی i < n به‌طور طبیعی route می‌کنه به مسیر کند وقتی وضعیت غیرعادیه.
اصطلاح one-shot ramp-up
بسته به زمینه (نرم‌افزار، DevOps، AI یا سخت‌افزار) کمی متفاوت است، اما مفهوم کلی آن این است:
راه‌اندازی یا افزایش ظرفیت در یک مرحله و به‌صورت یکباره، بدون افزایش تدریجی.
معنی واژه‌ها
One-shot =
یک‌باره، در یک مرحله، بدون تکرار
Ramp-up =
افزایش تدریجی ظرفیت، سرعت، بار یا عملکرد تا رسیدن به سطح موردنظر
وقتی این دو کنار هم قرار می‌گیرند، منظور این است که به‌جای افزایش تدریجی، سیستم مستقیماً به ظرفیت نهایی یا موردنظر می‌رسد.

مثال در توسعه نرم‌افزار
فرض کنید یک سرویس باید ۱۰۰۰ Worker اجرا کند.
درواقعه Ramp-up یعنی تدریجی

ثانیه 1 → 100 Worker
ثانیه 2 → 200 Worker
ثانیه 3 → 300 Worker
ثانیه 10 → 1000 Worker

One-shot ramp-up

ثانیه 1 → 1000 Worker
همه Workerها یک‌باره ایجاد می‌شوند.

مثال در تست بار (Load Testing)
در ابزارهایی مانند k6 یا JMeter:
Ramp-up
یعنی تعداد کاربران مجازی به‌تدریج افزایش پیدا کند.

One-shot ramp-up
یعنی تمام کاربران مجازی هم‌زمان شروع به ارسال درخواست کنند.
مثلاً:

1000 Virtual Users
Normal Ramp-up:
0 → 1000 در مدت 5 دقیقه
One-shot Ramp-up:
0 → 1000 در کمتر از یک ثانیه

مثال در Kubernetes
فرض کنید Deployment شما باید ۵۰ Pod داشته باشد.

اRamp-up معمولی:
ا Podها به‌تدریج ساخته می‌شوند.

One-shot ramp-up: Scheduler
تلاش می‌کند هر ۵۰ Pod را تقریباً هم‌زمان ایجاد کند (البته با توجه به محدودیت‌های کلاستر).
مزایا
رسیدن سریع به ظرفیت کامل
مناسب برای تست فشار (Stress Testing)
کاهش زمان راه‌اندازی

معایب
افزایش ناگهانی مصرف CPU و RAM
احتمال ایجاد Thundering Herd Problem (هجوم هم‌زمان تعداد زیادی درخواست یا پردازش)
افزایش احتمال Timeout یا فشار روی دیتابیس و سرویس‌های وابسته

جمع‌بندی
این One-shot ramp-up یعنی سیستم، کاربران، Workerها یا منابع در یک مرحله و تقریباً هم‌زمان به ظرفیت هدف برسند، نه اینکه به‌صورت تدریجی افزایش پیدا کنند. این اصطلاح معمولاً در زمینه‌های Load Testing، سیستم‌های توزیع‌شده، Kubernetes، سرویس‌های ابری و پردازش موازی استفاده می‌شود.
🔵 عنوان مقاله
Supervised Fire-and-Forget Tasks in Go

🟢 خلاصه مقاله:
در برنامه‌نویسی همگام‌سازی با زبان گو، مفهوم "وظایف ناپایدار و بدون نیاز به نظارت مستقیم" یا همان "fire-and-forget" بسیار کاربردی است. این نوع وظایف عموماً وظایفی هستند که اجرا می‌شوند و برنامه بدون انتظار نتیجه‌ی مستقیم از آن‌ها ادامه می‌دهد. در کنار این، مدیریت همزمان وظایف، تضمین صحت اجرا، و محافظت در برابر خطاهای تصادفی اهمیت ویژه‌ای دارد؛ چیزی که در روش‌های ساده با استفاده از کدهای خام `go func()` ممکن است نادیده گرفته شود.

در این متن، راهکارهایی ارائه شده است که با استفاده از آن‌ها می‌توانید وظایف "فایر و فراموش" را با محدود کردن همزمانی، بازیابی از خطاهای پانیک، و اجرای خاموشی مرحله‌ای طراحی کنید. این روش‌ها به شما کمک می‌کنند تا برنامه‌ای مطمئن‌تر و قابل کنترل‌تر داشته باشید، بدون اینکه اجرای وظایف همزمان باعث کاهش کارایی یا بروز خطاهای متمرکز شود.

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

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

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

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

#گو #برنامه‌نویسی #همزمانی #مدیریت_وظایف

🟣لینک مقاله:
https://rednafi.com/go/supervised-fire-and-forget/


👑 @gopher_academy
پنیک برای خطاهای «غیرمنتظره و غیرقابل‌ادامه» هست، نه برای خطاهای معمولیِ برنامه. فلسفه‌ی گو اینه که خطاهای عادی (مثل نبود فایل، ورودی نامعتبر و...) با error برگردونده بشن و صریح هندل بشن، ولی پنیک برای جاهایی هست که یه چیزی اونقدر غیرمنتظره یا خطرناکه که ادامه‌ی اجرا اصلاً منطقی نیست.

کاربردهای واقعی:
- باگ‌های برنامه‌نویسی: nil pointer dereference، index خارج از رنج آرایه، تقسیم بر صفر - اینا خودکار پنیک می‌کنن چون معمولاً نشونه‌ی باگ هستن نه یه حالت قابل پیش‌بینی

- نقض invariant: مثلاً یه تابع که فرض می‌کنه فلان شرط همیشه برقراره، اگه برقرار نبود پنیک می‌کنه چون یعنی جای دیگه‌ای از کد خراب کار کرده

- خطاهای init: اگه توی init() یا شروع برنامه یه چیز حیاتی (مثل اتصال به دیتابیس ضروری) شکست بخوره، ادامه دادن بی‌فایده‌ست

نکته‌ی مهم: پنیک لزوماً کل برنامه رو نمی‌کشه. با recover() داخل یه defer می‌شه جلوشو گرفت. الگوی رایج توی وب‌سرورها اینه که هر هندلر یه middleware داره که پنیک رو recover می‌کنه، لاگ می‌کنه، و فقط همون request رو با خطا جواب می‌ده - بقیه‌ی سرور نمی‌خوابه.

خلاصه:
اگه خطا قابل پیش‌بینیه و caller باید تصمیم بگیره → error. اگه یه چیز نباید هیچ‌وقت اتفاق بیفته و اتفاق افتاده (یعنی باگه) → panic.
2
🔰 آموزش کامل دستور go env در Go قسمت اول — CGO و ارتباط Go با C
━━━━━━━━━━━━━━━━━━
ببینیم این CGO چیه؟
ابزاریه که به Go اجازه می‌ده مستقیماً با کدهای C و C++ ارتباط برقرار کنه.

▫️ CGO_ENABLED=1

فعاله. اگه 0 بشه، Go فقط کد خالص Go کامپایل می‌کنه و به هیچ کتابخونه C نیازی نداره.

▫️ CGO_CFLAGS='-O2 -g'
فلگ‌های کامپایل فایل‌های .c-O2 یعنی بهینه‌سازی سطح ۲ → -g یعنی اطلاعات debug ذخیره بشه

▫️ CGO_CXXFLAGS='-O2 -g'
همین فلگ‌ها ولی برای فایل‌های .cpp (C++)

▫️ CGO_CPPFLAGS=''
فلگ‌های پیش‌پردازنده C/C++ — مثلاً تعریف ماکرو با -DNAME=VALUE

▫️ CGO_FFLAGS='-O2 -g'
فلگ‌های کامپایل Fortran (خیلی کم استفاده می‌شه)

▫️ CGO_LDFLAGS='-O2 -g'
فلگ‌های لینکر — مشخص می‌کنه چطور فایل‌های آبجکت به هم وصل بشن

💡 نکته کاربردی:
اگه پروژه‌ت به هیچ کتابخونه C نیازی نداره، می‌تونی CGO رو غیرفعال کنی:
CGO_ENABLED=0 go build .

این کار باعث می‌شه باینری کاملاً مستقل (static) بشه و نیازی به نصب هیچ چیزی روی سرور نداشته باشه
#golang #go #آموزش_برنامه‌نویسی #backend
👍1🍾1
Gopher Academy
🔰 آموزش کامل دستور go env در Go قسمت اول — CGO و ارتباط Go با C ━━━━━━━━━━━━━━━━━━ ببینیم این CGO چیه؟ ابزاریه که به Go اجازه می‌ده مستقیماً با کدهای C و C++ ارتباط برقرار کنه. ▫️ CGO_ENABLED=1 فعاله. اگه 0 بشه، Go فقط کد خالص Go کامپایل می‌کنه و به…
🔰 آموزش کامل دستور go env در Go قسمت دوم — کامپایلرها، معماری و سیستم‌عامل
━━━━━━━━━━━━━━━━━━
🛠 کامپایلرها

▫️ CC=gcc
کامپایلر C که CGO ازش استفاده می‌کنه (می‌تونی عوضش کنی، مثلاً clang)


▫️ CXX=g++
کامپایلر C++ که CGO ازش استفاده می‌کنه


▫️ AR=ar
ابزار ساخت کتابخونه‌های استاتیک


▫️ GCCGO=gccgo
کامپایلر جایگزین GCC-based برای Go (به جای کامپایلر رسمی Go)


▫️ PKG_CONFIG=pkg-config
ابزار پیدا کردن کتابخونه‌های سیستم برای CGO مثلاً وقتی می‌نویسی
// #cgo pkg-config: openssl

▫️ GOGCCFLAGS='-fPIC -m64 -pthread ...'
فلگ‌های داخلی که Go خودش به GCC پاس می‌ده (معمولاً دستی تغییرشون نمی‌دی)

━━━━━━━━━━━━━━━━━━
🖥 معماری و سیستم‌عامل
▫️ GOOS=linux
سیستم‌عامل هدف کامپایل
▫️ GOARCH=amd64

معماری هدف (64 بیتی x86)

▫️ GOHOSTOS=linux

سیستم‌عامل ماشین شما


▫️ GOHOSTARCH=amd64

معماری ماشین شما


▫️ GOAMD64=v1

نسخه پشتیبانی از AMD64: → v1 پایه (همه CPU های x86-64) → v2 — پشتیبانی از SSE4, POPCNT → v3 — AVX, AVX2 (CPU های مدرن‌تر) → v4 — AVX-512 (Intel Xeon سری جدید)


▫️ GOEXE=''

پسوند فایل اجرایی → در Linux خالیه → در Windows مقدارش .exe می‌شه
━━━━━━━━━━━━━━━━━━
💡 Cross Compilation در Go خیلی ساده‌ست:
GOOS=windows GOARCH=amd64 go build .

همین یه خط کافیه تا برنامه‌ات رو روی Linux برای Windows کامپایل کنی! 🚀
#golang #go #آموزش_برنامه‌نویسی #backend
👍1🔥1🍾1
Gopher Academy
🔰 آموزش کامل دستور go env در Go قسمت دوم — کامپایلرها، معماری و سیستم‌عامل ━━━━━━━━━━━━━━━━━━ 🛠 کامپایلرها ▫️ CC=gcc کامپایلر C که CGO ازش استفاده می‌کنه (می‌تونی عوضش کنی، مثلاً clang) ▫️ CXX=g++ کامپایلر C++ که CGO ازش استفاده می‌کنه ▫️ AR=ar ابزار…
🔰 آموزش کامل دستور go env در Go قسمت سوم — مسیرها و مدیریت ماژول


📁 مسیرهای مهم

▫️ GOBIN=''


محل نصب باینری‌های go install اگه خالی باشه → به $GOPATH/bin می‌ره


▫️ GOCACHE=/home/USER/.cache/go-build


کش کامپایل — باعث می‌شه build های بعدی خیلی سریع‌تر باشن


▫️ GOMODCACHE=/home/USER/go/pkg/mod

محل ذخیره ماژول‌های دانلودشده


▫️ GOENV=/home/USER/.config/go/env

فایل تنظیمات محیطی Go — متغیرهایی که با go env -w ست می‌کنی اینجا ذخیره می‌شن


▫️ GOTOOLDIR=/snap/go/11067/pkg/tool/linux_amd64


محل ابزارهای داخلی Go مثل compile و link

📦 مدیریت ماژول


▫️ GOMOD=/dev/null

مسیر فایل go.mod پروژه جاری → /dev/null یعنی الان خارج از یه ماژول هستی! (وقتی وارد پروژه‌ات بشی، مسیر go.mod رو نشون می‌ده)


▫️ GO111MODULE=''

حالت ماژول — خالی یعنی

autoon — همیشه ماژول → off — همیشه GOPATH قدیمی → auto — بستگی به وجود go.mod داره


▫️ GOWORK=''

مسیر فایل go.work برای Workspace Mode (وقتی روی چند ماژول همزمان کار می‌کنی)


▫️ GOFLAGS=''

فلگ‌های پیش‌فرض برای همه دستورات Go مثلاً: GOFLAGS='-mod=vendor'

💡 تنظیم دائمی متغیرها:
go env -w GOBIN=/usr/local/bin
go env -w GOPROXY=https://goproxy.io,direct

این تغییرات در فایل GOENV ذخیره می‌شن
#golang #go #آموزش_برنامه‌نویسی #backend
👍1
Gopher Academy
🔰 آموزش کامل دستور go env در Go قسمت سوم — مسیرها و مدیریت ماژول 📁 مسیرهای مهم ▫️ GOBIN='' محل نصب باینری‌های go install اگه خالی باشه → به $GOPATH/bin می‌ره ▫️ GOCACHE=/home/USER/.cache/go-build کش کامپایل — باعث می‌شه build های بعدی خیلی سریع‌تر…
📮 پست ۴ از ۴
🔰 آموزش کامل دستور go env در Go قسمت چهارم — پروکسی، امنیت و تنظیمات Runtime
━━━━━━━━━━━━━━━━━━
🌐 پروکسی و امنیت ماژول

▫️ GOPROXY=https://proxy.golang.org,direct
سرور دانلود ماژول‌ها → ابتدا از پروکسی رسمی Google دانلود می‌کنه → اگه پیدا نشد، مستقیم از source می‌ره
go env -w GOPROXY=https://goproxy.io,direct

▫️ GOSUMDB=sum.golang.org
سرور تأیید امنیت ماژول‌ها — مطمئن می‌شه کدی که دانلود می‌کنی دستکاری نشده

▫️ GONOSUMDB=''
ماژول‌هایی که نباید checksum بشن (مثلاً ریپوهای خصوصی)

▫️ GONOPROXY=''
ماژول‌هایی که مستقیم از source دانلود می‌شن و bypass پروکسی می‌کنن

▫️ GOPRIVATE=''
ماژول‌های خصوصی — هم GONOPROXY هم GONOSUMDB رو یکجا تنظیم می‌کنه مثال:
go env -w GOPRIVATE=github.com/mycompany/*

▫️ GOAUTH=netrc
روش احراز هویت برای ریپوهای خصوصی از فایل ~/.netrc برای username/password استفاده می‌کنه

▫️ GOINSECURE=''
ماژول‌هایی که می‌شه بدون HTTPS دانلودشون کرد (توصیه نمی‌شه!)
━━━━━━━━━━━━━━━━━━
⚙️ تنظیمات Runtime و رفتار کامپایلر

▫️ GOVERSION=go1.26.6
نسخه Go نصب‌شده

▫️ GOTOOLCHAIN=auto
مدیریت toolchain: → auto — اگه پروژه نسخه جدیدتری خواست، خودکار دانلود می‌کنه → local — فقط از نسخه نصب‌شده استفاده کن → go1.24.0 — نسخه مشخص

▫️ GODEBUG=''
تنظیمات debug برای runtime مثال:
GODEBUG=asyncpreemptoff=1,gccheckmark=1

▫️ GOFIPS140=off
استاندارد رمزنگاری دولتی آمریکا (FIPS 140) برای اکثر پروژه‌ها نیازی نیست

▫️ GOVCS=''
محدودیت روش‌های Version Control برای دانلود مثال:
GOVCS=*:git,hg
— فقط git و Mercurial

▫️ GOTELEMETRY=local
داده‌های آماری ارسال به Google: → local — فقط محلی ذخیره بشه on — به Google ارسال بشه → off — کاملاً غیرفعال

▫️ GOEXPERIMENT=''
قابلیت‌های آزمایشی که هنوز رسمی نشدن
👍1🔥1
Media is too big
VIEW IN TELEGRAM
🟢معرفی قابلیت‌های جدید زبان Go در نسخه‌های Go 1.25 و Go 1.26

در این ویدئو تیم Go درباره‌ی تغییرات مهم نسخه‌های جدید صحبت می‌کند؛
و بررسی ویژگی‌های جدید این نسخه‌ها:👇
🔴Green Tea GC
🔴Runtime improvements
🔴Compiler optimizations
🔴New standard library APIs
🔴Vector instructions

@gopher_academy
👍4
Forwarded from Persian Post
کتاب «اپل در چین: تسخیر بزرگ‌ترین شرکت جهان»

(Apple in China: The Capture of the World's Greatest Company)

اثری جذاب و خواندنی از پاتریک مک‌گی است.

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

https://xn--r1a.website/+Bp8JeTpQoiUwMjVk
1🔥1
اگه با گوروتین‌ها کار می‌کنی و می‌ترسی یه جا کنترل از دستت در بره، این یکی به کارت میاد:
github.com/panjf2000/ants

یه pool مدیریت گوروتینه؛ به‌جای اینکه هزارتا گوروتین بی‌حساب‌وکتاب باز کنی، تعدادشون رو محدود و بازیافت می‌کنه، پنیک‌ها رو هم قشنگ مدیریت می‌کنه که برنامه‌ت کرش نکنه. شرکت‌های بزرگی مثل Tencent و ByteDance و Shopify هم توی پروداکشن ازش استفاده می‌کنن.
1🔥1
ویژگی Vector Instructions در گولنگ

🧠 اول از همه ما باید درک کنیم که CPU چطور کار می‌کنه؟
حالت معمولی:
مثال: جمع ۴ عدد
a[0] + b[0] = c[0] ← دستور ۱
a[1] + b[1] = c[1] ← دستور ۲
a[2] + b[2] = c[2] ← دستور ۳
a[3] + b[3] = c[3] ← دستور ۴

مجموع: ۴ دستور CPU

حالت Vector (SIMD):
مثال:
[a0, a1, a2, a3] + [b0, b1, b2, b3] = [c0, c1, c2, c3]

مجموع: ۱ دستور CPU

SIMD = Single Instruction, Multiple Data
یعنی
یه دستور چند داده همزمان
📦 رجیسترهای Vector در CPU رجیسترهای مخصوصی داره که می‌تونن داده‌های بیشتری نگه دارن:

رجیستر معمولی (64 بیت):
یه عدد int64

رجیستر XMM — SSE (128 بیت):

│ float32│ float32│ → 2 عدد همزمان

│ یه float64 │ → یا 1 عدد 64 بیتی


رجیستر YMM — AVX2 (256 بیت):
┌──────┬──────┬──────┬──────┐
│ f32 │ f32 │ f32 │ f32 │ → 4 عدد همزمان
└──────┴──────┴──────┴──────┘

رجیستر ZMM — AVX-512 (512 بیت):
┌────┬────┬────┬────┬────┬────┬────┬────┐
│ f32│ f32│ f32│ f32│ f32│ f32│ f32│ f32│ → 8 عدد همزمان
└────┴────┴────┴────┴────┴────┴────┴────┘

🔗 ارتباط با GOAMD64
GOAMD64='v1'   # بدون vector خاص — فقط x86-64 پایه

GOAMD64='v2' # + SSE4.1, SSE4.2, POPCNT

GOAMD64='v3' # + AVX, AVX2 (256 بیتی)

GOAMD64='v4' # + AVX-512 (512 بیتی)

یعنی وقتی GOAMD64=v3 می‌ذاری، به Go می‌گی:
«مطمئنم CPU ای که این کد اجرا می‌شه AVX2 داره، از رجیسترهای 256 بیتی استفاده کن!»

🔄 درواقعه Go چطور از Vector استفاده می‌کنه؟

روش ۱ Auto-Vectorization (خودکار)
کامپایلر Go بعضی حلقه‌ها رو خودش تشخیص می‌ده و بهینه می‌کنه:
func addSlices(a, b, c []float32) {
for i := range a {
c[i] = a[i] + b[i]
}
}

//کامپایلر پشت صحنه
(با GOAMD64=v3):
// به جای 8 دستور جداگانه، یه دستور VADDPS می‌زنه
// که 8 تا float32 رو همزمان جمع می‌کنه

روش ۲ پکیج math/bits و استانداردها
import "math/bits"

// این تابع کامپایلر می‌دونه باید از دستور POPCNT استفاده کنه
n := bits.OnesCount64(x) // شمارش بیت‌های ۱
n := bits.RotateLeft64(x, k) // چرخش بیت

روش ۳ Assembly دستی (پیشرفته)
// فایل add_amd64.s
TEXT ·addSlicesAVX(SB), NOSPLIT, $0
VMOVUPS (SI), Y0 // بارگذاری 8 float32 از slice a
VMOVUPS (DX), Y1 // بارگذاری 8 float32 از slice b
VADDPS Y1, Y0, Y0 // جمع همزمان 8 عدد
VMOVUPS Y0, (DI) // ذخیره نتیجه
RET

روش ۴ — پکیج golang.org/x/sys/cpu
import "golang.org/x/sys/cpu"

// تشخیص قابلیت‌های CPU در runtime
if cpu.X86.HasAVX2 {
addWithAVX2(a, b, c)
} else {
addNormal(a, b, c)
}

📊 مثال واقعی تفاوت سرعت
عملیات: جمع دو slice با ۱۰۰۰ عدد float32


بدون Vector (GOAMD64=v1): ~250 ns

با SSE4 (GOAMD64=v2): ~80 ns → 3x سریع‌تر

با AVX2 (GOAMD64=v3): ~40 ns → 6x سریع‌تر

با AVX-512 (GOAMD64=v4): ~20 ns → 12x سریع‌تر

🎯 کجاها مهمه؟
 پردازش تصویر و ویدیو
یادگیری ماشین (ضرب ماتریس)
رمزنگاری (AES, SHA)
پردازش صوت
بازی‌سازی (physics, graphics)
داده‌های علمی و عددی
جستجو در آرایه‌های بزرگ

منطق معمولی برنامه
کار با string ها (عموماً)
I/O و شبکه

💡 نکته عملی برای Go
# ببین کامپایلر از vector استفاده کرد یا نه:

go build -gcflags="-S" . 2>&1 | grep -i "VMOV\|VADD\|VPCMP"

# کامپایل برای CPU فعلیت (بیشترین بهینه‌سازی):

GOAMD64=v3 go build .

# تست اینکه CPU ات چی ساپورت می‌کنه:

grep -m1 flags /proc/cpuinfo | tr ' ' '\n' | grep -E "avx|sse"
3👍1🔥1
🔰 آموزش کامل دستورات go env

🎖 قسمت اول — CGO و ارتباط Go با C
👑https://xn--r1a.website/gopher_academy/5137

🎖قسمت دوم — کامپایلرها، معماری و سیستم‌عامل
👑 https://xn--r1a.website/gopher_academy/5138

🎖 قسمت سوم — مسیرها و مدیریت ماژول ها
👑 https://xn--r1a.website/gopher_academy/5139

🎖قسمت چهارم — پروکسی، امنیت و تنظیمات Runtime
👑 https://xn--r1a.website/gopher_academy/5140
👍1
اصلا این فلگ ها -02 -g چی هستن و ایا فلگ های دیگری هم داریم؟👇
CGO_CFLAGS='-O2 -g'
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'


@gopher_academy
1
🚀 فلگ‌های بهینه‌سازی -O

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

@gopher_academy
🔥2