یوشا

دست نوشته ها و تجربیات شخصی

یوشا

دست نوشته ها و تجربیات شخصی

شهید دکتر مصطفی چمران: می گویند تقوا از تخصص لازمتر است، آنرا می پذیرم، اما می گویم آنکس که تخصص ندارد و کاری را می پذیرد بی تقواست!

طبقه بندی موضوعی

۹۱ مطلب با موضوع «نرم افزار :: برنامه نویسی» ثبت شده است

۱۰
۱۴۰۴/۰۹

اتوماسیون تولید یا Build automation یا builder گونه نرم‌ افزاری است که به توسعه‌ دهندگان کمک می‌کند تا با اجرای خودکار فرایند تولید، خروجی نهایی پروژه را به سادگی و با کارایی بیشتری تهیه کنند. این ابزار کمکی می‌ تواند به صورت مستقل نصب شود یا بعنوان بخشی از یک IDE در پس‌ زمینه فعال گردد. مثلاً با کلیک روی گزینه‌ی های Build یا Run در ویرایشگرتون این ابزار تمام مراحل لازم برای آماده‌ سازی و اجرای پروژه را بصورت خودکار انجام می‌ دهد.

تاریخچه و تحول Build automation

پیش از وجود ابزارهای Build automation و IDEها، برنامه‌نویسان این مراحل را به صورت دستی انجام می‌ دادند که وقت‌ گیر و پرخطا بود. با گذشت زمان، این مراحل در قالب یک فایل Bash، VBScript یا Batch تعریف شد و تنها با اجرای یک دستور، فرایند اتوماسیون اجرا میشد. اما این روش باز هم مشکلاتی از جمله عدم انتقال‌ پذیری بین سیستم‌ عامل‌ ها و دشواری maintain داشت...

 

Build automation امروزی

امروزه ابزارهای Build automation همه مراحل را با یک "syntax مشترک" در یک فایل تعریف می‌ کنند و تنها با یک دستور، تمامی فرایندها به‌ صورت خودکار و یکپارچه انجام می‌ شوند. این ابزارها قابل انتقال به دیگر سیستم‌ عامل‌ ها بوده و به راحتی قابل استفاده و maintain هستند.

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

 

عملیاتی که در فرایند Build automation می تواند انجام شود

فرایند build معمول شامل مراحل زیر است که می‌توانند با یک کلیک یا یک دستور آغاز شود:

  1. تنظیم فایل‌ های سورس: آماده‌ سازی و مرتب‌ سازی کدها برای ساختن نسخه نهایی.
  2. تنظیم نوع خروجی (debug/release): مشخص‌ کردن حالت نهایی خروجی (برای تست یا انتشار).
  3. تنظیم فایل کانفیگ وب: تنظیمات مربوط به سرور و محیط وب.
  4. بررسی نسخه compiler/interpreter مورد استفاده: اطمینان از استفاده از نسخه‌ صحیح مثلا PHP یا .Net.
  5. به‌روزرسانی کتابخانه‌ ها: دانلود و به‌روزرسانی وابستگی‌های پروژه.
  6. اجرای تست‌ها (Unit Testing): اطمینان از صحت کدها با اجرای تست‌ های واحد.
  7. ساخت پوشه‌ های مورد نیاز و انتقال فایل‌ ها: سازماندهی ساختار پوشه‌ ها و فایل‌ ها.
  8. اجرای پروژه: اجرای نهایی پروژه برای بررسی نهایی.
  9. آنالیز و گزارش‌ دهی: جمع‌ آوری و نمایش گزارش از پروژه اجرا شده.
  10. آرشیو و پکیج کردن: بسته‌ بندی پروژه در قالب فایل نهایی (مثل ZIP).
  11. آپلود و استقرار پروژه: آماده‌ سازی و انتقال به سرور.

نمونه فایل build.xml حاوی دستورالعملهای نرم افزار Apache ANT:

<project name="SimpleAntProject" default="compile" basedir=".">
    <property name="src.dir" value="src"/>
    <property name="build.dir" value="build"/>

    <!-- Clean build directories -->
    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <!-- Create build directory and compile Java source files -->
    <target name="compile" depends="clean">
        <mkdir dir="${build.dir}"/>
        <javac srcdir="${src.dir}" destdir="${build.dir}"/>
    </target>

    <!-- Run clean and compile -->
    <target name="all" depends="clean, compile"/>

</project>

 

نرم‌افزارهای معروف Build Automation

برخی از نرم‌ افزارهای Build automation شامل موارد زیر می‌ شوند:

  • برای پروژه های PHP: نرم افزار PHING
  • برای پروژه های جاوا: نرم افزارهای  Maven, Gradle
  • برای پروژه های C و Cpp: نرم افزارهای CMake, Automake, Conan
  • برای پروژه‌های .NET: نرم افزارهای MsBuild, NANT
  • برای پروژه های وب: نرم افزارهای Grunt, Gulp
  • برای پروژه های متفرقه و چند پلتفرمی: نرم افزار Apache ANT

 

مزایای استفاده از Build automation

  1. قابلیت یکپارچگی با CI/CD: ابزارهای Build Automation به راحتی با سیستم‌ های CI/CD مانند Jenkins، GitLab CI و Azure DevOps یکپارچه می‌ شوند و فرایند استقرار مداوم را بهبود می‌ بخشند.
  2. مدیریت وابستگی‌ ها: بسیاری از ابزارهای Build Automation مدیریت وابستگی‌ ها را به‌ صورت داخلی فراهم می‌ کنند، که به‌ روزرسانی و مدیریت کتابخانه‌ ها و پکیج‌ ها را آسان می‌ کند.
  3. صرفه‌ جویی در زمان و کاهش خطاها: با اتوماتیک‌ کردن فرایندهای ساخت، احتمال خطای انسانی کاهش یافته و فرایند بهبود می‌ یابد.
  4. مناسب برای تیم‌ های چند پلتفرمی: با تعریف یک بار مراحل در یک فایل، پروژه به راحتی قابل انتقال بین سیستم‌ عامل‌ ها و محیط‌ های کاری مختلف خواهد بود.
  • یوشا آل ایوب
۲۰
۱۴۰۴/۰۸
  • Comment ها باید کوتاه و شفاف باشند. هدف این است که برنامه نویس بتواند به سرعت متوجه منظور شما شود.
  • منظور Comment نباید کد را مجدد تکرار کند.
  • ترجیحاً از زبان انگلیسی برای نوشتن Comment استفاده کنید. (مگر اینکه تیم شما زبان دیگری را ترجیح دهد)
  • از نوشتن Comment های غیرمفید خودداری کنید.
  • برای تعیین کارهایی که باید بعداً انجام شوند یا مشکلاتی که باید حل شوند، از نشانگرهای Comment استفاده کنید:
// TODO: Optimize this function for better performance.
public void calculateDate()
{
}

# FIXME: Handle edge case when input is None.
function getData()
{
}

TODO: برای کارهای معلق/آینده

FIXME: برای اصلاحات ضروری

NOTE: برای توضیحات مهم

HACK: برای راه‌ حل‌ های موقت/trick

  • Comment، به معنای توجیهی برای کد نامفهوم نیست!
  • وقتی نمی‌ توانید Comment واضحی و شفافی برای کد بنویسید، معمولاً نشان دهنده این است که کدتان مشکل دارد.پس احتمالاً کد باید بازنویسی/ساده‌ سازی شود.
  • Comment ها باید ابهامات را برطرف کنند، نه اینکه ابهام جدید ایجاد کنند!
  • اگر Comment طولانی است، از Comment نوع multi-line برای نوشتن آن استفاده کنید.
/*
 This function calculates the Fibonacci sequence up to n.
 It uses an iterative approach to improve performance compared
  to the recursive method, which can be slow for large values of n.
 Also blah blah.
 */
  • Comment ها را بروز نگه دارید.
  • همیشه فقط کدهای غیر معمول/پیجیده را در Comment توضیح دهید.
  • هنگام Comment نویسی، اصول و ساختار مخصوص هر زبان برنامه نویسی را حفظ و رعایت کنید.
/**
 * Calculates the sum of two numbers.
 *
 * @param int $a The first number
 * @param int $b The second number
 * @return int The sum of $a and $b
 */
function add(int $a, int $b): int {
    return $a + $b;
}

/// <summary>
/// Calculates the sum of two numbers.
/// </summary>
/// <param name="a">The first number</param>
/// <param name="b">The second number</param>
/// <returns>The sum of a and b</returns>
public int Add(int a, int b)
{
    return a + b;
}
  • بهتره همیشه لینک منبع اصلی کدهای کپی‌ شده را در Comment قید کنید.
  • اگر الگوریتمی پیچیده است، می‌ توانید قبل از پیاده‌ سازی آن، Pseudo code آن را به صورت Comment بنویسید.
# Pseudo code:
# 1. Initialize an empty list
# 2. Loop through the input array
# 3. Append each element multiplied by 2 to the list
result = []
for num in input_array:
    result.append(num * 2)
  • اگر کد شما به اندازه کافی خوانا و واضح است، نیازی به نوشتن Comment ندارد. (کد گویا بهتر است)
// Returns result of calculation!
return a + b
  • از نوشتن Comment هایی که فقط شامل نظرات شخصی، شوخی یا مطالب های غیرضروری هستند، باید اجتناب شود.
  • از Comment برای نشان دادن محدودیت‌ ها/خطرات/هشدارها استفاده کنید.
// WARNING: This function does not handle negative inputs!
function squareRoot($x)
{
    return $x ** 0.5;
}
  • اگر از یک الگوی طراحی خاص (Singleton، Factory و...) استفاده می‌ کنید، آن را در Comment ها می توانید ذکر کنید.
// Singleton pattern implementation.
class DatabaseConnection:
    ...
  • اگر متغیرها و توابع نام‌ گذاری خوبی داشته باشند، نیاز به Comment کمتر می‌ شود.
  • و در آخر، کد خوب مثل یک داستان است؛ Comment ها فقط پاورقی‌ های آن هستند...
  • یوشا آل ایوب
۰۸
۱۴۰۴/۰۴

 

در ادامه مقاله قبلیم(12 سال پیش!) که ماژول Kernel لینوکس رو تعریف کردم، در این مقاله به نوشتن ماژول برای Kernel لینوکس می پردازم.

در این مقاله، به صورت ساده یاد می‌ گیریم که چگونه یک ماژول Hello World برای کرنل Linux بنویسیم، کامپایل و اجرا کنیم... و همه اینها بر پایه توزیع های معروف مثل Debian, RedHat و Slackware انجام میدیم.

 

ماژول های هسته لینوکس

هسته لینوکس / Linux kernel قلب سیستم‌ عامل لینوکس است و مسئول مدیریت منابع سخت‌ افزاری، ارتباط با سخت‌ افزار و اجرای برنامه‌ هاست. هسته لینوکس به صورت ماژولار طراحی شده، یعنی بسیاری از قابلیت‌ های آن به صورت فایلهای جدا و Load شدنی (Loadable Kernel Modules - LKM) پیاده‌ سازی می‌ شوند.

ماژول های هسته Linux دارای چند نوع هستند:  ماژول‌ های درایور دستگاهها (Device drivers)، ماژول‌ های فایل سیستم (Filesystem)، ماژول‌ های شبکه (Network)، ماژول‌ های امنیتی (Security) و ماژول‌ های مدیریت حافظه و پردازش (Memory & process management). این ماژول ها باعث اضافه شدن feature در هسته، افزایش کارایی، سفارشی‌ سازی آسان و نگهداری ساده‌ تر خود هسته می‌ شوند.

  • یوشا آل ایوب
۰۷
۱۴۰۴/۰۳

زبان برنامه‌ نویسی PHP از زمان معرفی در سال 1994 تا اکنون(2025)، بعنوان یکی از محبوب‌ ترین ابزارها برای توسعه وب در سراسر جهان شناخته شده است. انعطاف‌ پذیری، سادگی یادگیری و فراوانی فریم‌ ورکها، CMF ها و CMS های معروف، آن را به انتخابی ایده‌ آل برای پروژه‌ های کوچک تا متوسط تبدیل کرده است...

اما صرفاً پروژه ها کوچک تا متوسط!

چون وقتی صحبت از محیط‌ ها و محصولات Enterprise-grade (سازمانی) میشود، بحث‌ ها و معیارهای متعدد و چالشی تری درباره مناسب بودن یا نبودن PHP به عنوان ابزار اصلی تولید محصول مطرح می‌ شود... 

با وجود پیشرفت‌ های قابل توجه PHP و فریم‌ ورک‌ هایی مانند Laravel و Symfony، خود زبان PHP همچنان دارای محدودیت‌ هایی است که آن را برای پروژه‌ های Enterprise مناسب نمیکند.

 

در این مقاله به بررسی دلایلی می پردازم که نشان می دهند زبان PHP مناسب محیط ها و محصولات Enterprise نیست. و اینکار را بدون تعصب و با دلایل علمی/فنی انجام میدهم.

  • یوشا آل ایوب
۲۱
۱۴۰۴/۰۱

اگر شما هم از توسعه دهندگان PHP هستید یا با پروژه های مبتنی بر این زبان سروکار دارید، حتماً میدونید که امنیت کدها چقدر اهمیت داره... باگهای امنیتی میتونن به راحتی به یک کابوس برای کسب و کار تبدیل بشن، مخصوصا از نوع باج افزار/Ransomware اش!

اما خب ابزارهایی وجود دارن که به ما کمک میکنن قبل از رسیدن به مرحله production، مشکلات امنیتی رو شناسایی کنیم... یک خانواده از این ابزارها Security linter ها هستن که با اسکن static کدها، حفره ها و اسیب پذیریهای امنیتی رو برنامه نویس ایجاد کرده رو شنایی و گزارش می کنند.

یکی از این ابزارها، PHP Security Linter هستش که دست ساز خودم هست:

 

PHP Security Linter

این ابزار یک Static analysis (تحلیل استاتیک کد) با زبان PHP هست که با اسکن کدها، آسیب پذیری های امنیتی رو بر اساس استانداردهای CIS و OWASP شناسایی میکنه. یعنی بکمک این ابزار و بدون نیاز به اجرای کد، میتونید مشکلاتی مثل SQL Injection، XSS، قرار دادن اطلاعات حساس در کد و غیره... رو پیدا کنید.

 

     

 

آدرس مخزن: https://github.com/Yousha/php-security-linter

 

چرا از این ابزار استفاده کنیم؟

  • پشتیبانی از بیش از ۲۰۰ قانون امنیتی (مطابق با CIS و OWASP)

  • سریع و سبک: بدون اجرای کد، آسیب پذیری ها رو تشخیص میده.

  • پشتیبانی از PHP 7.4 تا 8.3 

  • خروجی های متنوع: هم بصورت متن در کنسول و هم JSON.

  • قابلیت شخصی سازی: میتونید قوانین خودتون رو اضافه یا برخی رو غیرفعال کنید.

  • مناسب برای DevSecOps: به راحتی با DevSecOps ادغام میشه.

  • با حداقل dependency و سبک!

 

نصب و استفاده

نصبش بسیار سادست، فقط کافیه با Composer پکیج رو به پروژه اضافه کنید:

composer require --dev yousha/php-security-linter

بعد برای اسکن یک پوشه:

php vendor/bin/php-security-linter --path ./src

اگرم میخوایید پوشه هایی مثل vendor یا tests رو اسکن نکنید:

php vendor/bin/php-security-linter --path ./app --exclude vendor,tests

 

مثال خروجی ابزار

وقتی اسکن انجام میشه، نتیجه رو به صورت خوانا مشاهده میکنید:

Scan Results
========================================

File: /src/auth.php
  ✗ [CRITICAL] OWASP: SQL Injection vulnerability detected (Line 42)
  ✗ [HIGH] CIS: Hardcoded database credentials (Line 15)

File: /src/utils.php
  ✗ [MEDIUM] OWASP: XSS vulnerability possible (Line 88)

Summary: Scanned 24 files, found 3 potential issues.

 

  • یوشا آل ایوب
۰۵
۱۴۰۳/۱۲

 

OpCache اکستنشنی در PHP هست که برای بهبود پرفورمنس و سرعت پردازش فایلهای PHP ایجاد شده.

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

در حال حاضر سریعترین، کاملترین و قوی ترین سیستم cache برای PHP اکستنشن opcache هستش که هم optimization و هم caching رو فراهم میکنه.

 

فهرست مندرجات

  • الزامات و نیازمندیها
  • فعالسازی
  • مقایسه OPcache با سایر ابزارهای مشابه
  • نکات
  • تنظیم محیط گرافیکی
  • ابزارهای کمکی در فریمورک ها
  • قابلیت Preloading در PHP 8+
  • رفع مشکلات

  • یوشا آل ایوب
۰۷
۱۴۰۳/۱۱

در CSS، واحدهای سایز به دو دسته/خانواده اصلی تقسیم می‌ شوند:

  1. واحدهای ثابت/Absolute
  2. واحدها متغیر/Relative

 

واحدهای ثابت (Absolute units)

واحدهای ثابت/مطلق به صورت خشک تعریف شده‌ اند و سایز مشخص‌ شده با این واحدها دقیقاً همان اندازه نمایش داده می‌ شود. این واحدها نسبت به اندازه صفحه، جهت یا سایر تغییرات واکنش نشان نمی‌ دهند.

واحدهای ثابت برای استفاده در انواع نمایشگرها توصیه نمیشوند، چراکه اندازه صفحه نمایشها متفاوت است؛ اما در صورتی که محیط خروجی مشخص باشد (مانند Printer)، این واحدها میتوانند مفید باشند.

انواع واحدهای ثابت:

  • cm (سانتی‌ متر)
  • mm (میلی‌ متر)
  • in (اینچ)
  • px (پیکسل)
  • pt (پوینت)
  • pc (پیکا)
  • q (یک چهارم میلی‌ متر)

مثال:

/* یک باکس با عرض 2 سانتی‌ متر */
.box {
    width: 2cm;
    height: 2cm;
    background-color: lightblue;
}

/* متن با اندازه فونت ثابت 12 پوینت */
.text {
    font-size: 12pt;
}

 

واحدهای متغیر (Relative units)

واحدهای متغیر/مقیاس پذیر سایز را بصورت خودکار و نسبت به ویژگیهای دیگر مانند اندازه صفحه نمایش، اندازه صفحه مرورگر، عناصر والد/parent و... تنظیم میکنند. این واحدها در بین انواع دستگاه های مختلف بهتر scale و تنظیم میشوند.

انواع واحد های متغیر:

  • em : نسبت به اندازه فونت عنصر والد تنظیم میشود
  • ex : نسبت به ارتفاع x در فونت جاری، که برای فونتهای تک‌ فاصله مفید است تنظیم میشود
  • ch : نسبت به عرض کاراکتر "0" در فونت عنصر، برای فونت‌ های تک‌ فاصله کاربرد دارد
  • rem : نسبت به اندازه فونت عنصر ریشه (<html>)
  • vw : نسبت به 1٪ از عرض پنجره مرورگر
  • vh : نسبت به 1٪ از ارتفاع پنجره مرورگر
  • vmin : نسبت به 1٪ از کوچک‌ ترین بُعد پنجره مرورگر
  • vmax : نسبت به 1٪ از بزرگ‌ ترین بُعد پنجره مرورگر
  • % : نسبت به عنصر والد تنظیم میشود

 

توضیحات تکمیلی واحدهای مهم

  • px (پیکسل) - ثابت

    • پیکسل یک مربع کوچک روی نمایشگر است که می‌تواند فقط یک رنگ را در یک لحظه نمایش دهد. مانند عدد رزولوشن نمایشگر که نشان‌ دهنده تعداد پیکسل‌ های تشکیل‌  دهنده صفحه است. 1024x768
    • font-size: 12px; به مرورگر می‌ گوید که ارتفاع هر کاراکتر 12 عدد پیکسل باشد. پیکسل ها اندازه ثابتی دارند و تغییر اندازه نمی‌ دهند. این واحد برای مواقعی که نیاز به قرار دادن متن روی یک تصویر پس‌ زمینه دارید، مفید است.
  • % (درصد) - متغیر

    • درصد یک واحد متغیر است که بر اساس اندازه عنصر والد محاسبه می‌شود. برای تعیین عرض یا ارتفاع عناصر، زمانی که والد مشخص باشد، می‌ تواند به عنوان راهی منعطف استفاده شود.
    • font-size: 50%; اندازه فونت را به ۵۰٪ اندازه فونت عنصر والد تنظیم میکند.
    • font-size: 100%; یعنی ۱۰۰٪ اندازه‌ ای که از عنصر والد به ارث می برد. درصد برای طراحی‌ های انعطاف‌ پذیر مناسب‌ تر است.
    • در CSS، هر چیزی که از این واحد استفاده کند، نسبت به عنصر والد خود است، مگر در حالتی که موقعیت عنصر ثابت باشد که در آن صورت نسبت به عنصر ریشه <html> خواهد بود.
    • نکته: تعیین width یا height به درصد زمانی عمل نمی‌ کند که ابعاد عنصر والد بطور auto تعیین شده باشد.
  • pt (پوینت) - ثابت

    • 1 پوینت برابر با ۱/۷۲ اینچ است. font-size: 12pt; ارتفاع کاراکترها را به ۱۲/۷۲ اینچ تنظیم می‌ کند. پوینت اندازه‌ ای ثابت دارد و مقیاس‌ پذیر نیست!
    • پوینت در طراحی Print استفاده می‌شود و تنها در CSS مربوط به @media print کاربرد دارد.
  • em - متغیر

    • این واحد شبیه به درصد است و نسبت به اندازه فونت عنصر والد محاسبه می‌شود. اما ۱em برابر با ۱۰۰٪ و ۱.۵em برابر با ۱۵۰٪ است. em یک واحد مقیاس‌ پذیر است و برای تعیین اندازه فونت مناسب اما چالشی است.
    • یک em برابر با اندازه فونت جاری است، به عنوان مثال اگر اندازه فونت کل صفحه 12pt باشد، 1em برابر با 12pt خواهد بود. این واحد مقیاس‌ پذیر است؛ بنابراین 2em برابر با 24pt، ۰.۵em برابر با 6pt خواهد بود.
  • rem - متغیر

    • واحد rem هم مانند em مقیاس‌ پذیر است اما همیشه نسبت به اندازه فونت عنصر ریشه <html> محاسبه می‌ شود، که باعث می‌ شود از تغییرات ناخواسته در طراحی جلوگیری کند. بنابراین با استفاده از عناصر تودرتو دیگر نیازی به محاسبه اندازه فونت در رابطه با عنصر والد نیست. برای تعیین اندازه فونت مناسب است.
  • cm، mm، in - ثابت
    • معمولاً برای اندازه‌ گیری‌ های دقیق در محیط‌ های غیر دیجیتال و فیزیکی مانند Print به کار می‌ روند. اندازه فونت با تغییر اندازه پنجره مرورگر به صورت دینامیک واکنش نشان نمی‌ دهد، بلکه به تنظیمات زوم یا اندازه متن مرورگر، مانند فشار دادن همزمان کلید Ctrl و + در مرورگر، واکنش نشان می‌دهد.
  • vm. vh. viewport... - متغیر
    • واحدهای vw و vh نسبت به عرض و ارتفاع صفحه نمایش تعریف می‌ شوند. درواقع درصدی از پنجره مرورگر را نشان می‌ دهند و برای طرح‌ های واکنش‌ گرا کاربرد دارند. 1vw معادل 1٪ از عرض صفحه نمایش و 1vh معادل 1٪ از ارتفاع صفحه نمایش است. این واحدها به خصوص برای طراحی‌ های تمام‌ صفحه بسیار مفیدند.

مثال:

/* با عرض برابر با 50% از عرض پنجره مرورگر */
.box {
    width: 50vw;
    height: 50vh;
    background-color: lightcoral;
}

 

کاربرد واحدها در عناصر وب

  • px (پیکسل): برای اندازه خطوط مرزی و اجزای کوچک ثابت.

    • کاربرد: <button>, <small>, خطوط و حاشیه‌ ها.
  • % (درصد): برای تنظیم ابعاد نسبی نسبت به عنصر والد، به ویژه در عرض و ارتفاع.

    • کاربرد: <div>, <img>, <section>, <header>, <footer>.
  • em: برای تنظیم اندازه فونت و فاصله‌ های داخلی، با توجه به اندازه فونت والد.

    • کاربرد: <p>, <span>, <ul>, <ol>.
  • rem: برای اندازه فونت اصلی در کل صفحه و مقیاس‌ پذیری یکنواخت، بدون تاثیر از والد.

    • کاربرد: <body>, <h1>, <h2>, <h3>, <html>.
  • vw و vh: برای تنظیم ابعاد نسبی کل صفحه نمایش، به خصوص در طراحی‌ های تمام صفحه.

    • کاربرد: <section>, <header>, <footer>, عناصر تمام صفحه.
  • pt: برای فونت در خروجی چاپ (به ندرت برای وب).

    • کاربرد: فقط در چاپ، مثل استایل تحت @media print.
  • cm, mm, in: برای موارد خاص Print و اندازه‌ گیری دقیق.

    • کاربرد: چاپ و طرح‌ های خاص، مثل استایل‌ های PDF و کارت ویزیت

 

توجه: در اکثر مرورگرها، اندازه پیش‌ فرض فونت صفحه 16px است.

  • یوشا آل ایوب
۱۱
۱۴۰۳/۱۰

1- مفهوم و تفاوت Concurrency(همزمانی) و Parallel(موازی):

- پردازش Parallel نوعی از Concurrent هستش. درواقع Parallel زیرمجموعه Concurrency هستش.

- نوع Concurrent میتونه با یک پردازنده اعمال بشه (single/multi thread). اما نوع Parallel باید در چند پردازنده اعمال بشه. یعنی یک پردازنده به ازای هر پروسس.

نکته: عمل Multithreading زیرمجموعه Concurrency محسوب می‌شه و می‌تونه با پردازنده‌های تکی هم انجام بشه.

 

2- با استفاده از کلمه کلیدی volatile در متغیرها می تونید thread های برنامه رو وادار کنید تا اطلاعات متغیر رو مستقیماً از حافظه بخونن و نه کش CPU. (این عمل درواقع نوعی thread-safety محسوب میشه)

 

3- یادتون باشه که synchronized و Thread-Safe در .Net یک مفهوم دارن: دسترسی همزمان به کد توسط چند Thread بدون بروز مشکلات. یعنی کد/متد synchronized اجازه دسترسی همزمان چند Thread به کد/متد رو نمیده، پس Thread ها باید نوبتی به کد/متد دسترسی پیدا کنن بنابراین آخرین وضعیت کد/متد در همه Thread ها مشترک هستش.

نکته: این مسئله فقط در مورد برنامه های Multi-Thread صدق میکنه و نه Single-Thread.

نکته 2: در .Net باید از تکنیک‌هایی مانند lock برای Thread-Safe کردن کد استفاده کرد.

  • یوشا آل ایوب
۱۸
۱۴۰۳/۰۹

دلایل مختلفی ممکنه وجود داشته باشه که یک تیم توسعه‌ دهنده تصمیم بگیره قابلیت API رو از یک پروژه‌ی Laravel حذف کنه... مثلا:

 

- نیاز نداشتن به API و تمرکز روی توسعه‌ وب‌ سایت

- کاهش پیچیدگی و تمیزکاری

- کاهش دردسرهای امنیتی

- بهبود مصرف منابع سرور

  • یوشا آل ایوب
۰۹
۱۴۰۳/۰۶

برخی از مهمترین معیارهای انتخاب زبان برنامه نویسی: Java, .Net, PHP

(برای بزرگنمایی کلیک کنید)

  • یوشا آل ایوب