افزایش سرعت وردپرس با بهره‌گیری از Caching، به زبان ساده و بدون خونریزی!

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

codinghorror-wordpress-caching

توجه داشته باشید که در نمودار‌ بالا، برای از اعمال Caching، از افزونه‌ی WP-Cache استفاده شده که نسبت به افزونه‌هایی که در ادامه معرفی خواهیم کرد، کارایی کمتری دارد. می‌توانید نمودار‌های مقایسه‌ی سرعت افزونه‌های کش را هم در این صفحه ببینید.

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

اصلاً Caching چیست؟

به زبان ساده، هر بار که کاربری می‌خواهد یکی از صفحه‌های وبگاه شما را باز کند، وردپرس «اجرا» می‌شود و صفحه را می‌سازد. از آن‌جایی که این «اجرا‌»‌های مکرر در واقع خروجی یکسانی دارند (مثلاً یک صفحه از سایت شما، تا زمانی که کامنتی ارسال نشود تغییری نمی‌کند)، می‌توانیم خروجی این «اجرا»ها را در جایی ذخیره کنیم و بارهای بعدی، به جای «اجرا»ی دوباره‌ی برنامه، همان خروجی ذخیره شده را برای کاربر ارسال کنیم. به این کار، Caching می‌گویند.

increase-wordpress-speed-boost-wordpress-speed-using-some-plugins1

چه شیوه‌هایی برای Cache کردن وجود دارد؟

به طور کلی، می‌توان دو شیوه‌ی اساسی برای Caching نام برد:

۱. Cache صفحه: در این شیوه، کل خروجی یک صفحه به صورت یک فایل در سرور ذخیره می‌شود و آن صفحه به عنوان خروجی درخواست متناظر، ارسال می‌شود.

۲. Cache عملکرد‌ ها: در این شیوه، به جای ذخیره کردن کل صفحه، برخی عملکرد‌ها (مثل ویجت‌ها، یا درخواست‌های بین دیتابیس و وردپرس) ذخیره می‌شوند و در موقع لزوم مورد استفاده قرار می‌گیرند.

خب، بیایید کار را شروع کنیم!

گام نخست: افزونه‌ی Hyper Cache Extended را روی وردپرس نصب و فعال کنید. این افزونه کارایی مناسبی دارد و راه‌اندازی آن هم بسیار ساده است.

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

در منوی وردپرس، از قسمت «پیشخوان» روی Hyper Cache E کلیک کنید.

Screenshot (61)

حال، در قسمت Configuration for mobile devices، یکی از دو گزینه‌ی زیر را فعال کنید:

Screenshot (62)

اگر از افزونه‌ی WordPress Mobile Pack استفاده می‌کنید گزینه‌ی اول و اگر از روش دیگری استفاده می‌کنید، گزینه‌ی دوم را انتخاب کنید.

گام دوم: افزونه‌ی DB Cache Reloaded Fix را هم روی وردپرس نصب و فعال کنید. نیازی به دستکاری تنظیمات این افزونه نیست!

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

توجه داشته باشید که تا زمانی که در وردپرس لاگین باشید، افزونه‌ی کش صفحه‌های کش شده را به شما نشان نمی‌دهد. برای مشاهده‌ی تغییر سرعت، از وردپرس خارج شوید، یا مرورگر را در حالت Incognito/Private باز کنید. هنگام نخستین مشاهده‌ی صفحه، آن صفحه Cache می‌شود. حال اگر صفحه را Refresh کنید، می‌بینید که چقدر سرعت پاسخگویی سایت بالا رفته است!

***

یک گام اضافه: این گام ربطی به Caching ندارد، اما به بهبود سرعت وبگاه شما کمک به‌سزایی می‌کند: با کمک افزونه‌ی WP-Optimize، پایگاه داده‌ی خود را بهینه‌سازی کنید. بهینه‌سازی دیتابیس، حجم آن را کاهش و سرعت آن را افزایش می‌دهد. برای این‌کار، پس از نصب و فعال سازی این افزونه، در پایین منوی اصلی وردپرس روی WP-Optimize کلیک کنید، گزینه‌ی «بهینه سازی جداول پایگاه داده» را تیک بزنید و روی دکمه‌ی Process کلیک کنید. خوب است هر چند هفته یک بار،‌ این کار را تکرار کنید. (تیک‌زدن گزینه‌ی «حذف تمام رونوشت‌ها» هم می‌تواند حجم دیتابیس را کاهش و در نتیجه سرعت آن را افزایش دهد. اگر صلاح می‌دانید، این گزینه را هم تیک بزنید!)

Screenshot (63)

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

و یک نکته در همین مورد: اگر در قالب یا افزونه‌های وبگاه خود تغییراتی اعمال کردید، می‌توانید از صفحه‌ی تنظیمات Hyper Cache E، با کلیک بر روی دکمه‌ی Clear cache، صفحات ذخیره شده را پاک کنید تا تغییرات اعمال شده به کاربران نمایش داده شوند. همچنین اگر از کلادفلیر استفاده می‌کنید، در صورت تغییر در برخی فایل‌ها، لازم است از وبگاه کلادفلیر در بخش Cloudflare settings، روی دکمه‌ی Purge cache کلیک کنید تا تغییرات اعمال شده نمایش داده شوند. (در صورت انجام ندادن این کار، ممکن است نمایش تغییرات به کاربران تا چند روز به طول بیانجامد)

آیا در راه‌اندازی Cache به مشکلی برخورده‌اید؟ آیا افزونه‌های دیگری را برای این منظور پیشنهاد می‌کنید؟ Caching چه‌قدر در افزایش سرعت وبگاهتان به شما کمک کرده‌است؟ کیفیت گام‌های اضافه‌ی این نوشته از دید شما چطور بود؟! منتظر دیدگاه‌های شما هستیم.

پی‌نوشت: اگر مایلید بدانید، «دو برنامه‌نویس»‌ در حال حاضر برای Caching از افزونه‌های Hyper Cache Extended، DB Cache Reloaded Fix و WP Widget Cache استفاده می‌کند.

آموزش برنامه‌نویسی – بخش دوم – چند قدم جلوتر در راستای یادگیری مفاهیم!


سری جدیدی از آموزش‌های برنامه‌نویسی آغاز شده است. این سری منقضی شده است. پیشنهاد می‌کنیم این سری را ادامه ندهید!


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

شرط‌ها در پاسکال

در بیش‌تر مواقع ما نیاز به تصمیم‌گیری در مورد اطلاعات ورودی کاربر داریم. مثلا یک ماشین‌حساب ساده نیاز دارد بداند که در حال حاضر کدام عملگر را بین دو عدد ورودی اعمال کند. یعنی نیاز است که بررسی کنیم که کاربر کدام علامت (+ – / ×) را وارد کرده است؛ این کار با اعمال شروط امکان‌پذیر است.

ساختار کلی شرط‌ها

در پاسکال شرط‌ها به شکل زیر نوشته می‌شوند:

if {} then
	{Do something};

که پس از if باید شرط خود را قرار دهیم و پس از then نیز دستوری قرار می‌گیرد که اگر شرط درست بود باید اجرا شود.


کامنت‌ها

در بیش‌تر مواقع در برنامه‌نویسی شما نیاز خواهید داشت که توضیحاتی برای کدهای خود بنویسید. بزارید این‌طور توضیح دهم که فرض کنید شما برنامه‌ای با ۱۸۰۰۰ خط نوشته‌اید و در هنگام اجرا در خط ۱۵۴۳۶ام آن مشکلی پیش آمده است. مطمئنا انرژی خیلی‌خیلی‌خیلی زیادی باید صرف کنید تا بفهمید که قرار بوده در خط ۱۵۴۳۶ چه اتفاقی بیافتد (در این حد که در زبانی مثل پاسکال شاید مجبور باشید ۱۰۰۰ خط قبل و بعد از آن را بررسی کنید تا بفهمید! ولی نگران نباشید، قرار نیست شما برنامه‌نویس پاسکال باشید!). ولی در هنگام برنامه‌نویسی کافی است ۱ میلیونیم آن انرژی را صرف کتید و جلوی آن خط کامنتی بگذارید که قرار است چه اتفاقی بیافتد (به همین سادگی!‌ در مورد انرژی زیاد اغراق نمی‌کنم. در پروژه‌ی خامه‌عسل ما با همین مشکل روبرو هستیم و هنوز هم نتوانستیم خودمان را از این باتلاق بیرون بکشیم!)

در پاسکال کامنت‌ها به دو صورت در کدهای شما قرار می‌گیرند:

(*your comment line 1
Line 2
Line 3
Line 4*)

یا

{your comment line 1
Line 2
Line 3
Line 4}

که تا آن‌جایی که ما فهمیدیم هیچ فرقی با یکدیگر ندارند!


خوب برگردیم سراغ شرط‌های خودمان.

فرض کنید که می‌خواهیم سن کاربرمان را بپرسیم. در مرحله‌ی اول لازم است چک کنیم که کاربر سن‌ش را غلط وارد نکند. پس با فرض این موضوع که در زمان نوح (ع) زندگی نمی‌کنیم بیش‌ترین سن را ۲۰۰ سال و کم‌ترین را ۰ در نظر می‌گیریم. پس برنامه به شکل زیر خواهد بود:

var
age: integer;
ageOK: boolean;
begin
	writeln('plz enter you age:');
	readln(age);
	ageOK:= false;
	if a>0 then
		if a<200 then
			ageOK:= true;
	{do another things}
end.

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

دورزدن پاسکال با begin و end; !

اگر متوجه شده‌باشید در دستور پس از if شما اجازه دارید فقط یک دستور را اجرا نمایید و این موضوع مطمئنا مشکل‌زا خواهد بود. برای همین هم ما می‌توانیم با یک «تکه‌‌برنامه» این محدودیت را دور بزنیم. مثلا فرض کنید در برنامه‌ی بالا به کاربر بگوییم که شما که سن‌تان از ۰ کم‌تر است در زمان سفر کرده‌اید یا اگر سن‌شان از ۲۰۰ بیش‌تر است می‌توانند خودشان را به کتاب رتبه‌های سالیانه‌ی گینس معرفی کنند!

پس برنامه به شکل زیر تغییر می‌کند:

var
age: integer;
ageOK: boolean;
begin
	writeln('plz enter you age:');
	readln(age);
	ageOK:= false;
	if a>0 then
	begin
		if a<200 then
		begin
			ageOK:= true;
		end;
		if ageOK=false then
			writeln('The Guinness Book should know you!');
	end;
	if ageOK=false then
	writeln('Did you do time travelling?!? Or did you see Karim Khan Zand?!? ');
	{do another things}
end.

پس ما به‌جای قرار دادن یک دستور، چند دستور را در قالب یک «تکه‌برنامه» قرار دادیم. توجه داشته باشید که طریقه‌ی نوشتن تکه‌برنامه‌ها به صورت خطی است یعنی هر begin با اولین end; پایان می‌یابد و تکه‌برنامه‌ها یکدیگر را قطع نمی‌کنند (یعنی نمی‌شود یک تکه‌برنامه (پسر) داخل یک تکه‌برنامه‌ی دیگر (پدر) آغاز شود ولی پدر قبل از پسر به اتمام برسد {احترامی چیزی گفتن!})

البته این برنامه، برنامه‌ی بزرگی شد چون هنوز مبحث بعدی را نیاموخته‌ایم!

انجام کاری در صورت درست نبودن شرط

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

برای انجام کاری در صورت درست نبودن شرط باید از کلیدواژه‌ی else استفاده کرد. ساختار کلی if – else به شکل زیر است:

if {if statement} then
begin
	{do something}
end;
else
begin
	{do something}
end;

پس حالا برنامه‌ای که نوشتیم به شکل زیر در می‌آید:

var
	age: integer;
	ageOK: boolean;
begin
	writeln('plz enter you age:');
	readln(age);
	ageOK:= false;
	if a>0 then
	begin
		if a<200 then
		begin
			ageOK:= true;
		end;
		else
			writeln('The Guinness Book should know you!');
	end;
	else
		writeln('Did you do time travelling?!? Or did you see Karim Khan Zand?!?');
	{do another things}
end.

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

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

var
	menu: integer;
begin
	writeln('Hi, Welcome to my beautiful user friendly application designed for 2013 uesrs!');
	writeln('Please chose one the items below:');
	writeln('- Press 1 for Do job 1');
	writeln('- Press 2 for Do job 1');
	writeln('- Press 3 for Do job 1');
	writeln('- Press 4 for Do job 1');
	writeln('- or Press anything else to close this beautiful application');
	writeln('I"m waiting …');
	readln(menu)
	if menu=1 then
	begin
		{Do Job 1}
	end;
	if menu=2 then
	begin
		{Do Job 2}
	end;
	if menu=3 then
	begin
		{Do Job 3}
	end;
	if menu=4 then
	begin
		{Do Job 4}
	end;
	writeln('I"m Happy you used my beautiful user friendly application!');
	writeln('Have a good time');
	writeln('Good Bye!');
	readln();
end.

خوب فکر نمی‌کنم نیازی به توضیح داشته‌باشید {اگر در مورد نوشته‌های انگلیسی نیاز به توضیح دارید در دیدگاه بیان کنید!} پس بهتر است تا دیر نشده به سراغ مبحث بعدی برویم {الان ساعت ۲:۱۳ بامداد!}

کدهای چرخشی

در مواقعی شما نیاز دارید تا کاری را چندبار انجام دهید. مثلا بخواهید نمره‌ی ۲۰ نفر را از کاربر بگیرید و میانگین آن‌ها را برای آن‌ها چاپ کنید {این مثال واقعا تکراری بود! فکر کنم هر کتاب آموزشی را که باز کنید این مثال را بتوانید تویش پیدا کنید!} یا کارهای جالب‌تر مثلا چاپ یک مثلث متساوی‌الساقین ستاره‌ای به ساق ۲۰ خط {از این کارها هم انجام می‌دهیم! کمی صبر کنید} مطمئنا استفاده از کپی و پیست {مثلا ۲۰ تا readln بنویسیم!} ، روش جالبی برای گرفتن ورودی (نمرات) یا چاپ خروجی (یک مثلث نسبتا بزرگ!) نخواهد بود.

 این‌جاست که چرخش‌ها یا Loopها به کمک شما می‌آیند.

for

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

چون در دستور for ما نیاز به یک متغیر به عنوان شمارنده داریم، فرض می‌کنیم که متغیر i در ابتدای برنامه تعریف شده است. پس ساختار for به شکل زیر خواهد بود:

for i:=0 to 100 do
	{do something}

یا اگر بخواهیم پاسکال را دور بزنیم به شکل زیر در خواهد آمد:

for i:=0 to 100 do
begin
	{do something}
end;

ساختار چینش درختی برنامه

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

البته زیاد لازم نیست زحمت بکشید. فقط محیط ویرایشگر پاسکال بلد نیست خودش کدها رو مرتب کنه. چند وقت دیگه که وارد سی‌پلاس‌پلاس و سی‌شارپ شدیم دیگه در این مورد مشکلی نخواهیم داشت چون هزار ماشاالله همه‌ی محیط‌های جدید در جهت راحتی و تنبلی برنامه‌نویس‌ها کار می‌کنند و کم مونده ازشون درخواست کنیم که کد رو برامون بنویسند! البته الانش هم همین کامپایلرها یه‌جورایی دارن برامون کدها رو می‌نویسن. {داستان اسمبلی رو که یادتون نرفته؟!؟}


خوب بهتره بحث for رو ادامه بدیم.

به رسم اکثر آموزش‌ها اول برنامه‌ی میانگین رو به عنوان مثال در این‌جا قرار می‌دیم:

var
	now: integer;
	avg: real;
	i: integer;
begin
	readln(now);
	avg:=now;
	for i:=1 to 19 do
	begin
		readln(now);
	end;
	avg:=avg/20;
	writeln(avg);
end.

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

حالا می‌خواهیم مثلثی مثل مثلث زیر چاپ کنیم

*
**
***
****
*****
******

برای این‌کار لازم است از یک for تو در تو استفاده کنیم. به این معنی که درون یک for، یک for دیگر قرار دهیم.

برای جالب‌تر شدن نیز تعداد خطوط را به کاربر می‌سپاریم {در هنگام نگارش این سطور یعنی ساعت ۲:۵۱ بامداد نویسنده کمی خوابش میاید. اگر برنامه کم‌نمک یا پرنمک بود ببخشید!}

var
	i,j,n: integer;
begin
	writeln('Welcome to my wonderful mathematical application.');
	writeln('You are here and want me to draw a triangle for you!');
	writeln('So I"m waiting for you to give me length of it"s leg …');
	readln(n);
	for i:=1 to n do
	begin
		for j:=1 to I do
			write('*');
		writeln();
	end;
	writeln('I finished drawing. Don"t forget to pay me otherwise I will not draw any other things for you! :X');
	writeln('Honestly there are a lot of consumers waiting for me to draw things for them!');
end.

و خوب فکر می‌کنم برنامه نیاز به توضیح ندارد. فقط این‌که for  پدر در برنامه‌ی ما نقش اشاره‌گر خط را بازی می‌کرد و با هر حرکت آن یک خط رسم می‌شد و به همین دلیل نیز در انتهای دستورات آن writeln() مشاهده می‌شود (برای این‌که در خروجی به خط بعدی برویم!). {ساعت ۳ بامداد است. ادامه‌اش برای فردا!}

تا نشده‌ست آن تمام

{صبح بخیر!} بعد از for پرکاربرد ترین دستور چرخشی while است. مفهوم کلی آن این است که تا وقتی که یک شرط صحیح است کاری را انجام بده. مثلا منوی کاربرپسند (User Friendly!) که با if نوشتیم اگر تنها یک بار اجرا شود کاربردی ندارد (برای هر ابزار برنامه باید دوباره اجرا شود. مثل این‌که کاربر برنامه‌های جداگانه‌ی مختلف را اجرا کند) ولی اگر کاربر بتواند ابزارهای مختلف را استفاده کند و هروقت که خواست خارج شود مثلا ۰ را بزند، برنامه‌ی ما کاربرپسندتر می‌شود!

 پس برنامه‌ی کاربرپسندمان را این‌طور ویرایش می‌کنیم:

var
	menu: integer;
	mCheck: integer;
begin
	writeln('Hi, Welcome to my beautiful user friendly application designed for 2013 uesrs!');
	mCheck:= true;
	while mCheck do
	begin
		writeln('Please chose one the items below:');
		writeln('- Press 1 for Do job 1');
		writeln('- Press 2 for Do job 1');
		writeln('- Press 3 for Do job 1');
		writeln('- Press 4 for Do job 1');
		writeln('- or Press anything else to close this beautiful application');
		writeln('I"m waiting …');
		readln(menu)
		if menu=1 then
		begin
			{Do Job 1}
			continue;
		end;
		if menu=2 then
		begin
			{Do Job 2}
			continue;
		end;
		if menu=3 then
		begin
			{Do Job 3}
			continue;
		end;
		if menu=4 then
		begin
			{Do Job 4}
			continue;
		end;
		mCheck:= false;
	end;
	writeln('I"m Happy you used my beautiful user friendly application!');
	writeln('Have a good time');
	writeln('Good Bye!');
	readln();
end.

continue و break، دو دستور کاربردی برای کنترل چرخش‌ها

گاهی اوقات لازم است که ما اجرای دستورات چرخش را متوقف کنیم و به چرخش ادامه دهیم و یا کلا از چرخش بیرون بیاییم. مثلا در برنامه‌ی بالا لازم است که پس از این‌که کاری که کاربر تعیین کرده‌است را انجام دادیم، دیگر به کارمان ادامه ندهیم (وگرنه mCheck برابر false می‌شود و حلقه ادامه نمی‌یابد!) برای همین از دستور continue استفاده‌ کردیم.

اما در برنامه‌ی بالا می‌توانستیم به‌جای تعریف یک متغیر اضافی از دستور break استفاده کنیم که نتیجه‌ی نهایی می‌شود برنامه‌ی پایین:

var
	menu: integer;
begin
	writeln('Hi, Welcome to my beautiful user friendly application designed for 2013 uesrs!');
	while true do
	begin
		writeln('Please chose one the items below:');
		writeln('- Press 1 for Do job 1');
		writeln('- Press 2 for Do job 1');
		writeln('- Press 3 for Do job 1');
		writeln('- Press 4 for Do job 1');
		writeln('- or Press anything else to close this beautiful application');
		writeln('I"m waiting …');
		readln(menu)
		if menu=1 then
		begin
			{Do Job 1}
			continue;
		end;
		if menu=2 then
		begin
			{Do Job 2}
			continue;
		end;
		if menu=3 then
		begin
			{Do Job 3}
			continue;
		end;
		if menu=4 then
		begin
			{Do Job 4}
			continue;
		end;
		break;
	end;
	writeln('I"m Happy you used my beautiful user friendly application!');
	writeln('Have a good time');
	writeln('Good Bye!');
	readln();
end.

اعمال منطقی پاسکال

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

اما خیلی وقت‌ها لازم است که در یک شرط چند گزاره‌ی منطقی را باهم چک کنیم. مثلا در مثالی که برای if آوردیم، خیلی بهتر می‌شد اگر آن شرط تو در تو را در یک شرط بزرگ‌تر جمع آوری کنیم. اما مانند دنیای منطق، این‌جا هم چند عمل‌گر منطقی برای گزاره‌ها وجود دارد که آن‌ها را بررسی می‌کنیم:

and

اگر لازم باشد که هر دو (یا چند) شرط در یک زمان برقرار باشند باید از and استفاده کرد. مثلا برنامه‌ی مثال را می‌توان به شکل زیر نوشت:

var
	age: integer;
	ageOK: boolean;
begin
	writeln('plz enter you age:');
	readln(age);
	ageOK:= false;
	if (a>0) and (a<200) then
		ageOK:= true;
	{do another things}
end.

توجه دقت کنید که حتما از پرانتز () برای جداکردن گزاره‌ها استفاده کنید.

or

گاهی اوقات درست بودن یکی از شروط کافی است. مثلا می‌خواهیم نمرات دانش‌آموز را از طریق ایمیل برای پدر یا مادر او ارسال کنیم {فرستادن ایمیل در پاسکال؟!؟ عمرا!} و ما لیستی داریم که شامل ایمیل دانش‌آموز، ایمیل پدر و ایمیل مادر اوست. پس لازم است که فردی که ایمیل براش ارسال می‌شود پدر یا مادر دانش‌آموز باشد. در این حالت شرط ما به شکل زیر خواهد آمد (فرض می‌کنیم متغیر type مقادیر s (دانش آموز)، f (پدر) و m (مادر) را داشته باشد)

if (type='f') or (type='m') then
	{send mail!}

یا می‌توان از یک راه بهتر استفاده کرد و آن این است که چک کنیم که فرد دانش‌آموز نباشد. پس if ما به شکل زیر خواهد آمد:

if type<>'s' then
	{send email!}

not

اگر بخواهیم برعکس یک گزاره‌ی شرطی را چک کنیم، باید از عملگر not استفاده کنیم. مثلا در مثال بالا «اگر فرد دانش‌آموز نبود» را به شکل زیر هم می‌توان نوشت

if not (type='s') then
	{send email!}

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

عمل‌گرهای مقایسه‌ای

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

  • تساوی: اگر بخواهیم تساوی بین دو متغیر (یا یک متغیر و یک چیز ثابت) را چک کنیم از علامت = استفاده می‌کنیم.
  • کوچکتر، بزرگتر: برای بررسی کوچکتری و بزرگ‌تری مانند ریاضیات شیرین دوره‌ی ابتدایی {از ابتدایی شروع و تا کنون ادامه دارد!} از < و > استفاده می‌کنیم و اگر بخواهیم بزرگتر مساوی یا کوچکتر مساوی را چک کنیم از <= یا >= استفاده می‌کنیم.
  • نامساوی: برای این چک کنیم که دو عبارت مساوی نباشند باید از <> استفاده کنیم.

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

تمرین‌ها

با تشکر از این‌که تمارین بخش قبلی را حل کردید برای این بخش هم تعدادی تمرین در نظر گرفته‌ایم. اگر احیانا کسی زحمت کشید و هر کدام از تمارین را حل کرد ما هم کمی انگیزه پیدا می‌کنیم و جواب تمرین‌ها را در نوشته‌ای منتشر می‌کنیم {به قول استاد خوب حسابان‌مان :نمی‌خواهید یاد بگیرید اصلا چرا میاد نوشته رو می‌خونید. برید به مامانتون بگید من نمی‌خوام یاد بگیرم برید سیگار فروش شید چرا هی وقت‌تون رو با خوندن این چرت‌وپرت‌ها تلف می‌کنید؟ :دی}

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

پی‌نوشت: اگر مشکلی دارید می‌توانید در دیدگاهی مشکل خود را بیان کنید و یا اگر بخشی از این آمورش نادرست است لطفا اطلاع دهید {متشکرم!}

یک نکته‌ی مهم {سوال انحرافی}: در مثال‌های بالا (در کدهای بالا) اشتباه در دو مثال تکرار شده (راهنمایی یک کلید‌واژه اشتباها به‌عنوان متغیر استفاده شده) آیا می‌توانید آن را بیابید؟

Ubuntu for Phone بر روی Galaxy Nexus

محصول جدید کانونیکال: Ubuntu for Phones

دیشب (13 دی، ساعت 21:30 به وقت ایران) شرکت کنونیکال رسماً از Ubuntu for Phones پرده برداری کرد. این نسخه از سیستم عامل اوبونتو برای اسمارت‏ فون‏ ها بهینه سازی شده است. البته هیچ گوشی مجهز به این سیستم عامل تا کنون تولید نشده و در مراسم معرفی نیز از Galaxy Nexus استفاده شد.

Ubuntu for Phone
Ubuntu for Phone

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

قابلیت جالب و کاربردی دیگر این سیستم عامل این است که هنگامی که به آن نمایشگر، موس و کیبرد وصل کنید، مانند یک PC اوبونتویی کامل کار می کند؛ یعنی می توانید از رابط کاربری و برنامه های دسکتاپ استفاده کنید. این قابلیت مشابه Ubuntu for Android است که پیشتر معرفی شده بود.

بدیهی است که مهم ترین عامل موفقیت یا شکست یک سیستم عامل گوشی هوشمند، اکوسیستم آن و اپ های موجود برای آن است. در این زمینه، امکان تبدیل برنامه های وب به برنامه های دسکتاپ (با امکان دسترسی به منابع سیستمی، مانند فایل ها و غیره) فراهم شده است. علاوه بر آن، امکان Port کردن آسان برنامه های اوبونتو برای اسمارت فون نیز فراهم شده است. با در نظر گرفتن برنامه های موجود در Software Center و پشتیبانی Valve  (یکی از بزرگترین ناشران بازی) که در حال افزوده شدن به اوبونتو است، می توان امیدوار بود که در این زمینه نیز کمبودی نباشد. با این وجود، باید منتظر ماند و دید که آیا این اکوسیستم به اندازه کافی رشد می کند یا خیر.

کمینه سخت افزار مورد نیاز برای اجرای اوبونتوی اسمارت فون شامل پردازنده یک گیگاهرتز، 512 مگابایت رم و 4 گیگابایت حافظه داخلی است. البته با این امکانات، قابلیت استفاده به عنوان PC وجود ندارد. سخت افزار پیشنهادی برای “سوپرفون” نیز شامل پردازنده 4 هسته ای ARM یا پردازنده اتم اینتل، 1 گیگابایت رم و 32 گیگابایت حافظه داخلی است. با توجه به امکانات سخت افزاری پیشنهادی، احتمالاً قیمت گوشی های اوبونتویی از 200$ یا 250$ دلار به بالا خواهد بود.

همان طور که گفته شد، در حال حاضر هیچ اسمارت فونی با این سیستم عامل عرضه نشده، ولی کنونیکال وعده داده که اسمارت فون های اوبونتویی تا سال 2014 در بازار خواهند بود.

Ubuntu for Phone بر روی Galaxy Nexus
Ubuntu for Phone بر روی Galaxy Nexus

یک مسئله مهم این است که با وجود iOS و اندروید چه نیازی به یک سیستم عامل تازه است؟ پاسخی که به نظر من می رسد، این است که ارزش این سیستم عامل به این است که اولویت کنونیکال تصرف بازار نباشد. البته بدیهی است که یک شرکت تجاری تمایل به فروش و سود بیشتر دارد، ولی چیزی که اوبونتو را متمایز می کند، این است که تا حدّ امکان باز و آزاد است. البته از طرف برخی از بنیان گذاران و سردمداران Open Source و نرم افزار آزاد، مانند GNU، در این زمینه به اوبونتو انتقاد جدّی وارد است، به حدّی که GNU اوبونتو را به عنوان سیستم عامل باز به رسمیت نمی شناسد. نمونه ای از این انتقادها، گزینه نصب کدک MP3 است که در هنگام نصب اوبونتو دیده می شود. همان گونه که احتمالاً می دانید، MP3 کد بسته است و به همین دلیل، بسیاری از نرم افزارهای آزاد به شکل پیشفرض از آن پشتیبانی نمی کنند.

البته از آنجا که هدف اوبونتو بیشتر “سیستم عاملی برای انسان ها” است، این انتقاد بر آن وارد نیست؛ چرا که یک سیستم عامل برای انسان ها، باید بازی ها و نرم افزارهای پرطرفداری که به شکل بسته منتشر می شوند، را نیز داشته باشد. با این وجود، اوبونتو (دستکم تا کنون) تا حدّ امکان به آرمان هایش وفادار مانده و هنوز تا جایی که امکانش باشد، از نرم افزار Open Source استفاده می کند. به همین دلیل، با ورود این سیستم عامل به دنیای موبایل، عنوان “آزادترین سیستم عامل موبایل” بدون شک به آن تعلّق می گیرد.

علاوه بر آن، این سیستم عامل پس از ویندوز 8 و RT مایکروسافت، نخستین سیستم عاملی است که از Desktop به موبایل می رود و به همین دلیل، بیشتر قابلیت ها و کاربردهای PC را دارد.

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

اطلاعات بیشتر درباره ی Ubuntu for Phone را می توانید در سایت آن به نشانی ubuntu.com/devices/phone بیابید.

نظر شما درباره عضو جدید خانواده اوبونتو چیست؟ آیا می تواند موفق شود؟

 

ولی بالاخره این دنیا تمام می‌شود!

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

اما این تقصیر مایا ها یا نوستراداموس نیست. تقصیر زودباوری ماست. بسیاری از ما دوست داریم که هر خبری را بپذیریم و باور کنیم، حتا اگر یک دروغ بسیار بزرگ باشد.

EndOfTheWorld (2)

خب، دنیا که در ۲۱ دسامبر تمام نشد،‌ بیایید ببینیم دیگر چه روز‌هایی قرار است دنیا تمام شود!

سال ۲۰۱۳: سال ۲۰۱۲ که تازه شروع کار بود! اصل کاری در ۲۰۱۳ است!!

سال ۲۰۴۰: مدتی پیش، یک خرده سیاره کشف شد که گویا گذرش از دور و بر ما می‌گذشت… خیلی سریع پخش شد که «این یکی دیگر پایان دنیاست. اصلاً این بار ناسا خودش این خرده سیاره را کشف کرده!»؛ به خصوص وقتی در ۲۱ دسامبر دنیا تمام نشد، و با توجه به این‌که اگر مردم تاریخ پایان دنیا نداشته باشند روزشان شب نمی‌شود، شایعات قوت گرفت. البته طبق معمول دانش می‌گوید که ما در امان هستیم…

سال ۲۰۶۰: مردم نشسته‌اند و از دست‌نوشته‌های نیوتون به این نتیجه رسیده‌اند که «نیوتون گفته است دنیا سال ۲۰۶۰ تمام می‌شود. نیوتون که خودش دانشمند است،‌ دروغ نمی‌گوید که!». برای اطلاعات بیشتر کافیست عبارت end of the world newton 2060 را جست‌و‌جو کنید. 

همین‌طور بیایید جلو… تا سال ۵۰۰۰۰۰۰۰۰۰ :  می‌گویند سوخت خورشید در آن سال‌ها تمام می‌شود و قیامتی برپا می‌شود که نگو و نپرس. البته این نظریه، علمی و درست است، ولی به نظر من کار به آن جا ها نمی‌کشد! تا آن موقع ما آدم‌ها خودمان را نابود کرده‌ایم یا شاید نابود شده‌ایم، که در این صورت تکلیف مشخص است، یا این‌که کلاً بی‌خیال این کره‌ی دوست داشتنی شده‌ایم و در جای دیگری سکونت گزیده‌ایم…

EndOfTheWorld (1)

و البته سال 1040 : در این تاریخ ظاهرا دیگر عمر دنیا واقعاً تمام می‌شود. یعنی دیگر عمر پروتون‌ها و نوترون‌های دنیا تمام می‌شود و دیگر به نظر نمی‌رسد کسی بتواند زنده بماند!

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

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

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

فرهنگ!

امروز در مترو با یکی از دوستان در مورد فروش eBook در ایران بحث می‏ کردم. دوست مورد نظر علاوه بر این که کتاب خوان حرفه ای هست، یک eBook Reader هم دارد. به همین دلیل، گزینه مناسبی برای تبادل نظر در این باره بود.

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

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

در این لحظه آن دوست از من پرسید: «تو می خوای به این مردم یاد بدی eBook بخرند؟»

من:  :|

پی نوشت: میلاد امام موسی کاظم (ع) و شب یلدا مبارک!

به سان قایقی در طوفان سهمگین!

مثل آنان چون قایقی است که باد آنان را به هر سو می‌کشد.

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

ای کسانی که هدایت یافته‌اید، افساری برای رام‌کردن این اسب سرکش، بادبانی برای غلبه بر طوفان و (یا هر کوفت دیگر) نشانم دهید بل‌که من نیز به هدایتی دست یابم و از گمراهان نباشم!

پی‌نوشت

یاد این دیالوگ توی بتمن بگینز افتادم:
-مذهبي متعصب كسيه كه در تلاش برای خوشنودي خودش راهشو گم كرده.
اونو ميشه از بين برد يا زندانيش كرد.
ولي اگه تو خودتو چيزي بيشتر از يه انسان شكل بدي
اگه خودتو وقف يه عقيده كني
و اگه نتونند جلوتو بگيرند
اونوقت كاملا يه چيز ديگه ميشي
-اون چي هست؟
-افسانه, آقاي وين

چگونه مشکل خطای «پوشه‌ی مقصد وجود ندارد» یا «پوشه‌ی مقصد قابل نوشتن نیست» را حل کنیم؟

 هنگامی که دو برنامه‌نویس را به نسخه‌ی ۳.۵ وردپرس فارسی (که به‌نظر می‌آید در اصل ۳.۶ آلفا باشد یا اشتباها ۳.۶ آلفا ترجمه شده‌است!) به‌روزرسانی کردیم با مشکل خاصی مواجه شدیم: هنگام به‌روزرسانی افزونه‌ها وردپرس خطا‌یی می‌داد با این پیام که «پوشه‌ی مقصد قابل نوشتن نیست» درصورتی که وردپرس به پوشه‌ی wp-content دست‌رسی کامل داشت.

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

برای حل مشکل ابتدا مطمئن شوید که دست‌رسی پوشه‌ی wp-content در لینوکس ۷۷۷ است و در ویندوز سرور گروه‌های IUSR و IIS_IUSRS به این پوشه دست‌رسی کامل (full access) دارند و در سرویس‌های میزبانی ویندوز نیز همه‌ی گروه‌ها دست‌رسی کامل به این پوشه دارند.

سپس فایل wp-config.phpتان را باز کنید و خط 

if ( !defined('ABSPATH') )

define('ABSPATH', dirname(__FILE__) . '/');

را بیابید و پس از آن 

define('WP_TEMP_DIR', ABSPATH . 'wp-content/');

را اضافه کنید.

تمام شد! حالا یک وردپرس آماده دارید که همه‌ چیزش راحت به‌روزرسانی می‌شود.

پی‌نوشت: ما عادت داشتیم همه‌ی افزونه‌های‌مان رو در لحظه به‌روزرسانی کنید. باورتان نمی‌شود این چند روزی که ۱۰ – ۱۲ تا افزونه به‌روزرسانی نمی‌شدند چه جنگ اعصابی داشتیم!

البته همه‌ این‌ها توطئه‌ی آمریکاست تا دانش‌آموزان مملکت حواس‌شان پرت به‌روزرسانی وردپرس شود و درست درس نخوانند و بی‌خیال از این‌که پس فردایش آزمون جامع دارند دل‌شان به به‌روزرسانی وردپرس‌شان خوش شود و …  :-D

برنامه‌های ویندوز ۸ (۲): یک جعبه‌ی ابزار کامل!

این هفته قصد دارم یک جعبه ابزار با امکانات بسیار مفید را به شما معرفی کنم: Toolbox for Windows 8

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

منظورم این است که این زیر-اپلیکیشن‌ها می‌توانند با الگوهای تازه‌ای، چیزی بیشتر از حالت‌های محدود در محیط مدرن، در کنار هم قرار گیرند:

1

با «تول‌باکس» شما می‌توانید تا ۶ ابزار را در کنار یکدیگر قرار داده و از آن‌ها استفاده کنید. چند حالت‌ پیش‌فرض هم برای کار‌های مختلف برای شما پیش‌بینی شده است:

2

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

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

Screenshot (54)

نکته‌ی جالب در مورد این نرم‌افزار این است که این زیر-اپلیکیشن‌ها می‌توانند به برنامه اضافه شوند! کافیست روی آیکون Tool depot کلیک/تپ کنید.

Screenshot (56)

برای نمونه، در لحظه‌ی نگارش این نوشته، می‌توانید Stopwatch را هم به ابزار‌های تول‌باکس اضافه کنید؛ همچنین وعده داده شده است که Twitter reader و Notepad هم به زودی به ابزار‌های تول‌باکس افزوده شوند.

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

Screenshot (57)

این برنامه رایگان است و از اپلیکیشن «ویندوز استور» در ویندوز ۸ قابل دریافت است. اگر در دسترسی به ویندوز استور با مشکل مواجه شده‌اید، این نوشته و نیز این نوشته را بخوانید!

دیدن چند اسکرین‌شات از این برنامه هم خالی از لطف نیست:

Screenshot (50)

Screenshot (53)

Screenshot (52)

Screenshot (51)

آموزش برنامه‌نویسی – بخش نخست : مفاهیم کلی‌ برنامه‌نویسی


سری جدیدی از آموزش‌های برنامه‌نویسی آغاز شده است. این سری منقضی شده است. پیشنهاد می‌کنیم این سری را ادامه ندهید!


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

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

 برای کامپایل کدهای پاسکال نیاز به کامپایلر و محیط برنامه‌نویسی FreePascal دارید. پس از دانلود آن کافی است آن را اجرا کنید و کدهای‌ خود را در محیط آبی‌رنگ برنامه‌ بنویسید. (محیط‌های نرم‌افزاری که برای کدنویسی به کار می‌روند SDK یا Software Development Kit نامیده می‌شوند.)

برنامه (یا همان کد)

به تمام نوشته‌هایی که معمولا در SDK می‌نویسید و بعدا کامپایل خواهند شد برنامه یا کد می‌گویند. در پاسکال روال اصلی برنامه پس از دستور Begin شروع می‌شود و در End. پایان می‌یابد. پس می‌توان گفت ساده‌ترین برنامه در پاسکال به شکل زیر است:

 

هر دستور در پاسکال با یک ; (نقطه‌ویرگول انگلیسی) پایان می‌یابد و نوشتن ; در انتهای دستور اجباری است در غیر این‌صورت کامپایلر هنگام کامپایل برنامه دچار مشکل خواهد شد!

چاپ یک نوشته‌ی ساده

راحت‌ترین کاری که می‌توانیم در برنامه‌نویسی انجام دهیم چاپ یک نوشته‌ی ساده است. برای چاپ نوشته می‌توانیم از دستور Write یا Writeln استفاده کنیم. تفاوت Write با Writeln این است که در دستور Writeln پس از نوشته‌شدن نوشته‌ی موردنظر اشاره‌گر متن یک خط به پایین نیز می‌رود به عبارت دیگر مثل این است که پس از نوشتن متن یک اینتر در ویرایشگر بزنیم (در اصل Writeln خلاصه‌شده‌ای از واژه‌ی WriteLine است). به عنوان مثال در برنامه‌ی

 

خروجی به شکل

 

خواهد بود ولی اگر به‌جای Write از Writeln استفاده می‌کردیم خروجی به شکل

 

ورودی‌های قابل‌قبول برای دستور Write یا Writeln

این دستور (از این به‌ بعد Write و Writeln را یک دستور در نظر می‌گیریم) می‌تواند سه‌نوع ورودی بپذیرد که در ادامه آن‌ها را توضیح می‌دهیم:

1.  متن ساده: اگر می‌خواهید متنی در خروجی چاپ کنید (مانند مثال بالا) باید متن خود را درون کوتیشن «’» قرار دهید تا متن موردنظر مستقیما در خروجی چاپ شود.

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

3.  متغیرها: در مورد متغیرها در آینده صحبت خواهیم‌کرد.

متغیرها

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

متغیرها خانه‌هایی از حافظه‌ی موقت شما (RAM یا Random Access Memory) هستند که برنامه‌ی شما می‌تواند اطلاعاتی را در آن‌ها ذخیره کند. در این‌جا لازم است کمی وارد بحث تئوری-تاریخی شویم.

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

 این کار دردسرهای فراوانی به همراه داشته مثلا خالی‌کردن حافظه‌ای که مورد نیاز نبوده برای افزایش فضای خالی و یا این که هر چیزی که در حافظه ذخیره می‌شده چند خانه از حافظه را اشغال می‌کرده و اطلاعات باید از کدام خانه‌ی حافظه شروع شوند و …

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

 نوع متغیر‌ها

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

متغیرها در پاسکال

مسلما برای استفاده از متغیرها در پاسکال باید ابتدا آن‌ها را تعریف کنیم. در پاسکال متغیرها در پاسکل باید قبل از شروع برنامه تعریف شوند. متغیرها پس از کلیدواژه Var تعریف می‌شوند. برای تعریف آن‌ها از ساختار زیر استفاده می‌کنیم:

 

که ابتدا نام متغیر و پس از : نوع آن را تعیین می‌کنیم (نقطه‌ویرگول فراموش نشود!)

کامپایلر پاسکال در محیط DOS اجرا می‌شود و بنابراین معماری آن ۱۶ بیتی است. در معماری ۱۶ بیتی هر متغیر عدد دو بایت (۱۶ بیت) فضا اشغال می‌کند

 نوع متغیر

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

  • عدد صحیح: برای ذخیره‌سازی اعداد صحیح می‌توانید از نوع integer استفاده کنید. کامپایلر پاسکال در محیط DOS اجرا می‌شود و بنابراین معماری آن ۱۶ بیتی است. در معماری ۱۶ بیتی هر متغیر عددی دو بایت (۱۶ بیت) فضا اشغال می‌کند بنابر این حداکثر مقدار برای آن در صورتی که فقط از اعداد طبیعی استفاده کنیم ۶۵۵۳۶ است (۰ جزو اعداد طبیعی نیست) بنابراین نوع integet می‌تواند بازه‌ی -۳۲۷۶۸ تا ۳۲۷۶۸ را شامل شود. (۱۵ بیت برای عدد و ۱ بیت برای علامت آن!)
  • عدد حقیقی: برای اعداد حقیقی از نوع real استفاده کنید. این متغیر بر اساس پلت‌فرمی که با آن برنامه‌ می‌نویسید ۴ یا ۸ بایت فضا اشغال می‌کند و می‌تواند بازه‌ی -۲.۹ ۱۰۳۹ تا ۱.۷ × ۱۰۳۸  را شامل شود.
  • رشته‌ی متنی: برای ذخیره‌سازی متن‌ها می‌توانید از نوع string بهره بگیرید. این نوع ۱۰ بایت فضا اشغال می‌کند.
  • مقدار بولین (Boolean) : برای ذخیره‌سازی مقدار درست (true) یا غلط (false) به‌کار می‌رود.
  • یک کارکتر: برای ذخیره‌سازی یک کارکتر مثل ‘a’ یا ‘2’ و یا کارکترهای ASCII دیگر استفاده می‌شود.

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

دریافت یک ورودی از کاربر

برای دریافت ورودی از کاربر نیاز است که ابتدا متغیری برای آن ورودی در نظر بگیریم. به عنوان مثال در برنامه‌ی زیر

 

  1. ابتدا متغیر a را از نوع عددی تعریف می‌کنیم
  2. سپس به کمک دستور readln از کاربر مقداری می‌گیریم و آن را در a می‌ریزیم(readln این کارها را برای‌مان انجام می‌دهد)
  3. به کمک دستور writeln مقدار گرفته‌شده را چاپ می‌کنیم.
  4. دستور readln() برای این به کار می‌رود تا پس از چاپ متغیر a از برنامه‌ خارج نشویم بلکه برنامه منتظر بماند تا ما کلید اینتر را فشار دهیم. به این منظور که نتیجه‌ی نهایی را ببینیم و کامروا از برنامه خارج شویم!

توجه در این برنامه درصورتی که کاربر مقداری غیر از مقدار عددی وارد کند برنامه خارج می‌شود!

تابع read و readln

این دو تابع که تفاوت‌شان این است که در read فقط اولین کارکتری که کاربر وارد می‌کند خوانده می‌شود ولی در readln تمام‌ کارکترهایی که وارد می‌شود تا قبل از زدن دکمه‌ی اینتر در متغیر ریخته می‌شود، برای گرفتن ورودی از کاربر به کار می‌روند و به صورت readln({varName}); به کار می‌روند. و همان‌طور که اشاره کردیم می‌توان readln را بدون متغیر نیز استفاده کرد و در این صورت ورودی‌های کاربر در جایی ذخیره نمی‌شوند.

تعیین مقدار برای متغیر

شما می‌توانید مقدار متغیرهای‌تان را به‌صورت دستی نیز تنظیم کنید. برای این‌کار از varName:=Value; استفاده می‌شود. مثال زیر را در نظر بگیرید:

 

  1. ابتدا متغیرهای a و b را تعریف کرده‌ایم (نکته‌: برای تعریف چند متغیر از نوع یکسان می‌توان نام‌های آن‌ها را با , ازهم جدا کرد و سپس نوع آن‌ها را نوشت (مثل بالا))
  2. سپس a را از کاربر گرفته‌ایم.
  3. b را برابر با a قرار داده‌ایم.
  4. سپس b را چاپ کرده‌ایم.
  5. با کمک عبارات ریاضی مقدار b را تغییر داده‌ایم و سپس آن را چاپ کرده‌ایم.
  6. در دستور writeln از عبارات ریاضی همراه با متغیرها استفاده کرده‌ایم و مقدار دیگری را چاپ کرده‌ایم.
  7. از readln() برای مشاهده‌ی نتیجه استفاده کرده‌ایم.

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

نوبت شما

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

  1. ب.ب.ک (برنامه‌ای بنویسید که) دو متغیر از نوع string ار کاربر گرفته و آن‌ها را باهم جمع کند و چاپ کند.
  2. ب.ب.ک میانگین حقیقی دو عدد صحیح را چاپ کند. (a,b:integer; avg:real;)
  3. ب.ب.ک نام کاربر و سن او را گرفته و آی‌دی به صورت نام‌+سن چاپ کند (name:string; age:integer;)

به اضافه شدن کارکتر نیم‌فاصله در نتایج جست‌وجوی گوگل کمک کنید!

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

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

پیشاپیش از همکاری‌تان متشکرم!