COMPΞZ 🧬
前往频道在 Telegram
متخصص کامپیوتر و نرمافزار • سازنده • هنرمند و طراح • مجموعهدار • نویسنده • تحلیلگر • مشاور استارتاپی و ایدهپرداز 𐎲𐎴𐎠𐎼𐎴𐎫𐎹 𐏃𐎢𐎶𐎠𐎫𐎹 We create because the world deserves better code. https://linktr.ee/compez
显示更多未指定国家未指定类别
393
订阅者
-124 小时
-17 天
+3230 天
帖子存档
393
حالا یه عده هم میگن حالا که راهی پیدا کردیم بعضیها گیر دادن به بد بودن این شیوه! نه اتفاقاً و حقیقتاً خوشحالی داره اما من یک فنی هستم تنها به نتایج مثبتش فکر نمیکنم برای همین هفتهٔ پیش شخصاً نرمافزار سادهساز این موضوع رو نوشتم و همینکه متوجه عمق فاجعش شدم بیخیالش شدم! وقتی به پشت داستان نگاه میکنم متوجه چیزیهایی میشم که یه کاربر ساده بهش اصلاً فکر نمیکنه و براش مهم هم نیست اما نتیجش در دامنهٔ گسترده و حجم بزرگ اصلاً جالب نیست.
میدونید واقعیت رو باید ببینیم! نمونش در مورد قضیهٔ حسابهای اپل که از طریق سیبچه و سیباپ ثبت میشه قبلاً توضیح داده بودم که چه بیاعتباری ننگینی رو داره ایجاد میکنه به اسم ایرانی جماعت اسمش رو هم گذاشتن خدمات اپ استور در ایران.
هر حسابی که به اسم ایرانیها ثبت میکنن به عنوان یک توسعهدهنده برای اپل صادر میشه! یعنی الآن اکوسیستم اپل میلیونها توسعهدهندهٔ ایرانی داره! مسخرست نه؟ که با جعل حسابها و ثبت ad-hocهای مسخره دسترسی برای ثبت هر گوشی به عنوان یک توسعهدهنده ایجاد شده و هربار که اپل متوجه میشه حساب رو مسدود میکنه و اون پشت مشتها میلیونها حساب جعلی با هویت ایرانی آرشیو و مستند میشه.
همین موضوع مشابهش الآن با روشهای دسترسی به اینترنت داره شکل میگیره. اینکه یک جمعیت میلیونی رو دستی دستی دارن هول میدن به سمت هویتهای دروغ بسیار غمانگیزه... ای کاش اینطور نمیشد و این حق ما نبوده و نیست.
این مسائل همشون از بیکفایتی مسئولین سرچشمه میگیره که اصلاً هویت ایرانی براشون مهم نیست! اصلاً مهم نیست...!
393
این واقعاً یک فاجعه است.
ظاهر ماجرا شاید این باشد که مردم دارند برای دسترسی به اینترنت راهحل پیدا میکنند، اما عمق ماجرا خیلی خطرناکتر است. این وضعیت باعث شده کاربر عادی، فقط برای سادهترین نیاز قرن ۲۱، مجبور شود وارد دستکاری لایههای شبکه و جعل مسیر، تغییر DNS، تغییر IP و هزار راهحل غیرطبیعی دیگر شود.
چیزی که در حالت عادی بیشتر در دنیای حملات، مافیاهای سایبری، اسپمرها و شبکههای سوءاستفاده دیده میشود، حالا تبدیل شده به ابزار روزمرهٔ آدمهایی که فقط میخواهند اینترنت داشته باشند.
فاجعه اینجاست که بسیاری حتی نمیدانند این مسیرها چه تبعاتی دارد. وقتی میلیونها کاربر عادی مجبور شوند از روشهای غیرشفاف و غیرعادی برای اتصال استفاده کنند، از بیرون، بخش بزرگی از ترافیک کشور میتواند شبیه رفتار مشکوک، جعلی یا مخرب دیده شود.
نتیجهاش فقط کندی و اختلال نیست. نتیجهاش این است که رنجهای IP ایران، سرویسدهندههای ایرانی و حتی کاربران بیگناه، در گزارشهای بینالمللی بیشتر و بیشتر با رفتارهای غیرعادی، جعلشده، تونلشده یا پرریسک گره میخورند.
این دیگر فقط فیلترینگ نیست؛ این خراب کردن اعتبار فنی و شبکهای یک کشور است.
وقتی مردم را برای ابتداییترین نیازشان به مسیرهای خاکستری هل میدهی، نباید تعجب کنی که خروجیاش یک اکوسیستم آلوده، غیرقابلاعتماد و پر از گزارشهای جعلی و مشکوک شود.
و اگر این روند ادامه پیدا کند، نتیجهاش اصلاً جالب نخواهد بود. نه برای مردم، نه برای کسبوکارها، نه برای سرویسدهندهها، و نه حتی برای همانهایی که فکر میکنند با این مدل کنترل، چیزی را مدیریت کردهاند.
خلاصه که خاک بر سرت کنم مسئول ارتباطات.
393
چقدر سادهاید شماها...
از کسانی که پول ده برابر گوشی رو میگیره که رجیستر کنه که فقط گوشی زهرهماری آنتن بده انتظار داری که با این طرحهای سیم سفید و پرو احساس مسئولیت و به حقِ مسلم مردم فکر کنه؟ پهع!!!
همونطور که پول رجیستری به گوشی ندادم، پول پرو هم به سیمکارت نمیدم. این هزینهها رو خرج سرور خودم بکنم دست و پا شکسته آنلاین باشم سنگینترم تا بدم به این حروم لقمهها.
393
در مورد SNI ظاهراً بهروز رسانی جدید دادن و اتصال ممکن هست؛ اما به این نکته هم باید توجه کنید؛ همین تکنیک در حملات مخفیسازی ترافیک هم استفاده میشه و در سناریوهای مخرب مثل مخفیکردن ترافیک C2 بدافزارها دیده شده.
خدا بگم چیکارتون نکنه یه ملت رو آوارهٔ چه روشهایی کردین! آخه کاربر عادی که فنی نیست و جز اینستاگرام گردیو چهارتا داده ساده شخصی چیزی نداره چرا باید اینهمه با این چیزها درگیر بشه! شماها حرف از تهدید امنیت ملی میزنید ولی یه ملت رو انداختین وسط گودالی از تهدید 😐 بیچاره کاربر ساده و مظلوم... بیخبر از پشت این ماجرا فقط خواستش وصل شدن به این اینترنت کوفتیه! بازش کنید دیگه پدر سگا.
393
یکی از قدرتهای اصلی ++C اینه که دست ما رو برای مدیریت حافظه باز میذاره. چیزی که نادونها عیب میدوننش! مثل چپی کلههای راست پرست!
در واقع میتونیم دقیقتر تصمیم بگیریم دادهها کجا ذخیره بشن، چقدر ظرفیت داشته باشن و چطور مصرف بشن.
اما این آزادی همیشه به معنی بهتر بودن نیست.
گاهی اگر محدودیت مشخصی تعریف نکنیم، برنامه بیدلیل وارد تخصیص حافظهٔ پویا میشه، سربار اضافی ایجاد میکنه و رفتار حافظه هم کمتر قابل پیشبینی میشه. اینجاست که فکر کردن برنامهنویس به عنوان یک کارشناس در اون لحظه بسیار مهمه.
اینجاست که باید بدونیم کجا باید محدودیت صریح تعریف کنیم، نه فقط به رفتار پیشفرض تکیه کنیم.
مثلاً وقتی میدونیم یک لیست نهایتاً ۱۶ یا ۳۲ آیتم خواهد داشت، استفاده از ساختاری مثل
std::inplace_vector میتونه انتخاب بهتری از std::vector معمولی باشه.
چون ظرفیت از قبل مشخصه، حافظه داخل خود آبجکت (شیء) نگهداری میشه و خبری از تخصیصهای غیرضروری در زمان اجرا نیست.
نتیجه چی میشه؟
مصرف حافظه شفافتر میشه، رفتار برنامه قابل پیشبینیتر میشه، و راندمان کلی نرمافزار بالاتر میره.
استانداردهای جدید زبان، مخصوصاً C++23 و C++26، دقیقاً دارن به همین سمت حرکت میکنن:
کدی مدرنتر، امنتر، سریعتر و قابل کنترلتر برای نرمافزارهای جدی و حرفهای.
یعنی یه ذره من از این وضعیت خلاص بشم کتاب جدیدم رو با استاندارد ۲۶ مینویسم! انقدری که مطالب جدید وجود داره و ما ازشون بیخبریم.393
وقتشه بریم سر بخت استاندارد ۲۶ 😑 چیزای جالبی داره به چشمم میخوره!
یک مورد خوب
std::inplace_vector هستش.
مثل std::vector است، ولی حافظهاش را از قبل داخل خودش نگه میدارد و معمولاً از heap حافظه نمیگیرد.
برای مثال روی استاندارد وکتور پیشفرض:
std::vector<int> a;
این وقتی بزرگ میشود، از heap حافظه میگیرد.
در حالی که در مدل جدید به شکل زیر:
std::inplace_vector<int, 10> b;
ظرفیتش از قبل مشخص شده! حداکثر ۱۰ عدد. حافظهٔ همین ۱۰ عدد داخل خود شیء آماده است.
این از نظر کارآیی (پرفرمنس) بسیار بهینست و جاهایی که میدونیم سقف مقادیر چقدر هستن به شدت میتونه مفید باشه.
برای مثال، در پروژهٔ رعد میتونیم همچین چیزی داشته باشیم:
std::inplace_vector<DownloadSegment, 32> segments;
هر دانلود نهایتاً ۳۲ سگمنت دارد.
پس لازم نیست برای سگمنتها vector معمولی بگیریم.
هم سریعتر است و هم تخصیص حافظهٔ کمتری دارد و هم رفتار قابل پیشبینیتر است.
چه زمانی حالت عادی std::vector بهتره؟ زمانی که ما سقف مشخصی از مقادیر رو نمیتونیم تشخیص بدیم! برای مثال ممکنه یه کاربر به تعداد ۱۰ تا یا بینهایت مقدار اضافه کند.
مثال:
std::vector<DownloadItem> downloads;
چون تعداد دانلودهای کاربر ممکن است ۱۰ تا باشد، ممکن است ۵۰۰ تا باشد و ما نمیتوانیم آن را ثابت در نظر بگیریم؛ بنابراین اینجا std::vector بهتر است.
#cpp26 #cpp #std #vector #inplace_vector393
خیلی از برنامهنویسهای قدیمی سیپلاسپلاس برای تبدیل مستقیم بیتهای حافظه از
reinterpret_cast استفاده میکردند.
مثلاً وقتی میخواستند بیتهای یک float را به شکل int ببینند.
مشکل اینجاست که این روش در بسیاری از مواقع طبق استاندارد سیپلاسپلاس رفتار تعریفنشده (Undefined Behavior) دارد؛یعنی شاید امروز درست کار کند، ولی فردا با تغییر کامپایلر یا فعال شدن Optimization ناگهان خراب شود.
از C++20 قابلیتی به نام std::bit_cast اضافه شد تا این کار به شکل استاندارد، ایمن و قابل پیشبینی انجام شود.
تفاوت اصلی:
🔴 reinterpret_cast
میگوید:
«این حافظه را از الان یک نوع دیگر فرض کن.»
🟢 std::bit_cast
میگوید:
«بیتهای این داده را کپی کن و با آنها یک شیء جدید بساز.»
همین تفاوت باعث میشود:
• قوانین حافظه نقض نشوند
• کامپایلر بهتر بهینهسازی کند
• رفتار برنامه قابل پیشبینیتر باشد
• کد مدرنتر و حرفهایتر شود
نمونهٔ قدیمی:
float value = 1.0f;
auto bits =
*reinterpret_cast<std::uint32_t*>(&value);
نمونهٔ جدید
#include <bit>
float value = 1.0f;
auto bits =
std::bit_cast<std::uint32_t>(value);
امروزه در برنامهنویسی سطح پایین، موتور بازی، شبکه، پردازش باینری، سیستمعامل و پروژههای حرفهای، استفاده از std::bit_cast بهجای روشهای قدیمی، بخشی از سبک مدرن سیپلاسپلاس محسوب میشود.
خلاصه:
reinterpret_cast
«حافظه را به زور نوع دیگری ببین»
std::bit_cast
«بیتها را ایمن و استاندارد تبدیل کن»393
پس گفتین که شبیه آمپرِ ماشینه و مسخرم میکنید هان...
تحویل بگیرید! 😏 خالص QML همینو رو نسخهٔ جدید جنیکانکت خواهید دید.
با من شوخی نکنید یهو میبینی میرم یه چیز پشم ریزون میسازم.
یه نقطهٔ ریز توی طراحی هم داره! هرچقدر سرعت بیشتر میشه ذراتِ بیشتری بهم برخورد میکنن!
393
در واقع این باگ به خاطر اینه که من بررسی کانکشن رو روی یک حلقهٔ بینهایت بررسی میکردم و زمانی که به یک timeout میخورد حتی با فعال بودن اتصال TUN هم این شرط ارزیابی اجرا میشد و بعد runtime اصلی برای ارزیابی اتصال رو متوقف میکرد و خود برنامه helper خارج میشد.
انگار که مثلاً فرش زیر پای جنیکانکت رو یهو بکشی! 😄 خودش خودشو راگ میکرد 😐
393
یه باگ عجیب روی جنیکانکت یافتم؛ اگه با سرعت زیاد و حجم بالا دانلود داشته باشید اتصال دنبال مجوز توسط سیستمعامل میگرده که باعث میشه اتصال از بین بره (در حالی که کار میکنه) ولی Uplink و Downlink یهو صفر میشه و مجبور میشید دوباره قطع و وصلش کنید.
این باگ حل شد! منتظر اعلان روی نرمافزار باشید وقتی بهروز رسانی بدم خودش بهتون اطلاع خواهد داد. 😎
393
البته زیاد هم به شرف ربطی نداره، بعضیها پولشو ندارن و بعضیها هم نمیدونن چطور باید فعالش کنن. 👋🏼 به خیلی از افراد پیامک رفته که حتی نمیدونه درگاه بانکی چی هست حتی.
393
طبقاتی شدن که دیگه شاخ و دم نداره.
خب این چه کاریه شما که برای هر چیزی میگی شونصد تا مدارک بده تا ببینیم جاسوسی، اغتشاشگری چیزی نیستی بهت اینترنت بدیم! خب چه کاریه مگه دسترسی به اطلاعات همهٔ ملت ندارید؟ شما حتی میدونی لباس زیر ما چه رنگیه! دیگه این طبقه بازیها چیه برا خودتون سطح بندی میکنید! 😒
393
همون هفتهٔ اول جنگ بود من دسترسی به سرور اصلی جنیلیپ نداشتم؛ چه کنم چه کنم استرس عدم تمدید و از بین رفتن دسترسیهام دیونم کرده بود طوری که پاشدم رفتم لب مرز با سیمکارت ترکیه یه ذره اینترنت گدایی کردیم که مثلاً بتونم ۱۰ دقیقه فقط وصل بشم به بلاکچین و دیتاسنتری که ازش سرور داشتم رو تمدید کنم که سایتم نخوابه زحمات سالها تلاشم به باد نره!
به خاطر چند ده دلار چند برابرشو هزینه کردیم که زحماتمون به باد نره (که تا عمق عجیبی هم به باد رفته) بعد طرف میگه من رایگان انجام میدم این چیزارو! بابا چیزی میزنی شما یا ما شوتیم؟ 😄 نشستی با سیم سفید نه پول میدی نه چالش جلو راحته نه میفهمیم استرس و دشواری یعنی چی بعد برا ما رایگان رایگان میکنی.
393
اینهمه کانفیگ رایگان میدن چرا اسمش رایگانه؟ واقعاً رایگانه؟ خودت چی فکر میکنی؟
۹۹٪ تمام سرورهایی که الآن یه سرویس اینترنتی روشون اجرا میشه همشون برای آروان بزرگترین زیرساخت مملکت هستن و از پشت CDN رد میشن بدون هیچ استثناء خاصی که اونها هم داستانشون جداست.
پاسخ سوأل توی داشبورد آروان هست؛ اگه اونجا چیزی رایگان پیدا کردی اونوقت میتونی باور کنی که اینایی که به قول شما کانفینگگگ رایگان میدن برا خیر پدرشون این کارو نمیکنن. یه هدفی پشتش هست و یه حمایتی چیزی قطعاً دارن.
دو دلیل بیشتر نداره:
۱) طرف واقعاً خر پوله عشقی حال میکنه که سرویس بده رایگان عنوان میکنه ولی در حقیقت داره کلی هزینه صرف ترافیک و زیرساختش میکنه! خب...
سوأل اینجاست که واقعاً در جامعهٔ کنونی داریم همچین آدمایی که بدون هیچ نیت جبران کننده متقابلی همچین کاری کنه؟ هزینههای سرور و ترافیک سرسام آور بالاست... خب چرا باید هزینه کنه که ما آنلاین بمونیم؟ هدفش چیه؟ تبلیغ؟ افزایش بازدید؟ باز هم شک بر انگیزه!
۲) نیتش کاملاً جمعآوری داده باشه و از فروش اطلاعات باشه! با توجه به قوانین و صدها بند و تبصره مافیاها و رانتبازهای زیادی هستن که ظاهر قضیه رو خاله مهربونه نشون میدن ولی اون پشت مشتا... نیت یه چیز دیگریست :)
خارج از این دو موضوع ممکن نیست کسی به رایگان بتونه کاری انجام بده؛ همه چیز هزینه داره و باید هزینه بشه... حتی تو بخوای برای خودت فقط خودِ خودِت هم سرویسی راهاندازی کنی حتی از این راهکارهای شخماتیک SNI استفاده کنی باز باید برای ایجاد یک پایداری مناسب هزینه بپردازی و سرور بخری، ترافیک بخری؛ مدیریتش کنی و در کل زمان و هزینه قطعاً وجود داره.
اندکی تفکر بد نیست...
والا من برای حتی همین توکن خودم جنی الآن ماههاست ماه به ماه پول سرورشو میدم که مثلاً مینیاپهاش و همون چیزایی که یه چیزی تهش مونده آنلاین بمونه که بعداً بتونم دادههای GenyTask رو محاسبه و ادامهٔ خدمات رو پیش بگیرم... سایتم بالا بمونه... مگه میشه چیزی رایگان؟! این خزعبلات چیه تفتش دادن کف جامعه! رایگان!!! آره تو گفتی ماهم باور کردیم!
چقدر خوب و مهربونید شماها.
393
مثال عینی؛ کنترل ترافیک روی macOS و بلاک کردن ترافیک توسط xray core پشتیبانی نمیشه! و فقط روی ویندوز و لینوکس کار میکنه.
خب این یک چالشه و من باید بیام خودم یه لایه بهش اضافه کنم بعداً که بیاد مثلاً با برنامهنویسی اختصاصی APIهای اپل این مسأله رو حل کنه. تا دلت بخواد از این چالشها هست! حتی روی رعد و برق من برای پیادهسازی ویژگی Adaptive Segment Controller روی ویندوز جواب نمیگیرفتم! مجبور شدم بردارم کلاً برای ویندوز یه لایه سفارشیتر ایجاد کنم چون ویندوز اجازهٔ مدیریت پردازنده رو در سطح بالا نمیده و باید کدهات بیشتر به صورت low level باشه.
اینجاست که من عاشق ماکروهای سی++ هستم یعنی برنامهنویسی بدون ماکرو انگار که چلو مرغ بخوری ولی مرغ نداشته باشه!😁
برنامهنویسی واقعی و لذت و طعم واقعیش اینطوریه که شما چالشهارو خیلی شیک و جذاب حل کنی و ازش لذت ببری؛ کاربر هم بدون حتی متوجه شدن اون پشت مشتای قضیه از خروجیش راضی باشه! لذتش برای سازنده یه طعم خاصی داره برای مصرف کننده هم یه طعم خاص دیگهای ولی برای خالقش لذتبخشتره به شرطی که به بازخوردهاش توجه کنه! برای همینه من عاشق نتایجم که ببینم کاربر باز خورد میده و کیف میکنه! این کیف کردنه خستگی آدمو در میاره.
خلاصه که اینطوریاست؛ این پشت مشتا فرض رو اینطور بگیر که ده نفر برنامهنویس از گوگل، از اپل و از مایکروسافت استخدام کردی که بشینه یه برنامه رو فقط برای پلتفرم مقصد (هدف) کامپایل کنه اینها هزینه بر هستن و باید بدونی چطور از پسش بر میای.
اینجاست که طعم واقعی رو باید بچشی و الکی هزینه صرف مباحث پیش پا افتاده نکنی.
عصر عصر چند-سکوییه! اگه به روش سنتی پیش بری کلاهت پس معرکست ای برنامهنویسِ پر تلاش که هنوز در حال یادگیری هستی...
چند سال پیش گفتم برید سراغ Cross-Platformهای واقعی و بومی که اینهمه در مورد Qt من مانور دادم که تنها گزینهٔ بومیست! مخاطب شما نباید محدود به یک پلتفرم باشه باید بتونی حتی اگه متنفر هم باشی روی پلتفرم مقصدی که مصرف کننده داره خروجی بگیری.
393
شاید بگید اینکه برای اکوسیستم اپل برنامه میسازی پس لابد از Swift استفاده میکنی یا Objective-C اتفاقاً برعکس! سوئیفت برای من حکم #C روی ویندوز رو داره ده سال پیش من با این اسباببازیا کار کردم که محدود در توسعهپذیری خارج از قوائد اکوسیستم و محدود به یک حوزه هستن! اما برای کسی که فقط برای اکوسیستم اپل کار میکنه انتخابِ اول محسوب میشه؛ حرفی نیست درست هم هست.
اما واقعیت اینه با هیچ زبانی شما نمیتونی ممکن نیست روی همهٔ این پلتفرمها که گفتم کدت رو اجرا کنی قطعاً یه جا مجبوری بری زیر سلطهٔ قوانین محدودگر که قبلاً کلی در موردش صحبت کردم که چرا این شرکتهای غول خودشون ابزار میدن بیرون ولی خودشون از اون پشت مشتا صحبت نمیکنن.
اینکه روی چند اکوسیستم با چند نوع معماری متفاوت کار کنی خودشون پر از چالش و کلی مباحث فنی و ساختاری هستن؛ مثلاً شاید یک خط کد بنویسی فقط با قوائد ویندوز کار کنه؛ اما اینکه کد تو به همون اندازه و با همون کیفیت روی مثلاً مک هم کار کنه این خودش یعنی درک بیشتر از قوائید بازی؛ برای همین وقتی بری دنبال این چیزا بعدش دیگه دنیای نرمافزار برات بسیار متفاوت و بیانتها خواهد شد.
مثل اینه که یه تکنسین یا تعمیرکار بتونه هم زمان مشکل بنز و بیاموی و یا پورشه و آئودی رو درک و حلشون کنه و هم زمان سه سوته هم بتونه مشکل پراید رو هم درک و عین آب خوردن حلش کنه.
نباید مهم باشه که نوع ماشین یا جنس موتور چیه! برنامهنوسی هم همینه! مهارت و تجربه وابستهٔ هم هستن! مهارت داشته باشی اما تجربه نداشته باشی عمراً بتونی خروجی قابل قبول بدی بیرون.
این چیزاست که مارو پیر کرده... طرف وقتی میره طراحی UI یاد میگیره ما میریم طراحی رو یه بار با قوائد مایکروسافت یاد میگیریم یه بار توی قوائد اپل، گوگل و ... همهٔ اینها سالها زمان برده که من الآن در عرض ۲۴ ساعت یهو همزمان کدی منتشر میکنم که هم برای اپل هم برای ویندوز اجرا میشه.
حالا بخوام اینو روی اندروید و بقیه پلتفرمها هم اجرا کنم طبیعتاً باید به ۳ تا ۴ برابر بهینش کنمو چون نرمافزارهای کاربری به معنای چاپِ یک Hello, World نیست که بگم با دستور زیر:
std::print("Hello, World");
توی همهٔ پلتفرمها جواب میگیریم پس حله! نه خب این یه چاپ سادست! مهم اینه که ببینی مثلاً xray روی اندروید چطوری کار میکنه اصلاً! معماری و فرایند مدیریت مثلاً ترافیک چطوریه! یا مثلآً در مورد رعد، کار کردن با شبکه روی ویندوز با مک زمین تا آسمون فرق داره! اینکه برنامت روی هر جفتشم درست جواب بده اینا همشون هزینه و زمان نیاز داره.
برای همینه که ابتدا یه حوزه رو پوشش میدیم و بعد کم کم روی پلتفرمهای دیگه نهاییش میکنیم. تازه این در صورتیه که ما واقعاً زیرساخت مشترک داشته باشیم که با قدرت گرفتن از سی++ همشون ممکن شده. و اگرنه باید برای هر نسخه ده تا زبان برنامهنویسی عوض کنی صد بار پروژه رو از صفر تا صد بنویسی که مثلاً بخوای ۹۹.۹٪ شبیه نسخهٔ مشترکش باشه.