سرور مجازی

  • ۰
  • ۰

GraphQL یک زبان جستجو است که توسط فیس بوک با هدف ساخت برنامه های کلاینت بر اساس نحو بصری و انعطاف پذیر برای توصیف نیازمندی و تعامل داده ها ایجاد شده است. یک سرویس GraphQL با تعیین انواع و فیلدهای مربوط به آن نوع ها ایجاد می شود ، سپس عملکردهایی را برای هر فیلد در هر نوع ارائه می دهد.
هنگامی که یک سرویس GraphQL در حال اجرا است (به طور معمول با URL در یک سرویس وب) ، می تواند برای اعتبار سنجی و اجرا، جستارهایGraphQL را دریافت کند. ابتدا جستار دریافت شده بررسی می شود تا اطمینان حاصل شود که فقط به انواع و فیلدهای تعریف شده اشاره دارد ، سپس توابع ارائه شده را اجرا می کند تا نتیجه ای حاصل شود.
در این آموزش قصد داریم سرور مجازی GraphQL را با استفاده از Express پیاده سازی کنیم و از آن برای یادگیری ویژگی های مهم GraphQL استفاده کنیم.

برخی از ویژگی های GraphQL عبارتند از:
• سلسله مراتبی – جستجوها دقیقاً مانند داده هایی هستند که برگردانده می شوند.
• پرس و جوهای مختص کلاینت – کلاینت این آزادی را دارد که بگوید چه چیزی را از سرور مجازی دریافت کند ،
• به صورت قوی دسته بندی شده – می توانید قبل از اجرا ، یک پرس و جو را به صورت نحوی و درون سیستم نوع GraphQL تأیید کنید. همچنین به اهرم ابزارهای قدرتمندی که باعث بهبود تجربه توسعه می شوند ، مانند GraphiQL کمک می کند.
• درون نگرانه – می توانید با استفاده از خود دستور GraphQL ، نوع سیستم را پرس و جو کنید. این امر برای تجزیه داده های ورودی به رابط های قوی دسته بندی شده عالی است و نیازی به تجزیه و تبدیل دستی JSON به آبجکت ها ندارد.
چرا از GraphQL استفاده کنیم
یکی از چالش های اصلی در تماس های معمول REST عدم توانایی کلاینت در درخواست مجموعه داده های سفارشی (محدود یا گسترش یافته) است. در بیشتر موارد ، هنگامی که کلاینت اطلاعاتی را از سرور مجازی درخواست می کند ، همه یا هیچ یک از قسمت ها را دریافت نمی کند.
مشکل دیگر، کار و حفظ چندین نقطه انتهایی است. با رشد یک پلتفرم، در نتیجه تعداد آنها افزایش می یابد. بنابراین ، کلاینت ها اغلب نیاز به درخواست داده ها از نقاط انتهایی مختلف دارند. API های GraphQL از نظر انواع و فیلدها سازماندهی می شوند نه بر حسب نقاط پایانی. شما می توانید از یک نقطه انتهایی به قابلیت های کامل داده های خود دسترسی پیدا کنید.
هنگام ساختن یک سرور مجازی GraphQL ، فقط لازم است که یک URL برای واکشی و جهش همه داده ها داشته باشد. بنابراین ، کلاینت می تواند با ارسال یک رشته پرس و جو به سرور مجازی که خواسته اش را توصیف میکند، مجموعه ای از داده ها را درخواست کند.
تنظیم GraphQL با Node
ما با ساختار اصلی فایل و قطعه کد نمونه شروع می کنیم. برای دنبال کردن گام به گام این آموزش ، یک پوشه GraphQL ایجاد کنید و در داخل پوشه با استفاده از npm init -y یک پروژه npm را آغاز کنید. سپس یک فایل server.js ایجاد کنید که فایل اصلی خواهد بود. برای کد کامل ، منبع را با استفاده از دستورالعمل های موجود در منبع github ضمیمه شده ، کلون کنید.

بسته های لازم را نصب خواهیم کرد که در هر مرحله مورد بحث قرار خواهد گرفت.
⦁ $ npm i graphql express express-graphql -S

با استفاده از Express و express-Graphql ، یعنی میان افزار سرور مجازی HTTP ، یک سرور مجازی تنظیم خواهیم کرد. در مورد معنی کد نگران نباشید زیرا در مراحل بعدی با افزودن مطالب بیشتر ، آن را اندک اندک به طور کامل کشف خواهیم کرد.
var express = require(‘express’);
var graphqlHTTP = require(‘express-graphql’);
var { buildSchema } = require(‘graphql’);

// Initialize a GraphQL schema
var schema = buildSchema(`
type Query {
hello: String
}
`);

// Root resolver
var root = {
hello: () => ‘Hello world!’
};

// Create an express server and a GraphQL endpoint
var app = express();
app.use(‘/graphql’, graphqlHTTP({
schema: schema, // Must be provided
rootValue: root,
graphiql: true, // Enable GraphiQL when server endpoint is accessed in browser
}));
app.listen(4000, () => console.log(‘Now browse to localhost:4000/graphql’));

مفاهیم
تاکنون برخی از ویژگیها و مزایای GraphQL را مورد بررسی قرار داده ایم. در این بخش به اصطلاحات مختلف و پیاده سازی برخی از مشخصات فنی در GraphQL خواهیم پرداخت. برای تمرین ویژگی های خود از یک سرور مجازی اکسپرس استفاده خواهیم کرد.
شماتیک
در GraphQL ، Schema پرس و جوها و جهش ها را مدیریت میکند و چیزی که مجاز است در سرور مجازی GraphQL اجرا شود را تعریف می کند. شماتیک یک سیستم نوع GraphQL API را تعریف می کند. مجموعه کاملی از داده های ممکن (اشیاء ، زمینه ها ، روابط ، همه چیز) را که کلاینت می تواند به آن دسترسی داشته باشد ، توصیف می کند. تماس های کلاینت در مقابل شماتیک اعتبار سنجی و اجرا می شوند. کلاینت می تواند از طریق درون نگاری اطلاعات مربوط به شماتیک را پیدا کند. شماتیک در سرور مجازی GraphQL API قرار دارد.
زبان تعریف رابط GraphQL (IDL) یا زبان تعریف شماتیک (SDL) مختصر ترین روش برای مشخص کردن یک طرح واره GraphQL است. ابتدایی ترین اجزای یک شماتیک GraphQL انواع آبجکت هستند ، که فقط نشان دهنده نوعی آبجکت هستند که می توانید سرویس خود بگیرید و اینکه چه فیلد هایی را در اختیار شما قرار می دهد. در زبان شماتیک GraphQL ، ممکن است آن را مانند این نشان دهیم:
type User {
id: ID!
name: String!
age: Int
}

در قطعه فوق ما از تابع buildSchema استفاده می کنیم که یک آبجکت شماتیک را از زبان شماتیک GraphQL می سازد.
var schema = buildSchema(`
type Query {
hello: String
}
`);

انواع ساخت
در داخل buildSchema ، می توان انواع مختلفی را تعریف کرد. ممکن است در بیشتر موارد به type Query {…} و type Mutation {…} توجه کنید. type Query {…} آبجکتی است که توابعی را شامل میشود که روی جستارهای GraphQL نگاشت می شود و برای واکشی داده ها (معادل GET در REST) ​​استفاده می شود ، در حالی که type Mutation {…} توابعی را دارد که روی جهش ها نگاشت می شود و برای ایجاد ، به روزرسانی یا حذف داده ها (معادل POST ، UPDATE و DELETE در REST) استفاده میشود.
ما با اضافه کردن برخی از انواع منطقی ، شماتیک خود را کمی پیچیده خواهیم کرد. به عنوان مثال ، می خواهیم یک user و آرایه ای از users از نوع person که خصوصیات id ، name ، age و gender دارند را بازگردانیم.
var schema = buildSchema(`
type Query {
user(id: Int!): Person
users(gender: String): [Person]
},
type Person {
id: Int
name: String
age: Int
gender: String
}
`);

شما می توانید به دستور جالبی در بالا توجه کنید ، [Person] به معنی بازگرداندن مجموعه ای از نوع person است در حالی که علامت تعجب در user(id: Int!) بدین معنی است که id باید ارائه شود. جستار users  یک متغیر جنسیت اختیاری می گیرد.
resolver
resolver مسئول نگاشت عملکرد روی تابع واقعی است. در داخل type Query، عملیاتی به نام users داریم. ما این عملیات را به یک تابع با همین نام در داخل root نگاشت می کنیم. همچنین برای این قابلیت ، چند کاربر ساختگی را ایجاد خواهیم کرد.

var users = [ // Dummy data
{
id: 1,
name: ‘Brian’,
age: ’21’,
gender: ‘M’
},
{
id:2,
name: ‘Kim’,
age: ’22’,
gender: ‘M’
},
{
id:3,
name: ‘Joseph’,
age: ’23’,
gender: ‘M’
},
{
id:3,
name: ‘Faith’,
age: ’23’,
gender: ‘F’
},
{
id:5,
name: ‘Joy’,
age: ’25’,
gender: ‘F’
}
];

var getUser = function(args) { … } // Return a single user
var retrieveUsers = function(args) { … } // Return a list of users

var root = {
user: getUser, // Resolver function to return user with specific id
users: retrieveUsers
};

برای خواناتر کردن کد، به جای اینکه همه چیز را در resolver اصلی جمع کنیم ، توابع جداگانه ایجاد خواهیم کرد. هر دو تابع یک پارامتر args اختیاری دارند که متغیرهایی را از جستار کلاینت دربردارند. بیایید اجرایی را برای resolver ها ارائه دهیم و عملکرد آنها را تست کنیم.

var getUser = function(args) { // return a single user based on id
var userID = args.id;
return users.filter(user => {
return user.id == userID;
})[0];
}

var retrieveUsers = function(args) { // Return a list of users. Takes an optional gender parameter
if(args.gender) {
var gender = args.gender;
return users.filter(user => user.gender === gender);
} else {
return users;
}
}

جستار
query getSingleUser {
user {
name
age
gender
}
}

خروجی

در نمودار بالا ، ما از عملیاتی به نام getSingleUser استفاده می کنیم تا یک کاربر واحد با نام ، جنسیت و سن آنها را بدست آوریم. به صورت اختیاری می توانیم مشخص کنیم که فقط در صورت عدم نیاز به سن و جنس ، به نام آنها احتیاج داریم.
هنگامی که چیزی در ورودهای شبکه یا سرور مجازی GraphQL شما رخ می دهد ، به جای تلاش برای رمزگشایی مطالب ، آسانتر است که یک پرس و جو در پایگاه داده خود را با نام خود شناسایی کنید.
این پرس و جو id مورد نیاز را ارائه نمی دهد و GraphQL به ما یک پیام خطای توصیفی می دهد. اکنون یک جستار صحیح ایجاد خواهیم کرد ، به استفاده از متغیرها / آرگومان ها دقت کنید.
جستار
query getSingleUser($userID: Int!) {
user(id: $userID) {
name
age
gender
}
}
متغیرها
{
“userID”:1
}
خروجی

نام های مستعار
شرایطی را تصور کنید که باید دو کاربر مختلف را بازیابی کنیم. چگونه می توانیم هر کاربر را شناسایی کنیم؟ در GraphQL ، شما به طور مستقیم نمی توانید یک فیلد یکسان را با آرگومان های مختلف جستجو کنید. بیایید این مطلب را نشان دهیم.
جستار
query getUsersWithAliasesError($userAID: Int!, $userBID: Int!) {
user(id: $userAID) {
name
age
gender
},
user(id: $userBID) {
name
age
gender
}
}
متغیرها
{
“userAID”:1,
“userBID”:2
}
خروجی

خطا توصیفی است و حتی استفاده از نام های مستعار را نشان می دهد. بیایید اجرا را اصلاح کنیم.
query getUsersWithAliases($userAID: Int!, $userBID: Int!) {
userA: user(id: $userAID) {
name
age
gender
},
userB: user(id: $userBID) {
name
age
gender
}
}
متغیرها
{
“userAID”:1,
“userBID”:2
}
خروجی

اکنون می توانیم به طور صحیح هر کاربر را با فیلدهای خود مشخص کنیم.
بخش ها (fragmentها)
سؤال بالا چندان بد نیست ، اما یک مشکل دارد. ما در حال تکرار فیلدهای یکسان برای userA و userB هستیم. می توانیم چیزی را پیدا کنیم که جستجوهای ما را DRY می کند. GraphQL شامل واحدهای قابل استفاده مجدد به نام fragment است که به شما امکان می دهد مجموعه هایی از فیلدها را بسازید ، و سپس آنها را در جستارهای مورد نظر خود درج کنید.
جستار
query getUsersWithFragments($userAID: Int!, $userBID: Int!) {
userA: user(id: $userAID) {
…userFields
},
userB: user(id: $userBID) {
…userFields
}
}

fragment userFields on Person {
name
age
gender
}
متغیرها
{
“userAID”:1,
“userBID”:2
}

خروجی

ما قطعه ای به نام userFields ایجاد کرده ایم که فقط می تواند در type Person اعمال شود و از آن برای بازیابی کاربران استفاده می شود.
دستورالعمل ها
دستورالعمل ها به ما امکان می دهند ساختار و شکل نمایش داده ها را با استفاده از متغیرها به طور پویا تغییر دهیم. در بعضی از موارد ممکن است بخواهیم بدون تغییر شماتیک ، برخی از فیلدها را رد کنیم یا شامل شویم. دو دستورالعمل موجود عبارتند از:
⦁ @include(if: Boolean) فقط در صورت صحت آرگومان این قسمت را در فیلد وارد میکند.
⦁ @skip(if: Boolean) در صورت صحیح بودن آرگومان ، از این قسمت پرش میگذرد.
بگذارید بگوییم که می خواهیم کاربران با جنسیت “F” را بازیابی کنیم اما سن آنها را کنار بگذاریم و id آنها را درج کنیم. از متغیرها برای وارد کردن جنسیت استفاده می کنیم و از دستورالعمل ها برای رد کردن و مستثنی شدن ویژگی های جست و جو استفاده می کنیم.
جستار
query getUsers($gender: String, $age: Boolean!, $id: Boolean!) {
users(gender: $gender){
…userFields
}
}

fragment userFields on Person {
name
age @skip(if: $age)
id @include(if: $id)
}
متغیرها
{
“gender”: “F”,
“age”: true,
“id”: true
}
خروجی

جهش ها
تاکنون با پرس و جوها سر و کار داشته ایم، عملیاتی برای بازیابی اطلاعات. جهش ها دومین عملیات اصلی در GraphQL هستند که با ایجاد ، حذف و به روز رسانی داده ها سر و کار دارند. بیایید به چند نمونه از نحوه انجام جهش ها توجه کنیم. به عنوان مثال ، ما می خواهیم یک کاربر را با id==1 به روز کنیم و سن ، نام آنها را تغییر داده و جزئیات جدید کاربر را برگردانیم.
ما طرح خود را به روز خواهیم کرد تا یک نوع جهش را در خود جای دهد و همچنین resolver اصلی ما را با توابع resolver مربوطه به روز کند.
// Add mutations
var schema = buildSchema(`

type Mutation {
updateUser(id: Int!, name: String!, age: String): Person
}
`);

var updateUser = function({id, name, age}) { // Update a user and return new user details
users.map(user => {
if(user.id === id) {
user.name = name;
user.age = age;
return user;
}
});
return users.filter(user=> user.id === id) [0];
}

var root = {
user: getUser,
users: retrieveUsers,
updateUser: updateUser // Include mutation function in root resolver
};
فرض کنید این اطلاعات اولیه کاربر هستند.

پس از جهش برای به روزرسانی کاربر ، اطلاعات جدید کاربر را دریافت می کنیم.
جستار
mutation updateUser($id: Int!, $name: String!, $age: String) {
updateUser(id: $id, name:$name, age: $age){
…userFields
}
}

fragment userFields on Person {
name
age
gender
}
متغیرها
{
“id”: 1,
“name”: “Keavin”,
“age”: “27”
}
خروجی

نتیجه
در این راهنما ، ما مفاهیم اساسی GraphQL و همچنین برخی از مثال های نسبتاً پیچیده را پوشش داده ایم. بیشتر این مثالها تفاوتهایی را بین GraphQL و REST برای کاربرانی که با REST تعامل داشته اند نشان می دهد.
برای کسب اطلاعات بیشتر در مورد GraphQL ، مطالب رسمی را بررسی کنید.

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

Discourse یک بستر بحث و گفتگوی منبع آزاد است. می تواند به عنوان یک لیست پستی ، یک انجمن بحث و گفتگو یا یک چت روم طولانی استفاده شود. در این آموزش ، Discourse را در یک محیط جداگانه با استفاده از Docker ، یک برنامه کانتینریزاسیون نصب خواهیم کرد.
پیش نیازها
قبل از شروع کار ، مواردی وجود دارد که ابتدا باید آنها را تنظیم کنیم:
یک سرور مجازی Ubuntu 18.04 با حداقل 2 گیگابایت رم ، که با دنبال کردن راهنمای راه اندازی اولیه اوبونتو 18.04 تنظیم شده باشد، و شامل یک کاربر sudo غیر ریشه و فایروال تنظیم شده باشد.
Docker نصب شده بر روی سرور مجازی، که می توانید با دنبال کردن مرحله 1 آموزش نصب Docker برای اوبونتو 18.04 انجام دهید.
نام دامنه ای که بر روی سرور مجازی شما ایجاد شود ، که می توانید با دنبال کردن این آموزش نام میزبان ، آن را تنظیم کنید.
سرور مجازی پستی SMTP . اگر نمی خواهید سرور مجازی پست الکترونیکی خود را اجرا کنید ، می توانید از یک سرویس دیگر مانند سرویس رایگان Mailgun استفاده کنید.
توجه: اگر از 1 گیگابایت رم استفاده می کنید ، Discourse نیاز به فایل swap دارد. اگرچه swap برای سیستمهای در حال استفاده از هارد دیسک های چرخشی قدیمی توصیه میشود ، اما استفاده از swap با SSD ها می تواند با گذشت زمان مشکلاتی را برای تخریب سخت افزار ایجاد کند. با توجه به این نکته ، ما فعال کردن swap در vpsgol یا هر ارائه دهنده دیگری که از حافظه SSD استفاده می کند را توصیه نمی کنیم. انجام این کار می تواند بر قابلیت اطمینان سخت افزار اصلی برای شما و همسایگانتان تأثیر بگذارد. از این رو ، حداقل 2 گیگ رم را برای اجرای Discourse روی یک دراپلت vpsgol توصیه می کنیم. برای جزئیات بیشتر در مورد استفاده از Discourse ، به نحوه اضافه کردن فضای Discourse در اوبونتو 18.04 مراجعه کنید.
مرحله 1 – دانلود Discourse
با داشتن تمام پیش شرط های موجود ، می توانید مستقیماً به سراغ نصب Discourse بروید.
باید در بقیه مراحل تنظیم و راه اندازی به عنوان root وارد شوید، بنابراین ابتدا به یک پوسته root بروید.
$ sudo -s

در مرحله بعد ، دیرکتوری /var/discourse را ایجاد کنید ، جایی که تمام فایل های مربوط به Discourse در آن قرار دارند.
# mkdir /var/discourse

سرانجام ، تصویر رسمی Discourse Docker را به /var/discourse کلون کنید.
# git clone https://github.com/discourse/discourse_docker.git /var/discourse

با استفاده از فایل هایی که به آنها نیاز داریم ، می توانیم به سراغ پیکربندی و راه اندازی مجدد برویم.
مرحله 2 – پیکربندی و را ه اندازی Discourse
به دیرکتوری / var / discourse بروید جایی که فایل های Discourse قرار دارند.
# cd /var/discourse

از اینجا ، می توانید اسکریپت راه اندازی موجود را راه اندازی کنید.
# ./discourse-setup

سوالات زیر از شما پرسیده خواهد شد:
• نام میزبان برای Discourse ؟
نام میزبان مورد نظر خود را برای Discourse وارد کنید، مثلاً discourse.your_domain.com که نام دامنه شما جایگزین your_domain.com خواهد شد. لازم نیست از نام دامنه استفاده کنید زیرا یک آدرس IP هنگام ارسال ایمیل کار نمی کند.
• آدرس ایمیل برای حساب کاربری ادمین؟
آدرس ایمیلی را که می خواهید برای حساب کاربری ادمین Discourse استفاده کنید ، انتخاب کنید. این می تواند کاملاً بی ارتباط به دامنه Discourse شما باشد و می تواند هر آدرس ایمیلی که مناسب میبینید باشد.
توجه داشته باشید که وقتی اولین کاربر با آن ایمیل ثبت نام می کند ، این آدرس ایمیل به صورت پیش فرض مدیر Discourse را ایجاد میکند. بعداً هنگام تنظیم Discourse از پنل کنترل وب ، به این آدرس ایمیل نیاز خواهید داشت.
• آدرس سرور مجازی SMTP؟
• نام کاربر SMTP؟
• پورت SMTP؟
• رمز عبور SMTP؟
جزئیات سرور مجازی SMTP خود را برای این سؤالات وارد کنید. اگر از Mailgun استفاده می کنید ، آدرس سرور مجازی SMTP smtp.mailgun.org خواهد بود ، نام کاربر و رمز عبور، اعتبار SMTP برای دامنه شما در زیر دامنه ها هستند.
در آخر از شما خواسته می شود تمام تنظیماتی را که تازه وارد کرده اید تأیید کنید. بعد از تأیید تنظیمات ، اسکریپت یک فایل پیکربندی به نام app.yml تولید می کند و سپس فرایند راه اندازی شروع می شود.
توجه: اگر بعد از راه اندازی مجدد (Bootstrapping) نیاز بود این تنظیمات را تغییر دهید یا آنها را برطرف کنید ، فایل /containers/app.yml خود را ویرایش کرده و ./launcher rebuild app را اجرا کنید. در غیر این صورت ، تغییرات شما مؤثر واقع نمی شوند.
Bootstrapping بین 2-8 دقیقه طول می کشد ، پس از آن نمونه شما اجرا خواهد شد! بیایید به سراغ ایجاد یک حساب ادمین برویم.
مرحله 3 – ثبت نام حساب کاربری ادمین
برای مشاهده صفحه وب Discourse ، از دامنه Discourse خود در مرورگر وب مورد علاقه خود بازدید کنید.
اگر یک خطای 502 Bad Gateway دریافت کردید ، یک یا دو دقیقه منتظر بمانید و سپس ریفرش کنید. ممکن است Discourse هنوز شروع نشده باشد.
هنگامی که صفحه لود می شود ، روی دکمه آبی Register کلیک کنید. یک فرم با عنوان Register Admin Account با فیلدهای زیر مشاهده خواهید کرد:
• ایمیل: آدرس ایمیلی را که قبلاً ارائه کرده اید از فهرست کشویی انتخاب کنید.
• نام کاربری: نام کاربری را انتخاب کنید.
• رمز عبور: یک رمز عبور قوی انتخاب کنید.
سپس بر روی دکمه آبی رنگ Register روی فرم کلیک کنید تا ارسال شود. اعلانی را می بینید که می گوید ایمیل خود را تأیید کنید. صندوق ورودی ایمیل خود را برای تأیید بررسی کنید. اگر آن را دریافت نکردید ، روی دکمه Resend Activation Email کلیک کنید. اگر هنوز قادر به ثبت نام یک حساب ادمین جدید نیستید ، لطفاً به لیست بررسی عیب یابی ایمیل Discourse مراجعه کنید.
پس از ثبت ادمین خود ، setup wizard راه اندازی میشود و شما را برای پیکربندی اصلی Discourse راهنمایی می کند. اکنون می توانید در آن چرخ بزنید یا برای رد کردن روی گزینه Maybe Later کلیک کنید.

پس از تکمیل یا رد setup wizard ، برخی از مباحث و راهنمای شروع سریع ادمین (با عنوان READ ME FIRST را مشاهده خواهید کرد) ، که حاوی نکاتی برای شخصی سازی بیشتر نصب Discours میباشد.

همه را تنظیم کرده اید! اگر در آینده نیاز داشتید Discours را به روز کنید، می توانید با دریافت آخرین نسخه کد از Git repo و ساخت مجدد برنامه ، مانند خط زیر ، آن را از خط فرمان انجام دهید:
# cd /var/discourse

# git pull

# ./launcher rebuild app
همچنین می توانید با مراجعه به سایت http://discourse.your_domain.com/admin/upgrade ، کلیک بر روی Upgrade to the Latest Version و دنبال کردن دستورالعمل ها ، آن را در مرورگر خود به روز کنید.
نتیجه
اکنون می توانید مدیریت انجمن Discourse خود را شروع کرده و به کاربران اجازه دهید ثبت نام کنند. در صفحه جزییات Discourse ، در مورد ویژگی های Discourse بیشتر بیاموزید.

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

MySQL یک سیستم مدیریت پایگاه داده منبع باز است که معمولاً به عنوان بخشی از پشته محبوب LEMP (Linux، Nginx ، MySQL / MariaDB ، PHP / Python / Perl) نصب می شود. این سیستم، مدل رابطه ای و زبان ساختار یافته جستجو (SQL) را برای مدیریت و پرس و جوی داده ها پیاده سازی می کند.
در این آموزش نحوه نصب نسخه 8 MySQL در سرور مجازی CentOS 8 توضیح داده شده است.
پیش نیازها
برای تکمیل این آموزش ، به سرور مجازی دارای CentOS 8 نیاز خواهید داشت. این سرور مجازی باید دارای کاربر غیر ریشه با امتیازات ادمین و فایروال تنظیم شده با firewalld باشد. برای انجام این کارها، راهنمای تنظیم اولیه سرور مجازی برای CentOS 8 را مشاهده کنید.
مرحله 1 – نصب MySQL
در CentOS 8 ، نسخه 8 MySQL از منابع پیش فرض در دسترس است.
برای نصب بسته mysql-server و تعدادی از متعلقات آن ، دستور زیر را اجرا کنید:
$ sudo dnf install mysql-server

هنگامی که از شما خواسته شد ، برای تأیید ادامه روی y کلیک کرده و enter بزنید :
utput
. . .
Install 49 Packages

Total download size: 46 M
Installed size: 252 M
Is this ok [y/N]: y

با این کار MySQL روی سرور مجازی شما نصب شده است اما هنوز عملیاتی نشده است. بسته ای که تازه نصب کردید MySQL را پیکربندی می کند تا به عنوان یک سرویس سیستمی به نام mysqld.service اجرا شود. برای استفاده از MySQL ، باید آن را با دستور systemctl شروع کنید:
$ sudo systemctl start mysqld.service

برای بررسی صحت عملکرد سرویس ، دستور زیر را اجرا کنید. توجه داشته باشید که برای بسیاری از دستورات systemctl از جمله start  و ، همانطور که در اینجا نشان داده شده است ، status  – لازم نیست خدمات پس از نام سرویس .service را وارد کنید:
$ sudo systemctl status mysqld

اگر MySQL با موفقیت شروع شد ، خروجی نشان می دهد که سرویس MySQL فعال است:
Output
● mysqld.service – MySQL 8.0 database server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2020-03-12 14:07:41 UTC; 1min 7s ago
Main PID: 15723 (mysqld)
Status: “Server is operational”
Tasks: 38 (limit: 5056)
Memory: 474.2M
CGroup: /system.slice/mysqld.service
└─15723 /usr/libexec/mysqld –basedir=/usr

Mar 12 14:07:32 cent-mysql-3 systemd[1]: Starting MySQL 8.0 database server…
Mar 12 14:07:32 cent-mysql-3 mysql-prepare-db-dir[15639]: Initializing MySQL database
Mar 12 14:07:41 cent-mysql-3 systemd[1]: Started MySQL 8.0 database server.

سپس با اجرای دستور زیر MySQL را تنظیم کنید تا پس از بوت شدن سرور مجازی راه اندازی شود.
$ sudo systemctl enable mysqld

توجه: اگر می خواهید این رفتار را تغییر داده و MySQL را از شروع کار هنگام بوت شدن بازدارید ، می توانید این دستور را اجرا کنید:
$ sudo systemctl disable mysqld

اکنون MySQL روی سرور مجازی شما نصب ، اجرا و فعال شده است. در مرحله بعدی ، به سراغ نحوه بالا بردن امنیت پایگاه داده شما را با استفاده از اسکریپت پوسته ای میرویم که با نمونه MySQL از قبل نصب شده همراه است.
مرحله 2 – ایمن سازی MySQL
MySQL شامل یک اسکریپت امنیتی است که به شما امکان می دهد برای بهبود امنیت MySQL برخی گزینه های پیکربندی پیش فرض را تغییر دهید.
برای استفاده از اسکریپت امنیتی ، دستور زیر را اجرا کنید:
$ sudo mysql_secure_installation

این امر شما را با مجموعه ای از سؤالات مواجه می کند که آیا می خواهید در گزینه های امنیتی نصب MySQL خود تغییرات خاصی ایجاد کنید یا خیر. اولین سؤال از شما میپرسد که آیا شما می خواهید افزونه Validate Password را تنظیم کنید ، که می توانید از آن برای تست قوی بودن پسورد MySQL استفاده کنید.
اگر تنظیم افزونه اعتبار سنجی گذرواژه را انتخاب کنید ، اسکریپت از شما می خواهد که یک سطح اعتبار رمز عبور را انتخاب کنید. قوی ترین سطح – که شما با وارد کردن 2 انتخاب می کنید – حداقل 8 کاراکتر برای پسورد نیاز دارد و باید ترکیبی از حروف بزرگ ، حروف کوچک ، عدد و کاراکترهای خاص را شامل شود:
Output
Securing the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2

صرف نظر از این که آیا شما می خواهید افزونه رمز عبور معتبر را انتخاب کنید ، اعلان بعدی تعیین رمز عبور برای کاربر ریشه MySQL خواهد بود. رمز عبور ایمن را انتخاب و تأیید کنید:
Output
Please set the password for root here.

New password:

Re-enter new password:

اگر از افزونه اعتبار سنجی گذرواژه استفاده کرده اید ، در مورد قدرت رمزعبور جدید خود بازخورد خواهید گرفت. سپس اسکریپت از شما سؤال می کند که آیا می خواهید رمز عبوری را که وارد کرده اید ادامه دهید یا می خواهید یک رمز جدید را وارد کنید. با فرض اینکه از قدرت رمز عبوری که تازه وارد کرده اید راضی هستید ، Y را برای ادامه وارد کنید:
Output
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

پس از آن ، می توانید Y و سپس ENTER را فشار دهید تا پیش فرض برای همه سؤالات بعدی را بپذیرید. با این کار برخی از کاربران ناشناس و بانک اطلاعاتی آزمایشی حذف می شوند ، ورود root به سیستم از راه دور غیرفعال می شود و این قوانین جدید را لود می کند تا MySQL فوراً با تغییراتی که ایجاد کرده اید منطبق شود.
با این کار ، MySQL را روی سرور مجازی CentOS 8 خود نصب و ایمن کرده اید. به عنوان مرحله آخر ، آزمایش خواهیم کرد که بانک اطلاعاتی همانطور که انتظار می رود در دسترس بوده و کار می کند.
مرحله 3 – تست MySQL
می توانید با اتصال به ابزار mysqladmin ، کلاینتی که به شما امکان اجرای دستورات ادمین را می دهد ، نصب خود را تأیید کنید و در مورد آن اطلاعات کسب کنید. از دستور زیر برای اتصال به MySQL به عنوان root (-u root) ، اعلان رمز عبور (-p) و بازگردانی نسخه نصب استفاده کنید:
$ mysqladmin -u root -p version

خروجی مشابه این را مشاهده خواهید کرد:
Output
mysqladmin Ver 8.0.17 for Linux on x86_64 (Source distribution)
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version 8.0.17
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/lib/mysql/mysql.sock
Uptime: 2 hours 52 min 37 sec

Threads: 2 Questions: 20 Slow queries: 0 Opens: 131 Flush tables: 3 Open tables: 48 Queries per second avg: 0.001

این نشان می دهد که نصب شما موفقیت آمیز بود.
اگر می خواهید به MySQL وصل شوید و داده های خود را به آن اضافه کنید ، دستور زیر را اجرا کنید:
$ mysql -u root -p

مانند دستور mysqladmin قبلی ، این دستور شامل گزینه -u می باشد که به شما امکان می دهد تا کاربر مورد نظر برای اتصال ( به عنوان root در این حالت) و گزینه -p را مشخص کنید ، که به دستور می گوید رمز عبور کاربر که در مرحله قبل تنظیم کرده اید را از شما بخواهد.
پس از وارد کردن رمز کاربری MySQL ریشه خود ، اعلان MySQL را مشاهده می کنید:
mysql>
از آنجا ، می توانید با استفاده از نصب MySQL خود برای ایجاد و لود پایگاه داده و شروع اجرای جستارها استفاده کنید.
نتیجه
با دنبال کردن این آموزش ، MySQL را روی یک سرور مجازی CentOS 8 نصب و ایمن کرده اید. از اینجا ، می توانید Nginx و PHP را نصب کنید تا یک پشته LEMP کاملاً عملی روی سرور مجازی خود داشته باشید.
برای کسب اطلاعات بیشتر در مورد استفاده از MySQL ، ما شما را به مرور مطالب رسمی تشویق می کنیم.

 

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

مقدمه
بخش بزرگی از مدیریت سیستم جمع آوری اطلاعات دقیق در مورد سرور مجازی ها و زیرساخت های تان میباشد. ابزار و گزینه هایی برای جمع آوری و پردازش این نوع اطلاعات وجود دارد. بسیاری از آنها براساس فناوری به نام SNMP ساخته شده اند.
SNMP مخفف simple network management protocol یعنی پروتکل ساده مدیریت شبکه است. روشی است که سرور مجازی ها می توانند اطلاعاتی را درباره وضعیت فعلی خود به اشتراک بگذارند ، و همچنین کانالی را که یک ادمین می تواند مقادیر از پیش تعریف شده را تغییر دهد. در حالی که خود پروتکل ساده است ، ساختار برنامه هایی که SNMP را پیاده سازی می کند می تواند به سرعت پیچیده شوند. برای اطلاعات بیشتر در مورد اصول اولیه پروتکل SNMP ، به مقاله مقدمه ای بر SNMP مراجعه کنید.
در این راهنما ابزارهایی برای برقراری ارتباط با استفاده از SNMP تنظیم می کنید. برای نشان دادن از دو سرور مجازی اوبونتو 18.04 استفاده خواهید کرد. یک مدیر SNMP وجود دارد که برای پیاده سازی دستگاه های شبکه با نماینده صحبت خواهد کرد. به آن manager server گفته می شود. سرور مجازی دیگر نماینده SNMP را خواهد داشت که به دستورات سرور مجازی مدیر عمل خواهد کرد. به این سرور مجازی agent server گفته می شود. شما می توانید انتخاب کنید که ایجنت را نیز روی دستگاه مدیر نصب کنید ، اما جدا نگه داشتن آنها باعث می شود بتوانید عملکرد هر یک از مؤلفه ها را آسان تر کنید.
پیش نیازها
برای دنبال کردن این آموزش ، به موارد زیر نیاز دارید:
• دو سرور مجازی Ubuntu 18.04 با که پیروی از راهنمای اولیه تنظیم سرور مجازی Ubuntu 18.04 تنظیم شده اند ، شامل کاربر غیر ریشه ای با امتیازات sudo و فایروال تنظیم شده با ufw.
مرحله 1 – نصب SNMP Daemon و امکانات
می توانید با نصب Daemon و ابزارهای موجود در سرور مجازی های اوبونتو به بررسی نحوه اجرای SNMP بر روی یک سیستم بپردازید.
از دستگاه محلی خود ، به عنوان کاربر غیر ریشه خود وارد manager server شوید:
$ ssh your_username@manager_server_ip_address

فهرست بسته بندی را برای مدیر بسته APT به روز کنید:
$ sudo apt update

سپس ، نرم افزار SNMP را نصب کنید:
$ sudo apt install snmp snmp-mibs-downloader

بسته snmp مجموعه ای از ابزارهای خط فرمان را برای صدور درخواست های SNMP به نمایندگان فراهم می کند. بسته snmp-mibs-downloader به نصب و مدیریت فایل های پایه اطلاعات مدیریت (MIB) کمک میکند، که رد آبجکت های شبکه را پیگیری میکند.
سپس یک ترمینال جدید را در دستگاه محلی خود باز کرده و وارد agent server شوید:
$ ssh your_username@agent_server_ip_address

در سرور مجازی نماینده ، فهرست بسته را به روز کنید:
$ sudo apt update

سپس Daemon SNMP را نصب کنید
$ sudo apt install snmpd

توجه داشته باشید که نیازی به بسته snmp-mibs-downloader ندارید ، زیرا سرور مجازی نماینده قادر به مدیریت فایل های MIB نخواهد بود.
اکنون که این مؤلفه ها را نصب کردید ، سرور مجازی مدیر خود را پیکربندی می کنید.
مرحله 2 – پیکربندی منیجر سرور مجازی SNMP
همانطور که قبلاً ذکر شد ، عمده کار در سرور مجازی ایجنت (عامل) اتفاق می افتد ، بنابراین پیکربندی شما در سرور مجازی مدیر کمتر درگیر خواهد شد. فقط باید یک فایل را اصلاح کنید تا مطمئن شوید که ابزارهای SNMP می توانند از داده های MIB اضافی که نصب کرده اید استفاده کنند.
در سرور مجازی مدیر خود ، فایل /etc/snmp/snmp.conf را در ویرایشگر متن خود با امتیازات sudo باز کنید. در این آموزش از nano استفاده می شود:
$ sudo nano /etc/snmp/snmp.conf

در این فایل ، چند خط کامنت دار و یک خط بدون کامنت وجود دارد. برای اینکه مدیر بتواند فایل های MIB را وارد کند ، خط mibs را کامنت اوت کنید:
/etc/snmp/snmp.conf
# As the snmp packages come without MIB files due to license reasons, loading
# of MIBs is disabled by default. If you added the MIBs you can reenable
# loading them by commenting out the following line.
#mibs :

اگر از nano استفاده می کنید، با فشار دادن CTRL + X ، و سپس Y و enter ، snpt.conf را ذخیره کرده و ببندید.
اکنون پیکربندی سرور مجازی مدیر را به پایان رسانده اید ، اما همچنان باید از این سرور مجازی برای پیکربندی سرور مجازی نماینده خود استفاده کنید ، که در مرحله بعدی انجام خواهید داد.
مرحله 3 – پیکربندی سرور مجازی عامل SNMP
به عنوان یک سیستم سرور مجازی کلاینت واقعی ، سرور مجازی نماینده هیچ یک از ابزارهای خارجی لازم برای پیکربندی تنظیم SNMP خود را ندارد. شما می توانید برخی از فایل های پیکربندی را اصلاح کنید تا تغییراتی ایجاد شود ، اما بیشتر تغییراتی که شما باید انجام دهید با اتصال به سرور مجازی نماینده خود از طریق سرور مجازی مدیریت شما انجام می شود.
در این آموزش از نسخه 3 پروتکل SNMP استفاده خواهید کرد. برخلاف SNMPv1 و v2 ، در SNMPv3 هر پیام حاوی پارامترهای امنیتی رمزگذاری شده است. در این مرحله قوانین احراز هویت و کنترل دسترسی SNMPv3 را پیکربندی خواهید کرد.
برای شروع ، در سرور مجازی نماینده خود ، فایل پیکربندی Daemon را با امتیازات sudo باز کنید:
$ sudo nano /etc/snmp/snmpd.conf

در داخل ، باید چند تغییر ایجاد کنید. عمدتاً برای راه اندازی تنظیمات شما استفاده می شوند تا بتوانید آن را از سرور مجازی دیگر خود مدیریت کنید.
ابتدا ، باید دستورالعمل agentAddress را تغییر دهید. در حال حاضر ، به گونه ای تنظیم شده است که فقط اتصالات حاصل از رایانه محلی را اجازه میدهد. باید خط فعلی را کامنت اوت کنید و خط زیر آن را که به همه اتصالات اجازه می دهد ، uncomment کنید.
/etc/snmp/snmpd.conf
# Listen for connections from the local system only
#agentAddress udp:127.0.0.1:161
# Listen for connections on all interfaces (both IPv4 *and* IPv6)
agentAddress udp:161,udp6:[::1]:161

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

در مرحله بعد ، به طور موقت یک خط createUser را وارد می کنید. این دستورالعمل ها معمولاً در این فایل نگهداری نمی شوند. شما دوباره آن را در یک لحظه حذف خواهید کرد.
کاربری که ایجاد می کنید bootstrap نامیده می شود و به عنوان الگویی برای ایجاد اولین کاربر واقعی شما از آن استفاده می شود. بسته های SNMP این کار را از طریق فرآیند کلون سازی ویژگی های کاربر انجام می دهند.
در هنگام تعریف کاربر جدید ، باید نوع تأیید اعتبار خود را تعیین کنید (MD5 یا SHA) و همچنین یک عبارت عبور تهیه کنید که حداقل باید هشت کاراکتر باشد. اگر قصد دارید از رمزگذاری برای انتقال استفاده کنید همانند کاری که در این آموزش میکنید، باید پروتکل حریم خصوصی (DES یا AES) و به صورت اختیاری یک عبارت عبور پروتکل حریم خصوصی را نیز مشخص کنید. اگر هیچ عبارت عبور پروتکل حریم خصوصی ارائه نشده باشد ، عبارت عبور تأیید اعتبار، برای پروتکل حریم خصوصی نیز استفاده می شود.
این خط CreatUser را به انتهای فایل اضافه کنید:
/etc/snmp/snmpd.conf

createUser bootstrap MD5 temp_password DES

اکنون که کاربر جدیدی را مشخص کرده اید ، می توانید سطح دسترسی را که این کاربر در اختیار دارد تنظیم کنید. در این آموزش این کار را برای کاربر bootstrap خود تنظیم می کنید ، همچنین برای کاربر جدیدی که ایجاد می کنید با نام demo تنظیم می شود. با استفاده از بخشنامه rwuser به آنها اجازه دسترسی و خواندن و نوشتن را می دهید (گزینه جایگزین برای دسترسی فقط خواندن rouser است).
همچنین می توانید استفاده از رمزگذاری را با مشخص کردن priv بعد از کاربر خود اعمال کنید. اگر می خواهید کاربر را به قسمت خاصی از MIB محدود کنید ، می توانید شناساگر آبجکت در بالاترین سطح (OID) را تعیین کنید که کاربر باید در انتهای خط به آن دسترسی داشته باشد.
برای اهداف این آموزش ، هر دو خط شما به شرح زیر است:
/etc/snmp/snmpd.conf

rwuser bootstrap priv
rwuser demo priv

پس از اتمام انجام این تغییرات ، فایل را ذخیره کنید و ببندید.
برای اجرای این تغییرات ، سرویس snmpd را در سرور مجازی نماینده خود مجدداً راه اندازی کنید:
$ sudo systemctl restart snmpd

SNMP daemon اتصالات پورت را شنود میکند: 161. UFW را پیکربندی کنید تا بتوانید از سرور مجازی مدیر به این پورت ارتباط برقرار کنید:
می توانید اطلاعات بیشتری در مورد UFW را در راهنمای نحوه راه اندازی فایروال با UFW در اوبونتو 18.04 به دست آورید.
اکنون که سرور مجازی ایجنت پیکربندی شده است ، می توانید از طریق سرور مجازی مدیر به سرور مجازی ایجنت خود متصل شوید تا ارتباط را تأیید کنید.
مرحله 4 – تأیید صحت هویت سرور مجازی نماینده
در این مرحله آزمایش خواهید کرد تا مطمئن شوید که می توانید با حساب bootstrap خود به سرور مجازی نماینده وصل شوید. با این حال ، قبل از آن ، این آموزش کمی در مورد ساختار کلی ارسال یک دستور SNMP صحبت خواهد کرد.
هنگام استفاده از مجموعه ابزارهای موجود در پکیج snmp (مجموعه نرم افزار net-snmp) ، دستورالعمل هایی در مورد نحوه فراخوانی فرمان ها وجود دارد. اولین کاری که باید انجام دهید تایید اعتبارDaemon SNMP است که می خواهید با آن ارتباط برقرار کنید. این معمولاً شامل تهیه چند بخش اطلاعات است. موارد معمول به شرح زیر است:
-v: از این فلگ برای مشخص کردن نسخه پروتکل SNMP که می خواهید به کار بگیرید، استفاده می شود. این آموزش از v3 استفاده خواهد کرد.
-c: در صورت استفاده از رشته های جامع SNMP v1 یا سبک v2 برای احراز هویت ، از این فلگ استفاده می شود. از آنجا که از تأیید هویت مبتنی بر کاربر به سبک V3 استفاده می کنید ، نیازی به انجام این کار ندارید.
-u: این پارامتر برای مشخص کردن نام کاربری مورد نظر برای تأیید اعتبار استفاده می شود. برای خواندن یا تغییر هر چیزی با استفاده از SNMP ، باید با یک نام کاربری شناخته شده تأیید اعتبار کنید.
-l: برای مشخص کردن سطح امنیتی که با آنها ارتباط برقرار می کنید ، استفاده می شود. مقادیر احتمالی برای عدم احراز هویت و عدم رمزگذاری noAuthNoPriv میباشد ، و برای احراز هویت و عدم رمزگذاری authNoPriv ، و برای احراز هویت و رمزگذاری authPriv خواهد بود. نام کاربری که شما استفاده می کنید باید پیکربندی شود تا در سطح امنیتی که مشخص کرده اید ، کار کند وگرنه تأیید اعتبار موفق نخواهد شد.
-a: این پارامتر برای مشخص کردن پروتکل احراز هویت مورد استفاده قرار می گیرد. مقادیر ممکن MD5 یا SHA است. باید با اطلاعاتی که هنگام ایجاد کاربر مشخص شده است مطابقت داشته باشد.
-x: از این پارامتر برای مشخص کردن پروتکل رمزگذاری استفاده می شود. مقادیر ممکن DES یا AES باشند. این باید با اطلاعاتی که هنگام ایجاد کاربر مشخص شده است مطابقت داشته باشد. این کار هر زمان که مشخصات امتیاز کاربر بعد از آن priv داشته باشد ، لازم است تا رمزگذاری را اجباری کند.
-A: از این عبارت برای دادن عبارت عبور تأیید اعتبار استفاده می شود که هنگام ایجاد کاربر مشخص شده است.
-X: این عبارت رمزگذاری است که هنگام ایجاد کاربر مشخص شده است. اگر هیچ عبارتی مشخص نشده باشد اما الگوریتم رمزگذاری داده شده باشد ، از عبارت عبور تأیید اعتبار استفاده خواهد شد. این مورد هنگام ارائه پارامتر -x یا هر زمان که مشخصات امتیاز کاربر بعد از آن دارای priv باشد ، لازم است که رمزگذاری شود.
با استفاده از این اطلاعات می توانید دستورات خود را بسازید. با توجه به چگونگی تنظیم کاربر bootstrap خود ، دستوراتی که با آن حساب استفاده خواهید کرد چنین خواهد بود:
snmp_command -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password remote_host snmp_sub_command_or_options

از سرور مجازی مدیر خود ، تست کنید تا مطمئن شوید که حساب bootstrap  شما در دسترس است. موارد زیر را برای نمایش اطلاعات سیستم برای سرور مجازی نماینده تایپ کنید:
$ snmpget -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address 1.3.6.1.2.1.1.1.0

رشته 1.3.6.1.2.1.1.1.0 ، OID است که وظیفه نمایش اطلاعات سیستم را بر عهده دارد. خروجی نام uname -a را در سیستم از راه دور برمی گرداند.
خروجی زیر را نشان می دهد:
Output
SNMPv2-MIB::sysDescr.0 = STRING: Linux agent 4.15.0-66-generic #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 x86_64

اکنون که تأیید کردید که می توانید به سرور مجازی ی که SNMP را اجرا میکند تأیید اعتبار دهید ، می توانید به کار خود ادامه دهید تا بتوانید حساب کاربری منظم خود را ایجاد کنید.
مرحله 5 – تنظیم حساب کاربری منظم
اگرچه امتیازات اشتراک کاربر نمایشی را در فایل snmpd.conf مشخص کرده اید ، اما شما در واقع هنوز این کاربر را ایجاد نکرده اید. در این مرحله می خواهید از کاربر bootstrap به عنوان الگویی برای کاربر جدید خود استفاده کنید. شما این کار را با استفاده از ابزار snmpusm که برای مدیریت کاربر استفاده می شود ، انجام می دهید.
در سرور مجازی مدیر ، با استفاده از ابزار snmpusm و دستور کلی زیر می توانید کاربر را از قالب موجود ایجاد کنید:
snmpusm authentication_info agent_server_ip_address create new_user existing_user

با استفاده از آنچه در مورد فلگ های تأیید هویت موردنیاز می دانید و با استفاده از حساب کاربری که در اختیار دارید (bootstrap) ، می توانید یک کاربر متناسب با امتیازات کاربری که قبلاً تعریف کرده اید (نسخه ی نمایشی) ایجاد کنید.
این دستور به شرح زیر خواهد بود:
$ snmpusm -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address create demo bootstrap

پیام زیر را دریافت خواهید کرد:
Output
User successfully created.

اکنون یک کاربر کاملاً عملکردی به نام demo روی سرور مجازی نماینده خود دارید. با این حال ، هنوز از همان اطلاعات تأیید اعتبار به عنوان حساب bootstrap استفاده می کند. برای افزایش امنیت ، می توانید رمز عبور را به چیز دیگری تغییر دهید. این بار ، از اکانت demo برای تأیید اعتبار استفاده می کنید. به یاد داشته باشید ، گذرواژه‌ها باید حداقل هشت کاراکتر داشته باشند:
$ snmpusm -u demo -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address passwd temp_password new_password

پیام زیر را دریافت خواهید کرد:
Output
SNMPv3 Key(s) successfully changed.

می توانید با درخواست از سرور مجازی نماینده مدت زمان اجرای سرویس SNMP ، اعتبار و رمز جدید خود را آزمایش کنید. برای بدست آوردن یک مقدار واحد از سرور مجازی نماینده ، از دستور snmpget استفاده خواهید کرد.
این بار ، از تعاریف اضافی MIB که دانلود کرده اید ، استفاده کنید تا به جای ID عددی OID ، مقدار را با نام بخواهید.
$ snmpget -u demo -l authPriv -a MD5 -x DES -A new_password -X new_password agent_server_ip_address sysUpTime.0

شما مقداری را به دست خواهید آورد که آخرین بار شروع مجدد SNMP daemonاز راه دور است:
Output
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (53309) 0:08:53.09

اکنون یک حساب کاربری در حال کار با نام demo دارید. در مرحله بعدی کار با دستورات SNMP را با پیکربندی کلاینت ساده سازی خواهید کرد.
مرحله 6 – ایجاد فایل پیکربندی کلاینت
احتمالاً به این نکته توجه کرده اید که جزئیات تأیید اعتبار برای همه دستورات SNMP شما با هر درخواست نسبتاً ثابت خواهد بود. به جای هر بار تایپ کردن این موارد، می توانید یک فایل پیکربندی سمت کلاینت ایجاد کنید که اعتبارنامه ای را که با آن در ارتباط هستید را شامل شود.
فایل پیکربندی کلاینت بسته به میزان گستره ای که می خواهید آن را به اشتراک بگذارید ، می تواند در دو مکان مختلف قرار گیرد.
اگر می خواهید اعتبار ورود به سیستم را با هر کاربر معتبری در دستگاه مدیریت خود به اشتراک بگذارید ، می توانید جزئیات پیکربندی خود را در فایل جهانی snmp.conf در سرور مجازی مدیر قرار دهید. لازم است آن فایل را با امتیازات sudo باز کنید:
$ sudo nano /etc/snmp/snmp.conf

در حالی که ، اگر می خواهید تأیید اعتبار را فقط برای کاربر خود تعیین کنید ، می توانید یک دایرکتوری پنهان .snmp را در دیرکتوری هوم کاربر خود در سرور مجازی مدیر ایجاد کنید و فایل را در آنجا ایجاد کنید:
$ mkdir ~/.snmp

$ nano ~/.snmp/snmp.conf

صرف نظر از تصمیم شما در مورد قرار دادن پیکربندی، مطالب یکسان خواهند بود.
دستوراتی که برای تأیید اعتبار از آنها استفاده خواهید کرد در جدول زیر است. در ستون سمت راست ، می توانید نامهای بخشنامه ای را که برای تنظیم آن جزئیات پیکربندی در فایل snmp.conf استفاده می شود ، مشاهده کنید:
Command Flag Description Translated snmp.conf directive
-u username نام کاربری SNMPv3 برای تایید اعتبار defSecurityName username
-l authPriv سطح امنیتی برای تایید اعتبار defSecurityLevel authPriv
-a MD5 پروتکل تایید اعتبار برای استفاده defAuthType MD5
-x DES پروتکل خصوصی برای استفاده defPrivType DES
-A passphrase عبارت عبور تایید اعتبار از سمت نام کاربری ارائه شده defAuthPassphrase passphrase
-X passphrase عبارت عبور خصوصی از سمت نام کاربری ارائه شده defPrivPassphrase passphrase

با استفاده از این اطلاعات می توانید یک فایل مناسب snmp.conf بسازید. برای این راهنما ، اینگونه خواهد بود:
snmp.conf
defSecurityName demo
defSecurityLevel authPriv
defAuthType MD5
defPrivType DES
defAuthPassphrase new_password
defPrivPassphrase new_password

پس از اتمام ، فایل را ذخیره کنید و ببندید.
اکنون ، می توانید دستورات خود را بدون تهیه جزئیات تأیید اعتبار صادر کنید. فقط نیاز به دستور SNMP ، هاست و آرگومانهای فرمان دارید.
به جای تایپ کردن دستور زیر:
$ snmpget -u demo -l authPriv -a MD5 -x DES -A new_password -X new_password agent_server_ip_address sysUpTime.0

می توانید تایپ کنید:
$ snmpget agent_server_ip_address sysUpTime.0

همانطور که مشاهده می کنید ، این امر به میزان قابل توجهی میزان اطلاعات مورد نیاز برای تهیه در هر درخواست را کاهش می دهد. در مرحله بعد ، برای محکم کردن امنیت شبکه ، حساب bootstrap را حذف می کنید.
مرحله 7 – حذف حساب Bootstrap
اکنون که حساب منظم شما به درستی پیکربندی شده است ، می توانید حساب ناامن بوت استرپ را حذف کنید.
در سرور مجازی نماینده خود ، فایل /etc/snmp/snmpd.conf را دوباره با امتیازات sudo باز کنید.
$ sudo nano /etc/snmp/snmpd.conf

هر دو خط را که قبلاً اضافه کرده اید و کاربر bootstrap را ارجاع میدهد، پیدا کرده و کامنت اوت کنید (یا حذف کنید):
/etc/snmp/snmpd.conf

#createUser bootstrap MD5 temp_password DES
#rwuser bootstrap priv

ذخیره کنید و فایل را ببندید.
اکنون ، Daemon SNMP را مجدداً راه اندازی کنید:
$ sudo systemctl restart snmpd

• این کار توصیه ی عدم داشتن دیرکتیو های createUser در فایل عادی snmpd.conf را برآورده میکند. همچنین امتیازات مربوط به آن کاربر موقت را حذف می کند.
اگر می خواهید کاربر bootstrap را از usmUserTable به طور کامل حذف کنید ، می توانید با صدور این دستور از سرور مجازی مدیر این کار را انجام دهید:
$ snmpusm agent_server_ip_address delete bootstrap

پاسخ زیر را دریافت خواهید کرد:
Output
User successfully deleted.

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

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

مقدمه
Terminalizer یک برنامه ثبت ترمینال است که به شما امکان می دهد بخش ترمینال خود را در زمان واقعی ثبت و ضبط کنید ، و سپس در یک تاریخ بعد دوباره آن را پخش کنید. به همان روش ضبط صفحه نمایش دسکتاپ کار می کند ، با این تفاوت که در ترمینال شما اجرا می شود.
اگر می خواهید یک فعالیت خاص را دوباره مرور کنید ، یا به اشکال زدایی در یک خطای فریبنده خاص کمک کنید ، ضبط بخش پایانه مفید خواهد بود. ضبط های ساخته شده با Terminalizer همچنین می توانند به عنوان GIF های متحرک صادر شوند ، که برای به اشتراک گذاری آنلاین یا افزودن به مواد بازاریابی برای نرم افزار شما فوق العاده است.
در این آموزش Terminalizer را نصب می کنید ، از آن برای ضبط و پخش بخش های ترمینال استفاده می کنید ، ضبط های خود را سفارشی می کنید و سپس آنها را برای اشتراک گذاری آنلاین صادر می کنید.
پیش نیازها
برای تکمیل این آموزش ، به موارد زیر نیاز دارید:
⦁ سرور مجازی Ubuntu 18.04 که با دنبال کردن راهنمای راه اندازی اولیه سرور مجازی با اوبونتو 18.04 تنظیم شده است ، و شامل یک کاربر غیر ریشه sudoباشد.
⦁ Node.js و npm که با دنبال کردن نصب نسخه Distro-Stable برای بخش اوبونتو در راهنمای نحوه نصب Node.js در اوبونتو 18.04 قابل نصب است.
اگر می خواهید ضبط های خود را به صورت آنلاین به اشتراک بگذارید ، به این موارد نیز نیاز خواهید داشت:
• یک حساب کاربری رایگان در وب سایت Terminalizer.
پس از آماده شدن ، به عنوان کاربر غیر ریشه خود وارد سرور مجازی شوید.
مرحله 1 – نصب ترمینالایزر
در این مرحله ، Terminalizer را روی سیستم خود دانلود و نصب خواهید کرد. Terminalizer با استفاده از Node.js نوشته شده است و برای نصب با استفاده از مدیر بسته npm در دسترس است.
برای نصب Terminalizer در سطح جهانی بر روی سیستم خود ، دستور زیر را اجرا کنید:
⦁ $ sudo npm install –global –allow-root –unsafe-perm=true terminalizer

Terminalizer از چارچوب برنامه Electron برای صادر کردن بخش های ترمینال ضبط شده در قالب GIF استفاده می کند. به منظور نصب الکترون در سطح سیستم ، آرگومان فرمان –unsafe-perms = true لازم است.
پس از نصب Terminalizer ، خروجی مشابه زیر را مشاهده خواهید کرد:
Output
. . .
/usr/local/lib
└── terminalizer@0.7.1

سپس ، نصب خود را از طریق Terminalizer بررسی کنید:
⦁ $ terminalizer –version

چیزی شبیه به زیر را نشان می دهد:
Output
0.7.1
سرانجام ، یک فایل پیکربندی پیش فرض Terminalizer ایجاد کنید ، که می توانید برای شخصی سازی پیشرفته ترمینالایزر استفاده کنید (جزئیات بیشتر در مرحله 4):
⦁ $ terminalizer init

این کار خروجی شبیه به زیر را به همراه خواهد داشت:
output
The global config directory is created at
/home/user/.terminalizer
اکنون که Terminalizer را نصب کردید ، می توانید اولین ضبط ترمینال خود را انجام دهید.
مرحله 2 – ضبط و پخش یک بخش ترمینال
در این مرحله یک بخش ترمینال را ضبط و دوباره پخش می کنید.
برای شروع ، ضبط جدید Terminalizer را با استفاده از نام مورد نظر خود تنظیم کنید:
⦁ $ terminalizer record your-recording

خروجی زیر را ارائه می دهد تا نشان دهد ضبط شروع شده است:
Output
The recording session has started
Press Ctrl+D to exit and save the recording

اکنون می توانید هر کاری را که می خواهید در ترمینال خود انجام دهید. فشردن هر کلید و هر دستوری در زمان واقعی توسط Terminalizer ضبط می شود.
مثلا:
⦁ $ pwd

⦁ $ date

⦁ $ whoami

⦁ $ echo “Hello, world!”
وقتی می خواهید ضبط را متوقف کنید ، CTRL + D را فشار دهید. سپس Terminalizer ضبط را در فایل مشخص شده با فرمت YAML ذخیره می کند ، به عنوان مثال ، your-record.yml.
Output
Successfully Recorded
The recording data is saved into the file:
/home/user/your-recording.yml

ممکن است توسط Terminalizer از شما خواسته شود تا ضبط خود را به صورت آنلاین به اشتراک بگذارید. کافی است CTRL + C را فشار دهید تا فعلا این کار را لغو کنید ، زیرا می توانید ابتدا ضبط ترمینال را به صورت محلی پخش کنید.
در مرحله بعدی ، بخش پایانی ضبط شده خود را با دستور followng پخش کنید:
⦁ $ terminalizer play your-recording

این دستور بخش ضبط شده را در زمان واقعی در ترمینال شما پخش می کند:
Output
user@droplet:~$ pwd
/home/user
user@droplet:~$ date
Sun Mar 8 14:55:36 UTC 2020
user@droplet:~$ whoami
user
user@droplet:~$ echo “Hello, world!”
Hello, world!
user@droplet:~$ logout

همچنین می توانید با استفاده از گزینه –speed-Factor سرعت پخش ضبط خود را تنظیم کنید.
به عنوان مثال ، دستور زیر سرعت پخش موارد ضبط شده شما نصف می کند:
⦁ $ terminalizer play your-recording –speed-factor 2

از طرف دیگر ، می توانید ضبط خود را دو برابر سریعتر پخش کنید:
⦁ $ terminalizer play your-recording –speed-factor 0.5

اکنون یک بخش ترمینال را ضبط و پخش کرده اید. در مرحله بعد ، می توانید یک بخش ترمینال ضبط شده را به صورت آنلاین به اشتراک بگذارید.
مرحله 3 – اشتراک یک بخش ترمینال ضبط شده
در این مرحله ، بخش ترمینال ضبط شده خود را بصورت آنلاین در صفحه جستجوی Terminalizer به اشتراک می گذارید.
با انتخاب یک بخش ضبط شده برای اشتراک گذاری شروع کنید:
⦁ $ terminalizer share your-recording

از شما خواسته خواهد شد که متاداده پایه درباره ضبط خود ، مانند عنوان و توضیحات را ارائه دهید:
هشدار: ضبط های Terminalizer به طور پیش فرض به طور عمومی به اشتراک گذاشته می شوند ، بنابراین اطمینان حاصل کنید که هیچ جزئیات شخصی یا محرمانه موجود در ضبط ترمینال شما که نمی خواهید به اشتراک بگذارید وجود ندارد.
Output
Please enter some details about your recording
? Title Title of Your Recording
? Description Description of Your Recording
? Tags such as git,bash,game Comma-separated Tags for Your Recording

هشدار: از انجا که ضبط های Terminalizer به صورت پیش فرض در معرض دیدم عموم قرار ، اطمینان حاصل کنید که هیچ اطلاعات یا جزییات معتبری که نمیخواهید به اشتراک بگذارید در ضبط ترمینال شما نباشد.
اولین بار است که یک بخش ضبط شده را با استفاده از Terminalizer به اشتراک می گذارید، باید حساب Terminalizer خود را پیوند دهید. در صورت نیاز Terminalizer یک لینک تأیید را نشان می دهد:
Output
Open the following link in your browser and login into your account
https://terminalizer.com/token?token=your-token

When you do it, press any key to continue

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

هنگامی که پیوند را در مرورگر وب خود مشاهده کرده و به حساب Terminalizer خود وارد شدید ، برای ادامه هر کلیدی را میتوانید فشار دهید.
Terminalizer اکنون ضبط شما را آپلود می کند و پیوند را برای مشاهده آن در اختیار شما قرار می دهد:
Output
Successfully Uploaded
The recording is available on the link:
https://terminalizer.com/view/your-recording-id

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

شما یک بخش ضبط شده ترمینال را در وب سایت Terminalizer به اشتراک گذاشته اید و آن را در مرورگر وب خود مشاهده کرده اید.
مرحله 4 – تنظیم پیکربندی پیشرفته Terminalizer
اکنون که با Terminalizer آشنا شدید ، می توانید برخی از گزینه های پیشرفته تر سفارشی سازی، و همچنین امکان تنظیم رنگ و استایل صفحه نمایش را انجام دهید.
هر ضبط، پیکربندی پیش فرض را از فایل پیکربندی جهانی Terminalizer که در ~ / .terminalizer / config.yml قرار دارد دریافت میکند. این بدان معنی است که می توانید پیکربندی ضبط های فردی را مستقیماً با ویرایش فایل ضبط (به عنوان مثال your-record.yml) ویرایش کنید. از طرف دیگر ، می توانید پیکربندی جهانی را ویرایش کنید ، که تأثیر آن بر همه ضبط های جدید خواهد بود.
در این مثال فایل پیکربندی جهانی را ویرایش می کنید ، اما همان راهنما در مورد فایل های تنظیمات ضبط فردی نیز صدق می کند.
با باز کردن فایل پیکربندی جهانی Terminalizer در ویرایشگر متن خود ، مانند nano شروع کنید :
⦁ $ nano ~/.terminalizer/config.yml

در مورد هر یک از گزینه های موجود در پیکربندی در فایل به منظور توضیح آنچه انجام می دهند ، اظهار نظر می شود.
چندین گزینه پیکربندی معمول وجود دارد که ممکن است بخواهید مطابق میل خود تنظیم کنید:
⦁ Cols: به طور صریح تعداد ستون های ترمینال مورد استفاده برای ضبط خود را تنظیم کنید.
⦁ rows: به طور صریح تعداد ردیف های ترمینال مورد استفاده برای ضبط خود را تنظیم کنید.
⦁ FrameDelay: در هنگام پخش ، تأخیر بین هر فشردن کلید را حذف کنید.
⦁ MaxIdleTime: حداکثر زمان بین ضربات کلید را هنگام پخش مشخص کنید.
⦁ CursorStyle: سبک پیش فرض مکان نمای ترمینال را از بین block ، bar و underline مشخص کنید.
⦁ FontFamily: به ترتیب ترجیحی لیستی از فونت های پخش دلخواه را مشخص کنید.
⦁ theme: طرح رنگ پخش را تنظیم کنید به عنوان مثال برای ایجاد یک ترمینال سیاه و سفید و غیره ،.
به عنوان نمونه ، می توانید با پیکربندی گزینه های زیر به یک صفحه نمایش ترمینال سیاه و سفید برسید:
config.yml
. . .
theme:
background: “white”
foreground: “black”
. . .

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

شما می توانید سبک مکان نما را تنظیم کنید تا فهمیدن ضبط راحت تر شود ، به عنوان مثال با تعویض حالت پیش فرض مکان نما از سبک بلوک به سبک آندرلاین:
config.yml
. . .
cursorStyle: underline
. . .

نتیجه ای مشابه زیر حاصل می شود:

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

 

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

GraphQL یک استاندارد API است که توسط فیس بوک به عنوان جایگزینی برای API های REST ایجاد و منبع باز شده است. بر خلاف API های REST ،GraphQL از یک سیستم تایپ شده برای تعریف ساختار داده خود استفاده می کند ، جایی که تمام اطلاعات باید مطابق با یک طرح از پیش تعریف شده ارسال و دریافت شوند. همچنین به جای چندین URL برای منابع مختلف، یک انتهای واحد برای همه ارتباطات در معرض دید قرار می دهد و با بازگرداندن تنها داده های درخواست شده توسط کلاینت ، مشکل overfetching  را حل می کند و از این طریق پاسخ های کوچکتر و مختصر تری ایجاد می کند.
در این آموزش شما یک پس زمینه برای کوتاه کننده URL ایجاد می کنید – خدماتی که هر URL را در اختیار شما قرار می دهد و یک نسخه کوتاهتر و خواندنی تر تولید می کند – در حالی که به مفاهیم GraphQL مانند نمایش داده ها و جهش ها و ابزارهایی مانند رابط GraphiQL می پردازید. ممکن است قبلاً مانند سرویس bit.ly از چنین سرویس هایی استفاده کرده باشید.
از آنجا که GraphQL یک فناوری آگنوستیک زبانی است ، روی زبانها و چارچوبهای مختلف پیاده سازی می شود. در اینجا ، شما از زبان برنامه نویسی Python هدف کلی ، چارچوب وب Django ، و کتابخانه Graphene-Django به عنوان اجرای GraphQL Python با ادغام های ویژه برای Django استفاده خواهید کرد.
پیش نیازها
• برای ادامه این آموزش ، به نصب پایتون نسخه 3.5 یا بالاتر در دستگاه توسعه خود نیاز دارید. برای نصب Python ، آموزش ما را در مورد نحوه نصب و راه اندازی یک محیط برنامه نویسی محلی برای Python 3 برای سیستم عامل خود را دنبال کنید. اطمینان حاصل کنید که یک محیط مجازی نیز ایجاد و راه اندازی کنید؛ برای دنبال کردن این آموزش ، می توانید دیرکتوری پروژه خود را shorty بنامید.
• دانش سطح ورود به Django نیز توصیه میشود ، اما اجباری نیست. اگر کنجکاو هستید ، می توانید مجموعه توسعه Django ایجاد شده توسط انجمن vpsgol را دنبال کنید.
مرحله 1 – تنظیم پروژه Django
در این مرحله تمام ابزارهای لازم برای برنامه را نصب کرده و پروژه Django خود را تنظیم می کنید.
هنگامی که دایرکتوری پروژه خود را ایجاد کردید و محیط مجازی خود را راه اندازی کردید ، همانطور که در پیش نیازها پوشش داده شده است ، بسته های لازم را با استفاده از pip ، مدیر بسته پایتون نصب کنید. در این آموزش Django نسخه 2.1.7 و Graphene-Django نسخه 2.2.0 یا بالاتر نصب می شوند:
⦁ $ pip install “django==2.1.7” “graphene-django>==2.2.0”

اکنون تمام ابزارهای مورد نیاز خود را در کمربند ابزار خود دارید. در مرحله بعد با استفاده از دستور django-admin یک پروژه Django ایجاد خواهید کرد. یک پروژه به طور پیش فرض متن استاندارد Django است – مجموعه ای از پوشه ها و فایل ها با هر چیز لازم برای شروع توسعه یک برنامه وب. در این حالت ، شما پروژه خود را shorty می خوانید و با مشخص کردن نقطه در انتها، آن را در پوشه فعلی خود ایجاد می کنید:
⦁ $ django-admin startproject shorty .

بعد از ایجاد پروژه خود ،  Django migrations را اجرا خواهید کرد. این فایل ها حاوی کد پایتونی هستند که توسط Django تولید شده است و وظیفه تغییر ساختار برنامه را مطابق مدل های Django دارند. به عنوان مثال تغییرات ممکن است شامل ایجاد جدول باشد. به طور پیش فرض ، Django با مجموعه ای از جابه جایی های خود که مسئول زیر سیستم هایی مانند Django Authentication هستند ، همراه است ، بنابراین لازم است آنها را با دستور زیر اجرا کنید:
⦁ $ python manage.py migrate

این دستور از مفسر پایتون برای استناد به اسکریپت Django به نام managet.py استفاده می کند که مسئولیت مدیریت جنبه های مختلف پروژه شما ، مانند ایجاد برنامه ها یا اجرای جا به جایی ها را بر عهده دارد.
این دستور خروجی شبیه به زیر را ارائه می دهد:
Output
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial… OK
Applying auth.0001_initial… OK
Applying admin.0001_initial… OK
Applying admin.0002_logentry_remove_auto_add… OK
Applying admin.0003_logentry_add_action_flag_choices… OK
Applying contenttypes.0002_remove_content_type_name… OK
Applying auth.0002_alter_permission_name_max_length… OK
Applying auth.0003_alter_user_email_max_length… OK
Applying auth.0004_alter_user_username_opts… OK
Applying auth.0005_alter_user_last_login_null… OK
Applying auth.0006_require_contenttypes_0002… OK
Applying auth.0007_alter_validators_add_error_messages… OK
Applying auth.0008_alter_user_username_max_length… OK
Applying auth.0009_alter_user_last_name_max_length… OK
Applying sessions.0001_initial… OK

پس از آماده شدن پایگاه داده Django ، سرور مجازی توسعه محلی خود را شروع کنید:
⦁ $ python manage.py runserver

خروجی زیر را می دهد:
Output
Performing system checks…

System check identified no issues (0 silenced).
March 18, 2020 – 15:46:15
Django version 2.1.7, using settings ‘shorty.settings’
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

این دستور اعلان را در ترمینال شما از بین می برد و سرور مجازی را شروع می کند.
از صفحه http://127.0.0.1:8000 در مرورگر محلی خود بازدید کنید. این صفحه را مشاهده خواهید کرد:

برای متوقف کردن سرور مجازی و بازگشت به ترمینال خود ، CTRL + C را فشار دهید. هر زمان که نیاز به دسترسی به مرورگر داشته باشید ، اطمینان حاصل کنید که دستور قبلی در حال اجرا است.
در مرحله بعد ، با فعال کردن کتابخانه Django-Graphene در پروژه ، این مرحله را تمام خواهید کرد. Django دارای محتوای app ، یک برنامه وب با مسئولیت خاص میباشد. یک پروژه از یک یا چندین برنامه تشکیل شده است. در حال حاضر ، فایل shorty / settings.py را در ویرایشگر متن مورد نظر خود باز کنید. این آموزش از vim استفاده خواهد کرد:
⦁ $ vim shorty/settings.py

فایل settings.py تمام تنظیمات موجود در پروژه شما را مدیریت می کند. در داخل آن ، INSTALLED_APPS را جستجو کرده و خط “graphene_django” را اضافه کنید:
shorty/shorty/settings.py

INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘graphene_django’,
]

این افزونه به Django می گوید که شما از برنامه ای به نام graphene_django که در مرحله 1 نصب کرده اید ، استفاده خواهید کرد.
در پایین فایل ، متغیر زیر را اضافه کنید:
shorty/shorty/settings.py

GRAPHENE = {
‘SCHEMA’: ‘shorty.schema.schema’,
}

این متغیر آخر به طرح اصلی شما اشاره دارد که بعداً ایجاد خواهید کرد. در GraphQL ، یک شماتیک شامل انواع شیء مانند منابع ، جستجوها و جهش ها است. آن را به عنوان مستنداتی که تمام داده ها و عملکردهای موجود در سیستم شما را نشان می دهد ، در نظر بگیرید.
پس از اصلاحات ، فایل را ذخیره کرده و ببندید.
اکنون پروژه Django را پیکربندی کرده اید. در مرحله بعد ، یک برنامه Django و مدل های آن را ایجاد خواهید کرد.
مرحله 2 – تنظیم برنامه و مدل های Django
یک پلتفرم Django معمولاً از یک پروژه و بسیاری برنامه یا app تشکیل شده است. یک app مجموعه ای از ویژگی های درون پروژه ای را توصیف می کند و در صورت طراحی مناسب می تواند در پروژه های Django استفاده مجدد شود.
در این مرحله برنامه ای به نام shortener ایجاد خواهید کرد ، که مسئول ویژگی کوتاه کردن URL واقعی است. برای ایجاد اسکلت اصلی آن ، دستور بعدی را در ترمینال خود تایپ کنید:
⦁ $ python manage.py startapp shortener

در اینجا شما از پارامترهای startapp app_name استفاده کرده و از دستور manage.py برای ایجاد یک app با نام shortener استفاده می کنید.
برای پایان دادن به ایجاد برنامه ، فایل shorty / settings.py را باز کنید
⦁ $ vim shorty/settings.py

نام برنامه را به همان ورودی INSTALLED_APPS که قبلاً اصلاح کرده اید اضافه کنید:
shorty/shorty/settings.py

INSTALLED_APPS = [
‘django.contrib.admin’,
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
‘graphene_django’
‘shortener’,
]

فایل را ذخیره کنید و ببندید.
با افزودن shortener خود به shorty / settings.py ، می توانید به سمت ایجاد مدل هایی برای پروژه خود بروید. مدل ها یکی از ویژگی های مهم در Django هستند. از آنها برای نشان دادن یک پایگاه داده به روش “Pythonic” استفاده می شود و به شما امکان می دهد داده ها را با استفاده از کد پایتون مدیریت ، پرس و جو و ذخیره کنید.
پیش از باز کردن فایل model.py برای تغییرات ، این آموزش مختصری از تغییراتی را که شما ایجاد خواهید کرد را ارائه می دهد.
پس از تعویض کد موجود ، فایل مدل — shortener / model.py — شامل محتوای زیر خواهد بود:
shorty/shortener/models.py
from hashlib import md5

from django.db import models
در اینجا بسته های مورد نیاز کد مورد نظر خود را وارد می کنید. برای وارد کردن کتابخانه استاندارد Python که برای ایجاد hash  در URL از آن استفاده می شود ، خط from hashlib import md5 را در قسمت بالا اضافه خواهید کرد. خط from django.db import models به Django برای ایجاد مدل ها کمک میکند.
اخطار: این آموزش به hash  به عنوان نتیجه عملکردی که یک ورودی را می گیرد و همیشه همان بازده را برمی گرداند اشاره دارد. این آموزش با استفاده از عملکرد hash  MD5 برای اهداف نمایشی استفاده می شود.
توجه داشته باشید که MD5 دارای مشکلات برخوردی است و باید در تولید از آن جلوگیری کرد.
در مرحله بعد ، یک مدل به نام URL با فیلدهای زیر اضافه خواهید کرد:
⦁ full_url: URL ای که باید کوتاه شود.
⦁ url_hash: یک hash  کوتاه است که URL کامل را نشان می دهد.
⦁ clicks: تعداد دفعاتی که به URL کوتاه دسترسی پیدا شده است.
⦁ created_at: تاریخ و زمانی که URL ایجاد شده است.
shorty/shortener/models.py

class URL(models.Model):
full_url = models.URLField(unique=True)
url_hash = models.URLField(unique=True)
clicks = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)

شما می توانید url_hash را با اعمال الگوریتم hash MD5 در قسمت full_url و با استفاده از فقط 10 کاراکتر اول برگردانده شده در طی روش save() در مدل ، تولید کنید ، که هر بار Django ورودی را در پایگاه داده ذخیره می کند، اجرا می شود. علاوه بر این ، کوتاه کننده های URL معمولاً تعداد دفعاتی که روی پیوند کلیک شده است را دنبال می کنند. با فراخوانی روش clicked() در هنگام بازدید از URL توسط کاربر ، به این هدف دست خواهید یافت.
عملیات ذکر شده با این کد در مدل URL شما اضافه می شود:
shorty/shortener/models.py

def clicked(self):
self.clicks += 1
self.save()

def save(self, *args, **kwargs):
if not self.id:
self.url_hash = md5(self.full_url.encode()).hexdigest()[:10]

return super().save(*args, **kwargs)

اکنون که کد را مرور کرده اید ، فایل shortener/models.py را باز کنید:
⦁ $ vim shortener/models.py

کد را با محتوای زیر جایگزین کنید:
shorty/shortener/models.py
from hashlib import md5

from django.db import models

class URL(models.Model):
full_url = models.URLField(unique=True)
url_hash = models.URLField(unique=True)
clicks = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)

def clicked(self):
self.clicks += 1
self.save()

def save(self, *args, **kwargs):
if not self.id:
self.url_hash = md5(self.full_url.encode()).hexdigest()[:10]

return super().save(*args, **kwargs)

حتما فایل را ذخیره کنید و ببندید.
برای اعمال این تغییرات در پایگاه داده ، باید با اجرای دستور زیر migrations  را ایجاد کنید:
⦁ $ python manage.py makemigrations

این کار خروجی زیر را به شما می دهد:
Output
Migrations for ‘shortener’:
shortener/migrations/0001_initial.py
– Create model URL

سپس migrations را اجرا کنید:
⦁ $ python manage.py migrate

خروجی زیر را در ترمینال خود مشاهده خواهید کرد:
Output
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions, shortener
Running migrations:
Applying shortener.0001_initial… OK

اکنون که مدل ها را تنظیم کرده اید ، در مرحله بعدی نقطه پایانی GraphQL و یک جستار ایجاد خواهید کرد.
مرحله 3 – ایجاد جستارها (Queries)
معماری REST منابع مختلفی را در نقاط پایانی مختلف در معرض دید قرار می دهد ، هرکدام دارای یک ساختار داده به خوبی تعریف شده هستند. به عنوان مثال ، ممکن است لیست کاربران را از /api/users دریافت کنید ، که همیشه انتظار فیلدهای مشابه دارید. از طرف دیگر GraphQL یک نقطه پایانی واحد برای همه تعامل ها دارد و از جستارها برای دسترسی به داده ها استفاده می کند. اصلی ترین و با ارزش ترین تفاوت این است که می توانید از Query برای بازیابی همه کاربران خود در طی یک درخواست استفاده کنید.
با ایجاد یک Query برای واکشی همه URL ها شروع کنید. به چند مورد نیاز خواهید داشت:
• نوع URL ، مربوط به مدل تعریف شده قبلی شما.
• یک عبارت پرس و جو به نام urls .
• روشی برای کار با Query ، به معنای واکشی کلیه آدرس ها از پایگاه داده و برگرداندن آنها به کلاینت.
یک فایل جدید به نام shortener / schema.py ایجاد کنید:
⦁ $ vim shortener/schema.py

با افزودن عبارتات import  پایتون شروع کنید:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType

from .models import URL

اولین خط ، کتابخانه اصلی graphene  است، که شامل انواع پایه GraphQL مانند Listاست.
. DjangoObjectType کمکی برای ایجاد تعریف شماتیک از هر مدل Django ، و خط سوم مدل ایجاد URL قبلی شما را وارد می کند.
پس از آن ، با افزودن خطوط زیر ، یک نوع GraphQL جدید برای مدل URL ایجاد کنید:
shorty/shortener/schema.py

class URLType(DjangoObjectType):
class Meta:
model = URL

در آخر ، این خطوط را اضافه کنید تا یک نوع Query برای مدل URL ایجاد شود:
shorty/shortener/schema.py

class Query(graphene.ObjectType):
urls = graphene.List(URLType)

def resolve_urls(self, info, **kwargs):
return URL.objects.all()

این کد یک کلاس Query با یک فیلد به نام urls ایجاد می کند ، که لیستی از URLType قبلاً تعریف شده است. هنگام حل Query از طریق روش remove_urls ، تمام URL های ذخیره شده در پایگاه داده را برمی گردانید.
فایل کامل shortener/schema.py در اینجا نشان داده شده است:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType

from .models import URL

class URLType(DjangoObjectType):
class Meta:
model = URL

class Query(graphene.ObjectType):
urls = graphene.List(URLType)

def resolve_urls(self, info, **kwargs):
return URL.objects.all()

فایل را ذخیره کنید و ببندید.
اکنون باید تمام Query ها به طرح اصلی اضافه شوند. آن را به عنوان نگه دارنده تمام منابع خود تصور کنید.
یک فایل جدید در مسیر shorty / schema.py ایجاد کنید و آن را با ویرایشگر خود باز کنید:
⦁ $ vim shorty/schema

بسته های Python بعدی را با اضافه کردن خطوط زیر وارد کنید. اولین مورد ، همانطور که قبلاً نیز گفته شد ، شامل انواع پایه GraphQL است. خط دوم فایل شماتیک قبلاً ایجاد شده را وارد می کند.
shorty/shorty/schema.py
import graphene

import shortener.schema

سپس ، کلاس اصلی Query را اضافه کنید. به صورت موروثی ، تمام جستارها و عملیات ایجاد شده آینده را نگه میدارد:
shorty/shorty/schema.py

class Query(shortener.schema.Query, graphene.ObjectType):
pass

در آخر ، متغیر شماتیک را ایجاد کنید:
shorty/shorty/schema.py

schema = graphene.Schema(query=Query)

تنظیم SCHEMA که در مرحله 2 تعریف کرده اید به متغیر schema  که اخیراً ایجاد کرده اید اشاره می کند.
فایل کامل shorty/schema.pyدر اینجا نشان داده شده است:
shorty/shorty/schema.py
import graphene

import shortener.schema

class Query(shortener.schema.Query, graphene.ObjectType):
pass

schema = graphene.Schema(query=Query)

فایل را ذخیره کنید و ببندید.
در مرحله بعد ، نقطه انتهایی GraphQL و رابط GraphiQL را فعال کنید که یک رابط وب گرافیکی مورد استفاده برای تعامل با سیستم GraphQL میباشد.
فایل shorty / urls.py را باز کنید:
⦁ $ vim shorty/urls.py

برای اهداف یادگیری ، محتوای فایل را حذف کرده و آن را ذخیره کنید ، تا بتوانید از ابتدا شروع کنید.
اولین سطرهایی که اضافه خواهید کرد عبارت ورودی پایتون است:
shorty/shorty/urls.py
from django.urls import path
from django.views.decorators.csrf import csrf_exempt

from graphene_django.views import GraphQLView

تابع path  توسط Django برای ایجاد یک URL در دسترس برای رابط GraphiQL استفاده می شود. پس از آن ، csrf_exempt را وارد می کنید ، که به کلاینت ها امکان می دهد داده ها را به سرور مجازی ارسال کنند. توضیحات کامل را می توان در مستندات Graphene یافت. در آخرین خط ، کد واقعی مسئول رابط را از طریق GraphQLView وارد کردید.
سپس ، یک متغیر به نام urlpatterns ایجاد کنید.
shorty/shorty/urls.py

urlpatterns = [
path(‘graphql/’, csrf_exempt(GraphQLView.as_view(graphiql=True))),
]

با این کار تمام کدهای لازم برای ایجاد رابط GraphiQL در مسیر graphql/ در کنار هم قرار می گیرد:
فایل کامل shortener/urls.py در اینجا آمده است:
shorty/shorty/urls.py
from django.urls import path
from django.views.decorators.csrf import csrf_exempt

from graphene_django.views import GraphQLView

urlpatterns = [
path(‘graphql/’, csrf_exempt(GraphQLView.as_view(graphiql=True))),
]

فایل را ذخیره کنید و آن را ببندید.
به ترمینال برگردید ، دستور runderver python management.py را اجرا کنید (اگر قبلاً اجرا نشده است):
⦁ $ python manage.py runserver

مرورگر وب خود را در آدرس http: // localhost: 8000 / Graphql باز کنید. به شما این صفحه نمایش داده می شود:

GraphiQL رابطی است که در آن می توانید عبارت GraphQL را اجرا کرده و نتایج را مشاهده کنید. یکی از ویژگی ها، بخش Docs در بالا سمت راست میباشد. از آنجا که همه چیز در GraphQL تایپ شده است ، در مورد انواع ، پرس و جوها ، جهش ها و غیره مطالب رایگان دریافت می کنید.
پس از جستجو در صفحه ، اولین Query خود را در قسمت متن اصلی وارد کنید:
query {
urls {
id
fullUrl
urlHash
clicks
createdAt
}
}

این محتوا چگونگی ساخت یک جستار GraphQL را نشان می دهد: ابتدا ، از کلیدواژه query استفاده می کنید تا به سرور مجازی بگویید که شما فقط می خواهید برخی داده ها را پس بگیرید. در مرحله بعد ، از فیلد url تعریف شده در فایل shortener / schema.py در داخل کلاس Query استفاده می کنید. از این طریق ، به طور صریح تمام فیلدهای تعریف شده در مدل URL را با استفاده از سبک شتر ، که پیش فرض آن برای GraphQL است ، درخواست می کنید.
حالا روی play arrow button در سمت چپ بالای صفحه کلیک کنید.
پاسخ ذیل را دریافت خواهید کرد ، که نشان میدهد شما هنوز URL ندارید:
Output
{
“data”: {
“urls”: []
}
}

این نشان می دهد که GraphQL در حال کار است. در ترمینال خود ، CTRL + C را فشار دهید تا سرور مجازی شما متوقف شود.
شما در این مرحله کارهای بسیاری انجام داده اید ، نقطه پایانی GraphQL را ایجاد کردید، یک جستار برای دریافت همه URL ها تهیه کردید و رابط GraphiQL را فعال نمدید. اکنون ، برای تغییر بانک اطلاعاتی ، جهش هایی ایجاد خواهید کرد.
مرحله 4 – ایجاد جهش ها
اکثر برنامه ها با اضافه کردن ، به روزرسانی یا حذف داده ها راهی برای تغییر وضعیت پایگاه داده دارند. در GraphQL ، این عملیات Mutations نامیده می شود. Mutations یا جهش ها مانند Query به نظر می رسند اما از آرگومانهایی برای ارسال داده به سرور مجازی استفاده می کنند.
برای ایجاد اولین جهش خود ، Shortener / schema.py را باز کنید:
⦁ $ vim shortener/schema.py

در پایان فایل ، با اضافه کردن یک کلاس جدید به نام CreatURL شروع کنید:
shorty/shortener/schema.py

class CreateURL(graphene.Mutation):
url = graphene.Field(URLType)

این کلاس کمک کننده graphene.Mutation را به ارث می برد تا از قابلیت های یک جهش GraphQL برخوردار باشد. همچنین دارای یک ویژگی به نام url است که محتویاتی را که پس از اتمام جهش توسط سرور مجازی برگردانده می شود ، تعریف می کند. در این حالت ، ساختار داده URLType خواهد بود.
در مرحله بعد ، زیرکلاسی به نام Argument را به کلاس از قبل تعریف شده اضافه کنید:
shorty/shortener/schema.py

class Arguments:
full_url = graphene.String()

این کلاس تعریف می کند که چه داده هایی توسط سرور مجازی پذیرفته می شوند. در اینجا ، در انتظار یک پارامتر به نام full_url با محتوای String هستید:
اکنون خطوط زیر را برای ایجاد روش mutate  اضافه کنید:
shorty/shortener/schema.py

def mutate(self, info, full_url):
url = URL(full_url=full_url)
url.save()

این روش mutate  با دریافت داده ها از کلاینت و ذخیره آن در پایگاه داده ، کارهای زیادی را انجام می دهد. در پایان ، خود کلاس را که حاوی آیتم تازه ایجاد شده است ، برمی گرداند.
در آخر ، یک کلاس Mutation  ایجاد کنید تا با اضافه کردن این خطوط ، تمام جهش ها را برای برنامه خود نگه دارید:
shorty/shortener/schema.py

class Mutation(graphene.ObjectType):
create_url = CreateURL.Field()

تا کنون ، شما فقط یک جهش به نام create_url خواهید داشت.
فایل کامل shortener/schema.py در اینجا نشان داده شده است:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType

from .models import URL

class URLType(DjangoObjectType):
class Meta:
model = URL

class Query(graphene.ObjectType):
urls = graphene.List(URLType)

def resolve_urls(self, info, **kwargs):
return URL.objects.all()

class CreateURL(graphene.Mutation):
url = graphene.Field(URLType)

class Arguments:
full_url = graphene.String()

def mutate(self, info, full_url):
url = URL(full_url=full_url)
url.save()

return CreateURL(url=url)

class Mutation(graphene.ObjectType):
create_url = CreateURL.Field()

فایل را ذخیره کنید و ببندید.
برای اتمام اضافه کردن جهش ، فایل shorty / schema.py را تغییر دهید:
⦁ $ vim shorty/schema.py

فایل را تغییر دهید تا کد هایلایت شده زیر را شامل میشود:
shorty/shorty/schema.py

import graphene

import shortener.schema

class Query(shortener.schema.Query, graphene.ObjectType):
pass

class Mutation(shortener.schema.Mutation, graphene.ObjectType):
pass

schema = graphene.Schema(query=Query, mutation=Mutation)

فایل را ذخیره کنید و ببندید. اگر در حال اجرای سرور مجازی محلی نیستید ، آن را شروع کنید:
⦁ $ python manage.py runserver

در مرورگر وب خود به http: // localhost: 8000 / Graphql بروید. اولین جهش خود را در رابط وب GraphiQL با اجرای جمله زیر انجام دهید:
mutation {
createUrl(fullUrl:”https://www.vpsgol.net/community”) {
url {
id
fullUrl
urlHash
clicks
createdAt
}
}
}

شما جهش را با نام CreatURL ، آرگومان fullUrl و داده هایی که می خواهید در پاسخ در فیلد url تعریف شود را تهیه کردید.
خروجی شامل اطلاعات URL شما میباشد که اکنون در قسمت data  در GraphQL ایجاد شده است ، همانطور که در اینجا نشان داده شده:
Output
{
“data”: {
“createUrl”: {
“url”: {
“id”: “1”,
“fullUrl”: “https://www.vpsgol.net/community”,
“urlHash”: “077880af78”,
“clicks”: 0,
“createdAt”: “2020-01-30T19:15:10.820062+00:00”
}
}
}
}

با این کار ، همانطور که در قسمت urlHash مشاهده می کنید ،URL با نسخه hashed خود به بانک اطلاعاتی اضافه شد. سعی کنید Query را که در آخرین مرحله ایجاد کرده اید اجرا کنید تا نتیجه آن را ببینید:
query {
urls {
id
fullUrl
urlHash
clicks
createdAt
}
}

خروجی URL ذخیره شده را نشان می دهد:
Output
{
“data”: {
“urls”: [
{
“id”: “1”,
“fullUrl”: “https://www.vpsgol.net/community”,
“urlHash”: “077880af78”,
“clicks”: 0,
“createdAt”: “2020-03-18T21:03:24.664934+00:00”
}
]
}
}

همچنین می توانید همان Query را اجرا کنید ، اما فقط فیلدهایی را که می خواهید درخواست کنید.
سپس ، یک بار دیگر آن را با URL متفاوت امتحان کنید:
mutation {
createUrl(fullUrl:”https://www.vpsgol.net/write-for-donations/”) {
url {
id
fullUrl
urlHash
clicks
createdAt
}
}
}

خروجی به صورت زیر خواهد بود:
Output
{
“data”: {
“createUrl”: {
“url”: {
“id”: “2”,
“fullUrl”: “https://www.vpsgol.net/write-for-donations/”,
“urlHash”: “703562669b”,
“clicks”: 0,
“createdAt”: “2020-01-30T19:31:10.820062+00:00”
}
}
}
}

اکنون سیستم قادر به ایجاد URL های کوتاه و لیست آنهاست. در مرحله بعد ، شما کاربران را قادر خواهید ساخت تا با نسخه کوتاه آن به یک URL دسترسی پیدا کنند و آنها را به صفحه صحیح هدایت کنید.
مرحله 5 – ایجاد نقطه پایان دسترسی
در این مرحله ، از Django Views استفاده می کنید – روشی که یک درخواست را می گیرد و پاسخی را برمی گرداند- تا هر شخصی که به نقطه پایان http: // localhost: 8000 / url_hash دسترسی دارد را به آدرس اینترنتی کامل آن هدایت کنید.
فایل shortener / views.py را با ویرایشگر خود باز کنید:
⦁ $ vim shortener/views.py

برای شروع ، دو بسته را با جایگزین کردن محتوا با سطرهای زیر وارد کنید:
shorty/shortener/views.py
from django.shortcuts import get_object_or_404, redirect

from .models import URL

در ادامه اینها با جزئیات بیشتری توضیح داده می شوند.
سپس ، Django Views را با نام root ایجاد می کنید. این قطعه کد که مسئول View  در انتهای فایل شماست را اضافه کنید:
shorty/shortener/views.py

def root(request, url_hash):
url = get_object_or_404(URL, url_hash=url_hash)
url.clicked()

return redirect(url.full_url)

آرگومانی به نام url_hash را از URL دریافت می کند که توسط کاربر درخواست شده است. در داخل تابع ، خط اول سعی می کند URL را با استفاده از آرگومان url_hash از پایگاه داده دریافت کند. در صورت عدم یافتن ، خطای HTTP 404 را به کلاینت باز می گرداند ، به این معنی که منبع از دست رفته است. پس از آن ، ویژگی clicked  در ورود URL را افزایش می دهد ، و اطمینان حاصل میکند که تعداد دفعات دسترسی به URL را ثبت کرده است. در پایان ، کلاینت را به URL درخواست شده هدایت می کند.
فایل کامل shortener/views.py در اینجا نشان داده شده است:
shorty/shortener/views.py
from django.shortcuts import get_object_or_404, redirect

from .models import URL

def root(request, url_hash):
url = get_object_or_404(URL, url_hash=url_hash)
url.clicked()

return redirect(url.full_url)

فایل را ذخیره کنید و ببندید.
سپس ، shorty / urls.py را باز کنید:
⦁ $ vim shorty/urls.py

کد هایلایت شده زیر را برای فعال کردن نمای root اضافه کنید.
shorty/shorty/urls.py

from django.urls import path
from django.views.decorators.csrf import csrf_exempt

from graphene_django.views import GraphQLView

from shortener.views import root

urlpatterns = [
path(‘graphql/’, csrf_exempt(GraphQLView.as_view(graphiql=True))),
path(‘<str:url_hash>/’, root, name=’root’),
]

نمای root در مسیر / سرور مجازی شما قابل دسترسی خواهد بود و url_hash را به عنوان یک پارامتر رشته قبول می کند.
فایل را ذخیره کنید و ببندید. اگر در حال اجرای سرور مجازی محلی نیستید ، آن را با اجرای فرمان python manage.py runserver شروع کنید.
برای آزمایش متعلقات جدید ، مرورگر وب خود را باز کرده و به URL http: // localhost: 8000 / 077880af78 دسترسی پیدا کنید. توجه داشته باشید که قسمت آخر، URL hash باشد که توسط جهش از مرحله 5 ایجاد شده است. شما به صفحه URL hash هدایت می شوید .
اکنون که تغییر مسیر URL کار می کند ، با اجرای خطا هنگام اجرای جهش ، برنامه را ایمن تر می کنید.
مرحله 6 – اجرای مدیریت خطا
مدیریت خطاها بهترین روش در همه برنامه ها است ، زیرا برنامه نویسان معمولاً چیزی که برای سرور مجازی ارسال می کنند را کنترل نمیکنند. در این حالت ، می توانید سعی کنید نواقص را پیش بینی کنید و تأثیرات آنها را به حداقل برسانید. در سیستم پیچیده ای مانند GraphQL ، بسیاری از موارد ممکن است اشتباه پیش بروند ، از درخواست کلاینت برای داده های اشتباه تا از دست دادن دسترسی سرور مجازی به پایگاه داده.
به عنوان یک سیستم تایپ شده ، GraphQL می تواند هر کاری را که کلاینت درخواست کرده و در عملیاتی به نام Schema Validation دریافت می کند را تأیید نماید. با ساختن یک جستار با یک فیلد غیر موجود می توانید این کار را در عمل مشاهده کنید.
یک بار دیگر به مرورگر خود به http: // localhost: 8000 / Graphql بروید و جستار بعدی را در رابط GraphiQL با فیلد iDontExist اجرا کنید:
query {
urls {
id
fullUrl
urlHash
clicks
createdAt
iDontExist
}
}

از آنجا که هیچ فیلد iDontExist تعریف شده در جستار شما وجود ندارد ، GraphQL یک پیام خطا را برمی گرداند:
Output

{
“errors”: [
{
“message”: “Cannot query field \”iDontExist\” on type \”URLType\”.”,
“locations”: [
{
“line”: 8,
“column”: 5
}
]
}
]
}

این مسئله مهمی است زیرا ، در سیستم تایپ شده GraphQL ، هدف ارسال و دریافت اطلاعاتی است که قبلاً در این شماتیک تعریف شده است.
برنامه فعلی، هر رشته دلخواه را در قسمت full_url می پذیرد. مشکل این است که اگر شخصی آدرس اینترنتی ضعیفی ارسال کند ، هنگام امتحان کردن اطلاعات ذخیره شده ، کاربر را به ناکجا هدایت خواهید کرد. در این حالت ، باید تأیید کنید که آیا full_url قبل از ذخیره کردن آن در بانک اطلاعاتی به خوبی قالب بندی شده است ، و در صورت بروز هرگونه خطایی ، استثناء GraphQLError را با یک پیام سفارشی اعلام کنید.
بیایید این قابلیت را در دو مرحله پیاده سازی کنیم. ابتدا فایل shortener / models.py را باز کنید:
⦁ $ vim shortener/models.py

خطوط هایلایت شده را در بخش ورودی ها اضافه کنید:
shorty/shortener/models.py
from hashlib import md5

from django.db import models
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError

from graphql import GraphQLError

URLValidator یاور Django است که اعتبار یک رشته URL را تأیید می کند و از GraphQLError توسط گرافن برای اعلام استثنائات با یک پیام سفارشی استفاده می شود.
سپس ، مطمئن شوید که URL دریافت شده توسط کاربر را قبل از ذخیره کردن آن در پایگاه داده ، اعتبار دهید. این عملکرد را با اضافه کردن کد هایلایت شده در فایل shortener / models.py فعال کنید:
shorty/shortener/models.py
class URL(models.Model):
full_url = models.URLField(unique=True)
url_hash = models.URLField(unique=True)
clicks = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)

def clicked(self):
self.clicks += 1
self.save()

def save(self, *args, **kwargs):
if not self.id:
self.url_hash = md5(self.full_url.encode()).hexdigest()[:10]

validate = URLValidator()
try:
validate(self.full_url)
except ValidationError as e:
raise GraphQLError(‘invalid url’)

return super().save(*args, **kwargs)

ابتدا این کد URLValidator را در متغیر validate  معرفی می کند. در داخل بلوک try/except ، URL دریافت شده را تأیید می کنید و اگر چیزی اشتباه باشد ، یک GraphQLErr را با پیام سفارشی invalid url مطرح می کنید.
فایل کامل shortener/models.py در اینجا نشان داده شده است:
shorty/shortener/models.py
from hashlib import md5

from django.db import models
from django.core.validators import URLValidator
from django.core.exceptions import ValidationError

from graphql import GraphQLError

class URL(models.Model):
full_url = models.URLField(unique=True)
url_hash = models.URLField(unique=True)
clicks = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)

def clicked(self):
self.clicks += 1
self.save()

def save(self, *args, **kwargs):
if not self.id:
self.url_hash = md5(self.full_url.encode()).hexdigest()[:10]

validate = URLValidator()
try:
validate(self.full_url)
except ValidationError as e:
raise GraphQLError(‘invalid url’)

return super().save(*args, **kwargs)

فایل را ذخیره کنید و ببندید. اگر در حال اجرای سرور مجازی محلی نیستید ، آن را با دستور python manage.py runserver شروع کنید.
سپس ، خطای جدید خود را در آدرس http: // localhost: 8000 / Graphql آزمایش کنید. سعی کنید یک URL جدید با full_url نامعتبر در رابط GraphiQL ایجاد کنید:
mutation {
createUrl(fullUrl:”not_valid_url”){
url {
id
fullUrl
urlHash
clicks
createdAt
}
}
}

هنگام ارسال URL نامعتبر ، استثناء شما با پیام سفارشی مطرح می شود:
Output

{
“errors”: [
{
“message”: “invalid url”,
“locations”: [
{
“line”: 2,
“column”: 3
}
],
“path”: [
“createUrl”
]
}
],
“data”: {
“createUrl”: null
}
}

اگر به ترمینال خود نگاه کنید جایی که فرمان python manage.py runserverدر حال اجرا است ، خطایی ظاهر می شود:
Output


graphql.error.located_error.GraphQLLocatedError: invalid url

[30/Jan/2020 19:46:32] “POST /graphql/ HTTP/1.1” 200 121

یک نقطه پایانی GraphQL همیشه با کد وضعیت HTTP 200 مواجه خواهد شد ، که معمولاً نشان دهنده موفقیت است. به یاد داشته باشید که ، حتی اگر GraphQL طبق HTTP ساخته شده باشد ، از مفاهیم کدهای وضعیت HTTP یا روشهای HTTP مانند REST استفاده نمی کند.
با استفاده از خطای عملی شده ، اکنون می توانید مکانیزمی را برای فیلتر کردن جستارهای خود ایجاد کنید ، که اطلاعات را توسط سرور مجازی به حداقل برساند.
مرحله 7 – اجرای فیلترها
تصور کنید که برای افزودن پیوندهای شخصی خود ، از استفاده از ابزار کوتاه کننده URL استفاده کرده اید. پس از مدتی ، ورودی های زیادی وجود خواهند داشت که پیدا کردن ورودی درست دشوار خواهد شد. می توانید با استفاده از فیلترها این مسئله را حل کنید.
فیلترینگ یک مفهوم رایج در API های REST است ، که معمولاً یک پارامتر Query با یک فیلد و مقدار در URL اضافه می شود. به عنوان نمونه ، برای فیلتر کردن تمام کاربران با نام jojo ، می توانید از GET /api/users?name=jojo استفاده کنید.
در GraphQL از آرگومان های Query به عنوان فیلتر استفاده خواهید کرد. که یک رابط درست و تمیز ایجاد می کنند.
با اجازه دادن به کلاینت جهت فیلتر کردن نام آدرس های اینترنتی با استفاده از فیلد full_url میتوانید مشکل دشواری در یافت URL را حل کنید. برای پیاده سازی، فایل shortener/schema.py را در ویرایشگر مورد علاقه خود باز کنید.
⦁ $ vim shortener/schema.py
ابتدا روش Q را در خط هایلایت شده وارد کنید:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType
from django.db.models import Q

from .models import URL

این مورد برای فیلتر کردن جستار پایگاه داده شما استفاده می شود.
در مرحله بعد ، کل کلاس Query را با محتوای زیر بازنویسی کنید:
shorty/shortener/schema.py

class Query(graphene.ObjectType):
urls = graphene.List(URLType, url=graphene.String())

def resolve_urls(self, info, url=None, **kwargs):
queryset = URL.objects.all()

if url:
_filter = Q(full_url__icontains=url)
queryset = queryset.filter(_filter)

return queryset

تغییراتی که شما ایجاد می کنید عبارتند از:
⦁ اضافه کردن پارامتر فیلتر url در متغیر url و روش resolve_url.
⦁ در داخل resolve_url اگر پارامتری به نام url داده شده باشد ، با استفاده از روش Q (full_url__icontains = url) تنها URL هایی را که حاوی مقدار داده شده هستند ، برگردانید.
فایل کامل shortener/schema.py در اینجا نشان داده شده است:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType
from django.db.models import Q

from .models import URL

class URLType(DjangoObjectType):
class Meta:
model = URL

class Query(graphene.ObjectType):
urls = graphene.List(URLType, url=graphene.String())

def resolve_urls(self, info, url=None, **kwargs):
queryset = URL.objects.all()

if url:
_filter = Q(full_url__icontains=url)
queryset = queryset.filter(_filter)

return queryset

class CreateURL(graphene.Mutation):
url = graphene.Field(URLType)

class Arguments:
full_url = graphene.String()

def mutate(self, info, full_url)
url = URL(full_url=full_url)
url.save()

return CreateURL(url=url)

class Mutation(graphene.ObjectType):
create_url = CreateURL.Field()

فایل را ذخیره کنید و ببندید. اگر در حال اجرای سرور مجازی محلی نیستید ، آن را با اجرای python manage.py runserver شروع کنید.
آخرین تغییرات خود را در http: // localhost: 8000 / Graphql آزمایش کنید. در رابط GraphiQL عبارت زیر را بنویسید. این عبارت کلیه آدرس ها با کلمه community را فیلتر می کند:
query {
urls(url:”community”) {
id
fullUrl
urlHash
clicks
createdAt
}
}
خروجی فقط یک ورودی است زیرا شما فقط یک URL را با رشته community  در آن اضافه کرده اید. اگر URL های بیشتری را قبل از آن اضافه کرده باشید ، ممکن است خروجی شما متفاوت باشد.
Output

{
“data”: {
“urls”: [
{
“id”: “1”,
“fullUrl”: “https://www.vpsgol.net/community”,
“urlHash”: “077880af78”,
“clicks”: 1,
“createdAt”: “2020-01-30T19:27:36.243900+00:00”
}
]
}
}

اکنون این امکان را دارید که آدرس های اینترنتی خود را جستجو کنید. با این حال ، با ایجاد پیوندهای فراوان ، ممکن است کلاینت های شما از این که لیست URL ، داده های بیشتری نسبت به ظرفیت برنامه هایشان برمیگرداند، شکایت کنند. برای حل این مسئله ، صفحه بندی را اجرا خواهید کرد.
مرحله 8 – پیاده سازی صفحه بندی
کلاینت هایی که از پشت خط شما استفاده می کنند ممکن است شکایت کنند که زمان پاسخگویی خیلی طول می کشد یا اگر تعداد ورودی های URL بیش از حد زیاد باشد ، شاکی باشند که اندازه آن خیلی بزرگ است. حتی پایگاه داده شما ممکن است برای جمع آوری مجموعه عظیمی از اطلاعات با مشکل مواجه شود. برای حل این مسئله ، می توانید به کلاینت اجازه دهید با استفاده از تکنیکی به نام صفحه بندی ، تعداد موارد مورد نظر خود را در هر درخواست مشخص کند.
هیچ راه پیش فرضی برای اجرای این ویژگی وجود ندارد. حتی در API های REST ، ممکن است آن را در هدرهای HTTP یا پارامترهای پرس و جو ، با نام ها و رفتارهای مختلف مشاهده کنید.
در این برنامه با فعال کردن دو آرگومان دیگر برای جستار URL ، صفحه بندی را پیاده سازی می کنید: first  و skip. first  تعداد متغیر اول عناصر را انتخاب می کند و skip تعداد عناصری را که از ابتدا باید رد شوند، مشخص می کند. به عنوان مثال ، با استفاده از first == 10 و skip == 5 ، 10 URL اول را بدست می آورید ، اما 5 تا از آنها را رد می کنید و 5 مورد باقی مانده را برمیگردانید.
اجرای این راه حل مشابه اضافه کردن فیلتر است.
فایل shortener / schema.py را باز کنید:
⦁ vim shortener/schema.py

در فایل ، کلاس Query را با اضافه کردن دو پارامتر جدید به متغیر url و روش resolve_urls که در کد زیر هایلایت شده است ، تغییر دهید:
shorty/shortener/schema.py
import graphene
from graphene_django import DjangoObjectType
from django.db.models import Q

from .models import URL

class Query(graphene.ObjectType):
urls = graphene.List(URLType, url=graphene.String(), first=graphene.Int(), skip=graphene.Int())

def resolve_urls(self, info, url=None, first=None, skip=None, **kwargs):
queryset = URL.objects.all()

if url:
_filter = Q(full_url__icontains=url)
queryset = queryset.filter(_filter)

if first:
queryset = queryset[:first]

if skip:
queryset = queryset[skip:]

return queryset

این کد از پارامترهای تازه ایجاد شده first  و skip  موجود در روش resolve_urls برای فیلتر کردن پرس و جو از پایگاه داده استفاده میکند.
فایل را ذخیره کنید و ببندید. اگر در حال اجرای سرور مجازی محلی نیستید ، آن را با اجرای python manage.py runserver شروع کنید.
برای آزمایش صفحه بندی ، جستار زیر را در رابط GraphiQL به آدرس http: // localhost: 8000 / Graphql:صادر کنید:
query {
urls(first: 2, skip: 1) {
id
fullUrl
urlHash
clicks
createdAt
}
}

کوتاه کننده URL شما URL دوم ایجاد شده در پایگاه داده شما را برمی گرداند:
Output

{
“data”: {
“urls”: [
{
“id”: “2”,
“fullUrl”: “https://www.vpsgol.net/write-for-donations/”,
“urlHash”: “703562669b”,
“clicks”: 0,
“createdAt”: “2020-01-30T19:31:10.820062+00:00”
}
]
}
}

این نشان می دهد که ویژگی صفحه بندی کار می کند. به راحتی افزودن آدرس های اینترنتی بیشتر و آزمایش مجموعه های مختلف first  و skip را انجام دهید.
نتیجه
تمام اکوسیستم GraphQL هر روز در حال رشد است و جامعه ای فعال در پشت آن وجود دارد. این محصول توسط شرکت هایی مانند GitHub و Facebook به اثبات رسیده است و اکنون می توانید این فناوری را برای پروژه های خود اعمال کنید.
در این آموزش شما با استفاده از مفاهیمی مانند Query و Mutations یک سرویس کوتاه کننده URL با استفاده از GraphQL ، Python و Django ایجاد کرده اید. اما فراتر از آن ، اکنون می دانید که چگونه می توانید با استفاده از چارچوب وب Django به این فناوری ها اعتماد کنید تا بتوانید برنامه های وب ایجاد کنید.
می توانید اطلاعات بیشتری در مورد GraphQL و ابزارهای مورد استفاده در اینجا را در وب سایت GraphQL و وب سایت های مطالب Graphene کسب کنید.

 

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

GraphQL و React به خوبی همکاری می کنند تا ابزارهایی را برای کارهای برنامه نویسی معمول وب از جمله ادغام در زمان حقیقی برای توسعه دهندگان فراهم کنند. در این مقاله ، از React و GraphQL برای ایجاد یک برنامه چت در زمان حقیقی استفاده خواهید کرد.
کارهای زیر را انجام خواهید داد:
پروژه React و GraphQL را تنظیم میکنید
از Apollo برای تعامل با سرور مجازی GraphQL از React استفاده میکنید
جستجو کرده و موارد را تغییر میدهید
پیغام و اشتراک در زمان حقیقی را پیاده سازی می کنید
GraphQL یک نمونه جستار است که حول الگوریتم Graph ساخته شده توسط فیسبوک ایجاد شده است. GraphQL به جای ارسال بارهای JSON از طریق REST به سرور مجازی که بعدا سرور مجازی بانک اطلاعاتی را جستجو کند، این سؤالات را مستقیم از کلاینت ارائه می دهد. به این ترتیب کار شما فقط با آنچه کلاینت نیاز دارد پایان می یابد و نه آنچه که نقطه انتهایی REST در معرض آن قرار دارد. برای ارتباط برقرار کردن با سرور مجازی GraphQL از React خود ، از Apollo – کلاینت GraphQL -استفاده خواهید کرد. روند تنظیم سرور مجازی و ابزارهای درگیر نیز می تواند بسیار زیاد شود. بعضی اوقات حتی ممکن است اشتباه کنید ، و از این رو محصولات خود را در معرض آسیب پذیری های امنیتی قرار دهید. Graphcool یک سرور مجازی GraphQL میزبان بسیار گسترده است که می توانید با آن کار کنید. با استفاده از توابع بدون سرور مجازی می توانید هر چیزی را روی سرور مجازی دستکاری کنید.
راه اندازی یک پروژه React
create-react-app ابزار مورد علاقه برنامه نویسان برای چهارچوب بندی برنامه های React بوده است. با اجرای دستور زیر ، پروژه جدیدی را در React قرار دهید:
$ create-react-app graphql-chat

با این کار یک پوشه جدید به نام Graphql-chat ایجاد شده و تمامی فایلهای React لازم برای کار با آنها را دانلود می کند.
متعلقات را در pack.json به شرح زیر به روز کنید:
package.json
“dependencies”: {

“apollo-client-preset”: “^1.0.6”,
“apollo-link-ws”: “^1.0.4”,
“graphql”: “^0.12.3”,
“graphql-tag”: “^2.6.1”,
“react”: “^16.2.0”,
“react-apollo”: “^2.0.4”,
“react-dom”: “^16.2.0”,
“react-scripts”: “1.0.17”,
“subscriptions-transport-ws”: “^0.9.4″
},

سپس دستور نصب را اجرا کنید تا همه این فایل ها دانلود شوند:
$ npm install

$ # OR

$ yarn

در ادامه یاد میگیریم که هریک از این متعلقات هنگامی که با آنها مواجهه میشویم، چه کاری انجام میدهند.
برخی از فایل های جهانی CSS باید در بر گرفته شده باشند تا نگرانی های طراحی برای این پروژه از طرف ما برطرف شود. برچسب head  را در public/index.html به روز کنید تا فایل های CSS زیر را شامل شود:
public/index.html
<link rel=”stylesheet” href=”https://cdnjs.cloudflare.com/ajax/libs/normalize/7.0.0/normalize.min.css” />
<link rel=”stylesheet” href=”https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css” />

تنظیم یک نمونه GraphQL
به جای اینکه یک سرور مجازی محلی در حال اجرا باشد ، می توانیم از یک سرویس میزبانی شده رایگان موجود برای تنظیم یک نمونه GraphQL استفاده کنیم. این نه تنها رایگان است بلکه کار کمتری دارد و کار با آن آسانتر است. Graphcool برای پروژه های کوچک ، بزرگ و در حال رشد مفید است.
برای راه‌ اندازی نمونه ، ابتدا باید ابزار Graphcool CLI را نصب کنید. این ابزار دستورهایی را برای ایجاد سرور مجازی های جدید GraphQL ، به روزرسانی آنها و همچنین استقرار آنها ارائه می دهد. همچنین می تواند برای مدیریت توابع ابری Graphcool مورد استفاده قرار گیرد. دستور زیر را برای نصب اجرا کنید:
$ npm install -g graphcool-framework

به برنامه React که از طریق ترمینال تنظیم کرده ایم بروید و یک سرور مجازی جدید Graphool را راه اندازی کنید:
$ graphcool-framework init server


این دستور یک پوشه در پروژه React به نام server ایجاد می کند. دستور server حاوی تعاریف نوع و شماتیک برای داده های GraphQL شماست. برای کسب اطلاعات بیشتر در مورد اصول GraphQL می توانید به مقاله درک جستارهای API GraphQL و همچنین مقالاتی در این لینک جستجو مراجعه کنید.
برای برنامه چت ما ، فقط باید روی فایل types.graphql تولید شده در پوشه سرور مجازی تمرکز کنیم. اینجاست که به GraphQl می گویید ساختار داده های شما چگونه است. این کار به تعریف نوع شناخته شده است. محتوای آن را با موارد زیر جایگزین کنید:
type Chat @model {
id: ID! @isUnique
from: String!
content: String!
createdAt: DateTime!
}

باید این شماتیک را در سرور مجازی Graphcool به کار گیرید:
$ graphcool-framework deploy

این دستور ابتدا یک مرورگر برای شما باز می کند تا یک حساب Graphcool را راه اندازی کنید و سپس نمونه خود را مستقر کنید. می توانید نمونه را از منوی سمت چپ بالای داشبورد Graphcool خود باز کنید.
در این ترمینال ، فرآیند یک URL مهم را برای تعامل با سرور مجازی Graphcool شما چاپ می کند. لطفاً این URL را در جایی ذخیره کنید که بتوانید به آنها مراجعه کنید.
هنگامی که برنامه مستقر شد ، playground را باز کنید تا آزمایش کنید آیا روند استقرار ، تمام تعاریف نوع شما را در جای خود قرار داده است یا خیر:
graphcool-framework playground

جستار و جهش زیر را در ویرایشگر در سمت چپ اجرا کنید و برای راه اندازی آنها روی دکمه اجرا کلیک کنید:
query FETCH_CHATS{
allChats{
from,
content
}
}

mutation CREATE_CHAT {
createChat(content: “test”, from: “test”) {
content,
from
}
}

playground از شما می پرسد کدام یک از دستوراتی را که می خواهید اجرا کنید:
نمونه GraphQL را به React ارائه دهید
یک پروژه React و یک سرور مجازی GraphQL آماده است. بعدش چی؟ باید آنها را با تمام ماژول هایی که با فایل pack.json نصب کردیم ، گره بزنیم.
بیایید با وارد کردن آنها شروع کنیم. فایل ورودی src / index.js را برای وارد کردن متعلقات زیر به روز کنید:
src/index.js
import { ApolloProvider } from ‘react-apollo’;
import { ApolloClient } from ‘apollo-client’;
import { HttpLink } from ‘apollo-link-http’;
import { InMemoryCache } from ‘apollo-cache-inmemory’;
import { ApolloLink, split } from ‘apollo-client-preset’
import { WebSocketLink } from ‘apollo-link-ws’
import { getMainDefinition } from ‘apollo-utilities’

درست در زیر ورودی ها ، پیوند WebSocket را پیکربندی کنید. می توانید این کار را با استفاده از ماژول WebSocketLink انجام دهید:
src/index.js

const wsLink = new WebSocketLink({

uri: ‘[Subscriptions API URI]’,
options: {
reconnect: true
}
})

عملکرد سازنده با استفاده از گزینه های پیکربندی یک آبجکت را می گیرد. uri مورد نیاز است و باید همان Subscriptions API URI باشد که پس از استقرار دریافت کردید. ما از گزینه اتصال مجدد استفاده خواهیم کرد تا از WebSocket بخواهیم دوباره پس از یک تلاش ناموفق دوباره برای اتصال تلاش کند.
ما فقط در حال ایجاد ارتباط WebSocket نیستیم. بلکه برای انجام عملیات درخواست-پاسخگویی باید یک اتصال HTTP را تنظیم کنیم. این محتوا را درست زیر ستاپ پیوند WebSocket اضافه کنید:
src/index.js

const httpLink = new HttpLink({ uri: ‘[SIMPLE API URI]’ })

همانند سازنده WebSocketLink است اما از API URI ساده استفاده می کند. لازم نیست از هیچ گزینه پیکربندی عبور کنیم.
در این مرحله دو لینک داریم. ما از روش spliet استفاده خواهیم کرد تا به سرور مجازی بگوییم چه زمانی از کدام لینک استفاده کند:
src/index.js

const link = split(

({ query }) => {
const { kind, operation } = getMainDefinition(query)
return kind === ‘OperationDefinition’ && operation === ‘subscription’
},
wsLink,
httpLink,
)

روش split  سه آرگومان میگیرد. اولی تستی است که یک بولین را برمی گرداند. اگر مقدار بولی (دو بایتی) true باشد ، درخواست به آرگومان دوم(wsLink) ارسال می شود. اگر نادرست باشد ، به آرگومان سوم (httpLink) ارسال می شود.
اکنون می توانیم یک کلاینت Apollo با لینک برگشتی ایجاد کنیم:
src/index.js

const client = new ApolloClient({

link,
cache: new InMemoryCache()
})

با استفاده از URL های ارائه شده می توانید مستقیماً به سرور مجازی خود درخواست دهید. این کار نسبت به کتابخانه بسته بندی که عملکرد هایی را برای ساده کردن تعامل سرور مجازی فراهم می کند، کمی نابه سامان تر است. Apollo یکی از این کتابخانه ها است.
با استفاده از مؤلفه AppProvider کلاینت را ارائه دهید:
src/index.js

ReactDOM.render(

<ApolloProvider client={client}>
<App />
</ApolloProvider>,
document.getElementById(‘root’)
);

جستجوی سرور مجازی GraphQL
با پیوند بین برنامه React و مجموعه GraphQL ، زمان آن رسیده است که پرس و جو از پایگاه داده و نمایش داده ها در مرورگر آغاز شود.
src / App.js را برای تنظیم یک جستار به روز کنید:
src/App.js
import React, { Component } from ‘react’;

// Import GraphQL helpers
import { graphql } from ‘react-apollo’;
import gql from ‘graphql-tag’;

// App component styles
import ‘./App.css’;

class App extends Component {
state = {
from: ‘anonymous’,
content: ”
};
componentDidMount() {
// Get username form prompt
// when page loads
const from = window.prompt(‘username’);
from && this.setState({ from });
}
render() {
// Coming up next
}
}

const ALL_CHATS_QUERY = gql`
query AllChatsQuery {
allChats {
id
createdAt
from
content
}
}
`;

export default graphql(ALL_CHATS_QUERY, { name: ‘allChatsQuery’ })(App);

بیایید آنچه را که در اینجا اتفاق می افتد تجزیه کنیم:
ابتدا grafl و gql را وارد می کنیم. این کتابخانه ها به ترتیب به تنظیم و تجزیه پرس و جو کمک می کنند.
در پایان تعریف کلاس کامپوننت ، query را ایجاد می کنیم. دقیقاً شبیه کارهایی است که ما در playground انجام دادیم اما با استفاده از برچسب قالب به روش gql پیچیده شده است.
از HOC graphql  استفاده می شود تا نتیجه این پرس و جو را به ویژگی های مؤلفه برنامه نشان دهد.
اکنون می توانید از طریق props پرس و جو را در DOM ارائه دهید:
// Chatbox UI component
import Chatbox from ‘./components/Chatbox’;

class App extends Component {

//…

render() {
const allChats = this.props.allChatsQuery.allChats || [];
return (
<div className=””>
<div className=”container”>
<h2>Chats</h2>
{allChats.map(message => (
<Chatbox key={message.id} message={message} />
))}
</div>
</div>
);
}
}

// …

export default graphql(ALL_CHATS_QUERY, { name: ‘allChatsQuery’ })(App);

روش ارائه حول هر یک از نتایج پرس و جو تکرار می شود و آنها را با استفاده از مؤلفه Chatbox روی صفحه چاپ می کند. این همان شکل کامپوننت در components/Chatbox.js: میباشد:
import React from ‘react’;
import ‘./Chatbox.css’
const Chatbox = ({message}) => (
<div className=”chat-box”>
<div className=”chat-message”>
<h5>{message.from}</h5>
<p>
{message.content}
</p>
</div>
</div>
);
export default Chatbox;

برای بدست آوردن سبک های اصلی Chatbox.css و App.css می توانید به repo مراجعه کنید.
ایجاد پیام های جدید
جهش ها در GraphQL برای ایجاد ، ویرایش و حذف مقادیر از پایگاه داده شما استفاده می شود. جایی که یک جستار R (Read) در CRUD است ، یک جهش می تواند CUD (ایجاد ، به روز رسانی ، حذف) باشد. ما در حال حاضر قادر به خواندن پیام های موجود در برنامه چت خود هستیم. مورد بعدی که باید به آن توجه کنیم ایجاد پیامهایی از سوی برنامه React میباشد.
درست مانند روشی که یک پرس و جو ایجاد کردیم ، می توانیم جهشی نیز ایجاد کنیم:
import { graphql, compose } from ‘react-apollo’;

// App component …

const CREATE_CHAT_MUTATION = gql`
mutation CreateChatMutation($content: String!, $from: String!) {
createChat(content: $content, from: $from) {
id
createdAt
from
content
}
}
`;

export default compose(
graphql(ALL_CHATS_QUERY, { name: ‘allChatsQuery’ }),
graphql(CREATE_CHAT_MUTATION, { name: ‘createChatMutation’ })
)(App);

جهش بسیار شبیه به یک پرس و جو است اما پارامترها و محتوایی دریافت میکند. ما باید مؤلفه برنامه را در این جهش و جستار موجود محاصره کنیم. به همین دلیل روش کامپوزیت را نیز وارد می کنیم و از این روش برای پیچیدن هر دو HOC استفاده می کنیم.
در روش رندر ، می توانیم یک عنصر ورودی داشته باشیم که این محتوای پیام را جمع آوری کند:
render() {
const allChats = this.props.allChatsQuery.allChats || [];
return (
<div className=””>
<div className=”container”>
<h2>Chats</h2>
{allChats.map(message => (
<Chatbox key={message.id} message={message} />
))}

{/* Message content input */}
<input
value={this.state.content}
onChange={e => this.setState({ content: e.target.value })}
type=”text”
placeholder=”Start typing”
onKeyPress={this._createChat}
/>
</div>
</div>
);
}
}

ورودی باعث ایجاد یک رویداد در هر keyPress می شود و این رویداد متد _createChat نامیده می شود. در اینجا تعریف این روش در کلاس App آمده است:
_createChat = async e => {
if (e.key === ‘Enter’) {
const { content, from } = this.state;
await this.props.createChatMutation({
variables: { content, from }
});
this.setState({ content: ” });
}
};

ما فقط می خواهیم هنگام فشار دادن کلید enter ، جهش را اجرا کنیم. توجه کنید که چگونه CreatChatMutation نیز در props  قرار می گیرد و متغیر به عنوان یک شیء به روش جهش منتقل می شود.
هنگام ارسال پیام جدید ، هیچ اتفاقی نمی افتد تا مجدد لود کنید.
این کار، به روزرسانی های زمان حقیقی را فراخوانی می کند.
تنظیم اشتراک زمان حقیقی
اشتراک در GraphQL برای ردیابی تغییرات ایجاد شده توسط کلاینت های متصل شده استفاده می شود. این کلاینت ها می توانند بر اساس این تغییرات عمل کنند. احتمالاً با به روزرسانی رابط کاربری با داده های تغییر یافته یا حتی ارسال نوتیفیکیشن این کار انجام میشود. فن آوری که اشتراک را تقویت می کند ، WebSockets مشهور است.
برای تنظیم اشتراک ، این روش را به کلاس App  اضافه کنید:
_subscribeToNewChats = () => {
this.props.allChatsQuery.subscribeToMore({
document: gql`
subscription {
Chat(filter: { mutation_in: [CREATED] }) {
node {
id
from
content
createdAt
}
}
}
`,
updateQuery: (previous, { subscriptionData }) => {
const newChatLinks = [
…previous.allChats,
subscriptionData.data.Chat.node
];
const result = {
…previous,
allChats: newChatLinks
};
return result;
}
});
};

allChatsQuery یک روش SubscribToMore را در معرض دید شما قرار می دهد. پس از فراخوانی این روش ، کانال ارتباطی در زمان حقیقی باز می شود. این روش آبجکتی دریافت می کند که می توانیم سند پرس و جو و یک متد updateQuery را تعریف کنیم.
این سند اشتراکی را تعریف کرده و به دنبال این میگردد که قبل از شروع یک رویداد ، چه زمان جهش در chat رخ می دهد. روش بروزرسانی مقدار قدیمی و جدید را دریافت می کند و ما برای به روز کردن مقدار قدیمی از این مقادیر جدید استفاده می کنیم.
می توانید این اشتراک را با روش چرخه عمر componentDidMount شروع کنید:
پس از اجرای مجدد ، یک برنامه چت کاری خواهید داشت.
مطالب بیشتر
مجموعه آموزش هایGraphQL شما را در مراحل یادگیری اصول GraphQL راهنمایی می کنند.

 

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

مقدمه
Caddy یک وب سرور مجازی است که حول سادگی و امنیت طراحی شده است و ویژگی هایی دارد که برای میزبانی وب سایت ها مفید است. به عنوان مثال ، می تواند مجوزهای TLS را از Lets Encrypt برای فعال کردن HTTPS به طور خودکار دریافت و مدیریت کند ، و پشتیبانی از HTTP / 2 را نیز شامل می شود. HTTPS سیستمی برای تأمین امنیت ترافیک بین کاربران و سرور مجازی شماست و به سرعت در حال تبدیل شدن به یک خصیصه اصلی از وب سایتهای در حال تولید است – بدون وجود آن ، اگر کاربران سعی در ورود اطلاعات به سیستم داشته باشند، کروم و فایرفاکس هشدار می دهند که وب سایت شما “امن نیست”.
پیش از این ، روش پیشنهادی برای نصب Caddy ، دانلود باینری های از پیش ساخته از وب سایت پروژه Caddy بود. با این حال ، تغییر در نحوه صدور مجوز Caddy بدان معنی است که شما دیگر مجاز به استفاده از این باینری های از پیش ساخته برای مقاصد تجاری نیستید ، مگر اینکه هزینه مجوز را بپردازید ، حتی اگر فقط در داخل یک بیزینس از Caddy استفاده کنید. خوشبختانه ، کد منبع Caddy هنوز کاملاً منبع باز است و می توانید خودتان Caddy را بسازید تا از مشکلات مربوط به مجوز جلوگیری کنید.
در این آموزش ، شما Caddy را از مبدا ایجاد خواهید کرد و از آن برای میزبانی وب سایتی امن با HTTPS استفاده خواهید کرد. این کار مستلزم کامپایل کردن آن ، پیکربندی آن با استفاده از یک Caddyfile و نصب افزونه ها است. در پایان یاد خواهید گرفت که پس از انتشار نسخه جدید ، نصب خود را به روز کنید.
پیش نیازها
• سرور مجازی اوبونتو 18.04 با امتیازات اصلی و یک حساب ثانویه و غیر ریشه. می توانید با دنبال کردن راهنمای تنظیم اولیه سرور مجازی برای اوبونتو 18.04 ، این کار را انجام دهید. برای این آموزش کاربر غیر ریشه sammy است.
• نام دامنه کاملاً ثبت شده. در کل این آموزش از your_domain استفاده خواهد شد. می توانید نام دامنه را در Namecheap خریداری کنید ، یک نابهم صورت رایگان در Freenom دریافت کنید ، یا از ثبت دامنه مورد نظر خود استفاده کنید.
• رکورد DNS با your_domain که آدرس IP عمومی سرور مجازی شما نشان می دهد. برای جزئیات بیشتر در مورد چگونگی اضافه کردن آنها می توانید این مقدمه را در vpsgol DNS دنبال کنید.
• زنجیره ابزار Go language که روی سرور مجازی شما نصب شده باشد. برای تنظیم Go ، راهنمای ما را در مورد نحوه نصب و ستاپ یک محیط برنامه نویسی محلی در اوبونتو 18.04 دنبال کنید. نیازی نیست پروژه های نمونه ای ایجاد کنید.
• یک نشانه دسترسی شخصی (کلید API) با مجوزهای خواندن و نوشتن برای حساب vpsgol نیاز دارید. برای ایجاد آن، به نحوه ایجاد نشانه دسترسی شخصی مراجعه کنید.
مرحله 1 – ساخت Caddy
در این مرحله ، Caddy را با قابلیت اضافه کردن افزونه ها در آینده، و بدون تغییر کد منبع Caddy ، از مبدأ میسازید.
برای اهداف این آموزش ، کد منبع را تحت ~ / caddy ذخیره می کنید. با اجرای دستور زیر آن دیرکتوری را ایجاد کنید:
⦁ $ mkdir ~/caddy

به آن بروید:
⦁ $ cd ~/caddy

کد منبع را برای اجرا و شخصی سازی Caddy در فایلی به نام caddy.go ذخیره خواهید کرد. با استفاده از دستور زیر آن را ایجاد کنید:
⦁ $ nano caddy.go

خطوط زیر را اضافه کنید:
~/caddy/caddy.go
package main

import (
“github.com/caddyserver/caddy/caddy/caddymain”
)

func main() {
// caddymain.EnableTelemetry = false
caddymain.Run()
}
این کد Caddy را مستقیماً از Github ) با استفاده از Git) وارد می کند و آن را از تابع main ورودی شروع می کند. اگر می خواهید تله متری را فعال کنید ، خط caddymain.EnableTelemetry را لغو اعتبار کنید و مقدار را روی true تنظیم کنید. وقتی کارتان تمام شد ، فایل را ذخیره کنید و ببندید.
برای اینکه caddy.go بتواند از متعلقات وارد شده استفاده کند ، باید آن را به عنوان یک ماژول معرفی کنید:
⦁ $ go mod init caddy

Output
go: creating new go.mod: module caddy

در این مرحله ، قصد دارید نسخه جدید Caddy را از طریق کد منبع فوق با اجرای دستور زیر بسازید:
⦁ $ go install

خروجی بسیار زیادی وجود خواهد داشت ، و جزئیات مربوط به کتابخانه هایی که Go به عنوان متعلقات لازم برای کامپایل کردن دانلود کرده است ، را نشان میدهند. عملکرد اجرایی تحت $GOPATH/bin ذخیره می شود ، همانطور که در پیش نیازها توضیح داده شده است.
پس از اتمام ، سعی کنید Caddy را اجرا کنید:
⦁ $ caddy

خروجی مشابه زیر را مشاهده خواهید کرد:
Output
Activating privacy features… done.

Serving HTTP on port 2015
http://:2015

WARNING: File descriptor limit 1024 is too low for production servers. At least 8192 is recommended. Fix with `ulimit -n 8192`.

این بدان معناست که Caddy با موفقیت شروع به کار کرده و روی پورت 2015 نیز موجود است. می توانید پیام هشدار را نادیده بگیرید ، زیرا این محدوده در مراحل بعدی و بدون مداخله شما تنظیم می شود. برای خروج ، CTRL + C را فشار دهید.
اکنون Caddy را ساخته و اجرا کرده اید. در مرحله بعدی ، Caddy را به عنوان یک سرویس نصب خواهید کرد تا به طور خودکار از بوت شروع شود ، و سپس تنظیمات مالکیت و مجوزهای آن را انجام میدهید تا از امنیت سرور مجازی اطمینان حاصل شود.
مرحله 2 – نصب Caddy
اکنون که تأیید کرده اید که قادر به ساخت و اجرای Caddy هستید ، وقت آن است که یک سرویس سیستمی را پیکربندی کنید تا بتوانید Caddy را به طور خودکار در هنگام شروع کار سیستم راه اندازی کنید. برای کسب اطلاعات بیشتر در مورد systemd ، به آموزش Systemd Essentials ما مراجعه کنید.
برای شروع ، binary caddy را به / usr / local / bin منتقل کنید ، که مکان استاندارد برای باینری هایی است که توسط مدیر بسته Ubuntu مدیریت نمی شوند و کلید کار سیستم نیستند:
⦁ $ sudo mv $GOPATH/bin/caddy /usr/local/bin/

سپس ، مالکیت باینری Caddy را به کاربر اصلی تغییر دهید:
⦁ $ sudo chown root:root /usr/local/bin/caddy

این کار باعث جلوگیری از تغییر سایر حسابهای اجرایی می شود. با این حال ، حتی اگر کاربر اصلی دارای Caddy باشد ، توصیه می شود آن را فقط با استفاده از سایر حساب های غیر ریشه موجود در سیستم اجرا کنید. این کار اطمینان می دهد که در صورت به خطر افتادن Caddy (یا هر برنامه دیگر) ، حمله کننده قادر نخواهد بود که باینری را تغییر دهد یا دستورات را به عنوان ریشه اجرا کند.
سپس ، مجوزهای فایل باینری را روی 755 تنظیم کنید – که به root مجوزهای کامل خواندن / نوشتن / اجرای فایل را می دهد ، در حالی که سایر کاربران فقط قادر به خواندن و اجرای آن هستند:
⦁ $ sudo chmod 755 /usr/local/bin/caddy

از آنجا که فرآیند Caddy به صورت root اجرا نمی شود ، لینوکس مانع از اتصال آن به پورت های 80 و 443 (به ترتیب پورت های استاندارد برای HTTP و HTTPS) می شود ، زیرا اینها عملیات امتیازی هستند. برای اینکه به راحتی در دامنه خود قابل دسترسی باشید ، بسته به پروتکل ، Caddy باید به یکی از این پورت ها متصل شود. در غیر اینصورت ، برای مشاهده محتویات ارائه شده ، باید شماره پورت خاصی را به URL دامنه در مرورگر خود اضافه کنید.
برای اینکه Caddy بدون اتصال به عنوان root به پورت های پایین متصل شود ، دستور زیر را اجرا کنید:
⦁ $ sudo setcap ‘cap_net_bind_service=+ep’ /usr/local/bin/caddy

ابزار setcap قابلیت های فایل را تنظیم می کند. در این دستور قابلیت CAP_NET_BIND_SERVICE را به باینری Caddy اختصاص می دهد ، که به یک دستور اجرایی اجازه می دهد تا به درگاه پایین تر از 1024 وصل شوند.
اکنون تنظیم باینری Caddy به پایان رسیده است و آماده نوشتن پیکربندی Caddy هستید. با اجرای دستور زیر دایرکتوری ایجاد کنید که فایل های پیکربندی Caddy را ذخیره کنید:
⦁ $ sudo mkdir /etc/caddy

سپس ، مجوزهای صحیح کاربر و گروه را برای آن تنظیم کنید:
⦁ $ sudo chown -R root:www-data /etc/caddy

تنظیم کاربر به عنوان root و گروه به عنوان www-data تضمین می کند که Caddy دسترسی خواندن و نوشتن به پوشه )از طریق گروه www-data ( را خواهد داشت و فقط حساب superuser از همان حقوق خواندن و تغییر برخوردار است. www-data کاربر و گروه پیش فرض سرور مجازی های وب در اوبونتو است.
در مرحله بعد ، مجوز TLS اتوماتیک را که از Let’s Encrypt تهیه می کند ، فعال خواهید کرد. برای تهیه آن ، دایرکتوری ایجاد کنید تا هرگونه گواهی TLS را که Caddy به دست خواهد آورد در آن ذخیره کنید و همان قوانین مالکیت مشابه دیرکتوری / etc / caddy ، را به آن بدهید:
⦁ $ sudo mkdir /etc/ssl/caddy

⦁ $ sudo chown -R root:www-data /etc/ssl/caddy

caddy باید بتواند گواهینامه هایی را در این دیرکتوری بنویسد و از آن بخواند تا درخواست ها را رمزگذاری کند. در همین راستا ، مجوزهای مربوط به دیرکتوری / etc / ssl / caddy را تغییر دهید تا فقط برای root و www-data در دسترس باشد:
⦁ $ sudo chmod 0770 /etc/ssl/caddy

سپس ، دایرکتوری ایجاد کنید تا فایل هایی که Caddy در آن میزبان خواهد بود را ذخیره کنید:
⦁ $ sudo mkdir /var/www

سپس ، مالک و گروه پوشه را روی www-data تنظیم کنید:
⦁ $ sudo chown www-data:www-data /var/www

Caddy پیکربندی خود را از فایلی به نام Caddyfile که تحت / etc / caddy ذخیره شده است ، می خواند. با اجرا دستور زیر، فایل را بر روی دیسک ایجاد کنید:
⦁ $ sudo touch /etc/caddy/Caddyfile

برای نصب سرویس Caddy ، فایل واحد systemd را از منبع Caddy Github روی / etc / systemd / system دانلود کنید:
⦁ $ sudo sh -c ‘curl https://raw.githubusercontent.com/caddyserver/caddy/master/dist/init/linux-systemd/caddy.service > /etc/systemd/system/caddy.service’

مجوزهای فایل سرویس را تغییر دهید تا فقط توسط مالک آن ، یعنی root قابل تغییر باشد:
⦁ $ sudo chmod 644 /etc/systemd/system/caddy.service

سپس سیستم را مجدد لود کنید تا سرویس Caddy را شناسایی کند:
⦁ $ sudo systemctl daemon-reload

با اجرای systemctl status بررسی کنید که systemd سرویس Caddy را شناسایی کرده است:
⦁ $ sudo systemctl status caddy

خروجی مشابه زیر را مشاهده میکنید:
Output
● caddy.service – Caddy HTTP/2 web server
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: e
Active: inactive (dead)
Docs: https://caddyserver.com/docs

اگر همین خروجی را مشاهده می کنید ، سرویس جدید توسط systemd به درستی تشخیص داده شده است.
به عنوان بخشی از پیش نیاز اولیه راه اندازی سرور مجازی ، ufw ، فایروال کامپایل نشده و اتصالات SSH مجاز را فعال کنید. برای اینکه Caddy بتواند از طریق سرور مجازی خود ترافیک HTTP و HTTPS را سرویس دهی کند ، باید با اجرای دستور زیر در ufw به آنها اجازه دهید:
⦁ $ sudo ufw allow proto tcp from any to any port 80,443

خروجی مشابه زیر خواهد بود:
Output
Rule added
Rule added (v6)

از ufw status برای بررسی کارکرد تغییرات خود استفاده کنید:
⦁ $ sudo ufw status

خروجی زیر را مشاهده خواهید کرد:
Output
Status: active

To Action From
— —— —-
OpenSSH ALLOW Anywhere
80,443/tcp ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80,443/tcp (v6) ALLOW Anywhere (v6)

نصب شما در Caddy اکنون کامل است ، اما پیکربندی نشده است که به هر چیزی سرویس دهد. در مرحله بعدی ، Caddy را برای ارائه فایل از فهرست / var / www پیکربندی می کنید.
مرحله 3 – پیکربندی Caddy
در این بخش ، پیکربندی اصلی Caddy را برای ارائه فایل های استاتیک از سرور مجازی خود می نویسید.
با ایجاد یک فایل HTML پایه در / var / www با نام index.html شروع کنید:
⦁ $ sudo nano /var/www/index.html

خطوط زیر را اضافه کنید:
/var/www/index.html
<!DOCTYPE html>
<html>
<head>
<title>Hello from Caddy!</title>
</head>
<body>
<h1 style=”font-family: sans-serif”>This page is being served via Caddy</h1>
</body>
</html>

هنگامی که این فایل در یک مرورگر وب نمایش داده می شود ، عنوانی با متن This page is being served via Caddy نمایش داده می شود. فایل را ذخیره کنید و ببندید.
فایل پیکربندی Caddyfile را که قبلاً ایجاد کرده اید برای ویرایش باز کنید:
⦁ $ sudo nano /etc/caddy/Caddyfile

خطوط زیر را اضافه کنید:
/etc/caddy/Caddyfile
:80 {
root /var/www
gzip
}

این یک پیکربندی اولیه Caddy است ، و اعلام می کند که پورت 80 سرور مجازی شما باید با فایل هایی از / var / www سرویس دهی شود و با استفاده از gzip فشرده شود تا دفعات لود صفحه در سمت کلاینت کاهش یابد.
در اکثر موارد ، Caddy به شما امکان می دهد بخشنامه های پیکربندی را بیشتر تنظیم کنید. به عنوان مثال ، می توانید با بسط دادن دستورالعمل با بریس های موج دار و لیست دستورالعمل های تحت آن، فشرده سازی gzip را فقط به فایل های HTML و PHP محدود کنید و سطح فشرده سازی را روی 6 تنظیم کنید (1 پایین ترین و 9 بالاترین است):
/etc/caddy/Caddyfile
:80 {
root /var/www
gzip {
ext .html .htm .php
level 6
}
}

پس از اتمام کار ، فایل را ذخیره کنید و ببندید.
Caddy تعداد زیادی دستورالعمل مختلف برای بسیاری از موارد استفاده دارد. به عنوان مثال ، دستورالعمل fastcgi می تواند برای فعال کردن PHP مفید باشد. از دستورالعملmarkdown می توان برای تبدیل خودکار فایل های Markdown به HTML قبل از ارائه آنها استفاده کرد ، که می تواند برای ایجاد یک وبلاگ ساده مفید باشد.
برای آزمایش اینکه همه چیز به درستی کار می کند ، Caddy را شروع کنید:
⦁ $ sudo systemctl start caddy

سپس ، برای پیدا کردن اطلاعات در مورد وضعیت سرویس دهی Caddy ، systemctl status را اجرا کنید:
⦁ $ sudo systemctl status caddy

خروجی زیر را مشاهده خواهید کرد:
Output
● caddy.service – Caddy HTTP/2 web server
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2020-03-12 11:17:49 UTC; 11s ago
Docs: https://caddyserver.com/docs
Main PID: 3893 (caddy)
Tasks: 7 (limit: 1152)
CGroup: /system.slice/caddy.service
└─3893 /usr/local/bin/caddy -log stdout -log-timestamps=false -agree=true -conf=/etc/caddy/Caddyfile -root=/var/tmp

Mar 12 11:17:49 caddy-article-update systemd[1]: Started Caddy HTTP/2 web server.
Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO] Caddy version: v1.0.5
Mar 12 11:17:49 caddy-article-update caddy[3893]: Activating privacy features… done.
Mar 12 11:17:49 caddy-article-update caddy[3893]: Serving HTTP on port 80
Mar 12 11:17:49 caddy-article-update caddy[3893]: http://
Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO] Serving http://
Mar 12 11:17:49 caddy-article-update caddy[3893]: [INFO][cache:0xc00007a7d0] Started certificate maintenance routine
Mar 12 11:17:49 caddy-article-update caddy[3893]: [WARNING] Sending telemetry (attempt 1): Post “https://telemetry.caddyserver.com/v1/update/6a8159c4-3427-42
Mar 12 11:17:57 caddy-article-update caddy[3893]: [WARNING] Sending telemetry (attempt 2): Post “https://telemetry.caddyserver.com/v1/update/6a8159c4-3427-42

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

اکنون Caddy را برای ارائه فایلهای ثابت از سرور مجازی خود پیکربندی کرده اید. در مرحله بعد ، عملکرد Caddy را با استفاده از افزونه ها گسترش می دهید.
مرحله 4 – استفاده از افزونه ها
افزونه ها راهی برای تغییر و گسترش عملکرد Caddy ارائه می دهند. به طور کلی ، آنها مطابق مورد استفاده شما ، دستورالعمل های پیکربندی بیشتری را برای استفاده ارائه می دهند. در این بخش با نصب افزونه minify افزونه های اضافی را حذف کرده و از آنها استفاده خواهید کرد، که فضای سفید را حذف کرده و کدی را که برای کلاینت ارسال می شود ساماندهی می کند ، که باعث کاهش بیشتر اثرات قبلی و دفعات لود می شود.
منبع GitHub افزونه minify،  hacdias/caddy-minify میباشد.
با کد منبعی که در مرحله اول ایجاد کردید به دیرکتوری بروید:
⦁ $ cd ~/caddy

برای اضافه کردن افزونه به Caddy ، باید آن را در فایل caddy.go که قبلاً برای ساخت Caddy استفاده کرده اید وارد کنید. caddy.go را برای ویرایش باز کنید:
⦁ $ nano caddy.go

افزونه minify را با اضافه کردن خط هایلایت شده مانند زیر وارد کنید:
~/caddy/caddy.go
package main

import (
“github.com/caddyserver/caddy/caddy/caddymain”

_ “github.com/hacdias/caddy-minify”
)

func main() {
// caddymain.EnableTelemetry = false
caddymain.Run()
}

فایل را ذخیره کنید و ببندید.
ممکن است برخی از افزونه ها به اندکی تنظیمات جزئی پیکربندی نیاز داشته باشند ، بنابراین حتماً مطالب مربوطه را برای هر نوع نصب مطالعه کنید. می توانید لیستی از افزونه های محبوب را در قسمت سمت چپ مقاله های Caddy ، در زیر افزونه ها پیدا کنید.
هر زمان که افزونه جدیدی اضافه کنید ، باید Caddy را مجدداً بازسازی کنید. دلیل این است که Go یک زبان برنامه نویسی کامپایل شده است ، به این معنی که کد منبع قبل از اجرا به کد دستگاه تبدیل می شود. تغییر شما در اعلان ورود کد منبع را تغییر داده است ، اما تا زمان کامپایل آن روی باینری تأثیر نخواهد گذاشت.
برای کامپایل Caddy از دستور go install استفاده کنید:
⦁ $ go install

پس از اتمام ، باینری ایجاد شده را به / usr / local / bin منتقل کنید و مانند دفعه قبل مجوزهای باینری را تنظیم کنید. برای اطمینان از کارایی و امنیت آن ، باید هر بار که Caddy را بازسازی کنید ، این مراحل را انجام دهید:
⦁ $ sudo mv $GOPATH/bin/caddy /usr/local/bin/

⦁ $ sudo chown root:root /usr/local/bin/caddy

⦁ $ sudo chmod 755 /usr/local/bin/caddy

⦁ $ sudo setcap ‘cap_net_bind_service=+ep’ /usr/local/bin/caddy

برای شروع استفاده از افزونه minify ، لازم است بخشنامه minify را به Caddyfile خود اضافه کنید. آن را برای ویرایش باز کنید:
⦁ $ sudo nano /etc/caddy/Caddyfile

افزونه را با افزودن خط زیر به بلوک پیکربندی فعال کنید:
/etc/caddy/Caddyfile
:80 {
root /var/www
gzip
minify
}

اکنون ، سرور مجازی خود را با استفاده از systemctl مجدداً راه اندازی کنید:
⦁ $ sudo systemctl restart caddy

اکنون Caddy در حال اجراست و فایل های ارائه شده از جمله فایل index.html را که قبلاً ایجاد کرده اید ، کمینه می کند. با واکشی مطالب دامنه خود با استفاده از curl ، می توانید “حداقل سازی” را در کار مشاهده کنید:
⦁ $ curl http://your_domain

خروجی زیر را مشاهده خواهید کرد. توجه کنید که فضای سفید غیر ضروری حذف شده است ، نشان می دهد که افزونه minify در حال کار است.
Output
<!doctype html><title>Hello from Caddy!</title><h1 style=font-family:sans-serif>This page is being served via Caddy</h1>

در این مرحله یاد گرفتید که چگونه Caddy را با افزونه ها گسترش دهید. در مرحله بعد ، شما با نصب افزونه tls.dns.vpsgol ، HTTPS را فعال می کنید.
مرحله 5 – فعال کردن خودکار TLS با Let’s Encrypt
در این بخش ، صدور گواهینامه Let’s Encrypt خودکار را با استفاده از رکوردهای TXT DNS برای تأیید فعال می کنید.
برای تأیید صحت استفاده از رکوردهای TXT DNS ، افزونه ای برای رابط با vpsgol API با نام tls.dns.vpsgol نصب خواهید کرد. روش نصب آن تقریباً با نحوه نصب افزونه minify در مرحله قبل یکسان است. برای شروع ،caddy.go را باز کنید:
⦁ $ nano caddy.go

منبع افزونه را به ورودی ها اضافه کنید:
~/caddy/caddy.go
package main

import (
“github.com/caddyserver/caddy/caddy/caddymain”

_ “github.com/hacdias/caddy-minify”

_ “github.com/caddyserver/dnsproviders/vpsgol”
)

func main() {
// caddymain.EnableTelemetry = false
caddymain.Run()
}

با اجرای دستور زیر آن را کامپایل کنید:
⦁ $ go install

اطمینان حاصل کنید که Caddy از طریق systemctl متوقف شده است ، سپس نصب افزونه را با کپی کردن باینری تازه ساخته Caddy پایان دهید و یکبار دیگر مالکیت و مجوزهای خود را تنظیم کنید:
⦁ $ sudo systemctl stop caddy

⦁ $ sudo mv $GOPATH/bin/caddy /usr/local/bin/

⦁ $ sudo chown root:root /usr/local/bin/caddy

⦁ $ sudo chmod 755 /usr/local/bin/caddy

⦁ $ sudo setcap ‘cap_net_bind_service=+ep’ /usr/local/bin/caddy

در مرحله بعدی ، Caddy را تنظیم کنید تا با API vpsgol برای تنظیم رکوردهای DNS کار کند. برای پیکربندی DNS vpsgol ، Caddy باید به این نشانه به عنوان یک متغیر محیط دسترسی پیدا کند ، بنابراین باید فایل واحد سیستم شده آن را ویرایش کنید:
⦁ $ sudo nano /etc/systemd/system/caddy.service

خطی که با Environment= در بخش [Service] شروع میشود را پیدا کنید. این خط متغیرهای محیطی را که باید به فرآیند Caddy منتقل شوند ، تعریف می کند. فضایی را در انتهای این خط اضافه کنید ، سپس یک متغیر DO_AUTH_TOKEN و به دنبال آن نشانه تازه ایجاد شده را اضافه کنید:
/etc/systemd/system/caddy.service
[Service]
Restart=on-abnormal

; User and group the process will run as.
User=www-data
Group=www-data

; Letsencrypt-issued certificates will be written to this directory.
Environment=CADDYPATH=/etc/ssl/caddy DO_AUTH_TOKEN=your_token_here

این فایل را ذخیره کنید و ببندید ، سپس systemd daemon را مانند قبل لود کنید تا اطمینان حاصل شود که پیکربندی به روز شده است:
⦁ $ sudo systemctl daemon-reload

systemctl status را اجرا کنید تا بررسی کنید که تغییرات پیکربندی شما درست است:
⦁ $ sudo systemctl status caddy

خروجی باید به این شکل باشد:
Output
● caddy.service – Caddy HTTP/2 web server
Loaded: loaded (/etc/systemd/system/caddy.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: https://caddyserver.com/docs

باید چند تغییر جزئی در Caddyfile خود ایجاد کنید ، بنابراین آن را برای ویرایش باز کنید:
⦁ $ sudo nano /etc/caddy/Caddyfile

خطوط هایلایت شده را به Caddyfile اضافه کنید ، مطمئن شوید که your_domain را با دامنه خود جایگزین (به جای فقط پورت: 80) و gzip را کامنت میکنید:
/etc/caddy/Caddyfile
your_domain {
root /var/www
#gzip
minify
tls {
dns vpsgol
}
}

استفاده از یک دامنه به جای فقط یک درگاه برای نام میزبان باعث خواهد شد که Caddy درخواستهایی را از طریق HTTPS ارائه دهد. دستورالعمل tls رفتار Caddy را هنگام استفاده از TLS پیکربندی می کند ، و dns subdirective مشخص می کند که Caddy باید از سیستم DNS-01 استفاده کند نه HTTP-01.
با این کار وب سایت شما آماده به کارگیری است. Caddy را با systemctl شروع کرده و سپس آن را فعال کنید ، تا روی بوت اجرا شود:
⦁ $ sudo systemctl start caddy

⦁ $ sudo systemctl enable caddy
اگر در دامنه خود جستجو کنید ، با همان پیام نشان داده شده به صورت خودکار به HTTPS هدایت می شوید.
نصب شما در Caddy اکنون کامل و ایمن است و می توانید با توجه به مورد استفاده خود ، سفارشی سازی کنید.
اگر می خواهید Caddy را با انتشار نسخه جدید به روز کنید ، باید فایل go.mod (ذخیره شده در همان دیرکتوری) را به روز کنید ، که اینگونه خواهد بود:
~/caddy/go.mod
module caddy

go 1.14

require (
github.com/caddyserver/caddy v1.0.5
github.com/caddyserver/dnsproviders v0.4.0
github.com/hacdias/caddy-minify v1.0.2
)

قسمت هایلایت شده ، نسخه Caddy مورد استفاده شماست. هنگامی که نسخه جدیدی در Github منتشر شد (به صفحه برچسب های انتشار مراجعه کنید) ، می توانید نسخه موجود در go.mod را با آن جایگزین کرده و با توجه به دو مرحله اول ،Caddy را کامپایل کنید. همین کار را می توانید برای همه افزونه های وارد شده انجام دهید.
نتیجه
اکنون Caddy روی سرور مجازی شما نصب و پیکربندی شده است ، و در صفحات ایستا در دامنه مورد نظر شما ، با گواهی نامه Let’s Encrypt TLS رایگان، ایمن شده است.
قدم درست بعدی این است که راهی بیابید که از انتشار نسخه های جدید Caddy اطلاع پیدا کنید. به عنوان مثال ، می توانید از Feed Atom برای نسخه های Caddy یا سرویس اختصاصی مانند  dependencies.io استفاده کنید.
شما می توانید برای اطلاعات بیشتر در مورد پیکربندی Caddy، مطالب Caddy را جستجو کنید.

 

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

در این آموزش با استفاده از SuperAgent یک اسلایدر تصویر با تصاویر گرفته شده از اینستاگرام ایجاد می کنید. کتابخانه های مختلف بسیاری وجود دارد که می تواند برای برقراری تماس Ajax مورد استفاده قرار گیرند. Fetch API ، Axios ، Request ، jQuery $ .ajax و SuperAgent برخی از محبوب ترین راه ها برای واکشی داده ها از API هستند.
به طور خاص ، با استفاده از چارچوب جاوااسکریپت  [reactjs](reactjs.org/) ، یک اسلایدر تصویر ایجاد خواهید کرد. که تصاویر اینستاگرامی که با استفاده از کتابخانه درخواست SuperAgent Ajax گرفته شده اند را نمایش میدهد.
پیش نیازها
برای دنبال کردن این آموزش ، به nodej هایی که به صورت محلی بر روی رایانه نصب شده اند ، نیاز دارید. همچنین باید برنامه Creat React را نصب کنید.
پس از نصب این موارد ، با تنظیم فضای کاری پروژه خود شروع کنید.
راه اندازی پروژه
دستور create-react-app روشی مناسب برای راه‌اندازی پروژه ما است. این دستور به پیکربندی متعلقات کمک می کند و به شما امکان می دهد تا روی سمت React موارد متمرکز شوید.
با اجرای این دستور در ترمینال خود شروع کنید:
$ create-react-app image_slider

نتیجه یک پوشه پروژه به نام image_slider خواهد بود (برای استفاده از یک نام دیگر ، به سادگی image_slider را در ترمینال با نام دلخواه خود جایگزین کنید). پوشه پروژه حاوی فایل های مهمی از جمله pack.json ، node_modules و پوشه src ما است که در آن فایلهای برنامه ما قرار دارند.
در ترمینال خود ، برنامه را شروع کنید تا با اجرای دستور زیر مطمئن شوید که همه چیز به طور کامل کار می کند:
$ yarn start

این دستور باید URL http: // localhost: 3000 / را در مرورگر ما باز کند. هر تغییری که در فایل های React ایجاد کنید باعث می شود صفحه به طور خودکار در مرورگر مجدد لود انجام شود.
تنظیم React
تمام متعلقات react که نیاز داریم، در حال حاضر برای ما نصب شده اند. برای این آموزش فقط یک فایل در پروژه ویرایش می شود. در صورت تمایل می توانید اجزای مختلفی را که ایجاد می کنید به صورت جداگانه در فایل های مجزا جدا نمایید. در صورت انجام این کار ، اطمینان حاصل کنید که آن ها را به درستی export و import میکنید.
برای شروع ، App.js را ویرایش کنید و برچسب <p> </p> را حذف کنید چون لازم نیست، مگر اینکه بخواهید یک مقدمه کوچک برای برنامه خود بنویسید. توجه کنید که هنگام ایجاد تغییر در فایل ، مرورگر به طور خودکار مجدد لود می شود و آن را ذخیره می کند.
در این مرحله ، فایل App.js شما باید به این شکل باشد.
import React, { Component } from ‘react’;
import logo from ‘./logo.svg’;
import ‘./App.css’;

class App extends Component {
render() {
return (
<div className=”App”>
<header className=”App-header”>
<h1 className=”App-title”>My Instagram</h1>
</header>
</div>
);
}
}

export default App;

تنظیم SuperAgent
همانطور که در مستندات آن مشخص شده است ، SuperAgent یک API ajax پیشرونده کم حجم است که برای انعطاف پذیری ، خوانایی و انحنای یادگیری کم ساخته شده است.
یک درخواست انجام شده باید از روش یا عملی برخوردار باشد که شما می خواهید انجام دهید و به دنبال آن یک تابع .then () یا .end () برای انجام عملیات بر روی / با پاسخ باشد. برای کنترل خطا می توانید یک روش .catch داشته باشید اما اختیاری است.
از این رو درخواست GET چنین به نظر می رسد:
request
.get(‘/getsomedata’)
.then((res) => {
console.log(res)
}
.catch((err) => {
console.log(err)
}

با نصب superAgent شروع کنید.yarn add supertest را روی ترمینال اجرا کنید. در مرحله بعد ، آن را در فایل App.js خود وارد کرده و آن را ویرایش کنید تا مانند زیر باشد:
import React, { Component } from ‘react’;
import request from ‘superagent’;
import logo from ‘./logo.svg’;
import ‘./App.css’;

class App extends Component {
constructor(props) {
super(props);
this.state = {
photos: []
}
}

componentWillMount() {
this.fetchPhotos();
}

fetchPhotos() {
request
.get(‘https://api.instagram.com/v1/users/self/media/recent/?access_token=ACCESS-TOKEN’)
.then((res) => {
this.setState({
photos: res.body.data
})
})
}

render() {
return (
<div className=”App”>
<header className=”App-header”>
<img src={logo} className=”App-logo” alt=”logo” />
<h1 className=”App-title”>Welcome to My Instagram</h1>
</header>
<div>
{console.log(this.state.photos)}
</div>
</div>
);
}
}

export default App;

عملکردی به نام fetchPhotos مسئول واکشی داده ها از اینستاگرام است. هنگامی که داده ها را دریافت می کند ، در آرایه ای به نام photos  ذخیره می کند. تابع fetchPhotos درست قبل از سوار شدن کامپوننت با استفاده از computerWillMount فراخوانی می شود. فعلاً ، ما آرایه را وارد می کنیم تا ببینیم داده ها را گرفته ایم یا نه. هنوز هیچ تأیید هویتی انجام نداده ایم بنابراین نباید قادر به دیدن هر چیزی باشیم ، در عوض باید یک پیام خطا به ما بدهد.
API اینستاگرام
API اینستاگرام عکسهایی را که ایجاد می کنیم برای نمایش با اسلایدر ارائه می دهد. از آنجا که ما فقط در سمت کلاینت کار می کنیم و روی نحوه استفاده از API اینستاگرام تمرکز نداریم ، لازم نیست که مراحل تأیید اعتبار را طی کنیم تا نشانه دسترسی خود را دریافت کنیم. با این حال ، اگر می خواهید در مورد نحوه استفاده از API اینستاگرام اطلاعات بیشتری کسب کنید ، می توانید مستندات آنها را مشاهده کنید.
می توانید با استفاده از http://instagram.pixelunion.net نشانه تولید کنید. برای جلوگیری از اشتراک گذاری ، حتماً این فایل را در یک فایل .env نگه دارید.
ایجاد اسلایدر تصویر
نمایش تصاویر
عکس هایی که گرفته ایم در یک مجموعه قرار دارند اما باید هرکدام از آنها را به عنوان یک عکس واحد نمایش دهیم. بنابراین ، نیاز به نوشتن یک تابع map برای حلقه زدن در آرایه و برگرداندن عکس های خود داریم که همگی در صفحه ما نمایش داده می شوند.
قبل از افزودن عکس ها به صفحه خود، می توانیم با اضافه کردن این خط در داخل تابع نقشه {console.log(photo)} عکس را روی کنسول مرورگر وارد کنیم. این به ما آبجکتی می دهد که شامل چندین ویژگی است ، چند عکس ، کپشن ، تاریخ ایجاد شده ، لایک ها ، نظرات ، افرادی که بر روی عکس تگ شده اند و غیره.
تابع جدید ما در div جدیدی تحت هدر قرار خواهد گرفت و باید به صورت زیر باشد:
<div>
{this.state.photos.map((photo, key) => {
return (
<div key={photo.id}>
<img src={photo.images.standard_resolution.url} alt={photo.caption}/>
</div>
)
})}
</div>

همچنین این اسلایدر باید کپشن تصاویر را در پایین عکس ها نشان دهد. برای انجام این کار ، div  دیگری زیر برچسب تصویر اضافه کنید. سرانجام برای جلوگیری از بروز هرگونه خطایی در صورت عدم وجود کپشن عکس در اینستاگرام ، شرطی را اضافه کنید که یک رشته خالی را برگرداند:
<div style={{width:’600px’, margin: ’24px auto’, fontStyle: ‘italic’}}>
{photo.caption !== null ? photo.caption.text : ”}
</div>

اضافه کردن فلش های اسلایدر
تاکنون تمامی عکس های دریافت شده از API اینستاگرام با هم در همان صفحه نمایش داده می شوند. مرحله بعدی نمایش هر عکس به طور جداگانه و افزودن پیمایش از یک عکس به عکس دیگر است.
فلش ها یک روش مفید برای حرکت در اسلایدر هستند. برای این قابلیت ، دو فلش را به عنوان اجزای جداگانه مانند این در نظر بگیرید:
const BackArrow = () => (
<div style={{fontSize: ‘2em’, marginRight: ’12px’}}>
<i className=”fa fa-angle-left fa-2x” aria-hidden=”true”></i>
</div>
)

const NextArrow = () => (
<div style={{fontSize: ‘2em’, marginLeft: ’12px’}}>
<i className=”fa fa-angle-right fa-2x” aria-hidden=”true”></i>
</div>
)

Create-react-app فاقد اسکریپتی است که برای استفاده از آیکنهای بسیار جذاب نیاز داریم ، بنابراین باید yarn add font-awesome را اجرا کنید تا آن را به پروژه اضافه کنید و سپس ‘font-awesome / css / font-awesome.css’ را وارد پروژه کنید تا آیکون های ما را شامل شود.
اضافه کردن شمارش اسلایدها به وضعیت
اکنون همه مؤلفه های مورد نیاز خود را داریم اما فلش ها کاربردی نیستند و تمام عکس های ما هنوز در صفحه قابل مشاهده اند.
برای پیگیری اینکه روی کدام عکس قرار داریم ، slideCount را به حالت اضافه کنید. slideCount به سادگی یک عدد صحیح خواهد بود که در ابتدا با 0 تنظیم می شود و هر بار که روی پیکان بعدی کلیک می کنیم افزایش می یابد و وقتی روی پیکان قبلی کلیک می کنیم کاهش می یابد.
constructor(props) {
super(props);
this.state = {
photos: [],
slideCount: 0
}
}

برای نمایش یک عکس واحد در هر زمان ، فهرست عکس را بررسی کنید و عکسی را که با تعداد اسلایدها مطابقت دارد نمایش دهید. این باید در عملکرد نقشه ما اینگونه باشد:
<div className=”App”>
<header className=”App-header”>
<img src={logo} className=”App-logo” alt=”logo” />
<h1 className=”App-title”>Welcome to My Instagram</h1>
</header>
<div style={{display: ‘flex’, alignItems: ‘center’, justifyContent: ‘center’,marginTop: ’30px’}}>
{this.state.slideCount !== 0 ? <BackArrow previousImage={this.previousImage}/> : ”}
{this.state.photos.map((photo, key) => {
if (this.state.photos.indexOf(photo) === this.state.slideCount) {
return (
<div key={photo.id} style={{margin: ‘0 auto’}}>
<img src={photo.images.standard_resolution.url} alt=”/>
<div style={{width:’600px’, margin: ’24px auto’, fontStyle: ‘italic’}}>
{photo.caption !== null ? photo.caption.text : ”}
</div>
</div>
)
}
return ”
})}
{this.state.slideCount !== (this.state.photos.length – 1) ? <NextArrow nextImage={this.nextImage}/> : ”} </div>

وقتی مؤلفه BackArrow خود را فراخوانی می کنیم ، یک عبارت if وارد می کنیم زیرا نمی خواهیم وقتی در اولین عکس هستیم ، آن را ببینیم. به همین ترتیب ، وقتی آخرین عکس را می بینیم ، نمی خواهیم NextArrow نمایش داده شود.
در این مرحله از آنجا که حالت ما 0 است ، مرورگر باید یک تصویر (آخرین تصویر در حساب اینستاگرام) و فلش next  را نمایش دهد.
کاربردی کردن فلش ها
برای کاربردی کردن فلش ها ، دو تابع ایجاد کنید که عکس فعلی که در حال مشاهده است را تغییر دهد. این توابع عدد وضعیت را افزایش یا کاهش میدهند تا عکس در حال نمایش را تغییر دهند:
nextImage() {
this.setState({ slideCount: this.state.slideCount + 1 })
}

previousImage() {
this.setState({ slideCount: this.state.slideCount – 1 })
}

همچنین لازم است یک کنترل کننده رویداد را اضافه کنیم که هر زمان که روی فلش ها کلیک شد ، این توابع را فراخوانی کند. رویداد onClick را به 2 مؤلفه فلشی که ایجاد کردیم اضافه کنید.
const BackArrow = (props) => (
<div onClick={props.previousImage} style={{fontSize: ‘2em’, marginRight: ’12px’}}>
<i className=”fa fa-angle-left fa-2x” aria-hidden=”true”></i>
</div>
)

const NextArrow = (props) => (
<div onClick={props.nextImage} style={{fontSize: ‘2em’, marginLeft: ’12px’}}>
<i className=”fa fa-angle-right fa-2x” aria-hidden=”true”></i>
</div>
)

به یاد داشته باشید که 2 عملکرد را به عنوان props از مؤلفه parent عبور دهید.
<BackArrow previousImage={this.previousImage}/>
<NextArrow nextImage={this.nextImage}/>

برای دسترسی به توابع ، لازم است که توابع را به نمونه مولفه (this) متصل کنیم .
this.nextImage = this.nextImage.bind(this);
this.previousImage = this.previousImage.bind(this);

در این مرحله ، باید یک اسلایدر تصویر کاملاً کاربردی داشته باشید.
نتیجه
در این آموزش یاد گرفتید که چگونه از SuperAgent به عنوان یک کتابخانه درخواست در ترکیب با React برای ساخت اسلایدر تصویر تعاملی استفاده کنید. با استفاده از این مجموعه ابزارها ، می توانید اسلایدر را نیز گسترش دهید تا قابلیت های دیگری مانند ایجاد URL های مختلف سفارشی و استفاده از روش های post ، delete  و put  برای اضافه کردن ، حذف و ویرایش تصاویر یا کپشن ها را شامل شود.

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi
  • ۰
  • ۰

در طراحی تجربه کاربر ، ریزتعاملات لحظه های کوچکی از بازخورد هستند که به کاربر کمک می کند تا یک رابط را دنبال کند. غالباً در طراحی وب سایت ریزتعاملات با انیمیشن ظریف ساخته می شوند.
در این آموزش دکمه دانلود کاربردی با ریزتعاملات ایجاد خواهید کرد. برای اینکه این کار عملی شود ، ما از گذارها و انیمیشن های CSS به همراه کتابخانه انیمیشن کم حجم anime.js و segment.js برای انیمیشن های مسیر SVG استفاده خواهیم کرد.
در پایان آموزش ، دکمه دانلود مانند این را دریافت خواهیم کرد:

طراحی اصلی دکمه دانلود متعلق به Pedro Aquino است و در این عکس Dribbble می توان آن را یافت. کد کامل را می توانید در این مخزن Github پیدا کنید ، و در اینجا صفحه نسخه ی نمایشی آمده است.
مرحله 1 – ساخت ساختار HTML
بیایید کد HTML مورد استفاده را ببینیم:
<!– Button container –>
<div class=”download-button-container”>
<!– The real button –>
<button class=”download-button”>
<span class=”button-text-real hidden”>download</span>
<!– Extra elements to perform the animations –>
<span class=”button-icon”>
<span class=”button-linear-progress”>
<span class=”button-linear-progress-bar”></span>
</span>
<svg class=”button-icon-svg” viewBox=”0 0 60 60″>
<path class=”button-icon-path button-icon-path-square” d=”M 20 40 l 0 -20 l 20 0 l 0 20 Z”></path>
<path class=”button-icon-path button-icon-path-line” d=”M 40 20 l -20 20″></path>
</svg>
</span>
</button>
<!– Extra elements to perform the animations –>
<svg class=”border-svg” width=”240px” height=”100px” viewBox=”0 0 240 100″>
<path class=”border-path hidden” d=”M 40 3.5 a 36.5 36.5 0 0 0 -36.5 36.5 a 36.5 36.5 0 0 0 36.5 36.5 C 70 76.5 90 76.5 120 76.5 S 170 76.5 200 76.5 a 36.5 36.5 0 0 0 36.5 -36.5 a 36.5 36.5 0 0 0 -36.5 -36.5 Z”></path>
</svg>
<span class=”button-text button-text-download”>download</span>
<span class=”button-text button-text-done”>done!</span>
<div class=”button-wave”></div>
<div class=”button-progress-container”>
<svg class=”button-svg”>
<path class=”button-circular-progress” d=”M 50 50 m 0 -32.5 a 32.5 32.5 0 0 1 0 65 a 32.5 32.5 0 0 1 0 -65″></path>
</svg>
<span class=”button-ball”></span>
</div>
</div>

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

مرحله 2 – اضافه کردن سبک ها
با آماده شدن نشانه گذاری ، برای دکمه خود طرحی ایجاد کنید. لطفاً توجه داشته باشید که ما کل صفحه استایل را در اینجا نمی گنجانیم ، بلکه مهمترین بخش ها را آورده ایم. می توانید کل کد را در منبع Github پیدا کنید. برای درک بهتر، کد به طور کامل اظهار نظر شده است.
بیایید متغیرهای SCSS را که تعریف کرده ایم و کلاس ککی برای مخفی کردن عناصر را ببینیم:
// Some variables to use later
$button-width: 300px;
$button-height: 70px;
$button-border: 3px;
$icon-padding: 5px;
$icon-width: $button-height – ($icon-padding * 2);
$ball-width: 18px;

// Helper class to hide elements
.hidden {
visibility: hidden !important;
opacity: 0 !important;
}

سبک های عنصر دکمه واقعی به این شکل هستند:
// Real button styles
.download-button {
position: relative;
display: inline-block;
width: $button-width;
height: $button-height;
background-color: #2C2E2F;
border: none;
box-shadow: 0 0 0 $button-border #02D1FF; // This will be our ‘border’
border-radius: 100px;
cursor: pointer;
transition: 1s width, 0.3s box-shadow;

// Remove the custom behavior in some browsers
&, &:focus {
padding: 0;
outline: none;
}
&::-moz-focus-inner {
border: 0;
}

// Styles for the different states of the button
&:hover, &:active, &:focus {
box-shadow: 0 0 0 $button-border #02D1FF, 0 0 20px $button-border darken(#02D1FF, 20%);
}
}
دکمه ما می تواند در سه حالت مختلف باشد: downloading ، progressing و completed. بنابراین ما سبک های مورد نیاز برای هر ناحیه را با استفاده از ساختار زیر تعریف کرده ایم:
// Button container
.download-button-container {
// …CODE…

// Following are the different states for the button: downloading, progressing and completed
// We have defined the states in the container to have access to all descendants in CSS

// Downloading: The download button has been pressed
&.downloading {
// …CODE…
}

// Progressing: The progress starts
&.progressing {
// …CODE…
}

// Completed: The progress ends
&.completed {
// …CODE…
}
}

یکی دیگر از کد های جالب برای دستیابی به انیمیشن توپ پس از اتمام دانلود، استفاده می شود:
.button-ball {
left: 50%;
transition: none;
// CSS animations for the ball. All of them start at the same time, so we need to take care of delays
animation:
ball-throw-up 0.5s ease-out forwards, // Throw up the ball for 0.5s
ball-throw-down 0.5s 0.5s ease-in forwards, // Wait 0.5 seconds (throw up), and throw down the ball for 0.5s
ball-rubber 1s forwards; // Move the ball like a rubber deformation during 1s (throw up + throw down)
}

// Throw up animation
@keyframes ball-throw-up {
from {
transform: translate(-50%, 17.5px);
}
to {
transform: translate(-50%, -60px);
background-color: #00FF8D;
}
}

// Throw down animation
@keyframes ball-throw-down {
from {
transform: translate(-50%, -60px);
}
to {
transform: translate(-50%, 80px);
}
}

// Rubber animation
@keyframes ball-rubber {
from {
width: $ball-width;
}
25% {
width: $ball-width * 0.75;
}
50% {
width: $ball-width;
}
to {
width: $ball-width / 2;
}
}

تمام سبک های دیگر مورد استفاده را می توان در منبع Github یافت.
مرحله 3 – انیمیشن سازی با Javascript
برای کمک به انیمیشن سازی از هر دو کتابخانه کم حجم anime.js و segment.js استفاده خواهیم کرد.
لطفاً توجه داشته باشید که ما خاطر شفافیت ، برخی اعلامیه های متغیر را در قطعه کد زیر نمی گنجانیم. اگر شک دارید ، منبع Github را بررسی کنید.
در اینجا کد اصلی ما برای ثبت رویدادهای کلیک بر روی button  و اجرای رفتار مورد نظر ما آورده شده است:
// Capture click events
button.addEventListener(‘click’, function () {
if (!completed) { // Don’t do anything if downloading has been completed
if (downloading) { // If it’s downloading, stop the download
stopDownload();
} else { // Start the download
startDownload();
}
}
});

// Start the download
function startDownload() {
// Update variables and CSS classes
downloading = true;
buttonContainer.classList.add(‘downloading’);
animateIcon();
// Update progress after 1s
progressTimer = setTimeout(function () {
buttonContainer.classList.add(‘progressing’);
animateProgress();
}, 1000);
}

// Stop the download
function stopDownload() {
// Update variables and CSS classes
downloading = false;
clearTimeout(progressTimer);
buttonContainer.classList.remove(‘downloading’);
buttonContainer.classList.remove(‘progressing’);
// Stop progress and draw icons back to initial state
stopProgress();
iconLine.draw(0, ‘100%’, 1, {easing: anime.easings[‘easeOutCubic’]});
iconSquare.draw(‘30%’, ‘70%’, 1, {easing: anime.easings[‘easeOutQuad’]});
}

پیشروی انیمیشن در نسخه ی نمایشی واقعی نیست. برای نمونه واقعی ، با داده های پیشرفت واقعی جایگزین خواهند شد. این تابعی است که پیشروی را انجام می دهد:
// Progress animation
function animateProgress() {
// Fake progress animation from 0 to 100%
// This should be replaced with real progress data (real progress percent instead ‘100%’), and maybe called multiple times
circularProgressBar.draw(0, ‘100%’, 2.5, {easing: anime.easings[‘easeInQuart’], update: updateProgress, callback: completedAnimation});
}

سرانجام ، در اینجا قطعه کد استفاده شده برای انجام انیمیشن سازی هنگام اتمام دانلود آورده شده است ، جایی که انیمیشن توپ آغاز می شود و عناصر مسیر را اصلاح می کنیم.
// Animation performed when download has been completed
function completedAnimation() {
// Update variables and CSS classes
completed = true;
buttonContainer.classList.add(‘completed’);
// Wait 1s for the ball animation
setTimeout(function () {
button.classList.add(‘button-hidden’);
ball.classList.add(‘hidden’);
borderPath.classList.remove(‘hidden’);
// Morphing the path to the second shape
var morph = anime({
targets: borderPath,
d: ‘M 40 3.5 a 36.5 36.5 0 0 0 -36.5 36.5 a 36.5 36.5 0 0 0 10.5 26.5 C 35 86.5 90 91.5 120 91.5 S 205 86.5 226 66.5 a 36.5 36.5 0 0 0 10.5 -26.5 a 36.5 36.5 0 0 0 -36.5 -36.5 Z’,
duration: 100,
easing: ‘linear’,
complete: function () {
// Morphing the path back to the original shape with elasticity
morph = anime({
targets: borderPath,
d: ‘M 40 3.5 a 36.5 36.5 0 0 0 -36.5 36.5 a 36.5 36.5 0 0 0 36.5 36.5 C 70 76.5 90 76.5 120 76.5 S 170 76.5 200 76.5 a 36.5 36.5 0 0 0 36.5 -36.5 a 36.5 36.5 0 0 0 -36.5 -36.5 Z’,
duration: 1000,
elasticity: 600,
complete: function () {
// Update variables and CSS classes, and return the button to the original state
completed = false;
setTimeout(function () {
buttonContainer.classList.remove(‘completed’);
button.classList.remove(‘button-hidden’);
ball.classList.remove(‘hidden’);
borderPath.classList.add(‘hidden’);
stopDownload();
}, 500);
}
});
}
});
}, 1000);
}

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

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

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکا – خرید سرور مجازی ارزان هلند – vps – خرید vps هلند – خرید سرور مجازی آمریکا – خرید vps فرانسه – تست vps – سرور مجازی تست – سرور مجازی ویندوز – ارزانترین vps – خرید وی پی اس – vps ارزان – 

 

برچسب‌ها:

  • behnam gol mohamadi