Gopher Academy
3.34K subscribers
918 photos
40 videos
279 files
2K links
🕸 Gopher Academy

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

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

ادمین:
@mrbardia72
Download Telegram
🔴پروتوباف🔴

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

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

در مرحله بعد XML داشتیم که فکر نمیکنم دیگه هیچ‌جایی استفاده بشه پس توضیح نمیدم ولی توی وب خیلی کاربرد داشت تا اینکه جی‌سون معرفی شد.

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

و اما پروتوباف (protocol buffers) در سال ۲۰۰۸ توسط گوگل ایجاد شد (که در اون تاریخ SPDY نام داشت)، یک استاندارده که بیشتر برای ارتباط داخلی (ارتباط سرویس‌ها با یکدیگر) استفاده میشه اما این روزها دارن تلاش میکنند که این استاندارد سمت کاربر هم قابل استفاده باشه که فعلا در اندروید امکان پذیره و نمونه‌هایی هم برای مرورگر آماده شده، به علت باینری بودن قابل استفاده در HTTP/2 است از همین جهت سرعت و پرفورمنس خیلی بهتری داره.

مزیت‌های پروتوباف: تایپ دیتاها تعریف شدس، دیتاها بصورت اتوماتیک کمپرس میشن، تمام مسیج‌های ارسالی و دریافتی ساختار (schema) دارن (توی فایل proto تعریف میشن و بعدا توسط جنریتور کد مخصوص زبان شما جنریت میشه)، داکیومنت میتونه توی فایل proto نوشته بشه، دیتاها میتونه توی هر زبان برنامه نویسی‌ای خونده بشه، ساختار (schema) میتونه هرزمانی توسعه پیدا کنه، حدود ۷ برابر سریعتر از جیسونه، کدها بصورت اتوماتیک برای زبان شما جنریت میشه.

و معایب پروتوباف: ممکنه کد جنریتورش بعضی از زبانها رو ساپورت نکنه، نمی‌تونید دیتاهارو موقع انتقال با تکست ادیتور باز کنید (چون باینتریه).

#proto3

🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Defining A Message Type🔴

نحوه تعریف فایل protoبه صورت شکل فوق هست یعنی در گام اول ورژن سینتکس فایل protoخودتون رو مشخص می کنید
اگر مشخص نکنید به صورت پیش فرض روی ورژن ۲ تنظیم می شود
ما اینجا یه message داریم که تشکیل شده از یه سری فیلد هست
و این فیلد ها از type و name و number تشکیل شده
که تایپ ها نوع های ما هستن
و numberها شماه های ما هستن که از ۱ تا ۱۵ هستن در ادامه در موردشون صحبت می کنیم

🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Assigning Field Numbers🔴

در پروتوبافر اسم فیلدها مهم نیستند (البته منظورمون بعد از بیلد هست، وگرنه موقع دولوپ خیلی هم مهمه!)،
چیزی که مهمه تگ‌ها هستند، منظورمون همون عدادی هستند که در انتهای هر فیلد به ترتیب ۱ ۲ ۳ می‌نویسیم،
در پروداکشن برای شناسایی فیلدها از اسمشون استفاده نمیشه بلکه از تگشون استفاده میشه، پس هر فیلد باید یک تگ منحصر به فرد داشته باشه،
کوچیکترین تگی که میتونید استفاده کنید ۱ هست و بزرگترین ۵۳۶،۸۷۰،۹۱۱ هستش، اگر فکر میکنید این مقدار براتون کافی نیست احتمالا برنامه‌تون منطق اشتباهی داره،
همچنین شما نمیتونید از تگهای ۱۹۰۰۰ تا ۱۹۹۹۹ استفاده کنید، این تگها توسط گوگل برای استفاده‌های خاص رزرو شدن.
چیزی که لازمه بدونید تگ‌های ۱ تا ۱۵ فقط یک بایت فضا اشغال میکنند و تگ‌های ۱۶ تا ۲۰۴۷ دو بایت فضا اشغال می‌کنند.

🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Adding Comments🔴
شما می‌تونید کامنتاتون به فایل پروتوباف اضافه کنید تا نیازی به نوشتن داکیومنت ضافه مثل سرویس‌های رست‌فول نباشید، شما فقط فایل‌های پروتو در اختیار بقیه دولوپرها قرار میدید و اونها سرویس مورد نظر رو کال می‌کنند.

🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Reserved Fields🔴

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

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

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

🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴What's Generated From Your .proto?🔴

زمانی که شما فایل proto رو برای زبان خاصی جنریت می کنید - برای هر زبان یه سری فایل های دیگه ای رو جنریت می کند

برای C ++ یه فایل .h و .cc تولید می کند ، با یک کلاس برای هر نوع پیام که در پرونده شما توصیف شده است.

برای java ، یک فایل .java با کلاس برای هر نوع پیام و همچنین کلاسهای Builder ویژه برای ایجاد نمونه های کلاس پیام ایجاد می کند.

برای python کمی متفاوت است - پایتون یک ماژول با توصیف کننده ایستا از هر نوع پیام در .proto شما ایجاد می کند ، سپس با یک کلاس بزرگ برای ایجاد کلاس دسترسی به داده های لازم پایتون در زمان اجرا استفاده می شود.

برای Go ، یک فایل .pb.go برای هر نوع پیام در پرونده شما ایجاد می کند.

برای Ruby ، یک فایل .rb با ماژول Ruby شامل انواع پیام های شما تولید می کند.

برای Objective-C ، از هر .proto ، یک فایل pbobjc.h و pbobjc.m تولید می کند ، با یک کلاس برای هر نوع پیام که در پرونده شما توصیف شده است.

برای C # ، از هر .proto یک فایل .cs تولید می کند ، با یک کلاس برای هر نوع پیام توصیف شده در پرونده شما.

برای dart ، برای هر نوع پیام در پرونده شما ، یک فایل .pb.dart با کلاس تولید می کند.

🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Scalar Value Types🔴

احتمالا موقع نوشتن فایل پروتو گیج بشید که باید از کدوم یکی نوع مقدار استفاده کنید، برای مثال فقط برای اعداد گزینه‌های:
int32, int64
uint32, uint64
sint32, sint64
fixed32, fixed64
sfixed32, sfixed64
می‌تونید انتخاب کنید.

برای روشن‌تر شدن موضوع توصیه میکنم از لینک زیر به داکیومنت اصلی نگاهی بندازید،جدولی میبینید که توضیح کاملی از تایپ موردنظر تو زبانی که کار می‌کنید داره.
https://developers.google.com/protocol-buffers/docs/proto3#scalar

تمام مقادیر دو نوع ۳۲ بیت و ۶۴ بیت دارن.
تمام نوع‌ها ممکنه بتونند اعداد منفی بگیرن یا نگیرن. (Signed/Unsigned)
تمام این تایپ‌ها موقع کامپایل تبدیل به تایپ قابل فهم برای زبان‌های برنامه شما میشن، پس حتما از جدول این صفحه استفاده کنید.

درک این تایپ‌ها کمک میکنه تا برنامه‌ای با پرفورمنس بالا بنویسید.👇🏻

تایپ int32 و sint32 میتونه مقادیر -۲،۱۴۷،۴۸۳،۶۴۸ تا ۲،۱۴۷،۴۸۳،۶۴۷ در خودش ذخیره کنه
تایپ uint32 میتونه مقادیر ۰ تا ۴،۲۹۴،۹۶۷،۲۹۵ در خودش ذخیره کنه.
تایپ int64 و sint64 میتونه مقادیر -۹،۲۲۳،۳۷۲،۰۳۶،۸۵۴،۷۷۵،۸۰۸ تا ۹،۲۲۳،۳۷۲،۰۳۶،۸۵۴،۷۷۵،۸۰۷ در خودش ذخیره کنه.
تایپ uint64 میتونه مقادیر ۰ تا ۱۸،۴۴۶،۷۴۴،۰۷۳،۷۰۹،۵۵۱،۶۱۵ در خودش ذخیره کنه.


بنابراین یادتون باشه تایپ‌های uint32 و uint64 یا به اصطلاح Unsigned نمی‌تونند مقادیر منفی در خودشون ذخیره کنند.

تایپ‌های int32 و int64 به صورت رسمی اعداد منفی قبول نمی‌کنند. (در این تایپ اعداد منفی فضای بیشتری اشغال می‌کنند)

تایپ‌های sint32 و sint64 اعداد منفی قبول می‌کنند. (با تکنیکی به اسم ZigZag اعداد منفی فضای کمی اشغال می‌کنند)

تایپ fixed32 همیشه ۴ بایت اشغال می‌کنه، اگر عددتون بزرگتر از ۲۶۸،۴۳۵،۴۵۶ بود کاراییش بهتر از uint32 هست، بهتره از این تایپ استفاده کنید.

تایپ fixed64 همیشه ۸ بایت اشتغال می‌کنه، اگر عددتون بزرگتر از ۷۲،۰۵۷،۵۹۴،۰۳۷،۹۲۷،۹۴۰ بود کاراییش بهتر از uint64 هست، بهتره از این تایپ استفاده کنید.


🔰 @gopher_academy
🔴Default Values🔴

چیزی که خیلی مهمه تا بدونید مقدار پیش فرض در پروتوبافه، تمام فیلدها مقدار پیش‌فرض دارن،
برای بولین مقدار false هستش،
برای نامبر عدد ۰ هستش،
برای استرینگ یک رشته خالی،
برای بایت یک رشته بایت خالی،
برای ای‌نام (enum) اولین مقدار لیست،
برای آرایه یک آرایه خالی.

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

🔰 @gopher_academy
🔴معماری سیستم استخراج و ذخیره‌سازی اطلاعات زمان پخش🔴

https://vrgl.ir/OXIPO


🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Enumerations🔴
اگر با ای‌نام آشنا نیستید باید بگم یک لیست از مقدایره، همونطور که بولین یک لیست دوتایی از true و false هستش، ای‌نام میتونه یک لیست چندتایی از هر تایپی باشه.

اگر فراموش کردید باید دوباره بگم مقدار اول ای‌نام میشه مقدار پیش‌فرض، نباید اینو فراموش کنید.

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


🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Using Other Message Types🔴

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

🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Nested Types🔴

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

🔰 @gopher_academy
بیزینس شما رشد میکنه و شما باید API هارو آپدیت کنید، بعضی فیلدها تغییر می‌کنند، بعضی فیلد‌ها اضافه و بعضی حدف میشن.

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

خوشبختانه پروتوبافر اینجاهم به دادمون میرسه تا بتونیم بدون دردسر به توسعه اپ ادامه بدیم، پروتوباف full compatibe هست، اگر با این مفهوم آشنا نیستید به عکس بالا نگاه کنید:
در سناریو یک دیتا با فایل جدید نوشته میشه ولی با فایل قدیمی خونده میشه و مشکلی پیش نمیاد.

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

🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Updating A Message Type🔴
هیچوقت نباید تگ فیلدهارو تغییر بدیم.
شما می‌تونید فیلد جدید اضافه کنید، ولی اپلیکیشن با فایل پروتو قبلی اون فیلد‌هارو درنظر نمی‌گیره.
اگر اپلیکیشن شما بخواد فیلدی رو از ریکوئست دریافت کنه ولی نتونه پیداش کنه، مقدار پیش‌فرض درنظر میگیره. (به همین دلیله باید مقدار دیفالت رو بشناسید و مدیریتشون کنید)
همچنین فیلدها می‌تونند حذف بشن، ولی نباید دوباره تگ اون فیلد توی اون مسیج استفاده بشه. برای حذف می‌تونید به اول اسم فیلد OBSOLETE_ اضافه کنید یا تگ رو به reservet اضافه کنید.
تایپ های sint32 و sint64 با یکدیگر سازگار هستند اما با انواع دیگر عدد صحیح سازگار نیستند.
تایپ های string و byte ها تا زمانی که byte ها UTF-8 معتبر باشند سازگار هستند.
اگر byte ها دارای نسخه رمزگذاری شده پیام باشند ، پیام های با بایت سازگار هستند.
تایپ fixed32 با sfixed32 و fix64 با sfixed64 سازگار است.
تایپ های int32 ، uint32 ، int64 ، uint64 و bool همه با هم سازگار هستند - این بدان معناست که شما می توانید ، فیلدی را از یکی از این انواع به نوع دیگر تغییر دهید.
تایپ enum از نظر قالب با int32 ، uint32 ، int64 و uint64 سازگار است

🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Any🔴
تایپ Any شامل یک پیام دلخواه سریال به صورت بایت ، همراه با URL است که به عنوان یک شناسه پیام عمل می کند.
نوع پیش فرض URL برای نوع پیام داده شده است به صورت زیر
type.googleapis.com/_packagename_._messagename_

🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Oneof🔴
تایپ OneOf میگه فقط یکی از متغییرهایی که براش تعریف میکنیم می‌تونه مقدار داشته باشه.
در مسیج بالا داریم میگیم یه آیدی داریم و بعد از اون یکی از مقادیر my_string یا my_bool داریم
پس وقتی داریم این دو مقدار رو میخونیم فقط ممکنه یکی از اون‌ها مقداری روش ست شده باشه. و اما چند نکته:

فیلدهای oneof نمیتونند repated باشن.

توسعه oneof میتونه خیلی پیچیده باشه.

در موقع خواندن مسیج oneof، همه فیلدها نال خواهد بود، بجز آخرین فیلدی که موقع ارسال درخواست ست کردید.
پس اگر my_string و my_bool ست کنید فقط my_bool داری مقدار خواهد بود و my_string نال خواهد بود.

🔰 @gopher_academy
🤔ایا تابحال میدونستید که👇🤔
😐حداکثر حجم اپلود در یوتوب چقدره 👇
🔺Maximum file size:
128GB

🔺Maximum video length:
12 hours

🔺Accepted YouTube video formats:
.mov, .mpeg, .mp4, .avi, .wmv, .mpegps, .flv, webM, and 3GPP

🎯 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Maps🔴

در این تایپ می‌تونید اطلاعات رو به صورت key/value تعریف کنید (مشابه جیسون). از تمامی تایپ‌ها غیر از float/double پشتیابی میکنه، برای مثال:
در مثال بالا ما مجموعه‌ای از یوزرها به همراه پروفایلشون داریم، که کلید هر پروفایل یوزرآیدی و مقدارش مسیج دیگه‌ای به عنوان پروفایله. و اما چند نکته:
فیلدهای map نمیتونند repated باشن.
هیچگونه مرتب سازی روی مپ اتفاق نمیفته، چون مپ key/value هستش.

🔰 @gopher_academy
Gopher Academy
🔴آموزش proto3 از صفر تا صد🔴 proto? 🔴https://t.me/gopher_academy/627 Defining A Message Type 🔴 https://t.me/gopher_academy/628 Assigning Field Numbers 🔴https://t.me/gopher_academy/629 Adding Comments 🔴 https://t.me/gopher_academy/630 Reserved Fields…
🔴Packages🔴
خیلی مهمه برای فایل‌های پروتو پیکج تعریف کنید، وقتی کد برای زبان خودتون جنریت کنید این پکیج‌ها کاربرد دارن، همچنین از کانفلیکت بین اسم مسیج‌ها جلوگیری میکنه، پیکج‌ها تو تمام زبان‌های پشتیبانی میشن.

🔰 @gopher_academy