<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های محمود محمدآبادی</title><link>https://virgool.ir/feed/@mahmod.m2</link><description>برنامه نویس با سابقه PHP - Laravel , عاشق تکنولوژی و علاقه به کارآفرینی mahmood.nh2008@gmail.com</description><language>fa</language><pubDate>2026-11-11 07:25:23</pubDate><image><url>https://files.virgool.ir/upload/users/27156/avatar/8XYzsH.jpeg</url><title>محمود محمدآبادی</title><link>https://virgool.ir/@mahmod.m2</link></image><item><title>پکیج multiselect-vue و مقدار پیش فرض</title><link>https://virgool.ir/@mahmod.m2/پکیج-multiselect-vue-و-مقدار-پیش-فرض-f7r3xwji009s</link><description>سلام دوستان٬یک مشکلی روی این پکیج داشتم که توی داکیومنت خیلی شاید خوب توضیح نداده باشن و یا اینکه من یه مقدار سخت فهمیدم!!وقتی options رو تعریف میکنید و اگر خواستید به سلکت مورد نظر یک مقدار به عنوان دیفال بدید (مثل  select box که بهش توی لیست selected میدادیم)٬ این مقدار دیفالت باید دقیقا مثل ساختاری باشه که توی options دارید قرار میدید. مثال:ما اگر همچین آپشن هایی داشته باشیمoptions: [&#xA;  {language: &#39;JavaScript&#39;, library: &#39;Vue.js&#39; },&#xA;  { language: &#39;JavaScript&#39;, library: &#39;Vue-Multiselect&#39; },&#xA;  { language: &#39;JavaScript&#39;, library: &#39;Vuelidate&#39; }&#xA;]حالا مقدار دیفالت ما باید اینجوری باشه:value: { language: &#39;JavaScript&#39;, library: &#39;Vue-Multiselect&#39; }چون من رو گیج کرده بود صلاح دیدم یک پست ش کنم اینجا تا شاید یکی مثل من باهاش مشکل داشت و از ساختار ش رو متوجه بشهموفق باشید </description><category>محمود محمدآبادی</category><author>محمود محمدآبادی</author><pubDate>Fri, 29 Sep 2023 13:36:09 +0330</pubDate></item><item><title>تست پکیج Laravel Socialite در برنامه</title><link>https://virgool.ir/fboard/تست-پکیج-laravel-socialite-در-برنامه-vnyie38zebeq</link><description>در این  آدرس گیت هاب یک نمونه تست پکیج Socialite برای فرم وورک لاراول (Laravel) وجود داره که میتونیم در تست نویسی های خودمون ازش استفاده کنیم.این ریپوزیتوری رو به صورت تست برای یک جایی نوشته بودم که فکر کردم شاید بعضی از دوستان مثل من براشون سوال باشه چطوری میتونن یک Mock برای پکیج معروف Socialite ایجاد کنن و ازش در تست های خودشون استفاده کنن. و همچنین چطوری سرویسی که نوشتن رو براش یک service container ایجاد کنند.همچنین یک سرویس دیگری هم موجوده برای فشرده سازی فایل که شاید مفید واقع بشه.نمونه ای از تست انجام شده</description><category>محمود محمدآبادی</category><author>محمود محمدآبادی</author><pubDate>Sun, 13 Feb 2022 17:41:41 +0330</pubDate></item><item><title>ساخت یک کامپوننت Todo با Livewire با نکات مفید</title><link>https://virgool.ir/@mahmod.m2/ساخت-یک-کامپوننت-todo-با-livewire-با-نکات-مفید-otuh7yglk3xl</link><description>همانطور که در مقاله قبل (فول استک کار کردن با Laravel Livewire) در مورد livewire توضیح دادم و هچنین روش ایجاد یک کامپوننت رو نشون دادم٬ در این مقاله توضیحات بیشتری به همراه قابلیت های دیگر در مورد این پکیج قرار میدم. چون در عمل و تمرین مطلب رو بهتر درک میکنیم.قدم اول٬ با استفاده از دستور زیر یک کلاس یا کامپوننت جدید از livewire ایجاد میکنیم.php artisan livewire:make Todoما یک فرم به صورت عکس زیر درست کردیم و همچنین در انتهای فرم لیست Todo های اضافه شده رو نشون میدیم.کد نویسی در کامپوننت ایجاد شده از Livewireاز اونجایی که ما در حال حاضر نمیخوایم با دیتابیس کار کنیم٬ یک آرایه ایجاد میکنیم که لیست Todo ها رو نشون بدیم. (البته به همین روش میتونیم به راحتی به دیتابیس وصل شد!)ما مقادیری که نیاز داریم در لایه نمایشی (در فایل Blade) باهاشون کار کنیم٬ طبق روش زیر به کلاس کامپوننت اضافه میکنیم:/**&#xA; * Title in form&#xA; * @var string&#xA; */&#xA;public $title;&#xA;&#xA;/**&#xA; * Content or Desc in form&#xA; * @var strnig&#xA; */&#xA;public $content;&#xA;&#xA;/**&#xA; * List of Items&#xA; * @var array&#xA; */&#xA;public $list;&#xA;با استفاده از متد mount میتونیم به پارامتر list مقدار بدیم (اگر با VueJs آشنایی داشته باشید٬ این متد دقیقا کار متد mount در این کتابخانه از جاوااسکریپت رو انجام میده)  این متد زمانی که کلاس برای اولین بار در یک صفحه لود میشه٬ اجرا میشه! /**&#xA; * Mount component (Like VueJs Mount)&#xA; */&#xA;public function mount()&#xA;{&#xA;    $this-&gt;list = collect();&#xA;}به این پارامتر یک Collection پاس میدیم که قابلیت بیشتری برای کار با آرایه ها داشته باشیم.برای دریافت مقادیر از فرم و اضافه کردن به لیست Todo ها یک متد Submit ایجاد میکنیم./**&#xA; * Submit form&#xA; */&#xA;public function submit()&#xA;{&#xA;    $this-&gt;list-&gt;push([&#xA;        &#39;id&#39; =&gt; Str::uuid(),&#xA;        &#39;title&#39; =&gt; $this-&gt;title,&#xA;        &#39;content&#39; =&gt; $this-&gt;content,&#xA;    ]);&#xA;&#xA;    $this-&gt;emit(&#39;removeFormFields&#39;);&#xA;}پارامترهای title و content رو از فرم دریافت میکنیم و به لیست اضافه میکنیم. بعد از اضافه شدن آیتم٬ یک متد emit صدا زده شده٬ کار این متد اجرا کردن یک متد تعریف شده در کلاس مربوطه یا در کلاس/کامپوننت های اجرا شده در همان صفحه وب جاری است!protected $listeners = [         &#39;removeFormFields&#39;     ];زمانی که برای یک event متد (function) تعریف میکنیم٬ پارامتر بالا رو نیازه به کلاس کامپوننت  اضافه کنیم تا متد تعریف شده شناسائی بشه.حتی با استفاده از  متد emit میتونیم یک event در سمت جاوااسکریپت اجرا کنیم و عملیات مورد نظر خودمون رو انجام بدیم. یک نمونه در همین مثال آماده کردم که در ادامه نشون میدم.در این بخش ما متد removeFormFields رو در کلاس Todo خودمون ایجاد کردیم که بگیم بعد از ایجاد٬ مقادیر title و content رو null یا خالی کن٬ این کار در فرم html ما عمل میکنه و مقادیر وارد شده را بعد از ایجاد حذف میکنه./**&#xA; * Remove Form Fields and trigger todoIsAdded Event&#xA; */&#xA;public function removeFormFields()&#xA;{&#xA;    $this-&gt;title = null;&#xA;    $this-&gt;content = null;&#xA;&#xA;    $this-&gt;emit(&#39;todoIsAdded&#39;);&#xA;}همانطور که در کد بالا نشون داده٬ بعد از خالی کردن مقادیر٬ یک event به اسم todoIsAdded صدا زده شده٬ اما برای این یک نوع٬ هیچ متد ی در کلاس ننوشتم و در Javascript به عنوان یک Listener گرفته و عملیات انجام میدم.@livewireScripts&#xA;....&#xA;&#xA;    window.livewire.on(&#39;todoIsAdded&#39;, function (){&#xA;        alert(&#39;The ToDo item is added!&#39;)&#xA;    });&#xA;کد بالا  (یک alert رو اجرا میکنه) زمانی اجرا میشه که  event todoIsAdded صدا زده بشه! به همین صورت ما میتونیم به تعداد دلخواه در یک صفحه event تعریف کنیم و به کامپوننت های مختلف دسترسی داشته باشیم. همچنین حتی میتونیم به کامپوننت های مختلف با استفاده از متد emit مقادیری رو پاس بدیم!در نهایت یک متد Remove هم تعریف میکنم که Todo ها رو پاک کنیم./**&#xA; * Remove item&#xA; * @param $id&#xA; */&#xA;public function remove($id)&#xA;{&#xA;    $this-&gt;list = $this-&gt;list-&gt;reject(function ($item) use ($id) {&#xA;        return $item[&#39;id&#39;] == $id;&#xA;    });&#xA;}HTML&lt;div class=&#34;lg:px-8&#34;&gt;&#xA;    &lt;form wire:submit.prevent=&#34;submit&#34;&gt;&#xA;        &lt;div class=&#34;col-md-4&#34;&gt;&#xA;            &lt;div class=&#34;form-group&#34;&gt;&#xA;                &lt;label for=&#34;title&#34;&gt;Title:&lt;/label&gt;&#xA;                &lt;input type=&#34;text&#34; placeholder=&#34;Title&#34; wire:model.lazy=&#34;title&#34; class=&#34;form-control&#34;&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div class=&#34;col-md-4&#34;&gt;&#xA;            &lt;div class=&#34;form-group&#34;&gt;&#xA;                &lt;label for=&#34;title&#34;&gt;Desc:&lt;/label&gt;&#xA;                &lt;textarea type=&#34;text&#34; placeholder=&#34;Desc&#34; wire:model.lazy=&#34;content&#34; class=&#34;form-control&#34;&gt;&lt;/textarea&gt;&#xA;            &lt;/div&gt;&#xA;        &lt;/div&gt;&#xA;        &lt;div class=&#34;btn-group&#34; style=&#34;margin-top: 10px&#34;&gt;&#xA;            &lt;label for=&#34;&#34;&gt;&lt;/label&gt;&#xA;            &lt;button class=&#34;btn btn-primary&#34;&gt;Submit&lt;/button&gt;&#xA;&#xA;        &lt;/div&gt;&#xA;&#xA;    &lt;/form&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;div class=&#34;col-md-6&#34;&gt;&#xA;    Show List:&#xA;    @if(!$list-&gt;count()) &lt;p&gt;There is no result.&lt;/p&gt; @endempty&#xA;&#xA;    &lt;ol class=&#34;list-group list-group-numbered&#34;&gt;&#xA;        @foreach($list as $item)&#xA;        &lt;li class=&#34;list-group-item d-flex justify-content-between align-items-start @if(($loop-&gt;index + 1) % 2 == 0) list-group-item-primary @endif&#34;&gt;&#xA;            &lt;div class=&#34;ms-2 me-auto&#34;&gt;&#xA;                &lt;div class=&#34;fw-bold&#34;&gt;{{$item[&#39;title&#39;]}}&lt;/div&gt;&#xA;                {{$item[&#39;content&#39;]}}&#xA;            &lt;/div&gt;&#xA;            &lt;span class=&#34;btn btn-danger btn-sm&#34; wire:click=&#34;remove(&#39;{{$item[&#39;id&#39;]}}&#39;)&#34;&gt;Remove&lt;/span&gt;&#xA;        &lt;/li&gt;&#xA;        @endforeach&#xA;    &lt;/ol&gt;&#xA;&lt;/div&gt;PHP&lt;?php&#xA;&#xA;namespace App\Http\Livewire;&#xA;&#xA;use Illuminate\Support\Str;&#xA;use Livewire\Component;&#xA;&#xA;class Todo extends Component&#xA;{&#xA;    protected $listeners = [&#xA;        &#39;removeFormFields&#39;&#xA;    ];&#xA;&#xA;    /**&#xA;     * Title in form&#xA;     * @var string&#xA;     */&#xA;    public $title;&#xA;&#xA;    /**&#xA;     * Content or Desc in form&#xA;     * @var string&#xA;     */&#xA;    public $content;&#xA;&#xA;    /**&#xA;     * List of Items&#xA;     * @var array&#xA;     */&#xA;    public $list;&#xA;&#xA;    /**&#xA;     * Mount component (Like VueJs Mount)&#xA;     */&#xA;    public function mount()&#xA;    {&#xA;        $this-&gt;list = collect();&#xA;    }&#xA;&#xA;    /**&#xA;     * Submit form&#xA;     */&#xA;    public function submit()&#xA;    {&#xA;        $this-&gt;list-&gt;push([&#xA;            &#39;id&#39; =&gt; Str::uuid(),&#xA;            &#39;title&#39; =&gt; $this-&gt;title,&#xA;            &#39;content&#39; =&gt; $this-&gt;content,&#xA;        ]);&#xA;&#xA;        $this-&gt;emit(&#39;removeFormFields&#39;);&#xA;    }&#xA;&#xA;    /**&#xA;     * Remove Form Fields and trigger todoIsAdded Event&#xA;     */&#xA;    public function removeFormFields()&#xA;    {&#xA;        $this-&gt;title = null;&#xA;        $this-&gt;content = null;&#xA;&#xA;        $this-&gt;emit(&#39;todoIsAdded&#39;);&#xA;    }&#xA;&#xA;    /**&#xA;     * Remove item&#xA;     * @param $id&#xA;     */&#xA;    public function remove($id)&#xA;    {&#xA;        $this-&gt;list = $this-&gt;list-&gt;reject(function ($item) use ($id) {&#xA;            return $item[&#39;id&#39;] == $id;&#xA;        });&#xA;    }&#xA;&#xA;    /**&#xA;     * Render component view&#xA;     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View&#xA;     */&#xA;    public function render()&#xA;    {&#xA;        return view(&#39;livewire.todo&#39;);&#xA;    }&#xA;}با استفاده از ویژگی های livewire کارهای بسیاری رو میتونیم بدون نوشتن کد در جاوااسکریپت انجام بدیم و برنامه های خودمون رو پویا سازی کنیم.امیدوارم مطالب مفید باشه٬ آرزوی سلامتی و موفقیت دارم.</description><category>محمود محمدآبادی</category><author>محمود محمدآبادی</author><pubDate>Wed, 21 Apr 2021 14:14:10 +0430</pubDate></item><item><title>فول استک کار کردن با Laravel Livewire</title><link>https://virgool.ir/@mahmod.m2/فول-استک-کار-کردن-با-laravel-livewire-dz9mcl3spxw1</link><description>شاید جمله فول استک (Full Stack) برای با تجربه ها یه مقدار سنگین باشه. اما میتونم به جرأت بگم با livewire به ساده ترین شکل حدود ۷۰ تا ۸۰ درصد یک پروژه رو (یک شخصی که لاراول کار هست) میتونید انجام بدید٬‌ یا حداقل کد جاوا اسکریپتی به مراتب کمتر بزنید!حالا Livewire چی هست؟به تعریف خود تیم٬‌ یک ابزار یا فریم وورک برای فول استک کارکردن در لاراول٬ بدون از دست دادن راحتی کار با لاراول!یعنی شما میتونی با کد های PHP و طبق ساختاری که وجود داره٬ کد های سمت فرانت-اند هم بنویسی که اتوماتیک تولید میشه. به شخصه تجربه کار با این ابزار رو خیلی داشتم و رو یکی از سایت های مشتری٬ سمت فرانت رو به صورت  Full-Ajax (به قول خودمون) کار کردم.نصب پکیجخیلی راحت روی پروژه لاراولی که دارید میتونید با استفاده از دستور زیر اقدام به نصب  پکیج کنید.composer require livewire/livewireیک فایل JS و یک فایل CSS هم داره که باید به پروژه اضافه بشه....&#xA;@livewireStyles&#xA;&lt;/head&gt;&#xA;&lt;body&gt;&#xA;&#xA;@livewireScripts&#xA;&lt;/body&gt;&#xA;&lt;/html&gt;از طریق دستور زیر  یک کامپوننت از Livewire ایجاد میشهphp artisan make:livewire counterالباقی دستورات و طریقه استفاده در خود داکیومنت Livewire موجود هستش. جمع بندیهمانطور که توضیح دادم livewire یک پکیج بسیار مناسبه که قدرت عالی ای به برنامه نویس (سمت سرور) میده و میتونه در مواقع لزوم پروژه رو خودش هندل کنه و از مزایا زیر بهره ببره:تولید کد های سمت فرانت با PHPایجاد کامپوننت های دلخواه از Livewireقابلیت اتصال کامپوننت ها به هم دیگه. یعنی شما میتونی با استفاده از متد emit یک event رو صدا بزنی که در صفحه موجوده و عملیات خاصی رو انجام بدی.ایجاد فرم با قابلیت realtime validation و ....هدف من معرفی ابتدایی این ابزار بود که آشنا بشیم. از اونجایی که من دوست دارم مطالب مفید و جدی تری رو به اشتراک بزارم که شخصا تجربه کردم٬‌ به همین دلیل حتما یک سری آموزش کاربردی از این پکیج عالی با مثال آماده میکنم.امیدوارم مطالب مفید باشه٬ آرزوی سلامتی و موفقیت دارم.</description><category>محمود محمدآبادی</category><author>محمود محمدآبادی</author><pubDate>Mon, 19 Apr 2021 21:00:11 +0430</pubDate></item><item><title>لاراول - نمونه متد release در Job</title><link>https://virgool.ir/@mahmod.m2/لاراول-نمونه-متد-release-در-job-tkwycvfj7lnv</link><description>لاراول٬ ابزار محبوب و قدرتمند یک ماژول فوق العاده داره به اسم Queue یا صف که قابلیت های بسیار خوبی داره و میتونیم ازش به عنوان یک Worker تو برنامه خودمون استفاده کنیم! به برنامه نویس قدرت خاصی میده٬ مخصوصا زمانی که میخوایم با سرویس دهنده های دیگر در برنامه خودمان کار کنیم. مثل ارسال SMS یا ارسال EMAIL و موارد دیگری که نیاز داریم به سرویس دهنده وصل بشیم و باعث میشه کاربر زمانی رو معطل بمونه تا درخواست رد و بدل بشه و این برای کاربر تجربه خوبی نخواهد شد!قطعا نیاز داریم مباحث مربوط به ماژول Queue  رو در داکیومنت خود لاراول بخونیم و من اینجا در مورد مباحث ابتدایی مثل موارد پایه ای توضیح نمیدم. هدف من به اشتراک گذاشتن تجربیات مفیدی هست که در طی کار باهاشون برخورد کردم و متوجه مفید بودن این موارد در طولانی مدت شدم.یک نمونه از معرفی متد release در Job برای تکرار فرایندفرض کنید ما یک مدل Post داریم و میخوایم بعد از اینکه این مدل فعال شد (منتشر شد) در سیستم یک کاری انجام بدیم یا یک ایمیلی به کاربر ارسال کنیم.با استفاده از دستور زیر یک Job ایجاد میکنیم:php artisan make:job PostJobبه کلاس ایجاد شده مدل Post رو پاس میدیم (میتونیم به صورت مستقیم بعد از ایجاد شدن مدل اینکارو کنیم و یا از Model Observer استفاده کنیم). با کمک SerializesModel trait لاراول میتونیم به کلاس هایی که نیاز داریم مدل بفرستیم که این میتونه خیلی مفید باشه در بعضی موارد مثل Event.حالا میتونیم در handle function کاری که میخوایم رو انجام بدیم. به این صورت:if($this-&gt;post-&gt;status == Post::ACTIVE) {&#xA;    // Do some stuff&#xA;} else {&#xA;    $this-&gt;release(3600);&#xA;}متد release() در کد بالا برای زمانی به کار میره که ما میخوایم چندین بار یک مقدار رو چک کنیم. اینجا توی کد میگیم: اگر وضعیت مدل فعال نشده بود٬ ۱ ساعت دیگه بیا و مجدد چک کن که وضعیت فعال شده یا نه.یک ویژگی دیگه ای که میتونیم ازش برای این بخش استفاده کنیم و خیلی کاربردی هست٬ اضافه کردن یک پارامتر (در ادامه مثال زدم) به کلاس Job هستش.public $tries = 3 // تعداد دفعاتی که میخواید سیستم مدل رو بررسی کنهبعد از ۳ بار تلاش اگر مدل یا پست مربوطه فعال نشده بود٬ عملیات این Job مربوط به مدل متوقف میشه.فایل کامل کلاس PostJob &lt;?php&#xA;&#xA;namespace App\Jobs;&#xA;&#xA;use App\Models\Post;&#xA;use Illuminate\Bus\Queueable;&#xA;use Illuminate\Contracts\Queue\ShouldBeUnique;&#xA;use Illuminate\Contracts\Queue\ShouldQueue;&#xA;use Illuminate\Foundation\Bus\Dispatchable;&#xA;use Illuminate\Queue\InteractsWithQueue;&#xA;use Illuminate\Queue\SerializesModels;&#xA;&#xA;class PostJob implements ShouldQueue&#xA;{&#xA;    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;&#xA;&#xA;    /**&#xA;     * @var int&#xA;     */&#xA;    public $tries = 3;&#xA;&#xA;    /**&#xA;     * @var Post&#xA;     */&#xA;    public $post;&#xA;&#xA;    /**&#xA;     * Create a new job instance.&#xA;     *&#xA;     * @param Post $post&#xA;     */&#xA;    public function __construct(Post $post)&#xA;    {&#xA;        $this-&gt;post = $post;&#xA;    }&#xA;&#xA;    /**&#xA;     * Execute the job.&#xA;     *&#xA;     * @return void&#xA;     */&#xA;    public function handle()&#xA;    {&#xA;        if($this-&gt;post-&gt;status == Post::ACTIVE) {&#xA;            // Do some stuff&#xA;        } else {&#xA;            $this-&gt;release(3600);&#xA;        }&#xA;    }&#xA;}امیدوارم مطالب برای شما مفید باشه. آرزوی سلامتی و موفقیت دارم.</description><category>محمود محمدآبادی</category><author>محمود محمدآبادی</author><pubDate>Sun, 18 Apr 2021 12:01:09 +0430</pubDate></item><item><title>حسابداری و سپس برنامه نویسی (سمت سرور)!!</title><link>https://virgool.ir/fboard/حسابداری-و-سپس-برنامه-نویسی-سمت-سرور-tvqirfyas0px</link><description>داستان برنامه نویس شدن من از کجا شروع شد؟؟!! این موضوعی بود که همیشه دوست داشتم در موردش بنویسم و شاید کسی باشه که مثل من علاقه شدید به دنیای اینترنت/وب داره و در دوراهی گیر کرده باشه.توضیحی در مورد حسابداری و دانشگاهسال ۱۳۸۶ دیپلم حسابداری رو با معدل خوب گرفتم و سال ۱۳۸۷ وارد دانشگاه پیام نور در رشته حسابداری شدم٬ چون اصلا دوست نداشتم برای کنکور صبر کنم و پشت کنکور بمونم و از ابتدا برای همه ی کارهام عجله داشتم٬ این باعث میشد که صبوری نکنم و تصمیمات عجولانه ای بگیرم.تو حسابداری خیلی خوب ظاهر شدم! و واقعا مطالب رو عالی درک میکردم ٬ چون پایه حسابداریم تو دبیرستان قوی بود و چندباری در امتحانات سطح شهر قبول شده بودم. اما چون به بعضی از درس های عمومی علاقه ای نداشتم عملکردم ضعیف بود و نمره خوبی نمیگرفتم.از همون سال ها توی اینترنت با کارهای مختلف مشغول بودم مثل: تبلیغات (سایت های Offer) - ادمین سایت و یا کارهای دیگه که ازش درآمد کمی داشتم.تو دانشگاه نزدیک ۸۰ واحد پاس کردم (چون کارشناسی پیوسته بود) و احساس کردم دیگه نمیتونم  حسابداری رو ادامه بدم  و تمام فکر و ذهنم تو اینترنت بود و شدیدا به این علاقه داشتم که چطوری میتونم یک سایت برای خودم طراحی کنم! همیشه تو سایت ها میگشتم و از خودم سوال میکردم چطوری این سایت ها رو تولید میکنند. اطراف من دوست یا آشنایی نبود که تو این زمینه کار کرده باشه و یا تجربه داشته باشه٬ حتی کسی هم نبود که آشنایی داشته باشه از این موضوع!!! به خاطر همین همیشه سوال شده بود برام که چطوری؟!!!کم و بیش تو اینترنت گشته بودم و یک سری کلاس هم شرکت کردم تا برنامه نویسی وب (با زبان php) رو خیلی مبتدی یاد بگیرم! و با یکی از دوستام که اون زمان از اینترنت پیدا کرده بودم٬ html - css کار میکردم و به صورت ابتدایی بهم آموزش میداد.داستان برنامه نویس شدن من از اینجا شروع میشه!!سال ۱۳۹۰ تصمیم گرفتم دانشگاه رو کلا بیخیال بشم و سریعا تو یک کلاس برنامه نویسی که آقای کرامتی فر محترم برگزار میکرد شرکت کنم. اسم دوره (برنامه نویس پیشرفته php) که در این دوره معماری  MVC رو آموزش میدادن به همراه Store procedure در Mysql ٬ به همراه Smarty Engine برای بخش فرانت و لایه های نمایش وب سایت!بعد از شرکت در این کلاس٬ آشنایی من با طراحی وب و مواردش بیشتر شد و علاقم هم خیلی بیشتر شد٬ در حدی که برای یک دوستی در کانادا طراحی سایت های خوب به صورت رایگان انجام میدادم :D و ایشون هم خیلی خوشحال بود که به من کار داده تا تجربه کسب کنم!!بعد از اون٬ در یک شرکت بین المللی استخدام شدم (به صورت دورکاری) که با ووردپرس کار میکردن و در تیم پشتیبان و توسعه٬ همکاری میکردم و از این دوره کاری گذشت تا الان که با شرکت های بسیاری در پروژه های متعدد تجربه کاری داشتم و از مسیری که انتخاب کردم بسیار خوشحال هستم. اما طی این چند سال مواردی هست که به شخصه تجربه کردم (از دانشگاه تا وارد شدن به حوزه برنامه نویسی) که در انتها براتون مینویسم که شاید کمکی بشه به دوستانی که در شرایط یکسان با من هستند.همانطور که توضیح دادم٬ من برنامه نویسی (سمت سرور) رو در دانشگاه نخوندم و با مباحث ابتدایی این حوزه اصلا و ابدا آشنایی نداشتم و واقعا سختی خیلی زیادی کشیدم تا این موارد رو یاد بگیرم و از همه مهمتر درک کنم!!حالا چرا برام سخت بود؟! با مباحث ابتدایی مثل data type آشنایی نداشتمبا مباحث شی گرایی و الگوریتم آشنایی نداشتمبا بعضی معماری ها آشنا نبودماصول طراحی اپلیکیشن رو نمیدونستمبا طراحی دیتابیس آشنایی نداشتم.....این موارد باعث شده بود که با سختی بیشتری تو حوزه برنامه نویسی وارد بشم! و نگم براتون که چی کشیدم تا وقتی این موارد رو بتونم درک کنم. چون چند سال پیش مثل الان این همه منبع در دسترس ما نبود. یادمه جناب آقای مهندس شهرکی که آدم واقعا خوب و خوش برخوردی بود رو پیدا کرده بودم٬ کلی بهشون پیام میدادم و سوالاتم رو ازشون میپرسیدم. ایشون هم خیلی با صبر جواب بنده رو میدادند.دوستانی که در شرایط بنده هستند چیکار کنند تا کمتر با این مشکلات  مواجه بشن؟دوستانه میگم٬ اگر میخواید وارد این حوزه بشید موارد زیر رو پیشنهاد میکنم:با مباحث HTTP و درخواست های سمت سرور آشنا بشید٬ در حدی که راجع بهشون بدونید.. همین!اگر مثل من در دانشگاه در رشته دیگه ای غیر از نرم افزار هستید: یک کتاب مناسب در زمینه الگوریتم و فلوچارت بخونید. و روش برنامه نویسی رو خوب درک کنید..اگر مثل من در دانشگاه ...: مباحث شی گرائی رو حتما خوب درک کنید.اگر مثل من در دانشگاه ...: با معماری ها آشنا بشید.دوره ی طراحی دیتابیس رو حتما  بگذرونید و یا از یک منبع خوب فرا بگیرید.نمونه کد های غیر ایرانی رو مرور و مطالعه کنید.با روش های کد نویسی تمیز و مناسب آشنا بشید (کتاب هایی هم در این زمینه هست)به داکیومنت نویسی عادت داشته باشید و این عادت با تمرین شکل میگیره.منبع اصلی من برای آموزش ها بیشتر تو Youtube بوده٬ به همراه اون آموزش های زیادی از کتاب خوندن و سرچ کردن در مورد یک مطلب و یا شرکت در دوره های آنلاین بوده.طریقه خوب سرچ کردن در گوگل رو باید فرا بگیریم و تجربه کنیم.زبان انگلیسی تو آموزش هاتون خیلی میتونه کمک کنه. در کل زبان انگلیسی برای همه قشری بخصوص برنامه نویسی عالیه! و باید براش زمان مناسب گذاشت.تو سایت های مناسب و مربوطه subscribe کنید تا از اخبار و فیچر های جدیدی که در زمینه زبان برنامه نویسی مورد نظر ایجاد میشوند مطلع بشید.و در نهایت باید خودتون رو همیشه به روز نگه دارید تا در این صنعت رشد مناسب داشته باشید.امیدوارم مطالب براتون مفید باشه. آرزوی سلامتی و موفقیت دارم.</description><category>محمود محمدآبادی</category><author>محمود محمدآبادی</author><pubDate>Sat, 17 Apr 2021 21:11:48 +0430</pubDate></item></channel></rss>