یادداشت های یک توسعه دهنده از جهان برنامه نویسی

با ما به روز باشید

من خودم عادت کردم هر سایت و وبلاگ جدید میبینم ، سریع یه فید ازش میگیرم تا وقتی به روز میشه ازش خبر داشته باشم . شما هم به عنوان خوانندگان محترم وبلاگ ( هرچند چراغ خاموش هستید و نظر نمیدید ) اگه دوست دارید از نوشته هام با خبر بشید فید این وبلاگ رو میزارم تا بدون دردسر با ما به روز باشید .


 ویرگولgithub

۱ نظر

ایده هاتو بگو : آرایش

حتما شما هم اپلیکیشن های تغییر چهره رو یادتونه . اپ هایی که شما رو پیر میکردن یا براتون سبیل میزاشتن و یا حتی کچلتون میکردن . الانم یه اپ به نام FaceApp ترند شده که میتونید انواع فیلتر روی تصویر صورت اجرا کنید و با توجه به هوش مصنوعی استفاده شده در این اپ تصاویر جالبی بدست بیارید . ایده اصلی اپلیکیشن " آرایش " هم از همین اپ ها الهام میگیره .

آرایش و میکاپ برای خانم ها یک دغدغه است و ماشالله پول زیادی هم براش میدن . اپلیکیشن مورد نظر روی این موضوع مانور میده و با استفاده از الگو برداری از ویژگی های کاربر ، برای آرایش بهتر پیشنهاداتی میده .این پیشنهادات هم میتونه بصورت دوره ای پولی باشه و هم میتونه با توجه به تبلیغاتی که در همین مورد میده درآمد کسب کنه.

برای مثال فرض کنید شما از خودتون عکس میگیرید ( در شرایطی که اپ بتونه رنگ ها رو بهتر تشخیص بده ) و اپ با استفاده از رنگ پوست و موهای شما پیشنهاداتی مثل رنگ مو و رژ و غیره بهتون میده و یه سری محصول هم با همون تن رنگ بهتون پیشنهاد میده که بخرید . در ضمن میتونید از همون رنگ ها استفاده کنید و خودتون رو آرایش کنید تا ببینید آیا بهتون واقعا میاد یا نه . حتی میشه با توجه به ویژگی هایی که به اپ میدید ، یکی از سلیبریتی ها رو که باهاتون همزاد هست رو نشون بده تا شما بتونید از روی آرایشش ایده بگیریدو اگر چیزی رو انتخاب کردید محصول نزدیک بهش رو هم بهتون پیشنهاد بده

نمونه های زیادی از اپ هایی هست که میتونه رنگ صورت رو بهتون نشون بده یا آرایشی روی صورتتون اجرا کنه ولی مجموعی از اینها با استفاده از تبلیغات مرتبط وجود نداره یا حداقل من ندیدم

امید وارم یه روزی بتونم اجرایش کنم ولی فعلا که وقتش رو ندارم

۱ نظر موافقین ۰ مخالفین ۰
مرتضی درزی

ایده هاتو بگو : کار دار

هر چند مطرح کردن ایده های کسب و کاری که در ذهنون داریم با دیگران برای ما ایرانی ها معمولا سخته و معمولا ترس از دزدیده شدن ایده هامون یه چیز واقعی ، ولی مثل متن " از دزدیده شدن ایده هایتان نترسید! " نباید از طرح ایده ها ترسید ، چون از ایده تا اجرا یه دنیا فاصله است . البته نمیگم ایده هایی که دارید خودتون اجرایی میکنید رو جار بزنید ولی ایده هایی که گذاشتید گوشه ذهنتون تا شاید یه روزی اجرایی بشه رو بهتره زودتر اشاعه بدید چون حتما بیشتر از 100 نفر دیگه همین الان به همون ایده دارن فکر میکنن و احتمالا چندتاشون دارن اجرایش میکنن .

منم چون ایرانیم برام سخت بود ایده هایی هرچند کوچیک که به ذهنم رو میرسه مطرح کنم ولی به این اصل که گفتنش چیزی ازمون کم نمیکنه اعتقاد دارم . برای همین میخوام در مورد چند از ایده هام بنویسم ، شاید بدرد کسی خورد یا شاید با کسی نشستیم شروعش کردیم .

بازم میگم مهم نیست ایده چقدر کوچیک و چقدر غیر منطقی باشه . وقتی به بحث گذاشته بشه مزایا و معایبش رو نشون میده و خیلی از وجه های ایده رو که نمی دیدی ممکنه دیگری ببینه یا به خطراتی که ممکنه بهش فکر نکرده باشی با عقل جمعی خواهی رسید و من به این جمله معتقدم که تا وقتی که نتونستی حتی ایده ات رو تو یه جمعی توضیح بدی بهتره بیخیالش بشی .

حالا بریم سراغ ایده " کاردار "

این فقط یه اسمه . " کار دار " . کسی که قراره یه سری کار ها رو برامون انجام بده

من یه کارمندم . در ساعت کاری روزانه ( 8 صبح تا 4 بعدازظهر ) باید در دفترم باشم و نمیتونم همزمان خیلی از کارهای اداری و غیر اداری خودم رو برسم . از طرفی زدن از ساعت کاری با توجه به مسیر رفت و برگشت توجیحی نداره ( شایدم داره ) . بعضی کارها هم واقعا وقت تلف کردنه و نیاز به حضور نداره . اینجاست که باید گفت چه خوب میشد یه کسب و کاری بود که کارش همین بود " من کارهای روزانه ام بهش میسپردم تا برام انجام بده "

نمی دونم چقدر این ایده میتونه به سمت اجرایی شدن بره ولی خودم بعضی از معایبش رو می دونم . مثلا فرض کاری که شما دارید نیاز به امضا داشته باشه یا نیازمند جابجایی پول باشه . اونوقته باید در مورد امنیت و اطمینان بحث کرد

خوشحال میشم دوستان هم نظر بدن .

۰ نظر موافقین ۰ مخالفین ۰
مرتضی درزی

تایم لاین تولد مشاهیر

13 شهریور ، روز بزرگداشت ابوریحال بیرونی بود . گشتی تو نت زدم ( تبدیل به یه عادت شده برام ) که ایشون کی بوده ، کی زندگی میکرده و چه کرده که براش روز بزرگداشت میگیرن . ویکی پدیا مبارک هم کلی به دانش ما افزود و اطلاعات خوبی از این همه چیز دان ( اصطلاح جدید ) بزرگ بدست اوردم .

این بین تاریخ تولد ایشون که زادهٔ 13 شهریور ۳۵۲ خورشیدی هستن ، یه سوال جدید تو ذهنم ایجاد کرد . اینکه مشاهیر دیگه سرزمینمون کی بدنیا اومدن و تقدم و تاخر زندگی کردنشون چجوریه . این بود که به فکر یه تایم لاین از سال تولد مشاهیر افتادم . اینم شد نتیجه :

تایم لاین تولد مشاهیر هزار سال اول هجری شمسی
تایم لاین تولد مشاهیر هزار سال اول هجری شمسی

برای خودم که نتیجه کار جالبه ، برای شما نمی دونم . البته میشه اطلاعات دیگه ای مثل محل سکونت و مدت عمر و چیزای دیگه رو هم اضافه کرد که شاید در اینده نزدیک اونا رو هم انجام بدم .

بماند برای آینده

۳ نظر موافقین ۰ مخالفین ۰
مرتضی درزی

خودخوان منتشر شد

خودخوان
خودخوان

نرم افزار خودخوان ، همراه شما در کتاب خوانی ، منتشر شد

اگر میخواهید شب امتحانی نباشید و در طول ترم مثل یک معلم بر روی درس خواندنتان کنترل داشته باشید ، خودخوان را به شما پیشنهاد می کنیم . 

عملکرد درس خوانی
عملکرد درس خوانی

کافی است در خودخوان ترم تحصیلی و کتاب های آن ترم را معرفی کرده و هر روز برنامه مطالعه خود را دریافت کنید . اگر نمی دانید چقدر از درس ها عقب هستید و میخواهید بدانید باید کدام کتاب را بخوانید خودخوان در اختیار شماست . 

کتاب های ترم
کتاب های ترم

خودخوان به نحوه درس خواندن شما توجه کرده و با هوشمندی مخصوص به خود ، طوری به شما پیشنهاد میدهد که بتونید تا پایان ترم تمام کتاب ها رو تمام کنید. 

تعریف ترم تحصیلی یا آزاد
تعریف ترم تحصیلی یا آزاد

 

نکته : 

حواستون باشه بازه ترم را طوری انتخاب کنید که فرصت دوره و تست زنی هم داشته باشید 

پی نوشت :

ورژن 1 این نرم افزار رایگان منتشر کردم با حدود 850 نصب فعال ، ولی بدلایلی بازار برای انتشارش اشکال گرفت و مجبور شدم حذفش کنم . در ورژن جدید امکانات بیشتری قرار دادم و پولی هم شده .

۰ نظر موافقین ۰ مخالفین ۰
مرتضی درزی

من و git و اندروید

حتما یه برنامه نویس خوب از git استفاده میکنه و " یه برنامه نویس بدون git یه برنامه نویس مرده است "

مطالب زیادی میشه در مورد git تو نت پیدا کرد ولی دونستن بعضی از نکات ساده خالی از لطف نیست . خصوصا که این یافته پس از کلنجار یکی دو ساعته بدست بیاد .

آقا ما اومدیم یه پروژه قدیمی رو ریفکتور کنیم و مثل همیشه از android studio مستقیم share کردیم روی github و همه چی عالی . بعد یه سری تغییرات اومدم commit کنم دیدم ، الا ماشالله فایل تغییر یافته چقدر زیاده . 

یه بررسی اولیه کردم دیدم به به git اومده همه پوشه های build و .gradle رو هم تحت کنترل خودش گرفته . یعنی هر فایلی اونجا هست رو هم خواست بریزه روی repo سرور !!

اون زمان فرصت نداشتم و مجبور شدم بزنم بره و کلی وقت ما رو گرفت تا 60 مگ فایل رو اپلود کنه . بعد از مدتی که فرصت کردم یه سرچی زدم ببینم اشکال کار کجاست و به تجربیات زیر رسیدم :

حذف کنترل git از پروژه :

باید اول از همه یه کاری میکردم که git بیخیال این پروژه بشه . راهش ساده است . برید تو پوشه پروژه و پوشه .git رو حذف کنید . 

اندروید استودیو خودش یه پیغام میده که git اشکال داره و باید config کنید 

 که میرید ( یا روی لینکش کلیک کنید خودش میره ) تو قسمت version control در تنظیمات و کافیه اونجا هم git رو حذف کنید و تمام ، git بیخیال پروژه میشه و میره خونه خودش !


اضافه کردن دوباره پروژه به git :

این که روش تو تصویر زیر مشخصه . فقط قبلش یادتون باشه repo تو github رو حذف کنید تا همه چی از اول ساخته بشه . 


انتقال فایل های اصلی پروژه :

یه فایل text ساده تو پروژه ها هست با نام  gitignore . 

این فایل به git میگه بیخیال چه فایل و پوشه هایی بشه . معمولا هم متن داخلش برای همه میتونه یکسان باشه ولی بسته به تشخیص شما میتونید چیزی روش اضافه کنید . دلیل اینکه پروژه من همه اون پوشه ها رو کنترل میکرد این بود که این فایل رو نداشتم . با اضافه کردنش همه چیز درست شد و فقط فایل اصلی پروژه تحت کنترل قرار گرفت .


*.iml
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
/build
/captures
.externalNativeBuild

سوالی هم که باقی میمونه اینه که چرا باید git بیخیال این پوشه ها بشه ؟ چون این پوشه ها در هر سیستمی که قرار بگیرن خودشون بصورت اتوماتیک ساخته یا دانلود میشن و نیاز نیست شما همراه پروژه تون انتقالش بدید 


۲ نظر موافقین ۰ مخالفین ۰
مرتضی درزی

تغییر فونت فارسی در پروژه های اندروید

برای ما فارسی زبان های تغییر فونت اصلی اپلیکیشن هایی که مینویسیم تقریبا یه اصله . چون با فونت های جدید رابط کاربری زیباتری می تونیم بگذاریم و از حالت زمخت در میاد . میخوام روش ساده و سر راست افزودن فونت جدید به پروژه برنامه رو بگم که احتمالا جسته و گریخته آموزش هاش رو میشه پیدا کرد ولی گاهی وقت ها یه راه حل امتحان شده سر راست بهتر از توصیه های آموزشیه . با من همراه باشید

انتخاب فونت 

از نظر ما برنامه نویس ها انتخاب یه فونت درست و حسابی که به کلیت رابط کاربریمون بخوره کار سختیه ! چون ما فقط بلدیم کد بزنیم ، طراحی با دوستان دیگه است . فونت ایران یکی از سایت های تخصصی در این کاره ولی من نتونستم فونت مجانی توش پیدا کنم . برای ما که پروژه های عام المنفعه ! انجام میدیم فونت رایگان دوای درده . اینجا میتونید یه چند تا فونت فارسی رایگان پیدا کنید که من خودم از فونت شبنم استفاده میکنم

افزودن فایل به پروژه 

روی پوشه res راست کلیک کرده و New و مثل شکل زیر یه پوشه با نام font ایجاد کنید . 

حالا فایل فونت مورد نظر رو در این پوشه قرار بدید . حواستون باشه اسم فایل فونت با حروف بزرگ شروع نشه که اندروید استودیو اشکال میگیره

فونت ها اصولا از اندروید 26 به بالا میتونن استفاده بشه و برای اینکه بشه تا اندروید 16 هم از فونت استفاده کرد باید این روش رو بکار بگیرید و گرنه فونت اعمال نمیشه 

یه فایل xml با نام مثلا shabnam_font ایجاد کنید و کد زیر رو توش بنویسید :

<?xml version="1.0" encoding="utf-8"?>

<font-family

    xmlns:app="http://schemas.android.com/apk/res-auto">

    <font

        app:fontStyle="normal"

        app:fontWeight="400"

        app:font="@font/shabnam" />

</font-family>

app:font="@font/shabnam" همون آدرس فایل فونت ( ttf ) هست که قبلا اضافه کردیم . حالا فایل style در پوشه Values رو باز کنید و کد زیر رو بهش اضافه کنید :

<style name="textViewFont">
    <item name="android:fontFamily">@font/shabnam_font</item>
</style>
دیگه کار تمومه و میتونید از فونت جدید در جایی که خواستید استفاده کنید :
<TextView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     style="@style/textViewFont" />
اگر هم بخواهید از این فونت مثلا در تمام TextView های برنامه استفاه کنید کافیه کد زیر رو به theme برنامتون اضافه کنید تا هر جا TextView داریم با این فونت تغییر کنه :
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <!-- Customize your theme here. -->
     <item name="colorPrimary">@color/colorPrimary</item>
     <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
     <item name="colorAccent">@color/colorAccent</item>
     <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
     <item name="android:textViewStyle">@style/creditCardText</item>
</style>
موفق باشید 
۰ نظر موافقین ۰ مخالفین ۰
مرتضی درزی

تغییر UI در زمان اجرا با استفاده از ViewStub

اصول برنامه نویسی و طراحی میگه تا حد امکان باید از کد های تکراری بپرهیزیم و اینکار برای طراحی رابط کاربری هم بسیار مورد نیازه . یه مثال ساده ای که در این مورد همیشه زده میشه جداسازی کد های یک قسمت طراحی بصورت یک فایل جدا layout و استفاده از اون در layout های دیگه است که میشه با تگ های include , merge اون قسمت رو اضافه کرد . البته اگر قسمت ضمیمه شونده منطق خودش رو داشته باشه باید بصورت fragment به اکتیویتی اضافه بشه تا بتونیم برای هر قسمت منطقش رو اجرا کنیم . اینکار هم با تگ fragment , framelayout قابل انجامه . در چنین مثالهایی ما یک بخش ثابت داریم که میتونه در فضاهای بزرگ دیگه مثل فرگمنت یا اکتیویتی تکرار بشه 


حالا بزارید یه فرض دیگه رو هم بررسی کنیم . اگر ساختار اصلی فرگمنت هامون یک شکل باشه ولی یه بخش خاص برای هر فرگمنت تغییر کنه چطور ؟ یعنی فرض کنید چند فرگمنت یا اکتیویتی داریم که شکل ساختاری یکسانی دارند ولی مثلا بخش بالای صفحه در هر فرگمنت متفاوته و شکلش تغییر میکنه . اینجاست که ViewStub به کار میاد . بزارید اول بدونیم ViewStub چیه ؟

ViewStub 


طبق تعریف خود گوگل :
ViewStub is a zero-sized invisible View which is used to load "layout resource" at runtime.

یعنی ViewStub ویویی بدون سایز و مخفی است که در زمان اجرا به عنوان layout نمایش داده خواهد شد . این یعنی اینکه با اضافه کردن این ویو به layout هیچ جایی رو نخواهد گرفت و زمانی که متد ()inflate یا visible آن اجرا شود ، یه ویو دیگر را در خود نمایش خواهد داد . 

<ViewStub
    android:id="@+id/view_stub"
    android:inflatedId="@+id/replace_view"
    android:layout="@layout/replace_layout"
    android:layout_width="match_parent"
android:layout_height="match_parent"
/>

همانطور که در کد بالا می بینید attribute های ViewStub شامل موارد زیر می باشد :


android:id="@+id/view_stub"

 id مختص خود ViewStub که بتوان بعدا در برنامه به آن دسترسی داشت 


android:inflatedId="@+id/replace_view"

id ویویی که بعد از اجرای متد ()inflate یا visible به ویو جایگزین شده داده خواهد شد 


android:layout="@layout/replace_layout"

layout ای که باید جایگزین شود . البته اینکار را بصورت کد نویسی انجام می دهیم تا بتوانیم همانند مثال گفته شده layout های اختصاصی را برای هر فرگمنت جایگزین کنیم

viewStub.setLayoutResource(R.layout.my_checkbox);
View inflatedView = viewStub.inflate();

میتونید نحوه استفاده از ViewStub رو در اینجا و اینجا و اینجا و اینجا ببینید . با استفاده از ViewStub عملا ما میتونیم یک جایی اختصاصی جدا در layout در نظر بگیریم که برای هر فرگمنت یا اکتیویتی بتونه ویو مختص به خود رو در آن جایگزین کند . اما یکی از کاربرد های مهم دیگه ViewStub نیز لود کردن قسمت های مختلف layout در زمان های مختلفه . فرض کنید layout شلوغی داریم که اگر بخواهیم بصورت یکجا لود بشه زمان زیادی رو میگیره ، در این حالت با استفاده از ViewStub میشه زمان نمایش ویو رو تا زمان اجرای متد ()inflate یا visible به تاخیر بندازیم 


پی نوشت : یکی از ویژگی های ViewStub اینه که زمان inflate شدن ، خود ViewStub حذف خواهد شد و جای آن را ویو تعریف شده خواهد گرفت در نتیجه زمان استفاده از ViewStub در ConstraintLayout بعد از inflate شدن دیگه هیچ قید و بندی به ConstraintLayout نخواهد داشت ، برای حل این مشکل کافیه همانند راه حل ارائه شده در اینجا ، inflatedId رو با id یک مقدار قرار بدیم .

۰ نظر موافقین ۰ مخالفین ۰
مرتضی درزی

تغییر نام package اپلیکیشن اندروید

شاید برای شما هم پیش اومده باشه که بخواهید نام package اپ اندروید رو تغییر بدید ولی نمی دونید از کجا باید شروع کنید و چی رو باید تغییر بدید که پروژه تون از دست نره . با هم روش درستش رو می بینیم :

فرض کنید میخواهیم com.example.app به com.my.application  تغییر بدیم :


  • در Project pane ایکون تنظیمات رو کلیک کرده و تیک کنار Compact Empty Middle Packages رو بردارید . با اینکار فایل پروژه بصورت درختی نمایش داده میشه و می تونید ببینید com , example , app بصورت پوشه در میان

  • حالا رو پوشه example راست کلیک کرده و Refactor - > Rename رو انتخاب کنید 
  • در پنجره باز شده Rename Package رو انتخاب کنید و نام my رو وارد کرده و Refactor رو بزنید 
  • در پنل باز شده که لیست تغییرات مورد نیاز را نمایش میدهد نیز Do Refactor رو بزنید . اندروید استدیو باقی کار ها رو انجام میدهد 
  • همین کار رو برای پوشه app و تغییر نام به application  انجام بدید 
  • فایل manifest رو بازکنید و   "package="com.example.app رو به  "package="com.my.application تغییر بدید
  • فایل (build:gradle (app رو باز کنید و "applicationId "com.example.app را نیز مثل بالا تغییر دهید 
  • حالا پروژه را sync کنید و لذت ببرید

پی نوشت : احتمالا پوشه اصلی پروژه به نام قبلی app باقی مانده که فقط کافیه اون رو تغییر نام بدید هر چند در پروژه تاثیری نداره



۱ نظر موافقین ۱ مخالفین ۰
مرتضی درزی

دیباگ مستقیم اپ روی گوشی

حتما برای دولاپر های عزیز اندروید پیش اومده که بعد از آماده سازی اولیه اپ و نصب روی گوشی ، در حالی که به نظر میاد همه چیز داره خوب کار میکنه اپ کرش می کنه و یه سوال بسیار بزرگ عین شاخ از سرشون بیرون میزنه  ! اگر مثل من دسترسی به محیط دیباگ android studio به سرعت در اختیارتون نیست و یا نمیدونید کجا خطا اتفاق افتاده تا سریع برید همون خط رو دیباگ دوباره کنید و میخواید که خطا روی خود گوشی بهتون نمایش داده بشه ، این روش کارایی خوبی خواهد داشت .

Android Global Exception Handler

اینکار به سادگی با java.lang.Thread.UncaughtExceptionHandler قابل انجامه ولی باید یکی از دو روش زیر رو انتخاب کنید :

1.خطایابی در سطح Application که در این صورت نمی توانید dialog باز کنید و یا اکتیویتی جدیدی اجرا کنید با این حال هر نوع خطایابی قابل اجرا خواهد شد 

2.خطایابی در سطح Activity که به راحتی میتوان dialog یا اکتیویتی دیگری باز کرد ولی باید در یک کلاس ارث بری شده توسط اکتیویتی ها نوشته شود ( مثلا BaseActivity )

خطایابی در سطح Application

در این روش log ایرور بصورت فایل روی دستگاه ذخیره خواهد شد تا در اجرای دوباره اپ بتوان از آن استفاده کرده و متن خطا را نمایش داد 


public class LoggingExceptionHandler implements Thread.UncaughtExceptionHandler {
    private final static String TAG = LoggingExceptionHandler.class.getSimpleName();
    private final static String ERROR_FILE = MyAuthException.class.getSimpleName() + ".error";
    private final Context context;
    private final Thread.UncaughtExceptionHandler rootHandler;
    public LoggingExceptionHandler(Context context) {
        this.context = context;
        // we should store the current exception handler -- to invoke it for all not handled exceptions ...
        rootHandler = Thread.getDefaultUncaughtExceptionHandler();
        // we replace the exception handler now with us -- we will properly dispatch the exceptions ...
        Thread.setDefaultUncaughtExceptionHandler(this);
    }
    @Override
    public void uncaughtException(final Thread thread, final Throwable ex) {
        try {
            Log.d(TAG, "called for " + ex.getClass());
            // assume we would write each error in one file ...
            File f = new File(context.getFilesDir(), ERROR_FILE);
            // log this exception ...
            FileUtils.writeStringToFile(f, ex.getClass().getSimpleName() + " " + System.currentTimeMillis() + "\n", true);
        } catch (Exception e) {
            Log.e(TAG, "Exception Logger failed!", e);
        }
    public static final List<String> readExceptions(Context context) {
        List<String> exceptions = new ArrayList<>();
        File f = new File(context.getFilesDir(), ERROR_FILE);
        if (f.exists()) {
            try {
                exceptions = FileUtils.readLines(f);
            } catch (IOException e) {
                Log.e(TAG, "readExceptions failed!", e);
            }
        }
        return exceptions;
    }
}

حالا باید ان را به سطح Application ضمیمه کنیم


public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        new LoggingExceptionHandler(this);
    }
}

یادتان نرود که در فایل AndroidManifest  نیز تغییرات زیر را انجام دهید 

<application
    android:name=".MyApp"

خطایابی در سطح Activity

در این روش با استفاده از ApplicationContext می توان log ایرور را بصورت مستقیم نشان داد و یا حتی اکتویتی جدیدی را اجرا کرد 

public class MyExceptionHandler implements Thread.UncaughtExceptionHandler {

    public static final String EXTRA_MY_EXCEPTION_HANDLER = "EXTRA_MY_EXCEPTION_HANDLER";
    private final Activity context;
    private final Thread.UncaughtExceptionHandler rootHandler;

    public MyExceptionHandler(Activity context) {
        this.context = context;
        // we should store the current exception handler -- to invoke it for all not handled exceptions ...
        rootHandler = Thread.getDefaultUncaughtExceptionHandler();
        // we replace the exception handler now with us -- we will properly dispatch the exceptions ...
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    @Override
    public void uncaughtException(final Thread thread, final Throwable ex) {
        if (ex instanceof MyAuthException) {
            // note we can't just open in Android an dialog etc. we have to use Intents here
            // http://stackoverflow.com/questions/13416879/show-a-dialog-in-thread-setdefaultuncaughtexceptionhandler

            Intent registerActivity = new Intent(context, AuthActivity.class);
            registerActivity.putExtra(EXTRA_MY_EXCEPTION_HANDLER, MyExceptionHandler.class.getName());
            registerActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            registerActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);

            context.startActivity(registerActivity);
            // make sure we die, otherwise the app will hang ...
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(0);
        } else {
            rootHandler.uncaughtException(thread, ex);
        }
    }
}

برای ضمیمه کردن این Handler باید یک کلاس ایجاد کرد تا اکتیویتی های دیگر از آن ارث بری کنند 


public abstract class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        new MyExceptionHandler(BaseActivity.this);
    }
}
خودم از این روش در پروژه هام استفاده میکنم و معمولا وقتی ایرور جدید غیر قابل پیش بینی اتفاق می افته خیلی بدردم خورده ... البته چون از روش دوم استفاده میکنم بعضی از ایرور های که قبل از activity اتفاق می افتن رو نمیشه catch کرد که زیاد چنین اتفاقی نمی افته . من برای نمایش متن ایرور از اکتویتی جدید و یک TextView استفاده میکنم . البته نمی دونم بدلیل محدودیت String و یا TextView کل متن ایرور نمایش داده نمیشه که زیاد فرقی نمیکنه و معمولا از همون خطوط اول مشخص میشه خطا برای چیه 
۰ نظر موافقین ۰ مخالفین ۰
مرتضی درزی

Learnable Programming - برنامه نویسی قابل یادگیری - قسمت اول

با ترجمه و اقتباس از مقاله آقای برت ویکتور - Learnable Programming

موضوع اصلی این سری از مطالب در خصوص نحوه یادگیری یک زبان برنامه نویسی و درک کد های برنامه است . اینکه با چه روشی میتوان برنامه نویسی را به دیگران آموزش داد و محیط و زبان برنامه نویسی باید دارای چه خصوصیاتی باشد . ایده اصلی  Learnable programmingاز آقای برت ویکتور می باشد که این مطلب سعی میکند همراه با ترجمه ، تفکرات ذهنی نویسنده را نیز بیان کند .

موضوعات مطرح شده در این سری از مطالب ، در محیط آنلاین آموزشی آکادمی خان و براساس زبان برنامه نویسی جاوا اسکریپت ( js ) و Processing نوشته شده که دارای ویژگی مثل live coding می باشد که به محض نوشته شدن کد ، خروجی آن قابل مشاهده میباشد .

برنامه نویسی

برنامه نویسی یعنی فکر کردن ، نه فقط مهارت نوشتن کد . ما در برنامه نویسی یه پروسه فکری را ایجاد کرده و به آن می پردازیم و سعی میکنیم مشکلات را در این پروسه حل کنیم . به عنوان مثال ، صرف یادگیری حلقه for یادگیری برنامه نویسی نیست و مثل این می ماند که بخواهیم با یادگیری نحوه استفاده از مداد ، طراحی را یاد بگیریم. در برنامه نویسی سعی می کنیم با بررسی مساله یک حالت مفهومی را ایجاد کنیم تا پاسخگویی تمام ورودی ها و خروجی های کاربر قرار بگیرد . 

دیدن نتایج

همه ما آنچه را بتوانیم ببینیم بهتر درک میکنیم . در برنامه نویسی نیز یادگیرنده باید بتواند نتایج برنامه ای را که مینویسد ببیند . اینجا مقصود از نتایج خروجی برنامه نیست ، بلکه امکانی است برای یادگیرنده تا بتواند یک خروجی از هر خط کدی که مینویسد ببیند و درک کند این قطعه از کد چه کاری انجام خواهد داد و الزاما نیاز نیست منتظر خروجی کل برنامه در پایان کار باشد. هدف کلی یک سیستم برنامه نویسی :

تشویق و ترغیب یادگیرنده در استفاده از روش های قدرتمند فکر کردن

ایجاد امکان دیدن و فهمیدن جزئیات برنامه به یک یادگیرنده

آلن پرلیز ( Alan Perlis ) میگوید : " برای اینکه یک برنامه را بفهمید باید خود را جای انسان و ماشین قرار دهید و مثل انها فکر کنید "

این یک اشتباه بزرگ است . دقیقا چیزی که برنامه نویسی را سخت و غیر قابل اطمینان میکند . یک انسان هرگز نمیتواند مثل یک ماشین فکر کنید ، نحوه فکر کردن یک انسان بسیار با ماشین متفاوت است و ما برای فکر کردن نیاز به تجسم داریم در حالی که ماشین از روش های موجود استفاده میکند . حال سوال این است که پس چطور باید برنامه نویسی را به دیگران آموزش دهیم . ما سیستم برنامه نویسی را طوری تغییر میدهیم تا قابل فهمیدن توسط انسان باشد .


سیستم برنامه نویسی 

هر سیستم برنامه نویسی دو بخش دارد . یک بخش آن محیط برنامه نویسی است که روی کامپیوتر نصب میشود و محیطی را برای کار کردن برنامه نویس ایجاد میکند و یک بخش نیز زبان برنامه نویسی است که روی مغز برنامه نویس نصب میشود . و با استفاده از ان با کامپیوتر ارتباط برقرار می کند . باید هر دو بخش سیستم برنامه نویسی براساس اصولی طراحی شود که قابلیت یادگیری داشته باشد . یعنی همان شعار Learnable-Programming که سیستمی را برای برنامه نویسی ترسیم خواهد کرد که ، یادگیرنده در جایگاه خود به عنوان یک انسان و از دیدگاه خود برنامه را تحلیل کرده و بسازد .
یک محیط برنامه نویسی قابل یادگیری باید به یادگیرنده اجاز دهد :
  1. کلمات را بخواند ( read the vocabulary ) - کلمات چه معنایی میدهند ؟
  2. جریان داده را دنبال کند ( follow the flow ) - چه اتفاقی چه موقع می افتد ؟
  3. وضعیت ها را مشاهده کند ( see the state ) - کامپیوتر چطور فکر میکند ؟
  4. با واکنش نشان داد بسازد ( create by reacting ) - از نقطه ای شروع کرده و بسازد 
  5. بصورت مفهومی بسازد ( create by abstracting ) - ابتدا پیاده سازی کرده و سپس تعمیم دهد
یک زبان برنامه نویسی نیز باید شامل موارد زیر باشد :
  1. هویت و استعاره ( identity and metaphor ) - چطور باید جهان کامپیوتر را با جهان خودمان ارتباط دهیم ؟
  2. تجزیه ( decomposition ) - چطور باید ایده های خود را به تکه های قابل فهم تجزیه کنم ؟
  3. ترکیب دوباره ( recomposition  ) - چطور باید تکه های ذهنی را بهم بچسبانم ؟
  4. قابلیت خوانایی ( readability ) - این کلمات چه معنایی میدهند ؟
سعی خواهم کرد در سری های بعدی مطالب هر بخش از ویژگی های محیط و زبان برنامه نویسی را که در بالا لیست شده بصورت مجزا توضیح دهم 

 

۱ نظر موافقین ۰ مخالفین ۰
مرتضی درزی