1- حتی الامکان دایرکتیوهای using
رو بداخل namespace
منتقل کنید و در خارج از محدوده namespace رها نکنید.
StyleCop: SA1200: UsingDirectivesMustBePlacedWithinNamespace
namespace ConsoleApp1 { using System; using System.Collections.Generic; using System.Text; class Program { private static void Main(string[] args) { } } }
نکته: درصورتیکه فقط یک namespace
در فایل موردنظر موجود باشه.
2- همیشه reference های بلااستفاده رو از پروژه حذف کنید.
نکته: البته هنگام کامپایل برنامه، همه reference های استفاده نشده حذف میشن، ولی خب همیشه محیط کدنویسی رو تمیز و خلوت نگه دارید.
3- همیشه دایرکتیوهای using
بلااستفاده(خاکستری رنگ) رو از کلاسها حذف کنید.
using System.Drawing; using System.Resources; // <----- using System.Reflection; // <----- using System.Runtime.InteropServices; // <----- using System; using System.Windows.Forms;
4- جهت بازگشت چندین مقدار از یک متد میتونید از کلمه کلیدی ref
یا out
یا پرانتز (type1, type2, typeN) یا حتی Tuple
استفاده کنید:
public Tuple <int, string, string> GetStudent() { int studentId = 11; string firstName = "Alex"; string lastName = "Koertson"; return Tuple.Create(studentId, firstName, lastName); }
نکته: Tuple
از نوع reference type هستش و حداکثر ظرفیت 8 عنصر رو داره. همچنین از دات نت نسخه 4 و جدیدتر در دسترسه.
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
.
نکته: وظیفه نوشتن کدهای تست برای Unit Testing بعهده فرد برنامه نویس هستش نه فرد Tester. زیرا:
- بدلیل حفظ مالکیت کدها/پروژه، Tester نباید به سورس پروژه دسترسی داشته باشه.
- بدلیل مسایل امنیتی و کاهش تهدیدها، Tester نباید به داخل کدها و مکانیزم سیستم دسترسی داشته باشه.
- همچنین Tester قادر نیست به همه ابزارها، سبکها و زبانهای مختلفی که در پروژه استفاده شده مسلط بشه و test case طراحی کنه.
- تنها برنامه نویس هستش به کدهایی که پیاده سازی کرده مسلطه و test case رو در کمترین زمان با بالاترین کیفیت تولید میکنه.
بدون استفاده از عبارت SET NAMES utf8 در دیتابیس: اگر انکودینگ فایل موردنظر 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 باشه/نباشه خروجیش میشه این:
Â È Ê Ë Ì Í Î Ï Ö Ñ Ò Ô اگر انکودینگ فایل موردنظر UTF8 باشه، تگ meta صفحه UTF8 باشه، اما charset دیتابیس utf8_persian_ci "نباشه" خروجیش صحیحه و میشه این:
آ ب پ ت ث ج چ ح خ د ض ر ز ش
می بینید که حتی بدون استفاده از عبارت SET NAMES utf8 باز هم میشه "خروجی" صحیح رو گرفت.
با استفاده از عبارت SET NAMES utf8 در دیتابیس: اگر 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 باشه خروجیش میشه این:
" " اما برای نمایش درست کلمات در خود دیتابیس لازمه که از set_charset و SET NAMES UTF8 استفاده کنید.
مسئله Thread و Process دو موضوع نزدیک به هم ولی متفاوت هستن...
1- Process مستقل هستش، ولی Thread ها بخشی از یک Process هستن. (یعنی یک Process میتونه چندین Thread بوجود بیاره)
2- هر Process حافظه اختصاصی خودش رو داره، ولی Thread ها از حافظه اشغال شده Process استفاده می کنن. (یعنی هر Process حافظه خودش رو با Thread های خودش به اشتراک میذاره)
3- هر Process شامل یک برنامه و PID انحصاری هستش، ولی هر Thread شامل مجموعه ای از دستورالعمل ها و Stack انحصاری هستش.
4- هر Process درواقع یک Task هستش، ولی هر Thread یک Light wight process هستش.
5- Process ها توسط IPC (یا همون Inter-process communication) با یکدیگر ارتباط برقرار می کنن، ولی Thread ها توسط دستورات برنامه نویسی (در زبان PHP و Java توسط wait, notify و در زبان C توسط pthread_cond_wait, pthread_cond_signal) با یکدیگر ارتباط برقرار می کنن.
6- ساخت Process به سختی توسط duplicate کردن Process والد انجام میشه، ولی ساخت Thread براحتی توسط کپی شی Thread انجام میشه.
7- برای اجرای چند Process بطور موازی/parallel به یک سیستم Multi-Process نیاز هست، ولی برای اجرای چند Thread بطور همزمان به دستورات برنامه نویسی نیاز هست.
8- بطور کلی Process توسط CPU کنترل میشه، ولی Thread توسط Process کنترل میشه.
9- هر Process یک Thread main داره، ولی هر Thread فقط خودشه که کارگر/worker صدا زده میشه.
10- Process در فضای separate memory اجرا میشه، ولی Thread در فضای Shared memory اجرا میشه.
11- اگر یک Process کرش کند، معمولاً روی Process های دیگر تأثیر نمی گذارد. اما اگر یک Thread کرش کند، کل Process و تمام Thread های آن از کار می افتند.
12- ایجاد Process جدید هزینه بر است چون نیاز به اختصاص منابع جدید (حافظه، FD و...) دارد. اما ایجاد Thread بسیار سبک تر است چون منابع Process والد را به اشتراک می گذارد.
13- Process ها در تمام سیستم عامله ا به صورت استاندارد پیاده سازی شده اند. اما پیاده سازی Thread ها بین سیستم عامل ها متفاوت است (مثلاً Thread های POSIX در لینوکس vs Windows Threads).
و...
مقالات مرتبط:
نکاتی برای افزایش امنیت وبسایت
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- به عملا و دیکطه لقاط دغط کینید!
- برآورد مشکلات سیستم
- بررسی کلی سخت افزار
- بررسی کلی نرم افزار
سخت افزار
- پاکسازی داخل سیستم و مادربورد
- سرویس CPU و فن CPU
- سرویس Power supply و فن Power supply
- پاکسازی موس، کیبورد و مانیتور
- تهیه باطری جدید برای CMOS/BIOS
- پاکسازی سوکت ها و پورت های سیستم
[- قطع و غیرفعال کردن مودم Dialup]
[- قطع و غیرفعال کردن درایو Floppy]
- تعویض کابلهای کهنه/آسیب دیده
- ریست و تنظیم مجدد مانیتور
- بررسی کابلهای داخل و بیرون سیستم
نرم افزار
- بک آپ گیری از اطلاعات!
- آپدیت Firmware مادربورد(BIOS EEPROM)
- ریست و تنظیم مجدد BIOS/CMOS
- فرمت(wipe) دوره ای عمقی پارتیشن ها یا کل دیسک
- نصب مجدد سیستم عامل
[- ریستارت سیستم عامل بعد از انجام تنظیمات]
- تنظیم تاریخ و ساعت سیستم
- نصب نرم افزارهای کتابخانه ای/Runtime
- دانلود [و رایت] و نصب Driver ها
- حذف نرم افزارهای بلااستفاده و مزاحم
- پاکسازی فایلها و پوشه های اضافی و temp
[- بهینه سازی و تنظیم رجیستری]
- نصب و بروزرسانی نرم افزارهای کاربردی
- نصب ضدبدافزار سبک و قدرتمند
- بروزرسانی ضدبدافزار
- اسکن کل پارتیشن ها توسط ضدبدافزار
- بهینه سازی تنظیم سرویس ها
- Defrag/Optimize پارتیشن ها(بجز SSD ها)
- پاکسازی و تنظیم startup سیستم عامل
- پاکسازی system restore point ها
شبکه
- پاکسازی کش DNS و ریست Socket سیستم
- آپدیت Firmware مودم ADSL/DSL
- تنظیم subnet mask مودم به 255.255.255.128 یا بالاتر
- تنظیم Subnet prefix مودم به 25
- تنظیم DNS مودم به 208.67.222.222 و 8.8.8.8
- تنظیم Security protocol مودم به WPA2 یا WPA3
- خاموش کردن قابلیت WPS مودم
- پنهان کردن SSID مودم