<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات دوکوئچ  | مسیر حرفه ای برنامه نویسی</title>
        <link>https://virgool.io/devcoach/feed</link>
        <description>دوکوئچ devcoach وب سایت آموزش برنامه نویسی و تدریس خصوصی   به صورت حضوری و خصوصی هست. مسیر حرفه ای برنامه نویسی | جعفر اسماعیلی</description>
        <language>fa</language>
        <pubDate>2026-06-16 11:02:10</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/jyt3gzzkjuwn/vbfp4r.png</url>
            <title>دوکوئچ  | مسیر حرفه ای برنامه نویسی</title>
            <link>https://virgool.io/devcoach</link>
        </image>

                    <item>
                <title>بک آپ گرفتن از دیتابیس در سرور</title>
                <link>https://virgool.io/devcoach/%D8%A8%DA%A9-%D8%A2%D9%BE-%DA%AF%D8%B1%D9%81%D8%AA%D9%86-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-mysql-tcgy5orycfry</link>
                <description>backup-mysql-database-on-ubuntuبک آپ گیری از پایگاه دا دهای Mysql در Ubuntu serverامروزه اکثرا وب سایت ها و شرکت های های نرم افزاری مورد حملات گستره قرار می گیرد و هدف از این کار اغلب از بین بردن اطلاعات حیاتی و از دسترس خارج کردن سرور ها هست که اینجا اهمیت گرفتن بک آپ از پایگاه داده و فایل های سرور پر رنگ تر می شود.برای گرفتن بک آپ از نرم افزار بسیار قدرتمند Percona XtraBackup استفاده می کنیم .مرحله اول نصب percona xtraback روی اوبونتو سرور :apt install percona-xtrabackupاگر هم کسی بخواد مستقیم دانلود کند و روی سیستمی که به اینترنت وصل نیست نصب کند روی لینک کلیک کند.روند گرفتن بک آپ با percona اینجوری هست که از همه ای فایل ها مهم یک کپی می گیرد و به آدرسی که ما می دهیم می ریزد و ما باید این فایل ها رو فشرده کنیم و فایل های که ایجاد شده رو حذف کنیم.مرحله دوم گرفتن بک آپ با اجرای دستور زیر:MysqlBackupDir=/home/backups/xtrabackup-files

 xtrabackup --user=bkuser --password=dbpass --host=localhost 
 --port=3306 --socket=/var/run/mysqld/mysqld.sock   --backup --target-dir=${MysqlBackupDir}یک نام کاربری و پسورد با دسترسی کامل به mysql ایجاد می کنیم و داخل دستور با اطلاعات پیش فرض جایگزین می کنیم.و در بخش آخر دستور مسیر گرفتن خروجی رو تعیین می کنیم که من داخل home/backup-files گذاشتم.اگر اطلاعات رو درست وارد کرده باشید باید همچین فایل های رو ایجاد کند.حالا بسته به اینکه شما چند تا دیتابیس داخل mysql دارید می تواند فرق کند.کار بک آپ گیری تمام شد اما مشکلی که هست اینکه اگر قرار باشه هر باز این همه فایل ایجاد بشود بعد از مدتی حجم هارد سرور پر می شود از کلی فایل های بک آپ تکراری . برای حل این مشکل اول باید این فایل ها رو zip کنیم و فایل های باز رو حذف کنیم و بعد از این این روند رو خودکار کنیم تا هر روز به صورت اتوماتیک این کار انجام شود.مرحله سوم فشرده سازی و حذف فایل ها و پوشه های خروجی گرفته شده:اگر روی سرور شما zip نصب نشده هست با دستور زیر ابتدا نصب کنیدapt install zipو سپس با دستور زیر فایل زیب را ایجاد کنیدBackupFile=$(date +%Y-%m-%d_%H-%M-%S)
zip -qr /home/backups/mysql_backup_&amp;quot${BackupFile}&amp;quot.zip ./.ما برای فایل های بک یک نام بر اساس تاریخ و ساعت بک آپ گیری تعیین می کنم که دستور اول همین کار را انجام می دهد و خط دوم فایل زیپ را ایجاد می کند.بعد از ایجاد فایل zip حال فایل های که خروجی گرفته شده بود را حذف می کنیمMysqlBackupDir=/home/backups/xtrabackup-files
rm -rf &amp;quot${BackupDir}&amp;quotمرحله چهارم زمانبدی کردن بک آپ گیری :خب برای راحتی کار دوستان و من همه ای این کار ها رو داخل یک فایل bash آماده کردم و در اختیار شما می زارم و این فایل bash رو داخل crontab اضافه می کنیمیک فایل ایجاد کنید و دستورات زیر را داخل آن کپی کنید .یک فایل ایجاد کنید و دستورات زیر را داخل آن کپی کنید .#!/bin/bash



# Define variables
TmpDir=/tmp
BackupsDir=/backups
MysqlBackupDir=mysql-xtrabackup
BackupDir=$(date +%Y-%m-%d_%H-%M-%S)

# Change the directory into temp
cd ${TmpDir} || exit

# Make sure the backups directory exists
mkdir -p ${BackupsDir}

# Create the backup directory and change the directory into it
mkdir -p &amp;quot${BackupDir}&amp;quot
cd &amp;quot${BackupDir}&amp;quot || exit

# Create a MySQL backup with Percona XtraBackup
echo &amp;quot➤ Creating a full MySQL backup with Percona XtraBackup ...&amp;quot

# Create the MySQL XtraBackup directory
mkdir ${MysqlBackupDir}

# Create backup
  xtrabackup --user=bkpuser --password=dbpass --host=localhost  --port=3306 --socket=/var/run/mysqld/mysqld.sock   --backup --target-dir=${MysqlBackupDir} &amp;&gt; /dev/null

# Compress the backup directory
echo &amp;quot➤ Compressing the backup directory ...&amp;quot
  zip -qr ${BackupsDir}/mysql_backup_&amp;quot${BackupDir}&amp;quot.zip ./.

# Delete the backup directory from the temp directory
cd ..
  rm -rf &amp;quot${BackupDir}&amp;quotبعد از کپی کردن فایل های ابتدا باید فایل ایجاد شده را executeable کنید یعنی بتونه داخل linux اجرا بشه بعد داخل crontabاضافه کنید.دستور زیر این کار را انجام می دهد:chmod a+w /home/mysql_backup.sh
crontab -eاکثرا بک آپ گیری بهتره شب انجام داده بشه موقعی که درخواست ها کم هست و سرور خلوت تر هست من معمولا ساعت یازده به بعد زمانبندی می کنم . یه مثال برای زمانبدی بک آپ گیری برای ساعت ۱۱ شبکثرا بک آپ گیری بهتره شب انجام داده بشه موقعی که درخواست ها کم هست و سرور خلوت تر هست من معمولا ساعت یازده به بعد زمانبندی می کنم . یه مثال برای زمانبدی بک آپ گیری برای ساعت ۱۱ شب0 23  * * * /home/mysql_backup.sh &gt; /dev/null 1&gt;&amp;1نکات پایانی :دوستانی که پروژشون به صورت داکرایز شده هست و می خواهند از ایمیج داکر percona xtraback استفاده کنند از این لینک می توانند استفاده کنند.بعد از انجام همه ای این مراحل توانستم از دیتابیس ها و اطلاعات مهم mysql بک آپ بگیرم اما وقتی سرور مورد حمله قرار گیرد و همه ای اطلاعاتش پاک شود اصلا کار بک آپ گیری ما فایده نداره در نتیجه همیشه بهتر هست فایل های بک آپ رو در یک سرور جداگانه یا جای امن نگهداری شود. در پست بعدی نحوه ای آپلود شدن خودکار فایل های بک آپ روی گوگل درایو رو به شما دوستان عزیر آموزش خواهیم داد.برای مشاهده کامل مقاله می توانید به وب سایت ما مراجعه کنید</description>
                <category>دوکوئچ  | مسیر حرفه ای برنامه نویسی</category>
                <author>جعفر اسماعیلی</author>
                <pubDate>Sat, 02 Jul 2022 11:25:51 +0430</pubDate>
            </item>
                    <item>
                <title>قابلیت های php  نسخه ای 8 و اتفاق بزرگی به نام JIT</title>
                <link>https://virgool.io/devcoach/%D9%82%D8%A7%D8%A8%D9%84%DB%8C%D8%AA-%D9%87%D8%A7%DB%8C-php-%D9%86%D8%B3%D8%AE%D9%87-%D8%A7%DB%8C-8-%D9%88-%D8%A7%D8%AA%D9%81%D8%A7%D9%82-%D8%A8%D8%B2%D8%B1%DA%AF%DB%8C-%D8%A8%D9%87-%D9%86%D8%A7%D9%85-jit-dnxucrtmv5pv</link>
                <description>در این پست  تمام ویژگی ها و تغییرات ورژن php 8 را بررسی می کنم . یکی از هیجان انگیز ترین ویژگی آن JIT هست که ادامه توضیح خواهیم داد.چند ماه پیش php نسخه 8 را منتشر کرد که در نسخه ای جدید یک سری ویژگی های خیلی خوب اضافه شده که باعث بهبود سرعت اجرای برنامه می شود.(Just In Time Compilation)JIT چیست؟همان طور که می دانید php یک زبان مفسری هست یعنی برای اجرای برنامه  نیاز به کامپایل کردن یا همون خروجی گرفتن مثل زبان های دیگری مثل Java و یا ++C نیست. یعنی همان لحظه که برنامه اجرا می شود کامپایل می شود و خروجی رو نمایش می دهد اما در نسخه 8 پی اچ پی JIT را به موتور ترجمه خود اضافه کرده که باعث شده هم سرعت اجرا برنامه ها کمتر شود و هم از منابع کمتری برای اجرای برنامه ها استفاده کند. با این قابلیت در های جدیدی بر روی Php باز شده است مثلا در آینده شاهد این باشم که از Php در هوش مصنوعی هم استفاده کنند.در تصویر زیر هم که خود سایت php گذاشته مشاهده می کنید JIT چقدر تاثیر داشته در اجرای برنامه هادیگر ویژگی های PHP 8  را مثال می زنیم و با نسخه ای  PHP 7 مقایسه می کنیمNamed argument :بعضی مواقع برای بعضی از توابع و یا کلاس لازم می شد که چندین پارامتر بفرستیم که بعضی هاشون اختیاری باشن تو نسخه 7 موقع فراخوانی  توابع یا کلاس اگر می خواستم به پارامتر آخر یک مقداری رو پس کنیم (بفرستیم) مجبور بودیم که به اون پارامتر اختیاری که قبل از این پارامتر هست مقدار null بدیم که کار کند .اما در نسخه 8 این مشکلی خیلی خوب حل شده که در نمومه کد زیر قابل مشاهده هست .در واقع با قابلیت  name arugument  می داند که کدام مقدار را به کدام پارامتر بفرستد.class  Blog
{
    public function __construct(
    private string $title,
    private  string|null  $description,
    private string $slug ) {}

}

//   PHP 7
$blog_object = new Blog (
    &#039;New  Devcoach Post&#039;,
    &#039;&#039;,
    &#039;new-post&#039;,
);

// PHP 8
$blog_object = new Blog (
    title : &#039;New  Devcoach Post&#039;,
    slug: &#039;new-post&#039;,
);Attributes ها :جایگزین مناسب برای PHPDoc هست که در نسخه ای 8کد ها خیلی کمتر و خوانا ترم می کند.// PHP 7
class PostsController
{
    /**
     * @Route(&amp;quot/api/posts/{id}&amp;quot, methods={&amp;quotGET&amp;quot})
     */
    public function get($id) { /* ... */ }
}


// PHP 8

class PostsController
{
    #[Route(&amp;quot/api/posts/{id}&amp;quot, methods: [&amp;quotGET&amp;quot])]
    public function get($id) { /* ... */ }
}Constructor property promotion  :این اجازه را به ما می دهد که بتوانیم خصوصیات کلاس رو مستقیم داخل constructor تعریف  و استفاده کنیم بدون اینکه بخوایم  مانند نسخه 7 قبل  از متد  constructor  این خصوصیات رو  تعریف کنیم.// PHP 7
class Blog {
    public string $title;
    public string $description;
    public string $slug;

    public function __construct(
        float $title = &#039;New Devcoach Post&#039;,
        float $description = &#039;This is a post&#039;,
        float $slug = &#039;new-post&#039;
    ) {
        $this-&gt;title = $title;
        $this-&gt;description = $description;
        $this-&gt;slug = $slug;
    }
}

// PHP 8

class Blog {
    public function __construct(
        float $title = &#039;New Devcoach Post&#039;,
        float $description = &#039;This is a post&#039;,
        float $slug = &#039;new-post&#039;
    ) {}
}Union types :یه سری خطا داخل پروژه ها به این  خاطر پیش می آمد که پارامتر درست ارسال نشده بود چون بعضی مواقع نیاز بود یک پارامتر هم عددی باشد و هم اعشاری و این ویژگی نبود که هر دو نوع تایپ را  تعریف کرد.union ها در نسخه ای جدید این مشکل را حل کردن و در های جدیدی برای تعریف متد و فانکشن باز کردند.// PHP 7
class Number {
  /** @var int|float */
  private $number;

  /**
   * @param float|int $number
   */
  public function __construct($number) {
    $this-&gt;number = $number;
  }
}

new Number(&#039;NaN&#039;); // Ok

// PHP 8

class Number {
  public function __construct(
    private int|float $number
  ) {}
}

new Number(&#039;NaN&#039;); // TypeErrorMatch expression :به طور خلاصه این جایگزین خوب و کوتاه تر  برای swicth ها هست که طبق نیازمون می توانیم ازش استفاده کنیم و در ضمن  می توان مقدار پیش فرض مثل swicth ها براش تعریف کرد// PHP 7

switch (8.0) {
    case &#039;8.0&#039;:
        $result = &amp;quotOh no!&amp;quot
        break;
    case 8.0:
        $result = &amp;quotThis is what I expected&amp;quot
        break;
    default:
        $result = &#039;nothing&#039;;
}
echo $result;

// PHP 8

echo match(8.0){
&#039;8.0&#039; =&gt; &amp;quotOh no!&amp;quot,
  8.0 =&gt; &amp;quotThis is what I expected&amp;quot,
    default =&gt; &#039;nothing&#039;
};Nullsafe operator :به نظرم بعد از JIT  یکی از اتفاق های خوب  php نسخه ای  8 هست که انجام شده .در نسخه  7 php من همیشه این مشکل رو داشتم ، یک خطای به خاطر null بودن object رخ داده مخصوصا در لاراول که اکثرا در پروژه ها استفاده می کنم همیشه مسئله بوده که با شرط if بررسی کنم اگر خالی نبود  مقدارشون نمایش بدم. قطعا با  ویژگی ساختار کد ها خیلی تمیز تر ، کمتر و در کنار این همه قابلیت به نظرم تعداد خطای برنامه ها هم خیلی کم تر می شود.// PHP 7

$country =  null;

if ($session !== null) {
  $user = $session-&gt;user;

  if ($user !== null) {
    $address = $user-&gt;getAddress();
 
    if ($address !== null) {
      $country = $address-&gt;country;
    }
  }
}

// PHP 8
$country = $session?-&gt;user?-&gt;getAddress()?-&gt;country;Saner string to number comparisons :در  php 8 برای مقایسه یک عدد با رشته از مقایسه اعداد استفاده می کند .// PHP 7

0 == &#039;foobar&#039; // true

// PHP 8
0 == &#039;foobar&#039; // falseیک سری توابع و کلاس جدید هم در  php نسخه ای 8 اضافه شده که به شرح زیر هست:1.str_contains2.str_start_with3.str_ends_with4.get_debug_type// PHP 8

 str_contains ( string $haystack , string $needle ) : bool
Example:
str_contains(&#039;This is my first blog&#039;, &#039;blog&#039;) // true

str_starts_with (string $haystack , string $needle) : bool
Example:
str_starts_with(&#039;This is my first blog post&#039;, &amp;quotis&amp;quot) // false

str_ends_with (string $haystack , string $needle) : bool
// Example:
str_ends_with(&#039;This is my first blog post&#039;, &amp;quotpost&amp;quot) // true 

$bar = $arr[&#039;key&#039;];
if (!($bar instanceof Foo)) { 
  // this shows the most simple of patterns, to get the real type an assoc array
  // must be present to convert long-form &amp;quotinteger&amp;quot into int etc.
  throw new TypeError(&#039;Expected &#039; . Foo::class . &#039; got &#039; . (is_object($bar) ? get_class($bar) : gettype($bar)));
}
 
// would become
if (!($bar instanceof Foo)) { 
  throw new TypeError(&#039;Expected &#039; . Foo::class . &#039; got &#039; . get_debug_type($bar));
}
 
$bar-&gt;someFooMethod();


class FooBar {
    private WeakMap $cache;
 
    public function getSomethingWithCaching(object $obj) {
        return $this-&gt;cache[$obj] ??= $this-&gt;computeSomethingExpensive($obj);
    }
 
    // ...
}و در آخر من شخصا خیلی هیجان زده شدم از قابلیت و ویژگی های  نسخه 8 مخصوصا با  JIT و Nullsafe که واقعا ویژگی خوبی بودن . امیدوارم تونسته باشم که اکثر ویژگی ها رو با زبان ساده تو این مقاله ارائه بکنم.منبع</description>
                <category>دوکوئچ  | مسیر حرفه ای برنامه نویسی</category>
                <author>جعفر اسماعیلی</author>
                <pubDate>Mon, 13 Sep 2021 10:50:04 +0430</pubDate>
            </item>
                    <item>
                <title>حذف و غیر فعال سازی ویروس kdevtmpfsi</title>
                <link>https://virgool.io/devcoach/%D8%AD%D8%B0%D9%81-%D9%88-%D8%BA%DB%8C%D8%B1-%D9%81%D8%B9%D8%A7%D9%84-%D8%B3%D8%A7%D8%B2%DB%8C-%D9%88%DB%8C%D8%B1%D9%88%D8%B3-kdevtmpfsi-gu4pcrku1fs2</link>
                <description>devcoachمدیر سیستم بودن دردسر ها و استرس های خودشو داره یکی از حساس ترین کارها اینکه باید امنیت سرور رو تامین کنی داستان از جای شروع می شه که بچه های تیم گفتن که گیت لب کار نمی کنه و خیلی کند شده این رو هم بگم که ما یه سرور داریم که گیت لب رو روی اون نصب کردیم و پروژه هامون رو روی سرور با داکر اجرا می کنیم بعد منم رفتم لاگین کنم تست کنم ببینم داستان از چه قرار که سرعت سرور خیلی پایین اومده بود بالاخره با کندی وارد سیستم شدم لیست تسک های که در حال اجرا بود رو دیدم یه چیزی به اسم kdevtmpfsi با دستور kill استاپش کردم اما بعد چند دقیقه دوبراه اجرا می شد هی من استاپش می کردم دوباره اجرا می شد سرچ زدم داخل استک اورفلو و سایت های دیگر یه چیز های اورده بود انجام دادم اما فایده نداشت دوباره اجرا می شد.بالاخره بعد کلی تحقیق متوجه شدم که داخل یکی از ایمج های داکر می اد و خودشو اجرا می کنه احتمال های دادم و چیزی هم که بود داخل فروم ها بود داخل ایمیج redis ویا php هست دوباره از اول جذف کردم این ایمیج ها رو و نصب کردم اما فایده نداشت دوباره اجرا می شد.در آخر بهترین روشی که پیدا کردم این بود که با استفاده از دستور زیر اول مسیر ویروس رو پیدا کنم و حذف کنم که کلا از بین برهبرنامه مشاهده ادامه بر روی لینک کلیک کنید</description>
                <category>دوکوئچ  | مسیر حرفه ای برنامه نویسی</category>
                <author>جعفر اسماعیلی</author>
                <pubDate>Sun, 22 Aug 2021 21:46:26 +0430</pubDate>
            </item>
                    <item>
                <title>نصب و فعال Https روی Apache در لینوکس</title>
                <link>https://virgool.io/devcoach/%D9%86%D8%B5%D8%A8-%D9%88-%D9%81%D8%B9%D8%A7%D9%84-https-%D8%B1%D9%88%DB%8C-apache-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-g4tsvpbzgrzj</link>
                <description>در پست می خوایم نحوه ای نصب کردن گواهی نامه SSL یا همون  https  روی سرور های لینوکس بر روی وب سرور apache رو  آموزش بدم  و در پست بعدی نحوه ای نصب روی وب سرور  nginx اموزش خواهم داد.اینکه https چیه و چه مزایای نسبت به http داره می تونید از این لینک در موردش بخونید و در یک جمله اینو بگم که فرق بین http و https  اینکه در پروتکل  ارتباطی  https  ارتباط بین کاربر و سرور به صورت امن خواهد بود و از نظر سئو هم تاثیر داره بر روی سایت.فرق بین https با httpیکی از راه های نصب و فعال کردن  https  خرید گواهینامه  SSL  یا همون  TLS از سایت معتبر هست که بعد از خرید سه تا فایل می دن که اون ها روی سرور  آپلود می کنید یا اگه از  CDN استفاده می کنید  روی سرویس CDN که از آن استفاده می کنید , آپلود می کنید ولی ما در این پست نحوه ای نصب و استفاده از  https  های رایگان که در سطح اینترنت هستند رو آموزش می دیم. در واقع  TLS  همون نسخه ای ارتقا یافته ای  SSL  هست  ورژن  SSL 3.1 همان TLS 1.0 است. در حال حاضر   TLS  به ورژن 1.2 ٰرسیده و در هریک از این آپدیت‌ها امکانات امنیتی جدیدی افزوده و معرفی می شود.این نکته رو هم بگم که گواهینامه های پولی مدت اعتبارشون 1 سال هست ولی گواهینامه های رایگان مدتش 90 روزه که می شه دوباره تمدید کردخب بریم سراغ آموزش ما در این پست می خوایم از  Let&#x27;s Encrypt استفاده کنیم ما داخل سرور ممکنه چندن دامنه و ساب دامنه داشته باشه که برای هر کدوم باید جداگانه نصب کنیم https  رو. اول apache رو نصب می کنیم یا اگه نصب بررسی می کنیم که نسخه چنده رو نصب کردیم می توانید از دستور برای بررسی نصب بودن روی سرور چک کنید :apache2-v و اگه نصب نیست با این دستور نصب کنید :sudo apt install apache2 بعد از نصب بررسی می کنیم که نصب شده و فعال هست :sudo systemctl status apache2 خب یک پوشه ایجاد می کنیم  sudo  mkdir/var/www/html/api.ir داخل پوشه api.ir به فایل به نام   index.html ایجاد می کنیم که محتواش می تونه هر چی باشه:sudo  nano/var/www/html/api.ir/index.html داخل فایل : https://virgool.io/d/g4tsvpbzgrzj/edit خب یه فایل server block برای دامنه ایجاد می کنیم:sudo nano/etc/apache2/sites-available/api.ir.conf و داخلش این تنظیمات مربوط به  server block رو کپی می کنیم :ServerAdminadmin@example.com
ServerName api.ir
ServerAlias www.api.ir
DocumentRoot/var/www/html/api.ir
و با این دستور این server block رو به پوشه اس site-enable لینک می کنیم :ln  -s  /etc/apache2/sites-available/api.ir/      etc/apache2/sites-enabled/api.ir سیستم کلی وب سرور اینجوری که یه پوشه برای سایت ها و دامنه ای در دسترس وجود و هر کدوم رو خواستم لینک می کنیم به پوشه سایت های فعال حتی nginx هم این روند رو دارهحالا تنظیمات مربوط به وب سرور تموم هست می ریم Let&#x27;s Encrypt رو نصب کنیمsudo apt install certbot بعد از نصب برای اینکه بتوانیم از پلاگین webroot   استفاده کنیم یک پوشه ایجاد می کنیم بعد سطح دسترسی به اون رو تغییر می دیم:sudo mkdir  -p  /var/lib/letsencrypt/.well-known
sudo chgrp www-data/var/lib/letsencrypt
sudo chmod   g+s   /var/lib/letsencrypt  https://virgool.io/d/g4tsvpbzgrzj/sudomkdir-p/var/lib/letsencrypt/.well-knownsudochgrpwww-data/var/lib/letsencryptsudochmodg+s/var/lib/letsencrypt  sudo  nano   /etc/apache2/conf-available/well-known.conf  و داخلش این دستورات رو کپی می کنیم و در اخر ذخیره می کنیم و از فایل بیرون می ایم Alias/.well-known/acme-challengeهمه ای دامنه ها به یه ip آدرسی  که مربوط به سرور هست اشاره می کنند و بعد از رسیدن به سرور این apache هست که این درخواست رو هندل می کنه و برای اینکه برای این درخواست ها گواهینامه ssl رو فعال کنیم باید این کامند ها رو اجرا کنیم sudo a2enmod ssl
sudo a2enmod headers
sudo a2enmod http2
sudo a2enconf well-knownبعد از فعال کردن apache رو ریستارت می کنیم sudo systemctl restart apache2 خب بعد از اینکه گواهینامه ssl رو فعال کردیم باید برای هر دامنه یا ساب دامنه یک بار https رو نصب کنیم ما اینجا یک دامنه به آدرس api.ir ایجاد کردیم که بدین صورت خواهد بودsudo certbot certonly   --agree-tos  --email    admin@api.ir  --webroot  -w       /var/lib/letsencrypt/   -d   api.ir   -d  www.api.ir اگه درست نصب شده باشه باید با خروجی زیر رو به رو بشیم که می گه تبریک با موفقیت نصب شده importantnotes:-Congratulations!Yourcertificateandchainhavebeensavedat:/etc/letsencrypt/live/api.ir/fullchain.pemYourkeyfilehasbeensavedat:/etc/letsencrypt/live/api.ir/privkey.pemYourcertwillexpireon2020-06-27.Toobtainanewortweakedversionofthiscertificateinthefuture,simplyruncertbotagain.Tonon-interactivelyrenew*all*ofyourcertificates,run خب برای اینکه  بخواهیم تبادل اطلاعات  بین کاربر و سرور به صورت رمز نگاری شده باشد باید یک کلید تبادل  به مقدار 2048 تولید کنیمsudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048دوباره فایل  server block که برای دامنه api.ir ایجاد کرده بودیم رو باز می کنیم و به این صورت ویراش می کنیم &lt;VirtualHost *:80&gt;      
    ServerAdmin admin@example.com     
    ServerName api.ir
    ServerAlias www.api.ir    
    DocumentRoot /var/www/html/api.ir  
     ErrorLog ${APACHE_LOG_DIR}/api.ir-error.log 
&lt;/VirtualHost&gt;

&lt;VirtualHost *:443&gt;
  ServerName api.ir
  ServerAlias www.api.ir 
  DocumentRoot /var/www/html/api.ir

  Protocols h2 http:/1.1

  &lt;If &amp;quot%{HTTP_HOST} == &#039;www.api.ir&#039;&amp;quot&gt;
    Redirect permanent / https://api.ir/
  &lt;/If&gt;
  
  ErrorLog ${APACHE_LOG_DIR}/api.ir-error.log
  CustomLog ${APACHE_LOG_DIR}/api.ir-access.log combined

  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/api.ir/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/api.ir/privkey.pem
  SSLOpenSSLConfCmd DHParameters &amp;quot/etc/ssl/certs/dhparam.pem&amp;quot
  
  SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
  SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
  SSLCompression off
  SSLUseStapling on

&lt;/VirtualHost&gt;برای اینکه پروتکل https هم بتونه اطلاعات رو کش کنه و از کش بخونه باید تنظیمات مربوط به ان را توی تنظیمات apache فعال کنیم فایل ssl.conf رو باز می کنیم :sudo nano /etc/apache2/mods-available/ssl.confبعد  دارکتیو SSLStaplingCache  رو اضافه می کنیم # Set the location of the SSL OCSP Stapling Cache
 SSLStaplingCache shmcb:/tmp/stapling_cache(128000)  و مرحله ای آخر apache  رو ریستارت می کنیمsudo systemctl restart apache2برای اینکه هر 30 روز به صورت خودکار اعتبار گواهینامه دوباره تمدید بشه البته گفتم  مدت اعتبارش 90 روزه داخل cronjob این دستور رو اضافه می کنیم :0 1 * * * /usr/bin/certbot renew &amp; &gt; /dev/nullبرای اینکه تست کنیم تمدید تاریخ اعتبار به درستی کار می کنه یه بار دستی تست می کنیمsudo certbot renew --dry-runتبریک می گم شما تونستید گواهینامه  SSL  رو  روی دامنه خود نصب کنید و از این به بعد ارتباط بین سرور و کاربر شما به صورت امن و رمز نگاری خواهد شد .</description>
                <category>دوکوئچ  | مسیر حرفه ای برنامه نویسی</category>
                <author>جعفر اسماعیلی</author>
                <pubDate>Thu, 05 Mar 2020 18:42:57 +0330</pubDate>
            </item>
                    <item>
                <title>Mysql Storage Engine</title>
                <link>https://virgool.io/devcoach/mysql-storage-engine-anf3zybqexw0</link>
                <description>همه ای پایگاه داده ها از موتورهای  ذخیره سازی (storage engine) برای انجام پردازش و مدیریت عملیات CURD استفاده می کنند.پایگاه دادی Mysql هم از انواع موتور های ذخیره سازی ازجملهInnoDB,MyISAM,CSV,Memory,SEQENCE,پشتیبانی می کند.به صورت پیش فرض موتور ذخیره InnoDB فعال هست و اکثرا توسعه دهندگان حالت پیش فرض رو انتخاب می کنند و بعدا طبق نیاز پروژه عوض می کنند چون هر موتور ذخیره سازی کاربرد های خودش را دارد.برای مشاهده همه ای موتور های ذخیره و پردازش اطلاعات می توان از دستور زیر استفاده کرد:SELECT ENGINE, SUPPORT FROM INFORMATION_SCHEMA.ENGINES;بعد از اجرای دستور بالا لیست موتور های Mysql نمایش داده می شود همان طور که می بینید InnoDB به صورت پیش فرض  برای همه ای جدول ها ها فعال هست.حالا چند تا از موتور های دخیره سازی مشهور که اکثرا استفاده می شود بررسی می کنیم و شما بسته به نیاز پروژه می توانید از آن استفاده کنید. ویژگی های  InnoDB Storage Engineپشتیبانی از تراکنش ها پشتبانی کامل از خاصیت ACIDپشتیبانی از کلید خارجیظرفیت ذخیره سازی تا 64TBاگر نمی دانید خاصیت ACID چی هست می توانید از این لینک که دوستان زحمت کشیدن نوشتن استفاده کنید.مفهوم ACID چیست و بعنوان یک توسعه دهنده چگونه در باره‌ی آن فکر کنیم؟مشخصه های اصلی یک تراکنش ( ACID )ویژگی های MyISAM Storage Engineمناسب برای داده های سنگینعدم پشتیبانی از تراکنش هاعدم پشتیبانی از خاصیت ACIDعدم پشتیبانی از کلید خارجیظرفیت ذخیره سازی تا 256TBویژگی های CSV Storage Engineداده های به صورت متن ساده ذخیره می شوند و می توان از فایل csv مستقیم داده وارد کردعدم پشتیبانی از تراکنش هاعدم پشتیبانی از خاصیت ACIDعدم پشتیبانی از کلید خارجیویژگی های NDB Storage Engineپشتیبانی از بانک اطلاعاتی کلاسترینگپشتیبانی از تراکنش ها پشتیبانی از ویژگی های موتور ذخیره سازی Memory Storage Engineظرفیت ذخیره سازی تا 384EBمنظور از  بانک اطلاعاتی کلاسترنیگ این است که می توان داده های در جا و سرور های مختلفی با قابلیت تحمل خطای بالا ذخیره و بازیابی کرد.برای تکثیر اطلاعات به چندین سرور نیاز داریم و برای عملکرد و سرعت زیاد بهتر است سرور ها در یک مرکز باشند.به صورت پیش فرض در اکثرا نسخه های Mysql این موتور ذخیره سازی پشتیبانی نمی شود و بهتر است که نسخه ای MySQL community Edition داخل سرور نصب شود.ویژگی های Memory Storage Engineبرای ذخیره داده ها از RAM استفاده می کندعدم پشتیبانی از کلید خارجی و تراکنش هاظرفیت ذخیره سازی بسته به مقدار RAM سیستم یا سرورمناسب برای داده های که نیاز به خواندن دارند. و یه نکته به هر دلیلی سیستم یا سرور دوباره راه اندازی (restart) شود  همه ای داده های از بین می رود بنابراین بهتر است که برای داده ای مهم و حیاطی از این موتور ذخیره سازی استفاده نشود.  برای مشاهده جزیئات ویژگی های هر موتور ذخیره سازی از این دستور می توانید استفاده کنید.SHOW ENGINES; برای مشاهده همه ای ویژگی های هر موتور ذخیره سازی بر روی این لینک کلیک کنید.</description>
                <category>دوکوئچ  | مسیر حرفه ای برنامه نویسی</category>
                <author>جعفر اسماعیلی</author>
                <pubDate>Tue, 12 Nov 2019 23:20:27 +0330</pubDate>
            </item>
            </channel>
</rss>