یوشا

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

یوشا

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

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

طبقه بندی موضوعی
۰۸
۱۳۹۵/۰۱

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 ساعت تحقیق متوجه این موضوع شدم، چراکه مستندات خودشون هم به این نکته اشاره نکردن. (تا جایی که گشتم)

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

اینها چیزی نیستند جز software bundle، که توسط شرکت ها و گروه های نرم افزاری برای یک هدف جمع آوری شدن. و اون هم فراهم کردن بستری سریع و آسون برای برنامه نویسی.

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

 

نرم‌افزار شامل سیستم عامل ویژگی‌های کلیدی
XAMPP  Apache، MySQL، PHP، Perl چند-پلتفرم Apache، MySQL، PHP، Perl، SSL، ماژول‌های اضافی مثل WordPress، phpMyAdmin
WAMP Apache، MySQL، PHP/Perl/Python ویندوز Apache، MySQL، PHP/Perl/Python، نصب آسان، رابط کاربری دوستانه
MAMP Apache، MySQL، PHP مک Apache، MySQL، PHP، مشابه XAMPP اما برای مک
DAMP Apache، MySQL، PHP Debian Apache، MySQL، PHP، مشابه LAMP اما برای سیستم‌های مبتنی بر دبیان
UniformServer Apache، MySQL، PHP ویندوز Apache، MySQL، PHP، Perl، سبک، نصب آسان
EasyPHP Apache, MySQL/PostgreSQL, PHP, Ruby, Python, MongoDb ویندوز Apache، MySQL، PHP، Perl، رابط کاربری دوستانه، ابزارها و ماژول‌های اضافی


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

6 تصویر wallpaper برای لینوکس Slackware:
 

                    

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

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

این مقاله شامل آموزش نصب و راه اندازی Java + Android + Eclipse هستش.

که البته منظور از Android, پکیج Android SDK هستش، منظور از Eclipse, برنامه Eclipse IDE هستش و منظور از Java, پکیج Java SDK (همون JDK) هست.

 

فهرست مندرجات:

  • ابزارهای مورد نیاز
  • دانلود، نصب و تنظیم Java
  • دانلود، نصب و تنظیم Android SDK
  • دانلود، نصب و تنظیم Eclipse
  • دانلود، نصب و تنظیم ADT plugin
  • درباره Gradle ,ANT و Maven
  • نکات
  • رفع مشکلات

  • یوشا آل ایوب
۲۳
۱۳۹۴/۰۵
  • مقدمه

حافظه مجازی در کامپیوتر، یک آرایه بزرگ طولانی از بیت هستش و این بیت ها به بلوک هایی به نام بایت تقسیم میشن(هر 8 بیت = 1 بایت) و به هر بایت یک آدرس جهت دسترسی اختصاص داده می شه.

در زبانهای برنامه نویسی، وقتی با داده های غیرفیزیکی(مثل متغیر ها، اشیا، توابع و...) کار می کنید، مقدار و آدرس این داده ها در حافظه مجازی ذخیره میشه. در سطح پایینتر، وقتی متغیر محلی(local variable) یا تابعی تعریف و استفاده می کنید مقادیر و آدرسشون در قسمت Stack حافظه مجازی قرار می گیره. ولی با ساخت شی یا اختصاص حافظه بصورت دستی(Dynamic)، مقدار و آدرسشون در قسمت Heap حافظه مجازی قرار میگیره. و نهایتاً همه اینها در سلول های RAM سخت افزاری کامپیوتر بصورت منظم چیده میشن.

 

ram-stack-heap

 

فهرست/مندرجات:

  • حافظه Stack
    • قوائد حافظه Stack​
    • مشکل Stackoverflow
  • حافظه Heap
    • قوائد حافظه Heap
    • Garbage Collector / GC
    • مشکل Memory leak

 

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

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 و جدیدتر باگهای کمتر، امکانات بیشتر، بهینه تر و سازگاری بیشتری رو داره... پس در انتخاب اینها دقت کنید.

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

 

init: مخفف initialization، اولین برنامه/process ای هست که در حین بوت سیستم اجرا میشه و تا زمانی که سیستم خاموش بشه بکارش ادامه میده. این برنامه ابتدا عملیات system initialization رو انجام میده و سپس عملیات runlevel initialization رو و اینکارو با خوندن محتوای فایل inittab آغاز میکنه.

برنامه init ابتدا اسکریپت rc.S رو اجرا میکنه تا سیستم رو برای ورود به runlevel مورد نظر آماده کنه. فایل rc.S وظیفه داره که حافظه مجازی رو فعال کنه، filesystem رو Mount کنه، دایرکتوری var/ رو تمیزکاری کنه، دیوایس های Plug & Play رو آماده سازی کنه، ماژول های Kernel رو بارگذاری کنه(LKM)، پورت های سریال رو پیکربندی کنه و نهایتاً اسکریپتهای System V رو اجرا کنه. بنابراین init آغازگر بیشتر پرورس ها و فرآیندهای اصلی سیستم هستش.

نکته: برنامه init توسط Kernel فراخونده میشه و با پروسس Id 1 شروع بکار میکنه. اگر Kernel قادر به فراخوندنش نباشه، خطای Kernel pantic (یا همون fatal error) رخ میده که باعث متوقف شدن کل پروسه بوت میشه.

 

runlevel: تعیین کننده پارامترهای برنامه init و دستورالعملهایی برای تنظیم ترمینال، محیط کاربر، شبکه و اجرای سرویس های اولیه هستش که توسط یک شناسه عددی داخل فایل inittab در مسیر /etc/ تنظیم میشه. و البته این شناسه در هر توزیعی متفاوته!

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

 

گوشی که درحال حاضر ازش استفاده می کنم، مدل S111 Spreadtrum ماله شرکت Kenxinda هستش... (چینیه!)

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

خب خود گوشی نسخه اندرویدشو زده 4.0.0 ولی من خیلی وقت پیش مشکوک شدم که این گوشی اندرویدش 4 نیست، بلکه 3 یا 2 عه

دیروز که داشتم داخلش فایلگردی می کردم و برنامه های فابریکیشو decompile می کردم متوجه یه سوتی شدم:

فایل browser.java داخل برنامه Browser.apk در مسیر system/app/

public String getUserAgentString()
{
...

    localStringBuffer.append("Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; KENXINDA-KXD-");

...

    localStringBuffer.append("/1.0 Android/2.3.5 Release/03.01.2013 Browser/AppleWebKit533.1 Build/MocorDroid2.3.5) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1");

همینطور که میبینید داخل useragent مرورگر، سیستم عامل رو زده Android 2.3.5! یعنی نسخه واقعیه این گوشی! این همون سوتیه که شرکت Kenxinda داده.

 

حالا بگذریم، بعدش شروع کردم به گشتن تو اینترنت دنبال راهی که این برنامه رو بدون root کردن گوشی جایگزینش کنم. (یا اینکه بهینه سازی و دوباره کامپایلش کنم). که به یه Browser داخل پکیج های Cyanogen برخوردم:

سیستم عامل Cyanogen شاخه ای از پروژه Android هستش که خیلی هم بهتر از خود اندروید داره توسعه داده میشه

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

Cyanogen همه نوع توسعه دهنده و contributer ای رو قبول می کنه، opensource و رایگان هستش و با آغوشی باز از هر change/improvment ای استقبال می کنه. برعکس Google که فقط حرفشو میزنه.

دقیقاً مثل اندروید، core ش با C و ++C نوشته شده، UI ش با Java و پکیج منجرش هم APK هستش.

اگر کاربر عادی هستید و مدل گوشیتون در Cyanogen لیست شده پیشنهاد می کنم حتماً نصبش کنید و پادشاهی کنید! اگرم توسعه دهنده هستید و پیشنهادات/ایده هایی برای سورس اندروید دارید، بفرستیدش به Cyanogen که بررسی و اعمالش کنن.

 

اینم بگم که اگر فکر می کنید می تونید با ایده ها و تغییراتتون به توسعه خود Android کمک کنید سخت در اشتباهید. چون برای Android زیاد مهم نیست و اصلاً اهمیتی نمیدن، چون تیم Android بشدت مشغولند...!

 

http://cyanogenmod.org

http://wiki.cyanogenmod.org

https://github.com/CyanogenMod

  • یوشا آل ایوب