<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های ایمان یاراحمدی</title>
        <link>https://virgool.io/feed/@imanyarahmadi</link>
        <description>Android &amp; Flutter</description>
        <language>fa</language>
        <pubDate>2026-06-16 09:04:22</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/62093/avatar/vkCDLy.jpg?height=120&amp;width=120</url>
            <title>ایمان یاراحمدی</title>
            <link>https://virgool.io/@imanyarahmadi</link>
        </image>

                    <item>
                <title>آموزش ساخت افزونه گوگل کروم با فلاتر</title>
                <link>https://virgool.io/@imanyarahmadi/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B3%D8%A7%D8%AE%D8%AA-%D8%A7%D9%81%D8%B2%D9%88%D9%86%D9%87-%DA%AF%D9%88%DA%AF%D9%84-%DA%A9%D8%B1%D9%88%D9%85-%D8%A8%D8%A7-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-rck99nglwbhc</link>
                <description>با سلام و وقت بخیرامیدوارم که حالتون خوب باشه.توی این مطلب میخوایم در مورد ساخت افزونه گوگل کروم با فلاتر صحبت کنیم.من توی این مثال یک اپ crypto tracker رو به صورت افزونه منتشر کردم که شما میتونید سورس رو دانلود کنید و از اون استفاده کنید.https://github.com/iManYarahmadi/crypto_extension_chromeولی در این مطلب آموزشی یک مثال خیلی ساده رو با هم پیش میبریم که بیشتر تمرکزمون روی روال ساخت افزونه باشه.در ابتدا یک پروژه جدید میسازیم و یک متن خوش آمد در وسط صفحه میزاریم.بعد با استفاده از دستور پایین پروژه خودمون رو روی مرورگر اجرا میکنیم که پوشه build برای وب ساخته شه.flutter run -d Chromeبعد با استفاده از دستور پایین پروژه خودمون رو روی مرورگر اجرا میکنیم که پوشه build برای وب ساخته شه.برای ساخت افزونه باید چند مرحله رو طی کنیم که به ترتیب توضیح میدیم.مرحله اول: در فولدر web فایل index.html رو باز میکنیم و هر تگی که با  شروع میشه رو از داخل فایل پاک میکنیم ، مثل تصویر زیر:و بعد از پاک کردن تگ های  تگ پایین رو به داخل تگ body اضافه می کنیم.&lt;script src=&#039;main.dart.js&#039; type=&#039;application/javascript&#039;&gt;مرحله دوم:نیاز هست یه سایز برای افزونمون تعیین کنیم که تگ زیر رو به تگ html اضافه میکنیم.میتونید سایز رو به سایز دلخواه تغییربدین.&lt;html style=&amp;quotheight: 600px; width: 350px&amp;quot&gt;و در آخر فایل index.html ما به این صورت درمیاد.مرحله سوم:داخل فولدر web فایل manifest.json رو باز میکنیم و کل کد هارو پاک میکنیم و این کد ها رو جایگزین میکنیم.{
   &#039;name&#039;: &#039;Chrome Extension&#039;,
    &#039;description&amp;quot: &#039;Chrome Extension&#039;,
    &#039;version&#039;: &#039;1.0.0&#039;,
    &#039;content_security_policy&#039;: {
        &#039;extension_pages&#039;: &#039;script-src &#039;self&#039; ; object-src &#039;self&#039;
    },
    &#039;action&#039;: {
        &#039;default_popup&#039;: &#039;index.html&#039;,
        &#039;default_icon&#039;: &#039;icons/Icon-192.png&#039;
    },
    &#039;manifest_version&#039;: 3
}و با استفاده از تکه کد زیر از پروژه خودمون بیلد میگیریم.flutter build web --web-renderer html --cspو بعد از اجرای دستور داخل فولدر پروژه در فولدر build میتونید خروجی رو ببینید و از بیلد نهاییمون به شکل زیر استفاده می کنیم.وارد قسمت extension کروم میشیم. یا تکه کد زیر رو در قسمت سرچ وارد کنید.chrome://extensionsوارد قسمت extension کروم میشیم. یا تکه کد زیر رو در قسمت سرچ وارد کنید.گزینه developer mode رو در بالای صفحه فعال میکنیم.بعد روی گزینه load unpacked کلیک میکنیم.و وارد فولدر پروژه خودمون میشیم در قسمتbuild فولدر web رو بارگزاری میکنیم.,و به این صورت به افزونه ها اضافه میشه.و میتونیم افزونمون رو اجرا کنیم.امیدوارم که مطلب مورد پسندتون قرار گرفته باشه.اگه دوست داشتین مطلب رو حتما لایک کنید و کامنت بزارین که بتونیم مطلب های بیشتری رو منتشر کنیم.یاعلی.</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Wed, 12 Jul 2023 11:29:31 +0330</pubDate>
            </item>
                    <item>
                <title>کاربرد پکیج Equatable در فلاتر با مثال</title>
                <link>https://virgool.io/flutter-community/%D9%BE%DA%A9%DB%8C%D8%AC-equatable-%D8%AF%D8%B1-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-%D8%A8%D8%A7-%D9%85%D8%AB%D8%A7%D9%84-dr3t6jqivdw9</link>
                <description>سلام امیدوارم که روزهای خوبی در انتظار همگی باشه.ممکنه بارها حین مشاهده آموزش های مختلف فلاتر به استفاده از پکیج Equatable بر خورده باشین و براتون سوال باشه کار این پکیج چیه؟چرا و چه زمانی باید ازش استفاده کنیم؟بهتره این آموزش رو با یه سناریو پیش ببریم که درک مطلب راحت تر باشه.فرض کنید شما به همراه برادر یا خواهرتون تنها عضو خانواده هستین و پدر تصمیم میگیره به شما دو نفر دوتا ماشین هدیه بده.(خوشبحالتون D:) در ابتدا فرض ما این هست که دقیقا یک مدل ماشین با یک رنگ به هردوی شما عزیزان هدیه میدن و ما قصد داریم که مقایسه کنیم این دو ماشین رو که آیا دقیقا یک مدل و یک رنگ هستند یا خیر!در محیط واقعی خدا به ما قدرت بینایی داده و نگاه میکنیم که آيا شبیه هم هستند یا نه... ولی در زبان دارت یه خورده قضیه فرق میکنه.ادامه مطلب رو همراه من باشین که در قالب مثال عملی مطلب رو پیش بریم.در زبان های برنامه نویسی برای مقایسه دو  شی مختلف از اپراتور == استفاده میکنیم .(با این اپراتور برابر بودن رو بررسی میکنیم)class GiftCar { 
final String model;
 final String color;  
const GiftCar({this.model, this.color});
}در بالا ما یک کلاس داریم به اسم GiftCar که دوتا مشخصه مدل و رنگ ماشین رو براش تعریف کردیم.ما در متد main خودمون دو شی یا نمونه از کلاس بالا میسازیم به این صورت:void main() { 
final GiftCar car1 = GiftCar(model: &#039;207&#039;, color: &#039;white&#039;);
final GiftCar car2 = GiftCar(model: &#039;207&#039;, color: &#039;white&#039;);
print(car1 == car2); // false
 }هردو نمونه ۲۰۷ سفید هست که ماشین اول مال خودمون هست و ماشین دوم متعلق به خواهر یا برادرمون ، حالا با استفاده از اپراتور == بررسی میکنیم که آیا این دو نمونه برابر هستند یا نه؟وقتی نتیجه رو پرینت میگیریم و در کنسول به ما false بر میگردونه و میگه که این دوتا نمونه برابر نیستند،درصورتی که مشاهده میکنید،هردو مقادیرشون برابر هست.به صورت پیشفرض در دارت هر نمونه ای که میگیریم یک hashcode و identity (هویت مثلا کد ملی برای هر فرد) خاص به اون نمونه اختصاص داده میشه و حتی دو نمونه با مقدارهای یکسان رو هم برابر نمیبینه.چاره چیه؟کد زیر رو مشاهده کنید.class GiftCar { 
final String? model;
 final String? color;  
const GiftCar({this.model, this.color});
 @override 
  bool operator ==(Object other) =&gt;
identical(this, other) ||
 other is GiftCar &amp;&amp; 
 runtimeType == other.runtimeType &amp;&amp; 
 model == other.model &amp;&amp;  
color == other.color;  
@override 
  int get hashCode =&gt; model.hashCode ^ color.hashCode;
}باید به شکل بالا برای مقایسه دو نمونه عمل کنیم و به دارت بفهمونیم که identity و hashcode نمونه های ما یکی هستن و وقتی نتیجه برابر بودن رو با تکه کد زیر بررسی میکنیم دارت به ما true بر میگردونه و میگه که این دو نمونه برابر هستند.void main() { 
final GiftCar car1 = GiftCar(model: &#039; 207 &#039;, color: &#039;white&#039;);
final GiftCar car2 = GiftCar(model: &#039; 207&#039;, color:&#039;white&#039;);
print(car1 == car2); // true
 } تصور کنید که ما نمونه های مختلفی داشته باشیم و بخوایم برابر بودن یا نبودنشون رو مقایسه کنیم؟آیا این همه کار تکراری و کد تکراری رو هر دفعه باید انجام بدیم؟بهتره به جای این همه کار تکراری ، تمرکزمون روی پروژه ای که داریم انجام میدیم باشه و وقتمون رو با دوباره نوشتن این همه کد تلف نکنیم.اینجاست که برادر گرامی فیلیکس آنجلو یه پکیج منتشر کرده به اسم Equatable که همین کارو بدون این همه کار اضافی برای ما انجام میده و در پس زمینه خودش این همه کد رو اضافه میکنه و از طرف ما نیازی به اضافه کردن و نوشتن این همه کد تکراری نیست.اضافه کردن پکیج و استفاده از اون در پروژه:باید پکیجش رو از اینجا به پروژه خودمون در فایل pubspec.yaml اضافه کنیم.dependencies:   
equatable: ^2.0.5 و به شکل زیر عمل کنیم.import &#039;package:equatable/equatable.dart&#039;
 class GiftCar extends Equatable { 
final String? model;
 final String? color;  
const GiftCar({this.model, this.color}); 
@override List&lt;Object&gt; get props =&gt; [model, color];
} همونطور که مشاهده کردید کد بالا رو، کلاسی که میخوایم نمونه های مختلفش رو با هم مقایسه کنیم رو از Equatable با کلید واژه Extends ارث بری میکنیم.وقتی که ما از Equatable ارث بری میکنیم به اجبار باید از تکه کدی که اخر کد بالا مشاهده میکنید استفاده کنیم.@override List&lt;Object&gt; get props =&gt; [model, color];این تکه کد یه getter هست که لیستی  از اون مشخصه هایی که میخوایم از کلاسمون رو مورد بررسی قرار بدیم رو از ما میخواد که ما در مثال خودمون دو مشخصه به اسم مدل و رنگ ماشین داریم که در بالا اضافه میکنیم.نوع لیست ما هم از نوع object هست چون مشخصه های ما میتونن شامل هر نوع داده ای string ، int و ... باشن.و وقتی کد زیر رو اجرا میکنیم به ما true برمیگردونه و میگه که نمونه های ما برابر هستند.void main() { 
final GiftCar car1 = GiftCar(model: &#039;207&#039;, color: &#039;white&#039;);
final GiftCar car2 = GiftCar(model: &#039;207&#039;, color: &#039;white&#039;);
print(car1 == car2); // true } این همه دردسر کشیدیم که بگیم ماشین های شما عزیزان یکی هستند.از اولشم میدونستیم یکین ولی چاره چیه؟برنامه نویسیه دیگه!راحت که نیست!خلاصه مبارکتون باشه ماشین هااین پکیج Equtable در جاهای مختلفی استفاده میشه،یکی از مهم ترین کاربرداش استفاده در قسمت states و events استیت منیجیمنت بلاک هست که خیلی مورد استفاده قرار میگیره.در این مطلب قصد داشتم به صورت کلی شمارو با این پکیج آشنا کنم که متوجه کاربردش بشین و وقتی مفهوم کاری که انجام میده رو درک کنیم ، راحت تر متوجه علت استفاده این پکیج در مثال ها و کدهای مختلف میشیم.امیدوارم که مطلب مورد پسندتون قرار گرفته باشه.اگر نکته خاصی هم به نظر شما جا مونده یا بهتره اضافه بشه خوشحال میشم کامنت بزارین که به مطلب اضافه کنم.با ارزوی موفقیتیاعلی</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Sun, 01 Jan 2023 14:49:03 +0330</pubDate>
            </item>
                    <item>
                <title>چگونه به عنوان یک برنامه نویس Junior مشغول به کار شویم؟</title>
                <link>https://virgool.io/@imanyarahmadi/%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A8%D9%87-%D8%B9%D9%86%D9%88%D8%A7%D9%86-%DB%8C%DA%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-junior-%D9%85%D8%B4%D8%BA%D9%88%D9%84-%D8%A8%D9%87-%DA%A9%D8%A7%D8%B1-%D8%B4%D9%88%DB%8C%D9%85-iahpznlex8ys</link>
                <description>با سلام و وقت بخیر خدمت شما عزیزاندر این مطلب قصد دارم در مورد مسائل مختلفی که برای عزیزانی که مدتی از یادگیری برنامه نویسیشون میگذره و الان به دنبال موقعیت شغلی هستند که کار خودشون رو در محیط اجرایی شروع کنند،صحبت کنم.مطلب ما به چند قسمت تقسیم میشه:1- پیش نیاز ها و زمان آمادگی شروع به کار به عنوان برنامه نویس.۲-نکات مهم در یادگیری برنامه نویسی و ورود سریع تر به بازار کار.۳-صحبت های خودمانی در مورد یافتن شغل مورد نظر و عدم ناامیدی تا رسیدن به نتیجه.بخش اول:دانش اولیه:ابتدایی ترین پیش نیاز هر نوع شغلی در حوزه it ، دانش اولیه نسبت به اون زمینه فعالیت هست.مثلا اگه برنامه نویسی اندروید کار میکنین،باید در مورد محیط های توسعه مثل اندروید استدیو و . .. زبان برنامه نویسی که برای برنامه نویسی اندروید استفاده میشه  مثل جاوا و کاتلین و مفاهیم مربوط به خود برنامه نویسی اندروید رو شما تا حد نسبتا قابل قبولی آشنایی داشته باشین ( یا هر زمینه ی دیگه ای که فعالیت میکنین) و بعد اقدام به جست و جوی موقعیت شغلی مد نظر کنین.رزومه مناسب:به جرات میتونم بگم مهم ترین بخش بعد از دانش اولیه برای پیدا کردن شغل مورد نظر، داشتن رزومه مناسب هست.بسیاری از افراد در حوزه های it با دانش نسبتا خوب، به علت ضعیف بودن رزومه نمیتونن شغل مد نظر خودشون رو پیدا کنن.من به طور خلاصه ویژگی های یه رزومه مناسب رو توضیح میدم ولی شما میتونید در مورد این مطلب سرچ کنید و دوستان زیادی در مورد نوشتن رزومه مناسب به طور مفصل مطلب منتشرکردن.رزومه فارسی یا انگلیسی:مطمئنا حتی برای بسیاری از شرکت های ایرانی رزومه انگلیسی مناسب،مورد توجه بیشتری قرار میگیره و کارفرماها یا نیروهای منابع انسانی به رزومه هایی با زبان انگلیسی توجه بیشتری میکنن.البته ممکن هست خیلیا این حرف بنده رو تایید نکنن ولی خوشبختانه یا متاسفانه این مورد هست و به شخصه تجربه ارسال رزومه فارسی و انگلیسی و نوع مشاهده و پاسخ این رزومه ها رو داشتم.نکات دیگر رزومه مناسب:بهترین راه ساخت رزومه استفاده از ساختارهای آماده مثل سایت canava و یا نسخه ایرانیcvbuilder.meهست که به راحتی میتونیم رزومه های از پیش ساخته شده با ساختار مناسب رو با تغییر اطلاعات برای خودمون استفاده کنیم.پیشنهاد بنده استفاده از سایت canava هست.رزومه باید ساختار ساده داشته باشه، نیاز به استفاده از رنگ های مختلف برای جذابیت نداره،زمینه فعالیت شما بایدکاملا مشخص باشه و  باید با این تصور رزومه رو بسازید که یک شخص قراره با یک نگاه چند ثانیه ای رزومه شما رو بررسی کنه و همه چی باید ساده و قابل مشاهده باشه.بهترین راه برای ساخت رزومه مناسب ، دیدن رزومه افراد خبره هست که شما میتونید توی لینکدین یا هر پلتفرم دیگه ای با درخواست از این افراد رزومه اون اشخاص رو بگیرین و رزومه خودتون رو طبق اون رزومه ها بسازین.پس به بخش رزومه توجه ویژه ای داشته باشین که خیلی مهم هست.لینکدین:بسیاری از افراد که در حوزه it هستن این پلتفرم رو میشناسند و اگر شناختی نسبت به این پلتفرم ندارین ماهیت کار این پلتفرم این هست که هر شخص و یا شرکتی یک صفحه شخصی دارند که اشخاص پروفایل خودشون که شامل سابقه کاری در شرکت های مختلف،پروژه هایی که انجام دادند رو در این پلتفرم بارگزاری میکنند و شرکت ها هم اگر نیازی به نیرو داشته باشند در سرتاسر دنیا در این بستر اعلام نیاز میکنن و افراد و شرکت ها به هم متصل میشن.یکی دیگه از مزیت هاش ارتباط افراد خبره حوزه های مختلف با هم دیگه هست.برای پیدا کردن شغل چه در ایران و چه در خارج از کشور بسیاری از افراد متخصص از این بستر استفاده میکنن.مفهومی هست در لینکدین به اسم connection که ارتباط بین دو نفر رو برقرار میکنه و هر دو طرف پست های همدیگرو میبینن و ...بهتره با افراد متخصص حوزه خودتون و منابع انسانی شرکت ها Connection برقرار کنید که وقتی به دنبال شغل هستین و آگهی منتشر میکنید،این افراد پست شما رو ببینن و در صورت نیاز به شما پیشنهادهمکاری بدن.و بهتر هست لینک ، لینکدینتون رو در رزومتون قرار بدین.من با دیدن پروفایل لینکدین افراد متخصص سعی کردم لینکدین خودم رو تا حد ممکن به افراد با سابقه بالا شبیه کنم که شما میتونید در اینجا پروفایل لینکدین بنده رو ببینید و در قسمت featured هم رزومم بارگزاری شده.لینکدین فراتر از این توضیحی هست که دادم و پیشنهاد میکنم در موردش بیشتر بخونین.سوال مهمی که پیش میاد این هست که چگونه متوجه بشیم که ما آماده کار هستیم؟این سوال برای هرشخص و هر زمینه ای تفاوت میکنه!برای مثال ممکنه یک نفر برنامه نویسی اندروید رو شروع کرده و روزی هشت ساعت وقت گذاشته بعد سه ماه متوجه بشه که اماده برای شروع کار هست و ممکنه در طرف مقابل یک شخص باشه روزی دو ساعت کار کرده باشه و مدت زمان طولانی تر متوجه این قضیه بشه.یا دونفر همزمان شروع کنن به یادگیری دو زمینه مختلف حتی با ساعات یکسان ،یعنی یکی فرانت رو شروع کرده و یکی اندروید و هر دو روزی هشت ساعت وقت میزارن،طبعا کسی که اندروید رو شروع کرده دیرتر به نتیجه میرسه چون پیچیدگی های زیادی داره.به این علت این مطلب رو عرض کردم که نمیشه اصلا مقایسه کرد فیلدهای مخلتلف رو،بسته به زمینه تخصصی که کار میکنیم و زمانی که میزاریم نتیجه مشخص میشه.نکته مهم برای فهمیدن اینکه آماده به کار هستیم یا نه چه چیزی هست؟اینکه یک سری مینی پروژه کوچیک برای خودمون تعریف کنیم و سعی کنیم اون هارو انجام بدیم مثلا ساخت یک برنامه نوت یا طراحی یک وبسایت ساده و ...هم باعث میشه که خودمون رو به چالش بکشیم،هم اینکه بتونیم از اون اپ ها در رزومه خودمون استفاده کنیم.هروقت تونستیم با دانشی که داریم یه سری مینی پروژه کوچک رو برای خودمون انجام بدیم.اون موقع باید به دنبال موقعیت شغلی باشیم.بخش دوم:-نکات مهم در یادگیری برنامه نویسی و ورود سریع تر به بازار کار.نکته ای که بسیار مهم هست این مسئله هست که خیلی باید مواظب باشیم که کمالگرا برای شروع کار نباشیم چون حوزه های it  مسائل مختلف و فراوانی برای یادگیری دارن که ممکنه سال ها طول بکشه تا بتونیم خیلی از کارها رو انجام بدیم پس باید مواظب این موضوع باشیم که نمیشه همه مسائل رو از اول بلد بود و بعد به دنبال پیدا کردن موقعیت شغلی رفت.بسیاری از مطالب رو برنامه نویس در حین کار در یک شرکت یاد میگیره.اشتباه بزرگی که خیلی از برنامه نویس ها درگیرش هستن از جمله خودم اوایل خیلی با این مسئله درگیر بودم به جای کار عملی بیشتر درگیر دیدن فیلم های  آموزش برنامه نویسی و یا خواندن  آموزش های مختلف برنامه نویسی میشیم و به اصطلاح ویدیو محور میشیم و خودمون نمیتونیم کاری رو انجام بدیم  ، این مسئله رو اوایل کار شاید خیلی ضرراشون نبینیم ولی به مرور زمان وقتی در حین اجرای یک پروژه واقعی به مشکلی برمیخوریم و نمیتونیم اون رو حل کنیم و برامون دردسرساز میشه.پس توصیه برنامه نویسان حرفه ای که من بعضا مصاحبه هاشون رو شنیدم ، این هست که هرچیز کوچیکی رو یادمیگیریم سعی کنیم تمرین کنیم و  به صورت عملی برای خودمون مینی پروژه تعریف کنیم و به مرور زمان سعی در اضافه کردن امکانات جدید کنیم که هم باعث میشه اون مطلب رو خیلی بهتر متوجه بشیم و هم باعث میشه بعدا بتونیم از این کارهای کوچکی که انجام دادیم توی ساخت یک کاربزرگتر استفاده کنیم.تقویت مهارت های نرم هم در یافتن شغل و موفقیت در مصاحبه ها بسیار موثر هست،بسیاری از کمپانی ها صرفا تخصص یک فرد رو در مصاحبه مورد سنجش قرار نمیدن  و جنبه های دیگه مثل اخلاقیات و یا ارتباط گیری با سایر افراد تیم و .. رو مورد نظر قرار میدن.سعی کنید در حین مصاحبه اگر چیزی بلد نیستید خیلی راحت از عدم دانش فعلیتون نسبت به اون مسئله اطلاع بدین و در مورد جست و جوی اون مسئله بعد از مصاحبه هم صحبت کنید که طرف مقابل متوجه پیگیر بودن در یادگیری شما بشه،خیلی از افرادی که مسئول استخدام هستن ممکنه از شما سوالاتی بپرسن که خودشون هم اطلاع داشته باشن که شما پاسخ سوال رو نمیدونین ولی قصد دارن واکنش شمارو نسبت به این سوالا متوجه شن.در حین مصاحبه سعی کنید استرس رو تا حد ممکن پایین بیارید چون قرار نیست اتفاق خاصی بیوفته یا در اون شرکت مشغول به کار میشین یا رد میشین و مصاحبه با  شخص استخدام کننده برای شما تجربه میشه و سوالاتی که از شما پرسیده میشه رو در موردشون تحقیق میکنید و توی مصاحبه بعدی با تجربه تر حاضر میشین.یک نکته دیگه هم در مورد حقوق مدنظر برای شروع کار هست،ابتدای کار سعی کنید انتظاراتتون رو پایین بیارید و حتی شده به مدت چند ماه با حقوق پایه وزارت کار در یک شرکت مشغول شین و بعد از گذشت دو سه ماه اگر که خودتون رو اثبات کنید،خود شرکت حقوق شمارو افزایش میده و یا خودتون میتونید درخواست افزایش بدین.یا اگر هم مقدور نبود بعد از به دست اوردن تجربه و اعتماد به نفس کافی شرکت رو عوض کنین.پس خیلی مهمه برای شروع از لحاظ دریافت حقوق هم کمالگرا نباشیم،ممکنه یک شرکتی یک پروژه رو بخواد سریع توسعه بده و به شما که حتی تازه کار هستین حقوق بالایی بده که کار سریع پیش بره و بعد سه ماه با شما همکاری نکنه و بعد شما که به عنوان تازه کار توی این شرکت ۱۸ میلیون برای مثال میگرفتین به یکدفعه رزومه برای جاهای دیگه ارسال کنید به شما حقوق ۱۰ تومن رو پیشنهاد بدن و شما بگین که حق من نیست این حقوق.پس در ابتدای کار سعی کنید با رنج حقوقی مناسب مثلا بازه ۷ تا ۹ به عنوان یک جونیور شروع به کار کنین.معمولا قرار داد اول هم بازه زمانی سه ماهه هست.این تفکر اشتباه هست مواظب باشین.توی هر شغلی باید زمان و سلسله مراتبی طی بشه،باید سعی کنید روز به روز سعی در ارتقای دانش خودتون داشته باشین و بعد حقوق شما به راحتی بعد از گذشت مدتی افزایش پیدا میکنه.نکته دیگه در مورد کاراموزی این هست که اگر در جایی مشغول به کارآموزی شدین سعی کنید نهایتا بازه یکی دوماهه رو کارآموز بمونید،بعضی از شرکت ها کاراموز شش ماهه بدون حقوق میگیرن که این سو استفاده از افراد هست.بسیاری از موقعیت های کاراموزی با حقوق هستند.پس به این نکته توجه داشته باشین،اگرجایی هم بدون حقوق رفتین نهایتا بازه زمانی یکی دوماه باشه.بخش سوم:الان در مورد مسائل  خیلی مهم به نام امید و اعتماد به نفس میخوایم صحبت کنیم.که از لحاظ اهمیت دست کمی از موارد بالا که عرض کردم ندارن.بنده حوزه های مختلفی رو کار کردم و حدودا سال 96 تا اواخر 98 برنامه نویسی اندروید کار میکردم که تقریبا از اوایل سال 98 تا اواخرش خیلی جدی تر کار کردم و ساعات زیادی رو زمان گذاشتم که بتونم خودم رو به حدی برسونم که شروع به کار کنم.(شاید روزی 6 الی 8 ساعت)و از شهرستان به تهران اومدم با چند تا شرکت مصاحبه کردم و یکی از شرکت ها به من گفت از چند روز دیگه شروع به کار کن. در حال برگشتن به شهرستان بودم که وسایلم رو جمع کنم که یک نوتیفیکشن روی گوشیم اومد با این مضمون: اولین بیماران کرونایی در کشور . وقتی برگشتم خانواده به خاطر شرایط ترسناک اوایل کرونا رضایت ندادن که من به تهران بیام و بنده هم با اینکه خیلی آماده بودم و زمان زیادی رو برای یادگیری گذاشته بودم به یکدفعه نا امید شدم و یکی دو ماه بعد بعد این همه زحمت برنامه نویسی رو ول کردم و وارد یک شغل دیگه شدم تا حدودا یک سال و نیم من مغازه داشتم ولی انگار احساس آرامش نداشتم بعد چند ماه ساعاتی که توی مغازه بیکار میشدم رو کم کم شروع کردم دوباره به یادگیری زبان و دیدن اموزش های برنامه نویسی و با خودم گفتم من برای کار دیگه ساخته شدم و دوباره تلاش کردم .من اولین بار سال 98 حدودا 28 جای مختلف توی جابینجا رزومه ارسال کردم و امسال هم برای پیدا کردن موقعیت شغلی به جز دو بار گذاشتن اگهی در لینکدین که بازدید خیلی زیادی خورد، بیشتر از ۲۰ بار رزومه در جابینجا برای شرکت های مختلف ارسال کردم.تصویر پایین رو مشاهده بفرمایید.پس به هیچ وجه بعد از ارسال رزومه برای کمپانی های مختلف و رد شدن نا امید نشید و در حین ارسال رزومه برای کمپانی های مختلف سعی کنید تجربه خودتون رو با مطالعه و تمرین بیشتر کنید.حقیقتا یکی از مهم ترین بخش ها همین ناامید نشدن هست.ممکنه حتی شما چند ماه در یک جایی مشغول به کار باشین و یک شرکت تعدیل نیرو کنه و بیکار بشین ولی نباید ناامید بشید و با ارتقای دانش خودمون در دراز مدت به سطحی میرسین که به جای فرستادن رزومه برای شرکت های مختلف ،خود شرکت ها به شما پیام میدن و به دنبال جذب شما هستن.این مورد شاید سه چهار سالی طول بکشه ولی شرطش تلاش و ناامید نشدن هست.تمام این مطالب از جنس پرسش از افراد متخصص و تجربه شخصی هست.که امیدوارم در پیدا کردن راحت تر موقعیت شغلی مورد نظر شما کمک کننده باشه.بهترین هارو برای شما بزرگواران آرزومندم.یاعلی https://www.youtube.com/watch?v=dzVgNF0yYbI&amp;t=231s   </description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Thu, 17 Nov 2022 15:54:44 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش مینی فریمورک GetX در فلاتر</title>
                <link>https://virgool.io/@imanyarahmadi/%D9%81%D8%B1%DB%8C%D9%85%D9%88%D8%B1%DA%A9-getx-%D8%AF%D8%B1-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-pebs6s0g16ef</link>
                <description>با سلام و عرض ادبدر این مقاله آموزشی قصد داریم در مورد مفاهیم کلی مینی فریمورک GetX به همراه مثال های کوچک برای درک مطلب بهتر،صحبت کنیم.با من همراه باشید.معمولا بیشتر افراد GetX رو به عنوان پکیجی برای مدیریت وضعیت(State Management) برنامه می شناسند،درصورتی که GetX یک مینی فریمورک هست که به غیر از State Management در برنامه، کاربردهای مهم دیگه ای رو داره که در ادامه مطلب در مورد اون ها صحبت میکنیم.مینی فریمورک GetX چه مزایایی داره که باعث میشه اون رو نسبت به سایر رقبا متمایز کنه؟۱- باعث افزایش کارایی(Performance) میشه، به این علت که هدف ساخت این مینی فریمورک بر این بوده که کمترین استفاده از منابع(Resource) رو داشته باشه و همین مورد، علتی هست برای افزایش Performance برنامه، که توسعه دهندگان تونستند به خوبی این کار رو انجام بدن. دربیشتر فریمورک ها کنترلر در مموری میمونه و ما باید حتما در متد dispose کنترلر خودمون رو ببندیم و درصورت فراموش کردن این مورد مشکل اشفال کردن حافظه به وجود میاد که در GetX به صورت اتوماتیک این کار انجام میشه و از مشکلات احتمالی جلوگیری میشه.۲- به خاطر  syntax ساده کدها،کار توسعه دهنده آسان تر میشه و به طور کلی بهره وری رو افزایش میده .و مزایای دیگری که میتونید در موردشون بیشتر مطالعه کنید.خوب حالا که مزایاشو بررسی کردیم میریم سراغ ویژگی های مختلف این مینی فریمورک:۱- اولین کاربردش این هست به عنوان Route Management استفاده میشه و جابه جایی بین صفحات مختلف رو با ساختار بسیار ساده و با کارایی بالا انجام میده به مثال پایین توجه کنید(قصد داریم از یک صفحه به صفحه دیگه بریم)کد در حالت عادی:Navigator.push(
    context,
    MaterialPageRoute(builder: (context) =&gt; const SecondRoute()),
  );کد وقتی از GetX استفاده میکنیم:Get.to(SecondRoute());به همین سادگی تونستیم از یک صفحه به صفحه دیگه بریم.البته صرفا اینجا هدف آشنایی با کاربردها هست در ادامه یک مثال کاربردی در محیط برنامه نویسی میزنیم.۲- به عنوان Dependency Injection از اون استفاده میکنیم بدون نیاز به استفاده از Context: مثلا وقتی بخوایم در صفحات مختلف برنامه خودمون، از همون نمونه ای که در صفحه اصلی برنامه از کلاس خاصی مثل Api Provider گرفتیم استفاده کنیم، فقط کافیه در صفحه دیگه  با استفاده از دستور GetX.find اون نمونه اولی رو که ساختیم رو داخل متغییر بریزیم و از اون استفاده کنیم،برای درک خیلی بهتر در ادامه در قالب مثال توضیح میدم.۳- به عنوان StateManagement : به صورت خیلی ساده توضیح بدم مثلا ما داخل برنامه اینستاگرام هستیم و یک شخص استوری جدیدی قرار میده و همون لحظه صفحه ما اپدیت میشه و استوری این شخص رو مشاهده میکنیم(بدون اینکه از برنامه خارج بشیم و دوباره وارد بشیم)یک state یا وضعیت جدید رخ میده و اینجاست که  state management روی کار میاد و مدیریت state های برنامه رو به عهده میگیره و بدون این که کار خاصی انجام بدیم Ui مارو اپدیت میکنه.۴-به جز سه تا کار بالا که درموردشون توضیح دادیم چندیدن کار دیگه هم انجام میده که به طور خلاصه توی تصویر زیر میتونید مشاهده کنید.برای مثال عوض کردن تم برنامه که حالت دارک باشه یا لایت و موارد دیگه.برای مثال اگر بخوایم یک alertdialog یا یک snackBar نمایش بدیم از تکه کدهای زیر استفاده میکنیم.Get.defaultDialog(title:&amp;quotThis is dialog&amp;quot); 
get.snackbar(&amp;quotTitle&amp;quot,&amp;quotThis is getx snackbar&amp;quot);به صورت کوتاه تر و خوانا تر میتونیم با استفاده از دستورات بالا اسنک بار و دیالوگ در اپلیکیشن خودمون نمایش بدیم.خوب حالا که درمورد ویژگی های مختلف این مینی فریمورک صحبت کردیم بریم در قالب مثال توضیح بدیم که خیلی بهتر برای ما مطلب روشن بشه.ابتدا یک پروژه جدید میسازیم به اسم learngetx و ساختار پوشه lib ما به شکل زیر هست.یک دایرکتوری به اسم pages که شامل home و detail هست و هرکدوم از این دایرکتوری ها دوتا دایرکتوری زیرمجموعه دارن به اسم view,controller .حالا در این لینک میتونید وارد صفحه مربوط به فریمورک GetX بشید و اخرین ورژن اون رو در فایل pubspec.yaml قرار بدین.dependencies:  get: ^4.6.5بعد از انجام این کار ما در قسمت view صفحه main خودمون بدین شکل یک کلاس جدید میسازیم :در کلاس بالا یک Text ساده داریم و یک Button که وقتی دکمه رو لمس کردیم باید به صفحه جزئیات بریم.پیاده سازی صفحه جزئیات ما هم به شکل زیرهست.یک AppBar داره با یک دکمه که وقتی لمسش کنیم باید به صفحه قبل برگردیم.برای جابه جایی بین صفحاتمون اولین کاری که باید انجام بدیم این هست که در کلاس main اصلی برنامه به جای MaterialApp از GetMaterialApp استفاده کنیم.شکل زیر رو مشاهده بفرمایید.بعد در متد on press دکمه خودمون این خط کد رو اضافه میکنیم.Get.to(const DetailScreen());و وقتی دکمه رو لمس میکنیم به صفحه جزئیات میریم.به همین سادگی ما تونستیم از صفحه home به صفحه detail بریم.خوب اگه بخوایم از صفحه detail با استفاده از button ای که در appBar تعریف کردیم به صفحه home خودمون برگردیم چه کاری انجام میدیم؟کافیه فقط از این  کد استفاده کنیم. Get.back();یک کد دیگه هم هست که با استفاده از اون مطمئن میشیم button ما غیرفعال هست و کاری انجام نمیده.Get.off();به همین راحتی ما میتونیم بین صفحات مختلف جابه جا بشیم ،اما همون طور که میدونید پیاده کردن مبحث روتینگ و جابه جایی بین صفحات به شکل های مختلفی صورت میگیره،شما ممکنه قبلا با این روش آشنا شده باشید.شکل زیر رو مشاهده کنید.در شکل بالا مشاهده میکنید ما در کلاس main برنامه به هر صفحه ای میخوایم navigate کنیم،یک نام اختصاص میدیم و دیگه به جای این که مستقیم اسم کلاس رو پاس بدیم،نامی که اختصاص دادیم رو پاس میدیم.باعث میشه مدیریت روت های ما خیلی بهتر بشه و سازماندهی تر باشه کدهای ما.حالا در getX به شکل زیر پیاده میشه:حالا به جای تکه کد Get.to(const DetailScreen()) برای رفتن به صفحه دیگه از کد زیر استفاده میکنیم.Get.toNamed(&amp;quot/detail&amp;quot);به همین راحتی ما میتونیم از GetX برای بحث Routing در برنامه خودمون استفاده کنیم،که باعث میشه از نوشتن کدهای زیاد جلوگیری بشه و همین مسئله باعث خوانایی بهتر کد میشه.خوب قبل از اینکه بریم سراغ بحث Dependency Management ابتدا یک پکیج جدید به اسم service میسازیم و در داخلش یک کلاس apiservice به شکل زیر میسازیم.و محتویات کلاس api_service ما هم بدین شکل هست.ما قرار نیست توی کلاسمون دیتای واقعی رو از اینترنت بگیریم،چون اینجا بیشتر هدف ما یادگیری مفاهیم اصلی هست. کلاس ما شامل  یک متد هست که یک text رو برمیگردونه و یک متغییر به نام value.مبحث Dependency Management در فلاتر:مینی فریمورک GetX راه آسون و ساده ای رو برای مدیریت Dependency ها و inject کردن dependency ها فراهم کرده بدون نیاز به استفاده از Context.و به ما کمک میکنه که نمونه یا Instance که از کلاس خاصی مثل ApiProvider گرفتیم رو  در صفحات دیگه هم استفاده کنیم، بدون اینکه نیاز باشه مجدد از کلاس ApiProvider نمونه بگیریم و در کل برنامه و کلاس های مختلف از همون یک نمونه اولیه استفاده میکنیم.وقتی برنامه ما بزرگ میشه این کار باعث میشه مطمئن بشیم در کل برنامه فقط یک نمونه داریم از کلاس داریم وهمین باعث جلوگیری از بروز خیلی از مشکلات کمبود حافظه و ... میشه.برای درک بهتر در قالب مثال ادامه نوشته رو مطالعه کنید.تصویر زیر رو مشاهده کنید(به فلش ها توجه کنید)به کدهای قبلی خودمون فقط دو خط اضافه کردیم که در بالا با فلش مشخص شدن.خط اول ما یک متغیر به نام apiService تعریف کردیم و با استفاده از دستور get.put کلاس ApiService خودمون رو به این کلاس home برنامه inject کردیم.و همون طور که مشاهده میکنید در Button گفتیم که متد fetchTextFromApi ما رو پرینت بگیر که با فلش سوم مشخص کردیم و وقتی دکمه رو لمس میکنیم این پیغام رو به ما نمایش میده.خوب تا حالا کار خاصی انجام ندادیم ،قدرت GetX اینجا هست که ما میخوایم از همین نمونه در صفحه detail هم استفاده کنیم،به تصویر پایین توجه کنید. ما در صفحه detail یک متغییر ساختیم به اسم apiService و با استفاده از Get.find همون نمونه قبلی مارو هرکجای برنامه گرفته باشیم پیدا میکنه و در داخل این متغییر قرار میده و طبق مثال قبل وقتی دکمه رو لمس میکنیم اون پیغام رو در خروجی نمایش میده.(توجه کنید که ما در این صفحه نمونه جدید نساختیم از کلاس ApiService و از همون نمونه اولی استفاده کردیم) به همین سادگی ما عملیات Dependency Injection رو در کلاس خودمون انجام دادیم.مدیریت وضعیت ها(State management) در GetXبرای توضیح این قسمت ما از یک شمارنده ساده استفاده میکنیم که شامل یک Text و دو عدد Button هست برای افزایش و کاهش عددمون،Ui خودمون رو به شکل زیر Update میکنیم:میدونم جای دکمه ها بهتره عوض بشه و مثبت بره اونطرف ولی به بزرگی خودتون ببخشید D:خوب الان ما باید یک کلاس جدید در پکیجی که قبلا ساختیم به نام Controller در صفحه home اضافه کنیم که این محتویات کلاس به شکل زیر هست.به ازای هر صفحه ای که داریم یک کلاس کنترلر با نام دلخواه میسازیم و Extends میکنیم GetxController رو که کلاس خود فریمورک هست، توضیح ساده کلاس این هست که با استفاده از اون میتونیم متغییرها و متدهایی که ساختیم رو کنترل کنیم .خوب ما اینجا یه متغییر به اسم count ساختیم و دوتا متد که یکیشون به عدد اضافه میکنه و یکیشون کم میکنه عدد رو که قراره از این متد ها در Button های خودمون استفاده کنیم.نکته مهم وجود obs. بعد از مقدار متغیر count ما هست که مخفف Observable هست که استفاده از دستور باعث میشه هر زمان که متغیر ما تغیری کرد ما بتونیم در جایی که داریم از اون استفاده میکنیم به این متغیر listen کنیم یا گوش فرا بدیم و مقدارمون در Ui تغییر کنه.مرحله بعد در قسمت Build باید controller خودمون رو inject کنیم،همون طور که در بالا در موردش صحبت کردیم.خوب حالا باید text و Button هامون رو اپدیت کنیم که وقتی دکمه ها رو لمس میکنیم ،مقدار Text امون تغییر کنه:۴ خط کد به کدهای قبلیم اضافه کردیم که با فلش مشخص کردم.برای این که Text ما متوجه تغییر عدد داخل متغیر count ما بشه و خود به خود Ui ما اپدیت بشه باید Text خودمون رو در داخل ویجتی به اسم Obx قرار بدیم که همون Observable در GetX هست و وقتی عدد ما تغییر میکنه عدد داخل Text مارو Update میکنه.و در داخل Button ها هم متد Increment و Decrement رو با استفاده از homeController فراخوانی کردیم.و عدد ما کم یا اضافه میشه با استفاده از این Button ها.خوب الان ما میخوایم توی صفحه detail خودمون به مقدار update شده متغیر خودمون دسترسی داشته باشیم.مثلا عدد ما الان توی صفحه اصلی ۴ هست و توی details هم باید همین رو نشون بده.اگر با Bloc کار کرده باشین میدونین انجام این کار یه خورده پیچیده هست ولی GetX خیلی راحت و آسون این کارو برای ما انجام میده.فقط با دو سه خط کدهمون طور که مشاهده کردید فقط با استفاده از متد Get.find اون نمونه ای که قبلا گرفتیم رو فراخوانی میکنیم و Text رو نمایش میدیم.الان اگر من در صفحه اصلی عدد رو تا ۱۰ بالا ببرم در این صفحه هم عدد ۱۰ رو نمایش میده.و اخرین مبحث Binding در GetX هست:مفهوم binding باعث میشه که ما تمام inject هامون رو در این کلاس خاص تعریف کنیم و کد ما خواناتر میشه و بعدا خیلی راحت متوجه میشیم که inject ها و state هامون مربوط به چه صفحه ای هستن.برای درک بهتر با من همراه باشید.ما یک پکیج جدید در پکیج home خودمون میسازیم به اسم binding و در داخل اون کلاسhome_binding.dart رو میسازیم.و ما باید inject هایی که در کلاس main داریم رو در این کلاس اضافه کنیم.محتویات کلاس home_binding ما به شکل زیر هست.و در صفحه main امون به جای دو خط inject مثل شکل زیر از find استفاده میکنیم.خطوطی که کامنت شده رو حذف میکنیم و به جاش از find استفاده میکنیم و خود find جست و جو میکنه و از داخل کلاس binding کلاس هایی که inject کردیم رو پیدا میکنه.تنها کاری که باید بکنیم این هست که در روت خودمون بگیم که homeBinding مربوط به کدوم روت هست.به شکل زیر توجه کنید.و این کار ما باعث میشه کد خیلی خوانا تر بشه.همین کار رو هم میتونیم برای صفحه detail انجام بدیم که خیلی ساده هست و من انجامش میدم و در صفحه گیت هاب خودم قرار میدم از اینجا میتونید مشاهده کنید.تا حد ممکن سعی کردم ساده و مفید و خلاصه توضیح بدم.امیدوارم که مطلب مورد پسندتون قرارگرفته باشه.اینجا هم آموزش پیاده سازی  دوتا اپ کامل تر رو با استفاده از GetX میتونید،مشاهده کنید.https://www.youtube.com/watch?v=apPH1CCOtKQhttps://www.youtube.com/watch?v=tNGfVp4KY2g&amp;amp;amp;amp;amp;t=4sلینک گیت هاب اپلیکیشن:https://github.com/iManYarahmadi/LearnGetXموفق باشید یاعلی</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Wed, 21 Sep 2022 19:55:33 +0430</pubDate>
            </item>
                    <item>
                <title>دیتابیس Hive در فلاتر به همراه مثال</title>
                <link>https://virgool.io/flutter-community/%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-hive-%D8%AF%D8%B1-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D9%85%D8%AB%D8%A7%D9%84-vynkker24bll</link>
                <description>با سلام و وقت بخیر خدمت شما عزیزانتوی این آموزش قصد داریم دیتابیس Hive رو در فلاتر با استفاده از یک برنامه ساده که نام شخص و نام کشور محل زندگی اون فرد رو در دیتابیس ذخیره میکنه و به ما نمایش میده رو شرح بدیم. ما توی این مثال ۴ عمل اصلی  CRUD(Create,Read,Upadate,delete) رو در دیتابیس به طور مختصر در قالب ساخت اپ توضیح میدیم.قبل از اینکه وارد جزئیات اصلی دیتابیس Hive بشیم در مورد انواع دیتابیس،تفاوت هاشون و چرایی انتخاب Hive به طور مختصر توضیح میدیم و بعد وارد توضیحات دیتابیس Hive میشیم.ذخیره کردن داده در به صورت محلی یا Local  یکی از مفاهیم پایه ای و مهم در بسیاری از اپ ها هست. برای مثال ذخیره کردن ادرس و اطلاعات یک مشتری برنامه سفارش غذای آنلاین یا مثلا ذخیره کردن مقدار امتیاز کسب شده که هر شخص در یک بازی موبایلی کسب میکنه یا مقدار متغییری که نمایش میده کاربر دارک مود یا لایت مود رو در اپلیکیشن انتخاب کرده همگی این ها نیاز به یک دیتابیس داخلی دارن و چندین کاربرد دیگه که در اپ های مختلف مشاهده کردین.با این مثال ها متوجه اهمیت وجود دیتابیس در اپلیکیشن ها شدیم.فلاتر  گزینه های مختلفی برای ذخیره سازی داده به صورت محلی در اختیار ما گذاشته که برنامه نویس بر اساس کابرد اپلیکیشنی که درحال توسعه اون هست میتونه بین این گزینه ها یکی رو انتخاب کنه برای مثال دیتابیس Shared_Preferences پکیج مناسبی برای ذخیره ساختارهای کوچک Key-Value در فلاتر هست که یک مقدار رو به عنوان کلید میگیره و یک مقدار رو به عنوان مقدار اون کلید که مثلا برای ذخیره مقدار روشن یا خاموش بودن دارک مود میتونه گزینه خوبی باشه.یکی دیگه از گزینه ها دیتابیس Sqflite هست که پکیجی هست بر پایه Sqlite که در فلاتر استفاده میشه. این دیتابیس انتخاب خوبی هست برای ذخیره کردن داده ها در جداولی که دیتاها در اون جداول با هم ارتباط دارن  و در ارتباطاتشون پیچیدگی زیادی وجود داره  و ما در چنین مواقعی از این دیتابیس استفاده میکنیم.ولی اگر ما میخوایم که از دیتابیسی استفاده کنیم که پیچیدگی کد نویسی کمتری داشته باشه و سریع و امن باشه و وابستگی نیتیو نیاز نباشه و بتونیم حتی در فلاتر وب هم از اون استفاده کنیم ،دیتابیس Hive گزینه خیلی خوبی برای ما هست.چرا دیتابیس Hive?با این گزینه های در دسترس چرا ما از دیتابیس Hive استفاده کنیم؟چون دیتابیس سبکی هست از لحاظ حجمی و راه حل سریعی هست برای استفاده از ذخیره کردن ساختار Key-Value در اپلیکیشن و اینکه Cross-Platform هست و ما میتونیم همزمان اون رو در(فلاتر موبایل،وب و دستکتاپ) استفاده کنیم که کراس پلتفرم بودنش مزیتی هست نسبت به دیتابیس Sqflite در فلاتر.و اینکه دیتابیس hive از نوع NOSQL دیتابیس برای فلاتر هست که نیازی به نوشتن دستورات sql ای در فلاتر نیست و به طور اتوماتیک با استفاده از انوتیشن ها ساختارهارو برای ما میسازه.در تصویر پایین میتونید مشاهده کنید میزان سرعت خواندن و نوشتن Hive رو نسبت به بقیه دیتابیس هادر بالا اهمیت دیتابیس در اپلیکیشن ها و مزیت Hive نسبت به بقیه دیتابیس ها برای ما روشن شد و حالا بریم سراغ استفاده از دیتابیس.نکته:دیتابیس های مختلف دیگه ای هم وجود داره و شما میتونید توی گوگل در مورد انواع اون ها و تفاوت هاشون مطالعه کنید وتصمیم بگیرید که کدوم رو استفاده کنید،و ما سعی کردیم شناخته شده ها رو معرفی کنیم.با من همراه باشید.در تصویر پایین خروجی اپلیکشنی که قرار هست با هم بسازیم رو مشاهده میکنید.ما یک پروژه جدید فلاتر میسازیم به نام hive_demo و در pubspec.yaml پروژه دو تا پکیج زیر رو اضافه میکنیم.dependencies:  hive: ^2.1.0  hive_flutter: ^1.1.0شما میتونید برای به روز بودن ورژن پکیج ها از وبسایت Pub.dev اخرین نسخه رو به پروژتون اضافه کنید.و محتوای زیر رو به جای فایل Main.dart جایگزین کنید.import &#039;package:flutter/material.dart&#039;;

main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: &#039;Hive Demo&#039;,
      theme: ThemeData(
        primarySwatch: Colors.purple,
      ),
      debugShowCheckedModeBanner: false,
      home: InfoScreen(),
    );
  }
}همون طور که مشاهده میکنید با در قسمت home صفحه InfoScreen رو قرار دادیم که شما میتونید یک صفحه با همین نام بسازید برای نمایش اطلاعات کاربر،ولی قبل از اینکه وارد پیاده سازی قسمت های مختلف برنامه بشیم بهتره یه خورده در مورد مفاهیم دیتابیس Hive توضیح بدیم که درک بهتری داشته باشیم و بعد قسمت های مختلف برنامه رو پیاده سازی کنیم.مفهوم Box در دیتابیس Hiveدیتابیس Hive از یک مفهومی به اسم Boxes برای ذخیره کردن دیتا در دیتابیس استفاده میکنه، اگه قبلا با دیتابیس Sql  کار کرده باشین با مفهوم Table در اون آشنا هستین و یک Box  مفهومی شبیه به Table هست،با این تفاوت که Box ها فاقد ساختار دقیقی هستن،‌Box ها انعطاف پذیر هستن و اون ها فقط میتونن ارتباطات ساده بین دیتاها رو هندل کنن.قبل از اینکه دسترسی پیدا کنیم به داده های ذخیره شده یک جعبه ما باید اون Box یا جعبه رو باز کنیم،این کار کل محتوای داخل جعبه رو در مموری بارگزاری میکنه و باعث میشه خیلی راحت و سریع به محتوای داخل جعبه قابل دسترسی باشند.این دو خط پایین یک مثال ساده از این هست که چطور جعبه ای به نام peopleBox رو باز میکنیم و پارامتر name این جعبه رو دریافت میکنیم.var box = await Hive.openBox(&#039;peopleBox&#039;);
String name = box.get(&#039;name&#039;);غیر از ‌Box های معمولی ما مدل های مختلفی از box ها داریم که شامل Lazy box و Encrypted box  میشه: کاربرد Lazy box:همون طور که گفتیم جعبه های معمولی داده های مارو از حافظه محلی در مموری بارگیری میکنن و جعبه ما باز میمونه،اما وقتی داده های سنگینی داشته باشیم این راه خوبی برای دسترسی به داده ها نیست و حجم زیادی از داده وارد مموری ما بشه ممکنه باعث وجود خطا در برنامه بشه و حافظه زیادی رو اشغال کنه،به این خاطر ما از Lazy box استفاده میکنیم.در Lazy box ، فقط کلید ها یا Key برای خواندن و ذخیره کردن داخل مموری بارگزاری میشن، و ما میتونیم با استفاده از کلید داده مورد نظرمون رو از داخل جعبه فراخوانی کنیم.دوخط زیر رو مشاهده کنید به این طریق میتونیم از Lazy box استفاده کنیم.var lazyBox = await Hive.openLazyBox(&#x27;hugePeopleBox&#x27;);String name = await lazyBox.get(&#x27;name&#x27;);ما برای دسترسی به محتویات داخل جعبه های معمولی نیاز به استفاده از مفهوم await نداریم ولی در Lazy box باید استفاده کنیم به خاطر اینکه داده ها و محتوای ما درحال حاضر در مموری نیستند و فقط با استفاده از کلیدها قابل دسترسی هستند.ذخیره کردن داده های حساس با استفاده از Encrypted boxشما ممکنه بخواید داده حساسی از کاربر رو داخل دیتابیستون ذخیره کنید که به راحتی قابل دسترسی نباشه اینجا هست که مفهوم Encrypted ‌‌‌Box به ما کمک میکنه که این کارو انجام بدیم.دیتابیس Hive از مفهوم رمزگذاری AES-256 در خارج از Box یا جعبه پشتیبانی میکنه همراه با یک تابع کمکی برای تولید یک کلید رمزگذاری با استفاده از الگوریتم Fortuna.برای ذخیره کردن ایمن کلیدرمزگزاری شده بهتره از پکیج flutter_secure_storage استفاده کنید.اینجا یک مثال از ساخت و بازکردن یک Encrypted Box رو مشاهده میکنید.const secureStorage = FlutterSecureStorage();
final encryprionKey = await secureStorage.read(key: &#039;key&#039;);

if (encryprionKey == null) {
  final key = Hive.generateSecureKey();
  await secureStorage.write(
    key: &#039;key&#039;,
    value: base64UrlEncode(key),
  );
}

final key = await secureStorage.read(key: &#039;key&#039;);
final encryptionKey = base64Url.decode(key!);
print(&#039;Encryption key: $encryptionKey&#039;);

await Hive.openBox(
  &#039;securedBox&#039;,
  encryptionCipher: HiveAesCipher(encryptionKey),
);برای واکشی و ذخیره دیتا ها در جعبه شما میتونید از متدهای زیر استفاده کنید.final encryptedBox = Hive.box(&#039;securedBox&#039;);

_getData() {
  setState(() {
    data = encryptedBox.get(&#039;secret&#039;);
  });
  log(&#039;Fetched data&#039;);
}

_putData() async {
  await encryptedBox.put(&#039;secret&#039;, &#039;Test secret key&#039;);
  log(&#039;Stored data&#039;);
}برای مشاهده مثال کامل با استفاده از این نوع جعبه شما میتونید روی این لینک کلیک کنید.خوب الان که مفاهیم کلی دیتابیس رو درک کردیم بریم به سراغ ادامه مثال:قبل از اینکه عملیات CRUD رو توضیح بدیم باید دیتابیس خودمون رو initialize کنیم و یک ‌Box یا جعبه رو باز کنیم که این جعبه برای ذخیره داده های ما استفاده میشه.دیتابیس باید قبل از اینکه هر جعبه ای باز بشه، initialize بشه،بهترین مکان در تابع main برنامه هست.دستورات زیر رو مشاهده کنید.main() async {
  // Initialize hive
  await Hive.initFlutter();
  runApp(MyApp());
}فقط باید حواستون باشه که تابع ما باید asynchronous باشه و از await قبل از init کردن استفاده کنیم.ما در این برنامه فقط یک جعبه داریم اگر که شما قصد دارید از جعبه های مختلفی استفاده کنید باید مواظب باشید حتما قبل از استفاده اون جعبه رو باز کنید.main() async {
  // Initialize hive
  await Hive.initFlutter();
  // Open the peopleBox
  await Hive.openBox(&#039;peopleBox&#039;);
  runApp(MyApp());
}خوب الان همه چی اماده شده که ما عملیات CRUD رو که مخفف ساختن،خواندن،اپدیت،حذف کردن داده هست رو پیاده کنیم.عملیات CRUD در اپلیکیشن:ما عملیات های خودمون رو در داخل صفحه Info Screen که قبلا در موردش صحبت کردیم که یک صفحه StateFul Widget هست تعریف میکنیم.ساختار صفحه ما به شکل زیر هست:import &#039;package:flutter/material.dart&#039;;
import &#039;package:hive/hive.dart&#039;;

class InfoScreen extends StatefulWidget {
  @override
  _InfoScreenState createState() =&gt; _InfoScreenState();
}

class _InfoScreenState extends State&lt;InfoScreen&gt; {
  late final Box box;

  @override
  void initState() {
    super.initState();
    // Get reference to an already opened box
    box = Hive.box(&#039;peopleBox&#039;);
  }

  @override
  void dispose() {
    // Closes all Hive boxes
    Hive.close();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}کد بالا رو که نگاه کنید ما جعبه خودمون رو در متد initState در داخل یک متغیر به اسم box فراخوانی میکنیم.(جعبه ای که قبلا ساختیم رو در اینجا فقط فراخوانی میکنیم) و ما باید بعد از اتمام کارمون با جعبه و قبل از بستن اپلیکیشن ببندیم که ما در متد dispose دیتابیس خودمون رو میبندیم که باعث مشکلات حافظه نشه...خوب بریم چندتا متد تعریف کنیم برای عملیات CRUD در اپلیکیشنمون:class _InfoScreenState extends State&lt;InfoScreen&gt; {
  late final Box box;

  _addInfo() async {
    // Add info to people box
  }

  _getInfo() {
    // Get info from people box
  }

  _updateInfo() {
    // Update info of people box
  }

  _deleteInfo() {
    // Delete info from people box
  }

  // ...
}خوب ما یک Ui خیلی ساده با استفاده از کدهای زیر میسازیم برای تست و بررسی اینکه عملیات های ما به درستی کار میکنه یا نه؟!class _InfoScreenState extends State&lt;InfoScreen&gt; {
  // ...
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(&#039;People Info&#039;),
      ),
      body: Center(
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: [
            ElevatedButton(
              onPressed: _addInfo,
              child: Text(&#039;Add&#039;),
            ),
            ElevatedButton(
              onPressed: _getInfo,
              child: Text(&#039;Get&#039;),
            ),
            ElevatedButton(
              onPressed: _updateInfo,
              child: Text(&#039;Update&#039;),
            ),
            ElevatedButton(
              onPressed: _deleteInfo,
              child: Text(&#039;Delete&#039;),
            ),
          ],
        ),
      ),
    );
  }
}خروجی کد ما به این شکل هست:ذخیره کردن دیتا در Hive :برای این که ما بتونیم داده در داخل دیتابیس و باکسمون ذخیره کنیم باید اون متدی که قبلا تعریف کردیم برای فراخوانی دیتابیسمون به اسم box رو به همراه متد Put به شکل زیر استفاده کنیم،این متد زوج های کلید مقدار یا همون زوج key_value رو میپذیره.// Add info to people box
_addInfo() async {
  // Storing key-value pair
  box.put(&#039;name&#039;, &#039;John&#039;);
  box.put(&#039;country&#039;, &#039;Italy&#039;);
  print(&#039;Info added to box!&#039;);
}خوب ما متد add رو به شکل بالا مقدار دهی میکنیم،مقدار اول میشه نام کلید که در اولی name هست و رشته دوم میشه مقدار name  که John هست و خط بعدیش هم که کشور و نام اون رو میگیره.همچنین Hive کلید های integer ای رو هم ساپورت میکنه و میتونیم از کلیدهای auto-incrementing هم استفاده کنیم که خیلی کاربردی هست زمانی که ذخیره کنیم چندین مقداررو شبیه یک لیست و بخوایم با استفاده از یک شاخص خاص اون مقدار رو از داخل دیتابیس یا باکسمون بازیابی کنیم از این روش استفاده میکنیم.برای روشن تر شدن مطلب کد زیر رو مشاهده کنید.box.add(&#x27;Linda&#x27;); // index 0, key 0box.add(&#x27;Dan&#x27;);   // index 1, key 1دریافت دیتا از Box :برای خوندن دیتا از جعبه ما از متد get روی متغییری که قبلا ساختیم به اسم box استفاده میکنیم که در قسمت put هم مشاهده کردین// Read info from people box
_getInfo() {
  var name = box.get(&#039;name&#039;);
  var country = box.get(&#039;country&#039;);
  print(&#039;Info retrieved from box: $name ($country)&#039;);
}نکته اگه  از auto-incrementing values یا مقادیری که به صورت اتوماتیک و افزایشی مقدار دهی میشن  استفاده کنیم میتونیم با استفاده از index اون رو فراخوانی کنیم به شکل زیر:box.getAt(0); // retrieves the value with index 0box.getAt(1); // retrieves the value with index 1اپدیت کردن دیتا:برای اپدیت کردن داده ما میتونیم از همون متود put که برای اضافه کردن داده از اون استفاده کردیم،استفاده کنیم که وقتی در داخل اون key های قبلی مقادیر جدید قرار میدیم،جایگزین قبلی میشه،کد زیر رو مشاهده کنید:// Update info of people box
_updateInfo() {
  box.put(&#039;name&#039;, &#039;Mike&#039;);
  box.put(&#039;country&#039;, &#039;United States&#039;);
  print(&#039;Info updated in box!&#039;);
}مقدار اسم و کشور رو به Mike و UnitedState تغییر دادیم.جایگزین مقادیر قبلی میکنه.نکته: اگر  از auto-incrementing values استفاده کرده باشیم، باید از متد putAt به شکل زیر استفاده کنیم،این متد مقادیر با یک شاخصه خاص مثلا index 0 رو اپدیت میکنه به شکل زیر:box.putAt(0, &#x27;Jenifer&#x27;);حذف کردن دیتا در جعبه:برای حذف کردن داده میتونیم از متد delete به شکل زیر استفاده کنیم:// Delete info from people box
_deleteInfo() {
  box.delete(&#039;name&#039;);
  box.delete(&#039;country&#039;);
  print(&#039;Info deleted from box!&#039;);
}بعد از حذف اگر بخوایم مشخصه حذف شده رو برگردونیم یا بهتره بگیم با get مقدارش رو بخونیم به ما null بر میگردونه.نکته : اگر از auto-incrementing values استفاده کرده باشیم باید به شکل زیر اون رو حذف کنیم:box.deleteAt(0);استفاده از اشیاء شخصی سازی شده با استفاده از TypeAdapter :اگرمتوجه تیتر بالا نشدید ،ادامه مطلب رو بخونید متوجه موضوع میشین(واقعا پیدا کردن معادل فارسی بعضی از کلمات خیلی سخته D:)به طور معمول hive از همه ی primitive type ها نظیر List,Map,DateTime,Uint8List اما گاهی اوقات نیاز هست دیتا مدل های شخصی سازی شده خودمون رو داشته باشیم که باعث میشه مدیریت داده ها آسون تر بشه،برای این کار میتونیم از TypeAdapter  ها استفاده کنیم.تایپ آداپترها هم میتونن به صورت دستی تولید بشن و هم به صورت اتوماتیک.بهتره به صورت اتوماتیک این کار رو انجام بدیم که باعث باعث میشه مشکلات احتمالی که وقتی دستی انجام میدیم به حداقل برسه و همچنین روش خیلی سریعتری هست.کلاس مدل خودمون رو به شکل زیر تعریف میکنیم:class Person {
  final String name;
  final String country;

  Person({
    required this.name,
    required this.country,
  });
}ساخت Hive Adapter :ابتدا نیاز هست چند تا dependencies رو برای ساخت TypeAdapter  به فایل pubspec.yaml خودمون اضافه کنیم.dev_dependencies:  hive_generator: ^1.1.2  build_runner: ^2.1.8و بعد از اضافه کردن dependencies ها مثل کدهای زیر انوتیشن ها رو به هر متغییرمون اضافه میکنیم.import &#039;package:hive/hive.dart&#039;;
part &#039;people.g.dart&#039;;

@HiveType(typeId: 1)
class People {
  @HiveField(0)
  final String name;

  @HiveField(1)
  final String country;

  People({
    required this.name,
    required this.country,
  });
}در قسمت بالا با استفاده از کلمه کلیدی part  و اضافه کردن .g در وسط نام کلاس مدلمون مشخص میکنیم که از این کلاس مدل ما باید به صورت اتوماتیک تایپ اداپتر ساخته بشه.انوتیشن ها هم از نامشون مشخصه مثلا گفتیم فیلد جعبه ما اولیش نام هست دومیش نام کشور.خوب بعد از اینکه کلاس بالا رو ساختیم با استفاده از دستور زیر در ترمینال به طور اتوماتیک کلاس رو برای ما میسازه:flutter packages pub run build_runner buildرجیستر کردن TypeAdapter :باید قبل از اینکه جعبه رو باز کنیم TypeAdapter امون رو رجیستر کنیم وگرنه به ارور بر میخوریم و این کار رو به شکل زیر در متد main  انجام میدیم.main() async {
  // Initialize hive
  await Hive.initFlutter();
  // Registering the adapter
  Hive.registerAdapter(PersonAdapter());
  // Opening the box
  await Hive.openBox(&#039;peopleBox&#039;);

  runApp(MyApp());
}بعد از اتمام این کار بریم برای ساخت اپلیکیشن نهایی :ما سه تا صفحه داریم به اسم:۱- صفحه add یا AddScreen برای اضافه و ذخیره کردن داده در دیتابیس۲- صفحه Info یا InfoScreen برای نمایش و حذف داده های موجود در دیتابیس3- صفحه Update یا UpdateScreen برای اپدیت کردن داده در دیتابیسنیاز نیست که فایل main برنامه رو تغییر بدیم و تمام کارهای برنامه رو در همین صفحات انجام میدیم.صفحه Add:صفحه add ما شامل دوتا ورودی برای نام شخص و نام کشور هست و یک دکمه در پایین صفحه برای اضافه کردن داده های ورودی به دیتابیس مثل شکل زیر:کد صفحه بدین صورت هست:class AddScreen extends StatefulWidget {
  @override
  _AddScreenState createState() =&gt; _AddScreenState();
}
class _AddScreenState extends State&lt;AddScreen&gt; {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text(&#039;Add Info&#039;),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: AddPersonForm(),
      ),
    );
  }
}همون طور که در داخل فرزند Padding کد بالا مشاهده میکنید متد AddPersonForm ما ویجت اصلی هست زمانی که Ui ساخته میشه و همچنین شامل عملگرهای ذخیره سازیHive هست که ساختار پایه این متد به شکل زیر هست.class AddPersonForm extends StatefulWidget {
  const AddPersonForm({Key? key}) : super(key: key);
  @override
  _AddPersonFormState createState() =&gt; _AddPersonFormState();
}

class _AddPersonFormState extends State&lt;AddPersonForm&gt; {
  late final Box box;

  @override
  void initState() {
    super.initState();
    // Get reference to an already opened box
    box = Hive.box(&#039;peopleBox&#039;);
  }

  @override
  Widget build(BuildContext context) {
    return Container(); 
  }
}ما مثل مثال قبل در متد initstate رفرنس جعبه باز شده خودمون رو در متغیر box میریزیم و حالا ما باید یک GlobalKey برای فرم و جند تا کنترلر برای ادیت کردن تکست ها تعریف کنیم مثل شکل زیر:class _AddPersonFormState extends State&lt;AddPersonForm&gt; {
  final _nameController = TextEditingController();
  final _countryController = TextEditingController();
  final _personFormKey = GlobalKey&lt;FormState&gt;();

  // ...
}در کدهای زیر هم متدهایی برای ذخیره کردن دیتا در هایو و اضافه کردن یک اعتبارسنج برای متن هامون تعریف میکنیم:class _AddPersonFormState extends State&lt;AddPersonForm&gt; {
  // ...

  // Add info to people box
  _addInfo() async {
    Person newPerson = Person(
      name: _nameController.text,
      country: _countryController.text,
    );
    box.add(newPerson);
    print(&#039;Info added to box!&#039;);
  }

  String? _fieldValidator(String? value) {
    if (value == null || value.isEmpty) {
      return &#039;Field can\&#039;t be empty&#039;;
    }
    return null;
  }

  // ...
} و کد Ui برنامه ما هم به شکل زیر هست:class _AddPersonFormState extends State&lt;AddPersonForm&gt; {
  // ...

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _personFormKey,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text(&#039;Name&#039;),
          TextFormField(
            controller: _nameController,
            validator: _fieldValidator,
          ),
          SizedBox(height: 24.0),
          Text(&#039;Home Country&#039;),
          TextFormField(
            controller: _countryController,
            validator: _fieldValidator,
          ),
          Spacer(),
          Padding(
            padding: const EdgeInsets.fromLTRB(8.0, 0.0, 8.0, 24.0),
            child: Container(
              width: double.maxFinite,
              height: 50,
              child: ElevatedButton(
                onPressed: () {
                  if (_personFormKey.currentState!.validate()) {
                    _addInfo();
                    Navigator.of(context).pop();
                  }
                },
                child: Text(&#039;Add&#039;),
              ),
            ),
          ),
        ],
      ),
    );
  }
}صفحه Update :صفحه Update هم دقیقا در ظاهر مثل صفحه Add هست با این تفاوت ما به این صفحه شی از کلاس Person پاس میدیم که مقادیر قبلی که در دیتابیس هستن رو نمایش بده و ما بتونیم اون رو تغییر بدیم.کد زیر برای صفحه Update :class UpdateScreen extends StatefulWidget {
  final int index;
  final Person person;

  const UpdateScreen({
    required this.index,
    required this.person,
  });

  @override
  _UpdateScreenState createState() =&gt; _UpdateScreenState();
}

class _UpdateScreenState extends State&lt;UpdateScreen&gt; {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text(&#039;Update Info&#039;),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: UpdatePersonForm(
          index: widget.index,
          person: widget.person,
        ),
      ),
    );
  }
}تنها تفاوت در در متد UpdatePersonForm نسبت به Add  وجود متدهایی برای اپدیت مقادیر موجود در دیتابیس ما هست.در کد زیر مشاهده میکنید:class _UpdatePersonFormState extends State&lt;UpdatePersonForm&gt; {
  late final _nameController;
  late final _countryController;
  late final Box box;

  // ...

  // Update info of people box
  _updateInfo() {
    Person newPerson = Person(
      name: _nameController.text,
      country: _countryController.text,
    );
    box.putAt(widget.index, newPerson);
    print(&#039;Info updated in box!&#039;);
  }صفحه Info :صفحه info ما شامل اطلاعات شخص ذخیره شده در داخل دیتابیس هست.درواقع همون عملیات خواندن یا read  در دیتابیس مثل شکل زیر:ما از یک ویجت به اسم ValueListenableBuilder استفاده میکنیم که وقتی رفرش میشه صفحه که داده ای در دیتابیس تغییر کنه.صفحه ما شامل چندین عملکرد هست:۱- ضربه زدن به آیکون دیلیت برای حذف کردن اطلاعات از دیتابیس۲- ضربه زدن به هر آیتم برای آپدیت اون و سومی هم ضربه زدن به floating action button ما برای اضافه کردن اطلاعاتکد نهایی این صفحه ما:class InfoScreen extends StatefulWidget {
  @override
  _InfoScreenState createState() =&gt; _InfoScreenState();
}

class _InfoScreenState extends State&lt;InfoScreen&gt; {
  late final Box contactBox;

  // Delete info from people box
  _deleteInfo(int index) {
    contactBox.deleteAt(index);
    print(&#039;Item deleted from box at index: $index&#039;);
  }

  @override
  void initState() {
    super.initState();
    // Get reference to an already opened box
    contactBox = Hive.box(&#039;peopleBox&#039;);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(&#039;People Info&#039;),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () =&gt; Navigator.of(context).push(
          MaterialPageRoute(
            builder: (context) =&gt; AddScreen(),
          ),
        ),
        child: Icon(Icons.add),
      ),
      body: ValueListenableBuilder(
        valueListenable: contactBox.listenable(),
        builder: (context, Box box, widget) {
          if (box.isEmpty) {
            return Center(
              child: Text(&#039;Empty&#039;),
            );
          } else {
            return ListView.builder(
              itemCount: box.length,
              itemBuilder: (context, index) {
                var currentBox = box;
                var personData = currentBox.getAt(index)!;
                return InkWell(
                  onTap: () =&gt; Navigator.of(context).push(
                    MaterialPageRoute(
                      builder: (context) =&gt; UpdateScreen(
                        index: index,
                        person: personData,
                      ),
                    ),
                  ),
                  child: ListTile(
                    title: Text(personData.name),
                    subtitle: Text(personData.country),
                    trailing: IconButton(
                      onPressed: () =&gt; _deleteInfo(index),
                      icon: Icon(
                        Icons.delete,
                        color: Colors.red,
                      ),
                    ),
                  ),
                );
              },
            );
          }
        },
      ),
    );
  }
}خوب تبریک میگم ما تونستیم با استفاده از دیتابیس Hive یه اپ ساده که اطلاعات شخص رو شامل نام و نام کشور اون شخص هست رو میگیره و ذخیره میکنه بسازیم. و ما تونستیم هم اون اطلاعات رو اضافه کنیم هم دیلیت کنیم هم اپدیت کنیم و هم اون رو از حافظه بخونیم.(چهارعمل اصلی دیتابیس)تا جای ممکن سعی کردیم تو این مقاله هم درمورد مفاهیم دیتابیس Hive توضیح بدیم و هم کدهارو ولی هرجایی از کد یا هر مفهمومی ناآشنا بود خیلی راحت میتونید صرفا اون قسمت رو درگوگل سرچ کنید و در موردش اطلاع پیدا کنید.منبع این مقاله آموزشی ما هم بلاگ سایت logrocket هست که مقالات ارزشمند دیگه رو هم در مورد فلاتر میتونین اینجا پیدا کنید و بخونید.سورس نهایی کد رو هم از اینجا از گیت هاب نویسنده اصلی این مقاله آموزشی میتونید دانلود کنید.امیدوارم که این مقاله آموزشی مورد پسندتون قرار گرفته باشه و خوشحال میشم نظرات شمارو در رابطه با این مقاله بدونم.و ممنون از شما که تا اخر همراه من بودین.پ ن: ممنون از پیام زاهدی عزیز که گفتن خیلی پکیج hive استفاده نمیشه و میشه گفت منسوخ شده و بهتره از پکیج isar برای دیتابیس استفاده کنیم.موفق باشیدیاعلی</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Sat, 17 Sep 2022 02:04:16 +0430</pubDate>
            </item>
                    <item>
                <title>نحوه ریسپانسیو کردن Ui در فلاتر</title>
                <link>https://virgool.io/flutter-community/%D9%86%D8%AD%D9%88%D9%87-%D8%B1%DB%8C%D8%B3%D9%BE%D8%A7%D9%86%D8%B3%DB%8C%D9%88-%DA%A9%D8%B1%D8%AF%D9%86-ui-%D8%AF%D8%B1-%D9%81%D9%84%D8%A7%D8%AA%D8%B1-vjslclo9hzcn</link>
                <description>با سلام و وقت بخیر خدمت شما عزیزانتوی این آموزش قصد داریم بررسی کنیم که چه ویجت هایی رو فلاتر برای ریسپانسیو کردن ui معرفی کرده...و در مورد بعضی از ویجت ها هم تا حد ممکن توضیح بدیم ، هدف ما در این آموزش آشنایی اولیه با مفاهیم و ویجت ها هست و برای درک بهتر هر ویجت، صورت جداگانه ویجت رو سرچ کنید و مثال های مختلف رو ببینید.لیست برخی از ویجت های پرکاربرد:MediaQuery - LayoutBuilder - OrientationBuilder - SafeArea - AspectRatio - Flexible - Expanded -FractionalSizedBox and ...اولین مفهومی که قصد داریم معرفی کنیم مدیا کوئری هست .با استفاده از مدیا کوئری ما میتونیم به طول ، عرض و جهت صفحه نمایش دسترسی پیدا کنیم.ما در پایین سه متغییر تعریف کردیم به نام screenHeight ,screenWidth , orientation که با استفاده از دستورات زیر ما به ترتیب عرض و طول و جهت صفحه نمایش (که صفحه نمایش ما افقی هست و یا عمودی)  رو در داخل متغییر هامون قرار میدیمdouble screenWidth = MediaQuery.of(context).size.width;double screenHeight = MediaQuery.of(context).size.height;Orientation orientation = MediaQuery.of(context).orientation;برای اینکه در قالب مثال توضیح داده باشیم من یک اپ ساده که فقط یک متن رو در وسط صفحه نمایش میده رو با استفاده از شبیه ساز ایفون اجرا کردم،و در متد بیلد سه تا متغییر رو تعریف کردم و همونطور که در تصویر بالا مشاهده میکنید ،دستور پرینت سه تا متغییر رو قرار دادیم و وقتی برنامه رو اجرا میکنیم، به ما نشون میده که عرض آیفون ما ۳۹۰ هست و ارتفاع ۸۴۴ و جهت اون هم عمودی هست. به همین راحتی تونستیم طول و عرض جهت صفحه نمایش رو نمایش بدیم.خوب حالا که دربالا متوجه شدیم میتونیم با استفاده از مدیا کوئری سایز صفحه رو بگیریم چه مزیتی برای ما داره ؟ یکی از مزیت هاش این هست که  میتونیم در بدنه برنامه شرط بزاریم که اگه طول و عرض صفحه ما از یه اندازه ای کمتر بود شما بیا و این صفحه رو نمایش بده و اگه بیشتر بود یه صفحه دیگه رو(با ویجت هایی با طول و عرض متفاوت) نمایش بده، کجا کاربرد داره؟ وقتی ما میخوایم ui خودمون رو برای تبلت ها بهینه کنیم یا سایزهای مختلف تلفن های همراه:خیلی ساده بخوام مثال بزنم ما در برنامه بالا یه شرط ساده گذاشتیم و گفتیم اگه width صفحه نمایش ما کوچکتر از ۵۰۰ بود شما بیا متن ما رو با فونت سایز ۳۰ و رنگ زرد نمایش بده در غیر این صورت و بزرگتر بودن سایز بیا و متن رو با فونت سایز ۴۰ و رنگ آبی نمایش بده،این مثال خیلی ساده بود ولی شما میتونید به صورت کامل یک ویجت رو با دو سایز مختلف برای نمایش در موبایل و تبلت بهینه کنید ما اینجا از این نوع شرط گذاری استفاده کردیمcondition ?   :  ,قبل از علامت سوال شرط رو میزاریم ، بعد علامت سوال کاری که باید انجام بشه،و بعد دو نقطه هم کاری که در صورت اینکه شرط اولیه ما اجرا نشه...خیلی بهینه تر بخوایم مثال بزنیم با استفاده از متد OrientaionBuilder هم میتونیم مثل تصویر زیر شرط بزاریم که براساس سایز صفحه نمایش کدوم View ما رو نمایش بده.خوب بریم سراغ یکی از مثال های کاربردی:ما با استفاده از مدیا کوئری میتونیم سایز ویجت هامون رو بر اساس سایز صفحه تعیین کنیم..برای مثال میتونیم تعیین کنیم که ارتفاع ویجت ما ۳۰ درصد ارتفاع صفحه باشه با استفاده از دستور زیر میتونیم این کارو انجام بدیم:MediaQuery.of(context).size.height * 0.30;نکته ( صفر اخر رو هم نزاریم بازم ۳۰ درصد رو میگیره،یا مثلا میتونیم بگیم ۰.۰۲ یعنی دو درصد کل صفحه)و یا اینکه به این صورت هم میشه تعیین کرد که ویجت ما نصف ارتفاع صفحه باشه:MediaQuery.of(context).size.height / 2;مثال زیر رو مشاهده کنید.ما در بالا دوتا container ساختیم که در اولی با استفاده از دستور double.infinity  گفتیم عرضش به اندازه کل صفحه باشه و  ارتفاعش هم ۳۰ درصد کل صفحه باشه...و در container پایین هم ارتفاعی تعیین نکردیم وگفتیم خود به خود به اندازه طول ویجت های فرزندش ارتفاعش تنظیم میشه...خوب تا جای ممکن سعی کردیم مفهوم مدیا کوئری رو توضیح بدیم چون بسیار کاربردی هست و خیلی برای رسپانسیو کردن صفحات به ما کمک میکنه....در قسمت دوم در مورد ویجت های مهم و کاربردی Expanded &amp; Flexible صحبت میکنیمقبل از اینکه وارد توضیحات مربوط به ویجت Expanded بشیم،مثال زیر رو مشاهده کنیددر تصویر بالا مشاهده میکنید که سه تا container داریم که در عرض صفحه قرار گرفتند...خوب حالا اگه که بخوایم container هارو به صورت هم اندازه طوری گسترش بدیم که کامل عرض صفحه رو بگیرن از Expanded استفاده میکنیمویجت Expanded همانطور که از اسمش پیداست ، ویجتی هست که گسترش میده یک Child  رو در داخل Row یا Column برنامه فلاتری ما...در مثال پایین متوجه کاربرد این ویجت میشیمدر بالا دومین container رو wrap کردیم با یک ویدجت Expanded  و مشخصه width  رو هم حذف کردیم خود به خود تشخیص میده و خودش رو گسترش و یا بسط میده در اون ویجتی که هست و کل صفحه رو در بر میگیره.در مثال پایین سه تا Container رو wrap میکنیم به Expanded و همونطور که نتیجه رو مشاهده میکنید سه تا container  رو به صورت برابر در عرض صفحه تقسیم میکنه،با استفاده از Expandedویجت Expanded یک مشخصه به اسم flex داره که وقتی ما یک مقدار به این flex میدیم به طور غیر یکنواخت ویجت های مارو در اون سطر یا ستون ما گسترس میده،مقدارش به طور پیش فرض یک هستمثال پایین رو مشاهده کنید.ما در اولین ویجت مقدار flex رو ۴ قرار میدیم و دومی رو برابر۲ و سومی رو هم یک قرار میدیم..که در مجموع برابر ۷ میشه،یعنی عرض صفحه ما ۷ بخش میشه و container اولی ۴ بخشش رو به خودش اختصاص میده ..نکته ای که هست اینه که اگر عددی قرار ندیم خودش مقدار پیشفرضش رو برابر یک قرار میدهویجت Flexibleویجت Flexible کاملا شبیه به Expanded هست و یک تفاوت داره که در مثال های پایین به اون اشاره میکنیم، همینطور که مثال زیر رو مشاهده میکنید یک سطر داریم که سه Container رو در اون قرار دادیم و به ترتیب مثل مثال Expanded مقدار دهی کردیم Flex های هر ویجت Flexible رو که در مجموع شدن شش قسمت و اولی سه قسمت صفحه رو پوشش داده..اگه که ما بخوایم به یکی از Container ها ارتفاع دلخواه بدیم، طبق کد پایین که با فلش مشخص کردیم،و اومدیم ارتفاع رو برابر ۱۵۰ قرار داریم،ویجت کاری نداره با مشخصه Flex  و این مقدار رو به عنوان ارتفاع این ویجت قرار میده و کاری نداره با اینکه کل صفحه رو پوشش میده یا نه...در Expanded ما نمیتونیم مثل بالا وقتی از flex استفاده میکنیم height رو بر اساس مقدار دلخواه خودمون مقدار دهی کنیم.اگه بخوایم ویجت رو مجبور کنیم کل فضای خالی صفحه رو بگیره از مشخصه fit استفاده میکنیمدوتا گزینه داره FlexFit.tight و گزینه پیشفرضی اون Flexfit.losse هست که تفاوتشون در اینه که وقتی از این مشخصه استفاده میکنیم کل صفحه رو پوشش میده و دیگه کاری با سایزی که ما میدیم به Container نداره...ولی وقتی از Flexfit.loose استفاده میکنیم میتونیم هر کدوم از ویجت های دلخواه خودمون رو مقدار دهی کنیم.در Flexible آزادی عملی برای کنترل گسترش ویجت ها نسبت به Expanded داریم.تفاوت Expanded و Flexible هم این متد Fit هست.یه مثال ساده دیگه برای درک کامل تر،در مثال پایین یه container داریم و یک Flexible  که درون خودش یک Container داره و ارتفاع هردو اون ها برابر با ۲۰۰ هستحالا وقتی ما بیایم و Container دومی رو بزرگترکنیم ارتفاعش ..Flexible ارتفاع خودش رو نادیده میگیره و براساس Container سایزش تغییر میکنه.ویجت SafeArea :همینطور که در تصویر زیر مشاهده میکنید این ویجت برای این هست که بدنه برنامه ما زیر استاتوس و ... قرار نگیره و یک مقداری از بالا فاصله داشته باشه،خیلی راحت میتونیم بدنه رو با این ویجت wrap کنیم.ویجت LayoutBuilder:ویجت کاربردی هست که با استفاده از اون میتونیم به  BoxConstraints هر ویجت دسترسی پیدا کنیم که ‌BoxConstraint  مشخص کننده طول و عرض کامل ویجت هست و برای متوجه شدن تفاوت LayoutBuilder و MediaQuery ابتدا مثال زیر رو ببینید.در مثال بالا ما یک ستون داریم که صفحه رو به دو قسمت تقسیم کردیم که مقدار مدیا کوئری توی هر دو قسمت برابر هست ولی مقدار LayoutBuilder فرق میکنه به این خاطر هست مدیا کوئری عرض کل صفحه رو حساب میکنه ولی در لایوت بیلدر مقدار عرض اون ویجتی که در اون هستیم رو نمایش میده، برای مثال عرض قسمت بنفش رنگ رو برابر ۱۵۶ قرار داده که جمعش با عرض قسمت سفید رنگ برابر میشه با عرض کل برنامه..معرفی چند منبع برای یادگیری کامل تر این مطالب: https://docs.flutter.dev/development/ui/layout/adaptive-responsivehttps://blog.codemagic.io/building-responsive-applications-with-flutter/https://www.youtube.com/watch?v=WUZVO1CLXqwhttps://medium.com/flutter-community/flutter-widgets-expanded-flexible-acc945829584ممنون که همراه من بودین تا پایان این آموزش امیدوارم که مورد پسندتون قرار گرفته باشه و لایک و کامنت شما باعث خوشحالی من میشههرجایی نکته نیاز به تصحیح داشت و یا کم گفته بودم ممنون میشم توی کامنت ها اطلاع بدین که پست رو اصلاح کنم.موفق باشیدیاعلی</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Mon, 05 Sep 2022 16:07:14 +0430</pubDate>
            </item>
                    <item>
                <title>بهترین منابع یادگیری فلاتر(فارسی و انگلیسی)</title>
                <link>https://virgool.io/flutter-community/%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D9%85%D9%86%D8%A7%D8%A8%D8%B9-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%81%D9%84%D8%A7%D8%AA%D8%B1%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D9%88-%D8%A7%D9%86%DA%AF%D9%84%DB%8C%D8%B3%DB%8C-aytecdlsy1v3</link>
                <description>سلام امیدوارم که حالتون خوب باشه...قبلا در مورد بهترین منابع یادگیری برنامه نویسی اندروید  یه پست منتشر کردم که میتونید اینجا پست رو ببینید...ابتدا بهتره یک توضیح کوتاه در مورد فلاتر بدیم و بعد منابع یادگیری فارسی و انگلیسی فلاتر رو معرفی کنیم.چیه این فلاتر:سال ۲۰۱۷ گوگل یک فریم ورک رونمایی کرد به اسم فلاتر که با استفاده از این فریم ورک یه بار کد نوشته میشه و با پرفورمنس بالا همزمان چند خروجی ازش گرفته میشه(ios,android,windows,mac) و حتی بعضا میشه افزونه مرورگر هم نوشت(زیبا نیست؟) و اگه بخوایم به صورت عادی این همه خروجی بگیریم باید برای هر پلتفرم زبان برنامه نویسی و محیط برنامه نویسی مخصوص اون زبان رو بلد بود مثلا برای اندروید زبان برنامه نویسی جاوا یا کاتلین  و برای ios زبان swift  رو بلد بود و ...زبان توسعه فریم ورک فلاتر دارت هست که زبان برنامه نویسی شی گرایی سطح بالا هست و به زبانی مثل جاوا شباهت داره،خیلی قدرتمنده و اگه که شما قبلا با یکی از زبان های برنامه نویسی کار کرده باشین خیلی راحت میشه این زبان رو یادگرفت...فلاتر چه مزیتی داره که بریم یادش بگیریم ؟۱- همزمان چند خروجی میشه ازش گرفت۲- سرعت توسعش خیلی بالاتره و یادگیریش راحت تره نسبت به نیتیو۳- یه سری قابلیت مثل hot reload داره که وقتی تغییری در کد میدیم خیلی سریع بدون نیاز به بیلد گرفتن طولانی که زمان زیادی میگیره خروجی کد رو میینیم...۴- سرعت رشد و توسعش خیلی بالاست و افراد متخصص زیادی توی دنیا دارن به رشد این فریمورک کمک میکنن و خیلی از برنامه نویس ها نسبت به ری اکت نیتیو ترجیحش میدن زبان های نیتیو قدرت و سرعت اجرای بیشتری دارن نسبت به فلاتر و اینکه خیلی وقت نیست فلاتر مطرح شده و هنوز خیلی از شرکت های بزرگ  سمتش نرفتن که برنامه هاشون رو با فلاتر توسعه بدن ولی روز به روز دارن بیشتر میشن اپ هایی که با فلاتر توسعه داده شدن..و فرصت شغلی زیادی همین الان توی ایران هم برای فلاتر وجود داره...میشه خیلی  بیشتر هم توضیح داد در مورد فلاتر ولی به همین بسنده میکنم... و میتونید با سرچ در موردش به  مزایا و معایبش دسترسی پیدا کنید.خوب منی که در حال حاضر دارم این مطلب رو مینویسم خودم هم در حال یادگیری با استفاده از این منابع هستم و سعی کردم بهترین منابع رو پیدا کنم و خودم یادبگیرم و به شما معرفی کنم ولی به این مطلب بسنده نکنید و خودتون هم جست و جو کنید و اگه منبع خاص دیگه ای رو برای یادگیری سراغ داشتین کامنت بزارین که دوستان استفاده کنن..اولین منبعی که خیلی کامل و جامع فلاتر رو از صفر شروع کرده و خیلی خوب توضیح میده آنجلا از سایت یودمی هست که اینجا میتونید دانلود کنید، به نظرم اگه زبان انگلیسی رو در حد ابتدایی بلد هستین از این اموزش شروع کنید چون خیلی قشنگ و خوب در قالب مثال و ساخت اپ های گوناگون فلاتر رو یاد میدهاموزش فلاتر یودمیدومین اموزشی که بعد از دیدن مجموعه بالا و یا بهتره گفت بعد از آشنایی مقدماتی با فلاتر پیشنهاد میکنم اموزش ساخت اپ نوت با فلاتر هست که مدرسش ونداد نهاوندی پور هست که به زبان انگلیسیه و خیلی کامل در مورد خیلی از چیزا مثل مقدمات دارت،مقدمات فلاتر،اتصال به فایربیس،اتصال به گیت و خیلی دیگه از مسائل صحبت میکنه که خیلی فوق العاده هست این اموزش و ۳۶ ساعت اموزش پیوسته هست که کانال معتبر freecodecamp در یوتیوب منتشرش کرده و میتونید از اینجا اموزش رو ببینیداگه ۲ اموزش بالا رو با دقت مشاهده کنید و این هارو تمرین کنید که قطعا چند ماهی زمان میبره قول میدم که راحت میتونید کار پیدا کنید و نیازی به مشاهده مجموعه اموزشی دیگه ای ندارین ولی چون هدف پست معرفی بیشتر منابع معتبر و معروف هست پس ادامه میدیم.سومین منبع میشه داکیومنت اصلی خود فلاتر رو نام برد که خیلی دقیق و کامل اموزش داده ولی شخصا خودم فقط برای بعضی از مطالب به این سایت رجوع میکنم و چون خیلی جزيی هر مطلبی رو توضیح داده،ممکنه شروع یادگیری از اینجا سخت و یه مقدار گیج کننده باشه...چند تا کانال معروف یوتیوب هست که اموزش های فلاتر رو میزارن که در پایین لینکشون رو میزارم و شما میتونید سر بزنید و ببینید اموزش های مختلفشون رو 1 - Afgprogrammer 2 -  Devefy3 -  Flutter4 - Johannes Milke5 -  Abdul Aziz Ahwan6 - The Flutter Way7 - Code With Andrea8-  Flutter Mapp9 - Santos Enoque10 - Flutter Ninjaکانال های مختلفی رو در بالا معرفی کردیم که هرکدوم اموزش های مختلفی دارن که برای یادگیری ui و یا کانال رسمی فلاتر برای مشاهده ابزارها و امکانات جدید فلاتر میتونید از این کانال ها استفاده کنید و بدون شک کانال های خوب دیگه ای هم وجود داره که ممکنه من ندیده باشم و یا فراموش کرده باشم اینجا بزارم...خوب حالا بریم سراغ اموزش های فارسی که منتشر شده و نسبت به بقیه اعتبار بیشتری دارناولین اموزش که معرفی میکنیم....اموزش فلاتر موسسه ۷ لرن هست که حقیقتا این موسسه فوق العاده هست توی هر زمینه ای و این آموزش با تدریس سعید شاهینی هست که توی پست مربوط به یادگیری اندروید هم ایشون رو معرفی کردم از هر نظر فوق العاده هستن و ایشون اخیرا اپ میلیونی تلوبیون رو با فلاتر بازنویسی کردن و الان برنامه نویس اندروید دیوار هستن و همین میتونه نوید اموزش فوق العاده و تجربه بالای ایشون باشه....لینک دوره رو  اینجا میتونید ببینید.دومین دوره دوره اموزش فلاتر موسسه اندروید لرن هست که اقای فرزاد سر سیفی مدرس هستن که من از تسلط ایشون زیاد شنیدم که اینجا میتونید به اطلاعات دوره دسترسی داشته باشینسایت های دیگه ای مثل فلاترلرن و راکت  و فرادرس هم هستن که اموزش فلاتر رو در سایتشون دارن و خیلی از سایت های ایرانی دیگه که ممکنه اموزش داشته باشن و بنده از اون ها بی اطلاع باشمبه عنوان جمع بندی پایانی مطلب اینکه سعی کردم بهترین منابعی رو که میشناسم معرفی کنم و معرفی منابع مخصوصا منابع فارسی به معنی تایید صددرصدی نیست و شما خیلی راحت میتونید اعتبار سایت منتشر کننده سوابق کسی که تدریس میکنه و نمونه ویدیو دوره رو ببینید و بعد اقدام به خرید کنید و اگه واقعا در سطح ابتدایی با زبان انگلیسی اشنایی دارین و متوجه بیشتر صحبت ها به زبان انگلیسی میشین همون دوتا منبع اول خیلی عالی هستن و واقعا نیاز به پرداخت هزینه ای نخواهید داشت.در اخر هم ممنون که این مطلب رو تا اخر مطالعه کردین و اگه منبع خوب دیگه ای میشناسین لطف کنین در قسمت کامنت ها معرفی کنید که دیگر دوستان هم استفاده کنند..موفق باشیدیاعلی</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Tue, 28 Jun 2022 01:26:18 +0430</pubDate>
            </item>
                    <item>
                <title>نه گذشته نه آینده...چرا این دوران بهترین زمان زیستن هست؟</title>
                <link>https://virgool.io/@imanyarahmadi/%D9%86%D9%87-%DA%AF%D8%B0%D8%B4%D8%AA%D9%87-%D9%86%D9%87-%D8%A7%D9%93%DB%8C%D9%86%D8%AF%D9%87%DA%86%D8%B1%D8%A7-%D8%A7%DB%8C%D9%86-%D8%AF%D9%88%D8%B1%D8%A7%D9%86-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D8%B2%D9%85%D8%A7%D9%86-%D8%B2%DB%8C%D8%B3%D8%AA%D9%86-%D9%87%D8%B3%D8%AA-x9t2lw3tsgmc</link>
                <description>هر از چندگاهی ممکن هست در خلوت خویش به گذشته فکر کنیم و خاطرات خوب مارا خوشحال کند و خاطرات بد ذهن ما را تشویش...و در همان لحظات هست که سری به آینده میزنیم و شرایط خود در آینده را بر اساس حس حال درونی که ممکن هست آن روز داشته باشیم تجسم میکنیم... گاهی ممکن هست با دیدن یک فیلم یا خواندن کتاب قدیمی با خود فکر کنیم که ای کاش در گذشته دور زندگی میکردیم و گاهی میگوییم ای کاش در آینده میبودیم و زندگی و روند پیشرفت آن را در صد سال آینده مشاهده میکردیم. ابتدای صحبتمان نیم نگاهی به فیلم نیمه شبی در پاریس میندازیم. در این فیلم شخصی آرزو دارد به گذشته سفر کند و با شاعران و شخصیت های بزرگ قرن 20 دیداری داشته باشد و با آن اشخاص ارتباط برقرارکند و هنگامی که مشغول پیاده روی در خیابان های پاریس هست جلوی کلیسایی توقف می کند و به هنگام زنگ نیمه شب آن کلیسا ،ماشینی قدیمی می آید و اورا به قرن 20 می برد و در آن زمان با دختری آشنا می شود و آن دختر قرن 19 را بهترین زمان برای زیستن می بیند و هنگامی هم که به آن قرن می روند مشاهده می کنند که هنرمندان ،بسیار علاقه مند به زندگی در دوران رنسانس هستند. به همین روال همگی انسان ها به علت عدم پذیرش سختی های زمان خود به زندگی در گذشته علاقه مند هستند و با خود فکر می کنند که در اگر در آن زمان زندگی میکردند،زندگی کم دغدغه تری داشتند که در واقع اینطور نیست.چرا دوران ما به رغم تمام مشکلات و سختی های فراوان بهترین زمان و طلایی ترین زمان تاریخ برای زیستن هست؟(به نظر بنده)گاهی در خلوت خودم فکر میکنم که واقعا اگر امکان زندگی در آینده و گذشته فراهم میبود آیا زندگی در آن زمان ها را بر زندگی در این عصر ترجیح میدادم یا خیر...دقیق تر به زندگی گذشتگان که نگاه میکنیم میبینیم که زندگی در آن زمان ها بسیار سخت بوده..میتوان گفت به ندرت زندگی برابری برای همه افراد آن جامعه فراهم بوده و عده ای شاید انگشت شمار از افراد نزدیک به پادشاه و درباریان آن زمان امکان یادگیری علم و سواد آموزی و رفتن به دنبال علاقه خود را داشتند،و تمام مردم به هر نحوی در خدمت پادشاه بودند و حق اعتراضی نداشتند و به همین منوال عمر خویش را به پایان می رساندند.به زمان اینده هم که نگاه میکنیم میبینیم که شاید پیشرفت تکنولوژی آنقدی هیجان انگیز باشد که مارا به وجد بیاورد ولی زندگی اکثرا ماشینی باعث کم شدن ارتباطات افراد با هم میشود،افسردگی به خاطر این نوع زندگی در جامعه بسیار زیاد می شود و شاید بتوان گفت در اینده زندگی به معنایی که باید باشد وجود ندارد. وقتی به تکنولوژی های اینده نگاه میکنیم میبینیم قرار هست که حتی طبیعت رفتن ما هم با زدن یک عینک واقعیت مجازی باشد و قرار نیست حس واقعی دیدن طبیعت را داشته باشیم. قرار هست ارتباطاتمان با دوستان و افراد خانواده هم در بستری مانند متاورس باشد که حسی مجازی دارد و اصلا حس واقعی دیدار با نزدیکانمان و معاشرت با آنان را برای ما فراهم نمیکند. میتوان دلیل های زیادی از گذشته و آینده آورد که واقعا بهترین دوران برای زیستن نیستند و شاید بتوان گفت بودن ما در این دوران محبتی هست از طرف خدا.. البته امروزه هم نابرابری و ناعدالتی بسیاری وجود دارد ولی درصد بالایی از جامعه میتوانند تلاش کنند و به آرزوی خود برسند .. به گذشته که نگاه میکنید شخصی برای پیدا کردن یک کتاب معمولی که الان خیلی ساده در اختیار ما قرار دارد بایستی برای تهیه آن به کشور دیگری میرفته ولی امروزه روی موبایل و یا کامپیوتر ما میتوان گفت تمامی کتاب ها در دسترس ما هستند و علم اندوزی بسیار بسیار راحت تر از گذشته هست. شاید در ایران عدم ثبات ،ما را در رسیدن به اهدافمان دورتر کند ولی بدون چون و چرا دلسرد نشدن در این مسیر باعث رسیدن به نتیجه میشود.در این دوران اکثر ما انتخاب میکنیم که چه مسیری را برای رفتن طی کنیم و ممکن هست به مقصد آن مسیر هم به علت اتفاقات گوناگون جامعه نرسیم ولی حداقل ،فرصت تلاش برای ما فراهم بوده است. پس به شخصه زندگی کنونی را با تمام مشکلاتش، به زندگی طاقت فرسای گذشته به علت کمبود منابع برای علم اندوزی و عدم رسیدن به خواسته ها و زندگی آینده را به خاطر ماشینی شدن و عدم لذت زیستن واقعی ترجیح میدم. امید هست با بهتر شدن شرایط زندگی ، برابری برای همه افراد به وجود بیاید و اکثریت و تمام مردم شرایط اولیه و یکسانی برای زندگی کردن داشته باشند و بتوانند برای رسیدن به خواسته هایشان تلاش کنند.</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Sun, 22 May 2022 00:56:10 +0430</pubDate>
            </item>
                    <item>
                <title>چرا نمی توان برای آینده برنامه ای مشخص داشت؟</title>
                <link>https://virgool.io/@imanyarahmadi/%DA%86%D8%B1%D8%A7-%D9%86%D9%85%DB%8C-%D8%AA%D9%88%D8%A7%D9%86-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A2%DB%8C%D9%86%D8%AF%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%A7%DB%8C-%D9%85%D8%B4%D8%AE%D8%B5-%D8%AF%D8%A7%D8%B4%D8%AA-ce9iiay3p4br</link>
                <description>هر شخصی بر اساس محیط زندگی و سلایق افراد خانواده یا دوستانش و حتی رسانه هایی مانند شبکه های اجتماعی و فیلم ها و سریال های تلوزیونی به حوزه خاصی برای یادگیری متمایل می شود و می توان گفت که ابتدایی ترین علایق افراد بر اساس این موارد ذکر شده در آن فرد شکل می گیرد.البته همیشه استثنائاتی هم وجود دارد و ممکن هست در خانواده ای همه اهل شعر و ادب باشند و یکی از فرزندان آن خانواده از همان سنین کم اصلا به این وادی علاقه ای نداشته باشد ولی غالبا علایق بر اساس اطرافیان شکل می گیرند..آیا علایق ما به خوشبختی ما منتهی می شوند:ما در دنیایی زندگی می کنیم که خوشبختی را فقط در دیدن، ظاهر زندگی دیگر افراد جست و جو می کنیم.با این تفکر که فلان شخص چون کارخانه دارد و وضع مالی خیلی خوبی دارد همیشه و در همه حال در درونش احساس رضایت می کند.پس من هم باید برای به دست اوردن آن جایگاه تلاش کنم و آن وقت احساس رضایت و خوشبختی می کنم.ولی کافیست برای پی بردن به اشتباه بودن این تفکر نگاهی به زندگی افراد نزدیکمان بیندازیم.همه ما مشاهده کرده ایم که افراد زیادی با وضع مالی نچندان خوب و معمولی بسیار از زندگی خود راضی هستند و با همان درامد کم سعی می کنند تا حد ممکن از زندگی لذت ببرند..ولی بسیاری از افراد با درامد بالا و سطح زندگی رفاهی خوبی که دارند احساس خوشبختی نمی کنند.البته در متن بالا مخاطب ما افراد با سطح درامدی بسیار پایین نیستند که حتی ممکن هست نتوانند مایحتاج زندگی خویش را تهیه کنند.(امیدواریم که شرایط تغییر کند)البته هیچ کس منکر داشتن وضع مالی خوب نیست و یا تلاش برای به دست اوردن پول، بلکه حس خوشبختی وابسته به رسیدن به نقطه خاصی نیست.و یک احساس درونیست که ممکن هست شخصی با سطح رفاهی بسیار پایین تر از شخصی دیگر، بسیار احساس درونی بهتری داشته باشد.حالا چرا در متن بالا به این نکته اشاره کردیم که حس رضایت و خوشبختی وابسته رسیدن به نقطه خاصی نیست؟چون وقتی میخواهیم برای آینده برنامه ریزی کنیم ممکن هست فکر کنیم چون به خلبانی علاقه داریم حتما سطح بالای خوشبختی و رضایت ما در رسیدن به این نقطه یعنی خلبان شدن هست ولی از این نکته غافل هستیم که ممکن هست شرایط ما برای خلبان شدن مناسب نباشد و یا اینکه ما صرفا بر اساس شنیده ها و پرستیژی که خلبانی دارد،صرفا به صورت تئوریک به خلبانی علاقه داشته باشیم و در عمل واقعا اینطور نباشد.پس چاره چیست ؟علاقه مان را چگونه پیدا کنیم؟هیچ چیز مهم تر از عمل کردن نیست،ما خیلی بیشتر از آنکه عمل کنیم فکر میکنیم و در مورد علایقمان ایده پردازی های گوناگونی می کنیم ولی غافل از اینکه ممکن هست،وقتی آن کار را انجام دهیم اصلا به آن علاقه ای نداشته باشیم،پس باید به جای فکر کردن زیاد در مورد ایده هایمان حتی شده در زمان کوتاهی، آن را اجرایی کنیم و سپس متوجه میشویم که به آن کار علاقه داریم یا خیر.ترس از تغییر:یکی از بدترین ترس های موجود در جامعه ترس از تغییر رفتار و شغل قبلی و انجام کار جدید هست.ممکن هست دوسال به عنوان خیاط مشغول به کار بوده باشیم و حتی تبحر خاصی پیدا کرده باشیم ولی متوجه شویم آنطور که باید به این کار علاقه نداریم و دوست داریم کار دیگری را امتحان کنیم. ولی ترس از تغییر باعث شود افکار این چنینی سراغمان بیاید: مثلا من خیلی از عمرم را صرف اینکار کردم ،اگر کارم را تغییر دهم امنیت شغلیم به خطر می افتد و چندین افکار گوناگون دیگر ،ولی اگر دقیق تر به این مسئله نگاه کنیم متوجه می شویم کاری که واقعا به آن علاقه نداریم در دراز مدت ما را خسته می کند و نمی توانیم آن شغل را ارتقاءدهیم و در آن شغل بر اساس پتانسیلی که داریم پیشرفت کنیم.ممکن هست وقتی شغلمان را تغییر دهیم و از نقطه امن مان خارج شویم ،برای یکی دوسال به سطح درامدی پایین تری از شغل قبلیمان برسیم ولی پس از گذشت مدتی، چون به آن کار علاقه داریم رشد ما به یک باره به صورت تصاعدی بالا می رود و غیر از لذت انجام دادن کار به سطح درامدی خیلی بهتری از کار قبلیمان میرسیم.پس نباید از تغییر بترسیم.مقایسه با دیگران:یکی از مهم ترین عوامل یا بدترین عامل پیشرفت نکردن در هرکاری مقایسه خود با افراد خبره در آن شغل یا تخصص هست که ما را پس از مدتی دلسرد میکند،برای مثال ما یک ماه برنامه نویسی کار میکنیم و پس از مدتی درمیابیم که متوجه خیلی از مباحث نمیشویم و سریع به ذهنمان خطور میکند چرا فلان شخص یا فلان استادی که ما داریم خیلی خوب این مطلب را متوجه میشود ولی ما متوجه آن مطلب نمیشویم، و یک ماه کار کردن خودمان را با 5 سال تلاش شبانه روزی استادمان مقایسه میکنیم و یا اینکه به خودمان میگوییم منی که 27 سال سن دارم اندازه فلان شخص که 18 سال سن دارد و در یکی از بهترین شرکت های ایران یا دنیا کار میکند خوب نیستم،پس سن من بالا هست و دیر شروع کرده ام،پس بیخیال همه چیز....ولی حقیقتی که وجود دارد این هست در دنیا همیشه استثنائاتی وجود دارند ممکن هست شخصی 15 ساله باشد و دانشجوی دکتری باشد و فردی ده ساله نابغه شطرنج دنیا باشد،و این افراد همیشه وجود داشته اند و خواهند داشت و این ها ممکن هست یک دهم درصد جامعه کشور باشند و 99.9 درصد افراد جامعه مثل ما معمولی باشند و با تلاش زیاد به جایگاه شغلی و یا اجتماعی رسیده اند،پس نباید خودمان را با دیگر افراد مقایسه کنیم و باید سعی کنیم هر روزی که تلاش میکنیم بهتر از دیروز خودمان باشیم و صرفا افراد خبره را الگوی خودمان قرار دهیم،انگیزه ای برای یادگیری بیشتر نه اینکه وسیله ای برای مقایسه با خودمان و در نتیجه تحقیر خودمان...البته این هم مهارتیست که باید به دست بیاوریم.در نتیجه به جای مقایسه خودمان با دیگران سعی کنیم هر روز مقداری بیشتر از دیروز تلاش کنیم در زمینه ای که به آن علاقه داریم و بگذاریم زمان نتیجه را به ما نشان دهد.نتیجه صحبتمان چه میشود؟عادل فردوسی پور صحبتی دارد که واقعا برای بنده جالب بود و برای شما بازگو میکنمایشان میگفتن که وقتی جلسه اول کلاس ها در دانشگاه شریف برگزار میشود به دانشجوها میگویم چون شما  الان دانشجوی رشته مکانیک هستید ،دلیل نمیشود حتما علاقه شما و زمینه ای که در آینده در آن فعالیت کنید حتما این رشته باشد.و باید در کنار تحصیلتان چیز های مختلف را امتحان کنید و ممکن هست زمینه های دیگری باشند که شما خیلی بهتر بتوانید در آن فعالیت داشته باشین،پس خودتان را محدود نکنید.در نتیجه ما به عنوان یک شخص ممکن هست 15 ساله باشیم و مسیری را انتخاب نکرده باشیم و نمیدانیم به چه زمینه ای علاقه داریم و یا 28 ساله باشیم و تجربیات مختلفی داشته ایم و هنوز احساس میکنیم علاقه مان را پیدا نکرده ایم،باید کارهایی را که به آن علاقه داریم تست کنیم حتی اگر شده در زمان کوتاه و در نتیجه کاری را انتخاب کنیم که نسبت به بقیه کارها علاقه بیشتری به آن داریم و روز به روز در آن کار پیشرفت کنیم و در هر سنی که هستیم از تغییر شرایط هراسی نداشته باشیم و برای یافتن علاقه خودمان تلاش کنیم،البته ممکن هست در بعضی موارد اشتباه پیش بیاید و یک فرد مطمئن شده باشد به زمینه خاصی علاقه بیشتری دارد، نسبت به زمینه های دیگر، ولی وقتی مقداری پیش می رود و با چالش های سخت آن کار مواجه میشود و در اولین برخورد نمیتواند آن چالش را حل کند ،میگوید من به این زمینه علاقه ندارم و باید زمینه خودرا عوض کنم. و بیشتر عمر خودرا صرف این کار میکند.و به اصطلاحی بی دلیل از این کار به آنکار میپرد.هر شغلی سختی و چالش های خاص خودش را دارد، باید صبور باشیم و تلاش کنیم تا به نتیجه برسیم .فارغ از سن و موقعیت جغرافیایی زندگی باید زمینه مورد علاقه خود را بیابیم و در آن تلاش کنیم و فارغ از نتیجه نهایی، حین انجام آن کار هم لذت ببریم و احساس رضایت داشته باشیم که پیشرفت شغلی در گرو علاقه به کاری هست که انجام میدهیم و برای حس خوشحالی منتظر رسیدن به نقطه خاصی نباشیم. نکته اخر و طلایی که باید آن را در باورهای خودمان نهادینه کنیم :متاسفانه شرایط کشور ما به گونه ای هست که فشارهای اقتصادی و اجتماعی مختلفی روی زندگی هر شخصی تاثیر میگذارد...در مواجه با این مشکلات ما دو راه بیشتر نداریم یا تسلیم شرایط شویم و ناله سرکنیم و روز به روز به پایین تر کشیده شویم و خودرا بازیچه دست رسانه ها و اخبار بد گوناگون کنیم و یا اینکه با تمام توان تلاش کنیم که سطح تخصص خودرا در هر زمینه ای که داریم بالاتر ببریم و اگر هم اخبار ناراحت کننده ای شنیدیم ناراحتی آنی و لحظه ای باشد و پس از آن دوباره به تلاش خود ادامه دهیم و سعی کنیم زندگی بهتری برای خود بسازیم(زمان قرار نیست برای ما توقف کند چه ما تلاش کنیم چه نکنیم در گذر هست )و صد البته این صحبت  شعار نیست و افراد موفق همگی این را در باورهای خودشان گنجانده اند و با هر شرایطی سعی میکنند از تلاش خود دست نکشند و تسلیم و اسیر شرایط بد نشوند...به امید روزهای بهتر برای تمام مردم سرزمینم ایران.....</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Wed, 11 May 2022 23:39:14 +0430</pubDate>
            </item>
                    <item>
                <title>بهترین منابع یادگیری برنامه نویسی اندروید(فارسی و انگلیسی)</title>
                <link>https://virgool.io/coderlife/%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D9%85%D9%86%D8%A7%D8%A8%D8%B9-%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF%D9%81%D8%A7%D8%B1%D8%B3%DB%8C-%D9%88-%D8%A7%D9%86%DA%AF%D9%84%DB%8C%D8%B3%DB%8C-z4gt4oownklj</link>
                <description>به نام خدابا سلام و وقت بخیر خدمت شما عزیزانی که این مطلب آموزشی رو مطالعه میکنیدامیدوارم که مفید باشه براتون و خوشحال میشم بعد از خوندن مقاله نظرتون رو بگیناین مطلب به سه بخش تقسیم میشه که سعی میکنم کوتاه و مفید باشهجاوا یا کاتلین برای یادگیری برنامه نویسی اندروید؟شرکت در دوره های آموزشی یا یادگیری به صورت خود آموز؟ مهم ترین منابع فارسی و انگلیسی برای یادگیری بخش اول:جاوا یا کاتلین؟به عنوان شخصی که میخواید برنامه نویسی اندروید رو شروع کنید،برای شما سوال پیش میاد کدوم زبان رو یادبگیریم و کدوم بهتره...ابتدا عرض کنم در این قسمت قرار نیست مقایسه زبان ها صورت بگیره و صرفا یک راهنمایی برای شروع هست،ولی خیلی ساده بخوام بگم زبان اصلی که چندین سال زبان پیشفرض گوگل برای توسعه بوده جاوا هست و کاتلین بعد تر اضافه شد که توسط شرکت jetbrains توسعه داده شده و کلا اگه به کاتلین مسلط بشیم،توسعه رو برای ما آسون تر میکنه و حجم کدمون هم به مراتب کمتر میشه که البته خصوصیات زیادی داره و میتونید سرچ کنید و شما به راحتی توی یه اپ میتونید هم کد کاتلین داشته باشین هم جاوا و بدون هیچ مشکلی اجرا میشه.و اینکه شما با استفاده از هر کدوم این زبان ها میتونید به راحتی هر اپی رو پیاده سازی کنید،پس حتما نیازی نیست که برای پیاده سازی اپ مد نظرتون از هر دو زبان استفاده کنید ، نکته اصلی اینجا هست که خیلی از شرکت های برنامه نویسی اپ هاشون با زبان جاوا نوشته شده و شما به عنوان توسعه دهنده ای که دنبال کار میگردین اگه فقط کاتلین بلد باشید مطمئنن گزینه های انتخابی و پیش روتون برای کار کردن کمتر میشهپس توصیه خیلی از اساتید این هست که با جاوا شروع کنیم و بعد چند ماه شروع به یادگیری کاتلین کنیم که به عنوان یک توسعه دهنده با مرور زمان به هردو زبان مسلط بشیمدر نتیجه پرونده جاوا یا کاتلین رو برای همیشه ببندیم....بخش دوم: شرکت در دوره یا یادگیری به صورت خودآموز:خیلی از افرادی که برنامه نویس حرفه ای هستن به صورت خود آموز برنامه نویسی رو یادگرفتن و عده زیادی هم با شرکت در دوره هاحالا کدوم بهتره؟ وقتی که شما خودآموز یادگیری رو شروع میکنید چون پیچیدگی مطالب و فراوانی زیاد هست و ممکن هست که ندونید از کجا شروع کنید یه خورده یادگیری براتون سخت میشه ولی مزیت اصلیش این هست که اکثرا بدون پرداخت هزینه ای میتونین برنامه نویس شین و عیبش چیه؟ زمان یادگیری طولانیشرکت در دوره های آموزشی مزیت اصلیش این هست که زمان یادگیری شما رو کمتر میکنه و وقتی برنامه نویس با تجربه ای برای شما تدریس میکنه طبق سر فصلی که نیاز هست ،تدریس میکنه و باعث میشه دنبال مطالبی نریم که شاید خیلی مورد نیاز نباشن برای یادگیریو برای مثال اگه شما به صورت خوداموز 1.5 سال طول بکشه که مطالب رو یادبگیرید،شرکت در یک دوره آموزشی خوب میتونه این زمان رو خیلی کوتاه تر کنه و شما با پرداخت هزینه ای توی زمانتون صرفه جویی میکنیدولی باز هم انتخاب شماست،اگر با پرداخت هزینه دوره ها مشکلی ندارین که خیلی هاشون هم با قیمت پایینی هستن (شرکت در دوره ها توصیه میشه)چه دوره ای خوب هست تهیه کنیم؟به عنوان شخصی که میخواید یه دوره رو تهیه کنید میتونید چند قسمت اول اون دوره رو رایگان ببینید اگه مورد پسندتون بود،تهیه کنیدو بهتره که سوابق استاد رو نگاه کنید که سابقه برنامه نویسی داشته باشه و خودش کارکرده باشه،قطعا اون خیلی میتونه مفید تر باشه نسبت به کسی که فقط تدریس کرده و سابقه کار عملی نداشته بهترین منابع برای یادگیری :دوستان لازمه عرض کنم که دوره های خوب چه فارسی و چه انگلیسی توی سطح اینترنت زیاد هستولی من طبق تجربه شخصی (یا خودم از دوره استفاده کردم یا از دیگران شنیدم که دوره خوبیه ) منابع رو معرفی میکنم و باز هم انتخاب با شما هستبهترین منبع یادگیری هرچیزی.... که ممکنه اولین بار به گوشتون میخوره و خیلی منبع خوبی هست گوگل هست: D:اگه به عنوان یک یادگیرنده نتونید ارتباط خوبی با گوگل داشته باشید هیچوقت نمیتونید یک توسعه دهنده خوبی باشید،پس بهترین راهنما گوگل هست.منابع فارسی یادگیری زبان جاوا و کاتلین؟1 - دوره آموزش جاوا سکان آکادمی : دوره رایگان و فوق العاده ای هست که به زبان ساده جاوا رو تا حد قابل قبولی آموزش میده2 - دوره آموزشی کاتلین فارسی : دوره رایگان و کاربردی هست که میتونید کاتلین رو از طریق این سایت با زبان فارسی یاد بگیرید3 - دوره متخصص اندروید سایت 7 لرن : دوره فوق العاده کاربردی هست که اگه مشکل هزینه ندارین و میتونین شرکت کنین بدون شک از دستش ندین با تدریس فوق العاده اقای سعید شاهینی که خودشون برنامه نویس حرفه ای هستن و همین دوره رو متمایز تر میکنه نسبت به بقیه..به جرات شاید گفت بهترین منبع فارسی4 - دوره های سایت uncox: که هم آموزش برنامه نویسی اندروید رو داره و هم اموزش کاتلین که شخصا آموزش کاتلینش رو شرکت کردم و واقعا فوق العاده بوده(پیشنهاد میشه)5 - دوره آموزش برنامه نویسی اندروید با کاتلین سایت آواسام : که از خیلیا شنیدم که میگن دوره خوبیه..این سایت های فارسی که معرفی کردم واقعا مورد تایید هستن و تدریسشون کاربردی هست و میتونین از هرکدوم که خواستین دمو ببینید و اون رو تهیه کنیدکه البته سایت های دیگه ای مثل فرادرس و .. هم هستن که از دوره هاشون بی اطلاع هستمبهترین منابع یادگیری به زبان انگلیسی:نکته ای که باید عرض کنم این هست شما میتونید با دوره های فارسی به حد قابل قبولی برسید ولی برای این که بخواید پیشرفت کنید و توسعه دهنده بهتری بشین باید از منابع انگلیسی استفاده کنین،چون خیلی از مباحث تخصصی تر رو نمیتونین منابع فارسی براش پیدا کنیدابتدا چند تا سایت معروف رو که میتونید ازشون استفاده کنید رو معرفی میکنم و بعد چند تا از channel های کاربردی و فوق العاده یوتیوب که اکثر مطالب رو میتونین پیدا کنید رو معرفی میکنم1 - developer android google2 -  udacity3 -  android hive4 - tutorialspoint5 -mindorks6- medium 7- caster دوره کاتلینش چند روزه رایگان شده و دوره فوق العاده ای هستچندتا سایت مهم و کاربردی برای یادگیری رو معرفی کردم که البته سایت های خوب دیگه ای هم هستن که میتونید سرچ کنید ولی مهم ترین هاشون همینا بودنخوب قسمت آخر هم معرفی چند تا channel یوتیوب که واقعا کاربردی هستن و شخصا استفاده خیلی زیادی ازشون میکنم که چند تا رو به عنوان نمونه برای شما میارم1- Coding in Flow میشه گفت بهترین منبع2- CodingWithMitch3- AndroidDevs4- MindOrks5- Simplified Coding6- Reso Coder7- Smartherd8- irlogcat: ارائه های لاگ کت رو میتونید به زبان فارسی ببینیددوستان کانال های دیگه ای هم هستن که با سرچ میتونید پیدا کنید ولی این ها فوق العاده هستن و شخصا خیلی ازشون استفاده کردمنکته ای در مورد کانال های یوتیوب باید بدونید :برای پیدا کردن آموزش موضوعی میتونید اون بالا روی playlist کلیک کنید و دوره های مختلف کانال هارو به ترتیب ببینید، ولی خیلی از این کانال ها هم نظم خاصی ندارن و بهتره شما توی سربرگ video تمام آموزش های اون کانال رو ببینید،اموزش مورد نظر رو پیدا کنید.و آخرین و مهم ترین سایت برای برنامه نویس ها سایت stackoverflow هست که میتونید سوالات خودتون رو مطرح کنید یا به سوالات دیگران پاسخ بدینو من تا جایی که تونستم سعی کردم منابع مهم رو معرفی کنم و چه به زبان فارسی و انگلیسی منابع خوب زیادی هست و ممکنه بعدا با سرچ در مورد موضوع خاصی اون سایت ها رو پیدا کنیدو خوشحال میشم اگه سایت خاصی رو میشناسین که بنده معرفی نکردم توی کامنتا معرفی کنید که دوستان استفاده کننموفق باشین یاعلی</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Thu, 07 May 2020 15:27:43 +0430</pubDate>
            </item>
                    <item>
                <title>گرفتن Rest Api از وردپرس و ساده سازی JSON دریافتی با پلاگین برای استفاده در اپ اندروید</title>
                <link>https://virgool.io/coderlife/%DA%AF%D8%B1%D9%81%D8%AA%D9%86-rest-api-%D8%A7%D8%B2-%D9%88%D8%B1%D8%AF%D9%BE%D8%B1%D8%B3-%D9%88-%D8%B3%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-json-%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA%DB%8C-%D8%A8%D8%A7-%D9%BE%D9%84%D8%A7%DA%AF%DB%8C%D9%86-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%AF%D8%B1-%D8%A7%D9%BE-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-uo1jr6ei6b94</link>
                <description>با سلام و وقت بخیر خدمت شما دوستان عزیزقصد دارم توی این مقاله در مورد این که چطور از وردپرس REST API بگیریم صحبت کنم.ما به عنوان توسعه دهنده اندروید،نیاز به بک اند داریم که بتونیم داده هایی رو که میخوایم از سرور بگیریم و در برنامه خودمون نمایش بدیم،راه حلی که معمولا ابتدای کار از اون استفاده میکنیم،سایت هایی هست که json خودمون رو روی اون آپلود میکنیم و یه لینک به ما میده که میتونیم توی اپ استفاده کنیم،ولی خوب معایبی داره برای مثال ممکنه حذف بشه فایلمون یا بخوایم چیز تازه ای اضافه کنیم که کارمون رو سخت میکنهراه حل دومی که به ذهنمون میرسه،این هست که به کسی که طراح سایت بسپریم که یک سرور برای ما ران کنه که api داشته باشه به همراه پنل که هزینه بالایی داره و قطعا راه پیشنهادی برای کسب و کار هستو راه سومی که میشه ازش استفاده کرد سیستم مدیریت محتوای وردپرس هست که به ما اجازه میده به راحتی وبسایت شخصی خودمون رو راه اندازی کنیم و با استفاده از پلاگین به طور رایگان میتونیم از وردپرسمون api بگیریم و توی اپ از داده هامون استفاده کنیم و برای راه اندازی یک سایت شخصی که نمیخوایم هزینه زیادی کنیم با کمتر از 100 هزارتومن میتونیم به راحتی راه اندازیش کنیم یا حتی رایگانخوب قطعا انتظار میره شمایی که مقاله رو میخونید کار با وردپرس رو بلد باشید در حد ابتدایی ما به دو طریق میشه از وردپرس api بگیریم یکی کدنویسی و یکی استفاده از پلاگین هست،که اگر بخوایم خودمون کدنویسی کنیم نیاز به دونستن php و .. هست ...راه دومی که ما میخوایم استفاده کنیم استفاده از پلاگین هست که پلاگینی که ما استفاده میکنیمپلاگین WP REST API که روی اسم پلاگین کلیک کنید وارد صفحه میشید و اون رو دانلود کنید و توی قسمت Plugin وردپرستون اپلود کنید و فعالش کنید.و به همین راحتی api شما ساخته میشه و به یکی از این دو آدرس میتونید json رو مشاهده کنید:mysite/wp-json/wp/v2/postsormysite/index.php?rest_route=/wl/v2/postsدر اینجا میتونیم اطلاعات مختلفی رو ببینیم، که قطعا برای ما که میخوایم صرفا یه اطلاعات ساده ای از پست هامون داشته باشیم json دریافتی خیلی پیچیده هست و مارو کلافه میکنهچند تا راه هست برای این که json رو ساده تر کنیم و ساده تر ببینیم:یکی از راه ها این هست که همه فایل رو با استفاده پلاگین از Generate POJOs from JSON توی اندروید استودیو کپی کنیم و خود به خود مدل مارو میسازه و از اونایی که نیاز داریم توی اپ استفاده کنیم و یا اینکه اضافیا رو توی اندروید استودیو حذف کنیمو راه دوم این هست با استفاده از سایت های مثل jsonEditorOnline جیسون دریافتی رو توی سایت کپی کنیم و مواردی که نیاز نداریم رو حذف کنیم و فایل نهایی رو دریافت کنیم و توی اندروید استودیو مدلمون رو بسازیمراه سومی که من میخوایم در موردش توضیح بدیم،طبق آموزشی هست که توی یوتیوب هست و میتونید این آموزش رو که 15 دقیقه هست مشاهده کنید و یک api بنویسید که صرفا id و title و contentو image هر پستی رو میگیره و نمایش میده که اگر خوب دقت کنید میتونید فیلدهای دیگه ای هم که نیاز دارید رو خودتون اضافه کنیدولی اگر مثل من حوصله ندارید خودتون کد نویسی کنید D: و یا آشنایی ندارید با php، میتونید کدنهایی این جلسه رو به از اینجا دریافت کنیدتوی تصویر بالا ،بالای سایت میبینید که نوشته download zip پلاگین رو دانلود کنید و به افزونه های وردپرس اضافه کنید و فعالش کنیدو برای دیدن فایل json ساده شده خودتون باید به جای آدرس بالا از این آدرس استفاده کنیدآدرس قبلی شما به این صورت هست:mysite/index.php?rest_route=/wp/v2/postsو آدرس جدید به این صورت:mysite/index.php?rest_route=/wl/v1/postsو json دریافتی بدون پیچیدگی هست و به راحتی میتونیم توی اپ از اون استفاده کنیمو نکته ای که مهمه ممکنه به مشکل بربخورید این هست که baseurl رو صرفا آدرس اصلی سایت بدید توی رتروفیتمثلا baseurl: iman.comو توی انوتیشن get بقیه ادرس رو قرار بدید به این صورت: GET(&quot;index.php?rest_route=/wl/v1/posts&quot;)امیدوارم که مقاله براتون مفید بوده باشهاگر سوالی داشتین یا به مشکلی برخوردین خوشحال میشم کمکتون کنمموفق باشینیاعلی</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Sat, 18 Apr 2020 14:30:14 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش اتصال سورس اندروید استودیو به گیت لب و گیت هاب به دو روش</title>
                <link>https://virgool.io/web-how/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%B3%D9%88%D8%B1%D8%B3-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D8%A7%D8%B3%D8%AA%D9%88%D8%AF%DB%8C%D9%88-%D8%A8%D9%87-%DA%AF%DB%8C%D8%AA-%D9%84%D8%A8-%D9%88-%DA%AF%DB%8C%D8%AA-%D9%87%D8%A7%D8%A8-%D8%A8%D9%87-%D8%AF%D9%88-%D8%B1%D9%88%D8%B4-eoawqaaibojw</link>
                <description>با سلام و وقت بخیر خدمت شما دوستان عزیزقصد داریم توی این مقاله در مورد چند مسئله صحبت کنیمگیت چیه؟فرق گیت هاب و گیت لب چیه؟چرا باید از گیت استفاده کنیم؟اموزش اتصال سورس اندروید استودیو به گیت با دو روش:وقتی ما به عنوان برنامه نویس شروع به کار روی یک پروژه میکنیم،ممکن هست ما بخوایم تغییرات جدیدی رو روی پروژه اعمال کنیم و نخوایم نسخه قبلی از دست بره و ممکنه وقتی تغییرات رو انجام میدیم  پروژه خراب بشه و نتونیم برگردیم به نسخه اصلی و پایدار برناممونخوب کاری که ما اینجا انجام میدیم چی هست ..میایم یک کپی از پروژه اصلی میسازیم و روی اون کار میکنیمحالا ممکنه بخوایم تغییرات زیادی رو اعمال کنیم ،همینجوری باید پشت سر هم کپی بگیریم که ممکنه بعد یه مدت بگذره و خیلی به هم ریخته باشه و ندونیم پروژه اصلیمون کجاست و واقعا از این وضعیت کلافه بشیمو یا اینکه مثلا ممکنه یه دفعه هارد ما (خدایی نکرده D:) بسوزه .. و فایل پروژه از دست برهو یا وقتی با یه تیم کار میکنیم مجبوریم هر تغییری میدیم از طریق ایمیل و یا تلگرام یا هرطریقی پروژه تغییر یافته رو برای همکارمون بفرستیم که اونا هم اگه بخوان تغییر بدن و برای ما بفرستن ..خودتون حساب کنید که چه بی نظمی پیش میادبا این موارد که گفتم پس نگهداری و توسعه پروژه سخت میشه.حالا چاره چیه؟اینجا یه مفهوم میاد وسط به اسم git ابتدا بگم دوستان git و Gitlab و github یکی نیستن گیت (Git) یک سیستم کنترل نسخه (version control) رایگان هست که gitlab و github پلتفرم های میزبانی آنلاین برای خدمات مختلف هستن که از git استفاده میکنن..پس اشتباه نکنیدگیت چه فایده ای برای ما داره؟گیت یه بستر هست که باعث میشه مشکلاتی که بالا بهش اشاره کردم تا حدود خیلی زیادی رفع بشهبرای مثال: اینکه بر بستر نت هست و هرتغییری بدیم دیگران راحت میتونن تغییرات رو بگیرن بدون ارسال از طریق تلگرام و ...میتونیم بدون دردسر نسخه های مختلفی از کد داشته باشیم و هر تغییری که دادیم به راحتی به پروژه اصلی اضافه کنیم و یا اینکه بدونیم چه کسی توی تیم چه تغییراتی رو کد اعمال کردهو مزایای زیاد دیگه ایحتی میتونیم بدون استفاده از سرویس های گیت هاب و گیت لب از گیت استفاده کنیم که البته محیطش ترمینال هست و ما بایستی اشنا باشیم.خوب تفاوت گیت هاب و گیت لب چیه از کدوم استفاده کنیم؟گیت هاب بستر بزرگتری هست و اکثر پروژه های اوپن سورس رو توی این بستر میتونید پیدا کنید متاسفانه چند ماه پیش کاربران ایرانی رو برای ساختن پروژه شخصی محدود کرد و نمیتونیم برای شرکتمون یا حتی پروژه های شخصی خصوصی ازش استفاده کنیم و برای پروژه های پابلیکی که همه بهش دسترسی دارن میتونیم ازش استفاده کنیمولی توی گیت لب به راحتی میتونیم پروژه های شخصیمون رو بسازیم که دیگران نتونن دسترسی داشته باشنو میحطشون هم خیلی شبیه هم هست و بایستی برای استفاده ثبت نام کنین توی سایت هاشون به ادرس:gitlab.com  and github.comخوب امیدوارم تا الان ضرورت استفاده از گیت رو برای شما جا انداخته باشم ..البته این قسمت کمی از مزایاش بود،میتونین بیشتر در موردش تحقیق کنینخوب بریم سراغ بحث اصلیمون که چطور پروژه اندروید استودیو رو به گیت لب اضافه کنیمچون سرویس گیت لب این روزها بیشتر استفاده میشه، طبق گیت لب پیش میریم ولی واقعا تفاوتی به اون صورت ندارن و خیلی شبیه هم هستن به راحتی میتونین با این روش کدتون رو توی گیت هابم قرار بدینبه دو روش میخوایم توضیح بدیم :روش اول با استفاده از محیط ترمینال که خیلی ساده هست و با چند خط کد میتونیم پروژمون رو اضافه کنیمو روش دوم استفاده از محیط گرافیکی برای این کار هستکه بهتره با هر دو روش آشنا باشین چون بعدا ممکنه بهش نیاز پیدا کنینبریم سراغ روش اول:ابتدا به این آدرس میریم و بسته به سیستم عامل گیت رو دانلود میکنیم(ما اینجا برای ویندوز استفاده میکنیم)سایت:https://git-scm.com/downloadsمحیط سایتخوب وقتی که دانلود کردیم مثل همه برنامه های ویندوز به راحتی نصبش میکنیم و وقتی که نصب کامل شد روی صفحه یا هرجا کلیک راست میکنیم این دو گزینه رو میبینیم:Git gui and git Bashاین نشون میده که گیت ما نصب شدهمرحله بعدی این هست که یک پروژه توی سایت گیت لب بسازیم که بتونیم سورسمون رو اینجا آپلود کنیمخوب حالا میریم توی سایت گیت لب ثبت نام میکنیم و وقتی ثبت نام کردیم اینجور محیطی رو میبنیمتوی قسمت پروژه ها بالای صفحه گزینه new project رو میزنیم و یک صفحه برای ما باز میشهبدین صورت:اون قسمت بالا اسم پروژه رو تعیین میکنیم به صورت دلخواهو قسمت description توضیحات دلخواه در صورت تمایل میتونیم برای پروژمون بنویسیمو در قسمتvisibility level تعیین میکنم پروژمون خصوصی هست یا عمومی(ما اینجا خصوصی در نظر میگیریم)و اخرین گزینه میگه که فایل readme رو اضافه کنم برای توضیحات که ما اینجا تیکش رو غیر فعال نگه میداریمخوب روی create project کلیک میکنیم و پروژه ما ساخته میشه و این صفحه رو برای ما میاره:خوب اگه صفحه رو اسکرول کنیم به پایین دقیق به ما توضیح میده که با چه کدی پروژه رو از سیستمون به گیت لب اضافه کنیم بدون هیچگونه نیاز به اینکه مطالب غیر از اون رو بلد باشید، ولی ما  مرحله به مرحله جلو پیش میریم که دقیق جا بیوفتهخوب پروژه اندروید استودیو ما ساخته شده از قبل و یا جدید میسازیم و داخل فولدر پروژمون میریم و روی صفحه ای که پروژمون هست کلیک راست میکنیم گزینهgit bash here رو کلیک میکنیم که محیط بش و محیط کد برای ما باز بشهخوب وقتی این محیط برای ما باز شد باید چند دستور رو بنویسیم و اجرا کنیم که فایل هامون به گیت لب اضافه شهاولین دستور :    git init    رو تایپ میکنیم و اکی میزنیم ،این دستور باعث میشه یک سری فایل که مربوط به استفاده از git توی برنامه هست رو بسازه که یه فولدر به اسم git. هم اضافه میکنهدومین دستور:    . git add  که فایل هامون رو به گیت اضافه میکنه و نقطه یعنی همه فایل هامون رو اضافه کنسومین دستور :   &quot;git commit -m &quot;FirstCommit  که فایل هامون رو به اصطلاح کامیت میکنیم . m- هم مخفف message هست. این پیامیه که میگیم مثلا من فلان کار رو در برنامه انجام دادم..مسیج میتونه هرچیزی باشه چهارمین دستور: (git remote add origin (project address اون قسمت پروژکت آدرس که نوشتم باید آدرس فایل گیت رو بدون استفاده از () بنویسید که خود گیت وقتی پروژه ساخته میشه اون ادرس رو به ما میده که برای من به این صورته و شما میتونید همون رو کپی کنید که بعد ساخت پروژه به شما میده توی گیت لبgit remote add origin https://gitlab.com/imanyarahmadi/imanproject.gitو اخرین دستور مربوط به پوش کردن فایل ها توی گیت لب هست که این دستور رو رو مینویسید:git push -u origin masterوقتی این رو وارد میکنیم خود به خود یه پنجره باز میشه که باید یوزر و پسوورد گیت لبمون رو به ترتیب وارد کنیم که وارد اکانتمون بشه و تموم میشه کار ما، حالا پروژه اندروید استودیو ما به گیت متصل شد و فایل هامون هم آپلود شداگه توی قسمت پروژه سایت گیت لب بریم میبینیم که به این صورت اضافه شدهخوب خیلی راحت با 4 5 دستور پروژمون رو اضافه کردیم به گیت لبحالا از این به بعد هر تغییری توی پروژه دادیم میتونیم یا از محیط کامند و یا توی منو اندروید استودیو از سربرگ vcs روی commit کلیک میکنیم و وقتی روی کامیت کلیک کردیم این پنجره برای ما باز میشهکه خودش گزینه های مختلفی داره و توضیحات زیادی که میتونید سرچ کنید در موردشونولی پنجره وسط که نوشته کامیت مسیج ما اونجا مثل محیط کامندلاین مسیج مورد نظر رو اضافه میکنیم مثلا من یه toast به برنامه اضافه کردم و مینویسم toast add یا هرچیو توی پنجره اخری هم دقیقا برنامه رو قبل و بعد تغییرات به ما نشون میده مثلا توی پنجره سمت راستی toast رو به رنگ سبز نشون میده و میگه این اضافه شدهو وقتی مسیج رو نوشتیم اون گزینه commit پایین صفحه رو کلیک میکنیم و تغییر ما commitمیشهو اخرین کار هم این هست که کدهامون رو push کنیمکه از منوی vcs-&gt;git-&gt;push که در تصویر زیر میبینید کلیک میکنیم و یه پنجره باز میشه که تغییرمون رو با زدن روی گزینه push پایین صفحه اعمال میکنیمو تمام حالا وقتی دوباره بریم توی سایت میبینیم که تغییرات اضافه شده و اون مسیجی که نوشتیم رو نشون میده به اسم toast add ...دوتا گزینه بالایی تصویر زیراز این به بعد هروقت تغییری دادیم میتونیم به راحتی با این دوکار بالا تغییرات رو ذخیره کنیمو تمام ...و خواستم بدون استفاده از محیط ترمینال اموزش بدم که دیدم سایت اندروید ریور آموزش داده و دوباره باز نویسی میشه اگه بخوام مطالب رو بنویسم که لینکش رو میزارم میتونید ببینید:https://androidriver.ir/connect-android-source-to-gitlab/که البته توصیه میکنم با محیط ترمینال هم که بالا توضیح دادم کار کنید که آشنا بشیدو یک نکته خیلی مهمی بگم که گیت خیلی وسیع هست و اصطلاحات زیادی داره که حتما درموردش مطالعه کنید ولی نمیخواد که همشو یادبگیرین در حدی که به کارتون مربوطه مثلا کامیت و پوش و مرج و پول و .....یا اینکه برنچ چیه توی گیت و چطور برنچ بسازیم ......البته برنج نیست D: و branch هستامیدوارم که تونسته باشیم به خوبی توضیح بدم و اگه جایی هم نیاز به تغییر داره یا توضیح بیشتر ممنون میشم بگید واگه دوست داشتین لایک و کامنت یادتون نره موفق باشینیاعلی</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Sat, 11 Apr 2020 21:26:31 +0430</pubDate>
            </item>
                    <item>
                <title>دریافت اطلاعات از سرور و نمایش در ریسایکلر ویو     (mvvm,rxjava,retrofit,picasso)</title>
                <link>https://virgool.io/apieco/%D8%AF%D8%B1%DB%8C%D8%A7%D9%81%D8%AA-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%A7%D8%B2-%D8%B3%D8%B1%D9%88%D8%B1-%D9%88-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D8%AF%D8%B1-%D8%B1%DB%8C%D8%B3%D8%A7%DB%8C%DA%A9%D9%84%D8%B1-%D9%88%DB%8C%D9%88mvvmrxjavaretrofitpicasoo-yzrhjictoe41</link>
                <description> با سلام و وقت بخیر خدمت شما دوستان عزیزتوی این مقاله قصد داریم که یک سری اطلاعات رو از api بگیریم و توی ریسایکلر ویو نمایش بدیمحالا از چه مفاهیم و کتابخانه هایی توی پروژه میخوایم استفاده کنیم؟mvvm,rxjava,retrofitابتدا لازم میدونم نکته ای رو عرض کنم :این مثال ساده ترین و ابتدایی ترین شکل استفاده از معماری mvvm و rx هست واین مقاله مناسب افرادی هست که اشنایی ابتدایی در مورد این موارد دارن و میخوان طرز استفاده از این موارد رو یاد بگیرنبرنامه ما بدین شکله:خوب بریم برای شروع :ابتدا برای این که ما بتونیم اطلاعاتمون رو توی برنامه بگیریم نیاز به یک api  داریم که سایت های زیادی برای ساخت api هست و ما اینجا از سایت https://www.mocky.io/ استفاده میکنیم و ساختار json  خودمون رو طبق تصویر زیر میسازیم.محیط سایت:روی generate کلیک میکنیم و لینک رو به ما میدهلینک فایل json ما:http://www.mocky.io/v2/5e9071493300002cb827d7a7در اینجا ما یه id  و یه title  و یه content  و یه image  داریم کهشناسه (id): میشه مشخصه یکتای ما برای استفاده در برنامه که ما(مثلا اینجا چهارتا آیتم داریم که آی دی از 1 تا 4 میشه)عنوان (title): میشه عنوان آیتم ما که در اینجا به عنوان اسم ماشین در نظر میگیریممحتوا (content): توضیحاتی در مورد ماشینتصویر (image): تصویر ماشین مد نظر ماشما میتونید به تعداد دلخواه اون مشخصه مورد نظرتون رو اضافه کنید و توی برنامه ازش استفاده کنید برای مثال میتونید مثلا سال ساخت ماشین رو جدا توی json تعریف کنید و یا به جای 4 آیتم ماشین 20 آیتم استفاده کنید(20ماشین مختلف)در مرحله بعدیباید یک پروژه جدید اندروید استودیوبسازیم،تنظیمات رو طبق تصویر زیر به صورت پیشفرض بزارید ،ما از زبان جاوا استفاده میکنیم توی این مثال:پروژه رو که ساختیم دومین کار این هست لایبرری های مورد نظر رو در فایل build.gradleاضافه کنیم//recyclerview and CardView
implementation &#039;androidx.recyclerview:recyclerview:1.1.0&#039;
implementation &amp;quotandroidx.cardview:cardview:1.0.0&amp;quot
//retrofit
implementation &#039;com.squareup.retrofit2:retrofit:2.7.2&#039;
implementation &#039;com.squareup.retrofit2:converter-gson:2.7.2&#039;
implementation &#039;com.squareup.retrofit2:adapter-rxjava2:2.7.0&#039;
//rxjava
implementation &#039;io.reactivex.rxjava2:rxandroid:2.1.1&#039;
implementation &#039;io.reactivex.rxjava2:rxjava:2.2.18&#039;
//picasso
implementation &#039;com.squareup.picasso:picasso:2.71828&#039;لایبرری های مورد نیاز ما این موارد هست که میتونید با سرچ کردن توی نت به صورت جدا پیداشون کنید یا همین ها رو توی برنامتون کپی کنید که اخرین نسخه هر لایبرری تا این لحظه هستخوب لازم میدونم توضیحات کلی در مورد کتابخانه هایی که ما توی برنامه استفاده میکینم رو عرض کنمابتدا ریسایکلر ویو هست که میتونیم بگیم نسل بعدی لیست ویو هست با مزایای بیشتری برای نمایش آیتم های ما در صفحه که میتونید تفاوتش رو با لیست ویو توی نت سرچ کنید..فرض من اینه که در موردش اطلاع دارین و برای طولانی تر نشدن مقاله از توضیح بیشتر خودداری میکنیمدومین لایبرری کارد ویو هست که یکی از ویجت های متریال دیزاین هست که خیلی ساده: برای زیبا تر کردن آیتم هایی که استفاده میکنیم مثلا هر ماشین یک آیتم هست باعث میشه بتونیم دور ویو رو گرد کنیم و مسائل دیگه ای...سه تا لایبری بعدی مربوط به retrofit هست که ابتدایی مربوط به خود رتروفیت هست که رتروفیت یک کتابخانه ای هست که ما میتونیم به وسیله اون اطلاعاتمون رو از سرور و api که داریم بگیریم که کتابخانه های مختلفی مثل والی و .. هست که رتروفیت استفادش ساده تر و خیلی راحت میتونیم ازش استفاده کنیمدومی: مربوط به تبدیل فایل های json  به جاوا هست...در بالا ما یک سری اطلاعات به صورت json  ذخیره کردیم که این فایل باید تبدیل به java بشه و از این کانورتر استفاده میکنیمو سومی هم به ما این قابلیت رو میده که از rx به عنوان اداپتر رتروفیت استفاده کنیملایبرری های بعدی هم مربوط به rxjava و rx android  در برنامه ما هست که ما میتونیم از این مفاهیم در برناممون استفاده کنیممن انتظار دارم یه اشنایی کلی با rx java داشته باشین و اگه ندارین حتما در موردش تحقیق کنید که یک rxjava  یک مفهوم هست در جاوا که یک سری قابلیت هاش برای اندروید کاستومایز شده و یک لایبرری هم به اسم rx android اضافه شدهو اخرین کتابخانه هم کتابخانه پیکاسو هست برای بارگزاری تصاویر ما در برنامه که لایبرری های مشابه زیادی مثل glide  و فرسکو داریم که میتونید به دلخواه از هر کدوم که تمایل داشتین استفاده کنینسعی کردم به طور خلاصه در مورد کتابخانه هایی که استفاده میکنیم توضیحات مختصری عرض کنم که هرکدوم از این مواردخودش یک مقاله جداست و برای اطلاع بیشتر در موردشون میتونید در موردشون سرچ کنیددر مرحله بعدی ریسورس های مربوط به نمایش ویو رو میسازیم که ریسورس اولی مربوط به اکتیویتی main هست که ما در این جا طبق تصویر زیر صرفا یک ریساکلر ویوو اضافه میکنیم و یک ایدی برای اون ست میکنیم&lt;?xml version=&amp;quot1.0&amp;quot encoding=&amp;quotutf-8&amp;quot?&gt;
&lt;RelativeLayout xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot
    xmlns:app=&amp;quothttp://schemas.android.com/apk/res-auto&amp;quot
    xmlns:tools=&amp;quothttp://schemas.android.com/tools&amp;quot
    android:layout_width=&amp;quotmatch_parent&amp;quot
    android:layout_height=&amp;quotmatch_parent&amp;quot
    tools:context=&amp;quot.main.MainActivity&amp;quot&gt;
&lt;androidx.recyclerview.widget.RecyclerView
    android:id=&amp;quot@+id/recyclerview&amp;quot
    android:layout_width=&amp;quotmatch_parent&amp;quot
    android:layout_height=&amp;quotmatch_parent&amp;quot/&gt;


&lt;/RelativeLayout&gt;دومین ریسورس رو خودمون با کلیک راست بر روی قسمت layout-&gt;new-&gt;layout resource file  به اسم item_recycler  میسازیم که کدش رو میتونید مشاهده کنید که یک image view برای نمایش عکس و دوتا textview  برای نمایش عنوان و متن داریم&lt;?xml version=&amp;quot1.0&amp;quot encoding=&amp;quotutf-8&amp;quot?&gt;
&lt;androidx.cardview.widget.CardView xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot
    xmlns:app=&amp;quothttp://schemas.android.com/apk/res-auto&amp;quot
    android:layout_width=&amp;quotmatch_parent&amp;quot
    android:layout_height=&amp;quotwrap_content&amp;quot
    android:layout_margin=&amp;quot8dp&amp;quot
    app:cardCornerRadius=&amp;quot8dp&amp;quot
    app:cardElevation=&amp;quot8dp&amp;quot&gt;

    &lt;LinearLayout
        android:layout_width=&amp;quotmatch_parent&amp;quot
        android:layout_height=&amp;quotwrap_content&amp;quot
        android:orientation=&amp;quotvertical&amp;quot&gt;

        &lt;ImageView
            android:id=&amp;quot@+id/iv_main&amp;quot
            android:layout_width=&amp;quotmatch_parent&amp;quot
            android:scaleType=&amp;quotfitXY&amp;quot
            android:layout_height=&amp;quot200dp&amp;quot /&gt;

        &lt;TextView
            android:id=&amp;quot@+id/tv_main_title&amp;quot
            android:layout_width=&amp;quotmatch_parent&amp;quot
            android:layout_height=&amp;quotwrap_content&amp;quot
            android:maxLines=&amp;quot1&amp;quot
            android:layout_marginStart=&amp;quot4dp&amp;quot
            android:textAppearance=&amp;quot@style/TextAppearance.AppCompat.Large&amp;quot /&gt;

        &lt;TextView
            android:id=&amp;quot@+id/tv_main_content&amp;quot
            android:layout_width=&amp;quotmatch_parent&amp;quot
            android:layout_height=&amp;quotwrap_content&amp;quot
            android:maxLines=&amp;quot3&amp;quot
            android:layout_marginStart=&amp;quot4dp&amp;quot
            android:textColor=&amp;quot@android:color/black&amp;quot
            android:textSize=&amp;quot12sp&amp;quot
             /&gt;


    &lt;/LinearLayout&gt;

&lt;/androidx.cardview.widget.CardView&gt;حالا که ریسورس هامون تکمیل شد میریم سراغ کدهای جاوا:خب توی این مرحله میایم سه تا پکیج به پروژه اضافه میکنیم برای زیبایی و بهتر فهمیدن کدمون در آینده که پکیج بندی باعث میشه که راحت تر به کلاس مورد نظرمون دسترسی داشته باشیم در آیندهطبق تصویر زیر سه تا پکیج داریمhttp:کلاس های مربوط به رتروفیت رو برای گرفتن دیتا از سرور اینجا میسازیمData:کلاس های مربوط به نمایش ویو مثل اداپتر و مدل ریسایکلر ویوو رو اینجا میسازیمMain:کلاس های اصلی و پایه برنامه رو اینجا میسازیمتوی پکیج دیتا یک کلاس جدید به اسم Car  میسازیم که به عنوان مدل ریسایکلر ویوو ما استفاده میشه،مدل چیه : ساختار json ای که قبلا ساختیم رو اینجا به این صورت که توی تصویر زیر میبینید تعریف میکنیم و میگیم ماشین ما این مشخصات رو دارهبعد باید برای این مشخصه هامون getter  و setter تعرف کنیم که برای این کار پایین صفحمون کلیک راست میکنیم رو گزینه generate  کلیک میکنیم و روی getter and setter کلیک میکنیم و فیلدهامون رو همه انتخاب میکنیمکدنهاییمون به این صورت میشه:public class Car {
    private int id;
    private String title;
    private String content;
    private String image;

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String getImage() {
        return image;
    }
    public void setImage(String image) {
        this.image = image;
    }
}البته یک نکته ای رو عرض کنم ممکنه ایتم های شما زیاد باشن و نخواید یکی یکی به صورت دستی توی مدلتون بنویسید و اینجا میتونید از پلاگین هایی که موجود هست استفاده کنید به عنوان مثال پلاگین generate POJOs form JSON که به راحتی json شما رو به همراه getter  و setter  تبدیل به کلاس جاوا میکنهمیتونید در موردش سرچ کنیدو نوبت میرسه به ساخت adpater برای ریسایکلر ویو:یک کلاس جدید میسازیم و اسمش رو CarAdpater میزاریم و بعد این کلاس میاد extend میکنه recyclerView.Adapterرو که در اینجا نیاز به یک ویو هولدر داره که مثل تصویر زیر اون رو میسازیمبعد موس رو روی ویو هولدر و کلاس اصلیمون نگه میداریم و alt و اینتر رو میزنیم که متد های مورد نظر ما رو implement کنه که کد به این صورت در میاد:و نوبت میرسه به فراخوانی view ها و استفاده از اون ها در این کلاس  که کدنهایی adapter ما به این صورت میشه:public class CarAdapter extends RecyclerView.Adapter&lt;CarAdapter.RvViewHolder&gt; {

    private List&lt;Car&gt; cars;
    private Context context;

    public CarAdapter(List&lt;Car&gt; cars, Context context) {
        this.cars = cars;
        this.context = context;
    }

    @NonNull
    @Override
    public RvViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return new RvViewHolder(LayoutInflater.from(context).inflate(R.layout.item_recycler, parent, false));
    }

    @Override
    public void onBindViewHolder(@NonNull RvViewHolder holder, int position) {
        holder.Bind(cars.get(position));
    }

    @Override
    public int getItemCount() {
        return cars.size();
    }

    public class RvViewHolder extends RecyclerView.ViewHolder {
        private ImageView iv;
        private TextView tvTitle;
        private TextView tvContent;

        public RvViewHolder(@NonNull View itemView) {
            super(itemView);
            iv = itemView.findViewById(R.id.iv_main);
            tvTitle = itemView.findViewById(R.id.tv_main_title);
            tvContent = itemView.findViewById(R.id.tv_main_content);
        }

        public void Bind(Car car) {
            Picasso.get().load(car.getImage()).into(iv);
            tvTitle.setText(car.getTitle());
            tvContent.setText(car.getContent());
        }
    }
}که توی کانستراکتور کلاسمون لیستی از ماشین و کانتکس رو بایند میکنیم و در متد oncreateviewholderباید اون ریسورسی که برای ریسایکلرویو ساختیم رو پاس بدیمو در bindviewholderمیگیم که این موارد رو برای ما با استفاده از id ست میکنه title,content,imageو قسمت بعدی تعداد ماشین هامون هست که طبق کد ست میکنیمومتد بایند میایم ویوهامون رو با استفاده از کلاس Car که ساختیم طبق کد بالا ست میکنیمدرمرحله بعدی ما یک اینترفیس به اسم ApiService توی پکیج http میسازیم و کد به این صورت هستpublic interface ApiService {
    @GET(&amp;quot5e9071493300002cb827d7a7&amp;quot)
    Single&lt;List&lt;Car&gt;&gt; getCars();
}ابتدا از انوتیشن get@ که مربوط به رتروفیت برای گرفتن اطلاعات از سرور هست استفاده میکنیم و توی &quot; &quot; باید انتهای ادرسی که داریم رو قرار بدیم بدین صورت که ادرس کامل ما این هست http://www.mocky.io/v2/5e9071493300002cb827d7a7 که اون قسمت انتهاییش رو ما توی دابل کوتیشن میزاریم و در قسمت بعدی یک متد داریم که میگیم یه لیست از ماشین ها با استفاده از single به ما برگردون که سینگل یک observable آرایکس جاوا هست که جلوتر در موردش توضیح میدمدر قسمت بعدی یک کلاس توی پکیج http به اسم ApiServiceSingleton میسازیم که اینجا میخوایم یک نمونه از رتروفیت بسازیم کد کامل به این صورت میشه:public class ApiServiceSingleton {
    private static ApiService apiService;

    public static ApiService getInstance() {
        if (apiService == null) {
            Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(&amp;quothttp://www.mocky.io/v2/&amp;quot)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
            apiService = retrofit.create(ApiService.class);

        }
        return apiService;
    }
}ابتدا که نمونه از کلاس api service میسازیم به صورت استاتیک که مطمئن بشیم به صورت ایستا هست و جایی دیگه نمونه ازش ساخته نمیشه و توی کد چند قسمت هست که مختصر توضیح میدمیه قسمت به اسم base url که اون قسمت ابتدایی اسم سایتی که ازش استفاده میکنیم رو قرار میدیمدر قسمت بعدی میگیم که کانورتر ما برای تبدیل کدهای json به جاوا gson باشهو در قسمت بعدی میگیم که از rxjava میخوایم به عنوان کال آداپترمون استفاده کنیم بعدم با create میسازیم نمونمون رو..در قسمت بعدی یک کلاس به اسم MainViewModel میسازیم برای این که از معماری mvvm به طور خیلی ساده استفاده کرده باشیم..بدین صورت:public class MainViewModel {
    private ApiService apiService;

    public MainViewModel(ApiService apiService) {

        this.apiService = apiService;
    }

    public Single&lt;List&lt;Car&gt;&gt; getCars() {
        return apiService.getCars();
    }
}و میایم در کانستراکتور کلاس ApiService رو بایند میکنیمو در قسمت بعدی یک متد میسازیم که میاد متد getCars که توی Api سرویس ساخته بودیم رو برمیگردونهو در قسمت بعدی کد مربوط به کلاس main رو مینویسم که مربوط میشه به گرفتن نمونه از کلاس viewmodel و ست کردن ریسایکلر ویو که کدنهاییش به این صورت میشه:public class MainActivity extends AppCompatActivity {
    public RecyclerView recyclerView;
    private CarAdapter carAdapter;
    Disposable disposable;
    private static final String TAG=&amp;quotMainActivity&amp;quot
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MainViewModel mainViewModel = new MainViewModel(ApiServiceSingleton.getInstance());
        mainViewModel.getCars().subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new SingleObserver&lt;List&lt;Car&gt;&gt;() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        disposable = d;
                    }

                    @Override
                    public void onSuccess(List&lt;Car&gt; cars) {
                        Log.i(TAG, &amp;quotonSuccess: &amp;quot+cars);
                        recyclerView=findViewById(R.id.recyclerview);
                        recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false));
                        carAdapter = new CarAdapter(cars, MainActivity.this);
                        recyclerView.setAdapter(carAdapter);
                    }

                    @Override
                    public void (Throwable e) {
                        Toast.makeText(MainActivity.this, &amp;quoterror&amp;quot + e.toString(), Toast.LENGTH_SHORT).show();
                    }
                });
    }
}توی قسمت بالا ما ابتدا میایم یه نمونه ازMainviewModelمیسازیم که توی کانسراکتورش اون نمونه ای از apiservice که ساخته بودیم رو بهش پاس میدیمدر قسمت بعدی طبق تصویر زیرما باید با استفاده از rxjava لیست ماشین هامون رو بگیریمچندتا مفهوم میبینیم که درموردشون توضیح میدمسینگل Observable توی rx java که دو حالت داره یا به ما نتیجه رو برمیگردونه و یا ارور میدهو Observableمختلفی هست توی rx مثلا Completableکه فرقش با سینگل این هست که فقط میگه کار انجام شد یا نه ..نتیجه ای برنمیگردونه که بعضی جاها کاربرد داره میتونید در مورد تفاوتشون سرچ کنید اولین مفهوم subscribe on هست که میگیم داده هامون رو که میگیری توی ترد جدید بگیر و وقتی گرفتیشون observe کن روی ترد اصلیمون و بعد میایم subscribe میکنیم و new میکنیم single که قبلا داشتیم رو که خودش سه تا متد ایمپلمنت میکنه onsubscribe و onsuccess و که توی متد onsuccess داده ما با موفقیت گرفته میشه و ما توی ریسایکلر ویو نمایش میدیم ،طبق کدبالاو میگیم اگر ارور داد به هر طریقی توی قسمت به ما نمایش بده متن ارور روحالا چه مزیتی داشت استفاده از rxjava:ابتدا باعث شد به راحتی و با دو خط کد بگیم روی ترد دیگه ای اجرا کنه این تسک رو و دیگه از async task استفاده نکردیم و قابلیت های خیلی زیادی داره که میتونیم در موردش سرچ کنیمو فراموش نکنید برای اجرای برنامه توی مانیفست دسترسی اینترنت بدینو usesCleartextTraffic:true رو هم توی مانیفست ست کنید.امیدوارم که مقاله براتون مفید بوده باشهو واقعا توضیح دادن این مطالب توی متن خیلی سخته و به صورت ویدیویی خیلی بهتر میشه توضیح داد درموردش اگرم به نظر شما جایی اشتباه بوده خوشحال میشم بگین که تصحیح کنمو لینک گیت هاب پروژه رو هم قرار میدم که بتونید اجرا کنید و کد کامل رو ببینیدhttps://github.com/iManYarahmadi/CarShowJavaو سعی میکنم طی روزهای آینده کد کاتلینش رو هم بزارم که شما بتونید مقایسه کنیدیاعلی</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Sat, 11 Apr 2020 00:35:35 +0430</pubDate>
            </item>
                    <item>
                <title>مسیریادگیری فرد علاقه مند به رشته کامپیوتر از تجربه فیلدهای مختلف تا رسیدن به برنامه نویسی اندروید(قسمت اول)</title>
                <link>https://virgool.io/coderlife/%D9%85%D8%B3%DB%8C%D8%B1%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D9%81%D8%B1%D8%AF-%D8%B9%D9%84%D8%A7%D9%82%D9%87-%D9%85%D9%86%D8%AF-%D8%A8%D9%87-%D8%B1%D8%B4%D8%AA%D9%87-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-%D8%A7%D8%B2-%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D9%81%DB%8C%D9%84%D8%AF%D9%87%D8%A7%DB%8C-%D9%85%D8%AE%D8%AA%D9%84%D9%81-%D8%AA%D8%A7-%D8%B1%D8%B3%DB%8C%D8%AF%D9%86-%D8%A8%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%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-kqgeurpbvvna</link>
                <description>با سلام و وقت بخیر خدمت شما عزیزانی که تصمیم گرفتین این مطلب رو بخونینهدف من از نوشتن این مطلب به اشتراک گذاری تجربیات خوب و بدی که تو چند سال گذشته کسب کردم ، با شما عزیزانی هست که رشته کامپیوتر رو انتخاب کردین و قصد دارین توی یه زمینه ای خاص تخصص پیدا کنین و وارد بازار کار بشین.در ابتدا این مسئله رو عرض کنم که به ممکنه یه خورده متن طولانی بشه و سعی من بر این هست که تا جایی که میتونم کوتاه کنم و ممکنه توی دو قسمت اون رو منتشر کنم.قسمت اول کلیت انتخاب مسیر یادگیری هست و قسمت دوم مربوط به مسیر یادگیری برنامه نویسی اندروید هست که توصیه میکنم حتما قسمت اول رو بخونینوهدفم این هست که به صورت موضوعی بحث کنم و پاسخگوی سوالاتی باشم که ممکنه برای شما به وجود بیاد.چه سوالاتی؟دانشگاه برم یا نه؟چه زمینه ای رو برای یادگیری انتخاب کنم؟برنامه نویسی،شبکه،امنیت و ... ؟حالا که من مسیرم رو انتخاب کردم چطور منبع اموزشی خوب برای یادگیری گیر بیارم؟چقد طول میکشه تا متخصص شم؟و خیلی از سوالات دیگه ای که به عنوان کسی که رشته کامپیوتر رو انتخاب کرده ممکنه توی ذهن شما پیش بیاد، که قراره من در ادامه تا جایی که میتونم و تجربه کردم رو برای شما به اشتراک بزارم و بیشترین موردی که روش تاکید دارم سوال دوم هست که چه زمینه ای رو انتخاب کنم ،من که نمیدونم علاقم رو کدومه و کدوم درامد بیشتری برای من داره و ...؟خوب آماده اید بریم سراغ اصل مطلب؟دانشگاه برم یا نه؟راستش این سوال دانشگاه برم یا نه بیشترین سوالی هست که دیدم پرسیده میشه و سوال خودم هم بود...و از هرکی که صاحب نظر بود میپرسیدم این جواب رو میشنیدم،نه میگم نرو نه میگم برو؟D:و میدونم که خیلی این جواب رو شنیدین...دوستان بدون مقدمه در این مورد این رو عرض کنم ، شخصی که وارد دانشگاه میشه به عنوان کسی که سال ها تلاش کرده و درس خونده حداقل انتظار داره بعد این که مدرکش رو گرفت، بتونه توی یه زمینه ای متخصص شده باشه و وارد بازارکار بشه ،ولی متاسفانه اینطور نمیشه و شخصی مثلا کارشناسی ارشد نرم افزار داره  به جز ویندوز عوض کردن کاری نمیتونه انجام بده،که خیلی این رو مشاهده کردین بین دوستانتون، متاسفانه بیشترین بیکاری بین رشته ها هم مربوط رشته کامپیوتر هست.چرا؟حالا این علت های زیادی داره یکی از این علت ها بی سوادی خیلی از اساتید هست که متاسفانه تخصص ندارن و نمیتونن مطلبی رو با دانشجو به اشتراک بزارن (البته با احترام زیاد نسبت به اساتیدی که واقعا متخصص هستن ولی انگشت شمارن)و اگرم مطلبی رو که خوب تدریس میکنن ممکنه خیلی قدیمی باشه به درد الان نخوره و ضعف های دیگه ای که همه شاهدش بودیم....و متاسفانه چون اساتید صرفا کتاب رو خوندن و حفظ کردن و دیدی درمورد کار عملی ندارن حتی نمیتونن به شما سرنخ بدن و شمارو توی مسیری که دوست دارین ادامه بدین راهنمایی کنناین ضعف های خیلی زیاد و مهم باعث میشه که ادم خیلی تمایلی به دانشگاه رفتن یا ادامه تحصیل نداشته باشه.نتیجه گیری؟حالا با این ضعفا پس دانشگاه به چه دردی میخوره ؟دوستان این ضعف هایی که گفتم رو قطعا اکثر جاها هست ولی دانشگاه رفتن فایده هایی هم داره که نمیشه ازش چشم پوشی کرد؟یکی از فایده هاش این هست که ما با مفاهیم پایه ای رشته کامپیوتر اشنا میشیم...مثل ساختمان داده،پایگاه داده و یادگیری پایه زبان های برنامه نویسی که یه دید کلی بهمون در مورد رشته کامپیوتر میده و مهم هستن، براتون مثال بزنم: مفاهیمی رو توی دانشگاه خوندم مثل استک و صف و با خودم میگفتم این به چه درد من میخوره و قدیمیه...جلوتر که اومدم توی یه تخصصی که یه سال کار کردم به استفاده از مفاهیمی برخوردم که توی دانشگاه خونده بودم و دید خوبی بهم داده بود خوندنشون(ولی واقعا اونقدی مهم نبودن مباحث، که بخوام به خاطرش دانشگاه برم)و فایده دیگش هم این هست جدای از یادگرفتن اداب معاشرت با دیگران ،دوستان خوبی هم گیر میاریم که ممکنه متخصص باشن توی یه زمینه ای و ما بتونیم با کمک اونا پیشرفت کنیم.و فایده هایی زیاد دیگه ای که قلمم عاجزه از نوشتنشون(هیچ فایده دیگه ای نداره) D:خیلی ها میگن بیل گیتس،مارک زاکربرگ .. ترک تحصیل کردند ،پس منم ترک تحصیل کنم،موفق میشم.دوستان اینطور نیست این افراد یه چیزایی بلد بودن یه کاری رو راه انداختن و دیدن که وقت نمیکنن برن دانشگاه و ترک تحصیل کردن(نکتش این مورد هست)پس این بهانه هست...و نکته اصلی اینجاست: درس خوندن تو دانشگاه هیچ منافاتی با یادگیری تخصص نداره...اگه توجه کنیم حتی وقتی دانشگاه میریم خیلی وقت ازاد داریم تو روز،میتونیم زمان بزاریم و متخصص شیم تا وقتی دانشگاهمون تموم شد و راحت بتونیم وارد بازار کار بشیم.من خودم کارشناسی رو چند ماه پیش گرفتم و دیدم دیگه نیاز نیست ارشد بخونم و باید یه خورده برای تخصصم وقت بیشتری بزارم و وارد بازارکار بشم.پس پیشنهادم حداقل برای رشته ما این هست که اگه دوست دارین مدرک اکادمیک داشته باشین و صرفا با دید گرفتن مدرک برین دانشگاه! که خدایی نکرده لطمه نخورین! و هیچ انتظاری از محیط دانشگاه برای یادگیری نداشته باشیناگرهم مدرک برای شما مهم نیست دانشگاه هم نرید چیزی از دست ندادینو مجدد تکرار میکنم حتی اگه دانشگاه رفتین منافاتی با یادگیری شما در بیرون از دانشگاه نداره.و ممکنه بگین فلان دانشگاه بهتره و این دید اشتباهی هست چون برای رشته های عملی خیلی دانشگاه فرقی نمیکنهپس لطفا دیگه پرونده دانشگاه برم یا نه،کدوم دانشگاه بهتره و... رو ببندید،چون صرفا وقتتون تلف میشه.قسمت دوم:خوب حالا بریم سراغ قسمت دوم که چه زمینه ای رو برای یادگیری انتخاب کنم و ...این قسمت خیلی مهمه و ممکنه یه خورده طولانی بشه،ولی صبر به خرج بدید و مطمئنم کمکتون خواهد کرد که زودتر تصمیمتون رو بگیرین و وقت خودتون رو تلف نکنینابتدا مسیر یادگیری خودم رو شرح میدم، که بعد بگم معایب این مسیر چی بوده و شما مسیری مشابه مسیری که من سپری کردم رو طی نکنید.با من همراه باشید...به عنوان کسی که از کودکی علاقه مند به کامپیوتر بودم از کلاس پنج یا هفت ...ازم میپرسیدن میخوای چه کاره شی؟همه میگن دکتر و خلبان و ... من میگفتم دوست دارم برم رشته کامپیوتر ،البته اون موقع دید کاملی نداشتم چون سنم کم بود ،صرفا به خاطر بازی کردن میگفتم ،بازی کردن رو خیلی دوست داشتماومدم جلوتر کم و بیش  یه ویندوز عوض میکردم که xp بود و خیلی لذت میبردم ،رسیدم به پایه اول دبیرستان حالا همه میگفتن بهم تو ریاضیت خوبه برو رشته ریاضی بعدش تو دانشگاه اگه دوست داری برو کامپیوتر ولی من دوست داشتم برم رشته فنی که زودتر وارد رشته کامپیوتر بشم.رفتم رشته فنی چند ماه گذشت یه مقدار در مورد html  و .. به ما توضیح دادن من علاقه مند شدم به یادگیری طراحی سایت ،توی اینترنت در موردش خوندم البته خیلی جدی نگرفتم ..بیشتر مشغول بازی کردن بودم(cod 4) بودم ،که کاش نمیبودم،چون خیلی وقتم رو میگرفت ولی لذت داشتD:یه مقدار زمان گذشت یه دوستی در مورد وردپرس بهم توضیح داد،زمان گذاشتم و یادگیریش رو ادامه دادم و با هم یه سایت دانلود نرم افزار با وردپرس راه انداختیم..که متاسفانه ادامه ندادیم،بعد گفتم باید حرفه ای تر شم و اتقافی با اموزش طراحی وب اقای آوند سایت 7 لرن آشنا شدم که css  و html کار کردم ،گذشت دوره php رو خریداری کردم و تمرینی یه سری قالب طراحی میکردم.که اندک درامدی هم داشتم توی طراحی سایتکه واقعا اموزش های 7 لرن فوق العاده هستن که توی قسمت بعدی درمورد منابع بیشتر توضیح میدمچندماهی که گذشت یه دوستی داشتم بهم گفت اگه فتوشاپ بلدی قراره چاپ بنر بزنم ،بیا پیش خودم کار کنیه دفعه طراحی وب رو کنار گذاشتم و رفتم فتوشاپ رو یادگرفتم ،ابتدا به صورت رایگان چندماهی کارکردم و بعد کسب تجربه نزدیک به یک سالی توی شرکتای مختلف کار کردم با حقوق نسبتا پایینیکسال که از یادگیر فتوشاپم گذشت،گفتم عدم تمرکز فایده نداره، باید یه زمینه ای رو انتخاب کنم و اون رو ادامه بدم و اومدم وقتم رو گذاشتم رو مباحث امنیت ،خیلی وقت گذاشتم لینوکس رو یادگرفتم و مباحث مختلف و بعد چند ماه بعد به دوره هک و امنیت سایت اشیانه رفتم ...که راستش دوره قوی نبود برعکس تبلیغات و بزرگنماییولی دوستان خوبی پیداکردم،دو سالی گذشت ،دیدم که واقعا صرفا یه تصمیم هیجانی بوده و شاید خیلی علاقه ندارم،صرفا به خاطر جذابیت این زمینه بوده،البته خیلی چیزا یادگرفته بودمو یه نکته هم بگم درمورد یادگیری مباحث مربوط به هک امنیت اگه بخواین یه متخصص واقعی باشین به تمرکز و صبر و زمان خیلی زیادی نسبت به سایر رشته ها نیاز هست،باید نسبت به همه فیلدها دید داشته باشین،البته منظور من هکر واقعی هست نه کرکرو این هم گذشت...اومدم یه خورده برنامه نویسی اندرویدکار کردم دیدم که ازهمه کارهایی که قبلا انجام دادم و یادگرفتم برام جذابیت بیشتری دارهحالا چرا این همه توضیح دادم؟توی این همه زمینه زمان گذاشتم به نتیجه ای رسیدم؟تقریبا این فیلدها 4 5 سال از وقتم رو گرفتن؟ارزششو داشت؟یه جمله معروف هست که میگن طرف اقیانوسی هست به عمق یک سانتی متر، یعنی از زمینه های مختلف اطلاع داره ولی توی هیچکدوم عمیق نیستحالا تصورکنید من اگه 5 سال گذشته تا الان فقط طراحی وب کار میکردم الان کسی بودم که 5 سال سابقه داره و بدون شک با تخصص خیلی بالا و حقوق بالاو ممکنه شما پیش خودتون بگین که الان درمورد خیلی چیزا اطلاع داری و  این که خیلی خوبه، ولی اینطور نیست، شما باید تمام تمرکزتون رو بزارید روی یه تخصص و درکنارشم دوست داشتین درمورد فیلدای دیگه مطالعه کنین،ولی هدف اصلی و تخصص شما باید تمرکز و یادگیری توی یه فیلد خاص باشهحالا چطور بفهیم که ما به چه فیلدی علاقه داریم؟بهترین راه این هست طبق نظر اساتید صاحب نظر که اول علاقه هاتون رو محدود کنید و مثلا میرسید به دوتا فیلد یا سه تا فیلد،حالا سه ماه زمان بزارید و یه ماه رو به هرکدوم اختصاص بدین و بعد سه ماه تجربه کار با همه رو دارین در حد مقدماتی، قطعا یکیشون جذابیت بیشتری براتون داره و همون رو انتخاب کنید.ولی بیشتر از این وقتتون رو تلف نکنیدمیشه 4 سال من رو شما تو سه ماه تجربه کنید.مثلا من برنامه نویسی اندروید کار کردم ،وقتی نرم افزاری که روش کارکردم رو روی گوشیم میدیدم لذت بیشتری برام داشت تا یه وبسایت طراحی کنم! پس نزارید انتخاب زمینه برای یادگیری بیشتر از این زمان وقتتون رو بگیره!حالا ممکنه بگین مثلا من به طراحی وب علاقه مند هستم ولی برنامه نویسی موبایل درامد بیشتری داره؟این دیدگاه اشتباهی هست که وجود داره مطمئن باشین توی هر زمینه ای متخصص بشین به شرطی که صبور باشین و علاقه داشته باشین به نتیجه میرسین و درامد بالایی هم در انتظارتون خواهد بود،پس این دیدگاه اشتباه رو دور بریزینو اخرین موضوع قسمت اول :حالا ما انتخاب کردیم چه فیلدی رو ادامه بدیم،چقد طول میکشه به نتیجه برسیم؟دوستان وقتی به این مرحله رسیدید مهم ترین مسئله داشتن هدف هست،باید یه هدف بلند مدت داشته باشید یه هدف میان مدت و یه هدف کوتاه مدت چطور؟من میگم سه سال دیگه باید برنامه نویس ارشد یه شرکت باشم(هدف بلند مدت)،و 1.5 سال دیگه باید بتونم وارد بازار کار بشم و کارم رو شروع کنم(میان مدت) و شش ماه دیگه باید بتونم پروژه های کوچیکی که توی ذهنم هست برای یادگیری انجام بدم(کوتاه مدت)نکته ای رو که باید در نظر بگیرید این هست که زمان این هدف گذاری کاملا به خودتون بستگی داره و کسی که روزی 10 ساعت مثلا وقت میزاره با کسی که روزی دو ساعت وقت میزاره قطعا زمان رسیدن به هدف متفاوت هست.ولی چیزی که گفتم تقریبا استاندار هست برای کسی که روزی 4 5 ساعت وقت میزاره،حالا هدف گذاری چه فایده ای داره؟هدف گذاری بلند مدت باعث میشه که ما بلندپروازی الکی نداشته باشیم و بگیم مثلا من باید شش ماه دیگه مایی 10 میلیون حقوق داشته باشم و هدف گذاری کوتاه مدت و میان مدت باعث اشتیاق در کارکردن و یادگیری میشهو چند نکته هم که خیلی مهم هستن توی یادگیری: الانِ خودمون  که شش ماه کار کردیم رو نباید با کسی که 5 سال کارکرده مقایسه کنیم چون باعث ناامیدی میشه باید صبور باشیم،چون قطعا متخصص شدن زمان زیادی رو از ما میگیره به جای این که یک هفته  روزی 10 ساعت کار کنیم و یک هفته اصلا کار خاصی انجام ندیم. باید ریتم مرتبی برای یادگیری داشته باشیم، برای مثال عهد ببندیم روزی 4 ساعت کار کنیم ولی به طور منظم و در طولانی مدت تمرین و تلاش و صبر مهم ترین نکات هستند توی برنامه نویسی و توی رشته کامپیوتر برای متخصص شدن در یک زمینه خاص ممکنه بعد یه مدت بی انگیزگی سراغ ادم بیاد ،این جور موقعی باید یه اقدام کوچک کنیم و وقتی نتیجه کوچیکی میبنیم دوباره انگیزه برمیگرده،پس اقدام خیلی مهمهدوستان امیدوارم که از خوندن مطلب لذت برده باشین و اگه نظری داشتین خوشحال میشم بشنوم.و ببخشید اگر که متن ضعفی داشت یا نکته ای رو من فراموش کردم،سعی کردم تجربیاتم رو با شما به اشتراک بزارم. در قسمت بعدی در مورد مسیر یادگیری اندروید صحبت میکنم.امیدوارم که موفق باشینبا تشکر از دوست عزیزم کیوان</description>
                <category>ایمان یاراحمدی</category>
                <author>ایمان یاراحمدی</author>
                <pubDate>Wed, 18 Mar 2020 21:45:05 +0330</pubDate>
            </item>
            </channel>
</rss>