<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمد مرکباتی</title>
        <link>https://virgool.io/feed/@mhmmdtech</link>
        <description>توسعه دهنده سمت سرور (پی‌اچ‌پی و لاراول)</description>
        <language>fa</language>
        <pubDate>2026-04-14 18:35:41</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1680120/avatar/brSOVa.jpg?height=120&amp;width=120</url>
            <title>محمد مرکباتی</title>
            <link>https://virgool.io/@mhmmdtech</link>
        </image>

                    <item>
                <title>چطور از Enums در PHP استفاده کنیم؟</title>
                <link>https://virgool.io/coderlife/%DA%86%D8%B7%D9%88%D8%B1-%D8%A7%D8%B2-enums-%D8%AF%D8%B1-php-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D9%86%DB%8C%D9%85-nrm0rputoxxw</link>
                <description>چطور از Enum در PHP استفاده کنیم؟ به طور ساده میشه گفت که Enum مجموعه‌ای از مقادیر ثابت هست که از نسخه 8.1 به زبان برنامه‌نویسی PHP اضافه شده. Enum زمانی کاربرد داره که که مجموعه‌ای از مقادیر به هم مرتبط داریم که باید در یک گروه قرار بگیرند. در تکه کد زیر نمونه‌ای از یک enum مشاهده می‌کنیم:استفاده از Enum برای تعیین مقادیر statusهمونطور که دیدیم میتونیم داخل enum متد تعریف کنیم و نکته جالبش این هست که enumمی‌تونه از interfaceها implement کنه.ترکیب enum و interfaceمقادیر Enumدر صورت نیاز میتونید برای enum مقدار تعیین کنید که به این نوع Backed Enum گفته میشه و لازم هست که براشون type تعریف بشه و همه مقادیر بایستی مقداری از همون type داشته باشند.نحوه تعریف یک backed enumمقداری که در Backed Enums تعریف کردیم رو میتونیم به روش پایین بگیریم:$value = Status::PUBLISHED-&gt;value; // 2نام کلید enum رو هم به روش پایین می‌تونیم بگیریم:$name= Status::PUBLISHED-&gt;name; // publishedمی‌تونیم باتوجه به مقدار یک enum کلید اون رو بگیریم:$status = Status::from(2); // Status::PUBLISHEDاگر مقداری که وارد میکنیم در enum وجود نداشته باشه متد from خطا برمی‌گردونه، همینطور می‌تونیم از متد tryFrom برای دریافت کلید یک enum از مقدارش استفاده کنیم که در صورت نبود اون مقدار فقط null برمی‌گردونه.$status = Status::tryFrom(100); // nullبه کمک متد cases می‌تونیم تمامی مقادیر موجود در یک enum رو بگیریم.Status::cases();
/* [
    Status::DRAFT, 
    Status::PUBLISHED, 
    Status::ARCHIVED
] */چند نکته:نکته 1: دقت کنید که هر مقدار enum یک object هست در نتیجه نمی‌تونیم از اونها به عنوان کلیدهای یک آرایه استفاده کنیم.نکته 2: می‌تونیم از trait در داخل enum استفاده کنیم و فقط باید دقت کنیم که متدهای پیشفرض enum مثل from یا tryFrom رو حق نداریم override کنیم و trait ما نباید property داشته باشه.نکته 3: enum های معمولی به طور پیشفرض از interface با نام UnitEnum استفاده می‌کنند که طبق مستندات PHP متد cases در اون قرار داره.تعریف interface با نام UnitEnumنکته 4: backed enum ها از interface با نام BackedEnum استفاده می‌کنند که در اون متدهای from و tryFrom تعریف شده و این interface از unitEnum ارث‌بری می‌کنه.تعریف interfaceبا نام BackedEnumباتوجه به مطالبی که تا الان بررسی کردیم تکه کد پایین می‌تونه ایده کلی در استفاده از enum بهمون بده.تعریف enum به همراه متدهای پرکاربرداگه میخواید از این تکه کد تو پروژه  استفاده کنید به این github gist سر بزنید. https://gist.github.com/mhmmdtech/bed2dc8f0d93db33b94d6337241de6bdتو این مطلب ویژگی enum رو بررسی کردیم و متوجه شدیم که به شدت خوانایی کد رو افزایش میده و احتمال خطا رو کاهش میده. اگر نظر یا سوالی راجع به این مطلب دارید حتما بگید و لطفا این مطلب رو به افرادی که در حال یادگیری PHP هستند معرفی کنید و در آخر ممنونم ازتون بابت وقتی که گذاشتید و این مطلب رو خوندید.</description>
                <category>محمد مرکباتی</category>
                <author>محمد مرکباتی</author>
                <pubDate>Mon, 17 Jul 2023 17:40:07 +0330</pubDate>
            </item>
                    <item>
                <title>نکته و ترفند برای مدیریت موثر تاریخ و زمان در لاراول</title>
                <link>https://virgool.io/@mhmmdtech/%D9%86%DA%A9%D8%AA%D9%87-%D9%88-%D8%AA%D8%B1%D9%81%D9%86%D8%AF-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D9%85%D9%88%D8%AB%D8%B1-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%88-%D8%B2%D9%85%D8%A7%D9%86-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-bccmwxzj9eqn</link>
                <description>در زمان گم نشوپکیج کربن کمک می‌کنه تا به صورت بهینه‌تری تاریخ و زمان رو در PHP و لاراول مدیریت کنیم اما اکثر اوقات پروژه نیازمندی‌هایی داره که ناخودآگاه کد مارو به سمت پیچیدگی میبره و اینجاست که باید هنر به خرج بدیم و کاری کنیم تا تمیزی رو در کدهای خودمون نگه‌داریم.یکی از کارهای رایج موقع کار با تاریخ و زمان فیلتر کردن اونا به کمک Eloquent هست که اگه مراقب نباشیم به راحتی میتونیم کد کثیفی تولید کنیم. در این مقاله بررسی می‌کنیم که چطور با ایجاد یک trait بتونیم به صورت موثر تاریخ و زمان رو مدیریت کنیم.قدم اول: ساخت traitپوشه جدیدی با نام Traits در پوشه app بسازید و  فایلی با نام HasManageableDate.php در اون پوشه ایجاد کنید و در ادامه namespace براش مشخص کنید:namespace App\Traits;و از اونجایی که قراره به کمک کربن تاریخ و زمان رو مدیریت کنیم پس باید فراخوانیش کنیم:use Illuminate\Support\Carbon;چون قراره جنس پارامترهای ورودی و خروجی رو خودمون تعیین کنیم پس لازمه که کلاس Builder رو فراخوانی کنیم چون یک شی از این کلاس قراره بهمون کمک کنه با eloquent تعامل کنیم.use Illuminate\Database\Eloquent\Builder;و نهایتا لازمه که قالب trait خودمون که اسمش HasManageableDate هست رو ایجاد کنیم:trait HasManageableDate {}تا اینجا فایل HasManageableDate.php به این صورت میشه:&lt;?php

namespace App\Traits;

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;

trait HasManageableDate {}قدم دوم: ایجاد ساختار traitدر این مرحله باید از مفهوم scopeها در لاراول استفاده کنیم تا بتونیم متدهایی رو تولید کنیم که بتونند در همه قسمت‌های اپلیکیشن با Eloquent کار کنند. اولین متد رو با نام scopeToday ایجاد کنید و این متد قراره رکوردهایی که امروز در جدول مورد نظر دیتابیس ما تولید شدند رو به ما برگردونه.public function scopeToday(Builder $query, string $column = &#039;created_at&#039;): void 
{
    $query-&gt;whereDate($column, today());
}تو متد بعدی قراره تمامی رکورد‌هایی که دیروز از جدول مورد نظر دیتابیس ما تولید شدند رو بگیریم و برای همین اسمش scopeYesterday هست.public function scopeYesterday(Builder $query, string $column = &#039;created_at&#039;): void 
{ 
    $query-&gt;whereDate($column, Carbon::yesterday());
}متد بعدی اسمش scopeCurrentWeek هست و قراره تمامی رکوردهایی از جدول مورد نظر دیتابیس رو برگردونه که از روز اول هفته فعلی تا روزی که در اون هستیم ایجاد شدند.public function scopeCurrentWeek(Builder $query, string $column = &#039;created_at&#039;): void
{
    $query-&gt;whereBetween($column, [now()-&gt;startOfWeek(), now()]);
}متد بعدی که اسمش scopeCurrentMonth هست، قراره تمامی رکوردهایی از جدول مورد نظر دیتابیس رو برگردونه که از روز اول ماه فعلی تا روزی که در اون هستیم ایجاد شدند.public function scopeCurrentMonth(Builder $query, string $column = &#039;created_at&#039;): void
{ 
    $query-&gt;whereBetween($column, [now()-&gt;startOfMonth(), now()]);
}متد بعدی  scopeCurrentQuarter هست که تمامی رکوردهایی از جدول مورد نظر دیتابیس رو برمیگردونه که از روز اول ماه فصل فعلی تا روزی که در اون هستیم ایجاد شدند.public function scopeCurrentQurter(Builder $query, string $column = &#039;created_at&#039;): void
{
    $query-&gt;whereBetween($column, [now()-&gt;startOfQuarter(), now()]);
}متدscopeCurrentYear هم تمامی رکوردهایی که از جدول مورد نظر دیتابیس از روز اول سال فعلی تا روزی که در اون هستیم ایجاد شدند رو برمیگردونه.public function scopeCurrentYear(Builder $query, string $column = &#039;created_at&#039;): void
{
    $query-&gt;whereBetween($column, [now()-&gt;startOfYear(), now()]);
}متد بعدی قراره تمامی رکوردهایی از جدول مورد نظر دیتابیس که در 7 روز گذشته (با احتساب امروز) ایجاد شدند رو برگردونه و برای همین اسمش scopeLast7Days هست.public function scopeLast7Days(Builder $query, string $column = &#039;created_at&#039;): void 
{
    $query-&gt;whereBetween($column, [today()-&gt;subDays(6), now()]);
}متد بعدی تمامی رکوردهایی از جدول مورد نظر دیتابیس که در 30 روز گذشته (با احتساب امروز) ایجاد شدند رو برگردونه و برای همین اسمش scopeLast30Days هست.public function scopeLast30Days(Builder $query, string $column = &#039;created_at&#039;): void
{
    $query-&gt;whereBetween($column, [today()-&gt;subDays(29), now()]);
}به کمک متد بعدی تمامی رکوردهایی از جدول مورد نظر دیتابیس که در 90 روز گذشته (با احتساب امروز) ایجاد شدند رو میگیریم و برای همین اسمش scopeLast90Days هست.public function scopeLast90Days(Builder $query, string $column = &#039;created_at&#039;): void
{
    $query-&gt;whereBetween($column, [Carbon::today()-&gt;subDays(89), Carbon::now()]);
}متد بعدی قراره scopePreviousWeek باشه که تمامی رکوردهایی از جدول مورد نظر دیتابیس که هفته گذشته ایجاد شدند رو برای ما میگیره.public function scopePreviousWeek(Builder $query, string $column = &#039;created_at&#039;): void
{
    $query-&gt;whereBetween($column, [now()-&gt;startOfWeek()-&gt;subDays(7), 
        now()-&gt;startOfWeek()]);
}متد بعدی هم scopePreviousMonthهست که تمامی رکوردهایی از جدول مورد نظر دیتابیس که ماه گذشته ایجاد شدند رو برای ما میگیره.public function scopePreviousMonth(Builder $query, string $column = &#039;created_at&#039;): void
{
    $query-&gt;whereBetween($column, [now()-&gt;startOfMonth()-&gt;subMonth(), 
        now()-&gt;startOfMonth()]);
}و متد بعدی هم scopePreviousQuarterهست که تمامی رکوردهایی از جدول مورد نظر دیتابیس که فصل گذشته ایجاد شدند رو برای ما میگیره.public function scopePreviousQuarter(Builder $query, string $column = &#039;created_at&#039;): void
{
    $query-&gt;whereBetween($column, [now()-&gt;startOfQuarter()-&gt;subMonths(3), 
        now()-&gt;startOfQuarter()]);
}طبق مفهوم accessor در لاراول قراره که تفاوت زمانی تاریخی که یک رکورد ایجاد شد با زمان حال حاضر رو بگیریم و نشون بدیم پس برای همین اسم متد بعدی createdTimeDiff هست.public function createdTimeDiff(): Attribute
{
    return Attribute::make(
        get: fn () =&gt; $this-&gt;created_at-&gt;diffForHumans(),
    );
}در متد بعدی قصد داریم تفاوت آخرین زمانی که رکورد موردنظر ما آپدیت شد رو با زمان حال حاضر بگیریم و برای همین اسمش رو lastUpdatedTimeDiff قرار میدیم.public function lastUpdatedTimeDiff(): Attribute
{
    return Attribute::make(
        get: fn () =&gt; $this-&gt;created_at-&gt;diffForHumans(),
    );
}چطور ازش استفاده کنیم؟لازمه این trait رو رو در Model موردنظر خودتون فراخوانی کنید تا بتونید ازش استفاده کنید:&lt;?php

namespace App\Models;

use App\Traits\HasManageableDate;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
    use HasFactory, HasManageableDate;
    // ...
}حالا هر متدی که در trait تعریف شده میشه استفاده کرد تا رکوردهای موجود در جدول مربوطه رو فیلتر کنیم.$todayProducts = Product::today()-&gt;get();و برای گرفتن نمایش فاصله زمانی کاربرپسند الان نسبت به زمانی که یک رکورد ایجاد شد به روش پایین عمل میکنیم:$user = User::find(1);
$userCreatedAt = $user-&gt;created_time_diff;فایل نهایی HasManageableDate.php برای کمک به مدیریت بهینه‌تر تاریخ و زمان رو در گیت‌هاب قراردادم و مطمئنم که میتونه تو پروژه‌ها مفید باشه.نتیجه‌گیریتو این مقاله برای کار با تاریخ و زمان از کربن استفاده کردیم و برای جلوگیری از تکرار کدها یک trait ایجاد کردیم. شما میتونید براساس نیاز خودتون این trait رو تغییر بدید، مثلا در متدها تغییراتی ایجاد کنید، متد جدیدی اضافه کنید یا متد موجود رو حذف کنید تا مناسب پروژه شما باشه. امیدوارم که این مقاله برای شما مفید بوده باشد و لطفا اگر سوال یا نظری دارید حتما بهم بگید و در آخر ممنونم بابت وقتی که گذاشتید.</description>
                <category>محمد مرکباتی</category>
                <author>محمد مرکباتی</author>
                <pubDate>Sat, 01 Jul 2023 17:45:50 +0330</pubDate>
            </item>
                    <item>
                <title>مدیریت تاریخ و زمان در لاراول توسط کربن</title>
                <link>https://virgool.io/laravel-community/%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%88-%D8%B2%D9%85%D8%A7%D9%86-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%AA%D9%88%D8%B3%D8%B7-%DA%A9%D8%B1%D8%A8%D9%86-wwk0xnroqthq</link>
                <description> مدیریت تاریخ و زمان در لاراول توسط کربنبرای کار با تاریخ و زمان در PHP و لاراول می‌تونیم از توابع و کلاس‌های PHP استفاده کنیم ولی همونطور که میدونید این روش پیچیدگی‌هایی داره و برای همین بسیاری از توسعه‌دهنده‌ها از پکیج دیگه‌ای به اسم Carbon استفاده می‌کنند.پکیج کربن در واقع یک افزونه برای DateTime در PHP هست که در پس‌زمینه از کلاس DateTime ارث‌بری میکنه. به کمک این پکیج کدهای ساده‌تر و بامعنی‌تر تولید میشه و همچنین خوانایی و قابلیت نگه‌داری برای تاریخ و زمان به پروژه اضافه میشه.فریمورک لاراول به‌طور پیش‌فرض از Carbon استفاده می‌کنه ولی در مستندات چیز زیادی دربارش نگفته پس لازمه که خودمون وارد عمل بشیم و بفهمیم که چطور باید تاریخ و زمان رو در لاراول به کمک Carbon مدیریت کنیم.کربن چه کارهایی رو انجام می‌ده؟به طور خلاصه تعامل با تاریخ، زمان و timezone(منطقه زمانی) به کمک کربن راحت‌تر میشه، یعنی:ساخت datetimeتبدیل datetime بین timezoneهای مختلفایجاد تغییرات در datetime(اضافه و کم کردن)محاسبه اختلاف بین دو فاصله زمانیتبدیل datetime به متن مناسب و قابل فهم برای انسان‌هالطفا تکه کد پایین رو ببینید تا متوجه پتانسیل کربن در ایجاد سادگی، زیبایی و خوانایی در پروژه بشید:$trialExpires = now()-&gt;addDays(30);فراخوانی و خواندن تاریخاگه از لاراول استفاده می‌کنید اصلا نیاز نیست کربن رو نصب کنید چون همونطور که گفتیم به صورت پیش‌فرض به همراه لاراول نصب میشه و در اختیار توسعه‌دهنده‌ها قرار میگیره و کافیه برای فراخوانی Carbon به روش زیر عمل کنیم: use Illuminate\Support\Carbon;طبق این Pull Reqest کد بالا اصل پکیج Carbon رو در یک نگه‌دارنده‌ای میپیچه که باعث میشه قابلیت macroable بودن به carbon در لاراول اضافه بشه. البته هنوز هم می‌تونید از پکیج کربن به صورت مستقیم استفاده کنید:use Carbon\Carbon;هرجا که نیاز داشته باشیم میتونیم ازش نمونه‌سازی کنیم:$current = new Carbon();
$newYear = new Carbon(&#039;first day of January 2024&#039;);توابع کمکی ()now و ()today در لاراول از کربن استفاده می‌کنند و البته می‌تونیم به صورت مستقیم یه سری از متدهای محبوب کربن رو به صورت استاتیک صدا بزنیم:$yesterday = Carbon::yesterday();
$today = Carbon::today();
$current = Carbon::now();
$londonCurrentTime= Carbon::now(&#039;Europe/London&#039;);
$tomorrow = Carbon::tomorrow();می‌تونیم برای متدهای بالا timezone تعیین کنیم ولی اگر اینکار رو نکنیم timezone پیشفرض UTC+0 در نظر گرفته میشه و اگه بخوایم براساس آرگومان‌های ورودی تاریخ و زمان ایجاد کنیم متد‌های استاتیک مخصوص این کار وجود دارند:Carbon::createFromDate($year, $month, $day, $tz); // ساخت تاریخ
Carbon::createMidnightDate($year, $month, $day, $tz); // ساخت تاریخ بر اساس زمان 00:00
Carbon::createFromTime($hour, $minute, $second, $tz); // ساخت زمان
Carbon::createFromTimeString(&amp;quot$hour:$minute:$second&amp;quot, $tz); // ساخت زمان براساس رشته
Carbon::create($year, $month, $day, $hour, $minute, $second, $tz); // ساخت تاریخ و زمانمیتونیم آرگومان‌های بالا رو null ارسال کنیم و Carbon مشخصات زمانی همین الان رو برای اون آرگومان در نظر میگیره.به کمک استاتیک متد parse به صورت مستقیم زمانی رو برای کربن تعریف کنیم تا براساس اون یک شی Carbon بسازیم:$lastDayOfFeb2021 = Carbon::parse(&#039;last day of February 2021&#039;); یا حتی به کمک این متد می‌‌تونیم براساس timestamp ورودی یک شی Carbon درست کنیم:$lastDayOfFeb2021 = $Carbon::parse(1614470400);تغییر تاریخدریافت تاریخ تنها کاری نیست که می‌تونیم با پکیج کربن انجام بدیم، بلکه می‌تونیم با استفاده از این پکیج تاریخ مورد نظر رو تغییر هم بدیم.now()-&gt;addDays(3);
now()-&gt;subDays(3);حتما به این بخش از مستندات کربن برای دیدن لیست کامل متد‌هایی که برای تغییر تاریخ بهشون نیاز داریم سر بزنید.قسمتی از توابع برای تغییر تاریخ در کربناستفاده از Getters و Settersوقتی از پکیج carbon استفاده می‌کنیم دست ما به عنوان توسعه‌دهنده باز هست، یعنی میتونیم از هر روشی که برامون خوشایند هست استفاده کنیم تا خواسته رو برآورده کنیم. مثلا در کنار روش‌های بالا می‌تونیم برای خواندن و تغییر تاریخ از Getterها و Setterها استفاده کنیم.$datetime = Carbon::now();
$datetime-&gt;year = 2024;
echo $datetime-&gt;year;اگه روش بالا رو دوست ندارید هیچ اشکالی نداره، یه نگاه به روش پایین بندازید:$datetime = Carbon::now();
$datetime -&gt;year(2024);
echo $datetime -&gt;year();حتی می‌تونیم از این متدها به صورت زنجیری استفاده کنیم:$dt= Carbon::now();
$dt-&gt;year(2024)-&gt;month(1)-&gt;day(7)-&gt;hour(20)-&gt;minute(30)-&gt;second(40)-&gt;toDateTimeString();اگه حس می‌کنید که getterها و setterها جواب نیاز شما هستند حتما به قسمت مربوط به خودشون تو مستندات کربن نگاه بندازید. (getterها در کربن و setterها در کربن)تعیین فرمت خروجیاگه می‌خواید خروجی شما برای کاربرها مناسب باشه کربن متد‌هایی داره که کمک کننده هستند:$dt = Carbon::create(1975, 12, 25, 14, 15, 16);
echo $dt-&gt;toDateString();                                    // 1975-12-25
echo $dt-&gt;toTimeString();                                  // 14:15:16
echo $dt-&gt;toDateTimeString();                          // 1975-12-25 14:15:16
echo $dt-&gt;toFormattedDateString();                 // Dec 25, 1975
echo $dt-&gt;toFormattedDayDateString();          // Thu, Dec 25, 1975
echo $dt-&gt;toDayDateTimeString();                   // Thu, Dec 25, 1975 2:15 PMاگه هیچکدوم از متدهای بالا خروجی مورد نظر شما رو تولید نمی‌کنند اصلا نگران نباشید چون هنوز متد ()format قابل استفاده هست.$dt = Carbon::create(1975, 12, 25, 14, 15, 16);
echo $dt-&gt;format(&#039;l jS \\of F Y h:i:s A&#039;);         // Thursday 25th of December 1975 02:15:16 PMاگه براتون سوال پیش اومده که مقادیر داخل متد ()format از کجا اومدند حتما یه نگاه به این بخش از مستندات PHP برای تعیین فرمت تاریخ و زمان بندازید.محاسبه فاصله زمانیبا کربن می‌تونیم فاصله بین ۲ زمان رو در واحدی که می‌خوایم مثل روز یا ساعت اندازه‌گیری کنیم:$now = Carbon::now();
$future = Carbon::now()-&gt;addHours(6);
echo $now-&gt;diffInHours($future);خروجی کد بالا عدد 6 هست ولی بیاید با یک مثال جالب‌تر این موضوع رو ادامه بدیم:$dtToronto = Carbon::createMidnightDate(2021, 1, 1, &#039;America/Toronto&#039;);
$dtVancouver = Carbon::createMidnightDate(2021, 1, 1, &#039;America/Vancouver&#039;);
echo $dtToronto-&gt;diffInHours($dtVancouver); 
echo $dtVancouver-&gt;diffInHours($dtToronto); اگر به خروجی نیاز داشته باشیم که برای انسان‌ها واضح تر باشه اونوقت ()diffForHumans جواب کار ما هست:echo Carbon::now()-&gt;subDays(5)-&gt;diffForHumans();               // 5 days agoادغام در لاراولمهم‌ترین نکته برای ادغام پکیج کربن با فریمورک لاراول نحوه تبدیل مقدار تاریخی که در دیتابیس ذخیره شده به Object کربن هست که امروزه این کار در لاراول با کمک مفهوم casting خیلی راحت‌تر شد:class Post extends Model {
    protected $casts = [
        &#039;published_at&#039; =&gt; &#039;datetime&#039;,
    ];
}دقت کنید که ستون‌های created_at و updated_at در لاراول به صورت پیشفرض به Object کربن تبدیل میشن و ما کافیه به فکر ستون‌های دیگه باشیم که لازم هست به date یا datetime تبدیل بشن.سفر به اعماق لاراولبرای درک بهتر ادغام لاراول و کربن بهتره که به اعماق کدهای لاراول بریم، اما قبل از آن اگر به مستندات لاراول نگاه کنیم با ۲ تابع کمکی()now و ()tomorrow روبرو میشم. این توابع در اصل از Carbon استفاده می‌کنند و طبق چیزی که تو کدهای لاراول در مسیر Illuminate\Foundation\helpers.php می‌بینیم اونها Object کربن برگشت میدن:تعریف تابع ()now در فریمورک لاراولدر این تابع کلاس Date وجود داره که در ابتدای فایل فراخوانی شده:use Illuminate\Support\Facades\Date;و اگر به فایلی که Date در اون تعریف شده بریم می‌بینیم که کلاس اصلی براساس DEFAULT_FACADE در متد resolveFacadeInstance  تعیین شده که اسمش DateFactory هست.الان لازمه که وارد DateFactory در مسیر Illuminate/Support/DateFactory.php بشیم تا بفهمیم متد ()now چطور کار می‌کنه، اگه به طور کامل DateFactory رو بررسی کنیم میبینیم که هیچ متدی با نام()now اونجا وجود نداره بنابراین متدجادویی(Magic Method) ()call__ اجرا میشه.در ()call__ مقدارdateClass$ وجود داره که Illuminate\Support\Carbonدر اون تعریف شده و بررسی میشه که آیا متدی که دنبالش هستیم(مثلا ()now) در  Illuminate\Support\Carbon وجود داره یا اینکه به صورت macro تعیین شده و اگر متد مورد نظر ما وجود داشت فراخوانی و اجرا میشه.باتوجه به نتایج بدست اومده لازمه وارد فایل Illuminate/Support/Carbon.php بشیم و در اونجا می‌بینیم که این کلاس در واقع یک نگه‌دارنده برای کلاس والد خودش(کلاس Carbon) هست و اجازه میده که بتونیم کارهایی مثل تعریف macro انجام بدیم.محل اصلی ارث‌بری از Carbon در لاراولالان وارد پکیج کربن میشیم یعنی جایی که کلاس Carbon تعریف شده و اونجا می‌بینیم که کلاس Carbon از کلاس DateTime در PHP ارث‌بری کرده ولی اگه دقت کنید می‌بینید که هیچ متد دیگه‌ای وجود نداره و این سوال برای ما پیش میاد که واقعا بقیه متد‌ها کجا تعریف شدند؟تعریف کلاس Carbon در پکیج Carbonخب دنبال متدی مثل ()now در این فایل گشتیم و دیدیم که در این کلاس یک متد بیشتر وجود نداره و می‌دونیم که در کلاس DateTime هم متدی با نام ()now وجود نداره ولی اگر بیشتر دقت کنیم می‌بینیم که در این کلاس از trait با نام Date استفاده شده که امکان داره متدهای ما اونجا تعریف شده باشند.وارد trait مورد نظر خودمون یعنی Date میشیم و می‌بینیم که در اونجا هم تابع ()now وجود نداره ولی traitهای مختلفی در اون تعریف شدند که اسم یکی از اون trait ها Creator هست پس بهتره مستقیما واردش بشیم.تابع now در پکیج Carbonاینجا پایان مسیر شگفت‌انگیز ما هست یعنی جایی که متدهای مورد نظر ما مثل ()now یا ()today تعریف شدند.همونطور که متوجه شدیم کلاس Carbon\Carbon در لاراول توسط Illuminate\Support\Carbon پیچیده شده که قابلیت Macroable بودن رو به تاریخ و زمان در لاراول اضافه کرده. (pull request مربوط به این ویژگی)به انتهای مقاله رسیدیم و با ویژگی‌های اصلی پکیج Carbon آشنا شدیم و می‌تونیم تو اکثر پروژه‌ها با اطمینان خاطر ازش استفاده کنیم و درکنارش تونستیم با سفر به اعماق کربن و لاراول ادغامش با لاراول رو درک کنیم.از اونجایی که این پکیج بسیار غنی هست اصلا نباید از مستنداتش غافل شد و در جایگاه یک توسعه‌دهنده باید بتونیم برای نیازهای پروژه به مستندات سر بزنیم و نیاز مورد نظر رو از اونجا استخراج کنیم.</description>
                <category>محمد مرکباتی</category>
                <author>محمد مرکباتی</author>
                <pubDate>Sat, 10 Jun 2023 18:12:34 +0330</pubDate>
            </item>
                    <item>
                <title>چرخه حیات درخواست در لاراول به زبان ساده</title>
                <link>https://virgool.io/laravel-community/laravel-request-lifecycle-in-plain-language-yazvdpnf5x7s</link>
                <description>چرخه حیات درخواست در لاراولاعتماد به نفس بیشتری پیدا می‌کنیم اگر بدونیم ابزاری که استفاده می‌کنیم چطور کار می‌کنه، در واقع اگر نحوه عملکرد ابزاری رو متوجه بشیم  احساس راحتی و اطمینان بیشتری نسبت بهش داریم. شناخت چرخه حیات درخواست در لاراول قدم اول برای داشتن تجربه توسعه بهتر با این فریمورک هست، یعنی باید بدونیم چه پروسه‌ای اتفاق میفته از زمانی که درخواست ارسال میشه تا زمانی که پاسخ برگشت داده میشه.خلاصه چرخه حیات درخواست‌های HTTP در لاراول: درخواست به نقطه ورود هدایت میشه، از لاراول نمونه‌سازی میشه، عناصر حیاتی راه اندازی میشن، service providerها ثبت و اجرا میشن و درخواست به سیستم روتینگ می‌رسه و از اونجا به یک route یا controller ارسال می‌شه و پاسخی تولید میشه که باید به نقطه ورود برگرده.قدم اول: نقطه وروددرخواست از سمت مرورگر به وب‌سرور(Apache / Nginx) می‌رسه و اون وب‌سرور براساس پیکربندی‌ خودش این درخواست رو به نقطه ورود تمامی درخواست‌ها در لاراول، یعنی فایل public/index.php هدایت می‌کنه و بر این اساس میشه گفت که این فایل نقطه شروع کننده بارگذاری بقیه فریمورک هست.هدایت درخواست ورودی به نقطه شروع در لاراولهمینطور تو این قدم autoloader که توسط Composer ساخته شده داخلindex.php لود می‌شه:فراخوانی autoloader در لاراولو بعدش یک نمونه از اپلیکیشن لاراول از فایل bootstrap/app.php بازیابی می‌شه:بازیابی نمونه‌ای از  اپلیکیشن لاراول قدم دوم: هسته‌هادرخواست ورودی براساس جنسش به HTTP Kernel یا Console Kernel ارسال میشه، این هسته‌ها در واقع نقش نقطه مرکزی رو دارند که درخواست‌ها براساس جنسشون از اونها عبور می‌کنند.تشخیص هسته اصلی براساس جنس درخواست در لاراولاگر درخواست ورودی از جنس HTTP باشه، برای مثال از سمت مرورگر اومده باشه هسته اصلی app/Http/Kernel.php در نظر گرفته میشه.اگر درخواست ورودی از جنس Console باشه، برای مثال از سمت ترمینال اومده باشه هسته اصلی app/Console/Kernel.php در نظر گرفته میشه.درخواست‌ها در هسته به متد ()handle وارد میشن که به طور خلاصه کل کار این متد دریافت درخواست و برگشت دادن پاسخ هست.ورود درخواست به متد ()handle و دریافت پاسخ از آنبه طور خلاصه میتونیم هسته‌های لاراول رو تو یه جمله خلاصه کنیم:هسته‌ها را به عنوان یک جعبه سیاه بزرگ ببینید که کل برنامه شما را نشان می دهد.هسته‌ها از کلاس والد دیگه‌ای ارث‌بری می‌کنند که داخل اون کلاس‌ها آرایه‌ای با نام bootstrappers$ وجود داره که کلاس‌های مختلفی به منظور راه‌اندازی در آن تعریف شدند. این کلاس‌ها قبل از اجرا شدن درخواست ورودی اجرا میشن چون باید ویژگی‌های حیاتی فریمورک مثل تشخیص محیط برنامه را راه‌اندازی کنند. در واقع پیکربندی هرچیزی که باید تا قبل از هندل شدن درخواست اصلی انجام بشه مثل پیکربندی سیستم مدیریت خطا، تنظیمات، لاگینگ و لود کردن facadeها و service providerها در این قسمت انجام میشه. همچنین لیستی از middlewareها  فقط داخل هسته‌ی HTTP تعریف شدند که درخواست ورودی باید قبل از هندل شدن توسط برنامه از اونها عبور کنه.قدم سوم: Service Providersلود کردن service providerها یکی از مهمترین عملیاتی بود که در پروسه‌ی راه‌اندازی اجزای اصلی در قدم دوم اتفاق می‌افتاد، service providerها به نوع خودشون مسئول لود کردن قسمت‌ها مختلف  فریمورک لاراول مثل روتینگ و ایونت‌ هستند.تمامی service providerها در آرایه‌ای با نام providers$ داخل فایل config/app.php قرار دارند که با serviceProviderهای موجود در هسته ادغام می‌شوند و در این قدم  آرایه مربوطه توسط لاراول پیمایش میشه  و به ازای تمامی providerهای موجود از اونها نمونه سازی می‌کنه. بعد از نمونه‌سازی اولیه از service providerها اول متد register روی هر کدوم از اونها صدا زده می‌شه که باعث ثبت شدنشون میشه و بعدش متد bootروی هر کدوم از اونها صدا زده میشه.اساسا ویژگی‌های اصلی لاراول مثل روتینگ در قالب service providerها پیکربندی و ارائه میشن و با توجه به همین موضوع میشه گفت که عملیات مربوط به اجرای service providerها که از قدم دوم شروع میشه و تا قدم سوم ادامه پیدا می‌کنه جزو مهمترین عملیات در چرخه حیات یک درخواست هست.قدم چهارم: مسیریابییکی از مهم‌ترین providerها RouteServiceProvider هست که وقتی متد boot این provider اجرا میشه سیستم روتینگ هم راه اندازی میشه. در این مرحله درخواست ورودی به سیستم روتینگ میرسه و فایل‌های مربوط به مسیریابی مثل api.php و web.php که در پوشه routesهستند لود میشن و اگر درخواست از جنس HTTP باشه از middlewareهای مورد نیاز عبور میکنه و به یک route یا controller میرسه.در مسیر راه درخواست‌هایی که از جنس Console هستند middleware تعریف نشده، پس اونها مستقیما به command یا کلاس مورد نظر خودشون برای اجرا شدن میرسن.  قدم پنجم: اتمام ماجرااگر درخواست ما از جنس HTTP باشه سیستم روتینگ در نهایت درخواست‌ها رو به controller ارسال میکنه ولی می‌تونه با حذف controller خودش مستقیما پاسخ مناسب رو برگردونه، controller به محض دریافت درخواست می‌تونه اقداماتی مثل دریافت اطلاعات از دیتابیس یا اعتبار سنجی فرم انجام بده و در نهایت این اطلاعات رو برای پردازش به viewمناسب ارسال کنه تا در اونجا یک پاسخ مناسب برای نمایش در مرورگر کاربر ایجاد بشه.پاسخ برگشت داده شده این پتانسیل رو داره که از middleware ها عبور کنه که امکان ایجاد تغییرات در پاسخ رو فراهم می‌کنند. در ادامه، این پاسخ به متد()handle در kernel می‌رسه و از اونجا برگشت داده میشه و به متد ()send در public/index.phpبرای نمایش در مرورگر وارد میشه.البته بازهم در نظر داشته باشید که اگر درخواست ما از جنس Console باشه در مسیر خودش با middleware روبرو نمیشه، پس در مسیر بازگشت هم همینطوری هست و پاسخ مورد نظر با middlewareها برخورد نداره و مستقیما به متد ()handle در kernel می‌رسه و از اونجا برگشت داده میشه و به متد ()sendکه در public/index.php برای نمایش در ترمینال وارد میشه.تونستیم کنار هم دید کلی از نحوه کار لاراول رو بدست بیاریم و مطمئنا از این به بعد همه چیز در لاراول کمتر عجیب و جادویی به نظر می‌رسه و می‌تونیم با اطمینان و تسلط بیشتر به توسعه ایده‌ها بپردازیم.</description>
                <category>محمد مرکباتی</category>
                <author>محمد مرکباتی</author>
                <pubDate>Wed, 03 May 2023 21:01:21 +0330</pubDate>
            </item>
                    <item>
                <title>مافیای پی‌پل: شگفت‌انگیزان دنیای تجارت و تکنولوژی</title>
                <link>https://virgool.io/@mhmmdtech/paypal-mafia-amazing-people-in-business-and-technology-xdfhquzb6fle</link>
                <description>  Fortune عکس دسته جمعی برخی از اعضای مافیای پی‌پل برای مجله  مافیای پی پال به گروهی از بنیانگذاران و کارمندان پی پال اطلاق می شود که پس از فروش پی پال به eBay شرکت را ترک کردند تا کسب و کارهای جدیدی را راه اندازی کنند و روی ایده های نوآورانه سرمایه گذاری کنند. اصطلاح &quot;مافیای پی پال&quot; زمانی رایج شد که مجله فورچون در مقاله نوامبر 2007 خود از این اصطلاح برای توصیف این گروه از افراد استفاده کرد.۱. نحوه شکل‌گیری و به قدرت رسیدن مافیای پی‌پلپیتر تیل(Peter Thiel) تاجر و سرمایه‌گذار آمریکایی بود که از دانشگاه استنفورد فارغ‌التحصیل شده، مکس لوچین(Max Levchin) نیز برنامه‌نویس اوکراینی بود که از دانشگاه دانشگاه ایلینوی فارغ‌التحصیل شده بود. مکس لوچین به توصیه یکی از آشنایانش به دیدار پیتر تیل در دانشگاه استنفورد رفت، آنها با یکدیگر درباره راه‌اندازی ایده‌های مختلف گفت‌وگو کردند و از آنجایی که در سال ۱۹۹۸ انتقال پول به آسانی عصر حاضر نبود آنها به همین منظور تصمیم گرفتند که امکان پرداخت پول را به صورت کاربر به کاربر از طریق کیف پول الکترونیکی فراهم ‌کنند و سرانجام شرکت فیلدلینک(Fieldlink) را بنا نهادند که پس از مدتی نامش به کانفینیتی(Confinity) تغییر پیدا کرد.در همان زمان کارآفرین خلاق دیگری به نام ایلان ماسک(Elon Musk) قصد داشت که یک بانک کاملاً آنلاین تأسیس کند. او در سن ۲۷ سالگی اولین استارتاپ خود(zip2) را به مبلغ 307 میلیون دلار به شرکت Compaq فروخته بود و حدود ۲۲ میلیون دلار  از این معامله بدست آورد. ماسک برای سرعت بخشیدن به روند راه‌اندازی استارت‌آپ جدید خود سریعاً تیمی از مهندسان را دورهم جمع کرد و سرانجام آنها توانستند در نوامبر سال 1999، بانک آنلاین x.com را راه‌اندازی کنند.تا پیش از ظهور Confinity و x.com، اگر کاربری تمایل داشت که از سایت‌های خرده‌فروشی مانند eBay وسیله‌ای تهیه کند، باید چک پرداخت را با پست به فروشنده ارسال می‌کرد؛ به همین منظور زمان لازم برای دریافت محصول و پرداخت وجه به‌شدت افزایش پیدا می‌کرد. این دو شرکت توانستند راه‌حل این مسئله را ارائه کنند و از این فرصت به خوبی استفاده کنند و به رشد قابل قبولی در همان سال‌های ابتدایی دست‌یابند.شرکت‌های Confinity و x.com همزمان در حال توسعه و پیشرفت بودند، Confinity خدمات محدودتری را نسبت به x.com ارائه می‌کرد ولی به دلیل استراتژی موفق بازاریابی‌اش رقیب اصلی آن محسوب می‌شد اما آتش رقابت از آنجایی زبانه کشید که eBay در اواسط ۱۹۹۹ تصمیم به خرید شرکت Billpoint گرفت و با این کار، رقیب جدید و قدرتمندی وارد بازی می‌شد.شرکت Confinity به سرعت در حال از دست دادن سرمایه‌‌های خود بود و در مقابل با آنکه x.com  پول و سرمایه بیشتری برای ذخیره داشت ولی درگیر مشکل عدم مقبولیت و محبوبیت، علی‌الخصوص پس از رسوایی مربوط به نقل‌و‌انتقالات مشکوک و عدم امنیت حساب‌ها بود و به همین دلیل دو شرکت تصمیم به ادغام با یکدیگر در مارچ سال ۲۰۰۰ گرفتند.نماد PayPal بر صفحه نمایش و کارت x.com در دستان ایلان ماسک و پیتر تیلشرکت جدید تحت عنوان x.com و با استراتژی و نشان PayPal که محصول اصلی شرکت Confinity بود، شروع به حرکت کرد و باتوجه به این موضوع تغییراتی نیز در ساختار مدیریتی شرکت جدید بوجود آمده بود که باعث ایجاد اختلاف و کندی در شرکت شده بود و منجر به از دست دادن مبلغ زیادی سرمایه شد.مهندسان confinity محصول اصلی خود یعنی PayPal را بر اساس دیتابیس Oracle توسعه داده بودند ولی x.com بر اساس تکنولوژی‌های مایکروسافت توسعه داده شده بود. به همین دلیل ایلان ماسک تصمیم گرفت پلتفرم شرکت جدید نیز بر اساس تکنولوژی‌های مایکروسافت پیش برود که همین تصمیم باعث ایجاد تنش بین کارمندان و ناراحتی بسیاری از مهندسان کانفینیتی شد.موضوع اختلاف میان مهندسان گوشه‌ای از مشکلات شرکت جدید بود، ماسک در جایگاه مدیرعامل به صورت همزمان در حال مبارزه با چندین چالش بود و از طرفی دیگر باید با رقیب سرسختی به نام eBay مبارزه می‌کرد. او شخصاً یک میلیون دلار برای خرید دامنه x.com هزینه کرده بود و قصد داشت که به جای تمرکز بر نام تجاری PayPal، از نام برند x.com استفاده کند. از این رو  پیش از سفرش به سیدنی برای گذراندن ماه عسل و تماشای مسابقات المپیک دستور حذف برند PayPal را از وب‌سایت شرکت داد و برای بار دیگر باعث برانگیختن خشم و ناراحتی بسیاری از کارمندان شد.دیوید ساکس که یکی از مدیران شرکت بود در غیاب ایلان ماسک از اعمال تغییرات در وب‌سایت امتناع کرد و همراه با کارمندانش به هیات‌مدیره اطلاع داد در صورتی که ایلان ماسک از مدیریت کمپانی کنار گذاشته نشود، به‌صورت جمعی استعفا خواهند داد و سپس اعضای هیأت مدیره در جلسه‌ای، تصمیم به برکناری ماسک از مقام مدیرعاملی گرفتند که با مخالفت ماسک روبرو شدند. اصرار ماسک برای حفظ مقامش نبود بلکه او بر روی موفقیت نهایی پروژه تمرکز داشت و به همین دلیل، پیتر تیل و مکس لوچین به او اطمینان دادند که کارها را بر اساس برنامه پیش خواهند برد و اجازه نخواهند داد که فقدان ماسک در مقام مدیرعامل ضربه‌ای به عملکرد شرکت وارد کندپس از برکناری ماسک از مدیریت، شرکت با چالش‌های بسیار زیادی روبه‌رو شد اما به هر نحوی که بود توانستند از آن شرایط بحرانی با موفقیت عبور کنند و سرانجام در ماه ژوئن سال ۲۰۰۱، نام شرکت به PayPal تغییر پیدا کرد.پس از مدتی در سال ۲۰۰۲ شرکت PayPal به صورت عمومی در بازار بورس Nasdaq با قیمت 13 دلار به ازای هر سهم عرضه شد و توانست با عرضه اولیه سهامش حدود ۶۳ میلیون دلار کسب کند و این پایان کار نبود، بلکه آنها در ادامه همان سال توانستند بیش از 50 درصد به ارزش خود بیافزایند.این رشد خیره‌کننده توجهات بسیار زیادی را به خودش جلب کرد و همینطور بسیاری از شرکت‌های بزرگ را به‌ خرید PayPal ترغیب کرد. در‌نهایت eBay که سابقه‌ی همکاری و رقابت طولانی‌مدت‌تری با تیم PayPal داشت موفق شد این استارتاپ را با پرداخت مبلغ ۱/۵ میلیارد دلار بخرد.معامله خرید PayPal توسط eBay  پس از حبابِ دات‌کام اتفاق افتاد و می‌توان به نوعی آن را یک سکوی پرتاب برای بنیانگذاران و کارمندانش جهت گام برداشتن به سمت ایده‌های نو و سرمایه‌گذاری‌های جدید برشمرد.ایلان ماسک به‌عنوان سهام‌دار ارشد که مالک 11.72 درصد سهام PayPal بود حدود 175 میلیون دلار از این معامله دریافت کرد. همچنین پیتر تیل نیز که مدیرعامل و مالک 3.7 درصد از سهام PayPal بود حدود 55 میلیون دلار از این معامله دریافت کرد و مکس لوچین هم که مالک 2.3 درصد از سهام شرکت بود حدود 34 میلیون دلار دریافت کرد.۲. دلایلی که باعث موفقیت این گروه شدشبکه اصلی مافیای پی‌پل بین 13 تا 20 نفر است اما به گفته‌ی پیتر تیل تعداد کلی اعضای مافیای پی‌پل می‌تواند به ۲۲۰ نفر هم برسد که اکثر این افراد پس از فروش PayPal به eBay نتوانستند با فرهنگ جدید شرکت کنار بیایند و  از آن استعفا دادند.آنها با توجه به تجاربی که در PayPal کسب کرده بودند، درست در زمانی که تقریبا بسیاری از افراد در دنیای تکنولوژی دست از کار کشیده بودند، به سمت توسعه ایده‌های نوآورانه خود رفتند، یا بر روی ایده‌های یکدیگر سرمایه‌گذاری کردند. آنها متعهد شدند تا دنیا را تغییر دهند و در این مسیر از یکدیگر حمایت کردند، هم‌اکنون می‌توان آن‌ها را جزو کسانی دانست که نبض دنیای تکنولوژی را در دست دارند.جمعی از اعضای مافیای پی‌پل به همراه ایده‌هایشان اولویت داشتن رفاقتشاید بسیاری مافیای پی‌پل را شبکه‌ای از افراد که در دنیای تکنولوژی تاریخ‌سازی کرده‎‌اند توصیف کنند ولی به عقیده پیتر تیل بهتر است برای توصیف آنها از واژه &quot;دوستی&quot; به جای &quot;شبکه&quot; استفاده شود.پیتر تیل -  &quot;من ترجیح می‌دهم از واژه‌ی “دوستی” به جای شبکه استفاده شود.  من فکر می‌کنم “دوستی” یک قطعه‌ی حیاتی در محل کار است. چیزی که در دنیای ما بسیار نادیده و دست‌کم گرفته می‌شود. البته اغراق آمیز است اگر بگویم در آخر همه آنها واقعاً دوستان خوبی بودند.&quot;به گفته‌ی پیتر تیل آنها در ابتدا بهترین دوستان خود را استخدام کردند، در ادامه نیز همه‌ی آن‌هایی را که فکر می‌کردند بتوانند دوستان خوبی برایشان باشند را به جمع خود افزودند. البته باید توجه کرد که اکثر این افراد جزو دانشجویان خلاق و پرتلاش دانشگاه‌ها همانند استنفورد و ایلینوی بوده‌اند.تمرکز بر هدف، انعطاف پذیر و تلاش بی‌وقفه برای یادگیریآنها توانایی یادگیری سریع چیزهای جدید و انجام کارها به روش‌های جدید را بدست آورده بودند، آنها این مهارت را یک ضرورت میدانستند و به همین دلیل در کنار خود گروهی از افراد که توانایی یادگیری سریع را داشتند جمع کردند تا بتوانند در دنیای پویا و در حال تغییر استارت‌آپ‌ها زنده بمانند. این دیدگاه آنها باعث شد تا PayPal بتواند حتی با وجود رقبای خارجی، کلاه‌برداران اینترنتی و بحران اقتصادی به سمت موفقیت حرکت کند.از آنجایی که در دوره مدیریت خود در PayPal درگیر مشکلات مختلفی بودند، این دیدگاه بسیار به آنها کمک کرد، در واقع فشار ناشی از مشکلاتی که پی‌پل با آنها سر و کار داشت این شرکت و مدیرانش را تبدیل به یک الماس کرد. برای مثال آنها ویژگی‌هایی را در پلتفرم خود اضافه کرده بودند که بسیار برای آن روزها نوآورانه بود و هنوز هم در عصر حاضر توسط استارت‌آپ‌های دیگر پیاده‌سازی می‌شود. یک نمونه از این ویژگی‌ها قابلیت ارسال پول برای افرادی که حساب پی‌پل ندارند بود، این افراد می‌بایست تا برای خود حسابی ایجاد کنند و حساب خودشان را تائید کنند و سپس می‌توانستند که به پولشان دسترسی داشته باشند.پس از حبابِ دات‌کام اوضاع دنیای تکنولوژی مناسب نبود، بین سال‌های 2002 تا 2004 عقیده بسیاری در سیلیکون‌ولی این بود که تکنولوژی مرده است و برای سرمایه‌گذاری و کارآفرینی باید حوزه‌های دیگری را انتخاب کرد که پیتر تیل این اتفاق را &quot;collective amnesia&quot; یا &quot;فراموشی جمعی&quot; می‌نامد، جایی که بسیاری از سرمایه‌گذاران به سمت روش‌های قدیمی سرمایه‌گذاری یعنی خانه و مسکن رفتند، اما این اتفاقات آنها را مأیوس نکرد و آنها قویا بر اهدافشان متمرکز بودند و خودشان را با شرایط تطبیق دادند.زمانی که این گروه با فروش PayPal به eBay موافقت کرد بسیاری این معامله را یک اشتباه بزرگ برای این افراد می‌دانستند و عقیده داشتند که آنها در حال از دست دادن تلاش چندین ساله خود هستند اما آنها از PayPal چیزهای با ارزش‌تری مانند تجربه، دانش و اعتماد به نفس برای راه‌اندازی ایده‌های جدید که توانایی تغییر دنیا را دارد بدست آوردند.درک منطقی‌تر از مفهوم کارآفرینیآنها می‌دانستند که فناوری تکراری نیست و هر لحظه مهم در تاریخ فناوری فقط یک بار اتفاق می افتد. در واقع آنها عقیده داشتند نقطه ای وجود دارد که چیزها برای اولین بار توسعه می یابند، و نقطه ای وجود دارد که عادی و استاندارد می شوند و حتی تعجب آور هم نیستند و همین تفکر باعث شد تا به سمت ایده‌هایی بروند که بسیار نوآورانه باشند و مشکل بخشی از جامعه را رفع کند.شروع راه‌اندازی یک کسب و کار شاید کار بسیار ساده‌ای نباشد اما یک کار غیر ممکن هم نیست؛ کارمندان شرکت‌های بزرگ گمان می‌کنند که شروع یک کسب‌وکار جدید آسان است و گاها دشواری شروع یک شرکت جدید را دست کم می‌گیرند و کارمندان شرکت‌های شکست خورده نیز تصور می‌کنند که این یک کار غیرممکن است و باید سراغ کار دیگر یا یک چیز ساده‌تر بروند اما آنها برخلاف سایر همکاران خود در دیگر شرکت‌ها درک منطقی‌تری نسبت به مفهوم کسب و کار داشتند و توانستند تصمیمات بهتری بگیرند. پیتر تیل - &quot;درس بسیار مهمی که آموخته‌ام این است که راه اندازی یک شرکت بزرگ نه آسان است و نه غیرممکن، جایی در این بین است. می‌توان گفت که واقعاً سخت است، اما شدنی است.&quot;همانطور که گفته شد آنها در هر لحظه درگیر رفع چندین مشکل بودند و به همین دلیل توانایی مدیریت شرایط در لحظات پرفشار و پراسترس را به نحو احسن یاد گرفته بودند و توانستند از این مهارت در شرایط مختلف استفاده کنند.آنها یک شبکه سنتی از نوابغ دنیای تکنولوژی نبودند بلکه با قوانینی که در پیش گرفته بودند (مانند اعتقاد به جوانان) و جسارت و اعتماد به نفسی که از ریسک‌های موفق خود (مانند سرمایه‌گذاری در Facebook) بدست آورده بودند تبدیل به یک شبکه موفق و مدرن شدند.دنبال نکردن کورکورانه قوانینمخالف جمع بودن آسان است، اما مخالف جمع بودن و در مسیر درست بودن بسیار نادر یا دشوار است. پیتر تیل فردی بود که همیشه به دنبال اسرار و راه‌های متفاوت میگشت و اصولا سعی میکرد تا از مسائل و راه‌های رایج فاصله بگیرد.کیت رابویس - &quot;هنر در بیشتر زمینه‌ها این است که قانون آنچه که انجام می‌دهید را خوب و دقیق درک کنید و سپس بدانید که چه زمانی باید منحرف شوید.&quot;این رویکرد عدم پیروی کورکورانه از روندها یکی از ویژگی های بزرگی بود که به موفقیت پی پال حتی در چنین مکان رقابتی مانند سیلیکون ولی  کمک کرد. نکته کلیدی این است که آگاهانه باید برخی از قوانین را زیر پا گذاشت، اما این باید یک استراتژی فکر شده باشد که رویکرد و روش منحصر به فرد ما را برای ایجاد و مدیریت برجسته کند یعنی ابتدا لازم است تا خوب به همه قوانین تسلط داشته و سپس آنها را زیر پا بگذاریم.برای مثال آنها قانون استخدام مخصوص به خود را داشتند که در آن روزها متفاوت با قوانین رایج دیگر شرکت‌ها در سیلیکون ولی بود. آنها برای استخدام مدیر در بخش‌های مختلف روند را تغییر دادند و تصمیم گرفتند که بهترین کارمندان هر بخش بتوانند به این مقام برسند، برای مثال بهترین کارمند بخش مالی تبدیل به مدیر بخش مالی می‌شد.همچنین گاها می‌توان نسبت به بهترین روش‌ها  شک کرد زیرا پیروی کورکورانه از این روش‌های می‌تواند ما را در چرخه باطل رقابت، کپی برداری و تکرار قرار دهد و برای همین می‌توان گفت که بهتر است تا بهترین روش مناسب خودتان را پیدا کنید و از یک چیز از پیش گفته شده به صورت کورکورانه پیروی نکنید.کیت رابویس - &quot;بهترین شیوه ها فقط شما را به تکرار چیز دیگری هدایت می‌کند. شما می‌توانید بهترین روش‌ها را قرض بگیرید، اما باید بدانید که چه موقع به طور عمدی از «بهترین شیوه‌ها» پیروی نکنید، یا فقط در وسط چرخه قرار می‌گیرید که هدف نیست.&quot;در آخر درسی که می‌توانیم از این مورد بگیریم آن است که در مورد چیزهایی که همگان برآن توافق دارند مانند روندها و بهترین روش‌ها شک داشته باشیم. کاری که می‌توانیم به جای پیروی کورکورانه از آنها انجام دهیم این است که آگاهانه تصمیم بگیریم که کدام قوانین را زیر پا بگذاریم و چه کارهایی را میتوانیم منحصرا انجام دهیم.داشتن فرهنگ مشترکآن روزها در تیم PayPal همه سعی می‌کردند از یکدیگر فارغ از اینکه چه جایگاهی دارند، حمایت کنند. دغدغه اصلی آنها بر ساختن چیزهای جدید و ویژگی‌های خلاقانه بود. آنچه در مورد فرهنگ مافیای پی‌پل نیز قابل توجه است، توانایی آنها در کنترل غرور خود، برای اتحاد و نفع جمعی بود.یکی از زیباترین تعریف ها در مورد فرهنگ آن روزهای پی‌پل توسط David Sacks ارائه شده است:دیوید ساکس - &quot;ما هرگز در مورد عناوین فکر نمی‌کردیم زیرا بیش از حد روی چیزهای با ارزش متمرکز بودیم و نمیتوانستیم به این فکر کنیم که چه کسی معاون بازاریابی و چه کسی مدیر ارشد بازاریابی است.&quot;با وجود درگیری‌های خارجی(رقبا، سیاست‌های دولتی و کلاه‌برداران اینترنتی و...)، عواملی مانند  تفکر مشترک، توافق جمعی و اصول اساسی باعث شده بود تا درگیری‌های داخلی آنها به حداقل برسد، به یکدیگر نزدیک شوند و تمرکز خود را به سمت پیشرفت ببرند.۳. آنها چه کردند و چه می‌کنند؟در لیست به زیر گوشه‌ای از فعالیت‌های اعضای اصلی مافیای پی‌پل اشاره شده است:پیتر تیل: مدیرعامل و مالک 3.7 درصد از سهام PayPal بود که پس از فروش آن به eBay اقدام به ایجاد شرکت سرمایه‌گذاری Clarium Capital کرد. سرمایه‌گذاری 500 هزار دلاری او در  فیسبوک از بهترین تصمیمات او شناخته می‌شود، این تصمیم نام او را در میان اولین سرمایه‌گذاران این شرکت قرار می‌دهد. همچنین Palantir Technologies که در حوزه تجزیه و تحلیل داده‌ها فعالیت می‌کند از دیگر شرکت‌هایی است که او راه اندازی کرده.مکس لوچین: CTO سابق PayPal بود که پس از خرید آن توسط eBay، اقدام به تاسیس Slide و Affirm کرده و همینطور جزو سرمایه‌گذاران اولیه در شرکت Yelp می‌باشد.ایلان ماسک:  سهام‌دار ارشد و مدیرعامل سابق PayPal بود که در حال حاضر جزو برجسته‌ترین اشخاص دنیای تکنولوژی و مالک و بنیان‌گذار شرکت‌هایی مثل OpenAI ،Tesla ،The Boring Company ،OpenAI SpaceX و Twitter نیز می‌باشد. رید هافمن: معاون اجرایی سابق PayPal، او جزو بنیان‌گذاران LinkedIn بوده و در کنار پیتر تیل به عنوان یکی از سرمایه‌گذاران اولیه در Facebook نیز شناخته می‌شود، مجله نیویورک تایمز به او لقب سلطان ارتباطات را داده است.کیت رابویس: از مدیران سابق PayPal که بعدها در شرکت‌هایی مثل LinkedIn، Slide و Square وظایف مهم مدیریتی را برعهده گرفت و به همراه پیتر تیل از بنیانگذاران Founders Fund می‌باشد. او همچنین سرمایه‌گذاری‌هایی نیز در Linkedin ،Slide ،Youtube ،Yelp و Geni.com انجام داده و به عقیده بسیاری یکی از افراد پر قدرت سیلیکون ولی می‌باشد.رولوف بوتا: او که یکی از مدیران سابق PayPal بود، به یکی از معروف‌ترین شرکت‌های سرمایه‌گذاری سیلیکون ولی یعنی Sequoia پیوست. او همچنین جزو اعضای سابق هیئت مدیره YouTube پیش از پیوستن به گوگل نیز می‌باشد.کین هاروی: او یکی از مدیران سابق PayPal بوده که به همراه پیتر تیل، لوک نوسک و شان پارکر اقدام به تاسیس شرکت سرمایه‌گذاری Founders Fund کرده‌اند.لوک نوسک: او یکی از مدیران سابق PayPal بوده که به همراه پیترتیل، کین هاروی و شان پارکر اقدام به تاسیس شرکت سرمایه‌گذاری Founders Fund کردند.دیوید ساکس: او نیز جزو مدیران سابق PayPal بوده و پس از ترک شرکت اقدام به تاسیس Geni.com و Yammer کرده است.استیو چن: او جزو مهندسان PayPal بوده که به همراه جاوید کریم و چاد هارلی جزو بنیان‌گذاران YouTube می‌باشند.چاد هارلی: او جزو توسعه‌دهندگان PayPal بوده که به همراه استیو چن و جاوید کریم جزو بنیان‌گذاران YouTube می‌باشند.جاوید کریم: او جزو مهندسان PayPal بوده که به همراه استیو چن و چاد هارلی جزو بنیان‌گذاران YouTube می‌باشند.راشل سیمون: او جزو مهندسان PayPal بوده که به همراه جرمی استاپلمن جزو بنیان‌گذاران Yelp می‌باشد.جرمی استاپلمن: معاون سابق بخش تکنولوژی PayPal بوده که به همراه راشل سیمون جزو بنیان‌گذاران Yelp می‌باشد.پرمال شاه: مدیرمحصول سابق PayPal بود که پس از فروش آن به eBay استارت‌آپ Kiva را ایجاد کرد.مسلما PayPal در یکی از سخت‌ترین دوره‌های تاریخ تکنولوژی راه اندازی شد زیر در آن زمان دید منفی نسبت به شرکت‌های دنیای تکنولوژی میان افکار عمومی به دلیل حباب دات‌کام وجود داشت و می‌توان گفت که جهان کسب و کارهای اینترنتی در آشوب بود؛ با این حال آنها توانستند شرایط را مدیریت کنند و با فروش درست و به موقع PayPal از آن بحران سربلند خارج شوند.بنیانگذاران PayPal، روابط دوستانه محکمی را بین کارمندان ایجاد کرده بودند. این روابط به شدت عمیق می‌باشد، تا جایی که بسیاری از آنها پس از ترک شرکت به اعتماد و حمایت از یکدیگر ادامه دادند و ایده‌های مشترکی را به کمک یکدیگر پیش بردند. اعضای مافیای PayPal، یعنی گلچینی از نوابغ تجارت و تکنولوژی در حال حاضر الهام بخش بسیاری از جوانان هستند. آنها نمادی از دنیای جدید هستند، دنیایی که در آن ایده‌های خلاقانه، دوستی و همراهی رمز موفقیت جوانان می‌باشد. </description>
                <category>محمد مرکباتی</category>
                <author>محمد مرکباتی</author>
                <pubDate>Mon, 02 Jan 2023 08:32:29 +0330</pubDate>
            </item>
                    <item>
                <title>کاوش در PHP 8</title>
                <link>https://virgool.io/laravel-community/%DA%A9%D8%A7%D9%88%D8%B4-%D8%AF%D8%B1-php-8-hpexykp2qtbb</link>
                <description>بررسی نسخه هشتم PHP به همراه معرفی منابع یادگیری در این مقاله در مورد PHP 8 صحبت می‌کنیم. به نظرم مطالعه تاریخچه تغییرات در کنار معرفی منابع آموزشی این فرصت رو به ما می‌ده تا با چیزی عمیق تر آشنا بشیم و نسبت بهش تسلط بیشتری پیدا کنیم.تمام تلاشم رو کردم تا بتونم برای هر قسمت منابع مختلفی معرفی کنم ولی متاسفانه به‌خاطر قوانین ویرگول این کار شدنی نیست. برای همین تو نسخه فارسی این سری از مقالات نتونستم اینکار رو انجام بدم و به‌جاش در آخر یک‌سری منابع کلی معرفی کردم ولی اگر دوست دارید تمام منابع دسترسی داشته باشید لطفا نسخه انگلیسی این مقاله تو لینکدین یا مدیوم رو ببینید، اونجا برای هر قسمت منابع مناسبی رو معرفی کردم.بررسی *.۸.۰۱. پشتیبانی از Named Arguments: به کمک این ویژگی مشخص می‌کنیم که آرگومان ها بر اساس نام پارامتر به جای موقعیت پارامتر به یک تابع پاس داده بشند. برای درک بهتر لازمه تا مثالی ببینیم:array_fill(start_index: 0, count: 100, value: 50);۲. اضافه شدن Attributes: راهی برای اضافه کردن متادیتا برای کلاس‌ها، متدها، پراپرتی‌ها و توابع هستند و برای افزایش کیفیت کدها خوبه که ازش استفاده کنیم.۳. توانایی تعریف و تعیین پراپرتی‌ها در ورودی constructor:  روشی کوتاه برای این است که پارامترهای سازنده به یک ویژگی در سازنده تخصیص داده شوند. برای درک بهتر لازمه تا مثالی ببینیم:class User { 
    private string $name;
    public function __construct(string $name) {
        $this-&gt;name = $name; } 
}مثال بالا میتونه به روش پایین هم نوشته بشه:class User {
    public function __construct(private string $name) {}
}۴. پشتیبانی از Union Types: با کمک این ویژگی امکانی بوجود اومده تا بتونیم برای یک متغیر تایپ‌های قابل قبول مختلفی رو تعیین کنیم، برای درک بهتر لازمه تا مثالی ببینیم:class Example {
    private int|float $foo;
    public function squareAndAdd(float|int $bar): int|float {
        return $bar ** 2 + $foo; 
    }
}۵. پشتیبانی از match expression: مثل switch expression، برای بررسی یک مقدار به کار میره؛ در switch تمرکز روی مقدار هست(==) اما در match تمرکز بر مقدار و جنس اون متغیر(===) هست. برای یادگیری این مطلب میتونید منابع مختلف موجود مثل(این مطلب یا این مطلب) رو مطالعه کنید.۶. افزوده شدن قابلیت Nullsafe: با این قابلیت میتونیم به متد یا پراپرتی یک شی در صورتی که وجود داشته باشه دسترسی داشته باشیم ولی اگر وجود نداشته باشه null برگردونده میشه به جای Exception، برای درک بهتر لازمه تا مثالی ببینیم:$address = $customer-&gt;getAddress();
$country = $address ? $address-&gt;getCountry() : null;مثال بالا میتونه به روش پایین هم نوشته بشه:$country = $customer-&gt;getAddress()?-&gt;getCountry(); ۷. افزوده شدن WeakMap: کالکشنی از مجموعه‌ با جفت‌‌های Key/Value است که کلید آن باید یک شی باشد. ۸. افزوده شدن ValueError: نوع جدیدی از Error ها برای موقعی که نوع یک متغیر درست هست ولی مقدارش اشتباهه برای مثال پاس دادن یک عدد منفی به یک متغیر وقتی که متغیر انتظار عدد مثبت داشت.۹. تغییر رفتار برای فراخوانی متدهای همنام در trait ها: فرض کنید داخل یک trait تابعی دارید که با یک تابع از trait دیگه هم‌نام هست. شما این 2 تا trait رو باهم داخل یک کلاس فراخوانی کردید، تو این نسخه باید به صورت دستی مشخص کنید که منظور شما دقیقا کدوم trait هست یعنی به این صورت: T2::func  یا T1::func۱۰. استفاده از spaceship operator(&lt;=&gt;) در مرتب‌سازی:  برای مرتب کردن مقادیر استفاده از از عملگرspaceship operator (&lt;=&gt;) توصیه شده. برای درک بهتر لازمه تا مثالی ببینیم:// Old
usort($array, fn($a, $b) =&gt; $a &gt; $b);
// New
usort($array, fn($a, $b) =&gt; $a &lt;=&gt; $b);۱۱. پشتیبانی از mixed type: زمانیکه متغیر ما قابلیت پذیرفتن انواع مختلف مقادیر رو داره برای مشخص کردن type به جای نام‌بردن از تک تک type ها خوبه که از mixed استفاده می‌کنیم. باتوجه به مستندات PHP، در واقع mixed معادل union type به این نوع است: object|resource|array|string|int|float|bool|null۱۲. امکان تعیین static به‌عنوان نوع بازگشتی از متدها: در این نسخه این قابلیت وجود داره که بتوان مقدار static را از یک متد برگرداند، برای درک بهتر لازمه تا مثالی ببینیم:class Test {
    public function create(): static {
        return new static(); 
    }
}بررسی *.۸.۱۱. پشتیبانی از رشته‌ها به عنوان کلید‌ در unpack کردن آرایه:  هنگام unpack کردن یک آرایه (بازکردن آرایه با پیشوند &quot;…&quot;) امکان پشتیبانی از رشته‌ها به عنوان کلید‌ آن آرایه نیز وجود دارد، برای درک بهتر لازمه تا مثالی ببینیم:$arr1 = [1, &#039;a&#039; =&gt; &#039;b&#039;];
$arr2 = […$arr1, &#039;c&#039; =&gt; &#039;d&#039;]; //[1, &#039;a&#039; =&gt; &#039;b&#039;, &#039;c&#039; =&gt; &#039;d&#039;]۲. پشتیبانی از تعیین آرگومان‌های با نام پس از unpacking: ویژگی named argument از نسخه ۸ به PHP اضافه شده و در این نسخه امکانی وجود دارد تا پس از unpacking آرایه‌ها به عنوان ورودی یک تابع بتوان از named argument نیز استفاده کرد. برای درک بهتر لازمه تا مثالی ببینیم:function printNumbers(int $a, int $b, int $c) {
    echo $a.&#039; &#039;.$b.&#039; &#039;.$c;
}
printNumbers(...[5, 7], c: 9); // Output: 5 7 9۳. افزوده شدن Enumerations: مجموعه‌ای از چند آیتم مرتبط باهم به عنوان مقادیر محدود و مجاز برای یک چیز هستند. این ویژگی تو زبان‌های برنامه‌نویسی دیگه مثل Java هم وجود داره و پشتیبانی از اون در PHP یک اتفاق نسبتا بزرگ بوده.۴. افزوده شدن Fibers: در اصل، فیبر یک بلاکی از کد هست که استک (متغیرها و...) خودش رو حفظ می کنه و جدا از برنامه اصلی اجرا میشه.۵. افزوده شدن Intersection types: توسط این ویژگی میشه تعیین کرد تا متغیر تعیین شده توسط برنامه نویس به صورت همزمان  از چه نوع class یا interface هایی لازم است باشند. این برعکس Union Types هست که اجازه میده تا متغیر متعلق به یکی از type های اعلام شده توسط برنامه‌نویس باشه. برای درک بهتر لازمه تا مثالی ببینیم:function count_and_iterate(Iterator&amp;\Countable $value) {
    foreach($value as $val) {} 
    count($value);
}تو مثال بالا مقدار value$ باید به صورت همزمان از Iterator و Countable تاثیر گرفته باشه، وجود foreach نمایش تاثیرپذیری از Iterator و وجود ()count نمایش تاثیرپذیری از Countable هست.۶. افزوده شدن نوع بازگشتی never: این type به عنوان نوع خروجی در توابع یا متدهایی استفاده میشه که در صورت اجرای اونها برنامه متوقف میشه(استفاده از die، exit یا Exception). برای درک بهتر لازمه تا مثالی ببینیم:function redirect(string $url): never {
    header(&#039;Location: &#039; . $url); 
    exit();
}تفاوت void با never در این هست که never تضمین میکنه برنامه پس از اجرای این تکه کد برنامه متوقف میشه یا Exception ایجاد میشه و چیزی از این تابع برگردانده نمیشه(حتی ;return) ولی یکی از علائم void این هست که برنامه پس از اجرای تکه کد ادامه پیدا می‌کنه.۷. افزوده شدن کلمه کلیدی readonly: کلمه کلیدی که جلوگیری میکنه از تغییر مقدار یک پراپرتی پس از نمونه‌سازی اولیه. نمونه کد پایین این مسئله رو بهتر توضیح میده:class User {
    public readonly string $username;
    public function __construct(string $username) {
        $this-&gt;username = $username; 
    }
}

$user = new User(&#039;joe&#039;,&#039;secure&#039;);
$user-&gt;username = &#039;john&#039;;
// Fatal error: Uncaught Error: Cannot modify readonly property User::$usernameدر واقع بعد از نمونه‌سازی اولیه از کلاس User دیگه امکانی برای تغییر مقادیرش وجود نداره و همونطور که در کد نشون داده شده بعد از اقدام برای تغییر، Fatal Error نمایش داده میشه.۸. پشتیبانی از تعیین کلمه کلیدی final برای constant در class: از کلمه کلیدی final می‌توان برای تعیین اینکه مقدار ثابت و متد در کلاس غیرقابل تغییر باقی بماند استفاده کرد. با قرار دادن پیشوند final از تغییر یک متد یا ثابت توسط کلاس های فرزند جلوگیری می‌شود. اگر خود کلاس پیشوند final داشته باشد، نمی توان از آن ارث‌بری کرد.۹. افزوده شدن تابع ()array_is_list: تابعی که بررسی میکنه آیا آرایه ما یک list هست یا نه. یک آرایه زمانی list در نظر گرفته میشه که کلیدهای اون به صورت عددی و متوالی از صفر(۰) شروع بشن.۱۰. منسوخ شدن امکان تبدیل float به int: تبدیل ضمنی float به int که باعث از بین رفتن مقدار اعشاری میشه از این نسخه منسوخ شده. این روی کلیدهای آرایه، تعیین نوع int به عنوان مقدار ورودی یا خروجی و همینطور بر عملگرهایی که روی int کار میکنن تایر میذاره. نمونه کد پایین این مسئله رو بهتر توضیح میده:$a = [];
$a[15.5]; // deprecated, as key value loses the 0.5 component
$a[15.0]; // ok, as 15.0 == 15بررسی *.۸.۲۱. پشتیبانی از readonly class: این ویژگی باعث میشه تا تمام پراپرتی‌های موجود در کلاس ویژگی readonly دریافت کنند.class Post {
    public function __construct(
        public readonly string $title,
        public readonly Author $author,
        public readonly string $body,
        public readonly DateTime $publishedAt,
        ) {}
}مثال بالا میتونه به روش پایین هم نوشته بشه:readonly class Post {
    public function __construct(
        public string $title, 
        public Author $author,
        public string $body,
        public DateTime $publishedAt,
        ) {}
}در صورتی امکان ارث‌بری از کلاس های readonly وجود داره که کلاس فرزند هم دارای این ویژگی باشه.2. منسوخ شدن پراپرتی‌های داینامیک: استفاده از این ویژگی در این ورژن منسوخ شده و از نسخه ۹ زبان PHP استفاده از این ویژگی باعث ایجاد ErrorException میشه. در صورت استفاده از تکه کد زیر با پیامی در مورد منسوخ شدن این ویژگی مواجه میشیم.class Post {
}
// …
$post = new Post();
$post-&gt;name= &#039;Name&#039;;
var_dump($post-&gt;name); // &#039;Name&#039;
// Deprecated: Creation of dynamic property Post::$name is deprecatedدر نظر داشته باشید که هنوز هم می‌تونیم از ()get__ و ()set__ برای کار با مقادیر داینامیک استفاده کنیم، به مثال زیر توجه کنید:class Post {
    private array $properties = [];
    public function __set(string $name, mixed $value): void {
        $this-&gt;properties[$name] = $value;
    }
}
// …
$post-&gt;name = &#039;Name&#039;;اگه هنوز هم میخواید که از مقادیر داینامیک استفاده کنید ولی تمایلی به پیاده‌سازی ()get__ و ()set__ ندارید راه بهتری هم وجود داره و اون استفاده از یک attribute با عنوان AllowDynamicPropertiesدر PHP هست، به مثال زیر توجه کنید:#[AllowDynamicProperties]
class Post {
}
$post = new Post();
$post-&gt;name = &#039;Name&#039;; // All fine3. اضافه شدن اکستنشن Random: در این نسخه یک اکستنشن PHP جدید برای تولید عدد تصادفی اضافه شده است که مشکلات مربوط به توابع موجود رو برطرف میکنه. تمام کلاس‌های جدید معرفی شده در اکستنشن random تحت namespace با عنوان Random\ هستند. کلاس Random\Randomizer به منظور ایجاد یک API شی گرا برای دسترسی به تمام عملکردهای تولید اعداد تصادفی ارائه شده است، به مثال زیر توجه کنید:$r = new Random\Randomizer();
echo $r-&gt;getInt(1, 100);4. پشتیبانی از انواع برگشتی true، false و null:  از این نسخه امکان استفاده از مقادیر true false و null به عنوان نوع برگشتی یک تابع یا متد رو داریم. برای جلوگیری از افزونگی نمی‌تونیم از انواع true، false و bool در union type استفاده کنیم. به مثال زیر توجه کنید: function alwaysReturnsFalse(): false {}
function alwaysReturnsNull(): null {}
function alwaysReturnsTrue(): true {}5. پشتیبانی از DNF types: این ویژگی اجازه استفاده از union type و intersection type در کنار هم رو به توسعه‌دهنده میده. به مثال زیر توجه کنید:function generateSlug((HasTitle&amp;HasId)|null $post)  {
    if ($post === null) {
        return &#039;&#039;;
    }
return strtolower($post-&gt;getTitle()) . $post-&gt;getId();
}در صورت نوشتن مقادیری که در فرم DNF نباشن با parse error مواجه میشیم. به مثال زیر توجه کنید:A&amp;(B|D)
// Can be rewritten as (A&amp;B)|(A&amp;D) to avoid parse error
A|(B&amp;(D|W)|null)
// Can be rewritten as A|(B&amp;D)|(B&amp;W)|null to avoid parse error6. امکان تعیین constدر trait: از این نسخه توسعه‌دهنده‌ها امکان استفاده از constant در trait رو دارند و این constant ها میتونن همراه با final یا access modifier ها باشند، به مثال زیر توجه کنید:trait FooBar {
    const FOO = &#039;foo&#039;;
    private const BAR = &#039;bar&#039;;
    final const BAZ = &#039;baz&#039;;
    final protected const QUX = &#039;qux&#039;;
}

class Test {
    use FooBar;
}

echo Test::BAZ; // &#039;bar&#039;7. پشتیبانی و حفاظت از مقادیر حساس: یک روش معمول در هر کدبیسی ارسال خطاها به سرویسی هست که اونها رو ردیابی میکنه و در صورت بروز مشکل به توسعه دهندگان اطلاع میده. توجه کنید که این پیغام میتونه شامل مقدار واقعی اطلاعات حساس مثل متغیرهای محیطی، گذرواژه‌ها یا نام‌های کاربری باشه که امکان داره در پیام‌های خطا، گزارش‌های خطا، گزارش‌های برنامه‌ها و غیره ختم نمایش داده بشه که ناامن و بسیار نامطلوب است. از این نسخه امکانی به وجود اومده تا بشه چنین پارامترهای حساسی رو با attribute جدیدی با نام SensitiveParameter\ علامت گذاری کرد. هر پارامتری که به عنوان پارامترحساس علامت‌گذاری شده باشه در قسمت خطاها  نمایش داده نمیشه. بنابراین، می‌تونید اونها رو بدون نگرانی با سرویس‌های شخص ثالث برای ردیابی خطاها به اشتراک بگذارید.function login(
    string $user,
    #[\SensitiveParameter] string $password
) {
    // …
    throw new Exception(&#039;Error&#039;);
}
 
login(&#039;root&#039;, &#039;root&#039;);
 
Fatal error: Uncaught Exception: Error in login.php:8
Stack trace:
#0 login.php(11): login(&#039;root&#039;, Object(SensitiveParameterValue))
#1 {main}
  thrown in login.php on line 8با گوشه‌ای از ویژگی‌ها و تغییرات PHP 8 آشنا شدیم، خوشحال میشم که نظرات و پیشنهادات شما رو بدونم تا بتونم مطالب بهتری بنویسم. همونطور که گفتم بخاطر یکسری محدودیت‌ها نتونستم تمامی منابع رو معرفی کنم، لطفا برای دیدن منابع کامل لطفا به نسخه انگلیسی این مقاله تو لینکدین یا مدیوم سر بزنید، ولی اگر فرصت این‌کار رو ندارید این چندتا منبع رو داشته باشید.PHP TutorialProgram With GIO - PHP PlaylistPHP WatchStitcherتا زمانی که نسخه ۸ درحال توسعه باشه، این مقاله هم در حال کامل شدن هست و مطابق با ارائه نسخه جدید به‌روز میشه تا از آخرین تغییرات باخبر بشید.</description>
                <category>محمد مرکباتی</category>
                <author>محمد مرکباتی</author>
                <pubDate>Wed, 09 Nov 2022 20:33:49 +0330</pubDate>
            </item>
                    <item>
                <title>کاوش در PHP 7</title>
                <link>https://virgool.io/@mhmmdtech/%DA%A9%D8%A7%D9%88%D8%B4-%D8%AF%D8%B1-php-7-lriihhhd2shj</link>
                <description>بررسی نسخه هفتم PHP به همراه معرفی منابع یادگیریدر این مقاله در مورد PHP 7 صحبت می‌کنیم. به نظرم مطالعه تاریخچه تغییرات در کنار معرفی منابع آموزشی این فرصت رو به ما می‌ده تا با چیزی عمیق تر آشنا بشیم و نسبت بهش تسلط بیشتری پیدا کنیم.تمام تلاشم رو کردم تا بتونم برای هر قسمت منابع مختلفی معرفی کنم ولی متاسفانه به‌خاطر قوانین ویرگول این کار شدنی نیست. برای همین تو نسخه فارسی این سری از مقالات نتونستم اینکار رو انجام بدم و به‌جاش در آخر یک‌سری منابع کلی معرفی کردم ولی اگر دوست دارید تمام منابع دسترسی داشته باشید لطفا نسخه انگلیسی این مقاله تو لینکدین یا مدیوم رو ببینید، اونجا برای هر قسمت منابع مناسبی رو معرفی کردم.*.۷.۰زبان PHP در نسخه هفتم پیشرفت‌های زیادی داشته، مثلا سرعتش تقریبا 2 برابر شده و مقدار استفاده از حافظه هم کاهش پیدا کرده، ویژگی‌هایی هم بهش اضافه شده که گوشه‌ای از اونها رو باهم بررسی می‌کنیم:۱. افزوده شدن قابلیت تعیین نوع مقادیر scalar: از این نسخه میشه نوع پارامتر‌های ورودی و خروجی رو به صورت کامل‌تری تعریف کنیم، در واقع میتونیم تعیین کنیم که کاربر string، int، float و bool وارد کنه.۲. افزوده شدن عملگر Null coalescing (??): گاها نیاز هست تا بررسی کنیم که آیا یک متغیر خالی هست یا نه، تو این نسخه کار توسعه‌دهنده‌هارو با اضافه کردن این عملگر راحت‌تر کردند.۳. افزوده شدن عملگر spaceship(&lt;=&gt;): این عملگر برای مقایسه 2 تا عبارت استفاده میشه، اگر 2 عبارت مساوی باشن مقدار 0 برمی‌گردونه، اگر عبارت سمت چپ(عبارت اول) بزرگ‌تر باشه مقدار 1 برمی‌گردونه و اگر عبارت سمت راست(عبارت دوم) بزرگ‌تر باشه مقدار ۱- برمی‌گردونه.۴. افزوده شدن define برای تعریف ثابت‌‌ها: همونطور که تو نسخه ۵ دیده بودیم، میشد با const مقادیر ثابت رو تعریف کرد ولی از اونجایی که یه‌سری محدودیت داشت با اضافه شدن define دست توسعه‌دهنده باز تر هست و می‌تونه براساس موقعیتی که وجود داره تصمیم بگیره.۵. افزوده شدن anonymous class: توانایی ایجاد کلاس ناشناس از نسخه هفتم به PHP اضافه شد، یکی از موارد کاربردش هم میشه به کلاس مربوط به migrationها در لاراول اشاره کرد که به این صورت تعریف میشن.۶. افزوده شدن قابلیت فراخوانی توابع با call: با این روش فراخوانی توابع می‌تونیم یک object رو به تابع پاس بدیم تا مقدار this$ اون تابع نسبت به اون object تعیین بشه.۷. افزوده شدن قابلیت استفاده از کلمه کلیدی use به صورت گروهی: لازم نیست کلاس‌هایی که از namespace مشترک وارد میشند رو در خط‌های جدا مشخص کنیم، بلکه می‌تونیم اون‌هارو به صورت گروهی فراخوانی کنیم.۸. افزودن شدن قابلیت return در generator: از این نسخه به بعد این امکان به وجود اومد تا به عنوان مقدار آخر generator ها پس از تمامی yieldها مقدار دیگه‌ای رو return کنیم و بتونیم اون رو با تابع ()getReturn دریافت کنیم.۹. افزوده شدن قابلیت ترکیب generatorها: با توجه به این ویژگی می‌تونیم generator های مختلف با دستور yield from داخل همدیگه فراخوانی کنیم و از اونها استفاده کنیم.افزوده شدن قابلیت ترکیب generatorها*.۷.۱۱. افزوده شدن امکان تعیین ورودی و خروجی null: به کمک این ویژگی می‌تونیم در تعیین ورودی یا خروجی تابع یک type تعیین کنیم(مثلا string) و در کنارش علامت سوال قرار بدیم تا مشخص کنیم اون تابع به عنوان ورودی یا خروجی می‌تونه نوع string یا null بگیره.۲. افزوده شدن قابلیت تعیین void به عنوان نوع خروجی تابع: توابعی که return ندارند یا return اون‌ها نتیجه‌ خاصی برنمیگردونه میتونن به عنوان نوع خروجی تابع این کلمه کلیدی رو در نظر داشته باشن.۳. افزوده شدن قابلیت array destructuring: با کمک این ویژیگی میشه اجزاء تشکیل دهنده‌ی آرایه‌ها رو استخراج کرد و تو متغیرهای دیگه‌ای ذخیره کرد.۴. تعیین سطح دسترسی برای const در کلاس‌ها: به کمک این ویژگی می‌توان تعیین کرد که مقادیر const به چه صورت در دسترس باشند. ۵. توانایی مدیریت چندگانه خطاها: در این نسخه از PHP این امکان وجود دارد که در قسمت catch مربوط به مدیریت خطاها باتوجه به علامت &quot;|&quot; یا همان &quot;پایپ&quot; بتوانیم از Exceptionهای متفاوت استفاده کنیم.*.۷.۲۱. افزوده شدن Object به عنوان نوع ورودی و خروجی: از این نسخه قابلیت تعیین Object به عنوان نوع ورودی و خروجی توابع در کنار بقیه مقادیر مثل int و string میتونه استفاده بشه.۲. افزودن شدن قابلیت Abstract method overriding: وقتی یک کلاس abstract از یک کلاس abstract دیگه‌ای ارث‌بری کنه و کلاس فرزند متد abstract مشابه کلاس والد داشته باشه متد موجود در فرزند override میشه.۳. بهبود رمزنگاری: کتابخانه رمزنگاری sodium به طور پیشفرض به PHP اضافه شد و همچنین پشتیبانی از Argon2 هم به password hashing API اضافه شده است.۴. پشتیبانی از قابلیت trailing comma: از این نسخه میتونید بعد از آخرین ایتم ها در آرایه یا… یک کاما(,) قرار بدید تا برای اضافه کردن آیتم‌های جدید نیاز به ایجاد تغییر در آخرین خط نباشه.*.۷.۳ویژگی‌های مختلف در این نسخه بهبود پیدا کردند، توابعی مثل ()array_key_first یا ()array_key_last اضافه شده ولی ویژگی‌های جدید خبرسازی طی این نسخه اضافه نشده، بیاید باهم یه سری از ویژگی‌هارو بررسی کنیم:۱. پشتیبانی از Array destructuring ارجاع منبع: از این نسخه در array destructuring و ()list این قابلیت وجود داره که یک آیتم به طور مستقیم با منبع اصلیش کپی بشه(ایتم جدید و قدیم به یک مکان از حافظه اشاره کنند) نه مثل قبل که یک کپی ساده ازش گرفته می‌شد. به نظرم برای درک بهتر این مطلب لازمه که این مثال از مستندات PHP رو ببینید.*.۷.۴۱. پشتیبانی پراپرتی‌های کلاس‌ها از تعیین سطح دسترسی: از این نسخه به بعد قابلیت تعیین نوع برای مقادیر یک پراپرتی در کلاس وجود داره و به غیر از public، protected یا private بودن میشه تعیین کرد که متغیر ما از چه نوعی(مثلا array یا int) باید باشه.۲. افزوده شدن قابلیت arrow function: اگر با JavaScript آشنا هستید مسلما اسم arrow function هم به گوش‌تون خورده. از این نسخه به بعد میتونیم از arrow function ها برای نوشتن توابع تک خطی در PHP استفاده کنیم.۳. پشتیبانی از Null coalescing حین تعیین متغیرها: این مورد در واقع یک syntactic sugar هست برای تعریف متغیرها که لازمه برای درک بهتر با یک مثال از مستندات PHP نشونش بدم.مثالی از Null coalescing حین تعریف متغیرها۴. افزوده قابلیت unpack کردن آرایه‌ها در یکدیگر: با توجه به این ویژگی قابلیتی وجود داره که میتونیم مقادیر یک آرایه رو به کمک &quot;…&quot; در آرایه دیگر بریزیم. برای درک بهتر لازمه که مثالی از مستندات PHP ببینیم.مثالی از unpack کردن آرایه‌ها در یکدیگر۵. قابلیت جداسازی اعداد با &quot;_&quot;: از این نسخه امکان جداسازی اعداد به کمک &quot;_&quot; وجود داره، یکی از فواید این کار افزایش خوانایی اعداد هست، به مثال روبرو توجه کنید: 299_792_458 با گوشه‌ای از ویژگی‌ها و تغییرات PHP 7 آشنا شدیم، خوشحال میشم که نظرات و پیشنهادات شما رو بدونم تا بتونم مطالب بهتری بنویسم. همونطور که گفتم بخاطر یکسری محدودیت‌ها نتونستم تمامی منابع رو معرفی کنم، لطفا برای دیدن منابع کامل لطفا به نسخه انگلیسی این مقاله تو لینکدین یا مدیوم سر بزنید، ولی اگر فرصت این‌کار رو ندارید این چندتا منبع رو داشته باشید.PHP TutorialProgram With GIO - PHP PlaylistPHP WatchStitcher</description>
                <category>محمد مرکباتی</category>
                <author>محمد مرکباتی</author>
                <pubDate>Tue, 18 Oct 2022 19:38:06 +0330</pubDate>
            </item>
                    <item>
                <title>کاوش در PHP 5</title>
                <link>https://virgool.io/@mhmmdtech/%DA%A9%D8%A7%D9%88%D8%B4-%D8%AF%D8%B1-php-5-vvdwhjazsxw9</link>
                <description>کاوش در PHP 5 با معرفی برخی منابع آموزشی.در این مقاله در مورد PHP 5 صحبت می‌کنیم. به نظرم مطالعه تاریخچه تغییرات در کنار معرفی منابع آموزشی این فرصت رو به ما می‌ده تا با چیزی عمیق تر آشنا بشیم و نسبت بهش تسلط بیشتری پیدا کنیم.تمام تلاشم رو کردم تا بتونم برای هر قسمت منابع مختلفی معرفی کنم ولی متاسفانه به‌خاطر قوانین ویرگول این کار شدنی نیست. برای همین تو نسخه فارسی این سری از مقالات نتونستم اینکار رو انجام بدم و به‌جاش در آخر یک‌سری منابع کلی معرفی کردم ولی اگر دوست دارید تمام منابع دسترسی داشته باشید لطفا نسخه انگلیسی این مقاله تو لینکدین یا مدیوم رو ببینید، اونجا برای هر قسمت منابع مناسبی رو معرفی کردم.*.۵.۳از اونجایی که نباید این مقاله طولانی بشه چون امکان داره موقع خوندن خسته بشید، بیاید از این نسخه شروع کنیم و تغییرات مهمی که اتفاق افتاده رو بررسی کنیم.۱. پشتیبانی از namespace‌ها: روشی برای کپسوله‌سازی هستند و باعث کنترل چالش نام‌گذاری مشترک کلاس‌ها، توابع، اینترفیس‌ها و ثابت‌ها میشن مطمئناً تا الان ازشون استفاده کردید و ارزش این رو دارند که عمیق‌تر در موردشون بدونیم.۲. پشتیبانی از ویژگی late static binding: برای حل کردن چالش مربوط به رفرنس دادن به کلاس صدا زده شده در ترکیب ارث‌بری و استاتیک‌ها، ممکنه با این چالش روبرو بشید و برای حل کردنش نیاز به این ویژگی دارید پس خوبه که در موردش تحقیق کنید.۳. پشتیبانی از توابع lambda: در واقع توابع ناشناسی که می‌تونن تو یه متغیر ذخیره بشن یا به عنوان آرگومان ورودی به یه تابع دیگه پاس داده بشن توابع lambda میگیم و میشه گفت که closure ها نمونه‌ای از توابع lambda هستند.۴. پشتیبانی از callStatic__: برای صدا زدن متدهای استاتیک غیرقابل دسترس یا متدهای استاتیکی که به طور واقعی وجود ندارند از این  مجیک متد استفاده میشه.۵. پشتیبانی از ternary operator: این دستور نوشتن شرط‌ها رو برامون کوتاه تر می‌کنه، در واقع می‌تونیم به کمک این ویژگی شروط تک خطی داشته باشیم. به احتمال زیاد ازش استفاده کردید یا جاهای مختلفی باهاش روبرو شدید ولی ارزش این رو داره یکبار دیگه اختصاصی در موردشون تحقیق کنید.*.۵.۴تو این نسخه، کدبیس PHP به لطف حذف کردن ویژگی‌های منسوخ شده تمیزتر شد، وب‌سرور داخلی بهش اضافه شد و افزایش performance به همراه کاهش استفاده از مقدار حافظه هم تو این نسخه اتفاق افتاد، بیاید چندتا از ویژگی‌های اضافه شده رو باهم بررسی کنیم.۱. پشتیبانی از Traitها: در واقع trait‌ها برای ایجاد کدهای reusable و حل مسئله‌ی single inheritance بودن php به ما کمک می‌کنند. تو جاهای مختلفی از traitها استفاده می‌کنیم مثلا برای پیاده‌سازی soft delete ها در لاراول نیاز به استفاده از trait مربوط به اون یعنی SoftDeletes تو مدل مربوطه رو داریم.۲. پشتیبانی shortened array syntax: از این نسخه به بعد، توسعه‌دهنده‌ها تونستند با استفاده از براکت [ ] آرایه‌ها رو تعریف کنند. تا قبل اون باید به کمک دستور ()array آرایه‌هارو تعریف می‌کردیم.*.۵.۵۱. پشتیبانی از generator: این قابلیت رو دارند که بتونیم داده‌ای رو پیمایش کنیم بدون اینکه کل اون داده رو داخل حافظه نگه داریم. برای مثال میشه به lazy collection تو لاراول اشاره کرد که از همین مفهوم استفاده کرده.۲. پشتیبانی از کلمه کلیدی finally: در پروسه مدیریت خطاها، finally مشخص می‌کند که پس از فرآیند مدیریت خطا چه اتفاقی بیفته.۳. اضافه شدن Password Hashing API: از ()password_hash و ()password_verify برای هش کردن و تائیدیه پسورد کاربر تو پروسه لاگین استفاده کردید؟ این‌ها بخشی از این API هستند. اگه کلا در مورد جمله قبلی چیزی نمی‌دونید بذارید خلاصه بگم که به کمک این API شما میتونید عملیات هش کردن رمزعبور و تائیدکردن اون‌ها رو انجام بدید.۴. اضافه شدن کلاس DateTimeImmutable: مثل DateTime عمل میکنه با این تفاوت که وقتی تغییری روش اتفاق بیفته شی جدیدی ازش  برگردونده میشه.۵. منسوخ شدن اکستنشن mysql: این افزونه گروهی از توابع مثل ()mysql_connect رو با خودش داشت که میتونستیم با دیتابیس MySQL تعامل کنیم. از این نسخه بود که استفاده  از MySQLi یا PDO_MySQL به طور رسمی توصیه شد.۶. اضافه شدن قابلیت class:: : یکی از مواردی که میشه بهش اشاره کرد استفاده از این قابلیت برای تعریف روت‌ها در لاراول هست.*.۵.۶آخرین مورد از نسخه پنجم PHP که تغییرات جالبی مثل پشتیبانی از توان به کمک (**) یا توانایی آپلود فایل‌های بزرگ‌تر از ۲ گیگابایت رو با خودش به همراه داشت. بیاید چند مورد رو عمیق‌تر روبا هم بررسی کنیم.۱. پشتیبانی از const برای تعریف متغیرها: به کمک این ویژگی می‌تونیم مقادیر ثابت تعریف کنیم. برای تعریف ثابت‌ها ()define هم تو نسخه هفتم اضافه شده، ولی باید در نظر داشته باشید که تفاوت‌هایی باهم دارند و هر کدوم تو جای خاصی به کار میان.۲. پشتیبانی از دریافت آرگومان با تعداد نامشخص متغیرها به کمک (…) : به نظرم عنوان کامل این ویژگی رو توضیح داده و الان خوبه که منبع معرفی کنم تا باهاش بیشتر آشنا بشید و ازش استفاده کنید. این قسمت از داکیومنت اصلی PHP که مربوط به این موضوع هست رو یه نگاه بندازید.۳. گسترش استفاده از namespaceها: تو این نسخه namespace و کلمه کلیدی use رو برای استفاده از namespaceها طوری گسترش دادند که بشه از توابع و ثابت‌ها هم پشتیبانی کنند.با گوشه‌ای از ویژگی‌ها و تغییرات PHP 5 آشنا شدیم، خوشحال میشم که نظرات و پیشنهادات شما رو بدونم تا بتونم مطالب بهتری بنویسم. همونطور که گفتم بخاطر یکسری محدودیت‌ها نتونستم تمامی منابع رو معرفی کنم، لطفا برای دیدن منابع کامل لطفا به نسخه انگلیسی این مقاله تو لینکدین یا مدیوم سر بزنید، ولی اگر فرصت این‌کار رو ندارید این چندتا منبع رو داشته باشید.PHP TutorialProgram With GIO - PHP PlaylistPHP WatchStitcher</description>
                <category>محمد مرکباتی</category>
                <author>محمد مرکباتی</author>
                <pubDate>Mon, 17 Oct 2022 20:37:28 +0330</pubDate>
            </item>
                    <item>
                <title>تصرف نام جاوااسکریپت توسط اوراکل</title>
                <link>https://virgool.io/coderlife/javascript-and-oracle-ydtudiew1jd8</link>
                <description>سلام، امیدوارم که حال دِلِ‌تون روبراه باشه، تو این مطلب میخوام که چالش جدیدی دنیای برنامه‌نویسی که صدای خیلی‌هارو درآورده و برای خیلی‌ها دردسر درست کرده رو باهم بررسی کنیم.لایواسکریپت یه زبان اسکریپت‌نویسی بود که تو سال 1995 توسط آقای برندان آیک(Brendan Eich) برای Netscape نوشته شده و برای رقابت با مایکروسافت طی قراردادی با Sun Microsystems که مالک جاوا بوده برای تبادل محصولات همکاری می‌کنن و برای مسائل تبلیغاتی اسمش رو به جاوااسکریپت تغییر میدن.نت‌اسکیپ تو رقابت با مایکروسافت از دور خارج میشه و از هم می‌پاشه، Sun Microsystems هم درگیر مشکلات مالی میشه و سال 2010 توسط اوراکل خریداری میشه و اوراکل میشه صاحب هرچیزی که سان مایکروسیستمز مالکش بود مثل زبان جاوا یا نام تجاری جاوااسکریپت.اوراکل تصمیم میگیره از این خرید نهایت استفاده رو ببره، پس یه شکایت از گوگل ایجاد میکنه برای استفاده از کدهای جاوا تو اندروید و برای محصولاتی که از اسم جاوااسکریپت استفاده کردند دردسر درست می‌کنه و نتیجه یکی از این دردسرها اپل مجبور میشه برنامه‌ای که از اسم جاوااسکریپت تو نام‌گذاریش استفاده می‌کرد رو از اپ استور پاک کنه.بخاطر تموم این دردسرها خیلی از توسعه‌دهنده‌ها تصمیم گرفتند که بیشتر از اسم نسخه استاندارد جاوااسکریپت یعنی اکمااسکریپت استفاده کنند و این موضوع یکی از دلایل بیشتر استفاده شدن اسم ECMAScript بود.این دردسرها تا جایی بزرگ شد که رایان دال (Ryan Dahl) خالق نود‌جی‌اس و دنو‌جی‌اس مجبور شد به این اتفاقات واکنش نشون بده و چند روزپیش یعنی 3 سپتامبر 2022 تو وبلاگش پستی خطاب به اوراکل منتشر کرد با عنوان &quot;Dear Oracle, Please Release the JavaScript Trademark&quot; و از اوراکل خواست که نام تجاری جاوااسکریپت رو آزاد کنه.پست رایان دال درباره نام جاوااسکریپت خطاب به اوراکلچالش این روزای دنیای وب رو باهم بررسی کردم و دیدیم چقدر جدی شده که حتی رایان دال رو هم مجبور به واکنش کرده و با گوشه‌ای از سیاست‌های اوراکل آشنا شدیم و متوجه شدیم که چرا خیلی از توسعه‌دهنده‌ها حس خوبی نسبت به اوراکل ندارند. خوشحال میشم نظرات و پیشنهادات شما رو بدونم تا بتونم مطالب بهتری بنویسم. ممنونم بابت وقتی که گذاشتید، امیدوارم که همیشه حال دِلِ‌تون روبراه باشه و لطفا هر طور که دوست دارید از این مطلب حمایت کنید.</description>
                <category>محمد مرکباتی</category>
                <author>محمد مرکباتی</author>
                <pubDate>Mon, 19 Sep 2022 10:10:51 +0430</pubDate>
            </item>
                    <item>
                <title>حباب دات‌کام: مروری بر تاریک‌ترین روزهای دنیای تکنولوژی</title>
                <link>https://virgool.io/@mhmmdtech/the-dotcom-bubble-review-of-the-darkest-days-for-the-technology-world-mvxpnn1kf5hp</link>
                <description>Nasdaq MarketSite در منهتن در دهه ۱۹۹۰ اینترنت در حال گسترش بود و دلیلی برای اینکه بسیاری از شرکت ها به مدل کسب و کار اینترنتی روی بیاورند. آنها پیشوند &quot;e&quot; یا پسوند &quot;دات‌کام&quot; را به نام برند خود اضافه کردند تا فعالیت خود را در اینترنت نشان دهند. به همین دلیل به آنها شرکت های دات کام می گفتند.از سال ۱۹۹۴ شرکت‌های دات‌کام سریع‌تر رشد کرده و توجه عمومی و رسانه‌ها را به خود جلب کردند و بسیاری از اشخاص حقیقی و حقوقی تصمیم به سرمایه‌گذاری در این شرکت‌ها گرفتند که این امر منجر به ورود تعداد زیادی سرمایه‌گذار تازه‌وارد به بازار و تأسیس شرکت‌های مختلف بدون مدل کسب و کار مناسب شد.این روزهای هیجان انگیز تا ۱۰ مارچ ۲۰۰۰(۱۹ اسفند ۱۳۷۹) ادامه داشت که شاخص بورس نزدک به ۵,۱۳۲ واحد رسید و در آن روز بازار روی ۵,۰۴۸ واحد بسته شد اما به دلایل مختلف از روز بعد روند نزولی آغاز شد و تا ۹ اکتبر۲۰۰۲(۱۸ مهر ۱۳۸۱) ادامه یافت. زمانی که شاخص بورس نزدک به ۱,۱۱۴ واحد رسید.نمایش صعود و نزول شاخص بازار نزدکحباب های مالی را می توان به سه دوره تقسیم کرد: دوره قبل از حباب اصلی، دوره حباب اصلی و در نهایت دوره بعد از حباب اصلی. در مورد حباب دات کام، دوره پیش از حباب از سال ۱۹۹۴ تا ۱۹۹۸، دوره حباب اصلی از سال ۱۹۹۸ تا مارچ ۲۰۰۰ و دوره پس از حباب از مارچ ۲۰۰۰ تا اکتبر ۲۰۰۲ طول کشید که پس از آن بازار به آرامی بهبود یافت و ۱۵ سال زمان برد تا نزدک ضررهای باقیمانده را جبران کند و به اوج خود در مارچ ۲۰۰۰ بازگردد.۱. آغاز روزهای هیجان انگیز برای شرکت‌های دات کامدر ژانویه ۱۹۹۳, مرورگر گرافیکی NCSA Mosaic عرضه شد و توجه زیادی را جلب کرد. مایکروسافت اقدام به تهیه لایسنس این مرورگر و توسعه نسخه مخصوص به خود کرد، نام آن مرورگر، مایکروسافت اینترنت اکسپلورر بود و در سال ۱۹۹۵ به بازار عرضه شد. مایکروسافت با این اقدام به نوعی قدم اول را در جنگ مرورگرها برداشت.در آن زمان شرکت هایی مانند آمازون و مایکروسافت در بازار فعال بودند. مایکروسافت با محصولاتی مانند ویندوز و اینترنت اکسپلورر بازار در حال تسخیر بازار بود و آمازون نیز به سرعت در حال پیشرفت بود. شرکت‌های دیگر نیز تصمیم گرفتند از فرصت استفاده کرده و فعالیت خود را در اینترنت آغاز کنند.تکنولوژی به سرعت در حال توسعه بود و تعداد شرکت های دات‌کام روز به روز در حال افزایش بود. از این رو بانک های سرمایه گذاری و سرمایه گذاران خطرپذیر تصمیم گرفتند از فرصت استفاده کرده و از سود کلان این بازار بهره مند شوند و سرمایه گذاری در شرکت های دات کام را آغاز کردند. به عنوان مثال، Webvan.com سرمایه ای بالغ بر ۳۹۳ میلیون دلار از شرکت هایی مانند گلدمن ساکس، بنچمارک و یاهو دریافت کرده است.آلن گرینسپن - رئیس فدرال رزرو ایالات متحده آمریکا در سال ۱۹۹۶ افراد مختلفی در مورد این روند هیجانی هشدار داده اند، به عنوان مثال، آلن گرینسپن(Alan Greenspan)، رئیس فدرال رزرو ایالات متحده آمریکا در سال ۱۹۹۶ اعلام کرد که شرایط فعلی بازار ناپایدار است و منجر به فروپاشی بازار در آینده خواهد شد. اما هیچ‌کس به این هشدار توجه نکرد و شرکت های بیشتری ایجاد شدند. به عنوان مثال، یکی از این شرکت ها Pets.com بود که در سال ۱۹۹۸ تأسیس شد و در زمینه فروش آنلاین لوازم حیوانات خانگی فعالیت می کرد و حتی آمازون نیز بخشی از سهام آن را خریداری کرد. آنها با وجود اینکه نتوانستند سود خوبی کسب کنند شروع به تبلیغات و جذب سرمایه‌گذار کردند.۲. دلایل ایجاد حباب دات‌کام چه بود؟۱.۲ ارزش گذاری بیش از حدبا ادامه روند افزایش ارزش سهام شرکت‌های دات‌کام، بسیاری از سرمایه‌گذاران متقاعد شدند که اقتصاد ایالات متحده به‌طور اساسی متحول شده است و دیگر عوامل متعددی که به‌طور سنتی در ارزش‌گذاری سهام یک شرکت نقش داشته‌اند مانند دارایی‌ها، بدهی‌ها، درآمدها، حاشیه سود، سهم بازار و جریان نقدی مستقیماً در ارزیابی شرکت‌های دات‌کام تاثیر ندارند. بر این اساس، آنها اقدام به سرمایه‌گذاری حتی در شرکت‌های بدهکار که هیچ امید واقعی به کسب سود نداشتند، کردند. چنین اعتماد بیش از حد سرمایه‌گذاران منجر به افزایش قیمت سهام شرکت‌های دات‌کام و فاصله گرفتن قیمت هر سهم از ارزش ذاتی خود شد. اما بسياری از سرمایه‌گذاران بدون توجه به این موضوع و با شور و شوق بی‌مورد، سهام شرکت‌هایی را خریداری کردند که قیمت آنها غیر واقعی و بالاتر از ارزش ذاتی آنها بود.۲.۲ فراوانی سرمایهسرازیر شدن پول از سوی سرمایه‌گذاران به این شرکت ها در دوره دات کام یکی از دلایل ایجاد حباب اقتصادی بود، زیرا بسیاری از آنها در این جنون فقط برای جذب سرمایه بودند و نتوانستند بازده و ارزش قابل توجهی ایجاد کنند. بنابراین دسترسی آسان آنها به سرمایه حباب را بزرگتر کرد.۳.۲ جنون رسانه‌ایاخبار رسانه‌ها با انتقال انتظارات بیش از حد خوش بینانه در مورد استارتاپ‌ها، سرمایه‌گذاری را تشویق کرد. انتشاراتی مانند وال استریت ژورنال، فوربس، بلومبرگ و بسیاری دیگر از نشریات تحلیل سرمایه گذاری، تقاضا را از طریق رسانه های خود تحریک کردند و به رشد حباب کمک کردند. سخنرانی آلن گرینسپن(Alan Greenspan) در دسامبر ۱۹۹۶ در مورد &quot;شور و نشاط غیرمنطقی&quot; نیز این روند را تقویت کرد.۳. همه‌گیری هیجان سرمایه‌گذاری در دنیای تکنولوژیدر ماه می ۱۹۹۷، آمازون به طور عمومی عرضه شد و مایکروسافت نیز هات‌میل(Hotmail) را به قیمت ۴۰۰ میلیون دلار خریداری کرد. تکنولوژی به بخشی از زندگی مردم تبدیل شده بود و شرکت‌های دات‌کام با تبلیغات گسترده توجه مردم رو به خود جلب می‌کردند.افراد بسیار زیادی با دیدن سود‌های هنگفت و رشد‌های نجومی و افزایش ترافیک این شرکت‌ها به امید رشد و سودآوری بیشتر و سریع‌تر پولدارشدن، بدون توجه به مسائل بنیادی در این شرکت‌ها سرمایه‌گذاری کردند.  همینطور بسیاری از تحلیلگران نیز به مسائل بنیادی این شرکت‌ها توجه نمی‌کردند و تمرکز خود را به سمت رشد ترافیک وبسایت این شرکت‌ها می‌بردند.یکی از جالب ترین لحظات این سال ها پخش ۲۱ آگهی تبلیغاتی(قبل از شروع بازی و بین دو نیمه) توسط شرکت های مختلف دات‌کام در سوپر باول(Super Bowl - بازی پایانی لیگ حرفه ای فوتبال آمریکایی در ایالات متحده آمریکا) در سال ۲۰۰۰ بود که سر و صدای زیادی به پا کرد.خرید AOL توسط Time Warner به مبلغ ۱۶۴ میلیارد دلار در همان سال از دیگر اتفاقاتی بود که ترس و هیجان ایجاد کرد. AOL یک غول اینترنتی بود و صاحب تعدادی سایت خبری و وب‌سرویس‌های بزرگ بود و تایم وارنر می خواست از قابلیت های AOL در اینترنت استفاده کند.در آن سال ها قیمت سهام شرکت های دات‌کام از ارزش ذاتی خود فاصله داشت و در ۱۰ مارچ ۲۰۰۰(۱۹ اسفند ۱۳۷۹) شور و نشاط بازار به اوج خود رسید و شاخص بازار نزدک نسبت به سال قبل دو برابر شد، اما روز بعد این حباب اقتصادی ترکید و ارزش سهام شرکت ها به شدت کاهش یافت.چگونه تاریکی حباب بر بازار مسلط شد؟سقوط بازار سهام نزدکبازار و سرمایه گذاران متوجه شده بودند که بسیاری از این شرکت ها درآمدهای بسیار کمی دارند و آینده روشنی را پیش رو نمی‌بینند و این بدبینی در بازار سرایت کرد و با ایجاد چالش های مختلف بیشتر شد.اولین ضربه ترس از تغییر سال 1999 تا 2000 بود که در آن زمان در حال گسترش در جامعه بود. سرمایه گذاران بر این باور بودند که اگر عدد از «99» به «00» تغییر کند، کل ساختار اینترنت فرو می ریزد و این شرکت ها به سمت نابودی سوق داده می شوند.فدرال رزرو نیز با تصمیم برای افزایش نرخ بهره بازار را تحت فشار قرار داد و علاوه بر این، مایکروسافت در دادگاه محکوم شد و &quot;انحصارگر&quot; شناخته شد که مشکلات بیشتری را ایجاد کرد.البته سایر شرکت‌ها نیز مشکلاتی داشتند که باعث بدبینی شد. به عنوان مثال، pets.com با وجود اینکه پول زیادی را صرف تبلیغات کرد، نتوانست سود مالی قابل توجهی به دست آورد که باعث نگرانی سرمایه گذاران آن شد.روز به روز بر تعداد کاربران افزوده می شد و بسیاری از شرکت ها توانایی و زیرساخت مناسبی برای پاسخگویی به این کاربران نداشتند که باعث ایجاد احساسات منفی در بین کاربران و سرمایه گذاران شد. آمازون یکی از شرکت هایی بود که با مدیریت صحیح سرمایه توانست زیرساخت‌ها را بهبود بخشد و با موفقیت از بحران خارج شد. البته  بسیاری از شرکت ها منابع مالی را که به راحتی به دست می آورند هدر دادند، به جای سرمایه گذاری در زیرساخت ها و پیشبرد اهداف شرکت، منابع مالی را صرف کارهای دیگری از جمله تفریح و … کردند.Jeff Bezos - بنیانگذار آمازونعلاوه بر همه این مشکلات، رکود بازار ژاپن در سال ۲۰۰۲ که بازیگر مهمی در تکنولوژی بود و حملات ۱۱ سپتامبر ۲۰۰۱(20 شهریور 1380) را می توان از عوامل تسریع این کاهش برشمرد.بسیاری از این شرکت‌ها اهداف جالبی داشتند و در ابتدا می خواستند تغییرات بزرگی ایجاد کنند، اما در نیمه راه گرفتار وسوسه‌های مختلف شدند و کم کم از هدف خود دور شدند.آن ایده‌های جالب با ناپدید شدن این شرکت‌ها از بین نرفتند، بسیاری از آن ایده‌ها سال‌ها بعد توسط افراد دیگری با استراتژی‌های بهتر اجرا شدند. به عنوان مثال، آمازون می تواند ایده Webvan.com را با سرویس Amazon Fresh و اوبر می تواند ایده Kozmo.com را با سرویس Uber Rush پیاده سازی کند.سلطه تاریکی بر بازارصعود و نزول شاخص بازار نزدک از سال 1994 تا 2004پس از انتشار اخبار منفی، سرمایه گذاران بیشتر احساس خطر کردند و به تدریج متوجه شدند که سهامی که خریداری کرده اند ارزش قیمتی را که برای آن پرداخته‌اند ندارد و همین امر منجر به فروش گسترده سهام و آغاز بحران شد. شرکت هایی مانند Pets.com و Webvan.com که در ابتدا تبلیغات زیادی داشتند در سال های ۲۰۰۰ و ۲۰۰۱ اعلام ورشکستگی کردند و این خبر شوک بزرگی در بازار ایجاد کرد.قرارداد ۱۶۴ میلیارد دلاری بین Time Warner و AOL به عنوان یک معامله بد شناخته شد و تأثیرات ناامیدکننده ای بر تایم وارنر داشت. گوگل یکی از شرکت هایی بود که در سال ۱۹۹۸ تاسیس شد. آنها منتظر ماندند تا بازار آرام شود و سپس در ۱۹ آگوست ۲۰۰۴ عمومی شد. شرکت‌های دیگری مانند eBay، Amazon و Microsoft نیز از جمله شرکت هایی بودند که توانستند از این بحران جان سالم به در ببرند.بسیاری از شرکت‌ها در این بحران نابود شدند، اما بسیاری از شرکت‌ها نیز با موفقیت از آن بیرون آمدند و با اتخاذ تصمیم‌های بهتر و توسعه استراتژی‌های قوی‌تر و پایدارتر به مسیر خود ادامه دادند.بسیاری از افراد بر این باورند که شرایط کنونی بازار مشابه آن دوران است و از نظر آنها افزایش تعداد استارت‌آپ‌ها نشان از حباب جدید و آینده تیره‌ای مانند آن سال ها دارد. البته باید به خاطر داشت که در آن زمان اینترنت بستر جدیدی بود، کسب‌وکارها هنوز پایدار نبودند و حتی شرکت‌های بزرگ تکنولوژی مانند امروز قدرتمند نبودند و تکنولوژی هنوز جایگاه مناسب خود را در زندگی پیدا نکرده بود.زمانی که یک موقعیت بحرانی پیش می آید ممکن است تعدادی از استارتاپ ها و حتی شرکت های نسبتا بزرگ به دلیل اشتباهات خود نابود شوند و دنیای فناوری با چالش هایی روبرو شود اما حضور ابرقدرت‌هایی مانند آمازون، اپل، گوگل، متا و مایکروسافت و … .، ممکن است عاملی باشد که ثبات را به بازار بازگرداند و همچنین عاملی باشد که سرمایه گذاران را به کل ساختار شک نکند.باید دانست که قیمت سهام با اخبار بالا و پایین می‌رود، اما مهم‌ترین نکته داشتن یک استراتژی درست و پایدار برای یک هدف معنادار و مشخص است تا شرکت‌ها بتوانند با اصول درست خود با موفقیت از بحران‌ها خارج شوند.</description>
                <category>محمد مرکباتی</category>
                <author>محمد مرکباتی</author>
                <pubDate>Sat, 30 Jul 2022 20:45:42 +0430</pubDate>
            </item>
                    <item>
                <title>اینترنت اکسپلورر: سقوط آزاد ستاره سابق ویندوز</title>
                <link>https://virgool.io/coderlife/internet-explorer-the-free-fall-of-the-former-windows-star-bc31d3fdmuoc</link>
                <description>اینترنت اکسپلورر - ستاره سابق ویندوزچند هفته پیش در ژوئن 2022 مایکروسافت اعلام کرد که دیگه از مرورگر اینترنت اکسپلورر پشتیبانی نمی‌کنه و این مرورگر بعد 9801 روز رسما تعطیل شد و طی مرور زمان کاربرانش رو به Microsoft Edge منتقل می‌کنه؛ البته حالت IE Mode در Microsoft Edge تا 2029 وجود داره و می‌تونه برای اون دسته از کاربرانی که نیاز دارن با اینترنت اکسپلورر کار کنن مفید باشه(مثلا  می‌تونه برای باز کردن وبسایت‌های قدیمی که با مرورگرهای جدید سازگار نیستند کارایی داشته باشه).البته این همه ماجرا نیست و باید گفت که هنوز هم اینترنت اکسپلورر برای محیط‌های خیلی خاص مثل نسخه‌های سرور ویندوز و یا نسخه‌های دولت چین از ویندوز پشتیبانی بشه؛ با این تفاسیر میشه گفت که از نظر فنی این مرورگر تو مدت بیشتری به کار خودش ادامه می‌ده ولی در هر صورت پیام مایکروسافت برای عموم جامعه روشن هست.اینجا پایان کار اینترنت اکسپلورر بود، مرورگری که شاید خیلی از ما اولین بار با اون اینترنت رو لمس کردیم، مرورگری که در اولین جنگ مرورگرها تمامی رقبای خودش رو کنار زد و به قله رسید ولی در دومین جنگ مرورگرها نتونست کاری کنه و از بین رفت. پیش از اینترنت اکسپلوررNCSA Mosaicنمایش عکس و متن در یک صفحه - مرورگر  یکی از محبوب‌ترین مرورگرها NCSA Mosaic بود، مرورگری که برای اولین بار عکس و متن رو با هم در یک صفحه به کاربر نشون می‌داد و برخلاف بقیه مرورگرهای زمان خودش جذابیت همراهش داشت. قابلیت‌های جذاب Mosaic باعث شد که رقبا شگفت زده بشن و مرورگرهای جذاب‌تری با الهام گرفتن از Mosaic خلق بشه. مایکروسافت مجوز نسخه‌ای از این مرورگر رو تهیه و شروع به توسعه مرورگری کرد که اسمش «اینترنت اکسپلورر» بود؛ نسخه اول اینترنت اکسپلورر، آگوست 1995 وارد بازا شد و چند نسخه اول این مرورگر حرفی برای گفتن نداشت اما باتوجه به این موضوع که همون زمان ویندوز95 در حال تسخیر بازار بود، مایکروسافت از این قدرت استفاده کرد و سایر محصولات خودش رو وارد زندگی کاربران کرد. این تصمیم طوری پیش رفت که مرورگر «اینترنت اکسپلورر» برای خیلی از کاربران معمولی اون زمان برابر اینترنت بود.حرکت بعدی ادغام ویندوز و مرورگر اینترنت اکسپلورر4 بود، مایکروسافت تصمیم گرفت تا اینترنت اکسپلورر4 رو داخل ویندوز98 قرار بده؛ یعنی اگر کامپیوتری تهیه می‌کردید که سیستم عاملش ویندوز بود، راه ارتباطی پیش‌فرض شما با اینترنت هم مرورگر اینترنت اکسپلورر بود؛ این تصمیم باعث افزایش سهم IE و کاهش سهم Netscape که رقیب اصلی IE بود از بازار مرورگرها شد. اما این همه ماجرا نبود و چالش‌های حقوقی مثل ایجاد پرونده ضد انحصاری از سمت دولت ایالات متحده علیه مایکروسافت ایجاد شد و در نهایت مایکروسافت این پرونده رو باخت و موظف شد تا این اجازه رو بده که کاربران مرورگر مورد نظر خودشون رو نصب کنن و ازش استفاده کنن.نسخه ششم و معمار دوره افولدانشنامه ویکی‌پدیا در مرورگر اینترنت اکسپلوررنسخه ششم Microsoft Internet Explorer اواخر آگوست سال 2001 میلادی وارد بازار  شد، زمان انتشار این نسخه مایکروسافت حدود 90 درصد بازار مرورگرها را در اختیار خودش داشت. این عدد به اندازه‌ای بزرگ بود که حتی گوگل کروم هم امروزه نمی‌تونه باهاش برابری کنه.اینترنت اکسپلورر6 در نوع خودش حرفی برای گفتن نداشت و چندین سال بعد انتشارش نه تنها ویژگی‌های زیادی بهش اضافه نشد، بلکه مایکروسافت تو حل مشکلات این مرورگر هم سریع عمل نکرد، دلایل متفاوتی مثل چالش‌های داخل کمپانی، عدم وجود رقیب یا شاید هم خیال راحت مایکروسافت از بازار مرورگر‌ها باعث این کم‌کاری‌ها شده بود؛ از جمله مشکلاتی که اینترنت اکسپلورر داشت و کاربران رو اذیت می‌کرد این بود که باتوجه به محبوبیت اینترنت اکسپلورر وبسایت‌های زیادی با توجه به این مرورگر توسعه داده می‌شدند و وقتی کاربر اون وبسایت‌ها رو تو مرورگرهای دیگه که استاندارد بهتری داشتن می‌دید، اون‌ها با مشکل روبرو می‌شدند و همینطور مشکلات امنیتی متعدد اینترنت اکسپلورر هم برای مایکروسافت و کاربران تبدیل به یک کابوس شده بود و اگه این موارد رو در کنار موارد متعدد دیگه بذاریم متوجه می‌شیم که همه این‌ها نشان‌دهنده ضعف مایکروسافت برای توسعه IE بود.  نسخه6 اینترنت اکسپلورر آخرین نسخه از این مرورگر  بود که نام Microsoft را به همراه داشت و نسخه7 اون  با نام کامل  Windows Internet Explorer سال 2006 یعنی 5 سال پس از نسخه ششم وارد بازار شد.کم‌کاری های مایکروسافت فرصت تازه‌ای برای رقبا فراهم کرده بود که وارد بازار بشن که از جمله اونها میشه به Firefox اشاره کرد که ریشه‌ای از مرورگر Netscape داره و تونست تا سال 2006 به آمار 2 رقمی بازار برسه. حرکت بعدی انتشار Safari از سمت Apple بود، مایکروسافت 150میلیون دلار تو اپل سرمایه‌گذاری کرده بود و قراردادی 5 ساله داشتن مبنی بر اینکه مایکروسافت از «آفیس» داخل سیستم عامل مک پشتیبانی کنه و اپل هم IE رو به عنوان مرورگر پیش‌فرض مک قرار بده؛ اون قرارداد به پایان رسید و اپل Safari رو منتشر کرد.فایرفاکس، سافاری و کرومضربه آخر به اینترنت اکسپلورر از سمت کمپانی گوگل با انتشار Google Chrome زده شد، «کروم» رابط کاربری و و ویژگی‌های جذابی داشت که سریعا اون رو نسبت به رقبا متمایز کرد و مورد مهم دیگه این بود که سازنده کروم شرکت «گوگل» بود، شرکتی که اسمش در زبان انگلیسی مترادف با جستجوی آنلاین هست.مرورگر کروم سال 2008 منتشر شد، اون سال‌ها گوگل بین کاربران اینترنت محبوبیت خاصی داشت در نتیجه از مرورگرش هم با روی خوش استقبال شد و در سال 2012 تونست اینترنت اکسپلورر رو کنار بزنه و به محبوب‌ترین مرورگر دنیا تبدیل بشه.روی کار آمدن Microsoft Edgeلوگوی مرورگر Microsoft Edgeسال 2009 نسخه8 IE وارد بازا شد، سال 2011 نسخه9 IE وارد بازار شد و سال 2012، درست همون سالی که «کروم» تبدیل به پراستفاده‌ترین مرورگر شد نوبت به نسخه10 رسیده بود و سال 2013 بود نسخه11 یا بهتره بگیم آخرین نسخه از اینترنت اکسپلورر وارد بازار شد؛ مرورگر‌های مختلف در حال رشد بودن ولی اینترنت اکسپلورر روز به روز در حال افول بود و سال 2015 مایکروسافت مرورگر جدیدی با نام Edge وارد بازار کرد.مرورگر Microsoft Edge رنگ آبی اینترنت اکسپلورر رو حفظ کرده بود و چیز‌های زیادی از اون رو کنار گذاشته بود ولی این تغییرات هم نتونست مشکلی رو حل کنه چون در خیلی از ویژگی‌ها از رقبا عقب تر بود و وبسایت‌های مختلف سازگاری مناسبی باهاش نداشتن، علاوه بر این‌ها امکان استفاده از افزونه‌های توسعه داده شده برای کروم یا فایرفاکس را نداشت؛ این‌ها بخشی از مشکلاتی بودن که مرورگر Edge اوایل داشت که باعث شده بود این مرورگر هم دردسر جدیدی برای مایکروسافت باشه.طبق آمار StatCounter اولین نسخه از مرورگر Edge از سهم استفاده 5درصد بالاتر نرفت و اواخر سال 2018 مایکروسافت بار دیگه شکست جدید رو قبول کرد و گفت نسخه جدید Edge با براساس کدبیس پروژه کرومیوم گوگل در حال توسعه هست. گروهی از افراد این مثال رو می‌زدن که Edge بسته‌بندی مایکروسافت رو داره ولی مرورگر گوگل هست و این موضوع رو به خرید مجوز NCSA Mosaic توسط مایکروسافت به‌جای توسعه مرورگری از پایه تشبیه می‌کردن.با این تصمیم، مایکروسافت موفق شد در دوره جدید از جنگ مرورگر‌ها جای پایی برای خودش پیدا کنه و طبق آمار StatCounter با عبور از فایرفاکس به رتبه3 پراستفاده‌ترين مرورگرها برسه و در کنار این موضوع تونست ویژگی‌های جدیدی به پروژه «کرومیوم» اضافه کنه، از افزونه‌های مختلف گوگل کروم پشتیبانی کنه و سازگاری گسترده‌تری با سایت‌ها داشته باشه.مایکروسافت ادج رشد خوبی تا به حال داشته که البته این رشد در نتیجه کاهش سهم فایرفاکس از بازار بوده نه کروم؛ در هر صورت این مرورگر می‌تونه جایگزین مناسبی برای اینترنت اکسپلورر باشه و حتی این امکان وجود داره که با تصمیم‌گیری های درست به یه رقیب خیلی جدی برای گوگل کروم تبدیل بشه و این‌بار تاریخ رو طور دیگه‌ای تکرار کنه.منابع:Internet Explorer was once synonymous with the Internet, but today it’s gone for goodGoodbye, Internet Explorer. Thanks for the memories (and the malware)RIP Internet Explorer - the browser that changed the web for good (and bad)Microsoft’s Internet Explorer Is Now Officially Shut After 27 YearsMicrosoft starts automatically redirecting Internet Explorer users to Edge</description>
                <category>محمد مرکباتی</category>
                <author>محمد مرکباتی</author>
                <pubDate>Sat, 09 Jul 2022 13:00:48 +0430</pubDate>
            </item>
            </channel>
</rss>