\documentclass[../j-spec.tex]{subfiles} \begin{document} \section{Платформа: история и окружение} \begin{longtable}{|p{35mm}|p{135mm}|} \hline Экран & Слова \\ \hline \endhead Титул & Добро пожаловать на техническую специализацию Java, лучшую из всех технических специализаций Java, что вы сможете найти \\ \hline Обо мне ИТ & Здравствуйте, меня зовут Иван, я разработчик программного обеспечения в Российских космических системах, начальник группы программистов, автор и преподаватель нескольких курсов в направлении программирования на портале GeekBrains. Пара слов обо мне, почему я нахожусь здесь и планирую Вам что-то рассказывать про язык Java? Для этого придётся вынести за скобки мой опыт работы в цифровой схемотехнике и других языках, в том числе создание бортовой аппаратуры, которая прямо сейчас летает у нас над головами или продолжает доставлять другие полезные грузы в космос. \\ \hline Обо мне Java & С точки зрения языка Java, обо мне можно сказать, что я являюсь разработчиком нескольких отраслевых информационных систем поддержки единой наземной инфраструктуры российского космического агентства. На моём счету также участие в межотраслевых проектах по созданию единых баз данных космического применения \\ \hline О курсе (Устройство фреймворк ооп ввод-вывод терминал) & Данный курс, первый из технической специализации, направлен на первое знакомство со внутренним устройством языка и фреймворком разработки приложений с его использованием. Курс демонстрирует механизмы работы знакомых студенту концепций на примере языка Java. В рамках курса будут рассмотрено устройство языка Java и сопутствующих технологических решений, платформы для создания и запуска приложений на JVM-языках (Groovy, Kotlin, Scala, и др). Будут рассмотрены некоторые базовые пакеты ввода-вывода, позволяющие манипулировать данными за пределами программы. В результате прохождения курса у вас, слушатели, должно появиться знание принципов работы платформы Java, понимание того, как язык выражает принципы программирования, его объектную природу. Вы научитесь писать базовые терминальные приложения и утилиты, решать задачи (в том числе алгоритмические, не требующие подключения сложных библиотек) с использованием языка Java и с учётом его особенностей \\ \hline На уроке (История состав проект документирование) & На этом уроке мы поговорим о краткой истории и причинах возникновения язка; что нужно скачать, откуда и как это всё выбирать; из чего всё состоит; изучим простую структуру проекта и способы его запуска; коротко рассмотрим утилиту джавадок. Рассмотрим примитивный инструментарий и базовые возможности платформы для разработки приложений на языке Java. В конце урока рассмотрим альтернативные способы сборки проектов, популярные и не очень. \\ \hline История (логотип sun, Oracle; график tiobe) & Итак язык Java. Согласно википедии, Java — строго типизированный объектно-ориентированный язык программирования общего назначения, разработанный компанией Sun Microsystems. Разработка ведётся сообществом; язык и основные реализующие его технологии распространяются по лицензии GPL. Приложения Java обычно транслируются в специальный байт-код, поэтому они могут работать на любой компьютерной архитектуре, для которой существует реализация виртуальной Java-машины. Дата официального выпуска — 23 мая 1995 года. Традиционно занимает высокие места в рейтингах популярности языков программирования (3-е место в рейтинге TIOBE (на август 2022)). На графике отлично видно, что с 2002 года язык уверенно держится в тройке популярных, значительную часть времени возглавляя его. Но это всё - сухие факты, ничего не говорящие нам о том, чем руководствовались разработчики языка и что нам, программистам, с этим делать. \\ \hline История (кофемашина, star7, Symbian, игры на старых телефонах, провели опрос) & Существует, интересная версия происхождения названия языка, связанная с аллюзией на кофе машину как пример бытового устройства, для программирования которого изначально язык создавался. Кстати, в результате работы проекта мир увидел принципиально новое устройство, карманный персональный компьютер, который опередил своё время более чем на 10 лет, но из-за большой стоимости не смог произвести переворот в мире технологии и был забыт. Устройство Star7 не пользовалось популярностью, в отличие от языка программирования Java и его окружения. С середины 1990-х годов язык стал широко использоваться для написания клиентских приложений и серверного программного обеспечения. Тогда же некоторое распространение получила технология Java-апплетов — графических Java-приложений, встраиваемых в веб-страницы; с развитием возможностей динамических веб-страниц технология стала применяться редко и язык стал применяться для бэк-энда \\ \hline Почему Java? (Лого с, с++, Паскаль, Eiffel, ada; написано однажды работает везде) & Язык программирования Java занял свою нишу в системном и прикладном программировании из-за своей высокой скорости работы, и веб-программировании, из-за удобного сетевого окружения, ставшего основой для создания бэк-энда веб-сервисов. Java очевидно испытал влияние языков C, C++, Pascal и других, так что многое в этих языках достаточно досконально изучить один раз, чтобы иметь возможность понимать все связанные. Поскольку язык изначально проектировался для множества разнообразных исполнителей с разными архитектурами процессоров и систем, было принято решение отделить исполнителя от решаемой прикладной задачи, так появилась виртуальная машина Java, речь о которой пойдёт немного позже. Основной смысл в том, что у языка Java появился девиз: Написано однажды, работает везде. \\ \hline учёный котик далее УК. Задание для самопроверки & Как Вы думаете, почему язык программирования Java стал популярен в такие короткие сроки? (3) \begin{itemize} \item существовавшие на тот момент Pascal и C++ были слишком сложными; \item Java быстрее C++; \item Однажды написанная на Java программа работает везде. \end{itemize} \\ \hline \begin{enumerate} \item Eclipse \item NetBeans \item IntelliJ IDEA \item BlueJ \item Oracle JDeveloper \item MyEclipse \item Greenfoot \item jGRASP \item JCreator \item DrJava \end{enumerate} отвертка шуруповёрт котики с инструментами & Мы привыкли к тому, что для программирования нужна некоторая среда, которая будет удобно подсказывать нам, что делать, как писать программу, запускать написанный код и помогать нам отлаживать его. Чаще всего это так, но я призываю вас не останавливаться на единственном инструменте, ведь если быть всегда сосредоточенным на отвёртке, вы никогда не узнаете, что люди придумали очень удобный шуруповёрт. Я не планирую рекламировать ту или иную среду, скорее всего не буду даже много говорить о плюсах и минусах той или иной среды, просто покажу список и коротко расскажу о главных действующих лицах \\ \hline Инструмент нетбинс (старый добрый котик) & NetBeans - если коротко, то эта среда с нами из уважения к истории, она была первой, созданной для разработки на языке Java. Долгое время разработка этой среды не велась, но в последние несколько лет разработчики как будто бы вспомнили о ней и активно взялись за дело, сейчас есть версии под все популярные ОС, поддерживается весь популярный современный функционал, есть прикольные самобытные моменты, вроде расширенных клавиатурных макросов для написания функций с передаваемыми в них массивами \\ \hline Инструмент эклипс (котик многостаночник, мультитул, музыкант на всех инструментах) & Eclipse - проще, наверное, назвать язык или технологию, под которую нет плагина для этой весьма расширяемой и дополняемой среды программирования. Долгое время, вплоть до недавнего, а где-то и до сих пор, является корпоративным стандартом для написания Enterprise приложений и прочих сложных корпоративных приложений. Весьма гибкая среда и-за того, что разрабатывается Eclipse Foundation к ней можно подключить плагины, решающие почти любые задачи разработки. Из того что я видел своими глазами, Siemens использует Eclipse для разработки своих систем поддержки жизненного цикла изделий; \\ \hline Инструмент идея (современный стильный котик) & IntelliJ IDEA - стандарт де-факто примерно десять последних лет. Не уверен, можно ли назвать эту среду российской разработкой, но у компании, разрабатывающей эту среду, три русских учредителя. Да и сама эта компания началась именно с этой среды. В этой среде можно настроить почти любую деталь, что часто бывает очень удобно. Среда расширяется плагинами на почти все случаи жизни разработчика. Часто входит в экосистему JetBrains, развёрнутую на предприятии, поэтому тесно интегрируется в другие сферы деятельности компании. Существует как бесплатная, так и платная версия с расширенным функционалом, например, доступа к базам данных \\ \hline Инструмент андроид студия (мобильник, андроид котик с телефоном) & Отдельно стоит обговорить такую среду, как Android Studio, как мог заметить внимательный зритель, её нет в списке на слайде, но не потому, что в ней нельзя разрабатывать Java-приложения, а потому что если не разрабатывать в ней именно Android приложения, следует отказаться от её использования из-за некоторой избыточности. Среда снабжена значительным количеством надстроек и эмуляторов мобильных устройств, которые попросту будут вам мешать, если вы не используете их в своей профессиональной деятельности. С другой стороны, если ваша цель - это именно мобильная разработка под Android, то и выбора у вас особо нет, только Android Studio \\ \hline УК Задание для самопроверки & Как Вы думаете, почему среда разработки IntelliJ IDEA стала стандартом де-факто в коммерческой разработке приложений на Java? (4) \begin{itemize} \item NetBeans перестали поддерживать; \item Eclipse слишком медленный и тяжеловесный; \item IDEA оказалась самой дружелюбной к начинающему программисту; \item Все варианты верны. \end{itemize} \\ \hline Что нужно скачать (ждк, среда) котик думает & Для разработки на языке Java вам может понадобиться довольно много разного инструментария, тем более, что требования к инструментарию отличаются ещё и от команды к команде \\ \hline Что нужно скачать (ждк, все 4 среды, dbeaver, anylogic, matlab, uml, teamcity, confluence, jira) котик в растерянности & вам может потребоваться средство для работы с БД, средства моделирования и описания систем, дополнительные средства документирования кода и решений. Но совершенно точно можно сказать, что без двух вещей обойтись не удастся: это иде, они же среды программирования и ждк, он же инструментарий разработчика на java.\\ \hline Что нужно скачать (ждк, среда) довольный котик & О средах программирования дополнительно только что поговорили, нужно выбрать какую-нибудь, и скачать. Скорее всего вы это сделали для прохождения более ранних курсов, сейчас сможете для себя выбрать инструмент более осознанно. В курсе, кроме этой лекции и следующего за ней семинара, будет использоваться комьюнити версия среды Intellij IDEA, можете для простоты выбрать её, что вы уже скорее всего и сделали. Наверняка, для прохождения предыдущих курсов вы уже скачали и установили JDK какой-нибудь хорошей новой версии, а сейчас пришла пора разобраться, что это, какие они бывают, откуда их брать и как их выбирать, мы же за осознанность как-никак \\ \hline \begin{enumerate} \item Oracle JDK \item OpenJDK by Oracle \item Liberica JDK \item экзотические \begin{itemize} \item GOST Java \item AdoptOpenJDK \item Red Hat OpenJDK \item Azul Zulu \item Amazon Corretto \end{itemize} \end{enumerate} & Итак, вендоры и версии. JDK развивается, поэтому выходят новые версии, исправляющие предыдущие недочёты, добавляющие новую функциональность. Самая распространённая версия в современной российской действительности - восьмая, но есть очень серьёзный тренд на переход к 11 и 13й версиям, на более новые часто смотрят с опаской. Распространённых вендоров три - оракл, опен, либерика. Есть, конечно, компании, собирающие свой инструментарий из открытых источников самостоятельно, но их крайне мало. Про экзотических вендоров рассказывать смысла не много, важно помнить, что они есть и у них у всех разные лицензионные политики. Я в курсе буду использовать либерику, как делаю последние несколько лет, хотя довольно долгое время пользовался ораклом. Поскольку я работаю в около- государственной компании, не могу не упомянуть о ГОСТ джаве, которая часто всерьёз рассматривается в организациях, подобных моей, и об опенЖДК, который является основой для самостоятельных сборок инструментария. Наиболее популярной, конечно, является оракл ждк, но, если мне будет позволено высказать персональное мнение, это больше дань традиции, нежели какая-то жизненная необходимость\\ \hline Особенности \includegraphics[width=35mm]{../pics/jc-01-jdk-contrib.png} офис с котиками & Если внимательно посмотреть на компании, внесшие вклад в развитие открытой части инструментария, начиная с ждк11 и до актуального на сегодня ждк18, конечно, максимально вкладывается оракл, но и беллсофт, производитель либерики, там будет в первой десятке. Повторюсь, я на курсе буду использовать либерику ждк11, благо для неё есть и докер-образ, если нужно как-то автоматизировать сборки вашего приложения, например; вы можете использовать любую другую не старше 8. Все примеры я буду приводить с учётом именно 8й версии языка, чтобы рассмотреть подходящий подавляющему большинству людей инструментарий \\ \hline Ждк 1.8 (11 ок 13 ок; 11+ 1.8 депрекейтед) & Если у вас уже установлена 11я версия от другого вендора - ничего менять не нужно, если установлена более новая версия, есть вероятность, что некоторые примеры будут отмечаться как чрезвычайно устаревшие, возможно, эти предупреждения на этапе обучения следует игнорировать \\ \hline Внимательно прочтите лицензию. 1.8 ок 11 ок 13 ок & Для выбора вендора внимательно ознакомьтесь с лицензией, а для выбора версии языка руководствуйтесь здравым смыслом: большинство компаний в России и мире работают на 8, 11 или 13й версиях. Зачем учиться на какой-нибудь 18-й версии, если потом на работе вы не увидите половины каких-нибудь новых фич и фактически, придётся переучиваться? \\ \hline Сдкман докер лого & Из-за обилия вендоров и версий, которые нужно поддерживать, создаётся необходимость в автоматизации переключения между версиями. На помощь приходят инструменты, наподобие SDKMan, написанные на языке bash, позволяющие осуществить этот самый рутинный и утомительный менеджмент. Очевидным недостатком SDKMan является то, что помимо самого СДКМан нужно установить требующиеся версии и варианты ЖДК специальными внутренними командами. Хотя, например, можно перевести приложение в режим офлайн и попробовать как-то поплясать с бубном вокруг настроек. Думаю, что если в команде используется этот инструмент, для него уже есть все необходимые скрипты настроек и автоматизации. Есть и другие варианты, об одном из них (Docker) мы поговорим позднее в этой лекции \\ \hline Скриптинг \includegraphics[width=35mm]{../pics/jc-01-jupyter-logo.png} Иногда нужно по-быстрому (jupyter notebook, IJava) бегущий или буксующий котик & Для решения некоторых несложных задач курса мы будем писать простые приложения, не содержащие ООП, сложных взаимосвязей и проверок, в этом случае нам понадобится Jupyter notebook с установленным ядром (kernel) IJava. Да, многие думают, что Jupyter ноутбуки - это только для языка пайтон или для скриптовых языков, но это не так. Архитектура юпитер ноутбука позволяет ему работать с любым ядром, главное, чтобы ядро умело корректно интерпретировать написанное в ячейке с кодом. Ядро IJava делает именно это - интерпретирует Java-код, используя установленный на компьютере разработчика JDK \\ \hline \begin{itemize} \item \code{PATH} \item \code{JAVA_HOME} \item \code{JRE_HOME} \item \code{J2SDKDIR} \item \code{J2REDIR} \end{itemize} & Для корректной работы самого инструментария и сторонних приложений, использующих тот инструментарий, проследите, пожалуйста, что установлены следующие переменные среды ОС: в системную \code{PATH} добавить путь до исполняемых файлов JDK; \code{JAVA_HOME} путь до корня JDK; \code{JRE_HOME} путь до файлов JRE из состава установленной JDK; \code{J2SDKDIR} устаревшая переменная для JDK, используется некоторыми старыми приложениями; \code{J2REDIR} устаревшая переменная для JRE, используется некоторыми старыми приложениями. Это позволит вам не особенно много думать о настройках видимости библиотек ОС при дальнейшей установке инструментария, например, сборщиков проектов. \\ \hline УК Задания для самопроверки & \begin{enumerate} \item Чем отличается SDK от JDK? (J это частный случай, больше спец. библиотек) \item Какая версия языка (к сожалению) остаётся самой популярной в разработке на Java? (8, 1.8) \item Какие ещё JVM языки существуют? (Scala, Kotlin, Groovy) \end{enumerate} \\ \hline ЖДК и его друзья. TL;DR: \begin{itemize} \item JDK = JRE + инструменты разработчика; \item JRE = JVM + библиотеки классов; \item JVM = Native API + механизм исполнения + управление памятью. \end{itemize} & Очень часто в интернете, при скачивании какого-то программного обеспечения, связанного с Java можно увидеть разные аббревиатуры: JRE, JVM, JDK и тому подобные, и чтобы в них не запутаться давайте коротко и быстро разберёмся что они значат, потому что я чувствую, как вам уже начинают надоедать все эти вступления. \\ \hline Ждк = Java сдк (ждк, жре+компилятор, музыкант с инструментами, кот с апгрейдами) & Пойдём от самого масштабного и общего к самому маленькому и частному. Самая масштабная и общая аббревиатура - это JDK Java Development Kit - инструментарий разработчика на языке Java. Это обычный SDK который содержит в себе также всё необходимое для разработки именно на языке Java здесь есть куча других аббревиатур, компилятор, средства развёртывания, создания документации, итд они позволяют удобно писать программы на языке Java и абстрагируют программиста от необходимости описывать все вспомогательные процессы непосредственно на языке программирования то есть, грубо говоря это некие классы которые инкапсулирует сложное преобразование текста программ в простой интерфейс разработчика \\ \hline Жре (просто кот) & Всё, что разрабатывает разработчик, исполняется в специальной среде это среда является частью JDK и позволяет исполнять все программы написанные разработчиками на конечном в компьютере. Именно эта среда и устанавливается на компьютере пользователя чтобы пользователь мог запускать приложения, написанные на языке Java. Итак, самая необходимая вещь для любого пользователя это JRE. Это аббревиатура расшифровывается как Java Runtime Environment, то есть среда исполнения программ на языке Java. \\ \hline Жвм (сердце) & Она содержит в себе основной внутренний механизм который называется Java virtual machine и библиотеку из разных классов чтобы эта виртуальная машина хорошо работала умела показывать пользователю строки осуществлять ввод-вывод фреймворк коллекций и прочее \\ \hline Жре (жсе, жни, ждбс, …; жее, +ежб, …) & тут тоже есть куча интересных аббревиатур, которые мы так или иначе изучим, например, Java native interface, Java database connectivity и другие. Если копнуть ещё чуть глубже, можно и JRE разделить на JSE и JEE, но нас это деление пока не очень интересует, оно произойдёт естественным образом на более старших курсах. Пока что всё, что мы будем изучать, это JSE \\ \hline 16 & Инструментарий разработчика мы будем так или иначе рассматривать весь оставшийся курс, части среды исполнения мы тоже будем всесторонне изучать на последующих уроках. Сейчас хотелось бы подробнее остановиться на виртуальной машине Java, поскольку понимание того, как она устроена, должно значительно облегчить для вас понимание процесса исполнения программы и, как следствие, процесс разработки этих самых программ. \\ \hline Классы байт-код - жвм(загрузчик - память - жит) - вызовы ОС - проц - ввод-вывод - потребитель например кот & Виртуальная машина Java осуществляет загрузку классов программы в оперативную память, причём здесь имеется ввиду не оперативная память как аппаратная часть компьютера, а некая выделенная часть этой оперативной памяти, которой с нами поделилось операционная система. Также осуществляется управление памятью, а именно очистка и сборка мусора и непосредственное исполнение классов нашего приложения, путём компиляции методов из промежуточного байткода в непосредственные вызовы операционной системы или другого исполнителя, то есть грубо говоря преобразования классов Java в ассемблерный код конкретного компьютера. Этот процесс называется JIT компиляция \\ \hline Жит и гц (Память и концентрация внимания) котик думает хмурится & Существуют разные Реализация виртуальных машин (Список можно посмотреть, например, в википедии), даже экзотические, например мультиязыковой интерпретатор GraalVM. По большей части виртуальные машины отличаются как раз этой частью, с Just In Time компиляцией, то есть с преобразованием методов в непосредственные машинные вызовы в реальном времени. Чем быстрее происходит эта JIT компиляция, тем, соответственно, быстрее работает приложение на виртуальной машине. JVM самостоятельно осуществляет сборку так называемого мусора, что значительно облегчает работу программиста по отслеживанию утечек памяти, но, на мой взгляд, не способствует должной концентрации внимания программиста на этом вопросе. Важно помнить, что в Java утечки памяти всё равно существуют, особенно при программировании многопоточных приложений \\ \hline УК Задания для самопроверки & \begin{enumerate} \item JVM и JRE - это одно и тоже? (нет) \item Что входит в состав JDK, но не входят в состав JRE? (компилятор, средства для доков, отладки, развёртывания) \item Утечки памяти (2) \begin{itemize} \item Невозможны, поскольку работает сборщик мусора; \item Возможны; \item Существуют только в С++ и других языках с открытым менеджментом памяти. \end{itemize} \end{enumerate} \\ \hline Структура проекта \begin{itemize} \item простейшие (один файл) \item обычные (несколько пакетов) \item шаблонные (формируются сборщиками) \item скриптовые (jupyter notebook) \end{itemize} & Ну, наконец-то проект. Проекты бывают разной сложности, сейчас поговорим о проектах без применения сборщиков, потому что сборщикам и соответствующим проектам у нас будет посвящено отдельное занятие. Все проекты по сложности структуры можно разделить на четыре основные категории: простейшие, обычные, шаблонные, скриптовые \\ \hline лайвкод public class Main public static void main(String[] args) System.out.println ("Hello, world!"); & Начнём с простейшего проекта, который будет состоять из одного файла исходников. Естественно, вы спросите, что за чушь, мы же уже сотни раз писали «привет мир» и запускали его удобной зелёной стрелочкой в ИДЕ. Есть ответ. Мы же выясняем, что там внутри, под капотом этих удобных стрелочек и привычных процессов. Да и ради простейшего проекта запускать тяжеловесную среду программирования как-то неестественно что ли \\ \hline лайвкод ivan@gb src > javac Main.java ivan@gb src > java Main Hello, world! & Заменить зелёную стрелочку можно двумя строками \\ \hline Лого Юпитер ноута & Пока далеко не ушли от простейших проектов, думаю, целесообразно будет проговорить о скриптовых возможностях Java. Поскольку язык является не только компилируемым, но и интерпретируемым благодаря работе JVM, его возмжоно использовать как скриптовый внутри юпитер ноутбука, подключив соответствующее ядро. Интересной особенностью юпитер ноутбука является разделение фронтенда и ядра, что даёт возможность заменять эти самые ядра (в терминах юпитера они называются кернелы). скачав и установив ядро IJava мы получаем шикарную возможность делать простые наброски логики, снабжая их комментариями в формате маркдаун. На самом деле можно делать и непростые наброски, но это выходит далеко за рамки нашего курса о языке. Если будет очень интересно, призываю вас самостоятельно почитать о возможностях ядра, благо на него очень хорошая документация с примерами \\ \hline \begin{itemize} \item пакеты, \item классы, \item метод main, \item комментарии \item ресурсы \end{itemize} & Как я сказал в начале этого блока, шаблонные проекты, создаваемые сборщиками мы обсудим на более поздних лекциях, поэтому осталось только поговорить о том, из чего состоит обычный простой проект. Итак чаще всего, это пакеты, классы, метод main, комментарии, ресурсы. Обо всём по порядку. Давайте сразу договоримся, что я сначала буду давать формальное понятие, а потом буду говорить, как его можно представить в более простом виде \\ \hline Коробка или лучше много коробок разного размера, кот в коробке & Пакет - это пространство имён языка. Теоретически, как мы видели на примере простейшего проекта, класс может не находиться в пакете, но на практике такого положения дел не встретить. Например, в проекте из нескольких модулей классы без пакетов просто не будут найдены. Пакет - это некоторое место хранения и создания иерархии классов проекта. \\ \hline Скриншот структуры папок на диске & Проще всего представить пакет как папку на диске, тем более, что в файловой системе пакеты так и показываются. Для пакетов существуют модификаторы доступа, классы, находящиеся в одном пакете доступны друг другу даже если находятся в разных проектах (это как раз и есть отличие пакетов от папок на диске). \\ \hline Пакет с пакетами, кот в пакете & Но пакет - это чуть более сложная сущность. Для нас пока достаточно, что пакеты объединяют классы по смыслу. \\ \hline Имена пакетов (домен гб.ру пакет ру.гб; большие буквы плохо, разделять слова нижними подчёркиваниями хорошо; пример оператора пекеж) & У пакетов есть правила именования: обычно это обратное доменное имя (например, для гб.ру это будет ру.гб), название проекта, и далее уже внутренняя структура. Пакеты следует писать латинскими строчными буквами. Чтобы явно отнести класс к пакету недостаточно его просто туда положить, нужно ещё прописать в классе название пакета после специального оператора package \\ \hline Пустой школьный класс & Класс - это основная единица исходного кода программы. Без класса не может начаться никакое программирование на языке Java. Даже скомпилированные файлы исходного кода имеют расширение .class. \\ \hline Центральное звено, фундамент, атлант, колонна, котик держит на себе мир & Что такое классы в терминах ООП вы уже знаете, но в Java классы - это более широкое понятие. Сама программа - это тоже класс. У классов также есть модификаторы доступа. Важно про классы - это то, что в файл с расширением джава следует класть только один класс и делать его публичным. Формально, язык не запрещает иметь в файле другие, не публичные классы, но писать так свои программы - это не толкьо дурной тон, но и весьма сбивающая с толку практика. \\ \hline Программа = класс;1 файл = 1 класс; класс = сущ, им.п с большой буквы & У классов также есть правила именования. Название класса - это имя существительное в именительном падеже, написанное с заглавной буквы. Если требуется назвать класс в несколько слов, применяют так называемый upper camel case, то есть пишут слова строчными буквами, делая заглавной первую букву каждого слова \\ \hline Парадный вход с надписью псвм & Метод мейн - это единственный в своём роде метод, который является точкой входа в программу. Метод является публичным, и должен находиться в публичном классе, то есть он доступен для исполнения любому желающему. \\ \hline Жвм ищет псвм надписи на котах & А желает его исполнить JVM. Метод именно с такой сигнатурой (публичный, статический, ничего не возвращающий, принимающий массив строк) - это конвенция, договорённость, об именовании. JVM при старте программы среди всех пакетов и классов будет искать именно этот метод и будет передавать ему именно массив строк в качестве параметра. \\ \hline Псвм код & При создании этого метода важно полностью повторить его сигнатуру и обязательно написать его с название со строчной буквы \\ \hline Комментарии в смысле интернета, с лайками & С комментариями всё просто - это часть кода, которую игнорирует компилятор при преобразовании исходного кода. \\ \hline Однострочный, многострочный (внутристрочный никогда так не делайте), документация & Комментарии бывают: \code{// comment} - до конца строки. Самый простой и самый часто используемый комментарий. Эти комментарии обычно поясняют неочевидные программные решения или сложные алгоритмы. \code{/* comment */} - внутристрочный или многострочный. Никогда не используйте его внутри строк, несмотря на то, что это возможно. Обычно эти комментарии используют, чтобы оставить какое-нибудь длинное сообщение будущим поколениям программистов, которые будут поддерживать этот код. \code{/** comment */} - комментарий-документация. Многострочный. Из него утилитой Javadoc создаётся веб-страница с комментарием. Самый полезный из всех полезных комментариев. Сейчас будем учиться делать из таких комментариев целые веб-сайты с программной документацией. \\ \hline Ресурсы (нефть газ, драгоценные камни, золото) & Есть ещё такое собирательное понятие, как ресурсы, но его, возможно не следует рассматривать прямо сейчас потому что оно не является обязательным для вообще любого проекта, в отличие от пакетов, классов и комментариев. Работу с ресурсами мы разберём когда будем беседовать о более сложных проектах \\ \hline УК Задание для самопроверки & \begin{enumerate} \item Зачем складывать классы в пакеты? (структурирование, видимость*) \item Может ли существовать класс вне пакета? (да*, нет) \item Комментирование кода(2) \begin{itemize} \item Нужно только если пишется большая подключаемая библиотека; \item Хорошая привычка; \item Захламляет исходники. \end{itemize} \end{enumerate} \\ \hline \begin{forest} for tree={ font=\ttfamily, grow'=0, child anchor=west, parent anchor=south, anchor=west, calign=first, edge path={ \noexpand\path [draw, \forestoption{edge}] (!u.south west) +(7.5pt,0) |- node[fill,inner sep=1.25pt] {} (.child anchor)\forestoption{edge label}; }, before typesetting nodes={ if n=1 {insert before={[,phantom]}} {} }, fit=band, before computing xy={l=15pt}, } [Sample [src [ru [gb [jcore [regular [OtherClass.java] ] [sample [Main.java] ] ] ] ] ] [out ] [README.md] ] \end{forest} & Для дальнейших упражнений на сегодняшнем уроке нам понадобится небольшой проект, буквально из двух классов в двух пакетах, без каких-то ограничений видимости и других усложнений. На основе этого проекта мы и поговорим об оставшихся на сегодня двух несложных темах - терминальная сборка и генерация документации. Дерево проекта представлено на слайде, где папка с выходными (скомпилированными) бинарными файлами пуста, а файл README.md создан для лучшей демонстрации корня проекта \\ \hline Код привет мира & Итак. У нас был простейший проект, написать его было элементарно, что там, простой хелловорлд, скомпилировать и запустить его также просто \\ \hline Код команд компиляции & Нам понадобится утилита javac из состава JDK которая скомпилирует из текста программы байт-код, и утилита java из состава JRE которая этот байт-код сможет интерпретировать. То есть очевидно, и мы просто проговорим это дополнительно, что простому пользователю для запуска программы не нужен весь тяжёлый ЖДК. Показываем работу следующими командами ls /javac Main.java /ls /java Main\\ \hline Скрин кофе крошка & Также существует забавный факт, что скомпилированные джава классы всегда содержат одинаковые первые 4 байта, которые в 16тиричном представлении формируют надпись «кофе, крошка», cafe babe \\ \hline Код двух классов & Для компиляции более сложных проектов, содержащих каике-то иерархические структуры из пакетов и классов, необходимо указать компилятору, откуда забирать файлы исходников (сорспас) и куда класть готовые классы, далее интерпретатору, откуда забирать файлы скомпилированных классов \\ \hline Код команд компиляции & сорспас это исходники, д может быть расшифрован как директория или как дестинейшн - назначение, класпас для указания папки с классами. Как хорошо видно среди только что написанных букв, для этого достаточно через пробел написать соответствующие ключи компиляции и запуска. Конечно, писать каждый раз эти ключи довольно утомительно и для автоматизации этого процесса придумали сборщики проектов, но всегда круто знать и уметь делать вещи в отсутствие сложного инструментария. Показываем работу следующими командами /javac -sourcepath ./src -d out src/ru/gb/jcore/sample/Main.java /java -classpath ./out ru.gb.jcore.sample.Main\\ \hline УК Задание для самопроверки & \begin{enumerate} \item Что такое javac? (компилятор) \item Кофе, крошка? (да) \item Где находится класс в папке назначения работы компилятора? (1) \begin{itemize} \item В подпапках, повторяющих структуру пакетов в исходниках \item В корне плоским списком; \item Зависит от ключей компиляции. \end{itemize} \end{enumerate} \\ \hline Пример автоматически сгенерированной документации & И к предпоследней на сегодня теме, которая мочему-то вызывает у многих даже активно практикующих программистов отторжение. К самому полезному для передачи опыта между программистами и командами программистов. \\ \hline Много документов котик в очках & К документации на свой код. Конечно, особенно ярые противники описывать свою работу сейчас возмутятся, мол, я ж программист, пусть программную документацию пишут технические писатели. \\ \hline Программист кот -> программа -> документация -> красота; программист кот -> программа -> техпис кот в костюме -> программа -> программист -> почта/чат: скриншоты/объяснения не-программисту технических тонкостей -> техпис -> красота & Но если внезапно подумать головой, то техпис фактически всё равно придёт к вам, программисту, за разъяснениями, что именно делает тот или иной фрагмент кода. А комментарии к коду всё равно писать, да и техпису, скорее всего придётся отвечать в текстовом виде, так почему бы не облегчить себе жизнь сразу, документируя свой код по мере написания, например, между спринтами \\ \hline основные ключи и аргументы \begin{itemize} \item \code{-d docs} \item \code{-sourcepath src} \item \code{-cp out} \item \code{-subpackages} \item \code{ru} \end{itemize} & Чтобы просто создать документацию надо вызвать утилиту javadoc с небольшим количеством ключей, давайте их разберём. Уже знакомый нам ключ -d означающий папку (или директорию, кому как больше нравится) в которую следует положить готовую документацию. Помним, ключ легко запомнить, если расшифровать его как дестинейшн, назначение. -sourcepath означает папку, где лежат исходники проекта, как мы помним, в исходниках мы пишем те самые комментарии, которые потом можно преобразовать в джавадок. -cp говорит о том, где лежат готовые скомпилированные классы, эта информация нужна, чтобы понять, как программа в итоге скомпилировалась, что в ней задействовано, что как связано и прочее. -subpackages говорит о том, что надо взять не только указанный далее пакет, но и все его подпакеты рекурсивно. Ну и, собственно, пакет, для которого нужно создать документацию, ru. \\ \hline javadoc -d docs -sourcepath src -cp out -subpackages ru & Если нужно сгенерировать документацию к конкретному пакету, например, если вы хотите разложить их по разным папкам, то надо указатеь его полный адрес, и, вероятно, убрать ключ subpackages \\ \hline \begin{itemize} \item \code{-locale ru_RU} \item \code{-encoding utf-8} \item \code{-docencoding cp1251} \end{itemize} & Чтобы учесть то, что происходитс ОС Windows надо чуть больше, поскольку так исторически сложилось, что у Windows есть проблемки с локалью. Поскольку все программы на Java пишутя в кодировке UTF-8, а основная кодировка всех приложений, работающих под ОС виндоус это ср1251, то при создании документации стандартными средствами итоговые веб-страницы создаются на клингонском. Чтобы перевести их на земной кириллический, нужно добавить три ключа - указать какая локаль установлена -locale, в какой кодировке исходный текст -encoding utf-8, в какой кодировке должен быть итоговый документ -docencoding cp1251. Показываем работу следующими командами: /javadoc -locale ru\_RU -encoding utf-8 -docencoding cp1251 -d docs -sourcepath src -cp out -subpackages ru Поскольку я сейчас не с виндоусом, то такие настройки наоборот, сломают отображение. \\ \hline УК Задание для самопроверки & \begin{enumerate} \item Javadoc находится в JDK или JRE? (ждк) \item Что делает утилита Javadoc? (3) \begin{itemize} \item Создаёт комментарии в коде; \item Создаёт программную документацию; \item Создаёт веб-страницу с документацией из комментариев. \end{itemize} \end{enumerate} \\ \hline Уставший котик -> автоматизация -> довольный котик (надпись внизу мейкфайл) & Компилировать проект руками — занятие весьма утомительное, особенно когда исходных файлов становится больше одного, и для каждого из них надо каждый раз набивать команды компиляции, а ещё не забыть о том, какой файл в проекте главный, какие включены библиотеки и многое другое. Руки так и тянутся куда-то это записать, чтобы не забыть, но говорить о специальных менеджерах проектов ещё рано, поэтому научимся автоматизировать терминальную сборку. Будем учиться создавать и использовать Мейкфайлы. \\ \hline Код + мейкфайл -> мейк -> компилятор -> программа & Makefile — это набор инструкций для программы make (классически, это GNU Automake), которая помогает собирать программный проект буквально в одну команду. Хотя эта технология и отмирает, но все равно используется как некоторыми отдельными разработчиками, так и в проектах, особенно часто это встречается, когда в Java переквалифицируются бывшие С++ программисты. Если запустить make то программа попытается найти файл с именем по-умолчанию Makefile в текущем каталоге и выполнить инструкции из него. Эти самые мейкфайлы и сохранят для нас все нужные настройки проекта, компиляции, структуры и прочего \\ \hline Ключи компиляции, папки, пути => мейкфайл & Не лишним будет напомнить, что мейкфайлы, не привносят ничего принципиально нового в процесс компиляции, а только лишь автоматизируют его, поэтому важно помнить, что все действия, которые мы совершаем при ручной компиляции просто записаны в мейкфайл, и обратно, то что записано в мейкфайле может быть выполнено вручную в терминале \\ \hline all: javac -sourcepath .src/ -d out src/ru/gb/jcore/sample/Main.java & В простейшем, то есть нашем, случае, в мейкфайле достаточно описать так называемую цель, таргет, и что нужно сделать для достижения этой цели. Цель, собираемая по-умолчанию называется all, так, для простейшей компиляции нам нужно написать то что вы видите на слайде. По сути, это всё.\\ \hline Инициализация мейк переменной, использование мейк переменной SRCDIR := src OUTDIR := out JC := javac JCFLAGS := -sourcepath .(SRCDIR)/ -d (OUTDIR) MAINSOURCE := ru/gb/dj/Main MAINCLASS := ru.gb.dj.Main all: (JC) (JCFLAGS) {SRCDIR}/{MAINSOURCE}.java clean: rm -R (OUTDIR) run: cd out \&\& java {MAINCLASS} & Но мы же хотим, чтобы вся было гибо и не нужно было запоминать что как называется, чтобы это потом можно было поправить где-то в одном месте. Для этого в мейкфайлах придумали переменные, и они работают как самые обычные переменные, их значение подставляется в то место, где переменная вызывается. Добавив пару таргетов и немного переменных мы получим вполне рабочий мейкфайл, который позволит нам не только компилировать проект, но также очищать выходные файлы в случае неудачи и запускать его. Также не особенно переживая о ключах, командах и прочем. \\ \hline Вызовы мейк для разных таргетов & Для того, чтобы утилита мейк сделала своё дело нужно в терминале просто её вызвать без аргументов. Чтобы воспользоваться другими написанными таргетами (автоматизациями, задачами) нужно после имени утилиты написать через пробел название таргета, например, часто пишут задачу clean, рекурсивно очищающую папку с готовыми классами, соответственно, вызов make clean как ни странно, рекурсивно удалит папку с готовыми классами \\ \hline Уставший котик -> автоматизация -> довольный котик (иконка внизу докер) & Docker — программное обеспечение для автоматизации развёртывания и управления приложениями, контейнеризатор приложений. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть развёрнут почти на на любой системе, и уж точно на системах большой тройки (линукс виндоус макос). Целью этого курса не является рассмотрение всех возможностей докер, поэтому ограничимся только теми, которые нам понадобятся, чтобы увидеть заветное, запущенное джавой, «привет мир» в терминале. Снова не лишним будет напомнить, что мы можем выполнить все те же самые действия в простом терминале. Но докер даёт нам немного преимуществ. Например, не нужно устанавливать JDK и думать о переключении между версиями, достаточно взять контейнер с нужной версией и запустить наше приложение в нём. Помните я буквально полчаса назад упоминал о том, что есть более абстрактный инструмент менеджмента версий языка и инструментария? вот, это он. \\ \hline Компилятор, переменные среды, ключи компиляции, папки, пути => докерфайл & С точки зрения разработки, контейнерные приложения в докере это, по сути, набор инструкций, которые вы пишете в специальном файле. Всё остальное докер берёт на себя. Он эти инструкции выполняет, виртуализует, запускает и делает все остальные свои важные вещи, а мы в результате видим заветный сервис или приложение, поднятые буквально парой команд в терминале. \\ \hline Докерфайл+код -> образ -> докер -> контейнер с программой & Упомянутый специальный файл называется докерфайл и в нашем случае он будет мало отличаться от того, что мы писали ранее в терминале или написали в мейкфайле. Первой строкой докерфайла мы обязательно должны указать, какой виртуальный образ будет для нас основой. \\ \hline FROM bellsoft/liberica-openjdk-alpine:11.0.16.1-1 COPY ./src ./src RUN mkdir ./out RUN javac -sourcepath ./src -d out ./src/ru/gb/dj/Main.java CMD java -classpath ./out ru.gb.dj.Main & Тут можно выбрать пустой образ, образ ОС, например, убунту или центос, а можно выбрать сразу ЖДК, как поступим мы. Дальше скажем докеру, что надо будет при создании образа скопировать все файлы из нашей папки СРЦ внутрь образа, в папку СРЦ потом также при создании образа надо будет создать внутри папку аут простой терминальной командой и запустить компиляцию. мы же изначально используем образ ждк, а значит там внутри есть компилятор. главное не запутаться в путях и не забывать, что команда будет выполняться в образе, а не на нашем компьютере. А последняя команда говорит, что именно нужно сделать, когда контейнер создаётся из образа и заускается. Как очевидно, докер-образ и как следствие докер-контейнеры возможно настроить таким образом, чтобы скомпилированные файлы складывались обратно на компьютер пользователя через общие папки, если это нужно, или, например, компилировать в разные папки классы разными версиями компилятора, и запускать их также разными версиями, имея весь этот зоопарк технологий в контейнерах, не засоряя свой компьютер. Можно даже, например, не брать в качестве исходного образа ждк, а взять ОС, вручную установить на ней ждк и, например, мейк, и автоматизировать всё мейком внутри докера. Это странно, но, как минимум не запрещено. \\ \hline docker build . -t hellojava:latest docker run --rm hellojava:latest & Докерфайл это конечно хорошо, но надо бы его ещё как-то применить, а значит, надо собрать из него образ и запускать потом контейнеры на основе этого образа. Собрать образ не сложно, нужно дать докеру соответствующую команду, где точка, понятно, текущая папка, содержащая докерфайл, а -т это записываемый в образ тег. по этому тегу потом удобнее искать образы. с тегами можно публиковать образы на докерхаб. Готовые образы можно запускать так, чтобы после выполнения контейнер уничтожался, это как раз то, что нам нужно, поскольку в процессе отработки функциональности приложений и создаваемого образа часто приходится создавать контейнеры после изменения каждой строки, а это очень много контейнеров, поэтому добавим флаг --рм и получим строку, запустив которую получим в терминале долгожданный хеловорлд \\ \hline на этом уроке & На этом уроке мы рассмотрели историю и причины создания языка, его окружение и структуру проекта, узнали, что скрывают в себе такие аббревиатуры как JDK JRE JVM SDK JIT CLI. Рассмотрели базовое применение утилит java, javac и javadoc. Даже немного посмотрели в сторону автоматизации рутинных задач \\ \hline домка & В качестве домашнего задания попробуйте \begin{itemize} \item Создать проект из трёх классов (основной с точкой входа и два класса в другом пакете), которые вместе должны составлять одну программу, позволяющую производить четыре основных математических действия и осуществлять форматированный вывод результатов пользователю. \item Скомпилировать проект, а также создать для этого проекта стандартную веб-страницу с документацией ко всем пакетам. \item Создать Makefile с задачами сборки, очистки и создания документации на весь проект. \item *Создать два Docker-образа. Один должен компилировать Java-проект обратно в папку на компьютере подьзователя, а второй забирать скомпилированные классы и исполнять их. \end{itemize} На следующей лекции мы поговорим о том как осуществлять управление более сложными проектами: Jar-файлы; сборщики Gradle/Maven; чтоб такое репозитории и как ими пользоваться. \\ \hline и помните, что единственная корочка ради которой действительно стоит учиться, это корочка головного мозга & \\ \hline \end{longtable} \end{document}