<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>Mahdi Tajik</title>
	<atom:link href="http://www.mahditajik.ir/feed/" rel="self" type="application/rss+xml"/>
	<link>http://www.mahditajik.ir</link>
	<description>I'm Mahdi Tajik. I am project manager and Full-stack Android developer. welcome to my personal website.</description>
	<lastBuildDate>Mon, 21 Sep 2020 06:48:25 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.2.6</generator>

<image>
	<url>http://www.mahditajik.ir/wp-content/uploads/2015/03/cropped-sample-logo-MT-2-32x32.png</url>
	<title>Mahdi Tajik</title>
	<link>http://www.mahditajik.ir</link>
	<width>32</width>
	<height>32</height>
</image> 
	<itunes:explicit>no</itunes:explicit><itunes:subtitle>I'm Mahdi Tajik. I am project manager and Full-stack Android developer. welcome to my personal website.</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Software How-To"/></itunes:category><item>
		<title>توتی (توت فرنگی)</title>
		<link>http://www.mahditajik.ir/tooti/</link>
					<comments>http://www.mahditajik.ir/tooti/#respond</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Mon, 21 Sep 2020 06:40:37 +0000</pubDate>
				<category><![CDATA[برنامه های من]]></category>
		<category><![CDATA[توت فرنگی]]></category>
		<category><![CDATA[توتی]]></category>
		<category><![CDATA[کسب و کار]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2921</guid>

					<description><![CDATA[<p>توتی دستیار هوشمند کسب کارهای کوچک و خانگی حتما شما هم می دونید که داشتن کسب و کار آنلاین چقدر می تونه جذاب و پر درآمد باشه. ولی بدون داشتن ابزار مناسب برای مدیریت موجودی محصولات و یا فروش کمی سخت میشه و با بزرگتر شدن شبکه شما دیگه نمی تونید با سرعت و دقت ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/tooti/">توتی (توت فرنگی)</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[
<p><a href="http://toot-farangi.ir/" target="_blank" rel="noreferrer noopener">توتی </a>دستیار هوشمند کسب کارهای  کوچک و خانگی</p>



<p>حتما شما هم می دونید که داشتن کسب و کار آنلاین چقدر می تونه جذاب و پر درآمد باشه. ولی بدون داشتن ابزار مناسب برای مدیریت موجودی محصولات و یا فروش کمی سخت میشه و با بزرگتر شدن شبکه شما دیگه نمی تونید با سرعت و دقت لازم پاسخگوی نیاز مشتریاتون باشید و شاید بخشی از آنها یا سهمی از بازار رو دست بدین!<br>با توتی (توت فرنگی) کنترل کاملی روی موجودی محصولات تان دارید می تونید به راحتی فاکتور صادر کنید و مشتریان رو با مشخصات دلخواه ذخیره کنید. آمار کاملی از همه فعالیت هاتون رو بصورت روزانه هفتگی یا ماهانه ببینید. در ضمن کلی ابزار جانبی داره که همش بهتون کمک می کنه فقط متمرکز روی کسب و کارتون بشید و بیشتر و بیشتر بفروشید!</p>



<figure class="wp-block-image size-large is-style-default"><img decoding="async" loading="lazy" width="1024" height="512" src="http://www.mahditajik.ir/wp-content/uploads/2020/09/1-1024x512.jpg" alt="" class="wp-image-2923" srcset="http://www.mahditajik.ir/wp-content/uploads/2020/09/1-1024x512.jpg 1024w, http://www.mahditajik.ir/wp-content/uploads/2020/09/1-300x150.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2020/09/1-768x384.jpg 768w, http://www.mahditajik.ir/wp-content/uploads/2020/09/1-1536x768.jpg 1536w, http://www.mahditajik.ir/wp-content/uploads/2020/09/1.jpg 1654w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" loading="lazy" width="1654" height="827" src="http://www.mahditajik.ir/wp-content/uploads/2020/09/2-1024x512.jpg" alt="" class="wp-image-2924" srcset="http://www.mahditajik.ir/wp-content/uploads/2020/09/2-1024x512.jpg 1024w, http://www.mahditajik.ir/wp-content/uploads/2020/09/2-300x150.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2020/09/2-768x384.jpg 768w, http://www.mahditajik.ir/wp-content/uploads/2020/09/2-1536x768.jpg 1536w, http://www.mahditajik.ir/wp-content/uploads/2020/09/2.jpg 1654w" sizes="(max-width: 1654px) 100vw, 1654px" /></figure>



<figure class="wp-block-image size-large"><img decoding="async" loading="lazy" width="1024" height="512" src="http://www.mahditajik.ir/wp-content/uploads/2020/09/3-1024x512.jpg" alt="" class="wp-image-2925" srcset="http://www.mahditajik.ir/wp-content/uploads/2020/09/3-1024x512.jpg 1024w, http://www.mahditajik.ir/wp-content/uploads/2020/09/3-300x150.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2020/09/3-768x384.jpg 768w, http://www.mahditajik.ir/wp-content/uploads/2020/09/3-1536x768.jpg 1536w, http://www.mahditajik.ir/wp-content/uploads/2020/09/3.jpg 1654w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>نرم افزار توتی (توت فرنگی) یک دستیار حرفه‌ای برای کسب کارهای کوچک و متوسط خانگی است.<br>بخش های اصلی برنامه متشکل از انبار ، مشتریان، صدور فاکتور می باشد.<br>می توانید لیستی از محصولات ایجاد کرده و اطلاعات محصول از قبیل نام بارکد قیمت ، تعداد و مشخصات دیگر را وارد کرده و سپس برای فروش از آنها استفاده کنید. می توانید به راحتی با انتخاب محصولات مورد نظر و تعداد به راحتی فاکتور صادر کنید. بخش مشتریان نیز برای مدیریت مشتریان قابل دسترسی است. می توانیدمشتری را مستقیم ایجاد کنید و یا بعد صادر کردن فاکتور مشتری خود به خود ایجاد شده را مدیریت کنید.<br>در توتی (توت فرنگی) همه بخش ها بصورت یکپارچه به یکدیگر متصل بوده و با استفاده از امکانات توت فرنگی می توانید به راحتی محصول یا محصولاتی را انتخاب و سپس مشتری را ایجاد یا انتخاب کرده و برای او فاکتور صادر کنید، سپس فاکتور را به اشتراک بگذارید. در تمامی مراحل توت فرنگی به عنوان یک دستیار حرفه ای در خدمت شماست.<br>امکانات زیادی برای توت فرنگی در نظر گرفته شده که بسیار از آنها با اشتراک ماهانه فعال و قابل استفاده خواهد بود.<br>در ضمن با پشتیبانی آنلاین هرگونه سوال یا مشکل در اسرع وقت پاسخ داده خواهد شد. هدف ما کمک در هرچه بهتر کردن کسب و کار شماست.</p>



<p><a rel="noreferrer noopener" href="http://toot-farangi.ir/" target="_blank">وبسایت توتی: www.toot-farangi.ir</a></p>



<p><a href="http://www.bitecode.ir/services/projects/tooti/" target="_blank" rel="noreferrer noopener">توتی در بایت کد: www.bitecode.ir/services/projects/tooti/</a></p>



<p>دانلود از کافه بازار:</p>



<figure class="wp-block-image size-large is-resized is-style-default"><a href="https://cafebazaar.ir/app/ir.bitecode.android.tootfarangi"><img decoding="async" loading="lazy" src="http://www.mahditajik.ir/wp-content/uploads/2020/09/badge-new.png" alt="" class="wp-image-2928" width="308" height="91" srcset="http://www.mahditajik.ir/wp-content/uploads/2020/09/badge-new.png 563w, http://www.mahditajik.ir/wp-content/uploads/2020/09/badge-new-300x89.png 300w" sizes="(max-width: 308px) 100vw, 308px" /></a></figure>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/tooti/">توتی (توت فرنگی)</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/tooti/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rx java چیست؟ بخش اول</title>
		<link>http://www.mahditajik.ir/rx-java-%da%86%db%8c%d8%b3%d8%aa%d8%9f-%d8%a8%d8%ae%d8%b4-%d8%a7%d9%88%d9%84/</link>
					<comments>http://www.mahditajik.ir/rx-java-%da%86%db%8c%d8%b3%d8%aa%d8%9f-%d8%a8%d8%ae%d8%b4-%d8%a7%d9%88%d9%84/#respond</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Sun, 24 Mar 2019 10:09:37 +0000</pubDate>
				<category><![CDATA[آموزش]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2637</guid>

					<description><![CDATA[<p>RxJava&#160;کتابخانه ایست برای برنامه نویسی بصورت&#160;Reactive. خود&#160;Reactive Programing&#160;هم میشه اینطور در نظر گرفت که روش برنامه نویسی بر اساس یک واقعه یا&#160;Event&#160;است. نمی دونم چقدر با&#160;Event&#160;و یا&#160;Reactive programing&#160;آشنایی دارید اما اگر بخوام به زبان ساده بگم&#160;Event&#160;&#160;این هست که یک واقعه رخ میده و بعضی کلاس ها و آبجکت ها نسبت به اون واقعه حساسند و ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/rx-java-%da%86%db%8c%d8%b3%d8%aa%d8%9f-%d8%a8%d8%ae%d8%b4-%d8%a7%d9%88%d9%84/">Rx java چیست؟ بخش اول</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong>RxJava</strong>&nbsp;کتابخانه ایست برای برنامه نویسی بصورت&nbsp;<strong>Reactive</strong>. خود&nbsp;<strong>Reactive Programing</strong>&nbsp;هم میشه اینطور در نظر گرفت که روش برنامه نویسی بر اساس یک واقعه یا&nbsp;<strong>Event</strong>&nbsp;است. نمی دونم چقدر با&nbsp;<strong>Event</strong>&nbsp;و یا&nbsp;<strong>Reactive programing</strong>&nbsp;آشنایی دارید اما اگر بخوام به زبان ساده بگم&nbsp;<strong>Event&nbsp;</strong>&nbsp;این هست که یک واقعه رخ میده و بعضی کلاس ها و آبجکت ها نسبت به اون واقعه حساسند و متوجه اون واقعه می شوند. فرض کنید بابای خونه نسبت به روشن کردن کولر ( ایونت روشن شدن کولر) حساسه و هروقت اتفاق میافته به محض مطلع شدن عکس العمل مناسب و نشون میده! البته این یک شوخی بود اماواقعیت قضیه همینه.</p>


<p><strong>RxJava</strong> کتابخانه ایست برای برنامه نویسی بصورت <strong>Reactive </strong>در جاوا. خود <strong>Reactive Programing </strong>چیه؟ <strong>Reactive Programing</strong> روش برنامه نویسی بر اساس جریان داده و تغییرات روی آن بر اساس یک واقعه یا <strong>Event</strong> است. نمی دونم چقدر با <strong>Event</strong> و یا <strong>Reactive programing</strong> آشنایی دارید اما اگر بخوام به زبان ساده بگم <strong>Event </strong> این است که یک واقعه رخ می دهد و بعضی کلاس ها و آبجکت ها نسبت به آن واقعه حساسند و متوجه آن می شوند. فرض کنید بابای خونه نسبت به روشن کردن کولر ( ایونت روشن شدن کولر) حساسند و هروقت اتفاق میافتد به محض مطلع شدن عکس العمل مناسب را نشان می دهند! البته این یک شوخی بود اما واقعیت قضیه همین است. در ادامه موضوع رو بیشتر باز می کنم.</p>
<blockquote>
<p><a href="https://github.com/ReactiveX/RxJava" target="_blank" rel="noopener noreferrer">R</a><a href="https://github.com/ReactiveX/RxJava" target="_blank" rel="noopener noreferrer">xJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.</a></p>
</blockquote>
<p>خیلی خوب، گفتم که  برای برنامه نویسی بصورت <strong>Reactive</strong> در جاوا باید از <strong>RxJava</strong> استفاده کنیم. یک کامینوتی به نام <a href="http://reactivex.io/languages.html" target="_blank" rel="noopener noreferrer"><strong>ReactiveX</strong></a> است که تقریباً برای تمامی  زبان های برنامه نویسی مطرح، کتابخانه داده تا بتوان در آنها از امکانات <strong>Reactive</strong> استفاده کرد. مثلاً <strong>RxKotlin</strong> ،<strong>RxDart</strong> ،<strong>RxScala</strong> ،<strong>RxPHP</strong> و&#8230;. شاید بپرسید پس <strong>RxAndroid</strong> چیه؟ آیا اون هم پیاده سازی <strong>Reactive</strong> در اندرویده؟ اینجا باید بگم خیر!  <a href="https://github.com/ReactiveX/RxAndroid" target="_blank" rel="noopener noreferrer"><strong>RxAndroid</strong> </a>جای گزین <strong>RxJava</strong> برای اندروید نیست. بلکه افزونه ای است متشکل از مجموعه ای از ابزار های <strong>Rx</strong> برای اندروید برای <strong>RxJava</strong> . یعنی ما در اندروید از <strong>RxAndroid</strong> به تنهایی نمی تونیم استفاده کنیم و باید در کنارش حتماً <strong>RxJava</strong> باشه. فکر می کنم در جلسات بعدی که میریم سراع مثال این مسائل این دو وابستگی را در کنار هم در <strong>Gradle</strong> مشاهده خواهید کرد.</p>
<p>پیش نویس این مقاله رو بیش از دو سال پیش شروع کردم. موقعی که هنوز استفاده از <strong>RxJava</strong> و <strong>RxAndroid</strong> خیلی باب نشده بود.  منتهی لازم دیدم که هرچه زود تر به این مبحث بپردازم و تا  سریعتر بتونم وارد مباحث معماری بشم  که خیلی بکارمون میاد و کمکمون می کنه. احتمالاً <strong>RxJava</strong> رو بتونم در دو یا سه جلسه تمومش کنم و امیدوارم براتون مفید باشه.</p>
<p>از تعاریف که بگذریم می رسیم به منطق و مفهوم کار: به نظر خود بنده <strong>Reactive Programming</strong> پیاده سازی <a href="https://en.wikipedia.org/wiki/Observer_pattern" target="_blank" rel="noopener noreferrer"><strong>Observer pattern</strong></a> در سطح برنامه نویسی است. همانطور که در ادامه مشاهده خواهید کرد، یکی از مفاهیمی که بسیارمورد استفاده در <strong>Reactive</strong> هست مفهومی به نام <strong>Observer</strong> یا <strong>نظاره گر</strong> است. پس لازم است که ببینیم این دیزاین پترن دقیقاً چی می خواد بگوید.</p>
<h3>Observer pattern</h3>
<p>داستان اینطوریه که کلاً سه تا مفهوم داریم. یکسری <strong>موضوع </strong>یا <strong>Subject</strong> داریم که <strong>حالت </strong>یا <strong>State</strong> خاص دارند و یک تعدادی <strong>نظاره گر</strong> یا <strong>Observer </strong>هستند که به تغییر <strong>State</strong> این <strong>Subject</strong> ها علاقه مند هستند. پس خود را برای تغیرات حالت موضوع مورد نظر مهیا می کنند و در هر تغییر حالت، این تغییر با مکانیزمی به آنها اطلاع داده شود.</p>


<div class="wp-block-image"><figure class="aligncenter"><img decoding="async" src="http://www.bitecode.ir/wp-content/uploads/2019/03/OBSERVER-PATTTERN.jpg" alt="" class="wp-image-3959"/></figure></div>



<p>در این مثال ما پدر نسبت به روشن شدن کولر حساس است و تا کولر روشن می شود آن را خاموش می کند. از طرفی روشن شدن کولر برای مادر یا فرزند اهمیتی ندارد. همینطور بوی سوختن غذا فقط برای مادر مهم است و بعد از شنیدن آن به سرعت خودش و به آشپزخانه می رساند، در صورتی که برای پدر و فرزند معنی خاصی ندارد و اصلا متوجهش نیستند. ( البته مثال خیلی انتزاعی است). <strong>RxJava</strong> هم به همین صورت است. یعنی اتفاقات و <strong>event</strong> ها بر اساس وارد شدن و یا تغییر اطلاعات فعال می شوند و یک تعدادی کلاس به آنها واکنش نشان می دهند.</p>



<p>حالا که پترن <strong>Observer</strong> را برسی کردیم می خواهیم مفاهیم متناظر آن در <strong>RxJava</strong> را ببینیم.</p>


<p>برای ملاحظه مقاله کامل به سایت <strong><span style="color: #ff9900;"><a style="color: #ff9900;" href="http://www.bitecode.ir/learning/android/rxjava/" target="_blank" rel="noopener noreferrer">بایت کد</a></span></strong> مراجعه کنید.</p><p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/rx-java-%da%86%db%8c%d8%b3%d8%aa%d8%9f-%d8%a8%d8%ae%d8%b4-%d8%a7%d9%88%d9%84/">Rx java چیست؟ بخش اول</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/rx-java-%da%86%db%8c%d8%b3%d8%aa%d8%9f-%d8%a8%d8%ae%d8%b4-%d8%a7%d9%88%d9%84/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>برنامه اندروید چگونه کامپایل و اجرا می شود</title>
		<link>http://www.mahditajik.ir/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-%da%86%da%af%d9%88%d9%86%d9%87-%da%a9%d8%a7%d9%85%d9%be%d8%a7%db%8c%d9%84-%d9%88-%d8%a7%d8%ac%d8%b1%d8%a7-%d9%85%db%8c/</link>
					<comments>http://www.mahditajik.ir/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-%da%86%da%af%d9%88%d9%86%d9%87-%da%a9%d8%a7%d9%85%d9%be%d8%a7%db%8c%d9%84-%d9%88-%d8%a7%d8%ac%d8%b1%d8%a7-%d9%85%db%8c/#respond</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Sat, 07 Jul 2018 22:28:16 +0000</pubDate>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[apk]]></category>
		<category><![CDATA[بایت کد]]></category>
		<category><![CDATA[کامپایلر]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2862</guid>

					<description><![CDATA[<p>بسمه تعالی در این جلسه قصد داریم با نحوه ساخته شدن و اجرا شدن برنامه اندروید آشنا شویم.  اول از همه اصطلاح &#8220;کامپایل&#8221; شدن را تعریف می کنیم. در این باره pc mag staff می گوید: A compiler is computer software that transforms computer code written in one programming language (the source language) into another ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-%da%86%da%af%d9%88%d9%86%d9%87-%da%a9%d8%a7%d9%85%d9%be%d8%a7%db%8c%d9%84-%d9%88-%d8%a7%d8%ac%d8%b1%d8%a7-%d9%85%db%8c/">برنامه اندروید چگونه کامپایل و اجرا می شود</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p>بسمه تعالی</p>
<p>در این جلسه قصد داریم با نحوه ساخته شدن و اجرا شدن برنامه اندروید آشنا شویم.  اول از همه اصطلاح &#8220;کامپایل&#8221; شدن را تعریف می کنیم. در این باره <strong>pc mag staff</strong> می گوید:</p>
<blockquote><p>A <b>compiler</b> is <a class="mw-redirect" title="Computer software" href="https://en.wikipedia.org/wiki/Computer_software">computer software</a> that transforms computer code written in one <a title="Programming language" href="https://en.wikipedia.org/wiki/Programming_language">programming language</a> (the source language) into another programming language (the target language). Compilers are a type of <a title="Translator (computing)" href="https://en.wikipedia.org/wiki/Translator_(computing)">translator</a> that support digital devices, primarily computers. The name <i>compiler</i> is primarily used for programs that translate <a title="Source code" href="https://en.wikipedia.org/wiki/Source_code">source code</a> from a <a title="High-level programming language" href="https://en.wikipedia.org/wiki/High-level_programming_language">high-level programming language</a> to a <a class="mw-redirect" title="Lower level language" href="https://en.wikipedia.org/wiki/Lower_level_language">lower level language</a> (e.g., <a title="Assembly language" href="https://en.wikipedia.org/wiki/Assembly_language">assembly language</a>, <a title="Object code" href="https://en.wikipedia.org/wiki/Object_code">object code</a>, or <a title="Machine code" href="https://en.wikipedia.org/wiki/Machine_code">machine code</a>) to create an <a title="Executable" href="https://en.wikipedia.org/wiki/Executable">executable</a> program.</p></blockquote>
<p>&nbsp;</p>
<p>کامپایل شدن به معنای کنارهم قرار دادن و تبدیل کدهای و منابع برنامه و ساخت فایلی قابل اجرا برای دستگاه مقصد است. به برنامه ای که این کار را انجام می دهد کامپایلر گفته می شود. ممکن است برنامه ای برای محیط ویندوز کامپایل شود ( برنامه های ویندوزی) و یا برای اندروید کامپایل شود. ( برنامه های اندرویدی) اما هرکدام دارای شرایط و فرمت خاصی هستند که کامپایلر آن را کنترل می کند. برای استفاده از کامپایلر های مختلف برنامه ها و ابزار توسعه خاص مورد نیاز است. به عنوان مثال برای کامپایل کردن برنامه های اندرویدی می توان از Ecilipes یا Android studio و Intellij IDEA و غیره استفاده کرد. برای ساخت و کامپایل برنامه های ویندوزی از Visual Studio، Borland delphi و غیره استفاده کرد. بحث اصلی ما در مورد کامپایل برنامه اندروید است&#8230;</p>
<p><a href="http://www.bitecode.ir/learning/android/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-%da%86%da%af%d9%88%d9%86%d9%87-%da%a9%d8%a7%d9%85%d9%be%d8%a7%db%8c%d9%84-%d9%88-%d8%a7%d8%ac%d8%b1%d8%a7-%d9%85%db%8c/" target="_blank" rel="noopener"><strong><span style="color: #ff9900;">برای دیدن مقاله کامل به سایت بایت کد مراجعه کنید.</span></strong></a></p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-%da%86%da%af%d9%88%d9%86%d9%87-%da%a9%d8%a7%d9%85%d9%be%d8%a7%db%8c%d9%84-%d9%88-%d8%a7%d8%ac%d8%b1%d8%a7-%d9%85%db%8c/">برنامه اندروید چگونه کامپایل و اجرا می شود</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af-%da%86%da%af%d9%88%d9%86%d9%87-%da%a9%d8%a7%d9%85%d9%be%d8%a7%db%8c%d9%84-%d9%88-%d8%a7%d8%ac%d8%b1%d8%a7-%d9%85%db%8c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>چگونه در ویندوز عددفارسی را دقیقاً فارسی تایپ کنیم؟</title>
		<link>http://www.mahditajik.ir/%da%86%da%af%d9%88%d9%86%d9%87-%d8%af%d8%b1-%d9%88%db%8c%d9%86%d8%af%d9%88%d8%b2-%d8%b9%d8%af%d8%af%d9%81%d8%a7%d8%b1%d8%b3%db%8c-%d8%b1%d8%a7-%d8%af%d9%82%db%8c%d9%82%d8%a7%d9%8b-%d9%81%d8%a7%d8%b1/</link>
					<comments>http://www.mahditajik.ir/%da%86%da%af%d9%88%d9%86%d9%87-%d8%af%d8%b1-%d9%88%db%8c%d9%86%d8%af%d9%88%d8%b2-%d8%b9%d8%af%d8%af%d9%81%d8%a7%d8%b1%d8%b3%db%8c-%d8%b1%d8%a7-%d8%af%d9%82%db%8c%d9%82%d8%a7%d9%8b-%d9%81%d8%a7%d8%b1/#comments</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Tue, 08 May 2018 13:02:06 +0000</pubDate>
				<category><![CDATA[دانستنی ها]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2822</guid>

					<description><![CDATA[<p>به نقل از biteCode.ir کاربرد این قضیه وقتی است که مثلا می خواهید عددفارسی ٧ را تایپ کنید اما هفت لاتین نمایش داده می شود. این در صورتی است که زبان صفحه کلیدتان را روی زبان فارسی یا عربی تنظیم کرده اید. این موضوع در محیط های برنامه نویسی هم بسیار پرکاربرد است. برای نمایش ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%da%86%da%af%d9%88%d9%86%d9%87-%d8%af%d8%b1-%d9%88%db%8c%d9%86%d8%af%d9%88%d8%b2-%d8%b9%d8%af%d8%af%d9%81%d8%a7%d8%b1%d8%b3%db%8c-%d8%b1%d8%a7-%d8%af%d9%82%db%8c%d9%82%d8%a7%d9%8b-%d9%81%d8%a7%d8%b1/">چگونه در ویندوز عددفارسی را دقیقاً فارسی تایپ کنیم؟</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><strong>به نقل از<a href="http://www.bitecode.ir/learning/coding/%da%86%da%af%d9%88%d9%86%d9%87-%d8%af%d8%b1-%d9%88%db%8c%d9%86%d8%af%d9%88%d8%b2-%d8%b9%d8%af%d8%af%d9%81%d8%a7%d8%b1%d8%b3%db%8c-%d8%b1%d8%a7-%d8%af%d9%82%db%8c%d9%82%d8%a7%d9%8b-%d9%81%d8%a7%d8%b1/" target="_blank" rel="noopener"><span style="color: #e57f26;"> biteCode.ir</span></a></strong></p>
<p style="text-align: justify;">کاربرد این قضیه وقتی است که مثلا می خواهید عددفارسی ٧ را تایپ کنید اما هفت لاتین نمایش داده می شود. این در صورتی است که زبان صفحه کلیدتان را روی زبان فارسی یا عربی تنظیم کرده اید. این موضوع در محیط های برنامه نویسی هم بسیار پرکاربرد است. برای نمایش کاراکتر مورد نظر باید دقیقاً کد <strong>Unicode</strong> کارارکتر را تایپ کنید.</p>
<p style="text-align: justify;"><strong>Unicode چیست؟</strong></p>
<p style="text-align: justify;">unicode یک استاندارد بین المللی برای کاراکتر است که امروزه تقریباً هر سیستمی از آن پشتیبانی می کند و می تواند کاراکترهای آن را نمایش بدهد. در این استاندارد هر حرف یا کاراکتر دارای یک کد منحصر به فرد است و برای نوشتن یا نمایش آن کافی است از این کد استفاده کرد و محیط هایی که از استاندارد پشتیبانی می کنند بجای نمایش کد، کاراکتر مورد نظر را نمایش می دهند و این کارارکترها در همه جا استاندراد و یک طور نمایش داده می شود. برای بهتر متوجه شدن موضوع می وانید به این<a href="https://article.tebyan.net/38160/%DB%8C%D9%88%D9%86%DB%8C%DA%A9%D8%AF-unicode-%DA%86%DB%8C%D8%B3%D8%AA-" target="_blank" rel="noopener"><span style="color: #0000ff;"> مقاله</span></a> مراجعه کنید.</p>
<p style="text-align: justify;"><strong>کدهای حروف فارسی</strong></p>
<p style="text-align: justify;">همانطور که گفتم هر کارارکتری دارای کد منحصر به فرد است و در جایی که لازم است می توان دقیقاً از آن کاراکتر استفاده کرد. جدول های زیر کدهای اعداد و حروف ویژه فارسی می باشد:</p>
<table class="english-table" cellspacing="0">
<tbody>
<tr>
<th style="text-align: left;" scope="col">Character Name</th>
<th scope="col">Character</th>
<th scope="col">Entity</th>
<th scope="col">Hex Entity</th>
</tr>
<tr>
<td>EXTENDED ARABIC-INDIC DIGIT ZERO</td>
<td class="mightyglyph">۰</td>
<td>&amp;‌#۱۷۷۶;</td>
<td class="navy">&amp;‌#x06F0</td>
</tr>
<tr>
<td>EXTENDED ARABIC-INDIC DIGIT ONE</td>
<td class="mightyglyph">۱</td>
<td>&amp;‌#۱۷۷۷;</td>
<td class="navy">&amp;‌#x06F1</td>
</tr>
<tr>
<td>EXTENDED ARABIC-INDIC DIGIT TWO</td>
<td class="mightyglyph">۲</td>
<td>&amp;‌#۱۷۷۸;</td>
<td class="navy">&amp;‌#x06F2</td>
</tr>
<tr>
<td>EXTENDED ARABIC-INDIC DIGIT THREE</td>
<td class="mightyglyph">۳</td>
<td>&amp;‌#۱۷۷۹;</td>
<td class="navy">&amp;‌#x06F3</td>
</tr>
<tr>
<td>EXTENDED ARABIC-INDIC DIGIT FOUR</td>
<td class="mightyglyph">۴</td>
<td>&amp;‌#۱۷۸۰;</td>
<td class="navy">&amp;‌#x06F4</td>
</tr>
<tr>
<td>EXTENDED ARABIC-INDIC DIGIT FIVE</td>
<td class="mightyglyph">۵</td>
<td>&amp;‌#۱۷۸۱;</td>
<td class="navy">&amp;‌#x06F5</td>
</tr>
<tr>
<td>EXTENDED ARABIC-INDIC DIGIT SIX</td>
<td class="mightyglyph">۶</td>
<td>&amp;‌#۱۷۸۲;</td>
<td class="navy">&amp;‌#x06F6</td>
</tr>
<tr>
<td>EXTENDED ARABIC-INDIC DIGIT SEVEN</td>
<td class="mightyglyph">۷</td>
<td>&amp;‌#۱۷۸۳;</td>
<td class="navy">&amp;‌#x06F7</td>
</tr>
<tr>
<td>EXTENDED ARABIC-INDIC DIGIT EIGHT</td>
<td class="mightyglyph">۸</td>
<td>&amp;‌#۱۷۸۴;</td>
<td class="navy">&amp;‌#x06F8</td>
</tr>
<tr>
<td>EXTENDED ARABIC-INDIC DIGIT NINE</td>
<td class="mightyglyph">۹</td>
<td>&amp;‌#۱۷۸۵;</td>
<td class="navy">&amp;‌#x06F9</td>
</tr>
</tbody>
</table>
<p style="text-align: justify;">حال سوال اینجاست که چگونه این کاراکتر ها را تایپ کنیم. برای اینکار اول لازم است گزینه تایپ <strong>Unicode</strong> بر اساس کد <strong>Hex</strong> را در ویندوز فعال کنیم.</p>
<p style="text-align: justify;">دکمه start ویندوز را زده و و عبارت <strong>regedit</strong> را تایپ کنید تا برنامه ریجیستری ادیتور باز شود. سپس به مسیر <code>HKEY_CURRENT_USER\Control Panel\Input Method</code> بروید و یک آیتم از جنس <strong>String value</strong> با نام EnableHexNumpad بسازید و مقدار آن را ۱ قرار دهید. حال سیستم را یکبار Restart کنید. تایپ کردن Unicode با کد Hex برای شما فعال شده است. هرجا که خواستید این حروف Unicode را تایپ کنید کافیست <code>Alt</code> کیبورد را نگه داشته و سپس از بخش اعداد کیبورد ( بخش سمت راست) اول + را زده سپس کد <strong>hex</strong> را از جدول بالا (عبارت بعد x ) را تایپ کرده و نهایتاً Alt را رها کنید. کاراکتر شما تایپ خواهد شد!</p>
<p>برای مشاهده مقاله کامل به <a href="http://www.bitecode.ir/learning/coding/%da%86%da%af%d9%88%d9%86%d9%87-%d8%af%d8%b1-%d9%88%db%8c%d9%86%d8%af%d9%88%d8%b2-%d8%b9%d8%af%d8%af%d9%81%d8%a7%d8%b1%d8%b3%db%8c-%d8%b1%d8%a7-%d8%af%d9%82%db%8c%d9%82%d8%a7%d9%8b-%d9%81%d8%a7%d8%b1/"><span style="color: #e57f26;">bitecode.ir</span></a> مراجعه کنید. تصمیم دارم مطالب آموزشی را کم کم به این سایت منتقل کنم. نظر یا پیشنهادی داشتید در خدمت هستم.</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%da%86%da%af%d9%88%d9%86%d9%87-%d8%af%d8%b1-%d9%88%db%8c%d9%86%d8%af%d9%88%d8%b2-%d8%b9%d8%af%d8%af%d9%81%d8%a7%d8%b1%d8%b3%db%8c-%d8%b1%d8%a7-%d8%af%d9%82%db%8c%d9%82%d8%a7%d9%8b-%d9%81%d8%a7%d8%b1/">چگونه در ویندوز عددفارسی را دقیقاً فارسی تایپ کنیم؟</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/%da%86%da%af%d9%88%d9%86%d9%87-%d8%af%d8%b1-%d9%88%db%8c%d9%86%d8%af%d9%88%d8%b2-%d8%b9%d8%af%d8%af%d9%81%d8%a7%d8%b1%d8%b3%db%8c-%d8%b1%d8%a7-%d8%af%d9%82%db%8c%d9%82%d8%a7%d9%8b-%d9%81%d8%a7%d8%b1/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>پیکچا – Pictcha</title>
		<link>http://www.mahditajik.ir/%d9%be%db%8c%da%a9%da%86%d8%a7-pictcha/</link>
					<comments>http://www.mahditajik.ir/%d9%be%db%8c%da%a9%da%86%d8%a7-pictcha/#respond</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Wed, 21 Feb 2018 12:12:25 +0000</pubDate>
				<category><![CDATA[معرفی]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[ios]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2795</guid>

					<description><![CDATA[<p>پیکچا یک اپ آیفون هستش که به شما و بقیه شرکت کننده های یک ایونت این امکان رو میده که لحظاتتون و تجربه تون در اون ایونت رو با بقیه دنیا به اشتراک بذارید. برای هر ایونت یه صفحه ساخته میشه و پستهای شما با توجه به لوکیشنتون تو صفحه همون ایونت و در کنار ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d9%be%db%8c%da%a9%da%86%d8%a7-pictcha/">پیکچا &#8211; Pictcha</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" class="aligncenter wp-image-2796 size-full" src="http://www.mahditajik.ir/wp-content/uploads/2018/02/pictcha.jpg" alt="پیکچا" width="1264" height="712" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/02/pictcha.jpg 1264w, http://www.mahditajik.ir/wp-content/uploads/2018/02/pictcha-300x169.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2018/02/pictcha-768x433.jpg 768w, http://www.mahditajik.ir/wp-content/uploads/2018/02/pictcha-1024x577.jpg 1024w" sizes="(max-width: 1264px) 100vw, 1264px" /></p>
<p style="text-align: justify;">پیکچا یک اپ آیفون هستش که به شما و بقیه شرکت کننده های یک ایونت این امکان رو میده که لحظاتتون و تجربه تون در اون ایونت رو با بقیه دنیا به اشتراک بذارید. برای هر ایونت یه صفحه ساخته میشه و پستهای شما با توجه به لوکیشنتون تو صفحه همون ایونت و در کنار پست بقیه شرکت کننده های اون ایونت نمایش داده میشه و فن های اون ایونت تو همه دنیا میتونن تصویری که شما از جو اون ایونت ساختین رو ببین. پیکچا یه اپلیکیشن مبتنی بر ایونت هستش، به این معنی که فقط کسایی که توی یک اویونت هستنمیتونن از اون ایونت پست به اشتراک بذارن.</p>
<p style="text-align: justify;"><img decoding="async" loading="lazy" class="aligncenter wp-image-2800 size-full" src="http://www.mahditajik.ir/wp-content/uploads/2018/02/pictcha2.jpg" alt="پیکچا" width="1222" height="500" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/02/pictcha2.jpg 1222w, http://www.mahditajik.ir/wp-content/uploads/2018/02/pictcha2-300x123.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2018/02/pictcha2-768x314.jpg 768w, http://www.mahditajik.ir/wp-content/uploads/2018/02/pictcha2-1024x419.jpg 1024w" sizes="(max-width: 1222px) 100vw, 1222px" />خلاصه اگه کنسرت، فستیوال موسیقی یا مسابقه ورزشی رفتین یا مثلا تو یه جشن تولد یا عروسی بودین یا حتی تو کافه ای که نشستین برنامه ای در حال اجرا هستش میتونین ازش عکس و ویدیو بگیرید و تو پیکچا پستش کنید. اگه ایونتی که توش هستید رو تو پیکچا پیدا نکردین، میتونین بسازیدش و به بقیه اطرافیانتون هم بگید که توش پست بذارن.</p>
<p>این اپ در حال حاضر فقط برای گوشی های آیفون موجوده و می تونید از <a href="https://itunes.apple.com/us/app/pictcha-all-events/id1271719020" target="_blank" rel="noopener"><span style="color: #3366ff;"><strong>اینجا </strong></span></a>دانلود کنید.</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d9%be%db%8c%da%a9%da%86%d8%a7-pictcha/">پیکچا &#8211; Pictcha</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/%d9%be%db%8c%da%a9%da%86%d8%a7-pictcha/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>نحوه پاک کردن دسته جمعی مخاطبان تلگرام</title>
		<link>http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d9%be%d8%a7%da%a9-%da%a9%d8%b1%d8%af%d9%86-%d8%af%d8%b3%d8%aa%d9%87-%d8%ac%d9%85%d8%b9%db%8c-%d9%85%d8%ae%d8%a7%d8%b7%d8%a8%d8%a7%d9%86-%d8%aa%d9%84%da%af%d8%b1%d8%a7%d9%85/</link>
					<comments>http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d9%be%d8%a7%da%a9-%da%a9%d8%b1%d8%af%d9%86-%d8%af%d8%b3%d8%aa%d9%87-%d8%ac%d9%85%d8%b9%db%8c-%d9%85%d8%ae%d8%a7%d8%b7%d8%a8%d8%a7%d9%86-%d8%aa%d9%84%da%af%d8%b1%d8%a7%d9%85/#respond</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Sat, 03 Feb 2018 11:30:31 +0000</pubDate>
				<category><![CDATA[دانستنی ها]]></category>
		<category><![CDATA[telegram]]></category>
		<category><![CDATA[تلگرام]]></category>
		<category><![CDATA[حساب کاربری]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2764</guid>

					<description><![CDATA[<p>موضوع این آموزش پاک کردن گروهی مخاطبان تلگرام است. همانطور که می دانیم برنامه تلگرام با گرفتن مجوز &#8220;Contact&#8221; لیست مخاطبین گوشی را به لیست مخاطبان داخلی خود برنامه اضافه می کند. البته به مخاطبین آن می توان افرادی را اضافه کرد که شاید در لیست مخاطبان تلفن هم وجود نداشته باشند. ( موقعی که ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d9%be%d8%a7%da%a9-%da%a9%d8%b1%d8%af%d9%86-%d8%af%d8%b3%d8%aa%d9%87-%d8%ac%d9%85%d8%b9%db%8c-%d9%85%d8%ae%d8%a7%d8%b7%d8%a8%d8%a7%d9%86-%d8%aa%d9%84%da%af%d8%b1%d8%a7%d9%85/">نحوه پاک کردن دسته جمعی مخاطبان تلگرام</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2778" src="http://www.mahditajik.ir/wp-content/uploads/2018/02/telegram.jpg" alt="" width="800" height="491" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/02/telegram.jpg 800w, http://www.mahditajik.ir/wp-content/uploads/2018/02/telegram-300x184.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2018/02/telegram-768x471.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p style="text-align: justify;">موضوع این آموزش پاک کردن گروهی مخاطبان تلگرام است. همانطور که می دانیم برنامه تلگرام با گرفتن مجوز &#8220;<strong>Contact</strong>&#8221; لیست مخاطبین گوشی را به لیست مخاطبان داخلی خود برنامه اضافه می کند. البته به مخاطبین آن می توان افرادی را اضافه کرد که شاید در لیست مخاطبان تلفن هم وجود نداشته باشند. ( موقعی که شخصی که در کانتک شما نیست مسیج می دهد و شما دو گزینه دارید. او را بلاک کنید یا اینکه به لیست کانتکت ها اضافه کنید.)</p>
<p style="text-align: justify;">همانطور که احتمالاً می دانید یا متوجه شده اید، برنامه تلگرام تمامی مخاطبان موجود در گوشی تلفن همراه را در مخاطبان خود اضافه می کند و این امر در مواقعی می تواند مشکل ساز باشد. مثلا شما سیم کارتتان را بصورت موقت در گوشی شخص دیگری قرار داده اید و متاسفانه لیست مخاطبان سیم کارت ( درصورت استفاده و نمایش در تنظیمات)  به مخاطبان تلگرام موجود در گوشی اضافه می شود.</p>
<p style="text-align: justify;">یک سناریوی دیگر: باطری گوشی شما تمام شده و نیاز به اطلاعاتی دارید که در تلگرام گوشیتان قرار دارد. سیم کارت خود در گوشی دوستتان گذاشته و با حساب کاربری خود وارد می شوید. تمام مخاطبان تلگرام روی گوشی دوستتان به کانکت های تلگرام اضافه می شود که این امر خیلی دردسر سازاست.</p>
<p style="text-align: justify;">از طرفی در نسخه جدید که امکان اضافه کردن <strong>چند حساب کاربری</strong> وجود دارد نیز مخاطبان را برای هردو بروز رسانی می کند. ( مخاطبان حساب اول جزو مخاطبان حساب دوم می شوند و همچنین مخاطبان حساب دوم وارد لیست مخاطبان حساب اول می شوند.) البته امکان دارد که این باگ در نسخه های بعدی گرفته شود. اما اگر مثل من حساب دوم را وراد برنامه کرده اید حتماً مخاطبانتان با هم ادغام شده اند. این مشکل در نسخه فعلی یعنی ۴٫۷٫۱ وجود دارد.</p>
<p style="text-align: center;"><span style="color: #000000;"><span class="highlight"><strong>پاک کردن تکی مخاطبان</strong></span></span></p>
<p>در صورتی که یکی از این مشکلات برایتان بوجود آمد و یا به هر دلیل دیگری خواستی مخاطبین تلگرام را پاک کنید یک روش قدیمی پاک کردن یکی یکی مخاطبان است. برای این منظور کافیه طبق مراحل زیر عمل کنید.</p>
<p>اول وارد بخش کانتکت شده و مخاطب مورد نظر را انتخاب کنید:</p>
<p><img decoding="async" loading="lazy" class="aligncenter wp-image-2766 size-full" src="http://www.mahditajik.ir/wp-content/uploads/2018/02/delete-telegram-contact-4.jpg" alt="مخاطبان تلگرام" width="979" height="413" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/02/delete-telegram-contact-4.jpg 979w, http://www.mahditajik.ir/wp-content/uploads/2018/02/delete-telegram-contact-4-300x127.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2018/02/delete-telegram-contact-4-768x324.jpg 768w" sizes="(max-width: 979px) 100vw, 979px" />سپس روی اسم مخاطب کلیک کرده تا صفحه جزئیات بیاید. سپس روی منوی سمت راست ( گزینه سه نقطه) کلیک کرده و گزینه <strong>Delete contact</strong> را انتخاب کنید:</p>
<p><img decoding="async" loading="lazy" class="aligncenter wp-image-2767 size-full" src="http://www.mahditajik.ir/wp-content/uploads/2018/02/delete-telegram-contact-5-e1511684439475.jpg" alt="مخاطبان تلگرام" width="654" height="362" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/02/delete-telegram-contact-5-e1511684439475.jpg 654w, http://www.mahditajik.ir/wp-content/uploads/2018/02/delete-telegram-contact-5-e1511684439475-300x166.jpg 300w" sizes="(max-width: 654px) 100vw, 654px" />و در آخر هم تایید را بزنید.</p>
<p><img decoding="async" loading="lazy" class="aligncenter wp-image-2768 size-full" src="http://www.mahditajik.ir/wp-content/uploads/2018/02/delete-telegram-contact-1.jpg" alt="مخاطبان تلگرام" width="432" height="527" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/02/delete-telegram-contact-1.jpg 432w, http://www.mahditajik.ir/wp-content/uploads/2018/02/delete-telegram-contact-1-246x300.jpg 246w" sizes="(max-width: 432px) 100vw, 432px" />اما هدف ما از این آموزش یک مرحله جلو تر است و می خواهیم لیست یا تمام کانتکت لیست را یکجا حذف کنیم که به روش بالا خیلی زمان بر خواهد بود.</p>
<p style="text-align: center;"><span style="color: #000000;"><span class="highlight"><strong>پاک کردن گروهی مخاطبان</strong></span></span></p>
<p style="text-align: justify;"><strong><span style="color: #99cc00;">قدم اول:</span> </strong>برای این منظور اول لازم است تا از طریق وب وارد تلگرام شویم. همانطور که می دانیم یک نسخه آنلاین هم برای تلگرام در آدرس <span style="color: #3366ff;"><strong><a style="color: #3366ff;" href="https://web.telegram.org/" target="_blank" rel="noopener">web.telegram.org </a> </strong></span>وجود دارد. با شماره خود وارد شوید.</p>
<p style="text-align: justify;"><strong><span style="color: #99cc00;">قدم دوم:</span></strong> از منوی سمت راست <strong>Contacts</strong> را انتخاب کرده و در صفحه جدید باز شده گزینه <strong>Edit</strong> را بزنید.</p>
<p><img decoding="async" loading="lazy" class="aligncenter wp-image-2773 size-full" src="http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture11.jpg" alt="مخاطبان تلگرام" width="834" height="851" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture11.jpg 834w, http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture11-294x300.jpg 294w, http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture11-768x784.jpg 768w, http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture11-70x70.jpg 70w" sizes="(max-width: 834px) 100vw, 834px" /></p>
<p style="text-align: justify;"><strong><span style="color: #99cc00;">قدم سوم:</span></strong> در صورتی که می خواهید برخی مخاطبان تلگرام را پاک کنید کافی اسکرول کنید تا مخاطبان مورد نظر لود شوند، سپس  تعداد مورد نیاز کانتکت را انتخاب کرده ( حتماً دکمه <strong>Edit</strong> را در مرحله قبل زده باشید!) و سپس گزینه <strong>Delete</strong> را انتخاب کنید و همه آنها پاک می شود. حال برای پاک کردن همه موارد لیست را تا آخر اسکرول کنید و سپس وارد مرحله بعد شوید.</p>
<p style="text-align: justify;"><span style="color: #99cc00;"><strong>قدم چهارم:</strong></span> بعد از اینکه قدم سوم را انجام دادید، یعنی حالت <strong>Edit</strong> و اسکرول کردید تا تمام مخاطبان لود شود، باید وارد حالت <strong>Develop</strong> مرورگر بشوید. در <strong>Chrome</strong> کافی است راست کلیک زده و گزینه <strong>Inspect </strong> را بزنید یا در فایرفکس راست کلیک و گزینه <strong>Inspect elements</strong> را بزنید. سپس تب کنسول را باز کرده و عبارت زیر را اجرا کنید:</p>
<p></p><pre class="crayon-plain-tag">$('.contacts_modal_contact').click();</pre><p></p>
<p style="text-align: justify;">با این گزینه همه مخاطبان انتخاب می شوند و می توانید گزینه <strong>Delete</strong> را انتخاب نمایید.</p>
<p><img decoding="async" loading="lazy" class="aligncenter wp-image-2774 size-full" src="http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture22.jpg" alt="مخاطبان تلگرام" width="1271" height="913" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture22.jpg 1271w, http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture22-300x215.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture22-768x552.jpg 768w, http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture22-1024x736.jpg 1024w" sizes="(max-width: 1271px) 100vw, 1271px" />و نتیجه همه مخاطبان برای پاک شدن آماده هستند:)</p>
<p><img decoding="async" loading="lazy" class="aligncenter wp-image-2775 size-full" src="http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture33.jpg" alt="مخاطبان تلگرام" width="1256" height="906" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture33.jpg 1256w, http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture33-300x216.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture33-768x554.jpg 768w, http://www.mahditajik.ir/wp-content/uploads/2018/02/Capture33-1024x739.jpg 1024w" sizes="(max-width: 1256px) 100vw, 1256px" /></p>
<p>منبع: <a href="http://www.biitecode.ir" target="_blank" rel="noopener">بایت کد</a></p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d9%be%d8%a7%da%a9-%da%a9%d8%b1%d8%af%d9%86-%d8%af%d8%b3%d8%aa%d9%87-%d8%ac%d9%85%d8%b9%db%8c-%d9%85%d8%ae%d8%a7%d8%b7%d8%a8%d8%a7%d9%86-%d8%aa%d9%84%da%af%d8%b1%d8%a7%d9%85/">نحوه پاک کردن دسته جمعی مخاطبان تلگرام</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d9%be%d8%a7%da%a9-%da%a9%d8%b1%d8%af%d9%86-%d8%af%d8%b3%d8%aa%d9%87-%d8%ac%d9%85%d8%b9%db%8c-%d9%85%d8%ae%d8%a7%d8%b7%d8%a8%d8%a7%d9%86-%d8%aa%d9%84%da%af%d8%b1%d8%a7%d9%85/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>تفاوت Handler و Thread و AsyncTask در اندروید</title>
		<link>http://www.mahditajik.ir/%d8%aa%d9%81%d8%a7%d9%88%d8%aa-handler-%d9%88-thread-%d9%88-asynctask-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/</link>
					<comments>http://www.mahditajik.ir/%d8%aa%d9%81%d8%a7%d9%88%d8%aa-handler-%d9%88-thread-%d9%88-asynctask-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/#comments</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Tue, 30 Jan 2018 16:33:14 +0000</pubDate>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[AsyncTask]]></category>
		<category><![CDATA[Handler]]></category>
		<category><![CDATA[Thread]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2728</guid>

					<description><![CDATA[<p>با سلام، ممکنه برای خیلی ها این سوال پیش اومده باشه که از هرکدوم از Handler یا Thread یا AsycTask استفاده کرده باشیم و لی در حقیقت تفاوت میان آنها را به درستی نشناسیم. در این مقاله می خواهیم این تفاوت ها و محل مناسب استفاده از هر یک را برسی کنیم. اول لازم هست ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d8%aa%d9%81%d8%a7%d9%88%d8%aa-handler-%d9%88-thread-%d9%88-asynctask-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/">تفاوت Handler و Thread و AsyncTask در اندروید</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" class="aligncenter wp-image-2731 size-full" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/asynctask.jpg" alt="AsyncTask" width="800" height="486" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/01/asynctask.jpg 800w, http://www.mahditajik.ir/wp-content/uploads/2018/01/asynctask-300x182.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2018/01/asynctask-768x467.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p style="text-align: justify;">با سلام، ممکنه برای خیلی ها این سوال پیش اومده باشه که از هرکدوم از <strong>Handler</strong> یا <strong>Thread</strong> یا <strong>AsycTask</strong> استفاده کرده باشیم و لی در حقیقت تفاوت میان آنها را به درستی نشناسیم. در این مقاله می خواهیم این تفاوت ها و محل مناسب استفاده از هر یک را برسی کنیم.</p>
<p style="text-align: justify;">اول لازم هست تا با تعریف هرکدام بیشتر آشنا شویم.</p>
<p style="text-align: right;"><strong>Thread</strong></p>
<blockquote>
<p style="text-align: left;">A thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple threads of execution running concurrently.</p>
</blockquote>
<p style="text-align: justify;">ترد یا رشته واحد های کلی پردازش وظایف هستند که هر برنامه می تواند تعدادی ترد داشته باشد. هر ترد اولویتی در سیستم دارد و تردهای ایجاد شده توسط یک ترد دیگر، اولویت هم سطح خواهند داشت. در اندروید هر برنامه یک ترد اصلی یا <strong>Main thread</strong> دارد و وقتی  <strong>thread</strong> جدیدی ایجاد می کنیم پردازش ها جدا از اتفاقات ترد اصلی روی می دهد. اما برای هماهنگ کردن و یا به عنوان مثال بازگشت جواب باید اینکار را بصورت دستی توسط <strong>message</strong> یا <strong>callback</strong> مدیریت کنیم. ( <a href="http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/" target="_blank" rel="noopener"><span style="color: #3366ff;">مقاله کامل در اینجا</span></a>) در صورتی که اگر تردی ایجاد کنیم دستورالعمل های آن باعث freeze شدن برنامه نمی شود زیرا در یک ترد دیگری جاریست اما در عوض به عناصر <strong>UI</strong> که در ترد اصلی هستند دسترسی نداریم و نمی توانیم بطور مستقیم <strong>UI</strong> را تغییر دهیم.</p>
<p></p><pre class="crayon-plain-tag">new Thread(new Runnable() {
    @Override
    public void run() {
        doSomething();
    }
}).start();</pre><p></p>
<p style="text-align: right;"><strong>Handler</strong></p>
<blockquote>
<p style="text-align: left;">A Handler allows you to send and process Message and Runnable objects associated with a thread&#8217;s MessageQueue. Each Handler instance is associated with a single thread and that thread&#8217;s message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it &#8212; from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue</p>
</blockquote>
<p style="text-align: justify;">طبق تعریف خود گوگل با تعریف یک هندلر می توانیم پیغام یا <strong>Runnable</strong> ای را پردازش کنیم که دقیقاً در thread  کلاس تولید کننده آن قرار می گیرد و نحوه اجرا شدن آن هم به صف همان <strong>thread</strong> بستگی دارد. پس یعنی <strong>Handler</strong> های تولید شده در یک <strong>thread</strong> به ترتیب در همان <strong>thread</strong> اجرا می شوند. دستورالعمل هایی که در <strong>Handler</strong> اجرا می شوند در <strong>thread</strong> اصلی بوده و اصطلاحاً باعث  freeze  شدن برنامه می شود. اما اگر در ترد اصلی تولید شوند به عناصر UI برنامه دسترسی داریم و مثلا می توانیم یک <strong>ViewText</strong> ای را بروز رسانی کنیم.</p>
<p></p><pre class="crayon-plain-tag">new Handler().post(new Runnable() {
    @Override
    public void run() {
       doSomething();
    }
});</pre><p></p>
<p style="text-align: justify;">بطور معمول وقتی از <strong>Handler</strong> استفاده می کنیم که بخواهیم اتفاق خاصی در زمان خاصی بیافتد. مثلا فرض کنید می خواهید با تایمر <strong>View</strong> ای را آپدیت کنید.</p>
<p></p><pre class="crayon-plain-tag">new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        // update UI after 1000 millisecons
    }
},1000);</pre><p><strong>Runable</strong></p>
<p>یک اینترفیسی است که تمامی کلاس هایی که قرار است توسط  <strong>Thread </strong>اجرا شوند، باید آن را پیاده سازی کنند که یک متد <strong>run </strong>دارد. پس هرکلاس مشخص می کند که هنگام اجرا شدن توسط Thread چکاری را انجام دهد. ( آن کار در متد run پیاده سازی می شود.) که در تمامی مثال های قبلی قابل مشاهده است.</p>
<p><strong>AsyncTask</strong></p>
<p>برای ساخت آن باید کلاسی از آن مشتق کنیم و متد های آن را <strong>Override</strong> کنیم.</p>
<ul>
<li>doInBackground</li>
<li>onPostExecute</li>
</ul>
<p style="text-align: justify;">متد <strong>doInBackground</strong> در یک ترد مجزا انجام می گیرد و جواب آن <strong>onPostExecute</strong> در ترد اصلی یا همان <strong>UI thread</strong> اتفاق می افتد که می توانیم توسط آن <strong>UI</strong> را آپدیت کنیم. البته متد های دیگری نیز دارد که تنها به این دو متد اشاره کردم. استفاده از <strong>AsyncTask</strong> بسیار در گرفتن اطلاعات از سمت <strong>web</strong> پرکاربرد است. ( در صورتی که نخواهیم از کتابخانه های نظیر Retrofit و Volley استفاده کنیم) و اصولاً در قدیم (حدود ۶ سال قبل) ترکیب <strong>HttpConnection</strong> و <strong>AsyncTask</strong> برای صدا زدن <strong>Api</strong> های سمت وب اجتناب ناپذیر بود!</p>
<p></p><pre class="crayon-plain-tag">private class MyAsycTask extends AsyncTask&lt;Void, Void, Void&gt; {

    @Override
    protected void onPreExecute() {
       //do something in Ui-thread before background work start
    }

    @Override
    protected Void doInBackground(Void... params) {
       //do something in background
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
      //do something in Ui-thread
    }
}</pre><p></p>
<p style="text-align: justify;"><strong>نکته:</strong></p>
<p>یک نوع استفاده دیگر از Handler وجود دارد که در ظاهر انگار  Thread است اما:</p><pre class="crayon-plain-tag">runOnUiThread(new Runnable() {
    @Override
    public void run() {
        doSomething();
    }
});</pre><p>توجه کنید که <strong>runOnUiThread</strong> یک نوع خاصی از <strong>Handler</strong> است که فقط در ترد اصلی اتفاق می افتد.</p>
<p>هرگونه سوال و یا نکته ای داشتید خوشحال می شم که کامنت کنید.</p>
<p>منبع: <a href="http://www.biitecode.ir" target="_blank" rel="noopener">بایت کد</a></p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d8%aa%d9%81%d8%a7%d9%88%d8%aa-handler-%d9%88-thread-%d9%88-asynctask-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/">تفاوت Handler و Thread و AsyncTask در اندروید</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/%d8%aa%d9%81%d8%a7%d9%88%d8%aa-handler-%d9%88-thread-%d9%88-asynctask-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>نحوه ارتباط بین thread ها</title>
		<link>http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/</link>
					<comments>http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/#comments</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Mon, 29 Jan 2018 10:51:58 +0000</pubDate>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[Handler]]></category>
		<category><![CDATA[runnable]]></category>
		<category><![CDATA[Thread]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2741</guid>

					<description><![CDATA[<p>thread یا رشته عبارتند از  واحد های کلی پردازش وظایف که هر برنامه می تواند تعدادی ترد داشته باشد. هر ترد اولویتی در سیستم دارد و تردهای ایجاد شده توسط یک ترد دیگر، اولویت هم سطح خواهند داشت. در اندروید هر برنامه یک ترد اصلی یا Main thread دارد و وقتی  thread جدیدی ایجاد می ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/">نحوه ارتباط بین thread ها</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2755" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/thread.jpg" alt="" width="800" height="486" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/01/thread.jpg 800w, http://www.mahditajik.ir/wp-content/uploads/2018/01/thread-300x182.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2018/01/thread-768x467.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p style="text-align: justify;">thread یا رشته عبارتند از  واحد های کلی پردازش وظایف که هر برنامه می تواند تعدادی ترد داشته باشد. هر ترد اولویتی در سیستم دارد و تردهای ایجاد شده توسط یک ترد دیگر، اولویت هم سطح خواهند داشت. در اندروید هر برنامه یک ترد اصلی یا <strong>Main thread</strong> دارد و وقتی  <strong>thread</strong> جدیدی ایجاد می کنیم پردازش ها جدا از اتفاقات ترد اصلی روی می دهد. اما برای هماهنگ کردن و یا به عنوان مثال بازگشت جواب باید اینکار را بصورت دستی توسط <strong>message</strong> یا <strong>callback</strong> مدیریت کنیم.</p>
<p style="text-align: justify;">در این مقاله می خواهیم نحوه ارتباط با این دو روش را برسی کنیم.</p>
<p><strong>message</strong></p>
<p style="text-align: justify;">اصلی ترین راه ارتباط بین تردها پاس دادن پیام است. تردی که قرار است پیغام را دریافت کند باید دسترسی به صف پیغام ها داشته باشد که  messageQueue است و خود ترد ساده فاقد این کلاس است.</p>
<p></p><pre class="crayon-plain-tag">new Thread(new Runnable() {
    @Override
    public void run() {
        doSomething();
    }
}).start();</pre><p></p>
<p style="text-align: justify;">به شکل thread ساده و بدون messageQueue توجه کنید:</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2743" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_JAT.png" alt="" width="200" height="141" /></p>
<p style="text-align: justify;">برای افزودن messageQueue از کلاس Looper استفاده می کنیم که messageQueue را برایمان فراهم می کند.</p>
<p></p><pre class="crayon-plain-tag">new Thread(new Runnable() {
    @Override
    public void run() {
        Looper.prepare();
        doSomething();
        Looper.loop();
    }
}).start();</pre><p></p>
<p style="text-align: justify;">و بدین ترتیب messageQueue برایمان محیا می شود.</p>
<p style="text-align: justify;"><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2744" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_TWL.png" alt="" width="320" height="156" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_TWL.png 320w, http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_TWL-300x146.png 300w" sizes="(max-width: 320px) 100vw, 320px" /></p>
<p style="text-align: justify;">حال تردی که می خواهد مسیج ارسال کند نیاز به یک <strong>Handler</strong> دارد. وظیفه Handler ارسال و پردازش پیغام مربوط به messageQueue ترد ساخته شده اش می باشد. ( همچنین اجرای Runnable که موضوع این آموزش نیست). وقتی یک Handler جدید می سازیم به threadhd ای که درون آن ساخته شده و messageQueue مربوطه متصل می شود و message ها و runnable ها را به messageQueue مربوطه می رساند و یا از روی آن اجرا می کند. در اینجا برای ارسال پیام کافیست که یک هندلر بصورتی تعریف کنیم هردو ترد دسترسی داشته باشند ( بصورت public یا پاس دادن بصورت properties) در یکی توسط آن Messagehvshg ارسال کنیم و در دیگری Message را گرفته و پردازش کنیم.</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2745" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_PAT.png" alt="" width="320" height="163" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_PAT.png 320w, http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_PAT-300x153.png 300w" sizes="(max-width: 320px) 100vw, 320px" /></p>
<p style="text-align: justify;">به مثال ذیل توجه کنید:</p>
<p></p><pre class="crayon-plain-tag">private void testThreadMessaging() {

    Handler handler;

    new Thread(new Runnable() {
        @Override
        public void run() {
            Looper.prepare();

            handler = new Handler(){

                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    Toast.makeText(MainActivity.this, "Job finish with ( "+(float) msg.getData().getLong("jobTime")/1000+" ) seconds", Toast.LENGTH_SHORT)
                            .show();


                }
            };
            Looper.loop();
        }
    }).start();

    new Thread(new Runnable() {
        @Override
        public void run() {
            long jobTime = doSomething(ITERATION_COUNT);
            Message message = new Message();
            Bundle bundle = new Bundle();
            bundle.putLong("jobTime",jobTime);
            message.setData(bundle);
            handler.sendMessage(message);

        }
    }).start();
}</pre><p></p><pre class="crayon-plain-tag">private long doSomething(int iteration) {
    long startTime = System.currentTimeMillis();
    for (int i = 0; i &lt; iteration; i++) {
        Log.i("mahdi", "run: "+i);
    }
    long endTime = System.currentTimeMillis();

    return endTime - startTime ;
}</pre><p></p>
<p style="text-align: justify;">ترد اول بعد از تمام شدن کارش زمان انجام کار را به ترد دوم پاس می دهد. در اینجا handler بصورت public تعریف شده بود.</p>
<p><strong>Callback</strong></p>
<p style="text-align: justify;">در این روش ارتباط از طریق پاس دادن یک اینترفیس انجام می شود. برای اینکه مثال فرق کند ترد دریافت کننده پیام را در Ui thread قرار دادم. ( یعنی ترد جدیدی نساختم و در یک جایی در اکتیویتی تعریف کردم که می دانیم خود اکتیوتی در main thread یا همان Ui thread است).</p>
<p></p><pre class="crayon-plain-tag">private void testThreadCallBack(){

    //our receiver thread is main thread
    callBack = new ThreadCallBack() {
        @Override
        public void onMessage(Object o) {
            Log.i("mahdi", "Job finish with ( "+((Bundle) o).getLong("jobTime")/1000+" ) seconds");

        }
    };

    new Thread(new Runnable() {
        @Override
        public void run() {
            long jobTime = doSomething(ITERATION_COUNT);
            Bundle bundle = new Bundle();
            bundle.putLong("jobTime",jobTime);
            callBack.onMessage(bundle);
        }
    }).start();
}

interface ThreadCallBack{

    void onMessage(Object o);

}</pre><p></p>
<p style="text-align: justify;">برای درک بهتر کدها را اجرا کنید و نتایج را برسی کنید. در صورتی که سوال یا نکته ای داشتید کامنت کنید.</p>
<p>منبع: <a href="http://www.biitecode.ir" target="_blank" rel="noopener">بایت کد</a></p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/">نحوه ارتباط بین thread ها</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title>tailrec در Kotlin چیست؟</title>
		<link>http://www.mahditajik.ir/tailrec-%d8%af%d8%b1%da%a9%d8%a7%d8%aa%d9%84%db%8c%d9%86-%da%86%db%8c%d8%b3%d8%aa/</link>
					<comments>http://www.mahditajik.ir/tailrec-%d8%af%d8%b1%da%a9%d8%a7%d8%aa%d9%84%db%8c%d9%86-%da%86%db%8c%d8%b3%d8%aa/#respond</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Sun, 03 Dec 2017 07:29:52 +0000</pubDate>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[#تابع]]></category>
		<category><![CDATA[#کاتلین]]></category>
		<category><![CDATA[fun]]></category>
		<category><![CDATA[kotlin]]></category>
		<category><![CDATA[tailrec]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2701</guid>

					<description><![CDATA[<p>امکانات بسیار زیادی در Kotlin قرار گرفته تا بتواند به زبان رسمی Android مبدل گردد. tailrec یکی از آنهاست. این امکان در توابع بازگشتی کاربرد دارد. همانطور که می دانید استفاده از توابع بازگشتی معمولاً روشی نا صحصیح است که با مقیم شدن در حافظه تا تمام شدن تمامی مراحل، می تواند باعث stack overflow ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/tailrec-%d8%af%d8%b1%da%a9%d8%a7%d8%aa%d9%84%db%8c%d9%86-%da%86%db%8c%d8%b3%d8%aa/">tailrec در Kotlin چیست؟</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p style="text-align: justify;"><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2704" src="http://www.mahditajik.ir/wp-content/uploads/2017/12/tailrec.jpg" alt="" width="800" height="486" srcset="http://www.mahditajik.ir/wp-content/uploads/2017/12/tailrec.jpg 800w, http://www.mahditajik.ir/wp-content/uploads/2017/12/tailrec-300x182.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2017/12/tailrec-768x467.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" />امکانات بسیار زیادی در <strong>Kotlin</strong> قرار گرفته تا بتواند به زبان رسمی <strong>Android</strong> مبدل گردد. <strong>tailrec</strong> یکی از آنهاست. این امکان در توابع بازگشتی کاربرد دارد. همانطور که می دانید استفاده از توابع بازگشتی معمولاً روشی نا صحصیح است که با مقیم شدن در حافظه تا تمام شدن تمامی مراحل، می تواند باعث <strong>stack overflow</strong> گردد و در طراحی الگوریتم روشی <strong>brutal</strong> است. این امکان وجود دارد تا توابع برگشتی را با استفاده از حلقه بهینه کرد.</p>
<p style="text-align: justify;">با گذاشتن <strong>tailrec</strong> در اول تابع بازگشتی، <strong>kotlin</strong> خودش آن را هنگام کامپایل کردن در صورت برقرار بودن شرایط، پیاده سازی آن تابع را با حلقه انجام داده و کد را بهینه می کند. به عنوان نمونه به تابع فاکتوریل زیر توجه کنید:</p>
<p></p><pre class="crayon-plain-tag">fun fact(x: Long): Long {
    tailrec fun factTail(y: Long, z: Long): Long {
        return if (y == 0L) z
        else {
            return factTail(y - 1, y * z)
        }
    }
    return factTail(x, 1)
}</pre><p></p>
<p style="text-align: justify;">برای صدا زدن کافیست:</p>
<p></p><pre class="crayon-plain-tag">logg("$5! : ${fact(5)}")</pre><p></p>
<p style="text-align: justify;">استفاده از <strong>tailrec</strong> شرایط دارد از قبیل اینکه بعد از صدا زدن <strong>recursive</strong> نباید متد دیگری وجود داشته باشد و یا مثلا اینکه درون بلاک های<strong> try/catch/finally</strong> نمی توان استفاده کرد. مثال کامل <strong>Kotlin</strong> را می توانید در لینک ذیل مشاهده کنید.</p>
<p><a href="https://github.com/mahdit83/KotlinExample" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2146" src="http://www.mahditajik.ir/wp-content/uploads/2016/12/github_download.png" alt="github_download" width="230" height="70" /></a>منبع: <span style="color: #ff9900;"><a style="color: #ff9900;" href="http://www.biitecode.ir" target="_blank" rel="noopener">بایت کد</a></span></p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/tailrec-%d8%af%d8%b1%da%a9%d8%a7%d8%aa%d9%84%db%8c%d9%86-%da%86%db%8c%d8%b3%d8%aa/">tailrec در Kotlin چیست؟</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/tailrec-%d8%af%d8%b1%da%a9%d8%a7%d8%aa%d9%84%db%8c%d9%86-%da%86%db%8c%d8%b3%d8%aa/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>کتابخانه Advanced Permission manager</title>
		<link>http://www.mahditajik.ir/%da%a9%d8%aa%d8%a7%d8%a8%d8%ae%d8%a7%d9%86%d9%87-advanced-permission-manager/</link>
					<comments>http://www.mahditajik.ir/%da%a9%d8%aa%d8%a7%d8%a8%d8%ae%d8%a7%d9%86%d9%87-advanced-permission-manager/#comments</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Tue, 28 Nov 2017 15:39:19 +0000</pubDate>
				<category><![CDATA[برنامه های من]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[permission]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2677</guid>

					<description><![CDATA[<p>Advanced Permission manager کتابخانه ای است که توسط آن از شر تمامی دردسر های مجوز های درحال اجرای اندروید خلاص می شوید. همانطور که می دانید تعدادی مجوز در اندروید جزو مجوز های خطرناک است که برای استفاده از آنها علاوه بر منیفست باید در حال اجرا نیز اجازه کاربر را بگیرید و روند گوناگونی ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%da%a9%d8%aa%d8%a7%d8%a8%d8%ae%d8%a7%d9%86%d9%87-advanced-permission-manager/">کتابخانه Advanced Permission manager</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2678" src="http://www.mahditajik.ir/wp-content/uploads/2017/11/mahditajik.ir_lib_image_2.jpg" alt="" width="640" height="480" srcset="http://www.mahditajik.ir/wp-content/uploads/2017/11/mahditajik.ir_lib_image_2.jpg 640w, http://www.mahditajik.ir/wp-content/uploads/2017/11/mahditajik.ir_lib_image_2-300x225.jpg 300w" sizes="(max-width: 640px) 100vw, 640px" /></p>
<p style="text-align: justify;"><strong>Advanced Permission manager </strong>کتابخانه ای است که توسط آن از شر تمامی دردسر های مجوز های درحال اجرای اندروید خلاص می شوید. همانطور که می دانید تعدادی مجوز در اندروید جزو مجوز های خطرناک است که برای استفاده از آنها علاوه بر منیفست باید در حال اجرا نیز اجازه کاربر را بگیرید و روند گوناگونی دارد. لیست مجوز های خطرناک به شرح ذیل است:</p>
<p></p><pre class="crayon-plain-tag">READ_CALENDAR
WRITE_CALENDAR
CAMERA
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
RECORD_AUDIO
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
BODY_SENSORS
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE</pre><p></p>
<p style="text-align: justify;">حال ممکن است کاربر نه تنها اجازه ندهد بلکه گزینه &#8220;دیگر نشان نده&#8221; را انتخاب کند و برای رسیدگی کردن به این قضیه، چک های مختلفی انجام داد که خوشبختانه کتابخانه <strong>Advanced Permission manager</strong> همه این موارد را به عهده می گیرد.</p>
<p style="text-align: justify;">برای استفاده از این کتابخانه خط زیر را به گریدل برنامه اضافه کنید:</p>
<p></p><pre class="crayon-plain-tag">compile 'ir.mtajik.android:advancedPermissionsHandler:1.0.6'</pre><p></p>
<p style="text-align: justify;">کافی است  <strong>Activity</strong> خود را از <strong>PermissionHandlerActivity</strong> ارث بری کنید. سپس متد زیر را صدا کنید و دیگر نگران برسی کردن مجوز و مراحل دست و پا گیر آن نباشید. همه آن را کتابخانه بصورت اتومات مدیریت می کند.<strong><br />
</strong></p>
<p></p><pre class="crayon-plain-tag">String[] permissions = new String[] {Manifest.permission.SEND_SMS, 
Manifest.permission.WRITE_EXTERNAL_STORAGE , Manifest.permission.READ_EXTERNAL_STORAGE , ...}

boolean stickyMode = true;

askForPermission(permissions , stickyMode, new PermissionCallBack() {
                    
                    @Override
                    public void onPermissionsGranted() {  
                        Log.i("mahdi", "onPermissionsGranted: ");
                    }

                    @Override
                    public void onPermissionsDenied(String[] permissions) {
                        Log.i("mahdi", "onPermissionsDenied: ");
                    }
                });</pre><p></p>
<p style="text-align: justify;">روند گرفتن مجوز بدین شکل است:</p>
<p style="text-align: justify;"><strong>اول:</strong> برنامه اجازه تمامی مجوز های خواسته شده را به کاربر نمایش می دهد.<br />
<strong>دوم:</strong> سپس مجوزهای داده نشده در مرحله قبل با یک دیالوگ دیگر با پیغام جدید از کاربر خواسته می شود.<br />
<strong>سوم:</strong> اگر کاربر گزینه &#8220;دیگر به من نمایش نده&#8221; را انتخاب کرده باشد، تنظیمات برای گرفتن مجوزها باز می شود.<br />
<strong>چهارم:</strong> اگر همچنان کاربر مجوز نداد، کالبک <strong>onPermissionsDenied</strong> فراخوانی می شود.</p>
<p style="text-align: justify;">حال <strong>stickyMode </strong> مشخص می کند که تمام مراحل بالا در یک نشست اتفاق بیافتد یا اینکه خیر. استفاده از این کتابخانه باعث میشه که بدون نگرانی بابت مجوزها به قسمت های دیگر برنامه بپردازید. اگر درمورد پیاده سازی نکته، پیشنهاد، مشکل یا سوالی داشتید خوشحال می شم تا با من درمیان بگذارید.</p>
<p style="text-align: justify;"><a href="https://github.com/mahdit83/advancedPermissionHandler" target="_blank" rel="noopener noreferrer"><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2146" src="http://www.mahditajik.ir/wp-content/uploads/2016/12/github_download.png" alt="github_download" width="230" height="70" /></a></p>
<p>لینک پروژه در Github</p>
<p style="text-align: left;"><span style="color: #3366ff;"><a style="color: #3366ff;" href="https://github.com/mahdit83/advancedPermissionHandler" target="_blank" rel="noopener">https://github.com/mahdit83/advancedSmsManager</a></span></p>
<p>لینک پروژه در Bintray</p>
<p style="text-align: left;"><span style="color: #3366ff;"><a style="color: #3366ff;" href="https://bintray.com/mahdi/maven/advancedPermissionsHandler" target="_blank" rel="noopener">https://bintray.com/mahdi/maven/advancedsmsmanager</a></span></p>
<p>لینک در android-arsenal</p>
<p style="text-align: left;"><span style="color: #3366ff;"><a style="color: #3366ff;" href="https://android-arsenal.com/details/1/6510" target="_blank" rel="noopener">https://android-arsenal.com/details/1/6024</a></span></p>
<p>منبع: <a href="http://www.biitecode.ir" target="_blank" rel="noopener">بایت کد</a></p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%da%a9%d8%aa%d8%a7%d8%a8%d8%ae%d8%a7%d9%86%d9%87-advanced-permission-manager/">کتابخانه Advanced Permission manager</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/%da%a9%d8%aa%d8%a7%d8%a8%d8%ae%d8%a7%d9%86%d9%87-advanced-permission-manager/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
	</channel>
</rss>