احسان رضایی

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

تماس با من
me@dehohohohovelopithahahaha.ir
کی هستم؟
who am i

دست نوشته ها

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

(مطلب ثابت)

چرا به وب فریمورک های golang نیازی نیست؟

golang-web-freamework
زمانی که golang رو شروع کردم بلافاصله مشغول تحقیق و بررسی وب فریمورک هاش بودم. من قبلا مطلبی در مورد استفاده از فریمورک نوشتم و هنوز هم بر این عقیدم که مزیت های استفاده از فریمورک نسبت به عیب هایی که داره بیشتره. نکته جالب این بود که اغلب مخالف استفاده از فریمورک در go بودن و خب معمولا به جمله ی نیازی بهشون نداری بسنده میکردن.

برای تجربه بیشتر سراغ سه فریمورک gin، echo و روم به دیوار iris رفتم! یه نکته ی خیلی مهم وجود داشت. به نظرم این فریمورک ها به اندازه کافی کامل نیستن و هنگام توسعه زیاد اتفاق میوفته از پکیج های خارجی استفاده کنید. حقیقتا برای validator، router، middleware و error handling که میتونی پکیج هاشُ خودت توی پروژه ات به سادگی اضافه و استفاده کنی، نیازی به فریمورک نداری. در نتیجه تقریبا مزیتی نخواهد موند که از عیب هاش بیشتر باشه. اما پیشنهاد میکنم فریمورک هاشُ برای تجربه هم که شده امتحان کنید.

عدم موفقیت پروژه های نرم افزاری قسمت اول

fail

اجازه بدین قبل از شروع این موضوع آماریُ خدمتتون ارائه بدم.

در سال 2016 تخمین زده شد حدود 21 میلیون توسعه دهنده حرفه ای نرم افزار در سراسر دنیا فعالیت میکنن. با این حال:

75 درصد مدیران فناوری پیش بینی میکنن پروژه های نرم افزاری اونها شکست میخوره.

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

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

1) داشتن شور، اشتیاق، امید و انگیزه. اما تخصص نه!

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

ادامه...

شبکه اجتماعی کتاب در گردش

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

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

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

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

البته احتمال وجود برنامه مشابه این طرح وجود داره. این رو هم باید در نظر بگیریم.

و مهمتر از همه، خوشحال میشم نظرتون در مورد این موضوع رو بخونم :)

تکمیلی.

میتونید روند توسعه این پروژه رو داخل github ببینید.

https://github.com/rezaei121/bookcrossing
ادامه...

چپ دست ها آدمای خاصی هستن یا چی؟

left hand


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

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

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

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

یادمه این موضوع چپ دست بودن رو به نیم کره های مغز هم ربط میدادن که توجه تون رو به این نقل قول جلب میکنم:

در مطالعه‌ای در سال ۲۰۱۳، تصاویر سه‌بعدی مغز هزار نفر مورد بررسی قرار گرفت و با استفاده از اسکنر MRI، میزان فعالیت هردو نیمکره اندازه‌گیری شد. نتایج نشان می‌داد که هر انسان، از هردو نیمکره مغزی خود بهره می‌برد و بخشی بر دیگری غالب نیست.

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

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

این جماعت توسعه دهنده ی خرده گیر

به این نتیجه رسیدم توی برنامه نویسی دست رو هر چیزی بذاری(تکنولوژی، فریمورک و...) بازم پیدا میشن که بیان و یه عیبی روش بذارن :)

آیا واقعا جای عیب و ایراد گرفتن وجود داره؟ بله. حتما اینطور هست و اتفاقا کار آسونیه :)

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

موضوع دقیقا اینجا مشخص میشه. ممکن هست انتخاب یک شخص برای من نوعی و یا شخص دیگه ای سم باشه!

عمدتا 4 دلیل اصلی برای این موضوع وجود داره.

اول. بزرگ جلوه دادن خودشون!

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

دوم. سلیقه...

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

هیچ قانون سختگیرانه ای برای شما وجود نداره...

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

سوم. جبهه گرفتن.

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

چهارم. اطلاعات کهنه.

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

 

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

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

آخرین مطالب وبلاگ

نصب افزونه twig در yii2

سلام. صدای من رو از رسپینا نسخه 3 میشنوید :دی

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

نصب.

دستور زیرُ اجرا کنید:

php composer.phar require --prefer-dist yiisoft/yii2-twig

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

"yiisoft/yii2-twig": "~2.0.0"
ادامه...

تفاوت بین Active Record و Data Mapper

هنگامی که موضوع کار با داده ها در application مطرح میشه احتمالا نیاز به یک ORM پیدا خواهید کرد. ORM یک لایه بین پایگاه داده و application شماست. که به وسیله اون عملیات CRUD یا به عبارت دیگه create, read, update,  delete به آسونی انجام میپذیره. بیشتر از این به ORM نمیپردازم چون در حال حاضر اکثر فریمورک های مدرن ازش استفاده میکنن و بعید میدونم شما تا الان با اون کار نکرده باشید.

دو الگو پیاده سازی محبوب ORM ها Active Record و Data Mapper هست. در این مقاله تصمیم دارم به تفاوت بین این دو الگو بپردازم. مزایا و معایبشون چی هست و چطور میشه یکی از این الگو ها رو برای کار خودمون انتخاب کنیم.

ادامه...

درس های yii2 شماره 25: ایجاد خودکار migration از روی پایگاه داده

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

برای این کار(ایجاد خودکار migration از روی پایگاه داده) در درجه اول نیاز به PHP >= 7.1 و Yii >= 2.0.15.1 دارید. داخل composer.json بسته bizley/migration رو اضافه و بروزرسانی کنید.

{
    "require": {
        "bizley/migration": "~3.0.0"
    }
}

برای PHP < 7.1 میتونید از نسخه ی 2.3.0 این بسته استفاده کنید.

{
    "require": {
        "bizley/migration": "~2.3.0"
    }
}

قدم بعدی پیکره بندی هست. ترجیحا داخل پیکره بندی console این کارُ انجام بدین.

'components' => [
    // ...
],
'controllerMap' => [
    'migration' => [
        'class' => 'bizley\migration\controllers\MigrationController',
    ],
],

 

ادامه...

مدل سازی داده و طراحی پایگاه داده چند زبانه

Multiple Languages

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

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

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

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

ادامه...

نامگذاری چیزها

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

- مفهوم.

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

1) از نام های دقیق استفاده کنید.

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

2) اجتناب از نام های بی معنی.

نام هایی مثل i,j,k و... تنها زمانی قابل قبول هستن که در یک حلقه استفاده بشن. در باقی موارد خوانایی رو سخت میکنن.

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

3) نام کلاس ها، اینترفیس و پراپرتی ها.

نام کلاس میتونه شامل یک یا چند اسم باشه. از فعل نباید استفاده کرد. از “data”, “manager”, “info”, “processor”, “handler”, “maker”, “util” و موارد مشابه به علت مبهم بودنشون اجتناب کنید.

Interface ها معمولا اسم یا صفت هستن. میتونید از پیشوند (مثلا Interface) هم استفاده کنید.

namespace Psr\Log;

/**
 * Describes a logger instance
 */
interface LoggerInterface
{

property ها اسم یا صفت هستن. برای پراپرتی هایی با مقدار دودویی(0 یا 1) میشه از پسوند هایی مثل “Is”, “Can”یا “Has” در جاهای مناسب استفاده کرد.

نام Method باید شامل یک یا چند فعل باشه و کاری که انجام میده رو توضیح بده. نه اینکه چطور اون کار رو انجام میده.

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

 

 

class Exception {}

class InvalidArgumentException extends Exception {}
ادامه...

فهرستی از نکات امنیتی در PHP

php-security-checklist

- از php 7 یا نسخه های بالاتر استفاده کنید.

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

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

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

- استفاده از Whitelist به جای Blacklist.

به بیان ساده Blacklist یعنی فیلتر کردن موارد غیر قابل قبول! که به مراتب تعداد این موارد خیلی بیشتر از قابل قبول هاست. اصلا ممکنه نتونید همه رو توی این لیست جا بدین و چیزهایی از قلم بیوفتن. پس هرگز سعی نکنید لیست از مواردی داشته باشید که برای app شما غیر قابل قبول هست(Blacklist) و به جای اون Whitelist بسازید.

- strict typing

اگر از عملگر == برای مقایسه استفاده میکنید مراقب باشید که PHP به علت تبدیل عجیب و غریبی که انجام میده ممکنه اسکریپت شما رو آسیب پذیر کنه. مثلا عدد 1 برابر هست با رشته 1 و خود 1 یعنی true! و... .(Type Hinting)

 - از الگوریتم های امنیتی/رمزنگاری من درآوردی خودت استفاده نکن!

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

ادامه...