<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های امین کشاورز</title>
        <link>https://virgool.io/feed/@aminkt</link>
        <description>چپتر لید و با حفظ سمت تیم لید اسنپ فود. اکس تک لید دیجی کالا. پروداکت اونر اسبق بیمه بازار و معمار نرم افزار :)). برای اطلاعات بیشتر به لینکدینم مراجعه کنید: https://www.linkedin.com/in/aminkt/</description>
        <language>fa</language>
        <pubDate>2026-06-07 17:29:22</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/8841/avatar/xkk2Ts.jpg?height=120&amp;width=120</url>
            <title>امین کشاورز</title>
            <link>https://virgool.io/@aminkt</link>
        </image>

                    <item>
                <title>طراحی و معماری سایت خبرخوان</title>
                <link>https://virgool.io/VENZOOO/%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%88-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%AE%D8%A8%D8%B1%D8%AE%D9%88%D8%A7%D9%86-u0lbpya53k2h</link>
                <description>قصد دارم معماری یک نرم افزار خبرخوان را که با crawl کردن یه سری سورس مشخص Feed های خودش را محیا میکند و در اختیار کاربر قرار میدهد را در این پست با شما به اشتراک بگذارم.این نرم افزار، فرضا چندین سایت دیگر (مانند Twitter، دیجیاتو، دیجی کالا و ...) را برای یافتن پست هایشان Crawl میکند و در وب سایت خود پست میکند. کاربران با ثبت نام و مشخص کردن دسته بندی های مورد علاقه خود، به پست های مرتبط از سورس های متعدد دسترسی پیدا میکنند. هم چنین با لایک کردن پست ها، نشان میدهند چه محتوایی برایشان جالب بوده و این محتوا نیز در صفحه Feed آنها به نمایش در می آید.بعد از مشخص کردن نیازمندی های سیستم، برویم سراغ طراحی سیستم.در ابتدا عرض کنم که این سیستم کامل طراحی نشده و صرفا جنبه آموزشی دارد. خوشحال میشوم در صورتی که دوست داشتید، نکاتی که به ذهنتان می آید در قسمت کامنت ها بیان کنید تا محتوای پست غنی تر شود.دیتا مدل (Data Model)News Reader Data Modelبه نظرم خیلی نیاز نیست راجع به دیتا مدل صحبت بکنم.چندتا نکته رو صرفا اشاره میکنم:دسته بندی پست ها به صورت خودکار، مانند سایت ویرگول انجام میشه. چون نمیتونیم به طور قطع تو خیلی از موارد پست ها رو به یه دسته بندی خاص مرتبط کنیم، برای همین یک پست رو تو دسته بندی هایی که فکر میکنیم درسته دسته بندی میکنیم.برای محیا کردن فید کاربران، یک تیبل خواهیم داشت تا توسط ورکر ها و سرویس های بک گراند این فید ها محاسبه و برای کاربران مشخص بشوند.معماری کرالر ها (Crawlers) از اونجایی که Crawl کردن یک سایت کار ساده ای نیست و این سیستم باید تعداد زیادی سایت رو در زمان کم کرال کنه تا بتونه محتوای خوب و آپدیتی رو به کاربر نشون بده، پس یه معماری مناسب نیاز داریم.از اونجایی که قبلا گفتم سایت هایی که کرال میکنیم از قبل مشخص هست، از کلاس CrawlContentProcessor برای کرال کردن استفاده میکنیم (نمودار سمت راست).وقتی سرویس رو اجرا میکنیم، بعد از مراجعه به هر صفحه، یک سری لینک مشخص میشوند و درخواست کرال کردن این صفحات جدید در یک صف افزوده میشه تا ورکر هایی که محتوا این صفحات رو قراره بخونن به ترتیب از اون صف اطلاعات رو بردارند و برند صفحه رو کرال کنند.چرا این بخش رو جدا کردم؟ چون نتورک استیبل نیست. یک سایت کند هست، یک سایت بالا نمیاد و غیره، ما دیتا این سایتا رو درواقع برای مدت زمان مشخصی کش میکنیم تا CrawlContentProcessor بتونه با سرعت بیشتری کارش رو انجام بده.اگر توجه کرده باشید، یه متد تو CrawlContentProcessor هست که مشخص میکنه این آدرس قبلا کرال شده و پردازش شده یا نه.موقع پیاده سازی این متد حواستون باشه که باید یه ساختاری پیدا کنید که از رو آدرس صفحه بفهمید این صفحه قبلا کرال شده یا نه. یکی از مشکلات احتمالیتون پارامتر سورت یا کوئری پارامتر هایی هست که تو محتوا صفحه تغییری ایجاد نمیکنه.دوست داشتید این پست رو به اشتراک بذارید تا دوستامونم بیان و نظر بدن.ممنونم</description>
                <category>امین کشاورز</category>
                <author>امین کشاورز</author>
                <pubDate>Sat, 22 May 2021 00:45:01 +0430</pubDate>
            </item>
                    <item>
                <title>روند سکون من</title>
                <link>https://virgool.io/@aminkt/%D8%B1%D9%88%D9%86%D8%AF-%D8%B3%DA%A9%D9%88%D9%86-%D9%85%D9%86-u79b7dciabgu</link>
                <description>تهران را با همه خوبی هایش باید انداخت در سطل های زبالهبچه تر که بودم فکر میکردم که چقد زندگی در تهران میتواند جذاب باشد. اصلا در شهری که من بودم تهرانی بودن نوعی مزیت به حساب می آمد. آن دختر ها و پسرهای خوش تیپ با کلاس و خوش اخلاقی که از تهران می آمدند و ما بچه شهرستانی ها لباس های قشنگمان را سال به سال نمیپوشبدیم تا مگر دنیا التفاتی کند و ما راهی تهران بشویم. عقده ای در دلمان بود که صاف نمیشد. انگاری توی مغز کوچک و خاممان کرده بودند تهرانی ها ذاتا از بدو تولد خوشبختند. ریشه های نژاد پرستی مزبوحانه داشت درونمان شکل میگرفت اما از نوع برعکسش؛ اینطوریا که میگویی آنها بهتر از ما هستند.هرچه جلوتر رفتم این حس را در تمام دوستان هم شهری ام دیدم. رفتم رشت آنجا هم دیدم. اما ماجرا برای آنان که در تهران زندگی میکردند از زمین تا آسمان با این فکر کودکانه من فرق میکرد. من دیگر نمیدانستم تهران برای چه بهتر از این شهر باران خیز شمالی کشور است. اینجا که هم دریا دارد، هم کوه و هم جنگل. مردمانش شادند، میخندند و تا دمیدن سحر بیدارند و در شهر دور دور میکنند و کافه میروند و وقتی دلشان گرفته سوار ماشینشان میشوند، میگازند تا انزلی و آبجوشان را میل میکنند و سیگاری بر لب می نهند و دل روحشان را حسابی جا می آورند.الان و دقیقا همین ثانیه من دیگر رسما تهرانی حساب میشوم. دست کم تا به کسی نگویم کجاییم برای آن که در تهران خانه ای اجاره کرده هم و سرکار میروم تهرانی محسوب میشوم اما حالم عجیب درهم است از احوالات این شهر.بگذارید در ابتدا بگویم این افکار رنجور من از اوضاع است و اگر پیشنهادی دارید برای بهتر شدندش آغوش بنده تا آن نوک به نوک انگشتان وسط دست چپ و راستم باز است.من حالم از این شهر بهم میخورد. این شهر از روز ورودم به آن برایم اوضاع را عجیب پیچیده کرده است. تنهایی را بر سرم آوار کرده و انگاری من مانده ام و تنها یک چهاردیواری برایم و بقیه همه از دم کسشر است.به صورت مردمان که می نگری، در هرجا، همین که از لای دست و پا مردم خود را به واگون مترو که میرود، هر روز حدود ده باری میرود و برمیگردد و باز میرود تا برسد به ایستگاه بهشتی، همه انگاری دیشب غم از دست دادن عزیزترین فردشان را دارند. هندزفری را از گوشت که در میاری این همه آدم همه ساکتند و زل زده اند به کف مترو. این صحنه ایست که چه در اتوبوس و چه در تاکسی در صبح های تهران میبنید.کار هم که خدا رو شکر تمامی ندارد و روند محاسبه تعداد روز مرخصی، حقوق و پاداش و سنوات و اینها و چقدر در آخر ماه باید از عمرم کم کنم بدم صاحب خانه، عمر میگویم چون انگاری ما باید نه ساعت وقتمان را به فنا بدهیم تا حقوق بگیریم و همان ساعت ها را خرج خانه بدهیم، روزت را خراب تر میکند.مثلا همین قضیه مرخصی، میتوانی تصور کنی برای اینکه برای خودت باشی باید اجازه بگیری؟ مثلا شاید اصلا یه دو شنبه ای واقعا حالت پیچیده بود و دلت دریا خواست، اینجا که دریایش حداقل ۴ ساعت دور است تو باید حواست باشد کی دلت دریا میخواهد. اصلا چی دارد این تهران؟ من دلم بگیرد کجا بروم؟ کی بروم؟راه که می افتی مثلا بروی کافه ای دل شاد کنی که ترافیک است و ترافیک و ترافیک.روند سکون من از همین جا شروع شد. شروع شد از بند تهران بودن. سرتان را درد نیاورم. تهران نمانید. زود بزنید به چاک که روی دیوارهایش رنگ غم پاشیدند.یادم می آید در رشت که بودم برای همه چیز وقت داشتم. میتوانستم بروم با دوستانم خوش بگذرانم. تنهایی بروم کافه و دو ساعت بعد چندتایی برویم مهمانی و بعد بیایم بشینیم کار کنم و بعد بخوابم صبح بعد بروم کلاس و خداوکیلی میشد. نمی گویم هر روز ولی همه چیز شدنی بود. اما اینجا باید حساب کنم که ترافیک چقدر است و راه چقدر دور است و زمان چه اندک است.اما خوب این همه ماجرا نیست. روند سکون من شاید کمی عمیق تر باشد. تهران تمام ساخته های ذهنیتان از دنیا را بهم میریزد. متوجه میشوی درست کاری خیلی در پیشرفتت تاثیر ندارد. میفهمی کمتر کسی در این شهر خدا را قبول دارد. افرادی را میبینی که معترض حقوق آزادی اند و خشونت مذهبیون در ارشاد زورکیشان را میکوبن در سر هر فردی که میبنند و از هم در این مسیر سبقت میگیرند ولی مثلا همین امروز که خبر کتک خوردن یک حاج خانومی را شنیدم که گفته بود سگ نجسست، دیدم همه میگویند به به و چه چه که چقدر مردم آزادی خواهند و فضولی حقش این است. چقدر گم شدیم از آنچه میخواستیم و شد. و خوب دیگر خیلی اعتقاد خاصی برایت نمیماند. رفته رفته کشور معنایش از کف میرود. میهن برایت جز کسشری نمی شود. امید اصلاحی نمی ماند. و خوب دیگر هدفی نمی ماند و هدف نباشد انگیزه معنا دارد؟ بعد میشود که ۲۴ ساعت مینشینی جلوی درب بالکن ۲۵ سانتی متر مربعیت و دیوار ساختمان هایی که با دهن کجی مانع دیدم ابر ها میشوند را میبینی و میشوی یک انسان بی تحرک. از نظر فکری بی تحرک. و این اوضاع را با ضربه های عاطفی و اقتصادی قاطی کن و یکم بهش ادویه تنهایی اضافه کن ببین چه آشی میشود که در تمام عمرت کرختت میکند.اما می ترسم. از وقتی آمدم تهران به شکل عقده ای واری آنان که رفتند خارج، این بار نه شهر خاصی هر دهاتی شده خارج این کشور را برتر میبنم. جلو تر میبینم. نکند بریمو ببینیم آنچه فکر میکردیم از زندگی، دروغ کودکانه ای بیش نیست؟</description>
                <category>امین کشاورز</category>
                <author>امین کشاورز</author>
                <pubDate>Tue, 03 Nov 2020 22:12:20 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از ssh proxy برای اتصال به سرور گیت لب از سرور ایران</title>
                <link>https://virgool.io/@aminkt/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-ssh-proxy-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D9%87-%D8%B3%D8%B1%D9%88%D8%B1-%DA%AF%DB%8C%D8%AA-%D9%84%D8%A8-%D8%A7%D8%B2-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-ybfd7pdtfsug</link>
                <description>یک پست کوتاه و کاربردیاگر سرور ایران دارید تکه کانفیگ زیرو تو فایل ~/.ssh/config بذارید و با خیال راحت به گیت لب وصل بشید.Host gitlab.com
   User git
   Port 22
   ProxyCommand ssh username@second.server.ip nc %h %p %rبعد از این کار تو سرور پراکسیتون که باید خارج از کشور باشه لاگین کنید و این فایل رو ایجاد یا ادیت کنید:~/.ssh/authorized_keysو مقدار public key سرور ایران رو داخلش قرار بدید.اگه راجب این سوال دارید که پابلیک کی چی هست؟ ssh چی هست؟ چرا باید این پراکسی رو انجام بدم این پست مناسب شما نیست و خ ساده ازش بگذرید :)))بیشتر یه یاد داشت برای خودمه که یادم نره</description>
                <category>امین کشاورز</category>
                <author>امین کشاورز</author>
                <pubDate>Mon, 09 Dec 2019 17:01:38 +0330</pubDate>
            </item>
                    <item>
                <title>معماری اصلاح شده MVC برای وب اپلیکیشن های بزرگ</title>
                <link>https://virgool.io/apieco/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%DB%8C-%D8%A7%D8%B5%D9%84%D8%A7%D8%AD-%D8%B4%D8%AF%D9%87-mvc-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%88%D8%A8-%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86-%D9%87%D8%A7%DB%8C-%D8%A8%D8%B2%D8%B1%DA%AF-mqmrss3bj6ac</link>
                <description>امشب داشتم معماری یه نرم افزار جدید رو انجام میدادم و داشتم به این فکر میکردم که چطوری یک وب اپلیکیشن رو بنویسم به طوری که برای کاربرد های وسیع و کاربران زیاد و همچنین منطق و لاجیک های پیشرفته کارا باشه٬ در عین حال برنامه نویس های مبتدی هم بتونن با یک پترن خوب کد بزنن و از اینکه از برنامه نویس های تازه کار و جونیور تو پروژه استفاده بشه ترسی نباشه.معماری وب اپلیکیشن های بزرگاول مقالم دوست دارم بگم که این یک معماری هست که من پیشنهادش میدم و فکر میکنم کار کنه ولی هنوز پیادش نکردم. اما وظیفه من هم هست بگم ایده این معماری از کجا به ذهن من رسید.از وقتی که تو یکی از شرکت های ممتاز آی تی وارد کار شدم٬ ساختار جدیدی که برای MVC می‌دیدم نظر من رو جلب کرد. برای همین سعی کردم خیلی منطقی و مو شکافانه اونو بررسی کنم. خیلی از مفاهیم معماری جدیدی که برای خودم طراحی کردم و اینجا توضیح میدم از اون شرکت اقتباس شده.در خصوص کارایی٬ یا پیشنهاداتی که به ذهنتون میرسه وقتی که این مقاله رو مطالعه میکنید٬ خدمتتون عرض کنم که خوشحال میشم ایرادات و پیشنهادات رو به من بگید. میتونید منو تو اینستا گرام یا تلگرام از طریق لینک های زیر پیدا کنید:تو تلگرام به من پیام بدید | تو اینستاگرام دنبالم کنید :)طرح مسئلهیکی از مشکلاتی که تو پیاده سازی پروژه های بزرگ و پیچیده به چشم میخوره (بنا بر تجربه شخصی اینجانب)٬ تبدیل شدن کد های سورس پروژه از کد های تمیز و شسته رفته اولیه به کد های پیچیده٬ اسپاگتی٬ کثیف٬ ناکارا و در یک کلام آشغال هست.چیزی که باعث میشه شرکت های بزرگی مثل اسنپ و دیجی‌کالا در ایران مجبور بشوند تا زیر ساخت خودشون رو بازنویسی کنند.اینکه به دلیل فشار های بیزینس گاهاً کد ها بدون تحلیل درست زده بشه٬ اجتناب ناپذیره اما بعضی معماری ها و روش ها٬ ریفکتور کردن و اصلاح این کد ها رو در آینده راحت تر میکنه.تو این مقاله قصد دارم به تفصیل با بیان مشکل چند راه حلی که خودم تجربه کردم و جواب داده رو برای شما بنویسم.معماری اولیهمعماری اولیه پروژه خیلی میتونه راه گشا باشه. متاسفانه این منطق که سریع یه چی بالا بیاریم٬ ممکنه مشکلات و باگ های زیادی رو در آینده در کد شما ایجاد کنه. همیشه به عنوان یه مهندس نرم افزار٬ و نه برنامه نویس باید هزینه و صرفه اینکه شما سریعتر کد بزنید یا درست تر رو حساب کنید.همیشه شرایط و اجبار هایی در پروژه به وجود میاد که شما مجبور به سریع کد زدن و ایجاد بدهی فنی میشید. پس در ابتدای پروژه که دست شما باز هست و معمولا هم زمان بیشتری برای دولوپ دارید٬ زیر ساخت قرص و محکمی فراهم کنید.برنامه قابل توسعهاز نظر شخص بنده برنامه قابل توسعه برنامه ای هست که شما بتونید هر وقت لازم شد با کمترین هزینه و بالاترین درصد اطمینان اون رو ریفکتور کنید. چون حتی اگر خدا هم باشید بعضی جاها سوتی میدید و بعدا متوجه این مسائل میشید.حتما همه شما دوستان با این مسئله مواجه شدید که کد به قدری کثیف و درهم تنیده شده باشه که از دست زدن بهش بترسید و ترجیح بدید بذارید همینطوری که الان داره کار میکنه به کارش ادامه بده. این یعنی شروع مرگ نرم افزار شما.تست نرم افزار را جدی بگیریدتست نرم افزار مهم ترین اصلی هست که به شما اجازه ریفکتور های گسترده و سریع رو میده. اگر تست ننویسید عملا صحبت در خصوص ریفکتور بی معنی میشه.تست نوشتن برخلاف تفکر عموم برنامه نویس ها سرعت توسعه شما رو کند نمیکنه. حتی به توسعه صحیح و هدفمند شما کمک هم میکنه. پترن خود من تو تست نوشتن این طوری هست که قبل از اینکه کد یه قسمت رو بنویسم اول تست هاشو مینویسم بعد سعی میکنم کدم رو انقد عوض کنم تا تست ها رو پاس کنه نه این که کد رو بنویستم و تست رو جوری بنویسم که پاس بشه :)))شما وقتی تست مینویسید حتی میتونید پروسه های پیچیده رو سریع تر تست کنید.فرض کنید در شرایطی شما باید سه Entity رو ذخیره کنید و بعد یه باگ اتفاق میوفته٬ چقدر دیباگ کردن اعصاب خورد کن و زمان بر میشه. اینجاس که تست ها میتونن سریع شرایط رو برای شما روشن کنند.معماری MVC بهبود یافتههمه ما در خصوص معماری MVC شنیدیم. من نمیخوام در خصوص MVC حرف بزنم. به جاش شما رو به مقاله یکی از دوستان ارجاع میدم. https://virgool.io/@taha/mvc-i06wbpjwatco بعد از اینکه این مقاله رو مطالعه کردید٬ البته اگر در خصوص MVC اطلاعی نداشتید٬ و بعد از چند باری کد زدن با این معماری٬ متوجه منظور من میشید که چی میخوام بگم.قانون ۱ : فقط API بنویس. قالب اچ تی ام ال رو فراموش کندر اصول مهندسی نرم افزار همیشه شنیدیم که یک بار کد بزنید و بارها استفاده کنید. با همین مقدمه میگم که اصلا فکر پیاده سازی سایت رو با روش های مرسوم گذشته از ذهنتون خالی کنید و فقط به API فکر کنید. من خودم بیشتر REST API رو هدف قرار میدم.چرا که شما با یک بار پیاده سازی اینترفیس های سرورتون دگه نیازی به نوشتن API برای اپ و دیگر سرویس هایی که قراره از سایتتون استفاده کنند ندارید. با تکنولوژی های جدید فرانت امروز هم مثل٬ VUEJS و REACTJS و ... کار براتون خیلی ساده تر میشه.با حذف لایه View در معماری مرسوم MVC یک V جدید ظاهر میشه که در ادامه توضیح میدم.قانون ۲: متد بیشتر از ۱۰ خط یعنی اشتباه کردیاین چیزی هست که همیشه روش تاکید میشه. اگر کد شما طولانی شده حتما اون رو میتونید به قطعات کوچکتر و قابل استفاده خورد کنید تا هم کد تمیز تر و خوانا تر داشته باشید و هم اینکه از زدن کد تکراری جلو گیری کنید.با این قانون و فرض پس دیگه تو کنترلر هاتون جای کد زدن نیست.قانون ۳: کنترلر فقط باید بفهمه کدوم مدل رو صدا کنه و چطوری خروجی رو برگردونهپس شما اگر دارید از معماری MVC استفاده میکنید٬ الان درگیر مدل میشید. یعنی کنترلر باید فقط با ورودی کاربر مدل درست رو صدا کنه و مقدار خروجیش رو برگدونه.تو فریم ورک هایی مثل Yii, Laravel, Symfony و ... شما یک مدل دارید که هم براتون دیتا رو از دیتابیس میخونه٬ هم داره بیزینس رو هندل میکنه٬ پس مدل هاتون خواه و ناخواه به اصطلاح چاق میشن و همه کد های پروژه تو اون لایه متمرکز میشه ولی همین موضوع باعث پیچیده شدن مدل ها میشه.نظریه من : اعتبارسنجی فرم ها و ورودی کاربر٬ کار مدل ها هست نه کنترلر. چون این موضوع هم به عبارتی نوعی لاجیک بیزینس حساب میشه. هر مدل ممکنه یه فرم رو به شکل متفاوتی اعتبار سنجی کنه. این موضوع تو Yii به خوبی هندل شده.قانون ۴: مدل های دیتابیسی یا Entity ها رو فقط با لاجیک دیتابیس پر کنیدیعنی چی؟ یعنی اینکه وقتی مثلا یه مدل الکونت تو لاراول یا اکتیو رکورد تو YII میسازید. مدل هایی که داره دیتا رو مستقیم با دیتابیس رد و بدل میکنه٬ اینا رو تمیز نگه دارید و فقط لاجیک های مربوط به دیتابیس توش بریزید. مثلا یکتایی دیتا٬ تبدیل به جیسون و از این قرتی بازیا. لاجیک بیزینس رو تا حد امکان وارد این مدل ها نکنید.پس جای لاجیک کجاس؟قانون ۵: از فرم مدل ها برای گرفتن ورودی کاربر استفاده کنیدیه چیزی که فریم ورک Yii داره و خیلی دل منو برده٬ منطق فرم مدل ها هست. تو این منطق شما یه مدل پایه که به دیتابیس وصل نیست میسازید٬ وقتی کاربر ورودی هاشو برای کنترلر میفرسته٬ کنترلر این مدل ها رو پر میکنه و متد مورد نظر اون اکشن مثلا create رو صدا میزنه. اگر هم ارور داشت ارور از مدل برمیگرده به کنترلر و اون خروجی رو به کاربر میده.مزیتش چیه؟ اینطوری شما دستتون به شدت بازه و کدتون خیلی تمیز تر میشه. میتونید اعتبارسنجی های پیشرفته تری داشته باشید. میتونید از فرم های پیچیده استفاده کنید و حتی چندین Entity رو هم زمان ذخیره کنید و خلاصه اینکه هر جنگولک بازی تو ذخیره Entity ها و دیتای کاربر میتونید در بیارید.زیبا نیست؟ به نظر شما تمیز تر و درست تر نیست؟قانون ۶: از View Model ها برای برگردوندن اطلاعات به کاربر استفاده کنیداین دقیقا همون V جدید مدل MVC هست که اینجا میگم. به قول محمد نظری عزیز٬ هد تیم فنی گروه مالی دیجی‌کالا٬ این کلاس ها چشم ما به دیتابیس هست.فرض کنید در یک لاجیک پیچیده بیزینسی٬ شما مجبورید از چندین Entity بخونید و دیتا رو به کاربر نشون بدید. اون موقع هست که این لایه بسیار راه گشا هست و دست شما رو تو تغییرات باز میذاره.شما میتونید بدون تغییر تو Entity یا FormModel ها مقادیر خروجی رو تغییر بدید و یا اصلاح کنید.وقتی ما لایه ای که خروجی رو به کاربر با HTML نشون میداد حذف میکنیم این لایه میتونه استفاده بشه تا آرایه هایی رو آماده کنه تا به کاربر برگدونیم.تو این لایه شما میتونید منطق های Cache های پیچیده٬ سرچ های پیچیده و هر چیزی که لازمه تا دیتا رو برگردونید استفاده کنید.مدل MVC بهبود یافته برای اپلیکیشن های بزرگاستفاده از FormModel ها و ViewModel ها شما رو توی نوشتن Unit Test های کارا تر و  پیچیده تر قوی تر میکنه. همونی که گفتم. بدون تست ریفکتور معنا نداره.قانون ۷: هیچ وقت گول این حرف رو نخورید٬ کد تمیز مینویسم و داکیومنت لازم نیستکد تمیز الزامی هست. از متد های استاندارد کد استایل استفاده کنید. مثل PSR ها برای PHP.ولی الان همه زبان ها تقریبا از Inline Document پشتیبانی میکنند. PHP Doc رو برای مثال یاد بگیرید. نماد هاشو بفهمید و در همه کد ها٬ هر متد جدید استفاده کنید.کد شما هر چقدر هم تمیز باشه با این داکیومنت ها٬ کار برنامه نویس بعدی که قراره کد شما رو بهبود بده راحت تر میشه. این موضوع تو نوشتن برنامه های بزرگ اساسی هست.بعدا از همین PHP DOC یا هر چیز دگه میتونید استفاده کنید تا داکیومنت کامل پروژه رو بسازید و به وسیله اون برنامه نویس های جدید رو سریعتر آن برد کنید.ممنون وقت گذاشتید و این مقاله رو خوندید.اگر دوست داشتید اونو منتشر کنید.در خصوص اشتباهاتم به من پیام بدید و نظر بدید ولی ناموسا نگید چرا یک رو مینویسم ی و فلان چیز چرا خلاصه شده :)))). سبکمه و این مورد رو درست نمیکنم.</description>
                <category>امین کشاورز</category>
                <author>امین کشاورز</author>
                <pubDate>Sun, 16 Jun 2019 01:51:54 +0430</pubDate>
            </item>
                    <item>
                <title>دیپلوی پروژه های ReactJs یا VUEJS بر روی سرور ایران با استفاده از Gitlab CI/CD</title>
                <link>https://virgool.io/@aminkt/%D8%AF%DB%8C%D9%BE%D9%84%D9%88%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-reactjs-%DB%8C%D8%A7-vuejs-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-gitlab-cicd-c9qy3dq9exws</link>
                <description>در پست قبلی من توضیح دادم که گیت لب چیه. این پست ادامه سری پست های دیپلوی روی سرور ایران هست که توضیح میدم چطوری پروژه VUEJS یا REACTJS رو با گیت لب دیپلوی کنیم.اگر پست قبلی رو نخوندید قویا توصیه میکنم یه نگاهی بهش بندازید: https://virgool.io/@aminkt/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-gitlab-cicd-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D9%87%D8%A7%DB%8C-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-xdxkvsfwyshh (اگه دوست داشتید و وقت پیاده سازی رو خودتون نداشتید میتونید به تلگرام من که تو بیو هست پیام بدید که با توافقاتی اوکی کنم براتون)قسمت دوم:تو این پست کار زیادی نداریم. اکثر توضیحات رو تو پست زیری دادم: https://virgool.io/@aminkt/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%BE%D8%B1%D9%88%DA%98%D9%87-vuejs-%D8%AE%D9%88%D8%AF-%D8%B1%D8%A7-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-ssh-%D9%88-gitlab-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-deploy-%DA%A9%D9%86%DB%8C%D9%85-f0vr9ancpbhh تمام کاری که باید بکنید تو این پست توضیح داده شده ولی اینجا کلید اصلی رو بهتون معرفی میکنم.منظورم از کلید اصلی اینه که چطوری رو سرور ایران خودمون از طریق گیت لب که ما رو تحریم کرده دیپلوی کنیم.برای این کار فایل .gitlab-ci.yml خودمونو باید یکم تغییر بدیم.build site:
  image: node:6
  stage: build
  only:
    - master
  script:
    - npm install --progress=false
    - npm run build
  artifacts:
    expire_in: 1 week
    paths:
      - dist

unit test:
  image: node:6
  stage: test
 only:
   - master
  script:
    - npm install --progress=false
    - npm run unit

deploy:
  environment:
    name: production
    url: http://domain.example/
  image: ubuntu
  stage: deploy
  variables:
    PROJECT_ON_SERVER: &quot;/path/to/your/public/folder&quot;
  only:
    - master
  script:
    - apt-get update -yqq
    ##
    ## Install ssh-agent if not already installed, it is required by Docker.
    ## (change apt-get to yum if you use an RPM-based image)
    ##
    - &#039;which ssh-agent || ( apt-get update -y &amp;&amp; apt-get install openssh-client -y )&#039;

    ## Install resync to create mirror between runner and host.
    - apt-get install -y rsync

    ##
    ## Run ssh-agent (inside the build environment)
    ##
    - mkdir -p ~/.ssh
    - echo &quot;$SSH_PRIVATE_KEY&quot; | tr -d &#039;\r&#039; &gt; ~/.ssh/id_rsa
    - chmod 700 ~/.ssh/id_rsa
    - eval &quot;$(ssh-agent -s)&quot;
    - ssh-add ~/.ssh/id_rsa
    - ssh-keyscan -H $SERVER &gt;&gt; ~/.ssh/known_hosts
    - rsync -ravzhP --delete -e &quot;ssh $SSH_USER@$SSH_HOST ssh&quot; dist/ $SSH_DEPLOY_USER@&quot;$SSH_DEPLOY_HOST&quot;:$PROJECT_ON_SERVERاگر متوجه نشدید این فایل چی هست و چی میکنه لطفا به پست قبلی من که راجب دیپلوی VUEJS هست مراجعه کنید. اونجا کاملا توضیح دادم.تنها کاری که من اینجا کردم اینه که خط آخر خودمو به چیزی که این زیر نوشتم تغییر دادم:rsync -ravzhP --delete -e &quot;ssh $SSH_USER@$SSH_HOST ssh&quot; dist/ $SSH_DEPLOY_USER@&quot;$SSH_DEPLOY_HOST&quot;:$PROJECT_ON_SERVERاین قطعه کد میگه که از همون rsync برای جابجایی فایل ها از سرور گیت لب به سرور من استفاده کن ولی نکته ای که داره اینه که من از یه سرور تو یه جای دگ دنیا به عنوان پراکسی استفاده کردم.یعنی به جای اینکه اطلاعات مستقیم به سرور ایران فرستاده بشه مثلا اول میره تو کانادا به سرور پراکسی من بعد از کانادا میاد ایران تا تحریم رو دور بزنه.متغیر هایی که تو کد استفاده شده به صورت Private تعریف شدن که چطوری این کارو بکنید هم تو پست قبلی توضیح دادم. بذارید فقط بگم هر کدوم از این متغیر ها چی داخل خودشون دارند:SSH_USER : نام کاربری اس اس اچ من تو سرور پراکسی یا همون سرور کانادامSSH_HOST : آی پی یا آدرس سرور پراکسیSSH_DEPLOY_USER : نام کاربری اس اس اچ من تو سرور اصلیم که تو ایران هستSSH_DEPLOY_HOST: آی پی یا آدرس سرور اصلیPROJECT_ON_SERVER : آدرس پوشه دیپلویم رو سرور اصلیدم شما گرم.برای مطالعه بیشتر میتونید به نوشته های دیگه من مراجعه کنید https://virgool.io/@aminkt/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-gitlab-cicd-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D9%87%D8%A7%DB%8C-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-xdxkvsfwyshh  https://virgool.io/@aminkt/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%BE%D8%B1%D9%88%DA%98%D9%87-vuejs-%D8%AE%D9%88%D8%AF-%D8%B1%D8%A7-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-ssh-%D9%88-gitlab-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-deploy-%DA%A9%D9%86%DB%8C%D9%85-f0vr9ancpbhh (اگه دوست داشتید و وقت پیاده سازی رو خودتون نداشتید میتونید به تلگرام من که تو بیو هست پیام بدید که با توافقاتی اوکی کنم براتون)</description>
                <category>امین کشاورز</category>
                <author>امین کشاورز</author>
                <pubDate>Tue, 01 Jan 2019 12:46:14 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش Gitlab CI/CD برای سرور های ایران - قسمت اول</title>
                <link>https://virgool.io/@aminkt/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-gitlab-cicd-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D9%87%D8%A7%DB%8C-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-xdxkvsfwyshh</link>
                <description>سلام.قبلا یه پست راجب دیپلوی کردن استاتیک سایتا مثل سایتایی که با React JS یا VueJs درست شده نوشته بودم که شما میتونید اینجا بخونیدش: https://virgool.io/@aminkt/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%BE%D8%B1%D9%88%DA%98%D9%87-vuejs-%D8%AE%D9%88%D8%AF-%D8%B1%D8%A7-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-ssh-%D9%88-gitlab-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-deploy-%DA%A9%D9%86%DB%8C%D9%85-f0vr9ancpbhh اخیرا به شدت درگیر بودم تا هم یه سری پروژه های VUEJS و هم یه بک اند PHP رو٬ روی سرور های ایران دیپلوی کنم و همینطور که میدونید گیت لب ایران رو تحریم کرده و نمیتونه آی پی های ما رو ببینه.تو سری پست های آتی تمام تجربمو براتون به اشتراک میزارم.توجه کنید که اگه سرور هاتون تو ایران نیست باز این پستا توضیح میده که چطوری این کارو انجام بدید پس دنبالش کنید و اگه دوست داشتید منو فالو کنید.(اگه دوست داشتید و وقت پیاده سازی رو خودتون نداشتید میتونید به تلگرام من که تو بیو هست پیام بدید که با توافقاتی اوکی کنم براتون)خوب بریم سر اصل مطب.فرض کنید ما یک یا چند سرور تو ایران داریم و میخواهیم پروژه خود را روی آن دیپلوی کنیم.۱- چگونه فایل های استاتیک را مثل پروژه های React Js یا VueJs را در سرور ایران دیپلوی کنیم؟ (قسمت دوم) https://virgool.io/@aminkt/%D8%AF%DB%8C%D9%BE%D9%84%D9%88%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-reactjs-%DB%8C%D8%A7-vuejs-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-gitlab-cicd-c9qy3dq9exws ۲- چگونه بک اند خود را روی سرور ایران دیپلوی کنیم؟ما خیلی ساده میخوایم کارای بالا رو انجام بدیم. توضیحات هر کدوم رو به تفصیل تو پست های جداگانه میدم و میگم که چطوری باید انجام بشه و این جا پیش نیاز ها رو مطرح میکنم.برای شروع به چه چیزی نیاز دارم؟همونطور که میدونید سرور های گیت لب سرور ایران رو نمی بینند و برای کار با گیت لب باید حتما پراکسی داشته باشید. حالا که سرور شما تو ایران هست باز شما به پراکسی برای این کار احتیاج دارید.من از یه سرور خیلی ارزون تو کانادا استفاده کردم.پس اگه سرور شما تو ایرانه به یه سرور خ سبک تو خارج نیاز دارید و اگه هم تو ایران نیست که خیلی کارتون ساده میشه.اصلا GITLAB CI/CD چی هست؟یه ابزاری هست تو خود گیت لب و رایگان که به شما کمک میکنه تا پروژتون رو به صورت اتوماتیک تست کنید و اونو روی سرور اصلی یا سرور تست دیپلوی کنید.چرا باید ازش استفاده کنیم؟خیلی سادس. باعث میشه کاراتون تمیز تر٬ حرفه ای تر٬ ایمن تر و سریع تر بشه و چون دخالت انسانی دیگه تو دیپلوی یا تست نیست مطمئن میشوید همه چی تو روال رفته جلو.برای مثال من روی یه برنچم پوش میکنم. بعد مرج ریکوست میدم رو مستر. گیت لب خودش شروع میکنه به اجرا کردن تست ها و نتیجه پوش شما رو نشون میده که آیا این تغییرات سیستم شما رو بهم ریخته یا نه. نمایی از مرج ریکوست گیت لب و ران شدن تست ها قبل و بعد از مرجهمین طور که تو عکس بالا میبینید٬ من مرج ریکوست دادم٬ قبل اکسپت کردن وضعیت تست ها رو نشون داد که موفق بود و بعد از اعمال تغییرات رو برنچ مقصد هم همه چی اوکی بود.گزارش و وضعیت دیپلوی هاتو منوی سمت چپتون شما میتونید وارد صفحه Pipeline بشید. تو این صفحه نشون میده که وضیعت CI/CD های گذشته شما چطور پیش رفته.وضعیت Job ها در یک Pipelineبذارید یکم توضیح بدم جاب چیه و پایپ لاین چیه.هر اجرای CI/CD یک پایپ لاینه به معنی خط لوله. یعنی وقتی کار یه جا گیر کنه بقیش اجرا نمیشه. و از چند stage یا مرحله تشکیل شده.تو هر استیج ما یک یا بیشتر جاب داریم. جاب درواقع هر اکشن سیستم هست. مثلا جاب تست. جاب بیلد یا جاب دیپلوی.پیش نمایش اجرای جاب تستتو تصویر بالا شما اجرای جاب رو میبینید و ترمینال مربوط بهش که نتیجه رو کامل نشون میده.بقیه مطلب رو تو پست های خودش توضیح میدم که خسته نشید و فقط قسمتی که لازم دارید رو بخونید.(اگه دوست داشتید و وقت پیاده سازی رو خودتون نداشتید میتونید به تلگرام من که تو بیو هست پیام بدید که با توافقاتی اوکی کنم براتون)مچکرم</description>
                <category>امین کشاورز</category>
                <author>امین کشاورز</author>
                <pubDate>Wed, 26 Dec 2018 18:15:48 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه پروژه VUEJS خود را با استفاده از SSH  و Gitlab بر روی سرور Deploy کنیم؟</title>
                <link>https://virgool.io/@aminkt/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D9%BE%D8%B1%D9%88%DA%98%D9%87-vuejs-%D8%AE%D9%88%D8%AF-%D8%B1%D8%A7-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-ssh-%D9%88-gitlab-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-deploy-%DA%A9%D9%86%DB%8C%D9%85-f0vr9ancpbhh</link>
                <description>با عرض سلام و خسته نباشیدبعد از یه مدت دوری برگشتم تا براتون تجربه امروز خودمو منتشر کنماول یه خلاصه بگم که قراره چه اتفاقی بیوفته.شما یه سایت دارید که با فریم ورک vuejs نوشته شده و حالا میخاید اونو دیپلوی کنید رو VPS خودتون. چطوری این کارو اتوماتیک کنیم؟ میگم بهتون!(اگه دوست داشتید و وقت پیاده سازی رو خودتون نداشتید میتونید به تلگرام من که تو بیو هست پیام بدید که با توافقاتی اوکی کنم براتون)اول از همه پروژتون رو روی یک ریپوزیتوری gitlab بالا بیارید.حتما میدونید که این روش بعد از تحریم اعمال شده توسط گیت لب به ما ایرانی ها یکم سخته. ینی باید وی پی ان داشته باشید و کلا سرور هم ایران نباشه یا روشی بلد باشید که از آی پی ایران به گیت لب وصل نشید.مرحله دوم ایجاد پروسه GITLAB CI/CD هست.برای این کار باید یک فایل به نام .gitlab-ci.yml تو فولدر روت پروژتون بسازید و موارد زیر رو توش کپی کنید:build site:
  image: node:6
  stage: build
  only:
    - master
  script:
    - npm install --progress=false
    - npm run build
  artifacts:
    expire_in: 1 week
    paths:
      - dist

unit test:
  image: node:6
  stage: test
 only:
   - master
  script:
    - npm install --progress=false
    - npm run unit

deploy:
  environment:
    name: production
    url: http://domain.example/
  image: ubuntu
  stage: deploy
  variables:
    PROJECT_ON_SERVER: &quot;/path/to/your/public/folder&quot;
  only:
    - master
  script:
    - apt-get update -yqq
    ##
    ## Install ssh-agent if not already installed, it is required by Docker.
    ## (change apt-get to yum if you use an RPM-based image)
    ##
    - &#039;which ssh-agent || ( apt-get update -y &amp;&amp; apt-get install openssh-client -y )&#039;

    ## Install resync to create mirror between runner and host.
    - apt-get install -y rsync

    ##
    ## Run ssh-agent (inside the build environment)
    ##
    - mkdir -p ~/.ssh
    - echo &quot;$SSH_PRIVATE_KEY&quot; | tr -d &#039;\r&#039; &gt; ~/.ssh/id_rsa
    - chmod 700 ~/.ssh/id_rsa
    - eval &quot;$(ssh-agent -s)&quot;
    - ssh-add ~/.ssh/id_rsa
    - ssh-keyscan -H $SERVER &gt;&gt; ~/.ssh/known_hosts
    - rsync -rav --delete dist/ $USER@$SERVER:$PROJECT_ON_SERVER
فایل بالا به محض کامیت شدن رو مستر شروع میکنه به اجرا شدن.حالا چه اتفاقی داره میوفته؟ من شما رو به داکیومنت اصلی خود گیت لب برای کار به CI/CD گیت لب ارجاع میدم چون اون خودش یه بحث جداست که با کلیک رو لینک پایین بهش هدایت میشید: https://docs.gitlab.com/ee/ci/ اما اگه بخواهم یک خلاصه بگم اینه که ما عمل CI و CD خودمون رو به سه قسمت BUILD, TEST, DEPLOY تقسیم کردیم و هر کدوم از این ها یه استیج حساب میشه. شما تو عکس اول این مقاله میبینید در هر سطر سه دایرس که وضعیت اجرای این استیج هامون رو نشون میده.با اجرا شدن به اصطلاح Pipeline گیت لب و انتخاب Task در حال اجرا تو همون عکس اول این مطلب شما میتونید جزئیات اجرای تسک رو ببینید.نمایی از اجرای یک تسکخوب به طور خلاصه ما تو استیج بیلد داریم پروژه خودمون رو بیلد میکنیم و فولدر dist خودمون که خروجی هست رو مشخص میکنیم.در استیج بعدی از خروجیمون به وسیله کدهای تستی که نوشتیم تست میگیریم و اگه هر دو مرحله درست پیش بره میریم برای مرحله آخر.شما میتونید قسمت تست رو صرف نظر کنید اگر تستی ننوشتید. فقط پاکش کنید.خوب مرحله آخر که دیپلوی هست سخت ترین مسله هست که تو قسمت بعد توضیح میدم.دیپلوی روی سروربرای دیپلوی روی سرور قبل این که pipeline اجرا بشه باید همه چیز رو رو سرور محیا کرده باشید. پس بذارید یه مرور کنیم که چیا کردیم؟ یک یوزر برای گیت لب در سرور با دستور زیر بسازید.sudo adduser gitlab   // create gitlab user.
su gitlab // Switch to gitlab user.۲. برای یوزر ساخته شده یک ssh key بسازید. میتونید ساخت ssh key رو از لینک زیر ادامه بدید https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys--2 ۳. کلید خصوصی رو کپی کنید و در گیت لب  وارد کنید:برای کپی کردن کلید خصوصی در صورتی که محل اونو دیفالت انتخاب کرده باشید دستور زیر کمکتون میکنه:cat ~/.ssh/id_rsaاین دستور کلیدتون رو روی ترمینال نشون میده. اونو کپی کنید و به آدرس زیر تو ریپوی گیت لب برید:Your repo -&gt; Settings -&gt; CI/CD -&gt; Variablesبا کلیک روی دکمه expand مطابق عکس زیر مقادیر رو وارد کنید:جای سرور آی پی سرور - جای یوزر همین یوزری که ساختید ینی gitlab و جای ssh_private_key هم همین کلید خصوصی رو بذارید.حالا pipeline شما درست باید کار کنه.گفته بودم بخش آخر فایل گیت لب رو توضیح میدم حالا بریم سر اون:deploy:
  environment:
    name: production
    url: http://erfantahvieh.com/
  image: ubuntu
  stage: deploy
  variables:
    PROJECT_ON_SERVER: &quot;/home/erfantahvieh.com/front&quot;
  only:
    - master
  script:
    - apt-get update -yqq
    ##
    ## Install ssh-agent if not already installed, it is required by Docker.
    ## (change apt-get to yum if you use an RPM-based image)
    ##
    - &#039;which ssh-agent || ( apt-get update -y &amp;&amp; apt-get install openssh-client -y )&#039;

    ## Install resync to create mirror between runner and host.
    - apt-get install -y rsync

    ##
    ## Run ssh-agent (inside the build environment)
    ##
    - mkdir -p ~/.ssh
    - echo &quot;$SSH_PRIVATE_KEY&quot; | tr -d &#039;\r&#039; &gt; ~/.ssh/id_rsa
    - chmod 700 ~/.ssh/id_rsa
    - eval &quot;$(ssh-agent -s)&quot;
    - ssh-add ~/.ssh/id_rsa
    - ssh-keyscan -H $SERVER &gt;&gt; ~/.ssh/known_hosts
    - rsync -rav --delete dist/ $USER@$SERVER:$PROJECT_ON_SERVERاگه لینکی که بالا تر براتون گذاشتم رو بخونید کامل متوجه بخش های این قسمت میشید اما اگه یه توضیح کوچیک بخام بدم ما از داکر اوبونتو برای اجرای دستوراتمون استفاده کردیم. یک متغیر به نام PROJECT_ON_SERVER نوشتیم که به جایی اشاره داره که مخواهیم فایل های بیلد شدمون رو بفرستیم روش.بریم سر اصل مطب ینی بخش scriptتو این بخش ابتدا من نرم افزار های مورد نیاز رو نصب کردم:- apt-get update -yqq
##
## Install ssh-agent if not already installed, it is required by Docker.
## (change apt-get to yum if you use an RPM-based image)
##
- &#039;which ssh-agent || ( apt-get update -y &amp;&amp; apt-get install openssh-client -y )&#039;

## Install rsync to create mirror between runner and host.
- apt-get install -y rsyncتو دستور اول مخزن ریپو های اوبونتو رو آپدیت کردم. تو دستور دم کلاینت ssh رو نصب کردم و در دستور سوم نرم افزار rsync رو برای کپی کردن فایل ها از روی داکر اوبونتوم به روی سرور نصب کردم.در دستورات بعدی من سرور خودم رو به داکر معرفی کردم وکلید خصوصی سرور خودمو بهش دادم تا بتونه با ssh به سرور من وصل بشه:##
## Run ssh-agent (inside the build environment)
##
- mkdir -p ~/.ssh
- echo &quot;$SSH_PRIVATE_KEY&quot; | tr -d &#039;\r&#039; &gt; ~/.ssh/id_rsa
- chmod 700 ~/.ssh/id_rsa
- eval &quot;$(ssh-agent -s)&quot;
- ssh-add ~/.ssh/id_rsa
- ssh-keyscan -H $SERVER &gt;&gt; ~/.ssh/known_hostsو در خط آخر من محتویات رو از پوشه dist که تو استیج بیلدم ساخته شده بود به سرورم منتقل کردم:- rsync -rav --delete dist/ $USER@$SERVER:$PROJECT_ON_SERVERتموم شد.ممکنه یکم این کار براتون سخت و گیج کننده باشه. خوشحال میشم کمکتون کنم.ارور ها رو دنبال کنید تا سرویستون ران بشه. کد هایی که اینجا گذاشتم دقیقا مراحلی هست که من خودم طی کردم.موفق باشیدو ممنون میشم اگر خوشتون اومد رو تویتر و سوشال مدیا هاتون منو شیر کنیدتو پست بعدی میخام داکر رو با gitlab ci/cd دیپلوی کنم پس منتظر باشید ...آموزش دیپلوی روی سرور های ایران با استفاده از GITLABسری پست های GITLAB CI/CD رو حتما دنبال کنید و منو فالو کنید اگه دوست داشتید. https://virgool.io/@aminkt/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-gitlab-cicd-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D9%87%D8%A7%DB%8C-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-xdxkvsfwyshh  https://virgool.io/@aminkt/%D8%AF%DB%8C%D9%BE%D9%84%D9%88%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%87%D8%A7%DB%8C-reactjs-%DB%8C%D8%A7-vuejs-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-gitlab-cicd-c9qy3dq9exws (اگه دوست داشتید و وقت پیاده سازی رو خودتون نداشتید میتونید به تلگرام من که تو بیو هست پیام بدید که با توافقاتی اوکی کنم براتون)</description>
                <category>امین کشاورز</category>
                <author>امین کشاورز</author>
                <pubDate>Fri, 05 Oct 2018 19:43:27 +0330</pubDate>
            </item>
                    <item>
                <title>چطور بنویسیم؟!</title>
                <link>https://virgool.io/@aminkt/%DA%86%D8%B7%D9%88%D8%B1-%D8%A8%D9%86%D9%88%DB%8C%D8%B3%DB%8C%D9%85-ev0sw4luz519</link>
                <description>سلاممن امین هستم ۲۳ ساله٬ دانشجوی رشته نرم افزار دانشگاه گیلان.برنامه نویس ارشد چندتا شرکتم و در حال حاضر دارم تجربه خودمو تو مدیریت پروژه اضافه میکنم و مدیر پروژه دو شرکت در شهر رشت٬ محل تحصیلم هستم.اما چرا این پست و چرا چطور بنویسیم؟؟پست قبلی من یه پست کاملا فنی و آموزشی در حوزه برنامه نویسی بود که چندتا از دوستان خ دوست داشتنی و خیرخواه در قالب کامنتاشون سعی کردن به من بگن که بهتره پست هاتو به صورت فارسی سالم یا به اصطلاح نگارش صحیح فارسی بنویسی.دلیل این دوستان برای این تذکر این بود ک من خ مث چت مینویسم. ( تو همین جمله خ = خیلی٬ ک = که و مث = مثل ) در ادامه میخام (میخواهم) توضیح بدم که چرا چنین نثری رو برای نگارشم استفاده کردم.راستش همونطور که همتون شاهدید تو شبکه های اجتماعی خلاصه نویسی مختص چت خ رونق داره. دلیلش اینه که به نظر من مردم الان وقت کمتری برای نوشتن و خوندن دارن. خلاصه نویسی به این سبک ضمن اینکه حال و هوای دوستانه تری تو نثر آدم میده زمان نوشتارشو به شدت کم میکنه و آدمو از گیرو داد های خاص نوشتار نگارشی صحیح خارج میکنه. این که دگ شما جای مفعول و فاعل رو جابجا کنید اهمیت نداره و اهمیت مطلب روی چیزی هست که نویسنده میخاد ( میخواهد) بگه هست.اما آیا این نحو نگارش همه جا صحیح هست؟ اصلا حرف من درسته؟تو قسمت اول سوالم باید بگم که قطعا نه. من به فراخور کاری که دارم گاها مجبورم یه سری گزارش های فنی و غیر فنی از عملکرد تیمم به مدیران بالا دستیم بدم.این گزارشا تعداد و هدفشون خ متفاوته ولی چیزی که مشابه هست اینه که این یه سند رسمی و یه گزارش اداری هست پس من دگ نمیتونم از روش خودم برای نگارش استفاده کنم و باید روی استاندرد عمل کنم. یعنی کلمات کامل٬ رسا٬‌جمله بندی صحیح و استفاده از نقطه و ویرگول و این چیزا.قسمت دوم سوالم هم قطعا جوابش نه هست. من فقط نقطه نظرمو میگم و میتونه درست یا غلط باشه.اما چطور بنویسیم؟؟ نوشتن خ سلیقه ای و بسته به هر شخص میتونه سبک متفاوتی داشته باشه. ولی چیزی که به نظر من حقیر درسته اینه که شما در هر موقعیت باید تصمیم بگیرید. مثلا اگه برای گزارش یا کتاب مینویسید باید استاندارد ها رو رعایت کنید ولی اگه قراره برای دل خودتون بنویسید یا حتی تو یه مجله٬ اگه شما یه ستون دارید به نظرم بهتره خلاقیت و سبک خودتون رو ملاک قرار بدید.خوشحال میشم نظرتون رو بدونممرسی که وقت گذاشتید</description>
                <category>امین کشاورز</category>
                <author>امین کشاورز</author>
                <pubDate>Fri, 18 May 2018 22:16:32 +0430</pubDate>
            </item>
                    <item>
                <title>نظرتون چیه برای رخداد های نرم افزارتون Event بنویسید؟</title>
                <link>https://virgool.io/Software/%D9%86%D8%B8%D8%B1%D8%AA%D9%88%D9%86-%DA%86%DB%8C%D9%87-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B1%D8%AE%D8%AF%D8%A7%D8%AF-%D9%87%D8%A7%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1%D8%AA%D9%88%D9%86-event-%D8%A8%D9%86%D9%88%DB%8C%D8%B3%DB%8C%D8%AF-cka0kxp83wbt</link>
                <description>رخداد های یا همون Event ها تو سیستم های نرم افزاری خ به درد بخوره. حتما اگه برنامه نویس باشید اسم ایونت ها رو خ شنیدید. چون عوض کردن زبان کیبورد انرژی زیادی ازم میگیره و نوشتن ایونت هم یه جوریه از این به بعد مینویسم رخداد شما به بزرگی خودتون برای اینکه اظهار فضل انگلیسی طور نوشتنمو نمیکنم ببخشید.اون قدیما که داشتم تازه برای جاوا GUI مینوشتم تازه با رخداد ها آشنا شدم. مثلا اینطوری که اگه کاربر رو صفحه رابط کاربری نرم افزار کلیک کرد من از کجا بفهمم چی شده.بعدا که گذشت دیدم ای دل غافل٬ کل نوشتن این رخداد و مدیریت اون چقد سادس و در عین حال چقد کاربردی. مثلا داشتم برای پروژه دانشگاه بازی انگری بردز رو مینوشتم و دیدم ک چقد رخداد ها بم کمک میکنند. مثلا وقتی پرنده ها به سنگ یا خوکا میخوردن یه رخداد برخورد به اصطلاح پرتاب میکردم و هر کلاسی که براش مهم بود اونو میگرفت و کد خودشو ران میکرد.این خلاصه خ طولانی شد. بریم سر اصل مطلب. برای نوشتن رخداد ها و اینکه واقعا به رخداد نیاز دارید یا نه باید یکم از فضای برنامه نویسی خارج بشید. اینطوری به قضیه نگاه کنید که واقعا این اتفاقی که میخاید با رویداد نوشتن هندلش کنید یه رویداده؟؟!!برای مثال تو همون قضیه برخودر پرنده ها با موانع تو بازی انگری بردز. دیدید؟؟؟ خ ساده نبود؟؟؟ آره خوب یه برخورد اتفاق افتاده و یه رویداد شکل گرفته. یا وقتی کاربر روی صفحه کلیک میکنه این عمل کلیک کردنش یه رویداده دگ.حالا که فهمیدید رویداد چیه بریم بفهمیم چطوری هندل میشه.برای هندل کردن رویداد ها یه پترن ساده موجوده به اسم Observer pattern. تو این پترن یه اتفاق خ ساده میوفته.Observer pattern UMLخو اگه یه نگاه خوب به UML بالا کنید همه چی گویاس. مثلا فک کنید شما دارید یه سیستم تحت وب طراحی میکنید و میخاید وقتی کاربر لاگین میکنه یه سری لاگ بندازید. کار خ سادش اینه که یه متد تو مدل همون یوزر وقتی لاگین میکنه بذارید که توش هر کاری دلتون میخاد بکنید. اما راه درستش اینه یه رخداد ایجاد کنید تحت عنوان لاگین یوزر‍‍‍. بعد وقتی یوزر لاگین کرد٬ چون معمولا هم شما٬ یه جا کد مربوط به لاگین رو مینویسید میاید داد میزنید که آهای کلاس هایی که براتون مهمه. یوزر لاگین کرداااا!!!!!.خوب این داد زدنه تازه اول قضیه هست. برای این که این دادو بزنید و بقیه کلاس ها حتی بفهمن که شما صداتون درومده باید چی کنید؟؟؟ این قسمت دقیقا پیاده سازی همون مکانیزم رخداد ها هست. شما در راحت ترین سناریو میاید یه کلاس میسازید و به هر شکلی مثل استفاده از آرایه یه لیست از کلاس هایی که براشون لاگین شدن یوزر مهمه نگه میدارید. این کلاسا رو به اصطلاح Observer صدا میکنیم. بعد تو همون کلاس یه متد میذارید تحت عنوان RegisterObserver که ورودیش همون آبجکت یا رفرنس به کلاس یا متدی هست که برای لاگین مهمه. ینی همون Observer خودمون.این متد کارش اینه که این Observer رو بره بریزه تو لیستی که از قبل برای اونا طراحی کرده که همشونو نگه داره.ممکنه یه جا بخاید یه Observe رو از لیست درارید که دگ براش اون رخداد مث لاگین کاربر مهم نباشه پس یه متد دگ مینویسید که همین کارو میکنه. تو عکس اسمش unregisterObserve هست.حالا برای اینکه اصلا بتونید داد بزنید که به بقیه Observer ها بگید کاربر لاگین کرده باید یه متد بنویسید مثلا به اسم notifyObservers که کارش اینه دونه دونه همه آبجت های تو لیست یاد شده تو بالا رو صدا کنه و متد مثلا update که قراره ری اکشن اون observer ها به مثلا لاگین شدن کاربر باشه رو ران کنه.خوب حالا شما تو همه اون Observer اون متد آپدیت رو میذارید و بعد دونه دونه attach یا register میشن به اون کلاسی که قرار بود رخداد رو هندل کنه.دگ تموم شد. حالا شما اونجا که کاربر لاگین داشت میکرد و میخاستید داد بزنید که آهای هوار این داداشمون لاگین کرده٬ میاید متد notifyObservers رو تو اون کلاسی که کل رخداد ها رو هندل میکرد صدا میکنید.اتفاقی که قراره بیوفته هم که واضحه.انشالله تو نوشتار بعدیم از نحوه پیاده سازی رخداد ها تو فریم ورک Yii2 مینویسم.مرسی. من امینم. اگه دوست داشتید لایک کنید و برای دوستاتون بفرستید</description>
                <category>امین کشاورز</category>
                <author>امین کشاورز</author>
                <pubDate>Thu, 17 May 2018 05:53:56 +0430</pubDate>
            </item>
                    <item>
                <title>چطوری یک شل اسکریپت بنویسم؟؟؟!!!</title>
                <link>https://virgool.io/@aminkt/%DA%86%D8%B7%D9%88%D8%B1%DB%8C-%DB%8C%DA%A9-%D8%B4%D9%84-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D8%A8%D9%86%D9%88%DB%8C%D8%B3%D9%85-rnyjfmnztnls</link>
                <description>سلامشاید برای شما که کاربر مک یا لینوکس هستید پیش اومده باشه ک کلی دستور لازم باشه بزنید تا یه برنامه کوچیک رو ران کنید. یا حتی یه اپلیکیشن.مثلا اون موقع که من لینوکس داشتم و میخاستم php storm رو باز کنم لازم بود حتما با دستور cd برم تو فولدر برنامه مثل دستور زیر:cd ~/apps/phpstorm/bin/بعد که تازه میرسیدی اینجا باید یه دستور برای ران کردن برنامه میزدی مثل زیر:sh phpstorm.shخو یه راه ساده برای جلو گیری از این کار این بود که یه بار برای همیشه یه بش اسکریپت بنویسم ولی چون بلد نبودم مدت ها با این عذاب ساختم.اما بش اسکریپت مربوطه به کار بالا چطوری نوشته میشه؟خ خ ساده تر از چیزی که فکر بکنید. تنها کافی بود که یه فایل متنی باز کنم و اینا رو توش بنویسم:#!/bin/bash cd ~/apps/phpstorm/bin/sh phpstorm.shینی خط اول باید با دستور #!/bin/bash معرفی میکردم که میخام بش بنویسم بعد همه اون کارا رو مینوشتم توش.بعد فایلو به اسم مثالا phpstormstart.sh ذخیره میکردم و میریختم تو یه جایی مثل روت یا هوم خودم و بعد با زدن دستور زیر تو ترمینال رانش میکردم.sudo /home/phpstormstart.shبه همین سادگی و به راحتی آب خوردن.امین هستمدوست داشتید برای دوستاتون بفرستید.</description>
                <category>امین کشاورز</category>
                <author>امین کشاورز</author>
                <pubDate>Sun, 13 May 2018 00:59:46 +0430</pubDate>
            </item>
            </channel>
</rss>