در این مقاله با شیوه استفاده از CSS روی فرمهای HTML برای زیباتر ساختن آنها آشنا میشویم. البته این کار ممکن است کمی پیچیده باشد. ویجتهای فرم به دلایل تاریخی و فنی به خوبی با CSS همکاری نمیکنند. به دلیل همین دشواریها، توسعهدهندگان زیادی تلاش میکنند که ویجتهای HTML خاص خود را بسازند و روی ظاهر و حس آنها کنترل کاملی داشته باشند. با این حال، طراحان وب با استفاده از بسیاری از مرورگرهای مدرن کنترل هر چه بیشتری روی طراحی عناصر فرم پیدا کردهاند. برای مطالعه بخش قبلی این سری مطالب آموزشی روی لینک زیر کلیک کنید:
در روزهای آغازین ظهور وب یعنی حدود سالهای 1995، کنترلهای فرم بر حسب خصوصیتهای HTML 2 به این زبان اضافه شدند. به دلیل پیچیدگی ویجتهای فرم، پیادهسازیکنندگان تصمیم گرفتند که برای مدیریت و رندر آنها روی سیستم عامل تکیه داشته باشند.
چند سال بعدتر که CSS خلق شد بر حسب ضرورت فنی از ویجتهای بومی برای پیادهسازی کنترلهای فرم به دلیل الزام به استایلبندی استفاده شد. در روزهای آغازین CSS استایلبندی کنترلها یک اولویت محسوب نمیشد.
از آنجا که کاربران به ظاهر بصری پلتفرمهای متناظرشان خو کرده بودند، ارائهدهندگان مرورگر تمایل چندانی به فراهم ساختن قابلیت استایلبندی کنترلها نداشتند. تا به امروز این وضعیت همچنان یک مشکل جدی برای بازسازی همه کنترلها جهت ایجاد قابلیت استایلبندی محسوب میشود.
حتی امروزه نیز هیچ مرورگر منفردی به صورت کامل CSS2.1 را پیادهسازی نکرده است. با این حال در طی زمان، ارائهدهندگان مرورگرها پشتیبانی خود از CSS را برای عناصرشان بهبود بخشیدند و گرچه CSS در این زمینه شهرت بدی کسب کرده است، اما امروزه میتوان از آن برای استایلبندی فرمهای HTML استفاده کرد.
در حال حاضر همچنان برخی دشواریها در زمان استفاده از CSS روی فرمها بر جا مانده است. این مشکلات را میتوان به سه دسته عمده تقسیم کرد:
برخی عناصر میتوانند بدون هیچ مشکل و یا مشکلات جزئی روی همه پلتفرمها استایلبندی شوند. این موارد شامل عناصر ساختاری زیر هستند:
این لیست همچنین شامل همه ویجتهای فیلد متنی (چه تکخطی و چه چندخطی) و دکمهها نیز میشود.
برخی عناصر به ندرت میتوانند استایلبندی شوند و ممکن است نیازمند برخی ترفندهای پیچیده باشند و حتی در مواردی ممکن است لازم باشد از دانش پیشرفته CSS3 برخوردار باشید.
این لیست شامل عنصر <legend> است، اما این عنصر نمیتواند روی همه پلتفرمها به درستی موقعیتیابی شود. «کادرهای انتخاب» (Checkboxes) و دکمههای رادیویی نیز نمیتوانند مستقیماً استایلبندی شوند گرچه به لطف CSS3 میتوان راهحلهایی یافت. محتوای placeholder به هیچ روش استانداردی قابل استایلبندی نیست، با این حال همه مرورگرهایی که آن را پیادهسازی میکنند، شِبهعنصر CSS مناسبی را برای آن پیادهسازی کردهاند یا شِبهکلاسی دارند که امکان استایلبندی آن را فراهم میسازد.
ما در مقالات آتی مجله فرادرس، روش مدیریت همه این حالتها را با جزییات بیشتر توضیح خواهیم داد.
برخی عناصر نمیتوانند با استفاده از CSS استایلبندی شوند. این موارد شامل همه ویجتهای پیشرفته اینترفیس کاربر مانند کنترلهای range ،color یا date و همه ویجتهای بازشدنی شامل عناصر <select> ،<option> ،<optgroup> و <datalist> میشود. ویجت file picker نیز به طور کلی نمیتواند استایلبندی شود. عناصر جدید <progress> و <meter> نیز در همین دسته جای میگیرند.
مشکل اصلی همه این ویجتها از این واقعیت ناشی میشود که ساختار بسیار پیچیدهای دارند و CSS در حال حاضر به قدر کافی برای استایلبندی همه بخشهای ظریف این ویجتها گویا نیست. اگر میخواهید این ویجتها را سفارشیسازی کنید، باید از جاوا اسکریپت برای ساختن یک درخت DOM جهت استایلبندی آنها استفاده کنید. این وضعیت در مقاله زیر مورد بررسی قرار گرفته است:
برای استایلبندی عناصری که استایلبندی آنها آسان است، یعنی در بخش فوق آنها را در دسته خوبها قرار داریم عموماً مشکل خاصی وجود نخواهد داشت چون آنها شبیه هر عنصر HTML دیگری رفتار میکنند. با این حال استایلشیت خاص هر مرورگر میتواند اندکی ناسازگار باشد و از این رو چند ترفند وجود دارد که میتواند به استایلبندی سادهتر آنها کمک کند.
کادرهای جستجو تنها نوعی از فیلدهای متنی هستند که ممکن است استایلبندیشان کمی دشوار باشد. در مرورگرهای مبتنی بر WebKit (کروم، سافاری و غیره) باید آن را با مشخصه webkit-appearance- دستکاری بکنید.

چنان که در تصویر فوق از فیلد جستجو روی مرورگر کروم مشخص است، دو فیلد دارای حاشیه هستند. فیلد اول بدون استفاده از مشخصه -webkit-appearance رندر شده است در حالی که دومی با استفاده از مشخصه webkit-appearance:none رندر شده است. تفاوت کاملاً مشخص است.
فونت CSS و قابلیتهای متن میتوانند به سهولت روی هر نوع ویجتی استفاده شوند. حتی میتوان از font-face@ به همراه ویجتهای فرم استفاده کرد. با این حال رفتار مرورگرها غالباً ناسازگار است. برخی ویجتها به صورت پیشفرض از font-family و font-size از والدینشان ارثبری نمیکنند. مرورگرهای زیادی به جای آن از ظاهر پیشفرض سیستم استفاده میکنند. برای این که فرم شما از نظر ظاهری با باقی محتوا سازگار باشد، میتوانید قاعده زیر را به استایلشیت اضافه کنید:
تصویر زیر تفاوت را نشان میدهد. در تصویر سمت چپ رندرینگ پیشفرض عنصر در فایرفاکس روی Mac OS X با استایل فونت پیشفرض پلتفرم مشاهده میشود. در سمت راست همان عناصر با اعمال قواعد هماهنگسازی استایل دیده میشوند.

بحثهای زیادی بر سر این مسئله در جریان است که آیا بهتر است فرمها با استایلهای پیشفرض سیستم نمایش پیدا کنند یا دارای استایل های سفارشی باشند که برای تطبیق با محتوا سفارشیسازی شدهاند. این تصمیمگیری بر عهده شما به عنوان طراح وبسایت یا وب اپلیکیشن است.
همه فیلدهای متنی دارای پشتیبانی کاملی برای همه مشخصههای مرتبط با مدل باکس CSS شامل width ،height، padding ،margin و border هستند. با این حال مانند بخش قبل مرورگرها در زمان نمایش این ویجتها عموماً به استایلهای پیشفرض سیستم تکیه دارند. این بر عهده شما است که تعریف کنید دوست دارید آنها چگونه با محتوای دیگر بخشهای وبسایت هماهنگ شوند. اگر میخواهید ظاهر و حس بومی ویجتها را حفظ کنید یا در صورتی که بخواهید اندازه سازگاری برایشان تعیین کنید، با کمی دشواری مواجه خواهید شد.
دلیل این مسئله آن است که هر ویجت قواعد خاص خود را برای border ،padding و margin دارد. بنابراین اگر میخواهید اندازه یکسانی به چند ویجت مختلف بدهید، باید از مشخصه box-sizing استفاده کنید:

در تصویر فوق، سمت چپ بدون box-sizing ساخته شده است، در حالی که ستون راست از این مشخصه با مقدار border-box استفاده میکند. توجه کنید که بدین ترتیب میتوانیم مطمئن شویم که همه عناصر علیرغم قواعد پیشفرض هر نوع ویجت، فضای یکسانی اشغال کردهاند.
موقعیتیابی ویجتهای فرم عموماً یک مشکل محسوب نمیشود، با این حال، دو عنصر وجود دارند که باید توجه خاصی به آنها داشت و شامل legend و textarea میشوند که در ادامه هر یک را به صورت جداگانه توضیح میدهیم.
عنصر <legend> استایلبندی آسانی دارد و تنها مشکل در موقعیتیابی است. عنصر <legend> در هر مرورگر در بالای حاشیه فوقانی والد <fieldset> خود جای میگیرد. مطلقاً هیچ راهی برای تغییر دادن آن و قرار گرفتنش در داخل HTML و دوری از حاشیه فوقانی وجود ندارد. با این حال میتوانید آن را به صورت مطلق یا نسبی با استفاده از مشخصه position موقعیتیابی کنید. در غیر این صورت بخشی از حاشیه fieldset خواهد بود.
از آنجا که عنصر <legend> برای مقاصد دسترسیپذیری بسیار مهم است، از سوی فناوریهای حمایتی به عنوان بخشی از برچسب هر عنصر فرم درون fieldset قرائت میشود. در اغلب موارد با یک عنوان جفت شده و سپس به روشی دسترسپذیر پنهان میشود. به مثال زیر توجه کنید:
به صورت پیشفرض همه مرورگرها عنصر <textarea> را یک بلوک درونخطی در نظر میگیرند که در راستای خط تختانی متن تراز میشود. این وضعیت به ندرت مطلوب است. برای تغییر دادن inline-block به block بهتر است به آسانی از مشخصه display استفاده کنیم. اما اگر بخواهید از inline استفاده کنید، تغییر دادن تراز عمودی کار دشواری نخواهد بود:
در این بخش نگاهی به یک مثال دقیق از شیوه استایلبندی یک فرم HTML خواهیم داشت. بدین ترتیب بسیاری از این ایدهها روشنتر میشوند. ما قصد داریم این فرم تماس «کارتپستالی» را بسازیم.

اگر میخواهید با ما در ساخت این مثال به صورت عملی همراه باشید، ابتدا یک کپی از فایل زیر روی سیستم خود ایجاد کنید و سپس از دستورالعملهای ارائه شده پیروی نمایید.
کد HTML این مثال چندان پیچیده نیست و صرفاً چند ID و عنوان از یک صفحه معمولی HTML بیشتر دارد:
کد فوق را در بدنه HTML اضافه میکنیم.
این بخش همان جایی است که بخش جذاب ماجرا آغاز میشود. پیش از آن که شروع به کدنویسی بکنیم، به سه فایل دیگر نیاز داریم:
پیش از آغاز فونتها به مقدار پردازش بیشتر نیاز دارد:
اکنون نوبت بررسی CSS مثال رسیده است. همه بلوکهای کد نمایش یافته درون عنصر <style> را یکی پس از دیگری اضافه کنید.
ابتدا زمینه را با تعریف کردن قواعد @font-face آماده میکنیم. همه موارد مقدماتی روی عنصر <body> element و عنصر <form> آماده هستند:
اکنون میتوانیم موقعیت عناصر خود را که شامل عنوان و همه عناصر فرم است تعیین کنیم:
این همان جایی است که شروع به کار روی خود عناصر فرم میکنیم. ابتدا باید مطمئن شویم که عناصر <label> دارای فونت مناسبی هستند:
فیلدهای متنی نیازمند نوعی قواعد مشترک هستند. به بیان ساده ما borders و backgrounds را حذف میکنیم و padding و margin آنها را بازتعریف میکنیم:
زمانی که یکی از این فیلدها فوکوس بگیرند، آنها را به رنگ خاکستری روشن و با پسزمینه شفاف هایلایت میکنیم. توجه کنید که افزودن مشخصه outline برای حذف هایلایت فوکوس پیشفرض اضافه شده روی برخی مرورگرها ضروری است:
توجه داشته باشید که فیلدهای متنی کامل شدهاند و باید نمایش فیلدهای متنی تکخطی و چندخطی را تنظیم کنیم، چون معمولاً هنگام استفاده از حالت پیشفرض یکسان به نظر نمیرسند.
فیلد متنی تکخطی برای مشاهده مناسب در اینترنت اکسپلورر به دستکاری بیشتری نیاز دارد. اینترنت اکسپلورر ارتفاع فیلدها را بر مبنای ارتفاع طبیعی فونت (که رفتار همه مرورگرهای دیگر است) تعریف نمیکند. برای اصلاح این مشکل باید مانند زیر یک ارتفاع صریح به فیلد اختصاص دهیم
عناصر <textarea> به صورت پیشفرض به عنوان یک عنصر بلوکی رندر میشوند. دو نکته مهم در اینجا به مشخصههای resize و overflow مربوط است. از آنجا که طراحی دارای اندازه ثابت است، باید از مشخصه resize برای جلوگیری از تغییر دادن اندازه فیلدهای متنی چندخطی از سوی کاربران استفاده کنیم. مشخصه overflow برای این که فیلد روی مرورگرهای مختلف به روش منسجمتری رندر شود مورد استفاده قرار میگیرد. برخی مرورگرها به صورت پیشفرض دارای مقدار auto هستند، در حالی که برخی دیگر دارای مقدار پیشفرض scroll هستند. در این حالت بهتر است هر بار که از auto استفاده میکنیم کاملاً مطمئن باشیم:
عنصر <button> با CSS کاملاً سازگار است و میتوان هر کار موردنظر را روی آن حتی با استفاده از pseudo-elements اجرا کرد:
نکته: اگر مثال شما آن چنان که انتظار دارید، کار نمیکند، بهتر است کد خودتان را با کد زیر تطبیق دهید تا ریشه مشکل را پیدا کنید:
چنان که در این مطلب مشاهده کردیم، تا زمانی که میخواهیم فرمها را صرفاً با فیلدهای متنی و دکمهها بسازیم، استایلبندی آنها با استفاده از CSS کار آسانی است. در قسمت بعدی این سری مقالات آموزشی در مورد روش مدیریت آن دسته از ویجتهای فرم صحبت خواهیم کرد که در دستههای «بد» یا «زشت» این مقاله قرار گرفتند.
اگر این مطلب برای شما م
منبع: فرادرس
در این مقاله در مورد عملکرد کلکسیونهای مختلف مربوط به API Collection جاوا صحبت میکنیم. زمانی که از کلکسیونها سخن میگوییم، معمولاً یاد ساختمانهای داده List ،Map و Set و پیادهسازیهای رایج آنها میافتیم. قبل از هر چیز، به مفهوم پیچیدگی O بزرگ برای عملیات رایج میپردازیم و سپس برخی اعداد واقعی از عملیات کلکسیون در زمان اجرا ارائه خواهیم کرد. بنابراین با ما همراه باشید تا پیچیدگی زمانی عملیات جاوا روی انواع ساختمان داده را به زبان ساده توضیح دهیم.
به طور معمول زمانی که از پیچیدگی صحبت میکنیم منظورمان نمادگذاری O بزرگ است. به بیان ساده این نمادگذاری میزان رشد مدت زمان مورد نیاز برای اجرای الگوریتم را در صورت افزایش اندازه ورودی مشخص میسازد. برای یادگیری موارد بیشتر در مورد نمادگذاری O بزرگ پیشنهاد میکنیم از مطلب زیر بازدید نمایید:
کار خود را با لیست ساده آغاز میکنیم که یک کلکسیون مرتب است. در ابن بخش به بررسی عملکرد پیادهسازیهای ArrayList, LinkedList و CopyOnWriteArrayList میپردازیم.
ArrayList در جاوا توسط یک آرایه پشتیبانی میشود. بدین ترتیب میتوانیم منطق درونی پیادهسازی آن را درک کنیم. بدین ترتیب ابتدا روی پیچیدگی زمانی عملیات رایج در سطح بالا متمرکز میشویم:
این پیادهسازی از اینترفیس List زمانی که مشغول کار با اپلیکیشنهای چند نخی هستیم بسیار مفید است، چون دارای ویژگی «ایمنی نخ» ((thread-safe است.
در ادامه عملکرد O بزرگ را برای CopyOnWriteArrayList میبینید:
چنان که میبینید استفاده از کلکسیون به دلیل مشخصههای عملکردی متد add() بسیار پرهزینه است.
«لیست پیوندی» (LinkedList) یک ساختمان داده خطی است که شامل گرههایی برای نگهداری فیلدهای داده و ارجاعی به گرههای دیگر است. برای کسب اطلاعات بیشتر در مورد لیستهای پیوندی به لینک زیر مراجعه کنید:
در ادامه زمان تخمینی میانگین مورد نیاز برای اجرای برخی از عملیات ابتدایی را مشاهده میکنید:
اینک برای اثبات تئوری، کمی با دادههای واقعی کار میکنیم. به عبارت دقیقتر نتایج تست JMH یعنی Java Microbenchmark Harness را برای اغلب عملیات رایج کلکسیون ارائه میکنیم.
ابتدا پارامترهای اصلی تستهای بنچمارک را ارائه میکنیم:
سپس تعداد تکرارهای گرم کردن را روی 10 تعیین میکنیم. ضمناً میخواهیم زمان اجرای میانگین نتایج نمایش یافته را بر حسب میکروثانیه ببینیم.
اینک زمان آن رسیده است که تستهای بنچمارک را اجرا کنیم. ابتدا با ArrayList آغاز میکنیم:
درون ArrayListBenchmark کلاس State را برای نگهداری از دادههای اولیه اضافه میکنیم.
در این بخش یک ArrayList از اشیای Employee میسازیم. پس از اقدام به مقداردهی آن با 100،000 آیتم درون متد ()setUp میکنیم. State@ نشان میدهد که تستهای Benchmark@ دسترسی کاملی به متغیرهای اعلانشده در همان نخ دارند.
در نهایت نوبت آن میرسد که تستهای بنچمارک را برای متدهای ()add() ،contains() ،indexOf() ،remove و ()get اضافه کنیم:
همه نتایج بر حسب میکروثانیه ارائه شدهاند:
از روی نتایج فوق میفهمیم که متدهای ()testContains و ()testIndexOf تقریباً زمان اجرای یکسانی دارند. همچنین به وضوح میبینیم که تفاوت عظیمی بین نمرات متد ()testAdd و ()testGet از بقیه نتایج وجود دارد. افزودن یک عنصر باعث میشود که 2.296 میکروثانیه طول بکشد و دریافت آن نیز در طی زمان 0.007 میکروثانیه صورت میگیرد.
با این که زمان جستجو یا حذف یک عنصر تقریباً 700 میکروثانیه است، این اعداد اثباتی بر بخش نظری قبلی هستند که فهمیدیم پیچیدگی زمانی ()add و ()get به مقدار (O(1 و برای عملیات دیگر به مقدار (O(n است که در این مثال از n=10000 استفاده شده است.
به طور مشابه، میتوانیم همین تستها را برای کلکسیون CopyOnWriteArrayList بنویسیم. تنها چیزی که نیاز داریم جایگزینی ArrayList در employeeList با وهله CopyOnWriteArrayList است.
در ادامه نتایج بنچمارک را میبینید:
در این مورد نیز یک بار دیگر نتایج، تئوری را اثبات میکنند. چنان که میبینیم ()testGet به صورت میانگین در مدت زمان 0.006 میکروثانیه اجرا میشود و میتوانیم آن را O(1) تصور کنیم. در مقایسه با ArrayList نیز متوجه تفاوت زیادی بین نتایج متد ()testAdd میشویم. از آنجا که در اینجا پیچیدگی O(n) را برای متد ()add در برابر مقدار (O(1 برای ArrayList داریم.
به روشنی شاهد یک رشد خطی زمان هستیم، چون عملکرد عدد 878.166 را در مقایسه با 0.051 نمایش میدهد.
اینک نوبت به LinkedList میرسد:
از روی نمرات میتوان فهمید که افزودن و حذف عناصر در لیست پیوندی کاملاً سریع است. به علاوه یک شکاف عملکردی مهم بین عملیات add/remove و get/contains وجود دارد.
در جدیدترین نسخههای JDK شاهد بهبود عملکرد قابل توجهی برای پیادهسازیهای Map هستیم که شامل جایگزینی با ساختمان گره درخت متعادل متوازن در پیادهسازیهای درونی HashMap و LinkedHashMap میشود. این کار موجب کاهش زمان بدترین سناریوهای گشتن به دنبال عنصر از (O(n به O(log(n)) در زمان تصادم HashMap شده است.
با این حال در صورت پیادهسازی مناسب احتمال تصادم ()equals و ()hashcode بسیار پایین است.
لازمه به ذکر است که زمان بازیابی و ذخیرهسازی عناصر در HashMap به صورت (O(1 است.
اینک به بررسی مثالهای واقعی میپردازیم. ابتدا HashMap را بررسی میکنیم:
چنان که میبینیم اعداد ثابت میکنند که زمان ثابت O(1) برای اجرای متدهای فوق وجود دارد. اینک نمرات تست HashMap را با نمرات وهله دیگری از Map مقایسه میکنیم.
در مورد همه متدهای لیست شده برای HashMap ،LinkedHashMap ،IdentityHashMap ،WeakHashMap ،EnumMap و ConcurrentHashMap با زمان ثابت O(1) مواجه هستیم.
در ادامه نتایج نمرات باقیمانده تست را به شکل جدول مشاهده میکنید:
از روی اعداد خروجی میتوان تأیید کرد که ادعای پیچیدگی زمانی O(1) در این مورد صحیح است.
در مورد ساختمان درخت TreeMap و ConcurrentSkipListMap، عملیات ()put() ،get() ،remove و ()containsKey دارای پیچیدگی زمانی O(log(n)) است.
در این بخش میخواهیم مطمئن شویم که تستهای عملکردی ما تقریباً در زمان لگاریتمی اجرا میشوند. به همین جهت map-ها را به صورت پیوسته با n=1000, 10,000, 100,000, 1,000,000 آیتم مقداردهی میکنیم.
در این حالت به زمان کلی اجرا علاقهمند هستیم.
زمانی که n=1000 است، زمان کلی اجرا بر حسب میلیثانیه برابر با 00:03:17 است. در تعداد آیتم n=10,000 زمان تقریباً بدون تغییر و برابر با 00:03:18 میلیثانیه است. در تعداد n=100000، زمان اجرا به 00:03:30 افزایش مییابد. در نهایت زمانی که n = 1000000 میشود، زمان اجرا برابر با 00:05:27 میلیثانیه خواهد بود.
پس از مقایسه اعداد، زمان اجرای با تابع (log(n برای هر n، میتوان تأیید کرد که محاسبه هر دو تابع با هم مطابقت دارند.
به طور کلی Set یک کلکسیون با عناصر یکتا است. در این بخش قصد داریم پیادهسازی HashSet ،LinkedHashSet، EnumSet ،TreeSet ،CopyOnWriteArraySet و ConcurrentSkipListSet از اینترفیس Set را بررسی کنیم.
اینک مستقیماً به سراغ بررسی اعداد پیچیدگی زمانی میرویم. پیچیدگی زمانی برای عملیات ()add() ،remove و ()contains برای HashSet ،LinkedHashSet و EnumSet به صورت ثابت (O(1 است. این واقعیت به لطف پیادهسازی داخلی HashMap رخ داده است.
به طور مشابه پیچیدگی زمانی TreeSet برای عملیات لیست شده فوق به صورت ((O(log(n است. دلیل این امر به پیادهسازی TreeMap بازمیگردد. پیچیدگی زمانی برای ConcurrentSkipListSet نیز برابر با ((O(log(n است چون بر مبنای رد کردن ساختمان داده List طراحی شده است.
متدهای ()add() ،remove و ()contains برای CopyOnWriteArraySet دارای پیچیدگی زمانی میانگین (O(n است.
اینک به سراغ تستهای بنچمارک خود میرویم.
به علاوه پیکربندی بنچمارک را نیز همانند قبل و بدون تغییر بوده است.
در ادامه به مشاهده رفتار نمرات زمان اجرای HashSet و LinkedHashSet در هنگامی که n = 1000; 10,000; 100,000 آیتم است پرداختهایم.
در مورد HashSet نتایج به صورت زیر هستند:
به طور مشابه نتایج در مورد LinkedHashSet به صورت زیر هستند:
چنان که مشاهده میشود، نمرات برای همه عملیات تقریباً یکسان باقی مانده است. حتی هنگامی که آنها را با خروجیهای تست HashMap مقایسه میکنیم، همچنان یکسان به نظر میرسند.
در نتیجه تأیید میشود که همه متدهای تست شده در زمان ثابت (O(1 اجرا شدهاند.
در این مقاله پیچیدگی زمانی اغلب پیادهسازیهای ساختمانهای داده جاوا را مورد بررسی قرار دادیم. همچنین عملکرد زمان اجرای واقعی هر نوع از کلکسیون را از طریق تستهای بنچمارک JVM نشان دادیم. ضمناً عملکرد عملیات یکسان را در کلکسیونهای مختلف بررسی کردیم. در نتیجه اینک میتوانیم برای رفع نیازهای خود بهترین کلکسیون مناسب را انتخاب کنیم. همه کدهای مربوط به این مقاله را میتوانید در این ریپوی گیتهاب (+) ملاحظه ک
منبع: فرادرس
پایتون سبکهای کدنویسی مختلفی دارد و به نوعی میتوان گفت پذیرای همه سبکها است. هر کس میتواند با سابقه یادگیری هر نوع زبان برنامهنویسی دیگر از پایتون استفاده کند. اما باید توجه داشت که یادگیری یک زبان برنامهنویسی و آموختن آن به روش بهینه دو موضوع متفاوت هستند. در این مقاله با روشهای کاهش استفاده از حلقه for در پایتون آشنا میشویم.
بدین ترتیب در ادامه در مورد حلقههای for در پایتون و این که چطور میتوان از کاربرد غیرضروری آنها اجتناب کرد توضیح میدهیم. همه این موارد به وسیله یک مثال ساده ارائه میشوند. فرض کنید میخواهید مجموع مربعات را در یک لیست به دست آورید. این یک مسئله معتبر در حوزه یادگیری ماشین است که هر زمان که بخواهیم مسافت بین دو نقطه را در n بعد محاسبه کنیم از آن استفاده میکنیم. این کار با استفاده از حلقهها به سادگی قابل اجرا است.
در واقع سه روش برای انجام این کار وجود دارند که همه آنها را بررسی میکنیم و انتخاب هر کدام از آنها بر عهده شما است.
هر زمان که کد فوق را در یک کدبیس پایتون میبینید، بدانید که فردی با پیشزمینه C یا جاوا از پایتون استفاده کرده است. روش پایتونیتر برای نوشتن کد فوق به صورت زیر است:
این کد بهتر است چون لیست اندیسگذاری نمیشود و کد ما خوانایی بیشتری دارد. اما روش کاملاً پایتونی برای نوشتن کد فوق در یک خط به صورت زیر است:
این رویکرد به نام «خلاصهسازی لیست» (List Comprehension) نامیده میشود و شاید یکی از بهترین دلایل توجیه علاقه افراد به پایتون محسوب میشود. میتوان از if نیز در خلاصهسازی لیست استفاده کرد. فرض کنید میخواهیم فهرستی از اعداد مربع را صرفاً برای اعداد زوج محاسبه کنیم.
اینک اگر بخواهیم اعداد زوج مربع و اعداد فرد مکعب شوند چه کار باید بکنیم؟
می بینید که نوشتن کد به روش فوق چه قدر زیباتر و خلاصهتر است. هر زمان که خواستید یک گزاره for بنویسید، باید سؤالات زیر را از خود بپرسید:
برخی اوقات ما هم به اندیس در یک آرایه نیاز داریم و هم مقدار یک آرایه را میخواهیم. در چنین مواردی بهتر است به جای اندیس کردن لیست از enumerate استفاده کنیم.
قاعده کار چنین است:
آن را با یک مثال توضیح میدهیم. ما میخواهیم یک دیکشنری داشته باشیم که کلید آن برای هر مقدار x مربع آن مقدار است.
اگر بخواهیم یک دیکشنری صرفاً برای مقادیر زوج داشته باشیم چطور؟
اگر بخواهیم کلید ما برای مقادیر زوج، مربع آن مقدار و برای مقادیر فرد برابر با مکعب آن مقدار باشد چگونه باید عمل کنیم؟
در پایان باید گفت که گرچه به نظر میرسد انتقال دانش زبانهای برنامهنویسی دیگر به پایتون کار آسانی باشد اما در صورتی که این کار را انجام دهید، نمیتوانید زیبایی پایتون را درک کنید. پایتون زمانی که از روشهای اختصاصی آن استفاده کنید بسیار قدرتمندتر خواهد بود.
بنابراین در زمان نیاز به حلقه for باید از خلاصهسازی لیست و خلاصهسازی دیکشنری استفاده کنید. اگر به اندیسگذاری آرایه نیاز دارید از enumerate استفاده کنید. اما هر کاری میکنید همواره به خاطر داشته باشید که باید در حد امکان از حلقههای for احتراز کنید. بدین ترتیب کد شما خوانایی بیشتری خواهد داشت و قابلیت نگهداری آن نیز در بلندمدت افزایش مییابد.
منبع: فرادرس
سلام خدمت کاربران سایت میهن وردپرس ، در این پست مطلبی برای شما آماده کردیم که به نظر کم اهمیت هست ولی در واقع از اهمیت زیادی برخوردار است. اهمیت بروز رسانی سایت در بهبود سئو چقدر هست؟
آنچه در این مطلب میخوانید:
سئو مخفف کلمه Search Engine Optimization است. با استفاده از سئو میتوانید سایت خود را در ردیفهای بالای جستجوی کاربران قرار دهید درواقع هرچه رتبه شما در گوگل بالاتر باشد تعداد کاربرانی که از سایت شما بازدید میکنند بیشتر است که این نکته بسیار مهم میباشد و میتواند درفروش محصولات شما بسیار تأثیرگذار باشد. این کار کاملاً به عهده خودتان است و خودتان میتوانید تعیین کنید که رتبه بالاتری در گوگل داشته باشید. شما با انتشار مطالب و محتوای مفید در سایتتان میتوانید کاربرانتان را تشویق کنید که مطالب و لینک سایت شما را به اشتراک بگذارند. سئو چیست؟
این کار همچنین سبب میشود سایت شما ترافیک ورودی بیشتری داشته باشد. این خودتان هستید که تعیین میکنید روزی هزاران بازدیدکننده داشته باشید یا اینکه با اقدامی نابجا سایت خود را محدود کرده و درنهایت باعث دیده نشدن سایت خود شوید.
با پیشرفت فناوری سایتهای اینترنتی از اهمیت و جایگاه ویژهای برخوردار شدند. افراد بیشتر امور خود را از طریق اینترنت انجام میدهند و درواقع از اینترنت هم بهعنوان وسیلهای جهت خرید کالا و هم اطلاعرسانی استفاده میشود.
شما باید بتوانید با استفاده از محتوای جدید و بروزرسانی شده سایت خود را جز رتبههای بالا قرار داده و سئو سایت خود را بالا ببرید. همچنین این امر سبب میشود که عملکرد سایت شما بهبود پیدا کند. شما باید همواره از اطلاعات بروز آگاه باشید و آنها را طبق آخرین تغییرات خود در سایت خود قرار دهید. ساخت سایت بهتنهایی کافی نیست درواقع پشتیبانی از سایت از اهمیتی بسیار بالاتر از ساخت آن برخوردار است. سعی کنید همواره سایتی پویا داشته باشید و در آن از مطالب جذاب و مفید با توجه به نیاز روز جامعه استفاده کنید. در نظر داشته باشید که در بروزرسانی سایت خود به سبک موردپسند کاربر و سلیقه آن حتماً توجه کنید و آن را در درجه اول اهمیت قرار دهید. به طراحی و رنگها و تصاویر توجه ویژهای داشته باشید و آنها را یکنواخت به حال خود رها نکنید.
درواقع شما باید این را همیشه در نظر داشته باشید که همانطور که ساختن یک سایت مهم است نگهداری و حفظ سایت در درجه بالاتری از اهمیت قرار میگیرد چراکه اگر به سایت خود و بهروزرسانی آن اهمیت ندهید و محتوای باکیفیت در آن قرار ندهید ساخت آن بیفایده است.
اهمیت بروز رسانی سایت در سئو بسیار زیاد هست. وظیفه این بروز رسانی و بهبود عملکرد سایت و درنتیجه بالا بردن رتبه سایتتان در موتورهای جستجوگر بر عهده شما بهعنوان مدیر سایت است. همچنین اگر شما بتوانید در ساعت مشخصی سایت خود را بهروزرسانی کنید و محتوای مفید در سایت خود قرار دهید رتبه سایت خود را ارتقا میدهید. هرچقدر که محتوا غنیتر و باکیفیتتر باشد رتبه شما بالاتر میرود. همواره این را در نظر داشته باشید که کپی کردن از سایتهای دیگر رتبه شما را پایین میآورد.
شما میتوانید با استفاده از سیستمهای مدیریت محتوا سایت بسازید و بدون هیچ نگرانی آن را مدیریت و مرتباً بهروزرسانی کنید. این سیستمها کار شما را بسیار راحتتر کرده و دیگر نیازی به کدنویسی برای ایجاد سایت ندارید.
بروزرسانی نرمافزار سایت شما بهعنوان یکی از ستونهای مهم در سایت شما به شمار میرود. تمام محتوای تولیدشده توسط شما بهوسیله نرمافزار شما به کاربران ارائه میگردد. باید با در نظر گرفتن تمام جوانب سایت به برطرف کردن نواقص و ضعفهای آن پرداخته و محتوای موجود در سایت را بهبود دهید. این کار شما هیچوقت بهپایان نمیرسد شما باید همیشه و در همه حال سایت خود را دائما بروز رسانی کنید.
یکی دیگر از انواع بروزرسانی، بروزرسانی محتوا و مطالب سایت شما است. این محتوای سایت شما است که باعث جذب کاربران و افزایش بازید سایت شما میشود. پس محتوا در سایت از اهمیت ویژهای برخوردار است و باید به آن بسیار توجه شود، محتوای خوب باعث میشود شما بتوانید به تبلیغ بهتر محصولات خود نیز بپردازید و فروش خود را افزایش دهید.
شما باید بهعنوان مدیر سایت به بررسی سایت پرداخته و از اهمیت کلمات کلیدی غافل نشوید چون موتورهای جستجو بهطور خودکار کلمات کلیدی کاربران را جسنجو میکنند. پس سعی کنید این کلمات را شناخته و از آنها در محتوای خود بهکار بگیرید.
در نظر داشته باشید که تنها بهروزرسانی متن کافی نیست و باید عکسها، ویدئوها و… را نیز بهروزرسانی کنید و از عکس و ویدئوهای جدید استفاده کنید توجه داشته باشید که تصاویر و ویدئوها کاملاً مناسب و مطابق سایت و محتوای آن باشند بهطوریکه بازدیدکنندگان را مجذوب خود کنند، همچنین محتوا کاملاً واضح و روشن باشد و از هرگونه ابهام جلوگیری کنید. نیاز کاربران سایت بسیار مهم است و باید توجه ویژهای به آن شود، در نظر بگیرید که با توجه به درخواست کاربران مطالب جدید و بروز در اختیارشان قرار دهید. بنابراین شما باید با تحقیق اطلاعات کافی در این زمینه داشته باشید.
محتوای جدید و بروزرسانی شده به شما کمک میکند که کاربران بیشتری را به خود جذب کنید و اگر شما مطالب جدید را مرتب در سایت خود قرار ندهید کاربران خود را از دست میدهید و ترافیک داده شما کم میشود درواقع وقتی شما دائما مطالب مفید در سایت قرار دهید به کاربران خود این حس را القا میکنید که توجه ویژهای به آنها و نیازشان دارید.
در دنیای اینترنت هرروز خبری تازه و مطلبی تازه ساخته میشود وبسایتی موفق است که بتواند اولین نفری باشد که این مطلب را در سایت خود قرار دهد. مدیران وبسایتها نظم خاصی در بروز کردن سایتشان ندارند و هر وقت که دوست داشته باشند سایت خود را بروز میکنند. در مقابل بعضی از سایتها هستند که در یک روز ده تا دوازده مطلب در سایت خود قرار داده و تا یک ماه هیچ خبری از مطلب جدید در سایت آنها نیست.
امروزه دنیای رقابت است و در حال حاضر با رواج کسبوکار اینترنتی وبسایتها در حال رقابت باهم هستند، هرچه سایتی بروزتر و مطالب جدیدتر داشته باشد و به کاربران خود انتشار دهد از دیگر وبسایتها سبقتگرفته و موفقتر است. همچنین اگر سایت خود را بهصورت منظم بین یک بازه زمانی خاصی بروز کنید روباتهای گوگل میفهمند که مطالب سایت شما را بین این بازهی زمانی خاص ثبت کنند و بالعکس اگر شما سایت خود را هر وقت که دوست داشتید آپدیت کنید رباتهای گوگل بهصورت هفتگی مطالب سایت شما را ثبت میکنند و از دیگر رقبای خود عقب میافتید. به خاطر داشته باشید که منظم بودن در بروز رسانی سایت باعث میشود که گوگل مطالب شما را سریعتر ایندکس کند.
شما می توانید مابقی نکات سئو را در فیلم آموزش سئو وردپرس مشاهده بفرمایید.
امیدواریم این مقاله در زمینه درک اهمیت بروز رسانی سایت در سئو به شما کمک کرده باشد.
راستی! برای دریافت مطالب وردپرسی در کانال تلگرام میهن وردپرس عضو شوید.
منبع: میهن ورد پرس
اگر قصد دارید سایت خود را از هر نظر ایمن نمایید لازم است نکاتی را رعایت کنید. اما آیا میدانید تأمین امنیت سایت از چه راههایی امکانپذیر است؟ اگر میخواهید امنیت سایت خودتان را بالا ببرید باید به نکات مهمی توجه کنید. به شما پیشنهاد میکنم در این مقاله همراه ما باشید.
تمام اقداماتی که در جهت بالا بردن حداکثری ضریب امنیت یک سایت انجام میشود بهعنوان امنیت سایت شناخته میشود.
حفظ امنیت سایت به فاکتورهای زیادی بستگی دارد تا بتواند امکان نفوذ به سایت را به حداقل برساند. موارد مهمی از جمله امنیت شبکه، امنیت اینترنت، امنیت سیستم عامل، امنیت نرمافزار و فاکتورهای بسیار دیگری وجود دارند که همگی در امنیت نهایی یک سایت نقش ویژهای دارند.
در واقع امنیت یک سایت شامل شرایطی است که در هنگام خدمات رسانی و انجام امور معمولی، میزان آسیبپذیری به حداقل برسد.
یک سایت زمانی میتواند به فعالیت ادامه دهد و از ثبات و اعتبار خود دفاع کند که امنیت داشته باشد. بنابراین تامین امنیت سایت از اهمیت بسیار بالایی برخوردار است. بسیاری از کاربران و مدیران سایتهای عادی و حتی سایتهای بزرگ و معتبر به موضوع امنیت اهمیت زیادی نمیدهند و آن را به صورت جدی پیگیری نمیکنند. اینکه یک سایت به دست اسپمرها نیفتد و هک نشود نمیتواند دلیلی منطقی برای امن بودن آن باشد چرا که در صورت پیشرفت سایت میتواند مورد حمله هکرها قرار بگیرد و زحمات چندین ساله مدیران را به هدر بدهد.

در واقع حفظ امنیت سایت زمانی مشخص میشود که مورد حمله هکرها قرار بگیرد. زمانی که هکرها به سایت حمله میکنند ممکن است که سایت به دلیل نداشتن امنیت مناسب به راحتی هک شود و یا اینکه به دلیل داشتن امنیت بالا هیچگونه آسیبی را متحمل نشود. با توجه به اینکه نوع و تعداد روشها برای هک کردن یک سایت بسیار زیاد است، امکان دارد هر سایتی در هر لحظهای مورد حمله هکرها قرار بگیرد بنابراین مسئله امنیت سایت حیاتیترین مسئله برای ادامه فعالیت آن است.
برای آنکه امنیت سایت خودتان را تأمین کنید و با خیالی راحت به فعالیت ادامه دهید نکات زیادی وجود دارد که باید حتماً رعایت شود. علاوه بر مواردی مانند امنیت شبکه، امنیت اینترنت و سیستم عامل که بیان کردیم لازم است که برای تأمین مطمئنتر امنیت سایت خودتان موارد زیر را رعایت کنید.
هاست در واقع حکم اتاق کار مجازی شما را دارد. باید هاست خودتان را از شرکتهایی معتبر و قابلاعتماد خریداری کنید چرا که هاست، میزبان سایت شما خواهد بود و امنیت آن اهمیت بسیار ویژهای دارد. همچنین سعی کنید برای هر سایت یک هاست جداگانه داشته باشید. هرچند که هاست این قابلیت را دارد که چندین سایت را به صورت همزمان میزبانی کند اما این کار اصلاً توصیه نمیشوند. اینکه فضای هاست شما زیاد است دلیلی برای نصب چندین سایت بر روی آن نیست. در صورتی که حتی یک پلاگین از یک سایت شما مورد حمله هکرها قرار بگیرد، میتواند آسیبی جدی به تمام سایتهایی که بر روی یک هاست مشترک نصب کردهاید وارد کند.
سیستم مدیریت محتوا (cms) از جمله موارد اولیه و لازم در تشکیل یک سایت است. امروزه cms های بسیار زیادی وجود دارند که میتوان از آنها استفاده کرد. سیستمهای منسوخ و ناامن میتوانند راحتترین هدف برای هکرها باشند. از CMS های استفاده کنید که قابلیت بهروزرسانی داشته باشند؛ مانند وردپرس که بصورت کاملا منظم در حال بروزرسانی و رفع باگهاست. امروزه هکرها پیشرفتهای بسیار زیادی داشتهاند و به صورت اتوماتیک عمل میکنند و دائماً سایتها را بررسی میکنند؛ بنابراین CMS هایی که در کوتاهترین زمان ممکن بهروز میشوند میتوانند گزینههای خوبی برای ساختن سایتها باشند. بعد از بهروزرسانی CMS حتماً سعی کنید که تمامی پلاگین هایی که استفاده میکنید بهروز شوند. هکرها ممکن است حتی در کمتر از یک ساعت به سایت حمله کنند و آسیبها جبرانناپذیری وارد کنند.
در صورتی که از CMS هایی استفاده میکنید که دارای تنظیمات پیشفرض هستند حتماً سعی کنید که آنها را سفارشیسازی و شخصیسازی کنید. یکی از رایجترین حملاتی که توسط هکرها انجام میشود به CMS هایی است که از تنظیمات پیشفرض استفاده میکنند.

شاید شما هم شنیده باشید که نصب SSL میتواند در حفظ امنیت سایت تاثیر خوبی داشته باشد. اما باید بدانید که برای نصب SSL دو نظریه و تفکر وجود دارد. بسیاری میگویند که SSL بههیچعنوان از سایت محافظت نمیکند، در برابر حملات واکنشی ندارد و توزیع نرمافزارهای مخرب را متوقف نمیکند؛ اما عدهای نیز معتقدند که گواهی ssl بر روی وبسایت، اطلاعات ورودی و خروجی را با الگوریتم بسیار پیچیدهای رمزنگاری کرده و از شنود و دزدیده شدن آنها جلوگیری میکند.
در واقع SSL مانع از مشاهده ترافیک و اطلاعات انتقالی شما توسط افراد دیگر میشود بنابراین وجود آن برای سایتها و اطلاعات حساس و شخصی بسیار لازم است و علاوه بر موارد امنیتی، تأثیرات بسیار خوبی در نتایج سئو و جلب اعتماد کاربران دارد.
نه تنها در سایت بلکه در تمام مواردی که احتمال هک وجود دارد، پسورد خوب و قدرتمند همیشه توصیه شده است. برای انتخاب پسورد خوب سعی کنید حداقل ۸ کاراکتر از حروف، اعداد و نمایهها را انتخاب کنید. برای آنکه بتوانید یک رمز عبور قوی و غیر قابل هک داشته باشید باید سه نکته اصلی را رعایت کنید.
اول اینکه رمز شما باید به اندازه کافی پیچیده و سخت باشد و به صورت تصادفی انتخاب شود.
دوم آنکه رمز عبور باید به اندازه کافی طولانی باشد، معمولاً گفته میشود حداقل ۸ کاراکتر اما هرچقدر تعداد کاراکترها بیشتر باشد خیلی مناسبتر است.
سوم آنکه رمز عبور باید منحصربهفرد باشد و سعی کنید رمز عبوری که برای سایت خودتان انتخاب میکند در هیچ جای دیگری استفاده نکرده باشید.
زمانی که سایتی دارید و چندین نفر بهعنوان مدیر، نویسنده، ویراستار و هر عنوان دیگری به سایت شما دسترسی دارند، باید میزان دسترسی آنها را کاملاً محدود و زمانبندی کنید تا تأمین امنیت سایت مشخص شود. تا زمانی که از میزان تواناییهای یک فرد اطلاع نداشته باشید به او دسترسی نامحدود ندهید. هر تعداد که کاربران بیشتری به سایت شما دسترسی نامحدود داشته باشند احتمال آسیبپذیری و هک شدن سایت نیز بالا میرود.
حتی اگر به صورت صد در صد از امنیت سایت خودتان مطمئن هستید از تمامی اطلاعات خودتان بک آپ بگیرید چرا که در دنیای دیجیتال همه چیز میتواند به صورت آنی از بین برود. بههیچعنوان بک آپ را بر روی سرور ذخیره نکنید چرا که بک آپ ها شامل نسخههای cms اصلاحنشده و انواع افزونهها هستند که برای هکرها مناسبترین موقعیت برای هک را ایجاد میکنند.
با کمک افزونه Backup buddy میتوانید از کل اطلاعات سایت یک نسخه پشتیبان تهیه کنید و در هر زمان که به مشکل برخورد کردید آن را بازگردانی کنید. برخی از ویژگیهای پررنگ این افزونه عبارت است از:
افزونههای امنیتی، با امکانات متعددی که دارند، حافظ امنیت وبسایت شما هستند. البته نه همه آنها بلکه موارد معدودی در خدمت امنیت سایت قرار گرفته و از نفوذ افراد مخرب جلوگیری میکنند. اگر در حفظ امنیت سایت کوشا هستید، حتما یکی از این افزونهها را نصب کنید.
iThemes Security یکی از قویترین افزونههای وردپرس در حوزه امنیت است که با کمک آن میتوانید سایت را در مقابل حملات مختلف هک نجات دهید. بصورت کلی این افزونه عملیات زیر را امکانپذیر میسازد:
علاوه بر تمامی موارد ذکر شده میتوان موارد بسیار زیاد دیگری را نام برد که نقشی انکارناپذیر در تأمین امنیت سایت دارند. از جمله آنها میتوان مجوزهای دسترسی فایل (این مجوزها تعریف میکنند که هرکسی میتواند بر روی فایلها چه کاری انجام دهد)، استفاده از وب سرورهای مطمئن و فایلهای پیکربندیشده سرور (وب سرورهای آپاچی، انجین ایکس و ای ای اس قدرتمندترین وب سرورها هستند)، محافظت سایت در برابر اسپمرها (استفاده از سیستم محافظت CAPTCHA )، استفاده از آنتیویروس و فایروال قدرتمند، بروز، معتبر و اصل، استفاده از سیستم عامل و نرمافزارهای معتبر و اصلی و استفاده از اینترنت امن و مطمئن اشاره کرد که وجود نقص در هر کدام میتوان زمینهساز هک شدن سایت را فراهم کند.