بایگانی ماهیانه: ژانویه 2013

مگه چقدر طول می‌کشه؟!؟

فکر کنم امروز که تموم شه ۱۰۹ روز از سال تحصیلی‌مون می‌گذره. یعنی نصف بیش‌تر ترم. تازه این سومه و سال بعد چهارمیم ولی به چهارم‌ها هم که نگاه‌ می‌کنم می‌بینم اونا حدود ۲۰۹ روز از سال تحصیلی‌شون گذشته.

مگه چقدر طول می‌کشه؟ تا به کنکور برسیم.

دانشگاه‌مون تموم شه.

سی‌ سال‌گی‌مون رو رد کنیم.

پنجاه سال‌مون بشه و به گذشته نگاه کنیم.

مگه چقدر طول می‌کشه که ببینیم ۸۰ – ۹۰ سال‌مونه و داریم نفس‌های آخر رو می‌کشیم؟

مگه این زندگی چقدر طول می‌کشه؟!؟

یک لحظه؟ دو لحظه؟

مگه تا الان‌ش وقتی به عقب نگاه می‌کنیم انگار برامون یک لحظه نمیاد؟

پس فوق فوقش زندگی‌مون می‌شه ۳ لحظه!

پی‌نوشت۱: زمان کش می‌آید و فشرده می‌شود!

پی‌نوشت۲: در حین نگارش این نوشته، نویسنده قرار بوده خیر سرش ادبیات بخواند!

پی‌نوشت۳: می‌گفت زمانی پیر شدن ما شروع می‌شود که افسوس‌های‌مان از آرزوهای‌مان بیش‌تر شود!

پی‌نوشت۴: نویسنده خیلی خوشحال است و بی‌خیال نوشتن نمی‌شود!

پی‌نوشت۵: آیا ری‌برندینگ لازم است؟!؟

پی‌نوشت۶: دو برنامه‌نویس چیست؟!؟

پی‌نوشت۷: آیا دو برنامه‌نویس در دسته‌بندی‌های معمول وب‌نوشت‌ها جای می‌گیرد؟!؟

پی‌نوشت۸: بیخیال پی‌نوشت‌های آخری شوید؛ به دل‌نوشته توجه کنید

پی‌نوشت۹: نویسنده می‌رود که درس بخواند، فعلا خدانگهدار!

پی‌نوشت۱۰: نویسنده به این همه چیز که نوشته نگاه می‌کند و افسوس می‌خورد که ۲۰۵ کلمه بیش‌تر نشده!

پشتیبان‌گیری و بازگردانی تنظیمات، دانلودها و درصد فایل دانلودشده توسط Internet Download Manager فقط با یک کلیک

اگر یادتان باشد حدود نه ماه پیش (۲۳ اردیبهشت ۹۱) ترفندی برای انتقال دانلودها و مقدار فایل‌های دانلودی نرم‌افزار IDM نوشته بودم که خوشبختانه با استقبال خوبی مواجه شد. جالب است بدانید که بر طبق آمار Google Analytics بعد از صفحه‌ی اصلی وب‌نوشت، این نوشته با ۱۹۲ بازدید در ماه گذشته پربازدیدترین نوشته‌ی دو برنامه‌نویس بوده (نمی‌دانم که این خوشحال‌کننده است یا ناراحت‌کننده!)

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

توجه داشته‌باشید که برای اجرای این نرم‌افزار نیاز به دات‌نت فریم‌ورک ۲ دارید (اگر ویندوزتون ۷ به بالاست مشکلی نیست ولی اگر XP دارید و تا الان نصب نکردید اون رو باید نصب کنید)

این برنامه از دو دکمه‌ی ساده تشکیل شده است که یکی (Backup Download and Registry Data) برای پشتیبان‌گیری و یکی (Restore Download and Registry Data) برای بازگردانی تنظیمات کلی IDM و صف‌های دانلود و فایل‌های موجود در آن‌ها بعلاوه‌ی مقدار فایل‌هایی که دانلود شده‌اند است.

فقط باید به این نکته توجه داشته‌باشید که برنامه باید حتما Run as administrator شود (روی آن راست‌کلیک کنید و Run as administrator را بزنید. در ویندوز XP از این آموزش استفاده کنید) چون برای پشتیبانی از رجیستری (مرحله‌ی سوم تا ششم آموزش قبلی) باید دست‌رسی مدیر به کامپیوتر داشته باشیم.

پس از پشتیبان‌گیری (پس از زدن دکمه‌ی Backup Download and Registry Data و پایان کار) توجه‌ داشته‌باشید که باید فایل idm.reg و پوشه‌ی IDMBackup را در جای مطمئنی نگه‌داری کنید و برای بازگرداندن نیز idm.reg و پوشه‌ی IDMBackup نیز باید در کنار فایل اجرایی برنامه باشد (یعنی در همان پوشه‌ای که برنامه در آن قرار دارد).

دانلود این برنامه با حجم ۳۵ کیلوبایت

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

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

افزایش سرعت وردپرس با بهره‌گیری از 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 : در این تاریخ ظاهرا دیگر عمر دنیا واقعاً تمام می‌شود. یعنی دیگر عمر پروتون‌ها و نوترون‌های دنیا تمام می‌شود و دیگر به نظر نمی‌رسد کسی بتواند زنده بماند!

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

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

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