عمومي

عمومي

مايكروسافت نرم افزار رقيب Team Viewer براي ويندوز ۱۰ مي‌سازد

۱۸۰ بازديد

مايكروسافت نرم افزار رقيب Team Viewer براي ويندوز ۱۰ مي‌سازد

مايكروسافت در حال توسعه‌ي اپليكيشني با نام Quick Assist براي ويندوز ۱۰ است كه مي‌تواند عملكرد مشابه نرم افزار Team Viewer را براي كاربران ويندوزي به منظور اتصال از راه دور سيستم‌ها فراهم كند.

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

البته اين قابليت در نسخه‌هاي پيشين ويندوز با نام Windows Remote Assistance  وجود داشت اما به نظر مي‌رسد مايكروسافت قصد دارد اين ابزار را از نو طراحي كرده و با نام Quick Assist و به همراه ظاهري جديد، در اختيار كاربران ويندوز ۱۰ قرار دهد. 

عملكرد Quick Assist دقيقا همانند تيم ويوور است؛ زماني كه قصد اتصال به سيستم مورد نظر را داريد، بايد كد لازم را از شخص درخواست كنيد و متقابلا زماني كه قصد داريد كسي به سيستم شما متصل شود، حتما بايد كد Quick Assist خود را در اختيار وي قرار دهيد. اين نرم افزار داراي چندين ويژگي مانند sketching است كه به نظر مي‌رسد براي صاحبان سرفيس بسيار كاربردي خواهد بود. اما در مقابل Quick Assist فاقد ويژگي‌ پركاربرد انتقال فايل بين دو كامپيوتر است كه مايكروسافت اعلام كرده در بروزرساني‌هاي بعدي اين قابليت را نيز اضافه خواهد كرد. 

Quick Assist

به نظر مي‌رسد هنوز اين اپليكيشن براي عرضه‌ي عمومي آماده نبوده و در حال حاضر در بيلد 14352 از نسخه‌ي پيش نمايش اينسايدر ويندوز ۱۰ فراهم شده است. البته Quick Assist در ليست اپليكيشن‌ها نمايش داده نمي‌شود، بنابراين براي استفاده از آن بايد ابتدا كورتانا را باز كرده و عبارت quick assist را جستجو كنيد و از ليست نشان داده شده quick assist را انتخاب كنيد. 

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

يك تلفن HTC One جديد با بدنه بزرگ‌تر، سخت‌افزار قوي‌تر و ظاهري نه چندان دلچسب فاش شد

۱۹۱ بازديد

يك تلفن HTC One جديد با بدنه بزرگ‌تر، سخت‌افزار قوي‌تر و ظاهري نه چندان دلچسب فاش شد

شايعات جالبي در باره نسخه قوي‌تر از تلفن HTC One M8 به بيرون درز كرده است، تلفني كه مي‌گويند قرار است با نام M8 Prime روانه بازار شود. از آنجايي كه منبع اين اطلاعات evleaks است بد نيست جزييات مربوط به آن را مرور كنيم.

اكانت نام‌آشناي evleaks در توييتر، يك تصوير ۳۶۰ درجه از تلفني با نام HTC One M8 Prime را فاش كرده است كه تغييرات قابل ملاحظه‌ را نسبت به مدل فعلي M8 دارد. مشخص‌ترين تغيير ايجاد شده در اين تلفن مربوط به دوربين آن است كه كمي بزرگ‌تر از تلفن‌هاي قبلي One شده است. البته هنوز دوربين ثانويه كه موجب شكل گيري Camera Duo مي‌شود در اين تلفن نيز حفظ شده است.

موضوع دوم ابعاد نسبتا بزرگ‌تر تلفن M8 Prime در مقايسه با M8 فعلي است. بدنه اين تلفن مسطح‌تر از M8 به نظر مي‌رسد و از اين بابت بيشتر شبيه به One Max است. براساس گزارش evleaks تغيير اساسي كه در جايگزين M8 ايجاد شده مربوط به بدنه تركيبي آلومينيوم با سيليكون مايع است كه باعث افزايش مقاومت بدنه تلفن و همچنين جذب گرما مي‌شود. تلفن M8 فعلي، خود از نظر كيفيت ساخت در بالاترين رده قرار داد و حالا اچ‌تي‌سي در M8 Prime باز هم قصد دارد بدنه تلفن خود را با كيفيت بالاتري توليد كند.

هرچند در پست evleaks اطلاعاتي در باره مشخصات فني تلفن M8 Prime ذكر نشده است، اما پيش‌ از اين شاهد شايعاتي در اين باره بوده‌ايم كه به پردازنده Snapdragon 805، حافظه رم ۳ گيگابايت، صفحه نمايش QHD يا ۲۵۶۰ در ۱۴۴۰ پيكسل اشاره داشتند. صفحه نمايش اين تلفن نيز ۵.۵ اينچ گزارش شده است. به اين ترتيب فاصله بين One Max با One M8 Prime بسيار كم خواهد شد و شايد از اين تلفن بتوان به عنوان جايگزين One Max نيز ياد كرد.

نظر شما در باره One M8 Prime چيست؟

اچ‌تي‌سي ساعت هوشمند خود را براساس سخت افزار Toq در MWC 2014 رونمايي مي‌كند

۱۳۸ بازديد

اچ‌تي‌سي ساعت هوشمند خود را براساس سخت افزار Toq در MWC 2014 رونمايي مي‌كند

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

گفته مي‌شود ساعت هوشمند HTC براساس نمونه اوليه از ساعت هوشمند Toq كوالكام ساخته شده است. Toq مجهز به صفحه‌نمايش اختصاصي كوالكام است كه مصرف بسيار بهينه داشته و از تراكم بالايي برخوردار است. نمونه اوليه ساعت هوشمند كوالكام حدود ۵ روز بدون نياز به شارژ باتري دوام مي‌آورد. اين ساعت به صفحه‌نمايش بسيار كم-مصرفي به نام Mirasol تجهيز شده بود. فناوري ميراسول به نحوي است كه مي‌توان تراكم پيكسل‌ها را تا 576ppi افزايش داد و علاوه بر آن شدت روشنايي را به شدت بهبود بخشيد و مصرف باتري را كاهش داد. حال HTC قصد دارد از همين فناوري در ساعت هوشمند خود بهره ببرد. براساس گزارش‌ بلومبرگ ساعت هوشمند HTC از سرويس Google Now پشتيباني نموده و قادر به دريافت دستورات صوتي است.

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

حال بايد تا شروع كنگره جهاني موبايل منتظر ماند و ديد HTC از چه محصولاتي در اين نمايشگاه رونمايي خواهد كرد.

طرح رجيستري گوشي‌هاي موبايل احتمالاً تا پايان خرداد اجرا مي‌شود

۱۵۸ بازديد

طرح رجيستري گوشي‌هاي موبايل احتمالاً تا پايان خرداد اجرا مي‌شود

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

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

معاون وزير صنعت، معدن و تجارت گفت: «در اين طرح بسيار مهم است كه مردم هنگام خريد يا استفاده از گوشي دچار مشكلي نشوند؛ به همين خاطر وزارت ارتباطات و فناوري اطلاعات در ماه‌هاي گذشته با جذب پيمانكاران مختلف، در حال پياده‌سازي و اجراي اين بخش است.»

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

محمود واعظي وزير ارتباطات و فناوري اطلاعات پاييز سال ۹۵ زمان اجراي طرح رجيستري موبايل را بعد از انتخابات و تيرماه ۹۶ اعلام كرده بود. سخنگوي ستاد مركزي مبارزه با قاچاق كالا و ارز نيز در روزهاي پاياني سال ۹۵ از اجراي طرح رجيستري تا تيرماه ۱۳۹۶ خبر داده بود.

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

معرفي بازي موبايل Guns of Boom

۱۵۶ بازديد

بازي موبايل Guns of Boom

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

بازي موبايل Guns of Boom

موسيقي خوب و گرافيك خيره‌كننده‌ي Guns of Boom، باعث شده تا با يكي از بهترين بازي‌هاي شوتر اول شخص موبايلي طرف باشيم

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

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

بازي موبايل Guns of Boom

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

اگر به ‌دنبال يك بازي آنلاين در سبك تيراندازي اول شخص براي موبايل يا تبلت‌تان هستيد تا خود را ساعت‌ها در كنار دوستانتان سرگرم كنيد، مي‌توانيد بدون معطلي و به صورت رايگان بازي Guns of Boom را از اپ استور و پلي استوربراي دستگاه‌هاي خود دانلود كنيد و از آن لذت ببريد.

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

۱۳۵ بازديد

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

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

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

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

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

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

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

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 را به متُد‌ها ارسال كنيد و سعي كنيد محتواي آن‌ها را تغيير دهيد.
 در آخر از كساني كه با زبان جاوا آشنا هستند درخواست داريم تا آموزش‌ها را با دقت مطالعه كنند تا اگر ايرادي در آموزش‌ها بود مطرح كنند تا آن‌ها را برطرف كنيم.

 

سامسونگ فناوري Dolby Atmos محصولات صوتي را در CES 2016 معرفي مي‌كند

۱۶۳ بازديد

سامسونگ فناوري Dolby Atmos محصولات صوتي را در CES 2016 معرفي مي‌كند

سامسونگ، در نمايشگاه CES 2016 نسل جديد محصولات صوتي خود را به نمايش خواهد گذاشت. ساندبار جديد سامسونگ با استفاده از فناوري دالبي اَتمُس (Dolby Atmos) ساخته شده و صداي سه‌بعدي واقعي را به خانه‌ها مي‌آورد.

جان جي‌كيم معاون ارشد بخش صوتي و تصويري سامسونگ الكترونيكس درباره محصولات سامسونگ در سال ۲۰۱۶ گفت:

«سامسونگ با فناوري دالبي اَتمُس (Dolby Atmos) محصول صوتي كم‌نظيري را ارائه كرده است كه با استفاده از آن مي‌توان در كنار تلويزيون‌هاي SUHD تجربه‌اي سرگرم‌كننده و جذاب از محصولات صوتي خانگي داشت.»

ساندبار جديد سامسونگ مدلHW-K950 اولين محصول سامسونگ و همچنين نخستين اسپيكر در صنعت لوازم صوتي است كه از دو بلندگوي بي‌سيم مجهز به دالبي اَتمُس بهره مي‌برد و صدايي ۵.۱.۴ كاناله ارائه مي‌كند. طراحي اين محصول نيز مانند محصولات صوتي پيشين سامسونگ موردتوجه بسياري قرار گرفته است. ارتفاع اين ساندبار تنها ۲.۱ اينچ است و سه بلندگو روبه‌جلو و دو بلندگو رو به بالا دارد. درنتيجه، صدايي قوي براي احاطه‌ي فضاي اتاق ايجاد مي‌كند. اين ساندبار، صدا را با جزئيات بيشتر پخش مي‌كند و اين امكان را دارد تا به‌صورت بي‌سيم به ساب‌ووفر متصل شود و در يك اتاق نشيمن هم كاربري داشته باشد. دگدرو معاون ارشد آزمايشگاه‌هاي دالبي سامسونگ، مي‌گويد:

«اين ساندبار جديد، تجربه‌اي بي‌نظير از صدايي كه در تمامي جهات، و به‌صورت زنده به گوش مي‌رسد براي كاربران به ارمغان مي‌آورد.»

شركت سامسونگ براي طراحي و توليد سري اسپيكرهاي ۳۶۰، از رنگ‌هاي متنوعي بهره برده كه براي هر دكوراسيوني مناسب و جذاب خواهد بود. اين اسپيكرها مي‌توانند صدا را به‌طور يكنواخت در فضا منتشر كنند و همچنين به كمك اپليكيشن به Gear S2 و ساعت‌هاي هوشمند متصل مي‌شوند. علاوه بر اين، اسپيكرهاي ۳۶۰، امكانات جديدي همچون اعلان‌هاي صوتي و تنظيمات سينماي خانگي، نيز به خانه‌هاي هوشمند ارائه خواهند كرد.

تصويري از گلكسي اس 8 در كنار آيفون 6 فاش شد

۱۵۴ بازديد

تصويري از گلكسي اس 8 در كنار آيفون 6 فاش شد

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

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

همان‌طور كه در تصوير بالاي مطلب مشاهده مي‌كنيد، آيفون ۶ در بخش پايين و بالاي نمايشگر خود حاشيه‌هاي زيادي دارد. اما حالا گلكسي اس ۸ به لطف استفاده از طراحي بدون حاشيه، با وجود بهره گرفتن از يك نمايشگر ۵.۸ اينچي، فقط كمي از آيفون ۶ اپل بلندتر است. همان‌طور كه مي‌بينيد، پرچم‌دار بعدي سامسونگ از يك صفحه نمايش خميده بهره مي‌برد و ديگر خبري از دكمه‌ي فيزيكي هوم در اين محصول نيست. سامسونگ در گلكسي اس ۸ دكمه‌هاي ديجيتال را جايگزين فيزيكي هوم كرده است كه البته در تصوير بالا به دليل خاموش بودن دستگاه قابل ديدن نيست. آيفون ۶ در سپتامبر سال ۲۰۱۴ معرفي شد؛  بنابراين شايد فكر كنيد اين مقايسه چندان منطقي نيست. البته بايد در نظر داشته باشيم آيفون ۶ اس كه يك سال پس از آيفون ۶ معرفي شد هم  طراحي مشابهي نسبت به نسل قبلي خود دارد. اگر يك سال جلوتر برويم، به آيفون ۷ مي‌رسيم كه اين گوشي هوشمند نيز حاشيه‌هاي زيادي دارد؛ بنابراين اهميتي ندارد كدام‌يك از گوشي‌هاي اپل را با گلكسي اس ۸ مقايسه كنيم و تفاوت در اين بين بسيار ناچيز است. 

گلكسي اس ۸ در تاريخ ۲۹ مارس (نهم فروردين ۹۶) در طي مراسم Unpacked سامسونگ در شهر نيويورك معرفي خواهد شد. ابن شركت از قبل تأييد كرده است كه گوشي مورد اشاره در اين تاريخ معرفي مي‌شود و احتمالا در اين رويداد، در كنار گلكسي اس ۸ از گلكسي اس ۸ پلاس هم رونمايي خواهد كرد. بر اساس خبرهايي كه تاكنون منتشر شده است، انتظار مي‌رود مدل معمولي پرچم‌دار جديد سامسونگ به نمايشگري ۵.۸ اينچي با رزولوشن كيو اچ‌دي (۲۵۶۰ در ۱۴۴۰ پيكسل) مجهز شود. لازم به ذكر است كه اين صفحه‌نمايش از نوع سوپر امولد و خميده است. از ديگر مشخصات گلكسي اس ۸ مي‌توان به رم ۴ گيگابايتي و سيستم‌عامل اندرويد نوقا اشاره كرد. اين دستگاه بدنه‌اي از جنس فلز و شيشه‌ خواهد داشت و احتمالا سنسور اثر انگشت در بخش پشتي آن قرار خواهد گرفت. علاوه بر اين، گلكسي اس ۸ به تكنولوژي تشخيص چهره مجهز خواهد بود و سامسونگ براي اولين بار دستيار صوتي مبتني بر هوش مصنوعي خود موسوم به بيكسبي را در اين دستگاه ارائه خواهد داد. تمام ويژگي‌هايي كه براي گلكسي اس ۸ انتظار داريم، در مورد گلكسي اس ۸ پلاس هم صدق مي‌كند و فقط اين مدل از صفحه‌نمايشي به ابعاد ۶.۲ اينچ بهره خواهد گرفت.

galaxy s8

اپليكيشن‌هايي براي همه: نرم‌افزارهايي براي كار‌هاي روزانه

۱۴۱ بازديد

اپليكيشن‌هايي براي همه: نرم‌افزارهايي براي كار‌هاي روزانه

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

براي راحتي كار، اپليكيشن‌ها را بر اساس موضوع دسته‌بندي نموده‌ و در هر مقاله به يكي از موضوعات خواهيم پرداخت. پيشتر در چهار مقاله‌ تحت عناوين «اپليكيشن‌هايي براي همه: خبرخوان‌ها»، «اپليكيشن‌هايي براي همه: ويرايشگر تصاوير»، «اپليكيشن‌هايي براي همه: ابزارهاي كاربردي» و و «اپليكيشن‌هايي براي همه: نرم‌افزارهاي كاربردي» به ۲۰ اپليكيشن مختلف اشاره شد. در اين قسمت، با اپليكيشن‌هاي مناسب براي كارهاي روزانه (Lifestyle) آشنا خواهيم شد.

Runkeeper

Runkeeper-02 Runkeeper-01

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

Kindle

Kindle-02 Kindle-01

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

Pocket Weather Australia

PWA-02 PWA-01

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

Zeebox AU

Zeebox-02 Zeebox-01

زي‌باكس، اپليكيشني شبيه به شبكه‌هاي اجتماعي است كه همانند جدول‌ بخش برنامه‌هاي تلويزيوني، جذابترين برنامه‌ها تلويزيوني در  حال بخش را به كاربر نمايش مي‌دهد. اگر با حساب كاربري خود به Zeebox AU وارد شويد، مي‌توانيد با دوستان خود به گفتگو پرداخته و درباره برنامه‌هاي تلويزيوني تبادل نظر داشته باشيد.

Jamie's Recipes

JR-02 JR-01

مواد خوراكي آشپزخانه خود را تعيين خود كنيد تا سرآشپز معروف، جيمز اوليور، از طريق اپليكيشن خود به شما در تهيه يك وعده غذايي فوق‌العاده كمك كند. به كمك راهنما‌هاي گام به گام و آموزش‌هاي اين اپليكيشن به يك آشپز ماهر تبديل خواهيد شد. Jamie's Recipes  شامل ۱۰ بخش مختلف است كه دستورالعمل مختلفي در آن قرار دارد. علاوه بر اين در صورت تمايل، قادر به خريداري بخش‌هاي ديگري همچون، غذا‌هاي بيست دقيقه‌اي يا تهيه يك صبحانه فوق‌العاده نيز هستيد.

اميدواريم اين اپليكيشن‌ها براي شما مفيد باشند. تجربه كاربري خود را درباره اين اپليكيشن‌ها با دوستانتان به اشتراك بگذاريد. آيا اپليكيشن‌هاي مشابه ديگري مي‌شناسيد؟