<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Serajoddin Aliabadi</title>
        <link>https://virgool.io/feed/@serajoddin.aliabadi</link>
        <description>اندکی برنامه نویس | softamoz.com | serajoddin-aliabadi.ir</description>
        <language>fa</language>
        <pubDate>2026-06-16 18:19:40</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/105066/avatar/GUf7EE.png?height=120&amp;width=120</url>
            <title>Serajoddin Aliabadi</title>
            <link>https://virgool.io/@serajoddin.aliabadi</link>
        </image>

                    <item>
                <title>آمار بازدید پست‌های من در سال ۹۹</title>
                <link>https://virgool.io/@serajoddin.aliabadi/%D8%A2%D9%85%D8%A7%D8%B1-%D8%A8%D8%A7%D8%B2%D8%AF%DB%8C%D8%AF-%D9%BE%D8%B3%D8%AA-%D9%87%D8%A7%DB%8C-%D9%85%D9%86-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-%DB%B9%DB%B9-mf9v43ouqcvf</link>
                <description>در طول تاریخ از اعداد استفاده کردیم تا اغلب داد و ستد کنیم و آن‌چیزی که شمردنی است را بشماریم. برای هر عدد واحد درست کردیم تا عددهای زندگی قاطی نشوند و از اعداد، شفاف‌تر استفاده کنیم؛ مثلا وقتی می‌گوییم ده هزار تومان به پول اشاره داریم و وقتی می‌گوییم ده هزار بلیط به بلیط!روز به روز که در زندگی جلو‌تر رفتیم عددها فرقی نکردند ولی این واحدها بودند که زیاد شدند. واحد کریپتو، واحد اصله درخت، واحد فاصله و …«واحد» یک توافق عمومی است برای شمردن؛ تا همانطور که گفتم شمردن‌ها قاطی نشود. مشاهده افراد دارای ثروت (اجتماعی یا مالی) به من ثابت کرده اینکه چه چیزی را بشماریم از اینکه چطور بشماریم مهم‌تر است. هرکس با واحد خاصی مسائل زندگی را می‌شمارد. اینطور به نظرم آمده که مشخص کردن واحد یعنی مشخص کردن اینکه من در زندگی برای چه چیزهایی ارزش قائلم و می‌خواهم چه چیزهایی را در زندگی بشمارم. https://cdn.virgool.io/annual-report/1399/mcnjfkbozu7q-p2Prp.mp4 اعدادی که بدون واحد ثبت کردمبه ویدیویی که ویرگول برایم ساخته که نگاه می‌کنم میبینم که در سال ۹۹، من در مجموع ۸,۱۱۷ کلمه در ویرگول نوشتم و منتشر کردم و مخاطبین، پست‌های من را ۸۶ مرتبه پسندیدند و  ۱۱ بار هم نظر خود را روی پست‌های من به اشتراک گذاشتند. در سال ۹۹، ۲۵ نفر در ویرگول من را دنبال کردند تا پست‌های بعدیم را بخوانند. این اعداد نشان میدهند من کاری کرده‌ام. هرکدام به واحدی وصل هستند. از خودم می‌پرسم من کدام واحد را شمارش کرده‌ام؟ کدامیک از واحدهای بالا از همه برای من مهم‌تر است؟ ادامه ویدیو را می‌بینم.آمار از اثر بیرونی می‌گویندطبق آمار پست‌های من ۲,۳۸۶ بار خوانده شدند و ۲۰۸,۷۵۶ ثانیه صرف مطالعه آنها شده است، که با توجه به جمعیتی که در ایران به اینترنت دسترسی دارند، ویرگول به من می‌گوید که توانستم  ۰/۰۰۲۸۶۲۰۲۴ ثانیه، سرانه مطالعه دیجیتال کشور را بالا ببرم.از طرف دیگر ویرگول به من می‌گوید که اگر قرار بود پست‌هایم را چاپ و به دست تک تک خوانندگان برسانم باید ۶,۴۵۷ کاغذ مصرف می‌کردم.آن عددهای کوچک ابتدای ویدیو حالا تبدیل شده‌اند به عددهای بزرگ به اینکه من جلوی مصرف این تعداد کاغذ را گرفتم یا به اینکه من  ۰/۰۰۲۸۶۲۰۲۴ ثانیه، سرانه مطالعه دیجیتال کشور را جابه جا کرده‌ام. واحد این عددها برای من ملموس‌تر است.واحد نوشتن چیست؟همه عددهای بالا و همینطور اثر بیرونی که روی خوانندگان و همینطور در مقیاس بزرگتر طبیعت و جامعه اطرافم گذاشتم اعدادی هستند که من دوستشان دارم و به آنها افتخار می‌کنم. اگر چنین ویدیویی دست شما نیز رسید به شما بابت تک تک اعداد تبریک می‌گویم.اثر هر نوشته تا حدودی معلوم است، اگر بنویسید جلوی قطع درخت را می‌گیرید، به سرانه مطالعه کشور اضافه می‌کنید و خوانندگانی جذب می‌کنید که شما را از طریق نوشته‌هایتان می‌شناسند و …به نظرم می‌رسد که نوشته‌های من و شما واحد ندارند ولی اثر بیرونی دارند.</description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Mon, 22 Mar 2021 23:19:53 +0430</pubDate>
            </item>
                    <item>
                <title>تغییر محل ذخیره سازی ایمیج های Docker Desktop در WSL</title>
                <link>https://virgool.io/@serajoddin.aliabadi/%D8%AA%D8%BA%DB%8C%DB%8C%D8%B1-%D9%85%D8%AD%D9%84-%D8%B0%D8%AE%DB%8C%D8%B1%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%A7%DB%8C%D9%85%DB%8C%D8%AC-%D9%87%D8%A7%DB%8C-docker-desktop-%D8%AF%D8%B1-wsl-ctbos5k17n8p</link>
                <description>بعد از انتشار نسخه ۲ از WSL یا همان  Windows Subsystem For Linux امکان استفاده از Docker Desktop بر مبنای این  ابزار فراهم شد. داکر دو distribution در WSL ایجاد می کند که می توانید  با دستور زیر آنها را ببینید:wsl -l -vیکی از آنها با عوان docker-desktop-data برای ذخیره سازی Image های داکر مورد استفاده قرار می گیرد.محل ذخیره سازی Image های Docker Desktop در WSLبه صورت پیشفرض، فایل های vhdx مربوط به داکر در آدرس زیر قرار دارد:%USERPROFILE%\AppData\Local\Docker\wsl\data\ext4.vhdxبرای مثال در سیستم من در آدرس های:C:\Users\Asus\AppData\Local\Docker\wsl\dataوC:\Users\Asus\AppData\Local\Docker\wsl\distroبا توجه به تعداد و حجم Image هایی که Pull کردید، حجم فایل ext4.vhdx  در دایرکتوری data متغیر خواهد بود. گاهی با توجه به محدودیت های فضای  ذخیره سازی، لازم است فایل ext4.vhdx را به درایو دیگری منتقل کنیم. اما  چگونه؟ https://softamoz.com/%d8%aa%d8%ba%db%8c%db%8c%d8%b1-%d9%85%d8%ad%d9%84-%d8%b0%d8%ae%db%8c%d8%b1%d9%87-%d8%b3%d8%a7%d8%b2%db%8c-%d8%a7%db%8c%d9%85%db%8c%d8%ac-%d9%87%d8%a7%db%8c-docker-desktop-%d8%af%d8%b1-wsl/ تغییر محل ذخیره سازی ایمیج های Docker Desktop در WSLبرای این کار، ابتدا با کلیک راست روی آیکن داکر، بر روی Quit Docker  Desktop کلیک می کنیم تا داکر shut down شود. سپس با استفاده از دستور زیر  مطمئن شوید distribution های مربوط به داکر در حالت stop قرار داشته باشد:wsl -l -vسپس با استفاده از دستور زیر، از docker-desktop-data را که محل ذخیره سازی ایمیج هاست، export می گیریم:wsl --export docker-desktop-data &amp;quotOtherDrive:\PathToSave\docker-desktop-data.tar&amp;quotبا توجه به حجم این distribution ممکن است ذخیره سازی آن در محل ذکر شده، زمان بر باشد.سپس با دستور زیر، docker-desktop-data را حذف می کنیم. توجه داشته باشید معمولا بعد از اجرای این دستور فایل ext4.vhdx حذف می شود.wsl --unregister docker-desktop-dataحال می توانیم فایل docker-desktop-data.tar در محل دلخواهی به WSL ایمپورت کنیم:wsl --import docker-desktop-data &amp;quotOtherDrive:\PathToNewext4.vhdxFile\&amp;quot &amp;quotOtherDrive:\PathWhereExportFileExists\docker-desktop-data.tar&amp;quot --version 2اکنون می توانید مجددا داکر را اجرا کنید. در صورتی که مشکلی نبود، می توانید فایل docker-desktop-data.tar را حذف کنید.منبع : وبلاگم! (کلیک کن)</description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Mon, 15 Mar 2021 13:23:09 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش هوش مصنوعی و یادگیری ماشین در سی شارپ با ML.NET</title>
                <link>https://virgool.io/coderlife/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%87%D9%88%D8%B4-%D9%85%D8%B5%D9%86%D9%88%D8%B9%DB%8C-%D9%88-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE-%D8%A8%D8%A7-mlnet-o6yzhvr0czoh</link>
                <description>این روز ها خیلی از برنامه نویسان علاقه به یادگیری هوش مصنوعی و یادگیری ماشین دارند. به لطف ML.NET برنامه نویسان سی شارپ و دات نت هم می توانند به راحتی طیف گسترده ای از سناریو های یادگیری ماشین را پیاده سازی کنند.تو این پست قصد دارم یه منبع نسبتا مناسب برای شروع آموختن هوش مصنوعی و یادگیری ماشین در سی شارپ معرفی کنم.دوره Hands-On Machine Learning for .NET Developers از انتشارات Packt Publishing منبع مناسبی برای یادگیری ML.NET هست. در این دوره چند سناریو متفاوت پیاده سازی خواهند شد.سناریو های زیر در این دوره پیاده سازی می شوند:1.Finding the Best Price on Laptops Using Price Prediction (Regression)2.Determining Aggression in User Comments3.Classifying News into Subjects4.Building a Recommender System5.Classifying Images Using TensorFlow &#x27;Transfer Learning&#x27;6.Detecting Facial Expressions in Your Webcam with a Pre-Trained ONNX Modelویدئو های این دوره به زبان انگلیسی هستند و متاسفانه زیرنویس انگلیسی موجود نیست. سعی می کنم به مرور اونها رو توی آپارات قرار بدم: https://www.aparat.com/v/liVa6?playlist=518197 https://www.aparat.com/v/liVa6?playlist=518197 البته ممکنه آپارات ویدئو ها رو حذف کنه، میتونید این دوره از لینک زیر دانلود کنید:https://coursedownloader.net/udemy-hands-on-machine-learning-for-net-developers-2020-6/</description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Sun, 30 Aug 2020 19:05:13 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش برنامه نویسی | کپی از منابع زبان اصلی | خوب، بد، زشت</title>
                <link>https://virgool.io/coderlife/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%DA%A9%D9%BE%DB%8C-%D8%A7%D8%B2-%D9%85%D9%86%D8%A7%D8%A8%D8%B9-%D8%B2%D8%A8%D8%A7%D9%86-%D8%A7%D8%B5%D9%84%DB%8C-%D8%AE%D9%88%D8%A8-%D8%A8%D8%AF-%D8%B2%D8%B4%D8%AA-z73onr43mduq</link>
                <description>چند وقتی هست که درگیر آماده سازی چند دوره آموزشی در حوزه برنامه نویسی هستم. در نگاه اول کار خیلی ساده ای هست. بخصوص اگر موضوعی را انتخاب کرده باشید که در استفاده ی از آن تجربه زیادی داشته باشید. ولی در حین کار متوجه سختی آن می شویم.برای محتوای آموزش ها بجز تجربیات خودم از منابع دیگه ای مثل کتاب ها و دوره های آموزشی انگلیسی استفاده می کنم. این کار باعث میشه هم خودم بروز باشم و هم آموزش با کیفیت و اصولی تولید کنم. این استفاده از سایر منابع کار بسیار معمول در حوزه آموزش به حساب میاد. چند سال پیش در یکی از کلاس های برنامه نویسی مجتمع فنی تهران حضور داشتم. استاد اون کلاس، این نکته رو ذکر کرد که &quot;برخی از دانشجویان کلاس، صرفا برای یادگیری روش های آموزش در کلاس شرکت می کنند تا خودشان بعدا بتوانند تدریس کنند و این کار بسیار معمول و طبیعی هست.&quot;اما اخیرا به موردی برخورد کردم که سوالاتی برای من ایجاد کرد. امیدوارم با مطرح کردن این مورد، بتونم نظرات شما، مخاطب این مقاله، رو دریافت کنم که تا حدودی به سوالاتم پاسخ داده بشه.برخی از مدرسین یکی از مطرح ترین سایت های ایرانی در حوزه آموزش برنامه نویسی و طراحی وب، آموزش های زبان اصلی سایت هایی مثل Udemy و PacktPub رو کپی می کنند. این کپی کردن با مواردی که بالا تر اشاره کردم تفاوت داره و به معنی واقعی کلمه کپی می کنند. سرفصل به سرفصل، ویدئو به ویدئو و مثال به مثال عینا کپی می کنند. حتی در برخی از موارد اسم پروژه هم تغییر داده نمیشه!!! میشه گفت این کپی، یجور دوبله آموزش به زبان فارسی هست!!!وقتی کتابی ترجمه میشه نام نویسنده کتاب ذکر میشه. نه اینکه مترجم، کتاب رو به اسم خودش منتشر کنه! جدای از حقوق تولید کننده اصلی، آیا افرادی که این آموزش هارو کپی می کنند، خلاقیت لازم برای تولید آموزش بدون کپی ندارند؟ آیا نمی تونند حداقل پروژه و مثال هارو کمی تغییر بدن؟ شرایط زمانی بدتر میشه که نسخه اصلی آموزش بیان بهتری داره و نسخه فارسی ... !!!اینکه از نحوه تدریس و سرفصل های یک مدرس ایده بگیریم کار طبیعی و کاملا منطقی هست ولی کپی برداری کامل از یک آموزش کار درستی هست؟ اکثر سایت های آموزشی مثل Udemy و ... ایران رو تحریم کردند و اگر خریدی هم انجام بشه، در صورتی که به ایرانی بودن کاربر پی برده بشه، اکانت بسته میشه. با توجه به این شرایط، امکان استفاده رایگان از این آموزش ها برای کاربران ایرانی فراهم هست. خیلی از سایت ها این اموزش ها رو به صورت رایگان و یا با مبلغ کمی در اختیار ما قرار می دهند. در این شرایط، فارسی سازی (کپی کامل) این آموزش ها نیاز هست؟جالب تر اینکه مدرسین این آموزش های کپی شده، گاها درآمد چند میلیونی(حتی کم) از هر کدوم از این آموزش ها دارند.اگر شما هم مخاطب این مدل آموزش ها باشید و متوجه بشید که آموزش از یک منبع زبان اصلی عینا کپی شده، از مبلغی که پرداختید راضی هستید؟ آیا از این نوع تدریس رضایت دارید؟ آیا به عنوان مخاطب، از من مدرس انتظار ارائه یک آموزش کپی رو دارید؟ این سوالاتی هست که برای من به عنوان یک مدرس بوجود اومده.لطفا نظرات خودتون رو در این مورد ارسال کنید. همچنین میتونید نظراتتون رو به https://t.me/dupm97 ارسال کنید. ممنونم ?</description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Sat, 20 Jun 2020 11:16:28 +0430</pubDate>
            </item>
                    <item>
                <title>بکاپ گیری در فضاهای ابری ایرانی</title>
                <link>https://virgool.io/@serajoddin.aliabadi/%D8%A8%DA%A9%D8%A7%D9%BE-%DA%AF%DB%8C%D8%B1%DB%8C-%D8%AF%D8%B1-%D9%81%D8%B6%D8%A7%D9%87%D8%A7%DB%8C-%D8%A7%D8%A8%D8%B1%DB%8C-%D8%A7%DB%8C%D8%B1%D8%A7%D9%86%DB%8C-lxvacwnacsgv</link>
                <description>همه ی ما فایل هایی داریم که نیاز هست از اونها پشتیبان داشته باشیم. گاهی محتوای این فایل ها حساس نیست و صرفا پایداری و دسترسی بکاپ ها در اینترنت برای ما اهمیت داره.یکی دو سال پیش اینجور فایلها رو به صورت آفلاین و روی سیستم شخصی ذخیره می کردم تا اینکه با بالا رفتن حجم و استفاده کم، به این فکر افتادم که چرا در فضا های ابری دخیره سازی نکنم!گزینه اولم استفاده از هاست های بکاپ بود. اکثرا دسترسی FTP و سی پنل یا دایرکت ادمین میدادن و امکانات از هاست های معمولی کمتر بود که صرفا برای بکاپ گیری استفاده میشد. با وجود رونق پیدا کردن فضاهای ابری، هنوز هم از این گزینه استفاده می کنم!!!اما تو این پست میخوام یجورایی این فضاها رو مقایسه کنم. از همین گزینه اول یعنی هاست های بکاپ شروع می کنم که فقط دسترسی FTP یا پنلی ساده میدن.کافیه یه سرچ کنید تا کلی از این سایت رو پیدا کنید. قیمت های متفاوتی دارن. هاستی که اخیرا ازش استفاده می کنم &quot;شیراز وب هاست&quot; هست. قیمت خوبی داره و تا الان مشکل خاصی نداشتم.در این سایت هزینه هاست 120 گیگ بکاپ، ماهانه 30 هزار تومان هست.گزینه بعدی سایت پارسا اسپیس هست. این سایت هم یجورایی هاست دانلود با فایل منیجر و دسترسی FTP ارائه میده. اوایل قیمت های خوبی داشت ولی الان هاست 100 گیگ ماهی 75 هزار تومان خرج داره. البته منظورم این نیست که این قیمت بالاست. ولی قیمت های پایین تر هم پیدا میشه ?و اما یکی دیگه از گزینه ها سایت پرشین گیگ هستدر کل از این سایت خاطرات خوبی ندارم. کندی و قطعی زیادی داشت قدیم ترا ولی الان نمیدونم. هزینه هاست 100 گیگ این سایت ماهی 40 هزار تومان هست. این سایت پنل مدیریت فایل هم ارائه میده.یکی دیگه از گزینه های گرون قیمت سایت ابر زس هستهزینه 100 گیگ فضا ماهانه چیزی حدود 75 هزار تومن هست. چون قیمتش یکم بالاست تجربه استفاده ازش رو ندارم.و اما یکی از گزینه های جدید الورود سایت ابر آروان هستاین سایت اخیرا Storage ابری خودش رو معرفی کرده که فعلا در حالت بتا قرار داره و بزودی نسخه نهایی منتشر میشه. جالبه که از استاندارد S3 استفاده می کنه پس کلی کلاینت متفاوت برای استفاده ازش وجود داره. کلاینت هایی مثل S3 Browser که نسخه رایگان هم داره. هزینه نگهداری 100 گیگ فایل در یک ماه چیزی حدود 30 هزار تومن هست. که البته هزینه ترافیک به صورت جدا محاسبه میشه. امروز با کلاینت S3 Browser حدود 36 گیگ فایل در کمتر از یک ساعت روی این سرویس آپلود کردم. البته چون تعداد فایل ها زیاد بود(حدود 6000)، پنل مدیریت فایل برام بالا نمیاد!و اما گزینه آخر، رو اعصاب ترین گزینه لیست یعنی ابرینواین سایت هم نسبتا قدیمی هست. قیمت هاشو تو تصویر میبینید. که نسبتا قیمت های خوبی داره. ولی کنده! کلی تو استفاده ارور عدم اتصال به سرور میده! پیام های عجیب و غریب تو نسخه اندرویدش میاد و ...جالبه بدونید اون 36 گیگ فایل که بالاتر گفتم، تو این سات هم دارم آپلود می کنم. از ساعت 8 صبح امروز تا الان که 9 شب هست هنوز آپلود نشده!!! و الان که این مقاله می نویسم کم کم دارم بیخیالش میشم.سعی کردم تجربیات خودم رو به اشتراک بذارم. قصد تخریب و تایید هیچ کدوم از این سرویس ها رو ندارم. مسئله ای که روشن هست اینه که سرویس های ابری ایرانی فاصله زیادی از نمونه های خارجی دارن. تنها راه کمک به پیشرفت اینه که مشکلات رو بررسی و اطلاع رسانی کنیم تا رفع بشه.شما هم اگر تجربه ای در این مورد دارید با ما به اشتراک بگذارید ?</description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Wed, 10 Jun 2020 20:37:43 +0430</pubDate>
            </item>
                    <item>
                <title>آیا وقت و سرمایه خود را در وبینار ها یا کلاس های حضوری تلف می کنیم؟</title>
                <link>https://virgool.io/@serajoddin.aliabadi/%D8%A2%DB%8C%D8%A7-%D9%88%D9%82%D8%AA-%D9%88-%D8%B3%D8%B1%D9%85%D8%A7%DB%8C%D9%87-%D8%AE%D9%88%D8%AF-%D8%B1%D8%A7-%D8%AF%D8%B1-%D9%88%D8%A8%DB%8C%D9%86%D8%A7%D8%B1-%D9%87%D8%A7-%DB%8C%D8%A7-%DA%A9%D9%84%D8%A7%D8%B3-%D9%87%D8%A7%DB%8C-%D8%AD%D8%B6%D9%88%D8%B1%DB%8C-%D8%AA%D9%84%D9%81-%D9%85%DB%8C-%DA%A9%D9%86%DB%8C%D9%85-rkxowlpeep2h</link>
                <description>چند وقتی است که درگیر بیماری منحوس کرونا هستیم. مجبوریم در خانه بمانیم یا به صورت بسیار محدود با سایرین در ارتباط باشیم. کلاس های حضوری، سمینار ها و کمپ ها کنسل شدند. دانشگاه ها و مدارس تعطیل شدند. ولی افرادی که به آموزش و آموختن علاقه دارند، متوقف نشدند. هرچند کرونا خیلی از فعالیت های آموزشی را تا حدودی متوقف کرد، اما آموزش به صورت مجازی همچنان ادامه دارد.خیلی از ما برای یادگیری هزینه می کنیم خیلی از ما در کلاس های حضوری، وبینار ها و ... ثبت نام می کنیم که چیز های جدیدی یاد بگیریم، مهارت های خودمون رو افزایش بدیم و حتی بتونیم درآمد خودمون رو بالا ببریم. اما آیا وقت و سرمایه خود را در وبینار ها یا کلاس های حضوری تلف می کنیم؟ امروز دومین جلسه از وبینار &quot;کمپ 22 روزه آنلاین سئو&quot; توسط تیم googlegeeks برگزار شد. سرکار خانم &quot;ندا خالقی&quot; مدرس این جلسه بودند. به عنوان کسی که با سئو آشنایی دارم، میتونم بگم مباحث خوبی ارائه شد.اما در این کارگاه چه گذشت؟از دید من، قسمت جالب این وبینار، سوالاتی بود که شرکت کنندگان می پرسیدند. خیلی از سوالات به قدری ابتدایی بود که آدم شاخ در میاره! مثلا یکی پرسید &quot;لطفا یه هیتلر شکن (?) خوب معرفی کنید؟&quot; یا یکی دیگه می پرسید &quot;چجوری تگ های مربوط به وردپرس رو ویرایش و سئو فرندلی (البته نه دقیقا همین عبارت) کنیم؟&quot; و سوالات این مدلی، خیلی زیاد پرسیده میشه... نه تو این کمپ بلکه تو سایر وبینار ها و حتی کلاس های حضوری. پرسیدن اشکال نداره... اما داره ?!چرا کسی که سایت راه اندازی نکرده و حتی در این مورد کوچکترین تحقیقی هم نکرده، و مشخصا هیچ اطلاعاتی نداره، باید بابت شرکت در کلاس غیر رایگان آموزش سئو ثبت نام کنه؟ نکته جالب اینجاست.من تجربه شرکت در کلاس های حضوری، سمینارها و اخیرا وبینار های زیادی دارم. وجه مشترک، اینه که خیلی وقت ها افراد بابت آموزش هزینه پرداخت می کنند اما بازدهی بسیار کمی براشون داره. چون حتی زحمت اینو به خودشون ندادن که تحقیق اولیه در مورد سرفصل های کلاس انجام بدن.اندکی خاطرهیک هم کلاسی در مجتمع فنی تهران داشتم که حدود 2 میلیون تومن بابت هزینه کلاس حضوری پرداخت کرده بود ولی حتی چند جلسه آخر، حضور هم نداشت! حتی در مورد وبینار &quot;کمپ 22 روزه آنلاین سئو&quot; که بالاتر گفتم، با یک بررسی ساده میشه فهمید خیلی ها بابت این کمپ هزینه پرداخت کردند ولی حتی شرکت نکردند. و برای بعضی ها هم بازدهی بسیار کمی داره! که البته مشکل از برگزار کننده نیست! مشکل از اینه که قبل از هزینه کردن برای آموزش باید خودمون نسبت به سرفصل، آشنایی اولیه داشته باشم.چجوری از کلاس ها بیشترین استفاده رو ببریم؟خیلی خوب میشه اگه بجز آشنایی اولیه حتی محل نیاز به این آموزش هم پیدا کرده باشیم... مثلا برای کلاس سئو، قبلش برای خودمون یه سایت راه بندازیم یا حداقل در موردش تحقیق کنیم. باید بدونیم به عنوان کسی که قراره هست سئو کار کنه، دائما با سایت ها سر و کار داریم پس آشنایی با این موارد به صورت حداقلی لازم و واجبه و مهم تر اینکه قبل از پرداخت هزینه این کلاس ها باید با این موارد آشنا بشیم. چون ممکنه همونجا به این نتیجه برسیم که این آموزش برای ما مفید نیست.خیلی ها همچین انتظاری دارند : &quot;کلاس پولی و حضوری ثبت نام می کنم که همه چیز رو همونجا یاد بگیرم!&quot; . این جمله هم درست هست و هم غلط. قطعا مدرسین کلاس ها، از دانش کافی برخوردار هستند و سرفصل مربوط به کلاس رو پوشش میدن. ولی مشکل از اینجا شروع میشه که این سرفصل ها همه چیز نیستند! باید به کلاس ها و وبینار ها به دید استارتر کیت نگاه کنیم که فقط برای شروع کار کفایت می کنند. برای اینکه بفهمیم تو دنیای اون موضوع چی میگذره. داستان وقتی خیلی خیلی حساس میشه که کلاس مربوط به مهارت خاصی هست و تئوری نیست. اگه از قبل با موضوع آشنایی نداشته باشیم، حداقل ضرر ما اینه که کلاس بازدهی بسیار پایینی برای ما خواهد داشت.و اما جمع بندی و چیزی که من از این مشاهده یاد گرفتمبا وجود اینترنت و منابع زیاد و رایگان، به هیچ وجه اگه در مورد موضوعی تحقیق نکرده باشم و حتی تا حدودی اون موضوع رو بلد نباشم، بابت آموزش حضوری و ... هزینه پرداخت نمی کنم. سعی می کنم درک اولیه و مناسبی از موضوع پیدا کنم، بعد، از آموزش های غیر رایگان استفاده کنم.این باعث میشه بهتر بتونم با کلاس همراهی کنم و از همه مهم تر بتونم از استاد استفاده کنم، سوال بپرسم، اشکالاتم رو رفع کنم، درک ناقصم از موضوع رو بهبود بدم و ... .</description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Mon, 11 May 2020 00:50:52 +0430</pubDate>
            </item>
                    <item>
                <title>شبکه کردن special ops های بازی Call of Duty: Modern Warfare 3</title>
                <link>https://virgool.io/@serajoddin.aliabadi/%D8%B4%D8%A8%DA%A9%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-special-ops-%D9%87%D8%A7%DB%8C-%D8%A8%D8%A7%D8%B2%DB%8C-call-of-duty-modern-warfare-3-jvawxcsjzrxb</link>
                <description>یکی از بازی هایی که خیلی ها باهاش خاطره دارن Call of Duty: Modern Warfare 3 هست. این بازی سه قسمت Campaign ، Multiplayer و Special Ops داره. قسمت Special Ops میشه به صورت دو نفره یا Cooperative از طریق LAN بازی کرد. در ادامه میخوام روش این کار بهتون آموزش بدم.اول از همه باید دو تا سیستم شبکه شده داشته باشید. کافیه یکم سرچ کنید تا بتونید این کار انجام بدین.پیشنهاد میدم آخرین نسخه از بازی که ری پک fitgirl ورژن 1.9.461 هست رو دانلود و نصب کنید. اینم با یه سرچ ساده میتونید دانلود کنید.بعد نیاز به پچ TeknoMW3 دارید که آخرین نسخه موجود برای دو نفره بازی کردن نسخه 2.9.2.0 هست.لینک دانلود TeknoMW3-292 : سرور 1 سرور 2بعد از دانلود فایل بالا، محتوای اونو در محل نصب بازی کپی کنید. (دو فایل TeknoMW3.exe و TeknoMW3.DLL)این نسخه از پچ TeknoGod نیاز به نسخه 1.9.446 بازی داره. درحالی که نسخه پیشنهادی من که بالاتر ذکر کردم 1.9.461 هست. پس برای اجرا، نیاز به فایل exe ورژن 1.9.446 بازی داریم که از لینک زیر میتونید دانلود کنید:لینک دانلود iw5sp_1.9.446.exe : سرور 1 سرور 2این فایل هم پس از دانلود در محل نصب بازی کپی کنید. و تمام. میتونید از فایل iw5sp.exe اصلی (ری پک فیت گرل) کپی داشته باشید که اگه مشکلی پیش اومد مجبور به نصب مجدد بازی نباشید.توجه کنید که دیگه نباید بازی رو با فایل اجرایی اصلی اجرا کنید. حالا می تونید فایل TeknoMW3.exe رو که در محل بازی کپی کرده بودید اجرا کنید. روی coop کلیک کنید. سیستمی که قراره Host یا سرور بشه کافیه start as host انتخاب کنه. ولی client علاوه بر انتخاب start as client باید آی پی سیستم هاست هم وارد کنه. بعد وارد بازی میشید و مثل تصویر زیر، گزینه سمت راست به TeknoGods coop تغییر نام داده. وارد اون بخش میشید و ادامه ماجرا... .بعد تو صفحه جدید اسم هردو بازیکن قابل مشاهده هست (سمت راست بالا). گاهی ممکنه یکم طول بشه تا لود بشه... مشکلی نیست.اگه مراحل فوق کامل انجام داده باشید ولی اسم دو نفر نیومد به احتمال خیلی زیاد مشکل از شبکه هست. باید هر دو سیستم به هم پینگ داشته باشن و فایروال هم به بازی اجازه اتصال به شبکه داده باشه.امیدوارم لذت ببرید.</description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Wed, 29 Apr 2020 22:11:28 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با Canonical Tag و تاثیر آن در سئو</title>
                <link>https://virgool.io/@serajoddin.aliabadi/%D8%A2%D8%B4%D9%86%D8%A7%DB%8C%DB%8C-%D8%A8%D8%A7-canonical-tag-%D9%88-%D8%AA%D8%A7%D8%AB%DB%8C%D8%B1-%D8%A2%D9%86-%D8%AF%D8%B1-%D8%B3%D8%A6%D9%88-og3ygx5y16wy</link>
                <description>از نظر موتور های جست و جو، وجود صفحات و محتوای تکراری در وب سایت ها  مناسب نیست و امتیاز منفی به سایت هایی با چنین محتوایی داده می شود. به  عنوان وب مستر و تولید کننده محتوا تا حد امکان سعی داریم صفحات و محتوای  تکراری ساخته نشود. Canonical Tag در این راه به ما کمک می کند.مشکل همیشگی محتوای تکراریبا این حال گاهی کنترل این مورد از دست ما خارج می شود. برای مثال ممکن  است برخی از صفحات سایت هم با www و هم بدون آن در دسترس باشند یا برخی از  صفحات با هر دو پروتکل HTTPS و HTTP در دسترس باشند. برخی از سایت ها برای  کاربرد های مختلف، یک محتوا را با چند لینک متفاوت منتشر می کنند. مثلا یک  لینک برای نسخه قابل چاپ و یک لینک برای نسخه تحت وب. یا حتی برخی از سایت  ها یک لینک کوتاه در کنار لینک اصلی برای صفحات در نظر می گیرند. تمامی این  موارد از نظر موتور های جست و جو محتوای تکراری محسوب می شوند.راه نجات!تگ Canonical، آدرس (URL) محتوا یا صفحه اصلی که باید در موتور جست و جو  Index شود را مشخص می کند. این Tag به عنوان یک Meta Tag در تمامی صفحات  قرار میگیرد و صفحه اصلی یا ابتدایی (Canonical) را مشخص می کند. به این  نکته توجه کنید که در صورت استفاده نامناسب از Canonical Tag، موتور جست و  جو می تواند آن را در نظر نگیرد؛ پس به منظور تقلب و گول زدن گوگل از آن  استفاده نکنید!پیشنهاد می کنم در تمامی صفحات سایت، این تگ را قرار دهید!نحوه استفاده صحیح از Canonical Tagاین تگ را باید درون تگ HEAD هر صفحه قرار بدهید. فرض کنید صفحه ای با آدرس زیر داریم:http://www.example.com/what-is-the-canonical-tag.htmlو برای این صفحه یک لینک کوتاه به شکل زیر هم وجود دارد:http://example.com/ctagپس باید در هر دو صفحه تگ Canonical را به صورت زیر قرار بدهیم:توجه داشته باشید، وقتی از این تگ استفاده می کنید، باید محتوای هر دو  صفحه تا حد زیادی (و حتی به صورت کامل) یکسان باشند. اگر اینطور نباشد  موتور جست و جو از این تگ صرف نظر می کند. اگر تعداد زیادی از این موارد در  سایت شما باشد ممکن است تمامی تگ های Canonical نادیده گرفته شوند.ابزار های زیادی با عنوان Canonical Tag Checker در اینترنت وجود دارد  که میتوانید از آن ها استفاده کنید و این تگ را در صفحات مختلف خود بررسی  کنید.اشتباهات رایجدر صفحاتی از تگ Canonical استفاده کنید که وجود داشته باشند و مهم تر  از آن، در دسترس موتور جست و جو باشند. برای مثال در صفحاتی که به عنوان  NoIndex مشخص کردید نباید از این تگ استفاده کنید. همچنین در هر صفحه فقط  یک Canonical Tag قرار دهید.اگر صفحه ۱ را به عنوان Canonical صفحه ۲ و صفحه ۲ را به عنوان  Canonical صفحه ۱ در نظر بگیرید، باعث ایجاد mixed signals شده اید و نباید  این کار را انجام دهید. همچنین اگر صفحه ۱ را به عنوان Canonical صفحه ۲ ،  صفحه ۲ را به عنوان Canonical صفحه ۳ و … در نظر بگیرید، دچار اشتباه در  استفاده از این تگ شده اید.Canonical Tag یا redirects ۳۰۱ مسئله این است!این دو مورد اساسا با هم تفاوت دارند و نباید بجای هم استفاده شوند. در  مورد ریدایرکت ۳۰۱ اگر صفحه ۱ را به صفحه ۲ ریدایرکت کنید، کاربران صفحه ۱  را نمی بینند و به صفحه ۲ منتقل می شوند. اما در صورتی که از Canonical Tag  استفاده کنید، هر دو صفحه در دسترس خواهند بود.پس هر کدام را در جای مناسب خود استفاده کنید.منبع : سافت آموز https://softamoz.com/?p=755 مطالعه بیشتر:https://support.google.com/webmasters/answer/139066https://yoast.com/rel-canonicalhttps://moz.com/learn/seo/canonicalization</description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Tue, 14 Apr 2020 10:33:06 +0430</pubDate>
            </item>
                    <item>
                <title>چرا برنامه نویسان باید ۵ ساعت در روز کار کنند؟</title>
                <link>https://virgool.io/@serajoddin.aliabadi/%DA%86%D8%B1%D8%A7-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%D8%A7%D9%86-%D8%A8%D8%A7%DB%8C%D8%AF-%DB%B5-%D8%B3%D8%A7%D8%B9%D8%AA-%D8%AF%D8%B1-%D8%B1%D9%88%D8%B2-%DA%A9%D8%A7%D8%B1-%DA%A9%D9%86%D9%86%D8%AF-udzchruxtwws</link>
                <description>یک پیشنهاد خوب دارم: برنامه نویسان باید ۵ ساعت در روز کار کنند.بدون شناختن شما یا نوع پروژه هایی که انجام می دهید، می توانم تضمین  کنم، کار مفیدی که به عنوان یک توسعه دهنده در یک روز می توانید انجام  دهید، در ۵ ساعت اولیه ی روز کاری شماست. در واقع، به احتمال زیاد ۳ تا ۴  ساعت، قبل از ناهار.اگر یک شرکت توسعه نرم افزار داشته باشم و تصمیم به استخدام شما بگیرم،  حقوقی بابت ۸ ساعت کار در روز را به شما می دهم؛ اما شما فقط ۵ ساعت در روز  کار خواهید کرد! من اجازه می دهم شما زودتر به خانه بروید و از زندگی لذت  ببرید!متأسفانه، علیرغم زندگی در دوران مدرن، محل کار ما هنوز تابع یک سیستم  سنتی است: معمولا ۵ تا ۹ ساعت کار در روز. در حالی که این رویه ممکن است  برای بسیاری از صنایع مفید باشد، آن را برنامه نویسان مطلوب نمی بینم.زمانی بود که ۱۲ ساعت در روز کدنویسی می کردم. گاهی اوقات حتی در  تعطیلات آخر هفته! حدس بزنید چه اتفاقی افتاد؟ مچ دستم آسیب دید. بسیاری  این آسیب را به عنوان سندرم تونل کارپ میشناسند.این بیماری از مچ دستم آغاز شد، و سپس به کف دست و آرنجم رسید. گاهی از  روز ها نمی توانستم بیش ۱ الی ۲ ساعت کار کنم و از درد زیاد مجبور به ترک  محل کار می شدم. این به این معنی است که در این شرایط پرداختی به من انجام  نمی شد. علاوه بر این، برنامه نویسی از علایق من است و فکر به اینکه نمی  توانم کد بزنم دردناک بود.بسیاری از برنامه نویسان با این مشکل در زندگی خود رو به رو هستند. برخی  (مانند من) موفق به بهبودی میشوند، اما برای دیگران، این مشکل به عنوان یک  چالش در زندگی مطرح است.یک راه حل ساده: برنامه نویسان باید ۵ ساعت در روز کار کنندبنابراین، حالا شما می دانید که به عنوان یک توسعه دهنده، در معرض درد  در مچ دست، ساعد، گردن، شانه ها و کمر درد هستید. و همچنین می دانید که  اکثر شرکت ها (نه همه) از سیستم ۹-۵ ساعت سنتی استفاده می کنند. چه کاری می  توانید برا سلامتی بدن خود انجام دهید؟ راه حل ساده است؛ به مدت ۴۵ دقیقه کار کنید و سپس برای ۵ تا ۱۰ دقیقه به استراحت بپردازید. این نه تنها باعث می شود سلامتی خود را حفظ کنید، بلکه باعث افزایش بهره  وری شما نیز می شود. در حال حاضر، این فرمول بسیار ساده، توسط تعداد کمی از  توسعه دهندگان مورد استفاده قرار می گیرد؟ چرا؟بهانه اول: کار فرمای من فکر می کند وقت تلف می کنم!اگر کار فرمای شما به این شکل فکر می کنید، بهتر است به فکر یافتن شغلی  جدید باشید! آیا مهم تر نیست که برای سلامت خود ارزش قائل باشید؟بهتر است با کار فرمای خود صحبت کنید. او را متقاعد کنید این زمان برای  استراحت باعث افزایش کارایی یک توسعه دهنده خواهد شد. می توانید با همکاران  خود صحبت کنید و در این مورد با آنها به بحث بپردازید. می توانید برای  مدتی این رویه را در شرکت خود به صورت آزمایشی انجام دهید و خواهید دید که  کارایی و بهره وری شما و همکارانتان بسیار بالا خواهد رفت.البته توجه داشته باشید که استراحت به معنای چک کردن تلفن همراه تان یا  بررسی توئیت های جدید نیست! شما باید از فناوری دور شوید. می توانید حرکات  ورزشی و کششی انجام دهید. کمی قدم بزنید و چای بنوشید!بهانه دوم: اگر استراحت کنم تمرکزم را از دست می دهم!به هیچ وجه اینطور نیست! هنگامی که میز کار را ترک می کنید و برای پیاده  روی کوتاه یا کار دیگری بروید، ذهن ناخودآگاه شما هنوز بر روی مشکل کار می  کند؛ حتی اگر به آن فکر نکنید! بعد از استراحت که به کار بر می گردید،  فکرتان تازه شده و می توانید مثل یک نینجا کار کنید!البته می توانید قبل از استراحت، یادداشت برداری کنید تا بعدا بهتر بتوانید به کارتان ادامه بدهید.بهانه سوم: من فراموش می کنم که استراحت داشته باشم!تا حدودی این مورد را قبول دارم! هنگامی که در حال توسعه هستید، گذر  زمان احساس نمی شود. بهترین راه حل استفاده از یک تایمر است. باید عادت  کنید بلافاصله بعد از به صدا در آمد تایمر، کار را رها کرده و استراحت  کنید. به خودتان نگویید: ” نه، من این کار را سریعا انجام میدهم و بعد  میروم”. گاهی این مدت کوتاه خیلی طولانی می شود!!!پس خود را عادت دهید سر ساعت به استراحت بپردازید.منبع : سافت آموز https://softamoz.com/?p=376 </description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Fri, 03 Apr 2020 22:12:42 +0430</pubDate>
            </item>
                    <item>
                <title>برای تبدیل شدن به یک توسعه دهنده نرم افزار نیازی به مدرک دانشگاهی ندارید!</title>
                <link>https://virgool.io/@serajoddin.aliabadi/%D8%A8%D8%B1%D8%A7%DB%8C-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%B4%D8%AF%D9%86-%D8%A8%D9%87-%DB%8C%DA%A9-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-%D8%AF%D9%87%D9%86%D8%AF%D9%87-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-%D9%86%DB%8C%D8%A7%D8%B2%DB%8C-%D8%A8%D9%87-%D9%85%D8%AF%D8%B1%DA%A9-%D8%AF%D8%A7%D9%86%D8%B4%DA%AF%D8%A7%D9%87%DB%8C-%D9%86%D8%AF%D8%A7%D8%B1%DB%8C%D8%AF-a2cuboeg6bwc</link>
                <description>بگذارید این را به شما بگویم: اگر هدف شما تبدیل شدن به یک “توسعه دهنده  نرم افزار” است، زمان و پول خود را برای دریافت مدرک دانشگاهی در علم کامپیوتر هدر ندهید. من هشت سال زندگی ام را در دو دانشگاه مختلف گذراندم.  یکی در ایران، که در آن من لیسانس خود را در رشته ی مهندسی نرم افزار  دریافت کردم و دیگری در استرالیا، جایی که من کارشناسی ارشد خود را در  سیستم های شبکه (Network Systems : شبکه های کامپیوتری) دریافت کردم.بنابراین، به عنوان کسی که تحصیلکرده است، به اعتقاد من اگر می خواهید به عنوان یک مهندس نرم افزار کار کنید، دانشگاه ها وقت و پول را هدر می  دهند. اگر دوره های برنامه نویسی آنلاین را در اختیار دارید، می توانید هدف  خود را با کسری از زمان و پول به دست آورید. در ادامه دلایل من را برای  این نظر مطالعه کنید.برای چیزی که نیازی ندارید هزینه می کنیددر چارت مهندسی نرم افزار ، مجبور شدم تعداد زیادی از موضوعات را  که با مهندسی نرم افزار ارتباط ندارند بگذرانم: ریاضیات، فیزیک، مطالعات  دینی، ادبیات فارسی، دانش جمعیت و خانواده (بله، خنده داره، درسته؟)، تاریخ  اسلام و غیره. هیچ علاقه ای به این موضوعات نداشتم، اما مجبور شدم آنها  را بردارم و برای آنها هزینه و زمان بگذارم.از بین ۴۰ تا ۵۰ موضوع، فقط تعداد کمی از آنها مفید بودند و تفکر من را تغییر دادند، از جمله:اصول برنامه نویسی با پاسکالبرنامه نویسی پیشرفته با Cزبان اسمبلیساختار داده ها و الگوریتم هااگر دوره های آنلاین را انتخاب کنید، “شما” می توانید موضوعاتی را که  “شما” علاقه مند آن هستید را انتخاب کنید. مجبور نیستید برای آنچه که لازم  ندارید هزینه و زمان بگذارید.وقت خود را با موضوعات قدیمی تلف می کنیدچارت های دانشگاهی اغلب ۲۰ سال عقب تر از آن چیزی است که امروزه در صنعت نرم افزار اتفاق می افتد. مگر اینکه چیزهایی را خودتان یاد بگیرید. زمان که فارغ التحصیل شدید به سختی می توانید شغلی پیدا کنید؛ زیرا مهارت هایی  که کارفرمایان به آن نیاز دارند را نیاموخته اید. دوره های آنلاین مبتنی بر  آنچه که در حال حاضر در صنعت اتفاق می افتد، هستند؛ نه سی سال پیش! آنها نظریه های فسیلی را که لازم ندارید، ندارند.آموزش با کیفیت دریافت نمی کنیدنمی خواهم به همه تعمیم بدهم، اما اغلب، افرادی که در دانشگاه تدریس  می کنند، یا دانشجوی دکترا هستند؛ دانش جویانی که این کار را به صورت گاه به گاه برای کسب درآمد انجام می دهند؛ یا افرادی تمام وقت آکادمیک هستند که  همیشه در محوطه دانشگاه بوده اند. هیچکدام از این دو گروه تجربه ی کاری کافی در صنعت را ندارند.میخواهید چیزی خنده دار بشنوید؟ آیا چیزی از ASCII شنیده اید؟ اگر نه، آن مخفف کلماتAmerican Standard Code for Information Interchange است. اساسا یک جدول است که کاراکتر ها را به اعدادی مپ می کند که می توانند در حافظه کامپیوتر ذخیره شوند. یک مدرس داشتم که آن را به عنوان ASCI TWO  تلفظ می کرد! او فکر کرد II عدد 2 است!البته، من نمیگویم هر مدرس دانشگاهی مثل این است. من مطمئن هستم که استادان ماهر بسیاری وجود دارند، اما آنها اغلب در اقلیت هستند.با دوره های آنلاین، “شما” مدرسانی را که دوست دارید را انتخاب کنید.  یک مدرس را دوست ندارید؟ فکر می کنید او بیش از حد صحبت می کند؟ یا  خسته کننده است؟ یا تجربه صنعتی ندارد؟ خوب. یک دوره آنلاین دیگر را انتخاب  کنید!چه زمانی آموزش دانشگاهی خوب و لازم است؟آموزش دانشگاهی همیشه بد نیست. این بستگی به آنچه که شما می خواهید انجام دهید دارد. اگر هدف شما تبدیل شدن به یک محقق یا استاد دانشگاه باشد، در واقع شما نیاز به یک مدرک دانشگاهی دارید و هرچه مدرک بالاتری داشته باشید بهتر است. اما پژوهشگر علوم رایانه، هیچ ارتباطی با توسعه دهنده نرم افزار ندارد.محققان بر روی یک موضوع کوچک تمرکز می کنند و چندین ماه یا چند سال را  صرف جمع آوری، تجزیه و تحلیل داده ها برای نتیجه گیری می کنند. آنها توسعه دهندگان نرم افزار نیستند. آنها نمی دانند چگونه برنامه های وب یا تلفن همراه بسازند و یا چگونه ساخت آن را به درستی انجام دهند. حتی اگر آنها این کار را انجام دهند، آنها آن را به عنوان یک سرگرمی آموخته اند. این بخشی از کار روزمره آنها نیست.سوال این است: چیکاره میخوای بشی؟ یک توسعه دهنده نرم افزار یا یک محقق؟درمورد بدست آوردن یک شغل به عنوان توسعه دهنده نرم افزار چطور؟خوشبختانه، بسیاری از شرکت ها متوجه شده اند که داشتن مدرک دانشگاهی یک نفر را برنامه نویس نمی کند؛ همانطور که داشتن گواهینامه ی رانندگی، یک راننده را تبدیل به راننده ی خوب و ایمن نمی کند. این فقط یک قطعه کاغذ است و معنی چیزی نیست!خودآموختگی راهی بسیار شایع تر از آنچه هست که شما فکر می کنید. من بسیاری از توسعه دهندگان را دیده ام که دارای مدرک دانشگاهی هستند، اما در  زمینه هایی غیر از علوم رایانه یا مهندسی نرم افزار. مدرک و نمرات شما مهم نیستند! هیچکدام از شرکتهایی که با آنها کار کرده ام، در مورد مدرک دانشگاهی من نپرسیدند. فکر نمی کنم من خوش شانس باشم! من فکر می کنم این  تفکر در بسیاری از شرکت ها به وجود آمده است. و اگر جایی که میخواهید کار کنید، آنها به یک قطعه کاغذ بیشتر از مغز شما ارزش می دهند، شما کار کردن  در آنجا را دوست نخواهید داشت؛ به من اعتماد کنید!منبع : سافت آموز https://softamoz.com/?p=336 </description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Sun, 29 Mar 2020 12:31:37 +0430</pubDate>
            </item>
                    <item>
                <title>مقادیر Truthy و Falsy در پایتون</title>
                <link>https://virgool.io/@serajoddin.aliabadi/%D9%85%D9%82%D8%A7%D8%AF%DB%8C%D8%B1-truthy-%D9%88-falsy-%D8%AF%D8%B1-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-lfgxnrw1r0n3</link>
                <description>در زبان های برنامه نویسی مانند سی شارپ و جاوا، تنها دو مقدار True و  False به عنوان Boolean شناخته می شوند. ولی در زبان پایتون سایر مقادیر  نیز می توانند Boolean باشند.در زبان پایتون برخی از مقادیر Truthy و Falsy هستند. هر زمان که لازم  باشد کامپایلر تلاش می کند که این مقادیر را به نوع متناظر True یا False  تبدیل کند.مقادیر Falsy عبارت اند از:“” : رشته خالی۰ : عدد صفر[] : لیست خالیNone : معادل null در زبان های خانواده Cسایر مقادیر Truthy به حساب می آیند.برای مثال به قطعه کد زیر توجه کنید:print(f&#x27;&quot;&quot; is : {bool(&quot;&quot;)}&#x27;)  # Falseprint(f&quot;0 is : {bool(0)}&quot;)  # Falseprint(f&quot;0.0 is : {bool(0.0)}&quot;)  # Falseprint(f&quot;Empty List : {[]} is : {bool([])}&quot;)  # Falseprint(f&quot;None is : {bool(None)}&quot;)  # Falseprint(f&#x27;&quot;    &quot; is : {bool(&quot;    &quot;)}&#x27;)  # Trueprint(f&#x27;&quot;False&quot; is : {bool(&quot;False&quot;)}&#x27;)  # Trueprint(f&quot;1 is : {bool(1)}&quot;)  # Trueprint(f&quot;-1 is: {bool(-1)}&quot;)  # Trueprint(f&quot;Not Empty List : {[1, 2, 3, 4, 5]} is : {bool([1, 2, 3, 4, 5])}&quot;)  #Trueتوجه داشته باشید که حتی رشته “False” هم True هست. زیرا تنها رشته خالی “” به عنوان Falsy شناخته می شود.کاربرد Truthy و Falsy در پایتون چیست؟این دو مفهوم می توانند در هرجایی که مقادیر Boolean نیاز داریم استفاده شوند. برای مثال در عبارت های شرطی.برای نمونه می خواهیم اگر کاربر رشته ای وارد کرد و این رشته خالی نبود، عبارت Not Empty چاپ شود.user_input = input(&quot;Enter an Input: &quot;)print(&quot;Not Empty&quot; if user_input else &quot;Empty&quot;)البته این مثال جنبه آموزشی دارد و این مقادیر در پروژه های واقعی کاربرد های بسیار بیشتری دارند.حال که با این دو مفهوم آشنا شدیم، در ادامه به صورت عمیق تر با آن آشنا خواهیم شد.Truthiness Value در پایتونهر کدام از built-in type ها در پایتون مقادیر Truthiness دارند. در جدول زیر می توانید این مقادیر را به صورت خلاصه مشاهده کنید:منبع : سافت آموز https://softamoz.com/?p=449 برای مطالعه بیشتر : http://bit.ly/2lKGzQu</description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Sat, 28 Mar 2020 14:37:34 +0430</pubDate>
            </item>
                    <item>
                <title>آیا باید پروژه ASP.NET MVC خود را به چندین پروژه تقسیم کنیم؟</title>
                <link>https://virgool.io/@serajoddin.aliabadi/%D8%A2%DB%8C%D8%A7-%D8%A8%D8%A7%DB%8C%D8%AF-%D9%BE%D8%B1%D9%88%DA%98%D9%87-aspnet-mvc-%D8%AE%D9%88%D8%AF-%D8%B1%D8%A7-%D8%A8%D9%87-%DA%86%D9%86%D8%AF%DB%8C%D9%86-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%AA%D9%82%D8%B3%DB%8C%D9%85-%DA%A9%D9%86%DB%8C%D9%85-pcjk50e2dsm3</link>
                <description>“آیا باید پروژه ASP.NET MVC خود را به چندین پروژه تقسیم کنیم؟” جواب کوتاه: نه!نمیدانم که چگونه این روند شروع شد اما دیده ام که برخی از توسعه دهندگان، یک پروژه ASP.NET MVC را به چندین پروژه تقسیم می کنند: یک پروژه  وب حاوی لایه ارائه (presentation logic)، به علاوه دو class library، برای  لایه های دیتا و منطق.مفهوم Tiers چیست؟غالباً به اشتباه تصور می شود که ساختار مطرح شده در بالا، یک برنامه را بصورت Multi-Tier یا ۳-Tier می سازد. برنامه Multi-Tier چیست؟ برنامه ای است که قسمت های آن به صورت فیزیکی در رایانه (ماشین) های مختلف در یک شبکه توزیع می شود. برنامه های وب معمولاً ذاتاً Multi-Tier هستند.در برنامه های وب اغلب Tier های زیر را داریم:Client / Presenter Tier: این قطعه در مرورگر کاربر اجرا می شود.Middle / Application / Logic Tier: این بخشی است که با ASP.NET MVC  (یا سایر چارچوب های مشابه سمت سرور) در یک وب سرور اجرا شده است.Data Tier: پایگاه داده ، file system یا هر نوع ذخیره دیگری است.وقتی در مورد ASP.NET MVC صحبت می کنیم ، ما فقط در مورد application یا  middle tier صحبت می کنیم. جدا کردن یک پروژه ASP.NET MVC به سه پروژه،  منجر به اضافه شدن Tier های جدید در معماری شما نمی شود.به عبارتی، برای مثال لایه داده را در رایانه دیگری مستقر نمی کنید!  بیشتر اوقات (نه همیشه) این ۳ پروژه (وب ، BLL و DAL) در یک فرآیند در یک  ماشین، کامپایل و اجرا می شوند؛ در وب سرور شما!وقتی شخصی به سایت شما مراجعه می کند، این DLL ها درون یک فرآیند (یک AppDomain) که توسط IIS اداره می شود، بارگذاری می شود.Layers یا Tiers ؟ مسئله این است!واژه های Layer و Tier گاها به جای هم استفاده می شوند ولی اساسا متفاوت هستند. Layer برای جدا سازی منطقی کد های برنامه استفاده می شود ولی Tier برای جدا سازی فیزیکی. یعنی توزیع قطعات برنامه در ماشین های مختلف.Layer چیزی مفهومی در ذهن برنامه نویس است! یک class library یا پوشه، یک لایه نیستند. می توانید کلاس ها را در یک پوشه یا یک class library که متعلق به لایه های مختلف است قرار دهید و به یکدیگر وابسته باشند. که این  نشان دهنده ی بد بودن معماری است. قرار دادن این کلاس ها در یک پوشه یا class library مانند BLL و DAL فوراً به نرم افزاری با معماری تمیز و تفکیک  خوب منجر نمی شود.با وجود این ، استدلال من این است که این پوشه ها (BLL و DAL) می توانند  و باید در پروژه اصلی وب سکونت داشته باشند و انتقال آنها به یک class  library جداگانه ، هیچ ارزشی ندارد.آیا باید پروژه ASP.NET MVC خود را به چندین پروژه تقسیم کنیم؟۲ دلیل برای تقسیم یک پروژه به پروژه های کوچکتر وجود دارد: قابلیت استفاده مجدد و استقرار مستقل آن پروژه ها.قابلیت استفاده مجددیکی از دلایل جدا کردن یک پروژه در چند class library، قابلیت استفاده  مجدد است. هنوز قسمت BLL یا DAL یک برنامه وب را که در یک برنامه دیگر مورد  استفاده مجدد قرار گرفته است ، مشاهده نکردم. این همان چیزی است که  کتابهای دهه ۹۰ میلادی برای ما تعریف می کردند! امروزه اکثر برنامه ها به  صورت خاص نوشته می شوند و لایه های آن کمتر در سایر برنامه ها استفاده می  شود. اغلب اوقات class library ها برای استفاده داخلی خود نرم افزار  ساخته می شوند نه برای استفاده مجدد.قابلیت استقراریکی دیگر از دلایل جدا کردن یک پروژه در class libraries در مورد استقرار پذیری است. اگر میخواهید قطعات پروژه به صورت مستقل ورژن بندی و مستقر شود، خوب  است پروژه را به این شکل لایه بندی کنید. که اغلب در framework ها کاربرد  دارد نه برنامه های سازمانی.Entity Framework مثال خوبی است. این فریم ورک از assembly های مختلفی  تشکیل شده است که هر یک حوزه کاربرد خاصی دارد. core assembly شامل قسمت  های اصلی این فریم ورک است. اسمبلی دیگری برای ارتباط با SQL server یا  سایر پایگاه ها داریم.با استفاده از این معماری ماژولار ، ما می توانیم فقط قسمتهایی را که  لازم داریم را بارگیری کنیم. تصور کنید که Entity Framework فقط شامل یک  اسمبلی بود! یک اسمبلی غول پیکر با کد های بسیار زیاد که نیازی به اکثر آن  ها نداریم.همچنین ، هر بار که تیم پشتیبانی یک ویژگی جدید را اضافه کند یا یک  اشکال را برطرف کند ، باید کل اسمبلی کامپایل و deploy شود. این باعث می  شود این اسمبلی بسیار شکننده شود. اگر برای ارتباط با SQL server از Entity  Framework استفاده می کنیم، چرا با آپگرید به نسخه جدید برای رفع مشکل  اتصال به SQLite ، برنامه خود را دچار مشکل کنیم؟؟؟ در صورتی که اصلا از  SQLite استفاده نمی کنیم! به همین دلیل به شکلی ماژولار طراحی شده است.در بیشتر برنامه های وب موجود، همه این مجموعه ها (وب ، BLL و DAL) را  با هم version و deploy می کنیم. بنابراین ، جدا کردن یک پروژه در ۳ پروژه  هیچ ارزشی نمی افزاید.مواردی که باید پروژه ASP.NET MVC را به چند پروژه تقسیم کنیمبنابراین ، چه موقع واقعاً نیاز دارید که یک پروژه را به صورت فیزیکی از چندین پروژه جدا کنید؟ در اینجا چند سناریو وجود دارد:‎ Multiple presentation layers: چند لایه ارائه داشته باشیم :فرض کنید که شما یک برنامه پردازش سفارش ایجاد کرده اید. این برنامه یک  برنامه دسک تاپ است که توسط کارکنان سازمان شما استفاده می شود. و تصمیم  دارید یک رابط وب برای این برنامه ایجاد کنید تا کارکنان بتوانند از طریق  اینترنت به آن دسترسی پیدا کنند. و البته می خواهید از DAL و BLL موجود  استفاده مجدد کنید.همانطور که قبلاً توضیح دادم ، یکی از دلایل تقسیم کردن پروژه به چند  پروژه، قابلیت استفاده مجدد است. پس در این سناریو پروژه به چند پروژه زیر  تقسیم می شود:OrderProcessing.Core (شامل BLL و DAL است)OrderProcessing.WebOrderProcessing.Desktopتوجه داشته باشید که حتی در اینجا من دو پروژه ندارم (BLL و DAL). من یک  پروژه با نام OrderProcessing.Core دارم که هم منطق کد و هم دسترسی به  داده برای برنامه پردازش سفارش ما را در بر می گیرد. چرا این پروژه را به  دو پروژه جداگانه (BLL و DAL) جدا نکردم؟ زیرا هدف اصلی این DAL ، فراهم آوردن یک persistence برای موارد موجود در BLL هست. بسیار بعید است که به تنهایی در پروژه دیگری مورد استفاده قرار گیرد.همچنین ، با توجه به اصل وارونگی وابستگی (dependency inversion) در  طراحی شی گرا ، وابستگی باید از DAL به BLL باشد ، و نه بر عکس. بنابراین ،  این بدان معناست که ، در هر جایی که اسمبلی DAL را reference دهید ، باید  به اسمبلی BLL نیز reference بدهید. به عبارت دیگر ، آنها کاملاً منسجم و جدانشدنی هستند.Multiple applications under a single portal :  چند برنامه در یک پرتالمورد دیگر این است که در آن شما چندین برنامه کوچک دارید که در یک پرتال  مجزا میزبانی می شوند. بنابراین ، از دید کاربر نهایی این برنامه ها جدا  نیستند؛ همه آنها دامنه های مختلف یک برنامه هستند. اما از نظر توسعه ، هر  برنامه از سایرین مستقل است. هر برنامه می تواند persistence store خود را  داشته باشد. یکی می تواند از اکسل استفاده کند ، دیگری می تواند از SQL  Server استفاده کند ، و دیگری می تواند از Oracle استفاده کند.در این سناریو ، به احتمال زیاد این برنامه ها توسط توسعه دهندگان یا  تیم های مختلف توسعه یافته اند. آنها غالباً بطور مستقل توسعه یافته اند ،  از این رو باید به چندین پروژه (class library) تقسیم شوند.برای این سناریو می توانیم پروژه های زیر را در solution داشته باشیم:OrderProcessing.Core (یک class library)Shipping.CoreCustomerSupport.CoreMainPortal (یک پروژه ASP.NET MVC)باز هم، شما جدایی BLL و DAL را در اینجا مشاهده نمی کنید. هر class  library (به عنوان مثال OrderProcessing.Core) شامل منطق و دسترسی به داده  ها (BLL و DAL) برای دامنه خود است.سخن پایانیدر اینجا چند مورد وجود دارد که امیدوارم از این مقاله آموخته باشید:Layer ها Tier نیستندTiers در مورد توزیع فیزیکی نرم افزار در رایانه های مختلف است.لایه ها مفهومی هستند. داشتن پوشه یا اسمبلی به نام BLL یا DAL به این  معنی نیست که شما به درستی برنامه خود را لایه بندی کرده اید ، همچنین به  این معنی نیست که شما از قابلیت نگهداری بهتر برخوردار هستید.قابلیت نگهداری بهتر یعنی: متد های و کلاس های کوچکتر که هریک وظیفه مشخصی دارند و وابستگی بسیار کمی بین آنها وجود دارد.اسمبلی ها واحد های versioning و deployment هستند.اگر می خواهید از قسمت های خاصی از آن در پروژه های دیگر استفاده مجدد  کنید ، یا اگر می خواهید به طور مستقل هر پروژه را نسخه و مستقر کنید ، یک  پروژه را به چندین پروژه تقسیم کنید.و در نهایت: مثل همیشه ، آن را ساده نگه دارید!منبع : سافت آموز https://softamoz.com/?p=458 </description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Sat, 28 Mar 2020 00:03:40 +0430</pubDate>
            </item>
                    <item>
                <title>آنچه کتاب ها در مورد ارث بری در شی گرایی اشتباه می گویند</title>
                <link>https://virgool.io/@serajoddin.aliabadi/%D8%A2%D9%86%DA%86%D9%87-%DA%A9%D8%AA%D8%A7%D8%A8-%D9%87%D8%A7-%D8%AF%D8%B1-%D9%85%D9%88%D8%B1%D8%AF-%D8%A7%D8%B1%D8%AB-%D8%A8%D8%B1%DB%8C-%D8%AF%D8%B1-%D8%B4%DB%8C-%DA%AF%D8%B1%D8%A7%DB%8C%DB%8C-%D8%A7%D8%B4%D8%AA%D8%A8%D8%A7%D9%87-%D9%85%DB%8C-%DA%AF%D9%88%DB%8C%D9%86%D8%AF-ivdivtzauhug</link>
                <description>در این مقاله با یک داستان واقعی، به بررسی “اشتباهات و نکات کلیدی در مبحث ارث بری در شی گرایی” می پردازیم.چند روز قبل ایمیلی از یکی از دانشجویانم دریافت کردم. در آن، از من در  مورد پروژه ای که روی آن کار می کرد راهنمایی خواست. او در حال کار روی  برنامه ای است که توسط مدیران تیم های ورزشی استفاده می شود. آنها می  توانند بازیکنان، تیم ها و مربیان را ایجاد، ویرایش و حذف کنند. بنابراین،  طرحی که دانشجوی من در ذهن داشته است، چیزی شبیه به این نمودار UML است:پس، SoccerPlayer از نوع Player است و از آن ارث می برد. به همین شکل Player هم از نوع Person است (همانند Coach). این همان چیزی است که بسیاری از کتاب ها در مورد برنامه نویسی شی گرا به شما می آموزند:وقتی می توانید ارتباط بین دو مفهوم را با استفاده از Is-a (مثال : SoccerPlayer is a Player یعنی SoccerPlayer از نوع Player) بیان کنید، این یک inheritance است!بسیاری از این کتاب ها ادعا می کنند که با ایجاد این انتزاعات (abstractions)، برای مثال در سناریو فوق، کلاس Person،  می توانید از آنها در پروژه های دیگر استفاده مجدد کنید. با این حال، در  ۱۵ سال از تجربه حرفه ای خودم، به سختی دیده ام که این گونه انتزاعات در  پروژه ها به شیوه ای مفید مورد استفاده قرار گیرد.در مقطعی، شروع به ایجاد یک کتابخانه از این انتزاعات کردم که بتوانم در  پروژه ها به اشتراک بگذارم. پس از مدتی، این کتابخانه، پر از کلاس ها و  انتزاعات نامرتبط شد. به علاوه ورژن بندی و استفاده از آن در پروژه های  متفاوت، به کابوس شبانه تبدیل شد. اگر قبلاً این کار را کرده اید، ممکن است  کمی مرا درک کنید.نمونه ای افراطی از وراثتهنگامی که به عنوان مشاور برای یک پروژه شروع نشده مشغول شدم، و در جلسه  مقدماتی، معمار داده (data architect) های این پروژه، مرا با تعداد زیادی  از نمودار کلاس UML (بیش از ۵۰ صفحه) متعجب کرد. هر کلاس از کلاس دیگری ارث  می برد و سرانجام، همه آنها به کلاس منتهی شدند که “Thing” نامیده شده  بود! بدون شوخی!جالب اینجاست که حتی یک نمودار رفتاری (behavioral diagram) وجود نداشت  که بیان کننده رفتار سیستم باشد. بنابراین، این سلسله مراتب عظیم وراثت فقط  برای وراثت “صفات” بود و نه رفتار (مثلا توابع)، در صورتی که دقیقا کاربرد  وراثت، برای به ارث بردن رفتار است.حدس بزنید سرانجام پروژه چه شد؟ پس از یک سال و پرداخت بیش از نیم  میلیون دلار برای آن پروژه، شرکت تصمیم به لغو پروژه گرفت. هیچ چیز تولید  نشده بود، حتی یک نسخه بتا! مدیران شرکت، مشاوران و تیم های مختلفی را  درگیر می کردند و هیچکس نمی توانست برنامه ای با چنین مدل پیچیده و وسیعی  را پیاده سازی کند.آیا این داستان برای شما آشنا به نظر می رسد؟کل جهان هستی را مدل سازی نکنید!هنگام ساختن نرم افزار، شما باید domain model را بر اساس نیازهای  برنامه و نه واقعیت برای آن طراحی کنید. در حقیقت domain model را باید بر  اساس کارکرد ها و use case هایی که برنامه باید شامل شود، ایجاد کرد. در  دنیای واقعی، یک Soccer Player یک Player و یک Player یک Person است. اما  فقط به این دلیل که می توانید چنین رابطه ای را به زبان انگلیسی یا فارسی  بیان کنید، نباید بین کلاسهای خود چنین ارتباطی برقرار کنید. زیرا در نهایت  مدل خود را با پیچیدگی های غیر ضروری و بی هدف آلوده می کنید.وراثت باعث افزایش جفت شدن (coupling) در طراحی شما می شودحدس بزنید مشکل ما با وراثت چیست؟ خوب ، قبل از توضیح ، بگذارید موردی  را روشن کنم. من مخالف ارث بری نیستم! وراثت، مانند هر چیز دیگری،  کاربردهای خود را دارد. وقتی از آن در کاربرد مناسب استفاده می کنید، کار  شما را راه می اندازد. اما اگر از آن به درستی استفاده نکنید، منجر به  افزایش پیچیدگی در برنامه های شما می شود.inheritance باعث افزایش وابستگی بین کلاس های شما می شود(tight coupling). اگر کلاس Child از کلاس Parent ارث بری کند، به Parent وابسته می شود. اگر در کلاس Parent تغییری ایجاد کنید، احتمالا باید کلاس Child را نیز تغییر دهید. یا حداقل ، باید مجدداً آن را کامپایل کرده و deploy کنید.پس اگر یک سلسله مراتب کوچک با تعداد محدودی کلاس دارید، مشکلی نخواهید  داشت. اما با افزایش سلسله مراتب، امکان تغییر در برنامه شما افزایش میابد.  هرچه در سطح بالاتری از سلسله مراتب تغییرات ایجاد کنید، کلاس های بیشتری  را نیز باید تغییر دهید یا حداقل مجدد کامپایل کنید.چه موقع از inheritance استفاده کنیمبنابراین ، چه زمانی باید از وراثت استفاده کنید؟ هنگام استفاده مجدد از  رفتار (برای مثال متد ها) و override کردن آنها که منجر به چند ریختی  (polymorphism) می شود. اما حتی پس از آن، شما می توانید از ترکیب  (composition) برای دستیابی به همان موارد با وابستگی کمتر در طراحی خود استفاده کنید. برای مطالعه بیشتر به این لینک مراجعه کنید.هنوز متوجه نشدید؟ در ادامه مقاله با من همراه باشید تا به شکلی ساده تر مفاهیم فوق را شرح دهم.چه موقع از inheritance استفاده نکنیماجازه دهید با کمک کد، توصیه های فوق العاده ساده و عمل گرایانه ای را  برای شما ارائه دهم. اگر یک یا چند مورد از علائم زیر را در کد خود دارید،  احتمالاً به inheritance نیاز ندارید. می توانید سلسله مراتب خود را کاهش  دهید، کاپلینگ (coupling : یعنی وابستگی) را کاهش داده و طراحی خود را ساده  کنید.وقتی کلاسهای توخالی داریدآیا در طراحی خود کلاس هایی از این دست را دارید؟ https://virgool.io/p/ivdivtzauhug/publicclassPerson%7BpublicintId%7Bget;set;%7DpublicstringName%7Bget;set;%7D%7DpublicclassPlayer:Person%7B%7D اگر با زبان سی شارپ آشنایی ندارید، در اینجا ما کلاس Person با دو فیلد  Id و Name را داریم. کلاس Player از Person ارث بری می کند. کلاس Player  در اینجا چیزی است که من آن را کلاس تو خالی می نامم. که بی هدف است.ما به سادگی می توانستیم از Person استفاده کنیم و پیچیدگی را در طراحی خود کاهش دهیم. به مثال زیر توجه کنید: https://virgool.io/p/ivdivtzauhug/publicclassPerson%7B%7DpublicclassPlayer:Person%7BpublicintId%7Bget;set;%7DpublicstringName%7Bget;set;%7D%7D در این مثال، Person یک کلاس توخالی و بی فایده است.اینجا قسمت مهمی است که می خواهم به آن توجه کنید: در دامنه (domain)  این برنامه، Id و Name هر بازیکن مهم است. در حقیقت، اینکه یک Player در  دنیای واقعی یک Person است، در این برنامه اهمیتی ندارد. منظور من این است  که مدل سازی برنامه های شما نباید بر اساس دنیای واقعی باشد. در عوض ، شما  باید بر اساس نیاز برنامه و چگونگی رفتار آن، مدل سازی کنید.وقتی سلسله مراتب وراثت تماما راجع به صفات استبه این مثال نگاه کنید: https://virgool.io/p/ivdivtzauhug/publicclassPerson%7BpublicintId%7Bget;set;%7DpublicstringName%7Bget;set;%7D%7DpublicclassPlayer:Person%7BpublicbyteNumber%7Bget;set;%7D%7DpublicclassCoach:Person%7BpublicbyteYearsOfExperience%7Bget;set;%7D استدلال پشت این طرح این است که ما در کلاس های Player و Coach دوباره  از خصوصیات Id و Name استفاده می کنیم. قبلاً کلاسهای زیادی مثل این داشتم!  مثال “نمونه ای افراطی از وراثت” که قبلاً به آن اشاره کردم دقیقاً مانند  این مورد است.استفاده مجدد از صفات یک روش و تفکر ضعیف در مورد ارث بری در شی گرایی  است است. تلاش برای کپی کردن این صفات در کلاس های مشتق شده چقدر خسته  کننده خواهد بود؟ copy/paste آنها فقط یک ثانیه طول می کشد!شما ممکن است بگویید: “تکرار کد بد است”. بله ، اما نه همیشه! بد است  اگر قصد تغییر آن را دارید و باید در مکانهای مختلف تغییر ایجاد کنید. اما  چند بار این صفات را تغییر خواهید داد؟؟؟ اغلب نه یا هرگز! منطق (logic)  چطور؟ منطق ، الگوریتم و رفتار (برای مثال متد ها) اغلب تغییر می کند.پس بر مبنای دلایل فوق، شما باید، فقط برای استفاده مجدد از رفتار ها از  ارث بری در شی گرایی استفاده کنید نه برای استفاده مجدد از صفات.با اینحال، در اکثر موارد استفاده از composition نسبت به inheritance بهتر خواهد بود.اجازه دهید جمع بندی کنیمبنابراین ، به یاد داشته باشید ، ارث بری باعث افزایش اتصال و وابستگی  بین کلاس های شما می شود. آن را برای موقعیت هایی استفاده کنید که می  خواهید چند ریختی را پیاده سازی کنید، نه فقط برای استفاده مجدد از کد، به  ویژه صفات. اگر در طراحی خود یک یا چند مورد از علائم زیر را دارید، شما  احتمالاً به وراثت نیاز ندارید:کلاس های توخالی که هیچ عضوی ندارند.کلاس های پایه که فقط صفات را شامل می شوند. آنها هیچ متدی را برای  استفاده مجدد در derived کلاس ها و از همه مهمتر، override کردن ندارند.می توانید سلسله مراتب خود را کاهش دهید، کاپلینگ (coupling : یعنی وابستگی) را کاهش داده و طراحی خود را ساده کنید.پس، همواره آن را ساده نگه دارید!منبع : سافت آموز https://softamoz.com/?p=513 </description>
                <category>Serajoddin Aliabadi</category>
                <author>Serajoddin Aliabadi</author>
                <pubDate>Thu, 26 Mar 2020 14:21:46 +0430</pubDate>
            </item>
            </channel>
</rss>