🐘 چرا کپی کردن یک آرایه همیشه به معنی کپی شدن Memory نیست؟
یکی از رفتارهای مهم PHP که خیلیها ازش خبر ندارن، Copy-on-Write یا همون COW هست.
مثلاً:
شاید فکر کنی الان PHP دو آرایهی یکسان داخل Memory ساخته.
اما نه. 👀
زبانPHP در این مرحله میتونه هر دو متغیر رو به همون دادهی موجود در Memory ارجاع بده.
تا وقتی که یکی از اونها تغییر نکرده:
عملاً لازم نیست فوراً یک کپی کامل ساخته بشه.
اما وقتی تغییر ایجاد میکنی:
اینجاست که PHP باید داده رو از هم جدا کنه.
یعنی:
🔥 نکته مهمتر
این موضوع وقتی مهم میشه که با آرایههای بزرگ کار میکنی.
مثلاً:
ممکنه با دیدن array $data فکر کنی PHP از همون ابتدا کل آرایه رو کپی کرده.
اما Pass-by-Value در PHP الزاماً به معنی Copy فوری نیست.
زبانPHP میتونه از Copy-on-Write استفاده کنه و فقط زمانی واقعاً کپی ایجاد کنه که داده نیاز به تغییر داشته باشه.
---
⚠️ اما اینجا یک دام وجود داره
اگر واقعاً نمیخوای آرایه کپی بشه و فقط میخوای تابع روی همان داده کار کنه، میتونی از Reference استفاده کنی:
ولی این به معنی «همیشه بهتر بودن Reference» نیست.
حالا Referenceها میتونن باعث پیچیدهتر شدن رفتار کد و ایجاد Side Effect بشن.
پس صرفاً برای کاهش Memory نباید کورکورانه از & استفاده کرد.
---
🧠 نکته حرفهای امروز
در PHP:
Assignment ≠ Copy فوری
و:
Pass-by-Value ≠ Copy فوری
به لطف Copy-on-Write، PHP تا زمانی که لازم نباشه داده رو واقعاً Duplicate نمیکنه.
بنابراین وقتی Performance و Memory برات مهمه، باید تفاوت بین:
Value
Reference
Copy-on-Write
و
Actual Memory Copy
رو بشناسی.
این دقیقاً یکی از تفاوتهای بین «کدی که فقط کار میکنه» و «کدی که رفتار PHP Engine رو میفهمه» است. 🐘
@CodeVerse_dev
یکی از رفتارهای مهم PHP که خیلیها ازش خبر ندارن، Copy-on-Write یا همون COW هست.
مثلاً:
$data = range(1, 1_000_000);
$copy = $data;
شاید فکر کنی الان PHP دو آرایهی یکسان داخل Memory ساخته.
اما نه. 👀
زبانPHP در این مرحله میتونه هر دو متغیر رو به همون دادهی موجود در Memory ارجاع بده.
تا وقتی که یکی از اونها تغییر نکرده:
$data = range(1, 1_000_000);
$copy = $data;
عملاً لازم نیست فوراً یک کپی کامل ساخته بشه.
اما وقتی تغییر ایجاد میکنی:
$copy[0] = 999;
اینجاست که PHP باید داده رو از هم جدا کنه.
یعنی:
$data ───────┐
├──> Same Memory
$copy ───────┘
↓ تغییر
$data ─────────> Original Data
$copy ─────────> New Copy
🔥 نکته مهمتر
این موضوع وقتی مهم میشه که با آرایههای بزرگ کار میکنی.
مثلاً:
function process(array $data): void
{
$data['status'] = 'processed';
}
$users = getHugeArray();
process($users);
ممکنه با دیدن array $data فکر کنی PHP از همون ابتدا کل آرایه رو کپی کرده.
اما Pass-by-Value در PHP الزاماً به معنی Copy فوری نیست.
زبانPHP میتونه از Copy-on-Write استفاده کنه و فقط زمانی واقعاً کپی ایجاد کنه که داده نیاز به تغییر داشته باشه.
---
⚠️ اما اینجا یک دام وجود داره
اگر واقعاً نمیخوای آرایه کپی بشه و فقط میخوای تابع روی همان داده کار کنه، میتونی از Reference استفاده کنی:
function process(array &$data): void
{
$data['status'] = 'processed';
}
ولی این به معنی «همیشه بهتر بودن Reference» نیست.
حالا Referenceها میتونن باعث پیچیدهتر شدن رفتار کد و ایجاد Side Effect بشن.
پس صرفاً برای کاهش Memory نباید کورکورانه از & استفاده کرد.
---
🧠 نکته حرفهای امروز
در PHP:
Assignment ≠ Copy فوری
و:
Pass-by-Value ≠ Copy فوری
به لطف Copy-on-Write، PHP تا زمانی که لازم نباشه داده رو واقعاً Duplicate نمیکنه.
بنابراین وقتی Performance و Memory برات مهمه، باید تفاوت بین:
Value
Reference
Copy-on-Write
و
Actual Memory Copy
رو بشناسی.
این دقیقاً یکی از تفاوتهای بین «کدی که فقط کار میکنه» و «کدی که رفتار PHP Engine رو میفهمه» است. 🐘
@CodeVerse_dev
👍5❤3
🌐 چرا localStorage جای خوبی برای ذخیره هر چیزی نیست؟
قابلیت localStorage خیلی جذابه.
چون سادهست:
و بعد:
ولی یک اشتباه خطرناک اینه که فکر کنیم:
«چون فقط داخل مرورگر ذخیره میشه، پس امنه.»
نه.
هر JavaScriptای که در Origin مربوطه اجرا بشه، در شرایط مناسب میتونه به localStorage دسترسی داشته باشه.
پس اطلاعات حساس مثل:
رو نباید بدون بررسی امنیتی داخلش ذخیره کنی.
از طرف دیگه localStorage همزمان با درخواست HTTP به سرور ارسال نمیشه؛ یعنی برخلاف Cookie، خودش مکانیزم ارسال خودکار Credential نیست.
برای Authentication باید معماری امنیتی درست داشته باشی، نه اینکه صرفاً یک Token رو داخل localStorage بذاری و خیال خودت رو راحت کنی.
یک API ساده ممکنه در چند خط نوشته بشه؛
ولی محل نگهداری Credentialها تصمیمیه که باید با تهدیدهای امنیتی پروژه گرفته بشه.
@CodeVerse_dev
قابلیت localStorage خیلی جذابه.
چون سادهست:
localStorage.setItem(
"username",
"ali"
);
و بعد:
const user =
localStorage.getItem("username");
ولی یک اشتباه خطرناک اینه که فکر کنیم:
«چون فقط داخل مرورگر ذخیره میشه، پس امنه.»
نه.
هر JavaScriptای که در Origin مربوطه اجرا بشه، در شرایط مناسب میتونه به localStorage دسترسی داشته باشه.
پس اطلاعات حساس مثل:
Password
Access Token
Secret Key
Personal Sensitive Data
رو نباید بدون بررسی امنیتی داخلش ذخیره کنی.
از طرف دیگه localStorage همزمان با درخواست HTTP به سرور ارسال نمیشه؛ یعنی برخلاف Cookie، خودش مکانیزم ارسال خودکار Credential نیست.
برای Authentication باید معماری امنیتی درست داشته باشی، نه اینکه صرفاً یک Token رو داخل localStorage بذاری و خیال خودت رو راحت کنی.
یک API ساده ممکنه در چند خط نوشته بشه؛
ولی محل نگهداری Credentialها تصمیمیه که باید با تهدیدهای امنیتی پروژه گرفته بشه.
@CodeVerse_dev
👍4❤3
🛡️ بازگشت Worm معروف Shai-Hulud به npm
یک خبر جدی برای توسعهدهندههای JavaScript:
محققان امنیتی اعلام کردهاند که Shai-Hulud، یک Worm مخرب در اکوسیستم npm، دوباره فعال شده است.
این بار نکته عجیبتر این است که مهاجمان توانستهاند چند پکیج مخرب را از سیستم جدید بررسی امنیتی npm عبور دهند.
بررسیها نشان میدهد:
🔴 ۴ پکیج مخرب در فاصله کوتاهی منتشر شدند
🔴 حمله بعد از حدود ۱۱۱ روز دوباره مشاهده شد
🔴 و اینکه Payload استفادهشده همان نمونه قبلی بوده
🔴 هدف اصلی، سرقت Tokenها و اطلاعات حساس توسعهدهندههاست
یعنی حتی اگر یک Package Manager سیستم بررسی امنیتی داشته باشد، باز هم نباید Blind Trust داشته باشیم.
🎯 برای پروژههای واقعی:
💡 امنیت Supply Chain یعنی فقط به کدی که خودت نوشتهای اعتماد نکنی؛ تمام Dependency Tree بخشی از سطح حمله پروژه است.
@CodeVerse_dev
یک خبر جدی برای توسعهدهندههای JavaScript:
محققان امنیتی اعلام کردهاند که Shai-Hulud، یک Worm مخرب در اکوسیستم npm، دوباره فعال شده است.
این بار نکته عجیبتر این است که مهاجمان توانستهاند چند پکیج مخرب را از سیستم جدید بررسی امنیتی npm عبور دهند.
بررسیها نشان میدهد:
🔴 ۴ پکیج مخرب در فاصله کوتاهی منتشر شدند
🔴 حمله بعد از حدود ۱۱۱ روز دوباره مشاهده شد
🔴 و اینکه Payload استفادهشده همان نمونه قبلی بوده
🔴 هدف اصلی، سرقت Tokenها و اطلاعات حساس توسعهدهندههاست
یعنی حتی اگر یک Package Manager سیستم بررسی امنیتی داشته باشد، باز هم نباید Blind Trust داشته باشیم.
🎯 برای پروژههای واقعی:
npm install
↓
Dependency
↓
Dependency Chain
↓
Malicious Code?
↓
Your CI/CD + Secrets
💡 امنیت Supply Chain یعنی فقط به کدی که خودت نوشتهای اعتماد نکنی؛ تمام Dependency Tree بخشی از سطح حمله پروژه است.
@CodeVerse_dev
👍5❤2
🚨بیش از ۶ میلیون سایت در معرض خطر بودند
دو آسیبپذیری جدی در Pluginهای محبوب WordPress شناسایی و Patch شدهاند:
🔴 Elementor Pro
🔴 Super Forms
هر دو مشکل مربوط به Unrestricted File Upload بودهاند؛ یعنی مهاجم میتوانسته فایلهایی با نوع خطرناک را در شرایط خاص روی سایت آپلود کند.
در مورد Elementor Pro، آسیبپذیری تا نسخه 4.2.1 وجود داشته و امکان Remote Code Execution را ایجاد میکرد.
شدت هر دو آسیبپذیری:
CVSS 9.8 / Critical
و نکته مهمتر:
⚠️ صدها هزار تلاش برای سوءاستفاده از این آسیبپذیریها مشاهده شده است.
🎯 درس مهم برای WordPress Developer:
فقط WordPress Core را Update نکن.
💡 یک Plugin میتواند به اندازه خود WordPress Core سطح حمله ایجاد کند.
@CodeVerse_dev
دو آسیبپذیری جدی در Pluginهای محبوب WordPress شناسایی و Patch شدهاند:
🔴 Elementor Pro
🔴 Super Forms
هر دو مشکل مربوط به Unrestricted File Upload بودهاند؛ یعنی مهاجم میتوانسته فایلهایی با نوع خطرناک را در شرایط خاص روی سایت آپلود کند.
در مورد Elementor Pro، آسیبپذیری تا نسخه 4.2.1 وجود داشته و امکان Remote Code Execution را ایجاد میکرد.
شدت هر دو آسیبپذیری:
CVSS 9.8 / Critical
و نکته مهمتر:
⚠️ صدها هزار تلاش برای سوءاستفاده از این آسیبپذیریها مشاهده شده است.
🎯 درس مهم برای WordPress Developer:
فقط WordPress Core را Update نکن.
Core
+
Plugins
+
Themes
+
Server
+
Dependencies
=
Security
💡 یک Plugin میتواند به اندازه خود WordPress Core سطح حمله ایجاد کند.
@CodeVerse_dev
👍6❤2
💻❤️ روز برنامهنویس مبارک!
به همهی اونایی که ساعتها باگ میزنن، دیباگ میکنن، سرچ میکنن و آخرش با یه
برنامهنویسی همیشه آسون نیست؛ بعضی روزها پر از خطا و سردرگمیه، ولی هر چیزی که امروز برات سخته، با تمرین یه روز تبدیل میشه به چیزی که بهش افتخار میکنی.
پس اگه تازه شروع کردی، وسط راهی یا حتی یه مدت خسته شدی، ادامه بده.
کدی که امروز نمیفهمیش، شاید فردا دلیل پیشرفتت باشه. 🚀
روز همهی برنامهنویسها مبارک ❤️🔥
@CodeVerse_dev
به همهی اونایی که ساعتها باگ میزنن، دیباگ میکنن، سرچ میکنن و آخرش با یه
; یا یه پرانتز اضافه میفهمن مشکل کجا بوده 😂برنامهنویسی همیشه آسون نیست؛ بعضی روزها پر از خطا و سردرگمیه، ولی هر چیزی که امروز برات سخته، با تمرین یه روز تبدیل میشه به چیزی که بهش افتخار میکنی.
پس اگه تازه شروع کردی، وسط راهی یا حتی یه مدت خسته شدی، ادامه بده.
کدی که امروز نمیفهمیش، شاید فردا دلیل پیشرفتت باشه. 🚀
روز همهی برنامهنویسها مبارک ❤️🔥
@CodeVerse_dev
❤🔥16❤2👎1
🔍 چرا Dependencyهای غیرمستقیم مهمتر از چیزی هستند که فکر میکنی؟
فرض کن پروژهات فقط این Package را نصب کرده:
اما
تو فقط
اما در واقع داری به چندین Package دیگر هم اعتماد میکنی.
این همان چیزی است که به آن:
Transitive Dependencies
میگوییم.
🎯 مشکل کجاست؟
اگر یکی از Dependencyهای پاییندست:
🔴 آسیبپذیر شود
🔴 یا Hijack شود
🔴 همینطور Maintainer آن Compromise شود
🔴 نسخه مخرب منتشر کند
ممکن است پروژه تو هم تحت تأثیر قرار بگیرد.
💡 به همین دلیل ابزارهای Dependency Scanning و Lockfileها فقط امکانات جانبی نیستند؛ در پروژههای جدی بخشی از زنجیره امنیت هستند.
@CodeVerse_dev
فرض کن پروژهات فقط این Package را نصب کرده:
{
"dependencies": {
"package-a": "^5.0"
}
}اما
package-a خودش از اینها استفاده میکند:
package-a
├── package-b
│ └── package-c
│ └── package-d
└── package-e
تو فقط
package-a را نصب کردی؛اما در واقع داری به چندین Package دیگر هم اعتماد میکنی.
این همان چیزی است که به آن:
Transitive Dependencies
میگوییم.
🎯 مشکل کجاست؟
اگر یکی از Dependencyهای پاییندست:
🔴 آسیبپذیر شود
🔴 یا Hijack شود
🔴 همینطور Maintainer آن Compromise شود
🔴 نسخه مخرب منتشر کند
ممکن است پروژه تو هم تحت تأثیر قرار بگیرد.
💡 به همین دلیل ابزارهای Dependency Scanning و Lockfileها فقط امکانات جانبی نیستند؛ در پروژههای جدی بخشی از زنجیره امنیت هستند.
@CodeVerse_dev
👍5❤1
📊 یه ابزار ساده، کاربردی و خوشساخت برای ساخت Pie Chart
اگه برای گزارش، ارائه یا پروژهات نیاز به نمودار دایرهای داری، این ابزار بدون دردسر برات میسازه.
کافیه دادهها رو وارد کنی؛ نمودار همون لحظه بهصورت زنده ساخته میشه و میتونی خروجی رو با فرمتهای PNG، JPG یا SVG دریافت کنی.
نکته جالبتر اینکه کل پردازش داخل مرورگر انجام میشه و دادهها به سرور ارسال نمیشن. این پروژه هم با React، Tailwind CSS و Google Charts ساخته شده و روی Vercel دیپلوی شده. 👌
یه نمونه خوب از اینکه چطور میشه با یک ایده ساده، یک ابزار کاربردی و تمیز ساخت.
📎 Article
@CodeVers_dev
اگه برای گزارش، ارائه یا پروژهات نیاز به نمودار دایرهای داری، این ابزار بدون دردسر برات میسازه.
کافیه دادهها رو وارد کنی؛ نمودار همون لحظه بهصورت زنده ساخته میشه و میتونی خروجی رو با فرمتهای PNG، JPG یا SVG دریافت کنی.
نکته جالبتر اینکه کل پردازش داخل مرورگر انجام میشه و دادهها به سرور ارسال نمیشن. این پروژه هم با React، Tailwind CSS و Google Charts ساخته شده و روی Vercel دیپلوی شده. 👌
یه نمونه خوب از اینکه چطور میشه با یک ایده ساده، یک ابزار کاربردی و تمیز ساخت.
📎 Article
@CodeVers_dev
👍5❤2
🐘 وضعیت PHP 8.5 در سپتامبر ۲۰۲۶
اگر هنوز پروژههای PHP خودت را روی نسخههای قدیمی نگه داشتهای، وقت آن است که وضعیت Version را جدیتر بررسی کنی.
شاخه فعلی PHP 8.5 است و نسخههای Patch آن بهصورت منظم منتشر میشوند.
اما یک نکته مهم:
❌ فقط به عدد Version نگاه نکن.
مثلاً:
قبل از ارتقای Production:
1️⃣ Changelog را بخوان
2️⃣ Composer Dependencies را بررسی کن
3️⃣ Test Suite را اجرا کن
4️⃣ روی Staging تست کن
5️⃣ بعد Production را Update کن
💡 در پروژههای حرفهای، «آخرین نسخه» لزوماً به معنی «همین الان روی Production نصبش کن» نیست؛ Release را بررسی میکنیم، Compatibility را میسنجیم و بعد Deploy میکنیم.
@CodeVerse_dev
اگر هنوز پروژههای PHP خودت را روی نسخههای قدیمی نگه داشتهای، وقت آن است که وضعیت Version را جدیتر بررسی کنی.
شاخه فعلی PHP 8.5 است و نسخههای Patch آن بهصورت منظم منتشر میشوند.
اما یک نکته مهم:
❌ فقط به عدد Version نگاه نکن.
مثلاً:
PHP 8.5
↓
Patch Release
↓
Bug Fix
↓
Security Fix
↓
Changelog
قبل از ارتقای Production:
1️⃣ Changelog را بخوان
2️⃣ Composer Dependencies را بررسی کن
3️⃣ Test Suite را اجرا کن
4️⃣ روی Staging تست کن
5️⃣ بعد Production را Update کن
💡 در پروژههای حرفهای، «آخرین نسخه» لزوماً به معنی «همین الان روی Production نصبش کن» نیست؛ Release را بررسی میکنیم، Compatibility را میسنجیم و بعد Deploy میکنیم.
@CodeVerse_dev
👍5❤3
🧩 Design Patterns in 3 Minutes | Factory Pattern
فرض کن در پروژه یک سیستم پرداخت داری:
امروز مشکلی ندارد.
اما بعداً میشود:
و Controller تبدیل میشود به یک جنگل از
اینجا Factory Pattern میتواند کمک کند.
مثلاً:
حالا مسئولیت ساخت Object از Controller خارج شده.
🎯حالا Factory چه مشکلی حل میکند؟
به جای اینکه هر جای پروژه بدانی:
«برای ساخت این Object دقیقاً باید چه Classای را
این تصمیم را به یک نقطه مشخص منتقل میکنی.
💡 اما یک نکته Senior-Level:
قابلیتFactory را فقط برای اینکه کدت حرفهایتر به نظر برسد استفاده نکن.
اگر فقط دو Class داری و منطق ساخت ساده است، Factory ممکن است فقط پیچیدگی اضافه کند.
موضوع Pattern زمانی ارزش دارد که یک مشکل واقعی در طراحی را حل کند.
@CodeVerse_dev
فرض کن در پروژه یک سیستم پرداخت داری:
if ($gateway === 'zarinpal') {
$payment = new Zarinpal();
}
if ($gateway === 'idpay') {
$payment = new IDPay();
}
if ($gateway === 'stripe') {
$payment = new Stripe();
}امروز مشکلی ندارد.
اما بعداً میشود:
5 Gateway
↓
10 Gateway
↓
20 Gateway
و Controller تبدیل میشود به یک جنگل از
if/elseها. 😅اینجا Factory Pattern میتواند کمک کند.
مثلاً:
$payment = PaymentFactory::make($gateway);
حالا مسئولیت ساخت Object از Controller خارج شده.
🎯حالا Factory چه مشکلی حل میکند؟
به جای اینکه هر جای پروژه بدانی:
«برای ساخت این Object دقیقاً باید چه Classای را
new کنم؟»این تصمیم را به یک نقطه مشخص منتقل میکنی.
💡 اما یک نکته Senior-Level:
قابلیتFactory را فقط برای اینکه کدت حرفهایتر به نظر برسد استفاده نکن.
اگر فقط دو Class داری و منطق ساخت ساده است، Factory ممکن است فقط پیچیدگی اضافه کند.
موضوع Pattern زمانی ارزش دارد که یک مشکل واقعی در طراحی را حل کند.
@CodeVerse_dev
👍5❤2
🧩 چرا بعد از حذف یک افزونه، سرعت سایت همیشه بهتر نمیشه؟
یک تصور رایج:
«این افزونه رو حذف کردم، پس دیتابیس هم سبک شد.»
لزوماً نه.
بعضی افزونهها هنگام حذف، تمام دادههایی که داخل دیتابیس ساختهاند رو پاک نمیکنن.
ممکنه بعد از حذف افزونه هنوز چیزهایی مثل:
باقی مونده باشن.
بدتر اینکه بعضی افزونهها دادههای موقتی یا Optionهای زیادی ایجاد میکنن که بعداً روی Autoload هم اثر میذاره.
اما اینجا هم نباید کورکورانه بری سراغ حذف اطلاعات.
چون ممکنه یک Option هنوز توسط قالب یا افزونه دیگری استفاده بشه.
روش حرفهای:
اول شناسایی → بعد بررسی وابستگی → بعد پاکسازی
نه اینکه مستقیم وارد دیتابیس بشی و هر چیزی که اسم افزونه قدیمی روشه حذف کنی. 😄
در WordPress، تمیز بودن دیتابیس خوبه؛
ولی پاکسازی بدون شناخت میتونه از دیتابیس شلوغ خطرناکتر باشه.
@CodeVerse_dev
یک تصور رایج:
«این افزونه رو حذف کردم، پس دیتابیس هم سبک شد.»
لزوماً نه.
بعضی افزونهها هنگام حذف، تمام دادههایی که داخل دیتابیس ساختهاند رو پاک نمیکنن.
ممکنه بعد از حذف افزونه هنوز چیزهایی مثل:
wp_options
wp_postmeta
wp_usermeta
Custom Tables
Cron Events
باقی مونده باشن.
بدتر اینکه بعضی افزونهها دادههای موقتی یا Optionهای زیادی ایجاد میکنن که بعداً روی Autoload هم اثر میذاره.
اما اینجا هم نباید کورکورانه بری سراغ حذف اطلاعات.
چون ممکنه یک Option هنوز توسط قالب یا افزونه دیگری استفاده بشه.
روش حرفهای:
اول شناسایی → بعد بررسی وابستگی → بعد پاکسازی
نه اینکه مستقیم وارد دیتابیس بشی و هر چیزی که اسم افزونه قدیمی روشه حذف کنی. 😄
در WordPress، تمیز بودن دیتابیس خوبه؛
ولی پاکسازی بدون شناخت میتونه از دیتابیس شلوغ خطرناکتر باشه.
@CodeVerse_dev
🔥5❤2
⚡ چرا forEach همیشه انتخاب خوبی نیست؟
این کد رو زیاد میبینیم:
ظاهرش کاملاً منطقیه.
ولی یک مشکل مهم داره:
تابع forEach منتظر
یعنی ممکنه همه sendEmail
اگر واقعاً میخوای یکییکی اجرا بشن:
و اگر مستقل از هم هستن و میخوای همزمان اجرا بشن:
تفاوت این دو فقط Syntax نیست.
اولی:
کنترلشده و ترتیبی
دومی:
همزمان و سریعتر، ولی با مصرف منابع بیشتر
پس وقتی Async Code مینویسی، همیشه از خودت بپرس:
این عملیات باید یکییکی انجام بشه یا واقعاً میتونن همزمان اجرا بشن؟
همین یک سؤال میتونه جلوی کلی Bug و Performance Problem رو بگیره.
@CodeVerse_dev
این کد رو زیاد میبینیم:
users.forEach(async (user) => {
await sendEmail(user);
});ظاهرش کاملاً منطقیه.
ولی یک مشکل مهم داره:
تابع forEach منتظر
Promiseهای داخل Callback نمیمونه.یعنی ممکنه همه sendEmail
ها تقریباً همزمان شروع بشن و کدی که بعد از forEach نوشته شده، قبل از تمام شدن اونها اجرا بشه.اگر واقعاً میخوای یکییکی اجرا بشن:
for (const user of users) {
await sendEmail(user);
}و اگر مستقل از هم هستن و میخوای همزمان اجرا بشن:
await Promise.all(
users.map(user => sendEmail(user))
);
تفاوت این دو فقط Syntax نیست.
اولی:
کنترلشده و ترتیبی
دومی:
همزمان و سریعتر، ولی با مصرف منابع بیشتر
پس وقتی Async Code مینویسی، همیشه از خودت بپرس:
این عملیات باید یکییکی انجام بشه یا واقعاً میتونن همزمان اجرا بشن؟
همین یک سؤال میتونه جلوی کلی Bug و Performance Problem رو بگیره.
@CodeVerse_dev
👍5❤1
یه باگ که از یه جای خیلی ساده شروع شد!
یروز داشتم یکی از بخشهای پروژه رو بررسی میکردم که متوجه شدم یه درخواست HTTP بیشتر از چیزی که انتظار داشتم اجرا میشه.
اول فکر کردم مشکل از Backend ـه.
ولی وقتی Network رو باز کردم و درخواستها رو یکییکی بررسی کردم، فهمیدم مشکل از Frontend شروع شده.
یه Event Listener چند بار روی یک Element ثبت شده بود!
نتیجه؟
با هر کلیک، چند درخواست همزمان ارسال میشد. 😐
جالب اینجاست که کد ظاهراً کاملاً درست به نظر میرسید.
این تجربه دوباره بهم یادآوری کرد که موقع Debug فقط به نتیجه نهایی نگاه نکنم؛ مسیر اتفاق رو هم بررسی کنم.
گاهی DevTools بیشتر از خود کد بهت جواب میده.
📢 @CodeVerse_dev
یروز داشتم یکی از بخشهای پروژه رو بررسی میکردم که متوجه شدم یه درخواست HTTP بیشتر از چیزی که انتظار داشتم اجرا میشه.
اول فکر کردم مشکل از Backend ـه.
ولی وقتی Network رو باز کردم و درخواستها رو یکییکی بررسی کردم، فهمیدم مشکل از Frontend شروع شده.
یه Event Listener چند بار روی یک Element ثبت شده بود!
نتیجه؟
با هر کلیک، چند درخواست همزمان ارسال میشد. 😐
جالب اینجاست که کد ظاهراً کاملاً درست به نظر میرسید.
این تجربه دوباره بهم یادآوری کرد که موقع Debug فقط به نتیجه نهایی نگاه نکنم؛ مسیر اتفاق رو هم بررسی کنم.
گاهی DevTools بیشتر از خود کد بهت جواب میده.
📢 @CodeVerse_dev
❤9
یکی از خطرناکترین جملهها در یک پروژه:
«فعلاً کار میکنه، بعداً درستش میکنیم.»
«بعداً» معمولاً تبدیل میشود به:
و ناگهان بعد از چند ماه، هیچکس جرئت تغییر آن قسمت را ندارد.
اسم این مشکل فقط Technical Debt نیست.
مشکل بزرگتر اینه که تیم کمکم ترس از تغییر کد پیدا میکنه.
توسعهدهنده حرفهای لزوماً کسی نیست که از اول بهترین معماری دنیا را طراحی کند.
کسیه که بداند:
کجا میشود ساده نوشت،
کجا باید از ابتدا درست طراحی کرد،
و کجا نباید «فعلاً» را وارد Production کرد.
@CodeVerse_dev
«فعلاً کار میکنه، بعداً درستش میکنیم.»
«بعداً» معمولاً تبدیل میشود به:
TODO
↓
TODO
↓
TODO
↓
Temporary Fix
↓
Temporary Fix
↓
Production Code
و ناگهان بعد از چند ماه، هیچکس جرئت تغییر آن قسمت را ندارد.
اسم این مشکل فقط Technical Debt نیست.
مشکل بزرگتر اینه که تیم کمکم ترس از تغییر کد پیدا میکنه.
توسعهدهنده حرفهای لزوماً کسی نیست که از اول بهترین معماری دنیا را طراحی کند.
کسیه که بداند:
کجا میشود ساده نوشت،
کجا باید از ابتدا درست طراحی کرد،
و کجا نباید «فعلاً» را وارد Production کرد.
@CodeVerse_dev
👍7❤2
🚨 اگر All-in-One WP Migration داری، این پست مهمه
یک آسیبپذیری SQL Injection بدون نیاز به لاگین در افزونهی محبوب All-in-One WP Migration and Backup گزارش شده که حدود ۵ میلیون سایت وردپرسی را تحت تأثیر قرار میدهد.
نکتهی جالبتر اینه که Wordfence اعلام کرده برای کاربران رایگانش، محافظت فایروال از ۱۵ سپتامبر ۲۰۲۶ فعال میشود.
یعنی امروز دقیقاً روزیه که اگر این افزونه روی سایتت نصبه، باید وضعیتش رو بررسی کنی.
🔐 همیشه اینو یادت باشه:
نصب یک افزونهی محبوب ≠ امن بودن آن
قبل از هر چیز:
نسخه افزونه را بررسی کن
آپدیت موجود را نصب کن
افزونههای بلااستفاده را حذف کن
لاگهای امنیتی سایت را بررسی کن
@CodeVerse_dev
یک آسیبپذیری SQL Injection بدون نیاز به لاگین در افزونهی محبوب All-in-One WP Migration and Backup گزارش شده که حدود ۵ میلیون سایت وردپرسی را تحت تأثیر قرار میدهد.
نکتهی جالبتر اینه که Wordfence اعلام کرده برای کاربران رایگانش، محافظت فایروال از ۱۵ سپتامبر ۲۰۲۶ فعال میشود.
یعنی امروز دقیقاً روزیه که اگر این افزونه روی سایتت نصبه، باید وضعیتش رو بررسی کنی.
🔐 همیشه اینو یادت باشه:
نصب یک افزونهی محبوب ≠ امن بودن آن
قبل از هر چیز:
نسخه افزونه را بررسی کن
آپدیت موجود را نصب کن
افزونههای بلااستفاده را حذف کن
لاگهای امنیتی سایت را بررسی کن
@CodeVerse_dev
👍6❤2
🚀 زبان TypeScript دیگه فقط یک زبان تایپشده روی JavaScript نیست؛ Compiler خودش هم متحول شده
یکی از تغییرات مهم امسال، مهاجرت TypeScript به یک Compiler کاملاً Native بر پایه Go هست.
نسخه TypeScript 7 با این معماری جدید منتشر شده و مایکروسافت گزارش کرده که در Buildهای کامل، بسته به پروژه، سرعتهایی حدود ۸ تا ۱۲ برابر نسبت به Compiler قبلی دیده میشه.
اما نکته مهم فقط سرعت نیست.
در پروژههای بزرگ TypeScript، زمان صرفشده برای:
میتونه روی تجربه توسعهدهنده تأثیر جدی بذاره.
وقتی این بخشها سریعتر بشن، نتیجه فقط یک Build سریعتر نیست.
یعنی:
⚡عمل Feedback سریعتر داخل IDE
⚡ سریعتر شدن Type Checking
⚡ تجربه بهتر در Monorepoها
⚡ امکان کار راحتتر با Codebaseهای بزرگ
و این دقیقاً همون جاییه که TypeScript میخواد JavaScript رو برای پروژههای خیلی بزرگ مقیاسپذیرتر کنه.
💡 نکته جالب:
گاهی Performance یک زبان فقط به Runtime مربوط نیست؛ سرعت ابزارهای اطراف Developer هم بخشی از Performance واقعی اون اکوسیستمه.
@CodeVerse_dev
یکی از تغییرات مهم امسال، مهاجرت TypeScript به یک Compiler کاملاً Native بر پایه Go هست.
نسخه TypeScript 7 با این معماری جدید منتشر شده و مایکروسافت گزارش کرده که در Buildهای کامل، بسته به پروژه، سرعتهایی حدود ۸ تا ۱۲ برابر نسبت به Compiler قبلی دیده میشه.
اما نکته مهم فقط سرعت نیست.
در پروژههای بزرگ TypeScript، زمان صرفشده برای:
Type Checking
↓
Language Server
↓
Build
↓
IDE Feedback
میتونه روی تجربه توسعهدهنده تأثیر جدی بذاره.
وقتی این بخشها سریعتر بشن، نتیجه فقط یک Build سریعتر نیست.
یعنی:
⚡عمل Feedback سریعتر داخل IDE
⚡ سریعتر شدن Type Checking
⚡ تجربه بهتر در Monorepoها
⚡ امکان کار راحتتر با Codebaseهای بزرگ
و این دقیقاً همون جاییه که TypeScript میخواد JavaScript رو برای پروژههای خیلی بزرگ مقیاسپذیرتر کنه.
💡 نکته جالب:
گاهی Performance یک زبان فقط به Runtime مربوط نیست؛ سرعت ابزارهای اطراف Developer هم بخشی از Performance واقعی اون اکوسیستمه.
@CodeVerse_dev
👍6❤2
🚨 امروز چند آسیبپذیری جدی در افزونههای وردپرس گزارش شده
یکی از موارد امروز مربوط به افزونه Login with QR با شناسه CVE-2026-86710 هست.
مشکل از جایی میاد که افزونه کد ورود QR را بهدرستی اعتبارسنجی نمیکنه و در شرایطی مهاجم بدون احراز هویت میتونه بهعنوان یک کاربر وارد سایت بشه؛ حتی اگر آن حساب Administrator باشه.
دو مورد دیگه هم امروز برای افزونههای Pressengine و PuppyFW گزارش شده:
🔴 Pressengine → امکان دور زدن احراز هویت و ایجاد Session معتبر
🔴 PuppyFW → ضعف در بررسی Permission در REST API و امکان تغییر تنظیمات سایت توسط کاربر دارای دسترسی پایینتر
نکته مهم برای توسعهدهندههای WordPress:
وقتی یک API یا Login Handler مینویسی، هیچوقت نباید به دادهای که از Request میاد برای تعیین سطح دسترسی اعتماد کنی.
اشتباه خطرناک:
چون کاربر عملاً داره تعیین میکنه:
«بررسی کن ببین من این دسترسی رو دارم یا نه!»
سطح دسترسی باید سمت سرور و از یک مقدار ثابت و قابل اعتماد تعیین بشه.
💡 خیلی از باگهای امنیتی پیچیده، در نهایت از یک اشتباه ساده شروع میشن:
اعتماد کردن به چیزی که کاربر خودش میتونه کنترلش کنه.
@CodeVerse_dev
یکی از موارد امروز مربوط به افزونه Login with QR با شناسه CVE-2026-86710 هست.
مشکل از جایی میاد که افزونه کد ورود QR را بهدرستی اعتبارسنجی نمیکنه و در شرایطی مهاجم بدون احراز هویت میتونه بهعنوان یک کاربر وارد سایت بشه؛ حتی اگر آن حساب Administrator باشه.
دو مورد دیگه هم امروز برای افزونههای Pressengine و PuppyFW گزارش شده:
🔴 Pressengine → امکان دور زدن احراز هویت و ایجاد Session معتبر
🔴 PuppyFW → ضعف در بررسی Permission در REST API و امکان تغییر تنظیمات سایت توسط کاربر دارای دسترسی پایینتر
نکته مهم برای توسعهدهندههای WordPress:
وقتی یک API یا Login Handler مینویسی، هیچوقت نباید به دادهای که از Request میاد برای تعیین سطح دسترسی اعتماد کنی.
اشتباه خطرناک:
$capability = $_REQUEST['capability'];
current_user_can($capability);
چون کاربر عملاً داره تعیین میکنه:
«بررسی کن ببین من این دسترسی رو دارم یا نه!»
سطح دسترسی باید سمت سرور و از یک مقدار ثابت و قابل اعتماد تعیین بشه.
💡 خیلی از باگهای امنیتی پیچیده، در نهایت از یک اشتباه ساده شروع میشن:
اعتماد کردن به چیزی که کاربر خودش میتونه کنترلش کنه.
@CodeVerse_dev
❤8
چرا باید Destructuring در JavaScript رو بلد باشی؟ 🤔
فرض کن از API یک User گرفتیم:
روش معمول:
اما با Destructuring:
همین! 😎
حالا مستقیم میتونی استفاده کنی:
---
تغییر اسم متغیر هم میشه 👀
مثلاً:
اینجا Property همچنان name هست، ولی متغیری که ساختیم username نام داره.
---
مقدار پیشفرض هم میتونی تعیین کنی:
اگر country داخل Object وجود نداشته باشه، مقدار پیشفرض استفاده میشه.
---
داخل Destructuring برای Array هم داریم 🔥
حتی میتونی بعضی آیتمها رو رد کنی:
---
کاربرد واقعی در پروژه
وقتی از یک تابع چند مقدار برمیگردونی:
یا هنگام کار با API:
کدت هم کوتاهتر میشه، هم خواناتر.
حالا Destructuring فقط برای کوتاه کردن کد نیست؛ کمک میکنه دقیقاً مشخص باشه از یک Object یا Array چه دادهای نیاز داری. 🚀
@CodeVerse_dev
فرض کن از API یک User گرفتیم:
const user = {
name: "alex",
age: 22,
role: "Developer"
};روش معمول:
const name = user.name;
const age = user.age;
const role = user.role;
اما با Destructuring:
const { name, age, role } = user;همین! 😎
حالا مستقیم میتونی استفاده کنی:
console.log(name);
console.log(age);
console.log(role);
---
تغییر اسم متغیر هم میشه 👀
مثلاً:
const { name: username } = user;
console.log(username);
// alexاینجا Property همچنان name هست، ولی متغیری که ساختیم username نام داره.
---
مقدار پیشفرض هم میتونی تعیین کنی:
const { name, country = "England" } = user;
console.log(country);
// Englandاگر country داخل Object وجود نداشته باشه، مقدار پیشفرض استفاده میشه.
---
داخل Destructuring برای Array هم داریم 🔥
const colors = ["red", "blue", "green"];
const [first, second] = colors;
console.log(first);
// red
console.log(second);
// blue
حتی میتونی بعضی آیتمها رو رد کنی:
const [first, , third] = colors;
console.log(third);
// green
---
کاربرد واقعی در پروژه
وقتی از یک تابع چند مقدار برمیگردونی:
function getUser() {
return {
name: "alex",
age: 22
};
}
const { name, age } = getUser();یا هنگام کار با API:
const { data, status } = response;کدت هم کوتاهتر میشه، هم خواناتر.
حالا Destructuring فقط برای کوتاه کردن کد نیست؛ کمک میکنه دقیقاً مشخص باشه از یک Object یا Array چه دادهای نیاز داری. 🚀
@CodeVerse_dev
👍8❤3
یک اشتباه رایج بین توسعهدهندهها:
و تمام.
اما واقعاً چه چیزی نصب شد؟
ممکنه تو فقط اینو درخواست کرده باشی:
my-package
ولی پشت صحنه:
یعنی یک پکیج میتواند دهها یا حتی صدها dependency دیگر وارد پروژه کند.
حملات زنجیره تأمین دقیقاً از همین نقطه خطرناک میشوند.
در سال ۲۰۲۶ چندین حمله بزرگ به npm رخ داده که حتی پکیجهای محبوب را هدف گرفتهاند؛ از جمله ChainDrop که بیش از ۴۰۰ پکیج npm را تحت تأثیر قرار داد.
پس قبل از اینکه یک پکیج را فقط به خاطر محبوب بودن نصب کنی، این سؤال را بپرس:
«این پکیج چه چیزهایی را با خودش وارد پروژه من میکند؟»
@CodeVerse_dev
npm install package
و تمام.
اما واقعاً چه چیزی نصب شد؟
ممکنه تو فقط اینو درخواست کرده باشی:
my-package
ولی پشت صحنه:
my-package
├── dependency-A
│ ├── dependency-C
│ └── dependency-D
├── dependency-B
│ └── dependency-E
└── ...
یعنی یک پکیج میتواند دهها یا حتی صدها dependency دیگر وارد پروژه کند.
حملات زنجیره تأمین دقیقاً از همین نقطه خطرناک میشوند.
در سال ۲۰۲۶ چندین حمله بزرگ به npm رخ داده که حتی پکیجهای محبوب را هدف گرفتهاند؛ از جمله ChainDrop که بیش از ۴۰۰ پکیج npm را تحت تأثیر قرار داد.
پس قبل از اینکه یک پکیج را فقط به خاطر محبوب بودن نصب کنی، این سؤال را بپرس:
«این پکیج چه چیزهایی را با خودش وارد پروژه من میکند؟»
@CodeVerse_dev
👍7❤2
🚨 وقتی یک اسکریپت خارجی، تبدیل به نقطه ورود حمله میشود
یک حمله Supply Chain در سرویسهای Brevo اخیراً باعث شد JavaScript مخرب از طریق بعضی Widgetها و Assetهای این سرویس به سایتهای استفادهکننده منتقل شود.
گزارشهای منتشرشده میگویند این حمله بیش از ۱۰۰ هزار سایت را در معرض خطر قرار داده است.
نکته مهم برای توسعهدهندهها:
وقتی داخل سایتت این موارد را قرار میدهی:
در واقع بخشی از اعتماد امنیتی سایتت را به یک سرویس خارجی منتقل کردهای.
یعنی حتی اگر:
✅ سیستم محتوا WordPress بهروز باشد
✅ همینطور Pluginها امن باشند
✅ سرور امن باشد
باز هم یک Third-Party Script آلوده میتواند سطح حمله را افزایش دهد.
برای همین در پروژههای حساس:
🔹 وابستگیهای خارجی را Inventory کنید
🔹همچنین Scriptهای Third-Party را بررسی کنید
🔹 دسترسی Pluginها را محدود کنید
🔹موضوع CSP را جدی بگیرید
🔹 تغییرات غیرعادی فایلها و درخواستها را Monitor کنید
امنیت فقط محافظت از کد خودمان نیست؛ زنجیره وابستگیها هم بخشی از سیستم ماست.
@CodeVerse_dev
یک حمله Supply Chain در سرویسهای Brevo اخیراً باعث شد JavaScript مخرب از طریق بعضی Widgetها و Assetهای این سرویس به سایتهای استفادهکننده منتقل شود.
گزارشهای منتشرشده میگویند این حمله بیش از ۱۰۰ هزار سایت را در معرض خطر قرار داده است.
نکته مهم برای توسعهدهندهها:
وقتی داخل سایتت این موارد را قرار میدهی:
<script src="external-service.js">
در واقع بخشی از اعتماد امنیتی سایتت را به یک سرویس خارجی منتقل کردهای.
یعنی حتی اگر:
✅ سیستم محتوا WordPress بهروز باشد
✅ همینطور Pluginها امن باشند
✅ سرور امن باشد
باز هم یک Third-Party Script آلوده میتواند سطح حمله را افزایش دهد.
برای همین در پروژههای حساس:
🔹 وابستگیهای خارجی را Inventory کنید
🔹همچنین Scriptهای Third-Party را بررسی کنید
🔹 دسترسی Pluginها را محدود کنید
🔹موضوع CSP را جدی بگیرید
🔹 تغییرات غیرعادی فایلها و درخواستها را Monitor کنید
امنیت فقط محافظت از کد خودمان نیست؛ زنجیره وابستگیها هم بخشی از سیستم ماست.
@CodeVerse_dev
👍6❤2