زمانی که روی یک لینک کلیک میشود تا زمانی که جواب از سرور مورد نظر دریافت میشود، چندین مرحله در شبکه طی میشود. این مراحل عبارتند از:
🟢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
#golang #gem: Use a buffered channel as a semaphore.
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
🍾6
✍️ Arman BabaeiArman Babaei
🤝 CTO at WorkgramCTO at Workgram
یک سوال چالشی که شاید در مصاحبه استخدامی ازتون پرسیده بشه.
ببینم تجربیات دیتابیس دوستان در چه حد هست.
سوال:
یک جدول به نام best_programmers داریم با چند میلیون ریکورد.
در این جدول قراره هر روز لیست برنامهنویسان برتر بروزرسانی بشه به صورت صعودی.
چالش: اگر برنامهنویسی از رتبه ۱۰۰۰ به رتبه ۱ منتقل بشه اونوقت شما مجبور هستید رنکینگ همهی برنامهنویسان رو تغییر بدید و با توجه به ریکوردهای زیاد این امر بهینه نیست.
یک راه حل بهینه پیشنهاد بدید که با کمترین هزینه رنکینگ برنامهنویسان بروزرسانی بشه.
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
🤝 CTO at WorkgramCTO at Workgram
یک سوال چالشی که شاید در مصاحبه استخدامی ازتون پرسیده بشه.
ببینم تجربیات دیتابیس دوستان در چه حد هست.
سوال:
یک جدول به نام best_programmers داریم با چند میلیون ریکورد.
در این جدول قراره هر روز لیست برنامهنویسان برتر بروزرسانی بشه به صورت صعودی.
چالش: اگر برنامهنویسی از رتبه ۱۰۰۰ به رتبه ۱ منتقل بشه اونوقت شما مجبور هستید رنکینگ همهی برنامهنویسان رو تغییر بدید و با توجه به ریکوردهای زیاد این امر بهینه نیست.
یک راه حل بهینه پیشنهاد بدید که با کمترین هزینه رنکینگ برنامهنویسان بروزرسانی بشه.
➖➖➖➖➖➖➖➖
💚 Donate
🤍 @gopher_academy
❤️ @GolangEngineers
👍8 2❤1🍾1
system_design_1_fa.pdf
10.7 MB
✅ کتاب ترجمه شده سیستم دیزاین نرم افزار ۱ ( 1 INTERVIEW DESIGN SYSTEM )
نویسنده: Alex Xu
https://system-design.ir/
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
نویسنده: Alex Xu
https://system-design.ir/
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍10🍾4
شرکت OpenAI مدل هوش مصنوعی جدید خود بهنام GPT-4o را معرفی کرد. این مدل، یک شبکهی عصبی multimodal یا omni است. بهعبارتی میتواند پذیرای دادهی ورودی از نوع متن، صوت، تصویر و یا ویدئو باشد. خروجی مدل نیز میتواند از هر نوعی باشد.
این هوش مصنوعی، جایگزینی برای دستیارهای صوتی سنتی مثل Apple Siri یا Amazon Alexa یا Google Assistant است که به مدلهای بنیادین مانند LLM ها مجهز شدهست و میتواند تعامل واقعا هوشمندانهای شبیه به سامانهی سامانثا در فیلم Her ارائه دهد.
پیش از این، ChatGPT قابلیتی بهنام Voice Mode داشت که به کاربران اجازهی تعامل از طریق صوت بهجای نوشتار را میداد. اما در این حالت، ابتدا صدای کاربر به مدل OpenAI Whisper که یک مدل ASR است داده میشد و متن معادل آن صدا بهدست میآمد. سپس این متن به مدل GPT-4 که یک LLM است داده شده و پاسخ مورد نظر در قالب متنی دیگر بهدست میآمد. در نهایت، این پاسخ متنی به کمک یک مدل سادهی TTS به صوت تبدیل و به کاربر ارائه میشد.
این پایپلاین، اگرچه در نوع خود بینظیر بود اما طبیعتا latency قابل توجهی (حدود ۵/۴ ثانیه) داشت که هرگز نمیتوانست حس یک گپوگفت طبیعی را به کاربر منتقل کند. از طرفی کاربر باید منتظر پردازش کامل صحبت قبلی میماند و برخلاف یک گپوگفت طبیعی، نمیتوانست صحبت دستیار را قطع کند. به علاوه اطلاعات مهمی از صحبت کاربر (مانند تون صدا، احساس، نویز محیط و …) به مدل زبانی منتقل نمیشد و صدای خروجی نیز عاری از هرگونه ابراز احساسات، خنده، آواز و … بود.
اما مدل GPT-4o یک مدل end-to-end است یعنی از سه مدل مجزا تشکیل نشده و همهی انواع ورودیها از طریق یک شبکهی عصبی یکتا، پردازش میشوند. بنابراین این مدل بهصورت میانگین طی مدت ۳۲۰ میلیثانیه (مشابه سرعت پاسخگویی انسان) پاسخ کاربر را میدهد.
کیفیت عملکرد این مدل برروی benchmark های متداول برای نوشتار انگلیسی، کدزنی و استدلال، مشابه با مدل GPT-4 Turbo است اما برای تسکهای چندزبانی، پردازش صوت و همچنین بینایی، عملکرد بهتری دارد.
قابلیت پردازش متن و تصویر به کمک مدل GPT-4o از امروز به نسخهی رایگان ChatGPT اضافه شده اما قابلیت پردازش صوت از چندهفته دیگر برای کابران نسخهی Plus در دسترس خواهد بود. توسعهدهندهگان نیز از امروز میتوانند به قابلیتهای پردازش متن و تصویر از طریق API با نصف هزینهی GPT-4 Turbo دسترسی داشته باشند.
نکتهی انگیزشی برای اعضای کانال اینکه در بین سازندگان اصلی این مدل نام تعداد زیادی از هممیهنان عزیزمون به چشم میخوره. آقایان علی کمالی، امین توتونچیان، بهروز قربانی، فرزاد خراسانی، هادی سلمان، رضا زمانی و …
https://openai.com/index/hello-gpt-4o/
#SchoolOfAI
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
این هوش مصنوعی، جایگزینی برای دستیارهای صوتی سنتی مثل Apple Siri یا Amazon Alexa یا Google Assistant است که به مدلهای بنیادین مانند LLM ها مجهز شدهست و میتواند تعامل واقعا هوشمندانهای شبیه به سامانهی سامانثا در فیلم Her ارائه دهد.
پیش از این، ChatGPT قابلیتی بهنام Voice Mode داشت که به کاربران اجازهی تعامل از طریق صوت بهجای نوشتار را میداد. اما در این حالت، ابتدا صدای کاربر به مدل OpenAI Whisper که یک مدل ASR است داده میشد و متن معادل آن صدا بهدست میآمد. سپس این متن به مدل GPT-4 که یک LLM است داده شده و پاسخ مورد نظر در قالب متنی دیگر بهدست میآمد. در نهایت، این پاسخ متنی به کمک یک مدل سادهی TTS به صوت تبدیل و به کاربر ارائه میشد.
این پایپلاین، اگرچه در نوع خود بینظیر بود اما طبیعتا latency قابل توجهی (حدود ۵/۴ ثانیه) داشت که هرگز نمیتوانست حس یک گپوگفت طبیعی را به کاربر منتقل کند. از طرفی کاربر باید منتظر پردازش کامل صحبت قبلی میماند و برخلاف یک گپوگفت طبیعی، نمیتوانست صحبت دستیار را قطع کند. به علاوه اطلاعات مهمی از صحبت کاربر (مانند تون صدا، احساس، نویز محیط و …) به مدل زبانی منتقل نمیشد و صدای خروجی نیز عاری از هرگونه ابراز احساسات، خنده، آواز و … بود.
اما مدل GPT-4o یک مدل end-to-end است یعنی از سه مدل مجزا تشکیل نشده و همهی انواع ورودیها از طریق یک شبکهی عصبی یکتا، پردازش میشوند. بنابراین این مدل بهصورت میانگین طی مدت ۳۲۰ میلیثانیه (مشابه سرعت پاسخگویی انسان) پاسخ کاربر را میدهد.
کیفیت عملکرد این مدل برروی benchmark های متداول برای نوشتار انگلیسی، کدزنی و استدلال، مشابه با مدل GPT-4 Turbo است اما برای تسکهای چندزبانی، پردازش صوت و همچنین بینایی، عملکرد بهتری دارد.
قابلیت پردازش متن و تصویر به کمک مدل GPT-4o از امروز به نسخهی رایگان ChatGPT اضافه شده اما قابلیت پردازش صوت از چندهفته دیگر برای کابران نسخهی Plus در دسترس خواهد بود. توسعهدهندهگان نیز از امروز میتوانند به قابلیتهای پردازش متن و تصویر از طریق API با نصف هزینهی GPT-4 Turbo دسترسی داشته باشند.
نکتهی انگیزشی برای اعضای کانال اینکه در بین سازندگان اصلی این مدل نام تعداد زیادی از هممیهنان عزیزمون به چشم میخوره. آقایان علی کمالی، امین توتونچیان، بهروز قربانی، فرزاد خراسانی، هادی سلمان، رضا زمانی و …
https://openai.com/index/hello-gpt-4o/
#SchoolOfAI
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
Openai
Hello GPT-4o
We’re announcing GPT-4 Omni, our new flagship model which can reason across audio, vision, and text in real time.
🍾10❤4👍2
package main
import "fmt"
func main() {
var values = []string{"1", "2", "3", "4", "5"}
for _, value := range values[1:] {
fmt.Println(value)
}
}
ایجاد و استفاده از حلقه for range در زبان گولنگ و همچنین محدود کردن slice مورد نظر آن به کمک اندیس ها
#go_idiom
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
🍾5👍3 1
✍️ Rouzbeh SabzeheiRouzbeh Sabzehei
🍾اختصاص Thread به یک Core بخصوص !
بعضی اوقات نیازه تا Thread های مختلف سیستم عاملی (OS Thread) رو به Core های خاصی اختصاص بدیم تا مطمن شیم سیستم عامل اونا رو توسط همون Core ای که مشخص کردیم پردازش میکنه. دلیل این کار اینه که میخوایم مطمن بشیم Context Switch بین ترد های برنامه رو به حداقل رسوندیم و ممکنه حتی تنظیماتی روی سیستم عامل انجام دادیم که Signal ها و Interrupt های نرم افزاری و سخت افزاری رو برای یک Core بسته باشیم و بارشون رو روی بقیه Core ها فرستادیم تا اون Core مورد نظر ما Block نشه سر این اتفاقا. اینجوری ۱۰۰ درصد پردازش اون Core اختصاص داده میشه به برنامه مون.
برای این کار میتونیم از syscall سیستم عاملی sched_setaffinity استفاده کنیم که جزو libc هست و روی سیستم عامل های UNIX ای جواب میده فقط ( احتمال خیلی زیاد مشابه این syscall برای Windows هم وجود داشته باشه)
برای توضیحات تکمیلی و روش استفاده میتونید به لینک زیر برید:
https://lnkd.in/dSuhgQSq
کامند taskset کار مشابه ای انجام میده و شما میتونید با مشخص کردن Process ID و Core مورد نظر برنامه تون رو بفرستید به اون Core.
احتمالا داخل اکثر زبان های سیستمی Library مشابه ای باشه که نیاز نباشه خودتون درگیر syscall زدن بشید. پکیج core_affinity_rs برای Rust همین کارو میکنه و خیلی راحت موقع ترد ساختن میتونید ازش استفاده کنید. اگه از ران تایم tokio هم استفاده میکنید tokio یه handler داره برای ترد هایی که ایجاد میکنه که میتونید از این پکیج اونجا استفاده کنید.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
🍾اختصاص Thread به یک Core بخصوص !
بعضی اوقات نیازه تا Thread های مختلف سیستم عاملی (OS Thread) رو به Core های خاصی اختصاص بدیم تا مطمن شیم سیستم عامل اونا رو توسط همون Core ای که مشخص کردیم پردازش میکنه. دلیل این کار اینه که میخوایم مطمن بشیم Context Switch بین ترد های برنامه رو به حداقل رسوندیم و ممکنه حتی تنظیماتی روی سیستم عامل انجام دادیم که Signal ها و Interrupt های نرم افزاری و سخت افزاری رو برای یک Core بسته باشیم و بارشون رو روی بقیه Core ها فرستادیم تا اون Core مورد نظر ما Block نشه سر این اتفاقا. اینجوری ۱۰۰ درصد پردازش اون Core اختصاص داده میشه به برنامه مون.
برای این کار میتونیم از syscall سیستم عاملی sched_setaffinity استفاده کنیم که جزو libc هست و روی سیستم عامل های UNIX ای جواب میده فقط ( احتمال خیلی زیاد مشابه این syscall برای Windows هم وجود داشته باشه)
برای توضیحات تکمیلی و روش استفاده میتونید به لینک زیر برید:
https://lnkd.in/dSuhgQSq
کامند taskset کار مشابه ای انجام میده و شما میتونید با مشخص کردن Process ID و Core مورد نظر برنامه تون رو بفرستید به اون Core.
احتمالا داخل اکثر زبان های سیستمی Library مشابه ای باشه که نیاز نباشه خودتون درگیر syscall زدن بشید. پکیج core_affinity_rs برای Rust همین کارو میکنه و خیلی راحت موقع ترد ساختن میتونید ازش استفاده کنید. اگه از ران تایم tokio هم استفاده میکنید tokio یه handler داره برای ترد هایی که ایجاد میکنه که میتونید از این پکیج اونجا استفاده کنید.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍4 4🍾1
💜 Feedback-Directed Optimization (FDO)
💸 یک تکنیک بهینهسازی است که از دادههای اجرایی برنامه برای بهبود کارایی آن استفاده میکند. این دادهها معمولاً شامل اطلاعاتی درباره hot paths و الگوهای استفاده در کد میباشد.
💜Profile-Guided Optimization (PGO)
💸 نوع خاصی از FDO است که بهینهسازی را بر اساس دادههای پروفایل جمعآوری شده از اجرای برنامه هدایت میکند.
🥂مراحل
↙️جمعآوری دادههای پروفایلینگ: برنامه با بار کاری اجرا میشود تا دادههای اجرایی جمعآوری شود.
↙️تحلیل دادهها: دادههای جمعآوری شده تحلیل میشوند تا الگوهای اجرایی و hot paths شناسایی شوند.
↙️بهینهسازی: کامپایلر از این دادهها برای بهینهسازی کد استفاده میکند، معمولاً تمرکز بر بهبود عملکرد hot paths است.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
💸 یک تکنیک بهینهسازی است که از دادههای اجرایی برنامه برای بهبود کارایی آن استفاده میکند. این دادهها معمولاً شامل اطلاعاتی درباره hot paths و الگوهای استفاده در کد میباشد.
💜Profile-Guided Optimization (PGO)
💸 نوع خاصی از FDO است که بهینهسازی را بر اساس دادههای پروفایل جمعآوری شده از اجرای برنامه هدایت میکند.
🥂مراحل
↙️جمعآوری دادههای پروفایلینگ: برنامه با بار کاری اجرا میشود تا دادههای اجرایی جمعآوری شود.
↙️تحلیل دادهها: دادههای جمعآوری شده تحلیل میشوند تا الگوهای اجرایی و hot paths شناسایی شوند.
↙️بهینهسازی: کامپایلر از این دادهها برای بهینهسازی کد استفاده میکند، معمولاً تمرکز بر بهبود عملکرد hot paths است.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍4❤1
🔴گولنگ و بهینهسازی
در گولنگ، بهینهسازیها به طور مستقیم از طریق تکنیکهای FDO یا PGO اشاره نمیشود، اما کامپایلر و زمان اجرای گولنگ شامل بهینهسازیهای مختلفی هستند که میتوانند از دادههای پروفایلینگ بهرهمند شوند.
🟢بهینهسازیهای کلیدی در گولنگ:
اInlining: کامپایلر گولنگ میتواند توابع کوچک را در جای خود قرار دهد تا هزینه فراخوانی تابع کاهش یابد.
اEscape Analysis: تعیین میکند که آیا متغیرها میتوانند در پشته (stack) به جای هیپ (heap) تخصیص داده شوند، که هزینههای جمعآوری زباله (garbage collection) را کاهش میدهد.
اSSA (Static Single Assignment): کامپایلر گولنگ از فرم SSA برای ایجاد فرصتهای بهتر بهینهسازی استفاده میکند.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
در گولنگ، بهینهسازیها به طور مستقیم از طریق تکنیکهای FDO یا PGO اشاره نمیشود، اما کامپایلر و زمان اجرای گولنگ شامل بهینهسازیهای مختلفی هستند که میتوانند از دادههای پروفایلینگ بهرهمند شوند.
🟢بهینهسازیهای کلیدی در گولنگ:
اInlining: کامپایلر گولنگ میتواند توابع کوچک را در جای خود قرار دهد تا هزینه فراخوانی تابع کاهش یابد.
اEscape Analysis: تعیین میکند که آیا متغیرها میتوانند در پشته (stack) به جای هیپ (heap) تخصیص داده شوند، که هزینههای جمعآوری زباله (garbage collection) را کاهش میدهد.
اSSA (Static Single Assignment): کامپایلر گولنگ از فرم SSA برای ایجاد فرصتهای بهتر بهینهسازی استفاده میکند.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍7❤6
❇️استفاده عملی در گولنگ
هرچند گولنگ به طور صریح از اصطلاحات FDO یا PGO استفاده نمیکند، شما میتوانید از ابزارهای پروفایلینگ و تحلیل عملکرد برای بهینهسازی برنامههای گولنگ خود استفاده کنید.
💋مراحل برای بهینهسازی عملکرد در گولنگ:
😊پروفایلینگ: از ابزارهای داخلی گولنگ مانند pprof برای جمعآوری دادههای پروفایلینگ استفاده کنید.
🤔تحلیل: دادههای پروفایلینگ را تحلیل کنید تا گلوگاهها (bottlenecks)، مسیرهای داغ و مناطق قابل بهبود شناسایی شوند.
🤯بهینهسازی: کد خود را بر اساس بینشهای به دست آمده از پروفایلینگ بازنگری و بهینهسازی کنید.
🥱نمونهای از پروفایلینگ و بهینهسازی در گولنگ
🫡پروفایلینگ با pprof:
🤬تحلیل پروفایل:
از go tool pprof برای تحلیل دادههای پروفایل جمعآوری شده و شناسایی نقاط داغ استفاده کنید.
😴بهینهسازی کد:
بر اساس دادههای پروفایلینگ، کد خود را بازبینی کرده و بهینهسازی کنید.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
هرچند گولنگ به طور صریح از اصطلاحات FDO یا PGO استفاده نمیکند، شما میتوانید از ابزارهای پروفایلینگ و تحلیل عملکرد برای بهینهسازی برنامههای گولنگ خود استفاده کنید.
💋مراحل برای بهینهسازی عملکرد در گولنگ:
😊پروفایلینگ: از ابزارهای داخلی گولنگ مانند pprof برای جمعآوری دادههای پروفایلینگ استفاده کنید.
🤔تحلیل: دادههای پروفایلینگ را تحلیل کنید تا گلوگاهها (bottlenecks)، مسیرهای داغ و مناطق قابل بهبود شناسایی شوند.
🤯بهینهسازی: کد خود را بر اساس بینشهای به دست آمده از پروفایلینگ بازنگری و بهینهسازی کنید.
🥱نمونهای از پروفایلینگ و بهینهسازی در گولنگ
🫡پروفایلینگ با pprof:
package main
import (
"log"
"net/http"
_ "net/http/pprof"
)
func main() {
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
// your code
}
😜اجرای پروفایلر:
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30
🤬تحلیل پروفایل:
از go tool pprof برای تحلیل دادههای پروفایل جمعآوری شده و شناسایی نقاط داغ استفاده کنید.
😴بهینهسازی کد:
بر اساس دادههای پروفایلینگ، کد خود را بازبینی کرده و بهینهسازی کنید.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍8❤3
💜Escape Analysis
یکی از تکنیکهای مهم در بهینهسازی حافظه در زبانهای برنامهنویسی است. با استفاده از این تحلیل، کامپایلر میتواند تصمیم بگیرد که کدام متغیرها باید در stack و کدامها در heap ذخیره شوند، که این امر به بهینهسازی مصرف حافظه و عملکرد برنامه کمک میکند.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
یکی از تکنیکهای مهم در بهینهسازی حافظه در زبانهای برنامهنویسی است. با استفاده از این تحلیل، کامپایلر میتواند تصمیم بگیرد که کدام متغیرها باید در stack و کدامها در heap ذخیره شوند، که این امر به بهینهسازی مصرف حافظه و عملکرد برنامه کمک میکند.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
👍5 3
مایکروسافت در وبسایت رسمی خود ربات دستیار هوش مصنوعی Copilot که بر پایه ChatGPT است را در پلتفرم تلگرام و حالت beta در دسترس عموم قرار داده است و برای تایید باید از شماره غیر ایران استفاده کنید.
مایکروسافت در حالت کنونی با ۳۰ پرسش در روز از طریق ربات @CopilotOfficialBot در دسترس قرار داده است.
➖➖➖➖➖➖➖➖
🕊 @gopher_academy | @GolangEngineers
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3 3