Syntax | سینتکس
3.01K subscribers
410 photos
108 videos
35 files
379 links
Download Telegram
L25-Atomic-Operations.pdf
817.1 KB
عملیات اتومیک در سخت افزار

تو این مقاله یه سری توضحات خوبی در خصوص اتومیک اپریشن داده

توضیح کوتاه:
اگه شما یک متغیری داشته باشید و قراره چندین پراسس همزمان روی این متغیر تغییری بوجود بیارن
برای مثال متغیر ما counter هستش و تمامی ترد ها میخوان counter++ کنند.

در این صورت ما میتونیم از mutex استفاده کنیم. اما بهتر از mutex استفاده از atomic operation هستش که performance بهتری داره زیرا از یک ویژگی در سی پی یو ما استفاده میکنه و میاد یک متغیر اتومیک درست میکنه که در لحظه فقط یک ترد میتونه بهش دسترسی داشته باشه و تغییراتی رو بده.

#note #atomic_operation

@Syntax_fa
👍5
لیست کلید واژه و شناسه ها در پایتون.

کدومش براتون کمترین استفاده رو داشته ؟

#Note

@Syntax_fa
👍10👎1
پر استفاده ترین سمبل ها در زبان های برنامه نویسی.

#Note

@Syntax_fa
👍11👎1
مفهوم اندازه و ظرفیت (Size, Capacity) در آرایه

یکی از پایه ای ترین ساختار داده آرایه ها هستند. در آرایه ها ما بصورت ترتیبی مقادیر را قرار می دهیم.

برای تعریف یک آرایه ما باید در قدم اول ظرفیت آرایه رو مشخص کنیم برای مثال ظرفیتش اگه 4 تا باشه فقط می تونیم 4 تا عنصر رو داخلش قرار بدیم.

همچنین لیست های پایتون، یک Array List هستند که در پشت صحنه همان آرایه ها هستند. پس سوالی که مطرح میشود این است که در لیست ها ما چجوری میتونیم هر چقدر که دوست داریم عنصر قرار بدیم و در تعریف کردن سایز رو هم مشخص نمیکنیم؟

در پشت صحنه اتفاقی که میوفتد دقیقا یک آرایه تعریف میشود با ظرفیت مشخص و وقتی که آرایه پر شد و ظرفیت خالی نداشت، یک آرایه بزرگ تر ساخته می شود و عناصر داخل آرایه جدید کپی میشود.

در عکس کاملا مشخص است چگونه این اتفاق میوفتد.

#note #data_structures

@Syntax_fa
👍8
دوازده نکته مهم برای امنیت api هاتون که باید رعایت کنید

#Note

@Syntax_fa
👍162
بخش های مختلف URL

#Note

@Syntax_fa
👍9👎2🔥1
Throughput و response time

دو مفهوم مهم در زمینه‌ی علوم کامپیوتر و مهندسی نرم‌افزار هستند که به نمایانگر عملکرد سیستم‌ها می‌باشند. در ادامه، توضیحی درباره هرکدام ارائه می‌شود همراه با یک مثال:

1. Throughput (ظرفیت):
به میزان کلی از داده‌ها یا فرآیندهایی که یک سیستم می‌تواند در یک بازه زمانی خاص پردازش کند، اشاره دارد. به عبارت دیگر، throughput نشان‌دهنده تعداد واحدی از فعالیت (مثلاً تعداد درخواست‌های وب یا تعداد تراکنش‌های پایگاه داده) در یک بازه زمانی مشخص است.

مثال:
فرض کنید یک وب‌سایت دارید و می‌خواهید throughput آن را اندازه‌گیری کنید. اگر در یک دقیقه 60 درخواست وب به سرور شما برسد و همه آن‌ها با موفقیت پردازش شوند، throughput وب‌سایت شما برابر با 60 درخواست در دقیقه است.

2. Response Time (زمان پاسخ):
Response time
یا زمان پاسخ، مدت زمانی است که از زمان ارسال درخواست تا زمان دریافت پاسخ می‌گذرد. این مفهوم نشان‌دهنده واکنش سیستم به یک فرآیند یا درخواست خاص است و معمولاً در واحد زمانی مانند میلی‌ثانیه اندازه‌گیری می‌شود.

مثال:
اگر شما یک درخواست HTTP به یک سرور وب ارسال کنید و زمانی که می‌گذرد تا پاسخ از سمت سرور دریافت شود، به عنوان زمان پاسخ شناخته می‌شود. به عنوان مثال، اگر زمان پاسخ یک درخواست وب 200 میلی‌ثانیه باشد، این به معنای آن است که سرور توانسته است درخواست شما را در 200 میلی‌ثانیه پردازش و پاسخ دهد.

به طور کلی، معمولاً تلاش می‌شود تا تعادلی بین throughput و response time برقرار شود تا سیستم به طور کارآمد واکنش دهد و همزمان تعداد زیادی درخواست را پردازش کند و به کاربران پاسخ سریعی ارائه دهد.

#Note

@Syntax_fa
👍10
ساختار یک HTTP Request

#Note #HTTP

@Syntax_fa
👍61
سوال هایی که سطح دانش شما رو مشخص می کنه!

یکی از ساده ترین روش ها برای محک زدن دانشتون، سوال پیچ کردن خودتون هستش.
این کار در دراز مدت باعث میشه سطح دانش شما نسبت به قبل خیلی بیشتر بشه.
خب بیاید چند نوع از این سوالا رو بررسی کنیم.

چیه؟
سوال سطحی که از یک جونیور توقع میره باهاش زیاد سر و کله بزنه این نوع سوال ها هستش.
برای مثال:
فریم ورک چیه؟
داکر چیه؟
رشته چیه؟
فرق بین همروندی و موازی سازی چیه؟

این نوع سوالات شمارو با مفاهیم برنامه نویسی بصورت سطحی آشنا میکنه

اما یه سطح بالاتر سوال هایی هست که درباره چیستی اون ابزار و مفهومه
برای مثال:
چرا از داکر استفاده میکنیم؟
چرا از لاگر ها استفاده میکنیم؟
چرا از میدلور استفاده میکنیم؟
چرا همروندی نیازه؟

در نهایت سوال هایی که پاسخ دادن بهشون، به شما درک عمیقی میدن، سوال هایی هستش که درباره چگونگی کار کردن اون ابزار پرسیده میشه.
برای مثال:
کانتینر چجوری کار میکنه؟
چجوری یک تایپ دیتا از نوع رشته توی حافظه ذخیره میشه؟
فرق بین hypervisor و روش container چی هستش؟
همروندی چجوری باعث پرفورمنس بهتر تو شرایطی که IO داریم میشه؟

پ.ن:
همیشه از خودتون به سبک های مختلف سوال بپرسید و سعی کنید بهترین پاسخ رو براش پیدا کنید.

#Note

@Syntax_fa
👍234🔥1
اگر این روزها PDF مقاله(انگلیسی) میخونید، از مرورگر Microsoft Edge استفاده کنید، چرا؟ در ادامه به ۴ مورد اشاره می‌کنم:

۱- میتونید قسمت‌های مختلف متن رو با چندین رنگ ‌های‌لایت کنید ولی حتما بعدش Ctrl+S رو بزنید که ذخیره بشه.

۲- برای متن‌ها میتونید کامنت بزارید.

۳- مترجم هم داره، هرقسمت از متن رو انتخاب کنید،‌ براتون به هر زبانی ترجمه میکنه.

۴- و درنهایت یک فیچر جذاب، امکان استفاده از هوش‌مصنوعی Copilot در کنار مقاله. به این صورت که به مقاله دسترسی داره، میتونید هر قسمتی که متوجه نشدید رو ازش بپرسید و بگید براتون بیشتر توضیح بده یا....

امیدوارم براتون مفید باشه.

[amir motaheri]

#Note

@Syntax_fa
👍15
یکی از دوستام چند مدت نبود. دیشب این پیامو فرستاده:

اقا شرمنده من ی مدتی نبودم برای یکی پروژه انجام داده بودم پول دزدی واریز کرده بود بازداشت بودم

دقیقا من ۱۰ روز اگاهی بودم از تهران بازداشتم کردن فرستادن کرج الانم با سند بیرونم میخواستن بفرستنم زندان !

و جالبیش اینه که پلیس فتا میدونست من خودم بی گناهم ولی باز هیچ چیزی نمینوشت که منو نفرستن زندان

قاضی هم که اصلا هیچ دانشی از این حوزه ها نداره

خلاصه سرتونو درد نیارم خیلی اذیت شدم الان ۶ روزه اومدم ولی ی بارم دست به لپ تاپ نزدم اصلا از همچی بدم اومده

از من نصیحت:
باید برای هرکس، هرکاری میکنید
قرار داد درست حسابی بنویسید و همه چی ذکر بشه.
اگه ی درصد از کسیم خواستی ارز دیجیتال بگیری بگو تو یه کاغذ اطلاعاتشو بنویسه و امضا کنه ک ب تو داره ارز میده و بگیره کنار صورتش عکس بفرسته

#Note

@Syntax_fa
💔31👍7👎1😱1
یکی از عجایب جیمیل اینه که شما میتونید به روش های مختلف جیمیلتون رو بنویسید و همشون درسته

مثلا این آدرس جیمیل ها:
maede@gmail.com
m.a.e.d.e.h@gmail.com
m.aede@gmail.com
maed.e@gmail.com
And ...

همشون به یک جیمیل اشاره می کنن و اگه به هرکدومشون ایمیل کنیم به آدرس یکسان box اشاره دارن.

چه استفاده ای میشه و نکته مهم چیه؟
با این ویژگی من میتونم با یک جیمیل چندین بار تو یک سایت ثبت نام کنم.
اگه تو وب سایتمون جیمیلی رو بلاک کنیم میتونه به یه شکل دیگه جیمیلش رو بنویسه و بازم ازش استفاده کنه.

مقاله:
https://generator.email/blog/gmail-generator

@WikiWebb

#note

@Syntax_fa
😱13🔥3👍1
در اکثر پروژه های نرم افزاری این که یک مشکلی چطور حل میشه اصلا برای کارفرما مهم نیست، اونا به دنبال نتیجه و راهکار هستند. راهکاری که درد و مشکلشون رو رفع کنه.
اگر در ارتباط با کارفرما بیش از حد به مسائل فنی و جزئیات پیاده سازی بپردازید، اون رو می ترسونید و به شکایت کارفرما نزدیکتر خواهید شد.

10 توصیه مهم هم از من بشنوید برای اینکه ارتباط بهتری با کارفرما بگیرید و در نهایت حال خوب شما و اون بیشتر باشه:

1. اول از همه، وقت بذارید تا بفهمید کارفرما دقیقاً چی از شما میخواد. این یعنی سؤالات دقیق بپرسید و با تمام وجود گوش کنید، فعالانه گوش کنید!

2. به جای اینکه فقط یک طرفه صحبت کنید، سعی کنید یک گفتگوی دو طرفه شکل بدید. خیلی مهمه که کارفرما حس کنه نظرش براتون ارزشمنده. اینا نقش سوال پرسیدن های هدفمند خیلی کلیدی هست.

3. سعی کنید از اصطلاحات فنی زیاد استفاده نکنید. بیشتر سعی کنید با زبان ساده حرف بزنید تا همه بتوانند منظور شما را به راحتی درک کنند. من همیشه گفتم که هر چی فنی تر صحبت کنی کارفرما رو بیشتر می ترسونی!

4. روی این تمرکز کنید که چطور راهحلهاتون میتونند به کارفرما کمک کنند تا به اهدافش برسه. در نهایت باید درد اون برطرف شه.

5. به کارفرما گزینههای مختلفی ارائه بدید و برای هر کدوم مزایا و معایب رو شرح بدهید تا بتونه یک تصمیم آگاهانه بگیره. می خواید کاریزماتیک تر باشی، نظر قاطعانه خودتون در مورد گزینه ای که برای کارفرما بهتر هست رو هم مطرح کنید.

6. توی جلسات به موقع حاضر بشید، ارائههاتون رو منظم و حرفهای انجام بدهید و باز اینجا مراقب باشید فنی گویی بیش از حد نداشته باشید!

7. از کارفرما بخواید تا در طول فرایند، نظراتش رو با شما به اشتراک بذاره. این طوری اونها حس میکنن که واقعاً بهشون اهمیت میدید.

8. داستانهایی بگید که نشون میده راه حلهای شما چطور تونسته در گذشته مشکلات مشابهی رو حل کنه. داستان گویی در اینجا هوشمندانه ترین روش ایجاد اعتبار و دلگرم کردن کارفرما از کارا بودن راهکار شماست.

9. صبور باشید و برای پاسخگویی به سؤالات، همیشه آماده باشید.

10. و در آخر اینکه، نشون بدید که شما به دنبال یادگیری و بهبود مداوم هستید تا بتونید بهترین خدمات رو به کارفرما ارائه بدید.

link

#note

@Syntax_fa
👍11
به دنبال ساختار باشید و نه چارچوب

چند روز پیش یه مربی کودک یه حرف خیلی مهمی زد با این مفهوم: «ما اینجا برای بچه ها ساختار تعیین می کنیم نه چارچوب، چارچوب یعنی حد و مرز!»
این جمله رو باید قاب کرد و زد رو دیوار، احتمالا در ابعاد خیلی زیادی از زندگی مهم باشه. در مهندسی نرم افزار و توسعه محصول هم خیلی حرف مهمیه.
بیشتر اوقات ما دنبال چارچوب هستیم در مهندسی نرم افزار، به همین دلیل وقتی خودمون رو به یه چارچوب خاص محدود می کنیم با چالش های زیادی روبرو میشیم. در حالیکه بهتره ما برای توسعه محصول ساختار داشته باشیم و طبق اصول ساختاری کار رو پیش ببریم، اینطوری چالش مون کمتر میشه.
اجازه بدید برداشت خودم از چارچوب و ساختار رو کمی بیشتر باز کنم. ساختار میشه مجموعه از قواعد رفتاری که باید سعی کنیم در توسعه محصول بهشون پایبند باشیم، در مقابل، چارچوب میشه تعیین کردن یه سری حد و مرز مشخص به شیوه ای سختگیرانه.
مثلا اگه بخوام برای توسعه یک سرویس ساختار تعیین کنم احتمالا میگم: این سرویس باید توان پاسخگویی بالایی داشته باشه، در مقابل خطا مقاوم باشه، قابلیت مقیاس پذیری داشته باشه، یک قرارداد ساده و شفاف به کلاینت ها ارائه بده و مواردی از این دست.
اما اگه بخوام چارچوب برای سرویس تعیین کنم احتمالا میگم: ما باید از ساختار کد مبتنی بر clean code یا ddd در فلان repository که خودمون یا دیگران اونو نوشتن پیروی کنیم، باید همه ورودی هارو تو پوشه port قرار بدیم، باید همه مدل هامون تو پوشه models باشه، باید از فلان روش ci/cd استفاده کنیم.

در توسعه محصول تعیین کردن حد و مرز و چارچوب میتونه خوب باشه، اما بشرطی که تعیین این حد و مرز تنها زمان پیاده سازی سرویس باشه و متعهد بشیم که کورکورانه و سختگیرانه نخوایم این چارچوب رو به همه سرویس ها و محصولات تحمیل کنیم.

خیلی از practiceهایی که معروف شدند مثل clean code و ddd و tdd و غیره هم از نظر من بیشتر به دنبال این هستند که به شما کمک کنند که برای کارتون ساختار تعیین کنید. در حالیکه اشتباهی که زیاد رخ میده اینه که ما با خوندن این مطالب احتمالا بیشتر به سمت درآوردن چارچوب میریم... همه ش به دنبال این هستیم که مثلا یه boilerplate داشته باشیم که از clean code پیروی کنه و همون رو همه جا استفاده کنیم.

من گاها به دوستان متذکر میشم که خوندن این الگوها و منابع خیلی خوبه، به شرطی که شما سعی کنی جان کلام و دغدغه اصلی رو متوجه بشی، نه اینکه سعی کنی به دنبال یک راه حل فست فودی و چارچوب مشخص و معین باشی که کورکورانه همه جا ازش استفاده کنی.

شما وقتی برای کارت ساختار داشته باشی میتونی انعطاف پذیر باشی و بسته به نیازت چارچوب تعیین کنی، اما اگه بخوای یه چارچوب معین رو همه جا رعایت کنی احتمالا یه جاهایی اصول ساختاری خودت رو مجبور میشی زیر پا بذاری چون هیچ چارچوب واحدی وجود نداره که برای همه نیازها مناسب باشه.

@gocasts

#Note

@Syntax_fa
👍152
نکته:
میدونستید جنگو translation بر اساس زبان دیفالت مروگر کاربر، زبانی که باید نشون بده رو انتخاب می کنه؟

اگه زبان دیفالت مرورگرش توی لیست زبان های برناممون نبود میره سراغ دومین زبانی که تو مرورگرش ست کرده

و اگه کلا اون زبانه نبود، اون زبانی که دیفالت توی settings.py ست کردیمو نشون میده

#Note #Django

@Syntax_fa
😱11👍8
تحلیل BSOD پتچ امنیتی CrowdStrike

مشکل اصلی که در نرم‌افزار CrowdStrike رخ داد، به دلیل دسترسی نادرست به حافظه از طریق یک اشاره‌گر تهی (NULL pointer) در زبان برنامه‌نویسی C++ بود. حافظه در کامپیوتر به صورت یک آرایه بزرگ از اعداد سازماندهی شده است. اگر برنامه‌ای تلاش کند به یک آدرس حافظه نامعتبر دسترسی پیدا کند، سیستم‌عامل بلافاصله برنامه را متوقف می‌کند و این موضوع منجر به خرابی سیستم می‌شود.

در این حالت خاص، برنامه سعی کرد به آدرس حافظه 0x9c (که معادل 156 در مبنای 10 است) دسترسی پیدا کند. این آدرس حافظه نامعتبر است و دسترسی به آن باعث می‌شود که سیستم‌عامل برنامه را متوقف کند. این مسئله به دلیل عدم بررسی اشاره‌گر تهی توسط برنامه‌نویس اتفاق افتاد.

برای مثال:

struct Obj {
    int a;
    int b;
};

Obj* obj = NULL;

print(obj->a);


در این مثال، اشاره‌گر obj تهی (NULL) است. هنگامی که برنامه سعی می‌کند به عضو a از شیء obj دسترسی پیدا کند، به دلیل تهی بودن اشاره‌گر، به یک آدرس نامعتبر دسترسی پیدا می‌کند و باعث خرابی برنامه می‌شود.

این مشکل به‌خصوص خطرناک بود زیرا در یک درایور سیستمی رخ داد. درایورهای سیستمی دسترسی‌های سطح بالایی به منابع سیستم دارند و خرابی در این درایورها می‌تواند منجر به توقف کل سیستم‌عامل و نمایش صفحه آبی مرگ (BSOD) شود.

برای جلوگیری از چنین مشکلاتی، برنامه‌نویسان باید همیشه قبل از دسترسی به اشاره‌گرها، آن‌ها را بررسی کنند. استفاده از زبان‌های برنامه‌نویسی مدرن مانند Rust که از دسترسی‌های نادرست به حافظه جلوگیری می‌کنند، می‌تواند به کاهش این خطرات کمک کند.

کلام آخر: شاید تاحدی شرکت CrowdStrike بدلیل بی دقتی باعث این اتفاق شده است ولی مقصر اصلی شرکت مایکروسافت هست که هنوز کرنل را درست آب بندی نکرده که بواسطه یک درایور اینطوی کرش نکند.

Source:
@GoInsights

#note

@Syntax_fa | boost
👍11😱2
خبر دارین که میتونین با js به اس ام اس OTP دسترسی پیدا کنید دیگه ؟

اینو فکنم 6 ماه پیش بهش بر خوردم و دارم الان پستشو میسازم

توی خیلی از PWA هایی که توسعه دادم سعی میکردم که شبیه به native اپ ها بشن و این حس خوبی بهم میداد

ولی وقتی به قسمت OTP میرسید قشنگ میخورد تو ذوقم

به دنبال راهی بودم که بتونم OTP SMS رو بخونم ولی Js و Browser چنین امکانی رو بهم نمیداد

اما پس از سرچ بسیار متوجه شدم که Chrome ای پی ای جدیدی ارائه داده به اسم WebOTP API /Web Auth Api

که به شما تحت شرایطی اجازه میده با استفاده از js و این API به پیام OTP دسترسی پیدا کنید و کد رو بخونید و دیگه کاربر مجبور نباشه که بره پیام رو بخونه کد رو حفظ کنه و بیاد وارد کنه

و شاید باورتون نشه خیلی حرکت خفن و کولی میباشد این حرکت 😁

لینک پیاده سازی و استفاده ازش:
https://developer.chrome.com/docs/identity/web-apis/web-otp

Source:
Link

#note

@Syntax_fa
🔥18👍41👌1
اگه کدی که مینویسی، این ویژگی هارو نداره، یه فکری به حال خودت کن 😔:

۱. کدتون مستقل از فریم ورک باشه:
معماری شما نباید وابسته به یه فریم ورک خاص باشه.
کدتون این امکانو بده از فریم ورک ها مثل ابزار ها استفاده کنید بدون اینکه وابسته به محدودیت های یک فریم ورک خاص بشید.

۲. کدتون قابل تست کردن باشه:
قابل تست بودن به این معنیه که بتونید business logic هارو بدون یو آی، دیتابیس، وب سرور یا هر چی وابستگی خارجی که هست، تست کنید.

۳. نباید به ui وابستگی داشته باشید!
قسمت ui رو باید بتونید به راحتی جایگزینش کنید.
مثلا از یک وب ui بتونید بدون اینکه قسمت های دیگه کدتون تغییره کنه، به کنسول و برنامه cli تغییرش بدید.

۴. معماریتون باید مستقل از دیتابیس باشه!
برای مثال: میتونید دیتابیستون رو به راحتی از mysql به mongodb تغییر بدید؟

۵. نباید به یک سرویس خارجی وابستگی داشته باشید!
برای مثال اگه از سرویس اس ام اس استفاده میکنید، آیا میتونید به راحتی بجای کاوه نگار از یه سرویس دیگه استفاده کنید؟

منبع:
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

#note

@Syntax_fa
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13👌4👎3🔥21
Gitmoji

وب‌سایت [Gitmoji](https://gitmoji.dev/) یک منبع آنلاین است که به توسعه‌دهندگان کمک می‌کند تا از ایموجی‌ها در پیام‌های کامیت‌های خود استفاده کنند. این وب‌سایت مجموعه‌ای از ایموجی‌ها را فراهم می‌کند که هر یک به یک نوع تغییر یا فعالیت خاص در کد اشاره دارند. به عنوان مثال:

- 🐛: برای فیکس کردن باگ‌ها
- : برای اضافه کردن یک ویژگی جدید
- 📝: برای به‌روزرسانی مستندات
- 🎨: برای بهبود ساختار یا ظاهر کد بدون تغییر عملکرد

استفاده از Gitmoji باعث می‌شود که تاریخچه کامیت‌ها خواناتر و قابل فهم‌تر شود و اعضای تیم توسعه‌دهنده بتوانند با نگاه به ایموجی‌ها به سرعت متوجه نوع تغییرات اعمال شده شوند. این ابزار به‌خصوص برای پروژه‌های متن‌باز و تیم‌های بزرگی که بر روی یک کدبیس کار می‌کنند، مفید است.

مثال:
git commit -m ":bug: fix a bug"


#note #gitmoji

@Syntax_Fa
👍9🔥31👎1
polymorphism in relational database

این پست درباره یکی از مفاهیم ساده ای هستش که خیلی بدرد بخوره.

بیاید با مثال بررسی کنیم.

فرض کنید ما یک مدل order داریم که انواع مختلفی از محصولات رو میفروشیم.

برای مثال اشتراک میفروشیم که وقتی اشتراک رو میخرن به یه سری سرویس هامون دسترسی خواهند داشت.
در کنار اشتراک یک سری محصولات فیزیکی هم میفروشیم.
در کنار همه اینا یه سری خدمات دیگه هم داریم که پرداخت نیاز دارن.

خب شاید اولین چیزی که بهش فکر میکنیم این باشه بیایم داخل تیبل order فیلد هایی مثل plan و product و ... رو قرار بدیم بعد اگه هرکدوم null نبود یعنی order مربوط به اون خدمات یا محصول هستش:
CREATE TABLE order (
id INT PRIMARY KEY AUTO_INCREMENT,
...
plan_id INT NULL,
product_id INT NULL,
)


اما روش بهتر اینه بیایم دوتا فیلد به اسم type_name و type_id ذخیره کنیم. اگه type_name مثلا plan بود پس order مربوط به پلن با آیدی فلان هستش پس موقعی که خرید موفقیت آمیز بود میدونیم باید چه اکشنی داشته باشیم.
توسعه در آینده هم برامون خیلی راحت تر میشه بدون اینکه نیازی باشه تیبل order تغییری کنه.

#note

@Syntax_fa
👍4🔥1👌1