یوشا آل ایوب

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

یوشا آل ایوب

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

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

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

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

(آخرین مقاله از این سری آموزش های PHP)

 

1- برای بدست اوردن میزان حافظه مصرف شده باید از دستور memory_get_usage(FALSE) استفاده کنید و برای میزان حافظه رزرو شده باید از دستور memory_get_usage(TRUE) استفاده کنید.

اما این نکته در مستندات سایت PHP.net برعکس توضیح داده شده:

int memory_get_usage ([ bool $real_usage = FALSE ] )

Returns the amount of memory, in bytes, that's currently being allocated to your PHP script.

 

2- زمانی از دستور strcmp استفاده کنید که قراره مقدار رشته ها شمارش(کمتر/بیشتر) بشن، درغیراینصورت استفاده از اپراتور === برای برابر بودن/نبودن رشته ها بهترین گزینست.


3- آیا میدونید به 4 روش مختلف میتونید تصاویر رو در مرورگر نمایش/output بدید؟

header('Content-Type: image/jpg');
$image = imagecreatefromjpeg('yourfilename.jpg');
header('Content-Length: ' . filesize('yourfilename.jpg'));
imagejpeg($image);
imagedestroy($image);

و

header('Content-Type: image/jpg');
header('Content-Length: ' . filesize('yourfilename.jpg'));
readfile('yourfilename.jpg');

و

header('Content-Type: image/jpg');
header('Content-Length: ' . filesize('yourfilename.jpg'));
echo file_get_contents('yourfilename.jpg');

و

header('Content-Type: image/jpg');
header('Content-Length: ' . filesize('yourfilename.jpg'));
header('X-Sendfile: ' . 'yourfilename.jpg'); 
exit;

 

4- اگر از PHP CLI در محیط text UI سیستم عامل استفاده می کنید و مشکلات output و نمایشی دارید، بهتره از دستور passthru استفاده کنید.

 

5- نکته جزیی: فراموش نکنید که تابع json_decode فقط اعضای public شی موردنظر رو تبدیل میکنه، و نه private / protected.

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

بدون استفاده از عبارت 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 "نباشه" خروجیش صحیحه و میشه این:
آ ب پ ت ث ج چ ح خ د ض ر ز ش

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

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

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

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

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

enlightened اما برای نمایش درست کلمات در خود دیتابیس لازمه که از set_charset و SET NAMES UTF8 استفاده کنید.

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

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

نکاتی برای افزایش امنیت وبسایت

 

1- حتاالمکان از کتابخانه های template engine برای کدنویسی لایه View/UI وب اپلیکیشن استفاده کنید و نه کدنویسی inline/mixed.

 

2- برای کاهش مصرف پهنای باند و افزایش سرعت سایت، همیشه فایلهای CSS, JavaScript, HTML رو minify و lint کنید:

CSS:

https://github.com/purifycss/purifycss

https://cssnano.co/guides/getting-started

https://github.com/ben-eb/cssnano-cli

https://github.com/css/csso-cli

https://github.com/uncss/uncss

JS:

https://github.com/nolanlawson/optimize-js

 

3- بطور منظم و ماهیانه پهنای باند وبسایت/سرور رو چک کنید.

 

4- یک سیستم اسکنر پیاده کنید که نوع دسترسی و زمان تغییر فایلها و دایرکتوری های کل سایت رو اسکن و به شما گزارش کنه.

 

5- از استفاده بیش از حد کوکی و ذخیره اطلاعات حساس/نمایشی  در داخلشون خودداری کنید.

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

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

نکات و اصول مهم در طراحی وبسایت

نکاتی برای افزایش امنیت وبسایت

#2 - نکاتی برای افزایش امنیت وبسایت

 

 

1- از صفت alt در تگهای img و از صفت title در تگهای link استفاده کنید. صفت alt بیانگر خلاصه ای از محتوای تصویر موردنظر هستش.


2- فراموش نکنید که محل کنونی آدرسهای Font در فایلهای CSS از همان مسیر Relative فایل CSS شروع می شوند.


3- Link های صفحات را چک کنید و از سالم بودنشان مطمئن بشید.


4- شکل ظاهری صفحات جداگانه را با شکل ظاهری صفحات اصلی یکنواخت کنید.


5- به عملا و دیکطه لقاط دغط کنید!

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

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

#2 - نکاتی برای افزایش امنیت وبسایت

 

 

1- مکانیزم و شیوه کار پروتوکل HTTP رو کامل فرا بگیرید.

 

2- همیشه کتابخانه ها و فریم ورکهای استفاده شده در اپلیکیشن رو بروز نگه دارید!

 

3- جهت جلوگیری از click-jacking مقدار هدر X-Frame-Options رو DENY قرار بدید:

Apache httpd.conf:

Header always append X-Frame-Options DENY


Apache .htaccess:

Header append X-FRAME-OPTIONS "DENY"


Nginx:

add_header X-Frame-Options "DENY";


PHP:

header('X-Frame-Options: DENY');

 

4- بصورت هفتگی یا ماهیانه کل سایت رو توسط نرم افزارها و سایتهای اسکنر امنیتی چک کنید:

https://observatory.mozilla.org

https://securityheaders.com

https://urlvoid.com

https://virustotal.com
https://immuniweb.com/websec
https://detectify.com
http://amn.bayan.ir
https://ssllabs.com/ssltest/index.html

http://isithacked.com
https://app.upguard.com/webscan
https://app.webinspector.com/online_scan
https://suip.biz/?act=sqlmap
https://pentest-tools.com/home
https://sitecheck.sucuri.net
https://quttera.com
https://siteguarding.com

https://transparencyreport.google.com/safe-browsing/search

 

5- داده های ورودی توسط کاربر را بدقت بررسی، برش و فیلترسازی کنید!

 

6- برای اپلیکیشن، قابلیت debug mode درست کنید تا در مواقع لزوم بتونید فعالیت های اپلیکیشن رو مانیتور و خطازدایی کنید.

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

programming mistakes

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

مقایسه پرفورمنس(startup, rendering, event handling):

Windows
FLTK > wxWidgets > GTK > Qt

Linux
FLTK > GTK > (wxWidgets / Qt)

نکته: در اینجا منظور از GTK نسخه GTKmm هستش که wrapper/مخصوص  ++C  هستش.
نکته 2: عناصر کتابخانه  wxWidgets صددرصد native هستن. اما عناصر کتابخانه FLTK و Qt و GTK فقط "شبیه" به native هستن. که برای این شبیه سازی از CSS و API های theming سیستم استفاده می کنن.


این توضیحات رو هم در نظر بگیرید:
- کتابخانه FLTK از نظر استایل بهترین گزینه برای لینوکس با محیط EDE هستش. از نظر فضای دیسک، بسیار کم حجم هستش. پرفورمنس بالاتری نسبت به بقیه کتابخانه ها داره. استفاده ازش آسون هست. از بعضی دیگر زبانهای برنامه نویسی هم پشتیبانی میکنه. در ویندوز برروی WinAPI، در لینوکس برروی X Window و در مک بر روی Quartz سوار هست. FLTK بعضی از widget های مدرن مثل Treeview رو نداره. بعضی از widget ها حالت RTL (راست به چپ) رو ندارن.

 

- کتابخانه wxWidgets از نظر استایل بهترین گزینه برای ویندوز و مک و لینوکس هستش. از نظر فضای دیسک، حجیم هستش. یادگیری و استفاده ازش کمی سخته. UI designer هم داره. از خیلی زبانهای برنامه نویسی پشتیبانی میکنه. در لینوکس بر روی کتابخانه GTK قرار داره و در پشت پرده از API های GTK استفاده میکنه. wxWidgets فقط کتابخانه GUI نیست، یک فریم ورک محسوب میشه.

 

- کتابخانه GTK از نظر استایل بهترین گزینه برای لینوکس با محیط Cinnamon, GNOME, XFCE یا Mate هستش. یادگیری و استفاده ازش آسونه. UI designer هم داره. از خیلی زبانهای برنامه نویسی پشتیبانی میکنه.

 

- کتابخانه Qt از نظر استایل بهترین گزینه برای لینوکس با محیط KDE, TDE یا LXQt هستش. از نظر فضای دیسک، حجیم هستش. یادگیری و استفاده ازش بواسطه Qt Creator آسونه. UI designer هم داره. از خیلی زبانهای برنامه نویسی پشتیبانی میکنه. امکانات غیر استاندارد هم داره(meta-object). طیف گسترده تری از platform ها رو در بر گرفته. Qt فقط کتابخانه GUI نیست، یک فریم ورک هستش.  برای پروژه های غیر opensource باید مجوز داشته باشید. از مدل برنامه نویسی reactive پشتیبانی می کنه. (به کمک شتابدهنده گرافیکی میشه بار سنگین رندر رو از روی پردازنده برداشت، بنابراین باعث افزایش پرفورمنس میشه)

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

1- تفاوت HashMap و HashTable:

 

کلاس HashMap از نوع synchronize نیست پس thread-safe نیست. اما کلاس HashTable از نوع synchronize هستش.
کلاس HashMap بخاطر synchronize نبودن کمی سریعتر از HashTable عمل میکنه.
کلاس HashMap اجازه داشتن یک کلید null و چندین مقدار null رو داره، اما کلاس HashTable همچین اجازه ای رو نداره.
کلاس HashMap زیرکلاس AbstractMap هستش، اما کلاس HashTable زیرکلاس Dictionary هستش.
کلاس HashTable تقریباً منسوخ شده و باید از جایگزینش ConcurrentHashMap استفاده بشه.
و...

در بیشتر موارد کلاس HashMap استفاده میشه، درصورتی که synchronization در اولویت نباشه.

 

2- برای حل مشکل ValueError: unsupported pickle protocol در لینوکس کافیه فایل .repopickle_.gitconfig در Android SDK رو پیدا و حذف کنید.

 

3- اصول طراحی کلاس:

- همیشه داده ها و فیلدها رو private نگهدارید و از اصول encapsulation پیروی کنید.

- همیشه فیلدها رو initialize کنید.

- هرکلاس رو به یک نوع/دسته از داده اختصاص بدید.

- کلاسهای چند منظوره با چند مسئولیت طراحی نکنید، بلکه آنها را تجزیه و جداسازی کنید.

- بی دلیل برای همه فیلدها و داده ها accessor و mutator طراحی نکنید. (set/get)

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

- حتاالمکان کلاسها رو immutable (غیرقابل تغییر) طراحی کنید.

- بجای استفاده مکرر تودرتو if/else switch foreach از interface یا کلاس abstract استفاده کنید.

- حتاالمکان کلاس رو static طراحی نکنید. (بخاطر global state و مشکلات unit testing)

- از نوشتن متدهای طولانی و سنگین خودداری کنید. معمولاً متدهای طویل نشاندهنده رفتار و وظایف متعدد هستش که نیاز به تجزیه و refactoring داره.

- از قانون DRY (مخفف Don’t Repeat Yourself) پیروی کنید... متدهای تکراری رو با ساخت superclass abstract یکی کنید.

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

 

1- جهت پشتیبانی از ارث بری چندگانه در PHP میتونید توسط trait ها اون رو شبیه سازی کنید.

trait PHP
{
   public function printPHP()
   {
      echo 'PHP ';
   }
}
trait Java
{
   public function printJava()
   {
      echo 'Java ';
   }
}
trait PHPJava
{
   use PHP, Java;
}
class ProgrammingLanguages
{
   use PHPJava;
}

 

2- اگر در حین کار با Composer یا PHPUnit با خطای module openssl is already installed on Unknown in line 0 مواجه شدید، کافیه اکستنشن openssl رو در PHP.ini غیرفعال کنید:

ویندوز
;extension=php_openssl.dll

لینوکس
;extension=php_openssl.so

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

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 رو بهش بدید...

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