احسان رضایی

یک توسعه دهنده، شاید هم نه.


اجرای collection های postman

برای اجرای collection ها در نوار کناری سمت چپ روی فلش مجموعه ی مورد نظرتون کلیک و سپس دکمه ی run رو بزنید. میتونید تمام collection ها یا فقط یک پوشه رو اجرا کنید. اگر در زمان اجرا با خطایی برخورد کردین میتونید داخل postman console که قبلا در موردش توضیح دادم جزئیات کاملش رو ببینید.

run collection

collection ها در postman

collection چیزی مثل folder هست که به منظور دسته بندی درخواست های مشابه از یک نوع یا یک گروه استفاده میشه. مستندات خود postman توضیحات خوبی در مورد ایجاد و مدیریت collection داده که در اینجا سعی میکنم نمونه ای رو مثال بزنم.

در قسمت سمت چپ نرم افزار و با کلیک روی دکمه new folder میتونید یک یا چند collection ایجاد کنید. زمانی که درخواست جدیدی رو ایجاد میکنید با کلیک روی گزینه ی save میشه اون رو داخل folder های تعریف شده ذخیره کرد.

create collection

امکانش وجود داره به این توافق برسیم که یک ساختار ساده گزینه ی خوبیه پس میشه برای هر feature یک collection ساخت. داخل application ما دوره های آموزشی وجود داره به اضافه اینکه کاربران میتونن داخل دوره ها ثبت نام و بعد از اون دوره های خودشون رو داخل پنل کاربریشون مشاهده کنن. میتونیم برای این feature یک collection بسازیم.

کتابخانه های کمکی postman

اعتبار سنجی پاسخ ها و بررسی خروجی JSON که اغلب شامل attribute های زیادی هست به مرور خسته کننده میشه. postman شامل کتابخانه های مفیدی هست که به شما برای test کمک میکنه. به ویژه lodash و tv4 JSON schema validator. میتونید لیست کامل این کتابخانه ها رو اینجا ببینید. بیایید دوباره عملیات test صفحه ی login رو که در پست های قبلی انجام دادیمُ ادامه بدیم.

از اونجایی که login ما فقط یک token برمیگردونه میتونیم ست بودن مقدار token رو بررسی کنیم.

let jsonData = JSON.parse(responseBody);
let ok = responseCode.code === 200;
tests["Successful request"] = ok;
tests["Token is set"] = _.has(jsonData, "token");

if(ok) {
    pm.environment.set("token", jsonData.token);
}
ادامه...

استفاده از console در postman

گاهی اوقات نیاز دارین اطلاعات درخواست و پاسختون رو با دقت بیشتری بررسی کنید. ابزار console این اطلاعات ارسال شده و دریافتی شما رو با جزئیات بیشتری ثبت میکنه. برای باز کردن console از کلید ترکیبی cmd+alt+C استفاده کنید یا اینکه به آدرس View > Show Postman Console برید.

عملیات test در postman

هنگام توسعه ی application نیاز داریم از صحت نتایج API اطمینان حاصل کنیم. با استفاده از testing میتونیم انواع مختلفی از اعتبار سنجی ها رو برای نتایج ایجاد کنیم. به عنوان مثال برای درخواست login در زبانه tests کد زیرُ بنویسید و روی دکمه Send کلیک کنید.

 

tests["Successful request"] = responseCode.code === 200;

 

postman tests

ادامه...

تعریف متغییر های محیطی در postman

Environment Variables ها امکان خوبی هستن که انجام عملیات copy/paste رو کاهش میدن و تمام متغییر های ما رو در یک جا نگه میدارن. environment یک محیط اجراست. ما میتونیم محیط های متفاوتی داشته باشیم مانند، محیط ارزیابی، عملیاتی/استقرار و... 

postman انواع مختلفی از متغییر ها رو در اختیار ما میذاره(Global، Environment، Local و Data). متغییر های Global  که اینجا مثالی در موردش خواهیم زد همه جا قابل استفاده هستند. شما میتونید در مورد متغییر ها اینجا بیشتر بخونید.

به عنوان مثال، ما به سه متغییر نیاز داریم.

domain: یک subdomain فعال که در حال حاضر ازش استفاده میکنیم مثل company1، company2 یا هر چیز دیگه ای.

url: آدرس اپلیکیشن مون.

token: توکنی که برای احراز هویت ازش استفاده میکنیم.

ادامه...

احراز هویت یا authorization در postman

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

خیلی ساده، در هر درخواست token رو در header ارسال میکنیم. سمت نرم افزار این توکن رو دریافت و بررسی میکنه تا از معتبر بودنش مطمئن بشه.

postman authorization

ادامه...

آموزش postman ایجاد یک request

اولین گام برای کار با postman، ایجاد یک request و مشاهده پاسخ یا خروجی اون هست. 

postman request

ادامه...

‏احساس تعلق خاطر به محل کار

روز اولی که اومدم شرکت داشتن نیرو جذب می‌کردن. بعد از مدتی دیدم خیلی هوام‌ُ دارن و همه جور امکاناتی برام فراهم می‌کنن. می‌گفتم اینا چقدر دلسوز کارمنداشون هستن. تا اینکه موضوع تعدیل نیرو داغ شد و عده‌ای رو اخراج کردن.

‏اما خوشبختانه من موندم. رئیس شرکت می‌گفت متاسفیم اما مجبوریم. اون موقع من فهمیدم چقدر کودکانه فکر می‌کردم. همیشه موضوع منفعت هست. تاسف اون هیچ ارزشی برای کسایی که اخراج شدن نداشت. اون از روز اول هم برای کسی دلسوزی نمی‌کرد. برای اون چیزی که مهمه بازدهی بیشتر نیروهاش بود و هست.

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

ادامه...

آپلود فایل های پروژه به وسیله ی ftp هنگام استفاده از git

اگر از git استفاده بکنیم یا نکنیم در نهایت نیاز داریم تا پروژمون رو داخل سرور قرار بدیم. ftp یک روش مرسوم برای این کار هست و Git-ftp این امکان رو بهمون میده تا با آپلود آخرین تغییرات پروژه در سرور زمان و پهنای باند کمتری رو صرف این کار بکنیم. برای تشخیص تغییرات، گزارشی از فایل های آپلود شده در قالب یک فایل log بر اساس شناسه commit داخل سرور نگه داری میشه بنابراین میتونیم به راحتی از branch های مختلف استفاده و یا به عقب برگردیم و یک نسخه ی قدیمی رو آپلود کنیم :)

# Setup
git config git-ftp.url "ftp://ftp.example.net:21/public_html"
git config git-ftp.user "ftp-user"
git config git-ftp.password "secr3t"

# Upload all files
git ftp init

# Or if the files are already there
git ftp catchup

# Work and deploy
git commit index.txt -m "Add new content"
git ftp push
# 1 file to sync:
# [1 of 1] Buffered for upload 'index.txt'.
# Uploading ...
# Last deployment changed to ded01b27e5c785fb251150805308d3d0f8117387.

داستان اول شخص بودن یک توسعه دهنده

یه دوستی میگفت در همین لحظه که داری به موضوعی فکر میکنی به طور میانگین حدود 16 نفر دیگه هم مثل تو دارن هم زمان به این موضوع فکر میکنن!

به نظرم توی برنامه نویسی اول شخص بودن یعنی ادعا. اینکه بگیم اولین نفری بودیم که این کارُ انجام دادیم یا مثلا تنها کسی بودم که انجامش دادم و...

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

درس های yii2 شماره 23: بهینه سازی SEO با pretty URLs برای صفحه بندی ها

در ادامه مطلب قبلی که به اصطلاح آدرس صفحات رو قشنگشون کردیم! یا به عبارت دیگه اونها رو به شکلی تغییر دادیم که گوگل دوست داره و برای کاربران هم قابل فهم تره میرسیم به صفحه بندی ها که به طور پیشفرض چیزی مثل http://example.com/schools/schoolTitle?page=2 میمونه. تصمیم بر اینه که صفحه بندی به صورت http://example.com/schools/schoolTitle/2 تغییر کنه. فایل پیکره بندی yii رو باز کنید چون لازمه به urlManager یک قانون جدید اضافه کنیم.

$config = [
        // ...
        'urlManager' => [
            // ...
            'rules' => [
              'schools/<title:\w+>/<page:\d+>' => 'site/schools', // new rule
              'schools/<title:\w+>' => 'site/schools',
            ],
        ],
        ....

 میتونید برای مشاهده قانون های بیشتر نگاهی به urlManager رسپینا بندازید.

همین :)

ذخیره و تجزیه و تحلیل apache logs در elasticsearch

filebeat-1

elastic اخیرا ماژول های filebeat رو معرفی کرده، که برای پردازش و به دست آوردن یک بینش بصری از log های رایج طراحی شده. filebeat در kibana به عنوان نقطه ی شروع یک داشبورد از پیش طراحی شده در اختیارتون قرار میده که میتونید بعدا نمودار های دیگه ای هم بسته به نیازتون بهش اضافه کنید. ماژول Apache2 که اینجا در موردش حرف میزنیم، اطلاعات مربوط به log های apache رو از مسیر های پیشفرض جمع آوری میکنه، اگر مسیر های پیشفرض رو هم تغییر دادین امکان پیکره بندی این ماژول وجود داره.
اطلاعات جمع آوری شده توسط filebeat به elasticsearch ingest node ارسال خواهد شد(به گره هایی که قبل از شاخص گذاری روی پرونده ها عملیات پیش پرازش رو انجام میدن ingest node گفته میشه) تا عملیات تجزیه و تحلیل قبل از شاخص گذاری در elasticsearch انجام بگیره.

ادامه...

رسپینا، تجربه شیرین اوپن سورس

داستان رسپینا اولین بار برمیگرده به چند سال پیش. قرار بود در انجمن ایران پی اچ پی که هنوز یکی از اعضای اون هستم آموزش پروژه محور داشته باشیم. چه چیزی بهتر و ساده تر از سیستم وبلاگ نویسی؟ به دلیل عدم مشارکت بچه ها پروژه(رسپینا) سال ها عقب افتاد تا زمانی که من yii2 رو برای یادگیری انتخاب کردم. خب چه چیزی بهتر از یک آموزش پروژه محور؟ بنا بر این تصمیم گرفتم رسپینا رو توسعه بدم. در نهایت یک نسخه پر از اشکال مدت زیادی بدون انتشار باقی موند تا اخیرا که دستی به سر و روش کشیدم و گذاشتمش داخل github. ما از ابتدا قرار نبود چرخ رو دوباره اختراع یا یک سیستم با ویژگی های متفاوت ایجاد کنیم. هدف آموزش بود بنا بر این اگر در مورد yii کمی تجربه داشته باشید و نگاهی به سورس بندازید متوجه خواهید شد کار سطح بالا و پیچیده ای انجام نشده. همه چیز ساده و با امکانات پایه خود فریمورک انجام گرفته. برای من همین کافیه تا کسی از روی سورس چیزی یاد بگیره مثل خودم که در گیت هاب از پروژه های دیگران استفاده میکنم.

7 تصور غلط کارفرما در مورد پروژه های نرم افزاری

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

1) پروژه دقیقا بر اساس زمان بندی که توسعه دهنده داده تموم میشه.

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

ادامه...

درس های yii2 شماره 22: بهینه سازی SEO با pretty URLs

گاهی کاربران url های سایت شما رو در شبکه های اجتماعی به اشتراک میذارن. مثلا به طور پیشفرض آدرس صفحه "درباره من" چیزی مثل http://webproject.ru/index.php?r=site%2Fabout هست.

اکثر کاربران هیچ تصوری از index.php یا 2% ندارن و به اون اعتماد نمیکنن در نتیجه کمتر روی لینک کلیک میشه. آدرس هایی مثل http://webproject.ru/about بهتر به نظر میرسه. در واقع کاربران به راحتی میتونن متوجه بشن که قراره چه چیزی رو ببینن. برای تبدیل آدرس ها به نمونه بالا کافیه سه مرحله زیرُ انجام بدین.
یک فایل htaccess بسازید یا اگر از قبل وجود داره موارد زیرُ بهش اضافه کنید(به عنوان مثال محل فایل در نسخه advanced میتونه frontend/web باشه).

RewriteEngine on
# If a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward it to index.php
RewriteRule . index.php

urlManager رو پیکره بندی کنید.

'components' => [
    // ...
    'urlManager' => [
        'class' => 'yii\web\UrlManager',
        // Hide index.php
        'showScriptName' => false,
        // Use pretty URLs
        'enablePrettyUrl' => true,
        'rules' => [
        ],
    ],
    // ...
],

 حالا آدرس ها چیزی مثل http://webproject.ru/site/about شدن. هیچ دلیلی برای وجود پارامتر site داخل url نیست پس با ضافه کردن rule زیر در پیکره بندی بالا اون رو حذف میکنیم.

    'rules' => [
        '<alias:\w+>' => 'site/<alias>',
    ],

 در قسمت rules کارهای بیشتری هم میتونیم انجام بدیم، مثلا اینکه به انتهای url پسوند html. اضافه کنیم. این مورد هم در SEO تاثیرگذار هست. پسوند url رو میتونیم در قسمت suffix مثل نمونه زیر تعریف کنیم.

'rules' => [
    [
        'pattern' => 'user/about/<username:\w+>',
        'route' => 'user/about',
        'suffix' => '.html',
    ],
]

 

درس های yii2 شماره 21: Bootstrapping

Bootstrapping به فرایندی از آماده کردن محیط قبل از شروع application برای مدیریت یک درخواست اشاره میکنه. به عنوان مثال، اگر تصمیم دارید قبل از اجرای application یکسری تنظیمات خاص برای کاربران تعریف بشه Bootstrapping گزینه ی مناسبی برای این کار هست. backend/components/bootstrap محل خوبی برای نوشتن یک کلاس از این نوع میتونه باشه.

namespace backend\components\bootstrap;

use Yii;
use yii\base\Application;
use yii\base\BootstrapInterface;

class Setting implements BootstrapInterface
{
    public function bootstrap($app)
    {
        $settingModel = \dashboard\modules\setting\models\Setting::find()->one();
        Yii::$app->language = $settingModel->language;
        Yii::$app->timeZone = $settingModel->time_zone;
    }
}

کلاس باید از BootstrapInterface مشتق بشه و به دلیل اینکه کلاس پدر interface هست تعریف متد bootstrap اجباریه.

app به Application جاری که در حال اجراست اشاره میکنه و با استفاده از اون به همه چیز دسترسی دارید. مثلا تعریف عنوان Application:

$app->view->title = 'my title';

یا اضافه کردن یک فایل css به صفحه و...

$app->view->registerCssFile(Yii::$app->homeUrl . 'web/css/index.css');

در کلاس Setting که به عنوان نمونه کدش رو دیدیم زبان و منطقه زمانی از دیتابیس دریافت و برای کاربر ست میشه. حالا باید مشخص کنیم که این کلاس در مرحله bootstrap اجرا بشه. این یک مرحله قبل از شروع Application هست و در اون متد bootstrap که در کلاس Setting داریم صدا زده خواهد شد. برای این کار به backend/config/main.php مراجعه کنید. در پیکره بندی Application شما یک کلید به نام bootstrap وجود داره، کلاس Setting رو بهش اضافه کنید تا این کار انجام بشه.

'bootstrap' => ['log', 'backend\components\bootstrap\Setting'],

 

نصب elasticsearch در ویندوز

نیازمندی ها.

elasticsearch با جاوا توسعه داده شده و برای اجرا حداقل به نسخه ی 8 جاوا نیاز داره. پیشنهاد شده از نسخه ی 131_1.8.0 یا بالاتر استفاده کنید، elasticsearch با نسخه ی های پایین تر اجرا نخواهد شد.

نصب.

- آخرین نسخه elasticsearch رو دانلود و در محلی از حالت فشرده خارج کنید.

- cmd رو باز و bin/elasticsearch.bat رو اجرا کنید.

C:\elasticsearch-5.5.1\bin>elasticsearch.bat

هنگام اجرای یک خطای معمول وجود داره و همونطور که خودش توضیح داده برای حلش میتونید JRE یا JDK رو نصب کنید.

Error: missing `server' JVM at `C:\Program Files (x86)\Java\jre1.8.0_101\bin\server\jvm.dll'.Please install or use the JRE or JDK that contains these missing components.

- IP:Port مخصوص به elasticsearch رو امتحان کنید(http://localhost:9200). اگر همه چیز درست پیش رفته باشه خروجی زیر بهتون نمایش داده خواهد شد.

{
    "name" : "JlngwG8",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "H7KFhzdBTYmkAwxb7XDvfw",
    "version" : {
        "number" : "5.5.1",
        "build_hash" : "19c13d0",
        "build_date" : "2017-07-18T20:44:24.823Z",
        "build_snapshot" : false,
        "lucene_version" : "6.6.0"
    },
    "tagline" : "You Know, for Search"
}

درس های yii2 شماره 20: کنترل سطح دسترسی RBAC، استفاده از rule ها

در ادامه مطلب قبلی. با استفاده از rule ها این امکان وجود داره تا به عنوان مثال بتونیم مجوز بروزرسانی یک بخش به شرطی که کاربر جاری مالک(ایجاد کننده) اون باشه رو بررسی کنیم. سیستم مدیریت وبلاگ رو در نظر بگیرید. کاربران(نویسنده ها) وبلاگ فقط باید امکان بروزرسانی یا حذف مطالب خودشون رو داشته باشن. در مرحله ی اول، برای بررسی مالک هر مطلب نیاز به ایجاد یک کلاس جدید داریم. backend\components\rbac میتونه جای خوبی برای ایجاد این کلاس باشه.

<?php
namespace backend\components\rbac;
use yii\rbac\Rule;

class AuthorRule extends Rule
{
    public $name = 'AuthorRule';

    public function execute($user, $item, $params)
    {
    }
}

لازم هست کلاسمون از yii\rbac\Rule مشتق(extends) بشه. و همچنین تعریف متد execute اجباریه. در این متد user شناسه کاربر جاری، item اطلاعات مربوط به مجوز و params پارامتر هایی که ما براش تعریف میکنیم رو برمیگردونه.

ادامه...

درس های yii2 شماره 19: ایجاد extension بدون نیاز به composer و github

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

وارد بخش Extension Generator در ابزار gii بشید. هر بخش رو مختر توضیح میدم.

Vendor Name، به اسم نویسنده اشاره میکنه، username گیت هابتون میتونه گزینه ی خوبی باشه اما اجباری برای نام گذاری وجود نداره من از developit استفاده میکنم به جای نام کاربری گیت هابم.

Package Name، نام extension شماست. بهتره yii2 اولش باشه هر چند اینجا هم اجباری وجود نداره.

Type، عنوان که میتونه extension یا library باشه. ما هم که معلومه داریم چی درست میکنیم.

Keywords، کلمات کلیدی رو با کاما از هم جدا کنید. برای جستجو، دسته بندی و اینطور مسائل مفید هست.

License، مجوز مورد نظر رو انتخاب کنید. هر چند ما قرار نیست چیزی رو به گیت هاب انتقال بدیم اما انتخاب مجوز اجباریه. من GPL-3.0 رو خیلی دوست دارم.

Title, Description, Author Name, Author Email، عنوان، توضیحات، نام و ایمیل خودتون رو بنویسید.

Output Path، مسیری که extension در اونجا قرار میگیره هست. پیشفرض داخل یه temp dir قرارش داده تا بعد از اینکه کارمون روی extension تموم شد اون رو به گیت هاب ببریم و بعدش با composer نصبش کنیم. از اونجایی که قرار نیست ما این روند درست رو طی کنیم این مسیرُ تغییر میدیم. من به جاش vendor/developit@ گذاشتم. دقت کنید در مسیری که میذارید حتما دایرکتوری ها وجود داشته باشن.

Preview رو بزنید و تیک مورد اول یعنی composer.json رو بردارید و روی گزینه ی Generate کیک کنید.

ادامه...