<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مهدی ابوالفضلی</title>
        <link>https://virgool.io/feed/@abolfazlimahdi</link>
        <description>من یک برنامه نویس اندروید و علاقه مند به جاوا و کاتلین هستم. بیشتر فعالیتم در حوزه اپلیکیشنهای مالی(بورس و کریپتو) و زبان انگلیسی هست. زیاد می خونم و متاسفانه کمتر عمل می کنم.</description>
        <language>fa</language>
        <pubDate>2026-06-29 03:48:28</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/4192/avatar/lTYh6Q.png?height=120&amp;width=120</url>
            <title>مهدی ابوالفضلی</title>
            <link>https://virgool.io/@abolfazlimahdi</link>
        </image>

                    <item>
                <title>داوطلبان آزمون MSRT این پست را از دست ندهند</title>
                <link>https://virgool.io/@abolfazlimahdi/msrt-gowvklt4csz7</link>
                <description>مدتی هست که دو نفر از دوستان خوبم مسعود معتمدی نیا (رتبه ۵ کنکور کارشناسی ارشد رشته آموزش زبان انگلیسی سال ۱۳۹۲ و فارغ التحصیل از دانشگاه تهران و همچنین فارغ التحصیل رشته ادبیات انگلیسی از دانشگاه فردوسی مشهد) و بهنام علیمردانی (فارغ التحصیل کارشناسی ارشد رشته آموزش زبان انگلیسی از دانشگاه فردوسی مشهد و کارشناسی ادبیات انگلیسی از دانشگاه فردوسی مشهد) آموزش رایگان گرامر MSRT  و همچنین آزمونهای آزمایشی آنلاین  MSRT را شروع کرده اند. مطالب آموزش گرامر را در قالب فایل pdf یا فایل صوتی در کانال تلگرامی که راه اندازی کرده اند قرار می دهند. برای آزمون ها نیز می توانید به این آدرس مراجعه کنید. این آزمونهای آزمایشی با شبیه سازی محیط آزمون برای شما و همچنین داشتن پاسخ تشریحی می تواند سبب شناخت نقاط ضعف و قوت شما شود. به همین  منظور یک ویدئوی آموزشی برای این آزمونها در آپارات قرار داده اند تا بتوانید با این آزمونها بیشتر آشنا شوید. لینک ویدئو http://msrtexam.com/ کانال تلگرام آموزش گرامر را توصیه می کنم از دست ندهید. در همین مدت کم استقبال بسیار خوبی از کانال شده و بیشتر از ۵۰۰ نفر عضو کانال شده اند. سبک آموزش هم به این صورت است که موضوعات گرامری مختلف را در قالب مثال آموزش می دهند. به نظرم اگر داوطلب آزمون MSRT هستید و یا در آینده نزدیک قصد شرکت در این آزمون را دارید حتما عضو این کانال شوید و خودتان محتوا را ارزیابی کنید.از ۱۸ اسفند که آخرین آزمون MSRT برگزار شده تستهای گرامر این آزمون را مورد بررسی قرار داده و در قالب فایل صوتی نکات مربوط به تست ها را آموزش می دهند. برای نمونه آخرین پستی که در کانال قرار داده اند را در اینجا می آورم تا اگر به نظرتان خوب بود عضو کانال شوید و از کانال بهره مند شوید.#سوال_6   #آزمون_اسفند_96  #نکات_قابل_بحثنکته: ساختار جمله ساده/شبه جمله وصفی کوتاه شده   6. Quasars ………….. emitting extremely intense radio waves and visible radiation.A. star-like objects areB. star-like, they are objectsC. are star-like objectsD. are they star-like objects- The girl who sits next to Peter in the class is very rich.- The girl sitting next to Peter in the class is very rich.Quasars are star-like objects which/that emit extremely intense radio waves and visible radiation.Quasars are star-like objects emitting extremely intense radio waves and visible radiation. ✔️توضیحات کامل در فایل صوتی در این لینکامیدوارم این پست به درد شما داوطلبین آزمون MSRT بخورد. همچنین برای آزمون های MSRT قرار است کارگاههای یک روزه و دو روزه با بررسی آزمونهای اخیر برگزار کنند. آدرس و لینک کانال تلگرام: @azmoonzaban_com</description>
                <category>مهدی ابوالفضلی</category>
                <author>مهدی ابوالفضلی</author>
                <pubDate>Sat, 17 Mar 2018 00:05:25 +0330</pubDate>
            </item>
                    <item>
                <title>پیاده سازی پرداخت درون برنامه ای کافه بازار</title>
                <link>https://virgool.io/Software/bazaar-xrh0ppzzvuxh</link>
                <description>در پست قبلی گفتم برای پرداخت درون برنامه ای کافه بازار دو سه هفته ای درگیر بودم. الان که نگاه می کنم خیلی آسانتر از آن چیزی بوده که وقت من را گرفته بود. این پست را برای کسانی می نویسم که می خواهند برای اولین بار پرداخت درون برنامه ای کافه بازار را پیاده سازی کنند. ابتدا سعی می کنم کلیت کار را شرح دهم و بعد وارد مباحث فنی پیاده سازی شوم. کلیت پرداخت درون برنامه ای به این شکل هست که ابتدا شما باید کوئری بزنید که آیا این اپلیکیشن قبلا خریداری شده است یا نه؟ اگر خریداری نشده است کاربر را به صفحه پرداخت درون برنامه ای کافه بازار هدایت کنید و در صورت موفق بودن پرداخت نسخه پرمیوم اپلیکیشن خودتان را در اختیار کاربر قرار دهید (در برنامه نویسی به این نتیجه رسیدم دید کلی به موضوعات داشته باشم تا بتوانم آنها را درک کنم، شما هم سعی کنید کلی نگاه کنید و جزیی پیاده سازی کنید).حالا توصیه می کنم این قسمت از مستندات کافه بازار را حتما بخوانید (فقط به صورت روزنامه وار بخوانید تا کلیت ماجرا را درک کنید،درگیر مطالب فنی و جزیی نشوید). این قسمت مطلب خاصی ندارد و فقط یک سری توضیحات درباره پرداخت درون برنامه ای و اشتراک اپلیکیشن ارائه شده است. توصیه اکید دارم اگر بار اول هست می خواهید پرداخت درون برنامه ای را پیاده سازی کنید سراغ اشتراک ماهیانه و محصولات مصرفی نروید چون واقعا گیج خواهید شد. یک اپلیکیشن نمونه بسازید که فقط پرداخت درون برنامه ای ساده را بتوانید پیاده سازی کنید. اپلیکیشن خود را در پنل کافه بازار آپلود کنید و محصولی برای پرداخت درون برنامه ای ایجاد کنید. تمام توضیحات برای این قسمت را در ادامه می آورم (توضیحات از کافه بازار کپی شده است و اگر نیاز باشد توضیح بیشتری می دهم) اما اگر تمایل دارید می توانید از این لینک که مستندات کافه بازار است استفاده کنید. بعید می دانم برای این قسمت مشکل خاصی داشته باشید اما اگر مشکلی پیش آمد در کامنت ها بپرسید تا کمکتان کنم.ایجاد لیست محصولاتپنل بازار  به شما این امکان را می‌دهد که به ازای هر یک از برنامه‌های‌تان یک لیست  جدا از محصولات داشته باشید. شما تنها وقتی می‌توانید یک محصول را در  برنامه‌تان به فروش برسانید که آن را در پنل ثبت کرده باشید. توجه داشته  باشید که هر برنامه لیست محصولات مربوط به خود را دارد و امکان فروش  محصولات دیگر برنامه‌ها در برنامهٔ شما وجود ندارد.لیست محصولات مربوط به برنامهٔ خود را می‌توانید با ورود به پنل توسعه‌دهندگی‌تان و سپس انتخاب برنامه‌ٔ مورد نظر، در سربرگ «پرداخت درون‌برنامه‌ای» مشاهده فرمائید. در  لیست محصولات برای هر محصول اطلاعاتی از قبیل شناسه کالا، عنوان،  قیمت، توضیحات محصول، نوع (فروشی یا اشتراکی) و وضعیت (فعال یا  غیرفعال) وجود دارد. این لیست فقط شامل اطلاعات کلی دربارهٔ محصول شماست و  به هیچ وجه محتوای محصول شما را شامل نمی‌شود. یعنی اینکه شما خودتان باید  محصولی (محتوا) را که در برنامه‌تان می‌فروشید، به دست کاربر برسانید.اضافه کردن محصولاتبرای اضافه کردن محصولات از طریق سربرگ «پرداخت درون‌برنامه‌ای» باید مراحل زیر را طی کنید:۱. به حساب کاربری خود وارد شوید.۲. وارد پنل توسعه‌دهندگی خود شوید.۳. برنامه مدنظرتان را انتخاب کنید و وارد سربرگ «پرداخت درون‌برنامه‌ای» شوید.۴. روی دکمه &lt;&lt;محصول جدید&gt;&gt; کلیک کنید و اطلاعات مورد نیاز برای هر محصول را وارد کنید.برای هر محصول موارد زیر را باید وارد کنید:شناسهٔ کالاشناسهٔ کالای هر محصول در هر برنامه باید  منحصر به فرد باشد. این شناسه باید با حروف کوچک لاتین یا یک عدد شروع شود و  همگی کاراکترهای استفاده شده در آن باید فقط از حروف کوچک لاتین، اعداد  لاتین، _ و نقطه باشند. شما به هیچ عنوان مجاز به ویرایش شناسهٔ یک محصول بعد از ایجاد آن نیستید و امکان استفادهٔ مجدد از این شناسه‌ها نیز وجود ندارد. عنوان یک توضیح بسیار کوچک از محصول است که به  ازای هر برنامهٔ شما باید منحصر به فرد باشد. ارائهٔ عنوان برای هر محصول  ضروری است و پیشنهاد می‌شود برای نمایش بهتر طول عنوان بیش از ۲۵ کاراکتر  نباشد. توضیحات یک توضیح مفصل برای محصولی که می‌خواهید  بفروشید باید ارائه کنید. این توضیح در صفحهٔ پرداخت بازار به کاربر نشان  داده می‌شود. البته امکان استفاده از این توضیح در برنامهٔ خودتان نیز وجود  دارد. قیمت برای هر محصول باید یک قیمت به ریال وارد  کنید. حداقل و حداکثر این قیمت در قرارداد شما با بازار مشخص شده است. قیمت  محصول نمی‌تواند از مقداری که در قرارداد شما مشخص شده است، کمتر یا بیشتر  باشد. حالا می رسیم به قسمت نسبتا سخت ماجرا. ابتدا حداقل یک بار این صفحه از مستندات را به طور کامل بخوانید تا درک کلی از آنچه انجام خواهید داد داشته باشید. برای شروع پیاده سازی توصیه می کنم از این قسمت مستندات شروع کنید.این مرحله تا برقراری ارتباط با بازار کاملا واضح و شفاف توضیح داده شده است. تا ابتدای این مرحله را به آسانی می توانید انجام دهید. چند فایل باید در پروژه خود کپی کنید. مجوز پرداخت در فایل مانیفست بدهید و پروژه را بیلد کنید. در قسمت نهایی کار شما باید کدنویسی را شروع کنید و با بازار ارتباط برقرار کنید تا بتوانید محصول خود را بفروشید. من راهی که خودم انجام داده ام را در اینجا می نویسم. یک اکتیویتی جدید با نام BuyActivity ایجاد می کنیم. سپس این کدها را در آن کپی می کنیم. کدها را از لینک دانلود کنید و در اکتیویتی مربوطه کپی کنید(خدا را شکر که متوجه شدم ویرگول هم از کداسنیپت پشتیبانی می کند اما باز هم لینک دانلود کدها را برای شما در اینجا قرار داده ام لینک دانلود).‍‍public class BuyActivity extends AppCompatActivity {

    //SweetAlertDialogCustom mProgressDialog;
    private boolean mBazaarInstalled;
    // SKUs for our products: the premium upgrade (non-consumable)
    static final String SKU_PREMIUM = &amp;quotpremium&amp;quot
    // Does the user have the premium upgrade?
    boolean mIsPremium = false;
    // (arbitrary) request code for the purchase flow
    static final int RC_REQUEST = 1;
    private static final String TAG = BuyActivity.class.getSimpleName() + &amp;quotTAG&amp;quot
    // The helper object
    IabHelper mHelper;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buy);
        ButterKnife.bind(this);
        
        //neshan dadan progress bar
        //mProgressDialog = SweetAlertHelper.loadingSweetAlert(this, &amp;quotدر حال اتصال به بازار&amp;quot);
        mHelper = new IabHelper(this, base64EncodedPublicKey);
        Log.d(TAG, &amp;quotStarting setup.&amp;quot);
        Log.d(TAG, &amp;quotStarting setup.&amp;quot);
        
          try {
              mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
              public void onIabSetupFinished(IabResult result) {
                  //mProgressDialog.dismiss();
                  mBazaarInstalled = true;
                  Log.d(TAG, &amp;quotSetup finished.&amp;quot);
                  
                      if (!result.isSuccess()) {
                          // moshkeli dar ertebat ba bazaar pish amad
                          Log.e(&amp;quotTAG&amp;quot, &amp;quotfailed to access bazaar &amp;quot + result);
                          mProgressDialog.dismiss();
                          //neshan dad dialog khata be karbar(dar inja sweet alert)
                          new SweetAlertDialogCustom(BuyActivity.this,
                          SweetAlertDialogCustom.CUSTOM_IMAGE_TYPE)
                              .setTitleText(&amp;quotکاربر گرامی&amp;quot)
                              .setContentText(&amp;quotخطایی در ارتباط با بازار رخ داد! از وصل بودن اینترنت خود مطمئن شوید.&amp;quot)
                              .setConfirmClickListener(new
                              SweetAlertDialogCustom.OnSweetClickListener() {
                                  @Override
                                  public void (SweetAlertDialogCustom sDialog) {
                                      finish();
                                  }
                              }).show();
                              Log.e(TAG, &amp;quotProblem setting up In-app Billing: &amp;quot + result);
                        }
                        // Hooray, IAB is fully set up!
                        mHelper.queryInventoryAsync(mGotInventoryListener);
                        }
                   });
               } catch (Exception ex) {
                   //bazaar ruye gooshie karbar nasb nist, bayad handle shavad
                   mBazaarInstalled = false;
                   mProgressDialog.dismiss();
                   //neshan dad dialog khata be karbar(dar inja sweet alert)
                   new SweetAlertDialogCustom(BuyActivity.this,
                       SweetAlertDialogCustom.CUSTOM_IMAGE_TYPE)
                       .setTitleText(&amp;quotکاربر گرامی&amp;quot)
                       .setContentText(&amp;quotبرای خرید این اپلیکیشن باید برنامه کافه بازار را نصب کنید!&amp;quot)
                       .setConfirmClickListener(new SweetAlertDialogCustom.OnSweetClickListener(
                           {
                           @Override
                           public void (SweetAlertDialogCustom sDialog) {
                               finish();
                           }
                      }).show();
                  }
            }
            
            IabHelper.QueryInventoryFinishedListener mGotInventoryListener = 
                new IabHelper.QueryInventoryFinishedListener() {
                    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
                        Log.d(TAG, &amp;quotQuery inventory finished.&amp;quot);
                        mProgressDialog.dismiss();
                        if (result.isFailure()) {
                            // moshkeli dar ertebat ba bazaar pish amad
                            Log.e(&amp;quotTAG&amp;quot, &amp;quotfailed to access bazaar &amp;quot + result);
                            //neshan dad dialog khata be karbar(dar inja sweet alert)
                            new SweetAlertDialogCustom(BuyActivity.this,
                                SweetAlertDialogCustom.CUSTOM_IMAGE_TYPE)
                                .setTitleText(&amp;quotکاربر گرامی&amp;quot)
                                .setContentText(&amp;quotخطایی در ارتباط با بازار رخ داد! از وصل بودن اینترنت خود                                 مطمئن شوید.&amp;quot)
                                .setConfirmClickListener(new
                                    SweetAlertDialogCustom.OnSweetClickListener() {
                                        @Override
                                        public void (SweetAlertDialogCustom sDialog) {
                                            finish();
                                        }
                                  }).show();
                              return;
                              } else {
                              Log.d(TAG, &amp;quotQuery inventory was successful.&amp;quot);
                              // does the user have the premium upgrade?
                              //aya karbar noskhe premium ra ghablan kharide ast? 
                              mIsPremium = inventory.hasPurchase(SKU_PREMIUM);
                              // update UI accordingly
                              //agar kharide ast bayad mohtava barayash baz shavad
                              if (mIsPremium) {
                              //barname be activity digari ke hedayat mishavad va mohtava baraye
                              //karbar baz mishavad
                              Intent intent = new Intent(BuyActivity.this, MainActivity.class);
                              startActivity(intent);
                              } else {
                                  try {
                                      mHelper.launchPurchaseFlow(BuyActivity.this, SKU_PREMIUM,
                                      RC_REQUEST, mPurchaseFinishedListener, &amp;quotpayload-string&amp;quot);
                                      } catch (Exception ex) {
                                 }
                            }
                            Log.d(TAG, &amp;quotUser is &amp;quot + (mIsPremium ? &amp;quotPREMIUM&amp;quot : &amp;quotNOT PREMIUM&amp;quot));
                       }
                       Log.d(TAG, &amp;quotInitial inventory query finished; enabling main UI.&amp;quot);
                  }
             };
             IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener = 
                     new IabHelper.OnIabPurchaseFinishedListener() {
                         public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
                             if (result.isFailure()) {
                                 // moshkeli dar ertebat ba bazaar pish amad
                                 Log.e(&amp;quotTAG&amp;quot, &amp;quotfailed to access bazaar &amp;quot + result);
                                 //neshan dad dialogE khata be karbar(dar inja sweet alert)
                                 new SweetAlertDialogCustom(BuyActivity.this,
                                         SweetAlertDialogCustom.CUSTOM_IMAGE_TYPE)
                                             .setTitleText(&amp;quotکاربر گرامی&amp;quot)
                                             .setContentText(&amp;quotخطایی در ارتباط با بازار رخ داد! از وصل بودن اینترنت خود مطمئن شوید.&amp;quot)
                                             .setConfirmClickListener(
                                                 new SweetAlertDialogCustom.OnSweetClickListener() {
                                                     @Override
                                                     public void (SweetAlertDialogCustom sDialog) {
                                                         finish();
                                                     }
                                                }).show();
                                           return;
                                       } else if (purchase.getSku().equals(SKU_PREMIUM)) {
                                           // give user access to premium content and update the UI
                                           // be karbar dastrasi be mohtavaye premium(puli) ra bedahid.
                                           //karbar kharid ra kamel anjam dad
                                           Intent intent = new Intent(BuyActivity.this, MainActivity.class);
                                           startActivity(intent);
                                           }
                                      }
                                  };
                                  
                                  @Override
                                  protected void onActivityResult(int requestCode, 
                                          int resultCode, Intent data) {
                                   super.onActivityResult(requestCode, resultCode, data);
                                   // Pass on the activity result to the helper for handling
                                   if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
                                       super.onActivityResult(requestCode, resultCode, data);
                                   } else {
                                       Log.d(TAG, &amp;quotonActivityResult handled by IABUtil.&amp;quot);
                                  }
                             }
                             
                             @Override
                             public void onDestroy() {
                                 super.onDestroy();
                                 if (mHelper != null &amp;&amp; mBazaarInstalled) mHelper.dispose();
                                     mHelper = null;
                                 }
                            }توجه کنید که هشدارها را با SweetAlert پیاده سازی کرده بودم و در این فایل کامنت کرده ام. بیشتر کامنت ها را به فینگلیش نوشته ام تا به راحتی متوجه کارکرد کدها شوید. حتما یک بار همه کدها و کامنتها را بخوانید. در صورتی که این پست مفید بود لایک را فراموش نکنید و هر سوال یا ابهامی برایتان وجود داشت در کامنتها عنوان کنید تا بیشتر توضیح دهم. از ویرگول عزیز خواهشمندم قسمت کداسنیپت را یک ویرایش اساسی برایش در نظر بگیرند. حدود یک ساعت فقط درگیر گذاشتن همین کداسنیپت در پست بودم. متاسفانه بعد از کپی کردن کدها هر خط کد را یک کد اسنیپت در نظر می گیرد.اگر دوست داشتید به کانال تلگرام من سر بزنید تا با هم بیشتر تعامل داشته باشیم. همه مطالبم را در کانال تلگرام منتشر خواهم کرد.</description>
                <category>مهدی ابوالفضلی</category>
                <author>مهدی ابوالفضلی</author>
                <pubDate>Sun, 11 Mar 2018 17:46:46 +0330</pubDate>
            </item>
                    <item>
                <title>تجربه های یک برنامه نویس اندروید و توصیه به افرادی که می خواهند به این عرصه وارد شوند.</title>
                <link>https://virgool.io/@abolfazlimahdi/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D9%87%D8%A7%DB%8C-%DB%8C%DA%A9-%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%AF%D8%B1%D9%88%DB%8C%D8%AF-%D9%88-%D8%AA%D9%88%D8%B5%DB%8C%D9%87-%D8%A8%D9%87-%D8%A7%D9%81%D8%B1%D8%A7%D8%AF%DB%8C-%DA%A9%D9%87-%D9%85%DB%8C-%D8%AE%D9%88%D8%A7%D9%87%D9%86%D8%AF-%D8%A8%D9%87-%D8%A7%DB%8C%D9%86-%D8%B9%D8%B1%D8%B5%D9%87-%D9%88%D8%A7%D8%B1%D8%AF-%D8%B4%D9%88%D9%86%D8%AF-sp2ytgwur0pb</link>
                <description>برنامه نویسی اندروید و چالش های آنمقدمهنکته: این پست در سال ۱۳۹۶ نوشته شده و در آبان ۱۳۹۹ ویرایش شده است.در این پست می خواهم تجربه های خودم در این ۵ سال و چند ماهی که درگیر برنامه نویسی اندروید هستم را با شما در میان بگذارم. ابتدا چند تا توصیه برای کسانی که به امید یک شبه ره صد ساله را رفتن به سمت این شغل آمده اند دارم. برنامه نویسی یکی از سخت ترین مشاغل دنیاست و روز به روز هم به جای آسانتر شدن به سمت سخت تر شدن حرکت می کند. در قدیم مشکلاتی وجود داشت اما به نظر من برنامه نویسی به طور کلی خیلی آسانتر (حداقل برای کسی که می خواست شروع کند) از الان بود. بزرگترین مشکل چند سال قبل که مشکل کوچکی هم نبوده عدم دسترسی به منابع یادگیری و حتی نبودن جایی برای پیدا کردن جواب مشکلاتی که پیش می آمد بود. یا حتی یک مشکل بزرگ دیگر که قبلا وجود داشت نبودن IDE یا محیطهای توسعه نرم افزار بود. در حال حاضر این دو مشکل کاملا حل شده اند اما دانشی که یک برنامه نویس باید داشته باشد به شدت افزایش پیدا کرده است. خب بگذارید برای اینکه شفافتر صحبت کنم با مثال از برنامه نویسی اندروید این موضوع را جلو ببرم. در گذشته برای توسعه اپلیکیشن اندروید شما کافی بود به زبان جاوا تسلط(نسبی) پیدا می کردید، سپس با پلتفرم اندروید که بسیار ساده تر از الان بود آشنایی پیدا می کردید. در گذشته از Maven به عنوان Build Tools در اندروید استفاده می شد اما اکنون از گریدل استفاده می شود که باز هم یادگیری آن سخت تر از Maven است اما به شدت در بلند مدت به نفع برنامه نویس است. در گذشته اپلیکیشن ها به ندرت انیمیشن داشتند. انواع طراحی در توسعه نرم افزار وجود نداشتند(مانند متریال دیزاین، طراحی فلت و ...). امکانات اندروید بسیار کمتر از امکانات کنونی آن بود. حالا به تمام این موارد نوشتن تست برای نرم افزار و همچنین رعایت کردن دیزاین پترن را هم اضافه کنید که حالا بسیار فراگیرتر شده اند. در گذشته RxJava نبود و کار MultiThreading در جاوا و اندروید سخت بود اما اپلیکیشنهای کمی بودند که به این مقوله نیاز داشتند. اما اکنون یادگیری این کتابخانه ها بسیار پراهمیت شده در حالیکه پروسه یادگیری آنها به شدت زمانبر است. ببینید در عمل نمی گویم برنامه نویسی سخت تر شده است، برای کسی که می خواهد شروع کند با دریایی از مطالب روبرو خواهد شد که نمی داند از کجا شروع کند و به کجا برسد. آنقدر باید دانش خود را عمیق و زیاد کنید که در ابتدا شاید بیخیال برنامه نویسی شوید. در یک کلام اگر واقعا به برنامه نویسی علاقه ندارید از همین جا این صفحه را بسته و دیگر این مطلب را ادامه ندهید و به دنبال شغلی دیگر بروید. با برنامه نویسی نمی شود یک شبه ره صد ساله رفت. شرط موفقیت در برنامه نویسی این است که سالهای سال برای یادگیری و کسب تجربه، خودتان را وقف کارتان کرده باشید. حالا با فرض بر اینکه به یادگیری برنامه نویسی علاقه دارید ادامه می دهیم.شروع برنامه نویسیشروع برنامه نویسی:اگر تا به حال برنامه نویسی نکرده اید و می خواهید از اندروید شروع کنید توصیه می کنم این کار را نکنید(این نظر بسیار شخصی است و شاید اشتباه باشد اما من به آن عمیقا اعتقاد دارم که در بلند مدت به نفع شما خواهد بود). من این کار را انجام دادم و می دانم کار بسیار سخت و طاقت فرسایی خواهد بود. بخصوص که یادگیری جاوا و کاتلین در بین سایر زبانهای برنامه نویسی معروف (به غیر از سی و سی پلاس پلاس) سخت تر و زمانبرتر است. توصیه ای که به دوستانی که به اندروید علاقه دارند می کنم این است که با برنامه نویسی وب شروع کنند. HTML, CSS, JavaScript را کمی یاد بگیرید که بتوانید یک سایت استاتیک ساده را خودتان از صفر شروع کرده و به اتمام برسانید. این کار به شما دید خوبی از برنامه نویسی خواهد داد. این پروسه حداکثر دو تا سه ماه زمان خواهد برد اما مطمئن باشید این کار در بلند مدت به نفع شما خواهد بود. دلیل این حرفم چیست؟ ببینید برنامه نویسی اندروید، برنامه نویسی سمت کلاینت است. برنامه نویسی سمت کلاینت در وب یعنی همان HTML, CSS, JavaScript. در اندروید بجای HTML ما XML داریم. بجای جاوااسکریپت از جاوا استفاده می کنیم. CSS در اندروید هم یا در XML پیاده سازی می شود یا در جاوا(کاتلین). اما یادگیری سمت کلاینت در وب برای کسی که برنامه نویسی نکرده به شدت ساده تر از اندروید است. پس برای یادگیری کلیت کار از وب شروع کنید.یادگیری جاواجاوا (کاتلین):اگر به توصیه بالا عمل کردید این مرحله نباید زمان زیادی از شما بگیرد. با یادگیری انواع متغیرها، حلقه ها، جملات شرطی و مفاهیم شی گرایی در جاوا (کاتلین) آشنا شوید و بلافاصله شروع به یادگیری اندروید کنید. من در این مرحله هم اشتباهات بزرگی کردم. شاید به مدت ۶ ماه فقط در حال یادگیری جاوا بودم در حالیکه به خیلی از مباحثی که در آن زمان یاد گرفتم هنوز هم نیاز پیدا نکرده ام. سعی کنید یادگیری خود را بر اساس نیاز قرار دهید. یعنی اگر در پروژه ای نیاز به مبحث خاصی بود آن مبحث را خوب یاد بگیرید. در غیر این صورت شاید هیچ وقت به آن مبحث نیاز نداشته باشید. بزرگترین مشکل بعد از یادگیری جاوا (کاتلین)، نصب اندروید استودیو خواهد بود. خیلی از کسانی که در گروههای اندروید می بینم برای نصب اندروید استودیو زمان زیادی می گذارند و در نهایت بی خیالش می شوند. سعی کنید مرحله به مرحله پیش بروید. من برای نصب اندروید استودیو یک ماه درگیر بودم. در نهایت هم به دلیل اینکه امولاتو روی سی پی یوهای AMD کار نمی کند مجبور شدم یک ماه برای نصب لینوکس و اندروید استودیو زمان بگذارم. البته همه اینها برای کسی که تازه وارد دنیای برنامه نویسی شده بود انقدر طول کشید. آن زمان خوب جستجو نمی کردم. حتما از ابتدا مهارت خوب جستجو کردن را در خود ارتقا دهید تا از این نوع مشکلات نداشته باشید.چگونه اندروید یاد بگیرم؟یادگیری عمیق ولی پروژه محور:این هم یکی از اشتباهات و در عین حال شاید نقاط قوت من در یادگیری برنامه نویسی اندروید بود. در یادگیری برنامه نویسی به شدت عمیق می شدم و تا به مبحثی کاملا مسلط نمی شدم از آن در پروژه هایم استفاده نمی کردم. این باعث می شد یادگیری ام بسیار عمیق اما کند باشد. به شما توصیه می کنم عمیق اما پروژه محور یاد بگیرید. در ابتدای یادگیری اندروید یک پروژه بسیار ساده برای خود در نظر بگیرید و همزمان که از روی کتاب، فیلم، سایت و... یاد می گیرید همان مباحث را در پروژه خود پیاده کنید. حتی زمانی که کتابخانه های مهم جاوا مانند Dagger یا RxJava را یاد می گیرید در پروژه های خود پیاده سازی کنید. این کار به شدت بهینه تر از کاری است که من انجام می دادم.کاتلین یا جاوا؟کاتلین یا جاوا(سوال همیشگی برای تازه کارها):اگر شما هم نمی دانید از کدام شروع کنید حق دارید. اکثر کسانی که می خواهند شروع کنند گیج می شوند چرا که با انبوهی از پیشنهادها مواجه می شوند. در همین پست که سه سال قبل نوشته بودم تاکید می کردم که برای برنامه نویسی اندروید حتما جاوا یاد بگیرید. اما اکنون بعد از گذشت سه سال شرایط خیلی عوض شده است. اکنون یادگیری کاتلین برای اندروید به شدت منطقی تر است. گوگل زبان رسمی برای توسعه اندروید را کاتلین معرفی کرده است. اکثر شرکتهای بزرگ بدلیل همین موضوع و همچنین سرعت توسعه بالاتر با کاتلین در حال مهاجرت به سمت این زبان محبوب هستند. همچنین کد زدن با کاتلین مزیتهایی دارد که واقعا نمی شود از آنها چشم پوشی کرد. مهمترین مزیتهای کاتلین نسبت به جاوا وجود Coroutines و Higher-Order Functions است. به طور کل اگر کاتلین را حرفه ای یاد بگیرید به شدت سرعت شما در توسعه اندروید زیاد خواهد بود. البته یادگیری جاوا شاید در طول مسیر به درد شما بخورد ولی برای شروع نیاز نخواهد بود (اگر وقت اضافه دارید یا به جاوا علاقه دارید بحث دیگری است). در کل باید بگویم اکنون یادگیری کاتلین برای شما مزیت محسوب می شود و اگر هدف شما اندروید است بهتر است از ابتدا با کاتلین شروع کنید.</description>
                <category>مهدی ابوالفضلی</category>
                <author>مهدی ابوالفضلی</author>
                <pubDate>Mon, 12 Feb 2018 18:26:55 +0330</pubDate>
            </item>
            </channel>
</rss>