ظاهراً در PHP هرچیزی بعد از دستور exit
بصورت ناقص(؟) پردازش میشه ولی بصورت کامل حافظه مورد نیازش رو allocate میکنه...
خروجی یک صفحه ساده:
<?php echo memory_get_usage(); // 217992
خروجی یک صفحه متغیر دار ولی exit
شده:
<?php echo memory_get_usage(); // 220552 exit; // <---------- !! $simpleVar = 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabcdabcdabcdabcdabcdabcd'; $simpleVar .= 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabcdabcdabcdabcdabcdabcd'; $simpleVar .= 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabcdabcdabcdabcdabcdabcd'; $simpleVar .= 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabcdabcdabcdabcdabcdabcd'; $simpleVar .= 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabcdabcdabcdabcdabcdabcd'; echo $simpleVar;
مسله indentation در کدنویسی جزییه و بیشتر شخصیه... ولی گفتن نکاتی درموردش خالی از لطف نیست
اول اینکه بیشتر Coding-style های موجود در اینترنت بروزرسانی نمیشن یا برای ویرایشگرها و مانیتورهای قدیمی طراحی شدن... یا حتی ناقص هستن! دوم اینکه چقدر خوب بود اگر مرجع رسمی براشون وجود داشت تا یک الگو، الگوی همگان میشد. نه اینکه هر شرکت و تیمی سبک انحصاریش رو طراحی و تعیین کنه و اسمشو بذاره قرارداد/convention رسمی
فکر کنید برنامه نویسایی که با دو یا چند زبان مختلف برنامه نویسی میکنن، برحسب عادت چقدر براشون سخته که از قوائد مختلف پیروی کنن...
Tab:
Space:
پیشنهاد من: SPACE با سایز 3 کاراکتر
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 هستش و نه آرایه!
به نقل از روحانی "سید مهدی صدر ساداتی":
دوستی گفت: من از تازی(عرب) بدم میاد!! ما از نسل کوروشیم، منشور کوروش را خوانده ای؟
گفتم: کوروش آدم خوبی بوده؟
گفت: بله
گفتم: کوروش بین افراد جامعه تبعیض نژادی قائل میشد؟
کمی مکث کرد و چاره ای نداشت که بگوید: نه
گفتم: پس تو چرا اینطور شدی؟
چند وقت پیش یکی از اعضای انجمن IranPHP سوالی درباره "سنجش دانش و سطوح برنامه نویسی" کرد که منم اینطور پاسخ دادم:
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 استفاده نکنید.
Version یا همون نسخه، مشخصه ای برای دسته بندی وضعیت محصول منتشر شده و [مختصر] شرحی از تغییرات انجام گرفته هستش.
به این معنی که Version یک محصول، بیانگر حال و روز کنونی و مقدار بهبود یافتگی اون محصول هستش... یا حتی آینده ای که در انتظارشه
مشخصه Version می تونه بصورت عدد، کلمه و تاریخ باشه; یا حتی هر سه:
Major.Minor.Micro/Patch[.Build] [ReleaseState] [Architecture] [Date] [Time]
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