یوشا

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

یوشا

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

یوشا

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

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

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

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

 

1- بهتره همیشه شماتیک :file رو در کلاس WebView رو مسدود کنید.

کلاس WebView قابلیت نمایش صفحات وب در داخل اکتیویتی رو فراهم میکنه، و از اونجایی که دیگر برنامه ها قادرن Intent URI به WebView ایجاد شده بفرستن، پس این امکان رو هم دارن تا بتونن فایل یا آدرس URI آلوده رو در دستگاه بارگذاری کنن...

راه حل:

String _intentUrl = getIntent().getStringExtra("http://blog.ir");

if (!_intentUrl.startsWith("file:"))
{
   loadUrl = _intentUrl;
}

 

2- از انجایی که همه برنامه ها قادرن محتوای logcat رو read کنن، هرگز اطلاعات حساس رو برای دیباگ Log نکنید، مخصوصاً درخواستها و پاسخهای HTTP رو.

 

3- اگر در حین بازکردن برنامه Eclipse با خطای Java was started but returned exit code 13 مواجه شدید، این یعنی مثلاً Java 64bit نصب کردید، درصورتی که Eclipse تون 32bit هستش. یا Java 32bit نصب کردید، درصورتی که Eclipse تون 64bit هستش.

بنابراین باید معماری هردو یکی باشه... مثلاًً هردو 32bit یا هردو 64bit باشن.

نکته: در صورت حل نشدن مشکل با نصب معماری مناسب، فایل eclipse.ini رو که در کنار فایل اجرایی Eclipse تون هست رو باز کنید و بدنبال واژه –vm بگردید... بعد در زیر این واژه مسیر نصب شده Java رو جایگزینش کنید...

و یا برنامه Eclipse رو باز کنید و به مسیر Menu -> Prefecences -> Java -> Installed JREs برید و مسیرنصب شده Java رو بهش بدید...

 

4- اگر هنگام بازکردن برنامه Android Studio در صفحه loading/splash متوقف شد یکی از راه های زیر رو دنبال کنید:

- اتصالتون رو با اینترنت قطع کنید و مجدداً برنامه رو باز کنید.

- اگر گوشی به دستگاه متصل هست، از دستگاه جدا و مجدداً برنامه رو باز کنید.

- برنامه رو از طریق گزینه Run as administrator موجود در منوی راست کلیک باز کنید.

- مطعن بشید که محتوای ANDROID_HOME و ANDROID_SDK_HOME در environment variable موجود و بدرستی تنظیم شده باشن.

 

5- برای حل مشکل Cannot Create Android Virtual Device در AVD اندروید یکی از راه های زیر رو دنبال کنید:

- برنامه ها رو ببندید و مجدداً بازشون کنید. اکلیپس، AVD Manager, AS...

- در پنجره ساخت دیوایس، مطمعن بشید که نوع CPU/ABI رو انتخاب کردید.

- مطمعن بشید که متغیر ANDROID_SDK_HOME به path مناسب و بدون فاصله ای تنظیم شده باشه.

- مطمعن بشید که System Image مربوط به اون دیوایس رو نصب کردید. ARM EABI v7a یا Intel x86 Atom...

- مطمعن بشید که در نام دیوایس فاصله(space) وجود نداشته باشد.

- مطمعن بشید که دیوایسی با این نام وجود نداشته باشد.(duplicate)

- یک دیوایس رو Clone کنید و او رو Edit کنید.

- مطعمن بشید که نسخه API ای که انتخاب کردید با CPU/ABI انتخاب شده سازگار باشه.

- برنامه AVD Manager رو در خارج از محیط برنامه نویسی باز کنید.

- از اسکریپت monitor.bat موجود در پوشه tools اندروید SDK استفاده کنید.

 

6- برای راست چین(RTL) کردن متون فارسی در اندروید قبل از 4 میتونید از روش های زیر استفاده کنید:

- اگر به قوائد unicode مسلط هستید میتونید از RIGHT-TO-LEFT MARK استفاده کنید:

String myMixedString = "Test \u200F(تست)";

- تغییر مقدار gravity به مقدار right

- استفاده از HTML

 

7- اگر هنگام بازکردن برنامه Device Monitor اندروید با خطای An error has occured. See the log file مواجه شدید برای حلش یکی از راه های زیر رو دنبال کنید:

- برنامه رو ببندید و با کاربر Administrator یا root باز کنید... یا توسط run as administrator یا دستور sudo.

- Task Manager سیستم رو باز کنید و اگر برنامه monitior.exe باز هستش اون رو Kill/End کنید.

- برنامه SDK Manager رو باز کنید و جدیدترین پکیج Android SDK Tools رو دانلود و نصب کنید. بعد برنامه Device Monitor رو مجدداً باز کنید.

- اگر در نام account سیستم تون فاصله وجود داره(مثل Firstname Lastname)، باید account دیگه ای بسازید و همه فایلها رو به اونجا منتقل کنید و مجدداً نصب و تنظیمشون کنید!

 

8- برای حل مشکل Could not open Selected VM debug port (8700) در برنامه Device Monitor یکی از راه های زیر رو دنبال کنید:

- برنامه Device Monitor رو ببندید و توسط IDE بازش کنید. (Device Monitor رو نباید مستقیم باز کرد)

- همه برنامه ها رو بسته و Task Manager رو باز کنید. بعد adb رو Kill/End کنید. در آخر برنامه رو مجدداً باز کنید.

- Task Manager سیستم رو باز کنید و اگر برنامه monitior باز هستش اون رو Kill/End کنید.

- باید DDMS رو تنظیم کنید که کدوم VM رو debug کنه. یعنی بر روی کدوم system_process باید سوار بشه و کار کنه.

- ویندوز: به مسیر C:\WINDOWS\system32\drivers\etc برید و فایل hosts رو باز کنید و این مقدار 127.0.0.1 localhost رو داخلش وارد کنید. (اگر نیست)

- وارد تنظیمات DDMS بشید و Base local debugger port رو به 8701 تغییر بدید و فیلد Use ADBHOST رو هم تیک بزنید. در آخر value رو بذارید 127.0.0.1

- سیستم رو یکبار خاموش و روشن کنید.

- اگر Eclipse و Android Studio هر دو باز هستن، اونها رو ببندید و فقط یکی رو باز کنید. (چون هردو از یک منبع SDK استفاده می کنن)

 

9- با استفاده از ابزار Lint گوگل، پروژه اندروید تون رو برای پیدا کردن bug های پنهان/خفیف اسکن کنید.

- در اندروید استودیو کافیه به منوی Analyse -> Inspect Code برید و در پنجره باز شده Ok رو بزنید تا فعال بشه.

- یا کد زیر رو در فایل build.gradle بنویسید تا با هربار build، سیستم Lint بصورت خودکار فعال بشه:

lintOptions
{
   abortOnError true
}

 

10- اگر هنگام نصب برنامه APK اندروید با خطای There is a problem parsing the package مواجه شدید، راه های زیر رو بررسی کنید:
- احتمالاً نام برنامه رو تغییر دادید، پس به حالت اولش برگردونید.
- از مقدار minSdkVersion در فایل .gradle و سازگاریش با دستگاه رو مطمعن بشید.
- شاید نام برنامه رو بعد از Sign کردن تغییر دادید. (در Manifest نام رو اصلاح کنید)
- برنامه شما برای API بالاتر از دستگاه موردنظر کامپایل شده. (در Manifest درجه API رو پایین بیارید)
- شاید برنامه دسترسی INSTALL_PACKAGES رو نداره.
- مطمعن بشید که تیک Unknown Sources to allow installation of non Market Applications در Settings دستگاه فعال باشه.
- پکیج مورد نظر بروی SD-Card قرار داره و از اونجا داره نصب میشه. پس باید به حافظه داخلی/Phone منتقل و نصبش کنید.
- احتمالا پگیج Sign نشده.
- شاید برنامه رو در دایرکتوری ذخیره کردید که دسترسی های لازم رو نداره.
- برنامه بطور کامل دانلود نشده و پکیج ناقص هست.
- در برنامه از منابع سخت افزاری استفاده شده که دستگاه شما پیشتیبانیش نمی کنه.

 

11- نکته جریی: برنامه Android Studio برای اجرا شدن از JRE استفاده می کنه، اما برای کامپایل از Gradle استفاده میکنه. برنامه Gradle هم برای اجرا شدن از JRE استفاده می کنه، اما برای کامپایل جاوا از JDK (و دیگر کامپایلرهای مختص هر زبان) استفاده می کنه.

 

12- دلیل قفل شدن برنامه Android Studio هنگام باز کردن پروژه با پیام Gradle: resolve dependancies، عدم دسترسی Android Studio به مخازن گوگل هستش که بخاطر مشکلات شبکه یا تحریم بوجود میاد. راه حل:

- فایل gradle.properties رو باز کنید و برای HTTP و HTTPS پروک*&سی وارد کنید:

systemProp.http.proxyHost=<http proxy address>
systemProp.http.proxyPort=<http proxy port>
systemProp.https.proxyHost=<https proxy address>
systemProp.https.proxyPort=<https proxy port>
یا
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8080
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=8080

- یا وارد Preferences -> Gradle اندروید استودیو بشید و گزینه work offline رو تیک بزنید و مجدداً تلاش کنید.

- یا فایل build.gradle رو باز کنید و بجای jcenter() بنویسید mavencentral() و مجدداً تلاش کنید.

- یا سیستم رو یکبار خاموش و روشن کنید.

- یا چند دقیقه صبر کنید تا عملیات به پایان برسه.

- یا برنامه اندروید استودیو رو مجدداً نصب کنید.

- یا برنامه AntiVirus یا Firewall رو غیر فعال کنید و مجدداً تلاش کنید.

 

13- همیشه از SP برای تعیین اندازه font و از DP برای تعیین اندازه عناصر(و دیگر آیتم ها) استفاده کنید.

- نوع DP مبتنی بر اندازه density فیزیکی صفحه هستش.

- اما نوع SP با تغییر اندازه فونت دستگاه تنظیم میشه - یعنی توسط screen density و font size preference کاربر.
نکته: تغییر اندازه فونت دستگاه توسط کاربر از اندروید ICS به بعد امکانپذیره.
نکته 2: بدلیل محدودیت اندازه در toolbar برنامه، بهتره از DP استفاده بشه.

 

14- مفهوم Loose Coupling یعنی عدم وجود وابستگی در دسته ای از کلاس. یعنی متصل اما مستقل. یعنی افزایش flexibility و re-usability کد. یعنی استقلال در حین وابستگی. یعنی عدم وابستگی در روابط بین کلاس ها.

و مفهوم Tight Coupling یعنی وجود وابستگی سخت/تودرتو در دسته ای از کلاس. یعنی متصل و به هم وابسته. یعنی کاهش flexibility و re-usability کد. یعنی وابستگی در روابط بین کلاس ها.

 

15- نکته جزیی: جهت thread-safe کردن متدها کافیه از کلمه کلیدی synchronized در تعریف متد استفاده کنید.

public synchronized void myMethod()
{
   // ...
}

نکته: استفاده از کلمه کلیدی synchronized روی متد باعث میشه تا در هر لحظه فقط یک Thread متد رو اجرا کنه و تا پایان اجرای متد Thread دیگری متد رو اجرا نکنه.

 

16- یادتون باشه که تقدم اجرای initializer ها در یک کلاس همیشه بصورت: Static initializer -> Instance initializer -> Constructor هستش.

public class MyClass
{
   // Constructor initializer
   public MyClass()
   {
      // #3
   }

   // Static initializer
   static
   {
      // #1
   }

   // Instance/Object initializer
   {
      // #2
   }
}

در این حالت ابتدا بلوک initializer احرا خواهد شد و سپس بدنه متد سازنده.

 

17- سعی کنید متغیرهای کلاس رو در خارج از متد constructor آماده سازی/Initialize کنید. (اینها مقادیر پیشفرض دارن و حتی قبل از اینکه سازنده کلاس صدا زده بشه مقدار دهی می شوند. پس دوبار به اونها مقدار ندید! بعلاه خوانایی کلاس راحت تر و سریع تر انجام میشه)

 

 18- مفهوم و تفاوت Concurrency(همزمانی) و Parallel(موازی):

- پردازش Parallel نوعی از Concurrent هستش. درواقع Parallel زیرمجموعه Concurrency هستش.

- نوع Concurrent میتونه با یک پردازنده اعمال بشه (single/multi thread). اما نوع Parallel باید در چند پردازنده اعمال بشه. یعنی یک پردازنده به ازای هر پروسس.

نکته: عمل multi-threading هم زیر مجموعه parallelism محسوب میشه(اما Parallel programming نیست) و میتونه توسط یک یا چند پردازنده انجام بشه.

 

19- برای تولید خودکار APK هنگام Clean/Build کردن پروژه در Eclipse، کافیه به مسیر Window -> Preferences -> Android -> Build برید و گزینه Skip packaging and dexing untill export or launch رو تیک بزنید.

 

20- اگر در تولید فایل build.xml (اسکریپت Ant) با مشکل مواجه شدید، کافیه در خط فرمان دستور زیر رو بزنید تا مجدداً ایجاد بشه:

android update project -p ./ --subprojects
یا
android update project -p ./

فایل اسکریپت android در مسیر <YOUR-ANDROID-SDK-HOME>/tools قرار داره.

 

21- برای حل مشکل ADB در برقراری ارتباط شاید لازم باشه در بعضی از دستگاه ها MTP (Media Transfer Protocol) فعال بشه و در بعضی دیگر PTP (Picture Transfer Protocol).

 

22- هنگام دریافت خطای failed to load با Android Virtual Device مطمعن بشید که ANDROID_HOME در PATH موجود و درست تنظیم شده باشه.

 

23- نکته جزیی: بدلیل وجود مشکلات oversleep و lock در دستور Thread.sleep، بهترین محل استفاده در Background thread هستش.

 

24- برای حل مشکل failed to create the SD card با Android Virtual Device در لینوکس های 64 بیتی کافیه پکیج lib32-gcc-libs رو دانلود و نصب کنید.

 

25- برای فعالسازی Proguard در اندروید استودیو(Gradle) فایل build.gradle موجود در app رو باز و دستورات زیر رو بنویسید:

android
{
   buildTypes
   {
      release
      {
         minifyEnabled true
         proguardFiles getDefaultProguardFile(‘proguard-android.txt'), 'proguard-rules.pro'
      }
   }
}

 

26- فرمول محاسبه حافظه JVM:

JVM memory = JVM Max Heap(-Xmx) + JVM Perm Size(-XX) + NumberOfConcurrentThreads * StackSize(-Xss) + OtherRequiredMemory(JIT, NIO, JNI...)

 

27- نکته جزیی: دستورات  wait(), notify() و notifyAll() همیشه باید در کدهای synchronize اجرا بشن.

 

28- تشریح ClassNotFoundException و NoClassDefFoundError:

- مشکل ClassNotFoundException از نوع Exception هستش و زمانی پرتاب میشه که برنامه جاوا بصورت Dynamic سعی در load کردن کلاس موردنظر حین Run-time از مسیر CLASSPATH کنه اما نتونه پیداش کنه.

- مشکل NoClassDefFoundError از نوع Error هستش و زمانی بوجود میاد که کلاس موردنظر در مسیر CLASSPATH حین Compile-time وجود داره اما حین Run-time وجود نداره.

 

29- آیا میدونید هنگام استفاده از اپراتورهای compound assignment (مثل += -= *= /= %=) یک عمل type-casting هم در پشت پرده صورت میگیره؟

 

30- برای حل مشکل java.lang.NoClassDefFoundError هنگام اجرای برنامه تولید شده توسط Android Studio یکی از راه های زیر رو دنبال کنید:

- به مسیر Menu -> File -> Settings -> Build, Execution, Deployment ->Instant Run در برنامه Android Studio برید و قابلیت Instant Run رو خاموش کنید.

- پروژه رو یکبار Clean کنید و مجدداً build کنید.

- نسخه مقدار classpath در gradle رو کاهش بدید و مجدداً build کنید.

- کتابخانه compile 'com.android.support:multidex:1.0.1' رو به پروژه اضافه و مجدداً build کنید.

 

31- برای حل مشکل IllegalArgumentException: Unable to locate adb در برنامه Android Studio راه های زیر رو دنبال کنید:

- اگر از برنامه های AntiVirus استفاده می کنید، به قسمت Quarantine برید و فایل adb.exe رو آزاد کنید. بعد AntiVirus رو خاموش کنید.

- وارد SDK Manager بشید و پکیج Android SDK Tools رو نصب کنید.

- پکیج Platform-Tools رو توسط SDK Manager پاک کنید و فایلهای Platform-Tools موجود در مسیر SDK رو حذف کنید. بعد مجدداً نصبش کنید.

- به Control Panel برید و مسیر System -> Advanced System settings -> Advanced tab -> Settings-> Advanced tab -> Change رو طی کنید. حالا مقدار initial و Maximum رو به نصف کاهش بدید. (این مقدار تعیین کننده حافظه مجازی/SWAPING هستش)

- در Android Studio به مسیر Tools -> Android -> SDK Manager -> Launch Standalone Sdk manager برید و پکیج هایی که نصب نشده رو نصب کنید.

- شاید لازم باشه فایل adb.exe رو در مسیر X:\Users\YOUR-WINDOWS-USERNAME\AppData\Local\Android\SDK\Platform-Tools کپی کنید.

 

32- برای حل مشکل system_process E/Surface: getSlotFromBufferLocked: unknown buffer راه های زیر رو دنبال کنید:

1- اگر در حین runtime برنامه درخواست permission ای میدید، بهتره در فایل manifest در قسمت uses-permission قید کنید.
2- اگر از اندروید 6.0.0 (Marshmallow) استفاده می کنید به اندروید 6.0.1 upgrade کنید.
3- اگر از backgroun task استفاده می کنید، ابتدا باید task مورد نظر finish بشه و بعد context رو ببندید. یا از getApplicationContext بجای activityContext استفاده کنید.
4- برنامه Android Studio و Emulator رو ببندید و مجدداً باز کنید.
5- شاید فایل java اکتیویتی رو حذف کردید اما xml ش رو حذف نکردید.

 

33- درصوت لود نشدن محتوای لیست(بخاطر مسایل تحریم) SDK Manager به مخازن SDK کمکی موجود در اینترنت مراجعه و آدرس لینک فایلهای XML رو کپی کنید سپس داخل منوی Addon Sites یا زبانه SDK Update Sites برنامه SDK Manager وارد کنید. بعد مجدداً لیست رو refresh کنید. https://mirrors.zzu.edu.cn/android/repository/

 

34- توسط دستور gradle --gui میتونید برنامه Gradle رو در محیط گرافیکی تجربه کنید. (Gradle نسخه 3 و قبل تر)

 

35- تفاوتهای new String("...") و String در جاوا:

اولی رشته ای از نوع literal string هستش (چیزی شبیه به simple string یا premitive ها)
دومی رشته ای از نوع OBJECT هستش

اولی در قسمت method area حافظه ذخیره میشه (یا همون class area)
دومی در قسمت heap حافظه ذخیره میشه (instance خود شی، نه متغیرش)
enlightenedنکته: حوزه ی حافظه Heap برنامه وابسته به runtime برنامست. یعنی با شروع برنامه اشغال و با بستن برنامه تخلیه میشه.

در اولی اگر صدها رشته با یک مقدار ثابت وجود داشته باشه، همگی حین compile یکی و merge میشن و هنگام runtime به یک آدرس در حافظه ارجاع داده میشن
در دومی اگر صدها شی رشته با یک مقدار ثابت وجود داشته باشه، هر کدوم هنگام runtime به یک آدرس جداگانه در حافظه ارجاع داده میشن
enlightenedنکته: مگر اینکه صراحتاً دستور intern() استفاده بشه.

String str2 = new String("Hello").intern();

در اولی دستوراتی مثل substring روی "خود" رشته اعمال میشه
در دومی دستوراتی مثل substring روی "کپی" دیگری از شی اعمال میشه!

اولی حین compile-time پردازش و اعمال میشه
دومی حین run-time پردازش و اعمال میشه

اولی سبک تر و پرفورمنسش بیشتره
دومی سنگین تر و پرفورمنسش کمتره

 

36- نکته جزیی: درصورتی که از javadoc JDK 1.7 استفاده می کنید و از استایل صفحات HTML (مستندات) تولید شده راضی نیستید، میتونید از این Stylesheet استفاده کنید.

 

37- درصورتی که از قابلیت های فریم ورک Google(یا همون Google API) استفاده نمی کنید، نیاز به دانلود و نصب system image های Google و Google API ندارید.

 

38- نکته جزیی: وظیفه نوشتن کدهای تست برای Unit Testing بعهده فرد برنامه نویس هستش نه فرد Tester! زیرا:

- بدلیل حفظ مالیکت کدها/پروژه، Tester نباید به سورس پروژه دسترسی داشته باشه.

- بدلیل مسایل امنیتی و کاهش تهدیدها، Tester نباید به داخل کدها و مکانیزم سیستم دسترسی داشته باشه.

- همچنین Tester قادر نیست به همه ابزارها، سبکها و زبانهای مختلفی که در پروژه استفاده شده مسلط بشه و test case طراحی کنه.

- تنها برنامه نویس هستش به کدهایی که پیاده سازی کرده مسلطه و test case رو در کمترین زمان با بالاترین کیفیت تولید میکنه.

 

39- در صورت بروز خطای Could not resolve all dependencies for configuration ':classpath' در نرم افزار Gradle یکی از راه های زیر رو دنبال کنید:

- مطمعن بشید که ارتباطتون با اینترنت برقرار باشه.

- مطمعن بشید که JDK نسخه 1.8.0 یا جدیدتر روی سیستم نصب باشه.

- اگر از pr0xi داخل فایل gradle.properties یا VPN استفاده می کنید اونرو خاموش کنید و ارتباط اینترنتی تون رو قطع و وصل کنید.

- آدرس repository داخل فایل build.gradle رو به یکی از مخازن زیر تغییر بدید:

repositories {jcenter()}
repositories {mavencentral()}
repositories {google()}
repositories {maven {url 'http://repo1.maven.org/maven2'}}
repositories {maven {url "https://plugins.gradle.org/m2/"}}

repositories {ivy {url "http://repo.mycompany.com/repo"}}

- جدیدترین نسخه نرم افزار JDK رو دانلود و نصب کنید.

- توسط دستور gradle build --refresh-dependencies همه dependency هارو refresh کنید.

- در ویندوز: وارد تنظیمات Network and sharing center سیستم بشید. در سمت چپ گزینه Change adapter setting رو کلیک کنید. روی آیکون network connection تون کلیک راست و گزینه Properties رو انتخاب کنید. در لیست باز شده دوباری روی گزینه IPv4 کلیک کنید. در پنجره باز شده گزینه Use the following dns server addresses رو انتخاب و مقادیر زیر رو وارد کنید:

Preferred DNS server: 208.67.222.222
Alternate DNS server: 208.67.220.220
یا
Preferred DNS server: 8.8.8.8
Alternate DNS server: 8.8.4.4

 

40- آیا میدونید اندروید تصاویر فرمت PNG رو به فرمت Bitmap رندر میکنه؟ فرمتی که پایین ترین حالت فشرده سازی رو داره!

but Android doesn’t keep the file compressed when it loads.  It renders your PNG to a Bitmap, which is the most un-compressed way to store an image.  It’s just a big matrix of pixels with a color value for each pixel.  By default, Android uses the ARGB_8888 format which uses 4 bytes per pixel.

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

1- همیشه از تابع mysql_tquery() بجای mysql_query() استفاده کنید. تابع mysql_tquery از نوع multi-thread هستش و میزان وقفه/lag در سرور رو بسیار کاهش میده. (عملیات رو بین Thread ها تقسیم میکنه)

 

2- درصورتی که از سیستم های ضد hack/cheat استفاده می کنید، همیشه EnableStuntBonusForAll رو 0 قرار بدید.

در غیراینصورت سرور کاربر رو هکر قلمداد میکنه.

 

3- توسط پلاگین crashdetect میتونید crash های سرور رو ردیابی کنید.

https://github.com/Zeex/samp-plugin-crashdetect

نکته: برای استفاده از این پلاگین در ویندوز، مطعمن بشید که VC++ runtime 2010 - VC10 نگارش x86 و x64 رو نصب دارید.

 

4- همیشه دستورات AddPlayerClass() رو در مختصات مناسب و قابل دسترس تنظیم کنید تا در صورت بروز باگ یا مشکلات شبکه ای(packet lost) کاربر به موقعیت مناسبی teleport بشه.

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

💡مقایسه سرعت الگوریتم binary search مقابل الگوریتم linear search برای آرایه های مرتب شده(sorted)

(برای آرایه های عددی سنگین)

 

$needle = range(1, 500000);

 

❌ Linear search algorithm

 

function search(array $numbers, $needle)
{
   $_totalItems = count($numbers);

   for ($i = 0; $i < $_totalItems; $i ++)
   {
      if ($numbers[$i] === $needle)
      {
         return TRUE;
      }
   }

   return FALSE;
}

 

📊 نتیجه(ms)
0.031199932098389
0.031199932098389
0.031199932098389
0.031199932098389
0.031199932098389
0.031199932098389
0.031200170516968
0.031200170516968
0.046799898147583
0.046800851821899

 


✅ Binary search algorithm

 

function search(array $numbers, $needle)
{
   $_low = 0;
   $_high = count($numbers) - 1;

   while ($_low <= $_high)
   {
      $_middle = (int) (($_low + $_high) / 2);
      if ($numbers[$_middle] > $needle)
      {
         $_high = $_middle - 1;
      }
      else if ($numbers[$_middle] < $needle)
      {
         $_low = $_middle + 1;
      }
      else
      {
         return TRUE;
      }
   }

   return FALSE;
}


📊 نتیجه(ms)
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0

 

x64 Hardware
32bit OS
PHP 5.6 CLI

کد از کتاب "PHP 7 Data Structures and Algorithms"

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

در Java چندین کلاس برای نوشتن و خواندن ورودی و فایلهای متنی وجود داره... اما کدام کلاس مناسبتره، کدام سریعتره و کدام نیازهای کاربر رو برطرف میکنه؟

 

  • کلاس BufferedReader

برای خواندن ورودی/فایل stream بصورت خط به خط از نوع string.

دارای بیش از 20 متد public داخلی.

پشتیبانی از متد close() برای بستن file handle.

این کلاس thread-safe هست. (میتوان BufferedReader رو در بین thread ها share کرد)

توانایی خواندن ورودی از System.in (یا stdin)

دارای حافظه buffer با سایز 8 کیلوبایت.

میتواند کلاس FileReader و InputStreamReader رو بعنوان reader در سازنده دریافت کند.

این کلاس synchronized هست.

پیاده سازی شده در JDK 1.1 و جدیدتر.

دارای کمترین system calls و کاملاً بهینه.

در صورت وقوع استثنا IOException اونرو throw میکنه.

عدم پشتیبانی از Encoding بصورت مستقیم.

زیر مجموعه پکیج java.io.

دارای پرفورمنس بالا نسبت به کلاسهای Scanner و FileReader.

توانایی خواندن ورودی فقط با نوع string.

مناسب برای محیط های multi-thread.

مناسب برای خواندن متن/ورودی طولانی بصورت string و خط به خط. (مثل فایلهای log, books)

 

 

  • کلاس Scanner

برای خواندن ورودی/فایل بصورت parse کردن داده های نوع primitive. (مثل int, long, double, string)

دارای بیش از 60 متد public داخلی.

پشتیبانی از متد close() برای بستن file handle.

این کلاس thread-safe نیست. (نمیتوان Scanner رو در بین thread ها share کرد)

توانایی خواندن ورودی از System.in (یا stdin)

دارای حافظه buffer با سایز 1 کیلوبایت.

میتواند کلاس FileReader و BufferedReader رو بعنوان reader در سازنده دریافت کند.

این کلاس synchronized نیست.

پیاده سازی شده در JDK 1.5 و جدیدتر.

دارای system calls پایین و تقریباً بهینه.

در صورت وقوع استثنا IOException اونرو مخفی میکنه.

عدم پشتیبانی از Encoding بصورت مستقیم.

زیر مجموعه پکیج java.util.

دارای پرفورمنس پایین نسبت به کلاسهای BufferedReader و FileReader.

توانایی خواندن ورودی با نوع int, long, string, float...

به دلیل استفاده از regular expression حافظه/CPU بیشتری نسبت به کلاس BufferedReader مصرف میکنه.

مناسب برای خواندن متن/ورودی و parse کردنش توسط delimiter. (مثل فایلهای xml, ini, config, json)

 

  • کلاس FileReader

برای خواندن فقط فایل از نوع string.

دارای 20 متد public داخلی.

پشتیبانی از متد close() برای بستن file handle.

عدم توانایی خواندن ورودی از System.in (یا stdin)

بدون قابلیت buffer.

پیاده سازی شده در JDK 1.1 و جدیدتر.

دارای بیشترین system calls و بسیار کند.

در صورت وقوع استثنا IOException اونرو throw میکنه.

عدم پشتیبانی از Encoding. (درواقع پیشفرض platform رو استفاده میکنه)

زیر مجموعه پکیج java.io.

دارای پرفورمنس بسیار پایین نسبت به کلاسهای Scanner و BufferedReader.

توانایی خواندن ورودی فقط با نوع string.

بهتر است بصورت مستقیم استفاده نشود.

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

 

کتابخانه 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

 

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

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

 

ابتدا باید بگم استاندارد رسمی برای سبک ها و workflow ها وجود نداره، اما در این مقاله سعی می کنم از تجربیاتم، قوائد همگانی و معمولترین موارد موجود در Atlassian، Kernel و git manpage استفاده کنم...

 

مقالات مرتبط:

دانلود، نصب و راه اندازی Git در ویندوز

ساخت SSh key در ویندوز

ساخت SSh key در لینوکس

کدام پروتکل: //:git یا //:ssh یا //:https

 

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

  • Branch / انشعاب
  • Commit
  • تنظیم / config
  • گوناگون

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

 

در ادامه مقاله قبلیم که شماره یک "نکات و اصول مهم در برنامه نویسی PHP" بود، در این مقاله شماره دو همین موضوع رو ارائه میدم...

 

1- هنگام Multi-thread کردن کدهاتون فراموش نکنید برای دسترسی به اشیاء lazy-initialize(یا همون load on demand) وضعیت نهایی شی باید synchronize باشه تا با مشکل race condition مواجه نشید.

 

2- برای نرمال سازی ستونها و جلوگیری از افزونگی/redundancy داده باید از اصول زیر پیروی کنید:

- هیچ ستونی نباید بیشتر از یک نوع/type داده رو نگهداری کنه. (مثل int + char + float...)

- هیچ ستونی نباید داده های تکراری/مشابه به دیگر ستون ها رو در خودش نگهداری کنه.

- داده هارو در جداول مختلف نگهداری کنید و درصورت لزوم اونهارو توسط کلید خارجی/foreign key بهم متصل کنید.

 

3- جهت افزایش پرفورمنس، همیشه کلاس والد و اینترفیس رو در خطوط قبل از کلاس ارث بر تعریف کنید. در غیراینصورت موتور PHP برای پیدا و پردازش کردن کلاس والد مجبور به انجام عملیات های اضافی خواهد شد. (بر اساس OpCode تولید شده)

interface IData 
{
}

class MyClass implements IData
{
}

نکته: حتی اگر در فایلهای جداگانه تعریفشون می کنید این قائده باز هم باید رعایت بشه.

 

4- یادتون باشه که Dependency Injection نه تنها از طریق Constructor، بلکه از طریق Setter, Interface و Property هم قابل انجامه.

نکته: زمانی از نوع Constructor استفاده کنید که کل کلاس نیازمند به اون dependency هستش یا شی dependency نباید در طول life time تغییر بکنه.

 

5- آیا می دونید تابع runkit_function_remove علاوه بر حذف قید تابع(function table)، مقدار حافظه اشغال شده توسط تابع رو هم آزاد می کنه؟

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

 

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

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

php-internals

لینک Stackoverflow.com

 

کاملترین و دقیق ترین چارت PHP internals موجود در اینترنت! heart

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

 


CLASSPATH: برای استفاده ClassLoader های خود Java طراحی شده و حاوی bytecode(در Java با پسوند class یا JAr) و nativecode(در C با پسوند o. یا obj.) های کامپایل شده هستش. درواقع بخشی از پکیج اصلی Java/C هستش و به برنامه java و javac اعلام میکنه که فایلهای کامپایل شده در کجا قرار دارن.

بصورت پیشفرض، محل فیزیکی CLASSPATH به پوشه "جاری" و پوشه lib در JDK/JRE نصب شده اشاره میکنه. اما اگر بخوایید میتونید این مسیر رو تغییر بدید.

توجه: با اضافه کردن کتابخانه به CLASSPATH، کتابخانه مورد نظر در تمام پروژه ها قابل استفاده هستش، لیکن بصورت Relative link.

نکته: مقدار CLASSPATH میتونه توسط پارامتر -cp در برنامه java و javac و خاصیت Class-Path در فایل manifest.mf تغییر پیدا کنه. اما نهایتاً خاصیت Class-Path در فایل manifest.mf نسبت به CLASSPATH و پارامتر -cp اولویت داره!

نکته 2: همیشه علاوه بر مسیر lib خود JDK/JRE، مسیر جاری رو هم توسط نقطه . در CLASSPATH اضافه کنید.

نکته 3: در صورت وجود کتابخانه در همه مسیرهای موجود در CLASSPATH، همیشه اولین مسیر انتخاب خواهد شد.

نکته 4: این تنظیم در برنامه Eclipse در مسیر Preferences -> [Java/C] -> Build path -> Classpath قرار داره.

- مشکل ClassNotFoundException: از نوع Exception هستش و زمانی پرتاب میشه که برنامه جاوا بصورت Dynamic سعی در load کردن کلاس موردنظر حین Run-time از مسیر CLASSPATH کنه اما نتونه پیداش کنه.

- مشکل NoClassDefFoundError: از نوع Error هستش و زمانی بوجود میاد که کلاس موردنظر در مسیر CLASSPATH حین Compile-time وجود داره اما حین Run-time وجود نداره.

 

Include path: برای تفسیر/parse پروژه(مثل C یا PHP) طراحی شده، حاوی فایلهای header، سورس یا inc هستش، کد completion رو اعمال میکنه و کلاً برای پیدا کردن محتوا و منابع استفاده شده در پروژه هستش.
نکته: البته path منابع باید بصورت relative باشه تا توسط Eclipse پردازش بشه. (relative path = ./file.jpg, absoloute path = c:\www\root\test\file.jpg)

 

Build path: برای ساخت/compile پروژه طراحی شده، حاوی سورس ها و کتابخانه های پروژه هستش، در مسیر Project -> Properties -> Build path قرار داره، بخشی از workspace ویرایشگر هستش، به ویرایشگر/IDE اعلام میکنه که فایلهای سورس پروژه در کجا قرار دارن... همچنین فقط مختص ویرایشگر/IDE هستش و در هر ویرایشگری به محل متفاوتی اشاره میکنه. (مثل VS, Eclipse, Borland...)

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

 

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

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

JNI, JVM internal, Class Loader, Execution Engine


کاملترین و دقیق ترین چارت Java/JVM internals  موجود در اینترنت! heart

نکته اینکه درمورد جاوای داخل اندروید روال به همین شکله منتها از Java bytecode به بعد:
1- توسط ابزار DEx Compiler اندروید، بایت کدها به Dalvik bytecode تبدیل میشن.
2- بجای پکیج JRE، اندروید از DVM/ART استفاده میکنه و همینجا هم اپلیکشن رو اجرا میکنه.

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