یوشا آل ایوب

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

یوشا آل ایوب

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

یوشا آل ایوب

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

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

۷۰ مطلب با موضوع «کامپیوتر» ثبت شده است

 

 

دیدم بعضی از کاربران برنامه Eclipse (چه ایرانی چه خارجی) در تفکیک و مفهوم CLASSPATH, Build path, Include path مشکل دارن، گفتم اینو بنویسم تا کمی از ابهامات رو برطرف کنم...

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

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

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

نکته 2: همیشه علاوه بر مسیر lib خود JDK، مسیر جاری رو هم توسط نقطه . در 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 استفاده میکنه و همینجا هم اپلیکشن رو اجرا میکنه.

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

 

ظاهراً در PHP (در ویندوز) هرچیزی بعد از دستور exit بصورت ناقص(!) پردازش میشه ولی بصورت کامل حافظه مورد نیازش رو allocate میکنه...

 

خروجی یک صفحه ساده:

<?php

echo memory_get_usage();

// 217992

 

خروجی یک صفحه متغیر دار ولی exit شده:

<?php

echo memory_get_usage();

// 220552

exit; // <---------- !!

$simpleVar = 'abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabc​dabcdabcdabcdabcdabcd';
$simpleVar .= '​abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabc​dabcdabcdabcdabcdabcd';
$simpleVar .= '​abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabc​dabcdabcdabcdabcdabcd';
$simpleVar .= '​abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabc​dabcdabcdabcdabcdabcd';
$simpleVar .= '​abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabbcdabc​dabcdabcdabcdabcdabcd';
echo $simpleVar; 

enlightened

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

مسله indentation در کدنویسی جزییه و بیشتر شخصیه... ولی گفتن نکاتی درموردش خالی از لطف نیست

اول اینکه بیشتر Coding-style های موجود در اینترنت بروزرسانی نمیشن یا برای ویرایشگرها و مانیتورهای قدیمی طراحی شدن... یا حتی ناقصن! دوم اینکه چقدر خوب بود اگر مرجع رسمی براشون وجود داشت تا یک الگو، الگوی همگان میشد. نه اینکه هر شرکت و تیمی برای خودش یه سبک رو طراحی و تعیین کنه و اسمشو بذاره قرارداد/convention رسمی!

فکر کنید برنامه نویسایی که با دو یا چند زبان مختلف برنامه نویسی میکنن، برحسب عادت چقدر براشون سخته که از قوائد مختلف پیروی کنن...

Tab:

  • سایزش در هر ویرایشگر و کامپیوتری متفاوته. (در یکی به اندازه 3 فاصله، در دیگری 4 در دیگری 5 و...)
  • میشه گفت Dynamic هستش و سایزش براحتی با تنظیم کردن سیستم/ویرایشگر قابل تبدیله.
  • در بعضی از پرینترها نادیده گرفته میشه، درنتیجه قالب کدها بهم میریزه.
  • Tab با سایز 3، یک کاراکتره.
  • معمولاً حذف و اضافه کردن Tab زمان کمتری صرف میکنه.
  • فلسفه وجود Tab برای tabulation/جدول بندی و پرش هستش.
  • در صفحات استاتیک وب، Tab پرفورمنس (جزیی) بالاتری در Load شدن داره. 
  • برای indentation کردن کلیدکمتری لازمه تا فشار داده بشه. (مگر ویرایشگرهای حرفه ای)
  • در بعضی از ویرایشگرهای تحت وب هنگام copy/paste نادیده گرفته میشه.
  • همتراز/Alignment کردن توسط Tab بهتر انجام میشه.

Space:

  • اندازش در همه ویرایشگرها و کامپیوتر ها ثابته.
  • میشه گفت Static هستش و معمولاً سایزش توسط تنظیمات قابل تبدیل نیست. (مگر ویرایشگرهای حرفه ای)
  • در همه پرینترها اعمال میشه، پس قالب کدها بهم نمیریزه.
  • Space با سایز 3، 3 کاراکتره.
  • معمولاً حذف و اضافه کردن Space زمان بیشتری صرف میکنه.
  • فلسفه وجود Space برای قراردادن فضای خالی هستش.
  • در صفحات استاتیک وب، Space پرفورمنس (جزیی) پایینتری در Load شدن داره. 
  • در هیچ کدوم از ویرایشکرهای تحت وب هنگام copy/paste نادیده گرفته نمیشه.
  • برای indentation کردن کلید بیشتری لازمه تا فشار داده بشه. (مگر ویرایشگرهای حرفه ای)
  • همتراز/Alignment کردن توسط Space سخت تر انجام میشه.

پیشنهاد من: یک TAB یا سه SPACE.

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

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

 

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));

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

چند وقت پیش یکی از اعضای انجمن IranPHP سوالی درباره "سنجش دانش و سطوح برنامه نویسی" کرد که منم اینطور پاسخ دادم:

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

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

 

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 رو غیرفعال کنه. بنابراین سرعت پردازش برنامه افزایش و کارایی برنامه بهبود پیدا می کنه.

۳ نظر ۹۵/۱۰/۲۳
یوشا آل ایوب
  • Version چیست

Version یا همون نسخه، مشخصه ای برای دسته بندی وضعیت محصول منتشر شده و [مختصر] شرحی از تغییرات انجام گرفته هستش.

به این معنی که Version یک محصول، بیانگر حال و روز کنونی و مقدار بهبود یافتگی اون محصول هستش... یا حتی آینده ای که در انتظارشه!

مشخصه Version می تونه بصورت عدد، کلمه و تاریخ باشه; یا حتی هر سه:

Major.Minor.Revision/Patch[-/.Build] [ReleaseState] [Architecture[Date] [Time]

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

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

 

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 هست و فقط یکبار بارگذاری میشه.

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

Virtual File System یا سیستم فایل مجازی

 

Virtual File System(مخفف VFS) یک ساب سیستم مهم در Kernel لینوکس هست که لایه بین filesystem و برنامه های user-space رو تشکیل میده. درواقع همه filesystem ها، با تکیه بر VFS می تونن شناسایی بشن و تبادل اطلاعات کنن. همین مسئله، برنامه های user-space رو قادر کرده که توسط دستورات موجود در VFS برای خواندن و نوشتن در filesystem های گوناگون اقدام کنن:

 

نکته: در اینجا منظور از لایه، همون Abstraction layer و منظور از دستورات، همون System call/SysCall هستش.

نکته 2: البته به برکت wrap های Gnu C Library، کمتر پیش میاد که برنامه user-space نیاز به استفاده از System call داشته باشه.

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