Category Archives: فنی

فوکوس Focus

فوکوس یا Focus چیست؟

فوکوس (Focus) در رایانه مفهومی است که مشخص می‌کند کدام جز یا المان در یک واسط کاربری گرافیکی آماده دریافت ورودی و تعامل با کاربر می‌باشد. این المان می‌تواند شامل پنجره ها و اجزای داخلی آن‌ها (نظیر جعبه های متنی، دکمه ها و …) باشد.

به عنوان مثالی ساده اگر یک جعبه متنی قابل ویرایش، Focus را در اختیار داشته باشد کاربر می‌تواند با فشردن کلیدهای مربوط به کاراکترها در صفحه کلید، متنی را در این جعبه وارد کند. این درحالیست که اگر یک دکمه دارای Focus باشد معمولا فشردن کلید Enter معادل با کلیک کردن روی این دکمه خواهد بود.

المانی که دارای فوکوس است معمولا با اندکی دقت در ظاهر آن برای کاربر قابل شناسایی است. به عنوان مثال اگر یک جعبه متنی دارای فوکوس باشد احتمالا کرسر متنی در آن به صورت چشمک زن قابل مشاهده است. همین‌طور حاشیه اطراف برخی از المان ها (نظیر جعبه های متنی و دکمه ها) در زمانی که Focus را در اختیار دارند معمولا با رنگی متمایز و برای برخی المان های دیگر (نظیر جعبه های قابل تیک زدن) به صورت نقطه چین مشخص می‌شود.

فوکوس Focus
در این پنجره، دکمه Save دارای Focus است. فشردن کلید Enter معادل با کلیک کردن روی این دکمه است؛ البته کاربر می‌تواند با کلید Tab یا کلیدهای چپ و راست روی سایر دکمه ها Focus کند.

البته لزوما تمام اجزا در یک واسط کاربری گرافیکی قابل فوکوس (Focusable) نیستند. المان هایی که غیرفعال یا پنهان هستند از جمله این عناصر به شمار می‌روند. در عین حال تغییر فوکوس به یک المان جدید باعث می‌شود المان قبلی فوکوس خود را از دست بدهد.

روش های تغییر فوکوس

کلیک یا لمس کردن

برای تغییر فوکوس، ساده‌ترین راه کلیک کردن یا لمس کردن مستقیم المان موردنظر است. این سیاست که با نام Click to Focus شناخته می‌شود رایج‌ترین روش برای فوکوس کردن روی یک المان به شمار می‌رود. به عنوان مثال در سیستم عامل ویندوز با کلیک کردن روی یک پنجره، پنجره Focus را در دست می‌گیرد. همین‌طور با کلیک کردن روی یکی از المان های داخلی این پنجره، المان موردنظر Focus را در اختیار می‌گیرد و آماده دریافت ورودی می‌شود.

فوکوس Focus
فرم اینترنتی ثبت نام در یک سایت – در این تصویر، جعبه متنی اول دارای Focus است و کاربر با کمک صفحه کلید می‌تواند آن را تکمیل کرده و سپس با فشردن کلید Tab به سراغ جعبه دوم برود.

در سیاست دیگری موسوم به Focus Follows Mouse Pointer بدون نیاز به کلیک کردن، فوکوس به پنجره ای منتقل می‌شود که نشانگر ماوس روی آن قرار گرفته است. این پنجره ممکن است به طور خودکار (احتمالا پس از کمی تأخیر) روی مابقی پنجره ها قرار بگیرد (AutoRaise) و یا با وجود اینکه آماده دریافت ورودی است به همان حالت (بخشی از آن) زیر پنجره های دیگر باقی بماند.

استفاده از صفحه کلید

روش دیگری که معمولا در رایانه ها برای تغییر فوکوس به کار می‌رود استفاده از صفحه کلید است. در این روش که یک روش نسبی (Relative) به شمار می‌رود با فشردن کلید Tab می‌توانید به سراغ المان بعدی قابل فوکوس بروید و با ترکیب Tab + Shift به المان قبلی فوکوس کنید. ترتیب المان ها برای این منظور که با اصطلاح Tab Order (ترتیب Tab) نیز شناخته می‌شود معمولا براساس موقعیت فیزیکی المان ها یا توسط توسعه دهنده با اختصاص شماره‌ای تحت عنوان Tab Index مشخص می‌شود. در برخی موارد نیز امکان انتقال فوکوس به المان های اطراف المان کنونی با کمک کلیدهای پیکانی وجود دارد.

استفاده از صفحه کلید به جای ماوس برای انتقال Focus به خصوص هنگام وارد کردن داده ها در یک جدول یا یک سند صفحه گسترده و همچنین هنگام تکمیل کردن فرم ها به سرعت بالاتر تعامل با واسط کاربری کمک می‌کند. اما در صورتی که لازم است یک المان مشخص در میان سایر المان ها فورا فوکوس را در اختیار بگیرد روش مستقیم (کلیک کردن یا لمس المان) سریعتر خواهد بود.

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

تغییر فوکوس خودکار

اگر ورودی یک المان دارای محدودیت خاصی باشد می‌توان با کمک برنامه نویسی امکان انتقال خودکار Focus به المان بعدی را فراهم نمود. برای مثال فرض کنید در یک جعبه متنی از یک فرم آنلاین، کاربر اجازه وارد کردن دو رقم برای تعیین سال تولد خود را داشته باشد. در این حالت می‌توان بلافاصله پس از دریافت ورودی مناسب، فوکوس را به المان بعدی منتقل کرد.

فوکوس و تجربه کاربری

معمولا به محض باز شدن یک پنجره یا نمایان شدن یک فرم، می‌بایست مهم‌ترین و پرکاربردترین المان آن Focus را در دست داشته باشد تا تعامل با واسط کاربری آسان‌تر شود. فراموش نکنید ترتیب مناسب برای تغییر Focus با کمک صفحه کلید نیز می‌تواند به یک تجربه کاربری قابل قبول منجر شود.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

در پشتی Backdoor

در پشتی یا Backdoor چیست؟

در پشتی یا بَک دُر (Backdoor) روشی است که برای عبور کردن از مکانیزم های معمولی تصدیق هویت (Authentication) یا رمزنگاری داده ها در یک سیستم یا محصول رایانه ای استفاده می‌شود.

چنین روش‌هایی ممکن است از طریق قطعه کدهایی که در سورس یک نرم افزار گنجانده شده و یا کدهایی که در فرم ویرها و محصولات سخت افزاری تعبیه شده است پیاده سازی شوند. گفتنی است واژه Trapdoor نیز به ندرت برای همین مفهوم به کار می‌رود.

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

برای درک بهتر این مفهوم، موضوع را با یک مثال در دنیای واقعی مورد بررسی قرار می‌دهیم. در سناریوی اول تصور کنید به تازگی خانه‌ای خریده‌اید که در آن درهای ورودی به بهترین قفل‌ها و دوربین‌های امنیتی تجهیز شده است. این درحالیست که شما از وجود یک در مخفی که توسط سازنده طراحی شده است و از طریق حفره‌ای زیرزمینی امکان ورود به خانه را فراهم می‌کند بی‌خبر هستید. در چنین شرایطی احتمالا پس از یک مسافرت دلچسب زمانی که به خانه برمی‌گردید با جای خالی لوازم گران قیمت خانه‌تان روبرو خواهید شد!

در سناریوی دوم تصور کنید یک فرد فراموشکار هستید که معمولا کلیدهایش را در خانه جا می‌گذارد یا آن‌ها را گم می‌کند! از آنجایی که فردی آینده‌نگر هستید یک در مخفی بدون قفل جایی در اطراف خانه خود ساخته‌اید که با برگ درختان پوشانده شده است و در مواقع ضروری می‌توانید برای ورود به خانه از آن استفاده کنید.

هرچند در سناریوی دوم برخلاف سناریوی اول، وجود در مخفی دارای جنبه مثبت است اما فراموش نکنید اگر همسایه‌ها یا سارقین، شما را حین استفاده از این در مخفی مشاهده کنند می‌توانند در آینده برای ورود به خانه از آن استفاده کنند. در دنیای رایانه هم درهای پشتی کارکردی مشابه با همین دو سناریو را ایفا می‌کنند.

در پشتی Backdoor
Backdoor ها امکان دور زدن مکانیزم های تصدیق هویت و روش‌های امنیتی متداول را میسر می‌کنند.

ویژگی ها و اهداف درهای پشتی

درهای پشتی معمولا به صورت محرمانه و عمدی توسط سازنده محصول یا اشخاص ثالث طراحی می‌شوند. البته برخی از آن‌ها نیز به صورت گسترده شناخته شده هستند. به علاوه ممکن است یک در پشتی به صورت غیرعمدی (برای مثال در اثر یک باگ یا خطای برنامه نویسی) در محصول به وجود آمده باشد.

درهای پشتی با اهداف مختلفی در محصولات یا سیستم های نرم افزاری و سخت افزاری ایجاد می‌شوند و مشابه با مثالی که در دنیای واقعی به آن اشاره شد الزاما مقاصد منفی را دنبال نمی‌کنند. برخی از توسعه دهندگان برای انجام امور مدیریتی به صورت از راه دور (نظیر عیب یابی و نگه داری سیستم) از بک درها در محصولات خود استفاده می‌کنند. در عین حال ممکن است بدافزارها (تروجان های دسترسی از راه دور یا Remote Access Trojan – RAT) نیز با ایجاد یک Backdoor امکان دسترسی هکرهای متجاوز را به یک سیستم رایانه ای فراهم کنند.

ذکر این نکته ضروری است که حتی اگر یک در پشتی برای مقاصد مثبت طراحی شده باشد باز هم وجود آن یک ریسک امنیتی محسوب می‌شود چرا که در صورت کشف شدن توسط هکرها، دسترسی آن‌ها به سیستم و داده هایش را برای اهداف بدخواهانه میسر می‌کند.

راهکارهای مقابله

هرچند شناسایی در پشتی در یک محصول اختصاصی معمولا کار چندان ساده‌ای نیست اما استفاده از دیوارهای آتش با پیکربندی های مناسب و نظارت روی ترافیک شبکه می‌تواند تا حدودی شناسایی و مقابله با درهای پشتی را امکان‌پذیر نماید. همچنین نرم افزارهای منبع باز اغلب می‌توانند به کاربر این حس اطمینان را منتقل کنند که در آن‌ها خبری از بَک دُر نیست چرا که پنهان کردن آن‌ها در مورد نرم افزارهایی که سورس کدشان به صورت عمومی منتشر شده است امری به مراتب دشوارتر خواهد بود.

در عین حال استفاده از ابزارهای امنیتی مناسب برای جلوگیری از آلوده شدن به بدافزارها می‌تواند شما را تا حدودی از حملات وابسته به درهای پشتی در امان نگاه دارد.

نمونه هایی از Backdoor های مشهور

از جمله معروف‌ترین درهای پشتی شناخته شده می‌توان به Back Orifice اشاره کرد که در سال 1998 با هدف مشروع مدیریت سیستم های ویندوزی از راه دور توسط گروهی از هکرها موسوم به Cult of the Dead Cow طراحی شده بود.

یکی دیگر از درهای پشتی مشهور متعلق به الگوریتم منسوخ شده Dual_EC_DRBG است که کاربرد آن در حوزه رمزنگاری بوده و به آژانس امنیت ملی آمریکا (NSA) اجازه می‌داده است داده های رمزنگاری شده با این الگوریتم را رمزگشایی کنند.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

سندباکس یا جعبه شنی Sandbox

سندباکس یا Sandbox چیست؟

سندباکس (Sandbox) به محیطی گفته می‌شود که معمولا به منظور تست بخش‌های جدید یک نرم افزار یا اجرای ایمن نرم افزارها بدون اینکه محیط اصلی تحت تأثیر آن قرار بگیرد به کار می‌رود. این واژه در زبان فارسی به معنای جعبه شنی است.

نام سندباکس به دلیل شباهت مفهوم آن با جعبه‌های شن بازی کودکان انتخاب شده است. این جعبه‌ها محیطی همانند یک زمین واقعی پر از شن را برای کودک شبیه سازی می‌کنند که کودک در آن بدون اینکه محیط بیرون از جعبه به شن آلوده شود یا به دیگران و خودش آسیبی برسد می‌تواند در چهارچوب محدودیت‌هایی از بازی خود لذت ببرد. درست همانند نقشی که سندباکس در رایانه ایفا می‌کند.

سندباکس و توسعه نرم افزار

در حوزه توسعه نرم افزار، سندباکس محیطی مجزا از محیط در حال عملیات است که از آن برای بررسی، تست و مانیتور کردن کدها یا بخش‌های جدید در حال توسعه استفاده می‌شود. اجرا در جعبه شنی، محیط اصلی (نظیر سرورهایی که در حال ارائه خدمات هستند) و داده های مرتبط با آن را از تغییراتی که ممکن است به درستی کار نکند یا خطرآفرین باشد محافظت می‌کند.

با توجه به اینکه لازم است تغییرات روی محیطی مشابه با محیط اصلی تست و بررسی شود بنابراین در سندباکس می‌بایست حداقل ویژگی‌های لازم برای تست صحیح نرم افزار مهیا شده باشد. برای مثال دسترسی به نسخه‌ای از داده ها یا سرویس های وب مشابه با همان چیزی که سیستم اصلی با آن‌ها کار می‌کند الزامی است.

در نهایت پس از اینکه تست ها به صورت موفقیت آمیز روی سندباکس انجام شد نسخه جدید یا تغییرات به صورت عمومی منتشر می‌شود.

سندباکس و امنیت

زمانی که پای امنیت در میان است منظور از سندباکس محیطی است که اغلب برای اجرای نرم افزارهای نامطمئن یا غیر قابل اعتماد از شرکت ها یا افراد شخص ثالث ناشناس استفاده می‌شود. چنین محیطی به عنوان یک لایه محافظتی اضافی، تا حدودی به کاربر این اطمینان را می‌دهد که خطاها یا مشکلات احتمالی، آسیب پذیری ها و تهدیدات امنیتی ناشی از اجرای نرم افزار، اثر مخرب یا منفی روی سیستم میزبان (که سندباکس در آن قرار گرفته است) نخواهد داشت و اثرات آن صرفا به محیط ایزوله سندباکس محدود می‌شود.

معمولا سندباکس ها دارای منابع کاملا کنترل شده برای اجرای نرم افزارها هستند و در آن‌ها اجازه دسترسی به منابع میزبان وجود ندارد و یا به شدت محدود شده است. از همینرو جعبه های شنی گزینه مناسبی برای نصب و اجرای نرم افزارهایی هستند که ممکن است حاوی کدهای مخرب و بدافزار باشند.

سندباکس Sandbox
اجرای نرم افزارها در سندباکس، سیستم میزبان را از آسیب های احتمالی ناشی از نرم افزار در امان نگه می‌دارد.

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

سایر کاربردها

جالب است بدانید هکرها هم برای اینکه آسیبی متوجه سیستم رایانه ای شان نشود به منظور تست بدافزارهای خود از سندباکس ها کمک می‌گیرند. در سمت مقابل، محققین امنیتی نیز برای بررسی و شناسایی نحوه رفتار کدهای مخرب از همین محیط‌ها استفاده می‌کنند.

سندباکس ها برای اجرای نرم افزارهایی که نیاز به یک سرویس وب دارند نیز به کار گرفته می‌شوند. به این ترتیب توسعه دهندگان قادر خواهند بود نرم افزار خود را پیش از آنکه به طور واقعی منتشر شود در محیطی ارزیابی و تست کنند که به سرویس وب موردنظر دسترسی دارد.

در برخی از سایت های ویکی (از جمله ویکیپدیا) نیز مدلی از جعبه شنی وجود دارد که به کاربر اجازه می‌دهد برای آشنایی با قابلیت های سایت به جای دستکاری محتواهای منتشر شده از این محیط استفاده کنند.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

زباله روبی Garbage Collection – GC

زباله روبی یا جمع آوری زباله (Garbage Collection) چیست؟

زباله روبی (Garbage Collection یا به اختصار GC) اصطلاحی در حوزه مدیریت و بازیابی خودکار حافظه (مموری) است و به فرایندی اشاره می‌کند که طی آن فضای اشغال شده توسط اشیائی که مورد نیاز برنامه نیستند به صورت خودکار آزاد می‌شود.

وظیفه انجام این کار بر عهده عاملی موسوم به زباله روب یا جمع آوری کننده زباله (Garbage Collector) است. این عامل تلاش می‌کند فضایی از حافظه که حین ایجاد و استفاده از یک شئ به آن اختصاص داده (Allocate) شده است و دیگر برنامه به آن نیازی ندارد را برای استفاده مجدد آزاد کند (از این رخداد با عنوان Deallocate کردن یا نابود کردن (Destroy) شئ نیز یاد می‌شود). اشیاء مذکور اصطلاحا با نام زباله (Garbage) یا اشیاء مرده (Dead Objects) شناخته می‌شوند.

جالب است بدانید Garbage Collection اولین بار توسط جان مک کارتی (John McCarthy) در سال 1959 برای زبان Lisp طراحی شد.

زباله روبی در نقطه مقابل مدیریت دستی حافظه (Manual Memory Management) قرار می‌گیرد که در آن شخص برنامه نویس وظیفه دارد اشیائی که دیگر به آن‌ها نیازی نیست را مشخص و حافظه منتسب به آن‌ها را آزاد کند.

در اغلب زبان های برنامه نویسی سطح بالا از قابلیت Garbage Collection به صورت پیشفرض یا درونی ساز (built-in) پشتیبانی می‌شود. البته برخی از زبان های امروزی علاوه بر زباله روبی خودکار از قابلیت‌هایی برای مدیریت دستی حافظه نیز برخوردار هستند. در مورد تعدادی از زبان های سطح پایین‌تر نظیر C و C++ که در آن‌ها اساسا برنامه نویس مسئول جمع آوری کردن زباله هاست امکان استفاده از پیاده سازی های Garbage Collection وجود دارد.

در بسیاری از زبان های برنامه نویسی متدی موسوم به Destructor (مخرب یا نابودساز) یا Finalizer (نهایی ساز) در کلاس ها قابل تعریف است که هنگام نابودی شئ فراخوانی می‌شود. این تابع برخلاف تابع سازنده نمی‌تواند هیچ پارامتری داشته باشد.

مزایا و معایب زباله روبی

زباله روبی علاوه بر تسهیل برنامه نویسی به جلوگیری از بروز مشکلات و باگ های مربوط به مدیریت دستی حافظه نیز کمک می‌کند. برای مثال فراموش کردن یا نادیده گرفتن آزادسازی فضای متعلق به زباله ها توسط برنامه نویس یکی از مشکلات مدیریت دستی حافظه به شمار می‌رود که می‌تواند به کمبود حافظه بیانجامد. آزادسازی مضاعف (Double free) حافظه‌ای که قبلا آزاد شده است نیز یکی دیگر از باگ هایی است که حین انجام این کار توسط برنامه نویس ممکن است رخ دهد.

در عین حال این نکته را نیز در نظر داشته باشید که جمع آوری زباله می‌تواند معایبی همچون کاهش سرعت اجرای برنامه و مصرف منابع بیشتر را نیز به همراه داشته باشد. همچنین معمولا زمان دقیق Garbage Collection غیرقابل پیش بینی و تقریبا غیر قابل کنترل است.

روش های جمع آوری زباله

موضوعی که در Garbage Collection از اهمیت بالایی برخوردار است شناسایی اشیاء بلااستفاده یا به عبارت بهتر اشیائی است که شایسته زباله روبی هستند.

زباله روبی با کمک ردیابی (Tracing garbage collection)، رایج‌ترین و اصلی‌ترین روش برای شناسایی و جمع آوری زباله ها به شمار می‌رود. در این روش پس از ردیابی اشیاء قابل دسترسی (Reachable) در زنجیره‌ای از ارجاعات، سایر اشیاء به عنوان گزینه‌هایی که می‌بایست حافظه تخصیصی به آن‌ها آزاد شود شناسایی می‌شوند.

در روشی دیگر موسوم به شمارش ارجاعات (Reference Counting garbage collection) تعداد ارجاعات به هر شئ نگه داری می‌شود و در صورتی که برای یک شئ، این عدد برابر با صفر باشد به عنوان زباله تشخیص داده می‌شود و حافظه تخصیصی به آن آزاد خواهد شد.

در تصویر زیر می‌توانید نمایی مفهومی از مراحل انجام یک Garbage Collection فرضی را مشاهده کنید. همان‌طور که در این تصویر می‌بینید زباله روب مورد مثال پس از شناسایی و آزادسازی فضای اشغال شده توسط زباله ها، فضای مربوط به اشیاء قابل دسترس (یا زنده) را در کنار یکدیگر مرتب (اصطلاحا کامپکت Compact) می‌کند تا سرعت اجرای برنامه افزایش یابد.

زباله روبی Garbage Collection
نمایی مفهومی از یک فرایند متداول Garbage Collection

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

تگ یا برچسب Tag

تگ یا Tag چیست؟

تگ (Tag) در مفهوم عام به برچسب (یا لیبل) هایی گفته می‌شود که برای شناسایی یا فراهم آوردن اطلاعاتی پیرامون یک شئ یا موجودیت به آن تخصیص داده می‌شود. این اصطلاح در حوزه‌های مختلف مرتبط با رایانه نیز دارای مفاهیم مشابهی است. به عنوان مثال تگ در زبان های نشانه گذاری برای تعیین المان های مختلف استفاده می‌شود و همچنین به گونه‌ای از فراداده ها گفته می‌شود که معمولا در قالب یک کلمه کلیدی یا واژه‌ای پرکاربرد به داده اصلی نسبت داده می‌شود.

1 . تگ در زبان های نشانه گذاری

همان‌طور که گفته شد در زبان های نشانه گذاری نظیر HTML و XML، از Tag ها برای مشخص کردن المان ها و اجزای مختلف سند استفاده می‌شود. به این ترتیب که محتوای المان ها (در صورت وجود) در میان تگ های آغازین و پایانی محصور می‌شود و خصوصیات هر المان نیز با کمک ویژگی (Property) هایی مشخص می‌شود که در تگ آغازین بیان می‌شود.

به عنوان مثال، در قطعه کد HTML زیر از تگ آغازین <p> و تگ پایانی </p> برای تعریف یک المان پاراگراف استفاده شده است. همان‌طور که در این مثال مشاهده می‌کنید تگ پایانی با افزودن یک نماد / به ابتدای نام تگ آغازین به دست آمده است و از ویژگی style برای تراز کردن پاراگراف با کمک قوانین CSS استفاده شده است.

<p style="text-align: justify;">This is a Paragraph.</p>

البته فراموش نکنید برخی از تگ ها (نظیر <img> در HTML) الزاما نیازی به تگ پایانی ندارند.

2 . تگ (یا برچسب) به عنوان فراداده

در دنیای امروزی، اختصاص دادن برچسب به بسیاری از موجودیت ها و داده های دیجیتال (نظیر پست های شبکه های اجتماعی، صفحات وب، فایل ها و …) به امری رایج تبدیل شده است. این فرایند که با عنوان برچسب گذاری (Tagging) شناخته می‌شود معمولا با نسبت دادن برچسب های متنی به یک موجودیت صورت می‌گیرد و غالبا توسط فرد ایجاد کننده یا استفاده کننده از آن انجام می‌شود. برچسب گذاری به عنوان روشی برای توصیف و دسته بندی موجودیت ها شناخته می‌شود و به کاربران کمک می‌کند موضوعات مورد نظر خود را به آسانی جستجو کنند یا میان تگ های مرتبط گردش کنند.

هرچند برچسب گذاری دارای تاریخچه‌ای بسیار قدیمی‌تر از دنیای رایانه هاست اما فراگیری آن در این حوزه با ظهور وب 2.0 و به ویژه با رشد شبکه های اجتماعی، سامانه های اشتراک تصویر و ویدئو، وبلاگ ها و … رقم خورد. برای مثال در وبلاگ ها و سیستم های مدیریت محتوا، نویسنده می‌تواند به هر نوشته (یا پست)، برچسب‌هایی حاوی واژه‌های مرتبط با موضوع آن نوشته اختصاص بدهد. به عنوان نمونه در یک وبسایت خبری برای نوشته‌ای که مربوط به تغییر مربی یک تیم فوتبال است برچسب هایی نظیر ورزش، فوتبال و مربی مناسب به نظر می‌رسد. این Tag ها معمولا جایی در صفحه مربوط به پست در قالب یک لینک نمایش داده می‌شوند و کاربر با کلیک روی آن‌ها به صفحه‌ای دیگر هدایت می‌شود که حاوی فهرستی از تمام نوشته‌های دارای آن تگ می‌باشد.

برچسب - تگ Tag
سه برچسب در انتهای یک پست

در مورد فایل ها به خصوص فایل های چند رسانه ای، برچسب گذاری به توصیف محتوای فایل با اطلاعاتی نظیر نام خواننده، ژانر موسیقی، سال انتشار، کپی رایت و … کمک می‌کند. ویرایشگرهای برچسب (Tag Editor) نرم افزارهای ویژه‌ای هستند که امکان ویرایش تخصصی این فراداده ها را میسر می‌کنند.

ابر برچسب

مفهوم مرتبط دیگری به نام ابر برچسب (Tag Cloud) در برخی از وبسایت ها وجود دارد که برای نمایش مجموعه‌ای از مهم‌ترین تگ های سایت کنار یکدیگر به کار می‌رود. در ابر برچسب که معمولا در نوار کناری یا فوتر سایت نمایش داده می‌شود متناسب با اهمیت و فراوانی استفاده از برچسب ها، واژه مربوط به آن‌ها با اندازه‌های مختلف یا رنگ‌های متمایز نمایش داده می‌شود و به این ترتیب ظاهری مشابه با یک ابر را برای کاربر تداعی می‌کند.

ابر برچسب - ابر تگ Tag Cloud
نمونه ای از یک ابر برچسب

هشتگ

هشتگ (Hashtag) ها گونه رایجی از تگ ها هستند که با نماد # آغاز می‌شوند. این شیوه معمولا برای ایجاد برچسب در شبکه های اجتماعی نظیر اینستاگرام و فیس بوک و سایر رسانه های اجتماعی استفاده می‌شود.

چالش ها

در کنار مزایایی که استفاده از تگ ها به همراه دارند این حوزه هم از نفوذ اسپم ها (در قالب تگ هایی بدون ارتباط به محتوا که برای جذب بازدیدکنندگان درج می‌شود) در امان نمانده است. یکی دیگر از چالش های رایج برچسب گذاری به تگ های یکسانی مربوط می‌شود که دارای معانی مختلفی هستند (برای مثال واژه “نوقا” نه تنها نام نسخه ای از سیستم عامل اندروید است بلکه نام یک شیرینی خوشمزه هم هست؛ درنتیجه کاربری که به دنبال شیرینی نوقا می‌گردد احتمالا با نتایج مربوط به یک سیستم عامل غیر قابل خوردن هم روبرو می‌شود!)

3 . سایر مفاهیم

در برخی از رسانه های اجتماعی نظیر فیس بوک و اینستاگرام منظور از تگ کردن یک شخص، اختصاص دادن لینکی به صفحه حساب کاربری او در یک پست است. به این ترتیب بازدیدکننده با کمک این لینک در پست شما می‌تواند به صفحه موردنظرتان هدایت شود.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

مبهم سازی Obfuscation

مبهم سازی یا Obfuscation چیست؟

مبهم سازی (Obfuscation) در حوزه توسعه نرم افزار به فرایند ایجاد سورس کدهایی گفته می‌شود که درک آن‌ها برای انسان دشوار است. معمولا از روش‌های مبهم سازی برای پنهان کردن هدف و منطق پشت پرده کد یا مقادیر گنجانده شده در آن استفاده می‌کنند و به این ترتیب احتمال مداخله و مهندسی معکوس را کاهش داده یا آن را به یک معما و سرگرمی برای افرادی تبدیل می‌کنند که قصد خواندن آن را دارند.

مبهم سازی ممکن است به صورت دستی یا با کمک ابزارهای مخصوصی موسوم به مبهم ساز (Obfuscator) انجام شود. این ابزارها بسته به زبان های مورد پشتیبانی قادر هستند روی فایل کامپایل شده یا سورس کد با روش های مختلف به ایجاد ابهام بپردازند. فراموش نکنید در هر حال با اِعمال مبهم سازی نباید عملکرد برنامه تغییر پیدا کند. علاوه بر این، تکنیک ها و ابزارهایی نیز وجود دارد که تلاش می‌کنند معکوس عمل مبهم سازی (Deobfuscation) را انجام دهند و از روی فایل اجرایی مبهم شده یا سورس کد مبهم شده به سورس اصلی و قابل درک دست پیدا کنند.

مبهم سازی کد Obfuscation
ایجاد ابهام در سورس کد، درک آن را دشوارتر می‌کند.

جالب است بدانید مسابقات برنامه نویسی معتبری (نظیر International Obfuscated C Code Contest) وجود دارد که در آن‌ها به بهترین کدهای مبهم شده و خلاقانه‌ترین روش‌ها جوایزی داده می‌شود.

در نظر داشته باشید حتی اگر سورس برنامه را منتشر نمی‌کنید در بسیاری از موارد (نظیر برنامه های نوشته شده به زبان های دات نت و اپلیکیشن های اندروید) به راحتی می‌توان با کمک دیکامپایلرها به سورس کد برنامه دست پیدا کرد. از همین رو پیش از انتشار یک نرم افزار اختصاصی، توصیه می‌شود از ابزارهای محافظت از کد استفاده کنید.

تکنیک ها و اهداف مبهم سازی

در مبهم سازی معمولا از عباراتی استفاده می‌شود که به افزایش پیچیدگی سورس کد می‌انجامد. نام گذاری متغیرها و توابع به صورت گمراه کننده یا بی‌معنا، استفاده از کامنت های فریب دهنده یا نگارش بخشی از کد به شکلی که به نظر یک کامنت بیاید، کدگذاری رشته ها، حذف فراداده های راهنمایی کننده، حذف یا افزودن فاصله، ایجاد ابهام در Control Flow، اضافه کردن کدهای بی‌ربط و نوشتن کد با فرم و شکلی جالب از جمله روش‌هایی است که برای این منظور به کار می‌رود.

در تصویر زیر مثالی از انجام یک مبهم سازی ساده به صورت خودکار را مشاهده می‌کنید که در آن صرفا با تغییر نام تابع و برخی از متغیرها همراه با رمزنگاری رشته، درک عملکرد کد دشوارتر شده است.

مبهم سازی Obfuscation
نمونه‌ای از یک قطعه کد ساده قبل و پس از انجام مبهم سازی توسط نرم افزار Dotfuscator

افزون بر جنبه های سرگرمی، چالش های ذهنی، محافظت در برابر مهندسی معکوس (تبدیل فایل کامپایل شده به سورس کد) و جلوگیری از ایجاد تغییرات در سورس کد به منظور استفاده در پروژه‌های نرم افزاری دیگر، مبهم سازی سورس کد در حوزه امنیت نیز مزایایی به همراه دارد. پنهان سازی بخش‌های مهم امنیتی و دشوارسازی کشف آسیب پذیری ها یا راه‌های نفوذ از جمله این مزایا به شمار می‌روند.

از سوی دیگر، مخفی کردن کدهای مخرب در سورس کد یکی از کاربردهای منفی و مهم Obfuscation به شمار می‌رود چرا که در این صورت، شناسایی و درک هدف آن‌ها به مراتب دشوارتر از حالت معمولی خواهد بود. همین موضوع می‌تواند به یکی از معایب کدهای مبهم شده به خصوص در مورد زبان های تفسیری تبدیل شود. برای مثال برخی از نرم افزارهای امنیتی در صورت شناسایی کدهای مبهم شده جاوا اسکریپت در صفحات وب به کاربر هشدار می‌دهند و به این ترتیب اعتبار سایت حاوی این کدها در میان کاربران مخدوش می‌شود.

در سایر حوزه ها

مبهم سازی صرفا به حوزه برنامه نویسی محدود نمی‌شود. به عنوان مثال در مورد ترافیک شبکه، این اصطلاح به روش‌هایی اشاره می‌کند که سعی دارند ترافیک واقعی شما را از دید دیگران پنهان کنند. چنین تکنیک‌هایی به خصوص هنگام اتصال به شبکه هایی کاربرد دارد که دسترسی به آن‌ها از نظر نهادها و ارائه کنندگان خدمات شبکه مجاز نیست یا احتمال مسدودسازی آن‌ها وجود دارد.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

پچ یا وصله Patch

وصله یا Patch چیست؟

پچ (Patch) یا وصله به مجموعه‌ای از تغییرات گفته می‌شود که به منظور بروزرسانی، تعمیر یا بهبود یک نرم افزار رایانه ای به کار می‌رود. این تغییرات ممکن است برای رفع آسیب پذیری های امنیتی و باگ های مختلف نرم افزار، بهبود نحوه استفاده یا کارایی و افزودن ویژگی های جدید به نرم افزار ایجاد شوند.

پچ ها معمولا در فایل های اجرایی یا اجزای نرم افزار تغییراتی ایجاد می‌کنند یا به طور کامل آن‌ها را با نمونه‌های جدید جایگزین می‌کنند. حتی در برخی از نرم افزارهای منبع باز، وصله ها در قالب تغییرات سورس کد از طرف توسعه دهندگان مختلف منتشر می‌شوند که در این صورت وظیفه کامپایل آن‌ها بر عهده کاربر خواهد بود.

محتویات پچ ها بسته به میزان تغییرات در ابعاد مختلف (از چند کیلوبایت گرفته تا چند صد مگابایت) عرضه می‌شوند. در برخی موارد از اصطلاح سرویس پک (Service Pack) برای پچ های بزرگ‌تر استفاده می‌شود. جالب است بدانید علاوه بر سیستم عامل ها، معمولا وصله هایی که برای بروزرسانی و اعمال تغییرات در بازی های رایانه ای عرضه می‌شوند نیز به دلیل داشتن فایل های گرافیکی دارای حجم بالایی هستند.

وصله های امنیتی (Security Patches) از جمله مهم ترین انواع وصله هایی هستند که برای رفع آسیب پذیری های امنیتی (به خصوص در مورد سیستم عامل ها) منتشر می‌شود.

پچ - وصله - بروزرسانی Patch - Update
پچ ها برای بروزرسانی، تعمیر یا بهبود نرم افزارهای رایانه ای منتشر می‌شوند.

بروزرسانی و اعمال پچ ها

امروزه معمولا دریافت وصله ها برای نرم افزارها و سیستم عامل های مختلف به سادگی از طریق اینترنت انجام می‌شود و اعمال آن‌ها نیز بدون نیاز به درگیری کاربر با جزئیات فنی این فرایند صورت می‌گیرد. در اغلب نرم افزارهای پرکاربرد مکانیزمی طراحی می‌شود که به صورت دوره‌ای در دسترس بودن وصله های جدید را بررسی می‌کند و به صورت خودکار یا پس از تأیید کاربر پروسه دریافت و اعمال آن‌ها را آغاز می‌نماید.

در مورد تغییرات گسترده (نظیر آنچه درباره سرویس پک ها برای نسخه های قدیمی‌تر سیستم عامل ویندوز مشاهده می‌شد) ممکن است فرایند اعمال تغییرات در قالب بسته هایی حجیم صورت گیرد که کاربر می‌بایست به صورت مستقیم برای نصب آن‌ها اقدام کند.

هرچند نصب خودکار پچ ها به خصوص در مورد سیستم عامل ها و سرورها از اهمیت بالایی در حفظ امنیت و رفع مشکلات سیستم برخوردار است اما ذکر این نکته ضروری است که در برخی موارد، بروزرسانی یا اعمال وصله هایی که به درستی طراحی نشده‌اند می‌تواند باعث از کار افتادن نرم افزار یا بروز مشکلات جدید شود. همین موضوع منجر شده است برخی از مدیران سیستم ترجیح دهند پیش از اقدام به نصب وصله ها و بروزرسانی نرم افزار از صحت عملکرد بخش‌های تغییر یافته مطمئن شوند. معمولا امکان انتخاب استراتژی مناسب در خصوص نحوه بروزرسانی از طریق بخش تنظیمات نرم افزار یا سیستم عامل در اختیار کاربران قرار می‌گیرد.

در بسیاری از موارد، نهایی شدن و اعمال این تغییرات نیازمند بسته شدن نرم افزار یا ری استارت کردن سیستم خواهد بود. با اینحال بروزرسانی های پویا این امکان را فراهم می‌کنند که حین اجرای نرم افزار، تغییرات لازم اعمال شود. گفتنی است اغلب پس از نصب پچ ها، نسخه نرم افزار نیز تغییر می‌کند.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

الحاق Concatenation

الحاق یا Concatenation چیست؟

الحاق (Concatenation) یا الحاق رشته ای (String Concatenation) در زبان های برنامه نویسی به عملی گفته می‌شود که طی آن رشته هایی از کاراکترها به یکدیگر متصل می‌شوند.

حاصل این عمل که معمولا به عنوان عملی دوتایی تعریف می‌شود رشته ای است که از قرار دادن محتوای عملوند دوم پس از محتوای عملوند اول به دست می‌آید. به عنوان مثال حاصل عمل الحاق روی دو رشته “سلام ” و “دنیا!” رشته‌ای تازه به صورت “سلام دنیا!” خواهد بود. به وجود کاراکتر فاصله در انتهای رشته اول توجه کنید؛ در صورتی که این کاراکتر را حذف کنید نتیجه به صورت “سلامدنیا!” درمی‌آید.

الحاق Concatenation
عمل الحاق در زبان های برنامه نویسی برای ایجاد رشته ای از ترکیب دو رشته دیگر به کار می‌رود.

الحاق در زبان های برنامه نویسی

عملگر الحاق در زبان های برنامه نویسی معمولا یک عملگر دوتایی یا باینری به شمار می‌رود. در بسیاری از زبان ها نظیر جاوا (Java) و جاوا اسکریپت (JavaScript) و سی شارپ (C#) و سی پلاس پلاس (C++) از نماد + برای این عملگر استفاده می‌شود. از جمله نمادهای رایج دیگری که به عنوان عملگر Concatenation در زبان های برنامه نویسی مورد استفاده قرار می‌گیرد می‌توان به نماد نقطه (یا .) در زبان های پی اچ پی (PHP) و پرل (Perl) یا نماد & در زبان ویژوال بیسیک (Visual Basic) اشاره کرد.

در قطعه کد زیر که به زبان جاوا نوشته شده است می‌توانید نحوه الحاق دو رشته معمولی برای نمایش در خروجی را مشاهده کنید.

System.out.println("Today is " + "Saturday");

همان‌طور که در مثال بالا مشخص است می‌توان از همان ابتدا این دو رشته را در قالب رشته “Today is Saturday” و بدون استفاده از عملگر الحاق نوشت. اما در مواردی که حداقل یکی از عملوندها دارای مقداری متغیر است استفاده از این عملگر به کمک برنامه نویس خواهد آمد. به عنوان نمونه اگر getWeekDay() تابعی باشد که متناسب با تاریخ فعلی، روز هفته را به شکل یک رشته برمی‌گرداند قطعه کد زیر برای آن مناسب خواهد بود:

System.out.println("Today is " + getWeekDay());

به عنوان مثالی دیگر فرض کنید در حال توسعه بخشی از یک وب اپلیکیشن هستید و قرار است در بخشی از صفحه با کمک یک اعلان، کاربر را از داشتن یا نداشتن پیام جدید با خبر سازید. در چنین حالتی ممکن است از عمل الحاق برای ایجاد متن اعلان کمک گرفته شود. عملوند اول را می‌توانید در قالب رشته ای ثابت با عبارت “پیام جدیدی ” درنظر بگیرید اما عملوند دوم متغیری از نوع رشته خواهد بود و متناسب با اینکه در صندوق ورودی کاربر، پیام جدیدی وجود دارد یا خیر به ترتیب با مقدار “دارید.” یا “ندارید!” ست می‌شود. پس از الحاق این دو عملوند، متن اعلان به صورت “پیام جدیدی دارید.” یا “پیام جدیدی ندارید!” ساخته می‌شود.

علاوه بر این در برخی از زبان ها به جای استفاده از عملگر می‌توان از متدهای ویژه‌ای برای اتصال رشته ها به یکدیگر کمک گرفت. برای مثال در زبان جاوا متد concat() از کلاس String برای همین منظور در نظر گرفته شده است.

مفاهیم مرتبط

عمل الحاق به برخی از حوزه های دیگر نیز به شکلی مشابه تعمیم داده می‌شود. به عنوان مثال در نظریه زبان فرمال، عمل الحاق زبان ها (یا مجموعه هایی از رشته ها) به این ترتیب تعریف می‌شود که اگر A و B دو زبان فرمال باشند آنگاه عمل الحاق آن ها شامل تمام رشته هایی به صورت vw خواهد بود که v رشته ای از A و w رشته ای از B باشد. با فرض اینکه A={ab,ac,c} و B={e,ef} باشد حاصل عمل فوق روی این دو زبان به صورت AB={abe,ace,ce,abef,acef,cef} خواهد بود.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

نرم افزار کراس پلتفرم Cross-Platform Software

نرم افزار کراس پلتفرم یا Cross-Platform Software چیست؟

نرم افزار کراس پلتفرم (Cross-Platform Software) به نرم افزاری گفته می‌شود که برای چند پلتفرم رایانشی پیاده سازی شده است. به عبارت بهتر کراس پلتفرم ها نرم افزارهایی هستند که روی چند محیط یا بستر رایانشی شامل سخت افزارها یا سیستم عامل های مشخص و مختلف قابل اجرا هستند. به عنوان مثال دو سیستم رایانه ای، یکی با معماری x86 که روی آن سیستم عامل ویندوز نصب شده است و دیگری یک رایانه مک با سیستم عامل مکینتاش می‌توانند پلتفرم هایی برای اجرای یک نرم افزار کراس پلتفرم باشند. به این نرم افزارها، نرم افزارهای چند پلتفرمی یا چند سکویی (Multi-Platform) و مستقل از پلتفرم (Platform-Independent) نیز گفته می‌شود.

گفتنی است برنامه ای که حداقل روی دو پلتفرم قابل اجراست یک برنامه کراس پلتفرم به شمار می‌رود. اما اگر تصور می‌کنید چند پلتفرمی بودن صرفا به رایانه ها و آن هم نرم افزارهای کاربردی محدود می‌شود کاملا در اشتباه هستید و لازم است بدانید این اصطلاح حتی به دنیای بازی های ویدیویی نیز ورود پیدا کرده است. شما می‌توانید بازی‌های محبوب فراوانی را پیدا کنید که روی پلتفرم‌های مختلف نظیر کنسول های Xbox و PlayStation، رایانه ها و گوشی های همراه با سیستم عامل های مختلف قابل اجرا هستند.

نرم افزار کراس پلتفرم یا چند پلتفرمی Cross-Platform Software
یک نرم افزار کراس پلتفرم نرم افزاری است که روی چند پلتفرم مختلف قابل اجراست.

انواع نرم افزارهای چند پلتفرمی

نرم افزارهای چند پلتفرمی را می‌توان از لحاظ فنی به دو گروه دسته بندی نمود. در دسته اول، نرم افزار برای پلتفرم های مختلف به صورت مجزا در اختیار کاربران قرار می‌گیرد تا متناسب با پلتفرم مورد استفاده، نسخه مناسب را دریافت کرده و روی سیستم خود اجرا کنند. به عنوان مثالی برای این نوع نرم افزارها می‌توان به مرورگر وب گوگل کروم اشاره کرد که دارای نسخه‌های مختلف قابل اجرا روی سیستم عامل های گوناگون از جمله مایکروسافت ویندوز، لینوکس، مک او اس، آی اُ اس و اندروید می‌باشد.

در دسته دوم، نرم افزار بدون نیاز به آماده سازی خاصی روی پلتفرم های مختلف به صورت مستقیم قابل اجرا خواهد بود. به عنوان نمونه‌های رایجی از این دسته می‌توان به نرم افزارهایی اشاره کرد که سورس کد آن‌ها به یک زبان تفسیری نوشته شده است و مفسرهای آن‌ها روی تعداد قابل توجهی از پلتفرم های مرسوم به صورت پیش فرض یا متداول در دسترس است. همچنین برنامه هایی در قالب بایت کدهای از پیش کامپایل شده که اجزای استانداردی به منظور اجرای آنها روی پلتفرم های مختلف موجود است در همین دسته قرار می‌گیرند (نظیر ماشین مجازی Java Virtual Machine برای برنامه های جاوا).

وب اپلیکیشن ها معمولا به عنوان نرم افزارهای کراس پلتفرم دسته دوم شناخته می‌شوند چرا که در مرورگرهای وب مختلفی که روی سیستم عامل ها و سخت افزارهای مختلف نصب شده‌اند قابل اجرا هستند. این گونه از نرم افزارها (نظیر وب میل) معمولا بر پایه ساختار کلاینتسرور شکل می‌گیرند و برای هر عملی بخشی از پردازش های لازم روی سرور انجام شده، نتیجه برای کلاینت ارسال می‌شود. در مورد وب اپلیکیشن ها و حتی محتوای صفحات وب، رعایت اصول طراحی واکنشگرا باعث تضمین نمایش مناسب و کارآمد آن در دستگاه‌های مختلف از گوشی های هوشمند گرفته تا رایانه های رومیزی می‌شود.

توسعه نرم افزار کراس پلتفرم

معمولا ساخت نرم افزارهای چند پلتفرمی در مقایسه با نرم افزارهای تک پلتفرمی زمانبرتر و دشوارتر است چرا که سیستم عامل ها و معماری های مختلف سخت افزاری دارای واسط های برنامه نویسی کاربردی (API) مختلف و ساختارهای مخصوص به خودشان هستند. بنابراین برنامه ای که برای یک سیستم عامل یا معماری رایانه ای به خصوص توسعه یافته است روی سایر پلتفرم ها به طور معمول قابل اجرا نخواهد بود.

از آنجایی که توسعه یک نرم افزار چند پلتفرمی از طریق نوشتن سورس کدهای مختلف برای هر پلتفرم به افزایش هزینه‌ها و زمان موردنیاز برای توسعه منجر خواهد شد لذا توسعه دهندگان به دنبال روش‌های ساده‌تری برای ایجاد این نوع نرم افزارها هستند. تجرید پلتفرم (Platform Abstraction) از جمله این روش‌هاست که کمک می‌کند برنامه حاصل بدون توجه به اینکه روی چه معماری رایانه ای یا سیستم عاملی قرار گرفته است قابل اجرا باشد (درست نظیر برنامه هایی که روی یک Java Virtual Machine اجرا می‌شوند). “یک بار بنویس، همه جا اجرا کن” (Write Once, Run Anywhere) مفهومی محبوب در میان توسعه دهندگان نرم افزارهای کراس پلتفرم است که در همین راستا رایج شده است و اجازه می‌دهد کد نوشته شده روی هر پلتفرمی اجرا شود. البته ممکن است در توسعه بخش‌هایی از این نوع برنامه ها برای پلتفرم های مختلف از ویژگی‌های خاص آن پلتفرم نیز استفاده شود که در هر حال در مقایسه با کدنویسی های مجزا برای پلتفرم های مختلف آسان‌تر خواهد بود.

علاوه بر این، ابزارهای توسعه کراس پلتفرم نیز به منظور تسهیل ساخت نرم افزارهای چند پلتفرمی در دسترس توسعه دهندگان قرار دارد. از جمله این ابزارها می‌توان به فون گپ (PhoneGap)، زامارین (Xamarin)، اپسلریتر (Appcelerator)، الکترون (Electron) و 8th اشاره کرد.

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

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا

حلقه For each

حلقه For each چیست؟

حلقه For each (یا For-each) گونه‌ای از حلقه ها در زبان های برنامه نویسی است که برای پیمایش مجموعه ای از عناصر (نظیر عناصر موجود در یک آرایه) به کار می‌رود.

دستورات بدنه در حلقه های For each به جای اینکه به تعداد دفعات مشخصی اجرا شوند، به ازای هر عنصر موجود در مجموعه یک مرتبه تکرار می‌شوند. در این نوع حلقه ها، برخلاف حلقه های For از شمارنده خبری نیست بلکه در آن‌ها از متغیری هم نوع با عناصر مجموعه کمک گرفته می‌شود که در هر تکرار از حلقه، نمایانگر عنصر جاری در آن مجموعه خواهد بود.

در قطعه کد زیر که به زبان جاوا نوشته شده است نحوه استفاده از این نوع حلقه ها برای پیمایش عناصر موجود در یک آرایه عددی نمایش داده شده است. متغیر number در هر تکرار از حلقه معادل با یکی از عناصر آرایه numbers می‌باشد و چنانکه مشاهده می‌کنید از همان نوع عناصر آرایه (یعنی int) تعریف شده است.

حلقه For each
نمونه‌ای از یک حلقه For each در زبان جاوا – این نوع حلقه ها در زبان جاوا با نام حلقه For بهبودیافته یا Enhanced For Loop نیز شناخته می‌شوند.

مزایا و محدودیت های حلقه For each

هر چند با در نظر گرفتن تعداد اعضای موجود در مجموعه و همین طور اندیس شروع عناصر می‌توان عمل پیمایش مجموعه را با کمک یک حلقه For نیز انجام داد اما در مورد استفاده از حلقه های For each حداقل دو مزیت را می‌توان در نظر گرفت. مزیت اول اینکه به کار بردن این حلقه ها از بروز خطاهای مربوط به تعیین کران ها (که ممکن است در حلقه های For رخ دهد) جلوگیری می‌کند (به خصوص در مورد خطاهای رایجی موسوم به Off-by-one Error که در آن به اشتباه کران های حلقه یک واحد کم یا زیاد تعیین می‌شود – این نوع خطاها معمولا در اثر عواملی نظیر عدم توجه به اندیس آغازین مجموعه ها در زبان مورد استفاده و همچنین استفاده نادرست از نماد به جای < یا بالعکس اتفاق می‌افتد). علاوه بر این، حلقه های For each در مقایسه با حلقه های معادل For به بهبود خوانایی کد نهایی کمک می‌کنند.

قطعه کد زیر، پیاده سازی مثال قبلی را با کمک حلقه For استاندارد نمایش می‌دهد. متغیر i (شمارنده) در هر تکرار از حلقه به اندیس کنونی عنصر مربوطه در آرایه numbers اشاره می‌کند و در هر تکرار یک واحد به آن افزوده می‌شود. بنابراین به هنگام چاپ نتیجه در خروجی، به جای مقدار متغیر i از مقدار numbers[i] استفاده شده است. همانطور که مشاهده می‌کنید قطعه کد بالا در مقایسه با نمونه زیر نه تنها خواناتر است بلکه احتمال خطای کدنویسی را نیز کاهش می‌دهد.

حلقه For
نمونه معادل مثال فوق با کمک حلقه For معمولی

در کنار مزایایی که گفته شد لازم است تأکید کنیم حلقه های For each غالبا در مواردی مناسب هستند که قرار است تمام عناصر موجود در مجموعه مورد پیمایش قرار گیرند. به عبارت بهتر در این حلقه ها همواره طول گام همان عدد 1 رو به جلو خواهد بود. با این حال در این نوع حلقه ها هم می‌توانید از دستورات ویژه‌ای (نظیر دستور continue و break در جاوا) که برای ادامه حلقه از تکرار بعدی و خروج زودهنگام از حلقه تدارک دیده شده است استفاده کنید.

پیوندهای پیشنهادی تک دیک

لینک واژه در ویکیپدیا