Forwarded from 🎄 یک برنامه نویس تنبل (Lazy 🌱)
🔶 گیت هاب یک گزینه جدید برای سازمانهای متن باز معرفی کرده که به آن ها امکان می دهد, درآمدزایی کنند.
طبق این طرح، یک مشارکت کننده میتواند با پرداخت مبلغی کم، رویه های CI/CD را نادیده بگیرد و تغییر خودش را به زور ادغام (force merge) کند. این موضوع می تواند به شدت به دنیای متن باز ضربه بزند.
#خبر
@TheRaymondDev
طبق این طرح، یک مشارکت کننده میتواند با پرداخت مبلغی کم، رویه های CI/CD را نادیده بگیرد و تغییر خودش را به زور ادغام (force merge) کند. این موضوع می تواند به شدت به دنیای متن باز ضربه بزند.
#خبر
@TheRaymondDev
Forwarded from Laravel News
Image Manipulation in Laravel With Glide https://laravel-news.com/image-manipulation-in-laravel-with-glide
Laravel News
Image Manipulation in Laravel With Glide - Laravel News
Glide for Laravel is a package that provides on-the-fly image manipulation using League/Glide. It offers Blade components for generating responsive images, URL signing for security, and seamless integration with Laravel's filesystem and caching layers.
Forwarded from DevTwitter | توییت برنامه نویسی
حتماً برات پیش اومده یه آبجکت یا آرایه بزرگ داری که توش کلی مقدار null، undefined، رشته خالی و صفر قاطی دادههای درستت شده!
موقع ارسال به سرور، ذخیره تو دیتابیس یا تمیز کردن خروجی API، همین دادههای اضافی گاهی باعث کلی دردسر میشن، از validation error گرفته تا حجم اضافه و باگهای عجیب.
اینجا دقیقاً کاریه که deep-cleaner-js برات انجام میده.
- همهی مقدارهای اضافی (null، undefined، ""، 0) رو پاک میکنه.
- دادههات رو deep تمیز میکنه، حتی اگه چند سطح تودرتو باشن.
- انواع خاص مثل Date، RegExp، Map، Set، Buffer رو خراب نمیکنه.
- از TypeScript پشتیبانی کامل داره و کاملاً قابل تنظیمه.
- هیچ وابستگی خارجی نداره (Zero dependencies).
- ساختارش بهصورت امن نوشته شده و از Circular reference هم نمیترسه.
- نسخه جدید (2.1.1) کلی بهینهسازی داره، سرعت بالاتر رفته و تستهای جامعی براش نوشته شده (بیش از ۵۰ تست مختلف).
خلاصه: هر وقت خواستی قبل از ارسال دیتا، ذخیرهسازی، یا پاکسازی نتیجهی API، ساختار دادههات رو تمیز و مرتب کنی، این کتابخونه دقیقاً همونه که دنبالش بودی!
https://www.linkedin.com/pulse/deep-cleaner-v211-here-clean-your-data-like-pro-mohammad-rostami-7evdc/
@DevTwitter | <Mohammad/>
موقع ارسال به سرور، ذخیره تو دیتابیس یا تمیز کردن خروجی API، همین دادههای اضافی گاهی باعث کلی دردسر میشن، از validation error گرفته تا حجم اضافه و باگهای عجیب.
اینجا دقیقاً کاریه که deep-cleaner-js برات انجام میده.
- همهی مقدارهای اضافی (null، undefined، ""، 0) رو پاک میکنه.
- دادههات رو deep تمیز میکنه، حتی اگه چند سطح تودرتو باشن.
- انواع خاص مثل Date، RegExp، Map، Set، Buffer رو خراب نمیکنه.
- از TypeScript پشتیبانی کامل داره و کاملاً قابل تنظیمه.
- هیچ وابستگی خارجی نداره (Zero dependencies).
- ساختارش بهصورت امن نوشته شده و از Circular reference هم نمیترسه.
- نسخه جدید (2.1.1) کلی بهینهسازی داره، سرعت بالاتر رفته و تستهای جامعی براش نوشته شده (بیش از ۵۰ تست مختلف).
خلاصه: هر وقت خواستی قبل از ارسال دیتا، ذخیرهسازی، یا پاکسازی نتیجهی API، ساختار دادههات رو تمیز و مرتب کنی، این کتابخونه دقیقاً همونه که دنبالش بودی!
https://www.linkedin.com/pulse/deep-cleaner-v211-here-clean-your-data-like-pro-mohammad-rostami-7evdc/
@DevTwitter | <Mohammad/>
Forwarded from IRCF | اینترنت آزاد برای همه
پاول دورف، مدیرعامل #تلگرام در یادداشتی در آستانه ۴۱ سالگیش، نوشته:
نسل ما داره زمانش برای نجات #اینترنت آزادی که پدرانمون برامون ساختن تموم میشه. چیزی که زمانی نوید تبادل آزاد اطلاعات بود، حالا داره تبدیل میشه به نهاییترین ابزار کنترل.
کشورهایی که زمانی آزاد بودن، حالا دارن اقدامات ویرانشهری مثل شناسههای دیجیتال (در بریتانیا)، بررسی سن آنلاین (در استرالیا) و اسکن گسترده پیامهای خصوصی (در اتحادیه اروپا) رو معرفی میکنن.
آلمان هرکسی رو که جرأت کنه از مقامات در اینترنت انتقاد کنه تحت پیگرد قرار میده. بریتانیا هزاران نفر رو به خاطر توییتهاشون زندانی کرده. فرانسه رهبران فناوری رو که از آزادی و حریم خصوصی دفاع میکنن، به جرم تحت تحقیق قرار داده.
یک دنیای تاریک و ویرانشهری با سرعت داره نزدیک میشه؛ در حالی که ما در خوابیم. نسل ما در خطره که در تاریخ به عنوان آخرین نسلی شناخته بشه که آزادی داشت و گذاشت اون رو ازش بگیرن.
به ما دروغ گفته شده. به ما القا شده که بزرگترین نبرد نسل ما، نابود کردن هر چیزیه که نیاکانمون برامون به جا گذاشتن: سنت، حریم خصوصی، حاکمیت، بازار آزاد و آزادی بیان.
با خیانت به میراث نیاکانمون، خودمون رو در مسیری از نابودی قرار دادیم؛ نابودی اخلاقی، فکری، اقتصادی و در نهایت زیستی.
🔍 ircf.space
@ircfspace
نسل ما داره زمانش برای نجات #اینترنت آزادی که پدرانمون برامون ساختن تموم میشه. چیزی که زمانی نوید تبادل آزاد اطلاعات بود، حالا داره تبدیل میشه به نهاییترین ابزار کنترل.
کشورهایی که زمانی آزاد بودن، حالا دارن اقدامات ویرانشهری مثل شناسههای دیجیتال (در بریتانیا)، بررسی سن آنلاین (در استرالیا) و اسکن گسترده پیامهای خصوصی (در اتحادیه اروپا) رو معرفی میکنن.
آلمان هرکسی رو که جرأت کنه از مقامات در اینترنت انتقاد کنه تحت پیگرد قرار میده. بریتانیا هزاران نفر رو به خاطر توییتهاشون زندانی کرده. فرانسه رهبران فناوری رو که از آزادی و حریم خصوصی دفاع میکنن، به جرم تحت تحقیق قرار داده.
یک دنیای تاریک و ویرانشهری با سرعت داره نزدیک میشه؛ در حالی که ما در خوابیم. نسل ما در خطره که در تاریخ به عنوان آخرین نسلی شناخته بشه که آزادی داشت و گذاشت اون رو ازش بگیرن.
به ما دروغ گفته شده. به ما القا شده که بزرگترین نبرد نسل ما، نابود کردن هر چیزیه که نیاکانمون برامون به جا گذاشتن: سنت، حریم خصوصی، حاکمیت، بازار آزاد و آزادی بیان.
با خیانت به میراث نیاکانمون، خودمون رو در مسیری از نابودی قرار دادیم؛ نابودی اخلاقی، فکری، اقتصادی و در نهایت زیستی.
🔍 ircf.space
@ircfspace
Forwarded from محتوای آزاد سهراب (Sohrab)
برنامه winboat امکان انتخاب ایزو موجود ویندوز رو اضافه کرده، کارش هم اینه که با داکر ویندوز رو نصب میکنه (qemu/kvm) و بعدش با rdp شما بهش وصل میشید و برنامههای دلخواهتون رو اجرا میکنید.
آیا از وجود چنین برنامهای به صورت پیشفرض در پارچ حمایت میکنید؟
آیا از وجود چنین برنامهای به صورت پیشفرض در پارچ حمایت میکنید؟
Anonymous Poll
63%
بله، مفید هستش
28%
خیر، چون فلسفه رو زیرسوال میبره
9%
خیر (در کامنتها نظرم رو میگم)
Forwarded from DevTwitter | توییت برنامه نویسی
برای تست API همیشه Postman هست که به کارمون بیاد اما اینکه شما نیاز به agent داری یا بار سنگینی که رو سیستم میندازه و... ممکنه یکم تو مخی باشه چون بنظر خودم برای پروژه های کوچیک که تیم بزرگی هم روش کار نمیکنن زیادی سنگین و اضافیه!
خب ابزار جایگزین زیاد هست و حتی اکستنشن هایی هم داریم اما بنظرم بازم نقص هاشون بیشتر از مزایاشون هست
تو یه مقاله با Requsetly آشنا شدم که بنظرم میتونه برای پروژه های لوکال و کوچیک به کار بیاد و حافظه سیستم رو بیخودی اشغال نمیکنه
https://requestly.com/
@DevTwitter | <Ali Palvaneh/>
خب ابزار جایگزین زیاد هست و حتی اکستنشن هایی هم داریم اما بنظرم بازم نقص هاشون بیشتر از مزایاشون هست
تو یه مقاله با Requsetly آشنا شدم که بنظرم میتونه برای پروژه های لوکال و کوچیک به کار بیاد و حافظه سیستم رو بیخودی اشغال نمیکنه
https://requestly.com/
@DevTwitter | <Ali Palvaneh/>
Forwarded from Linuxor ?
یکی سوال داشت که اگه روز Q برسه بیت کوین هامون چه بلایی سرش میآد؟
روز Q به روز فرضی توی آینده میگن که کامپیوتر کوانتومی به قدری قوی بشه که بتونه رمزنگاری فعلی که داریم استفاده میکنیم رو بشکنه، مسلما اگه اون روز برسه اتکر ها میتونن از روی کلید عمومی هاتون به کلید خصوصی هاتون برسن و مثل آب خوردن بیت کوین هاتون رو بردارن و حتی زنجیره رو تغییر بدن.
ولی نگران بیت کوین هاتون نباشید چون قبلش حساب های بانکیتون خالی میشه و اینترنت به طور کلی بخاطر استفاده از رمزنگاری گسترده RSA منحل میشه که داشتن بیتکوین دیگه بی معنیه... البته این روز فرضی هستش چون آزمایش هایی سال 2024 برای ساخت الگوریتم های رمزنگاری پست کوانتومی شرکت های بزرگ مثل گوگل و کلادفلر انجام دادن به موفقیت هایی رسیدن، دارن جوری جلو میبرنش که زود تر از کامپیوتر کوانتومی رمزنگاری پست کوانتومی داشته باشیم.
@Linuxor
روز Q به روز فرضی توی آینده میگن که کامپیوتر کوانتومی به قدری قوی بشه که بتونه رمزنگاری فعلی که داریم استفاده میکنیم رو بشکنه، مسلما اگه اون روز برسه اتکر ها میتونن از روی کلید عمومی هاتون به کلید خصوصی هاتون برسن و مثل آب خوردن بیت کوین هاتون رو بردارن و حتی زنجیره رو تغییر بدن.
ولی نگران بیت کوین هاتون نباشید چون قبلش حساب های بانکیتون خالی میشه و اینترنت به طور کلی بخاطر استفاده از رمزنگاری گسترده RSA منحل میشه که داشتن بیتکوین دیگه بی معنیه... البته این روز فرضی هستش چون آزمایش هایی سال 2024 برای ساخت الگوریتم های رمزنگاری پست کوانتومی شرکت های بزرگ مثل گوگل و کلادفلر انجام دادن به موفقیت هایی رسیدن، دارن جوری جلو میبرنش که زود تر از کامپیوتر کوانتومی رمزنگاری پست کوانتومی داشته باشیم.
@Linuxor
Forwarded from Reza Jafari
باهوش بودن خوبه، مفید بودن بهتره
خیلی وقتا تو حوزه دیتا ساینس و هوش مصنوعی، اونقدر غرق تو جزئیات فنی و مدلهای پیچیده میشیم که یادمون میره اصل ماجرا چیه. یه کسبوکار معمولاً نیاز نداره مدل دیپلرنینگ فوقالعاده دقیق یا موتور پیشنهاددهنده عجیب با embeddingهای خاص داشته باشه. نیازی هم نیست یه ترنسفورمر از صفر بسازیم یا سراغ شبکههای گرافی خیلی پیچیده بریم. چیزی که یه بیزنس واقعاً میخواد، اثر و رشد قابل لمسه. مهم اینه که اون رشد رو چطور به وجود بیاری، نه اینکه چقدر کد یا مدلت پیشرفتهست.
یکی از درسهای مهمی که اوایل کار یاد گرفتم این بود که هدف این نیست باهوشترین آدم اتاق باشی، بلکه مفیدترینش باشی. گاهی یه داشبورد ساده و سریع، میتونه تأثیرگذارتر از یه مدل سنگین و کامل باشه که سه ماه بعد آماده میشه. مدیرها و تصمیمگیرها معمولاً دنبال بینش عملیان، نه الگوریتم پیچیده.
الان دیگه تو خیلی از سازمانها، تمرکز از «ساخت مدل» رفته به سمت «خلق ارزش از داده». چیزی که بهش میگن هوش تصمیماتی (Decision Intelligence). یعنی سیستمها و ابزارهایی که بهجای فقط نشون دادن دیتا، کمک میکنن تصمیم بهتر گرفته بشه. واقعیت اینه که داده تا وقتی به عمل تبدیل نشه، هیچ ارزشی نداره.
برای همین، بهعنوان یه متخصص دیتا، گاهی باید بهجای غرق شدن تو دقت مدل، به این فکر کنیم که چطور میتونیم سریعتر، سادهتر و مؤثرتر به بیزنس کمک کنیم. آخرش همون راهحل کاربردیه که تفاوت واقعی رو رقم میزنه، نه پیچیدگی فنی.
🔤 🔤 🔤 🔤 🔤 🔤 🔤
🥇 اهورا اولین اپراتور هوش مصنوعی راهبردی ایران در حوزه ارائه خدمات و سرویسهای زیرساخت هوش مصنوعی
🌐 لینک ارتباط با اهورا
@reza_jafari_ai
خیلی وقتا تو حوزه دیتا ساینس و هوش مصنوعی، اونقدر غرق تو جزئیات فنی و مدلهای پیچیده میشیم که یادمون میره اصل ماجرا چیه. یه کسبوکار معمولاً نیاز نداره مدل دیپلرنینگ فوقالعاده دقیق یا موتور پیشنهاددهنده عجیب با embeddingهای خاص داشته باشه. نیازی هم نیست یه ترنسفورمر از صفر بسازیم یا سراغ شبکههای گرافی خیلی پیچیده بریم. چیزی که یه بیزنس واقعاً میخواد، اثر و رشد قابل لمسه. مهم اینه که اون رشد رو چطور به وجود بیاری، نه اینکه چقدر کد یا مدلت پیشرفتهست.
یکی از درسهای مهمی که اوایل کار یاد گرفتم این بود که هدف این نیست باهوشترین آدم اتاق باشی، بلکه مفیدترینش باشی. گاهی یه داشبورد ساده و سریع، میتونه تأثیرگذارتر از یه مدل سنگین و کامل باشه که سه ماه بعد آماده میشه. مدیرها و تصمیمگیرها معمولاً دنبال بینش عملیان، نه الگوریتم پیچیده.
الان دیگه تو خیلی از سازمانها، تمرکز از «ساخت مدل» رفته به سمت «خلق ارزش از داده». چیزی که بهش میگن هوش تصمیماتی (Decision Intelligence). یعنی سیستمها و ابزارهایی که بهجای فقط نشون دادن دیتا، کمک میکنن تصمیم بهتر گرفته بشه. واقعیت اینه که داده تا وقتی به عمل تبدیل نشه، هیچ ارزشی نداره.
برای همین، بهعنوان یه متخصص دیتا، گاهی باید بهجای غرق شدن تو دقت مدل، به این فکر کنیم که چطور میتونیم سریعتر، سادهتر و مؤثرتر به بیزنس کمک کنیم. آخرش همون راهحل کاربردیه که تفاوت واقعی رو رقم میزنه، نه پیچیدگی فنی.
@reza_jafari_ai
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from محتوای آزاد سهراب (Sohrab)
چون صحبت از winboat بود، یک ویدئو گرفتم و توش ازش استفاده کردم. ویندوز ۱۰ رو نصب کردم و برنامه طاقچه رو که یکی از مشکلترین برنامهها برای اجرا روی wine هستش رو روی این ماشین مجازی اجرا کردم.
تماشا از پیرتوب
تماشا از یوتوب
تماشا از آپارات
@SohrabContents
تماشا از پیرتوب
تماشا از یوتوب
تماشا از آپارات
@SohrabContents
Forwarded from Ninja Learn | نینجا لرن (Mohammad)
یکی از چالشهای رایج بین فعالان حوزهی هوش مصنوعی اینه که نمیدونن برای آموزش مدلشون باید از چه الگوریتمی استفاده کنن
آیا باید سراغ Classification برن؟ یا Regression؟ یا شاید Clustering؟ 🤔
خوشبختانه، کتابخونهی قدرتمند Scikit-learn (sklearn) توی مستندات رسمیش یه فلوچارت خیلی کاربردی ارائه داده که با دنبال کردنش میتونید دقیقاً بفهمید کدوم الگوریتم مناسب نوع داده و هدف پروژهتونه.
لینک
➖➖➖➖➖➖➖➖➖➖
آیا باید سراغ Classification برن؟ یا Regression؟ یا شاید Clustering؟ 🤔
خوشبختانه، کتابخونهی قدرتمند Scikit-learn (sklearn) توی مستندات رسمیش یه فلوچارت خیلی کاربردی ارائه داده که با دنبال کردنش میتونید دقیقاً بفهمید کدوم الگوریتم مناسب نوع داده و هدف پروژهتونه.
لینک
#️⃣ #ai #programming
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
scikit-learn
13. Choosing the right estimator
Often the hardest part of solving a machine learning problem can be finding the right estimator for the job. Different estimators are better suited for different types of data and different problem...
Forwarded from Pink Orca ✌️ پینک اورکا
💥 گروههای تلگرامی قدیمی شما رو به نرخ خوب و با تعداد نامحدودی خریدارم 💥
✅ با پرداخت فوری ✅
🗣 شرایط لازم:
- گروه ساختهُ ۲۰۲۳ به قبل باشه
- حداقل چند پیام قابل مشاهده مربوط به همون تاریخ داشته باشه
- توانایی انتقال مالکیت داشته باشید
همین! تعداد ممبر هم مهم نیست...
مثال:
از چندسال پیشا یه گروه برای کلاس داشتین و دیگه کاربردی نداره. من ازتون میخرمش!
🔫 سوالات رایج:
🎈 پیوی در خدمتم: @Pink0rca ➡️
✅ با پرداخت فوری ✅
🗣 شرایط لازم:
- گروه ساختهُ ۲۰۲۳ به قبل باشه
- حداقل چند پیام قابل مشاهده مربوط به همون تاریخ داشته باشه
- توانایی انتقال مالکیت داشته باشید
همین! تعداد ممبر هم مهم نیست...
مثال:
از چندسال پیشا یه گروه برای کلاس داشتین و دیگه کاربردی نداره. من ازتون میخرمش!
🔫 سوالات رایج:
- چند میخری؟
+ پیوی لینک گروه مورد نظر رو بفرست تا بگم (هیستوری گروه visible باشه)
- چرا میخرن این گروهها رو؟
+ چون قدیمیتر هستن تلگرام حساسیت کمتری روشون داره و میشه بهتر رشدشون داد، همچنین تو سرچ بهتر ایندکس میشن
- من اینطور گروهها رو ندارم... بیخیال بشم؟
+ خیر! به دوستان و آشنایان بگید شاید اونا داشته باشن، اینطوری به عنوان واسطه پورسانت خوبی دریافت میکنین
- چطور بهت اعتماد کنم؟ تازه عضو کانالت شدم و تورو نمیشناسم!
+ من هویت مشخصی دارم و همینطور طی سالهای گذشته در کنار فعالیتهام همیشه معاملاتی در زمینههای مختلف با افرادی که احتمالا شما هم میشناسین داشتم، هیچکس ناراضی نبوده و میتونید از خودشون بپرسید
- چقدر سود تو این کار هست؟
+ اگه زرنگ باشید میتونه چند میلیون در روز هم باشه، نمونش یکی از دوستان که دیشب ۷ تومن گیرش اومد
🎈 پیوی در خدمتم: @Pink0rca ➡️
Forwarded from محتوای آزاد سهراب (Sohrab)
Forwarded from Agora (Alireza)
Swiss Table
______________________________
روشهای مرسوم رفع تصادم (collision) توی hashmap رو تو درس ساختمان داده خوندیم:
1- open addressing
2- chaining
3- hybrid
خیلی خلاصه بخوام هرکدوم رو مرور کنم اینطور میشه:
در open addressing اینطور عمل میکنیم که وقتی تصادم رخ داد، اینقدر توی آرایهی wrap شده جلو میریم تا به اولین خونهی خالی برسیم و item رو اونجا بذاریم.
در روش chaining هر خونهی آرایهی ما یک عنصر نگه میداره و یک پوینتره به یک ساختماندادهی دیگه که میتونه یک linked list باشه یا یک درخت متوازن مثل red-black یا AVL. در صورتی که توی اون خونهی آرایه از قبل دادهای وجود داشته باشه، آیتم جدید رو push میکنیم توی اون ساختماندادهای که اون خونه بهش اشاره میکنه.
در روش سوم، یکی از روشهای اول و دوم رو با مکانیزم هشچندباره ترکیب میکنیم. به این صورت که چند الگوریتم هش متفاوت رو در نظر میگیریم. در صورتی که با هش آیتم مدنظرمون تصادم رخ داد، یک الگوریتم هش جدید رو انتخاب میکنیم. مکانیزم انتخاب الگوریتم هش هم میتونه هرچی باشه. ما ساده و round robin در نظر میگیریم. این کار رو تا زمانی ادامه میدیم که تمام الگوریتمهای هشمون رو تست کرده باشیم و همشون منجر به تصادم شده باشن. بعد با استفاده از یکی از روشهای ۱ یا ۲ اقدام به ذخیره کردن آیتم میکنیم.
تمام این قصهها چیزهایی هست که تا اینجا میدونیم و مرسومه. ولی واقعاً چقدر از این روشها استفاده میشه؟ آیا میشه پا رو فراتر گذاشت و عملکرد رو از این هم بهتر کرد؟
توی جاهایی مثل Cloudflare که عملکرد در حد میکروثانیه مهمه، گاهی باید پا رو فراتر گذاشت. گاهی سادهترین جزئیات میتونن تفاوت چندبرابری در سرعت ایجاد کنن. انگار یه نوع amplification رخ میده؛ بهینهسازی کوچیک که باعث میشه کل سیستم خیلی سریعتر بهنظر بیاد.
یکی از ایدههایی که دقیقاً با همین ذهنیت طراحی شده، ساختار Swiss Tableه. گوگل با در نظر گرفتن چالش کش سرورها دست به طراحی این ساختار زده. زبانهایی مثل Rust هم از همین ساختار برای پیادهسازی پیشفرض HashMap خودشون استفاده میکنن.
گوگل تو کنفرانس CppCon 2017 هم دربارهی طراحی و بهینهسازی این ساختار ارائهای داشت که دیدنش خالی از لطف نیست:
CppCon 2017: Matt Kulukundis – Designing a Fast, Efficient Hash Table
Swiss Table در اصل هنوز از ایدهی open addressing استفاده میکنه؛ یعنی دادهها مستقیماً در یک آرایه ذخیره میشن و وقتی تصادم رخ بده، دنبال خونهی بعدی میگردیم تا جایی برای درج پیدا کنیم. ولی تفاوت اصلیش اینه که چطور این آرایه
bucket
بندی میشه و چطور CPU ازش استفاده میکنه.
در Swiss Table، آرایهی اصلی به چند bucket تقسیم میشه. هر bucket معمولاً چند تا slot داره (مثلاً 8 تا)، یعنی هر bucket خودش میتونه تا 8 تا عنصر نگه داره.
در کنارش یه آرایهی کوچیکتر از metadata داریم که برای هر slot فقط یه بایت اطلاعات ذخیره میکنه. توی این بایت، یه تیکه از هش کلید (مثلاً 7 بیت از اون) نگه داشته میشه تا CPU بتونه سریعتر بفهمه کدوم slot احتمالاً مربوط به کلید مورد نظره.
وقتی میخوایم دنبال یه کلید بگردیم یا کلید جدیدی وارد کنیم، Swiss Table با استفاده از
SIMD (Single Instruction, Multiple Data)
چند بایت metadata رو با هم میخونه (مثلاً 16 تا در یک لحظه) و در عرض یک دستور CPU بررسی میکنه که آیا هش کوچیک ذخیرهشده توی اونها با هش کلید ما یکیه یا نه.
بعد اگه یکی از اونها match کرد، تازه میره سراغ دادهی واقعی و بررسی دقیقتر انجام میده.
Swiss Table تنها نمونهی چنین طراحیای نیست. بعد از گوگل، پروژههای بزرگ دیگه مثل
Facebook’s F14
ایدههای مشابه استفاده کردن.
زبانهایی مثل Rust و Go هم با الهام از همین طراحی، نسخههای خودشون رو ساختن.
در پیادهسازی Go، تیم توسعه با یه چالش جدی روبهرو شد که بهطور مفصل توی این پست توضیح داده شده:
The Go Blog – Swiss Table
مشکل از اینجا شروع شد که وقتی آرایهی اصلی هشمپ به حد آستانهی ظرفیتش میرسه، باید سایزش دو برابر بشه و کل دادههای قبلی داخل آرایهی جدید کپی بشن.
این فرایند در سیستمهای عادی چندان مشکلی ایجاد نمیکنه، ولی در سرورهای کش که چند ترابایت دیتا داخل مموری دارن، این resize میتونه به شدت زمانبر و کند باشه.
راهحلی که گولنگ برای این موضوع ارائه داد، استفاده از hashmapهای چندلایه (multi-level) بود. بهجای resize کامل، دادههای جدید در یک لایهی بالاتر ذخیره میشن و بهصورت تدریجی دادههای قدیمی جابهجا میشن. اینطوری عملیات resize به بخشهای کوچیک تقسیم میشه و فشار ناگهانی از روی سیستم برداشته میشه.
این پست رو هم از دست ندین:
A new fast hash table in response to Google’s new fast hash table
______________________________
روشهای مرسوم رفع تصادم (collision) توی hashmap رو تو درس ساختمان داده خوندیم:
1- open addressing
2- chaining
3- hybrid
خیلی خلاصه بخوام هرکدوم رو مرور کنم اینطور میشه:
در open addressing اینطور عمل میکنیم که وقتی تصادم رخ داد، اینقدر توی آرایهی wrap شده جلو میریم تا به اولین خونهی خالی برسیم و item رو اونجا بذاریم.
در روش chaining هر خونهی آرایهی ما یک عنصر نگه میداره و یک پوینتره به یک ساختماندادهی دیگه که میتونه یک linked list باشه یا یک درخت متوازن مثل red-black یا AVL. در صورتی که توی اون خونهی آرایه از قبل دادهای وجود داشته باشه، آیتم جدید رو push میکنیم توی اون ساختماندادهای که اون خونه بهش اشاره میکنه.
در روش سوم، یکی از روشهای اول و دوم رو با مکانیزم هشچندباره ترکیب میکنیم. به این صورت که چند الگوریتم هش متفاوت رو در نظر میگیریم. در صورتی که با هش آیتم مدنظرمون تصادم رخ داد، یک الگوریتم هش جدید رو انتخاب میکنیم. مکانیزم انتخاب الگوریتم هش هم میتونه هرچی باشه. ما ساده و round robin در نظر میگیریم. این کار رو تا زمانی ادامه میدیم که تمام الگوریتمهای هشمون رو تست کرده باشیم و همشون منجر به تصادم شده باشن. بعد با استفاده از یکی از روشهای ۱ یا ۲ اقدام به ذخیره کردن آیتم میکنیم.
تمام این قصهها چیزهایی هست که تا اینجا میدونیم و مرسومه. ولی واقعاً چقدر از این روشها استفاده میشه؟ آیا میشه پا رو فراتر گذاشت و عملکرد رو از این هم بهتر کرد؟
توی جاهایی مثل Cloudflare که عملکرد در حد میکروثانیه مهمه، گاهی باید پا رو فراتر گذاشت. گاهی سادهترین جزئیات میتونن تفاوت چندبرابری در سرعت ایجاد کنن. انگار یه نوع amplification رخ میده؛ بهینهسازی کوچیک که باعث میشه کل سیستم خیلی سریعتر بهنظر بیاد.
یکی از ایدههایی که دقیقاً با همین ذهنیت طراحی شده، ساختار Swiss Tableه. گوگل با در نظر گرفتن چالش کش سرورها دست به طراحی این ساختار زده. زبانهایی مثل Rust هم از همین ساختار برای پیادهسازی پیشفرض HashMap خودشون استفاده میکنن.
گوگل تو کنفرانس CppCon 2017 هم دربارهی طراحی و بهینهسازی این ساختار ارائهای داشت که دیدنش خالی از لطف نیست:
CppCon 2017: Matt Kulukundis – Designing a Fast, Efficient Hash Table
Swiss Table در اصل هنوز از ایدهی open addressing استفاده میکنه؛ یعنی دادهها مستقیماً در یک آرایه ذخیره میشن و وقتی تصادم رخ بده، دنبال خونهی بعدی میگردیم تا جایی برای درج پیدا کنیم. ولی تفاوت اصلیش اینه که چطور این آرایه
bucket
بندی میشه و چطور CPU ازش استفاده میکنه.
در Swiss Table، آرایهی اصلی به چند bucket تقسیم میشه. هر bucket معمولاً چند تا slot داره (مثلاً 8 تا)، یعنی هر bucket خودش میتونه تا 8 تا عنصر نگه داره.
در کنارش یه آرایهی کوچیکتر از metadata داریم که برای هر slot فقط یه بایت اطلاعات ذخیره میکنه. توی این بایت، یه تیکه از هش کلید (مثلاً 7 بیت از اون) نگه داشته میشه تا CPU بتونه سریعتر بفهمه کدوم slot احتمالاً مربوط به کلید مورد نظره.
وقتی میخوایم دنبال یه کلید بگردیم یا کلید جدیدی وارد کنیم، Swiss Table با استفاده از
SIMD (Single Instruction, Multiple Data)
چند بایت metadata رو با هم میخونه (مثلاً 16 تا در یک لحظه) و در عرض یک دستور CPU بررسی میکنه که آیا هش کوچیک ذخیرهشده توی اونها با هش کلید ما یکیه یا نه.
بعد اگه یکی از اونها match کرد، تازه میره سراغ دادهی واقعی و بررسی دقیقتر انجام میده.
Swiss Table تنها نمونهی چنین طراحیای نیست. بعد از گوگل، پروژههای بزرگ دیگه مثل
Facebook’s F14
ایدههای مشابه استفاده کردن.
زبانهایی مثل Rust و Go هم با الهام از همین طراحی، نسخههای خودشون رو ساختن.
در پیادهسازی Go، تیم توسعه با یه چالش جدی روبهرو شد که بهطور مفصل توی این پست توضیح داده شده:
The Go Blog – Swiss Table
مشکل از اینجا شروع شد که وقتی آرایهی اصلی هشمپ به حد آستانهی ظرفیتش میرسه، باید سایزش دو برابر بشه و کل دادههای قبلی داخل آرایهی جدید کپی بشن.
این فرایند در سیستمهای عادی چندان مشکلی ایجاد نمیکنه، ولی در سرورهای کش که چند ترابایت دیتا داخل مموری دارن، این resize میتونه به شدت زمانبر و کند باشه.
راهحلی که گولنگ برای این موضوع ارائه داد، استفاده از hashmapهای چندلایه (multi-level) بود. بهجای resize کامل، دادههای جدید در یک لایهی بالاتر ذخیره میشن و بهصورت تدریجی دادههای قدیمی جابهجا میشن. اینطوری عملیات resize به بخشهای کوچیک تقسیم میشه و فشار ناگهانی از روی سیستم برداشته میشه.
این پست رو هم از دست ندین:
A new fast hash table in response to Google’s new fast hash table
YouTube
CppCon 2017: Matt Kulukundis “Designing a Fast, Efficient, Cache-friendly Hash Table, Step by Step”
https://CppCon.org
—
Presentation Slides, PDFs, Source Code and other presenter materials are available at: https://github.com/CppCon/CppCon2017
—
Hash tables consume a large volume of both compute resources and memory across Google's production system. The…
—
Presentation Slides, PDFs, Source Code and other presenter materials are available at: https://github.com/CppCon/CppCon2017
—
Hash tables consume a large volume of both compute resources and memory across Google's production system. The…
Forwarded from 🎄 یک برنامه نویس تنبل ( MΞ)
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from Ninja Learn | نینجا لرن (Mohammad)
YouTube
I built ChatGPT with Minecraft redstone!
I built a small language model in Minecraft using no command blocks or datapacks!
The model has 5,087,280 parameters, trained in Python on the TinyChat dataset of basic English conversations. It has an embedding dimension of 240, vocabulary of 1920 tokens…
The model has 5,087,280 parameters, trained in Python on the TinyChat dataset of basic English conversations. It has an embedding dimension of 240, vocabulary of 1920 tokens…
Forwarded from محتوای آزاد سهراب (Sohrab)
Forwarded from محتوای آزاد سهراب (Sohrab)
فروم رو یک سری تغییرات دادم و زدم ایمیج کانتینرش از اول بیلد بشه پس اگر ارور 5xx دیدید نترسید.
@SohrabContents
@SohrabContents
Forwarded from کانال اطلاعرسانی توزیع پارچ
مشکل ورود با گوگل، دیسکورد و گیتهاب در فروم پارچ برطرف شد.
منتظر حضور شما در فروم پارچ بخصوص کافه پارچ هستیم :)
@ParchLinux
منتظر حضور شما در فروم پارچ بخصوص کافه پارچ هستیم :)
@ParchLinux
Forwarded from linuxtnt(linux tips and tricks) (hosein seilany https://seilany.ir/)
🔰ایجاد و اضافه کردن کاربر به گروه sudo
اگر زمانی با خطای زیر رو برو شدید User is not in the sudoers file از دستور زیر استفاده کنید.فایل sudoers: این فایل لیستی از کاربران و گروههایی را که مجاز به استفاده از sudo هستند، حفظ میکند. اگر نام کاربری شما در این فایل نباشد، سیستم به شما اجازه اجرای دستورات با امتیازات root را نخواهد داد.
ابتدا
su -
را وارد کنید. سپس رمز را وارد کنید و سپس دستور زیر را وارد کنید
به عنوان مثال، اگر بخواهید یک کاربر جدید با نام ali ایجاد کنید و به او اجازه دهید از دستور sudo استفاده کند، دستورات زیر را اجرا میکنید:
اگر زمانی با خطای زیر رو برو شدید User is not in the sudoers file از دستور زیر استفاده کنید.فایل sudoers: این فایل لیستی از کاربران و گروههایی را که مجاز به استفاده از sudo هستند، حفظ میکند. اگر نام کاربری شما در این فایل نباشد، سیستم به شما اجازه اجرای دستورات با امتیازات root را نخواهد داد.
ابتدا
su -
را وارد کنید. سپس رمز را وارد کنید و سپس دستور زیر را وارد کنید
sudo usermod -aG sudo username
به عنوان مثال، اگر بخواهید یک کاربر جدید با نام ali ایجاد کنید و به او اجازه دهید از دستور sudo استفاده کند، دستورات زیر را اجرا میکنید:
sudo usermod -aG sudo ali