✍️Pourya SharifiPourya Sharifi
مدیران فنی و CTOهای زیادی رو دیدم که هر روز دنبال افزایش مهارتهای فنی خودشون هستن و تمرکز اصلیشون عمدتا بر روی مسائل فنیه و کمتر دیدم که تواناییهای غیرفنیشون به اندازهی مسائل فنیشون اثربخش باشه. این در حالیه که CTO و مدیر فنی جایگاهی کاملا بین تخصصی با زوایای مختلف داره و نیازه که به همهی این ابعاد توجه بشه. یه زمانی خیلی درگیر این موضوع بودم و یه سری مواردی رو که تو فرآیند مطالعهی Case-Studyها و مرور ضعفهای خودم یادداشت کرده بودم رو باهاتون به اشتراک میذارم و امیدوارم به دردتون بخوره.
دارا بودن EQ بالا و مهارتهای مرتبط با EQ، برای یک مدیر فنی و CTO به هماناندازهی داشتن IQ مهمه و در خیلی از موارد کارایی بیشتری از IQ داره.
منظم باشید! یک CTO و مدیر فنی خوب منظمه و تمام کارهاش رو فقط با الویتبندی دقیق و نظم بالاست که میتونه به موقع و درست انجام بده.
داکیومنت کنید. هر چیزی رو که فکر میکنید مهمه داکیومنت کنید. در نظر داشته باشید که شما همیشه مشغول انجام یه کار مهم هستید پس همه چیز رو داکیومنت کنید! مهمترین ابزاری که هر CTO در بلندمدت در اختیار خواهد داشت، یه داکیومنتیشن خوبه.
دانش خوب، تجربهی خوب، زیرساخت خوب، معماری خوب و در نهایت خروجی خوب وقتی محقق میشه که تیم خوب داشته باشید. تیم خوب ساختنیه و صرف جذب آدمهای باتجربه و باسواد و بهکارگیری ابزار خوب باعث رسیدن به هدف نمیشه. مدیر فنی و CTO مسئول مستقیم ساختن تیم خوب و ایجاد فضا و فرهنگ تیمی خوب توی تیمشه!
یک CTO خوب باید بتونه خوب حرف بزنه و درست و صحیح ارتباط برقرار کنه و تعامل کنه و در موقع مقتضی خوب بجنگه! در عین حال باید صبور باشه و اصطلاحا زود از کوره در نره و شنوندهی خوبی هم باشه. باید شناخت خوبی از بعد انسانی و فنی خودش و همهی همتیمیهاش و مدیران بالادستی داشته باشه. یه CTO همیشه باید پاسخگوی مدیران بالادستی و در عین حال پاسخگوی افراد تیمش باشه، از این رو دارا بودن هنر تعامل، هنر صبور بودن و هنر تمیز دادن مسائل از یکدیگر، برای هر مدیری الزامیه.
یک CTO همیشه باید چیزی برای یاد دادن و انتقال دادن به تیمش داشته باشه و همیشه باید بتونه چیزهایی رو از مدیران و همتیمیهاش یاد بگیره. CTO مسئول پیشرفت تیم و همتیمیهاشه. نداشتن نگاه بالا به پایین و داشتن انگیزه برای یادگیری مستمر در موضوعات فنی و غیرفنی، باید جزو برنامههای روزمرهی یک مدیر باشه.
یه مدیر خلاق به تنهایی نمیتونه خروجی خلاقانه داشته باشه. این روحیهی خلاقیت تیمی هست که خروجی خلاقانه رو میسازه و مهارت حل مسئله رو توی یک تیم تقویت میکنه. مدیر یک تیم وظیفهی تزریق و ترویج روحیهی تفکر و فعالیت خلاقانه و پرورش مهارت حلمسئله رو توی تیمش به عهده داره.
برخلاف خیلی از مواردی که دیدم، یک CTO باید حتما به تمام ابعاد بیزنسی و قانونی کسب و کاری که در حال پیادهسازیش هست آگاه باشه و به تمام ابعاد و قوانین و محدودیتها و باید و نبایدهای اون کسب و کار و مسائل مرتبط باهاش تسلط داشته باشه.
یک CTO باید دانش و آگاهی جامعی از مسائل مالی مرتبط با کاری که داره انجام میده رو داشته باشه. یک CTO باید مفهوم ROI رو بفهمه، باید همیشه ابعاد هزینهای تصمیمی که داره میگیره رو محاسبه کنه. باید بتونه مدیریت هزینه انجام بده و اهداف تیمش رو در راستای اهداف مالی سازمانی پیش ببره و الویتبندی کنه.
و درنهایت یک CTO خوب دنبال راهحله نه مقصر!
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
مدیران فنی و CTOهای زیادی رو دیدم که هر روز دنبال افزایش مهارتهای فنی خودشون هستن و تمرکز اصلیشون عمدتا بر روی مسائل فنیه و کمتر دیدم که تواناییهای غیرفنیشون به اندازهی مسائل فنیشون اثربخش باشه. این در حالیه که CTO و مدیر فنی جایگاهی کاملا بین تخصصی با زوایای مختلف داره و نیازه که به همهی این ابعاد توجه بشه. یه زمانی خیلی درگیر این موضوع بودم و یه سری مواردی رو که تو فرآیند مطالعهی Case-Studyها و مرور ضعفهای خودم یادداشت کرده بودم رو باهاتون به اشتراک میذارم و امیدوارم به دردتون بخوره.
دارا بودن EQ بالا و مهارتهای مرتبط با EQ، برای یک مدیر فنی و CTO به هماناندازهی داشتن IQ مهمه و در خیلی از موارد کارایی بیشتری از IQ داره.
منظم باشید! یک CTO و مدیر فنی خوب منظمه و تمام کارهاش رو فقط با الویتبندی دقیق و نظم بالاست که میتونه به موقع و درست انجام بده.
داکیومنت کنید. هر چیزی رو که فکر میکنید مهمه داکیومنت کنید. در نظر داشته باشید که شما همیشه مشغول انجام یه کار مهم هستید پس همه چیز رو داکیومنت کنید! مهمترین ابزاری که هر CTO در بلندمدت در اختیار خواهد داشت، یه داکیومنتیشن خوبه.
دانش خوب، تجربهی خوب، زیرساخت خوب، معماری خوب و در نهایت خروجی خوب وقتی محقق میشه که تیم خوب داشته باشید. تیم خوب ساختنیه و صرف جذب آدمهای باتجربه و باسواد و بهکارگیری ابزار خوب باعث رسیدن به هدف نمیشه. مدیر فنی و CTO مسئول مستقیم ساختن تیم خوب و ایجاد فضا و فرهنگ تیمی خوب توی تیمشه!
یک CTO خوب باید بتونه خوب حرف بزنه و درست و صحیح ارتباط برقرار کنه و تعامل کنه و در موقع مقتضی خوب بجنگه! در عین حال باید صبور باشه و اصطلاحا زود از کوره در نره و شنوندهی خوبی هم باشه. باید شناخت خوبی از بعد انسانی و فنی خودش و همهی همتیمیهاش و مدیران بالادستی داشته باشه. یه CTO همیشه باید پاسخگوی مدیران بالادستی و در عین حال پاسخگوی افراد تیمش باشه، از این رو دارا بودن هنر تعامل، هنر صبور بودن و هنر تمیز دادن مسائل از یکدیگر، برای هر مدیری الزامیه.
یک CTO همیشه باید چیزی برای یاد دادن و انتقال دادن به تیمش داشته باشه و همیشه باید بتونه چیزهایی رو از مدیران و همتیمیهاش یاد بگیره. CTO مسئول پیشرفت تیم و همتیمیهاشه. نداشتن نگاه بالا به پایین و داشتن انگیزه برای یادگیری مستمر در موضوعات فنی و غیرفنی، باید جزو برنامههای روزمرهی یک مدیر باشه.
یه مدیر خلاق به تنهایی نمیتونه خروجی خلاقانه داشته باشه. این روحیهی خلاقیت تیمی هست که خروجی خلاقانه رو میسازه و مهارت حل مسئله رو توی یک تیم تقویت میکنه. مدیر یک تیم وظیفهی تزریق و ترویج روحیهی تفکر و فعالیت خلاقانه و پرورش مهارت حلمسئله رو توی تیمش به عهده داره.
برخلاف خیلی از مواردی که دیدم، یک CTO باید حتما به تمام ابعاد بیزنسی و قانونی کسب و کاری که در حال پیادهسازیش هست آگاه باشه و به تمام ابعاد و قوانین و محدودیتها و باید و نبایدهای اون کسب و کار و مسائل مرتبط باهاش تسلط داشته باشه.
یک CTO باید دانش و آگاهی جامعی از مسائل مالی مرتبط با کاری که داره انجام میده رو داشته باشه. یک CTO باید مفهوم ROI رو بفهمه، باید همیشه ابعاد هزینهای تصمیمی که داره میگیره رو محاسبه کنه. باید بتونه مدیریت هزینه انجام بده و اهداف تیمش رو در راستای اهداف مالی سازمانی پیش ببره و الویتبندی کنه.
و درنهایت یک CTO خوب دنبال راهحله نه مقصر!
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
✍️ mohammad gholamimohammad gholami
تا حالا شده از اینکه برای تایم طولانی open to work هستید و اون گردالی سبز دور پروفایلتون هست احساس بدی داشته باشید؟
من یادمه یک مقالهای رو بررسی میکردم که میگفت افراد بااستعداد، وقتی برای مدت زمان طولانی در لینکدین اپن تو ورک باشن، کمکم منزوی میشن و احساس سرخوردگی بهشون دست میده.
من با این رزومه، با این سابقه، با این همه دستاورد و با N تا کانکشن، هنوز نتونستم شغل مناسبی پیدا کنم!
الان دوستام درباره من چه فکری میکنن؟ الان hr اون شرکتی که ازش جدا شدم داره ذوق میکنه که دیدی گفتم اگه از اینجا بری کار گیرت نمیاد ... و اورتینک پشت اورتینک ...
یکی از بچهها میگفت من انقدر اپن تو ورک بودم که حالا میتونم یه کلمه "سید" اول اسمم اضافه کنم.
در اپیزود زیر با حلیه درباره تاثیر روانی طولانی شدن open to work صحبت کردم. برای شنیدن اپیزود لطفا با فیلترشکن کلیک کنید.
⭕️ در کست باکس:
https://lnkd.in/dvQSGTVQ
⭕️ در اسپاتیفای:
https://lnkd.in/dUtywGWw
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
تا حالا شده از اینکه برای تایم طولانی open to work هستید و اون گردالی سبز دور پروفایلتون هست احساس بدی داشته باشید؟
من یادمه یک مقالهای رو بررسی میکردم که میگفت افراد بااستعداد، وقتی برای مدت زمان طولانی در لینکدین اپن تو ورک باشن، کمکم منزوی میشن و احساس سرخوردگی بهشون دست میده.
من با این رزومه، با این سابقه، با این همه دستاورد و با N تا کانکشن، هنوز نتونستم شغل مناسبی پیدا کنم!
الان دوستام درباره من چه فکری میکنن؟ الان hr اون شرکتی که ازش جدا شدم داره ذوق میکنه که دیدی گفتم اگه از اینجا بری کار گیرت نمیاد ... و اورتینک پشت اورتینک ...
یکی از بچهها میگفت من انقدر اپن تو ورک بودم که حالا میتونم یه کلمه "سید" اول اسمم اضافه کنم.
در اپیزود زیر با حلیه درباره تاثیر روانی طولانی شدن open to work صحبت کردم. برای شنیدن اپیزود لطفا با فیلترشکن کلیک کنید.
⭕️ در کست باکس:
https://lnkd.in/dvQSGTVQ
⭕️ در اسپاتیفای:
https://lnkd.in/dUtywGWw
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍8🍾1
✍️Mohammad Hassan Daneshvar
یکی از مهمترین وظایف تک لیدها
بالا نگه داشتن پرچم کد بیس در تعامل با "تیم پروداکت و دولوپرهای تیم" در مورد این سه تا موضوعه:
- Beware of Optimization (premature optimization)
- KISS
- YAGNI
برای اینکار نیاز داریم که علاوه بر درک بیزینس، مهارتهای نرم مرتبط با "مذاکره" و "نه گفتن" رو هم داشته باشیم
پی نوشت:
"نه گفتن"، علاوه بر آدمها، بیزینسها رو هم نجات میده
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
یکی از مهمترین وظایف تک لیدها
بالا نگه داشتن پرچم کد بیس در تعامل با "تیم پروداکت و دولوپرهای تیم" در مورد این سه تا موضوعه:
- Beware of Optimization (premature optimization)
- KISS
- YAGNI
برای اینکار نیاز داریم که علاوه بر درک بیزینس، مهارتهای نرم مرتبط با "مذاکره" و "نه گفتن" رو هم داشته باشیم
پی نوشت:
"نه گفتن"، علاوه بر آدمها، بیزینسها رو هم نجات میده
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
✍️ Hossein NazariHossein Nazari
بعد از حمایت مالی گوگل، خبر حمایت مالی مایکروسافت از زبان Rust نیز منتشر شد.
ضمنا در چند وقت اخیر Mark Russinovich (CTO of Azure) هم حمایت هایی از زبان Rust کرده.
زبان Rust راه خودش رو به کرنل لینوکس هم باز کرده.
همه اینها نشانه های خیلی مثبتیه برای توجه ویژه تر به این زبان که در عین حال که پروسه یادگیری نسبتا طولانی تری داره، میتونه مزایای زیادی رو داشته باشه.
توجه داشته باشید گوگل و مایکروسافت خودشون زبان های سی شارپ، گولنگ و تایپ اسکریپت رو دارند، و این ارزش حمایت از Rust رو بیشتر میکنه.
🎯 https://thenewstack.io/microsofts-1m-vote-of-confidence-in-rusts-future/
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
بعد از حمایت مالی گوگل، خبر حمایت مالی مایکروسافت از زبان Rust نیز منتشر شد.
ضمنا در چند وقت اخیر Mark Russinovich (CTO of Azure) هم حمایت هایی از زبان Rust کرده.
زبان Rust راه خودش رو به کرنل لینوکس هم باز کرده.
همه اینها نشانه های خیلی مثبتیه برای توجه ویژه تر به این زبان که در عین حال که پروسه یادگیری نسبتا طولانی تری داره، میتونه مزایای زیادی رو داشته باشه.
توجه داشته باشید گوگل و مایکروسافت خودشون زبان های سی شارپ، گولنگ و تایپ اسکریپت رو دارند، و این ارزش حمایت از Rust رو بیشتر میکنه.
🎯 https://thenewstack.io/microsofts-1m-vote-of-confidence-in-rusts-future/
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍9❤5🍾3
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
- 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
🤔کدام پروتکل ها (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
پاسخ به اینکه آیا 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🍾1 1
* مجموعه وبینار و کارگاه های آموزشی گروه 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
- موضوع:
An overview of docker for data engineers
- مدرس : مهندس بهنام یزدان پناهی
Behnam Yazdanpanahi
- ساعت : ۱۰ الی ۱۲
- هزینه کارگاه آموزشی : رایگان
- پلتفرم : Google Meet
- لینک روز پنجشنبه :
https://lnkd.in/d-TshCEV
- لینک روز جمعه :
https://lnkd.in/dFCCwYky
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
🍾در زیر، لیستی از برخی الگوریتمهای جمعآوری زباله (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
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🍾2❤1
🟢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
🔵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
👍2❤1🍾1
زمانی که روی یک لینک کلیک میشود تا زمانی که جواب از سرور مورد نظر دریافت میشود، چندین مرحله در شبکه طی میشود. این مراحل عبارتند از:
🟢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
🟢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
😐سن از ۲۷
حالا مثلن اگر ۲۶ بود و با استک های بالا هم به صورت حرفه ای کار کرده بود
اون وقت چی....
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍12
در تحلیل الگوریتمها، دو مفهوم مهم به نامهای "مرتبه زمانی" و "پیچیدگی زمانی" وجود دارد که به دقت باید تفاوت آنها را درک کرد:
مرتبه زمانی (Time Complexity):
مرتبه زمانی یک الگوریتم به میزان زمانی که الگوریتم برای اجرا به ورودیهای مختلف نیاز دارد، میپردازد.
معمولاً با استفاده از نمادهای بزرگتر از یک، مانند O(n)، O(n^2) و غیره، بیان میشود.
مرتبه زمانی تعیین میکند که الگوریتم چگونه با افزایش اندازه ورودی عمل میکند.
پیچیدگی زمانی (Complexity of Time):
پیچیدگی زمانی الگوریتم به میزان زمانی که وقتی الگوریتم با ورودیهای مختلف اجرا میشود، صرف میشود، اشاره دارد.
معمولاً به صورت بهینه و بدترین حالت اجرا میشود.
این مفهوم اغلب به عنوان یک نوع مرتبه زمانی استفاده میشود، اما ممکن است با دقت متفاوتی محاسبه شود.
مرتبه زمانی میزان افزایش زمان اجرای الگوریتم را با افزایش اندازه ورودی نشان میدهد، در حالی که پیچیدگی زمانی نشان میدهد که الگوریتم با ورودیهای مختلف به چه شکلی عمل میکند.
برای مثال، یک الگوریتم با مرتبه زمانی O(n^2) ممکن است در بدترین حالت (پیچیدگی زمانی) خود، همواره با ورودیهای بزرگتر، زمان بیشتری برای اجرا صرف کند. اما در برخی حالات بهینه، ممکن است با ورودیهای کوچکتر، زمان کمتری برای اجرا صرف کند. در این حالت، پیچیدگی زمانی الگوریتم در حالت بهینه (بهترین حالت) ممکن است متفاوت از پیچیدگی زمانی آن در بدترین حالت (بدترین حالت) باشد.
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
مرتبه زمانی (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
لیستپیوندی (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:
which is equivalent to
but saves one allocation:
https://github.com/golang/go/issues/62121
☕️ Buy me coffee!
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
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
* چرا اعداد اول انقدر توی رمزنگاری مهم هستن؟
مساله اول - تجزیه
* اعداد اول توی کریپتوگرافی مهم شدن، چون یک طیف گستردهای از الگوریتمها مبتنی بر اعداد اول کار میکنن. مثل RSA و...
اما سوال اصلی اینجاست که...، در همون اول ماجرا، این اعداد چه خاصیتی داشتن که رفتن سراغشون؟؟
این سوال مهم و اصلی و جذاب ماجراست که در ادامه یکمی بهش میپردازم. قبل از اون بگم که الگوریتمهایی مثل RSA توی زیر باکشون، از رویکردهایی استفاده میکنن که برای رمزگذاری و رمزگشایی از "تجـــزیه" یا Factorization استفاده میکنن...
هر عددی رو میشه به یکسری عامل اول تجزیه کرد، این عاملها خشت سازنده عدد هستن و میتونن توی محاسبات این عدد رو به اعداد دیگه مرتبط کنن
[این تخصصیه- یه بار به زبان عامیانه میگم👇]
الان مثلا عدد 21 از دو عامل اول 3 و 7 ساخته میشه...
وقتی ما میتونیم یک بازی-ریاضی طراحی کنیم به این شکل که:
* تو دوتا عدد اول فرض کن/منم دوتا عدد اول فرض میکنم...
* اینجوری ضربشون کن...
* از این عددی که من بدست آوردم استفاده کن تا فلان عدد دیگه رو باهاش پیوند بزنی...
* حالا نتیجه رو به من بگو، من بدون اینکه بدونم دوتا عدد اول تو چیه و تو بدون اینکه بدونی دوتا عدد اول من چیه، این وسط یه عدد رو [بخونین پیام مخفی رو] به هم دیگه منتقل کردیم...
اونوقت این بازی-ریاضی میتونه از اعداد کوچولویی مثل 3 و 7 تعمیم پیدا کنه به اعداد بزرگتر و واقعا در عمل استفاده بشه برای اینکه یه پیام مخفی ردوبدل بشه، بشرطی که اعداد اول به قدری بزرگ باشن که نشه حدس زده بشن - این میشه پایه رمزنگاری نامتقارن مثلا...
اما باز هم این سوال باز میمونه که چیشد که بازی ریاضی مونو بر مبنای اعداد اول انتخاب کردیم؟
ادامه رو بخونین.
=+=+=+=+=+=+=+=+=+=+=+
مساله دوم- رندومنس
* اعداد اول، در بطن خودشون ساختار شبه-رندومی دارن، بخاطر اینه که تا الان کسی نتونسته الگویی دقیق برای اینکه اعداد اول چجوری و با چه ترتیبی ظاهر میشن پیدا کنه -
الگوهای جزئـــی به کرات یافت شده، ولی الگوی دقیق اینکه چطور یه عدد اول پیدا میشه هنوز پس از این همه سال یک راز نهفته هست...
پس این اعداد اول، مثل برخی از ساختارهای دیگه ریاضیات مثل عدد پی (پای) یا عدد اویلر/نپر، هنوز قابل حدس و مدلسازی نیستن...
پس یه سیستمی مثل رمزنگاری که میخواد از یه رندومنــــس معقول بهره ببره، اعداد اول رو وارد ساختارش میکنه:)
الان دقیقا SHA256 از جذرِ جذرِ جذرِ جذرِ.... چندتا عدد اول یعنی (2 و 3 و 5 و...) استفاده میکنه تا seed اولیهش رو بسازه...
توی داکیونتش کسی که طراحیش کرده صراحتا نوشته من اعداد اول رو بخاطر این استفاده کردم چون ماهیت رندومی دارن و با این کار کسی نمیتونه به الگوریتم SHA من شک کنه که یوقت توش بکدور گذاشته باشم... :)
یه هش کریپتوگرافیک استانداردی مثل SHA، باید آنتروپی بالایی داشته باشه تا بتونه به یه رندومنس خوبی برسه و واقعا بشه "هش کریپتوگرافیک" ... برای یافتن این آنتروپی بالا، چی بهتر از عاملهایی که در DNAشون رندومنس وجود داره و ریاضی دانها نمیتونن مدلشون کنن.
[اینم خیلی تخصصی بود - به زبان ساده یه بار بگم👇]
یچیزی مثل هش "شا" دلش میخواد خروجیش خیلی رندوم باشه که قابل حدس نباشه...
برای همین همون اول روی دیتای ورودیش یکمی نمک(salt) میزنه:
برای اینکه بتونه نمکش رو به نحوی انتخاب کنه که همه راضی باشن و متهمش نکنن به پنهانکاری و بکدور، از اعداد اول استفاده میکنه،
چون این اعداد ذات رندومی دارن - و این پاسخ خیلی از چیزهارو میده از جمله اینکه چرا اینقدر توی رمزنگاری مهم هستن...
=+=+=+=+=+=+=+=+=+=+=+
مساله سوم - لگاریتم گسسته
خیلی از مسائل ریاضیاتی حوزه رمزنگاری که با "به نما رسوندن" کار میکنن، به خاطر این امن تلقی میشن که حل کردن برعکس این روند یعنی حل مساله "لگاریتم گسسته" به این سادگی نیست.
لگاریتم گسسته، عکس عملی هست که به کرات توی رمزنگاری استفاده میشه، یعنی مود یا mod یا باقیمونده تقسیم.
لگاریتم گسسته زمانی تعمیم پیدا میکنه و بسیار سخت میشه که پیمانه ها عدد اول باشن، این باعث میشه قابل تجزیه نباشن که پیوند میخوره به بحث اول...
#مطالب_رایگان_و_آزاد
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
مساله اول - تجزیه
* اعداد اول توی کریپتوگرافی مهم شدن، چون یک طیف گستردهای از الگوریتمها مبتنی بر اعداد اول کار میکنن. مثل RSA و...
اما سوال اصلی اینجاست که...، در همون اول ماجرا، این اعداد چه خاصیتی داشتن که رفتن سراغشون؟؟
این سوال مهم و اصلی و جذاب ماجراست که در ادامه یکمی بهش میپردازم. قبل از اون بگم که الگوریتمهایی مثل RSA توی زیر باکشون، از رویکردهایی استفاده میکنن که برای رمزگذاری و رمزگشایی از "تجـــزیه" یا Factorization استفاده میکنن...
هر عددی رو میشه به یکسری عامل اول تجزیه کرد، این عاملها خشت سازنده عدد هستن و میتونن توی محاسبات این عدد رو به اعداد دیگه مرتبط کنن
[این تخصصیه- یه بار به زبان عامیانه میگم👇]
الان مثلا عدد 21 از دو عامل اول 3 و 7 ساخته میشه...
وقتی ما میتونیم یک بازی-ریاضی طراحی کنیم به این شکل که:
* تو دوتا عدد اول فرض کن/منم دوتا عدد اول فرض میکنم...
* اینجوری ضربشون کن...
* از این عددی که من بدست آوردم استفاده کن تا فلان عدد دیگه رو باهاش پیوند بزنی...
* حالا نتیجه رو به من بگو، من بدون اینکه بدونم دوتا عدد اول تو چیه و تو بدون اینکه بدونی دوتا عدد اول من چیه، این وسط یه عدد رو [بخونین پیام مخفی رو] به هم دیگه منتقل کردیم...
اونوقت این بازی-ریاضی میتونه از اعداد کوچولویی مثل 3 و 7 تعمیم پیدا کنه به اعداد بزرگتر و واقعا در عمل استفاده بشه برای اینکه یه پیام مخفی ردوبدل بشه، بشرطی که اعداد اول به قدری بزرگ باشن که نشه حدس زده بشن - این میشه پایه رمزنگاری نامتقارن مثلا...
اما باز هم این سوال باز میمونه که چیشد که بازی ریاضی مونو بر مبنای اعداد اول انتخاب کردیم؟
ادامه رو بخونین.
=+=+=+=+=+=+=+=+=+=+=+
مساله دوم- رندومنس
* اعداد اول، در بطن خودشون ساختار شبه-رندومی دارن، بخاطر اینه که تا الان کسی نتونسته الگویی دقیق برای اینکه اعداد اول چجوری و با چه ترتیبی ظاهر میشن پیدا کنه -
الگوهای جزئـــی به کرات یافت شده، ولی الگوی دقیق اینکه چطور یه عدد اول پیدا میشه هنوز پس از این همه سال یک راز نهفته هست...
پس این اعداد اول، مثل برخی از ساختارهای دیگه ریاضیات مثل عدد پی (پای) یا عدد اویلر/نپر، هنوز قابل حدس و مدلسازی نیستن...
پس یه سیستمی مثل رمزنگاری که میخواد از یه رندومنــــس معقول بهره ببره، اعداد اول رو وارد ساختارش میکنه:)
الان دقیقا SHA256 از جذرِ جذرِ جذرِ جذرِ.... چندتا عدد اول یعنی (2 و 3 و 5 و...) استفاده میکنه تا seed اولیهش رو بسازه...
توی داکیونتش کسی که طراحیش کرده صراحتا نوشته من اعداد اول رو بخاطر این استفاده کردم چون ماهیت رندومی دارن و با این کار کسی نمیتونه به الگوریتم SHA من شک کنه که یوقت توش بکدور گذاشته باشم... :)
یه هش کریپتوگرافیک استانداردی مثل SHA، باید آنتروپی بالایی داشته باشه تا بتونه به یه رندومنس خوبی برسه و واقعا بشه "هش کریپتوگرافیک" ... برای یافتن این آنتروپی بالا، چی بهتر از عاملهایی که در DNAشون رندومنس وجود داره و ریاضی دانها نمیتونن مدلشون کنن.
[اینم خیلی تخصصی بود - به زبان ساده یه بار بگم👇]
یچیزی مثل هش "شا" دلش میخواد خروجیش خیلی رندوم باشه که قابل حدس نباشه...
برای همین همون اول روی دیتای ورودیش یکمی نمک(salt) میزنه:
برای اینکه بتونه نمکش رو به نحوی انتخاب کنه که همه راضی باشن و متهمش نکنن به پنهانکاری و بکدور، از اعداد اول استفاده میکنه،
چون این اعداد ذات رندومی دارن - و این پاسخ خیلی از چیزهارو میده از جمله اینکه چرا اینقدر توی رمزنگاری مهم هستن...
=+=+=+=+=+=+=+=+=+=+=+
مساله سوم - لگاریتم گسسته
خیلی از مسائل ریاضیاتی حوزه رمزنگاری که با "به نما رسوندن" کار میکنن، به خاطر این امن تلقی میشن که حل کردن برعکس این روند یعنی حل مساله "لگاریتم گسسته" به این سادگی نیست.
لگاریتم گسسته، عکس عملی هست که به کرات توی رمزنگاری استفاده میشه، یعنی مود یا mod یا باقیمونده تقسیم.
لگاریتم گسسته زمانی تعمیم پیدا میکنه و بسیار سخت میشه که پیمانه ها عدد اول باشن، این باعث میشه قابل تجزیه نباشن که پیوند میخوره به بحث اول...
#مطالب_رایگان_و_آزاد
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍12 5❤3
What’s the difference between Session-based authentication and JWTs?
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍7🍾1 1