<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مهدی فتحی</title>
        <link>https://virgool.io/feed/@mehdi.developer</link>
        <description>یه توسعه دهنده وب خصوصا back-end</description>
        <language>fa</language>
        <pubDate>2026-06-17 05:14:33</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/3281/avatar/W2i8Wv.png?height=120&amp;width=120</url>
            <title>مهدی فتحی</title>
            <link>https://virgool.io/@mehdi.developer</link>
        </image>

                    <item>
                <title>انتشار نسخه جدید Eloquent Filter</title>
                <link>https://virgool.io/@mehdi.developer/%D8%A7%D9%86%D8%AA%D8%B4%D8%A7%D8%B1-%D9%86%D8%B3%D8%AE%D9%87-%D8%AC%D8%AF%DB%8C%D8%AF-eloquent-filter-navqdn31tpx9</link>
                <description>این روزا نسخه جدید Eloquent Filter منتشر شده که بسیاری امکانات جدید در اختیار کاربران فریم ورک لاراول قرار داده که میتونه خیلی بهشون کمک کنه.Eloquent Filter یک پکیج هست واسه ساخت کوعری ها ساده و پیچیده با استفاده از پارامتر های ارسالی کاربر.ساخت صفحات گزارش گیری همراه با فیلتر های گوناگون  با استفاده از این پکیج راحت تر و سریع تر انجام میشود.اگر دوست دارید توضیحات بیشتری بخونید میتونید این لینک رو اول یه نگاهی بندازید و یا صفحه گیت هاب این پکیج رو یه نگاه بندازید. تو این مطلب قصد داریم جدیدترین امکانات این پکیج رو معرفی کنیم. https://virgool.io/d/navqdn31tpx9/%F0%9F%93%B7Jenga Eloquent Filterپشتیبانی از شرط های Nested Relation Modelدر ورژن ۲ به بعد شما میتونید فیلتر ها روی netsed model ها رو هم داشته باشید که خیلی کاربردی هست.فقط باید whitelist رو ست کنید. همچنین پارامتر ها در url به این صورت ست شود.   https://gist.github.com/mehdi-fathi/748387470f113e987325fadc6570eae4 http://localhost:8000/users/list?posts[count_post]=876&amp;username=mehdi  select * from &quot;users&quot; where exists           (select * from &quot;posts&quot; where &quot;posts&quot;.&quot;user_id&quot; = &quot;users&quot;.&quot;id&quot;           and &quot;posts&quot;.&quot;count_post&quot; = 876)          and &quot;username&quot; = &quot;mehdi&quot;ساخت Custom Detection Conditionگاهی اوقات شما نیاز دارید که یکسری شرایط برای ساخت یک کوعری بخصوص داشته باشید که  پکیج  Eloquent Filter به صورت پیشفرض نمیتونه اون رو ساپورت کنه. که شما میتونید با استفاده از متد  Custom query filter این مشکل رو حل کنید ولی یه راه حل بهتری هم هست که میتونید با استفاده از Custom Detection Condition یکسری شرایط رو بررسی کنید و اون کوعری خودتون رو به اصطلاح inject کنید. به همین راحتی/users/list?username[value]=mehdi&amp;username[limit]=10&amp;username[email]=mehdifathi&amp;username[like_relation_value]=mehdi&amp;count_posts=10select * from &quot;users&quot; where exists (select * from &quot;posts&quot; where &quot;users&quot;.&quot;post_id&quot; = &quot;posts&quot;.&quot;id&quot; and &quot;comment&quot; like ?) and &quot;username&quot; &lt;&gt; ? and &quot;email&quot; like ? and &quot;count_posts&quot; = ? limit 10 https://gist.github.com/mehdi-fathi/5e6d83fe93521b6cc6d9cf97fe53ea43 ابتدا باید یه کلاس برای شناسایی شرایط مورد نظر بسازید مثه کد بالا.بعد میتونید کوعری دلخواه خودتون رو با یه کلاس دیگه تکمیل کنید. https://gist.github.com/mehdi-fathi/6f848700881ce005b7f14dcd6124c58a تمام پارامتر ها اول بصورت در کلاس  WhereRelationLikeConditionQuery چک می شود و سپس توسط شرط های پیش فرض eloquent filter بررسی می شود.با کد زیر شما میتونید کلاس مورد نظر رو inject کنید به صورت on the fly $users = User::SetCustomDetection([WhereRelationLikeCondition::class])-&gt;filter(); شما میتونید به صورت پیشفرض با ساخت متد EloquentFilterCustomeDetection هم کلاس مورد نظر رو inject کنید.به این صورت به صورت خودکار تو تمام فیلتر های اون مدل اون شرایط مورد نظر اعمال میشه.class User extends Model
{
    use Filterable;
    public function EloquentFilterCustomDetection(): array
    {
        return [
            WhereRelationLikeCondition::class,
        ];
    }
}معرفی Magic Methodsگاهی اوقات شما نیاز به یسری امکانات دارید که خیلی از کارهای تکراری قبل از فیلتر کوعری انجام بشه و یا حتی بعد از فیلتر. مثلا نیاز دارید قبل از فیلتر تاریخ میلادی رو به شمسی تبدیل کنید و یا داده رو تغییر بدید  قبل از فیلتر شاید لازم باشه دیتا بعد از فیلتر تو ردیس کش بشه و یا جایی برای شما یه لاگ بخصوص بزاره.در حال حاضر Eloquent Filter دو تا متد wrapper برای این قبیل موارد داره که میتونه بهتون کمک کنه.متد serialiazeRequestFilterاین متد  یه wrapper برای ورودی های به eloquent filter هست. که برای استفاده از اون باید این متد داخل مدل شما تعریف بشه. https://gist.github.com/mehdi-fathi/7ae88281a87cc13882f6b8828b284b61 متد ResponseFilterاین متد برای خروجی کوعری ها بعد از فیلتر هست.شما میتونید عملیات مورد نظر خودتون رو بعد از فیلترینگ انجام دهید. که با تعریف این متد داخل مدل خودتون میتونید از اون استفاده کنید. https://gist.github.com/mehdi-fathi/26a7ba5426833ebcbafa69b866a7a64c اگر نظر یا ایده ای درباره این پکیج دارید خوشحال میشم زیر این پست بخونم و یا به صورت issues داخل صفحه گیت هاب این پکیج ببینم.مرسی</description>
                <category>مهدی فتحی</category>
                <author>مهدی فتحی</author>
                <pubDate>Sun, 28 Mar 2021 13:02:51 +0430</pubDate>
            </item>
                    <item>
                <title>‌ تجربه deploy پروژه با git و Dockerize در Production</title>
                <link>https://virgool.io/@mehdi.developer/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-deploy-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%A8%D8%A7-git-%D9%88-dockerize-%D8%AF%D8%B1-production-n0d9kvhvxjxx</link>
                <description>امروز میخوام راجع یه تجربه ای که داشتم صحبت کنیم.قصه از اینجا شروع میشه که میخواستم یه پروژه از یه سروری به یک سرور بهتر در ابر آراون انتقال بدیم.یکی از دلایلش محدودیت در سرور قبلی بود.چون هاست اشتراکی بود.الان هم نمیخوام راجع به کامند های نصب حرف بزنم چون با سرچ به دست میاد.خب هدف های زیادی داشتیم و یکیش اینکه بتونیم بیشتر داکر رو یاد بگیریم و همچنین deploy  راحت تر و اصولی تری داشته باشیم.docker container conceptقیل و قال ها مثه کتاب فیلم درس مدرک رو بزاریم کنار خیلی چیز ها با قیمت تجربه به دست میاد.راه اندازی Dockerبعد از ssh تو سرور طبق معمول فراید نصب داکر رو جلو رفتیم و بعد از اون docker-compose رو نصب کردم و چند روز قبلش یه پکیج docker-compose خیلی خوب و ساده برای نصب lamp پیدا کردم که شدیدا پیشنهاد میشه.حتما برای یادگیری بهتر این پیکج رو ببینید.بعد از فرایند راه اندازی در کمتر از چند دقیقه باورکردنی نبود که حسابی از شر کانفیگ های تکراری و مسخره راحت شدم!.نصب lamp روی لینوکس ممکنه وقت گیر و اذیت کننده باشه مخصوصا اگر اشتباهی در بعضی از مراحل انجام بدید.خلاصه یکی از مزایای داکر همین قضیه هست که شما تقریبا کانفیگ رو کمتر باهاش درگیر میشید.در واقع بهتره بگیم container داکر قبلا توسط فردی کانفیگ شده و شما دارید از اون استفاده می کنید.البته در مواقعی هم نیاز هست البته یک سری تغییرات داخل container ایجاد کنید و یسری کانفیگ ها رو اعمال کنید.در واقع یکسری لایه های انتزاعی واسه این قبیل تغییرات در داکر وجود داره.Don&#039;t try this ad home!چالش هایی هم وجود داره که ممکنه اوایل کار یکم اذیت کننده باشه ولی چیزی نیست که حل نشدنی نباشه.ولی اگر با لینوکس و دستورات اون اشنا نیستید و یا تا به حال کانفیگ سرور انجام نداده اید حتی در لوکال خودتون. پیشنهاد میشه که اول این مراحل رو بگذرونید بعد وارد دنیای docker بشید.چگونگی Deploy پروژه با استفاده از gitخب تو این مرحله میخواییم بروزرسانی کد پروژه با استفاده از git انجام بدیم.یعنی میخواییم با استفاده از push  گیت کد های نرم افزار بروزرسانی بشوند.البته لازم به ذکر هست که راه های خیلی اصولی تری هست برای اینکار مثله نصب gitlab و یا حتی استفاده از سرویس خوده ابر اروان.ولی در  scale که خودمون داشتیم این یه مقدار بزرگ بود و فعلا نیازی به اون نبود و همچنین داکیومنت ابر اروان در مورد این قضیه زیاد کامل نبود.یه جاهای ابهاماتی داشت که رغبت نکردم سمتش برم.اول باید  bare repository درست کنیم.که اونجا محل نگهداری repository خودمون هست.دوم باید بریم سراغ git hooks که وظیفه اجرای یسری از فرایند ها رو بعد از یکسری اتفاق ها داره که ما باید بهش بگیم بعد از git push چه روندی رو طی کنه.مسیر hooks داخل /var/www/project/.git/hooks/هستش و اینجا باید یه فایل به نام post-receive درست کنیم.#!/bin/bash

# The production directory
WWW=&amp;quot/home/Mehdi/docker/docker-compose-lamp/www/website/example&amp;quot

# The Git repo
GIT=&amp;quot/home/Mehdi/docker/docker-compose-lamp/www/repository/example.git&amp;quot

# Deploy the content to the www directory
git --work-tree=$WWW --git-dir=$GIT checkout -f

cd $WWW || exit
# Do stuff like starting docker
این فایل بعد از هر push گیت اجرا میشه و کد ما رو با تغییرات جدید بروز میکنه البته برای جزعیات بیشتر خوندن این مقاله شدیدا پیشنهاد میشه.مثلا شاید اصولی تر این باشه که پروژه اول داخل یک فایل tmp ریخته بشه اونجا عملیات های composer npm انجام بشه و بعد پروژه اصلی حذف بشه و پروژه از فولدر tmp به فولدر اصلی منتقل بشه.میشه اسم این فرایند رو  CI نام گذاشت ولی خب تو این  scale واقعا نیاز نداشتیم و واسه پروژه هایی که زیاد بزرگ نیستند پیشنهاد نمیشه چون یسری چالش ممکنه درست کنه.شخصی سازی Container هاقطعا شما یکسری نیازها دارید که بصورت پیش فرض داخل کانتینر ها تعبیه نشده.مثلا میخوایین مقدار رم مصرفی php رو زیاد کنید و شاید در یک کار بزرگ تر میخوایین یسری کرون داخل هر کانتینر برای یکسری مقاصد مختلف اجرا بشه.مثلا فرایند بکاپ گیری از دیتابیس و اپلود اون داخل یک سرور دیگه رو ما داشتیم.یه مقداری چالشی بود ولی حل شد.چالشی از این لحاظ که سرویس کرون باید همزمان با up شدن container ها start بشن و شما نمیتونید تو build کرون استارت کنید.چون docker build برای ساخت یک temporaries کانتینر هست و run سرویس ها در اینجا انجام نمیشه.اینجا بود که ENTRYPOINT داخل فایل داکر باید استفاده بشه.یکی از اشتباه ها اینه که داخل کانتینر ssh کنیم و اونجا خودمون تغییرات رو بدیم.که به نظر من توصیه نمیشه چون داکر فایل وجود داره برای انجام همین کارها و این خودش یعنی حذف صورت مسئله .مگر اینکه قصد دیباگ دارید.درضمن بعضی تغییرات داخل کانتینر بعد از build از بین خواهد رفت.پس بهتر از خودمون تز ندیم!. راستی یکم هم shell script و یا حتی python هم میتونه بهتون کمک کنه.مثلا میخوایین یسری کامندها بعد از up کانتینر اجرا بشه شما به راحتی میتونید یه shell script رو اجرا کنید.FROM mysql:5.7

RUN apt-get -y update &amp;&amp; \
    apt-get -y --no-install-recommends install cron &amp;&amp; \
    apt-get -y --no-install-recommends install vim &amp;&amp; \
    apt-get -y --no-install-recommends install lftp &amp;&amp; \
    apt-get -y --no-install-recommends install curl

ADD /bin/backup-db.sh /home/backup-db.sh
RUN chmod +x /home/backup-db.sh

RUN mkdir /home/backup-db

ADD /crontab.txt /home/crontab.txt
RUN /usr/bin/crontab /home/crontab.txt

COPY start.sh /
RUN chmod +x /start.sh
ENTRYPOINT [&amp;quot/start.sh&amp;quot]کد بالا نمونه ی یک Dockerfile هست. در ضمن ADD COPY  برای ارسال فایل از هاست به کانتینر استفاده میشه که روی ساب فولدر ها به این سبک نمیتونه کار کنه.همانطور که در عکس بالا میبینید در تب command همان start.sh بارگذاری شده است. در ضمن برای اطمینان از کارکرد سرویس ها میتونید داخل کانتینر ها ssh کنید و اونجا سرویس ها رو چک کنید.امیدوارم این مقاله به دردتون بخوره چون سعی کردم بیشتر مفهومی توضیحاتی بدم و کد استفاده نکنم چون اون ها رو با سرچ پیدا میکنید.اگر نظری داشتید خوشحال میشم بشنوم.در اخر هم سخن را با شعر سعدی تموم میکنم.علم چندان که بیشتر خوانی // چون عمل در تو نیست نادانینه محقق بود نه دانشمند // چارپاپی بر او کتابی چندآن تهی مغز را چه علم و خبر // که بر او هیزم است یا دفترشیخ اجل سعدی</description>
                <category>مهدی فتحی</category>
                <author>مهدی فتحی</author>
                <pubDate>Fri, 24 Apr 2020 22:07:43 +0430</pubDate>
            </item>
                    <item>
                <title>معرفی پکیج کاربردی Eloquent Filter در لاراول</title>
                <link>https://virgool.io/@mehdi.developer/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D9%BE%DA%A9%DB%8C%D8%AC-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%AF%DB%8C-eloquent-filter-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-cz3zasda0niv</link>
                <description>تا حالا تجربه ساخت صفحات گزارش گیری ادمین یا ساخت صفحات با فیلتر های جستجوی متعدد در لاراول داشتید؟اگر پیاده سازی این قبیل امکانات را تجربه کردید.قطعا میدونید که ساخت این قبیل صفحات نیازمند دریافت یکسری داده از کاربر و ساخت کوعری بر اساس اون داده ها هست.امروز پکیج Eloquent filter رو معرفی میکنم که این مشکل رو خیلی راحت حل میکنه و دیگه نیازی نیست درگیر پیچیدگی های کوعری های صفحات فیلتر بشید و حتی نیازی نیست خیلی از کوعری ها رو خودتون بزنید  و کوعری ها با استفاده از پارامتر های query string ساخته می شوند.فکر میکنم با مثال بهتر منظور خودم رو برسونم.Jengaاولین راه حل =! بهترین راه حلاولین راه حلی که به ذهن اکثر توسعه دهنده ها میرسه اینه که برای هر داده ورودی یک نوع کوعری بسازیم.خب این مشکل با این راه حل حل میشه ولی قطعا در آینده کدهایی خواهید داشت که ده ها دستور شرطی برای هر نوع فیلد دارند.که قطعا پیچیدگی زیادی به کد شما وارد می کند و همچنین خوانایی کد شما کاهش می یابد.به طور مثال این نوع url را ببینید:http://localhost:8000/users/search?age_more_than=25&amp;gender=male&amp;created_at=25-09-2019 https://gist.github.com/mehdi-fathi/fb03bf7eb1f817aecb06c1a61f9ff221 کد بالا نحوه پیاده سازی در روش قدیمی هست همانطور که  می بینید برای هر نوع دیتا یک دستور شرطی درست شده است. البته شاید بشه حالا فرض کنید در اینده فیلتر شما کمی پیشرفته تر شود اون موقع نگهداری و پیاده سازی امکانات جدید یه مقدار پیچیده و سخت خواهد شد.معرفی Eloquent Filterتصور کنید شما یک پکیج نصب کنید که با استفاه از یسری قواعد query string شما رو تبدیل به یسری از شرط های mysql کند و کلا پیچیدگی پیاده سازی این قبیل امکانات رو بر عهده بگیره در ضمن حتی برخی کوعری ها را با توجه به پارامتر های ورودی بسازه. شما فقط دیتاهای مورد نظر رو به صورت query string به Controller خودتون تو فریم ورک لاراول پاس دهید همین‌!.قطعا این پکیج میتونه سرعت و تمیزی کد شما رو بالاتر ببره.نصب و پیاده سازیبه تازگی ورژن جدید eloquent filter منتشر شده همراه با ویژگی های بسیار کاربردی که میتونید از لینک گیت هاب جدیدترین نسخه آن که ورژن ۲ این پکیج هست را نصب و استفاده کنید.برای دریافت نسخه جدید این لینک را کلیک کنید.اول با استفاده از composer پکیج را نصب میکنیم.$ composer require mehdi-fathi/eloquent-filter:1.6.9 پیاده سازی در Modelطبق کد زیر باید Filterable trait را به مدل خودتون اضافه کنید.همچنین  فیلد های که میخواهید در فیلتر استفاده کنید باید در whiteListFilter  مقدار دهی کنید. https://gist.github.com/mehdi-fathi/131a9b4339f59265a899a38dd41a5a29 با این مقدار دهی میتوانید همه ی فیلد ها را برای فیلتر باز بگذارید.private static $whiteListFilter = [&#039;*&#039;];پیاده سازی در Controller https://gist.github.com/mehdi-fathi/75b647d421aca420b9ed0c6ec781df6b به همین سادگی حالا فقط کافیه داده ها از سمت  blade laravel به سمت کنترولر ارسال شود تا خروجی کوعری تولید شود.مثال های استفاده از پکیجدستورات شرطی سادهپارامتر های ارسالی GET موجب ساخت کوعری های به شکل زیر می شود.(به صورت کاملا خودکار)/users/list?email=mehdifathi.developer@gmail.com
SELECT ... WHERE ... email = &#039;mehdifathi.developer@gmail.com&#039;

/users/list?first_name=mehdi&amp;last_name=fathi
SELECT ... WHERE ... first_name = &#039;mehdi&#039; AND last_name = &#039;fathi&#039;

/users/list?username[]=ali&amp;username[]=ali22&amp;family=ahmadi
SELECT ... WHERE ... username = &#039;ali&#039; OR username = &#039;ali22&#039; AND family = &#039;ahmadi&#039;
عملگر ها در دستورات شرطیشما می توانید عملگر ها را داخل پارامتر بدین صورت استفاده کنید./users/list?count_posts[operator]=&gt;&amp;count_posts[value]=35
SELECT ... WHERE ... count_posts &gt; 35

/users/list?username[operator]=!=&amp;username[value]=ali
SELECT ... WHERE ... username != &#039;ali&#039;

/users/list?count_posts[operator]=&lt;&amp;count_posts[value]=25
SELECT ... WHERE ... count_posts &lt; 25شما می توانید پارمترهای limit , orderby را در URL ست کنید./users/list?f_params[limit]=1
SELECT ... WHERE ... order by `id` desc limit 1 offset 0

/users/list?f_params[orderBy][field]=id&amp;f_params[orderBy][type]=ASC
SELECT ... WHERE ... order by `id` ASC limit 10 offset 0شرط های پیشرفته برای ساخت کوعری های در یک بازه خاص مثه کوعری های بر حسب تاریخ باید پارامتر ها به این صورت ارسال شود./users/list?created_at[start]=2016/05/01&amp;created_at[end]=2017/10/01
SELECT ... WHERE ... created_at BETWEEN &#039;2016/05/01&#039; AND &#039;2017/10/01&#039;شما میتوانید تمام این شرط ها را داخل یک سری از پارامترها به پکیج ارسال کنید./users/list?count_posts[operator]=&gt;&amp;count_posts[value]=10&amp;username[]=ali&amp;username[]=mehdi&amp;family=ahmadi&amp;created_at[start]=2016/05/01&amp;created_at[end]=2020/10/01&amp;f_params[orderBy][field]=id&amp;f_params[orderBy][type]=ASCselect * from &#x60;users&#x60; where &#x60;count_posts&#x60; &gt; 10 and &#x60;username&#x60; in (&#x27;ali&#x27;, &#x27;mehdi&#x27;) and &#x60;family&#x60; = ahmadi and &#x60;created_at&#x60; between &#x27;2016/05/01&#x27; and &#x27;2020/10/01&#x27; order by &#x27;id&#x27; asc limit 10 offset 0 برای راهنمایی بیشتر می توانید فایل README.md این پکیج را مشاهده کنید.فقط توجه داشته باشید فیلد هایی که می خواهید شرط ها را رو آن اعمال شود.باید داخل آرایه whiteListFilter$ ست شده باشد.اگر نظر یا ایده ای درباره این پکیج دارید خوشحال میشم زیر این پست بخونم و یا به صورت issues داخل صفحه گیت هاب این پکیج ببینم.مرسی</description>
                <category>مهدی فتحی</category>
                <author>مهدی فتحی</author>
                <pubDate>Fri, 13 Mar 2020 00:35:59 +0330</pubDate>
            </item>
                    <item>
                <title>خود گیک پنداری مزمن!</title>
                <link>https://virgool.io/@mehdi.developer/%D8%AE%D9%88%D8%AF-%DA%AF%DB%8C%DA%A9-%D9%BE%D9%86%D8%AF%D8%A7%D8%B1%DB%8C-%D9%85%D8%B2%D9%85%D9%86-bg35vixtz4g9</link>
                <description>امروز راجع به یه افت میخواییم حرف بزنیم اونم خود گیک پنداری هست که تو بعضی از توسعه دهنده ها شدت بیشتری داره و شاید گاهی منو و حتی شما که داری این مطلب رو میخونی هم مبتلا شده باشید.اول باید مشخص بشه که چی میشه که یه توسعه دهنده ها فکر میکنه واقعا خیلی خفنه.یکم بزارید ریشه ای تر ببینیم قضیه رو.فکنم چندتا نکته بگم یکم بهتر باشه.خفففن یعنی چی اخه !‌؟این کلمه رو معمولا میشنویم فلانی خیلی خفنه خیلی کارش درسته و بیشتر مواقع هم بزرگ نمایی هست به خاطر اینکه تعاریف از کلمه حرفه ای متفاوت هست.شاید حرفه ای از دید یکی کسی هست که ویندوز نصب میکنه و از دید فرد دیگه چیز دیگه ای باشه.پس بهتره بگیم اگر هندونه زیر بغلتون میزارن فکر نکنید کار بسیار بزرگی رو انجام دادید حتی اگر واقعا کاری که کردید بزرگ بوده.چون احتمال داره یه مقدار زیادی دوپامین ترشح بشه و این شاید باعث بشه داستان مسابقه خرگوش و لاک پشت برای شما هم اتفاق بیوفته.مسابقه خرگوش و لاک پشتقضاوت غیر عقلانی نکنیمفکنم این جا رو با یه شعر حافظ شروع کنم بهتر حرفم رو برسونمنه هر که چهره برافروخت دلبری داند  // نه هر که آینه سازد سکندری داندنه هر که طرف کله کج نهاد و تند نشست // کلاه داری و آیین سروری داندحافظخیلی ساده اگر از مک استفاده میکنی دلیل محکمی برای خفن بودن یا حرفه ای بودن شما نیست.اگر از یه فریم ورک داری استفاده میکنی باز هم نمیتونه دلیل محکمی بر حرفه ای بودن شما باشه.تو خیلی از پروژه حتی با استفاده از فریم ورک و تکنولوژی بروز اون پروژه بعد مدتی به قول دوستان تو دیوار رفته.حتی اگر فوق لیسانس مرتبط هم داری دلیل بر برتری شما نیست دوست من.حالا باز یک مقدار دید شرکت ها بهتر شده شرط مدرک دیگه وجود نداره تو آگهی های استخدام.هزار نکته باریکتر ز مو این جاست  // نه هر که سر بتراشد قلندری داندنتیجهاول گفتیم حرفه ای تعاریف زیادی داره افراد رو با صفت های پویا تعریف نکنیم.مثلا بهتره بگیم فلانی چندتا پروژه خوب تو گیت هاب خودش داره که نشون میده تو گیت هاب فعال هست.یا فلانی واسه کارهای خودش تست نویسی هم میکنه و یا حتی میتونیم خصوصیت های اخلاقی رو هم مدنظر قرار بدیم.در کل بهتره واسه اظهار نظر دو تا دلیل منطقی بیاریم و بعد نتیجه گیری کنیم.دوم هم منظورم ساده بود سعی نکنیم علکی خودمون رو BOLD کنیم فقط بابت یسری موفقیت های دوپامین محور. </description>
                <category>مهدی فتحی</category>
                <author>مهدی فتحی</author>
                <pubDate>Sun, 30 Jun 2019 09:21:24 +0430</pubDate>
            </item>
                    <item>
                <title>از تجربه هامون بگیم نه از از ترجمه هامون!</title>
                <link>https://virgool.io/@mehdi.developer/%D8%A7%D8%B2-%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D9%87%D8%A7%D9%85%D9%88%D9%86-%D8%A8%DA%AF%DB%8C%D9%85-%D9%86%D9%87-%D8%A7%D8%B2-%D8%A7%D8%B2-%D8%AA%D8%B1%D8%AC%D9%85%D9%87-%D9%87%D8%A7%D9%85%D9%88%D9%86-v75elckzjn94</link>
                <description>سلام امروز میخواستم تجربه خودم رو از مطالعه جامعه وب بیشتر در موضوع نرم افزار و برنامه نویسی خصوصا در مورد PHP , Laravel بگم.شما هم شاید خیلی از مقالات رو دیدید که فقط نوشته اند طرز استفاده فلان چیز در فریم ورک فلان یا ویژگی های لاراول 5.6 یا حتی موضوعات به قدری کلیشه ای می شوند که شما وقتی میری به یه سمینار معتبر داخلی میبینی طرف میاد عین همون داکیومنت redis رو توضیح میده به علاوه نصب اون.خب خیلی از برنامه نویس ها اونقدر به زبان مسلط هستند که این مفاهیم پایه ای رو بدونن.بگذریم از اون دسته بلاگ هایی که عین داکیومنت رو با google translate ترجمه و منتشر میکنن.تجربهاما چیزای که کمتر بهش توجه میشه و خیلی هم مهم هستند تجربیات ما به عنوان یه توسعه دهنده در پروژه ها هستش.مثلا جای توضیح پترن ها میتونیم بیاییم تشریح کنیم که تو یک پروژه این پترن خیلی به درد من خورد به این دلایل و یا یکسری از تکنیک ها و مفاهیم که یکم پیچیده هستند.مثلا در مورد بعضی تکنیک های OOP مثله overriding من به شخصه ندیدم کسی صحبت کنه شاید هم اگر بوده خیلی گذری بوده.به نظر من خیلی بهتر میشه اگر یکم به بعضی موضوعات عمیق تر نگاه کنیم و همچنین از تجربه هامون بگیم از از ترجمه هایمان .Help others learn fishing instead of just giving them the fish.</description>
                <category>مهدی فتحی</category>
                <author>مهدی فتحی</author>
                <pubDate>Thu, 25 Apr 2019 09:40:26 +0430</pubDate>
            </item>
                    <item>
                <title>هر تکنولوژی جایی و مکانی دارد</title>
                <link>https://virgool.io/@mehdi.developer/%D9%87%D8%B1-%D8%AA%DA%A9%D9%86%D9%88%D9%84%D9%88%DA%98%DB%8C-%D8%AC%D8%A7%DB%8C%DB%8C-%D9%88-%D9%85%DA%A9%D8%A7%D9%86%DB%8C-%D8%AF%D8%A7%D8%B1%D8%AF-plyoh0nl6tps</link>
                <description>تازه یاد گرفته و کد می زند فکر میکند که فیس بوک گوگل یوتیوب چجوری دارن مثه ساعت کار میکنن.به زحمت یه اپاچی نصب میکنه و تو فروم های فارسی میگرده.براش جذابه که یه فیشینگ پیج درسته کنه و همه جا پز میده فکر میکنه با یادگیری یه زبان دیگه همه فن حریفه و با اون زبان دیگه یه فول استک باحال میشه وارد یه شرکت میشه و میبینه داستان خیلی با اون چیزی که فکر میکنه فرق داره.هر زبان جایی بخصوص خودش استفاده شده.و اونجا میفهمه هر تکنولوژی جایی و مکانی داره  شرح بالا داستان یک برنامه نویس تازه کار البته قطعا شامل خیلی از ما میشه.خیلی وقتها تعصبی روی یک زبان پافشاری بی خودی میکنم اونم به خاطر اینکه مثلا فیس بوک از این زبان استفاده کرده .خیلی سرتون رو درد نمیارم فقط ۳ تا نکته مینویسم امیدوارم به دردتون بخوره.خیلی وقتها اپلیکیشن های بزرگ محدود به یک زبان برنامه نویسی خصوصا بکند نیستند و حتی محدود به یک دیتابیس هم نیستند.مجموع همه اینها یک اپلیکیشن بزرگ رو میسازه. مثلا برای کارهای ساده تر  Php برای تسک های یکم سنگین تر مثه چت با کاربرای زیاد میتونه نود جی اس استفاده بشه.گاهی برای انجام کارهای هوشمندانه تر باید بیسیک تر مطالعه کنید مثه الگوریتم های که وجود داره و فهمیدن اونها به دردتون میخوره.و در آخر همیشه سریع دست به کد شدن به معنی سریع تمام کردن تسک مورد نظر نیست و همیشه قبل از  انجام کار حسابی روش فکر کنید.تبر خود را تیز کنید!</description>
                <category>مهدی فتحی</category>
                <author>مهدی فتحی</author>
                <pubDate>Sat, 20 Apr 2019 13:34:45 +0430</pubDate>
            </item>
                    <item>
                <title>معرفی پکیج Eloquent Filter</title>
                <link>https://virgool.io/@mehdi.developer/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D9%BE%DA%A9%DB%8C%D8%AC-eloquent-filter-safmxkzfebpq</link>
                <description>امروز میخوام یه پکیج کاربردی لاراول را معرفی کنم.یکی از کارهای تکراری که میتونه حتی حجم کد زیادی داشته باشه صفحات گزارش گیری هست که قطعا باید فیلتر های مختلفی از قبیل نام کاربری و سخت تر از اون فیلد تاریخ و شاید چندین فیلد دیگه باشه.خب معمولا این جور تسک ها حالت های مختلفی داره.مثلا معمولا شرط های مختلف میزارن که اگر فیلد نام پر بود یک کوعری دیگه ساخت بشه و مواردی دیگر که واقعا طاقت فرساست.نمونه یک صفحه گزارش گیریولی خب نگرانی نداره پکیج های زیادی برای این مشکل نوشته شده و حتی jeffrey way هم تو یکی از اموزشی ها یک راه حل خوب برای مشکل داده و خیلی ها از همین ایده گرفتند.این پکیج هم از همین ایده الهام گرفته.فقط با این تفاوت که دیگه شرط ها کاملا داینامیک هستند و شما دیگه نیازی نیست شرط ها رو برای هر فیلدی جدا بسازید!‌به طور پیشفرض هر فیلدی که پر می شود کوعری اون هم اجرا میشه که به طور پیشفرض مساوی با همون فیلد هستش.که البته شما میتونید متد خودتون رو بسازید و اون رو override کنید.همچنین برای تاریخ هم به صورت جدا یک ساختاری پیشنهاد شده که میتونید با استفاده از اون دیگه راحت کوعری های مربوط به فیلد تاریخ هم اجرا کنید.این لینک پکیج هستش خوشحال میشم نظرات شما رو بشنوم.</description>
                <category>مهدی فتحی</category>
                <author>مهدی فتحی</author>
                <pubDate>Sat, 20 Apr 2019 10:43:31 +0430</pubDate>
            </item>
            </channel>
</rss>