ROP - Render Output Unit چیست ؟


"واحد خروجی رندرینگ" یا Render Output Unit که به اختصار ROP و همچنین "کانال عملیات های رستر" (Raster Output Pipeline) نامیده می شود یکی از مراحل پایانی در پروسه رندرینگ بورد های گرافیکی سه بعدی امروزی است. کانال پردازش پیکسل، اطلاعات پیکسل و تکسل (واحد های تشکیل دهنده تکسچر) را دریافت می کند و آن را به وسیله عملیات های ماتریسی و وکتوری خاص به یک پیکسل نهایی یا متغیر عمق پردازش می کند. ROP ها، تراکنس های بین بافر های مرتبط در حافظه محلی شامل خواندن و نوشتن و ترکیب مقادیر را انجام می دهند. پس ROP وظیفه ترکیب و قرار دادن پیکسل ها در محل مخصوص خود در صفحه نمایش (در اصل حافظه) را بر عهده دارد.
در گذشته تعداد ROP ها، TMU ها (واحد نگاشت تکسچر) و سایه زن های پیکسل، برابر بودند. هرچند از سال 2004 چندین GPU این واحد ها را از یکدیگر جدا کردند تا اختصاص ترانزیستور برای عملکرد حجم کار برنامه و حافظ در دسترس به صورت بهینه انجام شود. همینطور که این رویه ادامه پیدا می کند، اینگونه انتظار می رود تا پردازنده های گرافیکی واحد های مختلف خود را از یکدیگر جدا کنند تا سازگاری خود را با برنامه های گرافیکی آینده افزایش دهند. این طراحی باعث می شود تا سازندگان تراشه رویه ای ماژول وار ایجاد کنند که در آن GPU های رده بالا در اساس، از منطق یکسانی در مقابل GPU های رده پایین استفاده کنند.


تفاوت حافظه های DDR3 و GDDR5

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

- مصرف بالاتر و تولید گرمای بیشتر DDR3 نسبت به GDDR5 .  (مصرف 1.2 تا 1.65 ولت DDR3 نسبت به حدود 1 ولت GDDR5)

- DDR3 از کنترلر حافظه 64 بیتی برای هر کانال استفاده می کند (128 برای دو کانال، 256 برای چهار کانال و ...) در حالی که GDDR5 از کنترلر های 32 بیتی (16 بیت برای ورودی/ 16 بیت خروجی) استفاده می کند. البته GPU میتواند از هر تعداد ورودی/خروجی 32 بیتی استفاده کند. (2 عدد برای 64 بیت، 4 برای 128 بیت، 6 برای 192 بیت و ...)

- فرکانس و پهنای باند بالاتر GDDR5 نسبت به DDR3.

- تاخیر (latency) بیشتر GDDR5 نسبت به DDR3.

به علت تفاوت ذاتی CPU و GPU در پردازش و توانایی بالای GPU در موازی کاری، تاخیر حافظه های GDDR5 اهمیتی برای GPU ندارد و در عوض توانایی حافظه GDDR5 در انتقال سریع حجم عظیم اطلاعات باعث می شود که برای GPU ها از این حافظه استفاده شود؛ در طرف مقابل نیاز CPU به انجام سریع پردازشات خطی، تاخیر کم حافظه های DDR3 و انتقال سریع حجم کم اطلاعات، یک مزیت برای DDR3 به حساب می آید.  



نصب  Net Framework 3.5 / 3 / 2 بر روی ویندوز 8 (windows 8)


به صورت پیشفرض نسخه های 3.5 ، 3 یا 2 چهار چوب .Net بر روی ویندوز 8 نصب نیستند و بسیاری از برنامه ها نیز به این نسخه ها برای اجرا نیازمند هستند؛ ولی میتوانید خیلی ساده این نسخه ها را بر روی ویندوز 8 نصب کنید. برای این کار می توانید از دو روش آنلاین یا دیسک نصب ویندوز استفاده کنید.

روش انلاین :

به کنترل پنل ویندوز رفته و وارد قسمت Programs and Features شوید و گزینه Turn Windows features on or off را انتخاب کنید. سپس تیک گزینه .NET Framework 3.5 را بزنید و Ok را کلیک کنید. پس از تایید دانلود فریمورک از اینترنت، به صورت خودکار فایل های موردنیاز دانلود شده و نصب می شوند.

روش افلاین : (استفاده از دیسک نصب ویندوز)
دیسک را در درایو قرار دهید و سپس به Command Prompt ویندوز رفته (با اختیارات Administrator) و دستور زیر را تایپ یا کپی کنید و enter را بزنید و صبر کنید تا مراحل نصب تکمیل شوند. 


Dism.exe /online /enable-feature /featurename:NetFX3 /All /Source:E:\sources\sxs /LimitAccess


به قسمت E:\source\sxs دقت کنید. این پوشه در دیسک نصب ویندوز قرار دارد و لازم است این آدرس به نسبت به نام درایو دی وی دی شما تغییر کند. برای مثال اگر "G" درایو دی وی دی شما است، آن را به       G:\source\sxs تغییر دهید.  

Effective Memory Clock چیست ؟


Effective Memory Clock یا "فرکانس موثر حافظه"، نقطه ی مقابل Real Memory Clock یا "فرکانس واقعی حافظه"، به فرکانس کلی یک حافظه تصادفی (RAM) گفته می شود که از ضرب فرکانس واقعی، در تعداد واحد های انتقال یافته اطلاعات در هر چرخه (کلاک) به دست می آید. برای مثال در رم های DDR - Double Data Rate فرکانس موثر از ضرب فرکانس واقعی در 2 به دست می آید چون این حافظه ها در هر چرخه می توانند دو واحد اطلاعات را انتقال دهند و یا در حافظه های QDR - Quad Data Rate فرکانس موثر از ضرب فرکانس واقعی در 4 به دست می آید چون این حافظه ها در هر چرخه 4 واحد اطلاعات را منتقل می کنند.    



فناوری GPU Boost


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


فناوری GPU Boost از شرکت Nvidia که مشابه فناوری Turbo Boost از شرکت اینتل است و احتمالا با آن بیشتر آشنا هستید، و با معماری کپلر (Kepler) این شرکت معرفی شد، یک فناوری تنظیم فرکانس یا بهتر است بگوییم اورکلاکینگ به صورت هوشمند و دینامیک است که فرکانس GPU و فرکانس رم کارت گرافیک را در بر می گیرد. این فناوری چندین پارمتر مانند دمای کنونی و آستانه تحمل تراشه، حجم کار تراشه، حجم رم استفاده شده و ... را برای تنظیم فرکانس GPU در نظر می گیرد و فرکانس را متناسب با آنها و نیاز پردازش تغییر می دهد. اورکلاکینگ دینامیک به شما اجازه می دهد تا از یک طرف از حداکثر توان کارت گرافیک در لحضاتی که نیازمند پردازش بالا هستید استفاده کنید و از طرف دیگر در مواقعی که نیاز به پردازش بالا نیست، در مصرف انرژی صرفه جویی کنید.  
src=

رزولوشن (تفکیک پذیری) 4K و 8K


شاید چند سال پیش خیلی ها از جمله خود من با اصطلاحات HD و FullHD آشنا نبودند ولی در حال حاضر به حدی این فرمت های گشترش پیدا کرده و معمول شده اند که وقتی که میخواهیم یک تلویزیون جدید خریداری کنیم یا ویدئویی را دانلود کنیم ابتدا به سراغ وضوح تصویر آن می رویم و این کاملا هم طبیعی است. فرمت های HD و FullHD ، به مرحله ی اشباه و تکامل خود رسیده اند و شرکت های سازنده ی تلویزیون و نمایشگر مدتی است که به سراغ فرمت های جدید رفته اند و برخی هم محصولاتی را با این فرمت ها وارد بازار کرده اند. البته در کنار آنها، دوربین های حرفه ای جدید نیز از این فرمت ها پشتیبانی می کنند، تا دچار کمبود محتوا برای این تلویزیون ها و نمایشگر ها نشویم!  ( 2K : تفکیک پذیری 1080*2048 برای سینما)  


 اصطلاحات 4K و 8K که این روز ها بیشتر و بیشتر شنیده می شوند، و یا با نام Ultra HD یا UHD بیان می شوند، به رزولوشن یا تفکیک پذیری یا وضوح تصویر جدیدی اطلاق می شود که پس از وضوح تصویر Full HD درحال معمول شدن هستند. اصطلاحا 4K به معنی وجود تقریبا 4000 هزار پیکسل، و 8K وجود 8000 هزار پیکسل فیزیکی در یک ردیف افقی در طول صحفه نمایش؛ و اگر آن را در مورد ویدئو ها به کار ببریم به همین میزان پیکسل افقی، در ویدئو است. تفکیک پذیری دقیق 4K و 8K و در نتیجه تعداد کل پیکسل ها در این دو فرمت به "نسبت تصویر" صفحه یا ویدئو بستگی دارد ولی برای مثال 4K در نسبت تصویر 16:9 برای تلویزیون ها برابر با 3840 x 2160 است که تقریبا دو برابر تفکیک پذیری FullHD برای همین نسبت تصویر است. تصویر بالا فرمت 4K را از نظر اندازه با فرمت های معمول مقایسه کرده است و طبق آن میتوانید به حد و حدود فرمت 8K با 33 میلیون پیکسل پی ببرید!

اگر بخواهیم این فرمت ها را با تعداد پیکسل های عمودی بیان کنیم این چنین خواهد بود :


HD : 720 pixels
FullHD : 1080 pixels
UltraHD-4K : 2160 pixels
UltraHD-8K : 4320 pixels


تغییر حالت Sata از IDE به AHCI پس از نصب ویندوز

 
اگر می خواهید مد پورت Sata مادربورد را از حالت IDE به حالت AHCI تغییر دهید، خوب است بدانید که نیازی نیست دوباره ویندوز کامپیوتر را نصب کنید! خیلی راحت با تنظیماتی ساده در رجیستری ویندوز (که احتمالا به صورت پیشفرض نیز صورت دلخواه ما قرار داده شده است) می توانید حالت پورت ساتا را در تنظیمات بایوس کامپیوتر خود تغییر دهید. برای این کار وارد رجیستری ویندوز شوید و کلید زیر را پیدا کنید. 
(برای وارد شدن به رجیستری ویندوز کلمه regedit را در قسمت Run ویندوز تایپ کنید و Ok را کلیک کنید)


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\msahci

یا در ویندوز 8 :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\storahci

پس از اینکه کلید بالا را پیدا کردید کافی است مقدار (ارزش) گزینه ی Start را برابر 0 قرار دهید. برای اینکار بر روی گزینه Start کلیک راست کرده و گزینه ی Modify را انتخاب کنید. سپس در قسمت Value data مقدار 0 را وارد کنید. (همانطور که گفته شد به احتمال زیاد این مقدار، به صورت پیشفرض نیز برابر 0 خواهد بود). کار ما در بخش رجیستری ویندوز تمام است حالا می توانید در قسمت BIOS حالت AHCI را برای پورت ساتا انتخاب کنید. (توجه داشته باشید، شاید ممکن باشد پس از این کار، هارد دیسک یا SSD خود را به عنوان اولین وسیله بوت کامپیوتر انتخاب کنید تا همه چیز به درستی کار کند).

فعال سازی TRIM در ویندوز 7


دستور یا قابلیت TRIM به طور پیشفرض در ویندوز سون فعال است ولی اگر می خواهید از فعال بودن آن مطمئن شوید و یا آن را غیر فعال کنید میتوانید از دستور زیر در Command Prompt ویندوز استفاده کنید. قبل از آن بدانید، TRIM یک نرم افزار یا پروسه در حال اجرا در کامپیوتر نیست و تنها یک دستور است که سیستم عامل برای پاکسازی هوشمند SSD از آن استفاده می کند. اگر سیستم عامل و فریمویر SSD از این قابلیت پشتیبانی کند، پس از این قابلیت استفاده می شود.

در Command Prompt ویندوز دستور زیر را تایپ کنید :

فعال سازی :
fsutil behavior query disabledeletenotify 0
غیر فعال سازی :
fsutil behavior query disabledeletenotify 1


علاوه بر این میتوانید در برنامه هایی مانند CrystalDiskInfo  ببینید که SSD شما از TRIM استفاده می کند یا خیر.

TRIM چیست ؟

در علوم کامپیوتر دستور TRIM به سیستم عامل اجازه می دهد تا به یک SSD اطلاع دهد کدام یک از بلوک های حافظه دیگر تحت استفاده نیست و می تواند پاک شود. TRIM معمولا با حروف بزرگ نوشته میشود ولی باید بدانید که "TRIM" مخفف عبارتی نیست و نام یک دستور است.

دستور TRIM پس از اینکه SSD ها رواج یافتند، معرفی شد. دستور TRIM طراحی شده است تا سیستم عامل بتواند SSD را از صفحات اطلاعاتی که در حال حاضر به دلیل خذف شدنشان توسط کاربر یا سیستم عامل، نامعتبر هستند، آگاه کند. در طول عملیات delete ، سیستم عامل نه تنها سکتور ها را به عنوان "آزاد" برچسب گذاری می کند، بلکه یک دستور TRIM همراه با آدرس بلوک های مربوطه را نیز به SSD می فرستد. پس از آن دیگر SSD می داند که دیگر اطلاعات این آدرس ها را در طول "زباله رویی" (Garbage Collection) جابه جا نکند؛ و این باعث کاهش دستور های "نوشتن"، کاهش گستردگی نوشتن و افزایش عمر SSD می شود. SSD های مختلف با دستور TRIM ممکن است رفتار مختلفی داشته باشند و درنتیجه عملکرد نهایی میتواند در SSD ها، مختلف باشد. نسخه های مختلفی از سیستم عامل ها از دستور TRIM پشتیبانی می کنند برای مثال ویندوز 7 ماکروسافت یکی از این سیستم عامل ها می باشد.  

(ویژگی های USB3 ) - تغییرات USB3 نسبت به USB2

 
USB3 یکی از تغییرات مهم در چند سال اخیر در حوزه ی کامپیوتر بوده است؛ در زیر خلاصه ی تغیرات و تفاوت های این تکنولوژی نسبت به نسخه ی دوم آن را می ببنید.

- SuperSpeed : نرخ جدید 5 Gbps انتقال اطلاعات که معادل 625 مگابایت بر ثانیه است.
- معماری گذرگاه دوگانه (Dual-Bus) : شامل Low-Speed ، Full-Speed ، High-Speed و SuperSpeed .
- جریان ترافیک غیر همزمان به جای جریان انتخابی.
- جریان دوطرفه همزمان Dual-Simplex برای سرعت SuperSpeed به جای جریان یک طرفه half-duplex .
- پشتیبانی از Streaming .
- تکنولوژی همگام سازی N-Go سریع.
- پشتیبانی از توان (برق) بالاتر.
- مدیریت توان بهتر.

برخی از اططلاحات بالا به شدت تخصصی هستند و من هم اطلاعاتی در مورد آنها ندارم ولی آنهایی که می توانم را در ادامه توضیح می دهم :
 Low-Speed ، Full-Speed ، High-Speed و SuperSpeed ، چهار نرخ انتقال متفاوت و مجزا هستند که نباید به عنوان چهار مشخصات استاندارد usb در نظر گرفته شوند. هر استاندراد کلی usb یک نرخ انتقال متفوت را معرفی کرده است در زیر این نرخ های انتقال را مشاهده می کنید. 

usb 1.0 : Low-Speed و Full-Speed
usb 1.1 : Low-Speed و Full-Speed
usb 2.0 : Low-Speed و Full-Speed و High-Speed
usb 3.0 : Low-Speed و Full-Speed و High-Speed و SuperSpeed

سرعت انتقال اطلاعات در هر از آنها به صورت زیر است :

Low-Speed : .1875 MB/s
Full-Speed : 1.5 MB/s
High-Speed : 60 MB/s
SuperSpeed : 625 MB/s

Streaming به معنی انتقال دائم و پیوسته اطلاعات از سوی یک ارائه کننده به کاربر نهایی است که بیشتر در حوزه ی چندرسانه ای یا multimedia مطرح است و احتمالا تا به حال با آن سر و کار داشته اید. برای مثال دیدن یک فیلم یا کلیپ در اینترنت نوعی از Streaming یا بخش "جریانی" به حساب می آید.

فناوری allway sync N-go یک فناوری برای همگام سازی (synchronization) اطلاعات وسایل جانبی در کامپیوتر های ویندوزی است، که از خود دستگاه جانبی اجرا می شود و نیازی به نصب ندارد.

Open AL چیست ؟


Open AL مخفف عبارت Open Audio Library به معنی "کتابخانه ی صوتی باز" به مجموعه ای از رابط های برنامه ی نویسی صوتی مولتی پلتفرم گفته میشود که برای رندرینگ موثر صدا در محیط سه بعدی طراحی شده است. سبک رابط های برنامه نویسی Open AL مشابه رابط های Open GL است که به احتمال زیاد بیشتر نامش را شنیده اید. نسخه های اولیه این نرم افزار متن باز بودند ولی نسخه های اخیر اختصاصی هستند و به وسیله ی شرکت Creative Technology توسعه داده می شوند. استفاده از Open AL باعث طبیعی شدن صدا در محیط های سع بعدی مانند بازی های رایانه ای میشود، برای مثال کاربر در حین حرکت در فضای سه بعدی (مجازی) می تواند رفتار طبیعی صوت را احساس کند. 
  

Track و Cylinder در هارد دیسک


Track (ترک) دایره هایی هم مرکز در پلاتر (صفحه ی گردان هارد دیسک) هستند که اطلاعات روی انها نوشته می شود. هر ترک به بخش های کوچکتری به نام سکتور (Sector) تقسیم می شود که کوجکترین واحد قابل آدرس دهی در هارد به حساب می آیند و معمولا 512 بایت گنجایش دارند. سیستم عامل و هارد دیسک از طریق شماره Track ها و Sector ها به اطلاعات دسترسی پیدا می کنند. هارد دیسک های امروزی از هزاران ترک تشکیل شده اند.
یک Cylinder (سیلندر) به مجموعه ترک های با فاصله ی یکسان از مرکز، در تمام پلاتر ها گفته می شود. (برای درک بهتر، آنها را به صورت یک استوانه توخالی تصور کنید). برای مثال اگر یک هارد دیسک شامل 4 پلاتر (4 صفحه) و هر پلاتر شامل 600 ترک باشد، آنگاه 600 سیلندر در هارد دیسک وجود دارد. و هر سیلندر شمل 8 ترک خواهد بود؛ چرا که هر پلاتر دارای دو سطح (پشت و رو) است و مجموعا 8 ترک با فاصله ی یکسان از مرکز در هارد دیسک وجود دارد. به بیرونی ترین سیلندر در هارد دیسک، سیلندر صفر (Cylinder Ziro) گفته می شود. شکل زیر، ترک و سیلندر و سکتور را در هارد دیسک نمایش می دهد.


Partition Alignment چیست و چرا اهمیت دارد ؟


هارد دیسک های جدید به گونه ای ایجاد می شوند که از سکتور های 4 کیلوبایتی به جای سکتور های رایج 512 بایتی استفاده کنند. دلیل اینکار استفاده ی بهینه تر از فضای فیزیکی دیسک است، چرا که برای هر سکتور اطلاعات کوچکی برای "تصحیح خطا" (Error Correction) در دیسک وجود دارد؛ و نقل مکان از 0.5 کیلو بایت (512 بایت) به 4 کیلو بایت به این معنی است که فضای کمتری برای "تصحیح خطا" در کل دیسک در نظر گرفته خواهد شد. شکل زیر از ویکیپدیا، این موضوع را نشان می دهد.


دلیل align کردن یا "تطبیق" کردن دیسک، نرم افزاری (نرم افزار هایی) است که برای استفاده از سکتور های 512 بایتی به جای سکتور های 4 کیلو بایتی طراحی شده است. اگر نرم افزار سکتور های 512 بایتی را انتظار داشته باشد، در نتیجه ممکن است اطلاعات را در جایی که "فکر می کند" سکتور دوم یک کلاستر است بنویسد در حالی که این 512 بایت بعدی همان سکتور 4 کیلو بایتی است.
مشکل درایوهایی که یک سکتور 512 بایتی را برای سیستم عامل شبیه سازی می کنند، ولی در اصل با سکتور های 4 کیلوبایتی کار می کنند، این است که یک سکتور تنها "در یک مرحله" می تواند نوشته شود. برای نوشتن "آن" 512 بایت دوم، کل 4 کیلوبایت سکتور باید خوانده شود و دوباره در درایو نوشته شود. و این یک پروسه کند تر نسبت به این است که خیلی ساده بگوییم کل سکتور 4 کیلو بایتی را دوباره بنویس.
حتی اگر سیستم عامل از وجود درایو های 4 کیلوبایتی مطلع باشد، باید به طور صحیح درایو به طور صحیح تطبیق داده شده باشد تا مرز های بین سکتور ها، درست همان جایی باشد که درایو می گوید و همان جایی که سیستم عامل فکر می کند. در SSD ها هم این مشکل می تواند وجود داشته باشد و فشار اضافی را برای دسترسی به اطلاعات بر دوش درایو بگذارد.
برای این اکثر برنامه های پارتیشن بندی جدید 1 مگابایت را برای مرز بندی در کل دیسک در نظر می گیرند. که به طور شسته رفته، نیاز تشخیص اینکه چه نوعی از سکتور ها را در اختیار دارید را از میان می برند. البته تطبیق پارتیشن ها بیشتر در SSD ها اهمیت دارد و اگر از هارد دیسک استفاده می کنید احتیاج نیست زیاد نگران این قضیه باشید. برای اینکه متوجه شوید درایو شما به طور صحیح پارتیشن بندی شده است چندین راه وجود دارد؛ یکی از انها پنجره ی msinfo32 در ویندوز است. برای ورود به این پنجره نام آن را در منو Start تایپ کنید و آن را پیدا کنید. در این صفحه به قسمت
Components > Storage > Disks
بروید و به دنبال نام درایو خود بگردید و گزینه ی Partition Starting Offset را پیدا کنید. اگر عدد مقدار این گزینه، مضرب 4096 بود، درایو شما به درستی تطبیق شده است وگر نه باید به سراغ "تطبیق مجدد" یا Realign کردن آن بروید. برنامه ی Gparted live CD یکی از برنامه های معروف برای اینکار است.

Boot Sector و انواع آن


Boot Sector یا Boot Block به قسمتی از هارد دیسک، فلاپی دیسک یا دیگر حافظه های جانبی گفته می شود که کد های ماشین برای بارگذاری در حافظه ی اصلی (RAM) را نگهداری می کند. هدف بوت سکتور، آغاز مراحل راه اندازی یک برنامه (معمولا سیستم عامل) است که در همان وسیله ذخیره شده است. محل و اندازه ی بوت سکتور به طراحی پلتفرم، مرتبط و وابسته است.
برای مثال در یک کامپیوتر سازگار با IBM ، BIOS دیسک راه اندازی را انتخاب کرده و و اولین سکتور آن را در حافظه اصلی لود می کند. برای دستگاه های دیگر این پروسه ممکن است کاملا متفاوت باشد.

انواع بوت سکتور :

  : Master Boot Record (MBR)

اولین سکتور حافظه جانبی که پاتیشن بندی شده است. MBR ممکن است که شامل کد هایی برای تشخیص پارتیشن های فعال و فرخواندن VBR آن باشد.

  : Volume Boot Record (VBR)

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

بنچمارک AS SSD


برنامه AS SSD یکی برنامه کم حجم و پرتابل برای ارزیابی حافظه های جانبی SSD است. این برنامه به همراه برنامه های دیگر مانند ATTO به یکی از برنامه های بنچمارک اصلی برای ارزیابی عملکرد وسایل ذخیره سازی تبدیل شده اند.
کار با این برنامه بسیار ساده است و تنها با یک کلیک می توانید دیسک خود را در برابر تست های مختلف ارزیابی کنید. این برنامه تست های رایج مانند خواندن و نوشتن ترتیبی ، بلوک 4 کیلوبایت ، زمان دستیابی و ... و نتیجه را به صورت IOPS یا MB/S و زمان دستیابی را بر حسب میلی ثانیه، به شما نشان می دهد و در آخر نتیجه ی کلی را به صورت یک امتیاز به شما نشان می دهد. AS SSD همچنین دارای تست های دیگری مانند تست کپی و تست مقایسه ای است که ابزار های جالبی برای ارزیابی عملکرد یک دستگاه هستند. این بنچمارک رایگان بوده و میتوانید با یک جست و جوی ساده، آن را از اینترنت دریافت نمایید. (بنچمارک = ارزیابی)  

تاثیر یک SSD بر سرعت کامپیوتر چقدر است ؟

 

در طول یک سال اخیر SSD ها جهش خوبی هم در سرعت و حجم و هم در قیمت داشته اند اند؛ البته جهش در سرعت و حجم به معنی "افزایش" و در قیمت به معنای "کاهش" است ! البته در کشور ما در طول چند ماه اخیر مسئله قیمت با سایر کشور ها متفاوت است و همه ما از آن مطلع هستیم. شاید خیلی بخواهند یک SSD را به سیستم خود اضافه کنند و بخواهند قبل از آن بدانند، آیا SSD ارزش هزینه ای که می کنند را برایشان دارد یا بهتر است هنوز هم به سراغ هارد دیسک های رایج بروند.

جواب این سوال از دو جهت در کشور ما سخت تر از دیگر کشور ها است : قیمت غیر واقعی و احتمال عدم دسترسی به مدل دلخواه.نیاز به توضیح در مورد دو مشکل بالا نیست (مشکلی هر دو آنها برای من اتفاق افتاد!)؛ در حالت کلی، در حال حاضر SSD ها به سرعت های قابل قبول (بیش از 500 مگابایت بر ثانیه) و حجم های بالا رسیده اند و میتواند نیاز به یک هارد دیسک را به کلی از بین ببرند و قیمت آنها نیز تقریبا معادل یک دلار و کمتر به ازای هر گیگابایت شده است (برای حجم های بالا) که می تواند برای بسیاری از کاربران منتطقی باشد. اما کشور ما تقریبا برای هر گیگابایت باید 3 هزار تومان هزینه کنید و مانند من برای یک SSD 128 گیگابایت معادل 350 هزار تومان هزینه کنید که تنها در صورتی که واقعا علاقه داشته یک SSD داشته باشید، منطقی است.در این چند وقتی که یک ADATA SP900 را به کامپیوتر اضافه کرده ام و با توجه به اینکه رابط مادربورد من SATA 2 است، در یک جمله میتوان گفت که تاثیر یک SSD در سرعت کامپیوتر، قابل قبول بوده است. یک SSD در سرعت کامپیوتر از زمان بوت گرفته تا جابه جایی اطلاعات و لودینگ ها تاثیر دارد ولی برای هرکدام این تفاوت با یک هارد دیسک معمولی متفاوت است. برای مثال برای کامپیوتر من کاهش زمان / افزایش سرعت:

- زمان بوت سیستم محسوس نیست.

- زمان آماده با کار سیستم محسوس است.

- لودینگ ها تا جایی که به حافظه جانبی مربوط هستند، قابل قبول است.

- جابه جایی فایل ها محسوس است.

چهار مورد بالا تجربیات من در طول چند روز کار با این SSD بوده است و برای امار و اطلاعات دقیق باید با برنامه هایی مانند ATTO یا PCMARK تست گرفته شود و نتایج مقایسه شوند. ولی چیزی که در حالت کلی بدیهی است که این است با وجود یک SSD به میزان قابل توجهی از محدود کننده بودن حافظه ی جانبی در سرعت کامپیوتر کاسته می شود ولی ممکن است این تغییرات در حوزه های مختلف متفاوت باشد. با احتمال زیاد تا چند سال آینده SSD ها به انتخاب اول کاربران برای حافظه ی جانبی کامپیوتر تبدیل می شوند و هارد دیسک ها باید کم کم از دور خارج شوند. SSD ها مزایای زیادی نسبت به HDD ها دارند و این تنها در بحث سرعت نیست.  

برترین کامپیوتر های دوستدار محیط زیست در Green 500


احتمالا با سایت Top 500 اشنایی دارید. سایتی که لیستی از 500 ابرکامپیوتر برتر جهان ، به همراه اطلاعاتی در مورد هر یک از آنها در اختیار شما قرار می دهد. این سایت متلعق به پروژه ای به همین نام است که در سال 1993 ایجاد شده است و هدف آن رتبه بندی قویترین کامپیوتر های (غیر توزیعی یا غیر شبکه ای) جهان است.

Green 500 پروژه مرتبط دیگری است که هدف آن رتبه بندی ابرکامپیوتر های جهان بر اساس نسبت عملکرد به مصرف، یا بازدهی است. ابر کامپیوتر ها معمولا مصرف بسیار بالایی دارند و کاهش توان مصرفی در کنار افزایش قدرت محاسبه، یکی از مهمترین اهداف سازندگان آنها است. در سایت Green 500 علاوه بر رتبه بندی کامپیوتر های قدرتمند جهان، اطلاعات بسیار زیاد دیگری موجود است که می تواند برای علاقه مندان جالب باشد.
 

سوکت پردازنده چقدر منتظر شما می ماند ؟!!


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


چند سال پیش هنگامی که میخواستم کامپیوتر جدیدم را جمع کنم، زمانی بود که تازه پردازنده های Core i7 اینتل به همراه سوکت جدید 1366 از راه رسیده بودند، و باعث شدند تا هزینه ی اضافی 500 هزار تومانی را متقبل شوم! به این امید که اینتل حداقل تا 5 سال این سوکت را در جمع سوکت های روی بورس نگه می دارد و پردازنده های جدید برای آن ساخته خواهد شد. البته این پیش بینی درست از آب درامد و تا چند سالی سوکت 1366 اینتل سوکت High End یا رده بالای اینتل به حساب می آمد تا این اواخر که جای خود را به سوکت 2011 داد...
البته باید این را بگویم که الان نه من مشکلی با این قضیه دارم و نه کامپیوترم احتیاج به ارتقا؛ ولی وقتی الان فکر میکنم که آن هزینه ی اضافی ارزشش را داشته است یا نه، نمیتوانم به جوابی قطعی برسم. حالا تنها سوال من از خودم این که "حالا که آن هزینه را متحمل شدی، چند وقت یا چند سال دیگر که بخواهی سیستمت را ارتقا بدی آیا باید سوکت پردازنده (و به دنبال ان دیگر اجزا کامپیوتر) را عوض کنی یا همین سوکت جوابگویت خواهد بود؟"
البته مشخص است که جواب این سوال را باید در همان "چند وقت یا چند سال دیگر" داد؛ ولی هدف از این پست این بود که آیا هزینه ها و آینده نگری هایی که هنگام خرید سیستم می کنیم برای ما سودی خواهد داشت یا فقط هزینه ای بیشتر برای تهیه "چیزی که از آن استفاده نمی کنیم" را متحمل می شویم؟ آیا باید هنگام خرید سیستم خود وسواسی رفتار کنیم یا بی خیال باشیم و فقط نیاز های روزمان را در نظر بگیریم ؟ این ها سوالاتی است که ممکن است برای خیلی از افراد هنگام خرید سیستم پیش آمده باشد و معلوم نیست جواب های درست به انها داده شده باشد یا نه ...

WonderShare Video Edit


WonderShare Video Edit برنامه ای مشابه Windows Movie Maker است که همان طور که از نامش برمی آید برای ویرایش فایل های ویدئویی به کار میرود. این برنامه را میتوان از سایت رسمی آن http://www.wondershare.com به قیمت 40 دلار تهیه کنید یا نسخه ی 30 روزه آن را (برای ویندوز یا مک) دانلود کنید.
اولین نکته در مورد این برنامه سادگی و سهولت کار با آن است. این برنامه بسیاری از ابزار های متداول مانند برجسب ها، افکت ها، برش، ترکیب و... برای ایجاد تغییرات در فایل های ویدئویی را در اختیار شما قرار می دهد. در زیر با برخی از ویژگی های این برنامه آشنا می شویم.

- ترکیب صدا، تصویر و ویدئو
- ایجاد متن
- ایجاد افکت (درخشندگی، نویز ، بلار و ...)
- اپلود مستقیم بر روی youTube
- ذخیره پروژه ها به فرمت های مختلف
- انتخاب فرمت برای بخش در دستگاه های (تلفن همراه یا تبلت) مختلف
- رایت بر روی Dvd
- ضبط صدا
- تغییر کنتراست، درخشندگی، رنگ و سرعت ویدئوها
- چرخاندن یا واران کردن ویدئو ها
- بریدن قسمتی از تصویر (Crop)



اگر نیازمند برنامه ای هستید که به وسیله ی آن کار های ساده ی خود در زمینه ی ویرایش ویدئو را انجام دهید میتوانید WonderShare Video Edit را امتحان کنید؛ ولی اگر به دنیال ویرایگش گری حرفه ای برای کار با ویدئو ها هستید، این برنامه جوابگوی نیاز شما نیست. 

برنامه نویسی مدیریت شده و مدیریت نشده


به طور کلی برای برنامه نویسی به زبان C++ در محیط .NET با دو انتخاب روبه رو هستید. برنامه نویسی بومی یا مدیریت نشده (Native) و برنامه نویسی مدیریت شده (Managed) . هر کدام از این روش ها معایب و مزایای دارند که به صورت کلی به آنها می پردازیم، ولی وقتی که خودتان شخصا برنامه نویسی را شروع می کنید، کم کم با تمام جزئیات آشنا خواهید شد.
شیوه ی سنتی یا مدیریت نشده: (ISO/IEC Standard C++)
قدمت زبان C++ بسیار بیشتر از چیز هایی مانند .NET و CLR و امثالهم است! به کد های اولیه و بومی زبان C++ که قبل و خارج از محیط دات نت نوشته شده اند، کد های "مدیریت نشده" می گویند. همان طور که از نام Native یا Unmanaged بر می آید در این روش با C++ بدون کنترل و مدیریت محیط های اجرای واسط طرف هستیم. در این روش پردازنده مستقیما برنامه های ما را اجرا می کند و برای برنامه نویسی، تنها شما هستید و قدرت زبان C++ . برنامه هایی که در این روش می نویسید توسط سیستم عامل مدیریت و اجرا می شوند و واسطه ای برای اجرا در کار نیست. در این روش آزادی عمل بیشتری برای برنامه نویسی دارید و در عوض از مزایای CLR که به آنها اشاره خواهیم کرد بی بهره هستید. که البته این به این معنی نیست که محدودیتی برای شما ایجاد شده باشد ولی کار شما به عنوان برنامه نویس کمی مشکل تر می شود و باید زمان و دقت بیشتری برای برنامه نویسی به خرج دهید.
شیوه مدیریت شده : (C++/CLI)
در این روش محیطی به نام Common Language Runtime یا به اختصار CLR بر روی سیستم عامل قرار می گیرد و واسطی بین برنامه شما و سیستم عامل می شود و برنامه های شما زیر نظر آن اجرای می شوند. CLR در واقع محیطی برای یکپارچه سازی زبان های برنامه نویسی، ورودی ها و خروجی ها و برنامه های شما است و قابلیت های برای شما به ارمغان می آورد که کار برنامه نویسی را آسان می کنند. مانند مدیریت حافظه، زباله رویی (خالی کردن خانه های بی استفاده حافظه) ، مدیریت استثنا (مدیریت خطا ها) و .. ( CLI مجموعه مشخصاتی است که اجازه می دهد برنامه هایی که در زبان های برنامه نویسی مختلف سطح بالا تولید شده اند، در سیستم های مختلف اجرا شوند و CLR پیاده سازی یک استاندارد CLI توسط کمپانی ماکروسافت است)

تصویر زیر محل قرار گیری CLR در معماری دات نت را نشان می دهد. البته دات نت تنها مختص سیستم عامل ویندوز نیست و توسعه دهنده گان در حال گسترش دات نت به سیستم عامل های دیگر مانند لینوکس و مکینتاش هستند.

وظیفه ی CLR بارگذاری و اجرای برنامه هایی هستند که توسط زبان برنامه نویسی به صورت زبان میانه در آمده اند (کامپایل شده اند). در محیط دات نت کد ها و توابع جدیدی به زبان C++ اضافه شده اند. به کد هایی که در محیط دات نت نوشته شده اند، کد های "مدیریت شده" گفته می شود که توسط شرکت ماکروسافت برای گشترش C++ نوشته شده اند. CLR میتواند هم کد های مدیریت شده و هم کد های مدیریت نشده را بپذیرد. تمام زبان های برنامه نویسی در داخل محیط دات نت، کد های شما را به کد های زبان میانه (Intermediate Language - IL) تبدیل می کنند. سپ در هنگام اجرا، کدهای تولید شده به وسیله کامپایلر توسط کامپایلر دیگری به نام Just In Time یا به اختصار JIT به کد های قابل اجرا تبدیل می شوند. یکی از ویژگی های کامپایلر JIT این است در هنگام تبدیل کد های IL به کدهای قابل اجرا، پردازنده ی سیستم را مد نظر قرار می دهد و (در صورت امکان) خروجی بهینه شده ایجاد می کند. و البته که برای اجرای کد های دات نت، باید نسخه ی مناسب دات نت بر روی سیستم اجرا کننده نصب باشد.
به طور کلی هرگاه عملکرد و کارایی برای برنامه نویسان در اولویت باشد، آنها شیوه ی Native را انتخاب می کنند و هنگامی که سرعت و راحتی در اولویت قرار داشته باشد به سراغ C++/CLI می روند. Visual C++ 2010 به طور کامل شیوه ی Native را پشتیبانی می کند، همچنین قابلیت های جدیدی از استاندارد جدید C++ را به برنامه اضافه کرده است. هر دو شیوه ی برنامه نویسی C++ در محیط دات نت دارای ویژگی های خاص خود هستند، با این حال تنها چیزی که در برنامه نویسی اهمیت دارد فراگرفتن اصول و قواعد اصلی یک زبان برنامه نویسی است، هنگامی که با آنها آشنا باشید، کار با پلتفرم ها، کامپایلر ها و شیوه های مختلف برنامه نویسی راحت خواهد بود. در این پست به طور کلی با این دو مفهوم آشنا شدیم، در پست های بعد به طور دقیق تر آنها را بررسی می کنیم و انتخاب های برنامه نویسی در Visual Studio را می بینیم.

آرایه در زبان C++ (مقدمات)


نوشتن بسیاری از برنامه ها بدون استفاده از مفهومی به نام "آرایه" غیر ممکن است. فکر کنید که می خواهید 100 عدد یا اسم یا هر چیز دیگری را در حافظه ذخیره کنید، اگر بخواهید برای هر کدام از آنها یک متغیر تعریف کنید و ورودی را در آن ذخیره کنید کاری بس دشوار و غیر اصولی خواهد بود ! در این مواقع آرایه ها به کار شما می آیند! آرایه مجموعه یا به عبارت بهتر زنجیره ای از متغیر ها است که در خانه های حافظه به صورت پشت سر هم قرار گرفته اند و دارای یک نام کلی هستند. هر کدام از خانه های آرایه به وسیله یک شماره یا "ایندکس" (index) مشخص شده اند و میتوان آنها را به صورت یک متغیر در نظر گرفت. برخی از نکات مهم در مورد آرایه ها :
- تمام خانه های آرایه از یک نوع هستند.
- شماره خانه های آرایه از "صفر" شروع می شود.
- خانه های آرایه به صورت پشت سر هم در حافظه قرار دارند.
- نام آرایه، آدرس اولین خانه ی شروع آرایه و همیشه ثابت است.
- ایندکس آرایه نباید از اندازه ی تعریف شده آن فراتر رود.
- در حالت کلی نمیتوان یک آرایه را به طور مستقیم به آرایه ی دیگر تخصیص داد.
تعریف آرایه چگونه است ؟

یک آرایه را میتوان به طریق مختلفی تعریف کرد. ساده ترین آنها به صورت زیر است. برای اعلان یک آرایه باید از علامت [ ] در کنار نام آن استفاده کنیم.

int a[10];

خط بالا یک آرایه استاتیک به نام a که دارای 10 خانه است و خانه های آن از نوع صحیح (int) هستند، را تعریف می کند. پس ابتدا نوع آرایه ، سپس نام و بعد از آن تعداد خانه های آرایه یا در یک کلام اندازه ی آرایه در بین دو علامت براکت آمده است. آرایه بالا دارای 10 خانه است که عبارتند از :(به خانه های آرایه، "عناصر" آرایه نیز گفته می شود)


{a[0] , a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9] }

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

a[0] = 100;

می بینید که تنها فرق آن با یک متغیر معمولی استفاده از علامت براکت و ایندکس است. تمام کارهای که با یک متغیر انجام می دهید را با یک خانه از آرایه نیز می توانید انجام دهید. در بالا گفتیم که نام آرایه در واقع ادرس اولین خانه ی آرایه است. پس برای ارسال آرایه به تابع کافی است که نام ارایه را به تابع بفرستیم. برای مثال از تابعی به نام Function داشته باشیم که آرگومان آن یک آرایه از نوع int باشد برای فرستادن آرایه a به تابع به صورت زیر عمل می کنیم.

Function (a);


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


Int* P = a;

در این صورت اگر p را چاپ کنیم ادرس ارایه و اگر *p را چاپ کنیم مقدار اولین خانه ی ارایه نمایش داده می شود. با افزایش مقدار p میتوانیم به خانه های دیگر آرایه دسترسی داشته باشیم.

آرایه های چند بعدی :
ارایه ای که در بالا تعریف کردیم یک آرایه یک بعدی از نوع int بود به این معنی که هر کدام از خانه های یا عناصر آن می توانند یک عدد صحیح را ذخیره کنند. آرایه های چند بعدی به آرایه های گفته می شود هر کدام از عناصر آن خود یک آرایه هستند. برای مثال یک ارایه ی 4 بعدی آرایه ای است که هر کدام از خانه های آن یک آرایه سه بعدی است! البته در عمل کمتر پیش می آید که ابعاد آرایه از سه بعد تجاوز کند به این دلیل که کار کردن با آن ها بسیار دشوار می شود ولی به هر حال تعریف و کار کردن با یک ارایه 10 بعدی نیز هیچ مانعی ندارد.
تعریف آرایه چند بعدی :

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

double b [3][4];

خط بالا یک ارایه دو بعدی به نام b از نوع double تعریف می کند که دارای 3 خانه است که هر کدام از آنها یک ارایه 4 خانه ای هستند. آرایه های دو بعدی را می توان به صورت یک ماتریس تصور کرد. در بالا می توانید آرایه b را به صورت یک ماتریس با 3 سطر و 4 ستون تصور کنید. این آرایه 12 عنصر مستقل دارد که می توان آن ها را به صورت زیر تصور کرد.

b[0][0], b[0][1], b[0][2], b[0][3]
b[1][0], b[1][1], b[1][2], b[1][3]
b[2][0], b[2][1], b[2][2], b[2][3]

برای مقدار دهی یا دسترسی به یک عنصر در ارایه چند بعدی شبیه به آرایه یک بعدی عمل می کنیم و از ایندکس آن استفاده می کنیم.

b[0][2] = 20.55;

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




ارجاع و اشاره گر :


در این پست به طور مختصر با دو مفهوم اساسی در برنامه نویسی آشنا می شویم. این دو از مفاهیمی در برنامه نویسی هستند که باید هر برنامه نویس با انها آشنا باشد.
ارجاع (Reference) :

ارجاع در یک جمله "یک نام مستعار برای یک متغیر است". از این جمله ای میتوان نتیجه گرفت که "ارجاع" یک متغیر مستقل نیست و فضای ذخیره سازی مستقلی ندارد و درنتیجه آدرس یکسانی با متغیری که به آن ارجاع دارد، دارد. و این نکته ی بسیار مهمی است. میتوان این گونه تصور کرد که هر گاه یک ارجاع از متغیر را تعریف کرده باشیم، یک نماینده یا تصویر از آن متغیر را در اختیار داریم. هر گاه ارجاع را به کار ببریم مانند آن است که خود متغیر را به کار برده باشیم. قبل از هر چیز، نحوه ی ایجاد یک ارجاع برای یک متغیر چگونه است ؟ تصور کنید که یک متغیر به نام A از نوع صحیح را تعریف کرده و مقدار 100 را به آن نسبت داده باشیم.


int A = 100;

برای تعریف یک ارجاع از عملگر ارجاع (&) استفاده می کنیم. به کد زیر توجه کنید:

int& R = A;


این کد یک ارجاع به نام R را تعریف می کند که می تواند به یک متغیر صحیح (int) ارجاع داشته باشد. همانگونه که می بینید ابتدا "نوع" ، سپس "عملگر ارجاع" و سپس "نام" ارجاع آورده شده است. پس از آن نام متغیری که می خواهیم به آن نسبت دهیم را اورده ایم. نکته ی مهمی که در این بخش باید به ان توجه داشته باشید این است که "ارجاع ها حتما در هنگام اعلان، مقدار دهی شوند". یعنی نمی توان یک ارجاع را تنها اعلان کرد و سپس در قسمت دیگری از برنامه مقدار دهی کرد. از این لحاظ ارجاع ها شبیه به "ثابت" ها در زبان سی پلاس پلاس هستند و باید هنگام اعلان مقدار دهی شوند.
اشاره گر (Pointer) :

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


cout << &A;


در بالا متغیر A را از نوع صحیح یا int تعریف کردیم و مقدار 100 را به ان دادیم. این متغیر در یک خانه ی 4 بایتی از حافظه اصلی کامپیوتر یا همان RAM ذخیره شده است. کد بالا آدرس خانه ای که این متغیر در آن است را در پنجره ی خروجی چاپ می کند. ادرس های حافظه به صورت اعداد بر مبنای 16 نمایش داده می شوند. حالا که می دانیم آدرس یک متغیر را چگونه به دست اوریم پس بیایید یک اشاره گر تعریف کنیم که ادرس متغیر A را ذخیره کند. تعریف اشاره گر با نماد یا عملگر (*) که عملگر "مقدار یابی" نیز نامیده می شود، صورت می گیرد.

int* P = &A;

در خط بالا اشره گری به نام P تعریف کرده ایم که می تواند آدرس یک متغیر صحیح (int) را در خود ذخیره کند و سپس آدرس متغیر A را در آن ذخیره کرده ایم. اگر در این حالت بخواهیم اشاره گر P را در خروجی چاپ کنیم یعنی کد زیر را به کار ببریم :

cout << P;

آدرس متغیر A در خروجی چاپ می شود. ولی اگر بخواهیم که محتویات متغیری که اشاره گر P به آن اشاره دارد را چاپ کنیم باید عملگر (*) را قبل از آن به کار ببریم مانند زیر:

cout << *P;

در این صورت عدد 100 که مقدار متغیر A است در خروجی چاپ می شود. بر خلاف ارجاع، اشاره گر می تواند ابتدا به صورت تنها اعلان شود و سپس در قسمت های دیگر برنامه مقدار دهی شود. یک اشاره گر میتواند در صورت تعریف درست به هر نوعی اشاره کند برای مثال حتی به یک اشاره گر دیگر. در این صورت باید برای تعریف اشاره گر دوم از دو عملگر (*) استفاده کنیم.

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

ارسال یک آرایه به تابع (C++) :  

در این پست می خواهیم چند روش برای فرستادن یک آرایه به تابع را بررسی کنیم. اولین چیزی که باید در این مورد بدانید این است که آرایه ها به صورت "ارجاع" به تابع فرستاده می شوند، به این معنی که هر تغییری که تابع در آرایه ایجاد کند در برنامه ی اصلی (تابع Main ) نیز بر روی آرایه اعمال می شود.
اگر متغیری به صورت "مقدار" به تابع ارسال شود، محتوای آن بعد از خروج از تابع تغییر نخواهد کرد.
اگر متغیری به صورت "ارجاع" (یا به صورت "آدرس") به تابع ارسال شود محتوای آن توسط تابع میتواند به طور دائم تغییر داده شود.
آرایه ی یک بعدی: فرض می کنیم که آرایه ای را در بدنه ی اصلی برنامه به نام A با 20 خانه به صورت زیر تعریف کرده ایم :

int A [20];

و می خواهیم آن را به تابعی به نام Function ارسال کنیم. ابتدا تابع خود را به صورت زیر اعلان و تکمیل می کنیم :

void Function (int Name [ ], int Size_of_Array) {
دستورات تابع:
{

همان گونه که می بینید از دو آرگومان تابع، ارگومان اولی که Name نام دارد و با علامت براکت مشخص شده است نشانگر یک آرایه است و تعداد خانه های این آرایه هم به وسیله ی ارگومان دوم که Size_of_Array نامگذاری شده است به تابع ارسال می شود. نام این دو آرگومان کاملا اختیاری است و نیازی نیست که با نام آرایه ای که در بالا تعریف کردیک یکسان باشد. حالا در بدنه اصلی برنامه، تابع را استفاده می کنیم و آرایه را به تابع می فرستیم.

Function (a , 20);

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

Function (a , 20, 20);
Function (20 , a);
Function (a[20]);.

یک آرایه چند بعدی : فرض می کنیم که آرایه ای دو بعدی 5 در 10 به صورت زیر داریم:

int A [5][10];

تابعی که بتواند این آرایه را بپذیرد باید به صورت زیر باشد :

void Function (int name [ ] [10] , Size1 , Size2)
{
دستورات تابع :
}

همانگونه که در اعلان تابع می بینیم، این تابع سه آرگومان دارد که به ترتیب نام آرایه ، اندازه ی بعد اول و اندازه ی بعد دوم هستند. برای ارگومان اول نام Name با دو علامت براکت آورده شده است که نشان می دهد این تابع یک آرایه دو بعدی را می پذیرد. نکته ای که این جا اهمیت دارد این است که به جز بعد اول، تابع باید حتما بداند که اندازه ی بعد های دیگر چند هستند. البته نوشتن اندازه ی بعد اول نیز مانعی ندارد. پس اگر یک آرایه 10 بعدی هم دارید باید به غیر از بعد اول، اندازه ی بعد های دیگر را در اعلان تابع مشخص کنید. در پست های بعدی روش های دیگر ارسال ارایه ها و متغیر ها به توابع را بررسی خواهیم کرد.
حالا که در این پست صحبت از "ارجاع" (Reference) شد بد نیست که توضیحی نیز در باره آن داده شود. هنگامی که یک متغییر را به تابع ارسال می کنید در حقیقت یک کپی از آن ساخته می شود و به تابع ارسال می شود. بنابر این شما هر تغییری که در این کپی ایجاد کنید در متغییر اصلی بی تاثیر خواهد بود. یکی از معایب این روش اتلاف بی دلیل حافظه است (مخصوصا وقتی که برنامه ای که نوشته اید بسیار بزرگ و حجیم باشد). با استفاده از عملگر ارجاع که علامت (&) است می توانید به جای ایجاد یک کپی از متغیر و ارسال آن به تابع، خود متغیر را به تابع ارسال کنید. در زیر اعلان دو تابع به وسیله ی مقدار و ارجاع نشان داده شده است. این تابع یک متغیر صحیح (int) را از برنامه اصلی دریافت می کند و یک مقدار صحیح را برمی گرداند.
به روش مقدار:

int Function (int);

به روش ارجاع:

int Function (int&);

Visual C++ (قسمت دوم)


مانند هر زبان دیگری، C++ نیز از اجزای مختلفی تشکیل و در قالب یک محیط توسعه نرم افزار یکپارچه به شما ارائه شده است. در زیر با اجزای این زبان آشنا می شویم. این اجزا در کنار هم Integrated Development Environment (IDE) نامیده می شود و توسعه برنامه های کاربردی را به شدت تسهیل می کند.
Editor : 
Editor یا "ویرایشگر" همان طور که از نامش پیداست محیطی تعاملی را در اختیار شما قرار می دهد تا بتوانید کد های سی ++ را در آن بنویسید و ویرایش کنید. بسیاری از قابلیت های ویرایش متن در این محیط وجود دارد مانند تغییر فونت، رنگ و اندازه قلم، Copy-Cut-Past ، نمایش شماره خطوط و... در ویرایشگر برای درک و تمایز بهتر کد های برنامه، هر عنصر برنامه با رنگ خاصی نشان داده می شود. (برای مثال توضیحات با رنگ سبز و کلمات رزرو شده با رنگ آبی) که البته می توانید آنها را به دلخواه تنظیم کنید. ویرایشگر به طور خودکار کد های برنامه را تشخیص داده و انها را به رنگ تعیین شده در می آورد.
Compiler :
Compiler یا "مفسر" یا "مترجم" کدهای زبان سی ++ را به کد های ماشین (Object Code) تبدیل می کند (کدهایی که به وسیله سخت افزار قابل فهم است) و خطاهای موجود در پروسه ی کامپایل را شناسایی و اعلام می کند. مفسر توانایی شناسایی گستره ی وسیعی از خطاهای نوشتاری و ساختاری را دارد ولی از شناسایی خطاهای منطقی و الگوریتمی معذور است. کد های تولید شده به وسیله ی مفسر در فایل هایی به نام Object File با پسوند .obj ذخیره می شوند.
Linker :
Linker یا "پیوند دهنده" اجزای مختلف تولید شده به وسیله ی Compiler را با یکدیگر ترکیب می کند، کد های لازم را از کتابخانه ی برنامه اضافه می کند و در کل همه چیز را به یک برنامه قابل اجرا تبدیل می کند. همچنین Linker قابلیت شناسایی و گزارش خطا را دارد؛ برای مثال اگر بخشی از یک برنامه یا کتابخانه ای که به آن ارجاع داده شده است، در دسترس نباشد.
Library :
library یا کتابخانه مجموعه ای از توابع و روتین های از قبل نوشته شده (به صورت حرفه ای و بهینه) است. این کتابخانه های را میتوان برای گسترش و سهولت برنامه و یکسان بودن نتایج آن برای همه، استفاده کرد. کتابخانه استاندارد سی ++ شامل روتین های پایه و اساسی مانند عملیات های حسابی می شود. برنامه های تحت ویندوز به وسیله ی کتابخانه ای به نام "کلاس های پایه ماکروسافت" Microsoft Foundation Classes (MFC) پشتیبانی می شوند. MFC تولید رابط گرافیکی برای برنامه های کاربردی را آسان تر می کند.
پروژه ها و راه حل ها :
پروژه یا Project در برگیرنده ی تمام چیز هایی است که یک برنامه را تشکیل می دهد. این برنامه میتواند یک برنامه ی کنسولی باشد یا یک برنامه تحت ویندوز یا هر چیز دیگری. قبل از هر کاری برای ایجاد یک برنامه در Visual C++ باید یک پروژه تعریف کنید. تمام فایل های یک برنامه در پوشه ی Projects ذخیره می شوند. اطلاعات کامل در باره ی پروژه در یک فایل XML با فرمت .vcvproj ذخیره می شوند. "راه حل" یا Solution همانطور که از نامش پیداست مکانیزمی برای گردهم آورد تمام اجزایی است که برای حل یک مشکل پردازشی لازم هستند. Solution یک پوشه است که تمامی اطلاعات مربوط به یک یا چند پروژه در آن نگهداری می شود. اطلاعات پروژه ها در این پوشه در دو فایل با پسوند های .sln و .suo نگهداری می شوند.
هنگامی که پروژه خود را ساختید در پوشه ی Debug (در پوشه ی پروژه) سه فایل ایجاد می شود.
.exe این فایل همانطور که از پسوندش معلوم است فیل اجرایی برنامه ی شما است که دیگر مستقل از محیط برنامه نویسی قابل اجرا است.
.pdb این فایل اطلاعات مربوط به عیب یابی (Debug) را در بر می گیرد و در هنگامی که برنامه را در حالت Debug اجرا می کنیم استفاده می شود.
.ilk این فایل در هنگام ساختن ربنامه توسط Linker استفاده می شود. این فایل به Linker اجازه می دهد تا به صورت مرحله ای فایل های مربوط را در هنگام ویرایش و اصلاح سورس کد به فایل exe فعلی ارتباط دهد. با این کار نیاز به تغییر لینک تمامی اجزا با هر بار اصلاح و بروزرسانی برنامه، از بین می رود. 
در پوشه Debug زیرپوشه ی دیگری به همین نام وجود دارد که شامل تعداد زیادی از فایل هایی است که در طول ایجاد برنامه (Build) تولید شده اند. و میتوانید ببینید هر کدام شامل چه اطلاعاتی هستند.

Microsoft Visual C++


اگر شما هم مانند من در برنامه نویسی (مخصوصا ویژوال) تازه کار هستنید و مشکل دارید پس پست های برنامه نویسی C++ را دنبال کنید. در این پست میخواهیم با مقدماتی از برنامه نویسی در محیط Visual studio آشنا شویم. بخشی از مطالب این پست از کتاب "Beginning Visual C++" از آقای Ivar Horton است. این پست ها ادامه دارند ...
Visual Studio یکی از قویترین محیط های توسعه نرم افزار است که توسط شرکت ماکروسافت توسعه داده شده است. در این محیط تمامی ابزار های مورد نیاز برای توسعه برنامه هایی با کاربرد های مختلف در اختیار دارید. چند زبان و پلتفرم برنامه نویسی، توسعه برنامه برای وب، پایگاه داده SQL و .. البته بسته به اینکه چه نسخه ای از نرم افزار را تهیه کرده باشید. هرچه که این نرم افزار قدرتمند است، اگر خواسته باشید آن را به صورت قانونی و اصل تهیه کنید، باید به فکر هزینه ی سرسام اور آن نیز باشید. هزینه ای بین 500 تا بالای 10000 دلار که به شخصه از عهده ی من خارج است! به هر حال... برای نوشتن برنامه های کاربردی برای محیط ویندوز و دیگر سیستم عامل ها باید به دو وجه کار توجه داشته باشید. یکی کار بر روی رابط گرافیکی یا GUI (Graphical User Interface) که کاربر نهایی با آن ارتباط دارد و دیگری کار بر روی کد های تعاملی و پردازشی برنامه که باطن برنامه هستند. برای توسعه برنامه های گرافیکی یا ویژوال ابتدا بایستی به زبان برنامه نویسی خود در حالت متنی یا کنسولی مسلط باشید تا از لحاظ قواعد و قوانین مشکلی نداشته باشید. پس ابتدا کار با حالت کنسولی زبان مورد نظر خود را فرا گیرید.
Visual studio بر اساس چهارچوب .NET استوار است و .NET از دو بخش CLR و کتاتبخانه های کلاس چهارچوب .NET تشکیل شده است. حال انها چیستند ؟
.NET Framwork قالبی نرم افزاری برای سیستم عامل ویندوز است که شامل کتابخانه های بزرگ و متعددی می شود و از چندین زبان برنامه نویسی پشتیبانی می کند و به آنها اجازه می دهد تا با یکدیگر سازگاری و ارتباط داشته باشند. پس چهارچوب نرم افزاری مجموعه ای از کتابخانه های نرم افزاری است که رابطی برای توسعه نرم افزار را ارائه می دهد. برنامه های نوشته شده در .NET در محیطی اجرا می شوند که به "زمان اجرا زبان مشترک" یا Common Language Runtime (CLR) معروف است. CLR محیطی استاندارد برای اجرای برنامه های نوشته شده در گستره ای از زبان های سطح بالا مانند Visual Basic ، C# و C++ و .. است. مشخصات CLR اکنون توسط ارگان های بزرگ کامپیوتری رعایت می شود و در استاندارد های قبلی این حوزه ادغام شده است و به نوعی پیاده سازی استاندارد "زیرساخت زبان مشترک" (CLI) است که توسط سیستم عامل در کامپیوتر استفاده می شود. ( CLI یا "زیرساخت زبان مشترک" مجموعه مشخصات محیطی است که اجازه می دهد که برنامه هایی که در زبان های سطح بالای مختلفی نوشته شده اند، در سیستم های مختلف قابل اجرا باشند). توسط CLR امنیت اطلاعات و قابلیت اطمینان برنامه ها با تخصیص حافظه ی پویا، ترخیص حافظه خودکار و بررسی کد های "زبان میانه ماکروسافت" قبل از اجرا برنامه و ..، بهبود پیدا کرده است.
استاندارد کنونی C++ به نام ISO/IEC 14882:1998 می باشد که توسط سازمان جهانی استانداردسازی (ISO) تایید شده است. این نسخه ی اصلاح و کاملتر شده C++ است که قابلیت های بیشتری را در بر دارد و توسط اکثر کامپایلر های در پلتفرم های سخت افزاری و سیستم عامل ها پشتیبانی می شود. استاندارد جدید تری نیز برای C++ پیشنهاد شده است و امکان دارد در آینده تایید شود. Visual C++ 2010 از قابلیت های جدید استاندارد کنونی پشتیبانی می کند که در آینده به آنها اشاره خواهیم کرد.

AES - (بخش دوم)

ریاضیات پایه و کاربردی در AES :

برای فهم الگوریتم Rijndeal که الگوریتم به کار رفته در "استاندارد رمز نگاری پیشرفته" است بایستی ابتدا با برخی از مفاهیم ریاضی به کار رفته در آن آشنا شویم. مطالب این پست ترجمه از کتاب "AES proposal: Rijndeal" است.
The Field GF(2^8) :
عناصر یک میدان محدود یا "میدان گلوس" (GF - Galois Field) (منظور، ساختار یا مجموعه ای متناهی ازعناصر که برای آنها چهار عمل اصلی حسابی تعریف شده باشد) را می توان به چندین شیوه نمایش داد. یکی از روش های برای نشان دادن میدان GF(2^8) روش چندجمله ای کلاسیک است.
(برای مثال) یک بایت به نام b از هشت بیت تشکیل شده است که می توانیم آنها را با b0,b1,b2,b3,b4,b5,b6,b7 نشان دهیم. این بایت را می توانیم به صورت چند جمله ای زیر (برای مثال به نام b(x) ) تصور کنیم. (دقت کنید : x^k یعنی : x به توان k )

b7 x^7 + b6 x^6 + b5 x^5 + b4 x^4 + b3 x^3 + b2 x^2 + b1 x + b0

عدد '57' (مبنای 16) را تصور کنید. این عدد به صورت باینری برابر با "01010111" است و طبق فرض بالا، متناظر با چند جمله ای زیر است :

x^6 + x^4 + x^2 + x + 1
جمع (Addition) :
محاسبات در حوزه میدان با محاسبات جبری اعداد صحیح یا اعداد واقعی تفاوت دارد. در نمایش چندجمله ای ، جمع دو عنصر عملیات شبیه به عملیات منطقی XOR است. یعنی برای مثال 1 + 1 = 0 و 1 + 0 = 1 .
پس برای دو عدد دلخواه '57' و '83' داریم :

'57' = x^6 + x^4 + x^2 + x + 1 = "01010111"
'83' = x^7 + x + 1 = "10000011"
'57' + '83' = 'D4'
(x^6 + x^4 + x^2 + x + 1) + (x^7 + x + 1) = x^7 + x^6 + x^4 + x^2
"01010111" + "10000011" = "11010100"

ضرب (Multiplication) :

در نمایش چندجمله ای، ضرب در GF(2^8) متناظر "ضرب چندجمله ای ها بر پیمانه ی یک چندجمله ای باینری غیر قابل تقسیم" است. (یک چندجمله ای هنگامی غیر قابل تقسیم است که تنها بر 1 و خودش قابل تقسیم باشد). برای الگوریتم رجیندل این چندجمله ای m(x) نام دارد و برابر است با :

m(x) = x^8 + x^4 + +x^3 + x + 1

و در مینای 16 برابر با '11B' است. مثال : ( modulo = به پیمانه ی )

'57' * '83' = 'C1'
(x^6 + x^4 + x^2 + x + 1) (x^7 + x + 1) = x^13 + x^11 + x^9 + x^8 + x^6 + x^5 + x^4 + x^3 + 1

(x^13 + x^11 + x^9 + x^8 + x^6 + x^5 + x^4 + x^3 + 1) modulo (x^8 + x^4 + +x^3 + x + 1) = x^7 + x^6 + 1

نتیجه همیشه یک چندجمله ای باینری از درجه ای پایین تر از 8 خواهد بود. این عملیات ضرب شرکت پذیر خواهد بود و عنصر '01' "عنصر خنثی" آن به حساب می آید.

ادامه دارد.

انتخاب در فتوشاپ (قسمت سوم)


در پست های قبل با برخی از ابزار های "انتخاب" در فتوشاپ آشنا شدیم. قبل از بررسی روش های دیگر انتخاب در فتوشاپ چند میانبر مفید دیگر را با هم می بینیم.

- با فشردن Ctrl + Shift + I انتخاب خود را معکوس می کنید. (یعنی تمام قسمت های انتخاب نشده عکس را انتخاب و تمام انتخاب های صورت گرفته را لغو می کنید).
- با فشردن Ctrl + J قسمت انتخاب شده خود را در یک لایه ی جدید کپی می کنید. با نگه داشتن کلید Shift در هنگام این کار قسمت انتخاب شده در یک لایه ی جدید کات (بریده) می شود.
- با نگه داشتن کلید Ctrl و کلیک بر روی هر لایه از عکس، تمام محتویات آن لایه انتخاب می شود.
- با فشردن Ctrl + T میتوانید ابزار "مقیاس" یا Scale را فعال و انتخاب خود را به دلخواه ویرایش کنید.
- اگر منوهای قسمت راست میزکار باعث محدود شدن میزکار شما شده است و میخواهید برای مدتی آنها پنهان باشند، می توانید از میانبر Shift + Tab استفاده کنید.

انتخاب با استفاده از کنتراست :
بسیاری از مواقع میتوان از کنتراست، رنگ و درخشندگی بالای قسمت های مختلف یک عکس استفاده کرد و به وسیله آنها قسمت های مورد نظر از یک عکس را به آسانی انتخاب کرد. تاکید می شود که عملکرد این روش ها به عکس شما و میزان کنتراست قسمت های آن بستگی دارد.
برای انتخاب با استفاده از کنتراست ابتدا بایستی یک کانال از عکس خود را دوبل یا کپی کنید. برای این کار به قسمت CHANNELS رفته و یکی از مناسب ترین کانال های عکس خود که دارای بیشترین کنتراست بین نقاط دالخواه شما است و نقاط بیشتری از آن را پوشش می دهد را انتخاب کنید. سپس یک کپی از آن لایه به وسیله drag کردن بر روی گزینه create new channel یا کلیک راست و انتخاب گزینه ی duplicate channel ایجاد کنید. ما تنها بر روی این کانال کار خواهیم کرد پس تنها این کانال را انتخاب کنید و سپس از منوی Image به قسمت Adjustments رفته و گزینه ی Threshold را انتخاب کنید.

در پنجره Threshold عکس فعلی به صورت عکسی با تنها دو رنگ یا دو نوع پیکسل در می آید، سیاه و سفید. به این معنی که تمام پیکسل هایی که از شدت انتخابی شما تاریکتر باشند به رنگ کاملا سیاه (سیاه مطلق) و تمامی پیکسل هایی که از آن روشن تر باشند به رنگ سفید (سفید مطلق) در می آیند. شدت پیکسل میانه را (از صفر تا 255 یا به عبارتی از سیاه تا سفید) می توانید به وسیله تغییر نوار متحرک یا وارد کردن آن به صورت دستی در این پنجره تعیین کنید. هدف ما در این پنجره جدا کردن قسمت های مورد نظر برای انتخاب از سایر نقاط تصویر به وسیله ی تغییر پیکسل های تصویر است. گفتیم که در عکس هایی این کار عملکرد مناسبی دارد که قسمت های مورد نظر ما دارای کنتراست قابل توجهی نسبت به سایر نقاط تصویر باشند. در این صورت با کمی کار در این پنجره میتوان برای مثال قسمت های مورد نظر را به رنگ سفید مطلق و دیگر قسمت های تصویر را به رنگ سیاه مطلق در آوریم. هنگامی که عکس به این صورت در آمد به راحتی با ابزار هایی مانند Magic wand و Quick selection یا نگه داشتن کلید Ctrl و کلیک بر روی کانالی که ایجاد کرده اید، میتوانید قسمت های مورد نظر خود را انتخاب کنید. اگر نتواستید به طور کامل نقاطی موردنظر خود را از سایر نقاط عکس تفکیک کنید و قسمت های دیگری از تصویر نیز به علت تشابه کنتراست به رنگ قسمت های مورد نظر درآمد، میتوانید به وسیله ابزار هایی مانند پاک کن قسمت های ناخواسته را حذف کنید. پس از انتخاب قسمت های دلخواه کار ما با کانالی که ایجاد کرده ایم تمام است و میتوانیم کانال های اصلی تصویر را دو باره فعال کنیم و تصویر اصلی را داشته باشیم، البته انتخاب های انجام گرفته نیز همچنان باقی خواهند ماند.

Luminance Selection :
با نگه داشتن کلید Ctrl و کلیک بر روی هر کانال RGB، فتوشاپ به طور خودکار یک انتخب بر اساس درخشندگی انجام خواهد داد. یعنی تمام قسمت ها یا به طور دقیق تر تمام پیکسل های درخشنده تر از پیکسل میانه را انتخاب می کند. همین کار را با بقیه کانال ها نیز انجام پذیر است. برای مثال در قسمت قبل با نگه داشتن Ctrl و کلیک بر روی کانال ایجاد شده توسط ما، تمام نقاط سفید عکس انتخاب می شوند. در بسیاری از مواقع این ویژگی میتوانید بسیار در وقت و انرژی شما برای ایجاد یک انتخاب به صورت، دستی صرفه جویی کند.

ذخیره انتخاب ها در فتوشاپ :
تصور کنید که وقت زیادی برای ایجاد یک انتخاب دقیق صرف کرده اید و می خواهید آن را برای استفاده در آینده ذخیره کنید. در این صورت باید بدانید که انتخاب های خود را میتوانید به صورت "کانال آلفا" یا Alpha Channel ذخیره کنید. برای این کار به منوی CHANNELS رفته و در قسمت پایین منو گزینه ی Save selection as channel را انتخاب کنید. با این کار انتخاب شما به صورت یک کانال در عکس ذخیره می شود و هنگام نیاز با نگه داشتن Ctrl و کلیک بر روی آن میتوانید در هنگام نیاز به آن دسترسی داشته باشید. این کار با انتخب گزینه ی Save selection از منوی Select نیز امکان پذیر است. 
استفاده از ابزار قلم برای انتخاب :
ایزار قلم یا Pen در فتوشاپ ابزار بسیار دقیقی است و به وسیله آن می توانید به صورت دستی اشکال و خطوط دقیقی رسم کنید. خوشبختانه از این ابزار نیز میتوان برای انتخاب قسمتی از تصاویر استفاده کرد. برای این کار کافی است پس از انتخاب قسمت های موردنظر و اتمام کار با قلم، بر روی عکس کلیک راست کنید و گزینه Make selection را انتخاب کنید.
 پس از انتخاب قسمت های مورد نظر، با رفتن به منوی Select و قسمت Modify میتوانید تغییرات بیشتری در انتخاب خود اعمال کنید مانند نرم کردن زوایا، تغییر اندازه ی مرز، تغییر کنتراست، گسترش انتخاب و ...

انتخاب در فتوشاپ (قسمت دوم)


در قسمت قبل با ابزار های قسمت Marquee tool و Quick selection آشنا شدیم. در این قسمت ابزارها و ترفند های دیگر انتخاب در فتوشاپ را بررسی می کنیم. ولی قبل از آن با چند میانبر کارامد آشنا می شویم.
- در هنگام کار با هر ابزار اگر کلید Space را پایین نگه دارید، ابزار Hand tool فعال شده و نشانگر موس به شکل "دست" تغییر می کند. با این ابزار می توان یک عکس را در میز کار فتوشاپ یا در پنجره عکس حرکت داد. هنگامی که عکس را زوم کرده اید یا عکس در حالت عادی بزرگ است این میانبر بسیار مفید است.
- با فشار دادن کلید Ctrl + A تمام عکس انتخاب میشود.
- هنگامی که یک عکس را برای ویرایش باز کرده اید، با زدن کلید F میتوانید بین حالت های مختلف نمایش آن عکس در میز کار سوئیچ کنید.
- با فشار دادن کلید Ctrl + D تمام انتخاب های انجام شده لغو می شوند.
- هنگامی که قسمتی از عکس را انتخاب کرده اید میتوان با استفاده از کلید های Ctrl + H نمایش "انتخاب" را غیر فعال کرد. دقت کنید که انتخاب شما همچنان پابرجا است و فقط نمایش داده نمی شود یا به عبارتی، پنهان است.
- با آوردن موس به درون یک قسمت انتخاب شده میتوانید انتخاب خود را جابه جا کنید. با نگه داشتن کلید Ctrl در هنگام این کار نیز میتوانید قسمت انخاب شده از عکس را جابه جا کنید.
Lasso Tool :

با کلیک کردن بر روی این ابزار در قسمت راست میزکار سه ابزار این قسمت نمایش داده می شود که هر کدام ویژگی خاص خود را دارند.

Lasso Tool : این ابزار برای انتخاب یک قسمت از عکس با هر شکل و اندازه ی دلخواه به کار می رود. به عبارت دیگر ابزار انتخب آزاد. برای انتخاب یک قسمت از عکس کافی است کلید چپ موس را نگه دارید و قسمت موردنظر را حرکت دادن موس انتخب کنید. با رها کردن کلید موس به طور خودکار قسمت ابتدای حرکت شما به قسمت نهایی متصل شده و یک شکل بسته را به وجود می اورد. همانند ابزار marquee tool برای Lasso tool نیز حالت های new ، add ، subtract و intersect وجود دارند.
new : جایگزینی انتخاب قبلی با انتخاب جدید.
add : اضافه کردن انتخاب جدید به انتخاب یا انتخاب های قبلی.
subtract : کم کردن انتخاب جدید از انتخاب قبلی. (در صورت اشتراک داشتن)
intersect : انتخاب قسمت های مشترک دو انتخاب. (اشتراک دو ناحیه انتخاب شده)

Polygonal Lasso Tool :
این ابزار برای انتخاب یک چندضلعی نا منتظم به کار میرود. برای شروع بر روی نقطه ی دلخواه کلیلک کمید و موس را در مسیر موردنظر حرکت دهید. ابزار به طورخور کار یک خط راست بین نقطه ی شروع و محل کنونی موس ایجاد می کند. برای تغییر مسیر کافی است که یک بار کلیک کنید تا نقطه ی کنونی موس به نقطه ی آغاز خط تبدیل شود. برای تکمیل کردن انتخب می نوانید در در نقطه دبل کلیک کنید یا موس را به نقطه ی ابتدایی برسانید و هنگامی که علامت دایره کوچک کنار موس را مشاهده کردید (که به معنای بستن چند ضلعی و تکمیل انتخاب است) با کلیک کردن چند ضلعی را تکمیل کنید. با دبل کلیک در هر قسمت از مسیر به طور خودکار انتها و ابتدای شکل شما به یکدیگر متطل می شوند و انتخاب شما تکمیل می شود. واضح است که این ابزار برای انتخاب قسمت هایی که بسیار خمیدگی دارند سخت تر می شود. در این شرایط بایستی تعداد اضلاع چندضلعی را افزایش دهید تا انتخب شما دقیق تر و بیشتر به صورت منحنی شود.
Magnetic Lasso Tool :
این ابزار حالت خودکار و هوشمند ابزار قبلی است و طور خودکار نواحی یکسان از یک عکس را در نزدیکی نشانگر موس انتخاب می کند. (البته هیچکدام از ابزار های انتخاب را نمیتوان به طور کل جایگزینی ابزار دیگری کرد.) با انتخاب این ابزار کافی است که تنها موس خود را بر روی نواحی دلخواه حرکت دهید. به طور خودکار فتوشاپ سعی میکند قسمت های یکسان و مرتبط عکس را از محل عبور موس را انتخب کند. واضح است که این ابزار در نواحی پرکنتراست که تفاوت رنگ قابل توجهی دارند و کمتر شلوغ هستند عملکرد بهتری دارد و ممکن است در بسیاری از نواحی به هیچ وجه عملکرد قبل قبولی نداشته باشد. خوشبختانه میتوان دقت این ابزار را به طور دلخواه در منوی Option در قسمت های Width ، Contrast و Frequency تنظیم کرد.

Horizontal type mask tool & Vertical type mask tool :

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


Color Range tool :
یکی دیگر از ابزاز هایی که بسیار سرعت کار شما در فتوشاپ را افزایش می دهد ابزار Color range است که به وسیله آن میتوان تمام نقاط همرنگ از یک تصویر را انتخب کرد. با انتخاب این ابزار از منوی Select پنجره ای باز می شود که در آن می توان تمامی قسمت های دارای یک رنگ مشخص یا دلخواه از عکس را انتخب کرد. به وسیله ایکون "قطره چکان" در قسمت چپ پنجره میتوان رنگ یک قسمت از عکس را انتخاب کرد. همچنین در این پنجره گزینه های Add و Subtract نیز وجود دارند که به وسیله آنها میتوانید چند رنگ متفاوت را انتخاب کنید. پس از زدن گزینه ی OK تمام قسمت هایی که دارای رنگ های انتخاب شده باشند انتخاب می شود.

انتخاب در PhotoShop


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


marquee tool :
اولین ابزار انتخاب که در قسمت چپ صفحه قرار دارد، marquee tool است که اگر بر روی آن کلیک راست کنید، دارای 4 زیر مجموعه است : اولین نکته در مورد فتوشاپ این است که مانند بسیاری از نرم افزار های دیگر دارای کلید های میانبر (shortcut) برای ابزار های و پنجره های مختلف است. این میانبر ها قابلیت تغییر نیز دارند و اگر به استفاده کردن از انها عادت کنید، بسیار در وقت خود صرفه جویی کرده اید.

Rectangular marquee tool : با این ابزار می توانید یک چهار ضلعی قائم زاویه یا همان مستطیل با هر اندازه دلخواه از هر قسمت عکس را انتخاب کنید. هنگامی که این ابزار را انتخاب کردید، کافی است که بر روی عکس کلید سمت چپ موس را فشار دهید و آن را نگه دارید و موس را حرکت دهید. به کلیک کردن و کشیدن موس، به اصطلاح "drag" کردن گفته می شود. اگر میخواهید چهار ضلعی شما یک مربع باشد کافی است کلید Shift را هنگام انتخاب نگه دارید. با این کار دیگر لازم نیست به صورت دستی مراقب طول و عرض آن باشید. قبل از اینکه به سراغ ابزار دیگر برویم در قسمت منوی option گزینه هایی وجود دارند که هر کدام تغییراتی در ابزار انتخاب شده ایجاد می کنند.

- آیکون New : به طور پیشفرض این حالت انتخاب شده است و به این معنی است که اگر یک قسمت از عکس را انتخاب کرده اید و بخواهید قسمت دیگری از آن را انتخاب کنید به طور خودکار انتخاب قبلی لغو خواهد شد یا به عبارت دیگر انتخاب های جدید "جایگزین" انتخاب های قبلی خواهند شد. و در نتیجه همیشه میتوانید "یک" مستطیل از تصویر را انتخاب کنید.
- آیکون Add : در کنار ایکون new ایکون add قرار دارد که به شکل دو مربع کنار هم است. اگر این گزینه را انتخاب کنید انتخاب های جدید شما به انتخاب های قبلی "اضافه" می شوند و در نتیجه میتوانید چند قسمت از یک تصویر را انتخاب کنید.
- آیکون Subtract : اگر این گزینه را انتخاب کنید قسمت هایی از مستطیل قبلی شما که با مستطیل جدید تداخل دارند را حذف می کند. به عبارت دیگر مستطیل جدید شما را از مستطیل قبلی کم می کند.(منظور از حذف، لغو کردن یا deselect کردن قسمت های انتخاب شده است)
- آیکون Intersect : این گزینه دقیقا عکس گزینه ی قبلی است و قسمت هایی از دو مستطیل که با هم تداخل یا اشتراک دارند را نگه داشته و بقیه قسمت ها را حدف می کند. به عبارت دیگر تنها اشتراک دو منطقه ی انتخاب شده را باقی می گذارد.

گزینه ی Feather که قابلیت تغییر از 0 تا 250 پیکسل را دارد گوشه های مستطیل را از حالت زاویه دار به حالت منحنی در می اورد و لبه های قسمت انتخاب شده ی تصویر را محو می کند.
در منوی style می توانید نسبت طول و عرض مستطیل خود را با انتخب گزینه ی Fixed ratio تعیین کنید. با انتخاب گزینه ی Fixed size نیز می توانید اندازه ی مستطیل را انتخاب کنید تا دیگر نیاز نباشد که خودتان با drag کردن اندازه های را کم و زیاد کنید. در صورتی که ابعاد مستطیل را به صورت ثابت تعیین کنید تنها کافی است بر روی عکس خود کلیک کنید تا به اندازه ی تعیین شده از آن انتخاب شود.

Elliptical marquee tool :
این ابزار مشابه ابزار قبلی است با این تفاوت که به جای یک مستطیل ، با درگ کردن یک بیضی یا دایره از عکس را انتخاب می کنید. مانند ابزار قبل اگر کلید Shift را هنگام این کار نگه دارید، به صورت خودکار یک دایره از عکس را انتخاب خواهید کرد. تمام ابزار هایی که در قسمت قبلی وجود داشت نیز برای حالت بیضی نیز وجود دارند به علاوه قابلیت Anti-alias نیز به آنها اضافه می شود تا لبه های قسمت انتخاب شده را صاف و صیقلی (smooth) کند.

Single row marquee tool :
با این ابزار میتوان تنها می توان یک ردیف به "عرض یک پیکسل" از تصویر را انتخاب کرد.
Single column marquee tool :
این ابزار مشابه ابزار قبلی است با این تفاوت که یک ستون به عرض یک پیکسل از عکس را انتخاب می کند.

هنگامی که قسمتی از یک تصویر را انتخاب کرده اید، اگر به نوار منو رفته و از قسمت Select گزینه ی Inverse را انتخاب کنید، به صورت خودکار تمام قسمت هایی از تصویر را که انتخاب نکرده اید انتخاب و قسمت هایی که انتخاب کرده بودید لغو می شوند.
اگر بخواهید تمام قسمت های انتخاب شده را لغو کنید میتوانید از میانبر Ctrl + d استفاده کنید.

Quick Selection Tool & Magic Wand Tool :
این دو ابزار یکی از سریعترین و جالب ترین ابزار های انتخاب در فتوشاپ هستند. با انتخب این دو ابزار و کلیک بر روی هر قسمت عکس، به طور خودکار تمام نواحی "هم رنگ" و مشابه (بسته به محدوده ی رنگ تعیین شده) با آن نقطه انخاب می شوند. بدیهی است که دقت و عملکرد این ابزار ها در نقاط پرکنتراست (که تفاوت رنگ زیادی دارند) ماکسیمم خواهد بود. مانند ابزار marquee برای این ابزار ها نیز در قسمت option گزینه ی new ، add و subtract وجود دارد که عملکرد انها در بالا توضیح داده شد. تفاوت این دو ابزار در این است که در ابزار Quick Selection باید برای انتخاب نواحی موس خود را بر روی نقاط موردنظر drag کنید ولی ابزار Magic Wand با یک کلیک به طور خودکار تمام نواحی یکسان و مرتبط را تشخیص می دهد. میتوان حساسیت این دو ابزار را در نوار option تنظیم کرد. با انتخاب گزینه ی Sample all layers این دو ابزار در انتخاب نواحی به محتوای تمامی لایه های عکس توجه می کنند ولی در صورتی که این گزینه غیر فعال باشد تنها لایه ای که انتخاب شده است را مورد توجه قرار می دهند.
در قسمت های بعدی با ابزار های دیگر مفید برای کار بر روی تصاویر آشنا می شویم.

BogoSort


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

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

برای پیاده سازی این الگوریتم به دو تابع احتیاج است، یک تابع که مرتب بودن لیست را برسی کند و یک تابع که لیست را به صورت تصادفی تغییر دهد (یا بهم بریزد). برای نوشتن تابعی که لیست را به صورت تصادفی تغییر دهد، میتوان با استفاده از تابع Rand() اعداد تصادفی در محدوده ی دلخواه تولید کرد و بر اساس آنها عناصر لیست را جابه جا کنیم و تابع بررسی لیست نیز میتواند که یک تابع boolean باشد که در صورت مرتب بودن یا نبودن لیست true یا false را برگرداند.
شاید بتوان با تغییراتی در این الگوریتم، آن را کارامد کرد و سرعت اجرای آن را بهبود داد. الگوریتم های دیگری نیز وجود دارند که تقریبا مشابه BogoSort و بر اساس آزمون خطا هستند؛ مانند Bozo sort که در آن دو عنصر از لیست به صورت تصادفی انتخاب و جابه جا می شوند. در قدم بعد اگر لیست مرتب نشده بود، دو عنصر دیگر انتخاب می شوند و این مراحل دو باره تکرار می شوند تا اینکه بلاخره لیست مرتب شود.
{ "bogo" معنی خاصی ندارد و مانند اصلاحات دیگری مانند "oops" و "ouch" برای ابراز یک حالت روحی به کار می رود}