<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های masoud</title>
        <link>https://virgool.io/feed/@1masoud1</link>
        <description>linkedin.com/in/masoud-mahmoodzadeh</description>
        <language>fa</language>
        <pubDate>2026-04-15 04:40:22</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/41843/avatar/ckDje3.jpeg?height=120&amp;width=120</url>
            <title>masoud</title>
            <link>https://virgool.io/@1masoud1</link>
        </image>

                    <item>
                <title>مدیریت وابستگی در برنامه نویسی به زبون آدمیزاد</title>
                <link>https://virgool.io/Rocket/dependency-injection-rk6wsy4xepiu</link>
                <description>dependency managementنوشتن همیشه یکی از علایقم بوده و هست و شاید اگر برنامه نویس نمی شدم یا شاید زودتر متوجه علاقه ام به نوشتن می شدم الان نویسنده بودم.البته الان هم در حال نوشتنم با این فرق به جای اینکه واسه آدمها داستان بنویسم واسه موبایل ها برنامه مینویسم. خب سرتون بیشتر از این درد نیارم. تو این مطلب میخوایم با هم دیگه بگردیم دنبال جواب سوالات زیر: مفاهیم Principle و Pattern چیه؟ و فرقشون با هم چیه؟وابستگی چیه؟ چجوری میشه مدیریتش کرد؟اگه وابستگی ها رو مدیریت کنیم چه فایده ای داره ؟ و اگه مدیریت نکنیم چه ضرری داره؟اول از همه بریم با دو مفهوم Principle و Pattern آشنا بشیم:مفهوم Principle به قواعد و دستورالعمل های کلی اشاره میکنه که بهمون کمک میکنه طراحی اصولی و بهینه ای برای نرم افزارمون داشته باشیم. Principle ها چشم انداز هستن و افق و دوردست رو بهمون نشون میدن Principle ها یک یا چند هدف مشخص رو دنبال میکنن Principle ها در مورد اینکه چجوری میشه به اون هدف رسید راهکاری ارائه نمیده و بیشتر شبیه نصیحت هستن نصیحت هایی که اگه بهش عمل کنیم عاقبت به خیر میشیم و اگه رعایت نکنیم دچار خسر الدنیا و الآخرت میشیم.اگه بخوایم چندتا مثال بزنیم میتونیم به SOLID و ِDRY و KISS و YAGNI و ... اشاره کنیم.خب یه سوال؟؟!!اگه Principle ها در مورد نحوه پیاده سازی و رسیدن به هدفش، راهکاری ارائه نمیده پس چجوری باید پیاده سازیش کرد؟اینجاست که Pattern ها به کمکمون میان. Pattern ها در مورد رسیدن به اون هدفی که Principle ازش صحبت میکنه راهکار دقیق و عملی میده. مثال هاش هم میشه همون Design pattern ها معروفی که در موردش میدونین.تو دنیای واقعی چه مثالی میتونیم بزنیم؟فرض بگیریم یه زمینی دارین و میخواین اونجا یه برج بسازین . به تیم مهندسی میگین که میخوام اینجا یه برجی 20 طبقه ساخته بشه، خواسته شما میشه همون هدف Principle و روش هایی و مشاوره هایی که تیم مهندسی بهتون ارائه میده میشه همون Pattern از اونجایی که در برنامه نویسی شی گرا زیاد پیش میاد که کلاس ها با هم در تعامل باشن و بهم نیاز و وابستگی داشته باشن یکی از چالش های مهم برنامه نویس ها، مدیریت این وابستگی هاست. اگه وابستگی ها مدیریت شده نباشه کدهامون دچار درهم تنیدگی و پیچیدگی میشه که باعث میشه کدهای ناخوانا، غیر قابل توسعه و با هزینه بالای نگهداری، داشته باشیم.dependencyچند Principle  و Pattern  هست که بهمون کمک میکنه وابستگی رو مدیریت کنیم:DIP = Dependency Inversion PrincipleIoC = Inversion of Control PrincipleDI = Dependency Injection Patternکه از این جمع DIP  و IoC  میشن Principle و DI میشه Pattern . اسماش سخت به نظر میرسه ولی خیلی مفاهیم سختی نیست.از Dependency Inversion Principle شروع می کنیماین اصل میگه که :ماژول های سطح بالا و ماژول های سطح پایین نباید به هم وابسته باشن بلکه هر دو باید به انتزاعات وابسته باشن و خود انتزاعات نباید درگیر پیاده سازی بشه.احتمالا واست سوال پیش اومده که:ماژول سطح بالا چیه؟ماژول سطح پایین چیه؟انتزاعات چیه؟فرض بگیر در برنامه ات برای فراموشی رمز عبور از سامانه ارسال پیامک استفاده می کنی این سامانه ارسال پیامک یک ماژول سطح پایین هست و بخشی از برنامه ات که از این سامانه پیامکی استفاده می کنه میشه ماژول سطح بالا.ماژول سطح پایین اون بخشیه که زیر ساختیه و بقیه ازش استفاده میکنن و ماژول سطح بالا بخشیه که از ماژول سطح پایین استفاده میکنه.پس تقریبا می تونیم بگیم third party libraryها، دیتابیس، سرویس های خارجی برنامه،همه به نوعی ماژول سطح پایین هستن که زیر ساخت های برنامه رو شامل میشن.میرسیم به انتزاعاتهمون طور که میدونید انتزاعات یا به قول این خارجکی ها Abstraction در کنار Polymorphism و Inheritance و Encapsulation ، مفاهیم بنیادی شی گرایی را تشکیل میدن.انتزاع یک مفهوم کلی هست که وقتی ازش صحبت میکنیم صرفا در مورد ویژگی های کلی اون مفهوم یه چیزهایی میدونیم ولی از جزئیاتش چیزی نمیدونیم.مثلا وقتی از میز صحبت میکنیم میز یک مفهوم انتزاعیه با شنیدن کلمه میز در ذهنت تصویری کلی از یک میز شکل میگیره ولی در مورد جزئیات دقیقش چیزی نمی دونی که میز چوبیه؟ فلزیه؟ شیشه ای؟ پلاستیکه؟ واسه اداره استفاده میشه؟ یا خونه؟ یا مغازه؟ پایه هاش چجوریه؟ کشو داره؟ نداره؟خودمونی بخوام بگم انتزاع معادل تصویره، معادل ذهنیته مثل یک عکس میمونه. وقتی به یک عکس از کوه دماوند نگاه میکنی صرفا داری کلیاتش رو میبینی نمیتونی لمسش کنی نمیتونی بفهمی الان اونجا آب و هواش چجوریه؟با این چیزهایی که گفتم میتونیم چند تا انتزاع دیگه هم مثال بزنیم:اتومبیلخونهمسافرتموبایلنقطه مقابل abstraction مفهوم concrete هست کلمه concrete به معنای بتن هست بتن هم نماد یه جسم سخته پس میتونیم نتیجه بگیریم که concrete به معنای ملموس بودن، واقعی بودن، وجود خارجی داشتن، هست. abstraction کلی هست ولی concrete ملموس، واقعی و شامل جزئیاته.یه بار دیگه تعریف DIP رو با هم بخونیم:ماژول های سطح بالا و ماژول های سطح پایین نباید به هم وابسته باشن بلکه هر دو باید به انتزاعات وابسته باشن و خود انتزاعات نباید درگیر پیاده سازی بشه.الان دیگه احتمالا این مفهوم واست واضح تر شده.توی زندگی روزمره مون از این DIP استفاده می کنیم؟وقتی میخوای گوشیتو شارژ کنی گوشیتو به پریز برق توی دیوار که لحیم نمیکنی!! میای از آداپتور استفاده می کنی. برق توی دیوار میشه ماژول سطح پایین، گوشیت میشه ماژول سطح بالا، آداپتورت هم میشه اون انتزاعی که وابستگی بین برق توی دیوار و گوشی رو مدیریت میکنه.راستی داشت یادم میرفت این اصل همون حرف D از اصول پنج گانه SOLID هست.dependency inversion
خب در امتداد اصل Dependency Inversion میرسیم به یک اصل دیگه که به نام Inversion of Controlکه خلاصه بهش میگن IoC که در فارسی، وارونگی کنترل یا بعضا وارونگی مسئولیت هم بهش میگنمنظور از کنترل چیه؟هر مسئولیتی که این کلاس به غیر از مسئولیت اصلی اش دارهحالا اصل IoC چی میگه؟میگه که هر مسئولیتی که یک کلاس به غیر از مسئولیت اصلی اش داره باید واگذار بشه به یکی کلاس یا ماژول و ... دیگهمثال کلاسیکی که واسه این اصل میزنن اینه که:فرض بگیرین شما میخواین با ماشینت بری سرکار، یه راهش اینه خودت بشینی پشت فرمون و گازش رو بگیری بری شرکت، یه راهش اینه یه راننده داشته باشی اون ببرتت شرکتدر حالت دوم اصل IoC رعایت شده و مسئولیت رانندگی رو به یه نفر دیگه واگذار کردی و خودت میتونی به یه کار دیگه برسیاصل IoC شامل دو روش میشه:کنترل بر جریان برنامه کنترل بر ساخت اشیا وابستهاول کنترل جریان برنامه رو توضیح بدمفرض بگیرین میخوایم یه برنامه تحت دسکتاپ بنویسیم و نام و نام خانوادگی، شماره همراه و رمز عبور از کاربر بگیریم و ثبت نام واسش انجام بدیماگه قرار باشه این اطلاعات رو از کاربر در محیط های CLI مثل Cmd و PowerShell و ... بگیریم تابع main اون برنامه اجرا میشه و به ترتیب اطلاعات رو از کاربر میگیره و در نهایت اطلاعات رو ثبت میکنه و تمامدر این حالت تابع main همه کاره هست و کنترل جریان برنامه دست گرفته و کاربر حق انتخابی که ترتیب پر کردن اطلاعات چجوری باشه نداره.حالا اگر بخوایم اصل IoC را رعایت کنیم چکار باید بکنیم؟باید از GUI یا همون رابط های گرافیکی مثل WinForm و WPF و ... استفاده کنیم در این حالت کنترل اجرای برنامه از طریق GUI مدیریت میشه و کاربر در ترتیب پر شدن اطلاعات نقش داره.خب بریم سراغ کنترل بر ساخت اشیای وابستهگفتیم که در برنامه نویسی شی گرا زیاد پیش میاد که کلاس ها با هم تعامل داشته باشن و به هم نیازمند و وابسته باشن IoC در این مورد تاکید داره که یک کلاس باید روی وظیفه اصلی خودش تمرکز کنه و نباید خودش رو درگیر تامین وابستگی ها کنه این وابستگی ها باید توسط یکی دیگه انجام بشه.خب حالا که فهمیدیم Dependency inversion و Inversion of Control چی هست بریم سراغ پیاده سازی این اصول.روش های مختلفی برای پیاده سازی این اصول هست مثل:Dependency InjectionStrategyService LocatorFactoryدر این مطلب Dependency Injection رو با هم مرور کنیم:پترن Dependency Injection یه روش برای مدیریت و کاهش وابستگی بین کلاس هاست. Dependency Injection از دو کلمه تشکیل شده:Dependency : گفتیم که کلاس ها برای انجام دادن وظیفه ای که دارن با هم تعامل دارن و بهم نیاز دارن این تعاملات و نیازمندی ها رو بهش میگیم DependencyInjection : یه روش واسه فراهم کردن و تامین کردن وابستگی های یه کلاس.وقتی کلاس A به کلاس B نیاز داره و بهش وابسته هست پس باید به آبجکتی از کلاس B دسترسی داشته باشه. یه راهش اینه داخل کلاس A خودش یه آبجکت از کلاس B بسازه و ازش استفاده کنه و یه راهش اینه که آبجکت B بیرون از کلاس A ساخته بشه و به کلاس A داده بشه.روش اول باعث میشه دو کلاس خیلی چفت و محکم بهم وابسته باشن و بعدها واسمون مشکل ساز بشهولی روش دوم که میشه همون تزریق وابستگی یا Dependency injection باعث میشه وابستگی بین دو کلاس کمتر و بهینه تر باشه.با تزریق وابستگی کلاس A روی وظیفه اصلی خودش تمرکز داره و وظیفه ساخته شدن و تامین کلاس B رو به یه کلاس دیگه واگذار میکنه و این همون چیزیه که IoC بهش تاکید داره.از سه روش میتونیم تزریق وابستگی رو انجام بدیم:Constructor injectionSetter injection (property injection)Method injection (Interface injection)روش اول از طریق  Constructor وابستگی بهش داده میشه:Constructor injectionروش دوم از طریق Setter method  وابستگی بهش تزریق میشه:Setter method injection روش سوم یه اینترفیس رو از طریق یه تابع بهش تزریق میکنه:Method injection فرض بگیرین قراره یه نرم افزار برای مدیریت یه کافی شاپ داشته باشیمکافی شاپ انواع مختلفی از نوشیدنی ها رو ارائه میده و آماده شدن هر نوشیدنی روش خاص خودشو داره پس برای هر نوشیدنی یک کلاس مجزا مینویسیم همه این نوشیدنی ها یه اینترفیس IDrink داره که آماده شدن نوشیدنی رو پیاده سازی میکنه.کلاس CoffeeShop باید بتونه هر نوع نوشیدنی رو آماده کنه پس نباید به یک نوع خاص از نوشیدنی وابسته باشه و به همین دلیله که ورودی متد prepareDrink یه IDrink دریافت میکنه و اینجوری میشه هر نوعی از نوشیدنی رو به کلاس CoffeeShop تزریق کرد.اگه دقت کرده باشین کلاس CoffeeShop یک ماژول سطح بالا هست و کلاس های Espresso  و HotChocolate ماژول های سطح پایین هستن که هر کدومشون به یه انتزاعی وابسته هستن پس میتونیم نتیجه بگیریم که اصل Dependency inversion  رو در این مثال رعایت کردیم.کلاس CoffeeShop  عمل آماده شدن نوشیدنی رو هم به کلاس همون نوشیدنی واگذار کرده پس میتونیم نتیجه بگیریم که اصل Inversion of Control هم در این مثال رعایت کردیم.و به نظرم میتونیم نتیجه بگیریم که interface injection  روشی برای تزریق یه رفتار به یه کلاس هست.یه مفهوم دیگه هم هست به نام IoC Containerاین IoC Container فریمورکی برای مدیریت Dependency injection هست با IoC Container میشه تنظیماتی انجام داد که وقتی برنامه به یه نوع خاصی از Interface نیاز داشت کلاس مشخصی بهش داده بشه. برای اندروید از Dagger و Hiltو Koin استفاده میشه و شنیدم که میگن برای .NET از Autofac  و Ninject  و StructureMap  استفاده میشه.خب پس متوجه شدیم: مفاهیم principle و pattern چی هست و فرقشون با هم چیهوابستگی ها رو فهمیدم چیه؟ و با دو تا اصل در مورد وابستگی ها آشنا شدیمتزریق وابستگی رو متوجه شدیم چیه و چجوری میشه پیاده سازی اش کردو فهمیدیم IoC Container  چیهprinciple and design pattern and frameworkممنون که این مطلب رو خوندین و اگه نکته ای، انتقادی، پیشنهادی هست خوشحال میشم بدونم.</description>
                <category>masoud</category>
                <author>masoud</author>
                <pubDate>Sat, 30 Apr 2022 22:46:55 +0430</pubDate>
            </item>
                    <item>
                <title>معنا در زندگی</title>
                <link>https://virgool.io/@1masoud1/%D9%85%D8%B9%D9%86%D8%A7%DB%8C-%D8%B2%D9%86%D8%AF%DA%AF%DB%8C-jujs35chzxet</link>
                <description>وقتی کم سن و سال تر هستیم، به موفقیت فکر میکنیم، به دستاورد داشتن فکر میکنیم، به مدرک تحصیلی، شغل، درآمد، مهاجرت و ... فکر میکنیم، بیشتر دنبال «پیشرفت» هستیم، دنبال «تغییر» هستیم، دنبال «ساختن» هستیم که نه تنها بد نیست که اتفاقا لازم هم هست. ولی چند سالی که میگذره حس میکنیم که موفقیت و پیشرفت و دستاورد داشتن اگر چه لازمه ولی کافی نیست.این روزا که یک ماهی از 28 ساله شدنم میگذره و تا حدودی از هیجانات سال های گذشته ام کم شده، بیشتر و جدی تر به زندگی فکر میکنم. به سختی هاش فکر میکنم، به کارهایی که انجام دادم، به کارهایی که انجام ندادم، به خاطره هایی که تجربه کردم، به آدمهایی که باهاشون در ارتباط بودم، به آدمهایی که باهاشون در ارتباط هستم، به داشته هام، به نداشته هام،  به اینکه چقدر از این راهی که تا الان اومدم راضی ام، به اینکه میخوام ادامه راه رو چجوری برم، به اینکه چه چیزهایی باید واسه ادامه زندگی بلد باشم.وقتی به زندگی فکر میکنی، نمیشه به سخت بودن زندگی فکر نکنی. سختی هایی که هممون به شکلی با همه وجود حسش میکنیم. گرونی، اجاره نشینی، بیکاری، بی پولی، بیماری، ازدواج، تربیت فرزند، طلاق، مرگ عزیزان، درک نشدن از طرف اطرافیان و کلی مورد دیگه که باعث میشه زندگی برامون سخت و تلخ و شاید عذاب آور بشه.با خودم فکر میکنم وسط این همه مشکلات و گرفتاری چجوری میشه از زندگی کردن ناامید نشد؟ اصلا به چی باید امید داشت؟ چی میشه که بعضی آدمها با اینکه داشته های زیادی دارن احساس خوشبختی نمیکنن؟ چی میشه که بعضی آدمها با وجود اینکه زندگی سختی دارن ولی احساس بدبختی نمیکنن؟ چی میتونه تحمل سختی ها رو واسه آدمها قابل تحمل کنه؟ وسط این همه سختی و اتفاقات تلخی که این روزها میشنویم و میبینیم فکر کردن و نوشتن و پرسیدن و کتاب خوندن چه اهمیتی داره؟یک روز که از سرکار برمیگشتم تو ایستگاه مترو، یک غرفه کتابفروشی دیدم و به رسم عادت رفتم که نگاهی به کتابهاش بندازم. تعداد زیادی از کتابها با موضوعیت موفقیت و پولدار شدن و ... بود که حس خوبی نسبت به اینجور کتابها ندارم. به نظرم با صحبت از کائنات، انرژی مثبت و مثبت اندیشی و... زندگی آدم ها تغییر به خصوصی نمیکنه. اینجور کتابها بدون اینکه محدودیت آدمها رو در نظر بگیرن، بدون اینکه تاثیرات خانواده، جامعه و حکومت و سیاست و خیلی چیزهای دیگه رو در نظر بگیرن، فقط میخوان بگن تلاش کن، رویا داشته باش، تو میتونی، تو موفق میشی. اینجور کتاب ها به جای آگاهی فقط هیجان تزریق میکنن، هیجانی که تهش سرخوردگی میاره و زود هم فروکش میکنه.لابلای کتاب ها، یک کتابی دیدم که عنوانش واسم جالب بود، قبلا تعریفشو زیاد شنیده بودم، یکی دو صفحه ازش خوندم و ازش خوشم اومد و خریدمش. نویسنده بدون اینکه بخواد ترحم مخاطب رو برانگیخته کنه از تجربیاتش، از سختی هایی که تحمل کرده، از رنج از دست دادن عزیزانش، از تجربه شکنجه، سختی اسارت و کشته شدن دوستان و اطرافیانش میگه.وقتی که داشتم کتاب رو میخوندم، خودمو در اون موقعیت ها تجسم میکردم و از خودم میپرسیدم اگه این اتفاقات و این سختی ها واسه من پیش میومد من چه حسی داشتم؟ چه عکس العملی نشون میدادم؟ ناامید میشدم؟ همین الان چه حسی نسبت به زندگی دارم؟ همین الان چجوری با مشکلاتم مواجه میشم؟از لابلای مطالب همین کتاب متوجه شدم آدما بیشتر از چیزی که فکر میکنن قوی هستن، قدرتی که خودشون میسازن و با تکیه بر همین قدرت میتونن مشکلات رو حل کنن و یا اگه قابل حل شدن نیست، باهاش کنار بیان و هضم کنن و اسم این قدرت «معنا» هست.انسان در جستجوی معنامعنا یک جمله مشخص نیست، یک کار مشخص نیست معنا، داشتن دلیل و چرایی زندگی هست. برای اینکه بتونیم سختی ها رو تحمل کنیم، حل کنیم یا باهاش کنار بیایم، باید یک دلیل، باور، لنگر، تکیه گاه تو زندگیمون داشته باشیم.معنا همون لنگر و تکیه گاهی هست که در سختی ها بهمون آرامش میده، معناست که باعث میشه در موقعیت های سخت زندگی، وقتی هیچ کاری ازمون برنمیاد، وقتی هیچ کسی نمیتونه یا نمیخواد کمکمون کنه، وقتی به بن بست میخوریم، وقتی ورشکست میشیم، وقتی عزیزی رو از دست میدیم، وقتی به بیماری دچار میشیم، وقتی رابطه عاطفی مون بهم میخوره، ناامید نشیم و به خودمون و بقیه ضربه نزنیم.معنا الزاما باعث نمیشه مشکلاتمون حل بشه، باعث نمیشه خوشبخت تر باشیم، باعث نمیشه گرفتاری هامون حل بشه ولی بهمون انرژی و انگیزه میده که به تلاش کردن ادامه بدیم، باعث میشه حالمون بهتر بشه، باعث میشه دچار روزمرگی نشیم، افسرده نشیم، معنا باعث میشه یک حس رضایت درونی رو تجربه کنیم. باعث میشه زندگی نزیسته کمتری داشته باشیم.آدمی که با معنا زندگی میکنه، با خودش قهر نیست، با دنیا و با آدمهاش قهر نیست، از دنیا و آدمهاش طلبکار نیست، دنبال مقصر نیست، از زندگی کردن اجتناب نمیکنه، انسان با معنا یاد گرفته با اینکه خودش زخم خورده هست ولی به روح و تن کسی زخم نزنه. این آدم میدونه که محدودیت هایی داره، میدونه که قدرت مطلق نیست ولی ضعیف و درمانده هم نیست، این آدم یاد گرفته تلاش کنه زخم هاشو التیام بده، یاد گرفته منفعل نباشه و به اندازه توانش، کاری که از دستش بر میاد رو انجام بده. این آدم یاد گرفته فقط روی نداشته هاش تمرکز نکنه بلکه داشته هاش هم ببینه. این آدم یاد گرفته به همون اندازه که نمیتونه کارهایی که دوست داره رو انجام بده ولی کارهای دیگه هست که هنوز میتونه انجام بده. آدم با معنا زندگی رو زندگی میکنه.هر کسی لنگر زندگیش رو یه جور میسازه، یکی از دین کمک میگیره، یکی از روانشناسی، یکی از فلسفه، یکی از ادبیات، یکی از هنر، یکی از اشعار مولانا و یا هر چیز دیگه ای. خیلی نمیشه بین اینا خط کشی کرد و تمایز خاصی قائل شد، نمیشه گفت کدوم یکی بهتره، همشون به شکل های مختلفی سعی دارن بهمون یادآوری کنن که با ارزش و محترمیم، سعی دارن به ما کمک کنن که بهتر زندگی کنیم، با معنا زندگی کنیم و دنیای بهتری برای خودمون و اطرافیانمون بسازیم و چه خوب که خودمونو فقط به یکی از این ابزارها محدود نکنیم و به اندازه توانمون سعی کنیم از همشون کمک بگیرم و صد البته به لنگر بقیه هم احترام بذاریم.یکی از بهترین فیلم هایی که تو زندگیم دیدم و خیلی به دلم نشست فیلم «خیلی دور خیلی نزدیک» ساخته «رضا میرکریمی»هست. یک فیلم تاثیرگذار، با موسیقی دل انگیز «محمد رضا علیقلی» با تصاویری زیبا از طبیعت، صحرا و بیابان خیلی زیبا و شاعرانه که در قالب رابطه پدر و پسری ، «معنا» را به تصویر کشیده.فیلم خیلی خوب و جهان شمولی شده که داستانش میتونه در هر کشوری و در هر جایی از کره زمین اتفاق بیوفته و صرفا مختص ایران نیست. در این فیلم داستان زندگی مردی رو به تصویر میکشه که قدم در مسیری میذاره که هر چه جلوتر میره، هر چی بیشتر تنها میشه، بیشتر میفهمه که کلی زندگی نزیسته، آغوش در برنگرفته، عشق ابراز نشده، داشته و خودش رو پشت نقاب ثروت و موقعیت اجتماعی و امکانات پنهان کرده و وقتی درگیر طوفان زندگی میشه نمیدونه چجوری باید از اون شرایط سخت رها بشه و خودش رو میبازه.خیلی دور خیلی نزدیکاینکه چقدر به خودمون نزدیکیم و یا از خودمون دوریم بستگی به این داره که الان کجای زندگی وایستادیم و داریم چجوری زندگی میکنیم، اگه زندگی رو صرفا در پول و ثروت و پیشرفت و لذت و موقعیت اجتماعی خلاصه کنیم و از جنبه های دیگه زندگیمون غافل بشیم داریم از خودمون دور میشیم. پول و ثروت و مادیات نه تنها بد نیست که لازم هم هست ولی در کنار اینا، معنا داشتن ، لنگر داشتن هم مهمه.فیلم «طعم گیلاس» ساخته عباس کیارستمی و فیلم «جهان با من برقص» سروش صحت هم فیلم های زیبایی هستن در این فیلم ها اهمیت زندگی، رنج، معنا و مرگ رو به خوبی به تصویر کشیده شده است.طعم گیلاسجهان با من برقصهوشنگ ابتهاج :زندگی زیباست، ای زیبا پسند  زنده اندیشان به زیبایی رسندکتاب انسان در جستجوی معنا: اگر زندگی رنج بردن است ، پس برای زنده ماندن باید ناگزیر معنایی در رنج بردن یافت. اگر اصلا زندگی خود هدفی داشته باشد، رنج و مرگ نیز معنا خواهد یافت. اما هیچ کس نمی تواند این معنا را برای دیگری بیابد. هر کس باید معنای زندگی خود را جستجو کند و مسئولیت آن را نیز پذیرا باشد.نیچه :انسانی که چرایی زندگیش را یافته باشد با هر چگونگی خواهد ساخت.یونگ:رنج نباید تو را غمگین کند، این همان جایی است که اغلب اشتباه میکنند، رنج قرار است تو را هشیارتر کند، چون انسان ها زمانی هشیارتر می شوند که زخمی شوند. رنج نباید بیچارگی را بیشتر کند رنجت را تحمل نکن، رنجت را درک کن. این فرصتی است برای بیداری، وقتی آگاه شوی بیچارگی ات تمام می شود. اگر به جای محبتی که به کسی کردید از او بی مهری دیده اید، مایوس نشوید، چون برگشت آن محبت را از شخص دیگری، در زمان دیگری، در رابطه با موضوع دیگری خواهید گرفت.نادر ابراهیمی: من هرگز نمیگویم در هیچ لحظه ای از این سفر دشوار، گرفتار ناامیدی نباید شد، من میگویم : به امید بازگردیم، قبل از اینکه ناامیدی، نابودمان کند.نوشته های دکتر مجتبی شکوری در مورد معنا و زندگی رو از دست ندین خیلی مطالبشون خوبه: https://vrgl.ir/oHioR نظر شما در مورد معنا در زندگی چیه؟ خوشحال میشم نظرتون رو بدونممعنا در زندگی</description>
                <category>masoud</category>
                <author>masoud</author>
                <pubDate>Sat, 08 Aug 2020 18:06:23 +0430</pubDate>
            </item>
                    <item>
                <title>آشنایی با LiveData در برنامه نویسی اندروید</title>
                <link>https://virgool.io/devAndroid/livedata-android-vcmueqi8xyqr</link>
                <description>آشنایی با LiveData در برنامه نویسی اندرویدیکی از چالش هایی که در برنامه نویسی به آن برمیخوریم بروز رسانی View متناسب با تغییرات object می باشد.فرض کنید یک دکمه Follow دارید که بعد از اینکه کاربر آن را لمس کرد رنگ و برچسب آن تغییر میکند و به تعداد Follower ها یکی اضافه می شود.برای حل این چالش راه های مختلفی در اندروید هست:چک کردن عادی یک متغیر boolean و تغییر عنوان و رنگ دکمهاستفاده از interface استفاده از Event busاستفاده از LiveDataدر این مطلب قصد دارم مروری بر LiveData در برنامه نویسی اندروید داشته باشم .  LiveData از مباحث مهم Android Architecture Components می باشد. LiveData میتواند تغییرات را رصد کند و تأثیر این تغییرات بر object ها را مدیریت و بروزرسانی کند. LiveData  ساختاری شبیه به observable دارد با این تفاوت که از lifecycle-aware تبعیت میکند. با استفاده از LiveData دیگر نگران memory leak نباشید چون وقتی اکتیویتی در وضعیت STARTED یا RESUMED قرار بگیرد  LiveData فعال است و وقتی اکتیویتی در وضعیت DESTROYED قرار بگیرد LiveData و object متناظر آن غیر فعال شده و از وقوع memoy leak جلوگیری می شود. از LiveData در معماری MVVM نیز استفاده می شود . ViewModel پل ارتباطی بین View و Model می باشد و LiveData پل ارتباطی بین ViewModel و View می باشد که برای این کار از Observer Pattern که یکی از دیزاین پترن های معروف است استفاده میکند.در واقع LiveData ابزاری برای ارتباط و مدیریت بهتر بین مشاهده کننده  (Observer)  و object یا همان Observable می باشد. به عبارت دیگر نگاه Observer به Observable می باشد تا در صورت تغییر در Observable خودش را به آن وفق دهد. مثال بالا را در نظر بگیرید:در این مثال یک  FollowStatus داریم که شامل خصوصیت های زیر می باشد : state backgroundlabelcountFollowers در واقع FollowStatus همان Observable هست که توسط Observer که همان دکمه باشد مشاهده می شود .یک LiveData از جنس FollowStatus تعریف میکنیم و در  دکمه با توجه به وضعیت فعلی و با دستور setValue مقدار FollowStatus را به LiveData پاس میدهیم.میتوانیم از دستور postValue هم استفاده کنیم که فرق آن با setValue در این است که setValue در main Thread اتفاق می افتد ولی postValue در background Thread.حال باید دستور observe برای LiveData فراخوانی کنیم تا در صورت تغییر , بروز رسانی وضعیت دکمه رو انجام دهد.نمونه کد زیر را مشاهده کنید:public class TestActivity extends AppCompatActivity 
{   
        private Button btn_follow;    
        private TextView tv_countFollowers;    
        private WebService webService;
        private MutableLiveData&lt;FollowStatus&gt; liv_follow = new MutableLiveData&lt;&gt;();
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) 
        {                                        
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_test);
                webService = callWebService();
                btn_follow = findViewById(R.id.btn_follow);
                tv_countFollowers = findViewById(R.id.tv_countFollowers);
                btn_follow.setListener(new View.Listener()
                 {
                        @Override
                        public void (View v) 
                        {
                                  boolean isFollow = webService.isFollow();
                                  int numberOfFollowers = webService.getCountFollowers();
                                  if (isFollow)  {
                                     // unfollow
                                    FollowStatus unFollowModel =
                                    getUnFollowModel(numberOfFollowers);
                                    liv_follow.setValue(unFollowModel);
                                    } else  {
                                     // follow
                                      FollowStatus followModel = getFollowModel(numberOfFollowers);
                                      liv_follow.setValue(followModel);
                                     }
                       }
          });
          setObservers();
  }
  private FollowStatus getUnFollowModel(int countFollowers) 
  {
  return new FollowStatus(false, R.drawable.ic_circle_unselect, &amp;quotUnFollow&amp;quot, countFollowers - 1);
   }
   private FollowStatus getFollowModel(int countFollowers) 
   {
 return new FollowStatus(true, R.drawable.ic_circle_unselect, &amp;quotFollow&amp;quot, countFollowers + 1);
   }
   private void setObservers() {
             liv_follow.observe(this, new Observer&lt;FollowStatus&gt;(){
                @Override
                 public void d(FollowStatus followStatus)  {
                             btn_follow.setText(followStatus.getLabel());
                              btn_follow.setBackgroundColor(followStatus.getBackground());                                                                       tv_countFollowers.setText(String.valueOf(followStatus.getCountFollowers()));
                                 }
               });
    }
    private WebService callWebService() {
              return new WebService();
       }
}چه تفاوتی بین MutableLiveData و MediatorLiveData هست؟کلاس LiveData جزو کلاس های پایه ای هست و معمولا برای کار با LiveData از فرزندان آن یعنی MutableLiveData و MediatorLiveData استفاده می شود.کلاس MediatorLiveData از MutableLiveData ارث بری میکند و MutableLiveData از LiveData ارث بری میکند پس میتوانیم نتیجه بگیریم که MediatorLiveData خصوصیات MutableLiveData و LiveData را دارد.از MutableLiveData  همچون مثال بالا برای مشاهده و آپدیت ویو ... استفاده می شود.ولی از MediatorLiveData به عنوان واسطه ای بین دو یا چند LiveData استفاده می شود و میتوان با کمک آن ، مقادیر بین دو یا چند LiveData را با یکدیگر ادغام (merge) کرد و یا مقادیر هر کدام از LiveData ها را به یک View واحد نسبت داد.فرض بگیرید 2 فرگمنت دارید که در هر کدام یک SeekBar در حال نمایش است اگر بخواهیم مقادیر این دو SeekBar با یکدیگر هماهنگ باشد از MediatorLiveData استفاده میکنیم. سورس کد زیر را مشاهده کنید: https://github.com/masoudmahmoodzadeh/MediatorLiveData-Example سایر مطالب بنده:آشنایی با Context در اندرویدچرخه حیات به سبک Lifecycle Aware در اندرویدچرخه حیات فرگمنت ها در اندرویدچرخه حیات اکتیویتی ها در اندرویدمعرفی کتاب نوسازی </description>
                <category>masoud</category>
                <author>masoud</author>
                <pubDate>Wed, 30 Oct 2019 21:03:47 +0330</pubDate>
            </item>
                    <item>
                <title>آشنایی با Context در اندروید</title>
                <link>https://virgool.io/coderlife/context-android-hi1yarsqjs34</link>
                <description>آشنایی با Context در اندرویدمیتوان گفت Context بیشترین موضوعی هست که در برنامه نویسی اندروید با آن سروکار داریم و تقریبا در هر بخشی از برنامه نویسی اندروید باید از آن استفاده کنیم که همین موضوع باعث میشود نحوه استفاده از آن بیش از پیش مهم باشد.اگر بخواهیم Context را تعریف کنیم میتوانیم بگوییم Context ، پی و فوندانسیون برنامه های اندرویدی است. Context وضعیت برنامه را شرح میدهد و با استفاده از آن می توان وضعیت برنامه را کنترل کرد و تغییر داد.همچنین از Context در اکتیویتی ها، سرویس ها، broadCast reciever، فراخوانی intent، دیتابیس، SharedPreference، ساخت ویوها و ... استفاده می شود.استفاده اشتباه از Context می تواند منجر به اشغال منابع سیستمی، کند شدن برنامه و در نهایت تجربه ای تلخ برای کاربر را در پی داشته باشد.به صورت کلی Context ها را بر اساس  نوع استفاده آنها ، تقسیم بندی می شوند:UI Context Non-UI Contextانواع Contextنوع UI Context  در جاهایی استفاده می شود که با UI سروکار داریم مانند :اکتیویتی ها دستور YourActivity.this در اکتیویتی هادستور getContext در فرگمنت ها اگر view با UI Context ساخته شده باشد دستور view.getContext نیز UI Context برمیگرداند در غیر این صورت Non-UI Context برمیگرداند.نوع Non-UI Context : هر Context که از نوع UI Context نباشد Non-UI Context میباشد . Non-UI Context میتوانند هر کاری که UI Context ها انجام میدهند ، انجام دهد ولی این عمل توصیه نمی شود.دستورات زیر از نوع Non-UI Context میباشد:دستور getApplicationContext در اکتیویتی ها و broadCast ها و سرویس ها مقدار دریافتی Context در سرویس ها و broadcast هاهر شی از جنس سرویس هاچند نکته مهم:- نوع UI Context برای عملیات های کوتاه مدت و Non-UI Context برای عملیات های طولانی مدت است و نباید از آن ها به جای یکدیگر استفاده کرد. مثلا نباید از UI Context ها برای عملیات های طولانی مدت مثل دانلود و آپلود فایل ها و ... استفاده کرد.- باید به خاطر داشته باشیم که نباید از Context ها به صورت استاتیک استفاده کرد چرا که باعث اشغال منابع سیستمی می شود و فضای زیادی را اشغال میکند. البته این موضوع در مورد Application context ها صدق نمیکند و در صورت لزوم میتوانیم از Application context به صورت استاتیک استفاده کنیم.اگر برای کار با یک layout از Non Ui Context استفاده کنیم چه اتفاقی رخ می دهد؟فقط ContextThemeWrapper و مشتقات آن از نوع UI Context می باشد و از آنجایی که کلاس Activity از ContextThemeWrapper ارث بری میکند و  وقتی layout خود را inflate میکنید و با View ها کار میکنید می توانید برای آنها Theme تعریف کنید. اگر از Non UI Context برای ایجاد View استفاده کنید دیگر قادر به تعریف Theme نیستید.آیا می توان از UI Context برای دسترسی به recources مثل color و strings و ... استفاده کرد؟ از آنجایی که UI Context = Context + Theme می باشد پس شما می توانید از Context ها برای دسترسی به منابع استفاده کنید.آیا می توان از UI Context برای عملیات هایی مثل دانلود استفاده کرد؟ یکی از بزرگترین اشتباهاتی که ممکن است برنامه نویسان اندروید انجام دهند همین موضوع هست . استفاده از UI Context برای عملیات های طولانی مدت مثل دانلود و آپلود باعث اشغال حجم سنگینی از منابع سیستمی می شود و سیستم عامل را با کمبود منابع رو به رو میکند که همین موضوع موجب memory leake و خطای out of memory می شود.هر برنامه نویسی اندرویدی با خطای out of memory موجه شده است از برخورد با این نوع خطاها شرمنده نباشید. برخورد شما با خطاهای مختلف با تجربه و مهارت شما نسبت عکس دارد و هرچه تجربه و مهارت های شما بیشتر شود طبیعتا باید کمتر درگیر این نوع خطاها شوید.تقریبا در همه جای اندروید نیاز به Context هست برنامه نویسان مبتدی ممکن است از UI Context در موارد مختلف استفاده کنند که این موضوع می تواند دردسر ساز باشد. UI Context ماهیتی موقتی و ناپایدار هستند و هر لحظه ممکن است کاربر با جابه جا شدن بین صفحات یا خارج شدن از برنامه به حیات آنها پایان دهد لذا  استفاده از UI Context ها برای امور طولانی مدت به هیچ وجه توصیه نمی شود . برای امور طولانی مدت می توانید از Service, Thread, AsyncTask, BroadCast و ... استفاده کنید.در استفاده از getBaseContext دقت کنید.در مورد getBaseContext توصیه می شود که در استفاده ازBaseContext دقت لازم را به همراه داشته باشیم  زیرا که BaseContext از Object های پایه ای کلاس ContextWrapper می باشد. سیستم عامل  با استفاده از Delegate Pattern از این متد در Child های بسیاری استفاده میکند و تغییرات آن بر بخش های مختلفی تاثیر گذار خواهد بود. استفاده از BaseContext فقط باید در Object هایی باشد که مستقیما از جنس ContextWrapper هست پس می توان نتیجه بگیریم مجاز به ارسال این متد به View ها نمی باشیم : TextView textview = new TextView(getBaseContext());استفاده از getBaseContext در مواردی شبیه به نمونه کد بالا اشتباه می باشد.کتابخانه هایی مثل  Calligraphy که در زمینه فونت کاربرد دارند از BaseContext استفاده میکنند که این موضوع منطقی و اصولی است.</description>
                <category>masoud</category>
                <author>masoud</author>
                <pubDate>Sun, 20 Oct 2019 18:43:58 +0330</pubDate>
            </item>
                    <item>
                <title>چرخه حیات به سبک lifecycle aware در اندروید</title>
                <link>https://virgool.io/@1masoud1/lifecycle-aware-android-xdvnqq4rlxjs</link>
                <description>چرخه حیات به سبک lifecycle aware در اندرویددر قسمت اول و دوم در مورد چرخه حیات در اکتیویتی ها و فرگمنت ها صحبت کردیم. اگر آنها را مطالعه نکرده اید توصیه میکنم ابتدا آن را مطالعه و سپس این مطلب را ادامه دهید.چرخه حیات اکتیویتی ها در اندرویدچرخه حیات فرگمنت ها در اندرویددر این مطلب قصد داریم چرخه حیات را به سبک جدیدتر و یکپارچه تر پیاده سازی کنیم.احتمالا در برنامه هایی مثل دیوار  و ... دیده اید که وقتی فرمی را پر میکنید اگر به هر دلیلی از برنامه خارج شوید اطلاعات وارد شده را به صورت پیش نویس ذخیره می شود و یا  وقتی در یک موزیک پلیر در حال گوش کردن به آهنگ مورد علاقه تان هستید اگر فردی به گوشی تان تماس بگیرد آهنگ قطع می شود  و بعد از پایان تماس با نمایان شدن موزیک پلیر مجددا آهنگ شروع به خواندن می کند.  برای انجام دادن فعالیت های این چنینی نیاز به آگاهی نسبت به Lifecycle اکتیویتی  و فرگمنت دارید.مثلا در مثال موزیک پلیر چرخه حیات بدین شکل می باشد:در متد On Create دستور init  اجرا می شود.در متد On Start دستور start  اجرا می شود.در متد On Pause دستور pause اجرا می شود.در متد OnDestroy دستور release اجرا می شود.این روشی بود که تا به امروز برای توسعه برنامه های خود استفاده میکردیم و همین روال در مورد مپ و یا موارد مشابه نیز انجام میدادیم.حال فرض بگیرید که لازم باشد در چند اکتیویتی یا فرگمنت ، همین روال را برای یک پلیر ، مپ و ... استفاده کنیم که انجام این کارهای تکراری علاوه بر اینکه باعث ناخوانایی کدها می شود ، زمانبر نیز می باشد.روش بهتر و منطقی تری که قصد داریم در این مطلب آن را با هم بررسی کنیم lifecycle aware می باشد. در این روش ، همه عملیات های مختلف مربوط به یک کامپوننت ( پلیر ، مپ و ...) را در یک کلاس مینویسیم که خود این کلاس تغییرات چرخه حیات را رصد کند و متناسب با رویدادهای چرخه حیات ، عملیات متناظر را اجرا میکند.در قالب یک مثال نحوه پیاده سازی lifecycle aware را بررسی میکنیم:در این مثال قصد داریم برنامه ای بنویسیم که مشابه برنامه دیوار که وقتی کاربر فرمی را پر میکند و از برنامه خارج می شود اطلاعات به صورت پیش نویس ذخیره شود ( لینک کامل برنامه را در انتهای پست میتوانید ببینید):یک کلاس با نام DraftComponent مینویسیم و اینترفیس LifecycleObserver را پیاده سازی میکنیم.یک تابع load برای خواندن اطلاعات از sharedPreferences و یک تابع save برای ذخیره اطلاعات در sharedPreferences نیاز داریم.حال باید مشخص کنیم که تابع load باید در رویداد onCreate  و تابع save در رویداد on Stop اجرا شود.@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)    private void load(){    }@OnLifecycleEvent(Lifecycle.Event.ON_STOP)    private void save() {    }حال باید از کلاس DraftComponent در اکتیویتی یا فرگمنت خود استفاده کنیم:public class MainActivity extends AppCompatActivity {    private DraftComponent lifecycle;@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);            addObserver();    } @Override    protected void onDestroy() {        super.onDestroy();        removeObserver();    }private void addObserver() {        lifecycle = new DraftComponent();        getLifecycle().addObserver(lifecycle);}private void removeObserver() {        getLifecycle().removeObserver(lifecycle);    }}به همین سادگی و به همین خوشمزگی کلاسی نوشتیم که lifecycle aware هست یعنی خوداگاه هست و از lifecycle آگاهی دارد و تغییرات آن را رصد می کند و خودش تصمیم میگیرد چه تابعی را اجرا کند.استفاده از این روش باعث می شود :از نوشتن های کدهای تکراری جلوگیری شود.کدهای قابلیت استفاده مجدد (reusable) را دارند.جداسازی خوبی بین منطق برنامه و view ها می شود.برای درک بهتر مفهوم زیبای lifecycle aware می توانید سورس کد کامل این برنامه را از لینک زیر مشاهده کنید:https://github.com/masoudmahmoodzadeh/Lifecycle-aware-Exampleمطالعه داکیومنت گوگل هم بسیار مفید است:https://developer.android.com/topic/libraries/architecture/lifecycle</description>
                <category>masoud</category>
                <author>masoud</author>
                <pubDate>Tue, 24 Sep 2019 12:26:24 +0330</pubDate>
            </item>
                    <item>
                <title>چرخه حیات فرگمنت ها در اندروید</title>
                <link>https://virgool.io/@1masoud1/lifecycle-fragment-android-naohzgkovv5u</link>
                <description>چرخه حیات فرگمنت ها در اندرویددر مبحث قبلی در مورد چرخه حیات اکتیویتی ها صحبت کردیم در این مبحث قصد داریم در مورد چرخه حیات فرگمنت ها بحث کنیم:فرگمنت ها از اندروید 3 (Api Level 11)  با هدف ساختن UI های داینامیک و  منعطف به اندروید برای صفحات بزرگ ،اضافه شد .اکتیویتی ها یک فضای کلی برای نمایش المان های گرافیکی در صفحه است که کاربر می تواند به وسیله آن با برنامه در تعامل باشد.فرگمنت ها با این هدف به وجود آمدند که بتوانند یک اکتیویتی را به چند قسمت مجزا تقسیم کنند. این تقسیم بندی در تبلت ها کارایی زیادی دارد. شاید بتوان اکتیویتی را به یک سالن ورزشی بزرگ و چند منظوره تشبیه کرد که میتوان در آن رشته های ورزشی مختلف را برگزار کرد.فرگمنت ها همیشه توسط اکتیویتی ها میزبانی می شوند یعنی حتما باید یک اکتیویتی وجود داشته باشد و به همین دلیل چرخه حیات اکتیویتی بر روی فرگمنت ها نیز تاثیر گذار است. به عنوان مثال  اگر اکتیویتی on Pause شود همه فرگمنت های آن اکتیویتی هم on Pause می شود.چرخه حیات فرگمنت ها در اندرویدوقتی یک فرگمنت اجرا می شود به ترتیب :on Attach()on Create()on CreateView()on ViewCreated()on ActivityCreated()on Start()on Resume()اجرا می شود .تا اینجا فرگمنت به نمایش در آمده و کاربر میتواند با آن در تعامل باشد.وقتی فرگمنت در حالت on Resume قرار دارد چند حالت ممکن است پیش بیاید:- - کاربر از فرگمنت A به فرگمنت B کوچ کند در این حالت ابتدا رویدادهای on Attach و on Create  برای فرگمنت B اجرا می شود و سپس رویداد on Pause  و on Stop  و on DestroyView برای فرگمنت A اجرا می شود و سپس در ادامه چرخه حیات فرگمنت B  به صورت  on CreateView و on ViewCreated و on ActivityCreated و on Start و on Resume اجرا می شود.رویداد on Pause برای اکتیویتی مبدا اجرا می شود و رویداد های on Create و on Pause و on Resume برای اکتیویتی مقصد و در نهایت رویداد on Stop برای اکتیویتی مبدا اجرا می شود.- - کاربر با فشردن دکمه Home برنامه را به Background منتقل کند در این حالت متدهای on Pause و on Stop اجرا می شود.حال اگر کاربر مجددا به برنامه بازگردد متد های on Start و on Resume اجرا می شود.باید به یاد داشت سیستم عامل در صورت نیاز به منابع سیستمی اقدام به فراخوانی متد on Destroy برنامه هایی میکند که به مدت طولانی در Background مانده باشد که در این حالت چرخه حیات اکتیویتی مربوطه از ابتدا اجرا می شود.- - کاربر با زدن دکمه Back از برنامه کاملا خارج شود در این حالت متد های on Pause و on Stop و on DestroyView و  on Destroy اجرا می شود.اگر با زدن دکمه Back از فرگمنت B به فرگمنت A بازگردد برای فرگمنت B رویدادهای on pause و on Stop و on DestroyView و on Destroy اجرا می شود و در ادامه برای فرگمنت A رویدادهای on CreateView و on ViewCreated و on ActivityCreated و on Start و on Resume اجرا می شود.- - وقتی کاربر گوشی را میچرخاند چرخه حیات فرگمنت به این صورت اجرا می شود :on Pauseon Stopon DestroyViewon Destroyon Attachon Createon CreateViewon ViewCreatedon ActivityCreatedon Starton Resume? رویداد on Attach :این رویداد بعد از اینکه فرگمنت را به FragmentManager ارتباط دادین اجرا می شود و باعث می شود فرگمنت به اکتیویتی میزبان خود متصل شود.? رویداد on Create : عملکرد این رویداد شبیه به اکتیویتی هاست با این تفاوت که  layout  فرگمنت ها در رویداد OnCreateView تعریف می شود.? رویداد on CreateView : از این رویداد برای اتصال layout به فرگمنت استفاده می شود.? رویداد on ViewCreated : از این رویداد برای اتصال ویوها به کد جاوا ( findViewByID ) و تعریف listener های ویوها و ... استفاده می شود.? رویداد on ActivityCreated : این رویداد زمانی که رویداد on Create اکتیویتی میزبان فرگمنت به پایان برسد اجرا می شود.? رویداد on Start : این رویداد هم عملکردی مشابه عملکرد رویداد نظیر در اکتیویتی هاست.? رویداد on Resume : این رویداد هم عملکردی مشابه عملکرد رویداد نظیر در اکتیویتی هاست.? رویداد on Stop : این رویداد هم عملکردی مشابه عملکرد رویداد نظیر در اکتیویتی هاست.? رویداد on DestroyView : در این رویداد ویوهای فرگمنت Destory می شوند ولی فرگمنت همچنان موجود است.? رویداد on Destroy : در این رویداد فرگمنت  Destory می شود.? رویداد on DeAttach : در این رویداد فرگمنت از اکتیویتی مربوطه جدا می شود.</description>
                <category>masoud</category>
                <author>masoud</author>
                <pubDate>Tue, 17 Sep 2019 21:30:00 +0430</pubDate>
            </item>
                    <item>
                <title>چرخه حیات اکتیویتی ها در اندروید</title>
                <link>https://virgool.io/@1masoud1/lifecycle-activity-android-uc1qr3ysazud</link>
                <description>چرخه حیات اکتیویتی ها در اندرویدچرخه حیات یا LifeCycle برای هر موجود زنده ای صادق است مثلا چرخه حیات برای انسان ها میتواند به این صورت باشد:- تولد- نوزادی- کودکی- نوجوانی- جوانی- میانسالی- کهنسالی- مرگهر کدام از این دوران ها ، روحیات ، احساسات ، دغدغه ها و نیازهای مخصوص به خودش را دارد که برای یک زندگی سالم باید به آنها توجه کرد.این موضوع در برنامه نویسی اندروید هم مهم هست وقتی یک اکتیویتی یا یک فرگمنت اجرا می شود سلسله وضعیت های متفاوتی رو پشت سر میگذارد و برای اینکه بتوانید برنامه ای بهینه ، روان ، اصولی تولید کنید لازم است که از Lifecycle اکتیویتی و فرگمنت آگاهی داشته باشید.پیاده سازی مناسب LifeCycle باعث می شود :-- از وقوع خطاها و Crash شدن برنامه جلوگیری شود.-- از اشغال شدن منابع سیستمی جلوگیری شود.-- وقتی کاربر از برنامه خارج و مجددا به آن باز میگردد وضعیت و داده های کاربر حفظ شود.چرخه حیات اکتیویتیوقتی یک اکتیویتی اجرا می شود به ترتیب : on Create on Starton Resumeاجرا می شودتا اینجا اکتیویتی به نمایش در آمده و کاربر میتواند با آن در تعامل باشد.وقتی اکتیویتی در حالت on Resume قرار دارد چند حالت ممکن است پیش بیاید:- - کاربر از اکتیویتی مبدا به اکتیویتی مقصد کوچ کند در این حالت رویداد on Pause برای اکتیویتی مبدا اجرا می شود و رویداد های on Create  و on Pause  و on Resume برای اکتیویتی مقصد و در نهایت رویداد on Stop برای اکتیویتی مبدا اجرا می شود.- -  کاربر با فشردن دکمه Home برنامه را به Background منتقل کند در این حالت متدهای on Pause و on Stop اجرا می شود.حال اگر کاربر مجددا به برنامه بازگردد متد های on Restart و on Start و on Resume اجرا می شود. باید به یاد داشت سیستم عامل در صورت نیاز به منابع سیستمی اقدام به فراخوانی متد  on Destroy برنامه هایی میکند که به مدت طولانی در Background مانده باشد که در این حالت اگر مجدد برنامه را باز کنید به ترتیب متدهای on Create  و on Strart و on Resume اجرا میشود.- - کاربر با زدن دکمه Back از برنامه کاملا خارج شود در این حالت متد های on Pause و on Stop و on Destroy اجرا می شود.اگر با زدن دکمه Back از اکتیویتی B به اکتیویتی A بازگردد برای اکتیویتی B رویداد  on Pause   اجرا می شود و  برای اکتیوتیتی A رویدادهای  on Restart و on Start و on Resume و در نهایت برای اکتیویتی A رویداد on Stop   و on Destroy  اجرا می شود.- - وقتی کاربر گوشی را میچرخاند چرخه حیات اکتیویتی به این صورت اجرا می شود :on Pauseon Stopon Destroyon Createon Starton Resume?رویداد on Create اولین رویدادی است که اتفاق میافتد و در آن کارهایی مثل:- انتصاب فایل XML مربوط به اکتیویتی.- معرفی View ها (findViewById).- ایجاد و مقداردهی اولیه Global Object ها.و ...را انجام میدهیم.در واقع می توان گفت هر کاری که در طول حیات یک اکتیویتی فقط یکبار نیاز است که انجام شود در این رویداد قرار میگیرد.مثل bind کردن داده ها به لیست ، دریافت داده ها از اکتیویتی قبلی  و ...انجام عملیات سنگین در این بخش توصیه نمی شود چرا که در کندی نمایش اکتیویتی موثر می باشد.? رویداد on Startاین رویداد بعد از onCreate اجرا می شود و اکتیویتی آماده هست تا به کاربر نمایش داده شود. این تابع نیز سریع اجرا می شود و نباید عملیات های سنگین را در این بخش اجرا کرد.در این بخش می توان عملیاتی نظیر موارد زیر را انجام داد :- - فرض کنید وقتی وارد اکتیویتی می شوید قرار است آهنگی پخش شود در این حالت میتوان در  دستور play رو فراخوانی کرد.- -  میتوان register شدن broadCastReciever را نیز در همین رویداد قرار داد.و ...? رویداد on Resumeاین رویداد هنگامی اتفاق می افتد که اکتیویتی به کاربر نمایش داده می شود  و برنامه در Foreground قرار دارد و کاربر می تواند با برنامه در تعامل باشد.عملیاتی هایی شبیه به زنگ خودن گوشی ، خاموش شدن صفحه گوشی ، جا به جا شدن به اکتیویتی دیگر و ... باعث می شود این رویداد به پایان برسد و برنامه وارد رویداد های On Pause و On Stop شود.تعاملات کاربر با برنامه مثل کلیک کردن ها ، ارتباط با سرور ، ارتباط با دیتابیس و  ... در این رویداد انجام میشود.به عنوان مثال در تایم لاین اینستاگرام درخواستی که به سرور برای گرفتن لیست پستهای تایم لاین داده می شود در رویداد  فراخوانی می شود حال اگر گوشی شما زنگ بخورد یا صفحه گوشیتان خاموش شود ، بعد از اینکه تماستان تمام شود یا صفحه گوشیتان روشن شود ، متد On Resume دوباره اجرا می شود و مجدد درخواست به سرور ارسال می شود و لیست پست ها به روز می شود و شما به ابتدای لیست منتقل می شوید.? رویداد on Pauseوقتی برنامه در حالت On Resume قرار دارد اگر گوشی شما زنگ بخورد یا صفحه گوشی خاموش شود ، یا کاربر از اکتیویتی فعلی به اکتیویتی دیگری برود ، ابتدا رویداد On Pause و سپس رویداد On Stop اجرا می شود.در این رویداد عملیات های سنگین مثل ارتباط با سرور ، ارتباط با دیتابیس و ... نباید انجام شود.وقتی برنامه ای در حالت MultiWindow قرار میگیرد برنامه ای که در حالت فعال نیست در رویداد On Pause قرار میگیرد. ( در مبحث دیگری به MultiWindow نیز میپردازیم).در این رویداد می توانید عملیاتی نظیر pause کردن موزیک پلیر و... را انجام داد.? رویداد on Stopاین رویداد پس از on Pause اجرا می شود در این رویداد متوقف کردن انیمیشن ها ، آزاد کردن هر نوع سرویس ، منابع و قطع کردن کانکشن به دیتابیس یا سرور در این رویداد انجام می شود.? رویداد on Destroyاین رویداد وقتی اجرا می شود که اکتیویتی آماده destroy شدن میشود . وقتی دستور finish() برای اکتیویتی اجرا می شود قبل از آن رویداد on Destroy  اجرا می شود .همچنین موقع چرخش صفحه نیز این رویداد اجرا می شود</description>
                <category>masoud</category>
                <author>masoud</author>
                <pubDate>Tue, 17 Sep 2019 19:23:58 +0430</pubDate>
            </item>
                    <item>
                <title>معرفی کتاب</title>
                <link>https://virgool.io/ketabaz/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%DA%A9%D8%AA%D8%A7%D8%A8-kgnumg37tqzv</link>
                <description>وقتی داریم کتاب میخونیم با صرف هزینه ی کمی ، با دنیای نویسنده آشنا میشیم ، از دغدغه های اون با خبر میشیم ، میتونیم از تجربیاتش ، چیزهای زیادی یاد بگیریم که ممکنه در زندگی شخصی یا شغلی مون به کارمون بیاد...کتاب نوسازی (Hit Refresh) یکی از همین کتابهاست ، کتابی که داستان زندگی ، افکار و تجربیات  شخصی رو روایت میکنه که امروز مدیر عامل یکی از بزرگترین شرکت های جهان هست و همین چند روز پیش تونست جایگاه ، با ارزش ترین شرکت جهان رو به دست بیاره.در این کتاب با فلسفه کاری شخصی آشنا میشیم که تونست با تکیه بر همین افکار ، شرکتی که حال روز خوبی نداشت ، از  رقبا عقب مونده بود و سردرگم بود  رو به با ارزش ترین شرکت جهان تبدیل کنه.وقتی سال 2014 مدیر عامل شد ، شرکت اصلا در موقعیت خوبی نبود ، بعضی از مدیران ارشد در حال جدایی از شرکت بودند ، کارمندان و مهندسان خسته تر و ناامید تر از همیشه بودند ، رسانه ها و کارشناسان با پیش بینی سقوط و رکود  و مقایسه با رقبا فشار روانی سنگینی رو به حجم مشکلات شرکت اضافه میکردند .هیئت مدیره تصمیم میگیره برای نجات از این وضعیت سخت ، آقای ساتیا نادلا رو به عنوان مدیر عامل مایکروسافت انتخاب کنه با این امید که بتونن به روزهای خوبشون برگردندر این کتاب ، نادلا از جایی که در اون بزرگ شده از حیدآباد هند ، از والدینش و سبک تربیتی اونها ، از عشق و علاقه به همسر و فرزندانش ، از علاقه اش به کریکت و درس هایی که از همین کریکت یاد گرفته ، از تجربیاتش به عنوان کارمند  و مدیر مایکروسافت ، از فرهنگ و فلسفه حاکم بر مایکروسافت ،از  اصول رهبری و مدیریت ، از شرکا و رقبا و تعامل با آنها ،  از تکنولوژی های آینده ، از قوانین اجتماعی و حقوقی آمریکا  و از تغییرات و سیاست گذاری هایی که منجر به بهبود مایکروسافت شد ، سخن گفته.کتابی که بدون شک برای برنامه نویسان ، مدیران ، رهبران و همه علاقه مندان میتونه خیلی خیلی مفید باشه.توصیه میکنم این کتاب زیبا رو با مقدمه که از بیل گیتس به چاپ رسیده حتما مطالعه کنین و از مطالب خوبش نهایت استفاده رو ببرین.عنوان کتاب : نوسازی ، تلاش برای بازیابی روح مایکروسافت و تصویر یک دنیای بهتر برای همهنویسنده : ساتیا نادلاانتشارات : نشر نوینبرشی از این کتاب زیبا:علاقه دارم همدلی را در مرکز هر کاری که دنبال میکنم قرار دهم از محصولاتی که تولید میکنیم گرفته تا بازارهای جدیدی که به آنها وارد می شویم و کارمندان و مشتریان و شرکایی که با آنها کار میکنیم.هیچ رهبری و هی تیمی و هیچ مدیر عاملی به تنهایی قهرمان نوسازی مایکروسافت نخواهد بود . اگر قرار باشد نوسازی انجام شود ، نیاز به همه ما و نیاز به همه بخش های هر کدام از ما دارد . تحول فرهنگی آهسته خواهد بود و تلاش در این راه رضایت بخش.انقلاب صنعتی چهارم پیش روی ماست و در این انقلاب هوش مصنوعی با هوش انسان به رقابت خواهد پرداخت.رهبری یعنی کاری بکنیم که بهترین های هر فردی بروز پیدا کند. شاید مهمترین چیزی که رهبران باید انجام بدهنداین است که اعتماد به نفس افرادی را که رهبری آنها را به عهده دارند افزایش دهندسایر مطالب بنده :آشنایی با LiveData در اندرویدآشنایی با Context در اندرویدچرخه حیات به سبک Lifecycle Aware در اندرویدچرخه حیات فرگمنت ها در اندرویدچرخه حیات اکتیویتی ها در اندروید</description>
                <category>masoud</category>
                <author>masoud</author>
                <pubDate>Sun, 12 May 2019 21:31:05 +0430</pubDate>
            </item>
            </channel>
</rss>