برنامه نویسی، ابزار دختران افغان برای غلبه بر مشکلات

افغانستان در حوزه دیجیتال و فناوری حرف زیادی برای گفتن ندارد، با این حال نخستین نسل از دختران برنامه نویس و طراح گیم این کشور با تکیه بر مهارت های خود تاکنون 20 بازی را روانه مارکت های دیجیتال کرده اند.

شهر «هرات» واقع در غرب افغانستان میزبان تیمی متشکل از 20 برنامه نویس و 90 دانش آموز است که در زمینه آموزش کدنویسی، توسعه اپلیکیشن و وبسایت و عیب یابی کدهای کامپیوتری فعالیت دارند.

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

این بازی دو بعدی که «با تریاک افغانی مبارزه کن» نام دارد، بر ماموریت سربازان افغانی برای نابود کردن مزارع تریاک، مبارزه با دلالان مواد مخدر و کمک به کشاورزان برای کاشت زعفران متمرکز است.

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

 

دوره های آموزشی این مرکز مختص دختران 15 تا 25 ساله ای است که به دلیل مشکلات مالی یا ممانعت خانواده از تحصیل در دانشگاه بازمانده اند. «حسیب رسا» مدیر پروژه Code to Inspire درباره مزایای آموزش کدنویسی به دختران می گوید:

برنامه نویسان امکان کار کردن از خانه را دارند. آنها در حال هموار کردن مسیر شغلی جدید برای خود و نسل بعد هستند.

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

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

منبع:
reuters


آموزش برنامه نویسی جاوا: برنامه نویسی شی گرا

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

شی گرایی یا Object Oriented چیست؟

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

OOP1

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

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

در دنیای واقعی هر شی (به زبان انگلیسی: Object) سه خصوصیات متمایز دارد:

  1. وضعیت، ویژگی‌ها یا متعلقات (State)
  2. رفتار (Behavior)
  3. هویت (Identity)

اجازه دهید که این سه ویژگی را با یک مثال توضیح دهم:

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

کلاس چیست؟

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

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

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

چگونه در جاوا یک کلاس بسازیم؟

ساختن کلاس در جاوا بسیار راحت است و ما به هر اندازه‌ای که بخواهیم می‌توانیم کلاس ایجاد کنیم. در برنامه‌هایی که ما در این سری آموزشی می‌نویسیم، هرکدام شامل شاید حداکثر 3 الی 4 کلاس باشد. اما در پروژه‌های صنعتی ممکن است روی سیستم‌هایی کار کنید که شامل صد‌ها و حتی هزار‌ها کلاس باشند.

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

به مثال زیر توجه کنید:

ابتدا محیط توسعه‌ی اکلیپس را اجرا و یک پروژه‌ی جاوایی ایجاد کنید، سپس بر روی پروژه کلیک راست کنید و از منوی New گزینه‌ی Class را انتخاب کنید. تصویر زیر:

class

بعد از طی کردن مراحل فوق، شما با یک پنجره همانند پنجره‌ی زیر مواجه می‌شود:

class

همانطور که در تصویر بالا با یک بیضی آبی رنگ مشخص شده است، نام کلاس خود را Main در نظر بگیرید و بعد در قسمت پایین پنجره که با یک مستطیل قرمز رنگ مشخص شده است، گزینه‌ی public static void main را تیک بزنید و بعد بر روی دکمه‌ی Finish کلیک کنید. (با تیک زدن گزینه‌ی مشخص شده، هنگام ساخته شدن کلاس، به صورت خودکار متد اصلی (main) کلاس که نقطه‌ی شروع هر برنامه‌ی جاوا است نوشته می‌شود). (بعد از ساخته شدن کلاس، توضیحات (Comment) اضافی را پاک کنید).

تا اینجای کار ما یک کلاس داریم و آن هم کلاس اصلی برنامه است. حالا می‌خواهیم یک کلاس دیگر ایجاد کنیم. پس بنابراین همانطور که توضیح داده شد اقدام به ساخت یک کلاس دیگر کنید. فقط نکته‌ای که باید رعایت کنید این است که این بار تیک گزینه‌ی public static void main را نزنید و نام کلاس را، GradeBook یعنی دفتر ثبت نمرات در نظر بگیرید.

oop

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

حالا می‌خواهیم یک متد را در کلاس GradeBook بنویسیم. بنابراین ابتدا یک توضیحات (Comment) برای متد خود می‌نویسیم. کد زیر:

public class GradeBook {
// display a welcome message to the GradeBook
}

حالا می‌خواهیم متدی با نام displayMessage ایجاد کنیم. کد زیر:

public class GradeBook {
// display a welcome message to the GradeBook
public void displayMessage() {
System.out.println("Welcome to the GradeBook!");
} // end method displayMessage
} // end class GradeBook
توضیحات در مورد متد فوق: سطح دسترسی متدی که ما در بالا تعریف کرده‌ایم، عمومی یا public است. (با سطوح دسترسی در جاوا در ادامه‌ی همین آموزش‌های شی گرایی آشنا می‌شوید). بعد از آن باید نوع برگشتی متد را مشخص کنیم. در اینجا نوع برگشتی متد ما void است یعنی متد ما هیج مقداری را بر نمی‌گرداند. بعد از آن هم نام متد را نوشته‌ایم و بعد هم آکولاد‌های باز و بسته قرار داده‌ایم تا بدنه‌ی متد مشخص شود. همانطور که مشاهده می‌کنید در بدنه‌ی متد کد خاصی نوشته نشده است. فقط با اجرای متد displayMessage پیغامی بر روی خروجی استاندارد چاپ می‌شود. همچنین دوباره با استفاده از کامنت‌ها، آخر متد و آخر کلاس را مشخص کرده‌ایم.

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

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

همانطور که می‌دانید ما در جاوا هنگامی که می‌خواهیم یک متغیر تعریف کنیم، به صورت زیر این کار را انجام می‌دهیم:

int number;

یعنی ابتدا نوع متغیری که می‌خواهیم ایجاد کنیم را می‌نویسیم و بعد یک نام برای آن در نظر می‌گیریم. برای ساختن آبجکت هم دقیقا باید به همین شکل رفتار کنیم. در حقیقت ما باز هم می‌خواهیم یک متغیر تعریف کنیم. اما این بار متغیر ما از جنس داده‌های اولیه (Primitive Data Type) ها نیست، از جنس کلاس است (کلاس GradeBook). بنابراین ابتدا نام کلاس را می‌نویسیم و بعد هم یک نام برای آن در نظر می‌گیریم (این عملیات باید داخل متد main نوشته شود). به صورت زیر:

public class Main {

public static void main(String[] args) {
// Object Creation
GradeBook book;
}
}

در کد بالا همانطور که مشاهده می‌کنید ما یک آبجکت تعریف کرده‌ایم، اما هنوز ایجاد نکرده‌ایم. در جاوا برای ایجاد و ساختن یک شی باید از کلمه‌ی کلیدی new استفاده کنیم. به کد تکمیل شده در زیر توجه کنید:

public class Main {

public static void main(String[] args) {
// Object Creation
GradeBook book = new GradeBook();
}
}

در کد بالا بعد از نام آبجکت (book) علامت مساوی (Assignment) قرار داده‌ایم. سپس اُپراتور new را نوشته (که با این کار یک شی ایجاد می‌شود) و بعد نام کلاس را دوباره می‌نویسیم و یک پرانتز باز و بسته در جلوی آن قرار می‌دهیم و در آخر هم علامت سمیکالن را می نویسیم.

تا اینجای کار ما یک آبجکت از روی کلاس GradeBook ساخته‌ایم. حالا می‌خواهیم با استفاده از آبجکتی که ایجاد کرده‌ایم، به متد موجود در کلاس GradeBook دسترسی پیدا کنیم. برای این کار ابتدا نام آبجکت را می‌نویسیم (book)، سپس یک نقطه (.) قرار می‌دهیم و بعد نام متد مورد نظر را که در اینجا displayMessage است را می‌نویسیم. کد زیر:

public class Main {

public static void main(String[] args) {
// Object Creation
GradeBook book = new GradeBook();
book.displayMessage();
}
}

حالا اگر برنامه را اجرا کنید در خروجی استاندارد متن !Welcome to the GradeBook را مشاهده می‌کنید.

بخش‌های حافظه

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

نکته: حافظه در برنامه‌های جاوا به دو بخش تقسیم می‌شود. حافظه‌ی Stack و حافظه‌ی Heap. هنگامی که با استفاده از اُپراتور new یک آبجکتی ایجاد می‌کنیم، این آبجکت ما در بخشی از حافظه به نام Heap ذخیره می‌شود. در حقیقت book یک آبجکت (شی) نیست!، بلکه یک ارجاعی است به شی ساخته شده در حافظه‌ی Heap. (درست است که همه می گویند با استفاده از آبجکت مثلا book به فیلد‌ها و متد‌های یک کلاس می‌توانیم دسترسی داشته باشیم، اما book آبجکت نیست. این طرز بیان فقط برای راحت تلفظ کردن است. اگر بخواهیم درست بیان کنیم باید بگوییم با استفاده از متغیر book که در حافظه‌ی Stack ایجاد شده است، می‌توانیم به به شی‌ای که در Heap ساخته شده است اشاره کنیم.). به تصویر زیر توجه کنید:

heap

در تصویر فوق در حافظه‌ی استک، ما یک متغیری داریم با نام parent که اشاره می‌کند به یک شی ساخته شده در حافظه‌ی هیپ. در کدی که ما نوشتیم متغیر book در حافظه‌ی استک (Stack) قرار می‌گیرد و ما با استفاده از این متغیر می‌توانیم به شی‌ای که در حافظه‌ی Heap ایجاد شده است، دسترسی پیدا کنیم.

نکته: متغیر‌های محلی هر متد روی استک قرار می‌گیرند، همانند book که یک متغیر محلی است، از جنس کلاس GradeBook که به شی‌ای در هیپ اشاره می‌کند.

Garbage Collector یا زباله روب

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

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

Garbage Collector یا زوباله روب بخشی از JVM است که وظیفه‌ی پاک کردن حافظه‌ی Heap را بر عهده دارد. وجود Garbage Collector در جاوا یک موهبت الهی برای برنامه نویسان جاوا است.

ducke

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

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

public class Main {

public static void show() {
int number = 20;
System.out.println(number);
}

public static void main(String[] args) {
System.out.println(number);
}
}

در کلاس بالا ما دو متد داریم. یکی متد main است و دیگری متد show. ما در متد show متغیری از جنس عدد صحیح با مقدار 20 تعریف کرده‌ایم و سپس آن را در خروجی استاندارد نمایش داده‌ایم. حالا در داخل متد main ما باز هم می‌خواهیم مقدار متغیر number را نمایش دهیم، اما با خطای کامپایل مواجه می‌شویم. زیرا وقتی متد show شروع می‌شود، برای متغیر number در Stack حافظه‌ای اختصاص داده می‌شود و وقتی هم که متد به پایان می‌رسد، به صورت خودکار حافظه‌ی اختصاص داده شده از روی استک پاک می‌شود. بنابراین ما نمی‌توانیم از متغیر number در متد main استفاده کنیم. این کار در زبان‌هایی مانند ++C که Garbage Collector ندارد، دقیقا به همین صورت اتفاق می‌افتد. بنابراین نتیجه‌ای که می‌گیریم این است که GC فقط حافظه‌ی Heap را پاک می‌کند.

تنظیم کردن اندازه‌ی حافظه‌های Heap و Stack

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

به جدول زیر توجه کنید:

معنی آرگومان
اندازه‌ی اولیه Heap Xms-
حداکثر اندازه‌ی Heap Xmx-
حداکثر اندازه‌ی Stack Xss-
نکته: با استفاده از آرگومان Xms- می‌توان اندازه‌ی اولیه‌ی حافظه‌ی Heap را مشخص کرد. همچنین توسط Xmx- می‌توان حداکثر اندازه‌ی حافظه‌ی هیپ را مشخص کرد و با Xss- هم حداکثر اندازه‌ی Stack.

مثال

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

Run Configurations

بعد از انتخاب گزینه‌ی مورد نظر وارد پنجره‌ی زیر می‌شوید:

Run

همانطور که در تصویر با یک فلش سبز رنگ مشخص شده است، تب Arguments را انتخاب کنید. سپس در قسمت VM Arguments یا همان آرگومان‌های ماشین مجازی، عبارت مشخص شده را بنویسید: Xmx-500m. در اینجا ما حداکثر اندازه‌ی حافظه‌ی Heap را برابر با 500 مگابایت در نظر گرفته‌ایم. بر روی دکمه‌ی Run کلیک کنید (البته چیزی اجرا نمی‌شود، زیرا هنوز برنامه‌ای ننوشته‌ایم).

حالا کلاس اصلی برنامه را باز کرده و کد زیر را در آن بنویسید:

public class Main {

public static void main(String[] args) {
int[] numArray = new int[100000000];
}
}

در اینجا ما یک آرایه‌ای با طول 100 میلیون ایجاد کرده‌ایم.

نکته: در اینجا می‌توانیم از یکی از قابلیت‌های جاوا 8 استفاده کنیم. همانطور که در ریاضیات ما اعداد را سه تا سه تا جدا می‌کنیم، در جاوا 8 هم با استفاده از Underscore (_) می‌توانیم اعداد را سه تا سه تا جدا کنیم. به صورت زیر:
public class Main {

public static void main(String[] args) {
int[] numArray = new int[100_000_000];
}
}

حالا برنامه را اجرا کنید. با اجرای این برنامه با ارور: OutOfMemoryError: Java heap space مواجه می‌شوید. اما راه حل چیست؟ ما قبل از اجرای برنامه، حداکثر اندازه‌ی حافظه‌ی Heap را مشخص کردیم. اما این حافظه برای اجرای چنین برنامه‌ای کافی نیست. بنابراین دوباره به پنجره‌ی Run Configurations مراجعه کرده و حداکثر اندازه‌ی حافظه را برابر با 1024m و یا یک گیگ قرار دهید و سپس برنامه را اجرا کنید. با افزایش حافظه دیگر برنامه‌ی ما کرش نمی‌کند.

حالا می‌خواهیم برنامه‌ای بنویسیم که حافظه‌ی Stack را پر کند و سر ریز شود. اصطلاحا StackOverflow گفته می‌شود و با خطای StackOverflowError مواجه می‌شویم. یکی از ساده‌ترین برنامه‌هایی که می‌توان نوشت تا استک سر ریز شود، استفاده از متد‌های بازگشتی (Recursive) است. به کد زیر توجه کنید:

public class Main {

public static void main(String[] args) {
System.out.println(function(1));
}

static int function(int i) {
if (i < 100000) {
return function(i + 1);
} else {
return 0;
}
}
}

ما هنوز به مبحث بازگشتی نرسیده‌ایم، اما کدی که در بالا نوشته‌ایم به این صورت است که داخل کلاس Main یک متدی با نام function تعریف کرده‌ایم که یک پارامتر به عنوان ورودی دریافت می‌کند. در داخل متد function ما یک عبارت شرطی‌ای قرار داده‌ایم که تا زمانی که مقدار متغیر i کوچکتر از 100000 است، بلاک if اجرا شود. که در داخل بلاک if دوباره خود متد function فراخوانی می‌شود که یک مقدار به به پارامترش اضافه می‌کند. در اینجا برنامه همانند یک حلقه اجرا می‌شود، تا زمانی که متغیر i کوچکتر از 100000 شود. بعد از آن بلاک else اجرا می‌شود. حالا اگر برنامه را با همین وضعیت فعلی اجرا کنید، برنامه کرش می‌کند. زیرا حافظه‌ی Stack پر می‌شود. اما می‌توانیم با استفاده از آرگومان Xss- اندازه‌ی حافظه‌ی Stack را افزایش دهیم. برای این کار دقیقا مانند قبل به پنجره‌ی Run Configurations بروید و این بار این را بنویسید: Xss5m- . حالا اگر برنامه را اجرا کنیم، دیگر خطایی دریافت نمی‌کنیم و مقدار صفر (0) در خروجی استاندارد چاپ می‌شود. علت درست اجرا شدن برنامه این است که برنامه حافظه‌ی کافی را در اختیار دارد، بنابراین بلاک دستور if کامل اجرا می‌شود و در آخر هم وقتی شرط حلقه نقض می‌شود، بلاک else اجرا می‌شود و مقدار صفر را بر می‌گرداند.

برای مشاهده‌ی کامل مطالب آموزش جاوا می‌توانید بر روی صفحه‌ی آموزش جاوا کلیک کنید.

لینکدین

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

منبع زومیت

برنامه نویسی و توسعهی وب و WordPress

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

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

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

Averta

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

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

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

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

مشاغل مورد نیاز:

برنامه نویس و توسعه‌دهنده وردپرس (ارسال رزومه)

تحلیل گر و بازاریاب الکترونیک (ارسال رزومه)

متقاضیان کارآموزی درخواست خود را به ایمیل زیر ارسال نمایند (در عنوان ایمیل  “کارآموزی” را ذکر شود )

jobs[AT]averta.net

پایان رپورتاژ آگهی/


وقتی زیبایی قربانی میشود؛ چرا پرچمداران دنیای موبایل اینقدر زشت

همین یک دهه قبل بود که موبایل ها از دستگاه های بزرگ، حجیم و زشت به گجت‌هایی شیک و زیبا تبدیل شده و پشت ویترین فروشگاه ها دلبری می کردند. حالا اما به نظر می رسد به جای پیشرفت با عقبگردی مواجهیم که به طراحی آیفون 11 پرو ، گلکسی اس 10 و حتی پیکسل 4 منجر شده است.

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

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

 

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

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

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

طراحی آیفون 11 پرو

 

همه اینها یک طرف و پنل پشتی یک طرف. تا زمانی که آیفون 11 پرو معرفی نشده بود بسیاری از کاربران امیدوار بودند که رندرهای لو رفته درست از آب درنیاید اما طراحی دوربین مثل کابوسی بود که به واقعیت پیوسته است.

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

 

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

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

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

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

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

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

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

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

گوگل پیکسل 4 کمی متقاعدکننده تر است اما عرضه آن در رنگ نارنجی نه چندان زیبا و با اسم «اوه چقدر نارنجی» نظر چه کسی را می خواهد جلب کند؟ این مدل پیکسل 4 بیشتر شبیه یک گوشی اسباب بازی به نظر می رسد تا پرچمدار سال 2019 یکی از بزرگترین کمپانی‌های دنیای فناوری.

پیکسل 4

 

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

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

منبع:
tech crunch


اینترنت اشیاء چه کمکی به کاربران و مدیران ایرانی میکند؟

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

از سوی دیگر شناخت خدمات اینترنت اشیاء‌ تا حد زیادی هزینه‌های سازمان را کاهش می‌دهد و مدیریت منابع را آسان­تر می‌کند؛ یعنی همان مشکلاتی که اغلب سازمان‌های ایران با آن مواجه هستند.

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

کارکرد اینترنت اشیاء

اینترنت اشیاء یا Internet of Things شبکه‌ای از دستگاه‌های دیجیتالی است که هر یک با داشتن شناسه‌های منحصر به فرد (UID) به یکدیگر متصل هستند.

اینترنت اشیاء بر پایه شبکه بی‌سیم و زیرساخت‌های اینترنتی بنا شده و سبب می‌شود که دنیای فیزیکی به صورت دقیق‌تر و بهینه‌تر مدیریت شود؛ به این صورت که اینترنت اشیاء به ویژه در بحث مدیریت زمان و هزینه، برای ما سودآور خواهد بود. هر وسیله هوشمندی که به اینترنت متصل می‌شود دارای IP مشخصی است که می‌توان از طریق این شناسه، به آن دستگاه هوشمند متصل شد.

کارکرد اینترنت اشیاء

 

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

کاربرد اینترنت اشیاء

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

اینترنت اشیاء مزیت‌هایی را در اختیار فرد و سازمان قرار می‌دهند که میزان قابل ملاحظه‌ای از هدر رفت منابع را کنترل می‌کند. از جمله ویژگی‌های اینترنت اشیاء، جلوگیری از تاخیر است. در واقع دستگاه‌های هوشمند سرعت بالاتری در پردازش داده‌ها دارند.

به این ترتیب می‌توان انتظار داشت که بهبود سرعت مدیریت منابع و داده یکی از نتایج استفاده از اینترنت اشیاء است. هوشمندی دستگاه‌ها با استفاده از اینترنت اشیاء مدیریت را نیز هوشمند و با برنامه می‌سازد.

موارد استفاده از اینترنت اشیاء در ایران

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

سیستم روشنایی هوشمند، سیستم مدیریت پسماند هوشمند، سیستم پارکینگ شهری و پارکینگهای عمومی هوشمند و همچنین سیستم آبیاری و فضای سبز هوشمند از جمله ابعاد متفاوت خدمات شهری و سازوکارهای هوشمندی است که اخیراً توسط برخی اپراتورهای اینترنتی در زمینه اینترنت اشیاء ارائه شده است.

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

دیجیاتو