بایگانی دسته بندی ها: فنی

همتا به همتا Peer to Peer – P2P

همتا به همتا یا Peer to Peer چیست؟

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

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

هرچند کاربرد شبکه های P2P به زمان‌های پیش‌تر باز می‌گردد اما فراگیری و محبوبیت آن را باید مدیون سامانه‌های اشتراک فایل (به ویژه اپلیکیشن اشتراک موسیقی Napster – تأسیس در سال 1999) دانست.

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

ویژگی ها، مزایا و معایب

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

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

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

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

همتا به همتا و کلاینت - سرور Peer to Peer and Client - Server
مقایسه مفهومی مدل های همتا به همتا و کلاینت – سرور. در مدل P2P (سمت چپ) تمام گره‌ها هم نقش کلاینت را ایفا می‌کنند و هم منابع خود را در قالب یک سرور به اشتراک می‌گذارند. در حالی که در مدل کلاینت – سرور (سمت راست) کلاینت‌ها خدمات و منابع موردنیاز خود را از یک سرور مرکزی درخواست می‌کنند.

از ترکیب مدل همتا به همتا و کلاینت – سرور، مدل‌های هیبریدی شکل می‌گیرند. در یک مدل هیبریدی متداول از یک سرور مرکزی برای کمک به همتاها جهت یافتن یکدیگر، جستجوی نام فایل‌هایی که توسط همتاها به اشتراک گذاشته شده و … استفاده می‌شود.

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

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

واحد محاسبه و منطق Arithmetic Logic Unit – ALU

واحد محاسبه و منطق یا Arithmetic Logic Unit چیست؟

واحد محاسبه و منطق (Arithmetic Logic Unit به اختصار ALU) یک مدار الکترونیک دیجیتال ترکیبی است که قادر به انجام اعمال منطقی و حسابی روی اعداد صحیح باینری می‌باشد. این واحد به عنوان یکی از اجزای اساسی در بسیاری از مدارات رایانه ای (از جمله واحد پردازش مرکزی یا CPU و واحد پردازش گرافیکی یا GPU) به شمار می‌رود.

ساختار واحد محاسبه و منطق

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

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

واحد محاسبه و منطق Arithmetic Logic Unit - ALU
نمایی ساده از وروی‌ها و خروجی‌ها در یک ALU

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

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

مدار منطقی یک ALU ساده
مدار منطقی 74181 – یک ALU ساده چهار بیتی

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

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

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

اسپاگتی کد Spaghetti Code

اسپاگتی کد یا Spaghetti Code چیست؟

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

استفاده از دستورات GOTO به عنوان روشی برای جهش (که زبان های برنامه نویسی قدیمی وابستگی بیشتری به آن داشتند و در بسیاری از زبان های امروزی نیز از آن پشتیبانی می‌شود) یکی از شایع ترین دلایل ایجاد کدهای درهم پیچیده و دارای جریان کنترلی (Control Flow) آشفته به شمار می‌رود. به این معنا که ترتیب اجرای دستورات در این سورس کدها برخلاف برنامه نویسی ساخت یافته استاندارد به شکلی واضح و قابل فهم نمی‌باشد و همانند یک بشقاب اسپاگتی دارای رشته‌هایی است که از ابتدا تا انتها با پیچ و خم‌های فراوان همراه می‌شود. طبیعتا دستکاری و تغییر قطعه‌ای از این کدها به گونه‌ای که باعث بروز مشکل در سایر بخش‌های آن نشود کار ساده‌ای نخواهد بود؛ درست مانند جدا کردن یک قاشق از اسپاگتی که معمولا باعث می‌شود رشته‌های دیگری که در بشقاب قرار دارد نیز قطع شوند!

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

اسپاگتی کد Spaghetti Code
نمایی مفهومی از روند اجرای دستورات در یک قطعه کد اسپاگتی مملو از جهش همانند رشته‌های موجود در یک بشقاب اسپاگتی!

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

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

جدول درهم سازی Hash Table

جدول درهم سازی یا Hash Table چیست؟

جدول درهم سازی (Hash Table) نوعی ساختمان داده است که قادر به نگه داری جفت داده‌هایی به صورت کلید و مقدار (Key, Value) می‌باشد. هر کلید در این ساختمان داده مشابه یک فرهنگ لغت به مقدار متناظر خود نگاشت می‌شود.

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

  • جستجوی مقدار مربوط به یک کلید
  • افزودن یک جفت کلید و مقدار
  • حذف یک جفت کلید و مقدار

درهم سازی و تابع درهم ساز

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

به عنوان مثال فرض کنید جفت‌های (Key, Value) به صورت (1, 5)، (3, 7)، (7, 4)، (12, 7) و (14, 8) قرار است در یک جدول درهم سازی که با کمک آرایه معمولی پیاده سازی شده و دارای ظرفیت 10 آیتم (با اندیس های 0 تا 9) است نگه داری شود. تابع درهم ساز را به صورت Key % 10 (یعنی باقیمانده مقدار کلید در تقسیم بر عدد 10) تعریف می‌کنیم. روشن است که مقدار حاصل از این تابع تنها می‌تواند یکی از اعداد مابین 0 تا 9 باشد. نتیجه حاصل از تابع درهم ساز برای پنج کلید 1، 3، 7، 12 و 14 همراه با جدول درهم سازی نهایی را می‌توانید در تصویر زیر مشاهده کنید. در آرایه حاصل (جدول درهم سازی)، جفت کلید و مقدار هر دو ذخیره شده‌اند که البته در این مثال ساده می‌توان تنها به ذخیره مقدارها اکتفا نمود:

جدول درهم سازی Hash Table
نمونه‌ای از روند ایجاد یک جدول درهم سازی – این جدول با کمک یک آرایه معمولی دو بعدی پیاده سازی شده است.

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

در حالت ایده آل انتظار داریم تابع درهم ساز، هر کلید را به یک حفره منحصربفرد و متفاوت نگاشت کند. چنین تابعی را تابع درهم ساز پرفکت یا کامل (Perfect Hash Function) می‌نامند. حال تصور کنید بخواهیم جفت جدید (22, 12) را به جدول درهم سازی فوق اضافه کنیم. با توجه به اینکه باقی مانده 22 بر عدد 10 برابر با 2 می‌شود بنابراین اندیس 2 توسط تابع درهم ساز برای قرار گرفتن جفت جدید انتخاب می‌شود. این در حالیست که حفره مربوط به این اندیس در آرایه اشغال می‌باشد. به این پدیده، برخورد (یا Collision) گفته می‌شود که در آن اندیسی یکسان برای دو یا چند کلید متفاوت تولید می‌شود. در چنین مواردی لازم است با کمک روش‌های مختلف، اندیس مناسبی برای قرارگیری مقدار مربوط به کلید یا کلیدهای دیگر درنظر گرفته شود.

یکی از مشخصه‌های مهم جدول‌های درهم سازی، فاکتور لود (Load Factor) نام دارد که به صورت “تعداد جفت‌هایی که قرار است در جدول ذخیره شود تقسیم بر تعداد حفره‌ها” محاسبه می‌شود. هرچه این مقدار بزرگتر باشد کارایی جدول درهم سازی پایین‌تر می‌آید. البته زمانی که فاکتور لود به سمت صفر میل می‌کند نیز با اتلاف حافظه روبرو می‌شویم چرا که در این حالت تعداد حفره‌ها به مراتب بیشتر از تعداد جفت کلید و مقدار خواهد بود. یک تابع درهم ساز پرفکت که مقادیر حاصل از آن برای n کلید به صورت n عدد صحیح پشت سرهم (معمولا 0 تا n-1) باشد را تابع پرفکت مینیمال می‌نامند چرا که در این حالت هیچ اتلاف حافظه‌ای نخواهیم داشت.

از جمله کاربردهای رایج جداول درهم سازی در ایجاد آرایه های انجمنی و ایندکس کردن پایگاه داده ها می‌باشد.

برطرف نمودن برخورد

معمولا بروز برخورد در مواقعی که تعداد زیادی جفت کلید/مقدار در اختیار داریم حتی با استفاده از بهترین توابع درهم ساز نیز غیرقابل اجتناب است. بنابراین وجود یک استراتژی مناسب برای برطرف نمودن برخوردها ضروری می‌باشد. آدرس دهی باز (Open Addressing) یکی از رایج‌ترین این استراتژی‌هاست. در این روش اگر اندیسی از آرایه که برای قرارگیری موجودیت جدید انتخاب شده اشغال باشد با استفاده از یک روش کاوش، به دنبال حفره دیگری می‌گردیم که خالی باشد. برای مثال در مدل کاوش خطی (Linear Probing) اگر حفره‌ای پر باشد تک تک حفره‌های پس از آن را تا زمانی که مکان خالی پیدا شود کاوش می‌کنیم. درنتیجه برای افزودن جفت (22, 12) در جدول فوق ابتدا حفره 2 بررسی می‌شود. از آنجایی که این حفره اشغال است به سراغ حفره 3 می‌رویم. این کار به همین ترتیب ادامه می‌یابد تا نهایتا جفت (22, 12) در حفره 5 قرار می‌گیرد. هنگام جستجو برای یافتن مقدار متناظر با کلید 22 نیز ابتدا حفره 2 بررسی می‌شود و این بررسی تا رسیدن به حفره‌ای که کلید 22 در آن ذخیره شده است ادامه می‌یابد. گفتنی است طول گام‌ها در کاوش خطی می‌تواند مقدار ثابتی به جز یک هم داشته باشد. درهم سازی دوبل (Double Hashing) این طول گام را براساس یک تابع درهم ساز ثانویه محاسبه می‌کند.

زنجیره سازی مستقل (Separate Chaining) نمونه‌ای دیگر از استراتژی‌های رفع برخورد است که در آن هر حفره به یک لیست مجزا اشاره می‌کند. هر لیست تمامی جفت های کلید و مقداری که در اندیس مربوط به آن حفره دچار برخورد می‌شوند را در خود نگه داری می‌کند. برای پیاده سازی لیست‌ها معمولا از لیست‌های پیوندی استفاده می‌شود. در تصویر زیر نحوه ایجاد جدول درهم سازی با کمک این استراتژی و پس از افزودن جفت (22, 12) نمایش داده شده است. در این روش، هنگام جستجو برای مقدار متناظر با کلید 22 تنها کافی است لیست مربوط به حفره 2 مورد کاوش قرار گیرد.

زنجیره سازی مجزا در جدول درهم سازی
رفع برخورد در جدول درهم سازی با کمک زنجیره سازی – در این نمونه از لیست پیوندی استفاده شده است.

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

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

زبان برنامه نویسی سطح بالا High-level Programming Language

زبان برنامه نویسی سطح بالا یا High-level Programming Language چیست؟

زبان برنامه نویسی سطح بالا (High-level Programming Language) به گونه‌ای از زبان های برنامه نویسی گفته می‌شود که از میزان انتزاع (Abstraction) بالایی نسبت به جزئیات رایانه و زبان ماشین برخوردار هستند. به عبارت بهتر در این زبان‌ها نسبت به زبان‌های سطح پایین (Low-level Programming Language)، برنامه نویسان با پیچیدگی‌های سیستم های رایانه ای (آنچه به طور مستقیم توسط پردازنده ها و رایانه ها قابل فهم و اجرا می‌باشد) کمتر دست و پنجه نرم می‌کنند.

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

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

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

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

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

از جمله زبان های برنامه نویسی سطح بالا می‌توان به ویژوال بیسیک (Visual Basic)، سی شارپ (C#پی اچ پی (PHP)، دلفی (Delphi) و بسیاری از زبان های پرکاربرد دیگر اشاره کرد.

نحوه اجرای کدهای نوشته شده به یک زبان سطح بالا

معمولا به منظور اجرای کد نوشته شده به یک زبان سطح بالا و تبدیل آن به دستورات قابل فهم (یا قابل اجرا) توسط پردازنده از کامپایلر یا مفسر استفاده می‌شود. در مدل اول، کد نوشته شده پیش از اجرا توسط نرم افزاری به نام کامپایلر به فرم قابل اجرا توسط پردازنده تبدیل می‌شود و در مدل دوم دستورات به طور مستقیم با کمک نرم افزاری به نام مفسر اجرا می‌شوند. البته گفتنی است نوعی معماری نادر به نام معماری کامپیوتر زبان سطح بالا (High-level Language Computer Architecture) نیز وجود دارد که امکان اجرای مستقیم کدهای این نوع زبان ها را فراهم می‌آورد.

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

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

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

شبکه تحویل محتوا Content Delivery Network – CDN

شبکه تحویل محتوا یا Content Delivery Network – CDN چیست؟

شبکه تحویل محتوا (Content Delivery Network به اختصار CDN) شبکه ای از پروکسی سرورها و مراکز داده‌ای است که در نقاط مختلف جغرافیایی توزیع شده‌اند. هدف از CDN ها توزیع سرویس در مکان‌های مختلف متناسب با کاربران است تا کارایی و دسترسی به سرویس افزایش یابد. گفتنی است به این شبکه ها، شبکه توزیع محتوا (Content Distribution Network) نیز گفته می‌شود.

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

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

CDN ها برای بهینه سازی توزیع محتوا از روش‌های مختلفی بهره می‌برند. وب کش ها (Web Cache) محتواهای متداول و پر درخواست کاربران را نگه‌داری می‌کنند و به این ترتیب میزان بار روی سرور اصلی و مصرف پهنای باند را کاهش می‌دهند و سرعت لود صفحات نیز افزایش می‌یابد. در روش‌های توازن بار سرور (Server Load Balancing)، ترافیک دریافتی روی سوئیچ میان سرورهای اصلی تقسیم می‌شود.

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

در برخی از ارائه دهندگان CDN مفهوم توزیع محتوا با تأمین موارد امنیتی نظیر جلوگیری از حملات منع سرویس ترکیب شده است. از جمله مشهورترین شبکه های تحویل محتوا می‌توان به Google Cloud CDN، Cloudflare، MaxCDN و Akamai اشاره نمود.

شبکه تحویل محتوا Content Delivery Network - CDN
توزیع با کمک یک سرور (سمت چپ) در مقایسه با توزیع با کمک شبکه تحویل محتوا (سمت راست)

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

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

بوت استرپ Bootstrap

بوت استرپ یا Bootstrap چیست؟

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

بوت استرپ از جمله ابزارهای توسعه وب سمت کاربر (Front-End Web Development) به شمار می‌رود (تنها چیزهایی که کاربر می‌بیند و با آن تعامل برقرار می‌کند از استایل‌ها گرفته تا اسکریپت‌هایی که سمت کلاینت اجرا می‌شوند) و با تمامی مرورگرهای وب امروزی (از جمله کروم، فایرفاکس، اینترنت اکسپلورر، اج و …) سازگار می‌باشد. امکان ایجاد صفحاتی با حداکثر 12 ستون، استفاده از استایل‌های زیبا و مدرن برای متون، هدینگ ها، جداول، تصاویر، اعلان‌ها و هشدارها، دکمه‌ها، امکان استفاده از Glyphicons (مجموعه‌ای از آیکن‌های پرکاربرد و تک رنگ) در طراحی بخش‌های مختلف صفحات وب (نظیر منوها)، نوارهای پیشرفت، فرم‌ها، گالری تصاویر و … از جمله قابلیت‌های Bootstrap به شمار می‌رود.

بوت استرپ Bootstrap
لوگوی بوت استرپ (سمت چپ) و طراحی واکنشگرای وب

در کد زیر نحوه لود کردن Bootstrap و ایجاد صفحه‌ای حاوی یک پیام هشدار با استفاده از این فریم ورک نمایش داده شده است. همانطور که مشاهده می‌کنید تنها کاری که لازم است برای تبدیل یک بلاک div به پیام هشدار انجام دهید اختصاص کلاسی با مقدار alert alert-danger به المان div مورد نظر می‌باشد.

<!DOCTYPE html>
<html lang="en">
    <head>
        <title>Bootstrap Example</title>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    </head>
    <body>
        <div class="alert alert-danger">
            <strong>Danger!</strong> This alert box could indicate a dangerous or potentially negative action.
        </div>
    </body>
</html>

نتیجه این کد در تصویر زیر نمایش داده شده است:

بوت استرپ Bootstrap
نمونه هشدار خطر با کمک Bootstrap
مثالی از بوت استرپ Bootstrap
نمونه لیست قیمت طراحی شده با کمک Bootstrap

نسخه‌های مختلف بوت استرپ

Bootstrap در سال 2010 با نام Twitter Blueprint توسط مارک اتو (Mark Otto) و جاکوب تورنتون (Jacob Thornton) در توئیتر طراحی شد تا نوعی یکپارچگی در ابزارهای داخلی این شرکت ایجاد کند. اما خوشبختانه کار به همین جا محدود نشد و پروژه با همکاری تعداد معدودی از توسعه دهندگان دیگر در آگوست سال 2011 با نام Bootstrap روی GitHub منتشر شد.

نسخه دوم بوت استرپ نیز در ژانویه سال 2012 با پشتیبانی از طراحی واکنشگرا و طرح شبکه‌ی 12 ستونی در کنار تعدادی قابلیت دیگر منتشر شد. تولد دومین سال بوت استرپ مصادف شد با انتشار نسخه سوم آن که با تأکید بیشتر روی طراحی واکنشگرا و رویکرد موبایل – اول (Mobile First) تکمیل شد. نسخه چهارم این فریم ورک نیز با بهبودهایی روی استایل‌های چاپ، حرکت به سمت flexbox و … در ژانویه 2018 به صورت رسمی منتشر شد.

مزایای استفاده از بوت استرپ

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

پروکسی سرور Proxy Server

پروکسی سرور یا Proxy Server چیست؟

پروکسی سرور (Proxy Server) سروری میانجی برای درخواست‌هایی است که از سوی کلاینت ها به منظور دریافت منابع از سرورهای دیگر ارسال می‌شود.

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

مفهوم Forward Proxy و Reverse Proxy

واژه Proxy در زبان انگلیسی به معنای نماینده یا وکیل می‌باشد. Proxy Server ها نیز مشابه همان کاری را انجام می‌دهند که یک نماینده در زندگی معمولی برای شما انجام می‌دهد. در میان عامه مردم زمانی که سخن از پروکسی ها به میان می‌آید غالبا منظور نوع متداول آن‌ها یعنی فوروارد پروکسی (Forward Proxy یا پروکسی ارسال کننده) می‌باشد. این نوع Proxy ها به عنوان یک نماینده یا واسطه برای کلاینت به شمار می‌روند. کلاینت درخواست خود را که مربوط به یک سرور معین است برای فوروارد پروکسی ارسال می‌کند. Proxy نیز در نقش یک کلاینت، درخواست را برای سرور مدنظر می‌فرستد و پس از دریافت پاسخ، نتیجه را به کلاینت خود تحویل می‌دهد. در این حالت کلاینت باید برای استفاده از Proxy به شکل مناسبی تنظیم شده باشد؛ این تنظیمات معمولا توسط یک نرم افزار ویژه به صورت خودکار انجام می‌شود.

نوع دیگری از Proxy ها نیز تحت عنوان پروکسی های معکوس (Reverse Proxy) وجود دارد که برخلاف Forward Proxy ها به عنوان میانجی برای یک یا چند سرور معین عمل می‌کنند. در واقع در این مدل، Proxy Server بخشی از شبکه داخلی سرورهای اصلی است و درخواست‌های دریافتی از کلاینت‌های خارجی را به سروری که باید آن را پاسخ دهد ارسال می‌کند و سپس پاسخ دریافتی را به شکلی که گویا مستقیما از سرور اصلی دریافت می‌شود برای کلاینت برمی‌گرداند. کلاینت معمولا در چنین حالتی متوجه وجود سرور اصلی (که در پشت Proxy پنهان شده است) و ویژگی‌های آن نخواهد شد و تصور می‌کند درخواست خود را برای سرور اصلی ارسال کرده است. به عبارت بهتر برخلاف فوروارد پروکسی ها که هویت کلاینتشان را مخفی می‌کنند (گمنامی)، پروکسی معکوس هویت سرور را پنهان می‌کند. صاحبان این پروکسی ها می‌توانند با پیکربندی مناسب آن‌ها، سرورهای اصلی خود را در مقابل حملاتی نظیر DDoS محافظت کرده و از مزایای دیگری نظیر توزیع و توزین بار (Load Balancing) روی چند سرور اصلی نیز بهره ببرند.

وب پروکسی

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

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

پروکسی سرور Proxy Server
Proxy Server به عنوان واسطی میان کلاینت و سرور اصلی عمل می‌کند.

سایر کاربردهای رایج پروکسی

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

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

کشینگ پروکسی (Caching Proxy) ها نیز نوع رایج دیگری از این سرورها هستند که با نگه‌داری نسخه‌ای از منابع که با درخواست بیشتری مواجه بوده‌اند قادر هستند پاسخگویی به درخواست‌ها را سرعت بخشیده و مصرف پهنای باند را نیز کاهش دهند.

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

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

واسط برنامه نویسی کاربردی Application Programming Interface – API

واسط برنامه نویسی کاربردی یا Application Programming Interface – API چیست؟

واسط برنامه نویسی کاربردی (Application Programming Interface به اختصار API) مجموعه‌ای از ابزارها و توابع است که برای ایجاد ارتباط میان اجزای مختلف نرم‌افزاری به کار می‌رود. به عبارت ساده‌تر، API ها نحوه تعامل نرم افزارها با یکدیگر را مشخص می‌کنند و با کمک آن‌ها می‌توان اپلیکیشن هایی ایجاد کرد که به ویژگی‌های سیستم عامل، نرم افزار یا سرویسی دیگر دسترسی داشته باشند.

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

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

نمونه‌هایی از API ها

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

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

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

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

ژئوتگینگ Geotagging

ژئوتگینگ یا Geotagging چیست؟

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

کاربردهای ژئوتگینگ

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

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

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

خطرات ژئوتگینگ

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

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

ژئوتگینگ Geotagging
نمایش تصاویر و ویدیوهای نشان گذاری شده جغرافیایی مربوط به مکان‌های نزدیک به هم بر روی نقشه
ژئوتگینگ Geotagging
فراداده‌های جغرافیایی یک فایل تصویری

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

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