امروز یکی از دوستام با این متد "هک" شد. شماها که فنی هستین و احتمالا متوجه میشین، ولی خیلی مهمه که به اطرافیان و خانواده که بلد نیستن اصول مراقبت آنلاین رو یاد بدین تا این موارد پیش نیاد. اینجور اپها چیز پیچیدهای نیستن، صرفا از بی توجهی و یا ندونستن کاربر سو استفاده میکنن. حالا این یکی رو که من میرم Decompile میکنم دیتاشو در میارم میدم فتا، ولی مراقب اطرافیانتون باشین خلاصه.
تو این مورد اس ام اس تلگرام و پسوردهای کاربر برداشته شد و به اکانتش دسترسی پیدا کردن، کانتکتها هم گرفته طرف.
@ever_code
تو این مورد اس ام اس تلگرام و پسوردهای کاربر برداشته شد و به اکانتش دسترسی پیدا کردن، کانتکتها هم گرفته طرف.
@ever_code
👍2😁1🌚1
بیاین کمی راجب Memory Allocation حرف بزنیم!
میدونیم توی سی شارپ، String ها نوع خاصی از داده هستن. با اینکه Reference Type هستن ولی مثل Value Type رفتار میکنن. بخاطر کار زیاد باهاشون و خاص بودنشون، توی Heap یه قسمت خاص براشون در نظر گرفته شده. String ها پشت صحنه یجورایی یه آرایه از کاراکتر هستن، به همین خاطر چون تغییر دادنشون عملیات سنگینیه، Immutable ان و اگر تغییرش بدین، یک String جدید ساخته میشه.
تا اینجای مطلب رو به احتمال زیاد میدونستین یا راجبش شنیده بودین.
شاید تا حالا اسم تایپ
اگر ما بخوایم یه بخشی از یه String رو بخونیم، باید slice یا split اش بکنیم و ازونجایی که گفتیم نمیشه به String دست زد، یعنی هرباری که اینکاری میکنیم داریم String جدید ایجاد میکنیم (Memory Allocation). و یعنی اگر یه لیستی از String ها داشته باشیم و بخوایم روی هر کدوم عملیات تغییر کننده انجام بدیم، به تعداد کل لیست، حافظه جدید اشغال میشه. توی تعداد کم، مثلا تا 100 هزارتا و یا شاید 1 میلیون تا، بسته به سیستم، شاید بشه چشم پوشی کرد. اما اگه تعداد بالا بره، حافظه پر میشه و ممکنه برنامه crash کنه.
خب چطوری میتونیم Memory Allocation رو پایین بیاریم؟ باید به یه روشی بتونیم یه بخشی از یه String رو بخونیم بدون اینکه بخوایم تغییرش بدیم، ازونجایی که String پشت صحنه یه آرایه ست، با استفاده از Span میتونیم بصورت مستقیم به بخشی ازون آرایه دسترسی داشته باشیم و دیگه حافظه جدید اشغال نکنیم!
حالا واقعا خود Span و Memory چی هستن؟ به ما دسترسی مستقیم به حافظه هر لیستی میدن بدون اینکه حافظه بیشتری اشغال بشه، و با توجه به ماهیت String میشه روی اون هم ازشون استفاده کرد.
توی این مقاله از خود مایکروسافت میتونین بهتر باهاشون آشنا بشین:
https://learn.microsoft.com/en-us/dotnet/standard/memory-and-spans/memory-t-usage-guidelines
اما میخوام بهتون تفاوت پرفورمنس رو نشون بدم.
من یه لیست از 10 میلیون String توی یه فایل دارم و بعد از خوندنش با استفاده از LINQ میام هر آیتم رو split میکنم، قسمت اول و دوم رو جدا میکنم و توی یه آبجکت ذخیره میکنم. روی سیستم من این نتیجه رو داد:
حالا همین تست رو میام با روشی مینویسم که Memory Allocation کمتر داشته باشه، و از طرفی از Span هم استفاده بکنه و نتیجه شد این:
البته باید بگم که برای این پست نیومدم روش کامل بهینه سازی رو انجام بدم. فقط اون قسمت مربوط به Memory Allocation توی لوپ اصلی رو بهتر کردم و توی هردو تست کل فایل رو یک جا خوندم و پردازش کردم. که این خودش یه عالمه جابجایی انجام میده. توی مرحله بعدی، حتی قسمت خوندن از فایل هم بهینه کردم و نتیجه شگفت انگیز شد:
یعنی برای 10 میلیون خط فقط 54 مگابایت توی حافظه نگه میداره! درحالی که توی تست قبلی حدودا 1 و نیم گیگابایت درگیر بود!
اینجا اومدم فایل رو Stream کردم بجای اینکه کامل بخونم که باعث میشه فقط اون بخشی از فایل که میخوام رو بیاره توی حافظه و وقتی کارش تموم شد بده بره.
@ever_code
میدونیم توی سی شارپ، String ها نوع خاصی از داده هستن. با اینکه Reference Type هستن ولی مثل Value Type رفتار میکنن. بخاطر کار زیاد باهاشون و خاص بودنشون، توی Heap یه قسمت خاص براشون در نظر گرفته شده. String ها پشت صحنه یجورایی یه آرایه از کاراکتر هستن، به همین خاطر چون تغییر دادنشون عملیات سنگینیه، Immutable ان و اگر تغییرش بدین، یک String جدید ساخته میشه.
تا اینجای مطلب رو به احتمال زیاد میدونستین یا راجبش شنیده بودین.
شاید تا حالا اسم تایپ
Span یا Memory و امثالشون رو دیده باشین. بخصوص توی نسخه های اخیر دات نت توی Standard Library ها بیشتر دیده میشن. اگر ما بخوایم یه بخشی از یه String رو بخونیم، باید slice یا split اش بکنیم و ازونجایی که گفتیم نمیشه به String دست زد، یعنی هرباری که اینکاری میکنیم داریم String جدید ایجاد میکنیم (Memory Allocation). و یعنی اگر یه لیستی از String ها داشته باشیم و بخوایم روی هر کدوم عملیات تغییر کننده انجام بدیم، به تعداد کل لیست، حافظه جدید اشغال میشه. توی تعداد کم، مثلا تا 100 هزارتا و یا شاید 1 میلیون تا، بسته به سیستم، شاید بشه چشم پوشی کرد. اما اگه تعداد بالا بره، حافظه پر میشه و ممکنه برنامه crash کنه.
خب چطوری میتونیم Memory Allocation رو پایین بیاریم؟ باید به یه روشی بتونیم یه بخشی از یه String رو بخونیم بدون اینکه بخوایم تغییرش بدیم، ازونجایی که String پشت صحنه یه آرایه ست، با استفاده از Span میتونیم بصورت مستقیم به بخشی ازون آرایه دسترسی داشته باشیم و دیگه حافظه جدید اشغال نکنیم!
حالا واقعا خود Span و Memory چی هستن؟ به ما دسترسی مستقیم به حافظه هر لیستی میدن بدون اینکه حافظه بیشتری اشغال بشه، و با توجه به ماهیت String میشه روی اون هم ازشون استفاده کرد.
توی این مقاله از خود مایکروسافت میتونین بهتر باهاشون آشنا بشین:
https://learn.microsoft.com/en-us/dotnet/standard/memory-and-spans/memory-t-usage-guidelines
اما میخوام بهتون تفاوت پرفورمنس رو نشون بدم.
من یه لیست از 10 میلیون String توی یه فایل دارم و بعد از خوندنش با استفاده از LINQ میام هر آیتم رو split میکنم، قسمت اول و دوم رو جدا میکنم و توی یه آبجکت ذخیره میکنم. روی سیستم من این نتیجه رو داد:
Performance:
Rows: 10,000,000
Stations: 413
Elapsed: 00:00:06.4921942
Throughput: 1,540,311 rows/sec (36.72 MB/sec)
Memory:
Working Set: 1,582 MB
GC Memory: 1,357 MB
Gen0 Collections: 169
Gen1 Collections: 169
Gen2 Collections: 10
حالا همین تست رو میام با روشی مینویسم که Memory Allocation کمتر داشته باشه، و از طرفی از Span هم استفاده بکنه و نتیجه شد این:
Performance:
Rows: 10,000,000
Stations: 413
Elapsed: 00:00:01.8735861
Throughput: 5,337,358 rows/sec (127.25 MB/sec)
Memory:
Working Set: 778 MB
GC Memory: 750 MB
Gen0 Collections: 47
Gen1 Collections: 47
Gen2 Collections: 8
البته باید بگم که برای این پست نیومدم روش کامل بهینه سازی رو انجام بدم. فقط اون قسمت مربوط به Memory Allocation توی لوپ اصلی رو بهتر کردم و توی هردو تست کل فایل رو یک جا خوندم و پردازش کردم. که این خودش یه عالمه جابجایی انجام میده. توی مرحله بعدی، حتی قسمت خوندن از فایل هم بهینه کردم و نتیجه شگفت انگیز شد:
Performance:
Rows: 10,000,000
Stations: 413
Elapsed: 00:00:01.1981524
Throughput: 8,346,184 rows/sec (198.99 MB/sec)
Memory:
Working Set: 54 MB
GC Memory: 4 MB
Gen0 Collections: 42
Gen1 Collections: 2
Gen2 Collections: 2
یعنی برای 10 میلیون خط فقط 54 مگابایت توی حافظه نگه میداره! درحالی که توی تست قبلی حدودا 1 و نیم گیگابایت درگیر بود!
اینجا اومدم فایل رو Stream کردم بجای اینکه کامل بخونم که باعث میشه فقط اون بخشی از فایل که میخوام رو بیاره توی حافظه و وقتی کارش تموم شد بده بره.
@ever_code
Docs
Memory<T> and Span<T> usage guidelines - .NET
This article describes Memory and Span, which are buffers of structured data in .NET that can be used in pipelines.
❤2🔥2👍1
Forwarded from کدهالیک | codehalic
اگه تو زیرساختتون از Keycloak برای احراز هویت استفاده میکنید سریعتر دستبهکار بشید چون یه آسیبپذیری خیلی بحرانی با نمره ۹.۱ کشف شده که تو این باگ، هکر بدون نیاز به هیچ دسترسی یا تایید ایمیل و فقط با دونستن یوزرنیم یا ایمیل ادمین، میتونه لاگین بازیابی رمز عبور رو دور بزنه و مستقیم پسوورد اکانت رو عوض کنه تا به تمام سیستمهای پشت Keycloak دسترسی پیدا کنه. تمام نسخههای زیر ۲۶.۷.۲ آسیبپذیرن و اگه الان شرایط ارتقا به نسخه ۲۶.۷.۲ رو ندارید، حتماً همین امروز قابلیت Forgot password رو از تنظیمات Realm به صورت موقت خاموش کنید.
https://fireup.pro/news/keycloak-cve-2026-18963-critical-password-reset-flaw?via=dailydev
@codehalic | کدهالیک
https://fireup.pro/news/keycloak-cve-2026-18963-critical-password-reset-flaw?via=dailydev
@codehalic | کدهالیک
❤1
یه سری تغییرات اساسی توی UI/UX دانلود منیجیر دادم.
خودم روتین ازش استفاده میکنم و مدام سعی میکنم بهترش کنم. جدا از اون خیلی نحوهی کارم با کلود توی این پروژه بهتر شده. میشه گفت از Spec-driven گذر کردم و بنظرم هرجایی خوب نیست.
برای ui براش sketch میکشم خودش میسازه و تست میکنه، ولی باید پختهترش کنم و برم از selenium یا ابزارهای مشابه استفاده کنم تا تمیزتر تست کنه خودش. الان با پایتون و screenshot گرفتن تست میکنه و موس رو حرکت میده.
در کل پروژه روند جالبی گرفته.
با اینکه تو گیتهابم هست، ولی هنوز لانچ رسمی نکردم. منتظرم به یه استیت خاصی برسه و یه سری فیچر مونده که از دانلود منیجر انتظار میره داشته باشه. البته اگه الان دانلود کنید، خود اپ قابلیت auto update داره و میتونید توی این مسیر همراه باشید و آپدیتها رو دریافت کنید. میتونید تو تنظیماتش فعالش کنید.
@ever_code
خودم روتین ازش استفاده میکنم و مدام سعی میکنم بهترش کنم. جدا از اون خیلی نحوهی کارم با کلود توی این پروژه بهتر شده. میشه گفت از Spec-driven گذر کردم و بنظرم هرجایی خوب نیست.
برای ui براش sketch میکشم خودش میسازه و تست میکنه، ولی باید پختهترش کنم و برم از selenium یا ابزارهای مشابه استفاده کنم تا تمیزتر تست کنه خودش. الان با پایتون و screenshot گرفتن تست میکنه و موس رو حرکت میده.
در کل پروژه روند جالبی گرفته.
با اینکه تو گیتهابم هست، ولی هنوز لانچ رسمی نکردم. منتظرم به یه استیت خاصی برسه و یه سری فیچر مونده که از دانلود منیجر انتظار میره داشته باشه. البته اگه الان دانلود کنید، خود اپ قابلیت auto update داره و میتونید توی این مسیر همراه باشید و آپدیتها رو دریافت کنید. میتونید تو تنظیماتش فعالش کنید.
@ever_code
❤1👍1👌1
این چندوقته با چندتا از همکاران و دوستان داشتیم راجب این بحث میکردیم که کد بهینه نوشتن دنیای خیلی متفاوتی با کد تمیز نوشتن داره. خیلی سخته که جفتش رو با هم داشته باشی، بیشتر شبیه دو سر یه نمودار هستن که تصمیم میگیری چی رو فدای چی بکنی. اگه بخوای واقعا کدت تماما بهینه باشه، احتمالا با دیگه تمیز نخواهد بود. نکته اینجاست که کد بهینه نوشتن نیازمند دانش بالایی هست و باید درک خوبی از یه سری چیزا داشته باشی. توسعه و نگهداریش سختتره، و هرکسی نمیتونه به راحتی بهش دست بزنه.
این موضوع منو یاد یه جملهی دیگه انداخت. کامپایلر نوشتن شاید اونجوری سخت نباشه و بشه یادش گرفت. ولی بهینه سازی کامپایلر ۸۰ درصد کاره.
این موضوع رو وقتی داشتم کتاب کامپایلر میخوندم به چشم دیدم. مفاهیم پایهی کامپایلر، حداقل برای شروع و یادگیری اونقدر پیچیده نبود و با کمی وقت گذاشتن میشد فهمید چی به چیه. اما کامپایلرهای واقعی که توی کار استفاده میشن زمین تا آسمون با کتاب فرق دارن.
بنظرم راجب همه مفاهیم این صدق میکنه.
@ever_code
این موضوع منو یاد یه جملهی دیگه انداخت. کامپایلر نوشتن شاید اونجوری سخت نباشه و بشه یادش گرفت. ولی بهینه سازی کامپایلر ۸۰ درصد کاره.
این موضوع رو وقتی داشتم کتاب کامپایلر میخوندم به چشم دیدم. مفاهیم پایهی کامپایلر، حداقل برای شروع و یادگیری اونقدر پیچیده نبود و با کمی وقت گذاشتن میشد فهمید چی به چیه. اما کامپایلرهای واقعی که توی کار استفاده میشن زمین تا آسمون با کتاب فرق دارن.
بنظرم راجب همه مفاهیم این صدق میکنه.
@ever_code
👌3
یکی از تفکرات کسب و کاری که خیلی آزارم میده این ایدهی "سوپر اپ" یا همون "یچی بزنیم همه چی توش باشه" هست.
فکر میکنم همونطور که توی کد باید تفکیک قائل بشیم توی محصولات هم باید قائل بشیم. چرا باید همه چی یجا باشه؟ اونم بخصوص وقتی کاربر شاید واقعا از ۲۰-۳۰ درصد قابلیتهاش استفاده بکنه.
بنظرم یه نمونه از Feature Creep میشه که ترند شده و scope پروژه رو الکی بزرگ میکنه
@ever_code
فکر میکنم همونطور که توی کد باید تفکیک قائل بشیم توی محصولات هم باید قائل بشیم. چرا باید همه چی یجا باشه؟ اونم بخصوص وقتی کاربر شاید واقعا از ۲۰-۳۰ درصد قابلیتهاش استفاده بکنه.
بنظرم یه نمونه از Feature Creep میشه که ترند شده و scope پروژه رو الکی بزرگ میکنه
@ever_code
👍4💯1
Forwarded from جادی | Jadi
بیرجند لاگی ها توی روز برنامه نویس یه چلنج باحال دیگه داشتن: چلنج فشرده سازی! (:
توی این رپو یه فایل به شما داده شده که باید فشرده اش کنین و بر اساس اینکه برنامه شما چقدره و چقدر فشرده می کنه، یه امتیاز میگیرین. دقت کنین که هدف نهایی درک کردن فشرده سازی، ور رفتن باهاش و .. است. اگر یه چیزی بنویسین که یه الگوریتم فشرده سازی رو به کار ببره نسبتا بیمزه است و شاید حتی خارج از رده بندی.
اگر من بخوام بازی کنم اول آنتروپی و چند تا فاکتور دیگه رو تست می کنم. بخصوص با برنامه
enp
تا ببینم این فایل اصولا چقدر دیتا داره. یه فایل رندوم چندان قابل فشرده سازی نیست.
بعدش سعی می کنم ایده های خیلی بیسیک فشرده سازی رو پیاده کنم. مثل
RLE, huffman
برای یادگیری بگم که توی آر.ال.ای، اگر ۵ تا A پشت هم هست ممکنه بتونین بنویسین 5A. معلومه که چند تا مشکل ریز داریم که باید حلش کنین.
توی هافمن یه بار متن رو می بینیم و ترکیب های تکراری رو توش پیدا می کنیم، بعد اینها رو کد گذاری می کنیم و سعی می کنیم هر موردش رو با کدش جایگذاری کنیم و این چیزها.
این ها مسائل جالبی هستن و چیزهای باحالی بهتون یاد می دن؛ پس اگر می خواین بازی کنین معما اینجاست:
https://github.com/birlug/256
البته معلومه که سطح چنین چیزی در رده متوسط است ولی اتفاقا مسائل رده متوسط خوبیشون اینه که اگر شما تازه کار هستین، بهتون ایده می ده چطوری شروع کنین و از اونطرف بررسی کنین بقیه چیکار کردن.
و مرسی از بچه های بیرجندلاگ که مدت ها است گاه گداری مسائلی واقعا جالب برامون مطرح کردن. منم چند ساعت دیگه اگر فرصت کنم تست می کنم و جواب های شما رو هم می بینم که لذت ببرم.
توی این رپو یه فایل به شما داده شده که باید فشرده اش کنین و بر اساس اینکه برنامه شما چقدره و چقدر فشرده می کنه، یه امتیاز میگیرین. دقت کنین که هدف نهایی درک کردن فشرده سازی، ور رفتن باهاش و .. است. اگر یه چیزی بنویسین که یه الگوریتم فشرده سازی رو به کار ببره نسبتا بیمزه است و شاید حتی خارج از رده بندی.
اگر من بخوام بازی کنم اول آنتروپی و چند تا فاکتور دیگه رو تست می کنم. بخصوص با برنامه
enp
تا ببینم این فایل اصولا چقدر دیتا داره. یه فایل رندوم چندان قابل فشرده سازی نیست.
بعدش سعی می کنم ایده های خیلی بیسیک فشرده سازی رو پیاده کنم. مثل
RLE, huffman
برای یادگیری بگم که توی آر.ال.ای، اگر ۵ تا A پشت هم هست ممکنه بتونین بنویسین 5A. معلومه که چند تا مشکل ریز داریم که باید حلش کنین.
توی هافمن یه بار متن رو می بینیم و ترکیب های تکراری رو توش پیدا می کنیم، بعد اینها رو کد گذاری می کنیم و سعی می کنیم هر موردش رو با کدش جایگذاری کنیم و این چیزها.
این ها مسائل جالبی هستن و چیزهای باحالی بهتون یاد می دن؛ پس اگر می خواین بازی کنین معما اینجاست:
https://github.com/birlug/256
البته معلومه که سطح چنین چیزی در رده متوسط است ولی اتفاقا مسائل رده متوسط خوبیشون اینه که اگر شما تازه کار هستین، بهتون ایده می ده چطوری شروع کنین و از اونطرف بررسی کنین بقیه چیکار کردن.
و مرسی از بچه های بیرجندلاگ که مدت ها است گاه گداری مسائلی واقعا جالب برامون مطرح کردن. منم چند ساعت دیگه اگر فرصت کنم تست می کنم و جواب های شما رو هم می بینم که لذت ببرم.
GitHub
GitHub - birlug/256: happy programmer's day
happy programmer's day. Contribute to birlug/256 development by creating an account on GitHub.
❤3
اگر تو انتخاب پلت رنگی برای پروژهتون مشکل دارین، میتونین از این ابزار استفاده کنید:
https://coolors.co/
@ever_code
https://coolors.co/
@ever_code
Coolors.co
Coolors - The super fast color palettes generator!
Generate or browse beautiful color combinations for your designs.
🔥1
اگر هم صفحهای تو وب اعصابتونو خورد کرد میتونید بزنید و داغونش کنید :)
https://page-rage.com/
@ever_code
https://page-rage.com/
@ever_code
Page Rage
Page Rage: Destroy any web page
Page Rage is a free game that lets you destroy any page. Dealing with things in a healthy way is overrated. Hide from your problems and break things instead!
😍2
اگر وقت اضافی دارید، و یا میخواین یه جونیوری رو بدبخت کنید، بدید بره ببینه کجا سمیکولون (;) جا افتاده و پیداش کنه
https://semicolon.trm.sh
@ever_code
https://semicolon.trm.sh
@ever_code
❤1👍1