Go Casts 🚀 – Telegram
Go Casts 🚀
7.67K subscribers
279 photos
20 videos
13 files
497 links
VP of Eng Zarinpal | Ex Snapp! Senior SE
فوق لیسانس هوش مصنوعی از دانشگاه تهران

اشتراک محتوا در مورد مهندسی نرم افزار، هوش مصنوعی، گولنگ
https://gocasts.ir

پروفایل
https://www.linkedin.com/in/gohossein

ارتباط
@lifography

Ai for Software
@aicasts_ir
Download Telegram
دوستان اگه اپلیکیشن رو بصورت مونولیت مینیوسید، کار خوبی میکنید، اما aggregation pattern رو جدی بگیرید، کمک بزرگی میکنه به حفظ loosely coupled بودن ماژول و سرویس هاتون.

یه اشتباه رایجی که باعث میشه خیلی راحت همه چیز در هم تنیده و coupled بشه نیازهای بیزینسی ای هست که دیتای aggregate شده از چند domain مختلف رو میخواد از شما. تو حالت مونولیت خیلی ساده ست که شما در هر domain به دیتابیس یه domain دیگه درخواست بزنی و یا حتی تو interactor/service دیگه یه متد جدید تعریف کنی که دیتای مد نظر رو بده. که معمولا باعث در هم تنیده شدن و چاق شدن سرویس هاتون میشه.

بهتره سرویس یا همون interactorهاتون کارهای خیلی کوچیک و well-definedی رو انجام بدن و اگه نیازمندی های aggregationطور دارید، یه سری service دیگه بسازید که وابستگی خواهد داشت به سرویس های مختلف و دیتاهای raw رو میگیره و پردازش میکنه که دیتای نهایی رو آماده کنه.

بعضی وقت ها از طریق gateway هم ممکنه بتونید aggregate کنید. بعضی وقت ها ممکنه تو همون لایه دلیوری (کنترلر) تون بتونید دو تا سرویس رو فراخوانی کنید و کار رو در بیارید، گاهی هم پیچیده تر میشه و لازمه یه سرویس(interactor) بنویسید که کار aggregation رو انجام بده
https://learn.microsoft.com/en-us/azure/architecture/patterns/gateway-aggregation

باز خود aggregate کردن حالت های مختلفی داره، اینجا میتونید بیشتر بخونید در موردش
https://medium.com/geekculture/design-patterns-for-microservices-aggregation-pattern-1b8994516fa2

@gocasts
👍203👏2🔥1
ملت از چی پول در میارن 😁

طرف ۹۹ دلار میگیره که ruby رو روی سیستم عامل مک نصب کنه :)
تا الان بیش از ۲ هزار نفر هم بهش پول دادن

https://www.rubyonmac.dev/

حالا من از کجا پیداش کردم؟ برای یه پروژه قدیمی داشتم ruby نصب میکردم که به مشکل خوردم، واقعا هم بعضی وقتا دردسر داره نصبش، مخصوصا اینکه نسخه ۳ هم اومده...

من حاضرم رو سیستم تون کامپایلر گولنگ نصب کنم به همراه همه وابستگی هاش، ۹ دلارم بیشتر نمیگیرم 😄


@gocasts
😁63👍4
Go Casts 🚀
تعداد مشارکت کنندگاه دوره از ۵۰۰ نفر گذشت 🔥 بی نهایت از اعتماد شما متشکریم. ان شاءالله که بتونیم پاسخگوی این همه محبت و اعتماد شما باشیم و بتونیم با تولید محتوای بروز، مناسب و برازنده شما، پاسخگوی محبت شما باشیم دوره +‌ تیمسازی بکند و گولنگ Go Casts لینک…
سلام دوستان
بالاخره سایتمون بروز شد :)

فکر کنم بعد از چند سال لازم بود از یه صفحه خیلی ساده کمی بهتر بشه

زحمت پیاده سازی ش رو دوستان فرانت کشیدن، و من با دخل و تصرف در کارشون صرفا یه سری قسمت هارو خراب کردم :)

اگه مشکلی داشت بدونید کار خودمه، مثلا کلی کلنجار رفتم که بتونم یه سری button رو به وسط صفحه منتقل کنم نشد که نشد 😟😁

از یه برنامه نویس بکند بیشتر از این انتظار نداشته باشید…

فعلا فقط لندینگ اصلی تغییر کرده. سعی کردیم توضیحات خوبی در مورد دوره و تیمسازی تو این صفحه قرار بدیم.

https://gocasts.ir

دمتون گرم ❤️

@gocasts
😍4213👍6🔥6😁1
اگه برای یادگیری گولنگ یه دلیل خیلی موجه میخوای، این پست رو با دقت مطالعه کن

آخرش رو اولش بخوام بگم میشه: یادگیری برنامه نویسی بدون فریمورک
حالا این قضیه چرا مهمه؟

درک practiceهای برنامه نویسی و ترکیب کردن اونا کار سختیه. ولی وقتی درکشون کنی و تجربه به کارگیری شون رو داشته باشی، یه دریچه ای به روت باز میشه که خیلی ارزشمند هست و بهت این قدرت رو میده که با انتخاب خودت و با تحلیل خودت انواع ترکیب الگوهارو در کنار هم برای سیستم خودت بسته به نیازت به کار بگیری.

خیلی از الگوهای برنامه نویسی رو فریمورک ها استفاده میکنن و کار رو برای شما خیلی راحت میکنن. اما این راحت شدنه یه هزینه ای داره، اونم اینه که اجازه نمیده به شما برنامه نویسی و کار با الگوهارو تجربه کنی.

گولنگ مزیت بزرگش یادگیری بدون فریمورک همین الگوهاست. بعد از یه مدت که الگوهای مختلف رو خودت تو گولنگ به کار میگیری با خیلی هاشون به اندازه کافی آشنا میشی و برای پروژه های جدیدت با خیال راحت تر و دست باز تصمیم میگیری چه ترکیبی از practiceهارو استفاده کنی.
گولنگ زبان جمع و جوریه و این خودش باز باعث میشه خیلی نتونی تو پیاده سازی الگوها شیوه های مختلفی رو به کار بگیری که انتخاب شیوه پیاده سازی وسواس برات ایجاد کنه.

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

@gocasts
👍71🔥74
Go Casts 🚀
اگه برای یادگیری گولنگ یه دلیل خیلی موجه میخوای، این پست رو با دقت مطالعه کن آخرش رو اولش بخوام بگم میشه: یادگیری برنامه نویسی بدون فریمورک حالا این قضیه چرا مهمه؟ درک practiceهای برنامه نویسی و ترکیب کردن اونا کار سختیه. ولی وقتی درکشون کنی و تجربه به کارگیری…
اجازه بدید برای پست دیروز یه مثال بزنم که شاید به درک بهتر موضوع کمک کنه.

از زیبایی های گولنگ اینه که پکیج ها و building blockهای سطح بالا ارائه میده، که سرعت توسعه برنامه نویس خوب باشه.
حالا مثلا برای یه web framework چه building blockهایی لازمه؟
اگه با گولنگ کار کنی بعد از مدتی میتونی blockهای مهمی که بخواد functionality یه فریمورک وب رو ارائه بده بشناسی، از جمله: یه http listener میخوای که درخواست هارو accept کنه، یه multiplexer میخوای که بر اساس request path درخواست هارو توزیع کنه، یه سری handler لازم داری که درخواست هارو مدیریت کنه، این وسط ممکنه یه سری middleware لازم داشته باشی، ممکنه تو handlerت validation لازم داشته باشی، بعدش نوبت به بیزینس لاجیک ت میرسه و بعدش هم به database driver احتیاج داری که ارتباط با دیتابیس رو مدیریت کنه.

قشنگی کار اینجاست که تو هر building block شما علاوه بر یک سری انتخاب از std packageها میتونی third-party پکیج هارو هم استفاده کنی و به ترکیب های مختلفی این building blockهارو با هم compose کنی و این flexibility فوق العاده ای میده.

علاوه بر همه این ها، برنامه نویس بعد از یه مدت به خودش میاد و میفهمه که نسبت به المان های فریمورک وب شناخت خوبی پیدا کرده و کارایی هر بلاک رو درک کرده و دیگه براش black box نیست. بعدش میتونه خودش هر بلاک رو تحلیل کنه و از بین انتخاب هاش اونی که براش بهتره رو انتخاب کنه.

@gocasts
👍45👏1
یه تعریف خیلی ساده و شسته و رفته برای Stack و Heap

تو مستندات آموزش rust قبل از اینکه ownership رو توضیح بده در مورد heap و stack صحبت کرده، توضیح کوتاه و خوبیه، یادآوری خوبی میتونه باشه
https://doc.rust-lang.org/book/ch04-01-what-is-ownership.html

چقدر این مثالش قشنگه برای اینکه چرا دسترسی به heap کندتر از stack هست

Accessing data in the heap is slower than accessing data on the stack because you have to follow a pointer to get there. Contemporary processors are faster if they jump around less in memory. Continuing the analogy, consider a server at a restaurant taking orders from many tables. It’s most efficient to get all the orders at one table before moving on to the next table. Taking an order from table A, then an order from table B, then one from A again, and then one from B again would be a much slower process. By the same token, a processor can do its job better if it works on data that’s close to other data (as it is on the stack) rather than farther away (as it can be on the heap).


@gocasts
👍196
Go Casts 🚀
تعداد مشارکت کنندگاه دوره از ۵۰۰ نفر گذشت 🔥 بی نهایت از اعتماد شما متشکریم. ان شاءالله که بتونیم پاسخگوی این همه محبت و اعتماد شما باشیم و بتونیم با تولید محتوای بروز، مناسب و برازنده شما، پاسخگوی محبت شما باشیم دوره +‌ تیمسازی بکند و گولنگ Go Casts لینک…
تجربه یه incident با رعایت نکردن اصول ساده

خیلی وقت ها پیش میاد که ما یه سری نکته ساده رو رعایت نمی کنیم و همین موضوع باعث میشه که مشکلات بزرگی در سیستم رخ بده.

من سعی میکنم نکات کوچیکی که طبق تجربه خودم داشتم یا اطرافیانم داشتند رو گاه به گاه منتشر کنم. امروز در مورد یکی از این موارد که باعث incident هم شد صحبت می کنم.

قبل از اینکه شرح بدم incident چی بود در مورد root cause صحبت می کنم که تابع Get از پکیج net/http بود. خیلی هاتون ممکنه برای ارسال درخواست های http در گولنگ از این تابع استفاده کنید و خیلی کار رو هم ساده می کنه.

https://pkg.go.dev/net/http#Get


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

این سرویس با همین مشخصات روی پروداکشن زیر لود بود که فهمیدیم سرویس خارجی ای که اطلاعات رو ازش میگیریم خیلی latency بالایی داره و همین باعث شده درخواست های زیادی باز بمونن برای مدت طولانی و مصرف رم و cpu سرویس بالا رفته و پاسخ ها دچار response time بالا شدن.

اولین نکته ای که به ذهن میرسه اینه که خب بهتره از context timeout استفاده کنیم برای درخواست ها که مثلا یه درخواست http به سرویس خارجی بیشتر از ۳۰ ثانیه باز نمونه.
که خب تابع Get خودش ورودی context نمیگیره، پس باید به فکر راه دیگه ای بود.
برنامه نویس فهمیده بود که تابع Get داره از http.DefaultClient استفاده میکنه و این client یه فیلد timeout داره، پس خیلی سریع تایم اوت رو ست کرد، به این صورت

http.DefaultClient.Timeout = time.Second * 5

کد دیپلوی شد و رفت روی پروداکشن، اتفاقی که افتاد این بود که دیگه مشکل response time وجود نداشت برای سرویس خارجی و اگه درخواست بیشتر از ۵ ثانیه طول میکشید کنسل میشد.

اما یه مشکل جدید خیلی بد بوجود اومده بود، ماژول پرداخت به فنا رفته بود و نمیتونست پرداخت هارو درست مدیریت کنه.

علت چی بود؟‌ علت این بود که اونم داشت از http.Get استفاده میکرد و با تنظیم شدن تایم اوت ۵ ثانیه، اونم درخواست های بیشتر از ۵ ثانیه رو کنسل میکرد.

خب خیلی ها شنیدید که الگوی singleton خیلی جاها میتونه bad practice باشه و یکی از اون جاها همین default http clientی هست که پکیج net/http ارائه میده.

درست ش این بود که هر ماژول برای درخواست های خودش یه http client مجزا داشته باشه که تایم اوت خاص خودش رو ست کنه. حتی میشه از این تابع NewRequestWithContext
استفاده کرد که context رو هم پشتیبانی کنه.

https://pkg.go.dev/net/http#NewRequestWithContext


مشکل singleton اینه که side effectهای تغییر singleton object مبهم میشه، شما میای برای درخواست های سرویس خارجی تایم اوت ست کنی، ولی عملا درخواست های پرداخت رو به فنا میدی..

پکیج net/http و پکیج های دیگه گولنگ برای راحتی استفاده خیلی وقت ها یه default object ارائه میدن، ولی واقعا باید برای استفاده از این objectها احتیاط کرد. بهتره instance خاص خودت رو بسازی که مدیریت stateش فقط خودت رو تحت تاثیر بذاره و side effect نداشته باشه.

@gocasts
👍41🔥8👏1
This media is not supported in your browser
VIEW IN TELEGRAM
ابزار جالبیه برای کار با docker و docker-compose در ترمینال

A simple terminal UI for both docker and docker-compose, written in Go with the gocui library.

https://github.com/jesseduffield/lazydocker

@gocasts
👍34😍12🔥4
بازم داغ داغ بریم سراغ فصل بعد کتاب Go Concurrency که در مورد پکیج پرکاربرد context هست

https://antonz.org/go-concurrency/context/

استفاده از context کاربردهای مختلفی داره که در عین سادگی مهم هم هست.
مثلا برای graceful shutdown کردن اپلیکیشن کاربرد داره.
برای مدیریت زمان پاسخ requestهای client کاربرد داره.
برای propagate کردن auth info کاربر بین درخواست هایی که بین microserviceهای داخلی رد و بدل میشه کاربرد داره.
برای کوئری هایی که به دیتابیس و third-party serviceها زده میشه کاربرد داره.
برای propagate کردن اطلاعات مرتبط با distributed tracing کاربرد داره.

برخی هم یه سری global object رو مثل logger تو context پاس میدن که من خودم به شخصه سعی میکنم چنین استفاده ای نداشته باشم.


دوره +‌ تیمسازی بکند و گولنگ Go Casts
خرید با ۵۰ درصد تخفیف به مبلغ ۴ میلیون و ۵۰۰ هزار تومان از طریق سایت
https://gocasts.ir

همه چیز در مورد دوره و تیمسازی
https://news.1rj.ru/str/gocasts/434

فیدبک های دوره و تیمسازی و استخدام
https://news.1rj.ru/str/gocasts/441

مشاوره تلفنی خرید دوره
https://survey.porsline.ir/s/ATeQL4b4

@gocasts
👍125
یه ابزار خیلی جالب open-source از apache که با گولنگ هم نوشته شده برای مدیریت پایگاه دانش و فروم به کار میاد.

Build a Q&A Platform
with Apache Answer

A Q&A platform software for teams at any scale. Whether it’s a community forum, help center, or knowledge management platform, you can always count on Answer.

https://answer.apache.org


میشه بهش پلاگین هم اضافه کرد
https://answer.apache.org/plugins


@gocasts
👍101
گزارش نظرسنجی JetBrains برای سال ۲۰۲۴ منتشر شده که نتایج جالبی داره.

زبان Go و Rust دو تا زبانی هست که بیشترین adoption را داشتند.

همچنین گولنگ بیشتر از هر زبان دیگه ای برای توسعه web service و cloud service داره استفاده میشه.

گولنگ در لیست زبان های top-paid دوم هست بعد از scala.

گزارش کامل رو اینجا میتونید بخونید
https://www.jetbrains.com/lp/devecosystem-2024/


@gocasts
👍202
اگه میخوای بیشتر در مورد انواع ایندکس های دیتابیس بدونی پیشنهاد میکنم این سری آموزش ویدیویی از PlanetScale رو ببین.

دیدن ش دید عمیق تری بهت میده که بهتر از ایندکس ها استفاده کنی.

لیست موضوعاتی که پوشش داده
Introduction to indexes
B+ trees
Primary keys
Secondary keys
Primary key data types
Where to add indexes
Index selectivity
Prefix indexes
Composite indexes
Covering indexes
Functional indexes
Indexing JSON columns
Indexing for wildcard searches
Fulltext indexes
Invisible indexes
Duplicate indexes
Foreign keys

https://planetscale.com/learn/courses/mysql-for-developers/indexes/introduction-to-indexes

How do Database Indexes Work?
https://planetscale.com/blog/how-do-database-indexes-work


@gocasts
👍22
Go Casts 🚀
اگه میخوای بیشتر در مورد انواع ایندکس های دیتابیس بدونی پیشنهاد میکنم این سری آموزش ویدیویی از PlanetScale رو ببین. دیدن ش دید عمیق تری بهت میده که بهتر از ایندکس ها استفاده کنی. لیست موضوعاتی که پوشش داده Introduction to indexes B+ trees Primary keys Secondary…
ولادت شاه مردان، امیرالمومنین، علی علیه السلام به همه دوستان مبارک

تخفیف روز پدر رو میتونید استفاده کنید تو سایت که نسبت به تخفیف فعلی ۵۰ درصد، ۶۰۰ هزار تومان بیشتر بهتون تخفیف میده

PEDAR

خرید از سایت
https://gocasts.ir

لینک توضیحات
https://news.1rj.ru/str/gocasts/572

روز پدر و مرد بر شما مبارک، ان شاءالله همیشه خوب و خوش و سلامت باشید، سایه تون مستدام باشه بالا سر خانواده تون
دمتون گرم، یا علی ❤️


@gocasts
94😁11👍2🔥1
Go Casts 🚀
اگه میخوای بیشتر در مورد انواع ایندکس های دیتابیس بدونی پیشنهاد میکنم این سری آموزش ویدیویی از PlanetScale رو ببین. دیدن ش دید عمیق تری بهت میده که بهتر از ایندکس ها استفاده کنی. لیست موضوعاتی که پوشش داده Introduction to indexes B+ trees Primary keys Secondary…
تو دیتابیس ها یه مفهومی وجود داره به اسم clustered index که در مقابلش non clustered index قرار میگیره

خب این clustered index یعنی چی؟ یعنی اینکه ترتیبی که داده ها در ایندکس قرار میگیرن، همون ترتیبی هست که داده ها در فایل و دیسک ذخیره میشن.

بنابراین هر جدول دیتابیس فقط میتونه یه clustered index داشته باشه که معمولا primary key هست.

کجا ها clustered index مهمه؟ جاهایی که شما range query یا sequential scan داری مهم میشه

چرا مهم میشه؟ چون دیتابیس با تعداد io کمتر رکوردهارو از فایل و دیسک fetch میکنه

حالا قرار دادن یه guid مثل uuid به عنوان primary key چه بلایی سر clustered index میاره؟ عملا رکوردهایی که در ایندکس دارن مرتب میشن میتونن تو فایل های مختلفی از دیسک scatter بشن و هزینه fetch کردن شون در کوئری های range رو بالا ببره.

یه سری دیتابیس ها یه سری بهبود برای این قضیه دارن، مثلا یه implicit primary key خودشون در نظر میگیرن که incremental integer هست و اون رو clustered index در نظر میگیرن.

Be careful with GUID as clustered index
https://blog.novanet.no/careful-with-guid-as-clustered-index/


@gocasts
👍402
هفته نامه Golang Nugget رو اگه دوست داشتید دنبال کنید.
منابع خوبی رو معرفی میکنه
این یه نمونه ش هست

https://golangnugget.com/p/go-concurrency-upgrade-strategies-memory-management-january-6-2024

این خبرنامه رو آقا لیام عزیز مدیریت میکنه
https://x.com/liammanesh


@gocasts
👍84
ویکی postgresql یه لیستی از anti-patternهارو لیست کرده و در موردشون توضیح داده، خوبه که لیست رو ببینید، احتمالش زیاده همین الان، در لحظه چند تا از این anti-patternهارو در حال استفاده باشید که بهتره جایگزین کنید.
مثلا NOT IN یا BETWEEN شاید استفاده ش کم نباشه تو کوئری ها.

https://wiki.postgresql.org/wiki/Don%27t_Do_This


@gocasts
👍23🔥1
آفر از هف هشتاد 🔥 (فیدبک در تصویر)

دوستمون از هف هشتاد آفر گرفته و در نهایت هم در یه شرکت دیگه استخدام شد (آفر یه شرکت دیگه رو بصورت دورکاری قبول کرد)

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


خرید از سایت با تخفیف ۵۰ درصد
https://gocasts.ir

همه چیز در مورد دوره و تیمسازی در این پست توضیح داده شده
https://news.1rj.ru/str/gocasts/434

تو این پست هم میتونید فیدبک های دوره و تیمسازی و استخدام بچه هارو بخونید
https://news.1rj.ru/str/gocasts/441

دوستانی که در خرید دوره تردید دارند میتونن برای مشاوره کوتاه تلفنی، فرم زیر رو پر کنند که باهاشون تماس بگیرم
https://survey.porsline.ir/s/ATeQL4b4

@gocasts
🔥25👍3