یوشا

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

یوشا

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

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

طبقه بندی موضوعی

۴۷ مطلب با کلمه‌ی کلیدی «tips & tricks» ثبت شده است

۰۸
۱۳۹۵/۰۱

1- طبق گفته Sun، از دستورات System.runFinalizersOnExit() و Runtime.runFinalizersOnExit() استفاده نکنید، اینها منسوخ و Unsafe اعلام شدن:

JAVA-DOC: Because it is inherently unsafe. It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock. While this problem could be prevented if the class whose objects are being finalized were coded to "defend against" this call, most programmers do not defend against it. They assume that an object is dead at the time that its finalizer is called. Further, the call is not "thread-safe" in the sense that it sets a VM-global flag. This forces every class with a finalizer to defend against the finalization of live objects!

Joshua Bloch: Never call System.runFinalizersOnExit or Runtime.runFinalizersOnExit for any reason: they are among the most dangerous methods in the Java libraries.

 

 

2- Handler یا Timer؟ (در شرایط کاربری یکسان)

Handler: براحتی reschedule میشه، هر اینترفیس Runnable ای رو میشه داخلش attach کرد، حافظه کمتری رو مصرف می کنه، بهترین گزینه برای update های UI هستش، از Multi-threading پشتیبانی می کنه، استثناهای پرتاب شده از task ها و thread هارو هندل میکنه، در ساخت Thread میشه Handler اون thread رو هم باهاش طراحی کرد، زمانی که دستگاه به حالت sleep بره کماکان به کارش ادامه میده!

Timer: قابلیت reschedule شدن نداره، فقط یک TimerTask رو میشه داخلش attach کرد، حافظه بیشتری رو اشغال میکنه، بهترین گزینه برای background-task ها هستش، نمی تونه UI رو update کنه، فقط با یک Thread کار میکنه(بقیه task ها باید queue بمونن تا کار اولی تموم بشه)، استثناهای task و thread رو هندل نمی کنه و فقط نابودشون میکنه(دیگر task ها رو هم اجرا نخواهد کرد)، زمانی که دستگاه به حالت sleep بره متوقف میشه.

 

3- آیا میدونید با فعال کردن خاصیت android:debuggable="true" در فایل AndroidManifest.xml پروسه Proguard غیرفعال میشه؟

ProGuard runs only when you build your application in release mode, so you do not have to deal with obfuscated code when you build your application in debug mode.

 

4- اگر به استثنا نوع UnknownHostException برخورد کردید و نتونستید این نوع استثنا رو catch کنید، تعجب نکنید. چراکه استثنای UnknownHostException از دسته java.net هستش درحالی که Exception از دسته java.lang!

راه ساده:

try
{
    // Codes.
}
catch (final java.net.UnknownHostException exception) // java.net
{
    // Handling codes.
}
catch (final java.lang.Exception exception) // java.lang
{
    // Handling codes.
}

 

5- با تغییر color scheme تصاویر به RGB_565 می تونید میزان حافظه اشغالی توسط تصویر رو کاهش بدید:

البته فقط کمی کیفیت تصویر پایین میاد...

BitmapFactory.Options _options = new BitmapFactory.Options();
_options.inPreferredConfig = Config.RGB_565;

  • یوشا آل ایوب
۱۸
۱۳۹۴/۱۲

 

<?php

switch (1)
{
    case 1:
        $var = 'Test';
        echo ' in case 1 ';
    break;

    case 2:
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    break;

    case 3:
        echo ' in case 3 ';
    break;
}
// Result: in case 1

switch (1)
{
    case 1:
    {
        $var = 'Test';
        echo ' in case 1 ';
    }

    case 2:
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    break;

    case 3:
        if (isset($var)) echo '($var is set)';
        echo ' in case 3 ';
    break;
}
// Result:  in case 1 ($var is set) in case 2

switch (1)
{
    case 1:
        $var = 'Test';
        echo ' in case 1 ';

    case 2:
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    break;

    case 3:
        if (isset($var)) echo '($var is set)';
        echo ' in case 3 ';
    break;
}
// Result:  in case 1 ($var is set) in case 2

switch (1)
{
    case 1:
        $var = 'Test';
        echo ' in case 1 ';

    case 2:
    {
        if (isset($var)) echo '($var is set)';
        echo ' in case 2 ';
    }

    case 3:
        if (isset($var)) echo '($var is set)';
        echo ' in case 3 ';
    break;
}
// Result:  in case 1 ($var is set) in case 2 ($var is set) in case 3

در PHP، ظاهراً بودن یا نبودن اون گیومه ها {} هیچ تاثیری در روند اجرای برنامه نداره، بلکه این break هستش که تعیین کنندست... در حالی که در بیشتر زبانها (مثل java, pawn, c++ و...) می تونه حوزه/scope متغیر ها رو داخل هر case تعیین کنه.

توضیح رسمی C99 درباره دستور switch:

CASE: Case statements are only 'labels'. This means the compiler will interpret this as a JUMP DIRECTLY to the label.
BREAK: A break statement terminates execution of the smallest enclosing switch or iteration statement.

البته این یه نکته ریزه که هنوز خیلی از برنامه نویس ها ازش مطلع نیستن
من هم بعد از 1-2 ساعت تحقیق متوجه این موضوع شدم، چراکه مستندات خودشون هم به این نکته اشاره نکردن. (تا جایی که گشتم)

  • یوشا آل ایوب
۱۳
۱۳۹۴/۰۴

1- هنگامی که دستگاه با وضعیت Low-Memory مواجه می شه، متد onStop() توسط DVM/ART اندروید نادیده گرفته میشه. پس حتی الامکان برنامه و اطلاعات مهمش رو در متد onPause() finalize کنید و نه در متد onStop().

در وضعیت Low-Memory، گاهی استفاده از متد System.runFinalization() و System.gc() می تونه کارساز باشه.

 

2- طبق گفته گوگل، حتی الامکان متد ها رو static تعریف کنید. اینکار سرعت پردازش رو 15 تا 20 درصد افزایش میده.

 

3- URLConnection یا Apache HTTP؟

طبق گفته ی وبلاگ Jesse Wilson، عضو تیم توسعه DVM، Apache HTTP در اندروید Froyo و قبل تر باگهای کمتر و بیشترین سازگاری رو داره. درحالی که UrlConnection در اندروید Gingerbread و جدیدتر باگهای کمتر، امکانات بیشتر، بهینه تر و سازگاری بیشتری رو داره... پس در انتخاب اینها دقت کنید.

  • یوشا آل ایوب
۰۸
۱۳۹۳/۰۸

 

سرعت بیشتر با get_magic_quotes_runtime و get_magic_quotes_gpc برای گرفتن مقدار Magic quotes:

if (get_magic_quotes_gpc() || get_magic_quotes_runtime())
{
    #...
}

0.0123500823970
0.0124192237854
0.0124502182007
0.0128602981567
0.0129485130310
0.0129580497742
0.0129580497742
0.0129890441895
0.0129985809326
0.0130105018616
0.0130105018616
0.0130200386047
0.0130295753479
0.0130391120911
0.0141811370850

 

سرعت کمتر با ini_get برای گرفتن مقدار Magic quotes:

if (ini_get('magic_quotes_gpc') || ini_get('magic_quotes_runtime'))
{
    #...
}

0.0201392173767
0.0201511383057
0.0201606750488
0.0201988220215
0.0202012062073
0.0202107429504
0.0202202796936
0.0202417373657
0.0202584266663
0.0203299522400
0.0219893455505
0.0220894813538
0.0238800048828
0.0250506401062
0.0255298614502

 

x64 Hardware
32bit OS
PHP 5.5 CLI

  • یوشا آل ایوب
۰۸
۱۳۹۳/۰۷

 

1- هرگز روی سیستمی که کمتر از 2 گیگ RAM داره ویندوز نسخه 64 بیتی نصب نکنید. چون اینکار بیشتر باعث کند شدن ویندوز میشه.

ویندوزهای نسخه 64 بیتی به حداقل ۴ گیگ RAM نیاز دارن.

 

2- حتاالمکان روی سیستمی که 8 گیگ یا بیشتر RAM داره ویندوز نسخه 32 بیتی نصب نکنید. درغیراینصورت فقط 4 گیگ RAM توسط CPU قابل دستیابی هستش و بقیه RAM بدون استفاده باقی می مونن.

 

3- درسیستم های BIOS یا پارتیشن نوع MBR/DOS، بهتره در حین نصب ویندز فقط درایو نصب ویندوز رو پارتیشن بندی کنید و بقیه درایوهارو از داخل خود ویندوز(بعد از نصبش) پارتیشن بندی کنید. اون هم از نوع Logical.

با اینکار پارتیشن های Primary بیشتری براتون باقی می مونه... و برای نصب سیستم عامل دوم و سوم به مشکل نمی خورید.

نکته: این موضوع راجب سیستم های UEFI یا پارتیشن نوع GPT صدق نمیکنه.

 

3- هرگز از درایو اصلی ویندوز(که ویندوز داخلش نصبه) برای ذخیره اطلاعت شخصی(مثل عکس، فیلم، موسیقی و...) استفاده نکنید.

اگر مشکل جدی برای ویندوز یا این درایو پیش بیاد معمولاً اطلاعتتون هم پاک میشه.

 

4- اگر از لپ تاپ استفاده می کنید، برای افزایش قدرت لپ تاپ و استفاده از تمام توان دستگاه اون رو به حالت Maximum performance تنظیم کنید.

نکته: در زمانهایی که لپ تاپ از باطری بجای برق مستفیم تغذیه میکنه، از حالت Maximum battery life یا Battery saver استفاده کنید.

در ویندوز Xp و ویندوز 7: به مسیر Start -> Control panel برید و در پنجره باز شده گزینه System and Security رو انتخاب کنید. سپس روی گزینه Power Options کلیک و در پنجره جدید Maximum performance رو انتخاب کنید.

در ویندوز 8 و ویندوز 10: در سمت راست نوار استارت روی آیکون باطری کلیک کنید سپس گزینه Maximum performance رو انتخاب کنید.

 

5- بصورت پیشفرض، ویندوز DLL برنامه های باز و بعد بسته شده رو [بخاطر افزایش سرعت باز کردن مجدد اون برنامه] unload نمی کنه. که اینکار باعث اشغال حافظه و گاهی کندی میشه. برای تغییر این رفتار، میتونید دستورالعمل زیر رو انجام بدید:

- ابتدا برنامه RegEdit رو در مسیر X:\Windows\RegEdit پیدا و اجرا کنید.

- سپس به آدرس HKEY_LOCAL_MACHINE -> Software -> Microsoft -> Windows -> CurrentVersion -> Explorer برید.

- حالا بر روی صفحه راست کلیک و گزینه New -> DWORD(X bit) value رو انتخاب کنید. و نامش رو بذارید AlwaysUnloadDLL

- در آخر روی همین گزینه دوبار کلیک و Value data رو 1 قرار بدید.

  • یوشا آل ایوب
۰۳
۱۳۹۳/۰۵

 

مقایسه سرعت بین دستورات شرطی If Else و Ternary(سه تایی)...

 

سرعت بیشتر:

if x: ...
else: ...
endif;

0.0336170196533
0.0337123870850
0.0337123870850
0.0338077545166
0.0338077545166
0.0339031219482
0.0339031219482
0.0339984893799
0.0339984893799
0.0339984893799
0.0343084335327
0.0343084335327
0.0344038009644
0.0346183776855
0.0408921051025

 

سرعت کمتر:

x ? ... : ...;

0.0385999679565
0.0389099121094
0.0390052795410
0.0390052795410
0.0392198562622
0.0392198562622
0.0392913818359
0.0393867492676
0.0394105911255
0.0395059585571
0.0395059585571
0.0395059585571
0.0396013259888
0.0405073165894
0.0436067581177

 

x64 Hardware
32bit OS
PHP 5.5 CLI

  • یوشا آل ایوب
۲۲
۱۳۹۲/۱۱

 

نکاتی راجب error_reporting و set_error_handler و register_shutdown_function:

 

  • دستور error_reporting

برخلاف تصور خیلی ها که فکر می کنند این دستور خطاها رو "نمایش" میده، این دستور موتور دریافت خطاها هستش. (نه حتی Log کردن خطا)

  • دستور set_error_handler

میشه گفت دستوری برای ثبت تابع customize کننده رفتار خطا هستش (مثلاً برای کادر بندی متون خطا، ایمیل کردن خطا، دادن راه حل به کاربر و...)

  • دستور register_shutdown_function

دستوری برای ثبت تابع callback هستش که هنگام متوقف شدن و پایان یافتن پردازش اسکریپت، اون تابع callback اجرا بشه (همچنین زمانی که exit / die صدا زده میشه)
اصول نامگذاری: onScriptShutdown یا onScriptEnd یا onShutdown....
نکته: توسط این دستور میشه خطاهای نوع E_ERROR , E_PARSE , E_CORE_ERROR , E_COMPILE_ERROR رو هم جذب کرد

 

 

  • دستور ini_set('display_errors', TRUE);

دستوری برای نمایش خطا هستش. اگر دستور error_reporting خاموش باشه این دستور هم کار نمی کنه. اگر دستور error_reporting روشن باشه ولی این دستور false باشه، اسکریپت کماکان خطاها رو دریافت می کنه اما نمایش نمیده.

  • دستور ini_set('log_errors', TRUE);

دستوری برای ذخیره خطا در فایل هستش. اگر دستور error_reporting خاموش باشه این دستور هم کار نمی کنه. اگر دستور error_reporting روشن باشه ولی این دستور false باشه، اسکریپت کماکان خطاها رو دریافت می کنه اما ذخیره نمی کنه.

 

بنابراین برای محیط development همگی باید فعال و true باشن و برای محیط production(سرور واقعی یا تحویل به مشتری) همه باید فعال و true باشن بجز دستور display_errors!

  • یوشا آل ایوب
۰۵
۱۳۹۲/۰۸

 

سرعت بیشتر با تابع StrToLower:

0.000250101089478
0.000252008438110
0.000259160995483
0.000259160995483
0.000261068344116
0.000263929367065
0.000263929367065
0.000265121459961
0.000269174575806
0.000270128250122

سرعت کمتر با StrIStr:

0.000537157058716
0.000538110733032
0.000538110733032
0.000538110733032
0.000540018081665
0.000542163848877
0.000542163848877
0.000543117523193
0.000550985336304
0.000910043716431

در مواردی مثل:

if (strtolower(&$_SERVER['HTTPS']) == 'on' || @$_SERVER['HTTPS'] == 1 || @$_SERVER['SERVER_PORT'] == 443): return(true);
endif;
و
if (stristr(&$_SERVER['HTTPS']) == 'on' || @$_SERVER['HTTPS'] == 1 || @$_SERVER['SERVER_PORT'] == 443): return(true);
endif;

 

x64 Hardware
32bit OS
PHP 5.4 CLI

  • یوشا آل ایوب
۱۱
۱۳۹۲/۰۶

 

چند نمونه از توابعی که در php.ini بهتره Disable بشن:

apache_child_terminate,
apache_reset_timeout,
unregister_tick_function,
rpc,
exec,
dl,
show_source,
apache_note,
apache_setenv,
closelog,
debugger_off,
debugger_on,
define_syslog_variables,
escapeshellarg,
escapeshellcmd,
ini_restore,
openlog,
passthru,
pclose,
pcntl_exec,
popen,
proc_close,
proc_get_status,
proc_nice,
proc_open,
proc_terminate,
shell_exec,
syslog,
system,
url_exec

 

نکته: این توابع باید در قسمت disable_functions در فایل php.ini قرار بگیرن.

توجه: در سیستم های local اگر از برنامه Composer یا pickle استفاده می کنید نباید توابع escapeshellarg, exec, passthru رو غیرفعال کنید. اگر از برنامه PHPMD استفاده می کنید نباید تابع proc_open و ini_restore رو غیرفعال کنید. و اگر از برنامه PHPCS استفاده می کنید نباید تابع proc_get_status و proc_close رو غیرفعال کنید.

  • یوشا آل ایوب
۰۲
۱۳۹۲/۰۵

/**
 * A hack to support __construct() on PHP 4
 * Hint: descendant classes have no PHP4 class_name() constructors,
 * so this constructor gets called first and calls the top-layer __construct()
 * which (if present) should call parent::__construct()
 *
 * @return Object
 */
function object()
{
    $arguments = func_get_args();

    if (method_exists($this, '__destruct')) register_shutdown_function(array(&$this, '__destruct'));

    call_user_func_array(array(&$this, '__construct'), $arguments);
}

https://github.com/felixge/raleigh-workshop-08/blob/master/application/cake/libs/object.php

  • یوشا آل ایوب