سبد خرید شما خالی است.

دسته بندی: برنامه نویسی

بررسی تغییرات php8

دوستان و همراهان عزیز به قسمت هفتم جت کد کست خوش اومدین، این قسمت میخوایم به بررسی تغییرات ورژن جدید PHP یعنی PHP8 بپردازیم. همونطور که سایت خود PHP هم گفته، این نسخه، یه Major Update هست که تغییرات زیادی شامل امکانات جدید و بهینه سازی رو در بر میگیره.

قبل از اینکه بخوایم شروع کنیم به بررسی این تغییرات، بزارین یه توضیح خیلی مختصر راجع به خود این زبان برنامه نویسی ارائه بدیم برای دوستانی که آشنایی ندارن. PHP که مخفف PHP Hypertext Processor هست، یه زبان برنامه نویسی از نوع اسکریپتی و مفسریه و برای بک اند وب هست که با C نوشته شده و توسط Rasmus Lerdorf سال ۱۹۹۴ منتشر شده و یه جورایی سال هاست که سر دسته زبان های بک اند برای توسعه هست و الانی که دارم این اپیزود رو ضبط میکنم ورژن ۸٫۰٫۲ هم ریلیز شده و در دسترسه.

خب حالا بریم سراغ اصل مطلب یعنی بررسی تغییرات PHP8. تو این ورژن ما شاهد تغییرات زیادی در هسته این زبان هستیم که منطقیه چون همونطور که کمی قبل گفتم این یه Major update هست.

از جمله این تغییرات میشه به:

Union Type، NamedArguments, Match Expressions، constructor Property Promotion، Nullsafe Operator, Weak Maps Just In Time Compilation که اهمیت فوق العاده ای در بهینه شدن سرعت این ورژن پی اچ پی داره و حتما بهش می پردازیم.

Named arguments

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

این فیچر واقعا Life Saver هست و من نمیدونم چرا قبلا اینو نداشتیم. برای من یکی که این قابلیت به تنهایی کافیه برای اینکه پروژه رو به سمت PHP8 هل بدم جلو. چون میدونید دیگه مثلا یه تابع سه تا آرگومان داره که وسطیش اختیاریه! قبلا موقع صدا زدن همچین تابعی باید هر سه آرگومان رو وارد میکردیم و مثلا وسطی رو میتونستیم Null یا Empty String بزنیم و تو فانکشن اینو هندل میکردیم. اما الان میشه آرگومان های اختیاری رو اصلا وارد نکرد و به اصلاح به جای Positional Argument که میگه باید پارامتر ها رو به ترتیب وارد کنی، از روش Named arguments استفاده میکنیم.

مثال PHP7:

htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);

مثال PHP8:

htmlspecialchars($string, double_encode: false);

Constructor property promotion

Constructor property promotion چیه؟ این قابلیت به ما این امکان رو میده که ویژگی های یک کلاس رو با کد کمتری تعریف و مقدار دهی کنیم. به عنوان مثال فرض کنید ما یه کلاس User داریم که یک ویژگی داره به اسم isAdmin و میخوایم پیش فرض false باشه اما اگر موقع ساختن نمونه از کلاس مقداری برای آرگومان isAdmin وارد شده بود، اون مقدار در پراپرتی isAdmin ذخیره بشه.

مثال PHP7:

class User {
  public bool $isAdmin;

  public function __construct(
    bool $isAdmin = false
  ) {
    $this->isAdmin = $isAdmin;
  }
}

مثال PHP8:

class User {
  public function __construct(
    public bool $isAdmin = false
  ) {}
}

برای اینکه بهتر متوجه این ویژگی بشین حتما مقاله مرتبط با این اپیزود رو که لینکش رو توی توضیحات پادکست میزارم مطالعه کنید و به مثال ها دقت کنید.

Union types

به کمک این ویژگی جدید میتونیم چند نوع داده برای یک متغیر تعریف کنیم و اگر نوع داده ی اون متغیر هیچ کدوم از اونها نبود، خطای از نوع Type Error میده. البته قبلا هم میتونستیم این کار رو انجام بدیم اما با استفاده از PHPDoc annotation. الان میشه خیلی راحت میشه از این قابلیت استفاده کرد. چطوری؟ فرض کنید میخایم ویژگی وزن در کلاس User از نوع Int یا Float باشه، برای اینکار میایم از این سینتکس استفاده می کنیم:

class User {
  public function __construct(
    private int|float $weight
  ) {}
}

Match expression

مچ اکسپرشن ها تقریبا شبیه همون Switch ها هستند اما با یه سری تفاوت. شما میتونید رو یه چیزی سوییچ کنید و بگید اگر مقدارش فلان چیز بود این چیز رو برگردون. اما دیگه break نمیخواد و اینکه به ازای هر مچ فقط میتونید یک خط کد بنویسید. اما این خیلی جا ها بدرد میخوره. یه مقال واضحش تبدیل روز های هفته از عدد به متنه. یادتون نره که خروجی این تابع match رو میشه echo کرد، توی یه متغیر ریخت و یا return کرد، چون این یک expression حساب میشه.

echo match(0){
    ۰ => 'شنبه',
    ۱ => 'یکشنبه',
    ,...
};
// نتیجه این کد نمایش "شنبه" هست

Nullsafe operator

عملگر نال سیف یکی از فیچر هاییه که کار رو برای توسعه دهنده ها راحت میکنه. فرض کنید شما میخواهید کشور زندگی کاربر رو بگیرید، قبلا برای اینکار اول چک می کردیم آیا $user نال هست یا نه، اگر نال نبود حالا اگر فیلد کشور داخلش هم نال نبود از متغیر $user، آدرس رو و از آدرس، کشور رو میگرفتیم.

مثال PHP7:

if ($user !== null) {
    $address = $user->getAddress();

    if ($address !== null) {
      $country = $address->country;
    }
  }

مثال PHP8:

$country = $user?->getAddress()?->country;

Non-capturing catches

تا قبل از PHP8 اگر میخواستیم به Exception رو بگیری باید توی یه متغیر میریختی مثلا به اسم $error یا $exception، حتی اگر از اون متغیر استفاده هم نمیکردی و صرفا برای هندل کردن خطا بوده. اما الان با استفاده از قابلیت Non-capturing catches این امکان وجود داره که اگر نخواستی اون متغیر رو نسازی.

مثال PHP7:

try {
    // Something goes wrong
} catch (MySpecialException $exception) {
    Log::error("Something went wrong");
}

مثال PHP8:

try {
    // Something goes wrong
} catch (MySpecialException) {
    Log::error("Something went wrong");
}

Trailing comma in parameter lists

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

public function add(
    string $name,
    int $age,
) {
    // کد های بدنه تابع
}

تابع str_contains

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

if (str_contains('Test Hello World Test', 'Hello')) { echo "Found!" }

تابع str_starts_with() و str_ends_with()

با استفاده از تابع str_starts_with() میتونیم چک کنیم ابتدای یک رشته، با یه رشته خاصی شروع میشه یا نه. و تابع str_ends_with() هم این کار رو به نسبت آخر یک رشته انجام میده. خروجی این دو تابع Boolean هست و میتونید ازش توی دستورات شرطی و… استفاده کنید.

مثال PHP8:

str_starts_with('haystack', 'hay'); // true
str_ends_with('haystack', 'stack'); // true

از اونجایی که لیست تغییرات این نسخه خصوصا چیزای جزیی زیادن، به سری از تغییرات جزیی و بهبود ها رو به صورت لیست وار مرور میکنیم:

  • Stable sorting
  • Saner string to number comparisons
  • Saner numeric strings
  • Stricter type checks for arithmetic and bitwise operators
  • Concatenation precedence
  • The @ operator no longer silences fatal errors
    روی پروداکشن اگر display_errors=Off رو تنظیم کنید تا اگر قبلا خطایی با @ مخفی شده بوده، الان هم نمایش داده نشه!
  • Consistent type errors
  • New mixed type
  • New static return type

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

JIT (The Just in Time Compiler)

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

ظاهرا JIT قراره پروفرمنس بهتری داشته باشه اما در عمل برای نرم افزارهای تحت وب مثل وردپرس، تفاوت چشمگیری در سرعتشون دیده نمیشه. اما JIT بخاطر ساختارش مزایای دیگه ای هم داره و در آبنده میتونه فرصت های خیلی خوبی رو برای زبانی مثل PHP ایجاد کنه. از جمله اینکه Cross platform هست و از این جهت که PHP ادعا میکنه General Purpose هست خب میتونه برای مفید باشه و بتونه از این طریق برای فضای خارج از وب هم خودش رو بهینه تر کنه.

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

امیدوارم مطالب این پادکست و مقاله به کارتون بیاد. مواظب خودتون باشین و پیش به سوی PHP8!

لینک ها و منابع

بهترین فریمورک های PHP در سال ۲۰۲۰

مقدمه

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

بد نیست بدونید که PHP یکی از معروفترین و بهترین زبان های برنامه نویسی تحت وبه. سابقه ی طولانی و درخشانی هم داره و توسط Rasmus Lerdorf سال ۱۹۹۴ ساخته شده.

فریمورک (Framework) چیست؟

فریمورک یا چارچوب ها فضایی ایجاد می کنند تا برنامه نویس ها در آن چارچوب کدنیوسی تمیزتر و استاندارد داشته باشند و همچنین روند ساخت و توسعه سریعتر و بهتر انجام بگیرد.

تفاوت فریمورک و کتابخانه (Library)

بعدا به صورت مفصل تر در یه مقاله مجزا در این مورد صحبت می کنیم اما الان بصورت مختصر میتونیم بگیم کتابخونه ها و فریمورک ها جفتشون کد هایی هستند که توسط برنامه نویس های دیگه نوشته شده اند و قابلیت استفاده مجدد دارند اما بینشون تفاوت هم هست. یکی از مهم ترین تفاوت های بیت Framework و Library اینه که کتابخونه ها رو شما صدا میزنید و از توابع و کلاس هایی که دارند استفاده می کنید اما فریمورک یک چارچوبه که شما کد های خودتون رو توش قرارمی دین و باید قوانین (Convension) ها و پترن های اون فریمورک خاص رو رعایت کنید.

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

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

  • رعایت اصول یک Design Pattern خاص
  • استفاده از یک معماری مناسب
  • کد نویسی تمیز و توسعه پذیری بالا و سریعتر
  • سرعت و امنیت بهینه تر

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

Laravel

لاراول بهترین و معروفترین فریمورک PHP در سالهای اخیره که توسط Teylor Otwell در سال ۲۰۱۱ معرفی شده و اکنون بیشترین امتیاز رو در بین فریمورک های PHP در گیت هاب داره. از جمله دلایل محبوبیت زیاد لاراول میتونیم به سرعت، امنیت، توانایی هندل کردن نرم افزار های بزرگ و سادگی پیاده سازی عملیات و ویژگی هایی مانند Routing، پیاده سازی سیستم احراز هویت، Caching و کار با Session هاست.

مقایسه فریمورک ها در گوگل ترندز

با استفاده از ابزار Google trends فریمورک های معروف PHP رو با هم مقایسه کردیم و نتیجه رو شما در عکس بالا میتونید مشاهده کنید. همونطور که می بینید Laravel در پنج سال گذشته رشد چشمگیری داشته.
لینک به منبع

امروز که دارم این مقاله رو برای شما می نویسم ریپازیتوری این فریمورک در گیت هاب بیش از ۶٫۶K ستاره داره.
لینک منبع

CodeIgniter

کدایگنایتر هم یکی از فریمورک متن باز و معروف PHP هستش که به سبک بودنش معروفه (کلا حدود ۲ مگابایت حجم داره) و کارکردن باهاش سادست. از جمله مهم ترین ویژگی های این فریمورک سریع بودن و داشتن مستندات خوبه که خصوصا برای افرادی که میخوان تازه شروع بکنن عالیه.

Symfony

سیمفونی قدیمی ترین فریمورک این لیسته که سال ۲۰۰۵ توسط Fabien Potencier منتشر شده. این فریمورک از معماری (MVC(Model View Controller استفاده می کنه و استاندارد های PHP رو رعایت میکنه.

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

نکته: بنظرمیاد درحالیکه Laravel توجهش رو به ساده کردن پروسه ها حتی برای توسعه دهنده های حرفه ای داده؛ Symfony یک مقدار برای توسعه دهنده های مبتدی سخت تر باشه.

CakePHP

برای نصب این فریمورک همین کافیه که فایلهاش رو روی هاستتون کپی کنید. آخرین ورژن این فریمورک تا الان (مرداد ۱۳۹۹) ۴٫۰ هستش که تغییرات زیادی رو اعمال کرده. کیک پی اچ پی دارای مستندات خیلی خوب و روونیه که اگر نیاز داشتید میتونید از وب سایت رسمیش به قسمت Documentation مراجعه کنید.

جمع بندی

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

امیدوارم این مقاله براتون مفید واقع بشه. اگر نظری یا پیشنهادی داشتید میتونید در قسمت نظرات مطرح کنید یا به ایمیل من به نشانی edris.qeshm2@gmail.com بفرستید.

برای مشاهده ی مقالات مشابه به صفحه ی مقالات وب سایت مراجعه کنید.

ساختار کامپایلر چگونه است؟ کامپایلر چطوری کار میکنه؟

مقدمه

قبل از اینکه در مورد ساختار کامپایلر (Compiler) و روش کار کردنش براتون بگم بزارید یکم در مورد اینکه اصلا کامپایلر چیه بیشتر براتون بنویسم.

کامپایلر چیه؟

کامپایلر نرم افزاری که سورس کد رو از یه زبانی به زبان دیگه تبدیل میکنه که غالبا منظور ما نرم افزاریه که از زبان های سطح بالا (High level Programming language) به زبان هایی سطح پایین مثل اسمبلی ترجمه می کنند.

In computing, a compiler is a computer program that translates computer code written in one programming language (the source language) into another language (the target language).

منبع: PC Mag Staff (28 February 2019). “Encyclopedia: Definition of Compiler”. PCMag.com. Retrieved 28 February 2017.

انواع کامپایلر ها

  • اگر برنامه ی کامپایل شده را بتوان در سستیمی با CPU متفاوت از سیستمی که برنامه در آن کامپایل شده اجرا کرد به آن نوع کامپایلر میگیم Cross-Compiler.
  • De-compiler برنامه ایه که میتونید باهاش برنامه ای رو از زبان سطح پایین به یک زبان سطح بالا ترجمه کنید (یعنی بر عکس مترجم های عادی مرسوم)
  • Source to Source Compiler یا Trans-compiler ها یکی از انوع کامپایلر ها هستند که امکان ترجمه یک کد زبان High level به زبان High level دیگه رو به ما میدن.
  • و…

ساختار کامپایلر ها

کامپایلر ها معملا یک ساختار مشترک دارند. یک سری کار ها رو به صورت متوالی انجام میدن تا کد رو از یک زبان سطح بالا (در این نوع کامپایلر های مورد بحث) به زبان ماشین تبدیل کنند. به ترتیب ساختار کامپایلر ها رو با هم دیگه مرور میکنیم و در مورد هر کدوم از مراحل کامپایل توضیحاتی میدم.

Lexical Analyzer

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

کار های اصلی که در این مرحله اتفاق میفته:

  • کامنت ها و فواصل اضافی رو حذف میکنه
  • شناسایی کلمات بر اساس متن سورس کد ورودی
  • دسته بندی کلمات به شناسه های از پیش رزرو شده (مثل if)، ثوابت و…
  • توکن هایی که جزو زبان نیستند رو تشخیص میده

مثال: فرض کنید به کامپایلر کد زیر رو به عنوان ورودی رو بدیم:

int y = 10;

خروجی ما در مرحله اول کامپایلر به این شکله:

Keywordint
Identifiery
Assignment Operator=
Number10
مثالی از توکن ها
Token name Sample token values
identifier x, color, UP
keyword if, while, return
separator }, (, ;
operator +, <, =
literal true, 6.02e23, "music"
comment /* Retrieves user data */, // must be negative

Syntax Analyzer

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

با کمک توکن های ساخته شده در مرحله قبل، بر اساس یک سری قوانین که برای هر زبان برنامه نویسی ممکنه متفاوت باشه Parse Tree رو میسازه.

یک مثال از Parse Tree

کار های اصلی که در این مرحله اتفاق میفته:

  • گرفتن توکن ها از Lexical Analyzer
  • بررسی صحت کد از جنبه ی Syntax
  • گزارش دادن ارور های سینتکس
  • ساختن یک درخت سلسله مراتبی به اسم Parse Tree

Semantic Analyzer

سمانتیک انالایزر معنی دار بودن Parse Tree رو بررسی میکنه و اگر مشکلی نداشت اصطلاحا Parse Tree رو Verify میکنه. یه سری کار های دیگه هم از جمله Type cheeking, label checking انجام میده. برای اینکه بهتر کار Semantic analyzer رو درک کنید اینطوری در نظر بگیرید که تو این مرحله کامپایلر اون درختی که شکلش رو تو مرحله قبل دیدیم بررسی میکنه و بهش از جنبه معنایی نگاه میکنه. اگر مشکلی وجود داشته خطا میده در غیر اینصورت ما رو به مرحله بعدی هدایت میکنه.

کار های اصلی که در این مرحله اتفاق میفته:

  • ذخیره سازی نوع داده ها در Parse Tree یا Symbol Table
  • بررسی نوع داده ها و در صورت عدم تطابق داده و نوع داده (اگر قابل Cast کردن نباشه) ارور Semantic نمایش داده میشه.

توضیح: اگر در مثالی شما نیاز به TypeCast باشد به صورت خودکار در صورت امکان این اتفاق در این مرحله انجام می گیرد. به عنوان مثال:

float x = 10.5;
float y = x * 2;

احتمالا متوجه شدید که در مثال بالا عدد ۲ که یک عدد صحیح یا Integer هست قبل از عملیات ضرب به صورت خودکار به یک Float یا عدد اعشار تبدیل میشه. پس اون خط چیزی شبیه این میشه:

float y = x * 2.0;

Intermediate Code Generator

Intermediate Code Generator یعنی سازنده کد میانی (سطح میانی). تا اینجای کار کامپایلر برای همه ی ماشین ها یکسانه و تفاوتی نداره. کد میانی در واقع یک کد انتزاعیه بین زبان برنامه نویسی سطح بالا و زبان ماشین.خوبی این مرحله اینه که کار رو برای ترجمه کد ها به زبان ماشین خیلی ساده تر میکنه.

کار های اصلی که در این مرحله اتفاق میفته:

  • بر اساس Semantic یک برنامه، کد سطح میانی تولید میشه
  • مقادیر رو طی فرایند ترجمه نگه میداره
  • به ترجمه کد به زبان مقصد کمک میکنه
  • حفظ ترتیب و اولویت هایی که در زبان مبدا وجود داشت

به عنوان مثال:

total = count + rate * 5

به کمک Address Code نتیجه میشه:

t1 := int_to_float(5) 
t2 := rate * t1 
t3 := count + t2
total := t3

Code Optimizer

در این پروسه، کد های میانی بهینه میشن (از نظر سرعت، کوتاه تر شدن کد ها، قدرت کم تر خواستن و… ) و خط های اضافی به نحوی حذف میشه و کد ها فشرده تر میشن. (منظور از خط های اضافی خطوط خالی و… نیست اونها که در مراحل قبل حذف شدن). این پروسه باعث میشه کد های کمتر بشن و تا حد ممکن سرعت اجرا بالاتر بره.

Target Code Generator

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

منابع

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

لینک حمایت از آموزش ها و پروژه های متن باز

گرفتن قیمت دلار با پایتون

امروز با استفاده از پایتون و کتابخونه ی selenium یک اسکریپت برای web scrapping و گرفتن قیمت دلار با پایتون به صورت لحظه ای می نویسیم. این اسکریپت رو میتونید روی یک کرون جاب بزارید تا هر چند وقت یکبار اجرا بشه و نتیجه ی فایل خروجی که حاوی قیمت هست به روز رسانی بشه یا اینکه کل کد ها رو یه حلقه ی بی نهایت بزارین و بعد از هر بار اجرا sleep بزارین تا برنامه چند لحظه مکث بکنه.

از این اسکریپت برای گرفتن قیمت دلار با پایتون میتونید استفاده کنید اما پیشنهاد میکنم اگر بصورت جدی میخواین ازش استفاده کنین در یه جایی که نیازه هر دقیقه قیمت به روز بشه بهتره از یک api خوب استفاده کنین که خیلی سریعتره یا اینکه یه طوری مرورگر رو headless بالا بیارین و جاوا اسکریپت و css ها و کل asset های دیگه رو بارگزاری نکنه و سریع لود بشه.

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

چرا باید به php7 مهاجرت کنیم؟

مهاجرت به php7 از نون شب براتون واجب تر نیست اما بالاخره مهم که هست 🙂 امروز یا امشب (نمیدونم کی میخونینش پس…) میخوایم بار و بندیلمونو برداریم بریم سمت php7 اما اگه آماده نیستید مساله ای نیست چون اولش کلی دلیل میاریم که چرا باید بریم اون سمتی.

خب بزارین با یه داستان یا همچین چیزی بحث رو شروع کنیم…

چند وقت پیش داشتم روی یه پروژه ی تحت وب به عنوان فریلنسر کار می کردم. بک اندش رو با PHP نوشتم در کل بر اساس استاندارد های php7 کد ها رو نوشتم اما روی هاست با PHP5.3 اجرا می شد.

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

حتی بعضی وقتا (خصوصا قسمتی که الگوریتم محاسبات روی تعداد زیادی Entry اپلای می شد) سایت time out میداد که مشکلات زیادی درست میکرد.

اولش با بالا برن execution_time توی تنظیمات php.ini هاست دایرکت ادمین تونستیم مقداری قضیه رو بهتر کنیم اما هنوز مسأله سر جاش بود.

راه حل؟ اولش اومدم یکبار الگوریتم رو بررسی کردم تا ببینم میشه کاری کرد که سریعتر اجرا بشه. دیدم چیزی در نیومد.
رفتم سراغ تنظیمات دایرکت ادمین و دیدم که گزینه ای داره برای انتخاب ورژن PHP، ورژن php رو روی ۷٫۳ قرار دادم (الان که مقاله روی مینویسم تا ۷٫۴٫۵ هم اومده که یه سری باگ فیکس و مشکلات امنیتی بوده اما هنوز شرکت روی سرورش نصب نکرده). نتیجه فوق العاده بود.

سرعت اجرا تا حدود ۵۰% بیشتر شد. یعنی دو برابر!

این قضیه موقع انتشار ورژن ۷ گفته شد و تاکید شد که حتما به این ورژن سوییچ کنید. (البته در نظر داشته باشید که یه سری چیز ها هم deprecate شدن و شما باید کدتون رو ریفکتور کنین).

حالا بریم یه سری به تغییرات php7 نسبت به php5 بزنیم.

php7

برخی از ویژگی های php7

Performance بیشتر

یکی از مهم ترین تغییرات این نسخه در مورد پروفرمنس بیشتر این نسخه هیچ شکی نیست و میتونید یه سرچی بزنید و خودتون ببینید که واقعا چقدر نسبت به ورژن قبلی پیشرفت داشته. دلیلش هم استفاده از ورژن جدید Zend Engine هست. اگر نمیدونید Zend Engine چیه اینجا کلیک کنید.

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

As per Zend Technologies, the performance improvement is huge!! Just upgrading to PHP 7 gives enormous performance upgrades. Hence, PHP 7 is often termed PHPNG (PHP – Next Gen) taking the performance of your code to a whole new level.

وب سایت geeksforgeeks

Scalar Type Hints

یعنی شما میتونید به آرگومان های تابع یا متودتون نوع بدین و بگین حتما باید از این نوع باشن. اگر خط زیر رو اول فایلتون بنویسید strict_type فعال میشه و اگر نوع داده ی ورودی با نوع داده ی آرگومان تابع شما همخوانی نداشته باشه خطا میده.

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

<?php
declare(strict_types = 1);
function sum(int $x, int $y)
{
 return $x + $y;
}
$sum = sum("10","20");
?>

از اونجایی که من تعیین کردم که php حساس و سخت گیر باشه در نتیجه به من خطا میده. چون من گفتم ارگومان های a , b باید integer باشن اما خودم رشته بهش دادم. پس ارور میده. در واقع خطایی که بهتون نشون میده چیزی شبیه اینه:

Uncaught TypeError: Argument 1 passed to sum() must be of the type int, string given

تعریف نوع داده ی بازگشتی

اگر با php کار کردین میدونید که توی نسخه ی های قدیمی تر امکان تعریف یک نوع داده بازگشتی برای یه تابع یا متد وجود نداشت و این گاها میتونست یه سری دردسر هایی برای برنامه نویس ها ایجاد بکنه. خوشبختانه توی نسخه ی جدید این امکان وجود داره که نوع داده ای که از یه تابع بر میگرده (return value) رو تعیین کنیم.

به عنوان مثال توی تابع زیر سن رو (یه عد صحیح) میگیریم و چک میکنیم اگر ۱۸ یا بالاتر بود نتیحه رو true بر میگردونیم در غیر اینصورت false برگشت داده میشه:

<?php
function isValid(int $age):bool{
    if($age >= 18){
        return true;
    }
    else{
        return false;
    }
}
?>

در واقع شما میتونید از چهار نوع داده bool, int, string, and float برای return کردن استفاده کنید.

پشتیبانی از اعداد صحیح ۶۴ bit

مدیریت خطا (Error handling)

PHP 7 changes how most errors are reported by PHP. Instead of reporting errors through the traditional error reporting mechanism used by PHP 5, most errors are now reported by throwing Error exceptions.

php.net

طبق گفته ی سایت رسمی خود php؛ شیوه ی گزارش خیلی از خطاها تغییر کرده اند. بجای گزارش ارور ها به شکل قدیمی که تو نسخه های php5 و… میدیدیم؛ بیشتر خطا ها توسط Exception ها میان بالا (به عبارتی).

در این مورد اینجا هم توضیحات خوبی داده شده.

Anonymous Class

کلاس های Anonymous یا ناشناس کلاس هایی هستند که اسم ندارند. تو php7 این امکان وجود داره که با استفاده از کلمه کلیدی new class یه کلاس ناشناس بسازیم.
برای مثال و فهمیدم عمیق این موضوع مقاله ی زیر رو پیشنهاد میکنم:
https://blog.eduonix.com/web-programming-tutorials/learn-working-anonymous-classes-php-7/

عملگر های جدید

عملگر < = > یا space ship operator یه عملگر جدید توی php7 هست و قبلا توی php نداشتیمش. از اونجایی که یه چیز جدیده (جدید به نسبت نسخه های قبل) یکم بیشتر توضیح میدم. بقول خودشون کارش مقایسه ی ترکیبیه. حالا پرسش ما اینه که اساسا combined comparison یا مقایسه ی ترکیبی یعنی چی و چه کاری برای ما انجام میده؟!

نحوه ی کار به این شکله:

اگر هر مقادیر دو سمت (یعنی عملوند ها) با هم برابر بودند ۰ بر میگردونه

اگر مقدار سمت چپ بزرگتر بود ۱ رو بر میگردونه

اگر مقدار سمت راست بزرگتر بود ۱- بر میگردونه

مثال:

<?php
 // Comparing Integers
echo 1 <=> 1; // outputs 0
echo 3 <=> 4; // outputs -1
echo 4 <=> 3; // outputs 1

// String Comparison
echo "a" <=> "a"; // outputs 0 
echo "m" <=> "y"; // outputs -1
echo "y" <=> "c"; // outputs 1
?>

در آخر اینم بگم که یه سری چیز ها بطور کلی از php7 حذف شده اند. مثلا یه سری تگ شبیه asp که میشه یه چیزی شبیه <% و غیره که میتونید اینجا ببیندشون.

منابع:

اگر دوست داشتین میتونید از دسته بندی برنامه نویسی چیز های بیشتری در این باره بخونید یا آموزش هایی رو ببینید.

برای حمایت میتونید کلیک کنید.

کتابخانه پایتون mypassmaker برای ایجاد رمز عبور امن

این مطلب مرتب به روز رسانی میشه؛ پس میتونید هر ازگاهی یه سری به اینجا بزنید.

سلامُ وقت بخیر؛ ادریس رنجبر هستم و امروز میخوام یه کتابخونه ساخت رمز عبور امن با پایتون به اسم mypassmaker رو به شما معرفی بکنم که خودم نوشتم و دارم توسعش میدم. این کتابخونه یا پکیج یا ماژول یا هرچی 🙂 کارش اینه که میاد به اندازه ی یک طول دلخواه که ما بهش میدیم برامون رشته ای حاوی کاراکتر های حروفی و عددی و کاراکتر های ویژه مثل +ـ()*،×٪٫!٬ میسازه و با هم ترکیبشون میکنه.

اما اینجا قضیه تموم نمیشه و بعد از اینکه رمز عبور رو براتون تولید کرد میتونه براتون ایمیلش هم بکنه. البته من به شکلی نوشتم که شما توی پروژتون به عنوان یک کتابخونه ماژول باهاش کار کنید اما میشه راحت اجراش کرد.

نسخه ۱.۲ منتشر شد

ویزگی های این نسخه:

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

نحوه نصب mypassmaker

برای نصب این کتابخونه با استفاده از مدیر بسته ی pip میتونید از دستور زیر استفاده کنید:

pip install mypassmaker

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

برای نصب هم کافیه از –upgrade استفاده کنید. اگر ورژن جدید منتشر کرده باشم براتون میاد.

اگر هم میخواید سورس رو ببینید میتونید به گیت هاب پروژه سری بزنید.

نحوه استفاده

from mypassmaker import Password
my_password = Password.generate(length=10)
Password.send_email(gmail_user="", gmail_password="", sent_from="", send_to="", my_password=my_password)

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

برای حمایت مالی از پروژه ها و آموزش های رایگان می تونید از طریق لینک زیر ارقدام کنید.
https://zarinp.al/@edrisranjbar

حل مشکل ریستارت مودم ایرانسل با پایتون

یه اسکریپت کوچولو نوشتم که با یه دستور ساده کار ریستارت مودم ایرانسل منو برام انجام میده.

تجربه ی کار با Thread در سی شارپ

سلام. امروز داشتیم رو یه پروژه ی نرم افزار ویندوزی که با سی شارپ نوشتیم کار می کردیم برای اپدیتش؛ یه مشکلی داشتیم. مسئله اینجا بود که میخواستیم طرف ببینه اینترنتش وصله یا قطعه اگه وصل بود با رنگ سبز بنویسه مثلا “به اینترنت متصل هستید” یا “اینترنت قطع هست”. ایده ی کلی چیز ساده ای بود که خب تو ورژن قبلی با یه timer که interval ش رو روی ۳۰۰۰۰ میلی ثانیه گزاشته بودیم حل شد تقریبا. ولی چون موقع لود شدن برنامه تا سی ثانیه بعد نتیجه رو نمایش نمیداد مجبور شدیم روی رویداد Form Load فرم هم اون تابعی که برای بررسی اصال به اینترنت نوشته بودیم رو صدا بزنیم.

ولی مشکل این بود که وقتی برنامه رو باز می کردیم چون یه پینگی از یه جا می گرفت یکم طول میداد و توی اون لحظه (تقریبا ۱ الی ۲ ثانیه) من نمیتونستم کاری بکنم یعنی اون برنامه درگیره. خب برای اینکار ایده ی Background Worker رو داشتم و از قبل میدونستم که همچین چیزی هست. میشه یه Thread جدید درست کرد که تو یه حلقه با شرط Trueتا بینهایت یه کاری بکنه اما سیستم هنگ نباشه. در واقع توی بک گراند این کار رو بکنه.

توی رویداد لود فرم اصلی این کد رو گزاشتم تا یه Task به Background Worker معرفی کنم و گفتم انجامش بده.

[code] backgroundWorker1.DoWork += backgroundWorker1_DoWork; backgroundWorker1.RunWorkerAsync(); [/code]

بعد توی خود Background Worker اومدم کدهایی کی میخوام هی اجرا بشن رو نوشتم.

[code] private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { while (true) { // check inrternet connection Netchecker netchecker = new Netchecker(); if (netchecker.CheckForInternetConnection()) { netIsConnect = true; } else { netIsConnect = false; } Thread.Sleep(10000); } } [/code]

در واقع یه کلاس نوشتم که توش یه متد netchecker هست برای بررسی وصعیت اینترنت که نهایتا True و False برمیگردونه. و توی این خط ها اومدم چک کردم اگر نتیجش True بود توی یه متغیر true میریزم. بعد توی یک تایمر هر چند ثانیه فقط مقدار اون متغیرو چک می کنم و یه پیام توی یک لیبل نمایش میدم. همین.

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

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

Thread در سی شارپ
اینم یه عکس که شاید از حرفای من واضح تر باشه براتون 🙂

شاد و پیروز و البته سلامت باشد.


اسکریپت پایتون گرفتن قیمت بیت کوین با API و ارسال SMS

سلام بچه ها. با عرض پوزش بابت تاخیر در ساخت آموزش های جدید؛ امروز یه آموزش براتون ظبط کردم در مورد گرفتن قیمت بیت کوین از طریق API با زبان برنامه نویسی پایتون. بعد از گرفتن قیمت اگر قیمت بیت کوین از یه حدی بیشتر بود یه اس ام اس به خودمون می زنیم که قیمتش بالا رفته برو بخر یا همچین چیزی. مهم ایده ی کلیشه که دستتون میاد با برنامه نویسی چه قدرتی دارین و چقدر میتونید کار های فان بکنید و از طرفی کار خودتون رو راحت تر کنید مثلا بعضی از کار های دیجیتالتون رو رباتتون براتون انجام بده.

از آموزش ها هم حتما اگه دوست داشتین حمایت کنید.

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

راستی اگر نقد یا پیشنهادی دارید چه در همین صفحه از طریق کامنت یا از طریق صفحه تماس با ما می تونید برای من بنویسید تا کیفیت آموزش ها رو ارتقا بدیم.

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

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

از آموزش ها هم حتما اگه دوست داشتین حمایت کنید.

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

راستی اگر نقد یا پیشنهادی دارید چه در همین صفحه از طریق کامنت یا از طریق صفحه تماس با ما می تونید برای من بنویسید تا کیفیت آموزش ها رو ارتقا بدیم.