Email: me.dev@developit.ir
نمایش ۱ تا ۲۰ مورد از کل ۵۱ مورد.

ذخیره و تجزیه و تحلیل 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) پروژه دقیقا بر اساس زمان بندی که توسعه دهنده داده تموم میشه.

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

2) من یک نرم افزار مادام العمر خریدم.

پروژه های نرم افزاری هم فنا پذیرند! سرعت رشد ابزارها و تکنولوژی بسیار بالاست و با توجه به یکسری معیار در پروژه شما طول عمر مفیدش قابل تخمین هست. مثلا 5 سال و شاید کمتر! بعد از اون باید پروژه بروزرسانی بشه.

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

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

4) اگر به توسعه دهنده فشار بیارم کارم زودتر تموم میشه.

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

5) هزینه ای که برای این نرم افزار میدم خیلی زیاده.

اغلب اینطور نیست، کاری نداره، دستمزد توسعه دهنده های سایر کشور ها رو بررسی کنید.(این جاش خیلی درد داشت دیگه ادامه نمیدم!)

6) فلان امکانات باید توی پروژه باشه، اینا که جزو بدیهیات هر پروژه ای هست.

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

7) X روز برای پیاده کردن فلان چیز! اینکه کاری نداره! همش دو خط کده من خودم قبلا یه زمانی برنامه نویسی کار میکردم.

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

درس های 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',
    ],
]

 

تجربه سفر با قطار های بن ریل و فدک

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

اما در قطار درجه 1 بن ریل برای دریافت آب معدنی دوم در یک مسافرت 14 ساعته هزینه پرداخت کردم!

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

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

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

کنترل دمای هوا و سیستم صوتی تصویری در اختیار ما نبود یعنی امکان تنظیم دما و انتخاب فیلم و محلی برای اتصال هندزفری نداشت!

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

دمای داخل اتاق به حدی سرد بود که مجبور به پوشیدن لباس های بیشتر شدیم و جالب تر اینکه وقتی موضوع رو به مهماندار اطلاع دادم گفتن که با پتو دریچه ی کولرُ ببندیم!!!

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

شعار بن ریل روی وسایل اتاق به چشم میخورد. "سفر به سبک بن ریل" اول به این فکر میکردم چه مفهومی داره و چقدر بی معنیه! اما در آخرخیلی خوب متوجه شدم... .

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

درس های 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 میتونه جای خوبی برای ایجاد این کلاس باشه.

<?phpnamespace 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 کیک کنید.

بیشتر بخوانید

درس های yii2 شماره 18: حذف web از url

دیدن عنوان دایرکتوری web داخل url برای من خیلی آزار دهنده بود. دلیلش این هست که index.php داخل این پوشه قرار گرفته. برای حذف کردن web از آدرس ها فقط کافیه سه مرحله زیرُ دنبال کنید.

- index.php رو به یک پوشه بالاتر مثلا backend/index.php انتقال بدین.

- بازش کنید و مسیر های داخلش رو تغییر بدین. چون جا به جا شده لازمه از هر مسیر یک /.. حذف بشه:

require(__DIR__ . '/../vendor/autoload.php');require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');require(__DIR__ . '/../common/config/bootstrap.php');require(__DIR__ . '/config/bootstrap.php');$config = yii\helpers\ArrayHelper::merge(    require(__DIR__ . '/../common/config/main.php'),    require(__DIR__ . '/../common/config/main-local.php'),    require(__DIR__ . '/config/main.php'),    require(__DIR__ . '/config/main-local.php'));$application = new yii\web\Application($config);$application->run();
بیشتر بخوانید

درس های yii2 شماره 17: استفاده از تاریخ و تقویم فارسی

 برای کار با تقویم فارسی در yii2 نیازی به نصب extension ندارید و فقط کافیه formatter رو در محل config/main.php(اگر مثل من از yii2 advanced استفاده میکنید) پیکره بندی کنید. چیزی مثل این نمونه:

'components' => [        'formatter' => [            'class' => 'yii\i18n\Formatter',            'locale' => 'fa_IR@calendar=persian',            'calendar' => \IntlDateFormatter::TRADITIONAL,            'dateFormat' => 'php:Y-m-d',            'datetimeFormat' => 'php:Y-m-d H:i',            'timeFormat' => 'php:H:i',        ], ],

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

$formatter = \Yii::$app->formatter;// output: ۱۳۹۶-۰۴-۰۵ ۱۸:۳۵echo $formatter->asDatetime('now');// output: ۱۳۹۶-۰۴-۰۵echo $formatter->asDate('now');// output: ۱۴:۰۵echo $formatter->asTime('now');

یا اینکه خودتون قالب نمایش رو براش تعریف کنید.

// ICU formatecho Yii::$app->formatter->asDate('now', 'yyyy-MM-dd'); // ۱۳۹۶-۰۴-۰۵// PHP date()-formatecho Yii::$app->formatter->asDate('now', 'php:Y-m-d'); // ۱۳۹۶-۰۴-۰۵

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

درس های yii2 شماره 16: کنترل سطح دسترسی، Role Based Access یا RBAC

 مفاهیم پایه

Role Based Access Control یا به طور خلاصه RBAC یک سیستم مدیریت دسترسی هاست که در yii2 گنجانده شده. هر نقش(role) در RBAC شامل مجموعه ای از مجوز هاست یک نقش میتونه به یک یا چند کاربر اختصاص داده بشه. به عنوان مثال نقش manage user(مدیریت کاربران) میتونه شامل مجوز های add user, edit user و delete user باشه. به منظور کنترل سطح دسترسی باید مشخص بشه آیا به کاربر جاری نقش یا مجوز لازم اختصاص داده شده یا خیر.

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

به عنوان مثال فرض کنید یک سیستم مدیریت مقالات داریم. کاربران این سیستم شامل سه گروه میشن:

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

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

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

rbac

بیشتر بخوانید

آموزش postman

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

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

postman-1

دو tab وجود داره، history تاریخچه درخواست هایی که ارسال کردینُ نشون میده و اگر بخواهید اونها save کنید در tab دوم یعنی قسمت collection قرار میگیره. collection مجموعه ای از درخواست های شماست که در واقع اونها رو علاوه بر ذخیره کردن دسته بندی هم میکنه. از collection میتونید export بگیرید و به عنوان یک backup نگهداریش کنید.

در بالای همین قسمت دو بخش دیگه هم قابل مشاهده است، runner تمام درخواست های یک مجموعه(collection) رو به صورت گروهی اجرا میکنه. امکان import درخواست ها و همچنین export نتایج وجود داره. هدف این بخش اجرا و تست یک مجموعه است.

بخش import همونطور که از نامش پیداست امکان اضافه کردن اطلاعات رو بهتون میده. این اطلاعات میتونه collection, environment, data dump, curl command یا یک RAML / WADL / suagger(v1/v2) / runscope باشه.

بیشتر بخوانید

درس های yii2 شماره 15: نصب swagger

در ادامه مطلب قبلی.

- داخل packagist عنوان مورد نظرمون(yii2 swagger) رو جستجو میکنیم. مثل همیشه package های زیادی رو مشاهده میکنید. اولین گزینه پر استفاده ترین و محبوب ترین package هست و ما هم اونُ انتخاب میکنیم(light/yii2-swagger).

- برای نصب از طریق composer توضیحات لازم رو داده. من از همون روش اولی که گفته نصب رو انجام میدم یعنی اجرای دستور زیر:

composer require --prefer-dist light/yii2-swagger "~1.0.4" --dev

- داخل یک controller به عنوان مثال SiteController و در متد actions پیکره بندی swagger رو انجام میدیم:

public function actions(){    return [        //The document preview addesss:http://api.yourhost.com/site/doc        'doc' => [            'class' => 'light\swagger\SwaggerAction',            'restUrl' => \yii\helpers\Url::to(['/site/api'], true),        ],        //The resultUrl action.        'api' => [            'class' => 'light\swagger\SwaggerApiAction',            //The scan directories, you should use real path there.            'scanDir' => [                Yii::getAlias('@api/modules/v1/swagger'),                Yii::getAlias('@api/modules/v1/controllers'),                Yii::getAlias('@api/modules/v1/models'),                Yii::getAlias('@api/models'),            ],            //The security key            'api_key' => 'balbalbal',        ],    ];}

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

doc: آدرس صفحه ی مستندات رو مشخص میکنه. با توجه به این نامی که انتخاب کردیم آدرس چیزی شبیه به http://api.yourhost.com/site/doc خواهد شد.

restUrl: آدرس پایه restful api رو تعریف میکنه. به عنوان مثال اگر یک api برای login آماده کنیم درخواست به آدرس http://api.yourhost.com/site/api/login ارسال میشه.

scanDir: مسیر هایی هست که swagger اونها رو برای پیدا کردن api جستجو(scan) میکنه.

api_key: ممکنه api شما نیاز به احراز هویت داشته باشه. در بالای صفحه ی مستندات swagger جایی برای وارد کردن کلید امنیتی وجود داره تا دسترسی ها محدود و امنیت برقرار بشه. به طور پیشفرض اینجا میتونید یک کد امنیتی تعریف و استفاده کنید اما بهتر اینه که کاربران در سیستم login کنن، سپس یک token دریافت و از اون به عنوان کلید امنیتی استفاده کنن. یعنی هر کاربر یک کلید امنیتی منحصر به فرد که با هر بار login تغییر میکنه. بعدا این قسمت رو جدی تر بررسی میکنیم.

مستند سازی خودکار و ایجاد یک محیط تعاملی برای Web API با استفاده از swagger

swagger اجازه میده یک ساختار توصیفی از API خودتون بسازید. چرا مفید، عالی و کاربردی به نظر میرسه؟ چون میتونیم به طور خودکار برای API خودمون مستندات زیبا و یک محیط تعاملی ایجاد کنیم، همچنین امکان تست API رو هم برامون فراهم میکنه. swagger این کارُ با خواندن به اصطلاح حاشیه ها/یادداشت ها یا کامنت های داخل سورس انجام میده.

    /**     * Display a listing of the resource.     *     * @return \Illuminate\Http\JsonResponse     *     * @SWG\Get(     *     path="/api/dashboard",     *     description="Returns dashboard overview.",     *     operationId="api.dashboard.index",     *     produces={"application/json"},     *     tags={"dashboard"},     *     @SWG\Response(     *         response=200,     *         description="Dashboard overview."     *     ),     *     @SWG\Response(     *         response=401,     *         description="Unauthorized action.",     *     )     * )     */    public function index()    {        ...    }...
بیشتر بخوانید

معرفی دو ابزار(رابط کاربری) برای کار با elasticsearch

HTTP و JSON دو نیاز اصلی برای کار با elasticsearch هستن، شاخص گذاری، جستجو و هر چیز دیگه ای که فکرشُ میکنید با این دو انجام میشن.

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

اولین پیشنهادم postman هست. یک ابزار توسعه API که قبلا هم در موردش نوشتم. افزونه ی chrome یا application های مجزا برای linux، windows و mac داره. صرفا مختص کار با elasticsearch نیست اما میشه به این منظور هم ازش استفاده کرد.

postman

مورد دوم، sense. فقط افزونه ی chrome داره، به سادگی، زیبایی و قدرت postman نیست اما مزیتش اینه که چون تنها برای elasticsearch نوشته شده autocomplete داره و خب کارُ آسونتر و سریعتر میکنه. اول داخل kibana و قسمت Dev Tools بود که الان هم هستش.

sense

دانشگاه یا موز!

در ادامه مطلب " نقدی در مورد برخی اساتید " ...

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

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

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

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

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

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

سیستم پشتیبانی تصمیم کلان داده - Big Data Decision Support System

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

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

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

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

بیشتر بخوانید

درس های yii2 شماره 14: اضافه کردن تگ های SEO

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

به عنوان انجام یک گام کوچیک در جهت بهبود SEO بهتره صفحات متفاوت meta tag های متفاوت و مربوط به خودشون رو داشته باشن.

میدونیم که برای تعریف عنوان یک صفحه(در controller) اینطور باید عمل کرد:

\Yii::$app->view->title = 'my title';

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

$this->title = 'my title';

ولی برای keyword ها یا description مثل title یک پارامتر اختصاصی نداریم و از اونجایی که هر دو meta tag به حساب میان باید از متد registerMetaTag برای ست کردنشون استفاده کنیم.

مثلا داخل controller:

\Yii::$app->view->registerMetaTag([    'name' => 'description',    'content' => 'my description',]);\Yii::$app->view->registerMetaTag([    'name' => 'keywords',    'content' => 'my keywords',]);

یا در view:

$this->registerMetaTag([    'name' => 'description',    'content' => 'my description',]);$this->registerMetaTag([    'name' => 'keywords',    'content' => 'my keywords',]);
عضویت در خبرنامه
جهت اطلاع از آخرین فعالیت های من لطفا در خبرنامه عضو شوید