یک نقشه تعاملی عااالی از کرنل لینوکس Linux kernel
خدایش زحمت کشیده
یک مرجع عالی ،
makelinux.github.io/kernel/map/
#DevTwitter | <MehrdadLinux/>
➖➖➖➖➖➖➖➖
👑 @gopher_academy
خدایش زحمت کشیده
یک مرجع عالی ،
makelinux.github.io/kernel/map/
#DevTwitter | <MehrdadLinux/>
➖➖➖➖➖➖➖➖
👑 @gopher_academy
❤7
🎯کتاب
Seven Concurrency Models in Seven Weeks
🌷 این کتاب به بررسی مدل های مختلف برای مدیریت همزمانی در نرمافزار میپردازد. این مدلها شامل "Thread and Locks"، "برنامهنویسی تابعی"، "مدل Actor"، "فرآیندهای ترتیبی ارتباطی"، "پردازش جریان"، "پیمانهبندی دادهها"، و "معماری Lambda" هستند. هر فصل به طور عملی و با مثالهایی از دنیای واقعی، مزایا و چالشهای هر مدل را توضیح میدهد. کتاب هدف دارد تا توسعهدهندگان را برای بهرهبرداری از چند هستهایها، مدیریت هزاران کاربر و دادههای بزرگ، و اطمینان از کارکرد پایدار نرمافزار در مقابل خطاهای سختافزاری و نرمافزاری آماده کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Seven Concurrency Models in Seven Weeks
🌷 این کتاب به بررسی مدل های مختلف برای مدیریت همزمانی در نرمافزار میپردازد. این مدلها شامل "Thread and Locks"، "برنامهنویسی تابعی"، "مدل Actor"، "فرآیندهای ترتیبی ارتباطی"، "پردازش جریان"، "پیمانهبندی دادهها"، و "معماری Lambda" هستند. هر فصل به طور عملی و با مثالهایی از دنیای واقعی، مزایا و چالشهای هر مدل را توضیح میدهد. کتاب هدف دارد تا توسعهدهندگان را برای بهرهبرداری از چند هستهایها، مدیریت هزاران کاربر و دادههای بزرگ، و اطمینان از کارکرد پایدار نرمافزار در مقابل خطاهای سختافزاری و نرمافزاری آماده کند.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍10❤2🔥1💯1🍾1
✍️ Rouzbeh SabzeheiRouzbeh Sabzehei
تو سیستم هایی که باید از قدرت پردازش های Concurrent بهره گرفته بشه یا به اصطلاح Multi-thread نوشته بشه. یکی از دغدغه ها همیشه بحث دسترسی به دیتای Share بین Thread های مختلف هست. اگر این دسترسی (از نوع Read و یا Write ) با استفاده از تکنیک های خاصی انجام نشه میتونه مشکلاتی مثل Data Race و یا Undefined Behavior رو بوجود بیاره.
یکی از راه حل ها استفاده از روش Lock هست که معمولا از Mutex یا RwLock و یا روش های مرسوم دیگه استفاده میشه. جدا از افت پرفورمنسی که این روش داره اگر به درستی استفاده نشه ممکنه منجر به Deadlock و یا مشکلات دیگر Sync نگه داشتن دیتا بشه. اینجور باگ ها بسیار خطرناک هستند و به دلیل پیچیدگی لایه های مختلف از اپلیکیشن گرفته تا سیستم عامل و CPU در زمان و نحوه اجرای این Lock ها ممکنه احتمال رخ دادنش کم باشه و خیلی دیر شناسایی بشه.
توی مطالعه هایی که انجام شده استفاده از روش های Lock-Free (استفاده از Atomic ها) میتونه این مشکلات رو حل کنه و تو مواردی تونسته پرفورمنس رو نسبت به حالت مشابه استفاده از Mutex به نزدیک 63% افزایش بده. یکی از کلیدی ترین الگوریتم ها توی این مطالعات CAS یا Compare and Swap بوده.
البته استفاده از Atomic ها تو بعضی سناریو ها میتونه پیچیدگی کد رو چند برابر کنه و ممکنه رو بعضی معماری های پردازنده های مختلف جواب نده.
کد زیر یک نمونه ساده از مقایسه Mutex و Atomic ها برای یک سناروی مشابه افزایش یک شمارنده عددی هست که با Rust نوشته شده.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
تو سیستم هایی که باید از قدرت پردازش های Concurrent بهره گرفته بشه یا به اصطلاح Multi-thread نوشته بشه. یکی از دغدغه ها همیشه بحث دسترسی به دیتای Share بین Thread های مختلف هست. اگر این دسترسی (از نوع Read و یا Write ) با استفاده از تکنیک های خاصی انجام نشه میتونه مشکلاتی مثل Data Race و یا Undefined Behavior رو بوجود بیاره.
یکی از راه حل ها استفاده از روش Lock هست که معمولا از Mutex یا RwLock و یا روش های مرسوم دیگه استفاده میشه. جدا از افت پرفورمنسی که این روش داره اگر به درستی استفاده نشه ممکنه منجر به Deadlock و یا مشکلات دیگر Sync نگه داشتن دیتا بشه. اینجور باگ ها بسیار خطرناک هستند و به دلیل پیچیدگی لایه های مختلف از اپلیکیشن گرفته تا سیستم عامل و CPU در زمان و نحوه اجرای این Lock ها ممکنه احتمال رخ دادنش کم باشه و خیلی دیر شناسایی بشه.
توی مطالعه هایی که انجام شده استفاده از روش های Lock-Free (استفاده از Atomic ها) میتونه این مشکلات رو حل کنه و تو مواردی تونسته پرفورمنس رو نسبت به حالت مشابه استفاده از Mutex به نزدیک 63% افزایش بده. یکی از کلیدی ترین الگوریتم ها توی این مطالعات CAS یا Compare and Swap بوده.
البته استفاده از Atomic ها تو بعضی سناریو ها میتونه پیچیدگی کد رو چند برابر کنه و ممکنه رو بعضی معماری های پردازنده های مختلف جواب نده.
کد زیر یک نمونه ساده از مقایسه Mutex و Atomic ها برای یک سناروی مشابه افزایش یک شمارنده عددی هست که با Rust نوشته شده.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍8🔥1💅1
✍️ Rouzbeh SabzeheiRouzbeh Sabzehei
ا استفاده از تکنیک Const Expression میتونید موقع کامپایل محاسبات و پردازش هاتون رو انجام بدید. این روش اجازه میده محاسبات مختلفتون موقع ران تایم نباشه و اینجوری سرعت نرم افزار رو تو محاسبات مشخص بالا ببرید. تو ++C میتونید با constexpr و در Rust با const از این ویژگی استفاده کنید.
تو مقاله اخیری که میخوندم برای یک الگوریتم ساده که حلقه ای بود برای محاسبه فاکتوریل یک سری اعداد استفاده از این روش تونسته بود سرعت رو از 2.69 نانوثانیه به 0.245 نانوثانیه در هر پیمایش حلقه کاهش بده یعنی نزدیک 91% بهبود سرعت !
➖➖➖➖➖➖➖➖
👑 @gopher_academy
ا استفاده از تکنیک Const Expression میتونید موقع کامپایل محاسبات و پردازش هاتون رو انجام بدید. این روش اجازه میده محاسبات مختلفتون موقع ران تایم نباشه و اینجوری سرعت نرم افزار رو تو محاسبات مشخص بالا ببرید. تو ++C میتونید با constexpr و در Rust با const از این ویژگی استفاده کنید.
تو مقاله اخیری که میخوندم برای یک الگوریتم ساده که حلقه ای بود برای محاسبه فاکتوریل یک سری اعداد استفاده از این روش تونسته بود سرعت رو از 2.69 نانوثانیه به 0.245 نانوثانیه در هر پیمایش حلقه کاهش بده یعنی نزدیک 91% بهبود سرعت !
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍3🎃2💅2🔥1🍓1
✍️ Rouzbeh SabzeheiRouzbeh Sabzehei
یکی از مواردی که تاثیر زیادی تو Performance نرم افزار داره استفاده از تکنیک Cache Warming هست. به این صورت که دیتای موردنیاز برای پردازش آماده میشه و از قبل در لایه های Cache پردازنده ( L1, L2 و L3 ) Load میشه. در ادامه CPU برای دسترسی به دیتا یا Instruction های موردنیاز لازم نیست از RAM دیتا رو بگیره و میتونه از دیتایی که Cache کرده استفاده کنه.
به طور تقریبی خوندن دیتا از L1 نزدیک ۲۰۰ برابر و L2 نزدیک ۲۰ برابر سریعتر از RAM هست. استفاده از الگو هایی مثل Pre Fetching و Data Oriented Design میتونه باعث Cache Warming بشه
➖➖➖➖➖➖➖➖
👑 @gopher_academy
یکی از مواردی که تاثیر زیادی تو Performance نرم افزار داره استفاده از تکنیک Cache Warming هست. به این صورت که دیتای موردنیاز برای پردازش آماده میشه و از قبل در لایه های Cache پردازنده ( L1, L2 و L3 ) Load میشه. در ادامه CPU برای دسترسی به دیتا یا Instruction های موردنیاز لازم نیست از RAM دیتا رو بگیره و میتونه از دیتایی که Cache کرده استفاده کنه.
به طور تقریبی خوندن دیتا از L1 نزدیک ۲۰۰ برابر و L2 نزدیک ۲۰ برابر سریعتر از RAM هست. استفاده از الگو هایی مثل Pre Fetching و Data Oriented Design میتونه باعث Cache Warming بشه
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🔥7👍2❤1
🔹این مقاله به بررسی ویژگیهای جدید و بهبودهای اعمال شده در نسخه 1.23 زبان برنامهنویسی Go میپردازد.
نکات اصلی:
🔻معرفی Iterators: بستههای iter، slices و maps برای کار با توالیهای داده به صورت استاندارد ارائه شدهاند.
🔻بهبود تایمرها: مشکلات مربوط به توقف و بازنشانی تایمرها بهبود یافته است.
🔻تInterning مقادیر: بهینهسازی حافظه با ذخیره تنها یک نمونه از مقادیر تغییرناپذیر انجام شده است.
🔻مدیریت کوکیها و فایل سیستم: قابلیتهای جدیدی برای مدیریت کوکیها و کپیکردن فایلها معرفی شده است.
🔻ابزارها و runtime: ابزارهای جدیدی برای جمعآوری دادههای تلمتری و بهبود عملکرد trace و vet اضافه شده است.
نتایج مهم:
🔻افزایش کارایی و سادهسازی مدیریت دادهها.
🔻بهبود عملکرد تایمرها و استفاده بهینهتر از حافظه.
🔻ارتقاء قابلیتهای ابزارها و runtime برای تسهیل کار برنامهنویسان.
🟢Go 1.23: Interactive release notes
🔵https://antonz.org/go-1-23/
➖➖➖➖➖➖➖➖
👑 @gopher_academy
نکات اصلی:
🔻معرفی Iterators: بستههای iter، slices و maps برای کار با توالیهای داده به صورت استاندارد ارائه شدهاند.
🔻بهبود تایمرها: مشکلات مربوط به توقف و بازنشانی تایمرها بهبود یافته است.
🔻تInterning مقادیر: بهینهسازی حافظه با ذخیره تنها یک نمونه از مقادیر تغییرناپذیر انجام شده است.
🔻مدیریت کوکیها و فایل سیستم: قابلیتهای جدیدی برای مدیریت کوکیها و کپیکردن فایلها معرفی شده است.
🔻ابزارها و runtime: ابزارهای جدیدی برای جمعآوری دادههای تلمتری و بهبود عملکرد trace و vet اضافه شده است.
نتایج مهم:
🔻افزایش کارایی و سادهسازی مدیریت دادهها.
🔻بهبود عملکرد تایمرها و استفاده بهینهتر از حافظه.
🔻ارتقاء قابلیتهای ابزارها و runtime برای تسهیل کار برنامهنویسان.
🟢Go 1.23: Interactive release notes
🔵https://antonz.org/go-1-23/
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍5🕊2❤1
چقدر از مطالبی که گذاشته میشه راضی هستید؟
درکل از روند فعالیت کانال راضی هستید؟
اگر نظر پیشنهادی انتقادی داشتید توی بیو کانال ای دی من هست
درکل از روند فعالیت کانال راضی هستید؟
اگر نظر پیشنهادی انتقادی داشتید توی بیو کانال ای دی من هست
Final Results
64%
عالیه
34%
متوسط
5%
ضعیف
❤11💯1
Gopher Academy pinned «چقدر از مطالبی که گذاشته میشه راضی هستید؟
درکل از روند فعالیت کانال راضی هستید؟
اگر نظر پیشنهادی انتقادی داشتید توی بیو کانال ای دی من هست»
درکل از روند فعالیت کانال راضی هستید؟
اگر نظر پیشنهادی انتقادی داشتید توی بیو کانال ای دی من هست»
مقاله "First Impressions of Go 1.23's range-over-func Feature" به بررسی ویژگی جدید "range-over-func" در Go 1.23 میپردازد. نویسنده ابتدا با تردید به این ویژگی نگاه میکند، اما پس از بررسی عملی و پیادهسازی آن در کتابخانه Kivik، به نتایج مثبتی میرسد. ویژگی range-over-func امکان ایجاد iteratorهایی با استفاده از توابع را فراهم میکند که باعث سادهتر شدن کد و افزایش خوانایی آن میشود. نتیجهگیری نویسنده این است که این ویژگی یادگیری پیچیدهای ندارد و میتواند به بهبود کدهای موجود کمک کند.
🟢Go 1.23: Interactive release notes
🔵https://boldlygo.tech/posts/2024-07-18-range-over-func/
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🟢Go 1.23: Interactive release notes
🔵https://boldlygo.tech/posts/2024-07-18-range-over-func/
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍6❤1🔥1
🎂🎊امروز زادروز چنل گوفر آکادمی هست🎊🎂
🥂امروز ۸ مرداد دقیقا روزی بود که گوفر آکادمی متولد شد🎂
🍾توی این مسیر کلی چیز یادگرفتم و حتی کلی رفیق خوب پیدا کردم
👑روز های خوب و بد زیادی داشتم تا جای که بود تونستم مقالات مفید و بروز براتون بذارم
🌷کانال ما چهارشنبه ۸ مرداد سال ۹۹ شروع به فعالیت خودش کرد یعنی ۴ سال میگذره از عمر این چنل (خیلی کوچیک بودیم اما زود بزرگ شدیم با تجربه تر شدیم در کنار شما)
🖐 دوستان این چنل ما رو حمایت کنید که همچنان با قدرت کارش رو ادامه بده👑🫡🍾🌷💸🚬
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢اگر تلگرام پرمیموم داری boost کن 👇
🔵 https://t.me/gopher_academy?boost
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢لینک حمایت مالی👇
🔵 https://www.coffeete.ir/gopher_academy
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢 اگرم سوالی نظری انتقادی بود درخدمتم👇
🔵 @mrbardia72
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢اگر دنبال تبلیغ هستی اینجا پیام بده👇
🔵 @labdon_ads
🥂امروز ۸ مرداد دقیقا روزی بود که گوفر آکادمی متولد شد🎂
🍾توی این مسیر کلی چیز یادگرفتم و حتی کلی رفیق خوب پیدا کردم
👑روز های خوب و بد زیادی داشتم تا جای که بود تونستم مقالات مفید و بروز براتون بذارم
🌷کانال ما چهارشنبه ۸ مرداد سال ۹۹ شروع به فعالیت خودش کرد یعنی ۴ سال میگذره از عمر این چنل (خیلی کوچیک بودیم اما زود بزرگ شدیم با تجربه تر شدیم در کنار شما)
🖐 دوستان این چنل ما رو حمایت کنید که همچنان با قدرت کارش رو ادامه بده👑🫡🍾🌷💸🚬
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢اگر تلگرام پرمیموم داری boost کن 👇
🔵 https://t.me/gopher_academy?boost
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢لینک حمایت مالی👇
🔵 https://www.coffeete.ir/gopher_academy
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢 اگرم سوالی نظری انتقادی بود درخدمتم👇
🔵 @mrbardia72
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
🟢اگر دنبال تبلیغ هستی اینجا پیام بده👇
🔵 @labdon_ads
🍾14👍3❤2🏆1🎃1
در Go، بین دو نوع دادهی اشارهگر به یک برش از ساختارها (مثل var x *[]Book)
و برش از اشارهگرها به ساختارها (مثل var y []*Book) تفاوتهای مهمی وجود دارد
که میتواند بر کارایی و نحوه استفاده از آنها تأثیر بگذارد.
تفاوتها و مزایا/معایب
🔵var x *[]Book:
نوع داده: اشارهگر به یک برش از Book.
کاربرد: بیشتر زمانی مفید است که بخواهید برش اصلی را تغییر دهید (مثلاً اندازه آن را افزایش دهید).
مزایا: تغییر اندازه برش (مثل append) مستقیماً بر برش اصلی تأثیر میگذارد.
معایب: استفاده پیچیدهتر از نظر دسترسی به دادهها و مدیریت حافظه. استفاده از اشارهگر به یک برش معمولاً نیازمند تخصیص و مدیریت دستی حافظه است.
🔵var y []*Book:
نوع داده: برشی از اشارهگرها به Book.
کاربرد: معمولاً زمانی استفاده میشود که بخواهید بر روی مجموعهای از ساختارها کار کنید و هر کدام از آنها ممکن است به طور مستقل تغییر کند.
مزایا: سادهتر برای استفاده و مدیریت. دسترسی مستقیم به هر عنصر بدون نیاز به دنبالهروی اشارهگرها.
معایب: ممکن است نیاز به تخصیص حافظه برای هر عنصر داشته باشد.
بهینهتر بودن
در اغلب موارد، استفاده از var y []*Book بهینهتر و سادهتر است. زیرا:
خوانایی و سادگی: کد سادهتر و خواناتر است. دسترسی به عناصر برش بدون نیاز به دنبالهروی اشارهگرها انجام میشود.
مدیریت حافظه: برشها در Go به صورت خودکار مدیریت میشوند و نیازی به مدیریت دستی حافظه نیست.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
و برش از اشارهگرها به ساختارها (مثل var y []*Book) تفاوتهای مهمی وجود دارد
که میتواند بر کارایی و نحوه استفاده از آنها تأثیر بگذارد.
تفاوتها و مزایا/معایب
🔵var x *[]Book:
نوع داده: اشارهگر به یک برش از Book.
کاربرد: بیشتر زمانی مفید است که بخواهید برش اصلی را تغییر دهید (مثلاً اندازه آن را افزایش دهید).
مزایا: تغییر اندازه برش (مثل append) مستقیماً بر برش اصلی تأثیر میگذارد.
معایب: استفاده پیچیدهتر از نظر دسترسی به دادهها و مدیریت حافظه. استفاده از اشارهگر به یک برش معمولاً نیازمند تخصیص و مدیریت دستی حافظه است.
🔵var y []*Book:
نوع داده: برشی از اشارهگرها به Book.
کاربرد: معمولاً زمانی استفاده میشود که بخواهید بر روی مجموعهای از ساختارها کار کنید و هر کدام از آنها ممکن است به طور مستقل تغییر کند.
مزایا: سادهتر برای استفاده و مدیریت. دسترسی مستقیم به هر عنصر بدون نیاز به دنبالهروی اشارهگرها.
معایب: ممکن است نیاز به تخصیص حافظه برای هر عنصر داشته باشد.
بهینهتر بودن
در اغلب موارد، استفاده از var y []*Book بهینهتر و سادهتر است. زیرا:
خوانایی و سادگی: کد سادهتر و خواناتر است. دسترسی به عناصر برش بدون نیاز به دنبالهروی اشارهگرها انجام میشود.
مدیریت حافظه: برشها در Go به صورت خودکار مدیریت میشوند و نیازی به مدیریت دستی حافظه نیست.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍10❤1
مفهوم "propagate" یا "پراپاگیت کردن" در علوم کامپیوتر و برنامهنویسی به معنای انتقال یا گسترش اطلاعات، سیگنالها، تغییرات، یا خطاها از یک بخش به بخش دیگر سیستم است. به عنوان مثال، در شبکههای عصبی مصنوعی، پراپاگیت کردن شامل انتقال سیگنالهای ورودی از طریق لایههای مختلف شبکه به خروجیها است. در مدیریت خطا، پراپاگیت کردن خطا به معنای انتقال یک خطا از یک بخش کد به بخش دیگر است که ممکن است باعث ایجاد خطاهای مرتبط در آن بخشها شود. این مفهوم در بسیاری از زمینههای علمی و مهندسی به کار میرود.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍9❤1🍾1
مقاله موجود در سایت Blacksmith به معرفی یک سرویس جدید برای اجرای GitHub Actions میپردازد که به جای استفاده از سختافزارهای قدیمی سرور، از CPUهای پیشرفته مخصوص بازی استفاده میکند. این سرویس تا 2 برابر سریعتر و بیش از 50٪ ارزانتر از رقبای خود مانند GitHub است. Blacksmith با ارائه ابزارهای قوی برای ساخت سریعتر و ارزانتر پروژهها، بهرهوری توسعهدهندگان را افزایش میدهد. این سرویس با پشتیبانی از ساختهای همزمان نامحدود، I/O سریع با NVMe، و قابلیتهای امنیتی بالا، یک انتخاب جذاب برای تیمهای توسعه است.
🟢Run GitHub Actions Up to 2x Faster at Half the Cost
🔵https://blacksmith.sh/
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🟢Run GitHub Actions Up to 2x Faster at Half the Cost
🔵https://blacksmith.sh/
➖➖➖➖➖➖➖➖
👑 @gopher_academy
💋4❤2
در این مقاله به بررسی روشی کارآمد برای شناسایی باگهای نرمافزاری با استفاده از ترکیب git bisect و مقایسههای مبتنی بر هش میپردازد. این روش در زبان Go برای شناسایی کامیتهای مشکلدار که باعث ایجاد خطا میشوند، استفاده میشود. git bisect با جستجوی باینری در تاریخچه کامیتها و استفاده از هش برای مقایسهها، فرآیند شناسایی باگها را تسریع میکند. نتایج نشان میدهند که این روش زمان شناسایی کامیتهای مشکلدار را به طور قابل توجهی کاهش میدهد و خودکارسازی آن تلاش دستی را کمتر میکند.
برای مثالی عملی از روش اشکالزدایی مبتنی بر bisect، فرض کنید شما در حال کار روی یک پروژه نرمافزاری هستید و متوجه میشوید که یکی از تستهای پروژه اخیراً شکست خورده است. شما میدانید که این تست در گذشته به درستی کار میکرد. برای شناسایی کامیت مشکلدار، میتوانید از git bisect استفاده کنید.
ابتدا git bisect start را اجرا کنید.
سپس کامیتی که تست در آن سالم است را با git bisect good و کامیتی که تست در آن شکست خورده را با git bisect bad مشخص کنید.
git bisect به صورت خودکار به میانهی تاریخچه کامیتها میرود و شما باید تست را اجرا کنید تا وضعیت تست (سالم یا شکسته) را مشخص کنید.
این فرآیند را تکرار کنید تا کامیت مشکلدار شناسایی شود.
🟢Hash-Based Bisect Debugging in Compilers and Runtimes
🔵https://research.swtch.com/bisect
➖➖➖➖➖➖➖➖
👑 @gopher_academy
برای مثالی عملی از روش اشکالزدایی مبتنی بر bisect، فرض کنید شما در حال کار روی یک پروژه نرمافزاری هستید و متوجه میشوید که یکی از تستهای پروژه اخیراً شکست خورده است. شما میدانید که این تست در گذشته به درستی کار میکرد. برای شناسایی کامیت مشکلدار، میتوانید از git bisect استفاده کنید.
ابتدا git bisect start را اجرا کنید.
سپس کامیتی که تست در آن سالم است را با git bisect good و کامیتی که تست در آن شکست خورده را با git bisect bad مشخص کنید.
git bisect به صورت خودکار به میانهی تاریخچه کامیتها میرود و شما باید تست را اجرا کنید تا وضعیت تست (سالم یا شکسته) را مشخص کنید.
این فرآیند را تکرار کنید تا کامیت مشکلدار شناسایی شود.
🟢Hash-Based Bisect Debugging in Compilers and Runtimes
🔵https://research.swtch.com/bisect
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍8
ساختار دادههای interface:
در زمان کامپایل، هر interface به صورت یک ساختار دادهای خاص ذخیره میشود که شامل دو بخش اصلی است:
نوع (Type): نوع دادهای که پیادهسازی واقعی را انجام میدهد.
مقدار (Value): مقداری که در این نوع دادهای خاص ذخیره شده است.
این ساختار دادهای به نام interface value شناخته میشود. یک interface در واقع از دو بخش تشکیل شده است:
یک اشارهگر به نوع پیادهسازی (در واقع نوع دادهای که متدهای interface را پیادهسازی کرده است).
یک اشارهگر به مقدار واقعی آن نوع داده.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
در زمان کامپایل، هر interface به صورت یک ساختار دادهای خاص ذخیره میشود که شامل دو بخش اصلی است:
نوع (Type): نوع دادهای که پیادهسازی واقعی را انجام میدهد.
مقدار (Value): مقداری که در این نوع دادهای خاص ذخیره شده است.
این ساختار دادهای به نام interface value شناخته میشود. یک interface در واقع از دو بخش تشکیل شده است:
یک اشارهگر به نوع پیادهسازی (در واقع نوع دادهای که متدهای interface را پیادهسازی کرده است).
یک اشارهگر به مقدار واقعی آن نوع داده.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🔥6👍3🕊1🏆1🍓1
🔴 درود به همگی اگر دوست داشتید ریپو زیر نمونه سوالات مصاحبه ای گولنگ و یه سری نکات توش هست رو یه نگاهی کنید
🔵و اگر چیزی به ذهنتون اومد که کمه و باید اضافه شه issue کنید
⭐️ استار یادتون نره😘
🟢 https://github.com/mrbardia72/Go-Interview-Questions-And-Answers
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🔵و اگر چیزی به ذهنتون اومد که کمه و باید اضافه شه issue کنید
⭐️ استار یادتون نره😘
🟢 https://github.com/mrbardia72/Go-Interview-Questions-And-Answers
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍7🔥1🕊1
✍️Ali KolahdoozanAli Kolahdoozan
برنامه نویس سنیور هیچ برتری خاصی بر بقیه ندارد
فقط فرقش این است حتی وقتی یک فاجعه درست میشه ، میگه اینم ولش کنید خودم یک خاکی توی سرش میکنم
بیخودی هم استرس نمی گیرد و واقعا بعدا یک خاکی تو سرش میکند
ضمننا تا یک سورس کد از ۱۵ سال پیش دید ، درجا نمیگه باید این را از اول نوشت و دیگه هیچ کاریش نمیشه کرد . همون را ۱۰
سال قابل استفاده میکند تا شرکت با مغز نخورد زمین
➖➖➖➖➖➖➖➖
👑 @gopher_academy
برنامه نویس سنیور هیچ برتری خاصی بر بقیه ندارد
فقط فرقش این است حتی وقتی یک فاجعه درست میشه ، میگه اینم ولش کنید خودم یک خاکی توی سرش میکنم
بیخودی هم استرس نمی گیرد و واقعا بعدا یک خاکی تو سرش میکند
ضمننا تا یک سورس کد از ۱۵ سال پیش دید ، درجا نمیگه باید این را از اول نوشت و دیگه هیچ کاریش نمیشه کرد . همون را ۱۰
سال قابل استفاده میکند تا شرکت با مغز نخورد زمین
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍20❤3🕊2🎉1🍾1
✍️Mohsen EtemadiMohsen Etemadi
در طراحی ایندکس پایگاه داده، مفهومی به نام Cardinality وجود دارد که بیانگر تعداد حالات مختلف یک ستون پایگاه داده است. به عنوان مثال، در جدولی که اطلاعات هویتی مردم ایران را ذخیره میکند، ستون کد ملی که ایندکس شده باشد بهترین Cardinality را دارد، زیرا Cardinality آن برابر با تعداد مردم ایران است.
با آشنایی با مفهوم Cardinality، در طراحی پایگاههای داده توصیه میشود ستونی برای ایندکس انتخاب شود که بیشترین Cardinality را داشته باشد. ستونهایی با Cardinality پایین برای ایندکسگذاری مناسب نیستند. ابتدا دلیل این موضوع بررسی میشود و سپس شرایطی که این قانون نقض میشود مورد بررسی قرار میگیرد
.
در صورتی که در یک جدول چندین ایندکس وجود داشته باشد و یک جستجو بر روی جدول انجام شود، پایگاه داده MySQL تنها از یک ایندکس برای جستجو استفاده میکند و برای ادامه از روش پیمایش بهره میبرد. MySQL ستونی را که کمترین تعداد ردیف دارای آن مقدار ایندکس را دارد انتخاب میکند.
بنابراین، اگر توزیع دادهها در پایگاه داده کاملاً نرمال باشد، ایندکسی که بیشترین Cardinality را دارد برای جستجو استفاده میشود. منظور از نرمال بودن داده این است که، برای مثال، اگر در پایگاه داده نامهای خانوادگی ذخیره میشود، تعداد افراد با نام خانوادگی "حسینی" و "اعتمادی" برابر باشد. اما در واقعیت این شرایط متفاوت است. حال اگر دادهها نرمال نباشند، Cardinality به صورت امید ریاضی کمک میکند که بفهمیم کدام ستون بیشتر در جستجو استفاده میشود. برای مثال، تفاوت فامیلها در ایران از تفاوت اسمها بیشتر است. به همین دلیل، معمولاً از ستون نام خانوادگی در جستجوی پایگاه داده با استفاده از ایندکس استفاده میشود. اما اگر کسی نام "سامیار حسینی" را جستجو کند، به دلیل کمتر بودن تعداد سامیارها نسبت به حسینیها، از ایندکس نام استفاده میشود. در این شرایط، ستون با Cardinality پایینتر که نام است برای جستجوی ایندکس استفاده شده، زیرا تعداد ردیفهای با این نام کمتر است.
در بحث نقض کردن قانون Cardinality بالا برای ایندکس، فرض کنید یک جدول برای کامنتها طراحی کردهاید که هر کامنت سه وضعیت "تایید"، "رد" و "جدید" دارد. کامنتهای جدید باید توسط پشتیبان بررسی شوند. به دلیل Cardinality پایین ستون وضعیت که برابر با سه است، به نظر میرسد برای ایندکس شدن مناسب نیست، اما این تحلیل اشتباه است. باید به نوع توزیع دادهها و نوع کوئریهایی که زده میشود نیز توجه شود. فرض کنید کوئری به این شکل است که ابتدا کامنتهای جدید، سپس تایید شده و سپس رد شده را نمایش دهد. حال اگر روزانه یک میلیون کامنت دریافت کنید، سالانه حدود 365 میلیون کامنت در
سیستم ثبت میشود. فرض کنید کوئری زیر در سیستم زده شود:
select * from comments where status = 'new' limit 100
این کوئری اگر 100 کامنت جدید وجود نداشته باشد باید همه 365 میلیون کامنت را پیمایش کند. توزیع دادهها نرمال نیست و تعداد محدودی کامنت جدید نسبت به سایر حالات وجود دارد. بنابراین، اگر وضعیت "جدید" اهمیت زیادی در کوئریها دارد، حتماً باید این ستون ایندکس شود. مثلا اگر این ستون ایندکس باشد سرعت جستجو در این حلت بسیار سریع تر می شود در اینجا، قانون Cardinality پایین برای ایندکسگذاری نقض میشود.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
در طراحی ایندکس پایگاه داده، مفهومی به نام Cardinality وجود دارد که بیانگر تعداد حالات مختلف یک ستون پایگاه داده است. به عنوان مثال، در جدولی که اطلاعات هویتی مردم ایران را ذخیره میکند، ستون کد ملی که ایندکس شده باشد بهترین Cardinality را دارد، زیرا Cardinality آن برابر با تعداد مردم ایران است.
با آشنایی با مفهوم Cardinality، در طراحی پایگاههای داده توصیه میشود ستونی برای ایندکس انتخاب شود که بیشترین Cardinality را داشته باشد. ستونهایی با Cardinality پایین برای ایندکسگذاری مناسب نیستند. ابتدا دلیل این موضوع بررسی میشود و سپس شرایطی که این قانون نقض میشود مورد بررسی قرار میگیرد
.
در صورتی که در یک جدول چندین ایندکس وجود داشته باشد و یک جستجو بر روی جدول انجام شود، پایگاه داده MySQL تنها از یک ایندکس برای جستجو استفاده میکند و برای ادامه از روش پیمایش بهره میبرد. MySQL ستونی را که کمترین تعداد ردیف دارای آن مقدار ایندکس را دارد انتخاب میکند.
بنابراین، اگر توزیع دادهها در پایگاه داده کاملاً نرمال باشد، ایندکسی که بیشترین Cardinality را دارد برای جستجو استفاده میشود. منظور از نرمال بودن داده این است که، برای مثال، اگر در پایگاه داده نامهای خانوادگی ذخیره میشود، تعداد افراد با نام خانوادگی "حسینی" و "اعتمادی" برابر باشد. اما در واقعیت این شرایط متفاوت است. حال اگر دادهها نرمال نباشند، Cardinality به صورت امید ریاضی کمک میکند که بفهمیم کدام ستون بیشتر در جستجو استفاده میشود. برای مثال، تفاوت فامیلها در ایران از تفاوت اسمها بیشتر است. به همین دلیل، معمولاً از ستون نام خانوادگی در جستجوی پایگاه داده با استفاده از ایندکس استفاده میشود. اما اگر کسی نام "سامیار حسینی" را جستجو کند، به دلیل کمتر بودن تعداد سامیارها نسبت به حسینیها، از ایندکس نام استفاده میشود. در این شرایط، ستون با Cardinality پایینتر که نام است برای جستجوی ایندکس استفاده شده، زیرا تعداد ردیفهای با این نام کمتر است.
در بحث نقض کردن قانون Cardinality بالا برای ایندکس، فرض کنید یک جدول برای کامنتها طراحی کردهاید که هر کامنت سه وضعیت "تایید"، "رد" و "جدید" دارد. کامنتهای جدید باید توسط پشتیبان بررسی شوند. به دلیل Cardinality پایین ستون وضعیت که برابر با سه است، به نظر میرسد برای ایندکس شدن مناسب نیست، اما این تحلیل اشتباه است. باید به نوع توزیع دادهها و نوع کوئریهایی که زده میشود نیز توجه شود. فرض کنید کوئری به این شکل است که ابتدا کامنتهای جدید، سپس تایید شده و سپس رد شده را نمایش دهد. حال اگر روزانه یک میلیون کامنت دریافت کنید، سالانه حدود 365 میلیون کامنت در
سیستم ثبت میشود. فرض کنید کوئری زیر در سیستم زده شود:
select * from comments where status = 'new' limit 100
این کوئری اگر 100 کامنت جدید وجود نداشته باشد باید همه 365 میلیون کامنت را پیمایش کند. توزیع دادهها نرمال نیست و تعداد محدودی کامنت جدید نسبت به سایر حالات وجود دارد. بنابراین، اگر وضعیت "جدید" اهمیت زیادی در کوئریها دارد، حتماً باید این ستون ایندکس شود. مثلا اگر این ستون ایندکس باشد سرعت جستجو در این حلت بسیار سریع تر می شود در اینجا، قانون Cardinality پایین برای ایندکسگذاری نقض میشود.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
👍6🔥1🍾1
✍️shahriyar bayatshahriyar bayat
پروتکل HTTP3 چیه و چطور کار میکنه؟
پروتکل HTTP/3 یک پروتکل جدید برای انتقال دادهها در وب است که بر اساس پروتکل QUIC ساخته شده. QUIC توسط گوگل توسعه داده شده و ترکیبی از TCP و TLS است که به صورت همزمان برای بهبود عملکرد و امنیت استفاده میشه. قرار هست HTTP/3 جایگزین HTTP/2 بشه و با هدف افزایش سرعت، امنیت و پایداری طراحی شده.
به تازگی ابرآروان هم این قابلیت و توی پنلش فعال کرده و میتونین پروتکل روی QUIC بزارین و سرعت بالاتری رو برای لود سایتتون تجربه کنید.
نسبت به HTTP2 چه مزیت هایی داره؟
سرعت بیشتر: پروتکل HTTP2 مبتنی بر TCP است که ارتباطات را به ترتیب و به صورت پایدار ارسال میکند، اما در صورت از دست رفتن یک بسته، تمام بستهها باید مجدداً ارسال شوند. ولی پروتکل HTTP3 از QUIC استفاده میکنه که مبتنی بر UDP است و به طور موازی چندین جریان داده را ارسال میکنه. به این معنی که از دست رفتن یک بسته داده، سایر بستهها را تحت تأثیر قرار نمیده و ارتباطات سریعتر و پایدارتر هستند.
راه اندازی سریعتر: پروتکل HTTP2 برای راه اندازی اتصال جدید چندین. بار handshake بین کلاینت و سرور انجام میده. ولی توی HTTP3 با استفاده از QUIC تنها یکبار handshake بین کلاینت و سرور انجام میشه که این کار باعث کاهش تاخیر و بهبود سرعت میشه.
امنیت بهتر: پروتکل HTTP2 امنیت و از طریق TLS تامین میکنه که نیاز به مراحل جداگانهای برای رمزگذاری داره. ولی در HTTP3 پروتکل QUIC با استفاده از رمزگذاری داخلی TLS مراحل اضافی رمزنگاری و حذف میکنه و باعث افزایش امنیت میشه.
اما HTTP3 هنوز ضعف هایی هم داره
پشتیبانی محدود: هنوز به اندازه HTTP/2 رایج نشده و همه مرورگرها و سرورها از آن پشتیبانی نمیکنند. این باعث میشه فعلا استفاده گسترده از HTTP/3 ممکن نباشد.
پیچیدگی های پیاده سازی: پیادهسازی و پیکربندی HTTP/3 به دلیل نیاز به استفاده از QUIC و تغییرات پروتکل ممکنه پیچیدهتر باشه. این پیچیدگی میتونه مانع از پذیرش سریعتر این پروتکل بشه.
سازگاری: بعضی از شبکهها و فایروالها ممکنه بستههای UDP را مسدود کنند که این میتونه باعث مشکلاتی در استفاده از HTTP/3 بشه.
پیش نیاز های فعال کردن HTTP3 چیه؟
حداقل نسخه Nginx 1.25 و openssl 1.1.1
➖➖➖➖➖➖➖➖
👑 @gopher_academy
پروتکل HTTP3 چیه و چطور کار میکنه؟
پروتکل HTTP/3 یک پروتکل جدید برای انتقال دادهها در وب است که بر اساس پروتکل QUIC ساخته شده. QUIC توسط گوگل توسعه داده شده و ترکیبی از TCP و TLS است که به صورت همزمان برای بهبود عملکرد و امنیت استفاده میشه. قرار هست HTTP/3 جایگزین HTTP/2 بشه و با هدف افزایش سرعت، امنیت و پایداری طراحی شده.
به تازگی ابرآروان هم این قابلیت و توی پنلش فعال کرده و میتونین پروتکل روی QUIC بزارین و سرعت بالاتری رو برای لود سایتتون تجربه کنید.
نسبت به HTTP2 چه مزیت هایی داره؟
سرعت بیشتر: پروتکل HTTP2 مبتنی بر TCP است که ارتباطات را به ترتیب و به صورت پایدار ارسال میکند، اما در صورت از دست رفتن یک بسته، تمام بستهها باید مجدداً ارسال شوند. ولی پروتکل HTTP3 از QUIC استفاده میکنه که مبتنی بر UDP است و به طور موازی چندین جریان داده را ارسال میکنه. به این معنی که از دست رفتن یک بسته داده، سایر بستهها را تحت تأثیر قرار نمیده و ارتباطات سریعتر و پایدارتر هستند.
راه اندازی سریعتر: پروتکل HTTP2 برای راه اندازی اتصال جدید چندین. بار handshake بین کلاینت و سرور انجام میده. ولی توی HTTP3 با استفاده از QUIC تنها یکبار handshake بین کلاینت و سرور انجام میشه که این کار باعث کاهش تاخیر و بهبود سرعت میشه.
امنیت بهتر: پروتکل HTTP2 امنیت و از طریق TLS تامین میکنه که نیاز به مراحل جداگانهای برای رمزگذاری داره. ولی در HTTP3 پروتکل QUIC با استفاده از رمزگذاری داخلی TLS مراحل اضافی رمزنگاری و حذف میکنه و باعث افزایش امنیت میشه.
اما HTTP3 هنوز ضعف هایی هم داره
پشتیبانی محدود: هنوز به اندازه HTTP/2 رایج نشده و همه مرورگرها و سرورها از آن پشتیبانی نمیکنند. این باعث میشه فعلا استفاده گسترده از HTTP/3 ممکن نباشد.
پیچیدگی های پیاده سازی: پیادهسازی و پیکربندی HTTP/3 به دلیل نیاز به استفاده از QUIC و تغییرات پروتکل ممکنه پیچیدهتر باشه. این پیچیدگی میتونه مانع از پذیرش سریعتر این پروتکل بشه.
سازگاری: بعضی از شبکهها و فایروالها ممکنه بستههای UDP را مسدود کنند که این میتونه باعث مشکلاتی در استفاده از HTTP/3 بشه.
پیش نیاز های فعال کردن HTTP3 چیه؟
حداقل نسخه Nginx 1.25 و openssl 1.1.1
➖➖➖➖➖➖➖➖
👑 @gopher_academy
🍾7👍5❤2
✍️shahriyar bayatshahriyar bayat
آشنایی با ابزار cadvisor برای مانیتورینگ کانیتنر های داکر
ابزار Cadvisor یکی از قدرتمند ترین ابزارهای مانیتورینگ برای کانتینر های داکره اول بریم ببینم چی هست و چه قابلیت هایی رو در اختیارمون میزاره
ابزار cAdvisor (Container Advisor) یه ابزار اپنسورس از گوگل هست که برای جمعآوری، پردازش و نمایش اطلاعات مصرف منابع (CPU، حافظه، شبکه و دیسک) کانتینرها طراحی شده. این ابزار به شما کمک میکنه تا به راحتی عملکرد و سلامت کانتینرهای Docker رو مانیتور کنید.
استفاده ازش چه مزایایی داره؟
cAdvisor به شما اجازه میده تا مصرف منابع کانتینرها رو به صورت لحظهای ببینید و به سرعت مشکلات رو شناسایی کنید.
این ابزار داشبوردهای گرافیکی ساده و user friendly ارائه میده که اطلاعات مصرف منابع رو به صورت تصویری نمایش میده.
ابزار cAdvisor به راحتی با Prometheus ادغام میشه و میتونید دادههای جمعآوری شده رو برای تحلیل و نمایشهای پیشرفتهتر به Prometheus ارسال کنید.
نصب Cadvisor خیلی سادست. cAdvisor به راحتی به عنوان یه کانتینر Docker اجرا میشه و نیاز به کانفیگ پیچیدهای نداره.
اما یه سری محدودیت هم برای Cadvisor وجود داره،
متاسفانه cAdvisor بیشتر برای جمعآوری دادههای پایهای مصرف منابع کاربرد داره و ممکنه برای جمعآوری دادههای پیشرفتهتر محدودیتهایی داشته باشه.
خود cAdvisor هم به عنوان کانتینر در حال اجرا مقداری از منابع سیستم رو مصرف میکنه، بنابراین باید مصرف منابع این ابزار رو هم در نظر بگیرید.
چه جایگزین هایی براش وجود داره؟
یکی از اصلی ترین جایگزین های Cadvisor ترکیب prometheus & Grafana هست این دو ابزار با هم ترکیب میشن تا یه راهحل جامع برای مانیتورینگ و ویژوالیزیشن ارائه بدن. Prometheus برای جمعآوری دادهها و Grafana برای نمایش بصری اونها استفاده میشه.
جایگزین دوم هم میتونه Datadog باشه یه پلتفرم مانیتورینگ و تحلیل که قابلیتهای پیشرفتهتری نسبت به cAdvisor داره و میتونه دادههای مختلفی رو از کانتینرها جمعآوری کنه. بعدا حتما یه پست هم در مورد datadog میزارم.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
آشنایی با ابزار cadvisor برای مانیتورینگ کانیتنر های داکر
ابزار Cadvisor یکی از قدرتمند ترین ابزارهای مانیتورینگ برای کانتینر های داکره اول بریم ببینم چی هست و چه قابلیت هایی رو در اختیارمون میزاره
ابزار cAdvisor (Container Advisor) یه ابزار اپنسورس از گوگل هست که برای جمعآوری، پردازش و نمایش اطلاعات مصرف منابع (CPU، حافظه، شبکه و دیسک) کانتینرها طراحی شده. این ابزار به شما کمک میکنه تا به راحتی عملکرد و سلامت کانتینرهای Docker رو مانیتور کنید.
استفاده ازش چه مزایایی داره؟
cAdvisor به شما اجازه میده تا مصرف منابع کانتینرها رو به صورت لحظهای ببینید و به سرعت مشکلات رو شناسایی کنید.
این ابزار داشبوردهای گرافیکی ساده و user friendly ارائه میده که اطلاعات مصرف منابع رو به صورت تصویری نمایش میده.
ابزار cAdvisor به راحتی با Prometheus ادغام میشه و میتونید دادههای جمعآوری شده رو برای تحلیل و نمایشهای پیشرفتهتر به Prometheus ارسال کنید.
نصب Cadvisor خیلی سادست. cAdvisor به راحتی به عنوان یه کانتینر Docker اجرا میشه و نیاز به کانفیگ پیچیدهای نداره.
اما یه سری محدودیت هم برای Cadvisor وجود داره،
متاسفانه cAdvisor بیشتر برای جمعآوری دادههای پایهای مصرف منابع کاربرد داره و ممکنه برای جمعآوری دادههای پیشرفتهتر محدودیتهایی داشته باشه.
خود cAdvisor هم به عنوان کانتینر در حال اجرا مقداری از منابع سیستم رو مصرف میکنه، بنابراین باید مصرف منابع این ابزار رو هم در نظر بگیرید.
چه جایگزین هایی براش وجود داره؟
یکی از اصلی ترین جایگزین های Cadvisor ترکیب prometheus & Grafana هست این دو ابزار با هم ترکیب میشن تا یه راهحل جامع برای مانیتورینگ و ویژوالیزیشن ارائه بدن. Prometheus برای جمعآوری دادهها و Grafana برای نمایش بصری اونها استفاده میشه.
جایگزین دوم هم میتونه Datadog باشه یه پلتفرم مانیتورینگ و تحلیل که قابلیتهای پیشرفتهتری نسبت به cAdvisor داره و میتونه دادههای مختلفی رو از کانتینرها جمعآوری کنه. بعدا حتما یه پست هم در مورد datadog میزارم.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
❤4👍3