<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های حمید</title>
        <link>https://virgool.io/feed/@hamedsj5</link>
        <description>یــــــعــــــنـــــی برنامه نویس =)))</description>
        <language>fa</language>
        <pubDate>2026-06-10 12:57:01</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/16014/avatar/C5ZPbA.jpeg?height=120&amp;width=120</url>
            <title>حمید</title>
            <link>https://virgool.io/@hamedsj5</link>
        </image>

                    <item>
                <title>در باب تفاوت Dependency inejction و Service Locator</title>
                <link>https://virgool.io/coderlife/%D8%AF%D8%B1-%D8%A8%D8%A7%D8%A8-%D8%AA%D9%81%D8%A7%D9%88%D8%AA-dependency-inejction-%D9%88-service-locator-cinsdxmbyvo7</link>
                <description>تزریق وابستگی به روایت تصویر =)))سه روش دسترسی به وابستگی‌ها تزریق وابستگی (Dependency injection)استفاده از Service Locatorدسترسی مستقیم یا ساختن وابستگی (بعضی بحث‌ها پیرامون این مورد وجود داره که نمیخوان قبول کنن این مورد &quot;وابستگی&quot; محسوب میشه یا نه؛ ولی توی این بلاگ پست نمی‌گنجه.)تزریق وابستگیتزریق وابستگی به کلاس‌های کد ما این امکان رو میده که به وابستگی‌هاش دسترسی داشته باشه بدون اینکه درگیر روند ساخت اونا باشه. در هنگام اجرای برنامه، کلاس دیگه‌ای وظیفه‌ی مهیا کردن این وابستگی‌ها رو برای کلاس ما داره.چهار رویکرد مختلف در پیاده‌سازی تزریق وابستگی(البته که برخی از موارد زیر bad practice محسوب میشن)۱.تزریق از طریق متد سازنده (Constructor Injection) : با این رویکرد وابستگی‌ها از طریق پارامتر‌های ورودی متد سازنده به کلاس تزریق میشن.۲. تزریق از طریق متد Setter ـ(Setter Injection) : با این رویکرد برای هر وابستگی یک متد واسطه می‌سازیم و از طریق کلاس سازنده‌ی وابستگی‌ها اون وابستگی رو به کلاس تزریق می‌کنیم.۳. تزریق در متغیر عمومی (Public variable Injection) : با این رویکرد باید متغیر وابستگی مورد نظر رو با دسترسی عمومی در کلاس نگه‌داریم سپس کلاس سازنده‌ی وابستگی‌ها، وابستگی مربوطه رو در متغیر آن تزریق می‌کنه.۴. تزریق توسط Reflection ـ(Reflection Injection) : با این رویکرد با استفاده از Reflection به متغیر‌های داخلی کلاسی که می‌خواهیم به اون وابستگی رو تزریق کنیم دسترسی پیدا می‌کنیم و وابستگی‌ها رو در متغیر‌های مربوط به خودشون تزریق می‌کنیم.خصوصت مشترک تمامی رویکردهای بالا این بود که یک کلاس خارجی مسئول تزریق وابستگی‌هاست.الگوی Service Locatorوابستگی‌های مورد نیاز کلاس، توسط خود کلاس، از یک منبع خارجی تامین میشن. اگر درکش براتون سخته می‌تونید مثال OrderProcessor رو در زیر ببینید:public class OrderProcessor : IOrderProcessor {
    public void Process(Order order){
        var validator = Locator.Resolve&lt;IOrderValidator&gt;();
        if (validator.Validate(order)) {
            var shipper = Locator.Resolve&lt;IOrderShipper&gt;();
            shipper.Ship(order);
        }
    }
} همونطور که مشاهده می‌کنید توی مثال بالا ما داریم Validator و Shipper رو از منبعی به نام Locator درخواست می‌کنیم.می‌تونید کد کلاس Locator رو ببینید:public static class Locator {
    private static Dictionary&lt;Type, Func&lt;object&gt;&gt;
    services = new Dictionary&lt;Type, Func&lt;object&gt;&gt;();
    
    public static void Register&lt;T&gt;(Func&lt;T&gt; resolver) {
        Locator.services[typeof(T)] = () =&gt; resolver();
    }
 
    public static T Resolve&lt;T&gt;() {
        return (T)Locator.services[typeof(T)]();
    }
 
    public static void Reset() {
        Locator.services.Clear();
    }
}کلاس Locator همونطور که می‌بینید یک Dictaionary (یا Map) داره که نوع وابستگی رو به عنوان کلید استفاده می‌کنه و تابع مربوط به ساخت اون وابستگی رو به عنوان مقدار نگه‌داری می‌کنه. ما هرموقع یک وابستگی رو بخوایم، توی منبعش می‌گرده و تابع مربوط به ساخت او وابستگی پیدا می‌کنه و اجراش می‌کنه و به ما یک نمونه جدید از اون وابستگی میده.چرا Service Locator یک ضد الگو (Anti Pattern) شناخته میشهیکی از ایراداتی که به Service Locator وارده، استفاده‌ی واسطه‌محور اونه. فرض کنید ما کسی نیستیم که کلاس Locator رو می‌نویسیم و از شخص ثالث (3rd party) این Locator رو تحویل گرفتیم؛ اونوقت اصلا اطلاعی نداریم که منبعی که به ما دادن می‌تونه وابستگی ما رو برطرف بکنه یا نه.یکی دیگه از ایراداتی که به Service Locator وارده اینه که استفاده از این الگو باعث می‌شه وابستگی‌های کلاس هدف از دید استفاده کننده پنهون باشه، ما هیچوقت متوجه نمی‌شیم که کلاسی که قراره یک نمونه از اون بسازیم از چه وابستگی‌هایی داره استفاده می‌کنه چون که خودش داره از Locator اونا رو تامین می‌کنه.یکی دیگه از ایراداتی که به Service Locator وارده اینه که اصل ISP از اصول SOLID در برنامه‌نویسی شی‌گرا رو نقض می‌کنه که می‌تونید توضیحات مربوط بهش رو توی این لینک مطالعه کنید.کتابخونه‌ی Dagger 2 کجای داستانه؟این نمونه‌ای از استفاده از کتابخونه‌ی Dagger2 برای تزریق وابستگیه:class TargetClass {
    @Inject lateinit var dependency1 : Dependency1
    @Inject lateinit var dependency2 : Dependency2
    @Inject lateinit var dependency3 : Dependency3
    
    init {
        DaggerMyComponent.create().inject(this)
    }
}
همونطور که مشاهده می‌کنید فقط کافیه متغیر مربوط به وابستگی‌های مورد نیاز کلاس رو با نشونه‌ی Inject توضیح نویسی کنیم سپس با فراخوانی inject روی کلاس‌های سازنده‌ی مربوطه، وابستگی مورد نیاز رو به کلاسمون تزریق کنیم.این روش، نوعی پیاده‌سازی از رویکرد سوم پیاده‌سازی تزریق وابستگی محسوب میشه ولی از اونجایی که &quot;خود کلاس&quot; داره درخواست تزریق رو میده، معتقدن که استفاده از کتابخونه‌ی Dagger2 اگر ۹۵٪ تزریق وابستگی محسوب بشه ۵٪ هم داره استفاده از الگوی Service Locator محسوب میشه.مشکل اندروید چیه با تزریق وابستگی؟مشکل اندروید اینه که ساخت بعضی کلاس‌های مورد نیاز اندروید (مثل اکتیویتی و فرگمنت) توسط خود سیستم‌عامل انجام میشه و ما اصلا نمیتونیم به صورت دستی اونا رو استفاده کنیم واسه همین به مشکل می‌خوریماکتیویتی‌ها توی اندروید معمولا با استفاده از دستور زیر توسط خود سیستم‌عامل ساخته میشن: startActivity(Intent(this, thatActivity::class.java))درسته که فرگمنت‌ها در ابتدا توسط خودمون ساخته می‌شن اما اگر Configuration Change اتفاق بیفته خود سیستم‌عامل فرگمنت‌ها رو دوباره می‌سازه که در این صورت بازم وابستگی‌ها رو از دست می‌دیم.راه حلش چیه؟راه حلش اینه که ما از توی خود کلاس درخواست تزریق وابستگی‌ها رو بدیم. اینطور می‌تونیم مشکل ساخت کلاس‌ها توسط سیستم‌عامل رو حل کنیم. چیزی مشابه عکس زیر :این مشکل دقیقا با کتابخونه‌ی dagger2 حل شده و می‌تونید از این کتابخونه برای پیاده‌سازی و استفاده از Dependency Injection توی برنامه‌هاتون استفاده کنید.منابعService Locator is an Anti-PatternDependency Injection or Service Locator | by ElyeDependency Injection and Service Locator | by Lam Pham Why Android Apps uses Dagger 2?| by Elye Service Locator violates SOLIDممنونم از این که این پست رو مطالعه کردیدامیدوارم که براتون مفید باشه و اگر بود لطفا با دوستاتون هم به اشتراک بگذارید.نوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Tue, 22 Jun 2021 00:49:58 +0430</pubDate>
            </item>
                    <item>
                <title>ساخت یک Middleware سفارشی برای پروژه جنگو</title>
                <link>https://virgool.io/ui-web-community/%D8%B3%D8%A7%D8%AE%D8%AA-%DB%8C%DA%A9-middleware-%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%AC%D9%86%DA%AF%D9%88-urwjr9aego2m</link>
                <description>سلام دوسِتان =))در ابتدا بگم که من این پست رو به زبون انگلیسی هم در سایت مدیوم منتشر کردم اگر دلتون خواست میتونید  از این لینک بخونید (اگر هم خواستید میتونید جفتشو بخونید، به خدا که من راضیم :دی )ـ‌Middleware ها چی هستند؟خیلی ساده بگم و گیجتون نکنم، Middleware ها در اصل کلاس‌هایی هستن که شامل یک یا چند تابع به خصوص هستند که قبل و بعد از تابع‌های View فراخوانی می‌شوند. برای اطلاعات بیش‌تر راجع به چرایی و چگونگی طی شدن این فرایند می‌تونید این بلاگ پست رو مطالعه کنیدـ‌Middleware ها چه نیازمندی‌هایی دارند؟تنها نیازمندی‌ای که یک کلاس داره تا به یک Middleware تبدیل بشه اینه که یکی از توابع زیر رو داشته باشه :process_requestprocess_viewprocess_responseprocess_exceptionالبته که به دلیل تغییراتی که توی نسخه‌های جدید جنگو اعمال شده راه ساده برای نوشتن یک Middleware اینه که علاوه بر داشتن حداقل یکی از توابع فوق، کلاس ما از MiddlewareMixin نیز ارث‌بری کرده باشه. این کلاس توابع سازنده و ترتیب توابع فوق رو برامون آماده کرده و دیگه نیازی به اضافه کردن تابعی اضافه به کلاس خودمون نداریم.ـ‌Middleware ها چگونه کار می‌کنند؟هر پروژه جنگو در فایل settings.py یک لیست به نام MIDDLEWARES ( در نسخه های قدیمی‌تر MIDDLEWARES_CLASSES ) داره که حاوی آدرس تمام Middleware های سر راه ریکوئست/ریسپانس هست.بعد از اینکه ریکوئست توسط فریمورک دریافت میشه WSGI Handler شروع به ساخت یک شئ HttpRequest میکنه و در این روند ریکوئست را به توابع process_request درون هر Middleware پاس میده. ( Middleware های درون لیست به ترتیب از بالا به پایین بررسی می‌شوند و اگر یک  Middleware دارای process_request نبود هیچ اتفاقی نمی‌افته و WSGI Handler فقط از این کلاس چشم‌پوشی میکنه )بعد از اینکه شئ مربوطه ساخته شد و از تمام Middleware ها گذشت نوبت به این میرسه که به تابع View تحویل داده بشه اما قبل از اون دوباره باید توابع process_view درون هر Middleware یه نگاهی بهش بندازن و در صورت تایید به view تحویل داده بشه =))حواستون باشه که توابع process_request و process_view باید None را به عنوان خروجی بازگردانند. البته که می‌توانند یک شئ HttpRequest رو بازگرداند که در این صورت WSGI Handler به جای ادامه دادن روند فعلی خودش، به چرخه process_response میانبر میزنه و ریسپانس رو برمیگردونه =))اگر یک تابع View با خطا برخورد کند WSGI Handler وارد چرخه process_exception میشه در غیر این صورت اگر یک شئ HttpResponse رو باز بگرداند وارد چرخه process_response خواهد شد.بر خلاف process_request و process_view توابع process_response و process_exception فقط میتوانند محتوای ریسپانس را تغییر دهند.خب دیگه بریم یکم کد بزنیم در ابتدا یک پروژه جنگو با file tree زیر آماده می‌کنیم :├── mysite
│   ├── manage.py
│   └── mysite   
│       ├── __init__.py 
│       ├── settings.py
│       ├── urls.py
│       └── wsgi.py
└── myapp   
    │   ├── __init__.py 
    │   ├── admin.py
    │   ├── apps.py
    │   ├── models.py
    │   ├── MyMiddleware.py
    │   ├── tests.py
    │   ├── urls.py
    └   └── views.pyحالا دوتا تابع view به پروژه خودمون اضافه میکنیم یکی برای تست process_request و یکی برای تست process_view : https://gist.github.com/hamedsj/8b68e9b93d43904be1876395a77f8872 بعد از اون محتوای فایل mysite/urls.py به صورت زیر تغییر میدیم : https://gist.github.com/hamedsj/ed7334e37fc69efc8d456545cc522d63 همچنین دوتا ویو ای که بالا ساختیم رو به myapp/urls.py مشابه زیر اضافه می‌کنیم :  https://gist.github.com/hamedsj/2388373a84d27e5581992c838257c740 حالا نوبت به نوشتن Middleware رسیده که محتوای اون رو داخل فایل MyMiddleware.py به شکل زیر قرار دادیم : https://gist.github.com/hamedsj/83907cc5e4d2217b05ede97d6fe80a29 همانطور که مشاهده میکنید طبق محتوای فایل فوق، هر ریکوئست با متد GET اگر دارای پارامتر p باشه جواب   “Hello World =)”  رو تحویل میگیره و اگر ریکوئستی به تابع process_view_test ارسال شد و پارامتر p رو بین پارامترهای GET نداشت جواب “This method only work for this view =)” رو تحویل میگیره.و در نهایت کافیه Middleware ای که ساختیم رو به لیست Middlewareها درون settings.py اضافه کنیم مانند زیر : https://gist.github.com/hamedsj/6137ae10b256b9a627ea4c1c4a8f5089 نوبت به تست کدمون رسیده =))Test 0 : curl http://127.0.0.1:8000/myview/ Output : Hello There =)Test 1 : curl http://127.0.0.1:8000/myview/?p=2 Output : Hello World=)Test 2 : curl http://127.0.0.1:8000/process_view_test/ Output : This method only work for this view =)Test 3 : curl http://127.0.0.1:8000/process_view_test/?p=1 Output : Hello World=)تمامی محتوای کد در این ریپوزیتوری گیتهاب در دسترستون هست. ممنونم از این که این پست رو مطالعه کردیدامیدوارم که براتون مفید باشه =))لایک و کامنت فراموش نشه...سوال یا نظری بود در خدمتم.نوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Sun, 03 May 2020 23:27:23 +0430</pubDate>
            </item>
                    <item>
                <title>داکرایز کردن Django و Nginx و Gunicorn به روش ساده</title>
                <link>https://virgool.io/@hamedsj5/%D8%AF%D8%A7%DA%A9%D8%B1%D8%A7%DB%8C%D8%B2-%DA%A9%D8%B1%D8%AF%D9%86-django-%D9%88-nginx-%D9%88-gunicorn-%D8%A8%D9%87-%D8%B1%D9%88%D8%B4-%D8%B3%D8%A7%D8%AF%D9%87-gkyfeyrwdejd</link>
                <description>سلام و خسته نباشیداول از همه میخوام رک و روراست بگم چرا این پست رو نوشتم؛ حقیقتا من به تازگی دارم کار با داکر رو یاد می‌گیرم و وقتی تونستم یه پروژه رو داکرایز کنم خواستم اطلاعاتی که دارم رو به اشتراک بذارم که هم شاید تونستم به کسی برای یادگیری داکر انگیزه بدم و هم شاید اشخاصی که اطلاعات بیش‌تری در این حوزه دارن بتونن برای بهتر شدن کارم بهم نظری بدن و هم اینکه ذوقمو یه جایی تخلیه کنم =)))پیشنیاز‌هاآشنایی با فریمورک djangoآشنایی ابتدایی با nginxآشنایی ابتدایی با gunicornاصل کارخب خب بریم سراغ اصل کاراول از همه یه پوشه به نام dod می‌سازیم ( مخفف django on docker )هدفمون اینه که یک ایمیج داشته باشیم برای nginx که از پورت ۸۰ استفاده میکنه و ریکوئست ها رو هدایت بکنه. در کنارش یک ایمیج دیگه داشته باشیم برای جنگو و گونیکورن که ریکوئست ها رو با استفاده از شبکه داکر از nginx دریافت کنه و پردازش های لازم رو انجام بده و ریسپانس‌ها رو برگردونه.در همین جهت دو پوشه به نام های nginx و app می‌سازیم که اطلاعاتمون رو توی اونا قرار بدیم.mkdir dod &amp;&amp; cd dod
mkdir app &amp;&amp; mkdir nginx &amp;&amp; cd appابتدا از ساخت ایمیج جنگو و گونیکورن شروع می‌کنیم.پروژه‌ی جنگو رو می‌سازیم به نام prj.از این پروژه کافیه که اطلاعاتی از Settings.py رو به صورت متغیر محیطی دریافت کنیم؛ به همین دلیل خطوطی رو به شکل زیر تغییر می‌دیم:SECRET_KEY = os.environ.get(&amp;quotSECRET_KEY&amp;quot)DEBUG = bool(os.environ.get(&amp;quotDEBUG&amp;quot,default=0))ALLOWED_HOSTS = os.environ.get(&amp;quotALLOWED_HOSTS&amp;quot).split(&amp;quot &amp;quot)این اطلاعات به صورت متغیر محیطی تعریف می‌کنیم تا در ادامه برای ساخت ایمیج‌های مختلف از یک فایل لازم نباشه که توی کد دست ببریم و تنها تغییر اطلاعات توی Dockerfile کفایت بکنه.شما می‌توانید اطلاعات دیگه‌ای از قبیل اطلاعات اتصال به دیتابیس و... رو هم به صورت متغیر محیطی تعریف بکنید که فعلا توی این پست از این کار صرف نظر کردیم.الان باید فایل requirements.txt رو آماده کنیم و توی اون ماژول‌هایی که هنگام بیلد ایمیج نیاز هست رو بنویسیم، ما توی این مثال ساده تنها به این دو ماژول نیاز داریم :Django==3.0.4
gunicorn==19.9.0الان تنها کاری که باقی مونده نوشتن Dockerfile هست.خط به خط شروع به نوشتن می‌کنیم با هم :FROM python:3.8-alpineایمیج پایه ما ایمیج پایتون 3.8 هست. و این کار رو توسط دستورالعمل FROM توی خط اول انجام دادیم.در لایه بعدی متغیرهای محیطی را تعریف می‌کنیم :FROM python:3.8-alpine
ENV SECRET_KEY 71)0c2pluviivk1!p93qouc_w017(#%x#g+2(*eo(0sf6h)vq3
ENV DEBUG 1
ENV ALLOWED_HOSTS webحالا نوبت به نصب ماژول های توی requirements.txt می‌رسه، برای این کار ابتدا فایل رو به درون کانتینر کپی می‌کنیم و سپس با استفاده از pip ماژول ها رو نصب میکنیم :FROM python:3.8-alpine
ENV SECRET_KEY 71)0c2pluviivk1!p93qouc_w017(#%x#g+2(*eo(0sf6h)vq3
ENV DEBUG 1
ENV ALLOWED_HOSTS web
COPY ./requirements.txt /home
RUN pip install -r /home/requirements.txtبعد از اون تمامی پروژه ای که ساختیم رو به پوشه home درون کانتینر کپی میکنیم و محل کارمون (work directory ) رو پوشه پروژه منتقل می‌کنیم تا بتونیم پروژه اجرا کنیم.FROM python:3.8-alpine
ENV SECRET_KEY 71)0c2pluviivk1!p93qouc_w017(#%x#g+2(*eo(0sf6h)vq3
ENV DEBUG 1
ENV ALLOWED_HOSTS web
COPY ./requirements.txt /home
RUN pip install -r /home/requirements.txt
COPY . /home
WORKDIR /home/prjبعد از همه این مراحل تنها کاری که می‌مونه اینه که دستورالعمل CMD رو اضافه بکنیم تا هنگام اجرای ایمیج پروژمون هم ران بشه:FROM python:3.8-alpine
ENV SECRET_KEY 71)0c2pluviivk1!p93qouc_w017(#%x#g+2(*eo(0sf6h)vq3
ENV DEBUG 1
ENV ALLOWED_HOSTS web
COPY ./requirements.txt /home
RUN pip install -r /home/requirements.txt
COPY . /home
WORKDIR /home/prj
CMD [&amp;quotgunicorn&amp;quot, &amp;quot--bind&amp;quot, &amp;quot0.0.0.0:8080&amp;quot, &amp;quotprj.wsgi&amp;quot]الان ساختار پروژه ما به این شکل هست :/home
   ├── requirements.txt
   ├── Dockerfile
   ├── prj
      ├── manage.py
      ├── prj
      │   ├── __init__.py
      │   ├── settings.py
      │   ├── urls.py
      │   └── wsgi.pyخب کارمون با ایمیج جنگو و گونیکورن فعلا تموم شده.میریم اطلاعات ایمیج nginx رو آماده می‌کنیم و بعد از اون ایمیج هامون رو بیلد میکنیم و بعدش هم اجرا میکنیم.وارد پوشه nginx بشید؛ برای استفاده از nginx تنها کافیه فایل های کانفیگ nginx رو جایگزین کانفیگ پیش‌فرض nginx بکنیم. برای این کار کافیه که فایل etc/nginx/conf.d/default.conf رو پاک کنیم و فایل کانفیگ خودمون رو به آدرس etc/nginx/conf.d کپی کنیم. پس داکرفایل ما به صورت زیر خواهد بود ( ایمیج پایه ما nginx:1.17.9 است. )FROM nginx:1.17.9
RUN rm /etc/nginx/conf.d/default.conf
COPY mysite.conf /etc/nginx/conf.d/کانفیگ پروژه ما به چه شکل خواهد بود؟ با هم مینویسم :upstream web {
    server web1:8080;
}

server {
    listen    80;
    server_name  localhost;

    location / {
        proxy_pass http://web;
    }
}با این کانفیگ هر ریکوئستی که به سرور ما ارسال بشه به گروه سرورهای web توسط reverse proxy ارسال می‌شه و اطلاعات رو از اون سرور ها میگیره و برمی‌گردونه. و درون گروه سرورهای web ما تنها یک سرور تعریف کردیم به نام web1 ( نام ایمیج جنگو خودمون رو در ادامه برابر web1 قرار می‌دهیم ) تعریف کردیم که توسط پورت 8080 به آن متصل شدیم.حالا نوبت به بیلد و اجرای پروژه می‌رسه. برای بیلد از دستور های زیر استفاده می‌کنیم ( name:tag ) را با نام و تگ دلخواه خودتون جایگزین کنید :docker build -t name:tag app/
docker build -t name2:tag2 nginx/قبل از اجرای این ایمیج ها ما نیاز داریم که یک شبکه داکر بسازیم تا دو ایمیج ما از طریق این شبکه ها با هم در ارتباط باشند برای این کار از دستور زیر استفاده می‌کنیم :docker network create wnبا این دستور یک شبکه با درایور bridge به نام wn ساختیم. حالا کافیه که موقع اجرای ایمیج‌ها اونا رو عضو این شبکه کنیم.ابتدا ایمیج جنگو رو با دستور زیر ران میکنیم :docker run -itd --name web1 --network wn name:tagاگر به دستور بالا دقت کنید نام کانتینر رو برابر web1 قرار دادیم ( که بتونیم با کانتینر nginx از طریق شبکه داخلی بهش متصل بشیم )؛ همچنین کانتینر جنگو رو عضو شبکه wn کردیم.حال با دستور زیر کانتینر nginx رو ران میکنیم. مشابه فوق، با این تفاوت که پورت ۸۰ را پابلیش می‌کنیم تا بتونیم از طریق پروتکل http بهش دسترسی داشته باشیمdocker run -itd -p 80:80 --name nginx --network wn name2:tag2حالا می‌تونیم با وارد کردن آدرس 127.0.0.1 در مرورگر پروژه ران شده جنگو خودمون رو مشاهده کنیم.تامام تامام =))می‌تونید فایل‌های این پست رو به صورت کامل در این ریپوزیتوری ببینید =))منابعسایت dockerme.irبلاگ پستی مشابه به زبان انگلیسی در وبسایت testdriven.ioلازمه که تشکر کنم از آقای رفیعی و سایت خوبشون dockerme.ir که به یادگیری بنده کمک خیلی زیادی کردند.ممنونم از این که این پست رو مطالعه کردیدامیدوارم که براتون مفید باشه =))لایک و کامنت فراموش نشه...سوال یا نظری بود در خدمتم.نوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Tue, 31 Mar 2020 21:56:44 +0430</pubDate>
            </item>
                    <item>
                <title>مشکل جنگو و mysql با زبون فارسی و اموجی چیه !؟</title>
                <link>https://virgool.io/@hamedsj5/%D9%85%D8%B4%DA%A9%D9%84-%D8%AC%D9%86%DA%AF%D9%88-%D9%88-mysql-%D8%A8%D8%A7-%D8%B2%D8%A8%D9%88%D9%86-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D9%88-%D8%A7%D9%85%D9%88%D8%AC%DB%8C-%DA%86%DB%8C%D9%87-emr9tkculuue</link>
                <description>سلام سلام =))چند روز پیش یکی از دوستان بهم پیام داد و دنبال راه حل یه مشکل بود که خودمم قبلا زیاد باهاش دست و پنجه نرم کرده بودم ، تهش هم نفهمیدم چطور حلش کردم D=اونم نه یک بار ،‌ دو بار حلش کردم و نفهمیدم چطوری...امروز میخوام توی این پست هرچی راجع به این مشکل می‌دونم رو بیان کنم که بالاخره یه سری راه جلوی پای باقی افرادی که گرفتار این مشکل میشن گذاشته باشم =))خب خب بریم تو کار...فرضیاتفرض می‌کنیم که یک فضای ایزوله (virtual environment) به نام tenv داریم درون آن یک پروژه جنگو به نام tpr و همچنین درون آن یک اپلیکیشن جنگو به نام tapp داریم. اپلیکیشن ما به یک دیتابیس به نام tdb متصل است و درون فایل models.py اپلیکیشن ما به شکل زیر است :class my_table(models.Model):
    record_id = models.AutoField(primary_key=True)
    text = models.TextField()شرح مشکلمشکل ما اینجاست که ما نمی‌تونیم متن فارسی یا متن دارای اموجی درون my_table ذخیره بکنیم. به نظرتون چرا؟چون وقتی یک تیبل به اپلیکیشن جنگو خودمون اضافه میکنیم و درون اون ستون هایی اضافه میکنیم برای ذخیره متن. به صورت خودکار از یونیکد utf-8 برای ساختن اون ستون استفاده میکنه.یونیکد و utf-8 اصلا چی هستن؟وقتی ما یک متن توی دیتابیس ذخیره می‌کنیم. در اصل کامپیوتر به صورت چند تا صفر و یک کنار هم اونا رو ذخیره میکنه به عنوان مثال توی کامپیوتر &quot;01000011&quot; ذخیره شده و کامپیوتر به صورت &quot;C&quot; اون رو به ما نشون میده.حالا کامپیوتر چطور این کار رو میکنه؟کافیه این عدد دودویی رو به دهدهی تبدیل کنیم که میشه 67. حالا کافیه از &quot;مجموعه کاراکتر‌ها&quot; ، کاراکتر 67ام رو انتخاب کنه و به ما نمایش بدهخیلی کشش نمیدم و میرم سر اصل مطلب.مجموعه کاراکترهای utf-8 هر کاراکتر رو با ۳ بایت ذخیره می‌کنه در صورتی که این کار اشتباهه و کاراکترها همه جا با ۴ بایت ذخیره میشن و این مشکل باعث میشه بعضی کاراکتر ها درون مجموعه utf-8 جای نگیرن.برنامه نویس‌های mysql هیچوقت این باگ رو برطرف نکردن فقط بعد ها یک مجموعه کاراکتر دیگه به نام utf8mb4 معرفی کردن که مشکل توی اون حل شده. می‌تونید برای اطلاعات کمی بیش تر به این لینک مراجعه کنیدراه حل چیست ؟راه حل اینه که مجموعه کاراکتر‌ها رو همه جا توی دیتابیس و تنظیمات دیتابیس به utf8mb4 تغییر بدیم.دستورات مورد نیاز رو این پایین براتون لیست کردم :تغییر مجموعه کاراکتر یک دیتابیس به utf8mb4 ( به جای db_name اسم دیتابیس رو بذارید ) :
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE utf8mb4_unicode_ci;تغییر مجموعه کاراکتر یک تیبل به utf8mb4 ( به جای table_name اسم تیبل رو بذارید ) :
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;تغییر مجموعه کاراکتر یک ستون از تیبل به utf8mb4 ( به جای table_name اسم تیبل و به جای column_name اسم ستون رو بذارید ) :
ALTER TABLE table_name MODIFYcolumn_name LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;تغییر مجموعه کاراکتر یکی از تیبل‌های پروژه جنگو که ممکنه باعث مشکل بشه :ALTER TABLE django_admin_log MODIFY object_repr VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;ALTER TABLE django_admin_log MODIFY change_message VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;در انتها باید این خط رو به تنظیمات فایل settings.py خود در بخش دیتابیس اضافه کنید :&#039;OPTIONS&#039;: {&#039;charset&#039;: &#039;utf8mb4&#039;,&#039;use_unicode&#039;: True,}حالا فقط مونده تنظیمات mysql که همه جا utf8mb4 داشته باشیم.برای این کار باید محتویات فایل etc/mysql/my.cnf رو به مانند زیر تغییر بدیم :
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ciیادتون نره که بعد از تغییر دادن تنظیمات mysql حتما سرویس اون رو restart کنید.توی لینوکس میتونید از دستور زیر استفاده کنید :sudo /etc/init.d/mysql restartتامام تامام =)))با تشکر از دوست عزیزم مهدی کاظمی که در تهیه این پست کمک کرد =))ممنونم از این که این پست رو مطالعه کردیدامیدوارم که براتون مفید باشه =))لایک و کامنت فراموش نشه...سوالی بود در خدمتم.نوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Tue, 10 Mar 2020 01:14:40 +0330</pubDate>
            </item>
                    <item>
                <title>کار در پس زمینه با فریمورک جنگو</title>
                <link>https://virgool.io/pythonisho/%DA%A9%D8%A7%D8%B1-%D8%AF%D8%B1-%D9%BE%D8%B3-%D8%B2%D9%85%DB%8C%D9%86%D9%87-%D8%A8%D8%A7-%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-%D8%AC%D9%86%DA%AF%D9%88-vb5jwlabwqmt</link>
                <description>سلام سلامحمید هستم و با یک قسمت دیگر از نیمچه آموزش‌های جالب در خدمتتونم.شوخی بسه برم سر اصل مطلب...حدود یک سال پیش که می‌خواستم برای یکی از پروژه‌هایی که دستم بود سرویس پوش نوتیفیکیشن راه اندازی کنم. به یه مشکل برخوردم.مدیر اپلیکیشن می‌خواست با اپلیکیشن مدیریت یک ریکوئست بده و پیغامی رو برای تمام کاربران اپلیکیشن ارسال بکنه. برای ارسال نوتیفیکیشن نیاز داشتم پیغام رو به سرور firebase برسونم که توسط سرویس firebase cloud messaging به دست کاربران برسه. و برای این کار باید یک ریکوئست به سرور firebase ارسال می‌کردم.این روند به نظر ساده و روون میاد اما مشکل دقیقا اونجا بود که بعضی اوقات سرور firebase دیر جواب ریکوئست من رو می‌داد و از اون طرف هم مدیر اپلیکیشن منتظر بود تاییدیه ارسال پوش رو بگیره و خب مشکل پیش می‌اومد دیگه =)))یکمی سرچ کردم و راه حلش رو پیدا کردم و مشکل رو حل کردم ، هم من راضی ، هم مدیر اپلیکیشن راضی و...حالا بعد از یک سال که می‌خواستم به یکی از کارآموزام این مطلب رو آموزش بدم دنبال آموزش روون بودم اما پیدا نمی‌شد برای همین تصمیم گرفتم یکی توی این بلاگ بنویسم که شاااااید به درد بقیه هم بخوره =)))توضیح کلی روند کاردر کنار جنگو از دو پکیج دیگه استفاده می‌کنیماولی که Celery نام داره. یک &quot;صف اعمال درست کن&quot; ( task queue ) هست. ما یک سری عمل یا همون تسک رو براش تعیین می‌کنیم و اون یه سری صف درست میکنه. هرموقع که ما یکی از عمل هامون رو صدا زدیم. اون عمل رو می‌اندازه توی صف تا وقتی که نوبتش رسید انجام بشه و وقت کار اصلی ما رو نگیره.دومی هم redis نام داره ردیس در اصل یک ساختمان داده نگهدارنده درون حافظه ای هست ( مثل یک دیتابیس که درون حافظه کار میکنه ).ما از ردیس برای انتقال اطلاعات بین اپلیکیشن جنگو و celery استفاده می‌کنیم ( راستی این هم بدونید که ردیس به عنوان یک message broker یا همون انتقال دهنده پیام هم استفاده میشه )فکر می‌کنم توی همین دو مورد بالا روند کار هم به صورت خلاصه توضیح دادم بهتون =)))فرضیات و اهداففرض می‌کنیم که یک فضای ایزوله (virtual environment) به نام venv و درون اون یک پروژه جنگو به نام prj و درون اون یک اپلیکیشن جنگو به نام prapp داریم.پس اطلاعات ما به صورت زیر هستن :
venv
prj
├── manage.py
├── prj
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── prapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.pyهدفمون هم اینه که یک عمل در پس زمینه راه بیندازیم که دو مقدار رو با همدیگه جمع بکنه و توی فایلی به نام alaki.txt مقدار رو ذخیره بکنه و یک ویو بسازیم که با هر بار صدا کردنش صد بار این کار رو انجام بده.شروع کارابتدا با نصب ردیس شروع می‌کنیم :sudo apt install redis-serverبعد از اون باید ماژول‌های ردیس و سلری برای پایتون رو نصب بکنیم :pipenv install celery redisسپس با اضافه کردن تنظیمات سلری به settings پروژه کار رو ادامه میدیم : 
BROKER_URL = &#039;redis://localhost:6379&#039;
CELERY_RESULT_BACKEND = &#039;redis://localhost:6379&#039;
CELERY_ACCEPT_CONTENT = [&#039;application/json&#039;]
CELERY_TASK_SERIALIZER = &#039;json&#039;
CELERY_RESULT_SERIALIZER = &#039;json&#039;
CELERY_TIMEZONE = &#039;Asia/Tehran&#039;الان باید یک فایل celery.py توی آدرس prj/prj بسازیم و محتویات زیر رو توی اون بنویسیم :from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault(&#039;DJANGO_SETTINGS_MODULE&#039;, &#039;prj.settings&#039;)
app = Celery(&#039;prj&#039;)

app.config_from_object(&#039;django.conf.settings&#039;)
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)هدف از ساخت این فایل این هست که با اجرا کردن این فایل با هربار اجرا شدن پروژه جنگو خودمون تنظیمات سلری بر اساس تنظیماتی که توی فایل settings.py اضافه کردیم انجام بشه و سلری ما آماده استفاده باشه. حالا برای صدا زدن این فایل و اجرا شدن سلری کافیه که به فایل prj/prj/__init__.py اطلاعات زیر رو اضافه بکنیم :from __future__ import absolute_import
from .celery import app as celery_app

__all__ = (&#039;celery_app&#039;,)خب حالا که تمام تنظیمات اولیه انجام شده ، کافیه که اعمال مورد نیاز برای انجام شدن در پس زمینه رو برای سلری مشخص کنیم. برای این کار یک فایل به نام tasks.py در آدرس prj/prapp می‌سازیم و تسک‌های خودمون رو توی اون می‌نویسیم ( به عنوان مثال ما در این آموزش می‌خواستیم یک تسک برای جمع کردن دو عدد و ذخیره اون بنویسیم ) :from celery import shared_task
import time

@shared_task()
def plus(x, y):
    time.sleep(5)
    alaki = open(&amp;quotalaki.txt&amp;quot, &amp;quota+&amp;quot)
    alaki.write(str( x + y ) + &amp;quot\n&amp;quot)
    alaki.close()خب ما از یک decorator به نام shared_task استفاده کردیم که این تابع رو به یک عمل معتبر celery تبدیل می‌کنه و ما می‌تونیم با هر Celery که داریم این تسک رو صدا بزنیم.همچنین برای بهتر شدن تستمون ۵ ثانیه توقف گذاشتیم که تفاوت انجام شدن عمل در background و foreground رو متوجه بشیم.و در انتها ویو هم می‌نویسم تا با نحوه صدا زدن یک تسک سلری آشنا بشید.این هم از محتویات فایل views.py :from .tasks import plus
from django.http import HttpResponse

def alaki(request):
    for i in range(100):
        plus.delay(1398, 1)
    return HttpResponse(&amp;quotOK&amp;quot)خب باقی تنظیمات جنگو و ران کردن پروژه رو به عهده خودتون باقی می‌گذارم اما اینو بگم که شما بعد از ران کردن پروژه جنگو باید worker سلری رو ران بکنید تا تسک های شما رو انجام بده. برای ران کردن worker سلری از دستور زیر می‌تونید استفاده بکنید :celery -A prj worker -l infoتامام تامام =)))نتیجه مطلوبهمونطور که به احتمال زیاد خودتون می‌دونید ما می‌تونستیم ویو خودمون رو به شکل زیر بنویسیم :from django.http import HttpResponse
import time

def alaki(request):
    for i in range(100):
        time.sleep(5)
        alaki = open(&amp;quotalaki.txt&amp;quot, &amp;quota+&amp;quot) 
        alaki.write(str( x + y ) + &amp;quot\n&amp;quot)
        alaki.close()
    return HttpResponse(&amp;quotOK&amp;quot)اما در این صورت وقتی که به این ویو ریکوئست ارسال می‌کردیم باید ۵۰۰ ثانیه صبر می‌کردیم تا یک OK تحویل بگیریمدر حالی که الان با استفاده از celery می‌تونیم همون لحظه OK رو تحویل بگیریم و باقی کار ها توی پس زمینه انجام بشه =))ممنونم از این که این پست رو مطالعه کردیدامیدوارم که براتون مفید باشه =))لایک و کامنت فراموش نشه...سوالی بود در خدمتم.نوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Sun, 01 Mar 2020 04:16:51 +0330</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت آخر</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D8%A2%D8%AE%D8%B1-zgikzuseugfk</link>
                <description>سلام و خسته نباشید خدمت همهقسمت سیزدهم ( آخر ) از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت های قبلی دسترسی داشته باشید ، امروز میریم سراغ دوازده سوال آخر...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اولمجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت چهارممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت پنجممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت ششممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هفتممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هشتممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت نهممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دهممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت یازدهممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوازدهم ۱۲۱. درخت دودویی ( binary tree ) :نوعی درخت که هر المان آن حداکثر دو شاخه ( فرزند ) دارد که به اسم شاخه راست و چپ شناخته می شوند را درخت دودویی می گویندمقدار شاخه چپ همیشه کم تر از مقدار والد است.مقدار شاخه راست همیشه بزرگتر یا مساوی مقدار والد است.اگر دو شرط فوق برقرار باشند می گویند که درخت در حالت تعادل است.مزیت های درخت دودویی نسبت به فهرست پیوندی : در فهرست پیوندی موارد تنها با یک اشاره گر next به هم متصل هستند اما در درخت دودویی تا وقتی که درخت در تعادل باشد همیشه مسیر کوتاه تری برای جستجو طی می شودنقطه ضعف آن ها هم این است که گاهی اوقات از نظر کارآمد بودن به اندازه فهرست پیوندی نزول پیدا می کنند.۱۲۲. پشته ها ( Stack ) :پشته ها مجموعه هایی هستند که از سیاست LIFO ( مخفف Last Input First Output ) استفاده می کنند.از توابع اساسی آن ها می توان موارد زیر را نام برد :تابع Push : موجودی جدیدی به بالای پشته می افزایدتابع Pop : یک موجودی از بالای پشته حذف می کندپشته ها محدودیت اندازه دارند و اگر پشته ای پر باشد و ما مقدار جدید push کنیم در این حالت می گوییم که overflow در پشته رخ داده استاگر پشته خالی باشد و سعی کنیم مقداری را pop کنیم این کار انجام نمی شود و در این حالت می گوییم که underflow در پشته رخ داده است.از نظر کارآمدی : زمان اجرای توابع پشته به تعداد مقادیر درون آن ربطی ندارند به همین علت بسیار کار آمد است و اُ بزرگ آن ۱ است.۱۲۳. صف ها ( Queues ) :صف ها مجموعه هایی هستند که از سیاست FIFO استفاده می کنند. از توابع اساسی آن ها می توان موارد زیر را نام برد :تابع enqueue : یک مورد جدید به انتهای صف اضافه می کندتابع dequeue : یک مورد جدید از جلوی صف حذف می کندتابع front : جلو ترین مقدار صف را باز میگرداندصف ها محدودیت اندازه دارند و اگر پشته ای پر باشد و ما مقدار جدید enqueue کنیم در این حالت می گوییم که overflow در صف رخ داده است اگر صف خالی باشد و سعی کنیم مقداری را dequeue کنیم این کار انجام نمی شود و در این حالت می گوییم که underflow در صف رخ داده است.از نظر کارآمدی : زمان اجرای توابع صف به تعداد مقادیر درون آن ربطی ندارند به همین علت بسیار کار آمد است و اُ بزرگ آن ۱ است.صف دوطرفه : نوعی از صف است که می توان مورد جدید را به انتها یا ابتدای آن اضافه کرد یا مورد جدیدی را از انتها یا ابتدای آن حذف کرد.صف دو طرفه با محدودیت ورودی : نوعی صف دو طرفه است که در آن حذف از دو طرف قابل انجام است اما اضافه کردن فقط در یک طرف قابل انجام شدن استصف دو طرفه با محدودیت خروجی : نوعی صف دو طرفه است که در آن اضافه کردن از دو طرف قابل انجام است اما حذف فقط در یک طرف قابل انجام شدن استصف الویت دار : نوعی صف است که در آن موارد علاوه بر مقدار با الویت افزوده می شوند و هنگام خروج بر اساس الویت خارج می شوند.۱۲۴. Blocking Queue :نوعی صف است که هنگامی که شما می خواهید در هنگام خالی بودن آن چیزی از آن حذف کنید یا در هنگامی که شما می خوهید در هنگام پر بودن آن چیزی به آن اضافه کنید thread شما را بلاک می کند تا زمانی که توسط یک بلاک دیگر پر شود ( اگر خالی بود ) یا خالی شود ( اگر پر بود )مثال برای پیاده سازی Blocking Queue۱۲۵. تفاوت های صف و پشته چیست :سیاست کاری صف LIFO است اما سیاست صف FIFO استبرای افزودن یا حذف در پشته از یک انتها استفاده می شود اما در صف یک انتها برای حذف و انتهای دیگر برای افزودن استفاده می شوددر صف از یک اشاره گر استفاده می شود اما در یک صف ساده از دو اشاره گر استفاده می شودعملیات های push و pop در پشته وجود دارند و معادل آن ها در صف enqueue و dequeue را داریمشرط خالی بودن پشته top == -1 است اما در صف یا front == -1 باشد یا front == rear + 1شرط پر بودن در پشته top == max -1 است اما در صف rear == max -1تنها یک نوع پشته وجود دارد اما انواع صف وجود دارد مانند صف دایره ای ، صف دو طرفه ، صف الویت دارپیاده سازی پشته در مقایسه با صف ساده تر است۱۲۵ـ DeadLock در جاوا چیست ؟هنگامی که یک thread منبعی از سیستم درخواست می کند و آن منبع در روند انتظار دیگری درگیر است یک DeadLock رخ می دهد و Thread منتظر تمام شدن روند انتظار و دریافت منبع از سیستم می ماند.مثال برای مواقعی که DeadLock رخ می دهدمثال برای جلوگیری از رخ دادن DeadLock۱۲۶ـ List Interface و Set Interface چیست ؟List Interface مجموعه ای از اشیاء که ممکن است تکرار داشته باشند را پشتیبانی می کند و Set Interface یک روش ریاضی برای دسترسی به عناصر موجود در مجموعه را برای جلوگیری از تکرار در اختیار شما می گذارد. ۱۲۷. فرق ArrayList و Vector چیست ؟وکتور ها بر خلاف ArrayList ها  Thread safe یا همان Synchronized هستند. به همین علت کارایی ArrayList ها بهتر از Vector هاست.در ArrayList برای جستجو باید از عنصر ابتدایی شروع به جستجو کنید اما در وکتور ها می توانید از یک موقعیت مشخص شروع به جستجو کنید. به همین علت عملیات جستجو در وکتور ها سریع تر انجام می شود.وکتور ها دارای اندازه پیش فرض ۱۰ هستند در حالی که ArrayList ها می توانند اندازه های متغیر داشته باشند.۱۲۸. چرا عملیات افزودن و حذف کردن در ArrayList کند تر از فهرست های پیوندی است؟ساختار ArrayList ها به شکلی است که در درون خود آرایه ای برای نگهداری داده ها دارند و هر زمانی که این آرایه پر شد آرایه ی جدیدی به اندازه ۱.۵ برابر آرایه قبلی ساخته می شود و داده های قبلی در آرای جدید کپی می شوند.هنگام عملیات حذف باید تمامی عناصر آرایه یک خانه به عقب کشیده شوند تا جای خالی عنصری که پاک شده است را پر کنند. در فهرست پیوندی داده ها در گره های متصل به هم ذخیره می شوند و عملیات حذف تنها با تغییر دو اشاره گر امکان پذیر است و عملیات افزودن در آن ها تنها با ساخت یک گره جدید و تغییر دو اشاره گر سریع تر انجام می شود.۱۲۹. انواع پیاده سازی برای Map ها :پیاده سازی TreeMap : ذخیره سازی در آن بر اساس کلید ها به صورت صعودی می باشد. برای افزودن ،‌ حذف و یافتن عناصر بهترین جایگزین برای آن HashMap است.پیاده سازی HashTable : مقادیر null را پشتیبانی نمی کند . fail-safe نیست sychronized است در صورتی که hashmap مقادیر null را پشتیبانی می کند . fail-safe است و synchronized نیست.پیاده سازی LinkedHashMap : یک زیر کلاس از HashMap است با این تفاوت که ترتیب عناصر را از حالت LinkedList حفظ می کند.۱۳۰. فرق Enumeration و Iterator ها چیست ؟Enumeration متد remove ندارند در صورتی که iterator ها دارند. رفتار Enumerator ها به صورتی است که تنها عملیات خواندن را انجام می دهند.ـ ListIterator : مانند Iterator ها هستند با این تفاوت که اجازه دسترسی به مجموعه را به صورت پیش رونده یا عقب رونده را می دهند.۱۳۱. HashMap در جاوا چگونه فعالیت می کنند؟HashMap ها با سیاسیت Hash کردن کار میکنند. یک ساختمان داده است که به ما اجازه می دهد به داده در  زمانی ثابت دسترسی داشته باشیم ( اگر کلید آن را بدانیم ) وقتی که ما از تابع put استفاده می کنیم متد hashcode بر روی آبجکت کلیدی فراخوانی می شود تا تابع hash در map بتواند سطلی برای ذخیره سازی مقدار پیدا کند.وقتی دو شئ مختلف دارای hashcode یکسان باشند یک فهرست پیوندی در آن سطل ساخته می شود و مقدار دوم به مقدار اول متصل می شود. در هنگام جستجو بعد از پیدا کردن سطل مربوط به hashMap از تابع key.equals برای تشخیص گره درست در فهرست پیوندی استفاده می کنیم و مقدار آن گره را باز میگردانیم.۱۳۲. ژنتیک در جاوا :با استفاده از ژنتیک در جاوا می توان برنامه نویس را مجبور کرد تا تنها انوع مشخصی از مقادیر را ذخیره سازی کند.نوع Type-Safety : تنها می توانیم یک نوع خاص از مقادیر را ذخیره کنیم و نمی توانیم مقادیر جدید را نگه داریمنوع مشخص نشده : نوعی مشخص نشده و می توانیم هر نوعی را ذخیره سازی کنیمبررسی در هنگام کامپایل : این موارد در هنگام کامپایل بررسی می شوند و دیگر کار به زمان اجرا نخواهد رسید که از نظر حرفه ای بسیار بهتر است.برای مثال قبل از ژنتیک باید از cast کردن انواع استفاده می کردیم :List list = new ArrayList();
list.add(&amp;quothello&amp;quot);
String s = (String) list.get(0); //typecastingاما بعد از ژنتیک دیگر نیازی به cast کردن انواع نبود :List&lt;String&gt; list = new ArrayList&lt;String&gt;();
list.add(&amp;quothello&amp;quot);
String s = list.get(0); کلاسی که به همه انواع ارجاع دارد به عنوان کلاس generic شناخته می شود. ما اینجا از پارامتر T استفاده کردیم. پارامتر T به هر نوعی اشاره دارد به عنوان مثال : String و Double و Strudent و ...علامت‌ ؟ ( علامت سوال ) به عنوان المان whildcard شناخته می شود. این علامت به معنی هر نوعی می باشد برای مقال اگر ما نوشتیم &lt;extends Number ? &gt;  به معنی این است که هر زیر کلاسی از کلاس Number به عنوان مثال Integer یا Double یا Float.حرف آخر :دم همتون گرم که تا اینجا این مقله سریالی رو دنبال کردید ،‌ مطمئنا خودتون سود کردید و نتیجه اش هم می بینیدبا نوشتن این ترجمه خیلی انتقاد بهم شد ، خیلی هاشون واقعا انتقاد درست و حسابی بودن و خیلی هاشون هم فقط بهونه یا حسادت یا ...ولی من نه هدفم بزرگ کردن اسمم بود و نه چیز مشابهی...صرفا خودمم میخواستم این مقاله ی بلند و بالا رو بخونم ، خوندن ۵۰ صفحه مقاله انگلیسی برام واقعا حوصله سر بر بود ولی نیازش داشتم ، دلم نمیخواست بعد از من کسی وجود داشته باشه که حوصله ی خوندن ۵۰ صفحه مقاله انگلیسی رو نداشته باشه ، خواستم همه از این اطلاعات استفاده کنن و تنها راهی که به ذهنم می رسید تا خیلی ها رو تشویق کنم برای خوندن همچین مقاله ای ترجمه اش به فارسی بود تشکر از Anitaa Murthy بابت مقاله فوق العاده خفنش.لینک نسخه انگلیسی مقاله هم براتون پایین میذارم استفاده ببرید قسمت اول برگه تقلب مصاحبه برنامه نویسی اندرویدقسمت دوم برگه تقلب مصاحبه برنامه نویسی اندرویدتشکر بابت مطالعه پستلایک و حمایت یادتون نرهسوالی بود درخدمتمنوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Fri, 18 Oct 2019 02:09:17 +0330</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوازدهم</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D8%A7%D8%B2%D8%AF%D9%87%D9%85-jktqchfvpxi5</link>
                <description>سلام و خسته نباشید خدمت همهقسمت دوازدهم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت های قبلی دسترسی داشته باشید ، امروز میریم سراغ ده سوال بعدی...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اولمجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت چهارممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت پنجممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت ششممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هفتممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هشتممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت نهممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دهممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت یازدهم ۱۱۱. معنی کلمه کلیدی synchronized چیست؟وقتی که شما دو thread دارید که باید به یک منبع متصل شوند ، بدون استفاده از synchronized ممکن است thread اول تغییراتی که thread دوم داده است را متوجه نشود.بلاک های synchronized وقتی که توسط یک thread فراخوانی می شوند منتظر می مانند تا کار thread قبلی با این بلاک پایان پیدا کند سپس کار خود را شروع می کنند. به عبارت دیگر تنها یک thread در لحظه می تواند به این متد دسترسی داشته باشد.۱۱۲. معنی کلمه کلیدی volatile چیست؟این کلمه کلیدی نشان می دهد که یک متغیر نباید به صورت محلی در یک thread کش بشود ( از متغیر کپی گرفته نشود ) و هر گونه تغییری که لازم باشد بر روی متغیر اصلی درون حافظه اصلی داده شوداینگونه می توان دو thread را به صورت همزمان به یک متغیر متصل کرد و بر خلاف synchronized دیگر thread منتظر thread قبلی نمی ماند و هر لحظه می تواند عملیات خواندن و نوشتن بر روی یک متغیر را انجام دهد.۱۱۳. فرق AutoBoxing و UnBoxing چیست ؟به تبدیل خودکار primitive type ها به کلاس های بسته بندی نظیر آن ها توسط کامپایلر جاوا AutoBoxing می گویند.برای مثال تبدیل int به Integer و تبدیل double به Double در اصل AutoBoxing هستند و برعکس این تبدیل را UnBoxing می گویند۱۱۴. Optional در جاوا چیست ؟Optional یک شئ نگهدارنده است که اشیاء غیر Null را در خود نگه می دارد.شئ Optional در اصل Null را با بی مقداری ارائه می دهد. کاربرد این متد در ساده کردن کد است چون به جای چک کردن null بودن متغیر از در دسترس بودن ( available ) و در دسترس نبودن ( not available ) مقدار استفاده می شود.۱۱۵. خارجی سازی ( externalization ) چیست ؟در عمل serialization مسئولیت خواندن و نوشتن اشیاء در زمان هایی که جزئیات عمل serialization زیاد مهم نیست با JVM است .اما در عمل serialization به صورت پیش فرض اطلاعات حساس مانند رمز ها و گواهینامه ها محافظت نمی شوند.به همین جهت عمل externalization کنترل عملیات خواندن و نوشتن اشیاء را به صورت کامل به دست برنامه نویسان می گذارد.کافی ایست که اینترفیس java.io.Externalizable را پیاده سازی کنید تا بتوانید با استفاده از تابع writeExternal و readExternal عملیات خواندن و نوشتن را کنترل نمایید.۱۱۶. ساختمان داده چیست ؟آرایش پایه ای مجموعه ای از داده ها را ساختمان داده می گویند. پنج رفتار اساسی برای ساختمان داده ها تعریف می شود که عبارتند از:دسترسی ( access )افزودن ( insert )حذف کردن ( delete )یافتن ( find )مرتب سازی ( sort )۱۱۷. علامت O بزرگ را توضیح دهید.علامت O بزرگ روند صعودی زمان اجرای الگوریتم را نشان می دهد. برای محاسبه O بزرگ یک الگوریتم باید بد ترین حالت ممکن برای زمان اجرای یک الگوریتم را مد نظر بگیریم.۱۱۸. علامت امگا بزرگ را توضیح دهید.علامت امگا بزرگ برای توصیف بهترین حالت ممکن برای زمان اجرای یک الگوریتم به کار می رود.۱۱۹. آرایه ها در جاوا :آرایه ها مجموعه های مرتبی هستند که بر خلاف لیست ها دارای طول ثابت هستند و در پشته ها و صف ها به کار می روند.آرایه ها نمی توانند type های موروثی را پشتیبانی کنند اما لیست ها می توانند.آرایه ها می توانند همه نوع داده ای را در خود ذخیره کنند در حالی که List ها نمی توانند داده های با نوع primitive را در خود ذخیره کنند و فقط برای ذخیره سازی اشیاء کاربرد دارند.الگوریتم فضاسازی آن ها به طور متوسط دارای امگا n و اُ بزرگ n می باشدالگوریتم جستجو آن ها به طور متوسط دارای امگا n و اُ بزرگ n می باشدالگوریتم افزودن آن ها به طور متوسط دارای امگا n و اُ بزرگ n می باشدالگوریتم حذف کردن آن ها به طور متوسط دارای امگا n و اُ بزرگ n می باشد۱۲۰. فهرست پیوندی ( Linked List ) در جاوا:یک فهرست پیوندی در جاوا دارای دو اشاره گر Head و Tail می باشد که Head به اولین مورد فهرست و Tail به آخرین مورد فهرست اشاره می کند. فهرست پیونده در جاوا از نوع دایره ای نمی باشد به همین علت اشاره گر Next در Tail فهرست به Head اشاره نمی کند و فقط Null است.هر گره یک اشاره گر دارد که به گره بعدی اشاره می کند.گره ها در حالت طبیعی به صورت dynamic ذخیره می شوند و این مورد به این معناست که تنها زمانی که نیاز باشد فضایی را از حافظه به خود اختصاص می دهند.افزودن ،‌ حذف کردن و اصلاح کردن در آن ها آسان است.یک فهرست پیوندی در اصل مجموعه ای از گره های متوالیست که هر گره دارای مقدار و همچنین یک رابط به گره بعدی در این توالی می باشد.فهرست پیوندی یگانه ( Singly linked list ) : در فهرست پیوندی یگانه هر گره دارای تنها یک اشاره گر آن هم به گره بعدی در توالی می باشدفهرست پیوندی دوگانه ( Doubly linked list ) : در فهرست پیوندی یگانه هر گره دارای تنها دو اشاره گر یکی به گره بعدی و یکی به گره قبلی در توالی می باشد الگوریتم فضاسازی آن ها به طور متوسط دارای امگا n و اُ بزرگ n می باشدالگوریتم جستجو آن ها به طور متوسط دارای امگا n و اُ بزرگ n می باشدالگوریتم افزودن آن ها به طور متوسط دارای امگا ۱ و اُ بزرگ ۱ می باشدالگوریتم حذف کردن آن ها به طور متوسط دارای امگا ۱ و اُ بزرگ ۱ می باشدترجمه متنی از Anitaa Murthyتشکر بابت مطالعه پستلایک و حمایت یادتون نرهسوالی بود درخدمتمنوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Thu, 17 Oct 2019 18:35:29 +0330</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت یازدهم</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%87%D9%85-cwapcol8sckr</link>
                <description>سلام و خسته نباشید خدمت همهقسمت یازدهم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت های قبلی دسترسی داشته باشید ، امروز میریم سراغ ده سوال بعدی...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اولمجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت چهارممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت پنجممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت ششممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هفتممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هشتممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت نهممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دهم۱۰۱. چرا String ها تغییر ناپذیر هستند ؟در اصل String ها تنها یک بار مقداردهی می شوند و مقدار آن ها دیگر تغییر نمی کند ،‌ اگر هم تغییر کنند در اصل یک شئ جدید از نوع String ساخته می شود. این مورد توسط StringBuffer انجام نمی شود.۱۰۲. تابع String.intern چیست و چه موقع استفاده می شود؟این تابع با تکرار ( duplication ) مقادیر String سر و کار دارد. یک String تکراری است در صورتی که محتوای آن String در یک متغیر دیگر درون حافظه موجود باشد.به عنوان مثال با فراخوانی تابع  intern بر روی &quot;abc&quot; ماشین مجازی جاوا &quot;abc&quot; را درون یک استخر String قرار می دهد و هر موقع دوباره کسی متغیری برابر &quot;abc&quot; بسازد ماشین مجازی همان متغیر درون استخر را باز می گرداند و دوباره حافظه را برای شئ جدید اشغال نمیکند ( ابعاد جلوگیری از اشغال حافظه به تعداد تکرار این مقدار در کدتان بستگی دارد.  )هروقت تابع intern دوباره روی یک String اجرا شود اگر String ای درون یک استخر وجود داشت که تابع equals با اجرا بر روی آن مقدار true را باز گرداند ماشین مجازی آدرس همان String درون استخر را بازمیگرداند و در غیر این صورت یک String جدید را درون استخر می سازد.۱۰۳. استخر String در جاوا چیست ؟استخر String در جاوا یک استخر از مقادیر String درون حافظه heap است که هرموقع ما یک متغیر String را توسط double quotes یا همان علامت &quot; &quot; مقدار دهی می کنیم ابتدا ماشین مجازی درون این استخر جستجو می کند و اگر مقدار نسبت داده شده به متغیر جدید ما درون استخر وجود داشت فقط آدرس مقدار درون استخر را باز می گرداند در غیر این صورت یک String جدید را وارد استخر می کند و سپس آدرس آن را باز می گرداند.۱۰۴. انواع Final ؟یک شئ یا متغیر final وقتی تعریف شد دیگر قابل تغییر نیست.کلاس های final : یک کلاس final نمی تواند زیر کلاس داشته باشدمتغیر های final : یک متغیر final بعد از مقدار دهی اولیه دیگر قابل تغییر نمی باشد.توابع  final : یک تابع final نمی تواند در یک زیر کلاس override شود.۱۰۵. کلمه کلیدی Finalize ؟تابع Finalize عمل پاک کردن حافظه را دقیقا قبل از این که شئ Garbage collect شود به انجام می رساند.۱۰۶. کلمه کلیدی Finally ؟کلمه finally یک محدوده ( block ) از کد را مشخص می کند که اجرای آن ها بسیار مهم است و چه exception اعمال شده باشد چه اعمال نشود ، این محدوده از کد اجرا می شود.۱۰۷. متغیر های Static چیستند ؟متغیر های Static متغیر هایی هستند که تنها یک نسخه از آن ها در یک کلاس وجود دارد و این متغیر ها متعلق به تنها یک نمونه ( instance ) از یک کلاس نیستند و به کل کلاس تعلق دارند و می توان بدون نمونه گیری از یک کلاس به آن ها دسترسی داشته باشید. متغیر های غیر Static می توانند مقادیر منحصر به فردی در هر نمونه به خود بگیرند.۱۰۸. انعکاس ( reflection ) چیست؟قابلیت انعکاس در جاوا بازرسی بر کلاس ها ، اینترفیس ها ، فیلد ها و متد ها را در هنگام اجرا ( بدون توجه به نام کلاس ها در هنگام کامپایل ) انجام می دهد. نمونه گیری از اشیاء و فراخوانی توابع و همچنین گرفتن یا set کردن یک مقدار برای فیلد ها را می توان توسط قابلیت انعکاس جاوا انجام داد.۱۰۹. مولتی تردینگ ( multi threading ) چیست ؟توسط multi threading چند وظیفه به صورت همزمان درون یک برنامه اجرا می شوند.۱۱۰ـ Fail-fast و Fail-Safe چیستند ؟در iterator های Fail-fast هرگاه یک thread در حال مرور بر یک شئ مجموعه ای ( مانند List ) است و یک thread دیگر تغییر ساختاری در شئ مجموعه ای ایجاد کند. ( مانند اضافه یا حذف کردن مواردی به شئ ) به سرعت یک ConcurrentModificationException بازگردانده می شود.اما iterator های Fail-Safe همیشه بر روی یک کپی از شئ مجموعه ای کار میکنند به جای نسخه اصلی آن شئ.ترجمه متنی از Anitaa Murthyتشکر بابت مطالعه پستلایک و حمایت یادتون نرهسوالی بود درخدمتمنوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Sat, 05 Oct 2019 03:43:50 +0330</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دهم</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%87%D9%85-rymo5godim9o</link>
                <description>سلام و خسته نباشید خدمت همهقسمت نهم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت های قبلی دسترسی داشته باشید ، امروز میریم سراغ ده سوال بعدی...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اولمجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت چهارممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت پنجممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت ششممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هفتممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هشتممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت نهم۹۱ـ overload کردن توابع در جاوا چه معنی دارد ؟overload کردن توابع یعنی داشتن دو یا چند تابع به همان نام در همان کلاس با ورودی های مختلف.نکات:هنگام overload کردن یک تابع حتما باید لیست ورودی ها تغییر کندتوابع overload شده می توانند نوع خروجی تابع را عوض کنندتوابع overload شده می توانند سطح دسترسی را عوض کنندتوابع overload شده می توانند گستره ی خطا های ( exception ) احتمالی توابع را تغییر دهندیک تابع می تواند در همان کلاس یا در یک زیر کلاس overload شود۹۲ـ override کردن توابع به چه معناست ؟override کردن توابع هنگامی اتفاق می افتد که یک زیر کلاس یک تابع با همان لیست ورودی ها و نوع خروجی که در ابرکلاس است را تعریف نماید.نکات:شما نمی توانید یک متد با سطح دسترسی عمومی ( public ) را به صورت محافظت شده ( protected ) دوباره override کنید.شما نمی توانید یک متد final را override کنیدشما نمی توانید یک متد static را override کنیدمتد های overload شده نیز می توانند override شوند۹۳. چرا نباید متد های abstract را در متد سازنده ( constructor ) فراخوانی کرد ؟مشکل این است که کلاس هنوز به صورت کامل ساخته نشده است و هنگام فراخوانی این تابع در زیرکلاس ممکن است مشکلاتی پدید بیاید.۹۴. تفاوت ترکیب و وراثت را بیان کنید:ترکیب در اصل به معنی &quot; استفاده از... &quot; یا &quot; دارای... &quot; می باشد. مثلا در مثال پایین کلاس Employee دارای کلاس Person می باشد ولی از کلاس Person ارث بری نکرده است.class Person {
    String Title;
    String Name;
    Int Age;
    public Person(String title, String name, String age) {
        this.Title = title;
        this.Name = name;
        this.Age = age;
    }
}
class Employee {
    Int Salary;
    private Person person;
    public Employee(Person p, Int salary) {
        this.person = p;
        this.Salary = salary;
    }
}ـ۹۵. تفاوت Encapsulation و Abstraction چیست ؟ـ Abstraction در اصل به نمای خارجی کلاس تمرکز دارد اما Encapsulation از دیدن نمای داخلی کلاس با مخفی سازی اطلاعات جلوگیری می کندـ Abstraction مشکلات طراحی یک کلاس را برطرف می کند در حالی که Encapsulation یک نوع پیاده سازی است.۹۶. تفاوت متد سازنده و دیگر متد ها در چیست ؟متد سازنده بایم همان نام کلاس را داشته باشد و همچنین هیچ نوع خروجی ای نباید داشته باشد.متد سازنده وظیفه ی initiate اجزای کلاس را دارد اما باقی توابع همچین وظایفی ندارند و تنها عضوی از کلاس می باشند.متد های سازنده نمی توانند ارث بری کنند اما اگر کلاس مشتق شده باشد می تواند متد سازنده ابرکلاس خود را فراخوانی کند.سازنده ها می توانند از تابع this استفاده کنند تا به متد های سازنده ی دیگر در همان کلاس دسترسی پیدا کنند.سازنده ها می توانند از تابع super استفاده کنند تا به متد سازنده ابرکلاس خود دسترسی پیدا کنند.متد های غیر سازنده برای فراخوانی نیاز به نمونه ای ( instance ) از کلاس دارند به همین دلیل نمونه ی کلاس باید توسط کلمه کلیدی new ساخته شود.متد های کلاسی‌، متد هایی هستند که به صورت استاتیک تعریف می شوند و برای فراخوانی آن ها نیاز به نمونه گیری از کلاس نیست.۹۷. تفاوت نمونه گیری از یک کلاس و initiate کردن یک کلاس چیست ؟initiate کردن یک کلاس به معنای گرفتن حافظه برای متغیر آن کلاس است. متغیر ها باید مقدار داشته باشند وگرنه سیستم همان مقدار قبلی درون آن قسمت از حافظه را به متغیر می دهد. برای جلوگیری از این مشکل زبان جاوا مقدار پیش فرض متغیر ها را برابر نوع ( type ) اطلاعات قرار می دهد.به روند تخصیص مقدار به یک متغیر از پیش تعریف شده نمونه گیری از یک کلاس می گویند.۹۸. داده ها در جاوا pass by reference هستند یا pass by value ؟خود جاوا همیشه pass by value است.جاوا یک کپی از مقدار متغیر را به تابع می دهد و سپس کار ها روی کپی انجام می شود و هیچ نتیجه ای به متد اصلی اعمال نمی شود.جاوا آدرس همان متغیر را کپی می کند و به تابع می دهد و هنوز پارامتر ورودی یک تابع به همان متغیر اشاره می کند اما تمامی تغییرات در همان تابع باقی می ماند.۹۹. مقادیر ابتدایی در جاوا چیستند ؟مقدار اولیه یک byte برابر 0 می باشدمقدار اولیه یک short برابر 0 می باشدمقدار اولیه یک int برابر 0 می باشدمقدار اولیه یک long برابر 0L می باشدمقدار اولیه یک float برابر 0.0f می باشدمقدار اولیه یک byte برابر 0.0d می باشدمقدار اولیه یک char برابر &#x27;0000\u&#x27; می باشدمقدار اولیه یک String یا هر شئ دیگر برابر null می باشدمقدار اولیه یک boolean برابر false می باشد۱۰۰. تفاوت == و تابع equals در جاوا چیست ؟در اصل == آدرس دو شئ را مقایسه می کند اما تابع equals محتوای دو شئ را مقایسه می کند.به عبارتی دیگر == بررسی می کند که آیا دو شئ به یک مکان از حافظه اشاره می کنند یا نه. اما تابع equals بررسی می کند که آیا مقادیر دو شئ با هم برابر است یا خیرترجمه متنی از Anitaa Murthyتشکر بابت مطالعه پستلایک و حمایت یادتون نرهسوالی بود درخدمتمنوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Thu, 03 Oct 2019 23:07:58 +0330</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت نهم</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D9%86%D9%87%D9%85-klu7bz0rqhjj</link>
                <description>سلام و خسته نباشید خدمت همهقسمت نهم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت های قبلی دسترسی داشته باشید ، امروز میریم سراغ ده سوال بعدی...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اولمجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت چهارممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت پنجممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت ششممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هفتممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هشتم۸۱. چرا متد Main در جاوا static  است ؟این متد استاتیک است تا معلوم بشود کدام متد باید اجرا شود ؛ اگر شما کلمه کلیدی static را استفاده نکنید برنامه شما کامپایل می شود اما با یک ران تایم ارور NoSuchMethodError مواجه می شویدشما می توانید تابع Main را overload کنید اما این تابع توسط سیستم اجرا نمی شود و راه حل این مشکل این است که در تابع Main اصلی تابع overload شده را فراخوانی کنید.برای جلوگیری از ارور NoSuchMethodError می توانید بعد از تابع Main از یک System.exit استفاده کنید.نکته : هر متد استاتیک قبل از متد Main اجرا ( execute ) می شود۸۲ـ Garbage Collector چیست و چگونه کار میکند ؟تمامی اشیائی که در حافظه هیپ جای دارند توسط JVM مدیریت می شوند. تا وقتی از یک آبجکت استفاده کنیم JVM آن را زنده در نظر می گیرد هر موقع از یک آبجکت استفاده نکنیم و دیگر توسط کد ما قابل دسترسی نباشد Garbage Collector آن راه از بین می برد و حافظه اشغال شده توسط آن آبجکت را باز میگرداند.۸۳. تفاوت حافظه heap و stack چیست ؟ـ stack برای تخصیص حافظه static استفاده می شود اما heap برای تخصیص حافظه dynamic استفاده می شود و جایگاه هردو حافظه در RAM است.ما به متغیر هایی که در stack جای دارند مستقیما دسترسی داریم و سرعت استفاده از آن ها بسیار بالا است و این حافظه زمان کامپایل کد به آن ها اختصاص می یابد. وقتی یک تابع ، تابع دیگری را فراخوانی می کند و آن تابع ، تابع دیگری را فراخوانی می کند و... اجرای همه تابع ها متوقف می شود تا وقتی که تابع آخر نتیجه را بازگرداند. حافظه stack یک ترتیب LIFO ( که مخفف Last In First Out است ) را آماده می کند و آخرین بلاکی که وارد حافظه می شود اولین بلاکی است که آزاد می شود و این مورد دنبال کردن فعالیت stack را بسیار ساده می کند. آزادسازی یک بلاک چیزی جز تنظیم یک اشاره گر در حافظه نیست.متغیر هایی که در heap جای دارند جایگاهشان در زمان اجرا تخصیص می یابد و دسترسی حافظه به آن ها  کمی کند تر از stack است اما اندازه حافظه Heap فقط محدود به حافظه ماشین مجازی ما است. المان های درون حافظه Heap هیچ وابستگی ای به هم ندارند و می توانید هر لحظه به هر المان دلخواه دسترسی داشته باشید یک بلاک می تواند هر موقع کار خود را شروع کرده و هر موقع دیگری کار خود را تمام کند و این مورد دنبال کردن فعالیت های بلاک های درون Heap را کمی سخت می کند.شما می توانید اگر اندازه دقیق حافظه مورد نیاز را می دانید و میزان حافظه مورد نیاز شما زیاد نیست از stack استفاده کنید و اگر اندازه دقیق حافظه مورد نیاز را نمی دانید و داده های شما زیاد است باید از Heap استفاده کنید.در فعالیت های multi threading هر Thread حافظه stack مختص خود را دارد اما همه Thread ها heap مشترکی دارند به عبارت دیگر stack حافظه ای خاص هر Thread است و heap حافظه خاص هر اپلیکیشن است حافظه stack باید هنگام رسیدگی به خطا ها و اجرای Thread ها در نظر گرفته شود.طزوقتی یک شئ ساخته می شود از فضای Heap برای ذخیره سازی آن استفاده می شود و مرجع آن در stack ذخیره می شود حافظه stack شامل متغیر های محلی گذرا و مراجع اشیاء درون heap است.اشیاء ذخیره شده درون هیپ همه جا قابل دسترسی هستند اما stack ها فقط در Thread مربوطه خود قابل دسترسی هستند.حافظه هیپ به دسته های &quot; OLD-Generation &quot; و &quot; Young-Generation &quot; و... تقسیم می شود؛ اطلاعات بیش تر در قسمت Garbage Collector جاوا...حافظه stack کوتاه مدت است در صورتی که حافظه Heap از شروع اپلیکیشن یا پایان آن دوام دارد.زمانی که stack پر شود جاوا خطای java.lang.StackOverFlowError را باز میگرداند در صورتی که وقتی حافظه Heap پر شود جاوا خطای java.lang.OutOfMemoryError: Java Heap Space error  را باز می گرداند.۸۳. مفهوم برنامه نویسی شئ گرا را توضیح دهید؟برنامه نویسی شئ گرا یک نوع استایل برنامه نویسی است که مفاهیم کلاس ها ( classes ) ، اشیاء ( Objects ) ، انتزاعی بودن ( Abstraction ) ، کپسولی سازی ( Encapsulation ) و چند ریختی بودن ( Polymorphism ) را در بر دارد۸۴. ارث بری ( inheritance ) چیست ؟ارث بری پروسه ای است که در آن یک کلاس دارای توابع یا آبجکت های یک کلاس دیگر است و به دو جهت از آن استفاده می شود الف) استفاده چند باره از یک کد  ب) انتزاعی کردن کد۸۵. آیا در جاوا می توان از چند جا ارث بری کرد ؟ارث بری چندگاه فقط برای interface ها مورد استفاده است و شما می توانید چند اینترفیس را توسط یک کلاس پیاده سازی کنید اما یک کلاس نمی تواند توسط چند کلاس دیگر مشتق شود.۸۶. کپسولی سازی چیست ؟کپسولی سازی شامل واحد سازی یک کد و داده ها می باشدکپسولی سازی یک تکنیک برای پنهان سازی تنظیمات و رفتار های یک شئ و آماده سازی راه مناسب برای دسترسی به آن ها از بیرون می باشد و از تغییر یا دسترسی به شئ به صورت مستقیم جلوگیری می کند.برای نمونه یک کلاس می تواند با تعریف همه متغیر های درون آن به صورت private و استفاده از getter و setter کپسولی سازی شود۸۷. کلاس Abstract چیست ؟کلاس Abstract نوعی کلاس است که شامل یک یا چند تابع Abstract است. یک تابع Abstract تابعی است که تعریف می شود اما هیچ پیاده سازی ای ندارد.اگر حتی یک متد Abstract باشد کل کلاس Abstract محسوب می شودکلاس های Abstract ممکن است بدون نمونه گیری شوند و برای اجرای متد های Abstract باید از زیرکلاس استفاده شودشما نمی توانید یک کلاس را همزمان هم Abstract و هم final کنیدمتد هایی که Abstract نیستند می توانند به متد های Abstract دسترسی داشته باشند۸۸. اینترفیس ( interface ) چیست ؟اینترفیس تنها شامل تعاریف متد هایی است که یک کلاس باید آن ها را پیاده سازی کنداینترفیس ها نمی توانند final باشند اما متغیر های اینترفیس بیاد یا static یا final باشدنمی توان مستقیما از اینترفیس ها نمونه گیری شودـ Marker Interface : این نوع اینترفیس ها شامل هیچ تعریف توابع نیستند. برای مثال اینترفیس java.io.Serializable یک marker interface است اما استفاده می شود تا مشخص شود کلاس قابلیست serialize شدن را دارد یا نه.۸۹. تفاوت های Abstract Class و interface چیستند ؟اینترفیس ها ارث بری چندگانه را پشتیبانی نمی کنند اما کلاس های Abstract می کنند.اینترفیس شامل عضو داده ای نیست و فقط تابع را دارد اما کلاس های Abstract شامل عضو های داده ای هم هستنداینترفیس ها تابع سازنده ندارند اما کلاس های Abstract تابع سازنده دارنداینترفیس ها تنها شامل اعضای غیر کامل هستند ( فقط signature از اعضا دارد ) اما کلاس های Abstract شامل هر دو اعضای کامل و غیر کامل هستند.در اینترفیس ها شما نمی توانید به صورت پیش فرض از modifier ها بر روی همه چیز استفاده کنید اما در کلاس های Abstract می توانید از modifier ها برای زیر کلاس ها و توابع و... استفاده کنید.عضو یک اینترفیس نمی تواند static باشد اما در کلاس های Abstract تنها اعضای کامل می توانند static باشند۹۰. انتزاعی بودن یعنی چه ؟انتزاعی بودن وقتی اتفاق می افتد که یک شئ دارای چند حالت باشد برای مثال String یک زیرکلاس از Object است.مفهوم انتزاعی بودن خود در جاوا نیز آشکار شده. شما می توانید چندین تابع با یک نام اما با آرگومان های متفاوت داشته باشید ( overload کردن توابع ) و در مواردی می توانید چندین تابع با یک نام و نوع خروجی یکسان داشته باشید ( override کردن توابع ).انتزاعی بودن مشخصه ای است برای تخصیص چندین معنی برای یک شئ برای استفاده های متفاوت و این شئ می تواند متغیر یا تابع یا کلاس باشد...دو نوع انتزاعی بودن داریم :انزاعی بودن compile time : جریان انتزاعی بودن هنگام کامپایل کنترل می شود. مانند overload کردن توابعانتزاعی بودن Run time : توسط ارث بری و اینترفیس ها انجام می شود. کنترل این نوع انتزاعی بودن هنگام اجرا انجام می شود برای مثال Overriding که برای آن در یک زیر کلاس می توانیم تابعی به همان نام در ابرکلاس داشته باشیم.ترجمه متنی از Anitaa Murthyتشکر بابت مطالعه پستلایک و حمایت یادتون نرهسوالی بود درخدمتمنوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Thu, 12 Sep 2019 22:04:25 +0430</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هشتم</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D9%87%D8%B4%D8%AA%D9%85-petjy5zdkwze</link>
                <description>سلام و خسته نباشید خدمت همهقسمت هشتم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت های قبلی دسترسی داشته باشید ، امروز میریم سراغ ده سوال بعدی...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اولمجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت چهارممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت پنجممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت ششممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هفتم ۷۱. چگونه انیمیشن swipe را در اندروید پیاده سازی می کنید؟&lt;set
xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot
android:shareInterpolator=”false”&gt;
&lt;translate android:fromXDelta=”-100%”
android:toXDelta=”0%”
android:fromYDelta=”0%”
android:toYDelta=”0%”
android:duration=”700&amp;quot/&gt;
&lt;/set&gt;۷۲ـ ArrayMap یا HashMap ؟مقاله اول در این موضوعمقاله دوم در این موضوع۷۳. چگونه از نشت حافظه ( memory leak ) جلوگیری کنیم؟این مقاله توضیحات مفصلی در رابطه با این سوال داده است.۷۴.چگونه حجم فایل apk را کم کنیم ؟پروگارد را برای پروژه ی خود فعال کنیدـ shrinkResources را فعال کنیدریسورس های اضافه را با اضافه کردن اسم ریسورس های مورد نیاز به resConfigs از پروژه حذف کنیدتمامی تصاویر را به webp یا vector drawable تبدیل کنید۷۵. کامپوننت های Architecture اندروید را نام ببرید :ـ Roomـ LiveDataـ ViewModelـ Data Bindingـ Lifecycles۷۶.تفاوت معماری های MVC و MVP و MVVM چیست ؟معماری MVC که نام آن مخفف Model-View-Controller است به این صورت است که کلمه Model به فایل های Model داده های شما اشاره می کند View به فایل های XML شما و Controller به فایل هایی که منطق اپلیکیشن شما را پیش می برند اشاره می کند. مشکل این معماری استفاده از unit test ها است Model ها تا زمانی که فعالیتشان به چیز دیگری گره نخورده قابل تست هستند اما فعالیت Controller ها به Api های اندروید گره خورده و این مورد تست آن ها را سخت می کند همچنین انعظاف پذیری و ماژولار کردن اپلیکیشن مشکل دیگر این معماری است چون فعالیت View و Controller به هم گره خورده است. اگر ما View را تغییر دهیم مجبوریم که Controller را نیز تغییر دهیم. همچنین Maintenance نیز مشکل دیگر این معماری می باشد.در معماری MVP که نام آن مخفف Model-View-Presenter است View تمامی فایل های XML و کلاس های اکتیویتی و فرگمنت را شامل می شود و منطق و توابع برنامه در گروه Presenter قرار میگیرند و این مورد باعث راحت تر شدن عمل unit test می شوددر معماری MVVM که نام آن مخفف Model-View-ViewModel است Model شامل کلاس های مدل اپلیکیشن و کلاس هایی که وظیفه ی آن ها دریافت داده هاست می شود و View Model ها وظیفه دریافت این داده ها و آماده سازی آن ها برای استفاده در View ها را دارند.۷۷. قوانین S.O.L.I.D در توسعه نرم افزار چیستند ؟قانون Single Responsibilityقانون Open-Closedقانون Liskov Substitutionقانون Interface Segregationقانون Dependency Inversion۷۸. فرق Throw و Throws در جاوا چیست ؟کلمه کلیدی Throw هنگامی استفاده می شود که ما میخواهیم یک خطا ( Exception ) را از یک متد یا بلاک استاتیک بازگردانیم در صورتی که کلمه کلیدی Throws نشان دهنده خطاهایی است که ممکن است توسط متد بازگردانده شوند.۷۹. راهی برای skip کردن بلاک finally در try/catch وجود دارد‌؟با استفاده از تابع System.exit می توانیم از اجرای بلاک finally جلوگیری کنیم و آن را بگذرانیممتد System.exit می تواند یک خطای امنیتی ( SecurityException ) بازگردانی کند. در JVM اگر متد System.exit بدون وجود خطای امنیتی فراخوانی شود بلاک finally اجرا نخواهد شد اما اگر خطای امنیتی وجود داشته باشد بلاک finally اجرا می شود۸۰. کلاس های ناشناس ( Anonymous ) چیستند ؟کلاس های ناشناس همانطور که از اسم آن ها پیداست کلاس های بدون نامی هستند که فقط یک نمونه از کلاس را می سازند و توابعی از آن را اجرا می کنندقوانین :یک کلاس ناشناس حتما باید یک ابرکلاس ( super class ) یا یک اینترفیس را پیاده سازی کند یا از یک ابرکلاس مشتق شده باشد اما نمی تواند به عنوان مشتق یا ابرکلاس استفاده شودیک کلاس ناشناس حتما باید تمامی توابع abstract درون ابرکلاس یا اینترفیس را پیاده سازی کندیک کلاس ناشناس برای نمونه گیری همیشه از تابع سازنده ابرکلاس خود استفاده می کند.مثال:MyButton.setListener(new Button.Listener {
@override
public void (View view){
//some code
        }
});ترجمه متنی از Anitaa Murthyتشکر بابت مطالعه پستلایک و حمایت یادتون نرهسوالی بود درخدمتمنوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Thu, 12 Sep 2019 19:54:59 +0430</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت هفتم</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D9%87%D9%81%D8%AA%D9%85-aegqi7l5kxb0</link>
                <description>سلام و خسته نباشید خدمت همهقسمت  هفتم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت های قبلی دسترسی داشته باشید ، امروز میریم سراغ ده سوال بعدی...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اولمجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت چهارممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت پنجممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت ششم۶۱. خلاصه ای از روند کار ویو های سفارشی ارائه دهید :ساخت کلاسی که از View ارث بری کرده استساخت فایل res/values/attrs.xml و تعریف خصوصیت هایی که میخواهید همراه ویو سفارشی خود استفاده کنید.اضافه کردن متد های سازنده در کلاس ویو خود و دریافت خصوصیت ها و آماده سازی آبجکت paintـ Override کردن متد های onSizeChanged و onMeasureرسم ویو توسط override کردن متد onDraw۶۲. چند راه برای بهینه سازی استفاده از ویو ها را بیان کنید:بررسی رسم های بیش از اندازه : اپلیکیشن خود را بر روی یک دستگاه اندروید نصب کنید و گزینه debug gpu overview را فعال کنیدویو های خود را به صورت سلسله مراتبی مسطح کنید : با استفاده از ابزار Hierarchy Viewer اندروید استودیو ویو های خود را مسطح کنید زمان رسم هر ویو را اندازه بگیرید ۶۳ـ Bitmap pooling در اندروید چیست ؟یک تکنیک ساده است که توسط آن به جای ساخت بیتمپ های جدید از بیتمپ های سابق دوباره استفاده می کنیم؛ برای این کار ابتدا پشته بررسی می شود و اگر بیتمپی در دسترس نبود یک بیتمپ جدید استفاده می شود و بعد از اتمام کار آن ، در پشته نگهداری می شود.۶۴. چگونه یک Bitmap را در حافظه لود کنیم ؟برای این سوال این مقاله را بخوانید ؛ نمیتونم بهتر این مسئله رو توضیح بدم =((۶۵. سطوح محافظت مجوز ها را بیان کنید : ـNormal : مجوز های کم خطر معمولا در سطح میان اپلیکیشنی هستند که برای محافظت از آن ها سیستم اندروید فقط در هنگام نصب نام آن ها را می نویسد و نیازی به تایید کاربر ندارد.ـDangerous : مجوز های خطرناک معمولا به تاییدیه ( یا هر پیغام دیگری به کاربر ) نیاز دارندـSignature : این مجوز تنها به اپلیکیشن هایی داده می شود که با همان امضایی ساخته شده باشند که اپلیکیشن هدف با آن ساخته شده است. ( نیازی به تاییدیه کاربر ندارد. )ـSignatureOrSystem : این نوع مجوز ها تنها به اپلیکیشن های سیستمی و یا اپلیکیشن های دارای همان امضای اپلیکیشن هدف داده می شود۶۶. خطای Application not responding چیست؟ چگونه از به وجود آمدن این خطا جلوگیری کنیم ؟این خطا هنگامی پیش می آید که رابط کاربری برای حداقل ۵ ثانیه متوقف شود؛ این مشکل معمولا با متوقف کردن Main Thread به وجود می آید و راه جلوگیری از آن پیش بردن فعالیت های Main Thread است.۶۷.کلاس Singleton در اندروید چیست ؟کلاس Singleton کلاسی است که می تواند آبجکتی بسازد که در تمامی دیگر کلاس ها قابل استفاده باشد.۶۸. تفاوت تابع هایی Commit و apply در SharedPrefrences چیست ؟ـCommit : داده ها را به صورت همزمان می نویسد و نتیجه را توسط یک متغیر boolean باز میگرداند.ـApply : به صورت غیر همزمان انجام می شود و هیچ boolean ای باز نمیگرداند؛ اگر یک تابع apply در حال اجرا باشد و یک commit را اجرا کنیم ، تابع commit منتظر می ماند تا کار apply پایان بیابد و بعد از آن شروع به کار میکند.۶۹ـ RecyclerView چگونه کار میکند؟RecyclerView برای نمایش لیست های طولانی طراحی شده است. فرض کنید می خواهید ۱۰۰ آیتم را نمایش بدهید؛ یک راه این است که ۱۰۰ ویو بسازید و آن ها را آماده نمایش بکنید ولی خب راه مناسبی نیست چون در لحظه به عنوان مثال ۱۰ عدد از این ویو ها را بیش تر نمی توانید نشان دهید. پس باقی ویو ها تنها حافظه را اشغال میکنند و پرفورمنس را خراب می کنند. ریسایکلر ویو تنها ۱۰ ویو می سازد و برای باقی ویو هایی که در صفحه نیستند این ویو ها را بازیابی می کند و این کار سرعت و مصرف حافظه را ۱۰ برابر بهبود می سازد.بازیابی ویو ها در متد onBindViewHolder اتفاق می افتد در ابتدا تعدادی ViewHolder استفاده نشده به شما می دهد و شما باید توسط داده هایی این ViewHolder ها را پر کنید و بعد از اسکرول کردن ViewHolder آیتم هایی که دیگر درون صفحه نیستند را به شما می دهد و شما باید داده های آن ها را با داده های جدید جایگزین کنید.۷۰. تفاوت های RecyclerView و ListView چیستند ؟الگو ViewHolder : ریسایکلر ویو از الگو ViewHolder استفاده می کند که در لیست ویو اجباری نیست؛ ریسایکلر ویو هنگام اسکرول سلول ها را بازیابی می کند.الگو ViewHolder چیست ؟ یک آبجکت ViewHolder ویو های کامپوننتی را درون یک لی اوت تگ دار ذخیره می کند و تنها یک بار آن ها را با findViewById فراخوانی می کنیم و در بار های بعد فقط آن ویو ها بازیابی می شوند در حالی که لیست ویو بار ها و بار ها هنگام اسکرول findViewById را تکرار می کند و این عمل سرعت را پایین می آوردـ LayoutManager : در لیست ویو تنها نوع ویو ای که در دسترس است به صورت عمودی است اما ریسایکلر ویو لیست را از container خود ریسایکلر ویو جدا کرده  از این رو شما می توانید آیتم ها را در هنگام اجرا در container های مختلف ( Linear یا grid )  توسط  LayoutManager نمایش دهید ـItem Animator : لیست ویو انیمیشن های زیادی را پشتیبانی نمی کند اما ریسایکلر ویو بعد دیگری را وارد ماجرا کرد...ترجمه متنی از Anitaa Murthyتشکر بابت مطالعه پستلایک و حمایت یادتون نرهسوالی بود درخدمتمنوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Thu, 12 Sep 2019 05:59:02 +0430</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت ششم</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D8%B4%D8%B4%D9%85-uivsby7pmdrq</link>
                <description>سلام و خسته نباشید خدمت همهقسمت ششم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت های قبلی دسترسی داشته باشید ، امروز میریم سراغ ده سوال بعدی...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اولمجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت چهارممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت پنجم ۵۱ـ Loader در اندروید چیست ؟لودر ها در API ورژن ۱۱ توسط گوگل معرفی شدند که وظیفه ی آن ها لود کردن اطلاعات از یک منبع برای نمایش در اکتیویتی یا فرگمنت است. لودر ها نتایج را هنگام تغییرات تنظیماتی کش کرده و آن ها را ذخیره می کند و از استفاده کوئری های تکراری جلوگیری می کند.۵۲. تفاوت Dialog و DialogFragmnet چیست؟DialogFragmnet ها در اصل فرگمنت هایی هستند که شامل یک دیالوگ شناور بالای اکتیویتی هستند و این فرگمنت وضعیت مناسبی را برای نمایش دیالوگ فراهم میکند در صورتی که Dialog ها کاملا به اکتیویتی ها وابسته هستند و در صورتی که اکتیویتی چرخانده شود دیالوگ ها dismiss می شوند اما DialogFragmnet ها  حواسشان به تغییرات تنظیماتی هست.۵۳. تفاوت margin  و padding چیست ؟padding فضا را درون container افزایش می دهد در صورتی که margin فضای بیرون نگهدارنده ( container ) را افزایش می دهد۵۴ـ ViewGroup ها چیستند و چه تفاوتی با View ها دارند ؟View : آبجکت های View اساسی ترین بلاک های رابط کاربری در اندروید هستند. View یک مستطیل ساده است که به اعمال کاربر واکنش نشان می دهد مانند EditText و Button و...مرجع View ها کلاس android.view.View است که اساسی ترین کلاس تمامی المان های رابط کاربری است.ViewGroup : در اصل یک نگهدارنده ( container ) پنهان است که View ها و ViewGroup ها را در خود نگه می دارد برای مثال LinearLayout یک ViewGroup است که می تواند یک button که یک View است را در خود نگهدارد همچنین دیگر لی اوت ها و ... . ViewGroup کلاس اساسی Layout هاست.۵۵. تفاوت فایل تصویری .png ساده و nine-patch چیست ؟فایل های nine-patch بیتمپ هایی با قابلیت تغییر اندازه هستند که به عنوان پس زمینه یا دیگر تصاویر اندروید استفاده می شوند. کلاس nine-patch توانایی رسم بیتمپ ها در ۹ قسمت را دارد. ۴ گوشه تصویر که قابلیت تغییر اندازه ندارند. ۱ قسمت در وسط تصویر که قابلیت تغییر اندازه در راستای دو محور را دارد و همچنین ۴ قسمت وسط اضلاع که قابلیت تغییر اندازه در راستای یک محور را دارد.۵۶.تفاوت Relative Layout و Linear Layout  چیست ؟Linear Layout : المان ها را در یک راستا به صورت عمودی یا افقی در کنار هم میچیند.Relative Layout : المان ها را توسط ارتباطشان به والد یا دیگر المان ها میچیند.۵۷ـ ConstraintLayout چیست؟توسط ConstraintLayout می توانید layout های مسطح و سلسله مراتبی ( نه تو در تو ) را به راحتی پیاده سازی کنید. شباهت بسیاری به RelativeLayout دارد با این تفاوت که در آن ویو ها توسط ارتباطشان با یک دیگر و  layout والد طراحی می شوند همچنین انعطاف پذیر تر از RelativeLayout است و کار با آن توسط ادیتور اندروید استودیو بسیار ساده تر است.۵۸. چه زمانی باید از FrameLayout استفاده کرد ؟FrameLayout به گونه ای طراحی شده که تنها یک شئ را در خود نگهداری کند و گزینه خوبی برای مواقعی است که شما نیاز به نمایش یک ویو دارید ؛ اگر چندین ویو را به صورت متوالی به FrameLayout اضافه کنید آن ها را به صورت پشته مانند بر روی هم نمایش می دهد پس برای زمانی که نیاز به روی هم گذاری ویو ها دارید نیز به کار شما می آید.۵۹ـ Adapter ها چیستند ؟آداپتر ها در اساس وظیفه تبدیل را بر عهده دارند خصوصا در اندروید وظیفه تبدیل هرگونه داده را به View دارند و آن ها را به یک AdapterView پاس می دهند. ( مانند ListView یا RecyclerView )۶۰. چگونه اندازه صفحات مختلف را پشتیبانی کنیم ؟ساخت یک لی اوت انعطاف پذیر : بهترین راه برای ساخت لی اوت های ریسپانسیو استفاده از Constraint layout  به عنوان لی اوت اساسی رابط کاربری است ؛ چون کانسترینت لی اوت ویو ها را توسط ارتباطشان با یک دیگر اندازه دهی می کند می توانید آن ها را جا به جا یا کشیده کنید زمانی که از اندازه صفحات مختلف استفاده می شود.ساخت nine-patch های دارای قابلیت کشیدگیخودداری از hardcode کردن اندازه لی اوت ها : از wrap_content یا match_parent استفاده کنیداز صفت های کوچکترین پهنا ( smallest width qualifier )  استفاده کنید : می توانید یک main_activity بسازید و با استفاده از صفت های کوچکترین پهنا آن را برای محدوده پهناهای مختلف آماده سازی کنید به عنوان مثال : res/layout/main_activity.xml و res/layout-sw600dp/main_activity.xmlترجمه متنی از Anitaa Murthyتشکر بابت مطالعه پستلایک و حمایت یادتون نرهسوالی بود درخدمتمنوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Thu, 12 Sep 2019 04:24:43 +0430</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت پنجم</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D9%BE%D9%86%D8%AC%D9%85-xviyrnq92fhj</link>
                <description>سلام و خسته نباشید خدمت همهقسمت پنجم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت های قبلی دسترسی داشته باشید ، امروز میریم سراغ ده سوال بعدی...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اولمجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت چهارم ۴۱. چرخه حیات فرگمنت را توضیح دهیدon Attach : instance یک فرگمنت به instance اکتیویتی مرتبط است ، معمولا در این متد یک نمونه از اکتیویتی مرجع را برای کار ها اولیه دریافت می کنید.on Create :سیستم این متد را زمانی که فرگمنت ساخته می شود فراخوانی می کند ، شما باید کار های اولیه ای که میخواهید در روند pause و stop و سپس resume نگه داری شوند را در این متد انجام دهیدon CreateView :سیستم این متد را زمانی که میخواهد برای بار اول رابط کاربری را طراحی کند فراخوانی می کند. برای رسم یک رابط کاربری برای فرگمنت خود باید ریشه ( root ) لی اوت خود را به صورت view از این تابع بازگردانی ( return ) کنید. اگر فرگمنت رابط کاربری ای ندارد می توانید null برگردانید.on ActivityCreated :این متد بعد از اجرای متد onCreateView در اکتیویتی مرجع فراخوانی می شود و سلسله مراتب ساخت نمونه از فرگمنت و اکتیویتی اجرا می شود. در این مرحله شما می توانید با استفاده از تابع findViewById به ویو ها دسترسی داشته باشید برای مثال از این مرحله به بعد شما می توانید از آبجکت هایی که نیاز به Context دارند نمونه گیری کنید.on Start :سیستم این متد را زمانی که فرگمنت نمایان ( visible ) می شود فراخوانی می کند.on resume : سیستم این متد را زمانی که فرگمنت فعالیت خود را شروع می کند فراخوانی می کند.on pause : سیستم این متد را دقیقا زمانی که فرگمنت ترک می شود فراخوانی می کند ؛ معمولا این متد جایی است که شما باید کار هایی که باید فراتر از session فعلی کاربر ، فعالیت خود را انجام دهند را ثبت کنید.on Stop : سیستم این متد را زمانی که فرگمنت فعالیتش متوقف می شود فراخوانی می شود.on DestroyView : با فراخوانی این متد ویو فرگمنت نابود می شودon Destory : فراخوانی می شود تا state فرگمنت را به کلی نابود سازد.۴۲. تفاوت اکتیویتی و فرگمنت چیست ؟ ارتباطشان رو توضیح دهید.اکتیویتی یک کامپوننت اندروید است که صفحه ای ارائه می دهد که کاربر می تواند با آن تعامل داشته باشد در حالی که فرگمنت یک بخش یا رفتارهایی از رابط کاربری درون یک اکتیویتی است ( که دارای چرخه حیات خاص و رخداد های ورودی خاص خودش است و می تواند در هر زمان دلخواهی حذف یا اضافه شود.  )۴۳. در چه مواقعی باید استفاده از فرگمنت را به استفاده از اکتیویتی ترجیح دهیم ؟ هنگامی که کامپوننت های در رابط کاربری داریم که باید در چند اکتیویتی استفاده شوند.هنگامی که چندین ویو هستند که باید در کنار هم استفاده شوند ( مانند view pager ها ) هنگامی که داده هایی دارید که باید هنگام restart شدن اکتیویتی ها نگهداری شوند.۴۴.تفاوت replace  و add  کردن فرگمنت در backstack چیست ؟replace : فرگمنت فعلی را حذف می کند و فرگمنت جدید را add می کند ، یعنی اگر شما در فرگمنت جدید دکمه back را فشار دهید در فرگمنت قبلی متد on CreateView دوباره اجرا می شود.Add : فرگمنت فعلی را نگه می دارد و فرگمنت جدیدی اضافه می کند. از این رو هنگامی که دکمه back را فشار می دهید متد on CreateView فرگمنت قبلی دیگر اجرا نخواهد شد.در کل هنگامی که از replace استفاده می کنید متد های چرخه حیات مانند on pause و on resume و on CreateView دوباره اجرا خواهند شد و این عمل در Add اتفاق نمی افتد.۴۵. چرا توصیه می شود که حتما از تابع سازنده پیش فرض فرگمنت استفاده شود؟دلیل اینکه شما باید حتما اطلاعات خود را از طریق bundle به فرگمنت منتقل کنید این است که هنگام تغییرات تنظیماتی ( configuration changes ) سیستم به صورت خودکار bundle شما را بازگردانی می کند این روشی است که شما می توانید وضعیت فرگمنت شما به همان صورت قبلی بازگردانده می شود.۴۶. شما یک فرگمنت را با فرگمنت دیگری replace می کنید. از کجا مطمئن می شوید که با فشردن دکمه back کاربر به سمت فرگمنت قبلی هدایت می شود ؟هرموقع نیاز باشد می توانید Fragment Transaction خود را با فراخوانی تابع addToBackStack قبل از فراخوانی تابع Commit در backstack ذخیره کنیم.۴۷. چه CallBack هایی هنگام add کردن یا pop کردن یک فرگمنت از backstack فراخوانی می شوند؟CallBack هایی که توسط تابع addOnBackStackChangedListener اضافه کردیم فراخوانی می شوند.۴۸. فرگمنت های نگهداری شده چیستند ؟به صورت پیش فرض فرگمنت ها همراه با اکتیویتی مرجع خود نابود و دوباره ساخته می شوند اما ما می توانیم توسط فراخوانی تابع setRetainInstance اجازه ی دور زدن این چرخه نابودی و بازیابی را به سیستم می دهیم و سیستم نمونه ای از وضعیت فعلی فرگمنت در طول این چرخه برای ما نگهداری می کند و همان را دوباره می سازد.۴۹.تفاوت FragmentPagerAdapter و FragmentStatePagerAdapter چیست ؟FragmentPagerAdapter :فرگمنت هر صفحه ای کاربر آن را می بیند در حافظه ذخیره می شود با اینکه ویو نابود می شود. از این رو هنگامی که فرگمنت دوباره نمایان می شود ویو آن دوباره ساخته می شود در صورتی که نمونه فرگمنت ذخیره شده است  و دوباره ساخته نمی شود . این مورد تاثیر به سزایی در میزان حافظه استفاده شده دارد. FragmentPagerAdapter به جای تابع remove ، تابع detach را در هر transaction فراخوانی می کند.FragmentStatePagerAdapter :تمامی نمونه فرگمنت نابود می شود به جز state فرگمنت که در حافظه ذخیره می شود. نتیجه ی این مورد ، تاثیر به سزایی در کم بودن میزان حافظه مورد استفاده است و برای رسیدگی به داده های زیاد می تواند کاربردی باشد همچنین استفاده از آن تاثیری بر پرفورمنس اپلیکیشن ندارد ، حتی اگر تعداد زیادی از فرگمنت ها داشته باشیم.۵۰. پیام Toast در اندروید چیست ؟ Toast در اندروید برای نمایش اطلاعاتی در مدت زمان کوتاه به کاربر استفاده می شود ؛ یک toast شامل یک پیام است که نمایش داده می شود و بعد از چند لحظه ناپدید می شود.ترجمه متنی از Anitaa Murthyتشکر بابت مطالعه پستلایک و حمایت یادتون نرهسوالی بود درخدمتمنوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Wed, 11 Sep 2019 18:53:55 +0430</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت چهارم</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%DA%86%D9%87%D8%A7%D8%B1%D9%85-nty1bfsehlkd</link>
                <description>سلام و خسته نباشید خدمت همهقسمت چهارم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت های قبلی دسترسی داشته باشید ، امروز میریم سراغ ده سوال بعدی...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اولمجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوممجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوم۳۱ـ ThreadPool  چیست؟ آیا استفاده از آن بهتر از استفاده از چند Thread جداگانه است‌؟ساخت و نابودی Thread ها باعث مصرف زیاد CPU می شوند پس وقتی که ما میخواهیم برای چند عملیات کوچک از چند Thread به صورت همزمان استفاده بکنیم بخش زیادی از CPU را درگیر کار میکنیم و این مورد در زمان انجام عملیات ها SEتاثیر به سزایی دارد. ThreadPool متشکل از task queue و چند worker thread است که توانایی اجرای چند عملیات به صورت همزمان را دارند.۳۲. تفاوت Serializable  و Parcelable چیست ؟عمل Serialize کردن به معنی تبدیل یک آبجکت به جریانی از بایت ها جهت ذخیره سازی در حافظه است تا بتوانیم دوباره در زمانی دیگر همان state آبجکت را ساخته و از آن استفاده کنیم.چگونه اجازه ی Serialize شدن یک آبجکت را ندهیم ؟ اگر یک متغیر را به صورت transient تعریف کنیم جلوی serialize شدن آن را می گیریم.Serializable یک interface استاندارد جاوا است؛ در صورتی که Parcelable یک interface مختص اندروید است که برای آن خودتان Serializable را پیاده سازی می کنید. Parcelable ساخته شد تا بهینه تر از Serializable عمل کند ( مشکلی که با این هدف به وجود آمد این است که reflection در آن استفاده شده و این مورد کار را کند می کند. این مکانیزم همچنین باعث ساخت چندین آبجکت موقت می شود که می تواند باعث مشکلات garbage collection نیز بشود. )۳۳. تفاوت Activity  و Service چیست ؟اکتیویتی ها در اصل نگهدارنده یا پنجره ای برای رابط کاربری هستند در صورتی که سرویس کامپوننتی برای اجرای عملیات در پس زمینه می باشد و رابط کاربری ندارد.۳۴. چگونه رابط کاربری یک اکتیویتی را از سرویسی در پس زمینه تغییر دهیم ؟باید یک LocalBroadcastReceiver در اکتیویتی ایجاد کنیم و هنگامی که میخواستیم تغییری در رابط کاربری ایجاد کنیم یک broadcast همراه داده های مورد نیاز توسط intent از سرویس ارسال کنیم. تا زمانی که اکتیویتی در foreground قرار دارد رابط کاربری از طرف پس زمینه تغییر پیدا می کند و باید اطمینان حاصل کنید که broadcast receiver را در متد  اکتیویتی نابود می کنید تا باعث به وجود آمدن نشت حافظه ( memory leaks ) نشوید. همچنین می توانید از Handler ها برای انتقال اطلاعات استفاده بکنید.۳۵ـ Intent چیست؟Intent ها پیام هایی هستند که برای انتقال اطلاعات بین کامپوننت اندروید استفاده می شوند، برای مثال : اجرای یک اکتیویتی یا باز کردن یک وب ویو و...دو نوع intent وجود دارد :Implicit : این نوع اینتنت زمانی استفاده می شود که ما intent پیش فرض اندروید را فراخوانی می کنیم برای مثال : هنگام ارسال sms و ارسال email و شماره گیری.explicit : این نوع اینتنت ها زمانی استفاده می شوند که شما یک اکتیویتی دیگر از همان اپلیکیشن را فراخوانی می کنید.۳۶ـ Sticky Intent ها چیستند ؟Sticky Intent ها توانایی ارتباط بین یک تابع و یک سرویس را به ما می دهند متد sendStickyBroadcast یک sendBroadcast به اصطلاح چسبنده را اجرا می کند. یعنی اینتنتی که ارسال می کند بعد از اینکه کار broadcast تمام شد باقی می ماند که باز هم بتوان داده ها را به سرعت توسط متد registerReceiver دریافت کرد. برای مثال اگر از اینتنت ACTION_BUTTERY_CHANGED جهت گرفتن رخداد های باتری استفاده کنیم هنگامی که از متد registerReceiver استفاده کنید [ حتی اگر مقدار BroadcastReceiver را در متد registerReceiver برابر null قرار دهیم ] ما intent ای را که مربوط به آخرین broadcast آن action است دریافت می کنیم ، اینگونه شما می توانید وضعیت باتری را دریافت کنید ( بدون نیاز به بررسی تمامی حالات باتری در ادامه کار ندارید. )۳۷ـ Pending Intent چیست ؟زمانی که میخواهید از طرف شما یک عملیات intent در آینده صورت بگیرد باید از pending intent استفاده کنید. برای مثال : شما می توانید یک pending intent زمان ساخت نوتیفیکیشن به آن پاس بدهید تا intent ای را در زمان کلیک شدن روی نوتیفیکیشن اجرا کند.۳۸ـ Action چیست ؟توضیحات یک Intent است برای مثال ACTION_CALL برای انجام عملیات تماس استفاده می شود.۳۹ـ Intent Filter ها چیستند ؟نوع مشخصی از Intent ها هستند که اکتیویتی ها یا سرویس ها می توانند به آن ها واکنش نشان دهند۴۰. فرگمنت ها چیستند ؟فرگمنت ها یک بخش دارای رابط کاربری هستند که به اکتیویتی ها متصل می شوند و می تواند دوباره با اتصال به اکتیویتی های دیگر از آن ها استفاده کرد. چندین فرگمنت می توانند همزمان به یک اکتیویتی متصل باشند؛ هر فرگمنت حتما باید به یک اکتیویتی متصل باشد و چرخه حیات آن به اکتیویتی میزبان آن وابسته است.ترجمه متنی از Anitaa Murthyبا تشکر از خانم مبلی بابت طراحی تصویر این پست =)))تشکر بابت مطالعه پستلایک و حمایت یادتون نرهسوالی بود درخدمتمنوشته شده با ❤️ توسط کوچیکتون حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Sat, 07 Sep 2019 02:48:47 +0430</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت سوم</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D8%B3%D9%88%D9%85-k5rafgr34ppn</link>
                <description>سلام و خسته نباشید خدمت همهقسمت سوم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید از طریق لینک های زیر به توضیحات و قسمت اول و دوم دسترسی داشته باشید ، امروز میریم سراغ ده سوال بعدی...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اولمجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوم۲۱. درباره سرویس ها ( Service ) را توضیح دهیدسرویس یک کامپوننت اپلیکیشن های اندروید است که عملیات های طولانی مدت در پس زمینه ( background ) را بد عهده دارد و رابط کاربری ( user interface ) ارائه نمی دهدسرویس می تواند حتی زمانی که کاربر با اپلیکیشن شما تعامل ندارد در پس زمینه اجرا شودسه نوع مختلف سرویس وجود دارد :- Foreground service : این نوع سرویس عملیات هایی را اجرا می کند که مورد توجه کاربر هستند برای مثال می توانیم از این نوع سرویس برای اجرای فایل های صوتی استفاده کنیم ، یک نوتیفیکیشن باید به کاربر نمایش داده شود.- Background service : این نوع سرویس عملیات هایی را اجرا می کند که به صورت مستقیم مورد توجه کاربر نیستند البته محدودیت هایی بعد از ارائه API 26 برای استفاده از این نوع سرویس وجود دارد و توصیه می شود در این موارد از WorkManager استفاده شود.- Bound service : این نوع سرویس وقتی که یک کامپوننت اپلیکیشن اندروید توسط متد bindService آن را فراخوانی می کند شروع به فعالیت می کند. این نوع سرویس یک رابط client-server در اختیار می گذارد که این رابط توسط ارسال request و دریافت result اجازه تعامل  با سرویس را می دهد. این نوع سرویس تنها تا زمانی که کامپوننت به آن متصل است اجرا می شود۲۲. فرق Service و Intent Service چیست ؟سرویس کلاس اساسی سرویس های اندروید است که می تواند به هر نوع سرویسی گسترش پیدا کند. کلاسی که از کلاس service مشتق ( extend ) شده بر روی thread اصلی اجرا می شود به همین علت نباید از این کلاس ها برای کار های طولانی مدت استفاده کرد یا اینکه برای کار های طولانی مدت باید این نوع کلاس ها را در یک thread دیگر اجرا کرد.intent service یک کلاس مشتق شده از service است که درخواست های asynchronous ای که با عنوان intent بیان شده اند را رسیدگی می کند. کلاینت ها با فراخوانی متد startService درخواست خود را بیان می کنند و در صورت لزوم سرویسی شروع به کار می کند ،‌ کار هر intent را در thread سازنده رسیدگی می کند و زمانی که کار سرویس تمام شد آن را متوقف می کند۲۳. فرق AsyncTask ها و Thread ها چیست؟Thread ها برای عملیات های طولانی مدت به صورت جدا از Thread اصلی باید استفاده شوند تا پرفورمنس بهبود یابد اما نمی توانند کارهای مربوط به تنظیمات اندروید را رسیدگی کنند ، شما نمی توانید از درون Thread ها رابط کاربری را تغییر دهیدAsyncTask می توانند برای کار های کوتاه مدت استفاه شوند ، در AsyncTask ها بر خلاف Thread ها شما توانایی تغییر UI را دارید اما انجام کار های طولانی مدت توسط آن ها پرفورمنس را نابود میکنند.۲۴. فرق Service و Intent Service و AsyncTask و Thread ها در چیست ؟Service ها یک کامپوننت اندروید هستند که عملیاتی مانند اجرای موزیک را در پس زمینه اجرا میکنند ، رابط کاربری ندارند . به صورت نامحدود توانایی فعالیت دارند حتی اگر اپلیکیشن بسته ( destroy ) شودAsyncTask ها به شما اجازه می دهند که کار های پس زمینه ای را در UI اجرا کنید. AsyncTask کار هایی که باعث توقف UI می شوند را در پس زمینه انحام می دهد و نتیجه را به Thread رابط کاربری می آورند و دیگر نیازی به  رسیدگی به Thread ها و handler ها را ندارید.IntentService یک کلاس مشتق شده از service است که درخواست های asynchronous ای که با عنوان intent بیان شده اند را رسیدگی می کند. کلاینت ها با فراخوانی متد startService درخواست خود را بیان می کنند و در صورت لزوم سرویسی شروع به کار می کند ،‌ کار هر intent را در thread سازنده رسیدگی می کند و زمانی که کار سرویس تمام شد آن را متوقف می کندThread یک جریان کنترل کارهای پی در پی درون برنامه ای است. Thread ها را می توان ریز پردازش های اجرا شده در دل پردازش اصلی دانست.۲۵. Handler ها چیستند ؟هندلر ها آبجکت هایی برای کنترل Thread ها هستند؛ پیام هایی را دریافت می کنند  و کدهایی برای چگونگی رسیدگی به پیام ها اجرا می کند ، هندلر ها خارج از چرخه حیات اکتیویتی ها اجرا می شوند ، پس نیاز است آن ها را بعد از اتمام کار پاک کرد وگرنه باعث Thread leak می شوند.هندلر ها اجازه ارتباط Thread پس زمینه و Thread اصلی را می دهند.از هندلر ها زمانی که می خواهیم یک کار پس زمینه ای هر x ثانیه تکرار شود هم می توان استفاده کرد.۲۶. Job Scheduling چیست ؟همانطور که از نام آن ها پیداست توانایی برنامه ریزی برای کار ها به صورت بهینه سازی شده نسبت به مموری ، قدرت و شرط های مربوطه را به ما می دهد.هر JobScheduler مجموعه از کار های برنامه ریزی شده را ساپورت می کند و سیستم اندروید می تواند کار ها را به صورتی ترکیب کند تا مصرف باتری کاهش پیدا کند. JobManager کار بارگذاری را توسط هندل کردن بی اعتمادی به network به آسانی انجام می دهد. همچنین اپلیکیشن را از خطر restart شدن نجات می دهد برای مثال :می تواند کار هایی را هنگامی که گوشی به شارژ وصل شد انجام بدهد.می تواند کارهایی که نیاز به اتصال به شبکه یا وای فای دارند را انجام بدهد.می تواند کار هایی که باید به صورت مرتب انجام شوند اما بحرانی نیستند را انجام بدهد.می توانید از این لینک ، مفصل تر راجع به Job Scheduler ها مطالعه کنید.۲۷. رابطه چرخه حیات اکتیویتی و AsyncTask چیست ؟ چه مشکلاتی را پدید می آورد و چگونه می توان جلوی رخداد این مشکلات را گرفت ؟چرخه حیات یک AsyncTask به چرخه حیات اکتیویتی ای که درون آن ساخته شده گرهی نخورده ، برای مثال اگر درون یک اکتیویتی یک AsyncTask را آغاز کنیم و سپس اکتیویتی را بچرخانیم ،‌ اکتیویتی نابود می شود و دوباره ساخته می شود اما AsyncTask به کارش ادامه می دهد و نابود نمی شود تا وقتی که کامل شود.زمانی که کار AsyncTask تمام شد ، نتیجه را به سمت اکتیویتی جدید نمی برد بلکه به سمت instance سابق اکتیویتی ارسال می کند که می تواند باعث خطا شود ( خطای view not attached to window manager if you use ) و راه جلوگیری از این خطا استفاده از findViewById برای بازیابی ویو است.این مورد پتانسیل به وجود آمد خطای نشت حافظه ( memory leak ) را تا زمانی که AsyncTask یک مرجع ( refrence ) از اکتیویتی راه نگهداری می کند به وجود می آورد چون این عمل باعث می شود اکتیویتی عمل garbage collect را تا زمانی که AsyncTask در حال اجراست به درستی انجام ندهد.به همین دلایل استفاده از AsyncTask برای کار های طولانی مدت ایده ی جالبی نیست و برای این نوع اعمال بهتر است از مکانیزم های دیگری (مانند سرویس ها) استفاده کرد.نکته : AsyncTask ها به صورت پیش فرض در یک Thread توسط serial executor انجام می شوند ، یعنی کار ها یکی پس از دیگری درون یک Thread انجام می شوند.۲۸. کار متد onThrimMemory چیست ؟این متد زمانی که سیستم عامل متوجه می شود زمانی مناسب برای تمیز کرد حافظه غیر ضروری درون process فرا رسیده فراخوانی می شود ، برای مثال زمانی که کار ها به پس زمینه منتقل می شوند و حافظه کافی برای کار های پس زمینه وجود ندارد اتفاق می افتداندروید از راه های مختلف حافظه مورد نیاز برای کار های بحرانی را از اپلیکیشن شما باز پس میگیرد [ حتی اگر شده اپلیکیشن شما را به کلی نابود ( kill ) می کند ] . برای کمک به تعادل حافظه سیستم و جلوگیری از نابودی process اپلیکیشن خود می توانید اینترفیس ComponentCallbacks2 را درون کلاس اکتیویتی های خود فراخوانی کنید. فراخوانی تابع onTrimMemory به شما اجازه می دهد رخداد های مرتبط با حافظه را چه در پس زمینه و چه در پیش زمینه شنود کنید و آبجکت هایی را با توجه به چرخه حیات اپلیکیشن یا رخداد هایی سیستمی [ که سیستم بازپس گیری حافظه را برای آن ها نیاز دارد ]  release کنید.۲۹. Android Bound Service :یک نوع سرویس است که اجازه می دهد کامپوننت های دیگر اندروید ( مانند اکتیویتی ) به آن متصل شود و داده ها را ارسال و دریافت کند. نه تنها یک کامپوننت در همان process می تواند به bound service متصل شود بلکه کامپوننت هایی که در proccess های دیگر در حال فعالیتند نیز می توانند به آن متصل شوند و داده ها را دریافت و ارسال کنند.هنگامی که یک bound service را پیاده سازی می کنیم باید آن را از service مشتق سازی کنیم، همچنین باید متد onBind را نیز override کنیم که این متد یک آبجکت را باز میگرداند که IBinder را پیاده سازی ( implement ) می کند که می توانیم از آن برای تعامل با service ها استفاده بکنیم. پیاده سازی Bound Service توسط Android Messenger‌سرویسی که اساس آن Messenger است می تواند با دیگر کامپوننت ها در دیگر process ها ارتباطی تحت عنوان Inter Process Communication و بدون استفاده از AIDL داشته باشدService Handler : این کامپوننت وظیفه رسیدگی به request های ورودی از طرف کلاینت هایی که با سرویس تعامل دارند را بر عهده داردMessenger : این کلاس آبجکتی را می سازد که یک اینترفیس IBinder برای تعامل کلاینت ها و سرویس پیاده سازی می کند.۳۰. تفاوت AIDL و Messenger Queue :Messenger Queue یک صف برای ما می سازد که توسط آن دیتا ها یا پیام هایی را بین دو process متوالی انتقال دهیم اما AIDL این دیتاها یا message ها را به صورت موازی منتقل می کند.AIDL  برای ارتباط داده ای و کنترلی در سطح اپلیکیشن استفاده می شود برای مثال سناریو زیر را در نظر بگیرید : اپلیکیشن درخواست دسترسی به لیست تمامی مخاطبین گوشی را می دهد ( این بخش داده ای است ) و هچنین می خواهد میخواهد مدت زمان تماس را نمایش دهد و هچنین از سمت اپلیکیشن تماس را قطع کند ( این بخش کنترلی است ).در Messenger queue ها شما بیش تر درون اپلیکیشن  هستید  بر روی Thread ها و process هایی کار میکنید که حاوی message هستند بنابراین سرویس های خارجی دخالتی در آن ندارند.هنگامی که از remote service استفاده میکنید به یک Messenger برای bind کردن نیاز دارید ( منظور remote service ای است که در یک process دیگ در حال اجراست )تشکر بابت مطالعه پستترجمه متنی از Anitaa murthyحمایت یادتون نرهسوالی بود درخدمتمکوچیک همه حمیدرضا شجراوی  =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Thu, 05 Sep 2019 13:50:28 +0430</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت دوم</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-csnpamxojnwr</link>
                <description>سلام و خسته نباشید خدمت همه قسمت دوم از مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید رو در پیش داریم که میتونید توضیحات و قسمت اول رو در لینک زیر مطالعه کنید ، امروز میریم سراغ ده سوال بعدی...مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اول۱۱ . در چه مواردی متد onDestroy برای یک اکتیویتی فراخوانی می شود در صورتی که هنوز  و  فراخوانی نشده اند ؟هنگامی که درون متد onCreate متد finish را فراخوانی کنیم سیستم به صورت مستقیم onDestroy را فراخوانی می کند۱۲. چرا باید setContentView در متد onCreate یک کلاس اکتیویتی فراخوانی شود ؟متد onCreate بر خلاف متد های  و  ( که چند بار برای یک اکتیویتی فراخوانی می شوند ) تنها یک بار فراخوانی می شود و بهتر است که متد setContentView ( که عمل سنگینی است ) را در این متد فراخوانی کنیم۱۳. کار onSavedInstanceState و onRestoreInstanceState در اکتیویتی چیست ؟متد onRestoreInstanceState : وقتی که یک اکتیویتی بعد از اینکه بار قبل destroy شده بود دوباره ساخته شود ما میتوانیم وضعیت قبلی اکتیویتی را از bundle ای که سیستم به اکتیویتی پاس می دهد بازیابی کنیم هر دو متد onCreate و onRestoreInstanceState یک bundle را از سیستم تحویل میگیرند اما چون متد onCreate هم زمانی که برای بار اول اکتیویتی ساخته می شود و هم زمانی که اکتیویتی بازسازی ( recreate ) می شود فراخوانی می شود ما برای بازیابی وضعیت اکتیویتی باید حتما null بودن bundle را قبل از استفاده کردن بررسی کنیم زیرا هنگامی که برای بار اول اکتیویتی ساخته می شود اگر bundle ای که به onCreate پاس داده شده بود null بود سیستم یک instance جدید از اکتیویتی می سازد.متد onSavedInstanceState : این متد برای ذخیره داده ها قبل از pause شدن اکتیویتی استفاده می شود۱۴. انواع Lunch mode در اندروید را توضیح دهید : ۱. standard : در این نوع با هر بار فراخوانی یک اکتیویتی یک instance جدید برای اکتیویتی ساخته می شود و ممکن است چندین instance از یک اکتیویتی در task های مختلف یا در همان task ساخته شود مثال :پشته ( stack ) روبرو را برای اکتیویتی ها در نظر بگیرید : ( A -&gt; B -&gt; C )حالا اگر دوباره اکتیویتی B اجرا شود ( با standard lunch mode )پشته اکتیویتی های ما برابر روبرو می شود : ( A -&gt; B -&gt; C -&gt; B )۲. SingleTop : این نوع lunch mode همان نوع standard است با این تفاوت که اگر instance ای از همان اکتیویتی در بالای پشته ( stack ) اکتیویتی های ما قرار داشت دیگر از آن اکتیویتی instance جدیدی نمی سازد بلکه intent ای به همان اکتیویتی که وجود دارد ارسال می کند مثال :فرض کنید پشته اکتیویتی های ما مانند روبرو است : ( A -&gt; B -&gt; C )حالا در این حالت اگر دوباره اکتیویتی C اجرا شود ( با singleTop lunch mode )پشته اکتیویتی های ما برابر روبرو می شود : ( A -&gt; B -&gt; C )۳. SingleTask : همیشه task جدید ساخته می شود و instance جدید به عنوان instance ریشه ای ( root ) به task ای که ساخته شده ارسال می شود یعنی اگر اکتیویتی ای درون task وجود داشته باشد intent به onNewIntent هدایت می شود و در غیر این صورت instance جدیدی از اکتیویتی ساخته می شود . همیشه فقط یک instance از اکتیویتی وجود دارد. مثال :فرض کنید پشته اکتیویتی های ما به صورت روبرو بود : ( A -&gt; B -&gt; C -&gt; D )حالا اگر اکتیویتی D را دوباره اجرا کنیم ( با singleTask lunch mode )پشته ما به صورت روبرو خواهد شد : ( A -&gt; B -&gt; C -&gt; D ) حالا اگر اکتیویتی B را دوباره اجرا کنیم ( با singleTask lunch mode )پشته ما به صورت روبرو خواهد شد : ( A -&gt; B )اکتیویتی های C و D نابود ( destroy ) خواهند شد۴. SingleInstance : در این نوع همیشه تنها یک instance از یک اکتیویتی می تواند درون task وجود داشته باشد و در صورتی که اکتیویتی دوباره اجرا شود instance جدیدی در یک task جدید اجرا خواهد شد ( اگر task ای وجود داشته باشد که دارای instance ای از اکتیویتی ما باشد آن task به بالای پشته task ها آورده شده و اکتیویتی از آن task اجرا می شود ) مثال :فرض کنید پشته اکتیویتی های ما به صورت روبرو است : ( A -&gt; B -&gt; C -&gt; D )حالا اگر اکتیویتی E که lunch mode آن singleInstance است اجرا شود پشته اکتیویتی های ما به صورت زیر خواهد بود :task1 : E( task2 : ( A -&gt; B -&gt; C -&gt; Dببخشید که نتونستم این سوال رو خیلی خوب توضیح بدم و جواب کمی گنگ به نظر می رسه ، میتونید توضیحات خوبی رو توی این لینک بخونید =))۱۵. واکنش اکتیویتی وقتی که کاربر صفحه گوشی را می چرخاند چیست ؟وقتی صفحه چرخانده می شود instance فعلی اکتیویتی نابود شده و یک instance جدید از همان اکتیوتی با جهت ( orientation ) جدید ساخته می شود . هنگامی که چرخش صفحه انجام می شود ابتدا متد onRestart فراخوانی می شود. متد های یک چرخه حیات جدید مانند جریانی ( flow ) که اکتیویتی از اول با آن ساخته شده بود فراخوانی می شوند.۱۶.چگونه از reload شدن داده ها و reset شدن صفحه هنگام چرخش جلوگیری کنیم ؟ساده ترین رویکرد استفاده ترکیبی از ViewModel ها و onSavedInstanceState است.ViewModel ها به اصطلاح lifeCycle-Aware هستند به عبارتی دیگر ViewModel ها هنگامی که صاحب ( owner ) آن ها به دلیل تغییر تنظیمات ( Configuration change ) مانند چرخش صفحه از بین می رود ( destroy می شود ) نابود نمی شوند و فقط instance جدید صاحب آن ها دوباره به ViewModel وصل خواهد شد یعنی اگر شما سه بار در یک اکتیویتی صفحه را بچرخانید تنها سه instance از یک اکتیویتی ساخته اید و فقط یک ViewModel داریدروش معمول استفاده از ViewModel ها برای ذخیره داده ها هنگام تغییر تنظیمات این است که داده ها را درون ViewModel نگهداری کرده و از onSaveInstanceState برای ذخیره داده های کوچک رابط کاربری استفاده کنیممثلا اگر ما یک صفحه جستجو داریم که کاربر یک متن را درون ادیت تکست نوشته است و نتایج جستجو توسط یک ریسایکلر ویو نمایش داده شده است حال اگر صفحه چرخانده شود روش ایده آل جلوگیری از ریست شدن داده این است که مقادیر لیست را درون ViewModel و نوشته ای که کاربر درون ادیت تکست نوشته را توسط onSavedInstanceState ذخیره کنیم ۱۷. دو روش برای پاکسازی پشته اکتیویتی های پیشین هنگامی که اکتیویتی جدید توسط intent فراخوانی می شود را نام ببرید :۱. استفاده از FLAG_ACTIVITY_CLEAR_TOP۲. استفاده از FLAG_ACTIVITY_CLEAR_TASK و FLAG_ACTIVITY_NEW_TASK به صورت پیوسته۱۸. فرق FLAG_ACTIVITY_CLEAR_TOP و FLAG_ACTIVITY_CLEAR_TASK چیست ؟FLAG_ACTIVITY_CLEAR_TASK : این فلگ تمامی اکتیویتی های حاضر در task ( از جمله تمامی instance های کلاسی که فراخوانی شده است ) را پاک می کند و اکتیویتی که اجرا می شود ریشه ( root ) جدید یک task خالی دیگر می شود. این فلگ باید همراه فلگ FLAG_ACTIVITY_NEW_TASK استفاده شودFLAG_ACTIVITY_CLEAR_TOP : بر خلاف فلگ قبلی این فلگ در صورتی که instance ای از آن در لیست task موجود باشد از پاک شدن باقی اکتیویتی ها از لیست task جلوگیری می کند و آن اکتیویتی ریشه لیست task می شود اما اگر instance ای از اکتیویتی که می خواهد فراخوانی شود در لیست task موجود نباشد یک instance جدید از آن اکتیویتی می سازد و آن را ریشه لیست task قرار می دهد . استفاده از FLAG_ACTIVITY_NEW_TASK به صورت پیوسته بعد از آن ، عمل خوبی است هرچند نیازی به آن نیست۱۹. Content provider ها را توضیح دهیدیک ContentProvider داده ها را از یک اپلیکیشن به اپلیکیشنی دیگر ( هنگامی که درخواست شود )  ارائه می دهد ، دسترسی به حالت ساختارمندی از داده را مدیریت می کند و مکانیزمی برای امنیت داده ها ارائه می دهد. ContentProvider یک رابط استاندارد ( standard interface ) است که داده ها را از یک فرایند به کد در حال اجرا در فرایندی دیگر متصل می کند.وقتی که شما به اطلاعاتی از طریق ContentProvider دسترسی پیدا کنید باید از ContentResolver در Context اپلیکیشن خود برای ارتباط با provider به عوان یک client استفاده کنید. provider اطلاعات درخواستی را از client دریافت می کند ، عملیات های درخواستی را انجام می دهد و نتایج را برمیگرداند.۲۰. دسترسی به داده ها توسط Content Provider :ابتدا باید مجوز های مربوط به خواندن اطلاعات را برای اپلیکیشن رو خود گرفته باشید سپس توسط فراخوانی متد getContentResolver بر ابجکت Context به ContentResolver دسترسی پیدا می کنید و داده ها را توسط یک query و متد ContentResolver.query دریافت میکنید.متد ContentResolver.query یک cursor برمیگرداند که می توانید داده های هر ستون را توسط متد های cursor دریافت و از آن ها استفاده کنید.قسمت سوم مجموعه تقلب مصاحبه شغلی برنامه نویس اندرویدترجمه متنی از Anitaa murthyتشکر فراوان بابت مطالعه این قسمتمن متن های زیادی نمی نوشتم ولی خیلی انگیزه ی خوبی برای نوشتن متن های مهم تر و مفید تر پیدا کردم وقتی دیدم این متن برای شما مفید واقع شد ،‌ کلی حرف و متن مفید و کاربردی برای ارائه به شما دارم که همشون رو تک به تک رو میکنم ، تشکر بابت تمام حمایت هاتون و همچنان :حمایت یادتون نره دوستان =))کوچیک شما حمیدرضا شجراوی =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Fri, 30 Aug 2019 09:40:20 +0430</pubDate>
            </item>
                    <item>
                <title>مجموعه تقلب مصاحبه شغلی برنامه نویس اندروید - قسمت اول</title>
                <link>https://virgool.io/MobileLab/%D9%85%D8%AC%D9%85%D9%88%D8%B9%D9%87-%D8%AA%D9%82%D9%84%D8%A8-%D9%85%D8%B5%D8%A7%D8%AD%D8%A8%D9%87-%D8%B4%D8%BA%D9%84%DB%8C-%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%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-iur4pgt6fomp</link>
                <description>سلام و خسته نباشید خدمت همهزیاد حرف نزنم مستقیم برم سر اصل مطلب ‌، ۱۳۲ تا سوال در مورد اندروید هست ( از مبتدی تا پیشرفته ) که تصمیم دارم در ۱۳ پست متوالی راجع به این سوال ها حرف بزنم و هم کمکی به خودم باشه و هم دوستان برنامه نویس اندرویدبریم سراغ سوالات۱. کلاس اپلیکیشن چیست؟کلاس اپلیکیشن پایه ای ترین کلاس در یک برنامه اندروید هست که شامل باقی کامپوننت ها هست مثل اکتیویتی و سرویس ها. این کلاس و هر زیر‌کلاسی (subclass) از کلاس اپلیکیشن قبل از اینکه پروسه کار پکیج شروع بشه صدا زده میشه و اجرا میشه۲ـ Context چیست؟در اصل context یک کنترل کننده یا به نوعی رابط برای سیستم هست و یک سری خدمات به ما ارائه میده ماننده دسترسی به resource ها و دیتابیس ها و prefrences و...ـ Application context :این نوع کانتکست در طول حیات کلاس اپلیکیشن در دسترس شما هست و هنگامی استفاده میشه که شما کانتکستی به غیر از کانتکست lifeCycle فعلیتون بخواهید یا اینکه بخواهید context ای که مربوط به اکتیویتی هست رو به خارج از scope اون پاس بدیدـ‌ Activity Context :این نوع کانتکست در طول حیات یک اکتیویتی در اختیار شما هست و به lifeCycle کلاس اکتیویتی وابسته هست و تنها زمانی باید استفاده بشه که شما context رو در lifeCycle یک اکتیویتی درخواست کنید۳ـ ArmV7 چیست :سه معماری cpu رایج در اندروید وجود داره که ArmV7 بیش تر از باقی مورد استفاده هست و مصرف باتری این معماری بهینه هست. Arm64 نسخه تکامل یافته ای از ArmV7 هست که پردازش ۶۴ بیتی رو هم برای پردازش قدرتمند تر ساپورت میکنه و در نهایت  x86 معماری ای کم استفاده تر از دو معماری باقی هست که رابطه ی خوبی هم با باتری نداره ولی از دو معماری باقی قدرتمند تر هست۴. چرا byteCode ها قابل اجرا روی اندروید نیستند؟چون اندروید از DVM (مخفف Dalvic virtual machine ) به جای JVM ( مخفف Java Virtual Machine ) استفاده میکنه[  از اندروید 5 به بعد ART ( مخفف Android RunTime ) جایگزین DVM شد و مشکلات حل شد  ]۵ـ buildType در gradle چیست و چرا استفاده میشود؟در اصل buildType تنظیمات gradle برای بیلد کردن پروژه اتون رو تعریف میکنه ــ این buildType هست که نوع بیلد شدن یک ماژول رو تعریف میکنه مثلا آیا این ماژول از پروگارد استفاده کرده یا نهــ Product flavour تعیین میکنه که چه ماژولی بیلد خواهد شد مثلا تعیین میکنه که چه resource ای در بیلد استفاده بشهــ گریدل یک build variant میسازه که کارش به وجود اوردن ترکیباتیی از buildType و product flavour در اپلیکیشنتون هست۶.‌ پروسه ی بیلد شدن یک اپلیکیشن اندروید رو توضیح بدید :مرحله ی اول پروسه ی بیلد یک اپلیکیشن اندروید شامل کامپایل کردن پوشه ی res توسط یک ابزار به نام aapt ( مخفف Android asset packaging tool ) هست که کل این پوشه به یک فایل به نام R.java کامپایل میشه ؛ این کلاس فقط شامل مقادیر ثابت هست.مرحله دوم شامل کامپایل کردن سورس جاوا به فایل های class هست که این کار توسط javac انجام میشه و بعد از اون فایل های class به dalvic byteCode با فرمت dx تبدیل میشن که شامل sdk tools هم هستند و خروجی classes.dex هستدر مرحله نهایی هم apkBuilder تمام ورودی ها رو گرفته و فایل apk ( مخفف Android packaging key ) رو تحویل میده۷.معماری یک اپلیکیشن اندروید به چه شکل است ؟معماری اپلیکیشن اندروید دارای کامپوننت های زیر هست :الف. Services : فعالیت های پس زمینه اپلیکیشن رو انجام میدهب. Intent : مسئول برقراری ارتباط داخلی بین اکتیویتی ها و مکانیزم انتقال داده ( data passing mechanism ) هستج. Resource externalization : شامل string ها و گرافیک هستد. Notification : شامل نور (led) ، صدا ، ایکون ، نوتیفیکیشن ، dialog box و توست (toast) هستهـ. Content providers : اطلاعات رو بین اپلیکیشن ها منتشر میکنه ۸. اکتیویتی ها را توضیح دهید :خیلی ساده و مختصر بخوایم بگیم اکتیویتی ها نگهدارنده یا پنجره هایی برای رابطه کاربری هستند۹.زنجیره حیات (lifeCycle) یک اکتیویتی :ـ onCreate : در این متد اولین ویو ها ساخته میشن و جایی هست که ما باید داده ها رو از bundle ها دریافت کنیم و...ـ  on Start : این متد زمانی صدا زده میشه که ویو ها برای کاربر نمایان میشن و با  یا  زنجیره ادامه پیدا میکنهـ on Resume : این متد زمانی صدا زده میشه که اکتیویتی اولین ارتباطش رو با کاربر برقرار میکنه ( اکتیویتی به foreground میاد ) و در این متد دیگه اکتیویتی در صدر پشته ی اکتیویتی ها قرار داره ( top of the activity stack )ـ  on pause : این متد زمانی صدا زده میشه که اکتیویتی به بکگراند منتقل شده ولی هنوز به صورت کامل از بین نرفته ( به اصطلاح kill نشده )ـ  on stop : این متد وقتی صدا زده میشه که اکتیویتی برای کاربر دیگه نمایان (visible) نیستـ onDestroy : این متد زمان پایان اکتیویتی صدا زده میشهـ onRestart : این متد زمانی صدا زده میشه که اکتیویتی متوقف (stop) شده میخواد دوباره start بشه۱۰. فرق onCreate و  on Start چیه؟متد onCreate زمانی اجرا میشه که اکتیویتی میخواد ساخته بشه یا کاملا از بین رفته ( destroy شده ) و میخواد دوباره ساخته بشه اما on Start هرموقع که اکتیویتی برای کاربر نمایان (visible) بشه اجرا میشه و این عمل ممکنه بعد از onCreate یا بعد از onRestart اتفاق بیفتهقسمت دوم مجموعه تقلب مصاحبه شغلی برنامه نویس اندرویدقسمت سوم مجموعه تقلب مصاحبه شغلی برنامه نویس اندرویدتشکر بابت مطالعه پستترجمه متنی از Anitaa murthyحمایت یادتون نرهسوالی بود درخدمتم =)))</description>
                <category>حمید</category>
                <author>حمید</author>
                <pubDate>Mon, 26 Aug 2019 09:24:20 +0430</pubDate>
            </item>
            </channel>
</rss>