آموزش

عمومي

آموزش جلوگيري از هك تلگرام و افزايش امنيت آن

۲۷۰ بازديد

آموزش جلوگيري از هك تلگرام و افزايش امنيت آن

تلگرام در حال حاضر محبوب‌ترين اپليكيشن پيام‌رسان در ايران است كه در اين مقاله به شما آموزش خواهيم داد كه چطور امنيت اكانت خود را تضمين كنيد. با زوميت همراه باشيد.

همان طور كه امروز در مقاله‌ي "امكان هك شدن تلگرام و واتساپ با باگ موجود در SS۷ وجود دارد" مطالعه كرديد به تازگي در SS۷ باگي كشف شده است كه توسط آن امكان ورود به اكانت تلگرام، واتس‌اپ يا هر اپليكيشن پيام‌رسان ديگري ممكن خواهد بود. قبل از هرچيز بايد بر اين موضوع تاكيد كنيم كه اين خبر نبايد باعث نگراني شما درباره‌ي امنيت و حريم شخصي‌تان شود چراكه روش انجام آن كاملا تخصصي و بسيار پيچيده است و تنها كاربراني كه دانش بالايي از هك و نفوذ دارند قادر به انجام احتمالي اين امر خواهند بود و يك شخص عادي به هيچ وجه توانايي انجام چنين كاري را نخواهد داشت. ضمن آنكه با پخش اين خبر به احتمال زياد به زودي شاهد تبليغات جديد افراد سودجو خواهيد بود كه با استناد به اين كليپ اقدام به فروش روش جديد هك تلگرام مي‌كنند در حالي كه همانطور كه اشاره شد انجام اين روش نيازمند تخصص بسيار بالايي است. علاوه بر اين آنچه در ويديو قابل مشاهده بود تنها بخش پاياني اين روش را به نمايش گذاشت و قبل از آن زمان و مراحل بسيار تخصصي و زيادي براي هك و دسترسي به كد ارسالي انجام شده است و از همين رو بهتر است فريب وعده‌هاي دروغين اين افراد را نخوريد.

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

 

پيش گيري (Two Step verification)

teleg3 00d26

براي اين كار به تنظيمات تلگرام وارد شده و به بخش Privacy برويد. گزينه‌ي Two Step Verifaction را لمس كنيد تا به مرحله‌ي تعيين رمز عبور وارد شويد. رمز مورد نظر خود را وارد كنيد. بعد از دومين باري كه رمز خود را براي تاييد وارد مي‌كنيد، از شما درخواست Password Hint يا راهنماي يادآوري رمز خواهد شد كه در صورت تمايل مي‌توانيد آن را وارد كنيد و در غير اين صورت، بدون وارد كردن حرف يا كلمه‌اي در آن، به مرحله‌ي بعد برويد. مرحله‌ي بعد بايد يك ايميل معتبر وارد كنيد تا در صورتي كه رمز عبور خود را فراموش كرديد، از اين ايميل براي بازيابي آن استفاده كنيد. با وجود آنكه در اين مرحله نيز مي‌توانيد با لمس گزينه‌ي Skip از وارد كردن ايميل بي‌نياز شويد، قويا پيشنهاد مي‌كنيم كه يك ايميل معتبر و البته خصوصي در اين بخش وارد كنيد يا حداقل رمزي را براي اكانت خود انتخاب كنيد كه احتمال فراموش كردن آن نزديك به صفر باشد. با انجام اين كار، مرحله‌ي تعيين رمز عبور به اتمام خواهد رسيد و از اين پس، چنين روش‌هايي امنيت اكانت شما را به خطر نخواهند انداخت.

 

درمان (Active Sessions)

https://cdn01.zoomit.ir/ex/Other/94/07/haapp2.jpg

اگر حس مي‌كنيد كه شخص دومي در اكانت شما وجود دارد يا به هر دليل نگران حضور شخصي غير خودتان در تلگرام هستيد مي‌توانيد با مراجعه به بخش Active Seassons از اين موضوع مطلع شويد. براي اين كار ابتدا به Setting تلگرام رفته و با لمس گزينه‌ي Privacy به تنظيمات خصوصي اكانت وارد شويد. در اين بخش با ورود به Active Seassons تمام دستگاه‌هايي كه قادر به استفاده از اكانت شما هستند به نمايش گذاشته خواهد شد. دقت كنيد كه وجود بيش از يك مورد در اين بخش لزوما نشانه‌ي وجود شخص دومي در اكانت شما نيست و در بسياري از مواقع، موارد موجود در اين بخش به كامپيوترهايي كه خود شما از آن‌ها براي لاگين شدن استفاده كرده‌ايد اختصاص دارد. تاريخ آخرين استفاده، مدل گوشي و IP هر كدام از موارد موجود نيز در جلوي آن‌ها ثبت شده است كه مي‌توانيد با بررسي آن‌ها، به وجود يا عدم وجود شخص دوم پي ببريد. در هر صورت اگر حس مي‌كنيد كه موارد ثبت شده توسط شما نبوده، يا بوده اما ديگر به آن‌ها نيازي نداريد مي‌توانيد با كليك روي گزينه‌ي Terminate تمام اتصال‌هاي ديگر به جز گوشي فعلي خود را، متوقف كنيد.

نكته: خوشبختانه تلگرام‌ IP دستگاه‌هايي كه در حال استفاده از اكانت شما هستند را نمايش مي‌دهد و اگر شكايتي در رابطه با هك شدن اكانت و سواستفاده‌هاي احتمالي از آن داريد مي‌توانيد به سادگي با يادداشت كردن IP مشخص شده در زير دستگاه نفوذي به پليس فتا مراجعه و اقدام به شكايت كنيد. اين آدرس IP كمك بسياري به پليس فتا در پيگيري شخص مورد نظر خواهد كرد.

آموزش برنامه نويسي جاوا: راه اندازي اكليپس

۲۶۱ بازديد

آموزش برنامه نويسي جاوا: راه اندازي اكليپس

در جلسه‌ي قبل IDE محبوب اكليپس را دانلود كرديم. در اين جلسه مي‌خواهيم نحوه‌ي استفاده از اين IDE را آموزش دهيم. بنابراين ياد مي‌گيريم كه چطور يك پروژه‌ي جاوايي در اكليپس ايجاد كنيم و همچنين با نحوه‌ي ساختن كلاس آشنا مي‌شويم. در اين جلسه دقيقا كار‌هايي را كه در قسمت آموزش برنامه نويسي جاوا: Hello World به صورت دستي انجام داديم، توسط اكليپس انجام مي‌دهيم تا شما در همين ابتداي كار به ضرورت وجود IDE ها در برنامه نويسي پي ببريد. در ادامه با زوميت همراه باشيد.

 بعد از اينكه دانلود برنامه‌ي اكليپس به پايان رسيد، ابتدا بايد فايل را از حالت فشرده خارج كنيد. براي اين كار مي‌توان از اپليكيشن‌هايي كه در اين زمينه توليد شده‌اند استفاده كرد يا مي‌توان از ابزار‌هاي خوده سيستم عامل استفاده كرد. بنده از اپليكيشن WinRAR براي اين كار استفاده مي‌كنم. بهتر است كه فايل اكليپس را در محلي از هارد ديسك قرار دهيم كه دسترسي به آن آسان باشد. Desktop را به شما پيشنهاد مي‌كنم. بعد از اينكه فايل اكليپس را به دسكتاپ انتقال داديم، بر روي فايل كليك راست كرده و گزينه‌ي Extract Here را انتخاب مي‌كنيم تا در همان دسكتاپ از حالت فشرده خارج شود. (تصوير زير):

01useeclipse01 873d1

بعد از اينكه فايل ZIP را از حالت فشرده خارج كرديد، فايلي ايجاد مي‌شود با نام eclipse. وارد اين فايل شويد. برنامه‌‌ي اكليپس نيازي به نصب ندارد و براي اجرا، شما بايد فايل eclipse.exe را اجرا كنيد. (در تصوير زير با يك بيضي سبز رنگ مشخص شده است):

01useeclipse02 0eaae

بعد از اينكه بر روي فايل اجرايي اكليپس كليك كرديد، با اولين پنجره‌اي كه مواجه مي‌شويد، پنجره‌ي زير است.

01useeclipse03 97ece

اين پنجره Workspace Launcher نام دارد. همانطور كه از نامش پيداست، مسيره ذخيره‌سازي پروژه‌هايي كه ما ايجاد مي‌كنيم را در هارد ديسك مشخص مي‌كند. بنابراين بهتر است كه مسير Workspace را همان دسكتاپ قرار دهيم. اما قبل از مشخص كردن مسير، ابتدا در دسكتاپ فولدري با نام workspace ايجاد كنيد و سپس با استفاده از دكمه‌ي Browse مسير workspace در دسكتاپ را انتخاب كنيد. اما قبل از OK كردن، به CheckBox (چك باكس) كه در تصوير بالا با يك فلش قرمز رنگ مشخص شده است توجه كنيد. اگر اين گزينه فعال نباشد، با هر بار بستن اكليپس و اجراي مجدد آن، اين پنجره نمايش داده مي‌شود و از شما درخواست مجدد مشخص كردن Workspace را مي‌كند. بنابراين، اين گزينه را انتخاب كنيد و بعد بر روي دكمه‌ي OK كليك كنيد تا برنامه اكليپس اجرا شود. (بعد از اجرا با تصوير زير مواجه مي‌شويد):

01useeclipse04 a2881

همانطور كه مشاهده مي‌كنيد اكليپس به شما خوش آمد مي‌گويد. با اين صفحه كاري نداريم. بنابراين همانطور كه در گوشه بالا، سمت راست تصوير با يك فلش سبز رنگ مشخص شده است، بر روي دكمه‌ي Worckbench كليك كنيد تا وارد صفحه‌ي اصلي برنامه شويد. (تصوير زير):

01useeclipse05 f8517

حالا وقت آن است كه اولين پروژه‌ي جاوايي خودمان را ايجاد كنيم. براي ساختن پروژه، ابتدا از منوي File گزينه‌ي New را انتخاب كنيد و بعد اولين گزينه، يعني Java Project را انتخاب كنيد. (تصوير زير):

01useeclipse06 c2b92

بعد از انتخاب گزينه Java Project، با پنجره‌ي زير مواجه مي‌شويد:

01useeclipse07 abd94

همانطور كه در تصوير فوق مشاهده مي‌كنيد، پنجره‌اي براي ساختن پروژه ظاهر شده است. ابتدا يك نام براي پروژه‌ي خود انتخاب مي‌كنيم. ما در اين آموزش نام: FirstJavaProgrm را نوشته‌ايم. به بقيه‌ي گزينه‌هاي اين صفحه كاري نداشته باشيد. بنابراين بر روي دكمه‌ي Finish كليك كنيد. بعد از ساخته شدن پروژه، بايد يك كلاس بسازيم.

نكته: در برنامه‌هاي بزرگ جاوا، ممكن است بيش از هزار كلاس وجود داشته باشد. اما اين نكته را به خاطر بسپاريد كه هر برنامه‌ي جاوا كم كم يك كلاس و يك مِتُد دارد.
در مورد كلاس‌ها و متدها در آموزش‌هاي مربوط به فصل شي گرايي به طور مفصل صحبت خواهيم كرد و كاربرد اصلي آن‌ها را ياد خواهيم گرفت.
 براي ساختن كلاس ابتدا پروژه‌ي خودتان را انتخاب كنيد و بعد كليك راست كنيد. منويي باز مي‌شود كه به آن منوي پاپ آپ (Pop-up) گفته مي‌شود. اولين گزينه از اين منو كه New است را انتخاب كنيد و بعد گزينه Class را انتخاب كنيد. (تصوير زير):
01useeclipse08 4c22d
درضمن، در بالاي همين عكس، قسمتي كه با يك فلش قرمز رنگ مشخص شده است را Package Explorer مي نامند. تمام پروژه‌هايي كه ما ايجاد مي‌كنيم در اين قسمت (Package Explorer) قرار مي‌گيرند.
بعد از كليك كردن بر روي دكمه‌ي Class، با پنجره‌ي زير مواجه مي‌شويم:
01useeclipse09 0c8f1
در مورد قسمت‌هاي مشخص شده در تصوير بالا كمي توضيح مي‌دهم:
 بيضي سبز رنگ اولي مربوط به پكيج است. اين كه پكيج چيست و چه كاربردي دارد، در آموزش‌هاي بعدي در مورد آن صحبت مي‌كنيم. بنابراين در اين آموزش براي پكيج چيزي نمي‌نويسيم.
قسمت بعدي كه Name است، بايد نامي براي كلاس خودمان انتخاب كنيم. نامي كه براي كلاسمان انتخاب مي‌كنيم بسيار مهم است. بايد نامي انتخاب كنيم كه نشان دهنده‌ي كاري باشد كه آن كلاس قرار است انجام بدهد. همانطور كه در آموزش قبلي گفته شد، هر برنامه‌ي جاوا داراي يك متد اصلي به نام متد main است كه نقطه شروع هر برنامه‌ي جاوا است. بنابراين چون در اين كلاس متد main را قرار است پياده‌سازي كنيم، كلاسمان، كلاس اصلي است. بنابراين نامي كه براي كلاس انتخاب مي‌كنيم، MainClass است.
آخرين قسمت كه با يك مستطيل قرمز رنگ مشخص شده است، يك چك باكس دارد. كه اگر اين چك باكس را انتخاب كنيم، اكليپس به صورت خودكار متد main را در كلاس ما پياده‌سازي مي‌كند و ديگر نيازي نيست كه ما به صورت دستي متد main را خودمان بنويسيم و اين يكي از مزاياي IDE ها است. چون IDE زحمت نوشتن كد را به گردن مي‌گيرد و كار ما را به عنوان برنامه نويس راحت تر مي‌كند. درضمن IDE ها در نوشتن كدها به هيچ عنوان اشتباه نمي‌كنند. بنابراين خيال ما از درست نوشته شدن كدها راحت است. بنابراين، اين گزينه را انتخاب كنيد و بعد بر روي دكمه‌ي Finish كليك كنيد.
 
نكته: در مورد انتخاب نام براي متغيرها، متدها، پكيج‌ها و كلاس ها نكاتي هست كه در هر آموزش مربوطه توضيح داده مي‌شود. در اين آموزش در مورد نام گذاري كلاس‌ها توضيح مي‌دهيم. البته يك سري قوانين كلي در جاوا براي نام گذاري وجود دارد و شامل همه‌ي موارد مي‌شود. اما براي نام گذاري بخش‌هاي مختلف جاوا تفاوت‌هاي كوچكي هست كه ما در هر مبحث به صورت جداگانه به آن ها اشاره مي‌كنيم. نكته‌اي كه بايد بسيار به آن توجه كنيد اين است كه نام كلاس بايد با حرف بزرگ انگليسي شروع شود. البته اگر با حرف كوچك هم شروع شود مشكلي نيست. اما يك قانون نانوشته در بين برنامه نويسان است كه نام تمام كلاس‌هاي خود را با حرف بزرگ شروع مي‌كنند و اگر نام كلاس از دو بخش تشكيل شده بود، مثلا در همين آموزش نام كلاس ما MainClass است، بايد حرف دوم بخش بعدي نام نيز با حرف بزرگ شروع شود. در اين آموزش بخش اول نام كلاس ما Main است كه با حرف بزرگ انگليسي شروع شده و بخش دوم Class است كه باز هم با حرف بزرگ شروع شده است. بنابراين اگر ما نام كلاس را به صورت Mainclass بنويسيم، غلط نيست! اما قشنگ هم نيست. نكته‌اي ديگر كه بايد به آن توجه كنيم اين است كه نمي‌توانيم نام كلاس خود را با اعداد شروع كنيم. مثلا 2MainClass كاملا غلط است يا نمي‌توانيم در بين كاركترهاي نام كلاس، از كاركترهاي خاص مثل ستاره (*)، هش مارك (#)، درصد (%) و ... استفاده كرد. اما در ميان كاركترهاي خاص مي توان از علامت دولار ($) استفاده كرد يا مي‌توان از خط زير يا Underscore (_) نيز استفاده كرد. اما باز هم تاكيد مي شود كه به هيچ عنوان از اين نام‌ها استفاده نكنيد. به عنوان مثال اين نام: Main_Class كاملا صحيح است، اما خوب نيست كه استفاده كنيم. همچنين از كلمات كليدي جاوا هم نمي‌توانيم استفاده كنيم. در هر زبان برنامه نويسي يك سري كلمات، از قبل رزرو شده است كه نمي‌توان از آن‌ها براي نام گذاري استفاده كرد. به عنوان مثال كلمه‌ي كليد class، يك كلمه‌ي رزرو شده است كه براي ساختن يك كلاس در جاوا استفاده مي‌شود.بنابراين ما نمي‌توانيم از اين نام استفاده كنيم و در آخر اينكه تمام كلمات كليدي با حروف كوچك انگليسي نوشته مي‌شوند.
 ليست تمام كلمات كليدي در جاوا
بعد از ساخته شدن كلاس، با تصوير زير مواجه مي‌شويم:
01useeclipse10 a3347
همانطور كه در تصوير بالا مشاهده مي‌كنيد، كدهايي كه نوشته شده است، حداقل كدهايي است كه يك برنامه‌ي جاوا براي اجرا به آن نياز دارد. اگر يادتان باشد در آموزش Hello World ما اين كدها را خودمان نوشتيم. درصورتي كه حالا IDE براي ما اين كار را انجام داده است. حالا براي اينكه فضاي بيشتري براي نوشتن كد در اختيار داشته باشيم، همانطور كه در تصوير بالا با يك فلش قرمز رنگ مشخص شده است، بر روي دكمه‌ي Maximize كليك كنيد. بعد كامنت ها كه با رنگ سبز نوشته شده‌اند (در آموزش‌هاي بعدي در موردشان توضيح داده مي‌شود) را پاك كنيد. نتيجه به صورت زير است:
01useeclipse11 df33e
حالا مي‌خواهيم وقتي برنامه اجرا شد، عبارت: Welcome to Java Programming نمايش داده شود. بنابراين بايد از جمله‌ي: ;()System.out.print استفاده كنيم. اما بجاي نوشتن كامل اين جمله، عبارت مقابل را بنويسيد: sysout و سپس دكمه هاي تركيبي CTRL + SPACE را فشار دهيد تا كد كامل شود. در بين پرانتزهاي ايجاد شده، يك جفت كوتيشن قرار دهيد و سپس عبارت فوق را بنويسيد. به شكل زير:
01useeclipse12 bd1ab
حالا با نگه داشتن دكمه‌هاي تركيبي CTRL + S برنامه را Save كنيد. بعد از Save كردن، دكمه‌هاي تركيبي CTRL + F11 را نگه داريد تا برنامه اجرا شود.
01useeclipse13 76e81همانطور كه مشاهده مي‌كنيد، عبارت مورد نظر ما در خروجي استاندارد يا همان كنسول برنامه چاپ شد.

آموزش مديريت محدوده‌ي پروژه

۱۳۵ بازديد

آموزش مديريت محدوده‌ي پروژه

مديريت محدوده‌ي پروژه به ما كمك مي‌كند زمان‌بندي و برآورد هزينه‌ي مناسبي براي پروژه داشته باشيم و از چالش‌هاي غير ضروري اجتناب كنيم.

مديريت محدوده‌ي پروژه، شامل فرآيندهايي است كه تضمين مي‌كنند براي رسيدن به نتيجه‌ي موفقيت‌آميز نهايي، صرفاً كارهاي مورد نياز را انجام مي‌دهيم و از پروسه‌هاي غير ضروري اجتناب مي‌كنيم. پيش از هر چيز، دو اصطلاح را از هم تفكيك مي‌كنيم:

  • محدوده‌ي محصول: توابع و ويژگي‌هايي كه خصوصيات محصول يا خدمات نهايي را تعريف مي‌كنند.
  • محدوده‌ي پروژه: كارهايي كه بايد انجام شود تا نتيجه‌ي پروژه، در قالب محدوده‌ي محصول (يعني توابع و ويژگي‌هاي آن) به دست آيد.

با اين مقدمه، مديريت محدوده‌ي پروژه حاوي آيتم‌ها و وظايفي است كه ما را دقيقاً به يك نتيجه‌ي مشخص مي‌رساند و مانع از اين مي‌شود كه وقت، منابع و انرژي‌مان را به كارهايي اختصاص دهيم كه ضروري و مورد نياز نيستند. مديريت محدوده، شامل سه پروسه‌ي اصلي است:

  • برنامه‌ريزي: تلاش‌هايي كه براي ثبت و تعريف كارهاي ضروري صورت مي‌گيرد.
  • كنترل: كنترل و نظارت فرآيندهايي كه روي مستندسازي، پيشرفت و تصويب يا عدم تصويب تغييرات متمركزند.
  • خاتمه: فرآيند چك كردن و بررسي نتايج به‌دست‌آمده و مقايسه‌ي آن‌ها با طرح اوليه است.

مدير پروژه صرف‌ نظر از روشي كه براي اجراي پروژه در نظر مي‌گيرد، از يك فرآيند سيستماتيك براي ضبط، تعريف و نظارت بر محدوده‌ي پروژه استفاده مي‌كند.

Project Management

مرحله‌ي ۱: تعريف نيازهاي پروژه

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

مرحله‌ي ۲: درك اهداف پروژه

براي تعريف محدوده‌ي پروژه، ابتدا بايد اهدافتان را تعيين كنيد. مثلاً توليد يك محصول جديد، يك سرويس درون‌سازماني يا بخشي از يك نرم‌افزار جديد. ممكن است چندين هدف با محوريت يك پروژه تكميل شوند. مدير پروژه تضمين مي‌كند كه تيم نتايج را مطابق با ويژگي‌ها يا توابع مشخص‌شده ارائه مي‌دهد. به‌طوركلي محدوده، اهدافي را كه براي رسيدن به يك نتيجه مطلوب به دست مي‌آيد مشخص مي‌كند.

به اين منظور شما بايد فاكتورهاي زير را تعيين كنيد:

  • هدف نهايي
  • زيرفازها
  • وظايف
  • منابع
  • بودجه
  • برنامه

با مشخص شدن اين پارامترها، محدوديت‌هاي پروژه روشن مي‌شوند و كارهاي فرعي كه زيرمجموعه‌ي پروژه نيستند، از فهرست شما خط مي‌خورند.

پروسه‌هاي مديريت محدوده‌ي پروژه

Project Scope Management

۱- برنامه‌ي مديريت محدوده

اين پروسه تعيين مي‌كند كه فرآيندهاي مديريت محدوده را چه كسي، چه زماني، با چه تكنيكي، چه تيمي و چه بودجه‌اي انجام مي‌دهد. يا به‌عبارت‌ديگر اين برنامه توضيح مي‌دهد كه محدوده‌ي پروژه چگونه تعريف، توسعه، نظارت، كنترل و بررسي مي‌شود.

۲- جمع‌آوري الزامات

اين فرآيند مستلزم مستندسازي خواسته‌ها و نيازهاي مالكان در راستاي تأمين اهداف پروژه است. يكي از مهم‌ترين فوايد اين كار، تعيين محدودي محصول است كه قبلاً در مورد آن صحبت كرديم. پس‌ازاينكه خواسته‌هاي مالكان پروژه ثبت شد، الزامات را دسته‌بندي و اولويت‌گذاري مي‌كنيم. اين الزامات عبارت‌اند از:

  • الزامات تجاري
  • الزامات مالكان
  • الزامات راه‌ حل
  • الزامات انتقال (نكاتي كه نيازهاي موقت را شرح مي‌دهند، مثل آموزش)
  • الزامات كيفيت

Collect Requirements

نكته: اگر اين روند به‌طور كامل و صحيح انجام شود، از بسياري از اتفاقات غيرمنتظره‌ي ناخوشايند كه ممكن است پروژه را از مسير اصلي منحرف كنند يا نارضايتي مشتريان را به نبال داشته باشند، پيشگيري مي‌شود.

مقالات مرتبط:

  • آموزش مديريت يكپارچگي پروژه
  • آموزش: مديريت مسائل و موانع پروژه

۳- تعريف محدوده

تعريف محدوده، يك شرح تفصيلي از پروژه و محصول (يا اهداف نهايي) است كه اقلام قابل تحويل يا دستاوردهاي پروژه و همچنين كارهاي مورد نياز براي حصول آن‌ها را بيان مي‌كند. همه‌ي اهداف و مرزهاي محدوده‌ي پروژه در اين سند ثبت مي‌شوند و شرحي از پروژه را ارائه مي‌دهند كه موردقبول مالكان يا ذي‌نفعان پروژه است.

۴- تدوين ساختار شكست كار (WBS)

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

نكته: ساختار شكست كار نشانگر منابع، زمان و ترتيب كارها نيست؛ بلكه فقط به محدوده‌ي پروژه برمي‌گردد.

Work Breakdown Structure (WBS)

مزاياي استفاده از نمودار WBS

  • اجتناب از فراموش‌ شدن اقلام تحويلي و فعاليت‌ها
  • مشخص كردن اقلام اصلي و مياني قابل تحويل
  • مشخص شدن محدوده‌ي پروژه

بايد به ياد داشته باشيم كه محدوديت خاصي براي تقسيم وظايف به جزئيات كوچك‌تر وجود ندارد. WBS صرفاً به مواردي نظير حجم پروژه، مشخصات اجزاي پروژه، گستره‌ي حوزه‌ي مكاني پروژه، نوع و سطح برنامه‌ريزي و كنترل و همچنين تنوع تخصص‌ها و مهارت‌هاي مورد نياز بستگي دارد. به‌علاوه هيچ لزومي ندارد كه تعداد زيرشاخه‌هاي حاصل‌ از WBS، در تمام فرآيندهاي پروژه با يكديگر برابر باشند. مهم اين است كه اجزاي جديد، به‌راحتي قابل‌برنامه‌ريزي و مديريت باشند و ماهيت كلي پروژه را نيز حفظ كنند.

ديكشنري WBS:

پس‌ازاينكه WBS پروژه طراحي و تكميل شد، جزئيات هر يك از زيرمجموعه‌ها (باكس‌ها) به‌طور واضح مشخص مي‌شود. ديكشنري WBS اين اجزاء را به‌طور مفصل‌تر توصيف مي‌كند و غالبا اين فاكتورها را شامل مي‌شود:

  • كد شناسايي
  • توصيف كار
  • فرضيات و محدوديت‌ها
  • سازمان مسئول
  • فهرست مايلستون‌ها
  • فعاليت‌هاي مرتبط زمان‌بندي
  • منابع مورد نياز
  • برآورد هزينه‌ها
  • الزامات كيفيت
  • معيارهاي پذيرش

Validate Scope

۵- تأييد و قانوني سازي محدوده

اين فرآيند شامل بازنگري اقلام قابل تحويل با حضور مشتريان و حاميان پروژه است. در اين مرحله توافق و پذيرش مشتريان را به‌طور رسمي اخذ و ثبت مي‌كنيم.

تفاوت فرآيند تأييد محدوده با فرآيند كنترل كيفيت، اين است كه در مرحله‌ي تأييد محدوده، روي پذيرش مشتريان متمركز هستيم و در مرحله‌ي كنترل كيفيت، صحت و كيفيت محصولات براي ما اهميت دارد.

۶- كنترل محدوده

فرآيند كنترل محدوده، شامل نظارت بر وضعيت پروژه و مديريت تغييرات محدوده است. ازآنجاكه وقوع بعضي تغييرات اجتناب‌ناپذير است، ما در اين مرحله اطمينان پيدا مي‌كنيم كه همه‌ي تغييرات را تحت كنترل داريم. اينجا واريانس از محدوده به‌عنوان مهم‌ترين ابزار نظارتي مطرح مي‌شود.

يكي از اشتباهات رايجي كه در مسير پروژه صورت مي‌گيرد، اين است كه وقتي اتفاقات پيش‌بيني‌نشده‌اي رخ مي‌دهد، اعضاي تيم براي برطرف كردن موانع اقداماتي انجام مي‌دهند كه در محدوده‌ي پروژه قرار ندارد و ممكن است بعداً آن‌ها را از هدف اصلي‌شان منحرف كند. به همين دليل مدير پروژه بايد با پيش‌بيني اختلالات و بازنگري مداوم، روند همه‌ي فرآيندها را كنترل كند. توصيه مي‌شود اعضاي تيم در هرلحظه از پرداختن به اموري كه تأثير يا نمودي در نتيجه‌ي نهايي پروژه ندارند، خودداري كنند.

نكات مهم در مديريت محدوده

گاهي اوقات مدير پروژه در طول پروسه‌ي تعيين محدوده، با مشكلاتي مواجه مي‌شود كه مانع از اجراي بهينه‌ي كار مي‌شوند. برخي از مشكلات متداولي كه در زمان تعريف و مستندسازي محدوده‌ي پروژه به وجود مي‌آيند، عبارت‌اند از:

  • ابهامات: وجود هرگونه ابهام در محدوده‌ي پروژه، به كارهاي غير ضروري و سردرگمي منجر مي‌شود. به‌منظور اجتناب از چنين اتفاقي، محدوده بايد به‌وضوح تعريف و براي اعضاي تيم شرح داده شود.
  • تعاريف ناقص: اگر تعاريف ناقص باشند يا برخي از حوزه‌ها مرزبندي نداشته باشند، برنامه از مسير اصلي خارج مي‌شود و به‌ تبع آن، هزينه‌هاي بيشتري به گروه تحميل مي‌شود.
  • ناپايداري و بي‌ثباتي: محدوده‌هاي گذرا و ناپايدار، مهم‌ترين عاملي هستند كه باعث مي‌شوند پروژه طبق زمان‌بندي قبلي به پايان نرسد. گاهي اين مشكل به حدي جدي است كه پروژه‌ها «بي‌پايان» خوانده مي‌شوند. راه‌ حل اين معضل، نهايي كردن سند محدوده و ثابت نگه‌داشتن آن است.
  • محدوده‌ي ناسازگار: محدوده‌اي كه با همه‌ي عوامل درگير به اشتراك گذاشته نمي‌شود، باعث ناسازگاري در الزامات و طراحي مي‌شود. به همين دليل سند محدوده بايد در اختيار حاميان و مالكان پروژه قرار بگيرد و جزئيات آن اطلاع‌رساني شود.

آموزش جاوا: ارسال پارامتر به متد‌ها

۱۶۸ بازديد

آموزش جاوا: ارسال پارامتر به متد‌ها

يكي از مفاهيم بسيار مهم در برنامه نويسي، ارسال پارامتر به متُد‌ها است. ارسال كردن پارامتر به متُد، كاري بسيار راحت است، اما كمي مفهوم پيچيده‌اي دارد. در حالت كلي به سه شكل مي‌توان به متُد‌ها پارامتر‌هايي را ارسال كرد كه عبارت هستند از Call By Value، Call By Pointer، Call By Reference. كه در ادامه‌ي آموزش به تفصيل در مورد اين اصطلاحات صحبت مي‌كنيم. با زوميت همراه باشيد.

نكته‌اي كه وجود دارد اين است كه بسياري از برنامه نويسان جاوا معتقدند كه جاوا Call By Value است و عده‌اي ديگر نيز معتقد‌ند كه جاوا Call By Reference است. اينكه جاوا را چه مي‌نامند اصلا اهميتي ندارد، بلكه مهم اين است كه شما رفتار جاوا را بدانيد كه در هر وضعيت چگونه عمل مي‌كند.

نگاهي كوتاه به مفاهيم گذشته

قبل از اينكه وارد بحث اصلي شويم، بهتر است نگاهي كوتاه به مفاهيم گذشته كنيم. اطلاع و تسلط داشتن كامل به مفاهيمي كه در گذشته آموزش داده شده است، بسيار مهم و لازم براي فهميدن و درك مطالب اين جلسه است. پس با دقت مطالعه كنيد.

همانطور كه مي‌دانيد در جاوا دو نوع داده وجود دارد كه عبارت هستند از داده‌هاي اوليه (Primitive Data Type) وداده‌هاي ارجاعي (Reference Data Type). داده‌هاي اوليه (Primitive Data Type) هشت نوع بودند: byte,shortintlongcharfloatdoubleboolea. اين هشت نوع داده به صورت پيش‌فرض در جاوا تعريف شده‌اند و استفاده از آن‌ها در يك مثال ساده به صورت زير است:


package ir.zoomit;

public class MainApp {

	public static void main(String[] args) {
		int integerNumber = 10;
		char character = 'A';
		boolean b = true;
	}
}

با استفاده از Primitive Data Type‌ها مي‌توانيم داده‌هاي پيچيده‌تري را بسازيم. به عنوان مثال كلاس String كه براي كار با رشته‌ها استفاده مي‌شود، در دل خودش از داده‌ي كاركتر (char) استفاده كرده است. String يك كلاس است، بنابراين جزء داده‌هاي ارجاعي (Reference Data Type) به حساب مي‌آيد. به عبارت ديگر تمام كلاس‌ها كه از روي آن‌ها اشيائي ايجاد مي‌شود، جزء داده‌هاي ارجاعي هستند و فقط و فقط آن هشت داده‌اي كه در بالا گفته شد جزء داده‌هاي پايه به حساب مي‌آيند.

چند نكته در مورد داده‌هاي پايه و ارجاعي

دقيقا منظور از ارجاع يا Reference چيست؟ به طور كلي براي استفاده از داده‌هاي ارجاعي، حتما بايد ابتدا از روي آن‌ها يك آبجكت ساخت. به صورت زير:


package ir.zoomit;

public class MainApp {

	public static void main(String[] args) {
		Person p = new Person(); // Object Creation OR Instantiation
	}
}

class Person {

}

در كد بالا دو كلاس وجود دارد. يكي كلاس اصلي (MainApp) كه در آن متد معروف main پياده‌سازي شده است و ديگري كلاس Person كه هيچ پياده سازي‌ ندارد. همانطور كه مشاهده مي‌كنيد در داخل متد main يك آبجكت از روي كلاس Person ساخته‌ايم.

نكته: اصطلاحا به ساخت آبجكت از روي يك كلاس Object Creation يا Instantiation گفته مي‌شود. حتما اصطلاحات انگليسي را با تلفظ درست ياد بگيريد و به كار ببريد.

در بسياري از كتاب‌ها و منابع آموزشي به اشتباه گفته مي‌شود كه p در كد بالا شي يا آبجكت است. در صورتي كه كاملا اشتباه است. ما در آموزش‌هاي قبلي هم در مورد اين موضوع صحبت كرديم، اما بهتر است دوباره نگاهي سطح پايين‌تر به اين موضوع داشته باشيم.

همانطور كه مي‌دانيد براي ساختن يك شي از روي يك كلاس، بايد آن كلاس را new كنيم. هنگامي كه با استفاده از عملگرnew اقدام به ساخت يك شي از روي يك كلاس مي‌كنيم، عملگر new در واقع دو كار را انجام مي‌دهد. ابتدا يك شي جديد در حافظه‌ي Heap ايجاد مي‌كند و سپس يك Reference يا ارجاعي از آن شي ساخته شده را بر‌مي‌گرداند. يعني ما با استفاده از آن ارجاع، مي‌توانيم به شي ساخته شده در حافظه دسترسي داشته باشيم. براي اينكه بتوانيم با استفاده از ارجاع به شيئي در حافظه دسترسي داشته باشيم، بايد ارجاع را در يك متغيري ذخيره كنيم. اين متغير در كد بالا، p است. بنابراين p شي نيست، بلكه يك Reference يا ارجاعي به شي در حافظه است.

نكته‌ي ديگري كه بايد از آن اطلاع داشته باشيد و قبلا هم به آن اشاره شده است، اين است كه در تكه كد زير:


Person p = new Person();

متغير p در حافظه‌ي Stack (استك) ايجاد شده است و آبجكت يا شي در حافظه‌ي Heap «هيپ».

براي درك بهتر مسئله‌ي فوق، به تصوير زير توجه كنيد:

 

Stack & Heap In Java

تصوير فوق به صورت دقيق اين مسئله را روشن مي‌كند، بنابراين با دقت توجه كنيد. در اين عكس در يك متُدي با نامMethod1 دو داده از نوع داده‌هاي اوليه يا Primitive Data Type تعريف كرده است و بعد هم از روي يك كلاسي با نام Class1 آبجكتي ايجاد كرده است. به Line1 (گوشه‌ي بالا سمت چپ تصوير) توجه كنيد. وقتي كه در برنامه يك داده از نوع عدد صحيح تعريف شده است، در حافظه‌ي Stack اين متغير ايجاد و مقداردهي شده است. توجه كنيد كه Primitive Data Type‌ها همانطور كه از نامشان پيداست، داده‌هاي اوليه هستند و نمي‌توانيم آن‌ها را new كنيم. newكردن فقط مختص كلاس‌ها است كه از روي آن‌ها اشيائي ايجاد مي‌شود. بنابراين وقتي در برنامه داده‌اي از نوع داده‌هاي اوليه تعريف مي‌كنيم، آن داده در حافظه‌ي Stack ذخيره و مقداردهي مي‌شود. اگر با درس Data structure يا ساختمان داده‌ها آشنايي داشته باشيد، مبحثي است با نام Stack يا پُشته كه در آن اصطلاح LIFO را براي Stack در نظر گرفته‌اند كه مخفف: Last In First Out است. يعني اينكه آخرين داده‌اي كه وارد Stack مي‌شود، اولين داده‌اي است كه از آن خارج مي‌شود. اگر به تصوير فوق نيز نگاه كنيد، استك را همانند يك ليوان كشيده است كه يك سَر آن بسته و يك سَر ديگر باز است. داده‌ها وقتي وارد استك مي‌شوند، روي يكديگر قرار مي‌گيرند. اگر به خط بعدي برنامه نگاه كنيد، دوباره داده‌اي از نوع داده‌هاي اوليه تعريف و مقداردهي شده است. حالا به Line2 توجه كنيد. همانطور كه مشاهده مي‌كنيد، در استك متغير y روي متغير i قرار گرفته است. پس تا اينجاي كار، متغير y آخرين متغير يا داده‌اي است كه وارد Stack شده است، پس اولين متغير يا داده‌اي است كه از استك خارج مي‌شود.

نكته: پس تا اينجا متوجه شديم كه داده‌هاي پايه در حافظه‌ي Stack ذخيره و مقداردهي مي‌شوند.

حالا به سراغ ادامه‌ي كد مي‌رويم. در ادامه برنامه مي‌خواهد از روي يك كلاس، آبجكتي در حافظه ايجاد كند و ارجاع يا Reference آن آبجكت را در متغيري با نام cls1 ذخيره كند. حالا به Line3 توجه كنيد. متغير cls1 در حافظه‌ي Stack ايجاد شده است و همانطور كه در تصوير نيز مشاهده مي‌كنيد، در مقابل آن و در داخل پرانتز عبارت (ref) را نوشته است كه منظور همان Reference يا ارجاع است. باز هم به تصوير دقت كنيد. در Line3 حافظه‌ي Heap را هم كشيده است و متغير cls1 در حال اشاره كردن به آبجكتي است كه در Heap ايجاد شده است. پس با توضيحات فوق بايد مفهومReference يا ارجاع را كاملا درك كرده باشيد.

توضيحات در مورد مفهوم ارجاع يا Reference به طور كلي گفته شد. اما در اينجا قصد داريم به يك نكته‌ اشاره كنيم تا يك سوءتفاهم را برطرف كنيم.

همانطور كه قبلا هم در آموزش‌ها اشاره شده است، در جاوا موجودي با نام زباله روب يا Garbage Collector وجود دارد. وظيفه‌ي GC پاكسازي حافظه‌ي Heap است. به عبارت ديگر Garbage Collector هر از چندگاهي به حافظه‌ي Heap سر مي‌زند و اشياء به اصطلاح مُرده را پاك و حافظه را آزاد مي‌كند. نكته‌ي بسيار مهم دقيقا همين جا است كه Garbage Collector فقط و فقط حافظه‌ي Heap را پاكسازي مي‌كند. اگر به تصوير فوق نگاه كنيد، در بخش exiting method، بعد از پايان برنامه حافظه‌ي Stack خالي شده است، اما در حافظه‌ي Heap آبجكت ساخته شده همچنان وجود دارد. نكته اينجا است كه در تمام زبان‌هاي برنامه نويسي (چه زباني مثل جاوا كه Garbage Collector دارد و به صورت خودكار حافظه‌ي Heap را پاكسازي مي‌كند، و چه زبان‌هايي مثل ++C كه پاكسازي اشياء نيز بر عهده‌ي برنامه نويس است)، حافظه‌ي Stack به صورت خودكار پاك مي‌شود و پاكسازي حافظه‌ي Stack اصلا ربطي به وجود Garbage Collector ندارد و در تمام زبان‌ها اين كار به صورت خودكار انجام مي‌شود. به اين دليل به نكته‌ي بالا پرداخته شد كه در بعضي از كتاب‌ها و منابع آموزشي، براي توضيح نحوه‌ي كار Garbage Collector، مثالي همانند مثال فوق مي‌آورند و مي‌گويند مثلا y، i يا cls1 توسط Garbage Collector پاك مي‌شوند كه كاملا غلط و اشتباه است.

ارسال پارامتر به متُد

متُد‌ها نشان دهنده‌ي رفتار يك برنامه هستند. وقتي يك متُد را تعريف مي‌كنيم، براي آن با توجه به كاري كه قرار است در برنامه انجام دهيم، پياده سازي‌هاي مختلفي در نظر مي‌گيريم. به كد زير توجه كنيد:


package ir.zoomit;

public class MainApp {

	public static void main(String[] args) {
		Person p = new Person(); // Object Creation OR Instantiation
		p.show(); // Method Invocation
	}
}

class Person {
	public void show() {
		System.out.println("Method Invocation");
	}
}

در بالا يك برنامه‌ي بسيار ساده نوشته‌ايم. ابتدا يك متُد با نام ()show در كلاس Person نوشته‌ايم كه اين متُد پياده سازي بسيار ساده‌اي دارد (در حد چاپ كردن يك رشته در خروجي استاندارد). در كلاس اصلي در داخل متد main، ابتدا آبجكتي از روي كلاس Person ايجاد كرده‌ايم و سپس توسط آن آبجكت، متُد موجود در كلاس Person را فراخواني كرده‌ايم.

نكته: اصطلاحا به فراخواني متُد، Method Invocation مي‌گويند.

متُدي كه در بالا تعريف كرده‌ايم، يك متُد بدون پارامتر است. حالا اگر بخواهيم يك متُد با پارامتر تعريف كنيم، بايد متغيري‌هايي را در داخل پرانتز‌هاي باز و بسته‌ي جلوي نام متد، تعريف كنيم. يك متد مي‌تواند صفر يا بيش از صفر پارامتر داشته باشد. به كد زير توجه كنيد:


package ir.zoomit;

public class MainApp {

	public static void main(String[] args) {
		Person p = new Person(); // Object Creation OR Instantiation
		p.sum(5, 10); // Method Invocation
	}
}

class Person {
	public void sum(int a, int b) {
		int sum = 0;
		sum = a + b;
		System.out.println(sum);
	}
}

در برنامه‌ي فوق، ابتدا در داخل كلاس Person متُدي با نام sum تعريف كرده‌ايم كه مي‌خواهيم اين متُد دو عدد را دريافت كند و سپس آن دو عدد را جمع كند و در خروجي استاندارد چاپ كند. اگر دقت كنيد متُد ()sum در داخل پرانتز‌هاي باز و بسته‌ي جلويش، دو عدد صحيح تعريف شده است. اين دو عدد پارامتر‌هاي متُد ()sum هستند. چند نكته در مورد پارامتر‌هاي متُد:

اگر قرار است متُد بيش از يك پارامتر داشته باشد (همانند متُد فوق)، بايد با استفاده از علامت « متغير‌ها را از يكديگر جدا كنيد. اما اگر يك متغير است، نيازي به اين كار نيست.

نكته‌ي دوم اين است كه اگر مي‌خواهيم متُدي را فراخواني كنيم كه داراي پارامتر است، در هنگام فراخواني متُد، حتما بايد براي پارامتر‌هاي متُد، داده‌هايي را از همان نوعي كه در متُد تعريف شده‌اند در نظر بگيريم. در غير اين صورت با خطاي كامپايل مواجه مي‌شويم. اگر به كد بالا دقت كنيد، در متُد main هنگام فراخواني متُد ()sum، دو عدد ۵ و ۱۰ را براي پارامتر‌هاي آن در نظر گرفته‌ايم. اگر آن دو عدد را در نظر نمي‌گرفتيم، با خطاي كامپايل مواجه مي‌شديم. پس در برنامه‌ي بالا ما يك متُد تعريف كرده‌ايم كه داراي دو پارامتر است و هنگام فراخواني آن متُد (Method Invocation)، دو داده براي پارامتر‌هاي آن در نظر گرفته‌ايم.

Parameter Passing: A Deeper Look

حالا مي‌خواهيم نگاهي دقيق‌تر به ارسال پارامتر به متُد‌ها داشته باشيم و وارد موضوعي شويم كه تمام مطالبي كه تا قبل از اين گفته شد، براي فهميدن اين موضوع لازم است.

در حالت كلي ارسال پارامتر به يك متُد، در سه صورت انجام مي‌شود كه عبارت‌ هستند از:

  1. Call By Value
  2. Call By Pointer
  3. Call By Reference

در زبان ++C مفهومي است با نام اشاره‌گر يا Pointer كه در زبان جاوا وجود ندارد. البته طراحان زبان جاوا ارجاع‌ها يا Reference‌ها را نوع خاص و محدود شده‌ي اشاره‌گر در جاوا مي‌دانند. نكته‌ي مهمي كه بايد به آن توجه كنيد اين است كه با توجه به اين موضوع كه در زبان جاوا اشاره‌گر وجود ندارد، درست نيست كه براي جاوا از مفهوم Call By Pointer استفاده كنيم. اما چرا ما در اينجا براي آموزش جاوا اين سه اصطلاح را نوشتيم؟ اين سه مُدل يك مفهوم كلي‌ است و شايد بهتر باشد با زبان‌هاي ديگري مثل ++C و #C نيز كار كنيد تا درك درستي از هركدام از اين مفاهيم پيدا كنيد، زيرا عنوان اين سه مُدل شفاف و گويا نيست و فهمدين و درك آن‌ها نيازمند تجربه است. به عنوان مثال مُدلي كه در ++C به آن Call By Reference مي‌گويند، اصلا در جاوا وجود ندارد و در مقابل مُدلي كه در جاوا معمولا به آن Call By Reference مي‌گويند، در ++C با عنوان Call By Pointer شناخته مي‌شود. بنابراين اگر كسي از شما بپرسد كه Call By Reference چيست، بايد سوالش را دقيق‌تر و كامل‌تر كند كه منظورش در كدام زبان برنامه نويسي است.

نكته‌ي بسيار مهم: در جاوا اگر متغير‌هايي از نوع داده‌هاي اوليه (Primitive Data Type) را به متُد پاس بدهيم يا ارسال كنيم، رفتار جاوا Call By Value است و اگر داده‌هاي ارجاعي (Reference Data Type) مثل كلاس String را ارسال كنيم، رفتار جاوا Call By Reference، چيزي شبيه Call By Pointer در ++C است.

حالا اجازه دهيد با مثال كار خود را پيش ببريم. ابتدا توضيح Call By Value. به كد زير توجه كنيد:


package ir.zoomit;

public class MainApp {

	public static void main(String[] args) {
		int a = 5;
		int b = 10;

		System.out.println("Before: " + "a=" + a + ", " + "b=" + b);

		badSwap(a, b);

		System.out.println("After: " + "a=" + a + ", " + "b=" + b);
	}

	private static void badSwap(int a, int b) {
		int temp = 0;
		temp = a;
		a = b;
		b = temp;
System.out.println("In badSwap() Method: " + "a=" + a + ", " + "b=" + b); } }

در برنامه‌ي بالا يك كلاس بيشتر تعريف نكرده‌ايم كه همان كلاس اصلي است. اما در داخل اين كلاس دو متُد وجود دارد. يكي متُد main كه نقطه‌ي شروع هر برنامه‌ي جاوا است و ديگري متُد ()badSwap كه پياده سازي آن به اين شكل است كه دو پارامتر به عنوان ورودي دريافت مي‌كند و سپس مقادير آن‌ها را با يكديگر عوض مي‌كند. يعني بعد از اجراي متُد ()badSwap، مقدار متغير a كه ۵ است بايد ۱۰ شود و مقدار b كه ۱۰ است، ۵. در پياده سازي متُد main قبل از اجرا و بعد از اجراي متُد ()badSwap مقادير متغير‌هاي a و b را در خروجي استاندارد چاپ كرده‌ايم تا متوجه‌ تغييرات (جا به جايي مقادير متغير‌ها) شويم. همچنين در داخل متُد ()badSwap نيز مقادير a و b را چاپ كرده‌ايم.

حالا قبل از اجراي برنامه، سعي كنيد فقط با نگاه كردن به كد‌ها، برنامه را روي يك تكه كاغذ يا ذهن خود Trace و اجرا كرده و خروجي برنامه را پيدا كنيد.

نكته: Trace كردن به اين معني است كه اگر برنامه با خطايي مواجه شود، برنامه‌نويس خط به خط برنامه را دقيقا مي‌خواند و تمام رويداد‌هايي كه در برنامه رُخ مي‌دهد را ثبت مي‌كند تا متوجه شود كه دقيقا چه اتفاقي مي‌افتد. البته در برنامه‌هاي بزرگ اصلا به اين شيوه عمل نمي‌كنند و از مبحث Logging استفاده مي‌كنند. استفاده از Trace كردن، جدا از پيدا كردن خطا در برنامه، مي‌توان از آن براي بهتر فهميدن برنامه نيز كمك گرفت.
تمرين بيشتر: در يوتيوب ويدئو‌هايي براي آموزش Trace كردن وجود دارد. Hand Tracing را جستجو كنيد و ويدئو‌هايي كه در اين زمينه توليد شده است را تماشا كنيد. درضمن اصلا نيازي نيست كه آموزش‌هايي كه در يوتيوب وجود دارد حتما براي زبان جاوا باشد، بلكه فقط كافي‌ است نحوه‌ي Trace كردن را فرا بگيريد.

بعد از اينكه خودتان برنامه را به صورت دستي Trace كرديد، برنامه را اجرا كنيد. بعد از اجراي برنامه‌ي فوق، با خروجي زير مواجه مي‌شويد:


Before: a=5, b=10
In badSwap() method: a=10, b=5
After: a=5, b=10

همانطور كه در خروجي فوق مشاهده مي‌كنيد، مقادير a و b قبل و بعد از اجراي متُد هيچ تغييري نكرده است و فقط تغييرات در داخل متُد ()badSwap است. يعني جاوا در اين قسمت رفتار Call By Value از خودش نشان داده است.اما علت تغيير نكردن مقادير چيست؟ بسيار ساده است. هنگامي كه در داخل متُد main، متُد ()badSwap را فراخواني و مقادير a و b را به آن ارسال كرده‌ايم، جاوا در حقيقت خود اصل مقادير را به متُد ارسال نكرده است، بلكه كُپي‌ از داده‌ها را به متُد ارسال كرده است. بنابراين در داخل متُد ()badSwap هر اتفاقي كه بيفتد، روي كُپي داده‌ها تغييرات ايجاد مي‌شود و اصل داده‌ها هيچ تغييري نمي‌كنند. به هم دليل است كه وقتي مقادير a و b را در داخل متُد ()badSwap در كنسول چاپ مي‌كنيم، مقاديرشان تغيير كرده است، اما بعد از آن خير.

نكته: پس هميشه اين نكته را به خاطر داشته باشيد كه وقتي داده‌هايي به متُد ارسال مي‌كنيد كه از نوع داده‌هاي اوليه (Primitive Data Type) هستند، جاوا رفتار Call By Value از خودش نشان مي‌دهد.

حالا اجازه دهيد در مورد Call By Reference كه شبيه Call By Pointer در ++C است صحبت كنيم.

به كد زير توجه كنيد:


package ir.zoomit;

public class MainApp {

	public static void main(String[] args) {
	}
}

class Person {
	private String str1;
	private String str2;

	public String getStr1() {
		return str1;
	}

	public void setStr1(String str1) {
		this.str1 = str1;
	}

	public String getStr2() {
		return str2;
	}

	public void setStr2(String str2) {
		this.str2 = str2;
	}
}

كد فوق بسيار ساده است. دو كلاس داريم، يكي كلاس اصلي (MainApp) و ديگري كلاس Person. كلاس Person داراي دو ويژگي يا Property يا فيلد است. طبق آموزش‌هاي قبل فيلد‌هاي كلاس Person متغير‌هاي str1 و str2 كه از جنس كلاس String هستند. در اين كلاس چهار متُد تعريف شده است. به دليل اينكه Encapsulation رُخ داده است، متُد‌هاي getter و setter براي دسترسي به فيلد‌هاي كلاس تعريف شده است.

حالا در ادامه مي‌خواهيم در كلاس اصلي و در متُد main از روي كلاس Person يك آبجكت ايجاد كنيم و با استفاده از شيئي كه در دست داريم، فيلد‌هاي كلاس Person كه str1 و str2 هستند را مقداردهي كنيم. پس بايد كُدمان را به صورت زير كامل كنيم:


package ir.zoomit;

public class MainApp {

	public static void main(String[] args) {
		// Object Creation OR Instantiation
		Person a = new Person();
		Person b = new Person();
		a.setStr1("Java");
		b.setStr2("C++");

		System.out.println(
		"Before: " + "str1=" + a.getStr1() + ", " + "str2=" + b.getStr2());

		swapNames(a, b);

		System.out.println(
		"After: " + "str1=" + a.getStr1() + ", " + "str2=" + b.getStr2());
	}

	static void swapNames(Person a, Person b) {
		String tmp = a.getStr1();
		a.setStr1(b.getStr2());
		b.setStr2(tmp);
	}
}

class Person {
	private String str1;
	private String str2;

	public String getStr1() {
		return str1;
	}

	public void setStr1(String str1) {
		this.str1 = str1;
	}

	public String getStr2() {
		return str2;
	}

	public void setStr2(String str2) {
		this.str2 = str2;
	}
}

برنامه بسيار ساده است. دقيقا همان جا به جايي است كه در بخش قبل براي اعداد انجام داديم، اينجا براي رشته‌ها انجام داده‌ايم و مي‌خواهيم امتحان كنيم كه آيا مقادير دو رشته‌ي str1 و str2 با يكديگر عوض مي‌شوند يا خير؟ باز هم پيشنهاد مي‌كنيم برنامه را قبل از اجرا در ذهن خود Trace كنيد و به خروجي آن برسيد.

حالا اگر برنامه را اجرا كنيم، با خروجي زير مواجه مي‌شويم:


Before: str1=Java, str2=C++
After: str1=C++, str2=Java

همانطور كه مشاهده مي‌كنيد اين بار مقادير متغير‌ها با يكديگر عوض شد. علت چيست؟ همانطور كه گفته شد، داده‌هاي ارجاعي (Reference Data Type)، به طور مستقيم خودِ داده را نگه داري نمي‌كنند، بلكه ارجاعي به آن داده در حافظه هستند. در كد بالا متغير‌هاي a و b در متُد ()swapNames به همان جايي در حافظه ارجاع مي‌دهند (اشاره مي‌كنند) كه متغير‌هاي a و b در متُد main به آن اشاره مي‌كنند. بنابراين وقتي با كمك متغير‌هاي a و b در متُد ()swapNames محتواي (State) يك آبجكت را تغيير دهيم، محتواي a و b در متُد main نيز تغيير مي‌كند. بنابراين ما در جاوا به كمك ارجاع‌هايي كه به به صورت پارامتر به متُد‌ها پاس مي‌شوند، مي‌توانيم محتوا يا وضعيت يا State اشياء را تغيير دهيم. نكته‌اي كه وجود دارد اين است كه هويت يا Identity اشياء را نمي‌توانيم تغيير بدهيم. به عبارت ديگر پارامتر‌هايي كه به متُد پاس مي‌شوند، در انتهاي فراخواني متُد، هويت‌شان حفظ مي‌شود. به عنوان مثال متغير‌هاي a و b در متُد main، پس از پايان متُد، هويتشان تغيير نمي‌كند و همچنان به همان جايي در حافظه اشاره مي‌كنند كه قبلا اشاره مي‌كردند. اما بعد از اجراي متُد، وضعيتشان، حالتشان يا State آن‌ها تغيير كرده است.

نكته‌ي پاياني: به عنوان نكته‌ي آخر، در مورد كلاس‌هاي تغيير ناپذير يا Immutable Class‌ها تحقيق كنيد. به عنوان مثال String يك كلاس Immutable است. ابتدا اين مبحث را مطالعه كنيد و سپس داده‌هايي از جنس كلاس‌هاي Immutable را به متُد‌ها ارسال كنيد و سعي كنيد محتواي آن‌ها را تغيير دهيد.
 در آخر از كساني كه با زبان جاوا آشنا هستند درخواست داريم تا آموزش‌ها را با دقت مطالعه كنند تا اگر ايرادي در آموزش‌ها بود مطرح كنند تا آن‌ها را برطرف كنيم.

 

تماشا كنيد: آموزش FIFA 16 – دفاع حرفه‌اي

۲۹۲ بازديد

تماشا كنيد: آموزش FIFA 16 – دفاع حرفه‌اي

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

آموزش HTML - بخش چهارم: لينك‌ها

۱۷۶ بازديد

آموزش HTML - بخش چهارم:  لينك‌ها

در بخش‌هاي قبلي آموزش اچ تي ام ال با تگ پاراگراف و نحوه نوشتن متن و قرار دادن عنوان در صفحات آشنا شديم. حالا شما مي‌توانيد با ساخت يك صفحه اچ تي ام ال (بخش اول)، متن‌هاي خود را در آن وارد نماييد(بخش دوم) و براي آن‌ عنوان قرار دهيد. حالا در انتهاي اين شماره شما قادر خواهيد بود تا صفحات خود را به يكديگر متصل نماييد. جالب است, نه؟ براي يادگيري قدم به قدم قرار دادن لينك در صفحه, با ما همراه شويد.

قرار دادن لينك در صفحه تگ

;لينك‌ها يكي از پراستفاده‌ترين المان‌هاي اچ‌تي‌ام‌ال هستند و در واقع اين لينك‌ها هستند كه كاربران شما را به جايي كه شما مي‌خواهيد هدايت مي‌كنند. به مثال زير دقت كنيد:

نمونه كد

 < a href  = "http://zoomit.ir"متني كه به عنوان نماينده لينك در مرورگر نشان داده مي شود

نتيجه‌اي كه مرورگر نمايش خواهد داد

براي قرار دادن لينك در اچ تي ام ال مراحل زير را طي مي‌كنيم.

 "آدرس لينك">   link name 

مرحله اول: براي اضافه كردن لينك به بخشي از صفحه, ابتدا علامت مخصوص آن، يعني  را قرار داده‌ايم.

مرحله دوم: سپس يك كلمه ديگر به نام href را در كنار لينك قرار داده‌ايم كه در واقع مقصد لينك شما را معين مي‌كند. 

مرحله سوم: در بين تگ‌هاي  كلمه يا متني كه قرار است  نماينده لينك در صفحه باشد را نوشته‌ايم.

مرحله چهارم:  در نهايت تگ a را  بسته‌ايم .

< a href  = "(URL)">  نام لينك مورد نظر 

نكته: هر چند نيازي به دانستن اين موضوع در اين لحظه نيست ولي شايد دوست داشته باشيد بدانيد كه كلمه href كه در كنار كلمه a در تگ لينك قرار مي گيرد چيست و چه نقشي دارد.

در واقع برخي تگ‌هاي اچ تي ام ال از جمله تگ لينك, عكس و بسياري ديگر به صورت پيش فرض براي تعريف شدن و تكميل شدن به يك مشخصه (Attribute) نياز دارند كه آن‌ها را توضيح مي‌دهد و تكميل مي‌كند. در اين مثال, كلمه href كه مقصد لينك در تگ a را مشخص مي‌كند يك صفت تكميل كننده براي تگ a است.

ما در بخش‌هاي بعدي از چنين كلماتي به مكرر استفاده خواهيم كرد و شما هم با اهميت آن بيشتر از پيش آشنا خواهيد شد. پس حالا كه آشنايي ابتدايي با اين تگ پيدا كرده‌ايد شما را به خواندن ادامه آموزش‌ها دعوت مي‌كنيم.

خلاصه قسمت چهارم:

در اين قسمت چيزهايي كه يادگرفته‌ايم را به صورت كاملا خلاصه مرور مي‌كنيم.

  • در قسمت چهارم از آموزش اچ تي ام ال, نحوه لينك گذاري در صفحات اچ‌تي‌ام‌ال را نيز آموختيم.
  • تگ لينك به صورت /> متن لينك <"آدرس صفحه مقصد در لينك"=a href> نوشته مي‌شود.

 نوبت شما

خب نوبتي هم كه باشد، ديگر نوبت شما است. پس همين حالا دست به كار شويد و به ما نشان دهيد كه همه چيزهايي كه گفته‌ايم را آموخته‌ايد. اين شما و اديتور آنلاين:

 

اميدواريم كه اين  آموزش هم، موفق به جلب رضايت شما زوميتي‌هاي عزيز شده باشد. قسمت‌هاي قبلي اين مجموعه مقالات را از دست ندهيد. تجربيات، پيشنهادات و نظرات شما بدون شك در ادامه اين مقالات آموزشي تاثير بسزايي خواهد داشت و قدرداني ما را هم به همراه خواهد داشت. پس لطفا با ما در ارتباط باشيد.

آموزش برنامه نويسي جاوا: JVM

۱۴۶ بازديد

آموزش برنامه نويسي جاوا: JVM

بهتر است آموزش را با يك مثال پيش ببريم. فرض كنيد مي‌خواهيم برنامه‌اي به زبان جاوا بدون كمك گرفتن از IDE ها (در مورد IDE ها در فصل‌هاي بعدي توضيح مي‌دهيم) بنويسم. بنابراين ابتدا يك ويرايشگر متن (مثل نُت پد) را اجرا مي‌كنيم و كدهاي برنامه را در فايل نت پد مي‌نويسيم. بعد از نوشتن كدهاي برنامه، ما برنامه را با پسوند java. ذخيره مي‌كنيم و سپس توسط كامپايلر جاوا، برنامه را كامپايل مي‌كنيم. در پروسه كامپايل اگر خطاي دستوري در برنامه وجود داشته باشد مشخص مي‌شود و برنامه كامپايل نمي‌شود. اما اگر خطايي در كار نباشد، برنامه كامپايل مي‌شود و كامپايلر جاوا فايلي ايجاد مي‌كند با پسوند class. كه اگر اين فايل class. را اجرا كنيم با كدهايي ناخوانا مواجه مي‌شويم. به اين كدها، كدهاي مياني يا بايت كد گفته مي‌شود. حال اجراي اين بايت كدها بر عهده JVM است. JVM اين بايت كدها را با توجه به نوع سيستم عامل و سخت افزاري كه روي آن نصب است، به زبان ماشين يا همان صفر و يك تبديل مي‌كند و در آخر، برنامه اجرا مي‌شود.

شايد توضيحات بالا براي كساني كه تجربه‌ي برنامه نويسي ندارند، كمي گنگ و نامفهوم باشد. بنابراين اصلا نگران نباشيد، چون در آموزش‌هاي بعدي تمام اين مراحل را به صورت عملي انجام مي‌دهيم.

jvm

نسخه هاي جاوا

جاوا در سه نسخه رسمي ارائه شده است. اين سه نسخه عبارت اند از:
Java SE كه مخفف Standard Edition است و همانطور كه از نامش پيداست، نسخه پايه و استاندارد جاوا است و براي نوشتن هر برنامه‌ي جاوا به اين نسخه احتياج است.
Java ME كه مخفف Micro Edition است. نسخه‌اي براي نوشتن برنامه روي سخت افزارهاي خاص مانند لوازم خانگي، موبايل، اسباب بازي‌ها و ... است. امروزه اين نسخه از جاوا با وجود موبايل‌هاي هوشمند، كمتر مورد استفاده قرار مي‌گيرد.
Java EE كه مخفف Enterprise Edition است. نسخه‌ي مدرن و سازماني جاوا است. از اين نسخه براي نوشتن برنامه‌هاي روي سرور استفاده مي‌شود. در كل Java EE مجموعه اي از تكنولوژي‌ها است و يادگيري اين نسخه از جاوا سخت و زمان‌بر است و بايد سال‌ها به طور عملي كار شود تا بتوان خود را به عنوان يك Java EE كار حرفه‌اي معرفي كرد.

از كدام نسخه شروع كنيم؟

با توجه به توضيحات بالا، مشخص است كه بايد نسخه Java SE را ياد بگيريم. زيرا براي كار كردن با هر يك از دو نسخه ديگر، بايد Java SE را بلد باشيم.
در جلسه آينده ما نحوه نصب و معرفي جاوا به سيستم را آموزش مي‌دهيم.

آموزش بازي سازي: روش‌هاي انتخاب رنگ مناسب

۱۶۸ بازديد

آموزش بازي سازي: روش‌هاي انتخاب رنگ مناسب

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

 

الگوهاي انتخاب رنگ

در يك شكل ساده براي رنگ‌آميزي يك صحنه بايد به چند نكته توجه كنيد. اولين نكته انتخاب يك تركيب مناسب از رنگ‌ها براي تم و اتمسفر كلي صحنه است. در اين نقطه روش‌هاي مختلف انتخاب رنگ‌ها و استفاده‌ي به جاي از آن‌ها مي‌تواند مفيد باشد. مثلا به عنوان نمونه به عكس زير نگاه كرده و براي خودتان حدس بزنيد كه از كدام روش‌ براي انتخاب رنگ‌هاي اصلي تشكيل‌ دهنده‌ي اين تصوير استفاده شده است.dark souls

رنگ‌هاي يكنواخت و نزديك به هم بيانگر استفاده از روش همجواري براي انتخاب رنگ‌ها است. اگر مقاله‌ي قبلي ما با عنوان مقدمه‌اي بر رنگ‌ شناسي را مطالعه كرده باشيد در آن جا ابزاري از شركت آدوبي را به شما معرفي كرديم كه در زمينه‌ي ساخت پالت رنگ مورد استفاده قرار مي‌گرفت. در يك آزمايش ساده و با استفاده از همان ابزار ما از روي عكس بالا به نتايج پايين دست پيدا كرديم.dark souls/colors

با در نظر گرفتن اين نكته كه معمولا دو رنگ سفيد و مشكي را معمولا جزو رنگ‌ها به حساب نمي‌آورند كاملا مشخص است كه روش انتخاب رنگ‌ها براي چنين صحنه‌هايي روش همجواري است. تنها نكته‌اي كه در اين بين بايد مورد توجه قرار بگيرد مبحث شدت رنگ‌ها يا همان انرژي آن‌ها است. مثلا در بازي همانند Dark Souls متناسب با مفاهيم نااميدي و تاريكي و ... ما به سطوح كم انرژي از رنگ‌ها احتياج داريم كه نزديكي رنگ‌هاي انتخاب شده به مركز دايره هم دقيقا همين مسئله را نشان مي‌دهد.

اما برخلاف نمونه‌ي بالا اگر ما بخواهيم يك بازي پر رنگ و لعاب و با رنگ‌هاي متنوع توليد كنيم، به نظر شما كدام روش‌هاي انتخاب رنگ مي‌تواند به درد ما بخورد؟  به عنوان نمونه به بازي Super Mario Odyssey و عكس زير دقت كنيد.

super mario odyssey

با اين كه در اين مرحله رنگ سرخ سياره مريخ كاملا واضح است اما همچنان تنوع رنگي بالايي درون عكس وجود دارد. اگر اين عكس را همانند مرتبه‌ي قبل مورد بررسي قرار دهيم به نتايج زير مي‌رسيم.

super matio odyssey/colors

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

همچنين استفاده از تعداد رنگ بالا به هر جهت هارموني تصوير شما را به هم خواهد زد و منظره شما در ديد مخاطب زيبا جلوه نخواهد كرد. به جاي اين مسئله سعي كنيد با ايجاد تفاوت در سطوح انرژي و كم و زياد كردن روشنايي رنگ‌ها و استفاده از لايه‌بندي، دامنه‌ي استفاده از همان رنگ‌هاي محدود را بيشتر كنيد.

 

لايه‌بندي مناظر

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

ori

مثلا همانند آنچه در تصوير بالا مشخص است، در بازي Ori and the Blind Forest حداقل سه لايه‌ي تصويري وجود دارد كه در نزديك‌ترين لايه به ما سبز تيره قرار دارد كه با حركت به سمت لايه‌ انتهايي اين سبز در طي دو مرحله به سمت روشن شدن تبديل مي‌شود.

در لايه‌بندي مناظر هميشه يكي از لايه‌هاي ما لايه‌ي HUD است كه اطلاعات بازي در آن به نمايش در مي‌آيد. با توجه به ماهيت اين لايه و راحتي تشخيص متمايز بودن آن از ديگر اجزاي بازي به راحتي مي‌توان در آن از رنگ‌هاي تازه استفاده كرد اما باز هم نكاتي براي انتخاب اين رنگ‌ها وجود دارد.

مثلا اگر همان عكس بازي Ori and the Blind Forest را تحليل كنيم مشاهده مي‌كنيم كه رنگي در لايه‌ي HUD بازي مورد استفاده قرار گرفته كه از كنتراست مناسبي به نسبت تمامي اجزاي درون صحنه برخوردار است.ori/colors

دليل اين مسئله هم اين است كه مخاطب بتواند به راحتي هر چه تمام‌تر اين اطلاعات را مشاهده كرده و تصميم‌هاي لازم را درون بازي بگيرد. به عنوان يك نمونه‌ي ديگر مي‌توانيد به عكس بازي Doom و تحليل رنگي آن در پايين توجه كنيد.doom/colors

البته گاهي به دليل تنوع بالاي رنگي موجود در بازي بهتر است به طور كلي با ايجاد يك حاشيه‌ي مناسب تمامي اين بخش را از محيط بازي جدا كنيد. با اين كه اين گونه ممكن است بخش زيادي از نماي ديد بازي شما صرف HUD بازي شود ولي اين مسئله مي‌تواند جلوي بروز تداخل‌هاي رنگي و كاهش خوانايي اجزاي بازي شما را بگيرد. نمونه‌ي اين مسئله را مي‌توانيد در بازي‌هايي همانند Dota 2 مشاهده كنيد.

dota 2

 

نكات پاياني

يكي از مواردي كه در رنگ‌آميزي به خصوص محيط‌ها بهتر است مورد توجه قرار بگيرد، انتخاب رنگ‌هاي نزديك به هم و با كنتراست پايين است. دليل اين مسئله اين است كه تا حد ممكن بتوانيد بدون زحمت مرز‌هاي ميان مدل‌ها و اجزاي محيطي را پوشش دهيد.

مسئله‌ي ديگري كه بايد به آن توجه كنيد اين است كه اگرچه معمولا هر كدام از رنگ‌ها براي مفهوم خاصي مورد استفاده قرار مي‌گيرند ولي چنين چيزي براي همه‌ي شرايط صادق نيست. شما مي‌توانيد با زمينه‌چيني در بازي خود براي رنگ‌ها معني و مفهوم ويژه خودتان را تعريف كنيد. براي همين هميشه براي خروج از چارچوب‌ها آماده باشيد و خلاقيت خودتان را به مواردي كه هست محدود نكنيد.

مورد ديگري هم كه بهتر است آن را جدي بگيريد، تمرين در مسئله‌ي شناخت رنگ‌ها و افزايش كيفيت ديد رنگي خودتان است. مثلا اگر به اين لينك برويد، آزمايشي روبروي شما قرار مي‌گيرد كه در آن بايد با روش‌هاي مختلف رنگ‌هاي مشخص شده را از درون ظرف رنگ‌ها انتخاب كنيد. با چند بار گذراندن اين امتحان مي‌توانيد بفهميد كه در انتخاب چه رنگ‌ها و چه روش‌هايي مهارت بيشتري داريد.

color exp

البته منظور از مهارت همان ديد رنگي شما است كه بسيار اهميت دارد. شما با چشمانتان رنگ‌ها را انتخاب مي‌كنيد و هر چقدر كه قدرت تشخيص رنگي شما بهتر باشد، در انتخاب نيز بهتر خواهيد بود.

به عنوان نكته‌ي آخر به اين موضوع اشاره مي‌كنيم كه هيچ نيازي به اين نيست كه شما همه چيز را از صفر ابداع كرده و به خلاقيت خود فشار بياوريد. گاهي عكس يك منظره و هر چيز ديگري مي‌تواند منبع الهامي براي شما باشد. كافي است عكس آن را گرفته و رنگ‌هاي آن را با استفاده از ابزارهاي گفته شده استخراج كنيد.

color extraction

به همين سرعت و پس از چندين بار امتحان مي‌توانيد پالت رنگ‌هاي خود را تشكيل داده و در عوض زمان بيشتري را روي جنبه‌هاي ديگر بازي خود صرف كنيد. البته هيچ ابزاري بدون خطا و اشتباه نيست و اين ما هستيم كه بايد بهترين نتيجه را از آن‌ها بيرون بكشيم.

11 نكته‌اي كه بايد در هنگام عكاسي و فيلم‌برداري با تلفن همراه در سفر مورد توجه قرار گيرند

۱۵۵ بازديد

11 نكته‌اي كه بايد در هنگام عكاسي و فيلم‌برداري با تلفن همراه در سفر مورد توجه قرار گيرند

هنگامي‌كه به سفر مي‌رويد، ممكن است با منظره‌اي زيبا و يا طبيعتي مطبوع رو به رو شويد و مسلما از ثبت خاطرات خود در قالب تصوير لذت خواهيد برد. تلفن هوشمندتان هم كه ديگر به ياري جداناشدني تبديل شده و هميشه همراهتان است. بنابراين حالا كه همه مواد مورد نياز يعني يك سوژه خوب و ابزار كار را در اختيار داريد، بد نيست تا چند دقيقه‌اي هم مهمان ما باشيد تا با ياد گيري چند راز مهم و اساسي، لذت بيشتر و كيفيت بهتري را تجربه كنيد.

اين روزها براي ثبت تصاويري باكيفيت در هر زمان و هر مكان، وسيله‌اي بهتر از تلفن هوشمند نخواهيد يافت. تقريبا اغلب مدل‌هاي پرچم‌دار و ميان رده از دوربيني 5 تا 13 مگاپيكسلي بهره مي‌برند و براي مصارف روزانه و شخصي، كيفيت بسيار مطلوبي دارند. حتي عكاسي در شب هم به لطف تلفن‌هايي چون لوميا 925 و HTC وان به سادگي قابل انجام است و ديگر با صفحه‌اي سياه رو به رو نمي‌شويد.

اما در كنار همه اين‌ها، هنوز اگر فوت و فن كار را ندانسته و شيوه‌ي بهره برداري صحيح از ابزاري كه در اختيار داريد را ندانيد، باز هم به نتايج دلخواه خود نمي‌رسيد.

در زير 11 مورد از مهم‌ترين رموز موفقيت عكاسان موبايلي را آورده‌ايم كه خواندنشان خالي از لطف نخواهد بود:

1- با برنامه عكاسي كنيد. براي خود هدفي در نظر گرفته و به بيان داستان خود بپردازيد. موضوع عكس مي‌تواند هرچيزي باشد. مهم اين است كه خلاقيت خود را به كار گرفته و با تركيب پديده‌هاي محيطي مانند ابنيه تاريخي يا يك جاذبه طبيعي، حس خود از سفرتان را با ديگران به اشتراك بگذاريد. مطمئن باشيد كه عكس‌هاي بدون موضوع و بي‌هدف، تاثير چنداني بر افراد نخواهند گذاشت.

2- در هنگام فيلمبرداري، حتما تلفن خود را 90 درجه چرخانده و به حالت افقي يا اصطلاحا Landscape فيلبرداري كنيد تا از تمام ظرفيت‌هاي قاب تصوير كمال استفاده را ببريد. فيلمبرداري در حالت پرتره به هيچ وجه توصيه نمي‌شود، مگر اين‌كه بخواهيد با سوژه مورد نظر به مصاحبه بپردازيد!

3- در هنگام فوكوس بر روي شخص يا شيء مورد نظر، به جاي استفاده از بزرگنمايي سعي كنيد فاصله خود را كاهش دهيد.

4- براي عكاسي از چهره‌ي افراد، بهتر است به جاي قرار دادن صورت در مركز و تصوير برداري مستقيم از رو به رو، زاويه‌اي ديگر را انتخاب كنيد. چرا كه در اين حالت چهره فرد پهن‌تر و بيني او تخت به نظر مي‌رسد. با متمايل كردن دوربين به اطراف و اندكي تغيير زاويه، از نتيجه كار خود بيشتر راضي خواهيد بود.

5- اين نكته يكي از رازهاي بزرگ عكاسي است.  هنگام تصوير برداري، خطوط راهنما (Gridlines) را فعال كنيد. در اين حالت، صفحه شما به 9 مربع مساوي تقسيم مي‌شود. حالا قسمت مهم كار: سعي كنيد هميشه سوژه عكاسي را در رديف وسط، بر روي مرز ميان يكي از دو مربع كناري با مربع مياني  قرار دهيد. همانطور كه در تصوير زير مشاهده مي‌كنيد، بهتر است سوژه‌ي اصلي عكس در نقاط حاصل از تقاطع خطوط قرار گيرد. در اين حالت، بيشترين جزئيات و بالاترين اثرگذاري را شاهد خواهيد بود.

tip 5

6- از عكاسي از نزديك (Close-Up) غافل نشويد. آثار باستاني و اشيائ قديمي، گل گياهان، چهره افراد و حتي غذا از موارد بسيار مناسبي هستند كه مي‌توانيد مورد توجه قرار دهيد.

7- در هنگام عكاسي از مناظر، بايد افق يا بخش اعظم منطقه مورد نظر در نيمه پاييني قاب تصوير قرار بگيرد.

2 4

8- گاهي سعي كنيد به جاي تصوير برداري از يك لحظه خاص، از عكاسي پي‌درپي (Burst Mode) استفاده كنيد. بعدا مي‌توانيد عكس‌ها را در نرم افزارهايي چون iMovie يا Movie Maker در كنار هم قرار داده و با افزودن يك آهنگ زيبا، لحظه‌اي رويايي را پديد آوريد.

9- از برنامه‌هاي مانند Vine يا Cinemagram براي ثبت ويديويي 6 ثانيه‌اي بهره ببريد كه در قالب عكسي با فرمت GIF ذخيره مي‌شود. بعدا مي‌توانيد از اين تصوير متحرك در موارد گوناگون و اغلب سرگرم كننده استفاده كنيد.

10- از سه پايه يا يك گيره‌ي تثبيت كننده استفاده كنيد تا از لرزش‌هاي احتمالي جلوگيري شود. براي زوم‌ با درجات بالا نيز به چنين وسيله‌اي نياز خواهيد داشت.

11- هيچگاه اهميت صدا را از ياد نبريد. 50 درصد از يك قطعه ويديويي خوب را صداي آن تشكيل مي‌دهد. بنابراين اگر در كار خود جدي هستيد، خريد يك ميكروفون اضافي را در اولويت قرار دهيد.

اين بود راهنماي ما. اگر شما هم ترفند يا راهكاري مي‌شناسيد، با دوستان خود در زوميت به اشتراك بگذاريد.

چطور ايميل‌هاي خود را رمزنگاري كنيم؟

۱۴۵ بازديد

چطور ايميل‌هاي خود را رمزنگاري كنيم؟

اگر اتصال اينترنتي كه از آن براي ارسال و دريافت ايميل استفاده مي‌كنيد رمزنگاري نشده باقي بماند، در زمان چك كردن نامه‌هاي الكترونيكي، ساير كاربران شبكه قادر هستند با نفوذ به ارتباط شما، نه تنها كلمه عبورتان را بربايند بلكه به كليه پيغام‌هاي رد و بدل شده‌تان نيز دسترسي داشته باشند. اين خطر زماني بيشتر مي‌شود كه از يك محيط عمومي مانند اينترنت بيسيم عرضه شده در مراكزي چون فروشگاه ها، رستورانها و... استفاده مي كنيد. اگر اين مقاله را تا آخر مطالعه فرماييد نه تنها شما را با مسائل اوليه و عمومي در حوزه امنيت داده‌ها آشنا خواهيم كرد، بلكه نحوه رمزنگاري نامه‌هاي الكترونيكي را نيز خواهيد آموخت.

توجه كنيد كه منظورمان از اطلاعات حساس همانا شماره حساب‌هاي بانكي، رموز تجاري و مواردي از اين دست است. اگر مسائل امنيتي را سرسري بگيريد نفوذگران به حساب شما نفوذ كرده و آن را از آن خويش مي كنند، كه مي‌تواند ضررهاي جبران‌ناپذيري را براي شما به همراه داشته باشد. اما گام نخست در حفظ حريم امنيتي چيست؟

قدم نخست: چه مواردي را رمزنگاري كنيم؟

براي تضمين امنيت موثر صندوق پست الكترونيكي تان، نيازمند رمزنگاري سه مورد ذيل هستيد: اتصال اينترنتي، پيغام هايي كه رد و بدل مي‌كنيد و پيام هاي موجود در صندوق پستي تان.

بايد مد نظر داشته باشيد كه استفاده صرف از اتصال اينترنتي ايمن كافي نيست. لازم به ذكر است كه پيام‌هاي الكترونيكي شما در تمام طول مسير (از رايانه شما گرفته تا سرورهاي خدمات دهنده پست الكترونيك) در معرض خطر قرار دارند. بنابراين بهترين گزينه همانا رمزنگاري پيام ها پيش از ارسال آنهاست. بدين ترتيب حتي اگر پيغام ها به دست افراد نااهل هم بيافتد آنها قادر به درك محتواي آن نيستند.

قدم دوم: چطور اتصال اينترنتي خود را رمزنگاري كنيم؟

براي تضمين امنيت اتصال بين ارائه دهنده خدمات پست الكترونيكي و رايانه تان (يا ساير ابزارهايي چون لپ تاب، تبلت، گوشي هوشمند و غيره) بهتر است از اتصال هاي اينترنتي امن SSL و يا TLS استفاده نماييد. اين اتصالات همان ارتباط‌هاي امني است كه در زمان دسترسي به حساب بانكي يا خريد‌هاي اينترنتي تضمين كننده امنيت شماست.

fig1-11351444

در صورتي كه از وب‌ ميل (صندوق پست الكترونيكي مبتني بر وب) استفاده مي‌كنيد، مطمئن شويد كه از طريق ارتباطي امن به صندوق پستي خود متصل شده‌ايد. براي اين منظور بررسي كنيد كه در ابتداي نشاني اينترنتي به جاي http عبارت https وجود داشته باشد. البته بسته به مرورگري كه استفاده مي‌كنيد ممكن است علائم مختلفي را مشاهده نماييد.

اگر پس از ورود به حساب پست الكترونيكي تان هيچ علامتي ملاحظه نكرديد، بررسي كنيد كه آيا در نشاني سايت https وجود دارد يا خير. و اگر پاسخ منفي است، شخصا به جاي http عبارت https را تايپ كرده و دكمه اينتر را بفشاريد. اگر سرويس دهنده ايميلتان داراي ارتباط امن SSL/TLS باشد ممكن است شما در تنظيمات نوع ارتباط را هنوز تعيين نكرده باشيد، براي اين منظور بهتر است به بخش تنظيمات رفته و اين موضوع را بررسي كنيد.

fig3-11351448 

اما اگر از برنامه‌هاي مديريت پست الكترونيك مانند Outlook استفاده مي‌نماييد بهتر است قدري زمان گذاشته و تنظيمات آن را براي استفاده از ارتباطات امن ست كنيد. به همين منظور برنامه را بازكرده به منوي تنظيمات برويد و موارد مربوط به POP/SMTP، IMAP/SMTP و يا HTTP را مد نظر قرار دهيد. در اينجا به دنبال گزينه‌اي براي فعال كردن «رمزنگاري» يا "Encrypt" بگرديد. كه معمولاً ميتوانيد آن را در بخش تنظيمات پيشرفته يافته و لازم است كه پورت‌هاي اتصال را نيز تعيين نماييد.

براي مثال اگر از حساب تبادل ايميل در محل كار استفاده مي نماييد، مي‌توانيد مكان مربوط به تنظيمات امنيتي را در آن بيابيد. اگر اين تنظيمات فعال نشده است، از ارائه دهنده خدمات پست الكترونيكي خود بخواهيد تا سرويسي به شما ارائه كند كه داراي قابليت رمزنگاري SSL/TLS باشد.

قدم سوم: چطور پيام هاي پست الكترونيكي را رمزنگاري كنيم؟

اگر شما نيز دغدغه امنيتي داريد، مي بايست تك‌تك پيام‌هاي پست الكترونيكي خود را رمزنگاري نماييد، اما براي اينكه اين روند به خوبي انجام شود لازم است تا شما و گيرنده هر دو موارد خاصي را تنظيم نماييد.

ضمنا، مي‌توانيد از موارد مربوط به رمزنگاري كه در سرويس دهنده ايميل‌تان موجود است استفاده كنيد يا اينكه نرم‌افزار خاصي را براي رمزنگاري به صورت مجزا تهيه نمايد (Open PGP). از اين گذشته خدمات آنلاين رمزنگاري پست الكترونيك )مانند Sendinc يا JumbleMe) نيز گزينه ديگري است كه پيش روي شما قرار دارد.

public-key-encryption-example

اغلب اشكال رمزنگاري پيام ها مانند S/MIME و يا Open PGP نيازمند آن است كه يك مجوز امنيتي را در رايانه خود نصب نماييد و سپس كاراكترهايي كه كليد عمومي نام دارند را (Public Key) براي افرادي كه ايميل را برايشان ارسال مي‌كنيد، بفرستيد. اين رشته كاركتر ها در واقع يك مدرك امنتي را روي سيستم افراد مورد نظر شما نصب مي‌كند و به اين ترتيب مي‌توانند ايميل شما را مشاهده كنند.

بسياري از برنامه هاي مديريت پست الكترونيكي مانند Outlook از استاندارد S/MIME پشتيباني مي كنند. از اين گذشته، افزونه مرورگرهاي وب مانند Gmail S/MIME مخصوص مرورگر فايرفاكس نيز اين امكان را ارائه مي كند. براي شروع، مي توانيد مجوزهاي امنيتي لازم را از شركت Comodo تقاضا فرماييد.

استاندارد رمزنگاري پست الكترونيكي Open PGP داراي انواع گوناگوني است، كه شامل PGP و GNU مي شود. در صورت تمايل مي توانيد برنامه هاي رايگان و تجاري مناسبي چون GPG4Win يا PGP Desktop Email مخصوص برنامه هاي مديريت پست الكترونيكي روميزي كه از رمزنگاري OpenPGP پشتيباني مي كند را تهيه نماييد.

قدم آخر: چطور نامه هاي ذخيره شده در كامپيوتر را رمزنگاري كنيم؟

اگر از برنامه هاي مديريت پست الكترونيكي در رايانه يا گوشي هوشمند خود استفاده مي‌نماييد لازم است تا از رمزنگاري نامه‌هاي موجود نيز اطمينان حاصل نماييد. بدين ترتيب مطمئن مي‌شويد كه اطلاعات خود را از دسترس نفوذگران دور نگه داشته‌ايد.

از آنجا كه قابل حمل بودن و احتمال گم شدن، يكي از عوامل افزايش دهنده ضريب خطاست، بهتر است كه لپ تاپ يا گوشي هوشمند خود را كاملاً رمزنگاري كنيد. در مقاله بعدي اطلاعات بيشتر در زمينه رمزنگاري رايانه‌هاي مجهز به سيستم عامل ويندوز يا لپ‌تاپ‌ها ارائه خواهيم كرد.

براي گوشي‌هاي هوشمند نيز بهتر است كه از يك سيستم‌عامل مجهز به رمزنگاري بهره ببريد. همچنين لازم است كه براي دسترسي به ايميل و ساير سرويس‌ها نيز كلمه عبوري خاص را تعريف نماييد. براي همين منظور گوشي‌هاي مجهز به iOS و بلك بري مدتهاست كه چنين قابليت هايي را ارائه نموده اند. اما اگر دلبسته آندرويد هستيد براي اين مهم پيشنهاد مي كنيم تا از روايت 3.0 به بعد آن استفاده كنيد. يا اينكه در سيستم‌هاي قديمي تر آندرويد، بهتر است از برنامه هاي مديريت ايميل مناسب (مانند نرم افزار TouchDown) كمك بگيريد.

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

اگر از نسخه‌هاي تجاري و حرفه اي ويندوز استفاده مي‌كنيد مسلماً قابليت رمزنگاري نامه‌هاي الكترونيكي فارغ از نوع برنامه وجود دارد. براي اين منظور از قابليت سيستم رمزنگاري فايل رجوع كنيد. به همين خاطر براي رمزنگاري فايلهاي مربوط به برنامه outlook كافي است فايلهايي با فرمت .PST و .OST را يافته و رمزنگاري كنيد. در سيستم عامل ويندوز xp بهتر است به نشاني

C:Documents and SettingsyourusernameLocal SettingsApplication DataMicrosoftOutlook

و در سيستم عامل ويندوز به نشاني

C:Usersyourusername AppDataLocalMicrosoftOutlook

مراجعه كنيد. پس از يافتن فايلهاي مربوطه كافي است روي آن راست كليك كرده و گزينه Properties را انتخاب و سپس Advanced و در آخر Encrypt Contents to Secure Data را برگزينيد.

fig5-11351437

قابليت EFS يا سيستم رمزنگاري فايل در ويندوز نه تنها مي‌تواند به رمزنگاري فايلهاي انتخابي بيانجامد بلكه هر زمان كاربر به محيط كاربري خود وارد شود تمامي فايل‌ها از اين حالت خارج مي شوند. راستي يادتان باشد پيش از تغيير حساب كاربري و يا تغيير ويندوز حتماً اين قابليت را براي فايل هاي مورد نظر غير فعال نماييد چرا كه پس از تعويض ويندوز ديگر نمي توانيد به آنها دسترسي داشته باشيد.

اگر نرم‌افزار‌هاي بهتري براي رمزگذاري ايميل‌ها سراغ داريد، در بخش نظرات با ما در ميان گذاريد.