<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های بهروز خضری</title>
        <link>https://virgool.io/feed/@bkhezry</link>
        <description>توسعه‌دهنده اندروید</description>
        <language>fa</language>
        <pubDate>2026-06-07 19:50:12</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/397/avatar/LrAyrG.png?height=120&amp;width=120</url>
            <title>بهروز خضری</title>
            <link>https://virgool.io/@bkhezry</link>
        </image>

                    <item>
                <title>برنامه زلزله‌ - داستان ایجاد یک اپلیکیشن اندروید</title>
                <link>https://virgool.io/@bkhezry/earthquake-app-jprhupm8ni7q</link>
                <description>مدتی بود که می‌خواستم یک برنامه با Kotlin بنویسم اما خب سختی کار کوچ از جاوا به کاتلین و به خصوص نداشتن ; در اون باعث می‌شد که هر بار انجامش ندم :-) دیگه اینبار دل رو به دریا زدم.برای دیتای زلزله، چندین وب‌سرویس وجود داره که من قبلا دیتای USGS رو دیده بودم. خروجی geojson میده که خب چون کار اصلی من روی داده‌های مکانی و نقشه است برای من خروجی خیلی مناسبی بود. شروع ایجاد پروژه جدید رو زدم و حداقل اندروید رو روی ۲۱ گذاشتم. خوبی این نسخه اینه که خیلی از مشکلات نسخه‌های پایین اندروید رو حل کرده. کار کردن بر روی vector و transitions ساده‌تره و نیازی به هندل کردن multi dex دیگر نیست.خیلی گشتم اما متاسفانه نتونستم طرحی برای اپلیکیشن مربوط به زلزله در اینترنت پیدا کنم. از شهرام هم که کارش همین طراحی است هم پرسیدم. اون هم نتونست طرح خاصی رو پیدا کنه. برای همین مجبور شدم هرچی طراحی که مربوط به نقشه بود رو یه نگاهی بندازم و این طرح رو پیاده کنم. می‌تونست خیلی بهتر باشه.دو ساعت اول کد نویسی خیلی عجیب بود. برخی از کارها رو آدم بصورت ناخودآگاه انجام میده، کاری که در کاتلین دیگه مرسوم نیست اما واقعا همین دو ساعت اولش سخت بود. بعد از اون با قدرت خود اندروید استودیو، الگوهای اون و حتی تبدیل اتوماتیک کد جاوا به کاتلین بسیاری از مشکلات حل شد.کدها کوتاه‌تر، یه سری از توابع بخصوص در رشته‌ها به غایت ساده و در دسترس‌تر وجود دارند. برخی از پیاده‌سازی‌ها مانند implement کردن کلاس‌های interface و هندل کردن کلیک بر روی المان‌ها کمی متفاوت‌تر از جاوا بود که با جستجو در گوگل حل می‌شد. تعاریف کلاس‌‌ها و توابع استاتیک هم عوض شده بود که اونا رو هم با کمی جستجو فهمیدم. کدی که در نهایت تولید شده مطمئنم بهینه نیست و حتی شاید نوع نوشتارش درست نباشه اما برای شروع برای خودم حداقل خیلی رضایت‌بخش بود. اگه کسی اشکالی در اون می‌بینه خوشحال میشم که با ثبت issue و حتی PR به اون در بهتر کردنش کمک کنه.‌کاتلین رو شروع کنید، از چیزی که به نظر میرسه ساده‌تره :-)از هوتن براری هم ممنونم. مثل همیشه برنامه رو تست کرد و مشکلات اون رو ذکر کرد. مرسی که هستی.پروژه رو به صورت کامل در گیت‌هاب به این نشانی قرار دادم: https://github.com/bkhezry/earthquake برای تست سورس برنامه فقط به API Key گوگل برای نقشه نیاز دارید که باید برای پروژه از کنسول گوگ دریافتش کنید و در فایل مربوطه قرارش بدید. تنها دسترسی مورد نیاز برای اجرای برنامه، اینترنت است. با اینکه از نقشه گوگل استفاده شده اما نیاز به دسترسی به موقعیت شما ندارد.لینک دانلود آخرین نسخه برنامه به صورت apk در اینجا در دسترس است:https://bkhezry.ir/earthquake-release-last.apk</description>
                <category>بهروز خضری</category>
                <author>بهروز خضری</author>
                <pubDate>Wed, 09 Oct 2019 11:05:24 +0330</pubDate>
            </item>
                    <item>
                <title>برنامه هواشناسی - داستان ایجاد یک اپلیکیشن اندروید</title>
                <link>https://virgool.io/@bkhezry/%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D9%88%D8%A7%D8%B4%D9%86%D8%A7%D8%B3%DB%8C-%D8%AF%D8%A7%D8%B3%D8%AA%D8%A7%D9%86-%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF-%DB%8C%DA%A9-%D8%A7%D9%BE%D9%84%DB%8C%DA%A9%DB%8C%D8%B4%D9%86-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-r9gx4htceo7g</link>
                <description>چند وقت بود که کاری در گیت‌هاب انجام نداده بودم و مشغول پروژه خاصی هم نبودم. گفتم یه اپلیکیشن بنویسم که هم خودم یه چیزی یاد بگیرم هم شاید بدرد کسی بخوره. چند سال پیش به API وب‌سایت OpenWeatherMap برخورد کرده بودم. دیتای هواشناسی رو در اختیار کاربرهاش قرار میده. گفتم یک اپلیکیشن کلاینت اندروید براش بنویسم. یک ماه پیش بود.رفتم داخل سایت UpLabs و دنبال طرح‌های هواشناسی گشتم. طرح‌های بسیار خوبی داشت. از بین اون‌ها این طرح رو انتخاب کردم:طرح خیلی زیبایی است که توسط  Raman Yv طراحی شده. با توجه به محدودیت‌های API مربوط به OpenWeatherMap مجبور شدم برخی تغییرات رو در ظاهر طراحی اعمال کنم. اما کلیت کار الهام‌گرفته از این طرح است.دیتای OpenWeatherMap شامل دیتای دمای فعلی، دمای ۵روز آینده به صورت هر سه ساعت یک دیتا و ۱۶روز آینده است. زمان‌های برگشتی از سمت API منطبق با GMT است و امکان مشخص کردن Timezone فعلی در درخواست وجود نداره. برای همین مشکلاتی برای نمایش دیتا پیش اومد چون مثلا در ساعت ۱ بامداد به وقت تهران، از نگاه ما فردا شده اما برای کسی که در بریتانیاست هنوز دیروز است. برای همین مجبور شدم تغییراتی در نمایش دیتا به وجود بیارم اما در نهایت نتیجه مطلوب شد.دسترسی به دیتای OpenWeatherMap در حال تغییره و ممکنه در آینده‌ی نزدیک اپ دیگه نتونه تمامی دیتا رو نشون بده و نیاز به به‌روزرسانی داشته باشه. در اون زمان اپلیکیشن بهتون پیام لازم رو میده. متاسفانه API بدرد بخور دیگه‌ای پیدا نکردم. اکثرا پولی شدن و یا به کل حذف شدند.برای استفاده از اپلیکیشن فقط یک محدودیت ۱ساعته برای هر به‌روزرسانی اعمال کردم. دلیل اینکار اینه که خودش اعلام کرده که هر ۲ساعت یک بار دیتا رو به‌روز می‌کنه و نیازی نیست درخواست‌های زیادی بهش داده بشه. پس ممکنه دیتای نمایش داده شده با واقعیت جوی اون لحظه منطبق نباشه.هدف اصلی از ایجاد این اپلیکیشن یادگیری برنامه‌نویسی اندروید در قالب یک پروژه متن باز است. از کتابخانه‌های مختلفی استفاده شده تا بهترین نتیجه در طراحی و نمایش دیتا حاصل بشه. مطمئنن مشکلات زیادی هم داره. ممنون میشم که خطاهای اون رو به صورت issue ثبت کنید. برنامه دو زبانه است و می‌تونید زبان فارسی رو در منوی اون فعال کنید.لینک سورس اون در گیت‌هاب به این نشانی در دسترس است https://github.com/bkhezry/weather از ابتدای شروع به کار، هوتن براری خیلی به این پروژه کمک کرد. همه بخش‌ها رو تست و نظراتش رو گفت. برای آیکن‌های هواشناسی برنامه هم زحمت کشید و اون‌ها رو از فایل‌های انیمیشن Lottie ایجاد کرد و برام فرستاد. خواستم اینجا ازش تشکر کنم. مرسی که هستی.از دوستانی که برنامه رو تست کردن و مشکلاتش رو گفت ممنونم. تا حد امکان سعی کردم مشکلاتش رو رفع کنم. برخی بخاطر محدودیت‌های برنامه‌نویسی و برخی هم به دلیل کمبود دانش من در اون زمینه انجام نشد.برای دانلود اپلیکیشن از لینک مستقیم زیر از وب‌سایتم استفاده کنید. تنها دسترسی مورد نیاز اپلیکیشن، اینترنت است.</description>
                <category>بهروز خضری</category>
                <author>بهروز خضری</author>
                <pubDate>Thu, 23 May 2019 13:36:50 +0430</pubDate>
            </item>
                    <item>
                <title>آمار بازدید مطالب من در سال ۹۷</title>
                <link>https://virgool.io/@bkhezry/%D8%A2%D9%85%D8%A7%D8%B1-%D8%A8%D8%A7%D8%B2%D8%AF%DB%8C%D8%AF-%D9%85%D8%B7%D8%A7%D9%84%D8%A8-%D9%85%D9%86-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-%DB%B9%DB%B7-sw7axnrn3lyk</link>
                <description>من در سال گذشته، در مجموع ۶ مقاله در ویرگول منتشر کردم. در طول این سال مقالات من ۱۰۴ مرتبه لایک شدند و ۹ نظر نیز بر روی آن‌ها ارسال شد. با مطالعه این مقالات، ۷۲ نفر تصمیم گرفتند تا من را در ویرگول دنبال کنند تا از مقالات بعدی من باخبر شوند.مخاطبیندر طول این سال، مقالات من توسط ۲,۸۴۸ نفر در ویرگول مطالعه شده است. مدت زمانی که این افراد در حال مطالعه‌ی آن‌ها بوده‌اند برابر با ۱۲۰,۱۴۰ ثانیه است. اگر فرض کنیم در حال حاضر جمعیت ایران ۸۰ میلیون نفر است، این یعنی من توانسته‌ام سرانه مطالعه کشورم ایران را ۰/۰۰۱۵۰۲ ثانیه افزایش دهم. شاید بتوانیم این عدد را به «اثر پروانه‌ای» تشبیه کنیم؛ چرا که هر کدام از نویسندگان در ویرگول توانسته‌ایم عددی کوچک را به سرانه مطالعه کشور اضافه کنیم اما مجموعِ تک تکِ این اعداد، یک عدد بزرگ شده است. من در کنار سایر کاربرانِ ویرگول توانستیم در سال ۹۷، سرانه مطالعه ایران را ۴/۱۲۲۳۴۳ ثانیه افزایش دهیم.می‌توانیم برای سال ۹۸، اتفاقات بزرگتری را رقم بزنیم.ویدیوی آمار مخاطبین من را ببینید: https://cdn.virgool.io/annual-report-97/vn9b9grqatl3-2OQr.mp4 </description>
                <category>بهروز خضری</category>
                <author>بهروز خضری</author>
                <pubDate>Wed, 27 Mar 2019 03:37:03 +0430</pubDate>
            </item>
                    <item>
                <title>ورود با حساب‌کاربری گوگل در اندروید</title>
                <link>https://virgool.io/pullrequest/google-sign-in-android-llrhgbahtas5</link>
                <description>قرار بود که بعد از منتشر شدن سرویس مهادل، در مورد ویژگی‌های اپ اندروید اون باز هم در ویرگول بنویسم. هدف اصلی و اولیه این سرویس هم، آموزش اندروید بود. ابتدا می‌تونید داستان ایجاد سرویس مهادل رو مطالعه کنید: https://virgool.io/@bkhezry/skill-swap-mahadel-qs9xzbyg275y خوبی ورود با حساب‌کاربری گوگل اینه که دیگه روند دریافت ایمیل، رمزعبور و تایید ایمیل رو حذف می‌کنه. از لحاظ امنیت هم چون رمزی از کاربر دریافت نمیشه، امنیت حساب‌کاربری شخص در اپلیکیشن، در گرو امنیت جیمیل اون است.عکس از گوگلگوگل برای ورود با حساب‌کاربری خودش دو راه حل در اندروید ارائه داده. یکی از اون‌ها قدیمی است و از ابتدای ایجاد این امکان، وجود داشته. این ورود با استفاده از Google play service و کتابخانه  play-services-auth انجام میشه. لینک راهنماروش دیگه استفاده از Firebase و کتابخانه firebase-auth است که به نسبت روش اول جدیدتره. امکانات این کتابخانه بسیار از روش اول بیشتره. با استفاده از اون می‌تونید نه تنها با حساب‌کاربری گوگل ثبت‌نام کنید بلکه امکان استفاده از شبکه‌های اجتماعی دیگه همچون فیس‌بوک، توییتر و گیت‌هاب رو هم فراهم کرده. لینک راهنمامتاسفانه از ابتدای به وجود اومدن این امکان در Firebase ایران در لیست تحریم اون قرار داره و عملا نمیشه برای اپلیکیشن‌هایی که در ایران استفاده میشن از اون استفاده کرد #فناتحریمبرای استفاده از روش اول ابتدا به سایت توسعه گوگل مراجعه کنید و یک پروژه جدید برای اپلیکیشنتون ایجاد کنیدسایت توسعه گوگلبرای مثال من پروژه Skill Swap رو ایجاد کردم.برای استفاده از امکان ورود با حساب‌کاربری گوگل نیاز به Client ID دارید که گوگل به شما میده. برای این‌کار گزینه Credentials رو بزنید. در صفحه جدید بر روی Create credentials کلیک کنید و گزینه OAuth client ID رو انتخاب کنید. در صفحه جدید باز شده، شما باید دو مقدار Client ID ایجاد کنید. یکی Web application نام داره که مقدار اون در تولید توکن در اپ اندروید و اعتبارسنجی مقدار اون در بک‌اند استفاده میشه. مقدار دوم، اپلیکیشن شما رو با استفاده از SHA1 مربوط به کلید ساین و package name اون گوگل معرفی می‌کنه. چنانچه چندین کلید برای ساین اپلیکیشن دارید به ازای هر کدام باید یکClient ID ایجاد کنید. با این کار فقط اپلیکیشنی که در این بخش مقدار مربوط به SHA1 و package name اون ثبت شده باشه توکن اون معتبر خواهد بود.Client ID ایجاد شدهالان مقدار Client ID مربوط به نوع Web application رو کپی کنید تا در پروژه اندروید استفاده بشه. کد کامل بخش ورود با حساب‌کاربری گوگل در این لینک قابل دسترس است.  https://gist.github.com/bkhezry/497c926fd517ad625d8a5103437d4042 مقدار Client ID گوگل رو با استفاده از تابع requestIdToken به GoogleSignInOptions ارسال کنید. با اضافه کردن این بخش، یک توکن با توجه به مقدار اون، توسط سرور گوگل برای شما ارسال می‌شه.  https://gist.github.com/bkhezry/8d461c54de067327ef8376bd1261b76c مقدار توکن با استفاده از تابع getIdToken از شی GoogleSignInAccount دریافت میشه. اطلاعات این توکن برای حساب‌کاربری من در عکس پایین نمایش داده شده‌توکن ارسالی از سمت گوگلاین توکن برای یک ساعت معتبر بوده و شامل نام، نام‌خانوادگی، ایمیل و لینک عکس پروفایل شخص است. این مقدار باید توسط یک ارتباط امن https به سرور برای اعتبارسنجی و ذخیره ارسال بشه.تا اینجا برنامه اندروید به گوگل وصل شده و توکن حساب‌کاربری انتخاب شده رو دریافت و به سرور ارسال کرده. نکات این بخش:به ازای هر کلید ساین اپلیکیشن، باید یک Client ID تولید و مقادیر SHA1 و package name رو براش ثبت کنیمبرای درخواست و اعتبارسنجی توکن باید از مقدار Client ID مربوط به نوع Web application استفاده کنیمحتما از ارتباط امن با سرور برای ارسال توکن استفاده کنیمبرای اعتبارسنجی توکن ارسال شده به سرور می‌تونید از کتابخانه‌های آماده مربوط به زبان بک‌اند خودتون استفاده کنید. تعدادی از اون‌ها شامل پی‌اچ‌پی، پایتون و ... در این لینک در دسترس است. دقت کنید که مقدار Client ID درخواستی سرور هم باید با مقدار ثبت شده در اپلیکیشن اندروید یکی باشد یعنی همان مقدار نوع Web application.</description>
                <category>بهروز خضری</category>
                <author>بهروز خضری</author>
                <pubDate>Sat, 29 Dec 2018 21:11:49 +0330</pubDate>
            </item>
                    <item>
                <title>استفاده از سورس اپ مهادل در اندروید استدیو</title>
                <link>https://virgool.io/@bkhezry/use-mahadel-source-dcgfrez5azei</link>
                <description>سرویس تبادل مهارت به صورت متن‌باز ارا‌ئه شد و در این پست در موردش نوشتم. الان می‌خوام در پستی کوتاه بگم برای استفاده از سورس اندروید اون چه چیزهایی نیاز است https://virgool.io/@bkhezry/skill-swap-mahadel-qs9xzbyg275y سورس برنامه به صورت کامل ارا‌ئه شده.  https://github.com/Mahadel/android این سورس به وب‌سرویس مهادل به آدرس https://demo.mahadel.ir وصل است. چون اپلیکیشن «ورود با حساب‌کاربری گوگل» داره برای همین در اجرای بدون سرور اون، به مشکل خواهید خورد. به همین دلیل برنامه رو به سرویسی متصل کردم تا در اجرای اول کار کنه. این سرویس از سرویس اصلا جدا بوده و دیتای اون‌ها ربطی به هم نداره.در تنظیمات مربوط به گردل، فایل خروجی برنامه چه در حالت Release و چه در حالت Debug با یک Keystore که مقادیر SHA1 اون در سرور و گوگل ذخیره شده ساین میشه پس نیازه که برای توسعه کد حتما برنامه با این کلید ساین بشه. بدون این کلید، گوگل JWT تولید شده در زمان ورود با حساب‌کاربری گوگل رو اعتبارسنجی نخواهد کرد.برای اجرای هرچه بهتر کد سعی کنید که از اندروید استدیو نسخه ۳.۴ استفاده کنید که به صورت آلفا ارائه شده. به دلیل استفاده از androidx و Material Design 2 در توسعه این برنامه و به‌روزرسانی متناوب این دو بخش، تصمیم گرفتم که از نسخه غیر پایدار اندروید استدیو استفاده کنم. امیدوارم با نسخه پایدار هم مشکلی نداشته باشه.در اجرا و استفاده از سورس برنامه چنانچه با اشکالی مواجه شدید حتما به پروژه issue بزنید تا مشکل رو رفع کنیم. در صورتی که از کد برنامه استفاده کردید و مفید بود ممنون می‌شم بهش ستاره بدید :-)</description>
                <category>بهروز خضری</category>
                <author>بهروز خضری</author>
                <pubDate>Wed, 19 Dec 2018 01:03:32 +0330</pubDate>
            </item>
                    <item>
                <title>برنامه تبادل مهارت - داستان ایجاد یک اپلیکیشن اندروید</title>
                <link>https://virgool.io/@bkhezry/skill-swap-mahadel-qs9xzbyg275y</link>
                <description>مدتی بود که می‌خواستم یک برنامه اندروید بنویسم که خیلی از جوانب و نیازمندی‌های توسعه اندروید رو پوشش بده و به صورت متن‌باز منتشرش کنم. پاییز امسال فرصتی شد که این کار رو انجام بدم. هدف اصلی برنامه آموزش برنامه‌نویسی اندروید بود اما اینکه برنامه بتونه یه کار رو هم انجام بده و یک ایده واقعی رو اجرا کنه خیلی بهتر بود. https://mahadel.ir چندتا توییت باعث شد که این ایده به ذهنم برسه. دوستانی بودن که در عوض مثلا یاد گرفتن سنتور و سه‌تار می‌خواستن به شخص یاددهنده برنامه‌نویسی یاد بدن. گفتم برنامه‌ای بنویسم که هر کس چیزی که بلده و چیزی که می‌خواد یاد بگیره رو ثبت کنه و موقع جستجو برنامه بگرده براش اون شخص رو پیدا کنه. ارتباط بعدی دو کاربر در جیمیلشون و از طریق ایمیل خواهد بود و کار برنامه تبادل مهارت تا اینجاست.کمی لاراول بلد بودم و نشستم یک بک‌اند برای برنامه نوشتم. می‌خواستم سورس بک‌اند رو هم منتشر کنم برای همین به مهدی علیپور گفتم که اگه دوست داره برای Review کدها در اون مشارکت کنه که قبول کرد. چون من تخصصی در لاراول نداشتم حتما نیاز به یک بازبینی از شخصی کار بلد چون مهدی وجود داشت. سورس اون در گیت‌هاب در دسترس است: https://github.com/Mahadel/api برای Web UI هم دوستم بارسین علی‌محمدی قبول کرد که یک Landing page برای اپلیکیشن آماده کنه. تمامی کارهای مربوط به آماده‌سازی صفحه برای زبان فارسی، ایجاد لوگو، اسکرین‌شات و ... رو انجام داد. سایت ارائه دهنده این قالب استفاده از این قالب برای اهداف غیرتجاری و بدون حذف لایسنس رو مجاز می‌دونه. بارسین هم به همین صورت سورس اون رو در گیت‌هاب منتشر کرد: https://github.com/Mahadel/web-ui برای برنامه نیاز به سرور داشتم که مازیار دانیالی اون رو برام فراهم کرد. برای اسم برنامه از نیما اکبرپور سوال کردم که اسم خاصی به ذهنش می‌رسه یا نه که از روی دو کلمه «تبادل مهارت» اسم مهادل رو پیشنهاد داد. با همون دامنه رو ثبت کردم.و اما اپ اندروید.مواردی که در برنامه‌نویسی اپ بهش پرداخته شده شامل ورود با حساب‌کاربری گوگل، دو زبانه بودن اپ، داشتن تم تاریک و روشن، استفاده از دیتابیس داخلی، ارتباط با سرور و... است. همچنین در طراحی برنامه سعی شده از المان‌های Material Design 2 که اخیرا توسط گوگل ارائه شده استفاده بشه: https://github.com/Mahadel/android در روزهای آتی و هر چند روز یه بار با جزئیات بیشتر در مورد این موارد در ویرگول خواهم نوشت. اینکه برای هر بخش چه کاری انجام شده و چه چالش‌هایی وجود داره. هدف اصلی برنامه هم همین آموزش‌های اندروید در قالب پُست وبلاگ در ویرگول و شاید مدیوم است.در هر پروژه منتشر شده اشکال وجود داشت یا نیاز است که تغییری ایجاد بشه می‌تونید در پروژه‌ها issue ثبت کنید. اینکه بتونید در توسعه اون‌ها کمک کنید که چه بهتر. از مشارکت شما به گرمی استقبال میشه. برنامه حتما کاستی‌هایی داره در بهبودش کمک کنید.از بارسین، مهدی و دکتر دانیالی هم خیلی ممنونم :-)</description>
                <category>بهروز خضری</category>
                <author>بهروز خضری</author>
                <pubDate>Wed, 19 Dec 2018 00:37:50 +0330</pubDate>
            </item>
                    <item>
                <title>کتابخانه‌ای برای ایجاد المان Spinner با قابلیت جستجو - داستان ایجاد یک کتابخانه</title>
                <link>https://virgool.io/@bkhezry/persianssearchablespinner-sulnzr2qhh7d</link>
                <description>برای یک برنامه اندروید نیاز داشتم که لیستی از آیتم‌ها رو نمایش بدم و یکی رو انتخاب کنم. برای اینکار در اندروید المانی به نام Spinner وجود داره. هر کسی باهاش کار کرده باشه می‌دونه که به غایت افتضاحه. این همه گوگل برای المان‌های مختلف آپدیت داده اما این یکی هنوز دست نخورده مونده. چند نفری روی راست به چپ کردن و اضافه کردن برخی ویژگی بهش کار کردن اما باز جای کار داره. برخی هم فقط در اپ خودشون استفاده کردن و کدش رو ارائه ندادن.دنبال یک Spinner گشتم که امکان جستجو داشته باشه راست به چپ هم باشه. این کتابخانه رو پیدا کردم: https://github.com/michaelprimez/searchablespinner اولین چیزی که بهش دقت کردم minSDK اون بود که متاسفانه ۲۱ است. در بخش issue اون پیشنهاد دادن که از کتابخانه‌ی دیگه‌ای برای نمایش انیمیشن استفاده کنه که نسخه اون رو بتونن کاهش بدن. چیزی که استفاده کرده بود در نسخه ۲۱ اندروید اضافه شده. نه راست به چپ بود و نه از تغییر فونت هم پشتیبانی می‌کرد.در بخش pull request شخصی سعی کرده بود اون رو تا نسخه ۱۵ کاهش بده که خب گویا موفق نبوده. کتابخانه رو گرفتم و برای اضافه کردن فونت، راست به چپ کردن و کاهش minSDK اون سعی خودم رو کردم. هم در attrs و هم در توابع SearchableSpinner امکان استفاده از فونت رو اضافه کردم و همچنین کل UI اون رو راست به چپ کردم.با استفاده از اون PR و کتابخانه CircularReveal و تغییراتی که اعمال کرده بود تونستم برنامه رو روی اندروید ۱۹ اجرا کنم و minSDK رو تا ۱۷ کاهش بدم. مشکلی نداشت. نسخه اولیه‌ای ازش خروجی گرفتم و حتی در یک برنامه قدیمی هم ازش استفاده کردم.برنامه رو در اندروید ۲۴ تست کرده بودن و با force close مواجه شده بودن. خطایی که داده بود مربوط میشه به تغییراتِ ترتیبِ نمایش view در صفحه. از نسخه ۲۱ به بعد گویا اینکار با تاخیر انجام میشه و زمانی که هنوز view اصطلاحا به صفحه attach نشده بود قصد داشت انیمیشن رو به اون اختصاص بده. با استفاده از تابع post که جزو توابع عمومی هر view است زمان اتمامِ ایجاد و attach شدن view به صفحه رو تشخیص و بعد از اون انیمیشن رو به اون اختصاص دادم. احتمالا همین مشکل بوده که باعث شده اون PR برای کاهش نسخه اندروید به سرانجام نرسه.کتابخانه رو در گیت‌هاب منتشر کردم. احساس می‌کنم مشکلاتی باید داشته باشه. در بهبودش کمک کنید. https://github.com/bkhezry/PersianSearchableSpinner </description>
                <category>بهروز خضری</category>
                <author>بهروز خضری</author>
                <pubDate>Wed, 04 Jul 2018 18:51:39 +0430</pubDate>
            </item>
                    <item>
                <title>انتخاب بازه‌ای از تاریخ و ساعت در اندروید - داستان ایجاد یک کتابخانه</title>
                <link>https://virgool.io/@bkhezry/persiandaterangepicker-veytkyvwvlbh</link>
                <description>فکر کنم پیام صادری بود یه بار گفت «هر توسعه‌دهنده ایرانی و یک کتابخانه شمسی» راست هم می‌گفت. اینترنت رو بگردی به ازای هر زبان برنامه‌نویسی چندین و چند کتابخانه برای انتخاب تاریخ شمسی وجود داره. چندی پیش دنبال یکیشون برای اندروید بودم که به کتابخانه‌ای که محمد ایجاد کرده رسیدم. https://github.com/mohamad-amin/PersianMaterialDateTimePicker در ابتدا متوجه شدم که از تغییر فونت پشتیبانی نمی‌کنه همانگونه که کتابخانه اصلی که محمد اون رو به شمسی ویرایش کرده ازش پشتیبانی نمی‌کرد. با سماجت دونه دونه گشتم و هرچی المان داشت رو تغییر فونت دادم و یه تابع برای مشخص کردن فایل فونت مورد نظر نوشتم و بهش PR دادم. اما چیزی که هنوز درست نبود راست به چپ بودن ایام هفته و به طبع عدد روزهای هر ماه بود. از خیر اون گذشتم و ازش استفاده کردم. ساعت که از ۱۲ شب گذشت دیدم یه مشکل دیگه داره و اونم اینه که هنوز تاریخ دیروز رو نشون میده و هنوز فردا نشده. خیلی سعی و کوشش کردم که کتابخانه رو درست کنم که متاسفانه موفق نشدم. می‌دونستم هرچی هست به TimeZone ربط داره اما همین که یه بخشش درست می‌شد می‌زد یه جای دیگه رو داغون می‌‌کرد. ولش کردم.در برنامه‌ای که رووش کار می‌کردم نیاز به یک کتابخانه داشتم که بشه بازه‌ای از زمان رو انتخاب کرد. برای فیلترکردن دیتا بهش نیاز داشتم. کتابخانه‌ی فارسی که از تاریخ شمسی پشتیبانی کنه رو برای این منظور پیدا نکردم. یه کتابخانه میلادی بود که از قضا با کتابخانه محمد پایه مشترکی داشتن. گفتم بشینم این رو ویرایش کنم بشه «کتابخانه انتخاب بازه‌ای تاریخ شمسی و ساعت در اندروید»اولین کار این بود که کلاس‌های مربوط به Dialog اون رو تغییر نام دادم. چرا که ممکن بود کسی از کتابخانه محمد و این کتابخانه کنار هم استفاده کنه و چون پایه هر دو یکی بود، کلاس‌ها با هم تداخل پیدا می‌کردن. بعدش جاهایی که محمد تاریخ رو از میلادی به شمسی تبدیل کرده بود رو اعمال کردم.کتابخانه به شکل برنامه محمد در اومد و این موقع بود که دیگه راست به چپ نبودنش رو تاب نیاوردم. کد رو که نگاه کردم در چند بخش مکان هر عدد(روزها) رو به صورت x,y محاسبه می‌کرد و عدد یا نام روز هفته رو در اون مکان قرار می‌داد. سپس در یک حلقه و به تعداد روزهای هفته مقدار x رو اضافه می‌کرد و نقطه بعدی رو قرار می‌داد. با تموم شدن یک هفته مقدار y رو اضافه می‌کرد تا در مکان پایین‌تر هفته بعد رو قرار بده و الا آخر. این روند رو با تغییر چندین خط و محاسبه نقاط جدید، معکوس کردم. با اضافه کردن یک padding به سمت راست تقویم شکلش قابل قبول شد.سپس روی هر نقطه که کلیک می‌کردم تابع دیگری فراخوانی می‌شد که عدد زیرش رو برگردونه. چون این تابع ویرایش نشده بود دقیقا نقطه قرینه رو انتخاب می‌کرد. مثلا ۱ام رو انتخاب می‌کردم اون ۷ام رو انتخاب می‌کرد. با ویرایش اون تابع هم دیگه مشکل راست به چپ حل شد. تغییر فونتش رو هم که قبلا حل کرده بود و به راحتی در این کتابخانه هم اعمال شد.اما باز که ساعت ۱۲ شب شد دیدم هنوز دیروزه و فردا نشده. چندین و چند ساعت وقت گذاشتم اما راه حلی یافت نشد. هرچی روش کثیف بود رو امتحان کردم. حتی از کلاس‌های دیگه هم استفاده کردم که تاریخ شمسی رو به میلادی تبدیل می‌کردن.یوهو یادم افتاد که علی عبدالهی هم کتابخانه‌ای برای انتخاب تاریخ شمسی نوشته. دوباره دانلوش کردم که تستش کنم. https://github.com/hamsaadev/Persian-Date-Picker-Dialog/ اجرا که کردم دیدم برای علی هم هنوز فردا نشده. هر دو از یک کلاس به نام PersianCalendar استفاده کرده بودن. معلوم شد که مشکل از این کلاسه و با دیباگ کردن فهمیدم که تابع calculatePersianDate تاریخ شمسی رو اشتباه محاسبه می‌کنه. اسم این تابع رو گوگل کنید متوجه می‌شید که خیلی جاها استفاده شده و خب باعث بروز این مشکل میشه. در یکی از همین جستجوها یک شخصی به نام سیاوش راه حل عبور از این مشکل رو ارائه داده بود که با استفاده از کد اون مشکل حل شد. فرصتی بشه حتما سعی می‌کنم این دو کتابخانه رو هم ویرایش کنم تا مشکل اونا هم رفع بشه.تا الان یه کتابخانه داشتم که تاریخش شمسی شده بود، راست به چپ شده بود و مشکل محاسبات تاریخش هم حل شده بود.تنها مونده بود انتشارش که در لینک زیر قابل دسترس است. برای حل مشکلات احتمالی و بهبودش به گرمی از pull request شما استقبال می‌شه :-) https://github.com/bkhezry/PersianDateRangePicker/ </description>
                <category>بهروز خضری</category>
                <author>بهروز خضری</author>
                <pubDate>Thu, 24 May 2018 02:38:30 +0430</pubDate>
            </item>
                    <item>
                <title>نقشه‌ OpenStreetMap در مسیر بهتر شدن</title>
                <link>https://virgool.io/@bkhezry/openstreetmap-w7qijihvefns</link>
                <description>چهار سال پیش برای اولین بار از نقشه‌های OpenStreetMap استفاده کردم. شرکتی که براش کار می‌کردم نیاز داشت بدون دسترسی به اینترنت هم بتونه نقشه‌ای به عنوان Base Map در برنامه رهگیری خودروش داشته باشه. اون زمان تونستم tileهای یک استان رو براشون دانلود و سرویسی برای نمایشش درست کنم.در اون سال‌ها جزئیات نقشه بسیار کم بود. بخصوص برای شهرهای کوچک در حد چند خط به عنوان راه‌های اصلی بود و خبری از خیابان‌های کوچکتر اصلا نبود اما به مرور زمان بهتر و بهتر شد.استفاده از نقشه‌ها به صورت رایگان و تحت لایسنس ODbL در دسترس قرار گرفته. تا سال ۲۰۱۵ چیزی حدود ۲میلیون نفر در وب‌سایت اون عضو شدن و با طی روند ساده‌ای داده‌های نقشه رو کامل و به‌روز کردن.تغییرات نقشه سقز چهار سال پیش و اکنونچیزی که باعث شد الان در مورد OSM بنویسم اینه که گوگل دیگه نقشه‌هاش رو به صورت رایگان در اختیار استفاده‌کنندگان قرار نمیده و از چند روز پیش به کسانی که قبلا در پروژه‌هاشون ازش استفاده کردن ایمیل داده از زمان مشخص شده در اطلاعیه به بعد باید حساب‌مالی رو به گوگل اضافه کنند تا چنانچه هزینه استفاده از نقشه، چه خود نقشه چه سرویس‌های مربوط به مسیریابی و ... بیشتر از ۲۰۰دلار در ماه شد اون رو از حساب مشتری کم کنه.داده‌های OSM جزئیات بسیار کمتری نسبت به گوگل داره و بخصوص مکان‌های ثبت شده توسط کاربر در اون خیلی کمتره. اما میشه نقشه رو به راحتی بهبود داد. چند ماه پیش پروژه‌ای متن‌باز در گیت‌هاب دیدم به نام StreetComplete که یک اپ اندروید برای وصل شدن به API این نقشه فراهم کرده. با استفاده از این برنامه میشه به راحتی مسیرها، مکان‌ها و ویژگی اون‌ها رو کامل و به‌روز کرد.  https://play.google.com/store/apps/details?id=de.westnordost.streetcomplete&amp;hl=en_GB به طور قطع با تصمیمی که گوگل در مورد نقشه خودش گرفته تعداد کسانی که از OSM استفاده می‌کنند بیشتر میشه. چه خوب میشه که ما هم در ایران این برنامه رو نصب کنیم و در حد توان خودمون به بهبود نقشه کمک کنیم. مطمئن باشید وقت زیادی ازتون نمی‌گیره. این امر برای شهرهای کوچک‌تر بسیار مهمه چون اطلاعات اون‌ها به مراتب کمتره و بهبود نقشه خیلی سریع‌تر به چشم میاد.با تحریم‌های فناوری و مالی ایران استفاده از خدمات نقشه گوگل خیلی سخت میشه. با قیمت دلار فعلی هم که دیگه هیچی. باید به فکر خودمون باشیم :-)</description>
                <category>بهروز خضری</category>
                <author>بهروز خضری</author>
                <pubDate>Sun, 06 May 2018 01:19:21 +0430</pubDate>
            </item>
            </channel>
</rss>