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

 

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

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

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

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

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

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

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

توابع در زبان پاسکال - Functions


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


function "NAME" ( "Parameters" ) : "TYPE";
Begin
/* function body */
End;

شکل کلی تابه به این صورت است که پس از کلمه کلیدی Function ، نام تابع آورده می شود و پس از آن پارامتر های تابع (نام به همراه نوع) و پس از آن نوع تابع ("TYPE") که مشخص کننده ی نوع خروجی آن است، آورده می شود و پس از آن بدنه ی تابع که کد های اجرا شونده تابع هست، در یک بلوک شامل Begin و End قرار می گیرد. حالا ذکر چند نکته در مورد توابع :

- توابع تنها یک مقدار را به برنامه باز می گردانند و این کار به وسیله قرار دادن مقدار خروجی در نام تابع صورت می گیرد.
- تابع می تواند بدون بارامتر باشد؛ برای اینکار کل پرانتز پارامتر های تابع، حذف می شود و فراخوانی تابع تنها با ذکر نام تابع در برنامه صورت می گیرد.
- تمام پارمتر های تابع از نوع مقداری یا صوری باشد. چون قرار نیست پارامتر های به برنامه اصلی بازگزدانده شوند.
- می توان آرایه ها، رکورد ها و مجموعه ها را به عنوان پارمتر تابع تعریف کرد. برای ارسال این انواع بع تابع باید آنها را در قسمت type تعریف کنید و سپس متغیر هایی از نوع آن ایجاد کردذه و آنها را به تابع ارسال کنید. به صورت مستقیم نمیتوان اینکار را انجام داد.
- یک تابع میتواند خود را فراخوانی کند. به این معنی که در داخل بدنه ی تابع، تابع فراخوانی شده باشد. به این گونه توابع، توابع بازگشتی می گویند.
- توابع در انتهای قسمت تعریف برنامه اصلی (Var) تعریف می شوند.
- نام توابع مقدار خروجی تابع را در بردارد. پس میتوان تابع را در دستور خروجی یا جایگزینی استفاده کرد.
- در تعریف توابع حتما باید نوع تابع را مشخص کنید؛ تابع بدون نوع وجود ندارد.
- یک تابع را می توان در درون یک تابع دیگر استفاده کرد ولی نمیتوان تک تابع را در درون یک تابع دیگر تعریف کرد. به عبارت دیگر در پاسکال "توابع تودرتو" وجود ندارند.

برای مثال در زیر تابعی به نام fact ، فاکتوریل یک عدد ارسالی را محاسبه می کند.

function fact (num : integer) : longint;
var
i , f : integer;
Begin
f := 1;
for i := 1 to num Do
f := f * i;
fact := f;
End;

در تابع یالا با قرار دادن مقدار متغیر f در نام برنامه، مقدار فاکتوریل محاسبه شده به برنامه اصلی فرستاده می شود. برای به کار بردن این تابع در برنامه کافی است نام تابع را به همراه یک پارمتر از نوع integer ذکر کنیم. مانند زیر : (مقدار 24320 در خروجی چاپ می شود)

writeln ( fact (10) );

روال ها در زبان پاسکال - Procedures


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

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

Procedure NAME (Parameters);
begin
/* code */
end;

شکل کلی روال ها را در پاسکال دیدید. استفاده از کلمه ی کلیدی Procedure ، آوردن نام روال و پارامتر های آن درون پرانتز؛ سپس بدنه ی روال که در آن کد های روال برای اجرا نوشته می شود. خط اول، عنوان روال نام دارد و بدنه ی تابع بین دو کلمه ی begin و end قرار می گیرد. حالا وارد جزئیات می شویم، ابتدا پارامتر های روال. پارامتر های روال همان متغیر هایی هستند که به روال ارسال می شوند تا در روال اعمالی رو آنها صورت گیرد. این پارمتر ها به دو شیوه به روال ارسال می شوند که به "پارمتر های صوری" و "پارمتر های واقعی" معروف هستند.
(در زبان C++ این قضیه "ارسال از طریق آدرس" و "ارسال از طریق مقدار" نامیده می شود.) حالا این یعنی چه ؟
پارمتر های صوری به پارمتر هایی گفته می شود که فقط قابلیت "ارسال" به روال را دارند و از روال به برنامه ی اصلی بازگشت داده نمی شوند. به این معنی که هر بلایی که در روال سر آنها در آورید، در برنامه اصلی مقدار آنها محفوظ باقی ماند. البته این به این معنی نیست که آنها در روال هم غیر قابل تغییر باشند. پارامتر های صوری به شیوه ی زیر اعلام می شوند.

NAME : TYPE

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

Var NAME : TYPE

حالا یک مثال در مورد روال ها :

Procedure Sample (i : integer; j : real; Var a : integer; Var b : real);
begin
/* do something with i , j , a, b */
end;

در بالا روالی به نام Sample تعریف شده است که دارای 4 پارامتر است که دو تای آنها صوری و دو تای دیگر واقعی هستند. پارامتر های i و j که بدون کلمه ی var تعریف شده اند پارامتر های صوری هستند و پاارمتر های a و b که با کلمه ی Var تعریف شده اند، پارامتر های واقعی هستند. پس هر تغییری که در روال بر روی پارمتر های i و j رخ دهد بر روی مقادیر آنها در برنامه اصلی بی تاثیر خواهد بود. یعنی اگر در هنگام فراخوانی روال مقادیر آنها به ترتیب 10 و 15.5 بوده باشد، پس از پایان کار روال هم این مقادیر یکسان خواهند بود. حالا کلا منظور از فراخوانی چیست ؟
فراخوانی روال به معنی استفاده از روال در برنامه است. روال ها در قسمت Var (تعریف متغیر ها) برنامه تعریف می شوند و پس از ان در برنامه ی اصلی استفاده می شوند. با استفاده از نام روال، آن را در برنامه فراخوانی می کنیم و سپس پارامتر های آن را به ترتیب داخل پرانتز می آوریم.

NAME (parameters);

برای مثال بالا استفاده از روال به صورت زیر خواهد بود.

x , y : integer;
r , l : real;
Sample (x , r , y , l);

چون روال Sample دارای 4 پارامتر بود، در هنگام استفاده از روال هم باید 4 پارمتر به روال ارسال شود. ترتیب پارمتر ها باید به درستی رعایت شود چون هر پارمتر ممکن است دارای نوع خاصی باشد و در هنگام فراخوانی، پارمتر های ارسال شده "به ترتیب" (به صورت متناظر) با پارمتر های تعریف شده در روال مچ می شوند. یعنی در مثال بالا :

x -----> i
r -----> a
y -----> j
l -----> b

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

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

C++ Class Template


در مورد template ها در گذشته صحبت کردیم و استفاده از انها در توابع توضیح داده شد، حالا در این پست در مورد آوردن این ویژگی به کلاس ها توضیح می دهیم. استفاده از کلاس های template انعطاف پذیری کلاس را افزایش و کد نویسی را کاهش می دهد. در زیر با ارائه یک مثال، پیاده سازی کلی یک کلاس template را نشان می دهیم.


template < class T >
class Class_Name
{
public:
Class_Name (T "Variable_Name")
{
   // code
}
T test (T "Variable_Name")
{
   // code
}
private:
T "Variable_Name";
};

در بالا یک کلاس به صورت template تعریف کرده ایم که یک "سازنده" و یک تابع عضو دارد. قبل از هر چیز توضیح چند چیز ضروری است.
T در مثال بالا تنها یک نام است و هیچ گونه مشکلی برای تعریف نام دلخواه خود نخواهید داشت. T در واقع یک TypeName است (یک "نوع" است) است که در اینده، هنگام ایجاد یک شی از این کلاس تعریف خواهد شد.
مثال بالا تنها نمونه ساده ای از تعریف یک کلاس template است و هیچ مانعی برای برای ایجاد دهها سازنده، تابع و متغیر عضو با استفاده از نوع T وجود ندارد و همچنین مانعی برای تعریف یک کلاس با چندین TypeName نیست. برای مثال می توانید کلاس را با سه typename تعریف کنید که در هنگام ایجاد شی از کلاس به ترتیب، تعریف خواهند شد.

template < class T, class T2, class T3 >

سه نوع T ، T2 و T3 میتوانند در هر کجای کلاس به کار روند و متغیر هایی از نوع آنها تعریف کرد. البته واضح است که کلاس های مدیریت شده نمی توانند متغیر های مدیریت نشده داشته باشند، پس باید در باره ی انتخاب انواع اندیشید.

ایجاد یک شی از کلاس : همانطور که تعریف و قوانین کلاس بالا، مشابه کلاس های معمولی است، تعریف یک شیاز کلاس نیز مشابه کلاس های معمولی است با این تفاوت که باید Type Name هایی که در template تعریف کرده اید را هنگام ایجاد شی از کلاس، مشخص کنید. در زیر حالت کلی تعریف یک شی از کلاس آمده است :


Class_Name < type > Object_Name;

یا (به صورت یک اشاره گر) :

Class_Name < type > * Object_Name = new Class_Name < type > () ;


اگر کلاس شما حاوی چند type name باشد، باید آنها را به ترتیب مشخص کنید.

Class_Name < type1, type2, type3 , ... > Object_Name;

تعریف توابع در بیرون کلاس نیز مشابه کلاس های معمولی و به صورا زیر است :

template < class T >
Class_Name < T >::Function_Name (T "Variable_Name", other variables...)
{
// code
}

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

در زیر هم نمونه یک template class را مشاهد می کنید که دارای چند تابع عضو و سازنده و type name است.

template < class T, class T2, class T3 > 
class Sample
{
public:
Sample ()
{
// code
}
Sample (T ipt)
{
// code
}
~Sample()
{
// code
}
// Function declaration
void someFunc ();

T somFunc2 (T r)
{
return r;
}
private:
T j;
T2 k;
T someFunc3 (T3 p)
{
// code
}
};

حلقه ی for each و Renge-Based for در C++


در زبان C++ حلقه ی for دارای دو نسخه ی ساده شده برای کارهای خاص می باشد. این دو نسخه حلقه ی for each و range-based for هستند که غالبا برای پیمایش ترتیبی و کامل یک آرایه به کار می روند.

for each :
حالت کلی حلقه ی for each به صورت زیر است :


for each ("VARIABLE" in "ARRAY")
{
// code
}

کد بالا را چنین می شود بیان کرد: "برای هر عنصر از نوع VARIABLE در آرایه فلان، دستورات زیر را انجام بده".برای مثال اگر Sample را یک آرایه از اعداد صحیح در نظر بگیریم، حلقه ی for each به صورت زیر در می آید : 

for each (int I in Sample)
{
// do something
}

توجه به چند نکته زیر در به کار بردن این حلقه اهمیت دارد.
- متغیری شمارش حلقه (در اینجا I ) می تواند در بیرون حلقه هم تعریف شده باشد و نیازی نیست حتما در خود حلقه تعریف شود.
- در این حلقه برخلاف حلقه ی for معمولی نمی توان شمارنده را دستکاری کرد ولی آرایه قابل دستکاری است.
- میتوان شمارنده را به صورت auto تعریف کرد تا کامپایلر به صورت خودکار نوع آن را نسبت به آرایه ارسالی تعریف کند.
- در زبان C# حلقه ی for each نحو یکسانی دارد، البته نام حلقه در C#، بدون فاصله (foreach) است.

Range-Based for :
حالت کلی این حلقه به صورت زیر است :

for ("VARIABLE" : "ARRAY")
{
// code
}

مثال بالا برای در حلقه ی Range-Based به صورت زیر خواهد بود :

for (int I : Sample)
{
// do something
}


این حلقه نیز مانند حلقه ی قبلی بیان یکسانی دارد و قواعد آن نیز مشابه حلقه ی for each است؛ با این تفاوت که متغیر شمارش حلقه در این جا باید حتما در خود حلقه تعریف شود. استفاده از این دو حلقه در بسیاری مواقع بهتر از حلقه ی for یا While است، ولی کاراییشان مسلما کمتر و دستتان در استفاده از آنها بسته تر است.  

برچسب ها ... به نام تو، به کام او؟


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

Linkin Park - Breaking the Habit


 با این جمله شروع کنم که Breaking the Habit آهنگ موردعلاقه من در بین تمامی آهنگ های گروه لینکین پارک است؛ ششمین آهنگ از البوم دوم گروه به نام Meteora  که در سال 2004 منتشر شده و بدون شک یکی از بهترین های لینکین پارک. شعر توسط Mike Shnoda نوشته و موزیک ویدئو آن توسط Joe Hahn کارگردانی شده است. مانند دیگر آهنگ های لینکین پارک هر کسی میتواند برداشت متفاوتی از آهنگ داشته باشد؛ ولی ظاهرا "اعتیاد" (هرگونه اعتیادی) اصلی ترین برداشتی است که از شنیدن آهنگ به انسان دست می دهد. همانگونه که گفته شد هر کسی میتواند با توجه با زندگی خودش برداشت متفواتی از آهنگ داشته باشد و به نظر من هم یکی از مشخصه های یک آهنگ خوب همین است.  

متن و ترجمه :


Memories consume خاطرات به یاد می آیند،
Like opening the wound مانند سر باز کردن زخم ها.
 I'm picking me apart again دوباره خودمو آشفته می کنم 
You all assume شما همه فکر می کنید...
I'm safe here in my room که اینجا تو اتاقم، جام امن هست
[Unless I try to start again] مگر اینکه دوباره تلاشی برای شروع داشته باشم

I don't want to be the one من نمیخوام کسی باشم که...
The battles always choose همیشه در در هر شرایطی ضرر می کنه.
'Cause inside I realize به خاطر اینکه در باطن می دونم...
That I'm the one confused این منم که که سردرگم شده.

I don't know what's worth fighting for من نمی دونم چه چیزی ارزش جنگیدن رو داره
Or why I have to scream یا چرا باید فریاد بزنم
I don't know why I instigate من نمیدونم چرا من اصرار دارم
And say what I don't mean و چیزی رو می گم که بهش اعتقاد ندارم
I don't know how I got this way من نمیدونم چطور به این راه کشیده شدم
I know it's not alright و میدونم که این راه درست نیست
So I'm
Breaking the habit پس من (امشب) عادتم رو ترک می کنم.
Tonight

Clutching my cure به دنبال راه علاج هستم
I tightly lock the door در رو محکم می بندم
I try to catch my breath again سعی میکنم دوباره نفسی تازه کنم
I hurt much more
Than anytime before بیشتر از هر وقت دیگه ذجر می کشم
I had no options left again دوباره هیچ انتخابی نداشتم

I'll paint it on the walls این ها رو روی دیوار نقاشی می کنم
'Cause I'm the one at fault چون منم که مرتکب اشتباه شدم
I'll never fight again دیگه هیچ وقت نخواهم جنگید
And this is how it ends , و داستان این طور تموم میشه

I don't know what's worth fighting for من نمی دونم چه چیزی ارزش جنگیدن رو داره
Or why I have to scream یا چرا باید فریاد بزنم
But now I have some clarity ولی حالا این صراحت رو دارم...
To show you what I mean تا منظورمو بیان کنم.
I don't know how I got this way من نمی دونم چطور به این راه کشیده شدم
I'll never be alright (با این وضع) هیچ وقت درست نمیشم
So I'm
Breaking the habit
Breaking the habit
Tonight پس همین امشب عادتم رو ترک می کنم

Properties در C++/CLI و C#


اگر برنامه نویس زبان های C++ یا C# هستید حتما با "مشخصات" یا properties کلاس ها کار کرده اید. چه هنگام استفاده از کلاس های از پیش نوشته شده .Net یا کلاس هایی که خود مینویسید. حداقل از field ها استفاده کرده اید. برنامه نویسی بدون استفاده از آنها محال است! field ها همان متغیر های کلاس شما هستند که وقتی به صورت "عمومی یا Public آنها را تعریف می کنید به مشابه (نه دقیقا) مشخصات (Properties) رفتار می کنند. استفاده از فیلد ها و property ها بسیار حیاتی و اساسی است. چطور میشود که یک فایل یا آرایه در اختیار داشته باشید و نخواهید نام، طول یا حجمش را بدانید؟ یا چطور میشود یک مشتری داشته باشید در صورتی که نام، آدرس یا شماره تلفن آو را ندانید ؟ property ها همانطور که از نامشان برمیآید خواص یک شیء هستند و در مورد آن شیء توضیح می دهند.

در این پست کمی بیشتر با Properties در زبان C# یا C++ آشنا می شویم. مثال های این پست به زبان C# هستند ولی در زبان C++/CLI نیز نحو تقریبا مشابه است. حالت کلی تعریف یک property به شکل زیر است :


public/private TYPE Property_Name
{
   get
   {
      // Code
   }

   set
   {
      // code 
   }
}



public" و "private نوع دسترسی به property را مشخص می کنند. "TYPE" نوع property و "Property_Name" واضخا نام آن است. در داخل بلوک اصلی دو بلوک به نام های Set و Get وجود دارد که به setter (قرار دهنده) و Getter (گیرنده) معروف هستند.
کد های بلوک Get هنگامی که کاربر قصد دریافت اطلاعات Property را دارد، اجرا می شوند. و کد های بلوک Set برای ثبت تغییرات و نوشتن در Property به کار می رود. این کد ها میتوانند هر چیزی باشند. از یک عملیات انتصاب ساده تا محاسبات پیچیده... که واضحا بستگی به نیاز شما دارد. اگر property شما نیازی به دستکاری شدن ندارد میتوانید کل بلوک Set را حذف کنید. در این صورت property شما "فقط خواندنی" یا read-only خواهد بود. مسلما برخی از مشخصاتی که در طول برنامه نویسی به آنها سر و کار داریم هم باید این گونه باشند. معمولا در بلوک Get با استفاده از دستور return مقداری که قرار است به برنامه بازگشت داده شود، را بازمیگردانند و در بلوک Set ، عملیات انتصاب عنوان می شود. ولی بسته به نیاز شما هر کدی میتواند در آنها استفاده شود.
پس کلا هدف این کارها چه بوده است ؟ property ها نقش دریافت کننده و فرستنده ی مقادیر را دارند. در setter مقادیر را دریافت می کنید و عملیات دلخواه را روی آنها انجام می دهید و در getter انها را به برنامه برمیگردانید. معمولا property ها به صورت "عمومی" (public) تعریف می شوند (تا توسط کاربر کلاس قابل دسترسی باشند) و مقادیر خود را در فیلد های خصوصی ذخیره می کنند. برخی از مواقع شاید این کار مزیتی نداشته باشد و کار به صورت مستقیم با فیلد ها هم کارتان را راه بیندازد؛ ولی در بسیاری از مواقع، استفاده از property ها مزایای خود را نمایان می کند. مانند پنهان سازی اطلاعات. در اخر می توان property ها را در یک جمله تعریف کرد : "راهی برای درسترسی به اطلاعات." شاید تا همین جا برای این پست کافی باشد، در پست های بعدی به جزئیات در مورد مشخصات کلاس اشاره می کنیم.

مرتب سازی صدفی - ShellSort


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

دور اول :
فرض لیستی با 12 عدد در اختیار دارید. ابتدا عناصری که 6 خانه از هم فاصله دارند (12 تقسیم بر 2) با یکدیگر مقایسه می شوند و در صورت نیاز جابه جا می شوند. یعنی عنصر اول با عنصر هفتم، هنصر دوم با عنصر هشتم، عنصر سوم با عنصر نهم و به همین ترتیب عنصر ششم با عنصر دوازدهم. در خلال این مقایسات عنصری که در حال حاضر جابه جا شده است با عنصر 6 خانه ی قبل نیز مقایسه میشود و در صورت نیاز تعویض می شود.

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

تکه برنامه زیر یک پیاده سازی غیر موثر این الگوریتم در زبان C# است :
list : ارایه ای نامرتب برای مرتب سازی.
Gap : فاصله ی مرتب سازی در هر دور.
swap : تابعی برای جابه جایی دو عنصر از لیست.



int[] list = new int[] {-1, -5, 1, 92, -8, 14, -7, 29, 22, 18, 10,
                              2, 32, 0, 41, 4, 8, 6, 5, 9, 41, 23, -9};

int Gap = list.Length / 2;

while (Gap > 0)
{
for (int i = 0; i + Gap < list.Length; i++)
{
if (list[i] > list[i + Gap])
{

  swap(ref list[i], ref list[i + Gap]);

  for (int j = i; j - Gap >= 0; j--)

     {

if (list[j] < list[j - Gap])
{
   swap(ref list[j], ref list[j - Gap]);
}
else
{
   break;
}

   }

}

}

Gap = Gap / 2;
}
  

ایجاد پروژه ی C++ Windows Forms در Visual Studio 2012 (روش دوم)


در Visual Studio 2012 به طور پیشفرض گزینه ی C++ Windows Forms وجود ندارد (حذف شده است)؛ با انجام مراحل زیر میتوانید این گزینه را به قسمت "ایجاد پروژه ی جدید" بازگردانید.


گام 1 :

این فایل ها را دانلود کنید.

لینک دوم.


گام 2 :
به مسیر زیر رفته و از فایل های موجود Backup بگیرید. (یک پوشه ایجاد کنید و فایل های موجود را در آن کپی کنید).
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcprojects\vcNET

گام 3 :
فایل هایی که دانلود کرده اید را در این پوشه (مسیر بالا) کپی کنید.

گام 4 :
ویژوال استدیو را باز کنید و به قسمت New Project - > Visual C++ - > CLR بروید. در صورت درست انجام دادن مراحل بالا باید گزینه ی Windows Forms را در میان گزینه های موجود مشاهد کنید.

گام 5 :

یک پروژه ی Windows Forms ایجاد کنید و ببینید همه چیز درست کار می کند یا نه !

منبع : http://www.abouthack.com/

پست اصلی : http://www.abouthack.com/articles/programming/c-plus-plus/windows-forms-application-in-visual-c-2012.html