یوشا

دست نوشته ها و تجربیات شخصی

یوشا

دست نوشته ها و تجربیات شخصی

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

طبقه بندی موضوعی
تبلیغات
Blog.ir بلاگ، رسانه متخصصین و اهل قلم، استفاده آسان از امکانات وبلاگ نویسی حرفه‌ای، در محیطی نوین، امن و پایدار bayanbox.ir صندوق بیان - تجربه‌ای متفاوت در نشر و نگهداری فایل‌ها، ۳ گیگا بایت فضای پیشرفته رایگان Bayan.ir - بیان، پیشرو در فناوری‌های فضای مجازی ایران

۴۸ مطلب با موضوع «نرم افزار :: سیستم عامل» ثبت شده است

 نکته اینکه دستور compile در نرم افزار Android Studio 3 و جدیدتر منسوخ شده و بجاش باید از دستور api استفاده بشه. (میتونید براحتی و بدون مشکل جایگزینشون کنید)

پس باید بپرسیم فرق دستور api با دستور implemention چیه:

- دستور api به اصطلاح حکم public کردن یک کتابخانه رو داره

- اما دستور implemention به اصطلاح حکم private کردن یک کتابخانه رو داره

- همونطور که با public کردن یک متد میتونید اون متد رو برای همه کلاس ها و پکیج ها share و قابل استفاده کنید، توسط دستور api هم میتونید محتویات یک کتابخانه رو برای کل پروژه  share و قابل استفاده کنید. (درواقع توسط دستور api، کتابخانه مورد نظر در همه جای پروژه "رخنه" میکنه)

- همونطور که با private کردن یک متد میتونید اون متد رو از همه کلاس ها و پکیج ها "مخفی و غیر قابل استفاده" کنید که " فقط در محل خودش قابل استفاده باشه"، توسط دستور implemention هم میتونید محتویات یک کتابخانه رو فقط برای برنامه یا کتابخانه ای که ازش استفاده کرده "نمایان و قابل استفاده" کنید.

MyApp -> Lib -> Lib2
👆 در اینجا برنامه MyApp به کتابخانه Lib وابستست، و کتابخانه Lib به کتابخانه Lib2 وابستست...
با api کردن Lib2 باعث میشید تا محتویات این کتابخانه در کل پروژه قابل دسترس باشه. اما آیا واقاً لازم دارید؟

dependencies
{
   api project(':Lib2')
}

مثلا اگر متد sendRequest() در کتابخانه Lib2 قرار گرفته باشه و فقط کتابخانه Lib از این متد استفاده کرده باشه، با api کردن Lib2 اون متد هم در اختیار شما و کل پروژه خواهد بود. چیزی که واقاً لازم نیست...


زمانی باید از دستور api استفاده کنید که میخوایید از محتویات یک کتابخانه که برای یک کتابخانه دیگر هست استفاده کنید. 👆 مثل  Lib2
یا  پروژه تون کلاً یک کتابخانست. مثل SugarORM یا Log4J یا Volley یا ApacheHTTP...


✅ همیشه باید از دستور implemention استفاده کنید. اینطوری خود Gradle plugin هوشمندانه تشخص میده که آیا لازمه به api تغییر کنه یا نه.
درصورت بروز خطا، بدونید که به اشتباه از متدهای کتابخانه های  تودرتو و زیرین استفاده کردید پس باید رفعش کنید.


Android Gradle plugin engineer Jerome Dochez: When you switch to the new Android Gradle plugin 3, you should replace all your compile (and api) with the implementation keyword.

implementation  / testImplementation  / androidTestImplementation

۰ نظر ۹۷/۰۶/۱۳
یوشا آل ایوب

 

کتابخانه OkHTTP

توسط Square تولید شده. مناسب برای Streaming و استفاده General مبتنی بر HTTP. پشتیبانی از POST, GET, UPLOAD. دارای مستندات آموزشی. زیربنای پیشفرض Retrofit و Picasso. یکی از زیربناهای Volley هستش. دارای disk cache. پشتیبانی از conn pooling. از پروتکل SPDY پشتیبانی می کنه. از اندروید 4.4 به بعد بصورت builtin در زیربنای اندروید استفاده شده. پشتیبانی از NewIO و...

 

کتابخانه Retrofit

توسط Square تولید شده. مناسب برای RESTful API / Web Service. پشتیبانی از POST, GET, PUT, DELETE, Multipart. دارای مستندات آموزشی. مبتنی بر کلاینت OkHTTP. دارای disk cache. پشتیبانی از async با کمترین کد. دارای cancellation و retryy برای درخواست ها. پشتیبانی از Dynamic URL. کمی کندتر از Volley اما سریعتر از AsyncTask هستش. دارای مفسر پیشفرض JSON و تبدیلش به POJO بکمک GSON.  پشتیبانی از NewIO. پشتیبانی از فعالیت های background.

 

کتابخانه Volley

توسط Google پشتیبانی شده. مناسب برای استفاده General و کار با تصاویر. پشتیبانی از POST, GET, PUT, DELETE. دارای مستندات آموزشی. دارای کلاینت های OkHTTP, Apache, HttpUrlConnection. دارای memory cache.  پشتیبانی از conn pooling. پشتیبانی از async با کمترین کد. دارای prioritization, cancellation, retrying برای درخواست ها. پشتیبانی از Dynamic URL. کمی سریعتر از Retrofit هستش. پشتیبانی از Image loading. دارای bitmap caching. سازگاری مناسب با activity lifecycle. دارای memory error handing مناسب. هندل کننده duplicate calls. استفاده نسبتاً آسان.

 

البته اگر بدنبال کتابخانه های سبکتر و کوچیکتر HTTP می گردید این گزینه ها هم میتونن انتخاب خوبی باشن:

LoopJ's android-async-http (HttpClient)
http://loopj.com/android-async-http/

Fast-Android-Networking
https://github.com/amitshekhariitbhu/Fast-Android-Networking

jus
https://github.com/apptik/jus

RoboSpice
https://github.com/stephanenicolas/robospice

 

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

۱ نظر ۹۷/۰۱/۰۳
یوشا آل ایوب

(برای بزرگنمایی کلیک کنید)

ُSlackware Linux wallpaper تصویر اصلی این wallpaper مطعلق به من نیست

            Slackware Linux wallpaper                                                                 

 
۰ نظر موافقین ۱ مخالفین ۰ ۹۶/۰۸/۰۵
یوشا آل ایوب

 

این دیاگرام رو درست کردم تا روند(internals) کامپایل، تولید و اجرای برنامه های جاوا رو نشون بده:
 

برای بزرگنمایی کلیک کنید

JNI, JVM internal, Class Loader, Execution Engine

Java internals, Java structure, JVM internals, ساختار جاوا، ساختمان جاوا
یکی از کاملترین و دقیق ترین دیاگرامهای Java/JVM internals  موجود در اینترنت هستش

اطلاعات بیشتر:

http://blog.jamesdbloom.com/JVMInternals.html

https://dzone.com/articles/understanding-jvm-internals

https://www.cubrid.org/blog/understanding-jvm-internals/

۲ نظر ۹۶/۰۵/۱۰
یوشا آل ایوب

1- فراموش نکنید که مقدار صفت android:updatePeriodMillis در تگ <appwidget-provider فایل xml/widget_info.xml بیانگر تایمری هست که کالبک onUpdate کلاس ویدجت صدا زده میشه.

 

2- در metadata ویدجت، مقدار صفت android:minHeight و android:minWidth تعیین کننده حداقل اندازه ویدجت هستش که باید 72dp (یعنی 1x1) باشه. ولی صفت android:layout_width و android:layout_height در layout ویدجت، تعیین کننده اندازه کنونی ویدجت هستش.

 

3- از انجایی که List متدی برای اضافه کردن عنصر نداره و سایزش هم ثابت هست، برای تبدیل Array به ArrayList باید به این روش عمل کنید:

ArrayList<String> _arrayList = new ArrayList<String>(Arrays.asList(myArray));

 

4- برای چک کردن وجود یک مقدار در آرایه کافیست به این صورت عمل کنید:

Arrays.asList(myArray).contains(targetValue);

 

5- نکته جزیی: فراموش نکنید که HashMap در جاوا در واقع همون data structure هستش و نه آرایه!

۷ نظر ۹۶/۰۱/۱۲
یوشا آل ایوب

1- برای رفع خطای OutOfMemory هنگام کار با تصاویر راه های زیر رو دنبال کنید:

- مقدار خاصیت largeHeap در فایل مانیفست رو true قرار بدید.

- سعی کنید از LRU cache manager استفاده کنید.
- تصاویر رو compress کنید.
- کدهارو بررسی کنید که memory leak رخ نداده باشه. (که 90% بخاطر بی توجهی به  activity life cycle رخ میده)
- برای سرویس ها و Toast ها از ApplicationContext استفاده کنید.
- دقت کنید که broadcast receiver ها رو Unreg کنید.
- همه Observer ها رو بعد از استفاده delete کنید.
- همه resource ها رو(مثل XML) بعد از استفاده destroy کنید.

مقاله کامل و قابل فهم از حافظه Stack و حافظه Heap.

 

2- مقدار صفت android:targetSdkVersion در تگ uses-sdk فایل AndroidManifest.xml، به دستگاه با نسخه مشابه SDK فرمان میده که سیستم compability رو غیرفعال کنه. بنابراین سرعت پردازش برنامه افزایش و کارایی برنامه بهبود پیدا می کنه.

 

3- یادتون باشه که synchronized و Thread-Safe در جاوا یک مفهوم دارن: دسترسی همزمان به کد توسط چند Thread بدون بروز مشکلات. یعنی کد/متد synchronized اجازه دسترسی همزمان چند Thread به کد/متد رو نمیده، پس Thread ها باید نوبتی به کد/متد دسترسی پیدا کنن بنابراین آخرین وضعیت کد/متد در همه Thread ها مشترک هستش.

نکته: این مسئله فقط در مورد برنامه های Multi-Thread صدق میکنه و نه Single-Thread.

 

4- برای حل مشکل minSdk(API x) != deviceSdk(API y) در Android Studio یکی از راه های زیر رو دنبال کنید:

راه اول: داخل گوشی/emulator به مسیر Settings -> منوی Developer options برید و گزینه USB debugging رو فعال کنید.
راه دوم: زمانی که گوشی/emulator رو وصل می کنید، داخل گوشی پنجره Allow USB Debugging باز میشه که حاوی fingerprint هم هست... اون رو ALLOW کنید.
راه سوم: مطمعن شید که حافظه گوشی/emulator پر نشده باشه... اگر شده خالیش کنید.
راه چهارم: داخل گوشی/emulator به مسیر Settings -> منوی Storage برید و از بالا options رو باز کنید، سپس گزینه USB computer connection رو بزنید و نهایتا Media device MTP رو فعال کنید. (اگر درست نشد، Camera device رو فعال کنید)
راه پنجم: نسخه targetSdkVersion و compileSdkVersion رو یکی کنید.
راه ششم: فایل build.gradle رو باز کنید و مقدار عددی minSdkVersion رو به مقدار عددی deviceSdk تغییر بدید.
راه هفتم: داخل Android Studio به منوی Tools -> گزینه Android برید و ADB Integration رو فعال کنید.
راه هشتم: داخل Android Studio به قسمت Build Tools Version برید و نسخه رو به مقدار عددی minSdk یا deviceSdk تغییر بدید.
راه نهم: کلاً از device های سری Preview, N, L استفاده نکنید.

۳ نظر ۹۵/۱۰/۲۳
یوشا آل ایوب

1- با اضافه کردن خاصیت android:supportsRtl="true" در تگ application فایل AndroidManifiest.xml، مشکل راست به چپ صفحات preferences تون حل خواهد شد. (برای اندروید 4.2 به بعد)

 

2- آیا میدونید هیچ تفاوتی بین fill_parent و match_parent در خاصیت عناصر گرافیکی وجود نداره و هر دو دارای مقدار 1- هستند؟

این مسئله فقط یک تغییر نام جزیی بوده که از API 8 به بعد صورت گرفته و پیشنهاد شده که از match_parent استفاده بشه.

 

3- از انجایی که SharedPreference ها عملیات read/write برروی دیسک انجام میدن و معمولاً هم در متد OnCreate() یا OnResume() فراخوانی و load می شن، پس بهتره در thread غیر از UI اعمال بشن، تا برنامه رو دچار وقفه نکنن.

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

 

4- در بیشتر مواقع با استفاده از عبارات زیر در تعاریف HttpURLConnection کدتون، خطای recvfrom failed: ECONNRESET (Connection reset by peer) برطرف خواهد شد:

System.setProperty("http.keepAlive", "false");
myHttpUrlConnection.setRequestProperty("connection", "close");

 

5- برای حل مشکل GC overhead limit exceeded در برنامه Eclipse کافیه ظرفیت حافظه Heap این برنامه رو در فایل eclipse.ini تغییر بدید:

-XX:MaxPermSize=1024m
-Xms512m
-Xmx1024m

۱ نظر ۹۵/۰۸/۰۶
یوشا آل ایوب

Virtual File System یا سیستم فایل مجازی

 

Virtual File System(مخفف VFS) یک ساب سیستم مهم در Kernel لینوکس هست که لایه بین filesystem و برنامه های user-space رو تشکیل میده. درواقع همه filesystem ها، با تکیه بر VFS می تونن شناسایی بشن و تبادل اطلاعات کنن. همین مسئله، برنامه های user-space رو قادر کرده که توسط دستورات موجود در VFS برای خواندن و نوشتن در filesystem های گوناگون اقدام کنن:

 

نکته: در اینجا منظور از لایه، همون Abstraction layer و منظور از دستورات، همون System call/SysCall هستش.

نکته 2: البته به برکت wrap های GNU C Library، کمتر پیش میاد که برنامه user-space نیاز به استفاده از System call داشته باشه.

۳ نظر ۹۵/۰۷/۲۱
یوشا آل ایوب

تغییر رفتار و امکانات keyboard اندروید در مقابل مقدار صفت inputype عنصر EditText: (تست شده روی اندروید 4.4.3 و 2.3.3)

<EditText android:id="@+id/et_test" android:inputType="?????"/>

 

نوع inputtype نوع Keyboard رفتار دکمه Enter شکلک Case حروف Suggestion کاراکترهای اضافی
textLongMessage الفبا / پیشفرض ارسال / بعدی دارد lowercase دارد , و . و همه چیز
textFilter الفبا / پیشفرض ارسال / بعدی دارد lowercase ندارد , و . و همه چیز
textCapWords الفبا / پیشفرض ارسال / بعدی دارد Camel Case دارد , و . و همه چیز
textCapSentences الفبا / پیشفرض ارسال / بعدی دارد Sentence case دارد , و . و همه چیز
time اعداد ارسال / بعدی ندارد - ندارد فقط :
textMultiLine الفبا / پیشفرض خط بعدی دارد lowercase دارد , و . و همه چیز
number اعداد ارسال / بعدی ندارد - ندارد ندارد
textEmailAddress الفبا / پیشفرض ارسال / بعدی ندارد lowercase ندارد @ و . و همه چیز
بدون نوع الفبا / پیشفرض خط بعدی دارد lowercase دارد , و . و همه چیز
textPassword الفبا / پیشفرض ارسال / بعدی ندارد lowercase ندارد , و . و همه چیز
text الفبا / پیشفرض ارسال / بعدی دارد lowercase دارد , و . و همه چیز
textShortMessage الفبا / پیشفرض شکلک دارد lowercase دارد , و . و همه چیز
textUri الفبا / پیشفرض ارسال / بعدی ندارد lowercase ندارد / و . و همه چیز
textCapCharacters الفبا / پیشفرض ارسال / بعدی دارد UPPERCASE دارد , و . و همه چیز
phone اعداد ارسال / بعدی ندارد - ندارد * # . -  / () W P N , +
textPersonName الفبا / پیشفرض ارسال / بعدی دارد lowercase دارد , و . و همه چیز

 

نکته: در صورتی که تنظیم Auto-capitalization در تنظیمات Keyboard فعال باشه، Case حروف رفتار پیشفرض خواهد داشت، در غیر اینصورت همه حروف کوچیک خواهند شد.

نکته 2: زبان نوع Keyboard اعداد، همگی اعداد انگلیسی 1234567890 می باشد.

نکته 3: در صورتی که تنظیم Correction/Suggestion در تنظیمات Keyboard فعال باشه، Suggestion بدرستی رفتار خواهد کرد، درغیر اینصورت در همه موارد خاموش خواهد ماند.

 

۴ نظر ۹۵/۰۶/۲۳
یوشا آل ایوب
۰ نظر ۹۵/۰۴/۱۳
یوشا آل ایوب