<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های محمود عباسی</title><link>https://virgool.ir/feed/@mahmoud.abbasi.m</link><description></description><language>fa</language><pubDate>2026-11-12 00:08:31</pubDate><image><url>https://files.virgool.ir/upload/users/33421/avatar/avatar.png</url><title>محمود عباسی</title><link>https://virgool.ir/@mahmoud.abbasi.m</link></image><item><title>سوالات آموزش مبانی جاوا</title><link>https://virgool.ir/@mahmoud.abbasi.m/سوالات-آموزش-مبانی-جاوا-ecf9eua7ubyv</link><description>س ۱ : تاریخچه جاوا چیست؟ چقدر محبوب است؟س ۲ : ویژگی های جاوا چیست؟س ۳ : چگونه جاوا یک زبان مستقل از پلتفرم است؟س ۴ :  JRE، JDK، JVM در جاوا چیست ، و چه تفاوتهایی بین آنها وجود دارد ؟س ۵ : جاوا Bean چیست؟س ۶ : چگونه  custom annotations در جاوا ایجاد کنیم؟س ۷ : interface در جاوا 8 چیست؟س ۸ : تفاوت بین کلاس Abstract و Interface در جاوا 8 چیست؟س ۹ : چند راه برای پیاده سازی Functional Interface در جاوا وجود دارد؟پاسخ سوال ۱ :در اوایل دهه نود، جاوا توسط تیمی به رهبری جیمز گاسلینگ برای Sun Micro-systems (Now Oracle) ایجاد شد. این در ابتدا برای استفاده در دستگاه های تلفن همراه دیجیتال، مانند تلفن های همراه طراحی شده بود. با این حال، زمانی که جاوا 1.0 در سال 1996 برای عموم منتشر شد، تمرکز اصلی آن به استفاده در اینترنت تغییر کرد. با ارائه روشی به توسعه دهندگان برای تولید صفحات وب متحرک، تعامل بیشتری با کاربران فراهم کرد. در طول سالها این زبان به عنوان یک زبان موفق برای استفاده در اینترنت و خارج از اینترنت تکامل یافته است. یک دهه بعد، این زبان هنوز هم با بیش از 6.5 میلیون توسعه دهنده در سراسر جهان، یک زبان بسیار محبوب است. در بیش از 25 سال گذشته جاوا توسط اکثر مشتریان به عنوان بهترین زبان برای توسعه برنامه ها پذیرفته شده است. ویژگی های جاوا به خصوص ویژگی های جاوا 8 باعث محبوبیت بیشتر جاوا در بین مشتریان و کاربران می شود.پاسخ سوال ۲ : 12 کلمه مهم (ویژگی) در جاوا وجود دارد.ساده: یادگیری آسان، بسیاری از ویژگی های دشوار مانند اشاره گرها، مفاهیم وراثت چندگانه از جاوا حذف شده اند.مستقل از پلتفرم: یک بار در هر کجا اجرا شود بنویسید. اگر تغییری در معماری سیستم  (Architecture Neutral)  خود انجام دهید، برنامه جاوا همچنان بدون مشکل اجرا می شود. قابل حمل (Portable): ما می توانیم کد جاوا را به راحتی از ویندوز به لینوکس منتقل کنیم.امن (Secure): به شما امکان می‌دهد برنامه‌هایی ایجاد کنید که نمی‌توان از خارج به آنها حمله کرد.شی گرا (Object Oriented): از JDK 1.8 به بعد جاوا برنامه نویسی تابعی (رویه ای) را نیز در خود جای داده است.چند رشته ای (Multi-threaded): می توانید برنامه هایی را با رشته های فعالیت همزمان بسازید که در نتیجه برنامه هایی با پاسخگویی بسیار بالا ایجاد می شود.قوی (Robust): داشتن عادات برنامه نویسی قابل اعتماد برای ایجاد برنامه های کاربردی بسیار قابل اعتماد.توزیع شده (Distributed): کاربران را برای ایجاد برنامه های کاربردی توزیع شده در جاوا تسهیل می کند. برای ایجاد برنامه های کاربردی توزیع شده از RMI، EJB، CORBA و غیره استفاده می کنیم.تفسیر شده (Interpreted): جاوا قدرت زبان های کامپایل شده را با انعطاف پذیری زبان های تفسیر شده یکپارچه می کند.کارایی بالا (High Performance): کد جاوا پس از کامپایل به بایت کد تبدیل می شود که توسط کامپایلر جاوا بسیار بهینه شده است، به طوری که ماشین مجازی جاوا (JVM) می تواند برنامه های جاوا را با سرعت کامل اجرا کند. قابل تغییر (Dynamic): از بارگذاری پویا کلاس ها پشتیبانی می کند. این بدان معنی است که بارگیری کلاس بر اساس تقاضا اتفاق می افتد.پاسخ سوال۳ :به طور کلی وظیفه کامپایلر در یک زبان برنامه نویسی تبدیل کد منبع به کد قابل فهم ماشین (که کد اجرایی نیز نامیده می شود) است. یک حالت دیگر از کد بین کد منبع و کد قابل فهم ماشین در جاوا وجود دارد که به آن کد بایت می گویند. در واقع تبدیل کد منبع جاوا به کد قابل فهم برای ماشین یک فرآیند دو مرحله ای است. یکی از کد منبع تا بایت کد (فایل کلاس .) است که توسط کامپایلر انجام می شود. سایر موارد از کد بایت تا کد قابل فهم ماشین است که توسط JVM انجام می شود. با این حال JVM نرم افزاری است که به طور خودکار با نصب JDK ارائه می شود.ا JVM  وابسته به پلتفرم است. بنابراین همزمان با تبدیل JVM از کد بایت به کد اجرایی، آن را با پلتفرمی که به آن تعلق دارد سازگار می کند. در این فرآیند کامل دو مترجم وجود دارد که این امکان را فراهم می کند. کامپایلر و JVM. کامپایلر می تواند فایل منبع (فایل جاوا) را بخواند. به طور مشابه JVM می تواند بایت-کد (فایل کلاس .) را بخواند. به دلیل ویژگی شعار جاوا وابسته به پلتفرم در Write Once Run Anywhere (WORA) . همچنین نکات زیر مهم است که در نظر داشته باشید.کد منبع جاوا - بایت کد جاوا مستقل از پلتفرم - کامپایلر جاوا مستقل از پلتفرم - کد اجرایی جاوا مستقل از پلتفرم - ماشین مجازی جاوا وابسته به پلت فرم - نرم افزار جاوا وابسته به پلتفرم (jdk) - برنامه جاوا وابسته به پلت فرم - برنامه نرم افزار جاوا مستقل از پلتفرم - برنامه نرم افزار جاوا مستقل از پلتفرمزبان‌هایی که تبدیل کد منبع به زبان ماشین یک فرآیند واحد است، آن زبان‌ها تحت دسته‌بندی وابسته به پلتفرم مانند C، C++ قرار می‌گیرند.پاسخ سوال ۴ : اول از همه بیایید بفهمیم که کاربرد این اصطلاحات در جاوا چیست. JRE (Java Runtime Environment) به ما کمک می کند تا کد کامپایل شده را در جاوا اجرا کنیم در حالی که JDK (کیت توسعه جاوا) به ما در کامپایل و اجرای کد کمک می کند. از این رو اگر می خواهید کدهای از قبل کامپایل شده مانند کدی به شکل jar/war/ear اجرا کنید، فقط JRE کافی است. از طرف دیگر اگر بخواهید کد خود را کامپایل و سپس اجرا کنید، باید JDK را در سیستم خود داشته باشید. JVM (ماشین مجازی جاوا) به ما کمک می کند تا کد کامپایل شده (کد بایت) را به کد زبان ماشین تبدیل کنیم. JRE شامل JVM و JDK حاوی JRE است.JRE = Java API + JVM &#xA;JDK = کامپایلر + JRE &#xA;JVM = مترجم + JITا (JVM) برنامه جاوا را با کمک مترجم اجرا می کند.JIT (کامپایلر Just in time) به مفسر کمک می کند تا زمانی که کند است سریع اجرا شود.Java API برنامه های از پیش تعریف شده ای مانند String، System، Thread، Exception، FileInputStream، FileOutputStream، ArrayList، Collections و غیره را حمل می کند.پاسخ سوال ۵ :ا (Java Bean) یک کلاس کمکی ساده جاوا است که برای انتقال داده ها بین کلاس ها یا برنامه ها استفاده می شود. هرگز به عنوان یک کلاس اصلی عمل نمی کند، بلکه مانند پستچی یا تحویل دهنده بین دو کلاس است. هیچ منطقی در آن نیست برای اینکه بیش از 3 مقدار را از یک کلاس به کلاس دیگر یا از یک پروژه به پروژه دیگر منتقل کنیم، باید از Java beans پشتیبانی کنیم. اگر مقدار کمتر از 3 باشد، باید از آرگومان های متد برای انتقال داده ها استفاده کنیم. با این حال یک طراحی خوب در جاوا به ما توصیه نمی کند که بیش از 3 پارامتر متد داشته باشیم. شما می توانید کتابخانه جاوا (java doc) را بررسی کنید، در یک متد بیش از 3 پارامتر پیدا نمی کنید، به ندرت ممکن است 4 پارامتر داشته باشد اما بیشتر از آن نباشد.چند دستورالعمل استاندارد برای توسعه کلاس Java Bean وجود دارد:1. باید جاوا Bean را به عنوان یک کلاس عمومی اعلام کنیم.2. این یک توصیه برای پیاده سازی java.io.Serializable است (برای ارسال داده ها در سراسر شبکه استفاده می شود زیرا ما به راحتی می توانیم داده های سریال سازی را از طریق شبکه ارسال کنیم). اگر نمی خواهید داده ها را از طریق شبکه ارسال کنید اختیاری است.3. همه متغیرهای عضو (ویژگی های bean) باید خصوصی و غیر ایستا باشند (اگر بخواهیم داده های 20 کارمند را ارسال کنیم، 20 مقدار ارسال می شود. اگر استاتیک آن فقط یک مقدار ارسال می شود، بنابراین اعلام غیر ایستا اجباری می شود. برای بهره مندی کامل از Java Bean)4. همچنین هر ویژگی bean باید یک متد تنظیم کننده و یک متد دریافت کننده (Accessor Methods) داشته باشد.پاسخ سوال ۶ :همانطور که در اسنپ کد زیر نشان داده شده است باید یک رابط با &#39;@&#39; ایجاد کنیمMyCustomAnnotation.javaimport java.lang.annotation.ElementType;&#xA;import java.lang.annotation.Retention;&#xA;import java.lang.annotation.RetentionPolicy;&#xA;import java.lang.annotation.Target;&#xA;&#xA;@Retention(RetentionPolicy.SOURCE)&#xA;@Target(ElementType.TYPE)&#xA;public @interface MyCustomAnnotation {&#xA;&#xA;&#x9;int studentAge() default 18;&#xA;&#x9;String studentName();&#xA;&#x9;String stuAddress();&#xA;&#x9;String stuStream() default &#34;CSE&#34;&#xA;}&#xA;اکنون بیایید این حاشیه نویسی سفارشی را در کلاس &#34;MyClass&#34; اعمال کنیم. در زیر کد است.MyClass.java@MyCustomAnnotation(studentName=&#34;Elbert&#34; stuAddress=&#34;California&#34;)&#xA;public class MyClass{&#xA;&#xA;}برای یادگیری کامل حاشیه نویسی و نحوه ایجاد حاشیه نویسی سفارشی، لطفاً از آموزش Annotations In Java استفاده کنید .پاسخ سوال ۷ :اینترفیس ها یک توافق بین کلاس و دنیای بیرون را تشکیل می دهند و این توافق در زمان ساخت توسط کامپایلر اجرا می شود. در برنامه نویسی شی گرا، گاهی اوقات تعیین اینکه یک کلاس باید چه کاری انجام دهد، اما نه اینکه چگونه آن را انجام دهد، مفید است. سپس از Interfaces استفاده می کنیم. مشخص می کند که چه کاری باید انجام شود، اما نه چگونه. هنگامی که یک رابط تعریف شد، هر تعداد کلاس می توانند آن را پیاده سازی کنند. همچنین یک کلاس می تواند هر تعداد اینترفیس را پیاده سازی کند.از جاوا 8 به بعد، یک رابط می تواند متدهای انتزاعی یا پیش فرض(default) یا ایستا (static) یا هر ترکیبی از دو یا همه آنها داشته باشد. برای پیاده سازی یک اینترفیس، یک کلاس باید پیاده سازی هایی را برای متدهای انتزاعی توصیف شده توسط اینترفیس ارائه دهد. هر کلاس در تعیین جزئیات پیاده سازی خود آزاد است. بنابراین، دو کلاس ممکن است یک رابط یکسان را به روش‌های مختلف پیاده‌سازی کنند، اما هر کلاس همچنان از مجموعه روش‌های مشابهی پشتیبانی می‌کند. به عنوان مثال به کد زیر توجه کنید..interface  Java8 {&#xA;&#x9;&#xA;&#x9;void m1(); //abstract by default as it has no body&#xA;&#x9;&#xA;&#x9;default void m2() {&#xA;&#x9;&#x9;//introduced in java 8 with body&#xA;&#x9;}&#xA;&#x9;&#xA;&#x9;static void m3() {&#xA;&#x9;&#x9;//introduced in java 8 with body&#xA;&#x9;}&#x9;&#xA;}همانطور که در قطعه کد نشان داده شده است و بر خلاف رابط‌های تا جاوا 7، از جاوا 8 به بعد جدا از روش‌های انتزاعی، اکنون یک رابط می‌تواند متدهای پیش‌فرض و ایستا با بدنه‌های متد داشته باشد.پاسخ سوال ۸ :پس از یادگیری Interfaces در زمینه جاوا 8، ممکن است یک شک در ذهن شما ایجاد شود که تفاوت بین کلاس های رابط و انتزاعی پس از معرفی روش های پیش فرض و استاتیک چیست. بیایید شک را از جدول زیر برطرف کنیم:پاسخ سوال ۹:پنج راه برای پیاده سازی Functional Interface در جاوا وجود دارد.1. توسط کلاس بیرونی صریح2. توسط کلاس داخلی صریح3. توسط کلاس داخلی ناشناس4. توسط بیان لامبدا (Lambda expression)5. مرجع با روش (Method Reference)</description><category>محمود عباسی</category><author>محمود عباسی</author><pubDate>Mon, 15 Nov 2021 18:43:25 +0330</pubDate></item><item><title>آموزش برنامه نویسی اسکالا (2)</title><link>https://virgool.ir/@mahmoud.abbasi.m/آموزش-برنامه-نویسی-اسکالا-2-z8f83fr6kfui</link><description>حتما مطالب قبلی را مطالعه بفرمایید در ادامه بحث لیستها ، به معرفی چندین متد در لیست اشاره میکنیم این متد چی هست و کارش چی هست List() or Nil   لیست خالی هستList(&#34;Cool&#34;, &#34;tools&#34;, &#34;rule&#34;)  یک لیست جدید از جنس [List[Sringایجاد کرده و سه تا مقدار درداخل آن قرار داده استval thrill = &#34;Will&#34; :: &#34;fill&#34; :: &#34;until&#34; :: Nilیک لیست جدید از جنس [List[Sringایجاد کرده و سه تا مقدار درداخل آن قرار داده استList(&#34;a&#34;, &#34;b&#34;) ::: List(&#34;c&#34;, &#34;d&#34;) ترکیب دوتا لیست از جنس [List[String و ایجاد یک لیست جدید شامل &#34;d&#34;,&#34;c&#34;,&#34;b&#34;,&#34;a&#34;thrill(2)برگرداندن عنصر دوم که پایه آن 0  می باشد.و که مقدار &#34;until&#34; را بر می گرداند.thrill.count(s =&gt; s.length == 4)تعداد عناصر thrill را که طولشان 4 می باشد ،  می شمارد. و مقدار 2 را برمیگرداند.thrill.drop(2)دوتا عنصر اول را برنمی گرداند و عنصر سوم را برمی گرداند .(&#34;List(&#34;until thrill.dropRight(2)دوتا عنصر از سمت راست را برمی دارد و یک عنصر بر میگرداند.(&#34;List(&#34;Willthrill.exists(s =&gt; s == &#34;until&#34;)تمام عناصر موجود در thrill را که با مقدار &#34;untill&#34; یکی باشد  true برمی گرداند.thrill.filter(s =&gt; s.length == 4)لیست از تمام عناصز از لیست راکه طول رشته انها چهار تا می باشد برمیگرداند.(&#34;List(&#34;Will&#34;, &#34;fillthrill.forall(s =&gt;s.endsWith(&#34;l&#34;))نشان میدهد همه عناصر که انتهای انها به &#34;I&#34; ختم شده باشد true  بر می گرداند.thrill.foreach(s =&gt; print(s))دستور print  را بروی تمام عناصر آرایه اجرا میکند. &#34;Willfilluntil&#34; را چاپ میکند.thrill.foreach(print) این دستور نیز همان کار دستور بالا را انجام می دهد.thrill.head  اولین عنصر از thrill را میدهد  &#34;Will&#34;thrill.initلیستی از همه ، جز آخرین عنصر در را برمی گرداند. (&#34;List(&#34;Will&#34;, &#34;fillthrill.isEmptyنشان می دهد که thrill خالی هست یا نه و مقدار false  را برمی گرداند.thrill.lastآخرین عنصر لیست را برمی گرداند &#34;until&#34;thrill.length  تعداد عناصر در لیست را بر می گرداند که مقدار 3 می باشدthrill.map(s =&gt; s + &#34;y&#34;)  یک تناظر یک به یک به عناصر لیست که مقدار &#34;y&#34; را به تمام عناصر String اضافه میکند و لیست جدید می دهد.(&#34;List(&#34;Willy&#34;, &#34;filly&#34;, &#34;untilythrill.mkString(&#34;, &#34;)یک رسته جدید با عناصر thrill که با &#34; ,&#34; از هم جدا شده اند را می سازد. &#34;Will, fill, until&#34;thrill.remove(s =&gt; s.length == 4)لیستی از همه عناصری را برمیگرداند که  رشته ای به طول 4  نباشد. (&#34;List(&#34;untilthrill.reverseتمام عناصر را بصورت برعکس برمیگرداند. (&#34;List(&#34;until&#34;, &#34;fill&#34;, &#34;Willthrill.sort( (s, t) =&gt;s.charAt(0).toLower &lt; t.charAt(0).toLower)یک لیست از تمام عناصر رابصورت مرتب برمبنای حروف الفبا و حروف کوچک بر میگرداند. List(&#34;fill&#34;, &#34;until&#34;, &#34;Will&#34;))thrill.tail تمام عناصر بغیر از عنصر اول را بر می گرداند.  (&#34;List(&#34;fill&#34;, &#34;untilاستفاده از tuplesیک object مفید دیگه tuple ها هستند.شبیه لیست میباشد.tuple ها غیر قابل تغییر هستند اما نه شبیه List ها.tuple  ها می توانند شامل انوع type  ها  در عناصر باشند.  در حالیکه  یک لیست میتواند شامل [List[String و یا [List[Int  باشد.در صورتیکه یک tuple  میتواند در یک لحظه شامل Integer , String باشد.tuple  ها خیلی مفید هستند . برای مثال اگر شما بخواهید چندین object از یک متد را برگردانید .در حالیکه در جاوا شما اغلب ایجاد میکنید یک JavaBean ، شبیه کلاس برای نگهداشتن چندین مقدار برای برگرداندن،در صورتیکه شما در اسکالا خیلی ساده با یک tuple بر می گردانید. و ان خیلی ساده است ، یک tuple  به تعداد object هایی که می خواهیم ، ایجاد میکنیم فقط object ها را درون پارانتز ، و با کاما از هم جدا میکنیم.وقتی شما یکبار یک tuple  را مقدار دهی میکنید.شما میتوانید به عناصر آن دسترسی داشته باشید بصورت با یک ._   با یک ایندکس از عناصر ، به مثال زیر دقت کنیم :ایجاد کردن و استفاده از tupleدر خط اول شما یک tuple تعریف کردین شامل عدد99 Integer که اولین عنصر می باشد و بعدی String که &#34;Luftballons&#34; میباشد و دومین عنصر می باشد.اسکالا استنتاج میکند  این [Tuple2[Int, String و نوع متغیر را همچنین در pair  قرار میدهدخط دوم شما دسترسی دارین به  فیلد _1  که تولید شده برای عنصر اول یعنی مقدار 99 ، &#34;.&#34; در اینجا نقش دسترسی به عناصر را به شما میدهد .و یا اینکه یک متدی را اجرا کنید.در این مورد شما دسترسی دارین به عناصر فیلد ها با _1 ، درصورت اجرای این اسکریپت شما به داده زیر دسترسی خواهید داشت. 99 Luftballonsنوع واقعی یک tuple  به تعداد عناصر و نوع عناصر آن بستگی دارد.بنابراین نوع (99, &#34;Luftballons&#34;) یک تاپل دوعنصری می باشد [Tuple2[Int, String  و نوع این داده (&#39;u&#39;, &#39;r&#39;, &#34;the&#34;, 1, 4, &#34;me&#39;) یک  Tuple6[Char, Char, String, Int, Int, String]   تایی می باشد. توجه داشته باشیم که هر نوع tuple  رو می توانیم ایجاد کنیم که در اسکالا تا Tuple22 می توانید بسازید.دسترسی به عناصر یک Tuple : ممکن هست شما تعجب کنید که چرا نمی توانید به عناصر یک Tuple  شبیه یک لیست دسترسی داشته باشید.از طریق &#34;(pair(0&#34; ، بخاطر اینکه یک لیست متد apply همیشه یک نوع برمی گردونه، اما یک Tuple  می تواند انواع مختلفی برگرداند._1  یک نوع بر گرداند و _2 یک نوع دیگه بر می گرداند.بنابراین_N تعداد هر کدام می تواند انواع مختلفی داشته باشند و یک نوع واحد نداشته باشند.استفاده از sets و maps:از انجا که اسکالا هدفش کمک به شما در مورد برنامه نویسی تابعی و سلسه مراتبی هست.بنابراین مجموعه ای از کتابخانه هه ساخته شده که اشاره میکند به مجموعه های قابل تغییر و غیر قابل تغییر .برای مثال آرایه ها همیشه هستند قابل تغییر و لیست ها همیشه هستند غیر قابل تغییر، اسکالا فراهم کرده قابل تغییر و غیر قابل تغییر را برای set ها و map ها، اما از اسامی ساده یکسان برای هر دو نسخه استفاده می کند.برای setها وmap ها ، اسکالا از مدل تغییر پذیر در ساختار کلاس استفاده میکند.برای مثال ، api اسکالا یک خصوصیت (trait) پایه ای برای set ها در نظر گرفته است.جایی که یک trait  شبیه یک interface  در جاوا می باشد.اطلاعات بیشتر رو بعدا در این مورد صحبت خواهیم کرد.بعدا اسکالا دوتا subtrait برای set ها ایجاد کرده یکی برای قابل تغییر (mutable)  و دیگری برای (immutable) که در شکل پایین می توانید ببینید.این سه تا ویژگی همه با یک اسم ساده Set  مشترک هستند.با اینحال که نام کامل آنها کاملا از هم متفاوت هستند ، زیرا هر کدام در یک package متفاوت قرار دارد.کلاسهای set همچون کلاسهای hashset در اسکالا api میباشد که در شکل زیر می بینید. هردو trait  قابل تغییر و غیر قابل تغییر از set توسعه داده شده است. اگرچه شما در جاوا interface ها رو پیاده سازی کرده اید، اما شما در اسکالا extend یا mix in  کردین trait  ها رو.ساختار سلسله مراتب set  در اسکالابنابراین ، اگر شما از یک Hashset استفاده کنید.شما میتوانید بر مبنای نیاز خودقابل تغییر و یا غیر قابل تغییر استفاده کنید.برای تعریف کردن یک set به مثال زیر توجه کنید:ایجاد کردن و مقدار دهی اولیه کردن و استفاده کردن از set  غیر قابل تغییر (immutable)در اولین خط کد شما تعریف کردین یک متغیر var بنام jetSet، و مقدار دهی کردین آن بصورت  immutable ، شامل دو تا مقدار &#34;Boeing&#34; و &#34;Airbus&#34; ، در این مثال ما به شما نشان می دهیم که شما مثل لیست ها و ارایه ها می توانید  set ها را نیز تعریف کنید.با استفاده از متد apply شما اینکار را روی companion object انجام دادید.شما apply  را روی companion object برای   scala.collection.immutable.Set ایجاد میکنید ( companion object : یعنی اینکه اگر بخواهیم فیلد یا خاصیتی ایجاد کنیم که در همه نمونه‌های کلاس قابل دسترسی باشد از کلمه کلیدی companion استفاده می‌کنیم ) که  یک نمونه از یک Set  immutable  را بصورت پیش فرض بر می گرداند. مفسر اسکالا  نوع jetSet رو از [immutable Set[String استنتاج میکند.برای اضافه کردن یک عضو به یک set  از &#34;+ &#34; میتوانید استفاده کنید.هر دو مدل mutable و immutable از &#34;+&#34;  استفاده میکنند.اما رفتار متفاوتی دارند.با اینحال mutable ها اضافه میکنند عناصر رو به خودشان و immutable ها وقتی یک عنصر جدید اضافه میکنند به یک لیست جدید می سازند و مقدار جدید نیز در داخل آن قرار می گیرد و بر می گرداند.شما با immutable set  کار میکنید بنابراین &#34;+&#34; یک مجموعه جدید را فراخوانی و ایجاد میکند.با اینکه mutable set  ها به خودشان مراجعه میکنند .ولی immutable  ها اینکار را انجام نمی دهند.در این مورد ، در خط دوم کد “jetSet&#34; += &#34;Lear&#34; اساسا فرم کوچک شده مورد زیر می باشد.&#34;jetSet = jetSet + &#34;Lear ، در خط دوم شما مجدد مقدار jetSet  رو با یک set جدید جایگذین میکنید.و در نهایت در خط آخر  شما دنبال یک set  که نیست و مقدار false  رو چاپ می کند.اگر شما بخواهید یک set قابل تغییر (mutable) درست کنید ، با توجه به شکل زیر عمل میکنیم:ایجاد کردن و مقدار دهی اولیه کردن و استفاده کردن از set قابل تغییر (mutable)  در خط اول شما کلاس مربوط به mutable  را وارد می کنید.همانند جاوا، شما می توانید یک کلاس را وارد کنید و از نام آن استفاده کنید.همانند Set، بجای اینکه از کل آدرسش در برنامه استفاده کنیم.می توانیم کوچک شده ان را استفاده کنیم.دز خط  دوم وقتی شما دارید Set رو انجام میدهید کامپایلر اسکالا scala.collection.mutable.Set را می فهمد.شما متغییر movieSet را با دوتا مقدار Hitch و Poltergeist مقدار دهی اولیه میکنید.در خط بعدی ما Sherk  رو به Set با عملگر += اضافه می کنیم.همانطور که قبلا گفته شد، عملگر += برای Set قابل تغییر تعریف شده است.شما اگه بخواهید می توانید به جای movieSet += &#34;Sherk&#34;  از دستور زیر نیز استفاده کنید: (&#34;movieSet.+=(&#34;Shrek  اگرچه پیاده سازی های پیش فرض برای Set برای روشهای قابل تغییر و غیر قابل تغییر بصورت factory تنظیم شده است ، برای بیشتر مواقع این تنظیمات کافی خواهد بود.گاهی اوقات شما ممکن هست یه کلاس set  explicit لازم داشته باشید.خوشبختانه، نحوه نوشتن شبیه هم هست.به سادگی کلاسی که لازم داریدimport می کنید.و از متد factory  روی آن object استفاده می کنید.اگه شما یک setغیرقابل تغییر لازم داشته باشید باید اینکار رو انجام بدهید:import scala.collection.immutable.HashSet&#xA;val hashSet = HashSet(&#34;Tomatoes&#34;, &#34;Chilies&#34;)&#xA;println(hashSet + &#34;Coriander&#34;)یک مجموعه مفید دیگه در اسکالا Map می باشد.با sets اسکالا mutable , imutable را برای map فراهم میکند.یک کلاس سلسه مراتبی استفاده می کنیم.ساختار سلسله مراتبی Mapکه اگر شکل رو نگاه کنیم این شکل خیلی شبیه به یکی از شکل های set  می باشد.یک trait برای map در scala.collection  وجود دارد.و دوتا subtrait برای maps وجود دارد: یک map قابل تغییر در scala.collection.mutable و یک map  غیر قابل تغییر در  scala.collection.imutable قرار دارد.پیاده سازی های Map ، همچون Hashmaps نشان داده شده در شکل بالا می تواند trait قابل تغییر و غیر قابل تغییر  را توسعه می دهد .شما می توانید ایجاد کنید و مقداردهی کنید map را با استفاده از method factory شبیه arrays, lists ,sets برای مثال میتوانید ببینید:ایجاد میکنیم map و مقدار دهی میکنیم و استفاده میکینم از یک mutableدر خط اول شما mutable map رو اضافه کردین و سپس یک متغیر val از جنس map با دوتا پارامتر یکی int بعنوان کلیذ  ,  یکی دیگه مقدار ، با نام treasureMap ایجاد کردیم.map خالی هست چون شما چیزی رو به factory method  پاس نکردین.و () در Int,String]   map] خالی میباشد.در 3 خط بعدی شما key/value  رو با عملگرهای  -&gt;  و += به treasureMap اضافه کردین.با توجه به توضیحات قبلی کامپایلر اسکالا یک عبارت عملگر دودیی  Go to island.&#34;    &lt;- 1&#34;     تبدیل میشود به (1). -&gt; (&#34;Go to island.&#34;) بنابراین وقتی شما می نوسید  1 -&gt; &#34;go to island &#34; یعنی شما یک متد -&gt; را صدا میکنید که روی متغیر int با مقدار 1 و &#34;go to island &#34; را به آن انتصاب میکنید.شما از متد -&gt; در هر جایی از برنامه های اسکالا میتوانید استفاده کنید.که یک tuple دو عنصری شامل key/value بر می گرداند.شما سپس این tuple دوعنصری را با متد =+ در متغییر treasureMap قرار می دهید.در نهایت در خط آخر مقدار کلید 2 را از متغیر treasureMap مطابقت داده و مقدار Find big X on ground.  در خروجی چاپ می کند.اگر شما ترجیح بدهید یک map immutable استفاده کنید ،لزومی نداره import انجام بدهید.immutable در map بصورت پیش فرض می باشد.به مثال زیر توجه کنید :ایجادو مقدار دهی اولیه و استفاده ار map (غیر قابل تغییر)در این کد دیگه import  انجام نمی دهیم.در خط اول وقتی شما Map رو صدا میکنید بصورت پیش فرض a scala.collection.immutable.Map  میباشد.شما 5 تا tuples را به متد map factory نگاشت میکنید.که map immutable شامل جفت مقادیر عناصر می باشد را بر می گرداند.اگر کد بالا را اجرا کنیم IV را بر می گرداند.شناخت سبک یادگیری functionalهمانطور که پیشتر گفته شد، اسکالا به شما اجازه میدهد سبک کد نویسی خود رو بهتر کنید.و شما رو تشویق میکند که یک سبک پر کاربردی رو استفاده کنید.اگه شما از یک زبان برنامه نویسی دیگه به این سمت امده اید ،اگر شما یک برنامه نویس جاوا هستید ، یکی از اصلی ترین مشکل شما این است که چگونه به سبک functional برنامه بنویسید.ما به شما راهنمایی های خیلی زیادی را در این نوع برنامه نویسی به شما یاد خواهیم داد.این کار به بخشی از کار شما احتیاج دارد ، و ما شما را به تلاش برای انجام این کار تشویق می کنیم. اگر از قبل زمینه برنامه نویسی دارید ، ما معتقدیم یادگیری برنامه نویسی به سبک functional نه تنها شما را یک برنامه نویس بهتر Scala  می نماید ،بلکه  افق های شما را گسترش می دهد و به طور کلی شما را به یک برنامه نویس بهتر، تبدیل می کند.اولین قدم شناخت تفاوت بین دو سبک در برنامه نویسی است،اگه در برنامه خودتون مقدار زیادی vars وجود داشته باشد ، به احتمال زیاد یک مدل برنامه نویسی imperative  است. اگر در کد خودتون به هیچ وجه vars وجود نداشته باشد.این یک سبک برنامه نویسی تابعی می باشد. بنابراین ، یک راه برای حرکت به سمت برنامه نویسی functional ، تلاش برای برنامه ریزی بدون vars است. اگر پس زمینه برنامه نویسی  مانند Java ، C ++ یا C # هستید، ممکن است متغیر vars را به عنوان یک متغیر عادی و vals را به عنوان نوع خاصی از متغیر درنظر بگیرید. از طرف دیگر ، اگر چس زمینه برنماه نویسی تابعی شما  مانند هاسکل ، OCaml یا Erlang استفاده می کنید ، ممکن استvals  به عنوان یک متغیر عادی و var را متغیر وابسته بدانید. با این وجود ، دیدگاه Scala این است که Val و var فقط دو ابزار مختلف در جعبه ابزار شما هستند که هم مفید هستند و هم ذاتاً مشکل ساز نیستند. اسکالا شما را تشویق می کند که به سمت vals حرکت کنید ، اما در نهایت با توجه به شغل موجود ، به بهترین ابزار دسترسی خواهید یافت. حتی اگر با این فلسفه متعادل موافق باشید ، هنوز هم ممکن است در ابتدا این مسئله را چالش برانگیز بدانید که چگونه می توانید از شر کد های خود خلاص شوید. مثال حلقاه رو در نطر بگیرید که قبلا گفته شده بود در نطر می گیریم:که از vars استفاده کرده و یک سبک برنامه نویسی قدیمی میباشد.def printArgs(args: Array[String]): Unit = {&#xA;var i = 0&#xA;while (i &lt; args.length) {&#xA;println(args(i))&#xA;i += 1&#xA;}&#xA;}که با یک تغییر جزیی می توانیم به یه مدل تابعی تبدیل کنیمdef printArgs(args: Array[String]): Unit = { &#xA;for (arg &lt;args) &#xA;println(arg) &#xA;}ویا def printArgs(args: Array[String]): Unit = {&#xA;args.foreach(println)&#xA;}این مثال یک مزیت برنامه نویسی را با تعداد vars نشان می دهد.کد اصلاح شده (functional) واضح تر ، مختصر تر و دارای خطای کمتری نسبت به کد اصلی (معمولی) است. در حقیقت دلیل اینكه اسكالا یك سبك functional را تشویق می كند این است كه سبك functional به شما كمك می كند تا كدی ساده قابل فهم و خطای كمتری بنویسید.هرچند می توانید حتی فراتر بروید.  دستور pringArgs را اگر refactored (بازبینی) کنیم این دستور صرفا functional نیست  ، زیرا دارای عوارض جانبی(side effect) است - در این حالت ، اثر جانبی آن چاپ به جریان خروجی استاندارد است. علامت یک عملکرد با عوارض جانبی این است که نوع نتیجه آن Unit است. اگر یک  تابع هیچ خروجی رو برنگرداند ،بدین معنی می باشد نوع خروجی از جنس Unit می باشد ، تنها راهی که این تابع می تواند تغییر ایجاد کند، استفاده از نوعی اثر جانبی است. یک روش کاربردی تر تعریف متدی است که آرگومان های منتقل شده را برای چاپ قالب بندی می کند ، اما فقط رشته فرمت شده را باز می گرداند ،تابع زیر را در نظر بگیریم :def formatArgs(args: Array[String]) = args.mkString(&#34;\n&#34;)یک تابع بدون side effect و بدون استفاده از متغیر vars، تابع mkString که شما می توانید انرا صدا کنید روی مجموعه تکرار ها (شامل arrays, lists, sets, و maps) که برمیگرداند یک String که شامل نتیجه صدا کردن تابع toString روی هر عنصر می باشد.که با یک جدا کننده این کار انجام می شود.بنابراین اگر ارگومان ورودی شامل عناصر  &#34;zero&#34;, &#34;one&#34;, &#34;two&#34; باشد خروجی تابع formatArgs  این خواهد بود &#34;zero\none\ntwo&#34; در حقیقت این تابع دستور print تابع printArgs که قبلا گفته شد را ندارد ، اما خیلی ساده می توانید انرا انجام بدهید.((println(formatArgs(args هر برنامه مفید به احتمال زیاد دارای عوارض جانبی به نوعی خواهد بود ، زیرا در غیر این صورت قادر به استفاده برای دنیای خارج نیست.ترجیح دادن روشها بدون  side effect شما را به سمت طراحی برنامه هایی تشویق می کند که در آن کد اثر side effect به حداقل برسد.یکی از مزایای این روش این است که می تواند برنامه های شما را برای تست آسان تر ،کمک کند. به عنوان مثال ، برای تست هر یک از سه روش printArgs که در این بخش در ابتدا نشان داده شده است ، شما نیاز به تعریف مجدد println دارید ، خروجی منتقل شده به آن را ضبط کنید ، و مطمئن شوید که این همان چیزی است که انتظار دارید. در مقابل ، شما می توانید عملکرد formatArgs را به سادگی تست کنید.val res = formatArgs(Array(&#34;zero&#34;, &#34;one&#34;, &#34;two&#34;))&#xA;assert(res == &#34;zero\none\ntwo&#34;)متد assert اسکالا متغیر Bollean  را چک میکند اگر خروجی false باشد خطای AssertionError رو بر می گرداند و اگر خروجی true  باشد چیزی را بر نمی گرداند.در مورد استثنا ها و خطا ها بعدا صحبت می کنیم.این رو در نظر داشته باشیم که هیج vars و side effect ای، ذاتا مشکل دار نیستند.اسکالا یک زبان تابعی صرف نیست که شما را مجبور کند که همه چیز را به سبک تابعی  برنامه ریزی کنید.اسکالا یک زبان ترکیبی از تابعی(اعلانی) و سلسله مراتبی(دستوری) می باشد. شما ممکن است دریابید که در برخی شرایط یک سبک سلسله مراتبی(دستوری) مناسب تر برای حل مسئله است و در چنین مواقعی نباید از استفاده از آن دریغ کنید. ما به شما در یادگیری چگونگی برنامه نویسی بدون vars  کمک خواهیم کرد ، با این حال ، ما نمونه های خاصی از کد ها را با vars و نحوه تبدیل آن را به  شما بعدا خواهیم گفت.خواندن خطوط یک فایل اسکریپت هایی که کارهای کوچک و روزمره ای را انجام می دهند اغلب نیاز به پردازش خطوط در فایل ها دارند.در این مورد ، اسکریپتی خواهید ساخت ،که سطرها را از یک فایل می خواند و آنها را با تعداد کاراکترهای موجود در هر خط چاپ می کند.نحوه خواندن خطوط از یک فایل این اسکریپت با import کردن کلاسی با نام Source  از package scala.io شروع کرده،سپس بررسی می شود که حداقل یک ارگومان ورودی داشته باشیم.اگر این چنین باشد ، اولین پارامتر را بعنوان نام فایل در نطر بگیریم و باز و پردازش کنیم.عبارت ((Source.fromFile(args(0 سعی میکند فایل را باز کند و یک object  source  برگرداند.,وقتی شما تابع  getLines را صدا می کنید.تابع getLine یک [Iterator[String برمیگرداند.که یک خط برای هر تکرار را ، درست میکند.بدون اینکه دستور \n  هر خط را برگرداند.برای عبارت iterators  یکی طول خط و یک فضای خالی و مقدار دادهی اون خط را چاپ می کند.اگر وجود نداشته باشه ارگومانی در وردی در نهایت چاپ میکند که لطفا نام فایل رو وارد کنید.اگخ کد بالا را در یک فایل با نام countchars1.scala ذخیره کنیم و دوباره اجرا کنیم خواهیم داشت :$ scala countchars1.scala countchars1.scalaشما خروجی زیر درا خواهید داشت:22 import scala.io.Source&#xA;0 &#xA;22 if (args.length &gt; 0) { &#xA;0 &#xA;51 for (line &lt;Source. &#xA;fromFile(args(0)).getLines()) &#xA;35 println(line.length +&#34; &#34;+ line) &#xA;1 }&#xA;4 else &#xA;46 Console.err.println(&#34;Please enter filename&#34;)</description><category>محمود عباسی</category><author>محمود عباسی</author><pubDate>Thu, 02 Jul 2020 14:56:47 +0430</pubDate></item><item><title>آموزش TwinCAT</title><link>https://virgool.ir/@mahmoud.abbasi.m/education-twincat-cyeqaengestu</link><description>این توضیحات فقط برای استفاده از متخصصان آموزش دیده در مهندسی کنترل و اتوماسیون که با استانداردهای ملی قابل اجرا آشنا هستند درنظر گرفته شده است.این آموزش در واقع بسیار طولانی است ، اما قصد دارد شما را از طریق بارگیری ، نصب ، پیکربندی ، برنامه نویسی ، ساختن ، فعال سازی ، آنلاین شدن ، force و حتی ایجاد تغییرات آنلاین  در حین اجرای برنامه   TwinCAT 3 PLC سوق دهد. وقتی کارتان تمام شد درک اساسی از سیستم TwinCAT 3 و نحوه عملکرد آن خواهید داشت. ویژوال استودیو 2010 اگر قبلاً برنامه نویسی دات نت هستید ، می توانید Visual Studio 2010 Professional را نصب کنید. اگر اینگونه باشد ، TwinCAT 3 در واقع به عنوان پسوند VS 2010 نصب خواهد شد. اگر نصب نکردید ، نگران نباشید. TwinCAT 3 به جای آن ، ویژوال استودیو شل را نصب می کند.ممکن است تعجب کنید که آیا می توانید از نسخه های رایگان Visual Studio مانند نسخه Visual C # 2010 Express یا Visual Basic .NET 2010 Express Edition استفاده کنید. در حالی که می توانید آنها را نصب کنید ، و می توانید از آنها برای نوشتن برنامه هایی استفاده کنید که با زمان اجرا TwinCAT 3 ارتباط برقرار می کنند ، TwinCAT 3 به عنوان افزونه ای برای این محصولات نصب نخواهد شد.نصب TwinCAT 3نصب TwinCAT 3 برای دانلود مجانی است اما نیاز به ثبت نام دارد. Beckhoff بطور دوره ای نسخه های جدیدی را منتشر می کند ، بنابراین برای دریافت آخرین نسخه ها ، به صفحه وب محصولات آن شرکت بروید:http://www.beckhoff.com/english.asp؟download/tc3-downloads.htm روی TE1xxx | از لینک مهندسی بخش نرم افزار کلیک کنید  . روی لینک کلیک کنید  حتما توجه داشته باشید  که XAE شامل زمان اجرا (XAR) نیز می باشد.  TwinCAT 3.1 - extended Engineering Automation (XAE) پس از ثبت نام ، یک ایمیل با دستورالعمل بارگیری دریافت خواهید کرد. فایل .zip را بارگیری کنید و آن را در یک پوشه موقت باز کنید.نصب TwinCAT 3در دایرکتوری فایل zip  را باز کردهاید دنبال فایل با پسوند  &#34;exe&#34;  را پیدا کرده و روی آن دوبار کلیک کنید.دستورالعمل ها را دنبال کنید از گزینه های پیش فرض استفاده کنید. وقتی از پوسته ویژوال استودیو 2010 سؤال می کند ، کادر نصب آن را بررسی کنید:شما   قبل از اینکه کار نصب تان تمام بشود لازم هست یکبار سیستم را ریستارت کنید.اولین پروژه  خود را با TwinCAT 3 ایجاد کنید :اکنون که TwinCAT 3 را نصب کرده اید ، باید در نوار ابزار شما یک نماد جدید دیده شود : فقط برای اینکه بدونید ، رنگ آیکون (آبی) به معنی زمان اجرا TwinCAT 3  که در حالت config بصورت که ( motion Controller / PLC  / PLC / غیره )  می باشد . این شبیه به &#34;حالت برنامه&#34; در یک PLC Allen-Bradley است. با شروع کار ، نماد سبز رنگ خواهد بود.  و اینکه رنگ قرمز یعنی متوقف شده است.از منوی سیستم نرمافزار TwinCAT XAE انتخاب کنید .  (&#34;E&#34; مخفف &#34;مهندسی&#34; است. و این محیط برنامه نویسی است که شما می خواهید با آن کار کنید.)پس از کلیک بروی نرم افزار مورد نظر شما صفه اول ویژوال استادیو را خواهید دید.روی لینک New Project… (بصورت هایلایت ) در سمت چپ صفحه کلیک کنید. این پروژه جدید را نمایش می دهد :ایجاد پروژه جدید با TWINCAT3:من فقط TwinCAT 3 را بدون نصب ویژوال استودیو 2010 ، نصب کرده ام ، بنابراین شما فقط می توانید یک نوع پروژه را مشاهده کنید :  TwinCAT XAE Project .اگر Visual Studio 2010 Professional را نصب کرده باشید ، تمام انواع پروژه محتلف را مشاهده خواهید کرد ، به علاوه این نوع جدید پروژه TwinCAT XAE. حتماً این نوع را انتخاب کنید. سپس نام مناسبی را برای  پروژه خود بدهید (به قسمت هایلایت شده بالا مراجعه کنید). هنگامی که نام پروژه را تغییر می دهید ، عنوان اصل پروژه با نامی که شما انتخاب می کنید یکسان میشود (sln.). برای اهداف ما آنها می توانند به همین نام باشند. من &#34;آموزش TwinCAT 3&#34; را انتخاب کردم.  و روی  OK  کلیک کنید.این ممکن است یک دقیقه طول بکشد. تا بتواند یک پروژه جدید TwinCAT 3 را بسازد. پس از اتمام ، صفحه ای مانند این مشاهده می کنید:پروژه خالی TwinCAT 3کلیه پرونده های این پروژه در Solution Explorer در سمت راست سازماندهی شده اند . در اینجا توضیح مختصری از هر بخش آورده شده است:بالاترین گره مربوط به  solution  هست. این در واقع یک ساختار ویژوال استودیو است ، یک شی از TwinCAT 3 نیست. در ویژوال استودیو ، یک solution تشکیل میشود از گروهی از پروژه های ویژوال استودیو و که بصورت  build order به همدیگر مرتبط می باشند. در مورد ما ، فقط یک پروژه ویژوال استودیو وجود دارد: و آن هم آموزش TwinCAT 3  می باشد.  اگر از Visual Studio 2010 Professional استفاده می کنید ، می توانید پروژه های دیگری را نیز تحت عنوان solution اضافه کنید ، مانند یک پروژه C # یا VB.NET (شاید یک HMI یا یک برنامه بیگ دیتا ). این امر به راحتی ممکن است زیرا شما می توانید همه چیز را در یک مکان نگه دارید و حتی از افزودنیهای ( svn/git/tfs )برای مدیریت همه چیز در یک محیط استفاده کنید.زیر مجموعه پروژه شما :SYSTEM : این بخش زمان اجرا مربوط به  مجوزها می باشد. می توانید چند هسته پردازنده PC را برای استفاده ، کدام PLC یا motion tasks را روی هر هسته تنظیم کنید و چه درصد از قدرت پردازش هر هسته را برای اختصاص به هر کاری تنظیم کنید. توجه داشته باشید که اتصال به زمان های اجرا در رایانه های دیگر امکان پذیر است ، اما در حال حاضر ما فقط به زمان اجرا محلی توجه خواهیم کرد.(ntp)MOTION:اینجاست که وظایف کنترل motion tasks را اضافه می کنید و محورها را به هر کار اختصاص می دهید. این tasks کار بستن حلقه های کنترل را برای شما انجام می دهد. برنامه های PLC شما معمولاً با motion tasks  با استفاده از motion function block استاندارد ارتباط برقرار می کنند و motion tasks  کمک میکنند  وظایف پیچیده ای را در کنترل servo drives بر عهده می گیرند ، شما مستقیماً با اشیاء زیر بخش MOTION تعامل دارید).PLC : اینجاست که پروژه های PLC را اضافه می کنید. هر پروژه PLC به شما امکان می دهد متغیرها (تخصیص حافظه) و  PLC LOGIC را تعریف کنید.SAFETY: اگر از یک قطعه ایمنی EL6900 Safety PLC یا زمان اجرای جدید ایمنی TwinCAT 3 (یک PLC ایمنی معتبر که بر روی رایانه شخصی کار می کند) استفاده می کنید ، می توانید LOGIC SAFETY را در اینجا ویرایش کنید. این بسیار مفید است زیرا می توانید برای نظارت و وضعیت ، اتصالی بین PLC و LOGIC SAFETY ایجاد کنید.C ++ : یکی از ویژگی های بزرگ جدید یا TwinCAT 3 امکان نوشتن کد C ++ است که به طور مستقیم در زمان اجرا ، اجرا می شود.I / O : اینجاست که شبکه I / O خود را پیکربندی می کنید ، و سپس نقشه های خود را بین همه ماژول های مختلف ایجاد می کنید. به عنوان مثال ، اگر یک ورودی را در ماژول PLC تعریف کنید ، باید معادل آن را به یک ورودی فیزیکی در ماژول I / O داشته باشید.ساختار فایل  Solution در TwinCAT 3یكی از نكات جالب TwinCAT 3 در مقایسه با سایر محیط های برنامه نویسی PLC ، این است كه solution را در مجموعه ای از فایل ها و دایرکتوری ها ذخیره می كند و نه در یك فایل یك monolithic. اگر دایرکتوری را که در آن از شما خواسته شده است solution خود را باز کنید ، موارد زیر را مشاهده خواهید کرد:فایل  TwinCAT 3 Tutorial.sln  در پوشه solution  شما قرار دارد ، و آن مربوط به گره سطح بالا در اکسپلورر &#34;solution&#34; شما را در سمت راست پنجره افزار TwinCAT XAE می باشد.  پوشه TwinCAT 3 Tutorial مربوط به پروژه  زیر پوشه solution  قرار دارد . اگر روی آن پوشه دو بار کلیک کنید ، فایلی به نام TwinCAT 3 Tutorial.tsproj را مشاهده خواهید کرد :به مرور این آموزش نوشته خواهد شد و شما با این آموزش می توانید برنامه های مربوط به کنترل صنعتی خود را با بهترین روش پیاده سازی کنید.</description><category>محمود عباسی</category><author>محمود عباسی</author><pubDate>Thu, 07 May 2020 11:20:37 +0430</pubDate></item><item><title>بیگ دیتا ، مفهوم و تکنولوژی های آن</title><link>https://virgool.ir/@mahmoud.abbasi.m/بیگ-دیتا-مفهوم-و-تکنولوژی-های-آن-zvqhaeyupqpt</link><description>معرفی data miningتمرکز روی اصول data mining و مفهوم و تکنولوژی برای کشف  جالب pattern  هایی از دادها در برنامه های مختلف.در شرایط خاص. ما به تکنولوژی های برجسته برای توسعه و کارامدی و موثر و مقیاس پذیری ابزارهای داده کاوی اهمیت می دهیم.بخش اول چرا data mining  خیلی تقاضا دارد و چطور آن یک قسمتی از تکامل طبیعی فناوری اطلاعات می باشد که به مرور آن را توصیف خواهیم کرد .بخش دوم تعریف میکند data mining  در رابطه با فرایندهای کشف دانش کمک می کند  .سپس شما درباره data mining  از جنبه های مختلف یاد می گیرد که چگونه انواع دادها را استخراج کنید.بخش سوم انواع دانشهایی که  می توان استخراج کرد.انواع تکنولوژی هایی که استفاده میشوداهداف برنامه هادید چند بعدی در رابطه با  data mining به مرور مطالب این بخش نیز اماده خواهد شد ....</description><category>محمود عباسی</category><author>محمود عباسی</author><pubDate>Fri, 24 Apr 2020 12:34:45 +0430</pubDate></item><item><title>آموزش برنامه نویسی اسکالا (1)</title><link>https://virgool.ir/javacup/آموزش-برنامه-نویسی-اسکالا-cbk29tuijhvo</link><description>هدف از نوشتن این مطلب این بود که می خواستم دوستانی که دوست دارن با این زبان برنامه بنویسند کمکی کرده باشم. این زبان یک زبان تابعی می باشد .که ساختار پروژه های آن نیز تابعی می باشد یعنی اینکه یک پروژه می تواند در داخل یک پروژه دیگر صدا زده بشود .اولین قدم در اسکالا :قبل از اینکه شروع کنیم به بحث عمیق اسکالا لازم هست اطلاعاتی در مورد این زبان بدانیم و مثالهایی در این مورد انجام بدهیم.اولین کار نصب استاندارد اسکالا می باشد برای نصب باید به ادرس زیر مراجعه کنید http://www.scalalang.org/downloads و دانلود مربوط به پلت فرمی که لازم دارید را انجام بدهید و بعد از دانلود نصب بکنید می توانید از pluging های مربوط به eclipse ویا intellije استفاده کنید.نحوه استفاده از scala Interpreter :آسانترین راه کار کردن با اسکالا استفاده از scala interpreter می باشد.که بصورت پوسته  &#34;shell&#34; برای نوشتن عبارات و برنامه ها اسکالا می باشد.نوع ساده ای از عبارات داخل مترجم هست و آن  عبارت را ارزیابی کند و  مقدار نتیجه را چاپ می کند .  در محیط shell اسکالا خیلی ساده اسکالا را صدا میزند. و شما  با نوشتن اسکالا در محیط terminal /command line از آن استفاده می کنید . در یک فرصت مناسب در مورد نحوه نصب آن در محیط ویندوز/لینوکس و مک در آینده ای نزدیک می نویسیم. برای شروع یک terminal باز کنید➜  ~ scala&#xA;Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_80).&#xA;Type in expressions for evaluation. Or try :help.scala&gt;بعد از این شما عبارات خود را می نویسید  مثل  ۱+۲ و بعد فشار می دهید enterscala&gt; 1+2&#xA;res0: Int = 3این خط شامل این موارد می باشد:بصورت خودکار تولید میشود یا نامی که توسط کاربر تعریف میشود برای مراجعه به مقدار محاسبه شده که به معنی نتیجه صفر است : res0یک  کولن (:) و بدنبال آن نوع عبارت (Int)معادل نشانه یا علامت (=)مقدار نتیجه از ارزیابی عبارتنوع Int نام کلاسی هست که در کلاس Int  در package  اسکالا می باشد.package  ها در اسکالا شبیه package در جاوا هستند.آنها  namespace ها رو جدا می کنند و  یک مکانیزم برای پنهان کردن اطلاعات فراهم میکنند . مقادیر کلاس Int متناظر است با مقادیر Int  کلاس جاوا. خیلی عمومی تر همه انواع type  primative کلاسهای متناظری در package  اسکالا  دارند. برای مثال scala.Boolean متناظرش هست در جاوا boolean.  یا scala.Float متناظرش در جاوا هست float و وقتی ما کد اسکالای خودمان را کمپایل می کنیم به byte code  جاوا تبدیل میشود.اسکالا موقع کمپایل تا جایی که امکان دارد از primitive types  های جاوا استفاده میکند تا جایی که ممکن هست بتواند کارایی بهتری رو  types primitive  می دهد.شناسه resX در خط های بعدی ممکن هست استفاده بشود . برای نمونه ، از آنجا که res0 قبلا بود 3 , درنتیجه res0 * 3  نتیجه اش 9 خواهد بود.scala&gt; res0*3&#xA;res1: Int = 9برای پرینت !Hello, world لازم است فقط در جلوی خط فرمان این دستور نوشته شود. scala&gt; println(&#34;Hello, world!&#34;)&#xA;Hello, world!تابع پرینت string را  برای خروجی استاندارد می نویسد و این شبیه System.out.print در جاوا می باشد .دومین قدم :تعریف کردن تعدادی متغییر :اسکالا دو نوع متغییر vals و vars  دارد . یک val است شبیه به یک متغیر final  در جاوا . و فقط یک بار مقداردهی اولیه می شود. یک متغیر val  نمی تواند هرگز مقدار دهی دوباره انجام شود. اما یک  متغیر var  برعکس اش می باشد . آن شبیه یک متغییر  non final  جاوا می باشد. یک متغییر var می توند در طور چرخه حیاتش دوباره مقدار دهی بشود . اینجا یک متغییر val  تعریف شده است.scala&gt; val msg = &#34;Hello, world!&#34;&#xA;msg: String = Hello, worldاین جمله  نام  msg  را برای رشته &#34;!Hello, world&#34; تعریف میکند  . نوع msg از نوع java.lang.String  می باشد , زیرا رشته ها در اسکالا با کلاس String  جاوا پیاده سازی شده اند . اگر شما از تعریف کردن متغییر در جاوا استفاده میکنید , شما متوجه  یک اختلاف برجسته در اینجا خواهید شد. نه java.lang.String و نه String در هیچ جایی از متغییر val  ظاهر نمی شود. این مثال شرح میدهد type infrence یا نوع ادراکی . اسکالا این قابلیت را دارد که بتواند نوع متغییر هایی که شما استفاده می کنید را بدست بیاورد .در این مورد، شما  msg  را با یک رشته  حرفی مقداردهی کرده اید . اسکالا نوع msg رو به String استنتاج میکند . وقتی مترجم اسکالا میتواند نوع را استنتاج کند . آن خیلی بهتر است که اجازه بدهیم  اینکار را آن انجام بدهد تا اینکه با کلی کد  تعریف کنیم که می توانیم لازم نداشته باشیم . حاشیه نویسی نوع صریح. شمای میتوانید حاشیه نویسی نوع صریح را مشخص کنید اگر دوست داشته باشید. احتمالا باید بعضی وقتها اینکار را انجام بدهید.حاشیه نویسی نوع صریح هردو  می توانند اطمینان حاصل کنند که مترجم اسکالا type  مورد نظر شما را استنتاج می کند.خوب مستندات مفید برای کسانی که بعدا کد را می خوانند بهتر خواهد بود.برخلاف جاوا شما نوع متغییر را قبل از نامش مشخص می کنید اما در اسکالا شما بعد از نام متغییر نوع اش را مشخص می کنید.و با یک : جدا می کنید.برای مثال :scala&gt; val msg2 : java.lang.String =&#34;Hello again,world&#34;&#xA;msg2: String = Hello again,worldشما می توانید  نوع اش را مشخص کنید در مثال زیر نیز می توانید ببینیدبرنامه ها به سادگی :scala&gt; val msg3: String = &#34;Hello yet again, world!&#34;&#xA;msg3: String = Hello yet again, world!برمیگردیم به msg  اصلی . حالا که آن  متغییر تعریف شده است. شما میتوانید از آن استفاده کنید . به خروجی زیر نگاهی بیندازیم:scala&gt; println(msg)&#xA;Hello,worldحالا سوال این است که چه کاری را شما نمی توانید با  msg انجام بدهید. میدانید که آن یک متغیر  val  میباشد نه یک var. پس بنابراین  شما نمی توانید آن را دوباره مقداردهی کنید. برای مثال ببینید چطور مترجم اشکال میگیرد وقتی شما تلاش می کنید این کار رو انجام بدهید.scala&gt; msg = &#34;Goodbye cruel world!&#34;&lt;console&gt;:12: error: reassignment to valmsg = &#34;Goodbye cruel world!&#34;^اگر شما میخواهید مقداردهی دوباره انجام بدهید.شما احتیاج دارید به استفاده از متغیر از جنس  var و در اینصورت :scala&gt; var greeting = &#34;Hello, world!&#34;greeting: String = Hello, world!از انجا که greeting یک متغییر var  هست نه val، بنابراین شما می توانید هر زمان لازم داشتید آن را مقدار دهی کنید.برای مثال شما میتوانید مقدار متغییر greeting را تغییر بدهید .scala&gt; greeting = &#34;Leave me alone, world!&#34;greeting: String = Leave me alone, world!برای وارد کردن دستوراتی  به مترجم که شامل چندین خط می باشد فقط لازم هست | را در اولین خط و خط بعد قرار بدهید . اگر کد شما در یک خط کامل نیست. مترجم  پاسخ میدهد . با یک enter  |  روی خط بعدی  به این صورت استفاده میکنیمscala&gt; val multiLine =| &#34;This is the next line.&#34;multiLine: String = This is the next line.اگر متوجه باشید اشتباهی تایپ کرده اید ، اما مترجم هنوز منتظر ورودی بیشتر است ، می توانید با فشار دادن enter دو بار می توانید این مسئله رو حل کنید.scala&gt; var opps =||You typed two blank lines.  Starting a new command. در ادامه سعی می کنیم موقع نوشتن مثالهایی از این دست از pipeline(|) کمتر استفاده کنیم.تعریف برخی توابعحالا که شما دارید با متغیر های اسکالا کار می کنید. شما احتمالا بخواهید برخی توابع را بنویسید . خوب ببینیم اینجا شما چطور اینکاررا در اسکالا انجام میدهید:scala&gt; def max(x:Int , y:Int): Int ={| if (x&gt;y) x| else y| }max: (x: Int, y: Int) Intتعریف توابع با یک def شروع میشود . نام تابع در این مورد max است.و بدنبالش , لیستی از پارامترهای در داخل پارانتز ها قرار دارد.و  هر پارامتر با با یک نوع annotation دنبال میشود  با هر پارامتری که با یک : از هم جدا میشدند.زیرا در کامپایلر  اسکالا  ( و مترجم از این به بعد ما میگیم کامپایلر) نوع پارامترهای استنتاج نمیشود.در این مثال تابع max  دوتا پارامتر x,y  که هردو Int  هستند را میگیرد .بعد از بستن پارانتز  یک نوع دیگر نیز در اینجا “ : Int ” نوعی از annotation است که تعریف نوع نتیجه از تابع max  می باشد. توابع  result Type هست معادل برابری یا {}  که  بدنه تابع رو مشخص میکند . در این مورد  در  بدنه یک عبارت تک شرطی میباشد. که مشخص می کنید  x یا y  کدام یک بزرگتر هست را بر می گرداند.  و در نتیجه نتیجه تابع  max مشخص  میشود. در اسکالا عبارت میتواند نتیجه را در یک مقدار  بدهد و مشابه عملگرهای سه تایی جاوا کار می کند. برای مثال , در اسکالا عبارت “ if (x &gt; y) x else y ” شبیه عبارت  “ x &gt; y) ? x : y) ”  در جاوا رفتار می کند.  علامت برابر در اینجا اشاره میکند به بدنه داخل {} که ما  در توابع به انها اشاره میکنیم.یک تابع تعریف شده عبارت که نتیجه اش در یک مقدار هست.ساختار پایه ای یک تابع در شکل زیر توضیح داده شده است.بعضی وقتها مترجم اسکالا از شما میخواهد نوع خروجی تابع را مشخص کنید. اگر تابع recursive  باشد.برای مثال شما خیلی واضح  نوع خروجی را مشخص می کنید . در مورد max هرچند ، شما ممکن  نوع خروجی را ندهید و اجازه بدهید  خود مفسر نوع خروجی را استنتاج کند . همچنین ، اگر یک تابع فقط شامل یک جمله باشد.شما میتوانید اکولاد ها را انتخاب کنید  و حذف کنید . بنابراین . شما می توانید تابع max  را مشابه زیر تعریف کنید :scala&gt; def max2(x: Int, y: Int) = if (x &gt; y) x else ymax2: (x: Int,y: Int)Int بعد از اینکه یک تابع را تعریف کردین شما می توانید انرا صدا بزنید بصورت زیر : scala&gt; max(3, 5)res4: Int = 5 در اینجا است  ما  می توانیم  یک تابع که هیچ پارمتری را نمی گیرد.و نتیجه ای برنمی گرداند. را تعریف کنیم مشابه نمونه زیر : scala&gt; def greet() = println(&#34;Hello, world!&#34;)و نحوه برخورد مفسر با این نوع توابع :greet: Unit()وقتش ما تابع greet را تعریف می کنیم . مترجم  برای تابع greet  این پاسخ را می دهد &#34;()greet:Unit “  یک توضیح اینکه ، در نام تابع ، () پارنتزها نشان میدهد که هیچ پارامتری را نمی گیرد و  نوع خروجی تابع greet ، از نوع Unit می باشد.نوع خروجی Unit نشان می دهد که تابع مقدار بر نمی گرداند. اسکالا یک نوع type دارد به نام Unit مشابه void درجاوا می باشد ، که هیچ مقداری برنمی گرداند. و در حقیقت هر متدی در جاوا از نوع  void  می باشد در اسکالا به Unit نگاشت می شود . که در اسکالا این نوع خروجی به متدهای Unit معرف است .بنابراین  هدفشان اجرای برنامه و در نهایت یک خروجی برای ما می باشد . در  مورد  تابع ()greet هدف این بود که برای ما خروجی تابع را چاپ کند . در قدم بعدی. شما  میخواهید کدهای اسکالا در یک فایل  قرار بدهید و بصورت یک فایل اسکریپت انرا اجرا کنید . اگر شما بخواهید از مترجم خارج بشوید شما می توانید quit: یا q: را در جلوی مفسر بنویسید و خارج بشوید مشابه زیر :scala&gt; :quit$قدم چهارم :  نوشتن تعدادی اسکریپت  در اسکالااگرچه اسکالا برای کمک به برنامه نویسان برای ساختن سیستم هایی با مقیاس بزرگ طراحی شده است.و  همچنین با مقیاس خوبی به نگارش در امده است.مفهوم یک اسکریپت فقط یک ترتیبی از جملات در یک فایل که بصورت ترتیبی شروع به اجرا میکند می باشد .خوب حالا میگذاریم ، کد زیر را داخل یک فایل با نام hello.scala ذخیره می کنیم .// Say hello to the first argumentprintln(&#34;Hello, world, from a script!&#34;)و بعد اجرا میکنیم.$ scala hello.scalaو شما باید این را در خروجی ببینید:Hello, world, from a script!ارگومانهای خط فرمان (Command line args)   در اسکریپت های اسکالا فعال می باشند و یک ارایه ای  در اسکالا ایجاد می کنند. و بعنوان ارگومان تعریف میشوند. دراسکالا ارایه ها از ۰ شروع میشوند.و شما برای دسترسی به عناصر ارایه از ایندکس داخل پارانتز استفاده میکنید.بنابراین اولین عنصر در یک ارایه  اسکالا step نامیده میشود که بصورت  (steps(0 عناصر  بدست می اید بصورت  جاوایی مشابه این  [step[0 بدست نمی اید. حالا سعی کینیم ببینیم  چگونه می توانیم پارامتر را در خروجی ببینیم . کد زیر را در داخل یک فایل با نام helloarg.scala قرار میدهیم.// Say hello to the first argumentprintln(&#34;Hello, &#34;+ args(0) +&#34;!&#34;)و سپس اجرا میکنیم:$ scala helloarg.scala planetدر این مثال planet  بعنوان یک ارگومان بنام (0)args  به عنوان ورودی سیستم در مقابل نام فایل به سیستم ارسال می گردد. بنابراین شما باید ببینید :Hello, planet!توجه کنیم که این اسکریپت شامل یک comment است.کامپایلر اسکالا  کاراکترهای بین // و کاراکترهاییی که بین  /* ---- */  قرار دارد را نایدیه می گیرد. این مثال نشان میدهد  با یک داده از نوع String شروع میکنه و با یک + خودش رو به یک متغییر وصل می کند .  همانطور که شما انتظار داشتید. عبارت  &#34;!Hello, &#34;+&#34;world&#34;  که نتیجه اش است  &#34;!Hello, world&#34; یعنی اینکه عملگر +  عمل ادغام  رو انجام میدهد.قدم بعدی  : حلقه با while  و شروط با ifبرای اینکه ببینیم دستور while  چگونه کار می کند کد زیر را در فایلی با نام printargs.scala ذخیره می کنیم.var i = 0 &#xA;while (i &lt; args.length) { &#xA;  println(args(i)) &#xA;  i += 1&#xA;}نکته:ما در اینجا مشخص نمی کنیم بهترین روش کد اسکالا در مورد while loops  کدام است .اما در بحث های آینده از رویکرد  اجتناب کردن در مورد فرایند تکرار در ارایه ها و ایندکسها صحبت خواهیم کرد.حالا یک توضیح در مورد این برنامه : از ابتدا ، این اسکریپت با یک متغیر  تعریف میشود  var i=0. نوعی داده را خود سیستم استنتاج می کند و نوع متغییر را از نوع scala.Int   در نظر می گیرد . زیرا  متغییر با مقدار صفر مقدار دهی اولیه شده است. ساختار while در خط بعدی ساختار block دارد.یعنی بین دوتا {} . و این تکرار میشود تا زمانیکه عبارت زیر false  با شد .&#34;i &lt; args.length &#34;تابع args.length به ما تعداد ارگومانهای ارسالی به سیستم را بصورت ارایه ای از ارگومانها هستند را اعلام می کند.داخل بلاک ما دوتا جمله اریم که هر کدام دو تا فضای خالی به جلو هستند.که این یک استایل در اسکالا می باشد.(indentation)  اولین جمله چاپ ی کنه ارگومان ارسلی به برنامه رو در کنسول  و دومین جمله i  را یه دونه افزایش میدهد  +i توجه داشته باشیم که اسکالا همانند جاوا increment  نمی کند در جاوا شما برای اینکه incrment انجام بدین از  ++i , i++  استفاده می کنید که این دستورات در اسکالا کار نمی کنند.شما در اسکالا از دو روش می توانید این کار را انجام بدهید i=i+1  یا i+=1  ، خوب حالا به اجرا کردن برنامه بر می گردیم :$ scala printargs.scala Scala is funو ما باید این خروجی رو ببینیم :Scala &#xA;is &#xA;funبرای اینکه بتوانیم دیتای خیلی بیشتری رو از وردی بخوانیم می توانیم در یک فایل با نام echoargs.scala ، کد زیر را ذخیره کنیم :var i = 0&#xA;while (i &lt; args.length) { &#xA;    if (i != 0) &#xA;      print(&#34; &#34;) &#xA;    print(args(i)) &#xA;    i += 1 &#xA;} &#xA;println()حالا ما این کد رو توضیح میدهیم : ما در این مثال از  println  برای نوشتن استفاده نکردیم بلکه از دستور print  برای نوشتن استفاده کردیم برای اینکه بتوانیم ورئی ها بصورت یک سطر در خروجی داشته باشیم به ازای هر ارگومان یک فاصله چاپ می کنیم و بعئ مقدار داه شده رو در سیستم می نویسیم. حالا ما اگر بخواهیم این فایل رو اجرا کنیم : $ scala echoargs.scala Scala is even more funنتیجه داده به این صورت خواهد بود :Scala is even more funتوجه داشته باشید که شما در اسکالا شبیه جاوا از عبارت boolean    داخل پارانتز در حلقه و یا شرط (while/if)استفاده می کنید.ما در اسکالا نمی تونیم مثل زبان روبی بدون پارانتز کار کنیم if i&lt;10  در اسکالا کار نمی کند.یک مورد دیگه که یک جمله شرطی داشته باشیم در جاوا در یک بلاک قرار می دیم اما در اسکالا می تویم بدون بلاک اینکار رو انجام بدیم.و اینکه در جاوا انتهای هر جمله رو با ;  می بندیم اما در اسکالا می تونیم استفاده نکنیم.شما می وانید با یک مدل دیگه ایکار رو انجام بدین :var i = 0;&#xA;while (i &lt; args.length) {&#xA;if (i != 0) {&#xA;print(&#34; &#34;);&#xA;}&#xA;print(args(i));&#xA;i += 1;&#xA;}&#xA;println();تکرار با foreach و forشما شاید به این قضیه پی نبرده باشین ، اما شما در مثال قبلی از روش Imperative programming (برنامه نویسی دستوری) استفاده کردید. این همان روشی هست که شما با زبان جاوا یا c  یا c++ انجام میدین.وقتی شما یک دستوری را در داخل حلقه تکرار مدهید این دستور می تواند یک متغیر عمومی را در کل تابع تغییر بدهد.اسکالا شما رو در برنامه نویسی دستوری کمک می کند .هرچقدر اسکالا را بهتر بشناسید ،  به احتمال زیاد اغلب خود را با سبکی کاربردی تر برنامه نویسی خواهید کرد.یکی از اهداف اصلی در اینجا این است که شما خیلی راحت بتوانبد سبک برنامه نویسی functional  با همان مدل برنامه نویسی (Imperative ) انجام بدهید.و یکی از کاراکترای اصلی زبانهای برنامه نویسی functional  این است که خود توابع که می نویسید  می تواند بصورت یه ساختار باشد و در اسکالا نیز  این موضوع کاملا صحیح می باشد .با مثال دیگر این موضوع را بررسی می کنیم :یک مقدار دقیق تر به این موضوع نگاه کنیم برای چاپ ارگومانهای خط فرمان از این دستور استفاده می کنیم :args.foreach(arg =&gt; println(arg))در این مثال شما متد foreach  رو برای ارگومانها صدا می زنید و  مقدار ارگومان رو به یک تابع دیگه پاس می کتید . در این حالت ، شما  مقدار ارگومان را به یک فانکش(function literal) پاس می کنید.بدنه خود فانکشن (println(arg  میباشد.اگه ما کد بالا در یک فایل بنام pa.scala ذخیره کنیم و اجرا کنیم :یک توضیح در مورد  function literal این است که یک فانکشن به عنوان ورودی یک فانکشن دیگر استفاده می شود .$ scala pa.scala Concise is niceنتیجه که خواهیم داشت :Concise&#xA;is&#xA;niceدر مثال بالا مفسر اسکالا نوع خروجی به نوع ارگومان (arg) که از نوع String بود refer کرد.از آنجا که String نوع ناصر آرایه که شما در foreach استفاده می کنید.اگر شما ترجیح بدین که خودتون نوعش رو مشخص کنید می توانید بصورت زیر در داخل پرانتز اینکار را انجام بدهید همانند مدل زیر :args.foreach((arg: String) =&gt; println(arg))اگر شما اینو رو اجرا کنید همانند  قبلی رفتار خواهد کرد.اگر شما دوست دارید خیلی کمتر بنویسید به جار اینکه خیلی بیشتر توضیح بدهید . یکی از مزیت های اسکالا استفاده از کوتاه نویسی هست.اگر یک function literal فقط شامل یک جمله باشد.و یک پارمتر، نیازی ندارید برای آن یک نام متد و نوع پارامتر برای آن تعریف  کنید.بنابراین می توانیم کد بالا بصورت زیر بنویسیم :args.foreach(println)خلاصه ، نحوه نوشتن یک تابع function literal بصورت لیستی از نام متغیر ها و یک  فلش راست و در نهایت بدنه تابع  می باشد.این شرح یک function literal  هست.با این نکته شما شاید تعجب کنید چه اتفاقی برای اون حلقه هایی که شما در زبان جاوا و یا c استفاده می کردین ، افتاده است.سعی می کنیم راهنمایی کنم شما رو در function direction ، بنام توابع وابسته که بصورت یک عبارت در اسکالا صدا زده می شود.که ما اینها را بصورت مفصل در آینده صحبت خواهیم کرد. یه نگاه اجمالی بکنیم و یک فایل جدید بانام forargs.scala  می سازیم :for (arg &lt;- args)&#xA;println(arg)پارانتز بعد از &#34;for&#34;  شامل arg &lt;- args  می باشد. که سیمبل  &#34;-&gt;&#34;  اشاره می کند به ارایه آرگومان ها. سمت راست این سیمبل اشاره می کند به متغیر arg که یک val  می باشد.چون شما فقط می نویسید این متغیر رو و اون است یک val.از آنجا که  arg ممکنه یک var  به نظر برسه زیرا آن هر سری در داخل حلقه می تونه یه مقدار جدید برای خودش بگیرد.و به نطر میرسه باید var  باشه، اما واقعیت این است که آن val  هست ، بخاطر اینکه نمی توانید در داخل حلقه مقدار arg  رو تغییر بدهید. در عوض ، برای هر عنصر از آرایه args ، مقدار جدیدی از  جنس val باری متغییر arg ایجاد می شود و مقدار اولیه آن را مقدار دهی می کند ، و   در داخل حلقهfor  آنرا را اجرا می کند. اگر شما اسکریپت  forargs.scala را با فرمان زیر اجرا کنید :$ scala forargs.scala for arg in argsشما باید این مقادیر را در خروجی خواهید دید:for &#xA;arg &#xA;in &#xA;argsاسکالا برای عبارات خیلی بهتر عمل می کنه،که برای شروع این مثال خوب می باشد ، که بعدها در این مورد بطور مفصل صحبت خواهیم کرد.ارایه ها با انواع پارامتر هاشما در اسکالا می توانید یک نمونه از یک object  و یا یک کلاس  را با یک  new  تعریف کنید.وقتی شما یک نمونه از یک  object  را ساختید می تونید با انواع مقادیر و پارمترها  parameterize  کنید. معنی  patametrize  در اینجا یعنی پیکربندی کردن وقتی که می خواهید انرا ایجاد کنید.شما پارمترایط می کنید یه نمونه از یک object را با مقادیر که پاس می کنیم به یک سازنده در با پارانتز مشخص شده است . برای مثال در کد اسکالای زیر ما یک نمونه از یک نوع java.math.BigInteger   با new  ایجاد کردیم و با مقدار  12345 مقدار دهی کردیم :val big = new java.math.BigInteger(&#34;12345&#34;)یه مدل پارامتریک کردن داده از یک نمونه با انواع مختلف داده استفاده از براکت می باشد که نوع داده در داخل براکت مشخص میشود.به مثال زیر دقت کنیم می بینیم :val greetStrings = new Array[String](3)در این مثال  greetStrings  یک مقدار از [Array[String یعنی &#34;Array of String&#34; که مقدار دهی اولیه شده با طول 3 و پارامترایز شده با مقدار 3 .به کد زیر نگاه کنیم :val greetStrings = new Array[String](3)greetStrings(0) = &#34;Hello&#34;greetStrings(1) = &#34;, &#34;greetStrings(2) = &#34;world!\n&#34;for (i &lt;- 0 to 2)print(greetStrings(i))اگه می خواستید خودتون نوع پارامتر رو مشخص کنید می توانستید اینکار رو انجام بدهید:val greetStrings: Array[String] = new Array[String](3)با توجه به استنباط خود اسکالا ، این خط کد معادل همان خط کد اول می باشد.اما این نمونه نشان میده یه قسمت نوع داده از پارمتر در داخل براکت و  طول داده در داخل پارانتز قرار دارد.نوع متغییر greetString  از نوع [Array[String  می باشد نه از جنس (Array[String](3.در مثال بالا هر عنصر از ارایه  greetString   مقدار دهی  اولیه شده است.greetStrings(0) = &#34;Hello&#34;&#xA;greetStrings(1) = &#34;, &#34;&#xA;greetStrings(2) = &#34;world!\n&#34;همانطور که قبلا گفته شد ، ارایه ها در اسکالا به عناصر خودش از طریق پارانتزها دسترسی پیدا می کنند  اما در جاوا از طریق براکت  این اتفاق می افتد.بنابراین عنصر صفرم بدینگونه میشود (greetStrings(0  ونه به این صورت [greetStrings[0 که در جاوا عناصر را بدست می آوردیم. این سه خط کد، مفهوم مهمی را برای درک در مورد Scala در مورد معنی Val نشان می دهد.وقتی شما یه متغییر از جنس  val تعریف می کنید ، دیگر نمیتوان مقدار دهی دوباره کرد.اما object ای که به آن اشاره دارد می تواند هنوز هم تغییر کند.بنابراین در این حالت ، شما نمی توانید مجدد greetStrings را به مجموعه دیگری تغییر دهید. greetStrings همیشه به همان نمونه Array [String] که با آن آغاز شده است اشاره می کند. اما می توانید عناصر آن Array [String] را با گذشت زمان تغییر دهید ، بنابراین خود آرایه قابل تغییر است.در مثال بالا دوتا خط که ، به هر کدام از عناصر ارایه  greetString اشاره میکند.for (i &lt;- 0 to 2) &#xA;print(greetStrings(i))خط اول کد یک دیگر از قوانین کلی در اسمالا رو بیان میکند.اگر متد شما فقط یک پارمتر داشته باشد شما میتوانید بدون . و یا پرانتز  انرا صدا بزنید.در این مثال واقعا متد یک پارامتر از جنس Int  دارد.کد 0 تا 2  به فرخوانی متد تبدیل میشود بدین صورت  (0).(to(2.  توجه داشته باشید این نحوه فراخوانی زمانیکه خیلی واضح  اعلام میکنید این دستور کار میکند.شما نمی توانید “println 10” را بنویسید.اما می توانید این دستور را اجرا کنید “Console println 10”.اسکالا از نظر فنی overloading ندارد بخاطر اینکه هیچ سنسی از عملگر را ندارد.بجار کاراکترهایی از نوع + - * /  از نام عملگر ها استفاده میکند.بنابرانی وقتی شما تایپ می کنید 1+2   را در کنسول اسکالا ،شما در واقع از متدی بنام +  استفاده میکنید روی object 1  از جنس Int و استفاده میکنید از 2 بعنوان پارامتر ورودی ان.شما در عوض می توانید 1+2 را با روش سنتی فراخوانی بکنیدو نحوه فرخوانی ان بصوزت .(2)+.(1)   می باشد.ایده مهم دیگری که با این مثال نشان داده شده است به شما بینش می بخشد.به همین دلیل به آرایه ها با کمک پرانتز در Scala دسترسی پیدا می کنید.Scala موارد خاص کمتری نسبت به جاوا دارد.آرایه ها بصورت نمونه کلاسهای ساده ای هستند شبیه بقیه کلاسها تعریف شده در اسکالا می باشند.وقتی شما پارانتزها را اطراف مقادیر متغییر اعمال می کنید .Scala کد را به فراخوانی روشی به نام applay بر روی آن متغیر اعمال می کند.بنابراین (greetStrings(i  تبدیل به (greetStrings.apply(i می شود. بنابراین دسترسی به عناصر یک ارایه خیلی ساده است شبیه صدا کرد یک متد دیگر می باشد.این اصل فقط محدود به آرایه ها نمی باشد.هر درخواستی از یک object که از تعدادی  آرگومان که با پارانتز مشخص شده است تبدیل به  صدا کردن متد  apply  میشود . البته این تنها در صورتی کامپایل می شود که آن نوع از شیء در واقع یک متد apply را تعریف کند. بنابراین این کار بصورت موردی نیست بلکه بصورت یک قانون کلی میباشد.وقتی یک مقداری را به یک متغیر که با پارانتز مشخص شده قرار میدهند .کامپایلر آنرا تبدیل به متد update میکند.و مقدار ان را در سمت راست قرار میدهد.برای مثال : &#34;greetStrings(0) = &#34;Hello   تبدیل میشود به این مقدار (&#34;greetStrings.update(0, &#34;Hello ، بنابراین موارد زیر از نظر معنایی با این کد برابری میکند :val greetStrings = new Array[String](3)greetStrings.update(0, &#34;Hello&#34;)greetStrings.update(1, &#34;, &#34;)greetStrings.update(2, &#34;world!\n&#34;)for (i &lt;-0.to(2))print(greetStrings.apply(i))اسکالا یک مفهوم ساده ای از رفتار هر چیزی را ارانه میدهد. از آرایه ها تا عبارات و از objectها با متدهایشان.شما لازم نیست موارد خاص را بخاطر بسپارید مثل primitive و انواع دادههای دیگر و یا مثل آرایه ها و یا regular objects.ugh, علاوه بر این این یکنواختی هزینه قابل توجه ای در سرعت و کاایی سیستم ایجاد نمی کند.کامپایلر اسکالا از آرایه های جاوا و انواع  primitive types و  native arithmetic   در هر جاییکه امکان استفاده در کد باشد ، استفاده میکند.اگرچه مثالهایی که شما تا اینجا دیدید  خوب ، کامپایل و اجرا شده اند.اسکالا راههای ساده تر و دقیقتری را برای ایجاد و مقدار دهی اولیه ارایه ها که بصورت معمولی استفاده میکنیم ایجاد کرده است.در شکل زیر خواهید دید، این کد یه آرایه با طول 3 ایجاد میکند .که با مقادیر Stringمقداردهی شده &#34;zero&#34;, &#34;one&#34;, و &#34;two&#34;.کامپایلر استنباط می کند نوع داده ها از جنس [Array[String می باشد.پراکه داه ای شما به ان اختصاص دادهاید از جنس String  می باشد.شکل 3.2چه اتفاقی واقعا در شکل 3.2 می افتد.یک متد  factory ،بنام apply صدا زده میشود، که ایجاد میکند و یک آرایه جدید ایجاد می کند. این متد apply  تعداد متغییرها را می گیرد. و  روی  companion object ، Array را تعریف می کند. که در جلوتر  در رابطه با companion objects صحبت مفصل خواهیم داشت.اگر یک برنامه نویس جاوا هستید ، می توانید به این روش فکر کنید یک متد  static  بنام apply ، در کلاس Array فراخوانی کنید. یک روش شفاف تر برای فراخوانی همان متد apply عبارت است از:val numNames2 = Array.apply(&#34;zero&#34;, &#34;one&#34;, &#34;two&#34;)استفاده از لیستهایکی از ایده های بزرگ برنامه نویسی functional این است که روشها نباید تاثیر گذار باشن.یعنی اینکه یک متد فقط باید یک کار انجام بدهد و یک مقدار خروجی برگرداند.برخی از مزایایی که هنگام استفاده از این متد ها به دست می آورید اینست که متدها کمتر درگیر می شوند و بنابراین قابل اطمینان تر و قابل استفاده مجدد هستند.یکی دیگر از مزایای آن ، این است که همه چیزهایی که وارد و خارج از یک روش می شوند توسط یک نوع چک بررسی می شود ، بنابراین خطاهای منطقی احتمالاً خود را به عنوان خطاهای نوع جلوه می دهند. استفاده از این فلسفه کاربردی در دنیای اشیاء به معنای تغییرپذیری اشیاء است.همانطور که مشاهده کردیدیک array  در اسکالا شامل یک مجموعه از دادهای پشت سر هم که از یک نوع می باشد.یک  [Array[String  فقط شامل کاراکتر می باشد.برای مثال ، اگرچه شما نمی توانید طول یک آرایه را بعد از آنکه تعریف کردید تغییر دهید ، اما می توانید مقادیر عنصر آن را تغییر دهید. بنابراین ، آرایه ها اشیاء قابل تغییر هستند.(mutable) ، اما برای دادهای پشت سرهم که غیر قابل تغییر باشد می توانیم از کلاس List اسکالا استفاده نماییم.همانند آرایه ها یک [List[String فقط شامل کاراکترها می باشد.scala.List با لیستی که در جاوا تعریف می شود java.util.List  متفاوت میباشد . لیستی که در اسکالا تعریف میشود غیر قابل تغییر می باشد.اما هر جایی که شما از لیست جاوایی استفاده کنید قابل تغییر می باشد.بطور کلی لیست اسکالا کلا برای بزنامه نویسی functional طراحی شده است. خیلی ساده میتونیم یک لیست رو ایجاد کنیم.شکل زیر رو ببینیم: هم ایجاد شده و هم مقدار دهی شده است در کد بالا یک مقدار جدید برای متغییر oneTwoThree مقدار دهی اولیه میکند که از جنس  [List[Int و عناصر آن اعداد صحیح می باشد.از آنجا که لیست ها تغییر ناپذیر هستند ، آنها کمی شبیه به رشته های جاوا رفتار می کنند: وقتی شما متدی را در لیست فراخوانی می کنید که ممکن است نام آن به نظر برسد این لیست تغییر می یابد ، در صورتیکه لیستی جدید با مقدار جدید ایجاد می کند.برای مثال List یک متدی که کار اضافه کردن را به عهده دارد، &#34;:::&#34;، حالا نحوه استفاده کردن آز ان را در زیر بیان می کنیم:val oneTwo = List(1, 2)&#xA; val threeFour = List(3, 4) &#xA;val oneTwoThreeFour = oneTwo ::: threeFour &#xA;println(oneTwo +&#34; and &#34;+ threeFour +&#34; were not mutated.&#34;) &#xA;println(&#34;Thus, &#34;+ oneTwoThreeFour +&#34; is a new list.&#34;)اگه ما اسکریپت بالا رو اجرا کنیم خواهیم داشت:List(1, 2) and List(3, 4)  این لیستها غیر قابل تغییر هستند&#xA;List(1, 2, 3, 4)  و این لیست یک لیست جدید می باشدشاید متداولترین عملگری که در لیست ها استفاده شود &#34;::&#34; باشد.که به معنی “cons”  می باشد .  cons  وظیفه اش اضافه کردن یک عنصر به ابتدای یک لیست که موجود هست می باشد . به اسکریپت زیر توجه کنیم : val twoThree = List(2, 3) &#xA;val oneTwoThree = 1 :: twoThree &#xA;println(oneTwoThree)اگر اسکریپت بالا اجرا کنیم به این میرسیم :List(1, 2, 3)توجه داشت باشیم  در عبارت 1:: twoThree   عملگر  :: یک متد عملگر راست  هست .در لیست twoThree ممکن است شما شک کنید که بعضی چیزهای غیر مرتبط با متد :: ، اما این یک قانون ساده است.اگر یک متد استفاده بشود در یک عملگری شبیه به این  در مجموعه ها : a*b ، متد این را یک عملگر چپ استفاده می کند.و به این شکل می باشد (a.*(b می باشد، مگر اینکه نام متد انتهایش با &#34;.&#34;  باشد .اگر یک &#34;.&#34;  در انتهای یک متد باشد آنیک عملوند راست می باشد.بنابراین در twoThree::1 ، &#34;::&#34;  متد twoThree  رو به عنوان یک عملوند سمت راست می پذیرد.و عدد 1 را به ان اضافه میکند به این صورت (twoThree.::(1،  ارتباطات عملگرها رو بصورت مفصل در نوشته های بعدی خواهم گفت.باید توجه داشته باشیم یک راه کوتاه برای اینکهیک لیست خالی هسا استفاده از Nil می باشد.یک راه دیگر مقدار دهی لیستها با ترکیب عناصر لیست با عملگر &#34;cons&#34;  می باشد که آخرین عنصر لیست را Nil قرار دهیم. برای مثال اسکریپت زیر همان خروجی را برای ما تولید می کند “(List(1, 2, 3”val oneTwoThree = 1 :: 2 :: 3 :: Nil &#xA;println(oneTwoThree)لیست ها در اسکالا بصورت متد های کاربری package بندی شده اند.بسیاری از انها را در زیر می آوریم و بعد ها در بخش های بعدی از قدرت لیست ها خواهم گفت، سوال اینجاست که ما چرا append  نداریم ؟چرا کلاس list  عملگر &#34;append&#34; را با استفاده از :+ ارائه می دهد.در این مورد ما شرح خواهیم داد بعدا، اما از این عملگر ما بندرت استفاده میکنیم. زیرا زمان لازم برای افزودن به یک لیست به طور خطی با اندازه آن لیست رشد می کند.در حالیکه ما از &#34;::&#34; متد استفاده میکنیم زمان آن ثابت می باشد.انتخاب شما برای انکه بخواهید یکلیست کاربردی بسازید با استفاده از append کردن بعد از اینکه انجام شد اگر بخواهید از دستور reverse و یا از دستور Listbuffer استفاده نمایید ، شما یک لیست قابل تغییر خواهید داشت.وقتی که از دستور toList استفاده بکنید. در مورد  ListBuffer نیز در آینده صحبت خواهیم کرد.یک تعداد از متدهای لیست رو در اینجا اشاره میکنیم  </description><category>محمود عباسی</category><author>محمود عباسی</author><pubDate>Fri, 24 Apr 2020 00:14:24 +0430</pubDate></item></channel></rss>