scala язык программирования обучение

Быстрый старт со Scala для начинающих и не очень

Авторизуйтесь

Быстрый старт со Scala для начинающих и не очень

Scala – строгий статически типизированный JVM-based язык, успешно совмещающий парадигмы объектно-ориентированного и функционального программирования. В языке есть классы, функции высшего порядка, анонимные функции, обобщенное программирование. Использование Java-кода из Scala не вызывает трудностей, синтаксически языки очень близки. В этой статье мы разберем основные элементы языка, достаточные для того, чтобы начать на нем писать.

Настройка окружения

Scala — язык, работающий на JVM, поэтому для работы требует установленную JDK (минимальная версия 1.6). Ее можно взять отсюда. После установки JDK можно приступить к установке самой Scala. Скачать свежую версию можно на официальном сайте. Последняя версия на момент написания статьи — 2.11.6.

Для того, чтобы сохранить эти настройки, их надо прописать в

На Windows команда немного другая:

Прописать эти опции постоянно можно в настройках системы: Control Panel → Advanced System Settings → Environmental Variables.

Старт 4 ноября, 9 месяцев, Онлайн, Беcплатно

После выполнения всех манипуляций можно проверить результат, запустив:

Примечание: если вы устанавливаете sbt, то можете пропустить отдельную установку scala, так как система сборки скачает ее автоматически

Исходники помещаются в папку src/main/scala и src/test/scala по пути, соответствующем иерархии пакетов (как в Java). Чтобы собрать, протестировать и запустить проект, необходимо в любой поддиректории проекта выполнить следующие команды:

или через интерактивную консоль:

Последовательное выполнение команд выглядит немного необычно (обратите внимание на точку с запятой в начале — это особенность синтаксиса):

Отличным помощником в разработке будет REPL (Read-Eval-Print-Loop), или по-другому, интерактивная консоль. Очень удобно проверять в ней небольшие функции, отлаживать код или просто посмотреть возможности языка. Для запуска REPL наберите sbt console в командной строке. Вы увидите примерно следующее:

Все! Можно писать команды на Scala и сразу же их выполнять:

Использование IDE для разработки на Scala не обязательно, однако сильно упрощает процесс. Скала — язык со сложной семантикой, поэтому возможности IDE более ограничены, чем, скажем, при разработке на Java. Тем не менее даже простая подсветка несуществующих методов и автодополнение существующих может сильно облегчить жизнь. Самые популярные IDE для Scala — это IntelliJ IDEA и Eclipse. Для IDEA есть плагин от JetBrains, в случае с Eclipse есть ее вариант Scala IDE.

Переменные, значения и типы.

Аналогичный код на Java будет выглядеть так:

Здесь мы видим сразу несколько приятных особенностей Scala:

Функции, анонимные функции, методы

Аналогичный код на Java:

Вызов метода apply подразумевается по умолчанию, поэтому использование функций внешне выглядит как в Java:

Все четыре вызова функции идентичны. Представление функций в виде объектов позволяет оперировать с ними, как с остальными объектами: передавать в качестве аргументов, возвращать из других функций, расширять дополнительными методами и т.д., что позволяет Scala полноценно поддерживать парадигму функционального программирования.

Конечно, присутствуют анонимные функции (лямбда-функции). Они объявляются так:

Классы и объекты

И аналогичный код на Java:

Как видим, public указывать не обязательно, аргументы конструктора доступны во всем классе, локальное приватное поле создавать также не обязательно.

Аналог на Java будет куда более многословен.

Интерфейсы и трейты

Ключевое слово override необязательно, но его использование является хорошей практикой.

Другие особенности и отличия от Java

Конструкция if / else всегда возвращает значение выражения, которое стоит последним ввыполняемом блоке. Скобки вокруг условия обязательны, скобки вокруг тела, в котором только одна инструкция, можно опустить.

Блок try / catch / finally выглядит в Scala так:

Циклы while ничем не отличаются от варианта в Java:

А циклы for — наоборот, совсем не похожи (о них мы подробнее поговорим в следующей статье):

Заключение

Итак, мы установили и настроили среду разработки для Scala, посмотрели основные элементы языка, сходства с Java и отличия от нее. Этого вполне должно хватить для того, чтобы начать писать простой и рабочий код. В следующей статье мы подробнее рассмотрим элементы функционального программирования, case-классы, pattern-matching и другие высокоуровневые особенности языка.

Источник

Scala как первый язык

Эта статья, как и мой предыдущий пост, не похожа на то, что обычно публикуют на Хабре. Здесь не объясняется никаких новых или старых концепций, я не рассказываю что такое ООП и функциональное программирование, сложного кода почти нет. Я хочу пригласить вас к дискуссии стоит ли начинать программировать с языка Scala.

Меня иногда просят научить программированию или помочь с поиском подходящего курса. Я хорошо понимаю недостатки и сложности со скалой, но думаю, что Scala 3 — подходящий язык, для того чтобы начать обучение с него, если правильно составить курс. Вся языковая мощь и сложность, конечно, не нужны начинающему программисту, но ему и незачем о них знать. На скале можно писать вполне простой и понятный код, постепенно наращивая инструментарий.

Я согласен с теми комментаторами, кто считает что для этого нужен толковый преподаватель. Это безусловно. Или талантливый преподаватель, который разбирается в предмете, или хорошая книжка, или толковый курс просто необходимы. Иначе есть риск захлебнуться, так и не научившись плавать.

И тем не менее я считаю, что Scala — это язык будущего.

Лестница в логотипе отсылает к институту EPFL в Лозанне. Там придумали этот язык

Если коротко, то Scala — это возможность научиться функциональному программированию на безопасном языке, у которого есть большое будущее

Умный компилятор

У скалы один из самых умных и сложных компиляторов. Это приводит к медленным билдам (особенно в первых версиях языка), и за это скалу хейтят. Но зато мы можем отдать компилятору очень много работы по анализу кода, проверке его на безопасность и отсутствие ошибок, что очень важно для программиста. Эта сложность — на стороне разработчика, в том числе и начинающего, которому компилятор очень помогает и облегчает работу.

Скала — это единственный язык, где я пишу код, и он сразу работает без утомительной отладки. Конечно, так происходит не всегда, но с джавой, джаваскриптом, си, паскалем и бейсиком так не происходило никогда. Я люблю говорить, что джава — это язык для компилятора, а скала — это язык для программиста.

JVM-экосистема

Как известно, Джеймс Гослинг, создатель языка джава, считает самой лучшей ее частью джава-машину. Действительно, много инженеров потратило десятки человеко-лет на разработку виртуальной машины и достигли скоростей, в некоторых случаях превышающих Си++. Вот исследование производительности JVM в мобильных устройствах, в нем чаще побеждает нативный код на Си, но в одном случае победила JVM: Java vs C app performance.

На Android 6 AArch64 JVM победила Си в математических вычислениях, хотя и проиграла во всех других видах

Java Memory Model (Модель памяти для многопоточных вычислений) — это зрелая, непротиворечивая, проверенная многими годами промышленного программирования парадигма, которая при правильном использовании гарантирует достаточный уровень абстракции и безопасности. Благодаря этому возможны удобные конструкции для параллельного программирования, доступные даже начинающим.

Кроме того, на джаве написаны миллионы строк кода, которые вы можете использовать из скалы или без проблем в нее транслировать.

Кстати, Джеймсу Гослингу скала тоже нравится.

Но в этом всем есть и минусы. Как мы знаем, высокоуровневые абстракции протекают, и для того чтобы программировать на скале, важно знать как устроена виртуальная машина джава, и учитывать ее особенности. Например, такие как Type Erasure. Это довольно серьезный минус, но плюсы от использования JVM его перевешивают.

Эволюция vs революция

В экосистеме скалы приняты довольно слабые гарантии обратной совместимости по сравнению с джавой. С одной стороны, это приводит к тому, что разработчикам постоянно приходится поддерживать свой код в форме при переходе на новую версию языка или библиотек. Кроме того, разработчикам библиотек приходится прибегать к кросс-компиляции для того чтобы обеспечить несколько версий скомпилированных библиотек, подходящих для нескольких версий языка. Это, безусловно, минус.

Но с другой стороны такой подход обеспечивает быстрое и динамичное развитие языка, которое не может себе позволить джава. Именно поэтому я думаю что будущее — за скалой.

К тому же, в Scala 3 появилось типизированное абстрактное синтаксическое дерево компилятора TASTY, которое позволит взаимодействовать классам, собранным разными версиями компилятора. Разумеется, начинающим программистам нет нужды разбираться в этом.

Scala 3

Благодаря более слабым гарантиям обратной совместимости, разработчики языка получили возможность пересмотреть его основы, включая синтаксис.

Первоначальным посылом к созданию скалы было сделать язык промышленного уровня, на котором будет приятно программировать. Это действительно был большой шаг вперед.

Но некоторые решения, принятые более 15 лет назад, были неверными и приводили к неочевидному, либо многословному коду. И сейчас создатели языка делают его действительно лучше. После этих изменений шансы скалы в качестве первого языка программирования заметно вырастают.

Я уже пару лет с нетерпением жду его выхода и мечтаю начать писать на нём. Вот сжатый рассказ Мартина Одерски про новую версию языка: Countdown to Scala 3 by Martin Odersky. Для опытных разработчиков — интересная статья Annoying things in Scala 2 that’ll be (mostly) gone in Scala 3

Dependent Object Types — это теоретические основы языка Scala 3, разработанные его основателем Мартином Одерски. Мало какой язык может похвастать математически точным исчислением, лежащем в его основе.

Мартин Одерски

Согласитесь, приятно учить язык с таким бэкграундом, хотя начинающим программистам знать о нём не обязательно.

Выразительность и лаконичность

То, что я больше всего люблю в языке — это его сжатость и лаконичность. Я ненавижу длиннейшие конструкции джавы, в которых приходится сложно и многословно объяснять компилятору простые вещи. Моя любимая шутка про джаву — что это такой язык, в котором уан-лайнер занимает около 30 строк. Так вот, в скале уан-лайнер — это уан-лайнер.

Я думаю, что это качество важно не только для опытных разработчиков, но и для тех кто только изучает язык. Думаю, выразительность — это та причина, по которой так популярны динамические и скриптовые языки. Уверен, скала способна с ними в этом поспорить. И даже сама послужить отличным скриптовым языком.

Конечно, лаконичность не должна наносить ущерб читаемости кода. Таких неудачных примеров в программировании полно, вспомним регулярные выражения, паттерн-матчинг и парсер-комбинаторы. Понятно, что для написания библиотек важно понимать сложные концепции и знать много умных слов. Но для того, чтобы ими пользоваться и писать простой код, всего этого знать не надо. Минимальный уровень скалы, который подойдет начинающим, очень простой.

Вот мой любимый пример для библиотечного кода на скале. Конечно, он не предназначен для начинающих разработчиков:

В новой версии языка даже есть возможность писать намного меньше фигурных скобок, если есть желание. Это будет выглядеть примерно так:

Статическая типизация

По-моему это самое важное, что должно быть в первом языке программирования. Программисту важно понимать, что не стоит складывать яблоки с апельсинами.

Именно по этой причине на мой взгляд не стоит начинать обучение с Питона, Руби, Джаваскрипта, Си и Си++. Динамическая типизация — это верный способ выстрелить себе в ногу.

Другое дело, что статическая типизация неудобна, неочевидна и требует дополнительного бойлер-плейта. Скала вполне успешно позволяет избавиться от этих недостатков в простых программах.

Объектно-ориентированное программирование — это самая популярная парадигма, без которой не обходится ни один современный язык программирования.

В скале эта парадигма изначально присуща языку, в отличии от Питона, Си/Си++ и в каком-то смысле джаваскрипта. Разумеется, сейчас у этих языков с ООП полный порядок.

Функциональное программирование

Функциональное программирование — это многообещающая тенденция. Скале она присуща в не меньшей степени чем ООП, и они взаимно обогащают друг друга благодаря этому языку. Рискну предположить, что скала — первый язык промышленного уровня с такими свойствами. Сейчас за ним подтягивается Котлин и другие более новые языки.

Начинающим разработчикам стоит узнать про функциональное программирование подробнее, этот подход позволяет писать гибкий, надежный и хорошо масштабируемый код. Вот несколько хабропостов о нём:

Иммутабельность

Вообще-то это свойство функционального программирования. Мне кажется очень важным прививать умение пользоваться неизменяемыми структурами данных с самого начала. Это позволит в будущем создавать безопасный многопоточный код. И не только многопоточный.

Расширяемость

Как известно, название языка изначально преподносилось как аббревиатура Scalable Language. Особенности языка позволяют писать гибкие и красивые DSL, удобные даже для не-программистов, вкладывать абстракции друг в друга, создавать очень удобные библиотеки и простые скрипты.

Часто этот инструмент обращается против пользователей библиотек, повышая порог входа в их API. Но в умелых руках такая гибкость может обратиться в большое благо. Опытные разработчики могу создавать на Scala простое и удобное API, тем самым заметно облегчая жизнь начинающим программистам.

В целом язык скала предоставляет большое количество мощных инструментов, и обратная сторона этого — высокий порог входа, особенно в отсутствии хорошего курса, учебника, или наставника.

Но думаю, что с хорошим наставником или туториалом вполне можно начинать изучать программирование с языка скала и получать правильные привычки статической типизации, функционального программирования и иммутабельных структур данных.

Источник: https://prwatech.in/blog/apache-spark/introduction-to-scala-programming-language/

Рынок вакансий

Конечно, вакансий для скала-программистов значительно меньше, чем для джава-программистов. Но зато Scala выше оплачивается.

https://insights.stackoverflow.com/survey/2019

Вот вам картинка про области применения скалы:

Источник: https://prwatech.in/blog/apache-spark/introduction-to-scala-programming-language/

Мои первые книжки

Самая лучшая книжка про скалу, которую я читал — Scala by Example Мартина Одерски, написанная уже 10 лет назад. Прежде чем начинать сейчас читать книгу по скале, очень рекомендую убедиться что она обновлена до версии Scala 3.

А любимый курс — это Functional Programming in Scala, я проходил его в самой первой версии, с тех пор он, конечно, успел измениться. Первые уроки этого курса основываются все на той же Scala by Example. Сейчас команда курса работает над его обновлением.

Если вы хотите поиграть скалой или дотти, не устанавливая IDE — добро пожаловать в Scastie.

Пример кода

Много примеров короткого кода на скале можно найти вот в этом обсуждении: Samples of Scala and Java code where Scala code looks simpler/has fewer lines? Вот один из них:

Scala

Java 8

Java 7

Поступь прогресса

На прощанье — шутка Кея Хорстмана «The March of Progress»

1980: C

1988: C++

1996: Java

2004: Java

2008: Scala and Groovy

2012: Scala 2.10

На этом я рискну опубликовать этот пост, но по-прежнему планирую его дописывать по результатам обсуждения с вами.

Источник

12 хороших курсов по Scala для тех, кто уже что-то знает

Язык программирования Scala громко заявил о себе в 2010-е годы. Сейчас ажиотаж вокруг него спал, но забывать о Scala точно не стоит. Это один из самых популярных коммерческих языков, который используют Twitter, LinkedIn, WhatsApp. Scala-разработчики, возможно, не так востребованы как их коллеги, пишущие на Python или Java, но хороший специалист будет цениться высоко, а знание языка станет безусловным плюсом в резюме. В помощь тем, кто хочет пополнить ряды адептов Scala, Digitaldefynd составил (а мы дополнили) подборку онлайн-курсов и тренингов разных уровней сложности.

Язык программирования Scala громко заявил о себе в 2010-е годы. Сейчас ажиотаж вокруг него спал, но забывать о Scala точно не стоит. Это один из самых популярных коммерческих языков, который используют Twitter, LinkedIn, WhatsApp. Scala-разработчики, возможно, не так востребованы как их коллеги, пишущие на Python или Java, но хороший специалист будет цениться высоко, а знание языка станет безусловным плюсом в резюме. В помощь тем, кто хочет пополнить ряды адептов Scala, Digitaldefynd составил (а мы дополнили) подборку онлайн-курсов и тренингов разных уровней сложности.

Содержание
spoiler#handleClick»>Примечание редакции

Стоимость указана на момент подготовки материала и носит ориентировочный характер.

Актуальные скидки и промокоды некоторых онлайн-площадок можно найти по ссылке.

Apache Spark на Scala для работы с большими данными (Udemy)

Курс разработан для того, чтобы помочь изучить Apache Spark, известную технологию в области BigData. Вы узнаете, как извлекать смысл из массивных наборов данных в отказоустойчивом кластере Hadoop. Освоите искусство формулирования проблем анализа данных при помощи многочисленных практических примеров и научитесь масштабировать их для выполнения в службах облачных вычислений.

Преимущества курса

spoiler#handleClick»>Отзыв

«Это превосходный курс по Spark и Scala. Я никогда не видел ничего подобного среди онлайн-курсов. Я рекомендую его всем, кто хочет иметь ясное понимание концепций Spark. Спасибо за прекрасный курс».

Продолжительность: 9 часов.

Рейтинг: 4.5 из 5.

Scala и Spark для работы с большими данными и машинного обучения (Udemy)

Работа со Spark и Scala — востребованный навык в ИТ-индустрии. Эта сертификация начинается с краш-курса по Scala и дает обзор экосистемы больших данных и Spark. В ней есть множество возможностей получить практический опыт работы с Mlib, платформой для аналитики больших данных Databricks и другими инструментами. После завершения сертификации вы сможете с уверенностью добавить полученные навыки в резюме.

Преимущества курса

spoiler#handleClick»>Отзыв

«Я приобретал другие курсы Jose и раньше. Я познакомился с введением в Scala и Spark на разных ресурсах, включая курсы Udemy, и хотел получить более структурированный материал. Репутация Jose как преподавателя, который объясняет все шаг за шагом, дала мне уверенность, чтобы записаться на этот курс. Мне нравится, что он объясняет „Почему“, а не просто фокусируется на том „Как“. Этот курс наконец-то связал для меня все воедино».

Продолжительность: 10 часов.

Рейтинг: 4.4 из 5.

Scala и функциональное программирование для начинающих (Udemy)

Если у вас есть опыт программирования на любом языке и вам хочется добавить в список своих скилов еще и работу на Scala, то можете обратить внимание на этот курс. Всего 15 часов лекций и, по словам инструктора, вы сможете понимать код Scala в производственных средах и проектах с открытым исходным кодом, научитесь с нуля создавать приложения на этом языке и получите навыки, которые позволят вам работать с такими инструментами, как Spark, Akka и Play.

Преимущества курса

Продолжительность: 15.5 часов.

Рейтинг: 4.6 из 5.

Принципы функционального программирования в Scala (Coursera)

В этой комплексной программе вы изучите элементы стиля функционального программирования и научитесь использовать их для решения ваших повседневных задач. Начнете с создания прочной основы для рассуждений о функциональных программах, прежде чем перейти к доказательству инвариантов и символическому отслеживанию выполнения. Если у вас есть опыт программирования на Java, C#, C, C++, Python, Javascript или Ruby (от одного года), то вы более чем готовы к обучению на этой сертификации.

Преимущества курса

spoiler#handleClick»>Отзыв

«По-настоящему хорошее объяснение инструктора. Хорошие задания. Они дают четкое представление о функциональном программировании. Мне понравилось, как проблемы были разделены на более мелкие».

Продолжительность: 23 часа, по 5 часов в неделю.

Рейтинг: 4.8 из 5.

Scala и функциональное программирование: продвинуты уровень (Udemy)

Курс создан для разработчиков, знакомых со Scala, которые хотели бы усовершенствовать свои знания и навыки. Для того, чтобы пройти данную программу, обязательно иметь хорошее понимание этого языка и функционального программирования. На курсе отобраны и рассмотрены самые важные идеи Scala, продвинутые концепции деконструируются на критические части, а вся теория поддержана демонстрацией реального кода. Полученный на программе опыт поможет продвинуться в разработке сложных масштабируемых систем, настройке существующих инструментов и создании своих собственных.

Преимущества курса

Продолжительность: 14 часов.

Рейтинг: 4.8 из 5.

Специализация по функциональному программированию на Scala (Coursera)

Эта специализация разработана для практического знакомства с популярным языком Scala, а также функциональным программированием. Занятия начинаются с изучения базового блока функциональных парадигм и их использования для решения небольших проблем, а затем переходят к объединению концепций и более крупным задачам. Вы узнаете, как эта парадигма упрощает параллельное и распределенное программирование. К концу обучения вы сможете эффективно применять новые знания в соответствующих проектах.

Преимущества курса

Продолжительность: 5 месяцев, по 5 часов в неделю.

Рейтинг: 4.7 из 5.

Обработка больших данных при помощи Spark Streaming и Scala: практикум (Udemy)

На этом курсе вы получите навыки практической работы с данными Twitter в реальном времени, смоделированными потоками журналов доступа Apache и даже данными, которые используются для обучения моделей машинного обучения. Узнаете, как написать и запустить реальные потоковые задания Spark и завершите обучение, перенося их в кластер Hadoop и запуская в производственной среде.

Преимущества курса

spoiler#handleClick»>Отзыв

«Фантастическая структура, предупреждения компилятора, которые могут сбить с толку кого угодно при запуске кода, и побудили меня создать готовый работающий пакет Spark Streaming за 20 минут. С нетерпением жду того, чтобы проверить код и разобраться с оптимизациями и другими источниками потоковой передачи».

Продолжительность: 6 часов.

Рейтинг: 4.4 из 5.

Анализ больших данных со Scala и Spark (Coursera)

Этот курс покажет вам, как парадигма параллельных данных может быть распространена на распределенный случай с помощью Spark. Изучите модель программирования Spark и поймите, чем она отличается от других, знакомых вам. Получите практический опыт и выясните, когда стоит учитывать вопросы, связанные с распределением, и как они могут сделать работу более эффективной. К концу занятий вы будете в состоянии читать данные из постоянного хранилища, управлять ими, выражать алгоритмы в функциональном стиле.

Преимущества курса

Продолжительность: 28 часов.

Рейтинг: 4.7 из 5.

Scala для начинающих (Udemy)

Данная программа подойдет всем, кто хочет получить комплексное представление об языке программирования Scala и изучить его с нуля. Курс представляет сбалансированное и подробное введение в Scala и его концепции, включая библиотеки Actors и Collections. Если верить преподавателю, то к концу обучения, при условии выполнения всех заданий, вы будете иметь прочные теоретические знания и практические навыки, которые позволят вам уверенно программировать на Scala и использовать все необходимые для этого инструменты.

Преимущества курса

Продолжительность: 5.5 часов.

Рейтинг: 4.7 из 5.

Программирование на Scala (Artima)

Если вы интересуетесь программированием на Scala, но не знаете, с чего начать, то это — подходящий вариант. Разработанное иначе, чем большинство курсов, это руководство рассматривает темы шаг за шагом и отлично подойдет студентам, которые предпочитают учиться по книгам. Кроме основных тем, в нем также рассказывается, как работать с XML, модульным программированием и программированием с графическим интерфейсом, равенством объектов и многое другое. Этот курс со множеством примеров и кодов — фаворит пользователей.

Преимущества курса

Продолжительность: определяете сами.

Рейтинг: 4.4 из 5.

Стоимость: бесплатно.

Apache Spark 3: программирование Spark на Scala для начинающих (Udemy)

Этот курс был разработан, чтобы помочь всем желающим разобраться с программированием Spark и начать применять полученные знания для создания решений по инженерии данных. Вы начнете обучение со знакомства с архитектурой Spark и его фундаментальными концепциями, а затем перейдете к более специфическим темам. Курс основан на рассмотрении конкретных примеров и «живом» кодировании, поэтому все необходимые концепции в нем объясняются по ходу. Для студентов, которые хотят пройти эту программу, обязательно знакомство со Scala.

Преимущества курса

Продолжительность: 7 часов.

Рейтинг: 4.6 из 5.

Проекты с консультациями по программированию на Scala (Coursera)

Новый формат обучения от Coursera — проекты с консультациями — позволяет в сжатые сроки (до 2-х часов) получить полезные навыки, например, изучить основы Scala, разработав мини-игру или объектно-ориентированное программирование на этом языке, практикуясь в написании кода. Обучение проходит в режиме разделенного экрана под руководством преподавателя, который дает вам пошаговые инструкции. Проекты лучше всего подойдут студентам, хотя бы немного знакомым со Scala, а также любым другим языком программирования. Обратите внимание: данный формат недоступен для мобильных устройств и в режиме бесплатного прослушивания.

Преимущества курса

Продолжительность: 1.5 — 2 часа.

Хотите сообщить важную новость? Пишите в Телеграм-бот.

А также подписывайтесь на наш Телеграм-канал.

Источник

Понравилась статья? Поделиться с друзьями:

Не пропустите наши новые статьи:

  • scala язык программирования для чего
  • Scala что за язык программирования
  • scad расчетная программа обучение
  • sbis что это за программа
  • Sbis launcher что это за программа

  • Операционные системы и программное обеспечение
    0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest
    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии