سرور مجازی

۲۱ مطلب با کلمه‌ی کلیدی «خرید سرور» ثبت شده است

  • ۰
  • ۰

نحوه فعال کردن SFTP بدون دسترسی Shell در اوبونتو 20.04

ورود به سایت

معرفی

SFTP مخفف SSH File Transfer Protocol است و راهی مطمئن برای انتقال فایلها بین ماشینها با استفاده از اتصال SSH رمزگذاری شده است. اگرچه از نظر نام مشابه است ، این پروتکل متفاوت از FTP (پروتکل انتقال فایل) است ، اما SFTP به طور گسترده توسط سرویس گیرندگان FTP مدرن پشتیبانی می شود.

SFTP به صورت پیش فرض بدون پیکربندی اضافی در همه سرورها با دسترسی SSH فعال است. اگرچه استفاده از آن ایمن و نسبتاً ساده است ، اما یکی از معایب SFTP این است که در پیکربندی استاندارد ، سرور SSH به همه کاربران دارای حساب در سیستم دسترسی به انتقال فایل و دسترسی به پوسته پایانه را می دهد. به عنوان مثال ، ممکن است بخواهید به برخی از کاربران اجازه دهید فقط انتقال فایل را انجام دهند ، اما از دسترسی ترمینال آنها به سرور از طریق SSH جلوگیری کنید.

در این آموزش ، شما SSH daemon را تنظیم می کنید تا دسترسی SFTP را به یک فهرست بدون دسترسی SSH به ازای هر کاربر محدود کند.

برای پیگیری این آموزش ، باید به سرور اوبونتو 20.04 دسترسی داشته باشید. این سرور باید دارای یک کاربر غیر root با امتیازات sudo و همچنین فایروال فعال باشد.

پیش نیازها

برای پیگیری این آموزش ، باید به سرور اوبونتو 20.04 دسترسی داشته باشید. این سرور باید دارای یک کاربر غیر root با امتیازات sudo و همچنین فایروال فعال باشد. برای کمک به تنظیم این ، راهنمای راه اندازی سرور اولیه ما برای اوبونتو 20.04 را دنبال کنید.

مرحله 1 – ایجاد یک کاربر جدید

ابتدا ، یک کاربر جدید ایجاد کنید که فقط اجازه انتقال فایل به سرور را دارد. در اینجا ، ما از نام کاربری sammyfiles استفاده می کنیم ، اما شما می توانید از هر نام کاربری که دوست دارید استفاده کنید:

sudo adduser sammyfiles

از شما خواسته می شود که یک رمز عبور برای حساب ایجاد کنید ، و سپس اطلاعاتی در مورد کاربر وارد کنید. اطلاعات کاربر اختیاری است ، بنابراین می توانید ENTER را فشار دهید تا آن فیلدها خالی بمانند.

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

مرحله 2 – ایجاد یک دایرکتوری برای انتقال فایل

برای محدود کردن دسترسی SFTP به یک دایرکتوری ، ابتدا باید مطمئن شوید که دایرکتوری با الزامات مجوزهای سرور SSH مطابقت دارد ، که بسیار خاص هستند.

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

روشهای مختلفی برای حل این مشکل مالکیت وجود دارد. در این آموزش ، شما از/var/sftp/uploads به عنوان پوشه بارگذاری هدف استفاده می کنید . /var/sftp متعلق به root است و توسط سایر کاربران قابل نوشتن نخواهد بود. زیر شاخه/var/sftp/uploads متعلق به sammyfiles است ، به طوری که کاربر می تواند فایل ها را در آن بارگذاری کند.

ابتدا دایرکتوری ها را ایجاد کنید:

sudo mkdir -p /var/sftp/uploads

 /var /sftp را روی root تنظیم کنید:

sudo chown root:root /var/sftp

به همان دایرکتوری مجوز نوشتن root بدهید و به سایر کاربران فقط حق خواندن و اجرا را بدهید:

sudo chmod 755 /var/sftp

مالکیت فهرست بارگذاری ها را به کاربری که به تازگی ایجاد کرده اید تغییر دهید. دستور زیر مجدداً از مثال کاربر و گروه sammyfiles استفاده می کند ، بنابراین اگر نام کاربری دیگر را ایجاد کردید ، این مورد را تغییر دهید:

sudo chown sammyfiles:sammyfiles /var/sftp/uploads

اکنون که ساختار دایرکتوری برقرار است ، می توانید خود سرور SSH را پیکربندی کنید.

مرحله 3 – محدود کردن دسترسی به یک دایرکتوری

در این مرحله ، پیکربندی سرور SSH را تغییر می دهید تا دسترسی ترمینال برای sammyfiles ممنوع شود ، اما اجازه انتقال فایل را می دهد.

فایل پیکربندی سرور SSH را با استفاده از nano یا ویرایشگر متن مورد علاقه خود باز کنید:

sudo nano /etc/ssh/sshd_config

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

/etc/ssh/sshd_config

Match User sammyfiles
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/sftp
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no

در اینجا هر دستورالعمل انجام می دهد:

  • Match User به سرور SSH می گوید دستورات زیر را فقط برای کاربر مشخص شده اعمال کند. در اینجا ، sammyfiles را مشخص می کنیم. مجدداً ، مطمئن شوید که این نام را در صورت متفاوت با نام کاربر خود به روز کنید.
  • ForceCommand داخلی-sftp سرور SSH را مجبور می کند تا سرور SFTP را هنگام ورود اجرا کند و دسترسی به پوسته را ممنوع می کند.
  • PasswordAuthentication بله اجازه احراز هویت رمز عبور را برای این کاربر می دهد.
  • ChrootDirectory/var/sftp/تضمین می کند که کاربر اجازه دسترسی به هر چیزی فراتر از فهرست/var/sftp را نخواهد داشت.
  • AllowAgentForwarding شماره ، AllowTcpForwarding شماره. و X11Forwarding به ترتیب حمل و نقل پورت ، تونل زنی و حمل و نقل X11 را برای این کاربر غیرفعال نمی کند.

این مجموعه دستورات ، با Match User شروع می شود ، می تواند برای کاربران مختلف نیز کپی و تکرار شود. مطمئن شوید که نام کاربری را در خط Match User بر این اساس تغییر دهید.

پس از افزودن این خطوط ، فایل را ذخیره و ببندید. اگر از نانو استفاده می کنید ، می توانید این کار را با فشار دادن CTRL + X و سپس Y و سپس ENTER انجام دهید.

برای اعمال تغییرات پیکربندی ، سرویس را راه اندازی مجدد کنید:

sudo systemctl restart sshd

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

مرحله 4 – تأیید پیکربندی

اجازه دهید اطمینان حاصل کنیم که کاربر جدید sammyfiles ما فقط می تواند فایل ها را منتقل کند. همانطور که قبلاً ذکر شد ، SFTP برای انتقال فایل بین ماشین ها استفاده می شود. می توانید با آزمایش انتقال بین دستگاه محلی و سرور خود ، این کار را تأیید کنید.

ابتدا سعی کنید به عنوان کاربری که در مرحله 1 ایجاد کرده اید وارد سرور خود شوید زیرا به دلیل تنظیماتی که به فایل پیکربندی SSH اضافه کرده اید ، این امکان پذیر نخواهد بود:

ssh sammyfiles@your_server_ip

قبل از بازگشت به درخواست اولیه ، پیام زیر را دریافت خواهید کرد:

OutputThis service allows sftp connections only.
Connection to your_server_ip closed.

این بدان معناست که فایل sammyfiles دیگر نمی تواند با استفاده از SSH به پوسته سرور دسترسی پیدا کند.

در مرحله بعد ، بررسی کنید که آیا کاربر می تواند با موفقیت به SFTP برای انتقال فایل دسترسی پیدا کند:

sftp sammyfiles@your_server_ip

به جای پیغام خطا، این دستور یک پیام ورود موفق با یک اعلان تعاملی ایجاد می کند:

Output

OutputConnected to your_server_ip
sftp>

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

sftp>ls

با این کار پوشه بارگذاری هایی که در مرحله قبل ایجاد شده بود نشان داده می شود و شما را به دستور sftp> بر می گرداند:

 

Output

uploads

برای تأیید اینکه کاربر واقعاً به این فهرست محدود شده است و نمی تواند به هیچ دایرکتوری قبل از آن دسترسی داشته باشد ، می توانید دایرکتوری را به فهرست قبلی تغییر دهید:

sftp>cd ..

این دستور خطایی نمی دهد اما محتویات فهرست را مانند قبل بدون هیچ تغییری لیست می کند و ثابت می کند که کاربر قادر به تغییر در فهرست اصلی نبوده است.

اکنون تأیید کرده اید که پیکربندی محدود همانطور که در نظر گرفته شده عمل می کند. کاربر sammyfiles که تازه ایجاد شده است می تواند تنها با استفاده از پروتکل SFTP برای انتقال فایل به سرور دسترسی داشته باشد و توانایی دسترسی به پوسته کامل را ندارد.

نتیجه

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

سرور SSH طرح های پیکربندی پیچیده تری را امکان پذیر می کند ، از جمله محدود کردن دسترسی به گروه ها یا چندین کاربر به طور همزمان ، یا حتی دسترسی محدود به برخی آدرس های IP.

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از تم ها در Gatsby

ورود به سایت

معرفی

Gatsby 1.0 در سال 2017 منتشر شد و از آن زمان به بعد ویژگی های جدید خود را همچنان حفظ می کند ، در حالی که قابلیت سفارشی سازی بالا را به عنوان یک تولید کننده سایت استاتیک حفظ می کند. ویژگی های افزوده شده به شکل افزونه ها ، API های جدید ، ابزارهای کمکی و گزینه های پیکربندی است. هر یک از این ویژگی ها را می توان به صورت جداگانه استفاده کرد و سفارشی کرد یا با هم ترکیب کرد تا موارد خاص استفاده را اعمال کند. با این حال ، از آنجا که بسیاری از سایت ها از ترکیب ویژگی ها و تنظیمات یکسانی بهره می برند ، Gatsby تم های Gatsby را معرفی کرد.

تم ها در Gatsby به طور خاص به افزونه هایی اشاره می کنند که به عنوان مجموعه ای از گزینه های پیکربندی ، عملکرد و/یا عناصر رابط کاربر (UI) عمل می کنند. تفکیک ویژگی های به اشتراک گذاشته شده در موضوعات حفظ شده باعث می شود سایت شما به روزتر باشد و همچنین به شما اجازه می دهد زمان کمتری را برای پیکربندی سایت خود صرف کنید و زمان بیشتری را برای توسعه محتوا اختصاص دهید.

در این آموزش ، شما تم Gatsby را برای انتشار پست های وبلاگ نصب ، پیکربندی و استفاده می کنید: gatsby-theme-blog. این افزونه چندین ویژگی مانند پشتیبانی از MDX و برجسته سازی کد را در یک بسته مناسب قرار می دهد. در طول دوره آموزشی ، روند استفاده از این موضوع خاص Gatsby را دنبال می کنید ، که می توانید آن را به طور کلی در موضوعات اعمال کنید.

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

پیش نیازها

قبل از شروع کار ، چند مورد را که لازم دارید در اینجا آورده ایم:

  • نصب محلی Node.js برای اجرای Gatsby و ایجاد سایت شما. روش نصب بر اساس سیستم عامل متفاوت است ، اما vpsgol دارای راهنمای Ubuntu 20.04 و macOS است و همیشه می توانید آخرین نسخه را در صفحه بارگیری رسمی Node.js پیدا کنید.
  • آشنایی با جاوا اسکریپت برای کار در Gatsby. زبان جاوا اسکریپت یک مبحث گسترده است ، اما یک نقطه شروع خوب نحوه کدگذاری ما در سری جاوا اسکریپت است.
  • یک پروژه جدید Gatsby ، داربست از gatsby-starter-default. برای ساخت یک پروژه جدید Gatsby از ابتدا ، می توانید به مرحله 1 آموزش نحوه راه اندازی اولین وب سایت Gatsby مراجعه کنید.

این آموزش روی Node.js v14.16.1 ، npm v6.14.12 ، Gatsby v3.11.1 و gatsby-theme-blog v3.0.0 آزمایش شده است.

مرحله 1 – پیدا کردن و نصب یک تم

اگرچه این آموزش با استفاده از یک موضوع خاص ، gatsby-theme-blog ، شما را راهنمایی می کند ، اما هر مرحله به طور کلی در مورد موضوعات Gatsby نیز کاربرد دارد. این امر در مورد اولین مرحله نیز صدق می کند: یافتن موضوعی که می خواهید استفاده کنید و نصب آن با npm.

Gatsby به نویسندگان افزونه و موضوع درباره نحوه انتشار بسته هایGatsby خود راهنمایی می کند ، که پیدا کردن موضوعی متناسب با نیازهای شما را آسان تر می کند. به توسعه دهندگان تم دستور داده می شود که بسته های موضوعی خود را با gatsby و gatsby-theme به عنوان کلمات کلیدی برچسب گذاری کنند ، که سپس توسط رجیسترهای بسته (جایی که فایلها در واقع میزبانی می شوند) اسکن شده و قابل جستجو می شوند.

این آموزش موارد استفاده از ساخت سایت دارای Gatsby با زیر بخش وبلاگ را دنبال می کند. شما به عنوان توسعه دهنده به دنبال موضوعی برای افزودن پشتیبانی از MDX ، برجسته سازی کد و موارد دیگر هستید. گرچه Gatsby مرورگر افزونه خود را دارد ، اما در واقع لیست های خود را از رجیستری npm خارج می کند ، بنابراین اولین قدم شما این است که جستجوی خود را مستقیماً در موتور جستجوی رجیستری npm شروع کنید. با استفاده از ورودی جستجوی کلمات کلیدی وبلاگ: gatsby-theme ، نتایج خود را تنها به آن افزونه هایی که دارای کلمه کلیدی gatsby-theme هستند محدود می کنید ، همانطور که در تصویر زیر نشان داده شده است:

در این آموزش ، شما از gatsby-theme-blog استفاده می کنید ، بنابراین آن بسته را انتخاب کنید. با انتخاب gatsby-theme-blog به عنوان موضوعی که قصد نصب آن را دارید ، قسمت بعدی این مرحله این است که در واقع آن را به همراه وابستگی های آن نصب کنید. به پروژه موجود Gatsby بروید و دستور زیر را در فهرست اجرا کنید:

npm install gatsby-theme-blog

پس از اتمام نصب وابستگی ها ، پیامی مشابه زیر مشاهده خواهید کرد:

 

Output

...
+ gatsby-theme-blog@3.0.0
added 262 packages from 181 contributors and audited 2391 packages in 49.706s

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

مرحله 2 – بارگیری و پیکربندی تم

اکنون که تم شما نصب شده است ، می توانید از آن در سایت خود استفاده کرده و آن را بر اساس نیاز خود تغییر دهید. در Gatsby ، راه اندازی اولیه و پیکربندی تم اصلی با ویرایش فایل پیکربندی ریشه ، gatsby-config.js انجام می شود. در این مرحله ، فایل پیکربندی را ویرایش می کنید تا در گزینه مورد نظر خود در تم خود بارگذاری شود.

فایل پیکربندی gatsby-config.js را در ویرایشگر دلخواه خود باز کنید ، سپس موارد زیر را اضافه کنید:

gatsby-config.js

module.exports = {
  plugins: [
    ...
    `gatsby-plugin-image`,
    {
      resolve: 'gatsby-theme-blog',
      options: {
        basePath: '/posts',
        contentPath: `md/posts`,
      }
    },
    `gatsby-transformer-sharp`,
    ...
  ]
}

در این کد پیکربندی ، دو تنظیم مهم وجود دارد که از مقادیر سفارشی برای آنها استفاده می کنید. موضوع از گزینه basePath برای تنظیم آدرس وبلاگ استفاده می کند و contentPath به موضوع می گوید که کجا فایلهای Markdown را برای انتشار به عنوان پست وبلاگ پیدا کنید. استفاده از مقدار md/posts برای contentPath به این معنی است که فایلهای Markdown شما باید در فهرست md/posts قرار داشته باشند.

پس از افزودن این کد ، فایل پیکربندی خود را ذخیره کنید.

موضوع gatsby-theme-blog تنظیمات بیشتری را ارائه می دهد ، که در فایل README gatsby-theme-blog ثبت شده است. از آنجا که هر موضوع Gatsby متفاوت است ، مهمترین قسمت این مرحله مراجعه به مستندات موضوع انتخابی شما و پیروی از راهنمایی های دقیق ارائه شده در آن است.

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

مرحله 3 – آزمایش عملکرد

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

شما MDX ، برجسته سازی کد و پشتیبانی پردازش Markdown از gatsby-theme-blog را با یک فایل پست وبلاگ جدید آزمایش خواهید کرد. ابتدا ، شما باید پوشه ای را برای نگهداری فایل ها ایجاد کنید ، که باید با تنظیم محتوای مسیر md/post هایی که در مرحله شماره 2 استفاده کرده اید مطابقت داشته باشد. شما می توانید این فهرست را به صورت دستی در مرورگر فایل خود ایجاد کنید یا با اجرای این دستور در ریشه پروژه Gatsby خود ، آن را در ترمینال خود ایجاد کنید:

mkdir -p ./md/posts

در مرحله بعد ، یک فایل خالی MDX ، my-first-post.mdx ایجاد کنید که حاوی محتوای پست جدید شما باشد. دوباره می توانید این را به صورت دستی یا در ترمینال ایجاد کنید:

touch ./md/posts/my-first-post.mdx

حالا فایل خالی MDX را باز کرده و کد زیر را به آن اضافه کنید:

md/posts/my-first-post.mdx

---
title: Learning Gatsby Themes and Trying MDX
slug: /posts/gatsby-theme-learning
date: 2021-08-16
excerpt: A post about learning Gatsby themes and trying out some MDX.
---

## Welcome!

This is a post where I plan to share my journey learning Gatsby Themes, and to try out some MDX.

## Resources

<ul>
{[
    {
        link: 'https://www.gatsbyjs.com/',
        text: 'Gatsby Website',
        note: 'Official Website for Gatsby'
    },
    {
        link: 'https://www.gatsbyjs.com/docs/themes/',
        text: 'Gatsby Theme Documentation',
        note: 'Documentation for Gatsby Theme usage and development'
    },
    {
        link: 'https://www.vpsgol.com/community/tutorial_series/how-to-create-static-web-sites-with-gatsby-js',
        text: 'vpsgol - "How To Create Static Web Sites with Gatsby.js"',
        note: 'A vpsgol tutorial series on using Gatsby JS'
    }
].map(item => (
    <li key={item.link}>
        <a href={item.link} target="_blank">{item.text}</a>
        <ul>
            <li>{item.note}</li>
        </ul>
    </li>
))}
</ul>

## Code Sample

To try out code highlighting in this theme, here is a snippet of JavaScript code. This code won't run in your browser; it is for visual use only.

در بالای فایل ، قسمتی که توسط — محصور شده است مجموعه ای از جفت های کلید-مقدار است که frontmatter نامیده می شود. همه موضوعات از کلیدهای یکسانی استفاده نمی کنند و آنهایی که در پست خود استفاده می کنید از بین کلیدهای مورد استفاده gatsby-theme-blog با دقت انتخاب شده اند. شما یک عنوان سفارشی ، راه حل (مسیر URL) ، تاریخ انتشار و گزیده ای (پیش نمایش متن برای نمایش در صفحه فهرست پست ها) را تعریف کرده اید.

تمام متنی که از دستور جلو پیروی می کند ، بدنه پست می شود و با خوش آمدید شما شروع می شود! بخش. دو علامت هش (##) قبل از متن عنوان به Markdown می گویند که این یک عنوان سطح 2 است که برای بخش منابع نیز استفاده می شود.

در بخش منابع ، اولین استفاده خود را از آنچه MDX را از Markdown معمولی متمایز می کند ، استفاده می کنید: استفاده از نحو JSX React برای جاسازی اجزای React که با Markdown شما ادغام شده و به یک صفحه واحد تبدیل می شوند. در پست خود ، از JSX برای تبدیل مجموعه ای از منابع درباره Gatsby به لیست پیوندهای HTML استفاده می کنید.

سرانجام ، برای آزمایش ویژگی برجسته سازی نحو کد همراه با gatsby-theme-blog ، یک بلوک Markdown Fidden Code Block در انتهای فایل اضافه کنید:

md/posts/my-first-post.mdx

```js
function saySomething(name) {
    console.log(`Hello ${name}!`);
    console.log(`Isn't learning about Gatsby fun?!`);
}
saySomething('Arthur');
```

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

پس از اتمام ویرایش پست جدید ، فایل MDX را ذخیره و ببندید.

برای مشاهده این پست به عنوان یک بیننده ، با آزمایش تمام ویژگی های افزونه تم ، دستور زیر را اجرا کنید:

npm run develop

پس از آماده شدن ، Gatsby CLI از شما می خواهد که پروژه خود را در مرورگر وب خود باز کنید ، که می توانید با رفتن به localhost: 8000 این کار را انجام دهید. برای مشاهده صفحه فهرست وبلاگ جدید ، از localhost: 8000/posts دیدن کنید و برای مشاهده این پست جدید ، به localhost بروید: 8000/posts/gatsby-theme-learning/. پست وبلاگ به شکل زیر خواهد بود:

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

مرحله 4 – استفاده از سایه (اختیاری)

در این مرحله از آموزش ، شما قبلاً یک تم شخص ثالث را در Gatsby نصب کرده و پیکربندی کرده اید. پیکربندی در gatsby-config.js انجام شد و محدود به گزینه هایی بود که ناشر موضوع برای سفارشی سازی آنها انتخاب کرده بود. اگر نیاز به سفارشی سازی یک موضوع فراتر از این گزینه ها دارید ، از یک مفهوم Gatsby به نام سایه استفاده می کنید ، که در این مرحله این کار را انجام می دهید.

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

با تم های Gatsby ، هر فایلی در کد منبع تم می تواند تحت سایه قرار گیرد ، از روش هایی که بر روی گره Gatsby و ایجاد فایل تأثیر می گذارد تا عناصر و طرح های UI. برای وبلاگ خود ، یک فایل کامپوننت React به نام bio-content.js را تحت سایه قرار دهید تا نحوه نمایش بیوگرافی وبلاگ شما در زیر هر پست سفارشی شود. با سایه انداختن این یک فایل ، بر ظاهر هر پست وبلاگی که از طریق افزونه gatsby-theme-blog می گذرد تأثیر می گذارید.

اولین قدم برای ایجاد سایه این است که یک پوشه در فهرست src خود با نام دقیق افزونه تم مورد نظر خود ایجاد کنید. می توانید این کار را به صورت دستی یا با ترمینال انجام دهید:

mkdir src/gatsby-theme-blog

برای هر فایل خاصی در تم که می خواهید سایه داشته باشد ، مرحله بعدی ایجاد یک پرونده با همان نام و ساختار دایرکتوری مشابه در موضوع است. از آنجا که قصد دارید جزء زیستی موجود را کمی تغییر دهید ، می توانید با کپی کردن فایل موجود به عنوان نقطه شروع ، با دستور cp (copy) در زمان خود صرفه جویی کنید.

mkdir -p src/gatsby-theme-blog/components
cp node_modules/gatsby-theme-blog/src/components/bio-content.js src/gatsby-theme-blog/components/bio-content.js

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

src/gatsby-theme-blog/components/bio-content.js

import React, { Fragment } from "react"

const BioContent = () => (
  <Fragment>
    <p>Content by vpsgol</p>
    <p>License Info:</p>
    <p
      style={{
        margin: "10px 20px",
        padding: 8,
        backgroundColor: "#0069ff",
        color: "white",
        borderRadius: 12,
      }}
    >
      This work is licensed under a Creative Commons
      Attribution-NonCommercial-ShareAlike 4.0 International License.
    </p>
  </Fragment>
)

export default BioContent

این فایل را ذخیره و ببندید ، زیرا اکنون ویرایش فایل سایه را انجام داده اید.

در این فایل ، شما فایل اصلی bio-content.js را تحت سایه قرار داده اید ، و متن نویسنده را با نام نویسنده و اطلاعات مجوز جایگزین کرده اید. شما این کار را با جایگزینی JSX برگردانده شده توسط کامپوننت BioContent React انجام داده اید. کد style = {{}} نمونه ای از CSS درون خطی است که از آن برای افزودن رنگ و فاصله به فراخوان مجوز استفاده کرده اید.

با اجرای مجدد npm run در ترمینال خود ، سرور توسعه Gatsby را راه اندازی می کنید و می توانید تغییرات را در همه پست های وبلاگ خود پیش نمایش کنید:

با استفاده از سایه زدن Gatsby ، شما فقط یک موضوع شخص ثالث Gatsby را فراتر از پیکربندی استاندارد تغییر داده اید و در لغو و افزونه های سفارشی خود مخلوط شده اید.

نتیجه

با دنبال کردن مراحل این آموزش ، اکنون یک سایت Gatsby دارید که از یک موضوع منتشر شده برای جمع آوری اجزای متعدد و قطعات عملکرد بسته به عنوان یک وابستگی واحد استفاده می کند. به لطف این قابلیت بسته بندی شده ، اکنون به روز رسانی سایت شما آسان تر است و علیرغم داشتن ویژگی های اضافی ، می تواند پیکربندی و کد راه اندازی بسیار کمتری داشته باشد. شما همچنین آموخته اید که چگونه از سایه برای سفارشی کردن تم های Gatsby در سطح عمیق تری بر اساس فایل استفاده کنید و قفل لایه دیگری از قابلیت توسعه را باز کنید.

اگرچه این آموزش یک موضوع خاص را پوشش می دهد ، اما مفاهیم و رویکردهایی که به آن اشاره می شود به طور کلی در موضوعات Gatsby کاربرد دارد. برای اطلاعات بیشتر در مورد موضوعات Gatsby ، به اسناد رسمی Gatsby نگاه کنید. اگر مایل به مطالعه بیشتر در مورد Gatsby هستید ، بقیه نحوه ایجاد وب سایت های استاتیک با سری Gatsby.js را بررسی کنید.

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه استفاده از نمایه ها در MongoDB

ورود به سایت

معرفی

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

انعطاف پذیری که MongoDB در رابطه با پرس و جوها ارائه می دهد ، می تواند موتور پایگاه داده را پیش بینی کند که چه نوع پرس و جوهایی بیشتر مورد استفاده قرار می گیرد. بدون توجه به اندازه مجموعه باید آماده یافتن اسناد باشد. به همین دلیل ، مقدار داده های موجود در یک مجموعه به طور مستقیم بر عملکرد جستجو تأثیر می گذارد: هرچه مجموعه داده بزرگتر باشد ، پیدا کردن اسناد مطابق با پرس و جو برای MongoDB دشوارتر است.

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

پیش نیازها

برای پیگیری این آموزش ، شما نیاز دارید:

  • سروری با کاربر معمولی و غیر روت با امتیازات sudo و فایروال با UFW پیکربندی شده است. این آموزش با استفاده از سروری که Ubuntu 20.04 را اجرا می کند تأیید شده است و می توانید با دنبال کردن این آموزش راه اندازی اولیه سرور برای اوبونتو 20.04 ، سرور خود را آماده کنید.
  • MongoDB روی سرور شما نصب شده است. برای تنظیم این ، آموزش ما را در مورد نحوه نصب MongoDB در اوبونتو 20.04 دنبال کنید.
  • نمونه MongoDB سرور شما با فعال کردن احراز هویت و ایجاد یک کاربر مدیریتی ایمن می شود. برای ایمن سازی MongoDB مانند این ، آموزش ما را در مورد نحوه ایمن سازی MongoDB در اوبونتو 20.04 دنبال کنید.
  • آشنایی با عملیات MongoDB CRUD و بازیابی اشیاء از مجموعه ها به طور خاص. برای یادگیری نحوه استفاده از پوسته MongoDB برای انجام عملیات CRUD ، آموزش نحوه انجام عملیات CRUD در MongoDB را دنبال کنید.

فهمیدن شاخص ها

به طور معمول ، هنگامی که از پایگاه داده MongoDB برای بازیابی اسناد مطابقت با شرایط خاصی – مانند قله های کوه با ارتفاع بیش از 8000 متر – درخواست می کنید ، پایگاه داده باید اسکن مجموعه ای را برای پیدا کردن آنها انجام دهد. این بدان معناست که هر سند را از مجموعه بازیابی می کند تا بررسی کند که آیا آنها با شرایط مطابقت دارند یا خیر. اگر سندی با شرایط مطابقت داشته باشد ، به لیست اسناد برگشتی اضافه می شود. اگر سندی با شرایط تعیین شده مطابقت نداشته باشد ، MongoDB تا زمانی که اسکن کل مجموعه را به پایان نرساند ، به سراغ اسکن سند بعدی می رود.

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

نمایه ها ساختارهای داده خاصی هستند که تنها زیرمجموعه کوچکی از داده های موجود در اسناد مجموعه را جدا از خود اسناد ذخیره می کنند. در MongoDB ، آنها به گونه ای پیاده سازی شده اند که پایگاه داده می تواند هنگام جستجوی مقادیر به سرعت و به طور م themثر از آنها عبور کند.

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

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

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

مرحله 1 – آماده سازی پایگاه داده نمونه

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

برای ایجاد این مجموعه نمونه ، به پوسته MongoDB به عنوان کاربر مدیریتی خود متصل شوید. این آموزش از قوانین پیش نیاز آموزش امنیتی MongoDB پیروی می کند و فرض می کند که نام این کاربر مدیریتی AdminSammy و پایگاه داده احراز هویت آن admin است. اطمینان حاصل کنید که این جزئیات را در دستور زیر تغییر دهید تا در صورت متفاوت بودن تنظیمات خود را نشان دهد

mongo -u AdminSammy -p –authenticationDatabase admin

گذرواژه ای را که هنگام نصب برای دسترسی به پوسته تعیین کرده اید وارد کنید. پس از ارائه رمز عبور ، درخواست شما به علامت بزرگتر از (>) تغییر می کند.

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

The Everest document

{
    "name": "Everest",
    "height": 8848,
    "location": ["Nepal", "China"],
    "ascents": {
        "first": {
            "year": 1953,
        },
        "first_winter": {
            "year": 1980,
        },
        "total": 5656,
    }
}

این سند شامل اطلاعات زیر است:

  • name: نام قله
  • ارتفاع: ارتفاع قله ، بر حسب متر.
  • مکان: کشورهایی که کوه در آنها واقع شده است. این فیلد مقادیر را به عنوان یک آرایه ذخیره می کند تا کوه های واقع در بیش از یک کشور را مجاز کند.
  • صعودها: مقدار این فیلد سند دیگری است. هنگامی که یک سند در سند دیگری مانند این ذخیره می شود ، به عنوان یک سند جاسازی شده یا تو در تو شناخته می شود. هر سند صعود صعودهای موفقیت آمیز کوه داده شده را توصیف می کند. به طور خاص ، هر سند صعود شامل یک میدان کلی است که تعداد کل صعودهای موفق هر قله را نشان می دهد. علاوه بر این ، هر یک از این اسناد تو در تو دارای دو فیلد است که مقادیر آنها نیز اسناد تو در تو هستند:.
    • اول: ارزش این زمینه یک سند تو در تو است که شامل یک زمینه ، سال است ، که سال اولین صعود موفقیت آمیز کلی را توصیف می کند.
    • first_winter: مقدار این فیلد یک سند تو در تو است که شامل یک فیلد یک ساله نیز می شود ، که مقدار آن نشان دهنده سال اولین صعود زمستانی موفق به این کوه است.

روش insertMany () زیر را در پوسته MongoDB اجرا کنید تا همزمان مجموعه ای با نام peaks ایجاد کنید و پنج نمونه سند را در آن وارد کنید. این اسناد پنج بلندترین قله کوه در جهان را توصیف می کند:

db.peaks.insertMany([
{
“name”: “Everest”,
“height”: 8848,
“location”: [“Nepal”, “China”],
“ascents”: {
“first”: {
“year”: 1953
},
“first_winter”: {
“year”: 1980
},
“total”: 5656
}
},
{
“name”: “K2”,
“height”: 8611,
“location”: [“Pakistan”, “China”],
“ascents”: {
“first”: {
“year”: 1954
},
“first_winter”: {
“year”: 1921
},
“total”: 306
}
},
{
“name”: “Kangchenjunga”,
“height”: 8586,
“location”: [“Nepal”, “India”],
“ascents”: {
“first”: {
“year”: 1955
},
“first_winter”: {
“year”: 1986
},
“total”: 283
}
},
{
“name”: “Lhotse”,
“height”: 8516,
“location”: [“Nepal”, “China”],
“ascents”: {
“first”: {
“year”: 1956
},
“first_winter”: {
“year”: 1988
},
“total”: 461
}
},
{
“name”: “Makalu”,
“height”: 8485,
“location”: [“China”, “Nepal”],
“ascents”: {
“first”: {
“year”: 1955
},
“first_winter”: {
“year”: 2009
},
“total”: 361
}
}
])

خروجی شامل لیستی از شناسه های شی است که به اشیاء تازه وارد شده اختصاص داده شده است.

 

Output

{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("61212a8300c8304536a86b2f"),
                ObjectId("61212a8300c8304536a86b30"),
                ObjectId("61212a8300c8304536a86b31"),
                ObjectId("61212a8300c8304536a86b32"),
                ObjectId("61212a8300c8304536a86b33")
        ]
}

با اجرای متد find () بدون آرگومان ، می توانید تأیید کنید که اسناد به درستی وارد شده اند ، که همه اسناد را بازیابی می کند

db.peaks.find()

 

Output

{ "_id" : ObjectId("61212a8300c8304536a86b2f"), "name" : "Everest", "height" : 8848, "location" : [ "Nepal", "China" ], "ascents" : { "first" : { "year" : 1953 }, "first_winter" : { "year" : 1980 }, "total" : 5656 } }

...

لطفاً توجه داشته باشید که این مجموعه نمونه آنقدر بزرگ نیست که بتواند تأثیر عملکرد شاخص ها یا فقدان آن را مستقیماً نشان دهد. با این حال ، این راهنما نحوه استفاده MongoDB از ایندکس ها را برای محدود کردن میزان اسناد مرور شده با توجه به جزئیات پرس و جو که توسط موتور پایگاه داده گزارش شده است ، توضیح می دهد.

با استفاده از داده های نمونه ، می توانید به مرحله بعدی ادامه دهید تا نحوه ایجاد فهرست بر اساس یک زمینه را بیاموزید.

مرحله 2 – ایجاد یک فهرست واحد و ارزیابی استفاده از شاخص

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

برای شروع ، عبارت زیر را اجرا کنید. به طور معمول ، سند پرس و جو {“height”: {$ gt: 8700}} باعث می شود که این پرس و جو هرگونه اسنادی را که قله کوهی با ارزش ارتفاع بیش از 8700 توصیف می کند ، بازیابی کند. با این حال ، این عملیات شامل روش توضیح (executiveStats) ، که باعث می شود پرس و جو در عوض اطلاعات مربوط به نحوه انجام این پرس و جو را برگرداند. از آنجا که هنوز هیچ نمایه ای ایجاد نکرده اید ، این یک معیار در اختیار شما قرار می دهد که می توانید از آن برای مقایسه در برابر پرس و جوهایی که از نمایه استفاده می کنند استفاده کنید:

db.peaks.find(
{ “height”: { $gt: 8700 } }
).explain(“executionStats”)

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

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                        "stage" : "COLLSCAN",
                        . . .
                },
        },
        . . .
        "executionStats" : {
                . . .
                "nReturned" : 1,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 0,
                "totalDocsExamined" : 5,
                . . .
        },
        . . .
}

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

WinPlan: این سند در بخش queryPlanner نحوه تصمیم گیری MongoDB برای اجرای پرس و جو را توضیح می دهد. بسته به نوع پرس و جو ، ساختار دقیق طرح برنده ممکن است متفاوت باشد ، اما در اینجا نکته اصلی که باید به آن توجه کنید COLLSCAN است. وجود این مقدار بدین معناست که MongoDB برای یافتن اسناد درخواستی نیاز به گذراندن مجموعه کامل بدون هیچ گونه کمکی داشت.
n بازگردانده شده: این مقدار به شما می گوید که چند سند توسط یک پرس و جو معین برگردانده شده است. در اینجا ، فقط یک قله کوه با پرس و جو مطابقت دارد.
ExeTimeMillis: این مقدار نشان دهنده زمان اجرا است. با چنین مجموعه کوچکی ، اهمیت آن ناچیز است. با این حال ، هنگام تجزیه و تحلیل عملکرد پرس و جوها در برابر مجموعه های بزرگتر یا پیچیده تر ، باید معیار مهمی را در نظر داشت.
totalKeysExamined: این به شما می گوید که چند مدخل فهرست را برای پیدا کردن اسناد درخواست شده در MongoDB بررسی کرده است. از آنجا که از اسکن مجموعه استفاده شد و شما هنوز هیچ فهرست ایجاد نکرده اید ، مقدار 0 است.
totalDocsExamined: این مقدار نشان می دهد که چند سند باید MongoDB از مجموعه بخواند. از آنجا که MongoDB یک اسکن مجموعه انجام داد ، مقدار آن 5 ، تعداد کل اسناد موجود در مجموعه است. هرچه مجموعه بزرگتر باشد ، در صورت عدم استفاده از نمایه ها ، مقدار بیشتری در این زمینه وجود دارد.
به تفاوت بین کل اسناد مورد بررسی و تعداد اسناد برگشت داده شده توجه کنید: MongoDB مجبور شد 5 سند را برای بازگرداندن یک سند بازرسی کند.

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

برای این منظور ، با استفاده از متد createIndex () ، یک شاخص در قسمت height در مجموعه peaks ایجاد کنید. این روش یک سند JSON را توصیف می کند که نمایه ای را که می خواهید ایجاد کنید توصیف می کند. این مثال یک فهرست زمینه واحد ایجاد می کند ، به این معنی که سند حاوی یک کلید واحد (ارتفاع در این مثال) برای فیلدی است که می خواهیم از آن استفاده کنیم. این کلید 1 یا -1 را به عنوان مقدار می پذیرد. این مقادیر ترتیب مرتب سازی شاخص را نشان می دهند که 1 نشان دهنده صعودی و -1 نشان دهنده نزولی است:

db.peaks.createIndex( { “height”: 1 } )

MongoDB تأییدی را برمی گرداند که نشان می دهد چند شاخص در حال حاضر در مجموعه تعریف شده است و تفاوت آن با حالت قبلی.

Output

 
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

حالا سعی کنید همان پرس و جو را که قبلاً اجرا کرده اید اجرا کنید. هرچند این بار ، اطلاعاتی که با روش توضیح (“exeStatStats”) بازگردانده می شوند ، متفاوت است زیرا نمایه ای در محل وجود دارد:

db.peaks.find(
{ “height”: { $gt: 8700 } }
).explain(“executionStats”)

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                        . . .
                        "inputStage" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "height_1",
                                . . .
                        }
                },
                . . .
        },
        "executionStats" : {
                . . .
                "nReturned" : 1,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 1,
                "totalDocsExamined" : 1,
                . . .
        },
        . . .
}

توجه کنید که WinPlan دیگر COLLSCAN را نشان نمی دهد. در عوض ، IXSCAN وجود دارد ، نشان می دهد که از ایندکس به عنوان بخشی از اجرای پرس و جو استفاده شده است. MongoDB همچنین به شما اطلاع می دهد که کدام شاخص از طریق مقدار indexName استفاده شده است. به طور پیش فرض ، MongoDB نامهای فهرست را از نامهای فیلدی که فهرست به آنها متصل است و ترتیب اعمال می شود ، می سازد. از {“height”: 1} ، MongoDB به طور خودکار نام height_1 را ایجاد کرد.

مهمترین تغییر در بخش exeStats است. یکبار دیگر ، این پرس و جو فقط یک سند واحد را که با nReturned مشخص شده است ، باز می گرداند. با این حال ، این بار totalDocsExamined فقط 1 است. این بدان معناست که پایگاه داده فقط یک سند را از مجموعه بازیابی کرده تا پرس و جو را برآورده کند. TotalKeysExamined نشان می دهد که شاخص فقط یک بار بررسی شده است زیرا اطلاعات کافی برای جمع آوری نتیجه را ارائه می دهد.

با ایجاد این فهرست ، تعداد اسنادی را که MongoDB مجبور به بازرسی بود ، از 5 به 1 کاهش دادید ، که پنج برابر کاهش می یابد. اگر مجموعه قله ها حاوی هزاران مدخل باشد ، تأثیر استفاده از شاخص حتی بیشتر آشکار می شود.

مرحله 3 – ایجاد نمایه های منحصر به فرد

در MongoDB ، درج دو سند در مجموعه اگر هر دو دارای مقادیر _id یکسانی باشند ، غیرممکن است. این به این دلیل است که پایگاه داده به طور خودکار یک فهرست تک فیلدی در قسمت _id حفظ می کند که علاوه بر کمک به سرعت بخشیدن به جستجوی اسناد ، منحصر به فرد بودن مقدار فیلد _id را تضمین می کند. این مرحله توضیح می دهد که چگونه می توانید فهرست بندی کنید تا مطمئن شوید مقادیر یک فیلد معین برای هر سند در یک مجموعه منحصر به فرد است.

برای توضیح ، روش createIndex () زیر را اجرا کنید. نحو این دستور مشابه آنچه در مرحله قبل استفاده شد است ، با این تفاوت که این بار یک پارامتر دوم با ایجاد تنظیمات اضافی برای index () به createIndex () منتقل می شود. {“منحصر به فرد”: true} نشان می دهد که شاخص ایجاد شده اطمینان می دهد که مقادیر فیلد (نام) مشخص شده نمی تواند تکرار شود:

db.peaks.createIndex( { “name”: 1 }, { “unique”: true } )

بار دیگر ، MongoDB تأیید می کند که این فهرست با موفقیت ایجاد شده است:

 

Output

{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 2,
        "numIndexesAfter" : 3,
        "ok" : 1
}

در مرحله بعد ، بررسی کنید که آیا ایندکس به منظور اصلی خود عمل می کند یا با اجتناب از اسکن مجموعه ، هر گونه پرس و جو را سریعتر با نام کوه اجرا می کند. برای انجام این کار ، عبارت برابری زیر را با روش توضیحی (“executiveStats”) اجرا کنید:

db.peaks.find(
{ “name”: “Everest” }
).explain(“executionStats”)

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

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                        . . .
                        "inputStage" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "name_1",
                                . . .
                        }
                },
                . . .
        },
        . . .
}

در مرحله بعد بررسی کنید که آیا می توانید سند دیگری را که نمایانگر کوه اورست است به مجموعه اضافه کنید ، در حالی که فهرست در جای خود قرار دارد. این کار را با اجرای روش insertOne () زیر انجام دهید:

db.peaks.insertOne({
“name”: “Everest”,
“height”: 9200,
“location”: [“India”],
“ascents”: {
“first”: {
“year”: 2020
},
“first_winter”: {
“year”: 2021
},
“total”: 2
}
})

MongoDB سند را ایجاد نمی کند و در عوض پیغام خطا را برمی گرداند:

 

Output

WriteError({
        "index" : 0,
        "code" : 11000,
        "errmsg" : "E11000 duplicate key error collection: test.peaks index: name_1 dup key: { name: \"Everest\" }",
        "op" : {
            . . .

این پیام خطای کلید duplicatye به فهرست name_1 اشاره دارد ، نشان می دهد که این محدودیت منحصر به فرد را در این زمینه اعمال می کند.

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

مرحله 4 – ایجاد یک فهرست در یک میدان جاسازی شده

هر زمان که از مجموعه ای با استفاده از فیلدی در سند تو در تو که نمایه ای ندارد ، درخواست می کنید ، MongoDB نه تنها باید همه اسناد را از مجموعه بازیابی کند ، بلکه باید از هر سند تو در تو نیز عبور کند.

به عنوان مثال ، عبارت زیر را اجرا کنید. با این کار اسنادی که مجموع آنها – فیلدی که درون سند صعودهای موجود در هر سند در مجموعه قله ها قرار گرفته است – بیش از 300 است و نتایج را به ترتیب نزولی مرتب می کند:

db.peaks.find(
{ “ascents.total”: { $gt: 300 } }
).sort({ “ascents.total”: -1 })

این پرس و جو چهار قله از مجموعه را باز می گرداند ، با کوه اورست قله با بیشترین صعود ، و پس از آن Lhotse ، Makalu و K2:

Output

{ "_id" : ObjectId("61212a8300c8304536a86b2f"), "name" : "Everest", "height" : 8848, "location" : [ "Nepal", "China" ], "ascents" : { "first" : { "year" : 1953 }, "first_winter" : { "year" : 1980 }, "total" : 5656 } }
{ "_id" : ObjectId("61212a8300c8304536a86b32"), "name" : "Lhotse", "height" : 8516, "location" : [ "Nepal", "China" ], "ascents" : { "first" : { "year" : 1956 }, "first_winter" : { "year" : 1988 }, "total" : 461 } }
{ "_id" : ObjectId("61212a8300c8304536a86b33"), "name" : "Makalu", "height" : 8485, "location" : [ "China", "Nepal" ], "ascents" : { "first" : { "year" : 1955 }, "first_winter" : { "year" : 2009 }, "total" : 361 } }
{ "_id" : ObjectId("61212a8300c8304536a86b30"), "name" : "K2", "height" : 8611, "location" : [ "Pakistan", "China" ], "ascents" : { "first" : { "year" : 1954 }, "first_winter" : { "year" : 1921 }, "total" : 306 } }

اکنون همان پرس و جو را اجرا کنید ، اما روش توضیح ((exeStatStats)) را که قبلاً استفاده شده بود ، وارد کنید:

db.peaks.find(
{ “ascents.total”: { $gt: 300 } }
).sort({ “ascents.total”: -1 }).explain(“executionStats”)

همانطور که مقدار COLLSCAN در این بخش از خروجی نشان می دهد ، MongoDB به یک اسکن مجموعه کامل متوسل شد و تمام اسناد مجموعه peaks را مرور کرد تا آنها را با شرایط پرس و جو مقایسه کند:

 

Output

{
        . . .
                "winningPlan" : {
                        "stage" : "COLLSCAN",
                        . . .
                },
        . . .
}

از آنجا که این مجموعه فقط پنج مدخل دارد ، فقدان شاخص تأثیر چندانی بر عملکرد نداشت و این پرس و جو بلافاصله اجرا شد. با این حال ، هرچه اسناد ذخیره شده در پایگاه داده پیچیده تر باشد ، پرس و جوهای تاثیرگذاری عملکرد بیشتری می تواند داشته باشد. این مرحله نحوه ایجاد نمایه های تک زمینه در زمینه های داخل اسناد تعبیه شده را برای کمک به کاهش این مشکل نشان می دهد.

برای کمک به MongoDB در اجرای این پرس و جو ، بیایید یک فهرست در قسمت کل در سند صعودها ایجاد کنیم. از آنجا که کل میدان درون صعودها قرار گرفته است ، هنگام ایجاد این فهرست نمی توان کل را به عنوان نام فیلد مشخص کرد. در عوض ، MongoDB یک نماد نقطه برای دسترسی به فیلدها در اسناد تو در تو ارائه می دهد. برای ارجاع به فیلد کل داخل سند صعودی ، می توانید از علامت ascents.total ، مانند این استفاده کنید:

db.peaks.createIndex( { “ascents.total”: 1 } )

MongoDB با پیام موفقیت آمیز پاسخ می دهد که به شما اطلاع می دهد که اکنون چهار فهرست تعریف شده دارید.

{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 3,
        "numIndexesAfter" : 4,
        "ok" : 1
}

پرس و جو قبلی را یکبار دیگر اجرا کنید تا بررسی کنید که آیا این فهرست به MongoDB کمک کرده است تا از اسکن کامل مجموعه جلوگیری کند:

db.peaks.find(
{ “ascents.total”: { $gt: 300 } }
).sort({ “ascents.total”: -1 }).explain(“executionStats”)

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                        . . .
                        "inputStage" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "ascents.total_-1",
                                . . .
                        }
                },
                . . .
        },
        "executionStats" : {
                . . .
                "nReturned" : 4,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 4,
                "totalDocsExamined" : 4,
                . . .
                "direction" : "backward",
                . . .
        },
        . . .
}

توجه داشته باشید که در حال حاضر IXSCAN در برابر شاخص تازه ایجاد شده ascents.total_-1 استفاده می شود و فقط چهار سند مورد بررسی قرار گرفته است. این همان تعداد اسنادی است که در فهرست بازگردانده شده و بررسی شده اند ، بنابراین هیچ سند دیگری برای تکمیل پرس و جو بازیابی نشده است.

جهت ، یک فیلد دیگر در بخش ExeStats ، نشان می دهد که MongoDB در کدام جهت تصمیم گرفته است که از ایندکس عبور کند. از آنجا که این شاخص با استفاده از نحو {“ascents.total”: 1} ایجاد صعودی شد و پرس و جو قله های کوه را به ترتیب نزولی مرتب کرد ، موتور پایگاه داده تصمیم گرفت به عقب برگردد. هنگام بازیابی اسناد به ترتیب خاص بر اساس فیلدی که بخشی از فهرست است ، MongoDB از فهرست برای ارائه سفارش نهایی بدون نیاز به مرتب سازی بیشتر اسناد پس از بازیابی کامل آنها استفاده می کند.

مرحله 5 – ایجاد Compound Field Index

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

هنگامی که یک فهرست میدان واحد در زمینه ارتفاع ایجاد کردید ، از مرحله 2 به یاد بیاورید تا به طور م moreثرتری از مجموعه قله ها برای یافتن بلندترین قله های کوه جستجو کنید. با استفاده از این شاخص ، بیایید تجزیه و تحلیل کنیم که چگونه MongoDB یک پرس و جو مشابه اما کمی پیچیده تر را انجام می دهد. سعی کنید کوه هایی با ارتفاع کمتر از 8600 متر پیدا کنید که اولین صعود زمستانی آنها پس از سال 1990 رخ داده است:

db.peaks.find(
{
“ascents.first_winter.year”: { $gt: 1990 },
“height”: { $lt: 8600 }
}
).sort({ “height”: -1 })

فقط یک کوه واحد – ماکالو – هر دو شرایط زیر را برآورده می کند:

 

Output

{ "_id" : ObjectId("61212a8300c8304536a86b33"), "name" : "Makalu", "height" : 8485, "location" : [ "China", "Nepal" ], "ascents" : { "first" : { "year" : 1955 }, "first_winter" : { "year" : 2009 }, "total" : 361 } }

حالا روش توضیح (“executiveStats”) را اضافه کنید تا نحوه انجام این درخواست توسط MongoDB را بیابید:

db.peaks.find(
{
“ascents.first_winter.year”: { $gt: 1990 },
“height”: { $lt: 8600 }
}
).sort({ “height”: -1 }).explain(“executionStats”)

حتی اگر هیچ شاخصی وجود نداشته باشد که ممکن است بر اولین صعود زمستانی تأثیر بگذارد ، MongoDB به جای انجام یک اسکن کامل مجموعه ، از یک شاخص ایجاد شده قبلی استفاده کرد:

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "height_1",
                                . . .
                        }
                },
                . . .
        },
        "executionStats" : {
                . . .
                "nReturned" : 1,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 3,
                "totalDocsExamined" : 3,
                . . .
        },
        . . .
}

توجه کنید که این بار ، متفاوت از اعدامهای پرس و جو با نمایه قبلی ، مقدار nReturned که تعداد اسناد برگشتی را نشان می دهد متفاوت از totalKeysExamined و totalDocsExamined است. MongoDB از شاخص میدان واحد در زمینه ارتفاع برای محدود کردن نتایج از 5 به 3 استفاده کرد ، اما سپس مجبور شد اسناد باقی مانده را برای بررسی اولین تاریخ صعود زمستانی اسکن کند.

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

در بسیاری از موارد ، این کاملاً کافی است. اگر متداول ترین پرس و جوها یک فیلد نمایه شده را بررسی می کنند و فقط گاهی اوقات باید فیلتر اضافی انجام دهند ، داشتن یک فهرست زمینه واحد معمولاً به اندازه کافی خوب است. هرچند که پرس و جوها در زمینه های متعدد متداول هستند ، ممکن است مفید باشد که یک فهرست شامل همه این زمینه ها مشخص شود تا مطمئن شوید هیچ اسکن اضافی نباید انجام شود.

تصور کنید که پایگاه داده قله های کوه را مطابق شرایط مطلوب مربوط به اولین صعود و ارتفاع زمستانی آنها به طور منظم جستجو کنید تا به نگرانی عملکرد تبدیل شود و از داشتن یک فهرست سودمند باشد. برای ایجاد یک فهرست بر اساس هر دو زمینه ، روش createIndex (0) زیر را اجرا کنید:

db.peaks.createIndex(
{
“ascents.first_winter.year”: 1,
“height”: -1
}
)

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

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

 

Output

{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 4,
        "numIndexesAfter" : 5,
        "ok" : 1
}

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

پرس و جو قبلی را یکبار دیگر اجرا کنید تا آزمایش کنید آیا تغییری در نحوه انجام پرس و جو ایجاد شده است یا خیر:

db.peaks.find(
{
“ascents.first_winter.year”: { $gt: 1990 },
“height”: { $lt: 8600 }
}
).sort({ “height”: -1 }).explain(“executionStats”)

این بار پرس و جو دوباره از اسکن فهرست استفاده کرد ، اما شاخص متفاوت است. اکنون ، شاخص ascents.first_winter.year_1_height_-1 که به تازگی ایجاد کرده اید ، بر روی شاخص height_1 که قبلاً استفاده شده بود ، انتخاب می شود:

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "ascents.first_winter.year_1_height_-1",
                                . . .
                        }
                },
                . . .
        },
        "executionStats" : {
                . . .
                "nReturned" : 1,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 1,
                "totalDocsExamined" : 1,
                . . .
        },
        . . .
}

تفاوت مهم در exeStats نهفته است. با نمایه جدید ، یک سند واحد مستقیماً از فهرست مورد بررسی قرار گرفت و سپس بازگردانده شد ، در مقابل سه سند که برای محدود کردن نتایج به اسکن بیشتر سند نیاز داشتند. اگر این مجموعه بزرگتر بود ، تفاوت بین شاخص مرکب جدید و استفاده از یک فهرست میدان واحد با فیلتر بیشتر حتی بیشتر نمایان می شد.

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

مرحله 6-ایجاد یک فهرست چند کلیدی

در مثالهای قبلی ، فیلدهای مورد استفاده در فهرستها دارای مقادیر واحد مانند قد ، یک سال یا یک نام در آنها بود. در این موارد ، MongoDB مقدار میدان را مستقیماً به عنوان کلید فهرست ذخیره می کند ، و این شاخص را به سرعت قابل عبور می کند. این مرحله نحوه رفتار MongoDB را نشان می دهد وقتی فیلدی که برای ایجاد ایندکس استفاده می شود ، فیلدی است که مقادیر متعددی مانند آرایه را ذخیره می کند.

برای شروع ، سعی کنید تمام کوه های موجود در مجموعه ای را که در نپال واقع شده اند پیدا کنید:

db.peaks.find(
{ “location”: “Nepal” }
)

چهار قله باز می گردند:

 

Output

{ "_id" : ObjectId("61212a8300c8304536a86b2f"), "name" : "Everest", "height" : 8848, "location" : [ "Nepal", "China" ], "ascents" : { "first" : { "year" : 1953 }, "first_winter" : { "year" : 1980 }, "total" : 5656 } }
{ "_id" : ObjectId("61212a8300c8304536a86b31"), "name" : "Kangchenjunga", "height" : 8586, "location" : [ "Nepal", "India" ], "ascents" : { "first" : { "year" : 1955 }, "first_winter" : { "year" : 1986 }, "total" : 283 } }
{ "_id" : ObjectId("61212a8300c8304536a86b32"), "name" : "Lhotse", "height" : 8516, "location" : [ "Nepal", "China" ], "ascents" : { "first" : { "year" : 1956 }, "first_winter" : { "year" : 1988 }, "total" : 461 } }
{ "_id" : ObjectId("61212a8300c8304536a86b33"), "name" : "Makalu", "height" : 8485, "location" : [ "China", "Nepal" ], "ascents" : { "first" : { "year" : 1955 }, "first_winter" : { "year" : 2009 }, "total" : 361 } }

توجه داشته باشید که هیچ یک از این قله ها فقط در نپال نیستند. هر یک از این چهار قله دارای بیش از یک کشور هستند که توسط فیلدهای مکان آنها مشخص شده است ، که همه آنها مجموعه ای از مقادیر متعدد هستند. علاوه بر این ، این مقادیر می توانند به ترتیب مختلف ظاهر شوند. به عنوان مثال ، لوتسه در [[نپال] ، \ “چین]] ، در حالی که ماکالو در [” چین “،” نپال “] ذکر شده است.

از آنجا که هیچ فهرست موجود در زمینه مکان وجود ندارد ، MongoDB در حال حاضر یک اسکن مجموعه کامل برای اجرای آن پرس و جو انجام می دهد. بیایید یک فهرست جدید برای قسمت مکان ایجاد کنیم:

db.peaks.createIndex( { “location”: 1 } )

توجه داشته باشید که این نحو با هیچ نمای میدان دیگری متفاوت نیست. MongoDB پیام موفقیت را برمی گرداند و ایندکس اکنون برای استفاده در دسترس است:

 

Output

{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 5,
        "numIndexesAfter" : 6,
        "ok" : 1
}

اکنون که یک فهرست برای قسمت مکان ایجاد کرده اید ، پرس و جوی قبلی را مجدداً با متد توضیح (“exeStatStats”) اجرا کنید تا نحوه اجرای آن را درک کنید:

db.peaks.find(
{ “location”: “Nepal” }
).explain(“executionStats”)

خروجی حاصله نشان می دهد که MongoDB از اسکن فهرست بعنوان استراتژی استفاده کرده است و با اشاره به نمای جدید location_1 ایجاد شده است:

 

Output

{
        "queryPlanner" : {
                . . .
                "winningPlan" : {
                        . . .
                        "inputStage" : {
                                "stage" : "IXSCAN",
                                . . .
                                "indexName" : "location_1",
                                "isMultiKey" : true,
                                . . .
                        }
                },
                . . .
        },
        "executionStats" : {
                . . .
                "nReturned" : 4,
                "executionTimeMillis" : 0,
                "totalKeysExamined" : 4,
                "totalDocsExamined" : 4,
                . . .
        }
        . . .
}

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

به ویژگی isMultiKey که در خروجی true ذکر شده توجه کنید. MongoDB به طور خودکار یک فهرست چند کلیدی برای قسمت مکان ایجاد کرد. اگر یک فهرست برای آرایه های دارای فیلد ایجاد کنید ، MongoDB به طور خودکار تعیین می کند که باید یک فهرست چند کلیدی ایجاد کند و برای هر عنصر از این آرایه ها ورودی های شاخص جداگانه ایجاد می کند.

بنابراین ، برای سندی که دارای فیلد مکان ذخیره آرایه [“چین” ، “نپال”] است ، دو ورودی فهرست جداگانه برای یک سند ، یکی برای چین و دیگری برای نپال ظاهر می شود. به این ترتیب ، MongoDB می تواند از ایندکس به نحو احسن استفاده کند ، حتی اگر query درخواست تطابق جزئی با محتویات آرایه را داشته باشد.

مرحله 7 – فهرست بندی و حذف فهرستها در یک مجموعه

در مراحل قبل ، نحوه ایجاد انواع مختلف فهرست ها را آموخته اید. هنگامی که پایگاه داده رشد می کند یا الزامات تغییر می کند ، مهم است که بتوانید بدانید چه شاخص هایی تعریف شده اند و گاهی اوقات موارد ناخواسته را حذف می کنید. ایندکس هایی که دیگر مفید نیستند می توانند تأثیر منفی بر عملکرد پایگاه داده داشته باشند ، زیرا MongoDB همچنان باید در هر زمان که داده ها را اضافه یا تغییر می دهید ، آنها را حفظ کند.

برای فهرست بندی تمام نمایه هایی که در مجموعه آموزش در این مجموعه آموزشی تعریف کرده اید ، می توانید از روش getIndexes () استفاده کنید:

db.peaks.getIndexes()

MongoDB فهرست فهرست ها را باز می گرداند ، ماهیت آنها را شرح می دهد و نام آنها را فهرست می کند:

 

Output

[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "key" : {
                        "height" : 1
                },
                "name" : "height_1"
        },
        {
                "v" : 2,
                "unique" : true,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1"
        },
        {
                "v" : 2,
                "key" : {
                        "ascents.total" : 1
                },
                "name" : "ascents.total_1"
        },
        {
                "v" : 2,
                "key" : {
                        "ascents.first_winter.year" : 1,
                        "height" : -1
                },
                "name" : "ascents.first_winter.year_1_height_-1"
        },
        {
                "v" : 2,
                "key" : {
                        "location" : 1
                },
                "name" : "location_1"
        }
]

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

برای حذف یک فهرست موجود ، می توانید از هر یک از این ویژگی ها با روش dropIndex () استفاده کنید. مثال زیر با استفاده از تعریف محتویات ، شاخص height_1 را حذف می کند:

db.peaks.dropIndex( { “height”: 1 } )

از آنجا که {“height”: 1} با نمای زمینه واحد در ارتفاع به نام height_1 مطابقت دارد ، MongoDB آن فهرست را حذف کرده و با پیامی موفقیت آمیز نشان می دهد که چند شاخص قبل از حذف این مورد وجود داشت:

 

Output

{ "nIndexesWas" : 6, "ok" : 1 }

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

db.peaks.dropIndex(“ascents.first_winter.year_1_height_-1”)

بار دیگر ، MongoDB فهرست را حذف کرده و یک پیام موفقیت آمیز نشان می دهد:

 

Output

{ "nIndexesWas" : 5, "ok" : 1 }

با فراخوانی مجدد getIndexes () می توانید تأیید کنید که این دو فهرست در واقع از لیست فهرست مجموعه حذف شده اند:

db.peaks.getIndexes()

این بار ، تنها چهار فهرست باقی مانده فهرست شده است:

 

Output

[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_"
        },
        {
                "v" : 2,
                "unique" : true,
                "key" : {
                        "name" : 1
                },
                "name" : "name_1"
        },
        {
                "v" : 2,
                "key" : {
                        "ascents.total" : 1
                },
                "name" : "ascents.total_1"
        },
        {
                "v" : 2,
                "key" : {
                        "location" : 1
                },
                "name" : "location_1"
        }
]

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

نتیجه

با خواندن این مقاله ، شما با مفهوم نمایه ها آشنا شده اید – ساختارهای داده خاصی که می توانند با کاهش میزان داده هایی که MongoDB باید در طول اجرای پرس و جو تجزیه و تحلیل کند ، عملکرد پرس و جو را بهبود بخشد. شما آموخته اید که چگونه فهرست های تک زمینه ای ، مرکب و چند کلیدی ایجاد کنید ، و همچنین چگونه بررسی کنید که آیا وجود آنها بر اجرای پرس و جو تأثیر می گذارد یا خیر. شما همچنین یاد گرفته اید که چگونه فهرست های موجود را لیست کرده و موارد ناخواسته را حذف کنید.

 

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه ایجاد افزونه منبع سفارشی در Gatsby

ورود به سایت

معرفی

در ایجاد یک وب سایت یا برنامه ، اغلب یکی از سخت ترین کارها این است که داده ها را از منابع متعدد جمع آوری کرده و آنها را در یک خروجی یکنواخت جمع آوری کنید. یک راه رایج برای حل این مشکل استفاده از سیستم های ساخت کاملاً متفاوت برای قسمت های مختلف یک سایت است ، اما این امر گاهی پیچیدگی را افزایش می دهد در حالی که دستیابی به یکنواختی را دشوارتر می کند. اینجاست که Gatsby ، یک تولید کننده سایت استاتیک مبتنی بر داده (SSG) می تواند راه حلی ارائه دهد.

یکی از اهداف اصلی Gatsby حل این مشکل برای توسعه دهندگان است و افزونه های منبع اصلی ترین راه برای این کار هستند. افزونه منبع مجموعه ای از کد است که داده ها را از یک منبع معین وارد اکوسیستم Gatsby می کند. منابع می توانند از سیستم فایل محلی مانند فایلهای Markdown ، پایگاه های داده ، فیدهای داده منتشر شده یا حتی منابع داده از راه دور کاملاً پویا مانند API ها باشند.

در این آموزش ، شما پلاگین منبع سفارشی خود را ایجاد می کنید تا داده های جدید را از یک API دنیای واقعی به Gatsby وارد کنید. همچنین داده ها را فرمت می کنید تا در سراسر Gatsby به آنها دسترسی داشته باشید و در پایان آموزش ، یک پروژه کاری داشته باشید که HTML ایستا را از منبع داده پویای جدید شما ایجاد می کند.

پیش نیازها

قبل از شروع کار ، چند مورد را که لازم دارید در اینجا آورده ایم:

  • نصب محلی Node.js برای اجرای Gatsby و ایجاد سایت شما. روش نصب بر اساس سیستم عامل متفاوت است ، اما vpsgol دارای راهنمای Ubuntu 20.04 و macOS است و همیشه می توانید آخرین نسخه را در صفحه بارگیری رسمی Node.js پیدا کنید.
  • آشنایی با جاوا اسکریپت برای کار در Gatsby. زبان جاوا اسکریپت یک مبحث گسترده است ، اما نقطه شروع خوب ما نحوه کدگذاری در سری جاوا اسکریپت است.
  • آشنایی با API های وب ، Node.js و JSON.
  • یک پروژه جدید Gatsby، داربست از gatsby-starter-default. برای برآوردن این نیاز و ایجاد پروژه جدید Gatsbyاز ابتدا ، می توانید به مرحله 1 آموزش نحوه راه اندازی اولین وب سایت Gatsby مراجعه کنید.
  • اگر می خواهید رابط کاربری (UI) پست های خود را فراتر از آنچه در این آموزش آمده است سفارشی کنید ، با React و JSX و همچنین عناصر HTML آشنا باشید.

این آموزش روی Node.js v14.16.1 ، npm v6.14.12 ، Gatsby v3.13.0 و node-fetch v2.6.2 آزمایش شده است.

مرحله 1 – فایل های داربست و نصب وابستگی ها

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

از آنجا که این یک افزونه محلی خواهد بود ، یک دایرکتوری در پروژه Gatsby خود ایجاد کنید تا کد منبع افزونه را در زیر پوشه افزونه های سطح ریشه نگه دارید. می توانید این کار را با ایجاد پوشه به صورت دستی در مرورگر فایل خود یا از خط فرمان در ریشه پروژه با دستور mkdir انجام دهید:

mkdir -p plugins/my-custom-source-plugin

در مرحله بعد ، باید یک فایل package.json ایجاد کنید تا این دایرکتوری را به عنوان بسته Node.js با وابستگی های خاص خود علامت گذاری کنید. برای ایجاد این فایل و پیش پر کردن برخی از فیلدهای مورد نیاز ، از دستور زیر استفاده کنید:

cd plugins/my-custom-source-plugin
npm init -y

این دستور به پوشه افزونه تازه ایجاد شده شما منتقل می شود و سپس از npm init برای راه اندازی مجدد یک بسته جدید استفاده می کند. پرچم -y برخی از سوالات بی ربط به این پروژه را رد می کند و فایل package.json را با حداقل مقادیر مورد نیاز پر می کند.

اکنون که package.json وجود دارد ، می توانید وابستگی هایی را به افزونه خود اضافه کنید که کدگذاری عملکرد را آسان تر می کند. پیش بروید و تنها وابستگی اضافی مورد نیاز خود را در این آموزش ، node-fetch ، با استفاده از دستور زیر نصب کنید:

npm install node-fetch@^2

در نهایت ، فایل gatsby-node.js را ایجاد کنید که در نهایت کد اصلی افزونه منبع را در اختیار داشته باشد:

touch gatsby-node.js

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

مرحله 2 – بارگیری و پیکربندی افزونه

مانند هر افزونه یا تم Gatsby ، Gatsby باید در مورد نحوه بارگیری افزونه از کجا آموزش داده شود. برای انجام این کار ، فایل پیکربندی اصلی Gatsby را ویرایش می کنید gatsby-config.js ، که در ریشه پروژه Gatsby شما قرار دارد. فایل را در ویرایشگر دلخواه خود باز کنید و خط برجسته زیر را اضافه کنید:

gatsby-config.js

module.exports = {
...
  plugins: [
    `gatsby-plugin-react-helmet`,
    `gatsby-plugin-image`,
    {
      resolve: `gatsby-source-filesystem`,
      options: {
        name: `images`,
        path: `${__dirname}/src/images`,
      },
    },
    `my-custom-source-plugin`,
    `gatsby-transformer-sharp`,
...

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

gatsby-config.js را ذخیره کرده و از فایل خارج شوید.

اکنون Gatsby را طوری پیکربندی کرده اید که افزونه منبع سفارشی شما را بارگذاری کند و همچنین به آن دقیقاً گفته اید که کجا باید کد منبع را پیدا کند. در مرحله بعد ، این کد منبع را برای کشیدن داده ها در زمان اجرا Node.js از منبع راه دور سفارشی خود ایجاد می کنید.

مرحله 3 – کشیدن داده های خام به Node.js

در مرحله قبل ، شما Gatsbyرا برای بارگیری و اجرای کد افزونه منبع سفارشی خود پیکربندی کرده اید ، اما برای انجام وظیفه وارد کردن داده های جدید به اکوسیستم Gatsby، هنوز باید این کد را ایجاد کنید. در این مرحله ، کدی را که این کار را انجام می دهد ، می نویسید ، داده های از راه دور را از طریق node-fetch واکشی کرده و برای استفاده در مراحل بعدی آماده می کنید.

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

فایل my-custom-source-plugin/gatsby-node.js خود را در فهرست افزونه ها باز کرده و کد زیر را اضافه کنید:

plugins/my-custom-source-plugin/gatsby-node.js

const fetch = require('node-fetch').default

/**
 * Fetch a list of computer books from Wikipedia, with excerpts
 */
async function getWikiProgrammingBooks() {
  const BASE_ENDPOINT = "https://en.wikipedia.org/w/api.php?action=query&format=json&utf8=1&redirects=1";

  // Get list of books
  const listEndpoint = new URL(BASE_ENDPOINT);
  listEndpoint.searchParams.append('list', 'categorymembers');
  listEndpoint.searchParams.append("cmtitle", "Category:Computer_programming_books");
  listEndpoint.searchParams.append("cmlimit", "10");
  const listResults = await (await fetch(listEndpoint.toString())).json();


  // Extract out the page IDs from the list
  const pageIds = listResults.query.categorymembers.map((listing) => listing.pageid);

  // Fetch details for page IDs
  const extractEndpoint = new URL(BASE_ENDPOINT);
  extractEndpoint.searchParams.append("pageids", pageIds.join("|"));
  extractEndpoint.searchParams.append("prop", "extracts|info");
  extractEndpoint.searchParams.append("exintro", "");
  extractEndpoint.searchParams.append("explaintext", "");
  extractEndpoint.searchParams.append("inprop", "url");

  const bookResult = await (await fetch(extractEndpoint.toString())).json();

  return Object.values(bookResult.query.pages);
}

در این کد ، شما یک تابع قابل استفاده مجدد ایجاد کرده اید که می تواند برای بازگرداندن لیستی از کتابهای برنامه نویسی کامپیوتر ، به همراه شناسه های صفحه آنها (یک شناسه منحصر به فرد در ویکی پدیا) و گزیده ها/عصاره ها فراخوانی شود. در قسمت اول تابع ، URL API مناسب را ایجاد می کنید تا بتوانید لیست اولیه عناوین و شناسه های مربوط به یک دسته خاص (کتابهای برنامه نویسی کامپیوتر) را برای استفاده از آن استفاده کنید. از سازنده URL و رابط برای خواندن و مدیریت تغییرات پرس و جو استفاده می شود.

شما از روش واکشی از node-fetch برای درخواست GET به URL ساخته شده استفاده می کنید ، که لیستی از عناوین کتاب با شناسه های آنها را برمی گرداند. سپس این پاسخ به آرایه ای از مقادیر pageid تبدیل می شود ، سپس برای پرس و جو مجدد API ویکی پدیا استفاده می شود ، این بار درخواست استخراج و اطلاعات متای تولید شده برای شناسه صفحه داده شده. شناسه های صفحه با کاراکتر پیپ (|) به هم متصل می شوند ، زیرا API ویکی پدیا از این قالب برای پذیرش چندین شناسه از طریق یک مقدار رشته استفاده می کند.

سرانجام ، از آنجا که نتایج گزیده های صفحه به عنوان یک شیء باز می گردند و هر کتابی در شناسه خود به عنوان کلید درج شده است ، از Object.values ​​() برای حذف کلید شناسه صفحه و تبدیل نتایج به یک آرایه قبل از بازگشت آنها استفاده می کنید.

اگر خروجی این تابع را وارد کنید ، چیزی شبیه به این خواهد بود:

[
  {
    "pageid": 379671,
    "ns": 0,
    "title": "The C Programming Language",
    "extract": "The C Programming Language (sometimes termed K&R, after its authors' initials) is a computer programming book written by Brian Kernighan and Dennis Ritchie...",
    "fullurl": "https://en.wikipedia.org/wiki/The_C_Programming_Language",
    ...
  },
  ...
]

مطمئن شوید که تغییرات خود را ذخیره می کنید ، اما این فایل را باز نگه دارید زیرا در مرحله بعد کد بیشتری به آن اضافه می کنید.

در این مرحله از node-fetch برای بازیابی محتوای منبع از راه دور و نمایش آن در فایل gatsby-node.js استفاده کردید. در مرحله بعد ، محتوا را عادی می کنید زیرا از آن برای ایجاد گره های جدید Gatsby برای استفاده در کل پروژه Gatsby استفاده می کنید.

مرحله 4 – عادی سازی داده ها و ایجاد گره ها

واکشی محتوای از راه دور و آوردن آن در gatsby-node.js در مرحله قبل به این معنی نیست که اکنون در سراسر Gatsbyقابل دسترسی است. به منظور به اشتراک گذاری داده ها به صورت جهانی ، Gatsby از مفهوم گره ها استفاده می کند ، که در یک لایه داده GraphQL یکپارچه به اشتراک گذاشته می شوند. در این مرحله ، شما این گره ها را ایجاد می کنید و محتوای جدید خود را برای مطابقت قالب بندی می کنید.

اگرچه اکنون می توانید با فراخوانی getWikiProgrammingBooks () نتایج ویکی پدیا را بازیابی کرده و به آنها دسترسی پیدا کنید ، اما برای ادغام این کد با سیستم گره Gatsby، هنوز باید کد را اضافه کنید. در همان فایل gatsby-node.js مرحله قبل ، این بلوک جدید کد را برای مدیریت تولید گره ها اضافه کنید:

plugins/my-custom-source-plugin/gatsby-node.js

const fetch = require('node-fetch').default

...

exports.sourceNodes = async ({ actions, createContentDigest, createNodeId }) => {
  // Arbitrary node type constant
  const BOOK_TYPE = 'BookWikiPage';

  // Get books
  const bookResults = await getWikiProgrammingBooks();

  // Convert raw book results to nodes
  for (const book of bookResults) {
    actions.createNode({
      ...book,
      id: createNodeId(`${BOOK_TYPE}-${book.pageid}`),
      parent: null,
      children: [],
      internal: {
        type: BOOK_TYPE,
        contentDigest: createContentDigest(book)
      }
    })
  }
};

در این بلوک کد ، شما در حال تکرار هر کتابی هستید که توسط getWikiProgrammingBooks بازگردانده می شود و یک گره Gatsbyبرای آن از طریق روش createNode ایجاد می کنید. هر ویژگی و مقداری که به createNode منتقل می شود دارای اهمیت است و ارزش توجه دارد:

  • … کتاب برای گسترش جفت های کلید-مقدار از شی API ویکی پدیا در گره Gatsby که ایجاد می کنید استفاده می شود. این بدان معناست که بعداً می توانید به node.title دسترسی پیدا کنید ، زیرا از book.title کپی می شود.
  • شناسه یک ارزش جهانی منحصر به فرد در داخل Gatsby است. برای اینکه شناسه هر کتاب را در افزونه خود منحصر به فرد کنید ، باید نوع کتاب را با شناسه صفحه ویکی پدیا ترکیب کرده و یک رشته شناسه تشکیل دهید. با این حال ، از آنجا که نمی توانید مطمئن شوید سایر افزونه ها از چه شناسه هایی استفاده می کنند ، از بهترین روش ارسال شناسه خود برای ایجادNodeId استفاده کرده اید ، که یک تابع کمکی Gatsby است و تضمین می کند که شناسه به چیزی در سطح جهانی تبدیل شده است.
  • والد فیلدی است که می توان از آن برای اتصال گره شما به دیگری از طریق شناسه استفاده کرد و این گره را در کودکی علامت گذاری کرد. از آنجا که هر کتاب موجودیت خاص خود است و به گره های دیگر متصل نیست ، این را به عنوان خالی گذاشته اید ، به این معنی که والد ندارد.
  • کودکان به عنوان راهی برای پیوند گره ها شبیه به والدین هستند ، اما آرایه ای از شناسه ها را می گیرد. از آنجا که هر کتاب فرزندی ندارد ، آرایه را خالی گذاشته اید.
  • داخلی شیئی است که زمینه های بسیار ویژه سیستم مدیریت گره داخلی Gatsby و سایر افزونه ها را با هم گروه بندی می کند. این فقط می تواند شامل فیلدهای رسمی باشد ، به همین دلیل است که شما شیء کتاب را در آن پخش نکرده اید.
  • type یک رشته منحصر به فرد در سطح جهان است که نوع گره ای را که ایجاد می کنید توصیف می کند و بعداً هنگام درخواست گره ها از طریق GraphQL مورد استفاده قرار می گیرد.
  • contentDigest یک رشته هش است که از محتویات گره و ابزار کمکی Gatsby createContentDigest ساخته شده است. این فیلد به Gatsby کمک می کند تا تشخیص دهد که یک گره چه زمانی تغییر کرده است ، زیرا در صورت اصلاح هرگونه ویژگی شیء کتاب ، رشته هش تغییر می کند.

شما به تازگی کدی را اضافه کرده اید که محتوای منبع شما را می گیرد و با آن گره های جدید Gatsby ایجاد می کند و آنها را در محیط Gatsby به اشتراک می گذارد. در مرحله بعد ، شما تأیید می کنید که این گره ها در لایه داده GraphQL ظاهر می شوند و می توان آنها را پرس و جو کرد.

مرحله 5 – (اختیاری) بازرسی خروجی گره با API GraphQL

در حال حاضر ، شما محتوای منبع خود را به داخل Gatsby کشانده اید و از آن برای ایجاد گره های جدید استفاده کرده اید. به عنوان جایگزینی برای اشکال زدایی دستی با نقاط شکست یا دستورات ورود به سیستم ، در این مرحله از GraphQL IDE تعاملی برای تأیید اینکه این گره های جدید در حال ایجاد شدن هستند و می توانند با API GraphQL پرس و جو شوند ، استفاده خواهید کرد.

پیش بروید و با اجرای این دستور از ریشه پروژه Gatsby خود ، سرور توسعه محلی خود را راه اندازی کنید:

npm run develop

علاوه بر راه اندازی نسخه زنده سایت Gatsby ، فرمان develop همچنین سرور GraphQL و IDE محلی را نیز نشان می دهد. برای تأیید اینکه کد شما در gatsby-node.js تمام گره های کتاب را ایجاد می کند ، از این پرس و جو GraphQL برای دریافت عناوین کتاب ، شناسه های صفحه و شناسه های Gatsby استفاده خواهید کرد:

{
  allBookWikiPage {
    edges {
      node {
        title
        pageid
        id
      }
    }
  }
}

برای اجرای این پرس و جو ، یا GraphQL IDE تعاملی را در localhost باز کنید: 8000/___ graphql و قبل از اجرا پرس و جو را در سمت چپ قرار دهید یا از طریق cURL آن را پرس و جو کنید.

curl –location –request POST ‘http://localhost:8000/___graphql’ \
–header ‘Content-Type: application/json’ \
–data-raw ‘{
“query”: “{ allBookWikiPage { edges { node { title pageid id } } } }”
}’

پاسخ JSON چیزی شبیه به این خواهد بود:

{
  "data": {
    "allBookWikiPage": {
      "edges": [
        {
          "node": {
            "title": "The C Programming Language",
            "pageid": 379671,
            "id": "818771ca-40aa-5cfd-b9e7-fddff093d5ec"
          }
        },
        ...
      ]
    }
  },
  "extensions": {}
}

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

مرحله 6 – (اختیاری) ایجاد صفحات بر اساس گره ها

تا کنون ، تمام مراحل قبلی بر ایجاد گره های داخلی Gatsby متمرکز شده است ، از جمله آخرین مرحله تأیید ایجاد و توانایی بازیابی آنها. با این حال ، این گره ها فقط برای کد در حال اجرا در پروژه Gatsby شما قابل مشاهده هستند ، نه برای بازدیدکنندگان از سایت یا برنامه شما. در این مرحله ، شما یک فایل قالب صفحه React اضافه کرده و آن را به گره های خود وصل می کنید تا محتوای افزونه منبع شما به صفحات وب واقعی واقعی تبدیل شود.

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

ابتدا یک فایل خالی در src/pages با نام فایل {BookWikiPage.title} .js ایجاد کنید. مهاربندهای پیچ دار به Gatsby می گویند که نام فایل از API مسیر سیستم استفاده می کند و در داخل براکت ها ، BookWikiPage.title به Gatsby می گوید که برای هر عنوان کتاب منحصر به فرد صفحه ای ایجاد کند. توجه داشته باشید که دیگر روی فایلهای موجود در فهرست افزونه ها کار نمی کنید ، اما اکنون در داخل پروژه اصلی Gatsby کار می کنید.

در مرحله بعد ، کدی را به آن فایل اضافه کنید که گره کتاب را گرفته و آن را به عنوان یک صفحه وب نمایش می دهد:

import { graphql } from "gatsby";
import * as React from "react";
import Layout from "../components/layout";
import Seo from "../components/seo";

export default function BookPageTemplate({ data: { bookWikiPage } }) {
  const { title, extract, fullurl } = bookWikiPage;
  return (
    <Layout>
      <Seo title={title} />
      <h1>{title}</h1>
      <blockquote>{extract}</blockquote>

      <i>This article uses material from the Wikipedia article <a href={fullurl} target="_blank" rel="noreferrer">"{title}"</a>, which is released under the <a href="https://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-Share-Alike License 3.0</a>.</i>
    </Layout>
  );
}

export const pageQuery = graphql`
  query ($id: String!) {
    bookWikiPage(id: { eq: $id }) {
      title
      extract
      fullurl
    }
  }
`;

در انتهای کد شما یک متغیر صادر شده به نام pageQuery وجود دارد که از تگ Gatsby GraphQL استفاده می کند. Gatsby پرس و جو GraphQL را که از آن استفاده می کند ، ارزیابی کرده و نتایج را به تابع BookPageTemplate منتقل می کند.

تابع BookPageTemplate ، که جزء React است ، سپس نتایج پرس و جو GraphQL را گرفته و با جاسازی مقادیر در JSX که برمی گرداند ، آنها را به عنوان بخشی از یک صفحه وب نمایش می دهد. عنوان کتاب به عنوان عنوان اصلی و عنوان صفحه استفاده می شود ، عصاره به عنوان نقل قول بلوک نمایش داده می شود و پیوندی به صفحه ورود کامل ویکی پدیا در پایین تعبیه شده است.

شما همچنین با استفاده از پیش فرض صادرات قبل از اعلان ، عملکرد BookPageTemplate را به عنوان صادرات پیش فرض علامت گذاری می کنید ، زیرا Gatsby انتظار دارد که جزء React مسئول تولید صفحه رندر شده نهایی را به عنوان صادرات پیش فرض هر فایل قالب صفحه بیابد.

پس از افزودن کد قالب React به فایل ، تغییرات را ذخیره کرده و ببندید. به http: // localhost: 8000/the-c-programming-language بروید تا یک صفحه نمونه را ارائه دهید:

برای نمایش فهرستی از این گره های جدید و صفحات مرتبط با آنها ، همچنین یک صفحه فهرست اختصاصی ایجاد می کنید که همه کتابها را در یک مکان نمایش می دهد. در قسمت src/pages یک فایل جدید با نام فایل books.js ایجاد کنید. بعد ، کد زیر را به آن اضافه کنید:

src/pages/books.js

import { graphql, Link } from "gatsby";
import * as React from "react";
import Layout from "../components/layout";
import Seo from "../components/seo";

export default function BookListingsPageTemplate({ data: { allBookWikiPage } }) {
  return (
    <Layout>
      <Seo title="Programming Books Listing" />
      <p>Here are some computer programming books that have their own Wikipedia entries:</p>

      {allBookWikiPage.edges.map((edge) => {
        const node = edge.node;
        return (
          <details key={node.title}>
            <summary>{node.title}</summary>

            <div className="details-body">
              <p>{node.extract}</p>
              <div className="links">
                <Link href={node.gatsbyPath}>Internal Page</Link>
                <a rel="noreferrer" href={node.fullurl}>Wikipedia Page</a>
              </div>
            </div>
          </details>
        )
      })}
    </Layout>
  );
}

export const pageQuery = graphql`
  query {
    allBookWikiPage {
      edges {
        node {
          title
          extract
          gatsbyPath(filePath: "/{BookWikiPage.title}")
          fullurl
        }
      }
    }
  }
`;

شبیه به الگوی صفحه {BookWikiPage.title} .js ، این فایل همچنین از برچسب GraphQL pageQuery برای برداشتن داده ها از لایه GraphQL و ارسال آن به یک جزء React استفاده می کند. با این حال ، در حالی که الگوی قبلی یک کتاب را بر اساس شناسه ارائه می داد ، این الگو فهرستی از همه کتابها را ارائه می دهد ، در حالی که به صفحات کتاب جداگانه پیوند داده شده است.

هر فهرست کتاب از یک عنصر <details> استفاده می کند ، که این لیست را قادر می سازد تا قسمت کامل کتاب و پیوندها را نشان دهد یا برای نشان دادن عنوان فقط جمع شود. با پیروی از بهترین روش ها ، شما همچنین یک مقدار منحصر به فرد را به کلید در حین تکرار در آرایه منتقل می کنید ، با استفاده از مولفه Gatsby Link برای پیوندهای داخلی و یک برچسب برای پیوندهای خارجی.

رشته gatsbyPath (filePath: “/{BookWikiPage.title}”) در پرس و جو GraphQL از تابع () gatsbyPath ویژه برای بازیابی مسیر عمومی ایجاد شده بر اساس نام فایل API مسیر فایل سیستم استفاده می کند.

این فایل را ذخیره کرده و از آن خارج شوید.

با وجود تمام کتابهای موجود در یک صفحه ، حتی با بخشهای جمع شونده همه چیز کمی شلوغ شده است ، بنابراین آخرین مرحله این است که برخی از ظاهر را اضافه کنید تا خوانندگان بتوانند فهرست را آسانتر کنند. یک فایل شیوه نامه جدید در src/styles/books.css ایجاد کنید. می توانید این کار را در مرورگر فایل خود یا با خط فرمان از ریشه پروژه Gatsby انجام دهید:

mkdir -p ./src/styles
touch ./src/styles/books.css

سپس CSS زیر را به فایل اضافه کنید:

src/styles/books.css

details {
  border: 1px dotted black;
  margin: 6px;
  padding: 6px;
}

.details-body {
  background-color: #eedeff;
  margin: 4px 0px 2px 12px;
  padding: 4px;
  border-radius: 4px;
}

.links {
  display: flex;
  justify-content: space-evenly;
}

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

در نهایت ، الگوی صفحه فهرست کتاب را به روز کنید تا این فایل CSS را در آن بکشید:

src/pages/books.js

import { graphql, Link } from "gatsby";
import * as React from "react";
import Layout from "../components/layout";
import Seo from "../components/seo";
import "../styles/books.css";

این فایل را با خط وارد کردن CSS که به تازگی اضافه شده است ذخیره و ببندید.

برای مشاهده نتایج ، دوباره فرمان develop را اجرا کنید تا سرور توسعه ظاهر شود و صفحات جدید را پیش نمایش کنید:

npm run develop

اکنون می توانید به صفحه فهرست کتابهای خود در localhost دسترسی داشته باشید: 8000/books/.

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

نتیجه

با دنبال کردن مراحل این آموزش ، شما اکنون ساخت افزونه منبع سفارشی را که محتوای خارجی را در پروژه Gatsby شما وارد می کند ، به پایان رسانده و از آن برای تأمین صفحات جدید در سایت خود استفاده کرده اید.

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

  • اگر می خواهید افزونه خود را با جهان به اشتراک بگذارید ، می توانید این کار را با انتشار آن در npm انجام دهید. می توانید این راهنمای انتشار بسته های npm را دنبال کنید و برای ارسال به کتابخانه افزونه Gatsby ، آن را با این گردش کار دنبال کنید.
  • برای افزونه های منبع که کارهای زیادی را با ورودی هایی انجام می دهند که برای مدت زمان یکسانی باقی می مانند ، می توانید از مزایای مکانیزم کش Gatsby بین ساخت ها استفاده کنید.
  • اگر گره های شما به یکدیگر مرتبط هستند یا به گره هایی که توسط افزونه های دیگر ایجاد شده اند ، می توانید آنها را از طریق روابط به هم پیوند دهید. این به طور خلاصه در این آموزش توضیح داده شده است ، اما می توانید جزئیات بیشتری را در اسناد Gatsby بیابید.
  • افزونه ترانسفورماتور افزونه ای است که فقط گره های یک نوع را گرفته و آنها را به گره های جدید یا اصلاح شده تبدیل می کند. در اسناد افزونه ترانسفورماتور Gatsby می توانید اطلاعات بیشتری در مورد آنها بخوانید.

c

 

  • behnam gol mohamadi
  • ۰
  • ۰

چگونه می توان نتایج پرس و جو را در Laravel Eloquent محدود و پیج بندی کرد

ورود به سایت

در طول این مجموعه ، شما پیوندهای جدیدی را به برنامه نمایشی خود اضافه کرده اید تا چندین ویژگی از Laravel Eloquent را آزمایش کنید. شاید متوجه شده باشید که صفحه فهرست اصلی هربار که پیوند جدیدی اضافه می کنید طولانی تر می شود ، زیرا محدودیتی در تعداد پیوندهای نشان داده شده در برنامه وجود ندارد. اگرچه وقتی تعداد اندکی از ورودی های پایگاه داده را دارید ، مشکلی ایجاد نمی شود ، اما در طولانی مدت ممکن است زمان بارگذاری صفحه شما طولانی تر شود ، و چیدمانی که بخاطر میزان انتشار محتوا در آن خواندن مشکل تر است. یک صفحه واحد

در این قسمت از سری ، نحوه محدود کردن تعداد نتایج در پرس و جو Laravel Eloquent با روش limit () و نحوه صفحه بندی نتایج با روش simplePaginate () را خواهید آموخت.

محدود کردن نتایج پرس و جو

برای شروع ، مسیر اصلی برنامه (/) خود را به روز می کنید تا تعداد پیوندهایی که در صفحه فهرست شما فهرست شده اند محدود شود.

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

routes/web.php

سپس ، تعریف مسیر اصلی را پیدا کنید:

routes/web.php

Route::get('/', function () {
    $links = Link::all()->sortDesc();
    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});

خط برجسته پرس و جو را نشان می دهد که تمام پیوندهای موجود در پایگاه داده را از طریق متد Link model all () دریافت می کند. همانطور که در قسمت قبلی این سری توضیح داده شد ، این روش از کلاس Model وراثت می شود و مجموعه ای را با تمام رکوردهای پایگاه داده مرتبط با آن مدل باز می گرداند. روش sortDesc () برای مرتب سازی مجموعه حاصله به ترتیب نزولی استفاده می شود.

اکنون خط برجسته را برای استفاده از روش مرتب سازی پرس و جو پایگاه داده orderBy () تغییر می دهید ، که نتایج پرس و جو را در سطح پایگاه داده سفارش می دهد ، به جای این که مجموعه کامل ردیف هایی را که به عنوان مجموعه فصیح از طریق روش (() بازگردانده می شوند ، به سادگی مرتب کنید. به همچنین برای محدود کردن نتایج پرس و جو ، یک روش زنجیره ای به روش limit () اضافه می کنید. در نهایت ، از روش get () برای بدست آوردن مجموعه نتایج فیلتر شده به عنوان مجموعه ای فصیح استفاده خواهید کرد.

مسیر اصلی خود را با کد زیر جایگزین کنید. این تغییر برای راحتی شما برجسته شده است:

routes/web.php

Route::get('/', function () {
    $links = Link::orderBy('created_at', 'desc')->limit(4)->get();

    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});

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

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

نتایج جستجوی پیجینی

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

Laravel Eloquent روشهای بومی برای تسهیل پیاده سازی صفحه نتایج جستار پایگاه داده دارد. روشهای paginate () و simplePaginate () به ایجاد پیوندهای صفحه بندی ، رسیدگی به پارامترهای HTTP برای شناسایی صفحه ای که در حال حاضر درخواست می شود ، و جستجوی پایگاه داده با محدودیت و جابجایی صحیح به منظور دستیابی به مجموعه مورد انتظار نتایج ، بستگی دارد. تعداد سوابق در هر صفحه ای که می خواهید لیست کنید.

اکنون می توانید پرس و جوهای Eloquent را در route/web.php به روز کنید تا از متد simplePaginate () استفاده کنید ، که با پیوندهای قبلی و بعدی یک ناوبری اساسی ایجاد می کند. بر خلاف روش paginate () ، simplePaginate () اطلاعاتی درمورد تعداد کل صفحات در نتیجه پرس و جو نشان نمی دهد.

فایل route/web.php را در ویرایشگر کد خود باز کنید. با به روز رسانی / route ، جایگزین محدودیت (4)-> فراخوانی متد get () با متد () simplePaginate:

routes/web.php

...
Route::get('/', function () {
    $links = Link::orderBy('created_at', 'desc')->simplePaginate(4);

    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});
...

 

در مرحله بعد ، تعریف مسیر /{slug} را در همان فایل قرار دهید و متد get () را با روش simplePaginate () جایگزین کنید. پس از اتمام کار کد باید به این شکل باشد:

routes/web.php

...
Route::get('/{slug}', function ($slug) {
    $list = LinkList::where('slug', $slug)->first();
    if (!$list) {
        abort(404);
    }

    return view('index', [
        'list' => $list,
        'links' => $list->links()->orderBy('created_at', 'desc')->simplePaginate(4),
        'lists' => LinkList::all()
    ]);
})->name('link-list');
...

پس از اتمام کار ، مسیرهای نهایی/فایل web.php به این شکل ظاهر می شود. تغییرات برای راحتی شما برجسته شده است:

routes/web.php

<?php

use Illuminate\Support\Facades\Route;
use App\Models\Link;
use App\Models\LinkList;

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    $links = Link::orderBy('created_at', 'desc')->simplePaginate(4);

    return view('index', [
        'links' => $links,
        'lists' => LinkList::all()
    ]);
});

Route::get('/{slug}', function ($slug) {
    $list = LinkList::where('slug', $slug)->first();
    if (!$list) {
        abort(404);
    }

    return view('index', [
        'list' => $list,
        'links' => $list->links()->orderBy('created_at', 'desc')->simplePaginate(4),
        'lists' => LinkList::all()
    ]);
})->name('link-list');

پس از اتمام فایل را ذخیره کنید.

درخواست های پایگاه داده در حال حاضر به روز شده اند ، اما شما هنوز هم باید نمای جلویی خود را به روز کنید تا کدی را که نوار ناوبری را نشان می دهد ، شامل شود. مجموعه Eloquent به دست آمده با () simplePaginate شامل روشی به نام () است که می تواند از نمای جلویی فراخوانی شود تا کد HTML لازم را برای خروجی بخش ناوبری بر اساس یک پرس و جوی صفحه بندی شده ارائه دهد.

همچنین می توانید از روش پیوندها () در یک مجموعه صفحه بندی شده Eloquent برای دسترسی به شی صفحه بندی کننده ذاتی استفاده کنید ، که چندین روش مفید را برای به دست آوردن اطلاعات در مورد محتوا مانند صفحه فعلی و اینکه صفحات متعدد محتوا وجود دارد یا خیر ، ارائه می دهد.

نمای برنامه منابع/views/index.blade.php را در ویرایشگر کد خود باز کنید:

resources/views/index.blade.php

انتهای بخش دارای برچسب کلاس پیوندها را مشخص کنید ، که شامل حلقه foreach است که پیوندها در آن رندر می شوند. کد زیر را بعد از آن بخش و قبل از برچسب </div> آخر در آن صفحه قرار دهید:

resources/views/index.blade.php

@if ($links->links()->paginator->hasPages())
    <div class="mt-4 p-4 box has-text-centered">
        {{ $links->links() }}
    </div>
@endif

ین کد با دسترسی به شی paginator و فراخوانی متد hasPages () ، وجود چندین صفحه از نتایج را بررسی می کند. وقتی این متد true می شود ، صفحه یک عنصر div جدید ارائه می دهد و متد links () را برای چاپ پیوندهای ناوبری برای پرس و جو مربوط به Eloquent فراخوانی می کند.

پس از اتمام کار ، صفحه به روز شده index.blade.php به این شکل خواهد بود:

resources/views/index.blade.php

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>My Awesome Links</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.1/css/bulma.min.css">

    <style>
        html {
            background: url("https://i.imgur.com/BWIdYTM.jpeg") no-repeat center center fixed;
            -webkit-background-size: cover;
            -moz-background-size: cover;
            -o-background-size: cover;
            background-size: cover;
        }

        div.link h3 {
            font-size: large;
        }

        div.link p {
            font-size: small;
            color: #718096;
        }
    </style>
</head>
<body>
<section class="section">
    <div class="container">
        <h1 class="title">
            @if (isset($list))
                {{ $list->title }}
            @else
                Check out my awesome links
            @endif
        </h1>
        <p class="subtitle">
            @foreach ($lists as $list)<a href="{{ route('link-list', $list->slug) }}" title="{{ $list->title }}" class="tag is-info is-light">{{ $list->title }} ({{ $list->links()->count() }})</a> @endforeach
        </p>

        <section class="links">
            @foreach ($links as $link)
                <div class="box link">
                    <h3><a href="{{ $link->url }}" target="_blank" title="Visit Link: {{ $link->url }}">{{ $link->description }}</a></h3>
                    <p>{{$link->url}}</p>
                    <p class="mt-2"><a href="{{ route('link-list', $link->link_list->slug) }}" title="{{ $link->link_list->title }}" class="tag is-info">{{ $link->link_list->title }}</a></p>
                </div>
            @endforeach
        </section>

        @if ($links->links()->paginator->hasPages())
            <div class="mt-4 p-4 box has-text-centered">
                {{ $links->links() }}
            </div>
        @endif
    </div>
</section>
</body>
</html>

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

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

Laravel EloquentSQLsqlserverپایگاه دادهخرید سرورفروش سرورنتایج پرس و جو

  • behnam gol mohamadi
  • ۰
  • ۰

نحوه مدیریت داده های زیرساخت با خروجی های Terraform

ورود به سایت

 

معرفی

خروجی های Terraform برای استخراج اطلاعات مربوط به منابع زیرساخت از حالت پروژه استفاده می شود. با استفاده از سایر ویژگی های زبان پیکربندی Hashicorp (HCL) ، که Terraform از آن استفاده می کند ، می توان اطلاعات منابع را جستجو کرد و به ساختارهای داده پیچیده تری مانند لیست ها و نقشه ها تبدیل کرد. خروجی ها برای ارائه اطلاعات به نرم افزارهای خارجی مفید هستند که می توانند بر روی منابع زیرساخت ایجاد شده کار کنند.

در این آموزش ، با نحوی خروجی Terraform و پارامترهای آن با ایجاد یک زیرساخت ساده که Droplets را مستقر می کند ، آشنا خواهید شد. شما همچنین می توانید خروجی ها را به صورت برنامه نویسی با تبدیل به JSON تجزیه کنید.

پیش نیازها

توکن vpsgol Personal Access Token ، که می توانید از طریق کنترل پنل vpsgol ایجاد کنید. دستورالعمل انجام این کار را می توانید در این پیوند مشاهده کنید: نحوه ایجاد یک رمز دسترسی شخصی.
Terraform بر روی دستگاه محلی شما نصب شده و پروژه ای با ارائه دهنده vpsgol تنظیم شده است. مرحله 1 و مرحله 2 نحوه استفاده از Terraform با vpsgol را تکمیل کنید و مطمئن شوید که پوشه پروژه را terraform-outputs ، به جای loadbalance نامگذاری کنید. در مرحله 2 ، متغیر pvt_key و منبع کلید SSH را وارد نکنید.
آشنایی با انواع داده ها و حلقه های HCL. برای اطلاعات بیشتر ، آموزش نحوه بهبود انعطاف پذیری با استفاده از متغیرهای Terraform ، وابستگی ها و شرایط را مشاهده کنید.

توجه: این آموزش به طور خاص با Terraform 1.0.2 آزمایش شده است.

تعریف خروجی ها

در این بخش ، یک Droplet را اعلام می کنید ، آن را در ابر مستقر می کنید و با تعیین خروجی هایی که آدرس IP Droplet را نشان می دهد ، با خروجی ها آشنا می شوید.

از فهرست راهنمای terraform-outputs که به عنوان پیش نیاز ایجاد کرده اید ، فایل droplets.tf را برای ویرایش ایجاد کرده و باز کنید:

nano droplets.tf

منبع Droplet و تعریف خروجی زیر را اضافه کنید:

terraform-outputs/droplets.tf

resource “vpsgol_droplet” “web” { image = “ubuntu-20-04-x64” name = “test-droplet” region = “fra1” size = “s-1vcpu-1gb” } output “droplet_ip_address” { value = vpsgol_droplet.web.ipv4_address }

ابتدا یک منبع Droplet به نام وب اعلام کنید. نام واقعی آن در ابر به صورت قطره ای و در منطقه fra1 با اوبونتو 20.04 اجرا می شود.

سپس ، خروجی ای به نام droplet_ip_address اعلام می کنید. در Terraform ، خروجی ها برای صادرات و نشان دادن مقادیر داخلی و محاسبه شده و اطلاعات مربوط به منابع استفاده می شوند. در اینجا ، پارامتر مقدار را که داده را به خروجی می پذیرد ، روی آدرس IP قطره اعلام شده تنظیم می کنید. در زمان اعلام ، نامشخص است ، اما پس از استقرار Droplet در دسترس قرار می گیرد. خروجی ها بعد از هر بار استقرار نشان داده می شوند و قابل دسترسی هستند.

فایل را ذخیره و ببندید ، سپس پروژه را با اجرای دستور زیر مستقر کنید:

terraform apply -var “do_token=${DO_PAT}”

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

Output…
vpsgol_droplet.web: Creating…

vpsgol_droplet.web: Creation complete after 32s [id=207631771]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

droplet_ip_address = ip_address

 

آدرس IP برجسته متعلق به Droplet جدید شماست. با استفاده از پروژه منابع را روی ابر مستقر می کند و خروجی ها را در پایان نشان می دهد ، زمانی که همه ویژگی های منبع در دسترس هستند. بدون خروجی droplet_ip_address ، Terraform اطلاعات بیشتری در مورد Droplet نشان نمی دهد ، مگر اینکه مستقر باشد.

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

terraform output

خروجی تمام خروجی های پروژه را لیست می کند:

Output

droplet_ip_address = ip_address

همچنین می توانید یک خروجی خاص را با نام و با تعیین آن به عنوان یک آرگومان ، درخواست کنید:

terraform output output_name

برای droplet_ip_address ، خروجی فقط شامل آدرس IP است:

Output
ip_address

به جز تعیین مقدار اجباری ، خروجی ها دارای چند پارامتر اختیاری هستند:

توضیحات: مستندات کوتاهی را با جزئیات آنچه خروجی نشان می دهد ، جاسازی می کند.
varet_on: یک پارامتر متا در هر منبع موجود است که به شما امکان می دهد منابع را به طور صریح مشخص کنید که خروجی بستگی به این دارد که Terraform قادر نیست در طول برنامه ریزی به طور خودکار نتیجه گیری کند.
حساس: مقدار بولین را می پذیرد ، که در صورت تنظیم روی true از نمایش محتوای خروجی پس از استقرار جلوگیری می کند.
پارامتر حساس زمانی مفید است که سیاهههای مربوط به استقرار Terraform در دسترس عموم قرار گیرد ، اما محتویات خروجی باید مخفی نگه داشته شوند. اکنون آن را به تعریف منابع Droplet خود اضافه می کنید.

droplets.tf را برای ویرایش باز کرده و خط برجسته را اضافه کنید:

resource “vpsgol_droplet” “web” {
image = “ubuntu-20-04-x64”
name = “test-droplet”
region = “fra1”
size = “s-1vcpu-1gb”
}

output “droplet_ip_address” {
value = vpsgol_droplet.web.ipv4_address
sensitive = true
}

پس از اتمام کار فایل را ذخیره و ببندید. دوباره پروژه را با اجرای زیر اجرا کنید:

terraform apply -var “do_token=${DO_PAT}”

در صورت درخواست بله را وارد کنید. خواهید دید که خروجی تغییر یافته است:

Output…

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

droplet_ip_address = <sensitive>

حتی اگر به عنوان حساس علامت گذاری شده باشد ، خروجی و محتویات آن همچنان از طریق کانال های دیگر مانند مشاهده وضعیت Terraform یا پرسیدن مستقیم خروجی ها در دسترس خواهد بود.

در مرحله بعد ، یک ساختار Droplet و خروجی متفاوت ایجاد می کنید ، بنابراین با اجرای موارد زیر ، ساختارهای فعلی را از بین ببرید:

terraform destroy -var “do_token=${DO_PAT}”

خروجی در انتها خواهد بود:

Output

… Destroy complete! Resources: 1 destroyed.

شما یک Droplet را اعلام و مستقر کرده و خروجی ایجاد کرده اید که آدرس IP آن را نشان می دهد. اکنون با استفاده از خروجی ها برای نشان دادن ساختارهای پیچیده تر مانند لیست ها و نقشه ها آشنا خواهید شد.

خروجی سازه های پیچیده

در این بخش ، با استفاده از کلمه کلیدی count ، چند قطره از یک تعریف را مستقر کرده و آدرس IP آنها را در قالب های مختلف خروجی می دهید.

با استفاده از حلقه for

شما باید تعریف منبع Droplet را تغییر دهید ، بنابراین آن را برای ویرایش باز کنید:

nano droplets.tf

آن را اصلاح کنید تا به این شکل باشد:

resource “vpsgol_droplet” “web” {
count = 3
image = “ubuntu-20-04-x64”
name = “test-droplet-${count.index}”
region = “fra1”
size = “s-1vcpu-1gb”
}

شما مشخص کرده اید که سه قطره باید با استفاده از کلید شمارش ایجاد شود و فهرست فعلی را به نام قطره اضافه کنید ، تا بعداً بتوانید بین آنها تشخیص دهید. خروجی موجود زیر را حذف کنید. پس از اتمام کار ، فایل را ذخیره و ببندید.

کد را با اجرای زیر اعمال کنید:

terraform apply -var “do_token=${DO_PAT}”

Terraform برنامه ای برای ایجاد سه قطره شماره دار به نام های test-droplet-0 ، test-droplet-1 و test-droplet-2 خواهد داشت. وقتی از شما خواسته شد تا مراحل را به پایان برسانید بله را وارد کنید. در پایان خروجی زیر را مشاهده خواهید کرد:


Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

این بدان معناست که هر سه Droplets با موفقیت مستقر شده اند و تمام اطلاعات مربوط به آنها در حالت پروژه ذخیره می شود.

ساده ترین راه برای دسترسی به ویژگی های منابع آنها استفاده از خروجی ها است ، اما ایجاد یکی برای هر Droplet مقیاس پذیر نیست. راه حل این است که از حلقه for برای عبور از لیست Droplets و جمع آوری ویژگی های آنها استفاده کنید ، یا از عبارت های splat استفاده کنید (که بعداً در این مرحله با آنها آشنا خواهید شد).

ابتدا یک خروجی تعریف می کنید که آدرس IP سه قطره را با نام آنها جفت می کند. droplets.tf را برای ویرایش باز کنید:

nano droplets.tf

خطوط زیر را اضافه کنید:

resource “vpsgol_droplet” “web” {
count = 3
image = “ubuntu-20-04-x64”
name = “test-droplet-${count.index}”
region = “fra1”
size = “s-1vcpu-1gb”
}

output “droplet_ip_addresses” {
value = {
for droplet in vpsgol_droplet.web:
droplet.name => droplet.ipv4_address
}
}

مقدار خروجی droplet_ip_addresses با استفاده از حلقه for ساخته می شود. از آنجا که توسط براکت احاطه شده است ، نوع حاصله یک نقشه خواهد بود. حلقه از لیست Droplets عبور می کند و برای هر نمونه ، نام آن را با آدرس IP آن جفت می کند و آن را به نقشه حاصل می افزاید.

فایل را ذخیره و ببندید ، سپس پروژه را دوباره اعمال کنید:

terraform apply -var “do_token=${DO_PAT}”

در صورت درخواست بله را وارد کنید و در پایان محتویات خروجی را دریافت خواهید کرد:

OutputApply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

droplet_ip_addresses = {
“test-droplet-0” = “ip_address”
“test-droplet-1” = “ip_address”
“test-droplet-2” = “ip_address”
}

droplet_ip_addresses آدرس IP سه قطره مستقر شده را مشخص می کند.

با استفاده از فرمان خروجی Terraform ، می توانید محتویات خروجی را به عنوان JSON با استفاده از آرگومان فرمان آن دریافت کنید:

terraform output -json droplet_ip_addresses

نتیجه مشابه موارد زیر خواهد بود:

Output{“test-droplet-0″:”ip_address”,”test-droplet-1″:”ip_address”,”test-droplet-2″:”ip_address”}

تجزیه JSON به طور گسترده ای در بسیاری از زبان های برنامه نویسی مورد استفاده قرار می گیرد و پشتیبانی می شود. به این ترتیب ، می توانید به طور برنامه ای اطلاعات مربوط به منابع Droplet مستقر را تجزیه کنید.

استفاده از عبارت Splat

عبارات Splat یک روش جمع و جور برای تکرار در تمام عناصر یک لیست و جمع آوری محتویات یک ویژگی از هر یک از آنها را ارائه می دهد که منجر به ایجاد یک لیست می شود. یک عبارت splat که آدرس IP سه قطره مستقر را استخراج می کند دارای نحو زیر است:

vpsgol_droplet.web[*].ipv4_address

نماد [*] از فهرست سمت چپ خود می گذرد و برای هر یک از عناصر ، محتویات ویژگی مشخص شده در سمت راست را می گیرد. اگر مرجع در سمت چپ به خودی خود یک لیست نباشد ، به یکی تبدیل می شود که تنها عنصر باشد.

می توانید droplets.tf را برای ویرایش باز کنید و خطوط زیر را برای پیاده سازی آن اصلاح کنید:

resource “vpsgol_droplet” “web” {
count = 3
image = “ubuntu-20-04-x64”
name = “test-droplet-${count.index}”
region = “fra1”
size = “s-1vcpu-1gb”
}

output “droplet_ip_addresses” {
value = vpsgol_droplet.web[*].ipv4_address
}

پس از ذخیره فایل ، پروژه را با اجرای دستور زیر اعمال کنید:

terraform apply -var “do_token=${DO_PAT}”

خروجی دریافت خواهید کرد که اکنون یک لیست است و فقط شامل آدرس های IP Droplets است:

Output…
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

droplet_ip_addresses = [
“ip_address”,
“ip_address”,
“ip_address”,
]

برای دریافت خروجی به عنوان JSON ، دستور زیر را اجرا کنید:

terraform output -json droplet_ip_addresses

خروجی یک آرایه واحد خواهد بود:

Output[“ip_address”,”ip_address”,”ip_address”]

شما از خروجی ها همراه با عبارات splat و حلقه ها برای صادر کردن آدرس های IP قطره های مستقر استفاده کرده اید. شما همچنین محتویات خروجی را به عنوان JSON دریافت کرده اید و اکنون از jq – ابزاری برای فیلتر پویا JSON با توجه به عبارات داده شده – برای تجزیه آنها استفاده می کنید.

تجزیه خروجی ها با استفاده از jq

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

اگر از اوبونتو استفاده می کنید ، دستور زیر را برای نصب jq اجرا کنید:

sudo snap install jq

در macOS ، می توانید از Homebrew برای نصب آن استفاده کنید:

brew install jq

jq عبارت پردازش ارائه شده را بر روی ورودی داده شده اعمال می کند ، که می توان آن را وارد کرد. ساده ترین کار در jq این است که ورودی را به خوبی چاپ کنید:

terraform output -json droplet_ip_addresses | jq ‘.’

وارد کردن عملگر هویت (.) بدین معناست که کل سند JSON تجزیه شده از ورودی باید بدون هیچ گونه تغییری خروجی داده شود:

Output[
“first_ip_address”,
“second_ip_address”,
“third_ip_address”
]

شما می توانید فقط IP دوم را با استفاده از نماد براکت آرایه با شمارش صفر درخواست کنید:

terraform output -json droplet_ip_addresses | jq ‘.[1]’

خروجی خواهد بود:

Output”second_ip_address”

برای ایجاد نتیجه پردازش یک آرایه ، عبارت را در داخل پرانتز بپیچید:

terraform output -json droplet_ip_addresses | jq ‘[.[1]]’

شما یک آرایه JSON بسیار چاپ شده دریافت خواهید کرد:

Output[
“second_ip_address”
]

با تعیین طیف وسیعی از نمایه ها در داخل براکت ها می توانید قسمت هایی از آرایه ها را به جای تک عناصر بازیابی کنید:

terraform output -json droplet_ip_addresses | jq ‘.[0:2]’

خروجی خواهد بود:

Output[
“first_ip_address”,
“second_ip_address”
]

محدوده 0: 2 دو عنصر اول را برمی گرداند – قسمت بالای محدوده (2) شامل نمی شود ، بنابراین فقط عناصر در موقعیت های 0 و 1 واکشی می شوند.

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

terraform destroy -var “do_token=${DO_PAT}”

در این مرحله ، jq را نصب کرده اید و از آن برای تجزیه و دستکاری خروجی پروژه Terraform خود ، که سه Droplet را استقرار می دهد ، استفاده کرده اید.

نتیجه

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

Terraformخرید vpsخرید سرورفروش سرورمدیریت داده های زیرساخت

  • behnam gol mohamadi
  • ۰
  • ۰

مشارکت در نرم افزار منبع باز: Kubernetes

ورود به سایت

آیا علاقه دارید با جامعه Kubernetes درگیر شوید ، اما مطمئن نیستید از کجا شروع کنید؟ این پست وبلاگ با هدف کمک به رفع ابهام مربوط به مشارکت در یک پروژه منبع باز به بزرگی Kubernetes و ارائه تجربیات حدیثی به شما این ایده را می دهد که مشارکت در یک پروژه منبع باز مانند Kubernetes می تواند به عنوان یک مبتدی به نظر برسد.

امیدوارم با بیان جزئیات تجربه خود به عنوان مشارکت کننده ، به شما انگیزه دهم تا اولین قدم را برای شروع راه خود به عنوان مشارکت کننده منبع باز بردارید. شما می توانید بدون توجه به سابقه یا سالها تجربه خود در Kubernetes مشارکت داشته باشید. مشارکت همه بخش مهمی و ارزشمند از جامعه منبع باز است. در زیر ، من تجربیات خود را به عنوان مشارکت کننده شرح می دهم و مراحل کلیدی را که هرکسی می تواند برای مشارکت انجام دهد ، شرح می دهد.

چرا من شروع به مشارکت در Kubernetes کردم

مشارکت در یک پروژه منبع باز مانند Kubernetes اشکال مختلفی دارد: ارسال PR های کد ، به روزرسانی اسناد ، مسائل مربوط به تریاژ ، گزارش اشکالات ، بهبود تست ها ، مرور کد ، بررسی پیشنهادات بهبود Kubernetes (KEPs) و مشارکت در مدیریت انتشار Kubernetes . Kubernetes به لطف ساعات بیشماری که توسط همکاران فعلی و مشارکت کنندگان آینده مانند شما سپری شده است ، وجود دارد و رشد می کند.

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

من همیشه علاقه مند بودم که در پروژه های منبع باز مشارکت کنم و احساس می کردم اگر مشارکت در Kubernetes را شروع کنم ، در مورد سیستم های توزیع شده اطلاعات بیشتری کسب خواهم کرد. هیچ چیز به اندازه نوشتن کد برای آن تجربه ای به شما نمی دهد ، به این ترتیب من درگیر Kubernetes شدم و چرا انجام چنین کاری برای دیگران بسیار ارزشمند است.

نحوه کمک به Kubernetes به عنوان یک مبتدی

در اینجا برخی از اولین قدم هایی است که باید برای شروع مشارکت در Kubernetes انجام دهید.

1. به دنبال مستندات مربوطه باشید که برای مشارکت کنندگان موجود است

به طور معمول ، هنگامی که شما مشارکت کننده جدیدی در هر پروژه منبع باز هستید ، باید به دنبال هرگونه اسناد مرتبط برای مشارکت کنندگان باشید. معمولاً ، این به صورت یک فایل CONTRIBUTING.md یا چیزی مشابه است. README در ریشه یک repo نیز مکان خوبی برای شروع است. هر پروژه ای که به دنبال پرورش جامعه مشارکت کنندگان است باید این اطلاعات را به راحتی در اختیار مشارکت کنندگان جدید قرار دهد. مورد دیگری که باید مورد توجه قرار گیرد ، وسایل ارتباطی است که توسعه دهندگان در آن پروژه یا پروژه فرعی خاص از آن استفاده می کنند. به عنوان مثال ، Kubernetes به شدت به Slack و لیستهای پستی متکی است: مشترک کانالهای Slack و ایمیلهای مورد علاقه خود شوید ، به ویژه برای مناطق Kubernetes که قصد دارید در آنها مشارکت داشته باشید.

به عنوان یک مبتدی کامل برای Kubernetes به طور کلی ، و همچنین فردی که هیچ تجربه ای در مشارکت در پایگاه کد Kubernetes نداشت ، من مستقیماً به فایل CONTRIBUTING.md رفتم. این به خوبی مستند شده است و به من مستندات لازم را برای تنظیم محیط من برای شروع توسعه نشان داد.

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

  • یافتن مشکلاتی برای کار: هنگامی که محیط برنامه نویس خود را تنظیم کردید ، می خواهید چیزی را پیدا کنید که روی آن کار کنید. هنگامی که من برای اولین بار شروع به کار کردم ، پس از اینکه محیط خود را تنظیم کردم ، به بررسی مسائل موجود در repo Kubernetes پرداختم. در GitHub ، هنگامی که مسائل مربوط به یک پروژه خاص را جستجو می کنید ، یک برچسب فیلترینگ وجود دارد که می تواند برای فیلتر کردن ” is:open is:issue label:”good first issue”” اعمال شود که نشان می دهد این مسئله می تواند توسط یک مبتدی کار شود. به عنوان مثال ، is:open is:issue label:”good first issue” ” در نوار جستجوی شماره GitHub لیستی از همه مسائل باز شده با برچسب “good first issue” را در اختیار شما قرار می دهد. برای فیلتر کردن بیشتر برای یک گروه علاقه مندی خاص (SIG) مانند sig/network ، عبارت “open is: issue”: برچسب ” is:open is:issue label:”good first issue”” را جستجو کنید: sig/network. از اینجا من توانستم اولین شماره خود را پیدا کنم.
  • رفع مشکلاتی که پیدا می کنید: پس از یافتن مشکلی ، باید به نگهبانان اطلاع دهید که قصد شما از کار روی آن چیست. اولین کاری که من انجام دادم این بود که در مورد GitHub بپرسم که آیا می توانم روی موضوعی که پیدا کردم کار کنم ، یعنی PR برای حذف تمام خطوط اضافی اضافی که به توابع Logf () منتقل می شوند. این شامل گذراندن کد در هر دو آزمون/e2e و test/e2e_node ، پیدا کردن مازاد خط جدید در تماس با Logf () و حذف آنها بود. این کار تمرین خوبی برای یادگیری نحوه مشارکت در پایگاه کد Kubernetes بود زیرا شامل تغییرات محلی ، ایجاد روابط عمومی در برابر شاخه اصلی و پرداختن به بازخورد بازبینی می شد.

در طول فرایند ، مهم این بود که در مورد بازخوردی که من متوجه آن نشدم ، توضیحاتی بخواهم. به عنوان مثال ، عبارت “یافتن و رفع مجرمان” گیج کننده بود زیرا نمی دانستم مجرم چیست. اما یک بار که پرسیدم ، یک پاسخ ساده دریافت کردم که به من می گفت که این بدان معناست که تمام خطوط عقب را در سراسر کد e2e حذف کنم.

  • ارتباطات کلیدی است: ارتباط در سراسر فرایند مشارکت بسیار مهم است و برای توسعه منبع باز بسیار مهم است. اگر در روابط عمومی گیر کرده اید ، مطمئن نیستید که چگونه به بازخورد بپردازید یا منطق آن را درک نمی کنید ، سوال بپرسید. بهتر است در مورد مشارکت کننده بیش از حد ارتباط برقرار کنید ، از جمله برقراری ارتباط زمانی که باید از پروژه عقب نشینی کنید. استراحت در توسعه منبع باز انتظار می رود و به حساب می آید و ارتباطات باعث شفافیت و تکرار سریعتر کار انجام شده می شود. با برقراری ارتباط واضح ، اطمینان حاصل می کنید که همه افرادی که در یک پروژه در سراسر جهان کار می کنند مطلع هستند ، در وقت خود صرفه جویی کرده و مواردی را که در ترجمه گم می شوند به حداقل می رسانند.

به عنوان یک مشارکت کننده جدید ، هنگام کار روی اولین کارم احساس عدم اطمینان و سردرگمی کردم. من معتقدم راحت بودن با ندانستن راه حل برای رسیدگی به مسائلی که به شما محول شده و پیش بردن راه حل بسیار ارزشمند است. این بدان معنا نیست که در یک اتاق تاریک بنشینید و خودتان آن را حل کنید ، این بدان معناست که وقتی نیاز به توضیح مشکل دارید ، هنگامی که با اصطلاحات آشنا نیستید ، همانطور که در مثال قبلی اشاره کردم ، یا حتی وقتی که فقط می خواهم به راه حل پیشنهادی خود چشم دوخته باشم این نگرش متکی بر کار گروهی و همکاری در مواقع ضروری به شما کمک می کند تا در مشارکت منبع باز و به طور کلی در فناوری پیشرفت زیادی داشته باشید. به خاطر داشته باشید ، به عنوان محرک راه حلی شما باید مجموعه ای از اشکال زدایی و اطلاعاتی باشید که در تلاش برای حل مشکل در حین همکاری با دیگران به دست آورده اید. به طور معمول هیچ مهلت واقعی (مگر اینکه به طور دیگری اعلام شود) در ارتباط با این “اولین مسائل خوب” وجود ندارد ، بنابراین خیالتان راحت باشد تا زمانی که لازم است از پیشرفت مداوم در موضوع GitHub اطمینان حاصل کنید و افراد را در جریان نگه دارید ، دیگران را درگیر کنید در صورت نیاز کمک کند اگر در نهایت متوجه شدید که دیگر پهنای باندی برای کار روی آن ندارید ، در مورد موضوع مربوطه صحبت کنید و شخص دیگری آن را انتخاب خواهد کرد.

3. در پیدا کردن مسائل گیر کرده اید؟ سعی کنید سایه انتشار repo Kubernetes شوید

راه دیگر برای مشارکت از طریق به روزرسانی اسناد است ، که روشی متداول برای مشارکت کنندگان جدید است تا در یک پروژه منبع باز غیر از تغییرات کد مشارکت کنند. یکی از راههای جالبی که اخیراً در آن شرکت کرده ام ، برنامه سایه انتشار Kubernetes است ، برنامه ای که در آن افراد تازه وارد مدیریت انتشارات Kubernetes می توانند در یکی از بخشهای مختلف نسخه کار کنند. من روی پیشرفتهای Kubernetes 1.20 کار کردم. وظیفه ای که به من محول شد ، بررسی و ردیابی همه پیشنهادات Kubernetes Enhancements (KEPs) ، با کمک چند سایه دیگر و یک سرنخ بود. این به من اطلاعات زیادی در مورد روند KEP داد و به من اجازه داد تا با تعداد کمی از مشارکت کنندگان در این روند کار کنم. من این مسیر را به هر کسی که به دنبال راه اندازی مجدد شبکه و تأثیر خود در جامعه Kubernetes است ، بسیار توصیه می کنم.

مزایای عضویت در Kubernetes

تبدیل شدن به یک عضو Kubernetes نتیجه مشارکت مکرر و همکاری نزدیک با حداقل 2 عضو مختلف مختلف با قابلیت های بازبینی برای یک پروژه خاص در repo Kubernetes است. به عبارت دیگر ، در پروژه Kubernetes به 2 حوزه مختلف کمک زیادی کنید و شخصی را پیدا کنید که بتوانید از نزدیک با هر یک از آنها کار کنید. با گذشت زمان ، هنگامی که تجربه کسب می کنید و برخی روابط عمومی را تحت پوشش خود دارید ، از این افراد بپرسید که آیا می توانند برای عضویت از شما حمایت کنند.

یکی از مزایای اصلی عضویت در این است که بتوانید مسائل مربوط به خود را تعیین کرده و تأثیر بیشتری بر بخش های خاصی از کدی که روی آن کار می کنید داشته باشید. یکی دیگر از مزایای ملموس عضویت ، دریافت آسیب پذیری ها و مواجهه های مشترک Kubernetes (CVE) به محض تشخیص توسط جامعه است. این امر برای تیم vpsgol Kubernetes بسیار ارزشمند بود زیرا ما اطلاعات مربوط به این آسیب پذیری های امنیتی را قبل از عموم مردم دریافت می کنیم و به ما این امکان را می دهد که تلاش های ناخواسته برای به خطر انداختن پلت فرم ما و اطمینان از حفظ امنیت مشتریانمان در حین استفاده از DOKS و سایر محصولات مبتنی بر Kubernetes در بستر vpsgol را خنثی کنیم.

موانع مشترک در راه شما برای تبدیل شدن به یک مشارکت کننده Kubernetes

موانع زیادی وجود دارد که می تواند از پیشرفت در کمک به Kubernetes جلوگیری کند یا سرعت شما را کاهش دهد. مانع اصلی این است که اولین کد خود را وارد کنید. با توجه به تعداد زیاد مشارکت های روزانه و تعداد محدود مرورگران ، برخی از روابط عمومی می توانند ماه ها یا بیشتر بمانند. راه مقابله با این مسئله این است که مطمئن شوید در حال ارسال کدی هستید که در واقع مورد نیاز است. شما می توانید با پیوند دادن آن به یک مسئله موجود یا ایجاد مشکلی برای به دست آوردن اجماع از صاحبان کدی که می خواهید به آن مشارکت کنید ، مشکلی واقعی داشته باشید و تأییدکنندگان/بازبینان آن ناحیه از کد را درگیر کنید. شما قصد مشارکت دارید

1. کمک به کد بدون همکاری با جامعه

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

2. متواضع نبودن یا احترام به عنوان مشارکت کننده

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

بازبینی: چگونه می توان به عنوان یک مبتدی به عنوان منبع باز Kubernetes تبدیل شد

  1. منطقه ای از K8 ها را پیدا کنید که به شما علاقه دارد و “اولین شماره خوب” را با موضوعات دارای برچسب پیدا کنید تا بلافاصله روی آن کار کنید.
  2. به یاد داشته باشید ، ارتباط زیاد خوب است.
  3. وظیفه را به شیوه ای مثبت دنبال کنید.
  4. در طول مسیر به دیگران کمک کنید ، درست همانطور که در شروع کار می خواهید.

open source, خرید سرور, سرور مجازی, فروش vps, منبع باز

  • behnam gol mohamadi
  • ۰
  • ۰

پایگاه های داده مدیریت شده اکنون از PostgreSQL 13 پشتیبانی می کنند

ورود به مدیریت

با افتخار اعلام می کنیم که پایگاه های داده vpsgol اکنون از PostgreSQL 13. پشتیبانی می کند PostgreSQL مسلما پیشرفته ترین پایگاه داده رابطه ای منبع باز جهان است و در چند دهه گذشته پایه و اساس برنامه های متعددی بوده است. با انتشار PostgreSQL 13 ، که شامل پیشرفت های قابل توجهی مانند صرفه جویی در فضا و افزایش عملکرد برای نمایه ها ، زمان پاسخ سریعتر برای پرس و جوهایی که از دانه ها یا پارتیشن ها استفاده می کنند ، برنامه ریزی بهتر برای پرس و جو هنگام استفاده از آمارهای پیشرفته و موارد دیگر ، قدرتمندتر شد. سایر قابلیت های جدید نسخه 13 شامل ویژگی های بسیار درخواست شده مانند جاروبرقی موازی و مرتب سازی افزایشی است.

اگر از نسخه قدیمی PostgreSQL استفاده می کنید ، می توانید به راحتی با استفاده از ارتقاء نسخه اصلی اصلی ، به صورت رایگان به PostgreSQL 13 ارتقا دهید. به این ترتیب می توانید سازگاری سرویس پایگاه داده موجود را در نسخه جدید قبل از ارتقاء آزمایش و اعتبار سنجی کنید. فرآیند ارتقا بدون درز است و نیازی به انتقال دستی داده ها بین سرویس ها را حذف می کند. به علاوه ، هیچ وقفه ای وجود ندارد ، بنابراین خوشه پایگاه داده شما در حالی که در حال ارتقا است در دسترس می ماند.

vpsgol Managed Databases شما را قادر می سازد تا کارهای پیچیده ، پیش پا افتاده (اما ضروری) مدیریت پایگاه داده مانند پیکربندی ، امنیت و به روزرسانی ها را در اختیار ما قرار دهید. این به شما امکان می دهد بر ساخت و ارتقاء برنامه های خود تمرکز کنید – نه بر حفظ پایگاه های داده خود. علاوه بر این ، پایگاه های داده مدیریتی ما اکنون از Droplets با 100٪ vCPU اختصاص داده شده برای بارهای مهم ماموریت شما پشتیبانی می کند. با نسخه فوق ، ماتریس پشتیبانی فعلی ما برای موتورها و نسخه ها به شکل زیر است:

امیدواریم پایگاه های داده خود را به PostgreSQL 13 ارتقا دهید و از همه پیشرفت ها و قابلیت های جدیدی که نسخه 13 ارائه می دهد استفاده کنید. علاوه بر این ، ارتقاء به PostgreSQL 13 از نسخه های قبلی رایگان است ، بنابراین دلیل بیشتری برای کشیدن ماشه ارتقاء وجود دارد

PostgreSQL 13SQLsqlserverآپدیت پایگاه دادهپایگاه های دادهخرید سرورفروش سرور

  • behnam gol mohamadi
  • ۰
  • ۰

 با اطمینان حجم کاری خود را به vpsgol منتقل کنید

ورود به سایت

رایانش ابری بسیاری از فرصت های جدید را برای مشاغل باز کرده است. با استفاده از خدمات ابری ، دسترسی نامحدودی به منابع کلیدی مانند محاسبه ، ذخیره سازی و پایگاه های داده با کسری از هزینه خرید و نگهداری سرورهای خود دارید. همه اینها راه اندازی یک استارتاپ جدید یا مقیاس گذاری کسب و کار خود را بر روی ابر آسان می کند. با این حال ، انتخاب ارائه دهنده مناسب ابر برای میزبانی برنامه های شما دشوار است و ممکن است نیازها در طول زمان تغییر کند. آنچه که هنگام شروع مشاغل خود کار کرد ممکن است بعد از چند سال از نظر اقتصادی یا فنی منطقی نباشد. به همین دلیل ، معمول است که شرکت ها همه بار کاری خود را به ارائه دهنده ابری دیگر منتقل می کنند یا از یک سیستم چند ابر استفاده می کنند ، که در آن ارائه دهندگان مختلف ابر برای بخش های مختلف کسب و کار استفاده می شود تا نیازهای متغیر کسب و کار خود را برآورده کنند.

با این حال ، مهاجرت به ارائه دهنده ابری دیگر مستلزم برنامه ریزی زیاد ، زمان و تلاش زیادی است و با این خطر مهاجرت باعث اختلال در تجربه مشتریان می شود.

“سادگی در هر کاری که انجام می دهیم” یکی از ارزش های اصلی در vpsgol است. این فقط به محصولات بصری ، UI ، اسناد و قیمت ما محدود نمی شود ، بلکه به روند انتقال حجم کار از سایر ارائه دهندگان ابر یا محیط های داخلی نیز گسترش می یابد. vpsgol متعهد است که روند مهاجرت را تا حد ممکن یکپارچه کند ، به همین دلیل ما اعتبارات زیرساختی و پشتیبانی را برای کمک به شما در هر مرحله از سفر مهاجرت ارائه می دهیم. در مورد اینکه چرا باید مهاجرت به vpsgol و مزایای برنامه مهاجرت ما را در نظر بگیرید ، بیشتر بدانید و برای درخواست به برنامه مهاجرت ما اینجا را کلیک کنید.

چرا مهاجرت به vpsgol

vpsgol رایانش ابری را ساده می کند تا توسعه دهندگان و مشاغل بتوانند زمان بیشتری را صرف ساختن نرم افزاری کنند که جهان را تغییر می دهد. vpsgol با زیرساخت های مهم ماموریتی و ارائه خدمات کاملاً مدیریت شده ، به توسعه دهندگان ، استارتاپ ها و مشاغل کوچک و متوسط (SMB) کمک می کند تا سریعاً برنامه های کاربردی را برای تسریع نوآوری و افزایش بهره وری و چابکی بسازند. برخی از مزایای اصلی vpsgol عبارتند از:

  • راه حل های ساده و در عین حال جامع

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

  • توانایی افزایش مقیاس با اطمینان

هر کسب و کاری نیازها و الزامات منحصر به فردی دارد. با vpsgol ، این انعطاف پذیری را دارید که می توانید از بین طیف وسیعی از IaaS ، PaaS کاملاً مدیریت شده و خدمات Kubernetes بر اساس کانتینر برای برآوردن نیازهای خود در هنگام رشد ، انتخاب کنید.

  • قیمت قابل پیش بینی و مقرون به صرفه

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

آنچه می توانید در vpsgol بسازید

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

چگونه vpsgol می تواند به انتقال حجم کار شما کمک کند

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

ارائه خدمات به مشتریانپلتفرمهای vpsgolخرید سرورخریدvpsرایانش ابریفروش سرورقیمت مقرون به صرفه سرورمهاجرت به vpsgol

 

  • behnam gol mohamadi
  • ۰
  • ۰

 Multi-cloud و hybrid cloud:همه آنچه کسب و کار شما باید بداند

ورود به سایت

یافتن رویکرد رایانش ابری مناسب برای کسب و کار شما

ظهور رایانش ابری در کسب و کار انقلابی ایجاد کرده است. ابری به مشاغل این امکان را می دهد تا زمان و انرژی خود را بر روی فناوری ساختمان متمرکز کنند ، به جای حفظ زیرساخت ها ، که منجر به رونق نوآوری در استارتاپ ها و مشاغل کوچک شده است.

اگر این مطلب را می خوانید ، احتمالاً نیازی به تعریف رایانش ابری ندارید ، اما در اینجا فقط در مورد آن آمده است: رایانش ابری عبارت است از ارائه منابع محاسباتی به عنوان یک سرویس ، که توسط ارائه دهنده ابر و نه کاربر نهایی مدیریت می شود. این برخلاف نحوه عملکرد مشاغل ، یعنی خرید و مدیریت نرم افزار و سخت افزار خود است. اکنون که متعهد به ابر هستید ، گام بعدی این است که تفاوت ها و شباهت های استراتژی ابر ترکیبی و استراتژی های چند ابر را بشناسید و دریابید که کدام رویکرد برای تجارت شما مناسب است.

برای آشنایی بیشتر با رایانش ابری ، از جمله سابقه غنی آن ، مدلها و محیطهای مختلف و مزایای کلی تجارت ، این آموزش را از vpsgol بخوانید.

بلافاصله ،  hybrid cloud و multi-cloud به طرز مشکوکی مشابه هستند و مرتباً به جای یکدیگر استفاده می شوند. در حالی که هر دو سرویس های ابری را از بیش از یک منبع ارائه می دهند ، این کار را به روش های منحصر به فرد انجام می دهند و به تنظیمات مختلف ابر اشاره می کنند. برای مطالعه عمیق تر این مبحث به ادامه مطلب بروید.

رایانش hybrid cloud چیست؟

یک عامل عمده وجود دارد که رایانشhybrid cloud را از multi-cloud منحصر به فرد می کند: رایانش hybrid cloud زیرساخت های ابر خصوصی را در کنار ارائه دهندگان رایانش ابری عمومی شامل می شود. برای اینکه محاسبات ابری ترکیبی در نظر گرفته شود ، به طور کلی شامل یک جزء خصوصی مانند مرکز داده در محل است که مستقیماً توسط مشاغل با استفاده از آن مدیریت و نگهداری می شود.

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

وقتی مشاغل شروع به ترکیب چندین سرویس ابری عمومی در ترکیب می کنند ، این تعریف پیچیده می شود. وقتی چندین سرویس ابر عمومی در ارتباط با یکدیگر کار می کنند ، این چند ابر است .

رایانش multi-cloud چیست؟

راه اندازی رایانش multi-cloud در ساده ترین شکل به این معنی است که یک شرکت از چندین ارائه دهنده ابر عمومی برای انجام وظایف یا حجم کاری خاص استفاده می کند. به عنوان مثال ، یک ارائه دهنده برای حجم کار تحلیلی و یکی برای وب سایت های عمومی. همانطور که رامان شارما ، نایب رئیس بازاریابی محصول و برنامه DigitalOcean می گوید: “دلایلی که برای انتخاب راه اندازی چند ابر ارائه می شود متفاوت است-مدیریت ریسک ، اجتناب از قفل شدن و وابستگی به یک ارائه دهنده ، رعایت الزامات نظارتی و غیره.”

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

برخی از مشاغل ممکن است از یک محیط hybrid وmulti-cloud استفاده کنند ، که در آن از یک ابر خصوصی علاوه بر چندین ابر عمومی استفاده می کنند. با این حال ، اگر یک کسب و کار فقط از یک سرویس ابری عمومی علاوه بر یک ابر خصوصی استفاده کند ، این تنها یک ابر ترکیبی محسوب می شود. تفاوت اصلی در اینجا این است که multi-cloud شامل بیش از یک ابر عمومی است

انتخاب گزینه ابر مناسب برای استارتاپ یا مشاغل کوچک شما

مشاغل کوچک کاندیدای ایده آل برای اتخاذ استراتژی hybrid وmulti-cloud هستند. بسیاری از مشاغل کوچک امروزی بومی ابر هستند ، به این معنی که در ابر متولد شده اند و هرگز زیرساخت خود را حفظ نمی کنند بلکه در عوض یک استراتژی چند ابر را اتخاذ می کنند. همانطور که شارما توضیح می دهد ، “اکثر شرکت های کوچکتر تقریباً بنا به ضرورت از معماری چند ابر استفاده می کنند. آنها دو نیاز دارند: 1) آنها می خواهند بر ساخت برنامه های خود تمرکز کنند و چرخ را دوباره اختراع نکنند. 2) آنها ابزارها و خدماتی را می خواهند که از نظر بهره وری و ROI در مناطق مربوطه بهترین تولید را داشته باشند. ” اغلب ، کار با ارائه دهندگان خدمات ابری خارجی نتیجه جستجوی نتایج مطلوب آنها با بودجه ای مناسب برای کسب و کار رو به رشد آنها است.

تنها با یک ارائه دهنده خدمات می توان مواردی را ذکر کرد ، اما این امر ممکن است نتواند به فناوری تخصصی که از ایده های نوآورانه و تکرار سرعت راه اندازی پشتیبانی می کند ، دسترسی پیدا کند.

وقتی نوبت به مسیر ترکیبی یا چند ابر می رسد ، تصمیم واقعاً در جایی است که منابع غیر ابری کسب و کار شما در کجا قرار دارد. اگر خرید و بهره برداری از یک ابر خصوصی در محل امکان پذیر است و به دلیل نیازهای منحصر به فردی که شرکت شما در زمینه امنیت یا پیکربندی نیاز دارد ، ترجیح داده می شود ، بنابراین ترکیبی راه درستی است. با این حال ، اگر این امر ضروری یا مطلوب نباشد ، استفاده از رویکرد چند ابر همچنان مزایای یکسانی را از نظر تقویت در برابر بلایا ، برخورد با رعایت و انعطاف پذیری به همراه خواهد داشت ، اما بدون استقلال همراه با داشتن ابر خصوصی. برای اکثر مشاغل کوچک و متوسط ​​، چند ابر انعطاف پذیری و قابلیت اطمینان لازم را بدون پیچیدگی و سرمایه گذاری زیرساختی مورد نیاز برای راه اندازی ابر ترکیبی فراهم می کند.

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

hybrid cloudmulti-cloudخرید سرورخریدvpsرایانش ابریرایانش ابری ترکیبیسرور مجازیمحاسبات ابریهاست 

 

  • behnam gol mohamadi