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

مباحث آی‌تی ما!

GTranslate به‌روزرسانی شد!

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

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

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

پی‌نوشت۲: نوشته کوتاه بود. در واقع چیز بیش‌تری برای گفتن نداشتم!

دیگر در گوگل مشکل نیم‌فاصله نداریم!

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

پس از انتشار افزونه نگاهی برای بازنویسی نوشته‌ی قبلی (به توصیه‌ی مهدی) به site:2barnamenevis.com در گوگل انداختم و در کمال تعجب دیدم که نام دو برنامه‌نویس در تعداد زیادی از نوشته‌ها با نیم‌فاصله نوشته می‌شه.

Capture10

 

Capture11

 

Capture12

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

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

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

موفق باشید و نمی‌دونید چقدر خوشحالم.

چون وردپرس با افزونه‌ی کمتر = سرعت بیش‌تر (حتی اگر آدم خودش افزونه رو نوشته باشه!)

رفع مشکل نمایش نیم‌فاصله در گوگل


این نوشته از اعتبار ساقط شده! (به این نوشته مراجعه کنید)

فقط در صورتی که هنوز کارکتر نیم‌فاصله‌ی شما در گوگل نمایش داده نمی‌شود از این افزونه استفاده کنید


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

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

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

برای این کار من یک افزونه برای وردپرس نوشتم که اگر user-agent بازدیدکننده‌ی سایت، user-agent خزنده‌ی گوگل بود، توی عنوان صفحه، دیدگاه‌ها، توضیحات دسته‌ها، اطلاعات سایت و اسم سایت اگر کارکتر نیم‌فاصله بود، به‌جای اون فاصله بزاره. اول آموزش نصب و استفاده از افزونه رو می‌گم و بعد بخش علمی ماجرا برای افرادی که دوست دارند بیش‌تر بدونن. برای استفاده از افزونه باید:

  1. فایل افزونه رو دانلود کنید (حجم: ۲ کیلوبایت)
  2. افزونه رو فعال کنید.
  3. اگر از افزونه‌ی کش استفاده می‌کنید باید توی تنظیمات اون user-agentهای گوگل رو جدا کنید. (لازم نیست همه‌ی user-agentها رو بنویسید. در ادامه توضیح می‌دیم!)

user-agentهای گوگل اون‌هایی هستند که این‌جا گفته و توی افزونه ما به همه‌ی اون‌ها حساسیم (یعنی اگر user-agent یکی از اون‌ها بود نیم‌فاصله می‌شه فاصله) ولی افزونه‌های کش معمولا یک واژه‌ی کلیدی می‌خوان و اگر اون user-agent اون واژه‌ی کلیدی رو شامل می‌شد دیگه سایت رو کش‌شده (به اون user-agent) نشون نمی‌دن. اگر از افزونه‌ی Hyper cache E استفاده می‌کنید توی صفحه‌ی تنظیمات افزونه Agents to reject رو پیدا کنید و توی اون کادر متنی روبه‌روش این مقادیر رو وارد کنید:

Googlebot
(compatible; Mediapartners-Google/2.1; +http://www.google.com/bot.html)
Mediapartners-Google
(+http://www.google.com/adsbot.html)

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


و حالا بحث علمی (که نمی‌شه دقیقا بهش گفت علمی!) user-agent: هر مرورگری یک‌سری از اطلاعات خودش رو به سایتی که ازش بازدید می‌کنه می‌ده تا اون سایت بتونه تشخیص بده که کاربر داره با چه مرورگری سایت رو نگاه می‌کنه. مثلا برای تشخیص این که بازدیدکننده داره از گوشی موبایل، تبلت یا کامپیوتر سایت رو نگاه می‌کنه از user-agent استفاده می‌شه. برای این‌که بفهمید که user-agentتون چیه می‌تونید به سایت whatsmyuseragent مراجعه کنید. مثلا user-agent فعلی من اینه:

 Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17 AlexaToolbar/alxg-3.1

و این user-agent نشون می‌ده که مثلا من از ویندوز ۶.۲ یا همون ویندوز ۸ استفاده می‌کنم و موتور ساخت صفحات وب من (توضیحات بیش‌تر رو در این‌جا بخونید) webkit هستش و یا

AlexaToolbar/alxg-3.1

می‌گه که من دارم از تولبار alexa استفاده می‌کنم. و خوب معلومه Chrome/24 یعنی مرورگر من گوگل کرومه. اصولا هر چیزی که توی وب هست یک user-agent داره. حالا ما توی این افزونه از user-agentهای خزنده‌های گوگل استفاده کردیم. در واقع user-agentها رو چک می‌کنیم و اگر خزنده‌ی گوگل بود، به‌جای متن نیم‌فاصله‌دار، متن فاصله‌دار به اون نشون می‌دیم. مثلا توی مرورگر کروم می‌تونید user-agent خودتون رو تغییر بدید و مثلا بکنیدش

Googlebot-Image(Googlebot)

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


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

پشتیبان‌گیری و بازگردانی تنظیمات، دانلودها و درصد فایل دانلودشده توسط 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 بیابید.

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

 

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

 هنگامی که دو برنامه‌نویس را به نسخه‌ی ۳.۵ وردپرس فارسی (که به‌نظر می‌آید در اصل ۳.۶ آلفا باشد یا اشتباها ۳.۶ آلفا ترجمه شده‌است!) به‌روزرسانی کردیم با مشکل خاصی مواجه شدیم: هنگام به‌روزرسانی افزونه‌ها وردپرس خطا‌یی می‌داد با این پیام که «پوشه‌ی مقصد قابل نوشتن نیست» درصورتی که وردپرس به پوشه‌ی 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;)