CloudyGo – Telegram
CloudyGo
190 subscribers
9 photos
1 video
1 file
42 links
Software Engineering & Development Best Practices, Especially in Golang!


https://cloudygo.ir

@rezakhademix
Download Telegram
#golang
#tip

مشکل کد زیر کجاست؟

‍‍‍
func main() {

names := make([]string, 0, 10)

names[0] = "reza"

fmt.Println(names)
}

خب این برنامه در ظاهر مشکلی نداره، یک اسلایس تعریف و در خط بعدی ایندکس صفرم دارای مقدار شده، اما نکته مهم اینجاست برای متغیر names یک اسلایس با ظرفیت (capacity) 10، اما طول (length) حقیقی صفر ایجاد شده و هنگامی ‌که در خط بعدی تصمیم به مقداردهی یکی از ایندکس‌های اسلایس می‌کنیم برنامه با خطای ران‌تایم مواجه میشه و نتیجه چنین کدی مساوی با خطای زیر است:

‍‍‍
panic: runtime error: index out of range [0]  with length 0


اگر می‌خواهید به اسلایسی که طول آن صفر است مقداری را اضافه کنید باید با استفاده از تابع ()append به شکل زیر این کار را انجام دهید.

names = append(names, "reza")


اما اگر نیاز داریم حتما مقادیر در ایندکس‌های مشخص در این اسلایس قرار بگیرند باید تعریف متغیر names را به‌ روش درست زیر انجام دهیم:

 names := make([]string, 10)


در این نوع تعریف علاوه‌بر تعیین ظرفیت، طول حقیقی اسلایس نیز معین میشه تا از خطای ران‌تایم جلوگیری شود.
دقت کنید تعریف اسلایس با کلمه کلیدی var و تکرار روند بالا بازهم برنامه را با خطای index out of range روبرو خواهد کرد.

var ages []int
ages[1] = 29 // this line will fail with runtime error: index out of range [1] with length 0



#tip
#golang
1🔥1😱1
#event

سلام دوستان
در نظر دارم تا اولین وبینار خصوصی برنامه‌نویسی cloudygo رو با موضوع «انقلاب در حوزه بک‌اند» برگزار کنم.

طبیعتا این رویداد رایگان، به‌صورت آنلاین و در بستر گوگل‌میت خواهد بود.

حد نصاب علاقمندان برای برگزاری ۷ نفر و حداکثر نفرات ۱۵ نفر خواهد بود که مسلما در آینده نفرات این وبینار از قابلیت‌های پریمیوم کانال cloudygo به‌صورت رایگان بهره‌مند خواهند شد. (این پیام را برای دوستان برنامه‌نویس علاقمند خود ارسال کنید)

خواهشمندم در نظرسنجی زیر شرکت کنید تا بهتر بتونیم رویداد رو برگزار یا موقتا کنسل کنیم.

طبیعتا برای اینکه مسیر آموزش‌های آینده هموار بشه همه ما باید با یک سری مفاهیم آشنا بشیم تا در زمان درست به یادگیری عمیق بپردازیم.

هدف از این وبینار شروع آشنایی و شرح موضوع درباره مباحث فنی زیر خواهد بود و مختص به یک زبان خاص نیست:

۰. توسعه با زبان گولنگ چرا و‌ چگونه؟
۱. پروژه‌های بک‌اند، گیت و دیپلوی سنتی
۲. ریپازیتوری، داکر، پادمن، ریجیستری، کوبرنتیز
۳. دیپلوی و ci cd
۴. مقیاس‌پذیری چیست و چرا مهم است؟
۵. چطور بدانیم مشکل از کجاست؟
۶. ابزارهای کاربردی برای مدیریت بهتر


هدف من بعد از این وبینار، برگزاری جلسات آینده همراه با خروجی مؤثر و اجرای تک‌تک قسمت‌ها در یک پروژه واقعی Golang خواهد بود.
👏2👍1
در اولین وبینار خصوصی cloudygoشرکت می‌کنید؟ (زمان برگزاری ‌به‌زودی اعلام خواهد شد)
Final Results
80%
بلی
20%
خیر
2
#رویداد
#cloudygo

سلام
از همراهی همه شما بسیار ممنونم، این هفته بسیار سرم شلوغ بود!

رویداد Backend Evolution به همت شما، برگزار خواهد شد و در حال آماده‌سازی سرفصل‌ها هستم.

امروز بالاخره تونستم یک ساعت وقت بذارم و سایت کامیونیتی رو ایجاد کنم.

https://cloudygo.ir

سایت در آینده بخش‌های مختلفی رو شامل خواهد شد و هدف من برگزاری رویدادهای live coding برای آموزش موضوعات مختلف از جمله:
Golang, CI/CD, Docker, Microservices, Kubernetes, Open Telemetry, ...

خواهد بود.

به زودی سرفصل رویداد و زمان برگزاری رو در اختیار شما خواهم گذاشت.

از امشب ثبت نام برای علاقمندان از طریق سایت امکان پذیر است.
👍2👏2
#رویداد

اولین وبینار کلودی‌گو با عنوان «تحول بک‌اند» برگزار خواهد شد.

سرفصل‌های این وبینار به‌صورت زیر خواهد بود:

۰. پروژه‌های بک‌اند، گیت و دیپلوی سنتی

۱. داکر، پادمن، کوبرنتیز
- بررسی داکر، پادمن، آموزش کانتینر کردن اپلیکیشن و یادگیری نحوه عملکرد کوبرنتیز

۲. میکروسرویس‌ها و CI CD
- بررسی ماهیت میکروسرویس‌ها و مقیاس‌پذیری، آموزش راه‌اندازی یک سرویس CI CD و دیپلوی خودکار

۳. گرفانا، پرمتئوس
- آموزش راه‌اندازی سرویس گرفانا و پرومتئوس برای مانیتورینگ سرویس‌های مختلف

۴. گولنگ
- چرا توسعه با زبان گولنگ را یاد بگیریم؟
- مسیر آینده کلودی‌گو برای آموزش برنامه‌نویسی گولنگ با clean arch، میکروسرویس، کوبرنتیز


🗓 زمان برگزاری:
پنجشنبه ۱۰ آبان ۱۴۰۳
ساعت ۱۶:۰۰
پلتفرم: گوگل‌میت

📝 ثبت‌نام:
https://cloudygo.ir
🔥21
#رویداد

فردا پنجشنبه ۱۰ آبان ۱۴۰۳ ساعت ۱۶:۰۰ رویداد Backend Evolution کلودی‌گو برگزار خواهد شد و عزیزانی که ثبت‌نام کرده‌اند، لینک شرکت در رویداد براشون ارسال شده است.
ثبت‌نام در رویداد از دیشب به ‌پایان رسیده و امیدارم در رویدادهای بعدی همراه ما باشید.

توضیحات:
با عرض پوزش، به‌دلیل تداخل تایم‌زون سرور، ساعت رویداد در ایمیل یادآوری به‌درستی تنظیم نشده بود!

🗓 زمان برگزاری:
پنجشنبه ۱۰ آبان ۱۴۰۳
ساعت ۱۶:۰۰
پلتفرم: گوگل‌میت


#cloudygo
#event
🔥2👏21
یک راهنمای خوب در خصوص نحوه افزایش Observability و Tracing
در برنامه‌های گولنگ با بررسی بررسی مموری، گوروتین‌ها، تردها و...

https://github.com/DataDog/go-profiler-notes/blob/main/guide/README.md

#blog
#tip
👍5
#رویداد

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

https://github.com/rezakhademix/cloudygo
👍6🙏2
این صفحه از سایت docker برای کسانی میخوان به زبان ساده در خصوص نحوه داکرایز انواع اپلیکیشن‌ها با زبان‌های مختلف اطلاعات کسب کنن، یه سری آموزش و راهنمایی گذاشته که همشون مختصر و به دور از حاشیه رفتن هستند.
همچنین در مورد دیپلوی با کوبرنتیز، swarm، کانتینر کردن دیتابیس‌ها و... هم آموزش‌های جالبی داره!

https://docs.docker.com/guides/


#blog
👍4
گولنگ ۱.۲۴ در ماه فوریه ۲۰۲۵ ارائه میشه و بالاخره توسعه‌هندگان تصمیم گرفتن تگ omitzero رو برای پکیج encoding/json فعال کنن و از این به بعد با نوشتن این تگ علاوه بر مقادیر پیش‌فرض، استراکچرهای خالی هم حذف میشن!

در ورژن‌های فعلی گولنگ تگ‌ omitempty رو داشتیم اما تنها فیلدهای با مقادیر پیش فرض رو حذف میکرد.

یه نگاه به نمونه کد زیر بندازین تا بیشتر موضوع روشن بشه:

type Blog struct {
Name string `json:"omitempty"`
Tags []string `json:"omitempty"`
Posts Posts `json:"omitempty"`
}

تگ‌ omitempty استراکچر درونی Posts رو حذف نمیکنه و فقط فیلدهای Name و Tags رو به شرطی حذف می‌کنه که مقدار پیش‌فرض گولنگی خودشون رو داشته باشن.

برای اینکه این مقادیر رو حذف کنید باید اینترفیس marshaler رو خودتون برای استراکت پیاده‌سازی کنید اما با ورژن ۱.۲۴ با تگ omitzero استراکت‌های خالی به شکل خودکار حذف میشن.

type Blog struct {
Name string `json:"omitzero"`
Tags []string `json:"omitzero"`
Posts Posts `json:"omitzero"`
}


لینک ریلیز ۱.۲۴ گولنگ برای جزییات بیشتر:
https://tip.golang.org/doc/go1.24


#tip
#golang
👏5
یکی از جالب‌ترین مباحث در Golang استفاده از errgroup است.


این نمونه کد از آقای matt boyle به‌خوبی یک مثال ساده از این مفهوم رو به نمایش می‌گذارد.


#tip
👍3🙏2
تفسیر کردن آبجکت‌های json در همه زبان‌های برنامه‌نویسی می‌تونه مثل حرکت کردن در یک میدان مین باشه! 💣

اگر تا حالا در این حوزه عمیق نشدین حتما یه سر به مقاله زیر بزنید که در مورد موضوعات بسیار جالبی در خصوص parse کردن آبجکت‌های json صحبت می‌کنه.

Parsing Json Is A Minefield


#blog
#tip
#deep
2👍2
این داستان: وقتی خودمون با دست خودمون N+1 می‌سازیم!


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

SELECT
posts.id,
posts.caption,
posts.content_url,
COALESCE(
(
SELECT COUNT(*)
FROM post_reactions
WHERE post_reactions.post_id = posts.id
),
0
) AS reactions_count
FROM
posts LEFT JOIN post_reactions ON post_reactions.post_id = posts.id

اگر با بعضی واژه‌ها در کوئری بالا آشنا نیستید مهم نیست، هدف ما بررسی ساب‌کوئری:

 SELECT COUNT(*)
FROM post_reactions
WHERE post_reactions.post_id = posts.id

ساب‌کوئری بالا رو میشه با روش‌های دیگه‌ای هم نوشت و تقریبا همه ما عادت کردیم در بسیاری از موارد وقتی میخوایم دیتایی مرتبط با نتایج مورد نظرمون از جدول‌های دیگه فراخوانی کنیم سریعا سراغ ساب‌کوئری‌ها بریم.

اما باید دقت کنیم که این ساب‌کوئری‌ها در دل خودشون یک N+1 ایجاد میکنن و به‌ ازای تک‌تک ریف‌هایی که فراخوانی کردیم، تکرار میشن و به‌راحتی ما رو در رکوردهای بالا دچار مشکل میکنن!

راه‌حل چنین موضوعاتی استفاده از pre aggregating و CTE هستش.
بهتره در چنین مواقعی با استفاده از WITH در PostgreSQL یا MySQL یا MariaDB از تکرار کوئری‌ها به‌صورت پنهان در Joinها جلوگیری کنیم. نسخه اصلاح شده کوئری:

WITH
reaction_counts AS (
SELECT post_id, COUNT(*) AS reactions_count
FROM post_reactions
GROUP BY
post_id
),
SELECT
posts.id,
posts.caption,
posts.content_url,
reaction_counts.reactions_count
FROM
LEFT JOIN reaction_counts ON reaction_counts.post_id = posts.id



کوئری بالا هم خوانایی بیشتری داره و هم پرفورمنس بهتری! کاری که هیچ ORM درکی از انجامش نداره!


#episode_0
#story
#tip
🔥31
یکی از بهترین رو‌ش‌ها برای اینکه عملکرد کدهاتون رو بهتر کنید اینه که بنچمارک‌های مختلفی روی کد مورد نظرتون اجرا کنید تا مشخص بشه چه قسمت‌هایی باید بهبود پیدا کنن.
مقاله زیر توضیحات کاملی در خصوص بنچمارک کدهای گولنگی بیان کرده و هر بخش رو با مثال شفاف‌تر کرده!

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

https://stackademic.com/blog/profiling-go-applications-in-the-right-way-with-examples

#tip
#bench
👍4
اگر در اپلیکیشنی که دارید زیاد از time.Time استفاده می‌کنید می‌تونید با استفاده از ایجاد یک تایپ دلخواه و استفاده int64 میزان مصرف مموری رو تا حد قابل قبولی کاهش بدید و پرفورمنس رو بهتر کنید. به مثال زیر دقت کنید:

‍‍‍‍
type Timestamp int64

func (t Timestamp) Time() time.Time {
return time.Unix(int64(t), 0)
}

#tip
#golang
👍3
مقاله زیر به ما آموزش میده چطور 1,000,000 رکورد دیتا رو در 4 ثانیه در PostgreSQL ذخیره کنیم!

https://www.timescale.com/learn/testing-postgres-ingest-insert-vs-batch-insert-vs-copy?ref=timescale.com


#tip
#postgresql
#database
👏5
در سالهای اخیر مسیر شغلی DevOps خیلی جدی‌تر داره دنبال میشه و در مقیاس کلی هم تغییرات زیادی به خودش دیده.

معمولا roadmapهای متفاوتی برای این مسیر بیان میشه که یکی از جالب‌ترین‌ها، ریپازیتوری 90DaysDevOps هستش.

این ریپازیتوری 27K استار داره و توسط خود کامیونیتی DevOps در خصوص مسیر یادگیری، قوانین، ابزارها و... ویدیوهای آموزشی و محتوای قابل قبولی داره و هر سال هم به‌روز میشه.


https://github.com/MichaelCade/90DaysOfDevOps/tree/main

#devops
#github
👍4🔥2
اگر هنوز یه quick start خوب برای یادگیری پرومتئوس و گرافانا پیدا نکردین یه نگاهی به ریپازیتوری زیر بندازین.

این ریپازیتوری 4.4k استار داره و علاوه بر داکرایز کردن، در خصوص هشدارها (alerts) و دیپلوی کردن هم نکات اولیه رو به سادگی بیان می‌کنه.

https://github.com/vegasbrianc/prometheus?tab=readme-ov-file

#github
👍4👏1
اگر در گیت‌هاب فعالیت می‌کنید می‌تونید با وارد شدن به لینک زیر خلاصه‌ای از فعالیت‌هاتون رو زیر ذره‌بین ببرین!

https://githubunwrapped.com/


#fun
#github
👍3