ar
Feedback

لا تقع ضحية للمخادعين! تيليمتريو يكتشف ويُميّز هذه القنوات 👉 إذا كنت تريد رؤية العلامة، اشترك

کدهالیک | codehalic

کدهالیک | codehalic

الذهاب إلى القناة على Telegram

دوره های آموزشیمون رو از داخل سایت ببینید https://codehalic.ir

إظهار المزيد
3 967
المشتركون
-6124 ساعات
-1607 أيام
-17730 أيام
أرشيف المشاركات
این ابزار بهتون اجازه میده همون موقعی که دارید رو سیستم خودتون کد میزنید عمدا کانکشن سرویس هاتون رو دستکاری کنید تا ببینید بر
این ابزار بهتون اجازه میده همون موقعی که دارید رو سیستم خودتون کد میزنید عمدا کانکشن سرویس هاتون رو دستکاری کنید تا ببینید برنامتون تو شرایط بحرانی چه واکنشی نشون میده. در واقع شما به سرور استیجینگ وصل میشید ولی فقط برای سشن خودتون شبیه سازی میکنید که مثلا دیتابیس کند شده یا ارتباط کلا قطعه بدون اینکه کار بقیه تیم مختل بشه. اینجوری قبل از اینکه کدتون بره رو پروداکشن و فاجعه به بار بیاره قشنگ متوجه میشید که اون لاجیک هایی که برای هندل کردن ارورها و تایم اوت ها نوشتید واقعا کار میکنن یا فقط الکی اونجا نشستن. https://metalbear.com/blog/mirrord-chaos-testing @codehalics | کدهالیک

پکیج AnimateIcons یه کلکسیون در حال توسعه از آیکون‌های متحرک و آماده‌ست. این ابزار به شما کمک می‌کنه تا بدون نیاز به طراحی صف
پکیج AnimateIcons یه کلکسیون در حال توسعه از آیکون‌های متحرک و آماده‌ست. این ابزار به شما کمک می‌کنه تا بدون نیاز به طراحی صفر تا صدِ انیمیشن‌ها، ظاهر پروژه‌تون رو پویاتر و حرفه‌ای‌تر کنید. این مجموعه مشخصاً برای اون دسته از برنامه‌نویس‌هایی طراحی شده که دوست دارن رابط کاربری (UI) پروژه‌شون حس تعاملی‌تری به کاربر بده، اما در عین حال نمی‌خوان درگیر پیچیدگی‌های اضافه‌ی کدنویسی بشن. https://animateicons.in/ npm i @animateicons/react @codehalics | کدهالیک

دوستانی که مک دارن پیشنهاد میکنم حتما این اپ رو امتحان کنین خیلی خوبه! یه آیکون کوچیک توی منوبار که کار ده‌ها اپ پولی رو یک‌ج
دوستانی که مک دارن پیشنهاد میکنم حتما این اپ رو امتحان کنین خیلی خوبه! یه آیکون کوچیک توی منوبار که کار ده‌ها اپ پولی رو یک‌جا انجام می‌ده. رایگان، اوپن‌سورس و همه‌چیز فقط روی خود مک اجرا می‌شه (بدون اکانت، بدون ترکینگ، بدون اشتراک). امکانات اصلیش ایناست: • کنترل صدای جدا برای هر اپ (مثل میکسِر ویندوز) • مانیتور کامل سیستم (CPU، GPU، رم، دما، باتری، شبکه و مصرف انرژی) • جلوگیری از خواب مک (Keep Awake) • سوییچر خیلی بهتر پنجره‌ها با پیش‌نمایش زنده • تاریخچه کلیپ‌بورد + شلف فایل‌ها • آنینستالر تمیز اپ‌ها • و کلی ابزار دیگه مثل اسکرین‌شات پیشرفته، اسنیپت متن، ویندوز اسنپ و... ماژولاره هم هست؛ فقط چیزایی که لازم داری رو فعال می‌کنی. اگه مک داری، حتماً یه نگاهی بهش بنداز: http://vorssaint.com GOODRICH ✍️ @codehalics | کدهالیک

وضعیت دیجیکالا بعد از گرون شدن دلار ! در حال بروزرسانی (قیمت ها) هستیم :)))) @codehalics | کدهالیک
وضعیت دیجیکالا بعد از گرون شدن دلار ! در حال بروزرسانی (قیمت ها) هستیم :)))) @codehalics | کدهالیک

بچه‌ها بریم سراغ جواب اون سوال مصاحبه که قولش رو داده بودم. وقتی صحبت از استراتژی‌های کشینگ میشه، ما چند تا الگوی استاندارد داریم که بسته به سناریو و نیازمندی سیستم باید بهترینش رو انتخاب کنیم. استراتژی اول: Cache Aside یا Lazy Loading این رایج‌ترین مدلیه که تو پروژه‌ها می‌بینید. روند کار اینطوریه که اپلیکیشن شما اول برای گرفتن دیتا میره سراغ ردیس. اگه دیتا اونجا بود که سریع برمی‌گردونه. اما اگه نبود، میره از دیتابیس اصلی مثل اس کیو ال سرور رکورد رو می‌خونه، کش رو آپدیت می‌کنه و بعد جواب رو میده. مثال بارزش خوندن کاتالوگ محصولات یا اطلاعات پایه یه سیستمه که زیاد خونده میشن اما دیر به دیر تغییر می‌کنن. استراتژی دوم: Write Through تو این مدل وقتی کاربر یه دیتایی رو ثبت یا آپدیت می‌کنه، اپلیکیشن شما همزمان اون دیتا رو هم داخل دیتابیس و هم داخل کش می‌نویسه. مزیت بزرگش اینه که همیشه دیتای داخل کش کاملا با دیتابیس سینک هست و دیتای کهنه یا منقضی شده به کاربر نمیدید. عیبش اینه که عملیات رایت یه کوچولو کندتر میشه چون دیتا باید هر دو جا نوشته بشه. این روش برای دیتاهایی که هم زیاد خونده میشن و هم آپدیت بودنشون به شدت حیاتیه کاربرد داره. استراتژی سوم: Write Behind یا Write Back این الگو برای سیستم‌های با ترافیک بالا فوق‌العاده است. اینجا شما دیتای جدید رو فقط داخل ردیس می‌نویسید و بلافاصله به کاربر پاسخ موفقیت‌آمیز میدید تا معطل نشه. بعدا تو بک‌گراند یه سرویس یا ورکر میاد این دیتاها رو جمع می‌کنه و به صورت دسته‌ای می‌بره سمت دیتابیس اصلی ذخیره می‌کنه. بهترین مثالش سیستم‌های لایک یا شمارشگر بازدید ویدیو هست که حجم نوشتن توشون به شدت بالاست. البته ریسکش اینه که اگه نود ردیس قبل از سینک شدن با دیتابیس کرش کنه، ممکنه بخشی از دیتا از دست بره.
در نهایت تو پروژه‌های بزرگ و معماری‌های توزیع‌شده، ما معمولا فقط به یک روش بسنده نمی‌کنیم و ترکیبی از این استراتژی‌ها رو پیاده می‌کنیم. هنر شما به عنوان طراح سیستم اینه که بر اساس بار ترافیکی و نیاز بیزینس، الگوی درست رو برای هر بخش از پروژه انتخاب کنید.
رفرنس : https://devscape.in/blog/caching-strategies @codehalics | کدهالیک

تو یکی از مصاحبه‌هایی که اخیرا برای پوزیشن Software Engineer تو یه شرکت خیلی خوب داخلی داشتم، یه سوال جالب ازم پرسیدن که امرو
تو یکی از مصاحبه‌هایی که اخیرا برای پوزیشن Software Engineer تو یه شرکت خیلی خوب داخلی داشتم، یه سوال جالب ازم پرسیدن که امروز می‌خوام راجع بهش باهاتون صحبت کنم. مصاحبه‌کننده اول پرسید آیا تا به حال از ردیس استفاده کردی؟ گفتم بله. پرسید برای چه کاری؟ جواب دادم عموما برای کش کردن دیتا. بعد رسید به سوال اصلیش و گفت خب حالا بگو کلا چند تا استراتژی کشینگ موقع استفاده از ابزارهایی مثل ردیس یا مموری کش داریم؟ پاسخش رو تو پست بعدی براتون می‌ذارم ولی تا پست بعدی آماده بشه، یکم بهش فکر کنید و ببینید جواب شما به این سوال چیه. #interview @codehalics | کدهالیک

یکی از جذاب‌ترین الگوها تو معماری فرانت‌اند و توسعه کامپوننت‌های ری‌اکت، نوشتن کامپوننت‌های پلی‌مورفیک یا چندریختی هست که بهم
یکی از جذاب‌ترین الگوها تو معماری فرانت‌اند و توسعه کامپوننت‌های ری‌اکت، نوشتن کامپوننت‌های پلی‌مورفیک یا چندریختی هست که بهمون اجازه میده با پاس دادن یه پراپ ساده مثل as یا component، نوع تگ رندر شده رو به صورت داینامیک عوض کنیم. این دقیقا همون تکنیک قدرتمندیه که تو دیزاین سیستم‌های بزرگی مثل متریال دیزاین هم استفاده میشه تا مثلا بتونیم یه کامپوننت دکمه رو به راحتی تبدیل به یه تگ لینک کنیم و در عین حال تایپ‌اسکریپت هم به صورت هوشمند فقط پراپ‌های مجاز همون تگ جدید رو بهمون پیشنهاد بده.
function Test () {
  return <>
    Should work:
    <Text as="p">Hello</Text>
    <Text as="a" href="https://www.google.com">Google</Text>
    <Text as="time" dateTime="2026-06-19">June 19, 2026</Text>
    <Text as="data" value="123">123</Text>

    Should fail type-checking:
    <Text as="p" href="https://www.google.com">Google</Text>
    <Text as="a" datetime="2026-06-19">June 19, 2026</Text>
  </>
}
https://kittygiraudel.com/2026/06/19/typed-polymorphic-react-component @codehalics | کدهالیک

زبان G# یا همون جی‌شارپ یه زبان برنامه‌نویسی جدید و متن‌باز برای اکوسیستم دات‌نت هست که ساختارش رو از زبان گو الهام گرفته و م
زبان G# یا همون جی‌شارپ یه زبان برنامه‌نویسی جدید و متن‌باز برای اکوسیستم دات‌نت هست که ساختارش رو از زبان گو الهام گرفته و می‌خواد برنامه‌نویسی سیستم و موبایل رو با کدهای سبک و امن راحت‌تر کنه. این زبان بهت اجازه میده سادگی و قابلیت‌های همزمانیِ گو مثل کانال‌ها رو در کنار مدل async و await دات‌نت داشته باشی و خیلی راحت از کتابخونه‌ها و پکیج‌های نودگت هم استفاده کنی. چون با دات‌نت ۸ تا ۱۰ سازگاره و خروجی‌های بسیار سبکی میده، هم برای کارهای ابری و وب‌اسمبلی عالیه و هم یه مسیر یادگیری خیلی خوب برای کساییه که می‌خوان از گو، سوئیفت یا کاتلین وارد دنیای دات‌نت بشن. https://github.com/DavidObando/gsharp @codehalics | کدهالیک

اگه این روزا استک پروژه تون NextJs هست و نمیدونین چه مدلی مناسب تره برای کد زدن بهتره که این بنچ مارک که توسط تیمشون انجام شد
اگه این روزا استک پروژه تون NextJs هست و نمیدونین چه مدلی مناسب تره برای کد زدن بهتره که این بنچ مارک که توسط تیمشون انجام شده رو بهش یه نگاه بندازین اینطوری خیلی سیف تر و مطمئن تر روی مدل هایی که استفاده می کنید سرمایه گذاری می‌کنید! بنچ مارک این موارد رو براتون به نسبت مدل شفاف میکنه: -امتیازدهی‌ بر اساس نرخ موفقیت -میانگین مدت‌زمان -میانگین هزینه https://nextjs.org/evals Javad @codehalics | کدهالیک

چند ماه قطعی‌های اینترنت ایران رو یادتونه؟ وسط همون روزا، یه پروژه‌ی NestJS + Prisma داشتیم که باید دیپلوی می‌شد ولی همه چی خاموش بود!!!!. روی سیستم لوکال همه‌چی عادی بود. ولی همین که npx prisma generate رو تو Container زدیم، گیر کردیم !! چون Prisma برای Generate کردن Client، یه Engine باینری از سرور خودش (نه npm) دانلود می‌کنه. و اون سرور رو اصلاً دسترسی نداشتیم. یعنی یه دستور که همیشه چند ثانیه طول می‌کشید، تبدیل شد به یه مشکل واقعی که باید حلش می‌کردیم اونم بدون اینکه اینترنت بین المللی داشته باشیم. تو این پست کامل نوشتم چطور با پیدا کردن Environment Variable درست، و آوردن Engine باینری سازگار از ریپوی خود Prisma، مشکل رو بدون نیاز به اینترنت حل کردیم: https://www.linkedin.com/feed/update/urn:li:ugcPost:7496507502277173249/ @codehalics | کدهالیک

یه نکته خیلی قشنگی داخل پادکست طبقه ۱۶ این هفته بود راجع به اینکه ما الان کلی ایده داریم ولی چرا کسی روش سرمایه گذاری نمیکنه ! میگفت الان خیلی از کسایی که سرمایه گذاری میکنن یه سوال خیلی مهم میپرسن که بنظرت این ایدت رو اگر گیت هاب یا آنتروپیک یا اصلا شرکت های بزرگ که هم پول دارن هم نیرو انسانی دارن هم وقت دارن از نو بنویسن و اینهمه هم کاربر دارن میتونن هدایتشون کنن به سمت این پروداکت ها !‌باز چه نفعی سرمایه گذاری روی تو داره و دقیقا هوش مصنوعی خوشبختانه یا متاسفانه این فاصله رو خیلی خیلی کم کرده ! شما ممکنه یه ایده خیلی نابی بزنی ولی خب اسلک میاد اسلک کد میده بیرون بیزنس شما تا بره اونهمه کاربر رو جمع کنه اون کالچر رو بسازه ولی خب اسلک به اصطلاح یوزر بیسش رو داره ! حالا چون بنظرم مرتبط اومد اینو نوشتم اینجا ولی هر ایده ای دارید به این موضوع عمیقا فکر کنین که یه جای خیلی بزرگ اگر بیاد عین ایدتون رو بزنه چی ؟ آیا میتونین خودتون رو انقد خوب پرزنت کنین که بجای اینکه وقت بزاره ایده تون رو بزنه که تایمش رو هم هوش مصنوعی خیلی خیلی کمش کرده بیاد و شرکت یا ایده شما رو ازتون بخره ؟ @codehalics | کدهالیک

در یک حرکت انتحاری برای مقابله با BUZZ جک دورسی اسلک هم از فیچر جدید اسلک کد رونمایی کرده ! اسلک قابلیت Slack Code را معرفی ک
در یک حرکت انتحاری برای مقابله با BUZZ جک دورسی اسلک هم از فیچر جدید اسلک کد رونمایی کرده ! اسلک قابلیت Slack Code را معرفی کرده که به تیم‌ها اجازه می‌دهد ایجنت‌های هوش مصنوعی را در کانال‌های اختصاصی برای نوشتن، بررسی و انتشار کد به کار بگیرند. این قابلیت با حضور ایجنت‌هایی از جمله کلاد، چت‌جی‌پی‌تی، Devin، کوپایلوت و دیگر سرویس‌ها ارائه شده و روند کدنویسی، بازبینی و پیش‌نمایش را داخل اسلک انجام می‌دهد. دیجیاتو ✍️ @codehalics | کدهالیک

این چنل پروژه‌های Open Source، ابزارهای کاربردی و ریپازیتوری‌های جالب برنامه‌نویسی رو جمع‌آوری و معرفی میکنه. t.me/RepoFA دوس
این چنل پروژه‌های Open Source، ابزارهای کاربردی و ریپازیتوری‌های جالب برنامه‌نویسی رو جمع‌آوری و معرفی میکنه. t.me/RepoFA دوست داشتید جوین بشید.❤️✌🏽

یکمی حس میکنم ادبیاتش شاید برای کسایی که تازه کار باشن ناآشنا و سخت باشه برای همین یکمی ساده ترش میکنم فرض کنید صفحه سایتتون مثل یه ساختمان بزرگه. اگه کلید برق یه اتاق رو توی پنل ورودی اصلی کل ساختمان بذارید، با هر بار زدن کلید، سیستم مجبور میشه وضعیت تک‌تک اتاق‌ها رو چک کنه ببینه تغییری کردن یا نه. تو این حالت خیلی از برنامه‌نویس‌ها برای حل کندی میرن روی در بقیه اتاق‌ها برچسب میزنن که نیازی به بررسی شما نیست، که این دقیقاً همون استفاده بی‌دلیل از ابزارهایی مثل useMemo هست که فقط کد رو پیچیده‌تر و حافظه رو درگیر میکنه. اما راه اصولی و ساده‌تر اینه که کلید برق رو از ورودی اصلی بردارید و دقیقاً بذاریدش داخل همون اتاق، تا موقع زدن کلید فقط همون بخش واکنش نشون بده و بقیه ساختمان اصلاً متوجه اتفاقی نشن. تو دنیای برنامه‌نویسی به این کار میگن انتقال استیت به پایین‌ترین سطح ممکن یا نزدیک‌ترین مصرف‌کننده. امیدوارم متوجهش شده باشید که منظور دقیقا از پست قبلی چی بود ! @codehalics | کدهالیک

یه نکته فرانتی خفن برای کسایی که خیلی از useMemo و React.memo استفاده میکنن استفاده بی‌رویه از useMemo و React.memo بدون پروفایلینگ فقط هزینه‌ی نگهداری کد رو بالا می‌بره، چون ری‌رندر تو ری‌اکت صرفاً اجرا شدن مجدد تابع کامپوننت و ساخت ابجکت‌های جدید JSX هست و تا زمانی که فرآیند Commit و تغییرات فیزیکی DOM اتفاق نیفته، پردازش سنگینی محسوب نمیشه. چرخه ری‌رندر کلاً سه تا تریگر داره: تغییر استیت داخلی، تغییر مقادیر context، یا دریافت ابجکت المنت جدید از والد؛ بنابراین تغییر Props به‌خودی‌خود تریگر نیست مگر اینکه کامپوننت با React.memo رپ شده باشه تا مقایسه سطحی یا Shallow Compare رو پراپس انجام بده. برای حل مشکلات کارایی، بهینه‌سازی اول از اصلاح ساختار شروع میشه: پایین بردن محل قرارگیری استیت تا نزدیک‌ترین مصرف‌کننده و استفاده از الگوی ترکیب با children prop که باعث میشه ری‌اکت به دلیل یکسان بودن رفرنس ابجکت، کلاً فاز محاسبه زیردرخت رو Bypass کنه. در نهایت اگه بعد از سنجش با ابزارهایی مثل Profiler یا React Scan محاسبه سنگینی دیدید، اونوقت تثبیت رفرنس با useMemo یا جداسازی با useDeferredValue معنا پیدا می‌کنه، چرا که حتی React Compiler هم فقط فرآیند ممیوایز کردن رفرنس‌های JSX رو خودکار می‌کنه و توانایی جابه‌جایی استیت یا اصلاح ساختار درخت کامپوننت رو نداره. https://thetshaped.dev/p/react-rendering-demystified-your-usememo-probably-isnt-doing-anything @codehalics | کدهالیک

انگولار ۲۲ با کلی تغییرات اساسی منتشر شده که مهم‌ترینش استیبل شدن Signal Forms به عنوان یه جایگزین یکپارچه و قوی برای فرم‌های
انگولار ۲۲ با کلی تغییرات اساسی منتشر شده که مهم‌ترینش استیبل شدن Signal Forms به عنوان یه جایگزین یکپارچه و قوی برای فرم‌های قبلیه. تو این آپدیت، استراتژی تشخیص تغییرات کامپوننت‌های جدید به صورت دیفالت روی OnPush تنظیم شده و علاوه بر اجباری شدن مهاجرت به تایپ‌اسکریپت ۶، ابزارهای جدیدی هم برای تزریق وابستگی اضافه شده. یه بخش خیلی هیجان‌انگیز این نسخه، پشتیبانی آزمایشی از WebMCP هست که به ایجنت‌های هوش مصنوعی اجازه میده به جای خوندن ظاهر صفحه، مستقیم از طریق یه پروتکل با اپلیکیشنی که در حال اجراست تعامل داشته باشن. https://angular.dev/events/v22 @codehalics | کدهالیک۴

این لغت یعنی XP مخفف Extreme Programming هست. یه متدولوژی خیلی معروف تو توسعه نرم‌افزاره که همون کنت بک (نویسنده کتابی که تو مقاله بود) اواخر دهه نود معرفیش کرد. ایده اصلیش خیلی سادس: میگه بیاین پرکتیس‌های خوب مهندسی نرم‌افزار رو بگیریم و تا بالاترین حد ممکن (همون اکستریم) اجراشون کنیم. مثلا اگه معتقدیم کد ریویو کار خوبیه، پس بیایم کلا دو نفری پای یه سیستم کد بزنیم که میشه همون پیر پروگرمینگ (Pair Programming). یا اگه تست کردن جوابه، پس اول تست رو بنویسیم و بعد کدش رو بزنیم (TDD). هدف کلی XP اینه که با تکیه روی ارزش‌هایی مثل ارتباط مداوم تو تیم، سادگی تو معماری، و گرفتن فیدبک سریع، هم کیفیت خروجی بره بالا و هم تیم نرم‌افزاری بتونه خیلی راحت‌تر و با استرس کمتر با تغییرات کنار بیاد. @codehalics | کدهالیک

دمت گرم که رک گفتی، حق با توئه. اصطلاحات من‌درآوردی رو می‌ذاریم کنار و با زبان واقعی خودمون می‌نویسم: نویسنده مقاله میگه وسط
دمت گرم که رک گفتی، حق با توئه. اصطلاحات من‌درآوردی رو می‌ذاریم کنار و با زبان واقعی خودمون می‌نویسم: نویسنده مقاله میگه وسط این بلبشوی هوش مصنوعی و توقعات فضایی مدیرها، بازخوانی کتاب ۲۷ ساله «اکستریم پروگرمینگ» کنت بک بدجور جواب میده. خیلیا فکر می‌کنن XP فقط یعنی پیر پروگرمنگ (کد زدن دونفره) و TDD، اما این کتاب ۲۶ تا روش عملی و ۵ تا ارزش کلیدی داره که دقیقاً درمان درد امروز ماست. الان که همه با ابزارهای AI پی‌آرهای غول‌آسا باز می‌کنن و کیفیت کد داره فدای سرعت میشه، اصول XP مثل سادگی، جلوگیری از معماری‌های پیچیده و بی‌خود، بازخورد سریع و احترام به وقت همدیگه یادمون میاره چطور کار کنیم. دلیل پیشنهاد این کتاب همینه که یاد بگیریم چطور وسط این سرعت دیوانه‌وار، کنترل کیفیت پروژه رو دستمون بگیریم و به عنوان یه مهندس زیر فشار ابزارها له نشیم. لینک کتاب برای مطالعه : https://refhub.ir/fa/refrence_detail/extreme-programming-explained-embrace-change/ لینک مقاله : https://managerdotdev.beehiiv.com/p/extreme-programming-1999-2026 @codehalics | کدهالیک

چرا یه هفتس رو این عدد ۳۹۹۷ گیر کردیم چرا ۴۰۰۰ تا نمیشیم ☹️

خیلی وقتا برای هماهنگ کردن تب‌های مرورگر (مثلا وقتی کاربر تو یه تب لاگ‌اوت میکنه یا سبد خریدش رو آپدیت میکنه) میایم سراغ هک localStorage. یعنی یه دیتا مینویسیم و فورا پاک میکنیم تا ایونت storage صدا زده بشه. این روش پر از دردسره، کدهای اضافه زیادی می‌طلبه و کلا از پایه برای این کار ساخته نشده. راه‌حل نیتیو و اصولی چیه؟ استفاده از BroadcastChannel این API دقیقا برای ارتباط مستقیم بین تب‌ها ساخته شده. نه نیازی به JSON.stringify داره، نه لازم هست ایونت‌های اضافه رو فیلتر کنید و دیتای ساختاریافته رو خیلی راحت منتقل میکنه. فقط یه کانال با اسم مشخص باز میکنید و پیامتون رو می‌فرستید: توی تب فرستنده:
const channel = new BroadcastChannel('app-sync');
channel.postMessage({ type: 'LOGOUT' });
توی تب‌های گیرنده:
const channel = new BroadcastChannel('app-sync');
channel.onmessage = (event) => {
  console.log(event.data); // { type: 'LOGOUT' }
};
به همین راحتی و تمیزی! کدهای کثیف و هک‌های قدیمی رو پاک کنید و از این مسیر مستقیم استفاده کنید. فقط یادتون باشه وقتی کارتون تموم شد channel.close() رو صدا بزنید تا ریسورس‌ها آزاد بشن. بفرستید برای بقیه بچه‌های کامیونیتی تا اونا هم کدهاشون رو ریفکتور کنن! @codehalics | کدهالیک