یوشا

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

یوشا

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

یوشا

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

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

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

شیوه درست صدا زدن Superclass ها در Activity اندروید:

// Called after onCreate has finished, use to restore UI state
@Override
public void onRestoreInstanceState(Bundle savedInstanceState)
{
    super.onRestoreInstanceState(savedInstanceState); // Always call the superclass method at FIRST.

    // Restore UI state from the savedInstanceState.
    // This bundle has also been passed to onCreate.
    // Will only be called if the Activity has been
    // killed by the system since it was last visible.
}

// Called before subsequent visible lifetimes for an activity process.
@Override
public void onRestart()
{
    super.onRestart(); // Always call the superclass method at FIRST.

    // Load changes knowing that the Activity has already
    // been visible within this process.
}

// Called at the start of the visible lifetime.
@Override
public void onStart()
{
    super.onStart(); // Always call the superclass method at FIRST.

    // Apply any required UI change now that the Activity is visible.
}

// Called at the start of the active lifetime.
@Override
public void onResume()
{
    // Resume any paused UI updates, threads, or processes required
    // by the Activity but suspended when it was inactive.

    super.onResume(); // Always call the superclass method at LAST.
}

// Called to save UI state changes at the end of the active lifecycle.
@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
    // Save UI state changes to the savedInstanceState.
    // This bundle will be passed to onCreate and
    // onRestoreInstanceState if the process is
    // killed and restarted by the run time.
    super.onSaveInstanceState(savedInstanceState); // Always call the superclass method at LAST.
}

// Called at the end of the active lifetime.
@Override
public void onPause()
{
    // Suspend UI updates, threads, or CPU intensive processes
    // that don't need to be updated when the Activity isn't
    // the active foreground Activity.
    super.onPause(); // Always call the superclass method at LAST.
}

// Called at the end of the visible lifetime.
@Override
public void onStop()
{
    super.onStop(); // Always call the superclass method at FIRST.

    // Suspend remaining UI updates, threads, or processing
    // that aren't required when the Activity isn't visible.
    // Persist all edits or state changes
    // as after this call the process is likely to be killed.
}

// Sometimes called at the end of the full lifetime.
@Override
public void onDestroy()
{
    // Clean up any resources including ending threads,
    // closing database connections etc.

    super.onDestroy(); // Always call the superclass method at LAST.
}

 

خلاصه مطب: در متد های onRestoreInstanceState، onStop, onRestart, onStart، ابتدا باید Superclass صدا زده بشه و بعد کدهای شما قرار بگیره. اما در متدهای onDestroy, onPause, onSaveInstanceState, onResume ابتدا باید کدهای شما قرار بگیره و بعد متد Superclass صدا زده بشه.

عدم رعایت این اولویت ها گاهی باعث کندی، crash کردن، memory leak، ناهماهنگی در UI، باگهای DataSaving و امثالش میشه... پس حتماً رعایت کنید.

 

(شاید درصد کمی از برنامه ها باشند که از این قائده پیروی نمی کنند، اما اون هم با آگاهی کامل از محتوا و مکانیسم Superclass ها.)

 

منبع: پروفسور Andrew T. Campbell (و گوگل)

http://www.cs.dartmouth.edu/~campbell/cs65/lecture05/lecture05.html

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

 

همونطور که می دونید برنامه Git برای کار با repository، پنج پروتکل در اختیار ما گذاشته که هرکدوم مزایا و معایب خودشونو دارن. این پروتکل ها:

1- File (یا همون Local protocol)

2- HTTP (یا همون Dumb protocol)

3- HTTPS (یا همون Smart protocol)

4- SSh

5- Git

هستند. اما از کدوم پروتکل باید استفاده کنیم؟ کدوم پروتکل امنیت بیشتری داره؟ و کدوم پروتکل سرعت بیشتری داره؟

پس وارد جزئیات میشیم!

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

در ادامه مقاله قبلیم که شماره یک "نکات و اصول مهم در برنامه نویسی Java/Android" بود، در این مقاله شماره دو همین موضوع رو ارائه میدم. منتها کمی پیشرفته تر...

 

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.

۰ نظر ۹۵/۰۱/۰۸
یوشا آل ایوب
<?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 ساعت تحقیق متوجه این موضوع شدم، چراکه مستندات خودشون هم به این نکته اشاره نکردن. (تا جایی که گشتم)

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

بدون استفاده از mysqli_set_charset و SET NAMES utf8
enlightened اگر انکودینگ فایل پی اچ پی UTF8 باشه، تگ meta صفحه UTF8 باشه، charset دیتابیس هم utf8_persian_ci باشه خروجیش صحیحه و میشه این:
آ ب پ ت ث ج چ ح خ د ض ر ز ش

اگر انکودینگ فایل پی اچ پی UTF8 باشه، تگ meta صفحه UTF8 "نباشه"، charset دیتابیس utf8_persian_ci باشه/نباشه خروجیش میشه این:
آ ب پ ت ث ج چ ح خ د ض ر ز ش

اگر انکودینگ فایل پی اچ پی UTF8 "نباشه"، تگ meta صفحه UTF8 باشه، charset دیتابیس utf8_persian_ci باشه/نباشه خروجیش میشه این:
� � � � � � � � � � � � � � 

اگر انکودینگ فایل پی اچ پی UTF8 "نباشه"، تگ meta صفحه UTF8 "نباشه"، charset دیتابیس utf8_persian_ci باشه/نباشه خروجیش میشه این:
Â È Ê Ë Ì Í Î Ï Ö Ñ Ò Ô

enlightened اگر انکودینگ فایل پی اچ پی UTF8 باشه، تگ meta صفحه UTF8 باشه، اما charset دیتابیس utf8_persian_ci "نباشه" خروجیش صحیحه و میشه این:
آ ب پ ت ث ج چ ح خ د ض ر ز ش

می بینید که حتی بدون استفاده از mysqli_set_charset و SET NAMES utf8 باز هم میشه "خروجی" صحیح رو گرفت

 

با استفاده از mysqli_set_charset و SET NAMES utf8
enlightened اگر mysqli_set_charset و SET NAMES هردو UTF8 باشن، انکودینگ فایل پی اچ پی UTF8 باشه، تگ meta صفحه UTF8 باشه، charset دیتابیس utf8_persian_ci باشه خروجیش صحیحه و میشه این:
آ ب پ ت ث ج چ ح خ د ض ر ز ش

اگر mysqli_set_charset و SET NAMES هردو UTF8 باشن، انکودینگ فایل پی اچ پی UTF8 باشه، تگ meta صفحه UTF8 "نباشه"، charset دیتابیس utf8_persian_ci باشه خروجیش میشه این:
آ ب پ ت ث ج چ ح خ د ض ر ز ش

اگر mysqli_set_charset و SET NAMES هردو UTF8 باشن، charset دیتابیس utf8_persian_ci "نباشه"، و همه چیز دیگر UTF8 باشن خروجیش میشه این:
? ? ? ? ? ? ? ? ? ? ? ? ? ?

اگر mysqli_set_charset و SET NAMES هردو UTF8 باشن، انکودینگ فایل پی اچ پی UTF8 "نباشه"، تگ meta صفحه UTF8 باشه، charset دیتابیس utf8_persian_ci باشه خروجیش میشه این:
" "

enlightened اما برای "نمایش" درست کلمات در خود دیتابیس لازمه که از mysqli_set_charset استفاده کنید.

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

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- در حین نصب/setup ویندز(هر نسخه ای)، فقط درایو نصب ویندوز رو پارتیشن بندی کنید و بقیه درایوهارو از داخل خود ویندوز(بعد از نصبش) پارتیشن بندی کنید. اون هم از نوع Logical.

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

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

 

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

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

 

4- حل مشکل A disk read error occurred:

این مشکل میتونه به دلیل:

1- آسیب دیدن RAM باشه
2- به هم ریختن تنظیمات BIOS باشه
3- به هم ریختن کدهای بوت(master boot record) باشه

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

- وارد BIOS بشید(توسط فشرن کلید F2, F8, F12, Esc یا Del هنگام بوت سیستم) و تنظیماتش رو Default / Reset کنید و بعدش Save کنید.

- یا وارد BIOS بشید و تنظیمات اولویت بندی دیوایس بوت(boot order) رو روی هارد دیسکتون قرار بدید.

- یا دیسک ویندوز رو داخل سیستم بذارید و بوت ش کنید. در صفحه Install گزینه Repair computer رو بزنید. در پنجره جدید گزینه Command prompt رو بزنید. حالا بنویسید chkdsk C: /r و Enter کنید تا اسکن کنه.
اگر بعد از اتمام اسکن درست شد که هیچ، اگر نشد همین کار رو انجام بدید اما اینبار بترتیب این دستورات رو بنویسید و Enter کنید:

bootrec /rebuildbcd

bootrec /fixmbr

bootrec /fixboot

- اگر درست نشد، برنامه memtest یا Memory Test رو از طریق منوی بوت یا از داخل BIOS اجرا کنید و نتیجه تست رو ببینید.

 

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.0608921051025

سرعت کمتر:

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

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

هنگام استفاده از استثنائات(یا همون Exceptions) از این قواعد پیروی کنید(هم برای عملکرد و هم دلایل مدیریت کد):

1- بخاطر داشته باشید که استثنائها، استثنا هستند. فقط بایستی از آنها برای مواجه با مشکلات غیر قابل پیش بینی استفاده کنید.
2- هرگز از استثنائها برای کنترل جریان برنامه استفاده نکنید. این باعث می شود که نتوان مسیر انجام کد را دنبال کرد و جریان برنامه کند نیز می شود(مشابه دستور GoTo که در برخی زبانها یافت می شود).
3- استثنائها فقط باید حاوی اطلاعات رخداد/رویداد باشد و نبایستی حاوی پارامترهایی(یا اطلاعات اضافی) باشد که روی نحوه انجام و منطق داخل هر Handle کننده Catch تاثیر بگذارد.


منبع: کتاب PHP 5 Power Programming.

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