Gopher Academy
3.34K subscribers
920 photos
40 videos
280 files
2.01K links
🕸 Gopher Academy

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

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

ادمین:
@mrbardia72
Download Telegram
There are over 1,000 engineering blogs. Here are my top 9 favorites:

- Netflix TechBlog
- Uber Blog
- Cloudflare Blog
- Engineering at Meta
- LinkedIn Engineering
- Discord Blog
- AWS Architecture
- Slack Engineering
- Stripe Blog

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
🍾7👍4
Common go build flags

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
4🍾2
18 Common HTTP Status Codes You Must Know

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
4🍾2
🤔کدام پروتکل ها (TCP یا UDP) درصد سی پی یو بیشتری مصرف می کنند؟

پاسخ به اینکه آیا TCP یا UDP سی پی یو بیشتری مصرف می کند به عوامل مختلفی بستگی دارد:

🟢TCP:
🔴Connection-oriented:
TCP is a connection-oriented protocol. It establishes a connection between the sender and receiver before transmitting data.

🔴Reliability:
TCP ensures reliable and ordered delivery of data. It retransmits lost packets and reorders out-of-order packets.

🔴Overhead:
TCP has more overhead compared to UDP due to features like sequencing, acknowledgment, and flow control.

🔴CPU Usage:
TCP consumes more CPU compared to UDP due to its additional processing requirements, including connection setup, teardown, and error recovery mechanisms.

🟢UDP:
🔴Connectionless:
UDP is a connectionless protocol. It does not establish a connection before transmitting data.

🔴Unreliable:
UDP does not guarantee the delivery of data. It does not perform retransmissions or ensure ordered delivery.

🔴Low Overhead:
UDP has lower overhead compared to TCP because it lacks features like sequencing, acknowledgment, and flow control.

🔴CPU Usage:
UDP consumes less CPU compared to TCP because it has fewer processing requirements.

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


💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍4🍾11

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍20🍾3
* مجموعه وبینار و کارگاه های آموزشی گروه DataEngineerGuys

- موضوع:
An overview of docker for data engineers

- مدرس : مهندس بهنام یزدان پناهی
Behnam Yazdanpanahi
- ساعت : ۱۰ الی ۱۲

- هزینه کارگاه آموزشی : رایگان

- پلتفرم : Google Meet

- لینک روز پنجشنبه :

https://lnkd.in/d-TshCEV

- لینک روز جمعه :

https://lnkd.in/dFCCwYky


💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
6🍾1
6
🍾در زیر، لیستی از برخی الگوریتم‌های جمع‌آوری زباله (garbage collection) در زبان‌های برنامه‌نویسی مختلف آورده شده است:

Mark-Sweep Algorithm:

این الگوریتم دو مرحله اصلی دارد: علامت‌گذاری (Mark) و تخلیه (Sweep).
در مرحله علامت‌گذاری، اشیاء قابل دسترس علامت‌گذاری می‌شوند. سپس، در مرحله تخلیه، اشیاء غیرقابل دسترس حذف می‌شوند.
Tricolor Marking Algorithm:

این الگوریتم نسخه بهبود یافته‌ای از الگوریتم Mark-Sweep است.
اشیاء به سه رنگ تقسیم می‌شوند: سفید، خاکستری و سیاه.
در این الگوریتم، هر بار که یک شیء مورد بررسی قرار می‌گیرد، به یکی از سه رنگ مشخص شده، یعنی سفید (که نشان‌دهنده عدم دسترسی است)، خاکستری (که نشان‌دهنده دسترسی موقت است) و سیاه (که نشان‌دهنده دسترسی دائمی است)، تغییر رنگ می‌دهد.
Copying Garbage Collection:

این الگوریتم شیوه‌ای از جمع‌آوری زباله است که در آن اشیاء زنده به یک منطقه حافظه دیگر کپی می‌شوند و سپس منطقه حافظه اصلی خالی شده و مجدداً برای استفاده آماده می‌شود.
معمولاً برای مدیریت حافظه در محیط‌هایی که تخصیص و آزادسازی حافظه سریع نیاز دارند، مورد استفاده قرار می‌گیرد.
Mark-Compact Garbage Collection:

این الگوریتم دو مرحله دارد: علامت‌گذاری (Mark) و فشرده‌سازی (Compact).
در مرحله علامت‌گذاری، اشیاء قابل دسترس علامت‌گذاری می‌شوند. سپس، در مرحله فشرده‌سازی، اشیاء زنده به یک سریا حافظه جمع‌آوری شده و فضای خالی حافظه متحرک می‌شود تا فضای خالی را کاهش دهد.
Generational Garbage Collection:

در این الگوریتم، اشیاء به دو دسته اصلی تقسیم می‌شوند: نوجوان (Young) و بالغ (Old).
اشیاء جدید به عنوان نوجوان دسته‌بندی می‌شوند و در یک فضای حافظه جداگانه نگهداری می‌شوند. سپس، الگوریتم جمع‌آوری زباله فقط بر روی فضای حافظه نوجوان اعمال می‌شود.
اشیاء که چندین بار دسترسی داشته‌اند، به عنوان بالغ دسته‌بندی می‌شوند و در یک فضای حافظه دیگر نگهداری می‌شوند.
Reference Counting:

در این الگوریتم، هر شیء شمارنده ارجاع دارد که تعداد اشاره‌گرهایی را که به آن اشیاء اشاره می‌دهند نشان می‌دهد.
وقتی که شمارنده ارجاع به صفر می‌رسد، شیء غیرقابل دسترسی است و جمع‌آوری زباله انجام می‌شود.
Incremental Garbage Collection:

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

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍8🍾21
🟢When: Thursday May 23rd | 12PM - 1PM EST

🔵Topic: Introduction to Generative AI with Go

🔴Where: Remote - Online Webinar

🥂 https://www.eventbrite.com/e/introduction-to-generative-ai-with-go-tickets-901869765747


💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍21🍾1
(روز پاسداشت زبان فارسی و بزرگداشت فردوسی بزرگ) (فرخنده باد)💙
213🍾2
زمانی که روی یک لینک کلیک می‌شود تا زمانی که جواب از سرور مورد نظر دریافت می‌شود، چندین مرحله در شبکه طی می‌شود. این مراحل عبارتند از:

🟢DNS Resolution

مرورگر ابتدا باید آدرس IP متناظر با دامنه‌ای که کاربر روی لینک کلیک کرده است را بیابد.
درخواست DNS از سرور DNS محلی (معمولاً سرویس دهنده اینترنت شما یا سرویس DNS داخلی در سازمان) ارسال می‌شود.
سرور DNS پاسخی که شامل آدرس IP متناظر با دامنه است ارسال می‌کند.

🟢برقراری اتصال (Connection Establishment):
مرورگر یک درخواست HTTP یا HTTPS برای دانلود صفحه وب (یا منبع مورد نظر) به سرور ارسال می‌کند.
این درخواست به آدرس IP متناظر با دامنه ارسال می‌شود.
اگر اتصال امن (HTTPS) باشد، مراحل handshake SSL/TLS انجام می‌شود.

🟢ارسال درخواست (Request Transmission):
مرورگر درخواست HTTP یا HTTPS را به سرور ارسال می‌کند.
درخواست شامل هدرهای HTTP مختلف مانند مرورگر، نوع درخواست (GET، POST و غیره)، و دیگر اطلاعات مورد نیاز است.

🟢پردازش در سرور (Server Processing):
سرور درخواست را دریافت کرده و به پردازش آن می‌پردازد.
این مرحله شامل دسترسی به پایگاه داده، اجرای کدهای سمت سرور، و سایر عملیات مورد نیاز است.

🟢ارسال پاسخ (Response Transmission):
سرور پاسخ را به مرورگر ارسال می‌کند.
پاسخ شامل هدرها، محتوا، و سایر اطلاعات مورد نیاز است.

🟢دریافت و نمایش محتوا (Content Rendering):
مرورگر پاسخ را دریافت کرده و محتوای آن را نمایش می‌دهد.
این شامل تجزیه و تحلیل HTML، CSS، و JavaScript و نمایش صفحه وب به کاربر است.
این مراحل تنها یک خلاصه از فرآیند است که در هنگام کلیک بر روی یک لینک اتفاق می‌افتد و ممکن است با توجه به شرایط خاص، مراحل دیگری همچون استفاده از CDN، کش‌های مرورگر، و غیره نیز اضافه شود.

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍9🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
از عجایب موقعیت شغلی
😐سن از ۲۷
حالا مثلن اگر ۲۶ بود و با استک های بالا هم به صورت حرفه ای کار کرده بود
اون وقت چی....

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍12
در تحلیل الگوریتم‌ها، دو مفهوم مهم به نام‌های "مرتبه زمانی" و "پیچیدگی زمانی" وجود دارد که به دقت باید تفاوت آن‌ها را درک کرد:

مرتبه زمانی (Time Complexity):

مرتبه زمانی یک الگوریتم به میزان زمانی که الگوریتم برای اجرا به ورودی‌های مختلف نیاز دارد، می‌پردازد.
معمولاً با استفاده از نمادهای بزرگ‌تر از یک، مانند O(n)، O(n^2) و غیره، بیان می‌شود.
مرتبه زمانی تعیین می‌کند که الگوریتم چگونه با افزایش اندازه ورودی عمل می‌کند.
پیچیدگی زمانی (Complexity of Time):

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

برای مثال، یک الگوریتم با مرتبه زمانی O(n^2) ممکن است در بدترین حالت (پیچیدگی زمانی) خود، همواره با ورودی‌های بزرگ‌تر، زمان بیشتری برای اجرا صرف کند. اما در برخی حالات بهینه، ممکن است با ورودی‌های کوچک‌تر، زمان کمتری برای اجرا صرف کند. در این حالت، پیچیدگی زمانی الگوریتم در حالت بهینه (بهترین حالت) ممکن است متفاوت از پیچیدگی زمانی آن در بدترین حالت (بدترین حالت) باشد.

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍11
لیست‌پیوندی و آرایه دو ساختار داده متفاوت هستند، هر کدام ویژگی‌ها و کاربردهای خود را دارند. در ادامه تفاوت‌های اصلی بین آن‌ها را بررسی می‌کنیم:

لیست‌پیوندی (Linked List):
ساختار داده:

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

این ساختار داده به طور پویا حافظه تخصیص می‌دهد و در صورت نیاز به تعداد عناصر جدید، حافظه را از سیستم عامل درخواست می‌کند.
این باعث می‌شود که لیست‌پیوندی انعطاف پذیرتری نسبت به تغییر اندازه داشته باشد.
دسترسی به عناصر:

برای دسترسی به عناصر، باید از ابتدای لیست‌پیوندی شروع شود و به صورت ترتیبی به اجزای دیگر دسترسی پیدا کنید.
عملیات درج و حذف:

درج و حذف عناصر در لیست‌پیوندی نسبت به آرایه سریعتر است زیرا فقط نیاز به تغییر پیوندها دارد و نیازی به کپی کردن عناصر نیست.
انواع لیست‌پیوندی:

لیست‌پیوندی دوسویه (Doubly Linked List): هر عنصر دو پیوند به عناصر قبلی و بعدی خود دارد.
لیست‌پیوندی دایره‌ای (Circular Linked List): آخرین عنصر به عنصر اول متصل است.
آرایه (Array):
ساختار داده:

آرایه مجموعه‌ای از عناصر است که هر عنصر در یک خانه مشخص در حافظه ذخیره می‌شود.
اندازه آرایه در زمان ایجاد تعیین می‌شود و ثابت است.
حافظه:

حافظه آرایه به طور پیوسته در حافظه ذخیره می‌شود و اندازه آرایه در زمان ایجاد مشخص می‌شود.
دسترسی به عناصر:

دسترسی به عناصر آرایه به صورت مستقیم و با استفاده از اندیس عناصر انجام می‌شود.
عملیات درج و حذف:

عملیات درج و حذف عناصر در آرایه ممکن است زمان بیشتری نیاز داشته باشد زیرا باید عناصر جدید را به صورت پشت‌سرهم در حافظه جا داده و یا از حافظه حذف کرد.
انواع آرایه:

آرایه استاتیک (Static Array): اندازه آرایه در زمان تعریف ثابت است و نمی‌توان آن را تغییر داد.
آرایه پویا (Dynamic Array): اندازه آرایه در زمان اجرا تغییر می‌کند و می‌توان عناصر جدید را به آن اضافه یا از آن حذف کرد.
تفاوت اصلی:
اصلی‌ترین تفاوت بین لیست‌پیوندی و آرایه این است که لیست‌پیوندی امکان افزودن و حذف عناصر با زمان ثابت را فراهم می‌کند، در حالی که آرایه امکان دسترسی سریعتر به عناصر را فراهم می‌کند اما افزودن و حذف عناصر آن ممکن است زمان بیشتری نیاز داشته باشد.

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍7
Golang "reflect" std package will support a "TypeAssert" function:

  func TypeAssert[T any](v reflect.Value) (T, bool)

which is equivalent to

  v.Interface().(T)

but saves one allocation:

https://github.com/golang/go/issues/62121

☕️ Buy me coffee!

🕊 @gopher_academy | @GolangEngineers
5👍4
* چرا اعداد اول انقدر توی رمزنگاری مهم هستن؟

مساله اول - تجزیه
* اعداد اول توی کریپتوگرافی مهم شدن، چون یک طیف گسترده‌ای از الگوریتمها مبتنی بر اعداد اول کار میکنن. مثل RSA و...
اما سوال اصلی اینجاست که...، در همون اول ماجرا، این اعداد چه خاصیتی داشتن که رفتن سراغشون؟؟
این سوال مهم و اصلی و جذاب ماجراست که در ادامه یکمی بهش میپردازم. قبل از اون بگم که الگوریتمهایی مثل RSA توی زیر باکشون، از رویکردهایی استفاده میکنن که برای رمزگذاری و رمزگشایی از "تجـــزیه" یا Factorization استفاده میکنن...
هر عددی رو میشه به یکسری عامل اول تجزیه کرد، این عاملها خشت سازنده عدد هستن و میتونن توی محاسبات این عدد رو به اعداد دیگه مرتبط کنن
[این تخصصیه- یه بار به زبان عامیانه میگم👇]
الان مثلا عدد 21 از دو عامل اول 3 و 7 ساخته میشه...
وقتی ما میتونیم یک بازی-ریاضی طراحی کنیم به این شکل که:
* تو دوتا عدد اول فرض کن/منم دوتا عدد اول فرض میکنم...
* اینجوری ضربشون کن...
* از این عددی که من بدست آوردم استفاده کن تا فلان عدد دیگه رو باهاش پیوند بزنی...
* حالا نتیجه رو به من بگو، من بدون اینکه بدونم دوتا عدد اول تو چیه و تو بدون اینکه بدونی دوتا عدد اول من چیه، این وسط یه عدد رو [بخونین پیام مخفی رو] به هم دیگه منتقل کردیم...

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

اما باز هم این سوال باز میمونه که چیشد که بازی ریاضی مونو بر مبنای اعداد اول انتخاب کردیم؟

ادامه رو بخونین.
=+=+=+=+=+=+=+=+=+=+=+

مساله دوم- رندومنس
* اعداد اول، در بطن خودشون ساختار شبه-رندومی دارن، بخاطر اینه که تا الان کسی نتونسته الگویی دقیق برای اینکه اعداد اول چجوری و با چه ترتیبی ظاهر میشن پیدا کنه -
الگوهای جزئـــی به کرات یافت شده، ولی الگوی دقیق اینکه چطور یه عدد اول پیدا میشه هنوز پس از این همه سال یک راز نهفته هست...

پس این اعداد اول، مثل برخی از ساختارهای دیگه ریاضیات مثل عدد پی (پای) یا عدد اویلر/نپر، هنوز قابل حدس و مدلسازی نیستن...
پس یه سیستمی مثل رمزنگاری که میخواد از یه رندومنــــس معقول بهره ببره، اعداد اول رو وارد ساختارش میکنه:)

الان دقیقا SHA256 از جذرِ جذرِ جذرِ جذرِ.... چندتا عدد اول یعنی (2 و 3 و 5 و...) استفاده میکنه تا seed اولیه‌ش رو بسازه...
توی داکیونتش کسی که طراحیش کرده صراحتا نوشته من اعداد اول رو بخاطر این استفاده کردم چون ماهیت رندومی دارن و با این کار کسی نمیتونه به الگوریتم SHA من شک کنه که یوقت توش بکدور گذاشته باشم... :)
یه هش کریپتوگرافیک استانداردی مثل SHA، باید آنتروپی بالایی داشته باشه تا بتونه به یه رندومنس خوبی برسه و واقعا بشه "هش کریپتوگرافیک" ... برای یافتن این آنتروپی بالا، چی بهتر از عاملهایی که در DNAشون رندومنس وجود داره و ریاضی دانها نمیتونن مدلشون کنن.
[اینم خیلی تخصصی بود - به زبان ساده یه بار بگم👇]

یچیزی مثل هش "شا" دلش میخواد خروجیش خیلی رندوم باشه که قابل حدس نباشه...
برای همین همون اول روی دیتای ورودیش یکمی نمک(salt) میزنه:
برای اینکه بتونه نمکش رو به نحوی انتخاب کنه که همه راضی باشن و متهمش نکنن به پنهانکاری و بکدور، از اعداد اول استفاده میکنه،
چون این اعداد ذات رندومی دارن - و این پاسخ خیلی از چیزهارو میده از جمله اینکه چرا اینقدر توی رمزنگاری مهم هستن...
=+=+=+=+=+=+=+=+=+=+=+

مساله سوم - لگاریتم گسسته
خیلی از مسائل ریاضیاتی حوزه رمزنگاری که با "به نما رسوندن" کار میکنن، به خاطر این امن تلقی میشن که حل کردن برعکس این روند یعنی حل مساله "لگاریتم گسسته" به این سادگی نیست.
لگاریتم گسسته، عکس عملی هست که به کرات توی رمزنگاری استفاده میشه، یعنی مود یا mod یا باقی‌مونده تقسیم.

لگاریتم گسسته زمانی تعمیم پیدا میکنه و بسیار سخت میشه که پیمانه ها عدد اول باشن، این باعث میشه قابل تجزیه نباشن که پیوند میخوره به بحث اول...
#مطالب_رایگان_و_آزاد

🕊 @gopher_academy | @GolangEngineers
👍1253
What’s the difference between Session-based authentication and JWTs?

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍7🍾11
#golang #gem: Use a buffered channel as a semaphore.

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
🍾6
✍️ Arman BabaeiArman Babaei
🤝 CTO at WorkgramCTO at Workgram

یک سوال چالشی که شاید در مصاحبه استخدامی ازتون پرسیده بشه.
ببینم تجربیات دیتابیس دوستان در چه حد هست.

سوال:
یک جدول به نام best_programmers داریم با چند میلیون ریکورد.
در این جدول قراره هر روز لیست برنامه‌نویسان برتر بروزرسانی بشه به صورت صعودی.
چالش: اگر برنامه‌نویسی از رتبه ۱۰۰۰ به رتبه ۱ منتقل بشه اونوقت شما مجبور هستید رنکینگ همه‌ی برنامه‌نویسان رو تغییر بدید و با توجه به ریکوردهای زیاد این امر بهینه نیست.

یک راه حل بهینه پیشنهاد بدید که با کم‌ترین هزینه رنکینگ برنامه‌نویسان بروزرسانی بشه.

💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍821🍾1
برای سنیور شدن باید چه توانایی های داشته باشیم.

🕊 @gopher_academy | @GolangEngineers
👍4🍾3
system_design_1_fa.pdf
10.7 MB
کتاب ترجمه شده سیستم دیزاین نرم افزار ۱ ( 1 INTERVIEW DESIGN SYSTEM )

نویسنده: Alex Xu

https://system-design.ir/


🕊 @gopher_academy | @GolangEngineers
👍10🍾4