#data_structures #general
Карта (Map)
Map — это структура, которая хранит данные в парах ключ/значение, где каждый ключ уникален. Иногда её также называют ассоциативным массивом или словарём. Map часто используют для быстрого поиска данных. Она позволяет делать следующие вещи:
Карта (Map)
Map — это структура, которая хранит данные в парах ключ/значение, где каждый ключ уникален. Иногда её также называют ассоциативным массивом или словарём. Map часто используют для быстрого поиска данных. Она позволяет делать следующие вещи:
⟡
добавлять пары в коллекцию;⟡
удалять пары из коллекции;⟡
изменять существующей пары;⟡
искать значение, связанное с определенным ключом.#news #crystal
Вышел язык программирования Crystal
На днях вышла версия 1.0 языка — Crystal.
Если вы не слышали о проекте раньше, то вот краткое его описание. Crystal — это высокоуровневый объектно-ориентированный язык программирования. Его синтаксис очень похож на синтаксис Ruby, но отличается от своего конкурента тем, что компилируется в машинный код посредством LLVM.
По словам разработчиков и сторонних компаний, которые уже протестировали язык, производительность приложений, написанных на Crystal сравнима с приложениями на С. Последний считается более сложным для освоения, чем Ruby. Таким образом, создатели Crystal убивают сразу двух зайцев — дают возможность писать быстрые приложения, и обеспечивают низкий порог входа в разработку.
Вышел язык программирования Crystal
На днях вышла версия 1.0 языка — Crystal.
Если вы не слышали о проекте раньше, то вот краткое его описание. Crystal — это высокоуровневый объектно-ориентированный язык программирования. Его синтаксис очень похож на синтаксис Ruby, но отличается от своего конкурента тем, что компилируется в машинный код посредством LLVM.
По словам разработчиков и сторонних компаний, которые уже протестировали язык, производительность приложений, написанных на Crystal сравнима с приложениями на С. Последний считается более сложным для освоения, чем Ruby. Таким образом, создатели Crystal убивают сразу двух зайцев — дают возможность писать быстрые приложения, и обеспечивают низкий порог входа в разработку.
#java
Что такое пул строк в Java?
Пул строк (String Pool) — это множество строк в кучи (Java Heap Memory). Мы знаем, что String — особый класс в java, с помощью которого мы можем создавать строковые объекты.
Когда мы используем двойные кавычки, чтобы создать новую строку, то первым делом идет поиск строки с таким же значением в пуле строк. Если java такую строку нашла, то возвращает ссылку, в противном случае создается новая строка в пуле, а затем возвращается ссылка.
Однако использование оператора new заставляет класс String создать новый объект String. После этого можем использовать метод intern(), чтобы поместить этот объект в пул строк или обратиться к другому объекту из пула строк, который имеет такое же значение.
Что такое пул строк в Java?
Пул строк (String Pool) — это множество строк в кучи (Java Heap Memory). Мы знаем, что String — особый класс в java, с помощью которого мы можем создавать строковые объекты.
⟡
Пример работы с пулом строкКогда мы используем двойные кавычки, чтобы создать новую строку, то первым делом идет поиск строки с таким же значением в пуле строк. Если java такую строку нашла, то возвращает ссылку, в противном случае создается новая строка в пуле, а затем возвращается ссылка.
Однако использование оператора new заставляет класс String создать новый объект String. После этого можем использовать метод intern(), чтобы поместить этот объект в пул строк или обратиться к другому объекту из пула строк, который имеет такое же значение.
#java
Классы-обертки в Java
Все дело в том, что коллекции это набор объектов и для того, чтобы оперировать примитивными типами как объектами и были придуманы классы обертки.
Как и все объекты, переменные созданы с помощью классов оберток будут храниться в куче (heap). НО, есть одно важное замечание, о котором часто любят спрашивать в тестах или собеседованиях. Оно касается целочисленных классов оберток. Неявное создание таких переменных со значением в диапазоне -128 +127 будут храниться в пуле. Потому такие обертки с одинаковыми значениями будут являться ссылками на один объект.
Автоупаковка переменных примитивных типов требует точного соответствия типа исходного примитива — типу «класса-обертки». Попытка автоупаковать переменную типа byte в Short, без предварительного явного приведения byte->short вызовет ошибку компиляции.
Ну и конечно же, классы-обертки расширяют возможности работы с примитивами, предоставляя удобные методы и поля.
Классы-обертки в Java
Все дело в том, что коллекции это набор объектов и для того, чтобы оперировать примитивными типами как объектами и были придуманы классы обертки.
Как и все объекты, переменные созданы с помощью классов оберток будут храниться в куче (heap). НО, есть одно важное замечание, о котором часто любят спрашивать в тестах или собеседованиях. Оно касается целочисленных классов оберток. Неявное создание таких переменных со значением в диапазоне -128 +127 будут храниться в пуле. Потому такие обертки с одинаковыми значениями будут являться ссылками на один объект.
Автоупаковка переменных примитивных типов требует точного соответствия типа исходного примитива — типу «класса-обертки». Попытка автоупаковать переменную типа byte в Short, без предварительного явного приведения byte->short вызовет ошибку компиляции.
Ну и конечно же, классы-обертки расширяют возможности работы с примитивами, предоставляя удобные методы и поля.
#java
Хэш-таблицы (Hash table)
Хэш-таблица — это похожая на Map структура, которая содержит пары ключ/значение. Она использует хэш-функцию для вычисления индекса в массиве из блоков данных, чтобы найти желаемое значение.
Обычно хэш-функция принимает строку символов в качестве вводных данных и выводит числовое значение. Для одного и того же ввода хэш-функция должна возвращать одинаковое число. Если два разных ввода хэшируются с одним и тем же итогом, возникает коллизия. Цель в том, чтобы таких случаев было как можно меньше.
Таким образом, когда вы вводите пару ключ/значение в хэш-таблицу, ключ проходит через хэш-функцию и превращается в число. В дальнейшем это число используется как фактический ключ, который соответствует определенному значению. Когда вы снова введёте тот же ключ, хэш-функция обработает его и вернет такой же числовой результат. Затем этот результат будет использован для поиска связанного значения. Такой подход заметно сокращает среднее время поиска.
Хэш-таблицы (Hash table)
Хэш-таблица — это похожая на Map структура, которая содержит пары ключ/значение. Она использует хэш-функцию для вычисления индекса в массиве из блоков данных, чтобы найти желаемое значение.
Обычно хэш-функция принимает строку символов в качестве вводных данных и выводит числовое значение. Для одного и того же ввода хэш-функция должна возвращать одинаковое число. Если два разных ввода хэшируются с одним и тем же итогом, возникает коллизия. Цель в том, чтобы таких случаев было как можно меньше.
Таким образом, когда вы вводите пару ключ/значение в хэш-таблицу, ключ проходит через хэш-функцию и превращается в число. В дальнейшем это число используется как фактический ключ, который соответствует определенному значению. Когда вы снова введёте тот же ключ, хэш-функция обработает его и вернет такой же числовой результат. Затем этот результат будет использован для поиска связанного значения. Такой подход заметно сокращает среднее время поиска.
#java
JDBC
Java Database Connectivity – это стандартный API для независимого соединения языка программирования Java с различными базами данных (далее – БД).
JDBC решает следующие задачи:
Одним из недостатков JDBC является то, что код, который получается в конце — выглядит очень большим по объему (хотя работы он выполняет не много). Также, очень сложно приходится, когда объект джава который мы пытаемся сохранить в базе или достать — достаточно большой. Нужно правильно замапить поля базы данных и поля класса Java. Бывает такое, что в процессе работы нужно добавить поле к готовой таблице в базе. И потом нужно находить все запросы в базу в коде приложения чтобы добавить это поле. Чтобы прочувствовать всю «боль» работы с JDBC, нужно с ним поработать. А для тех, кто уже знаком с этим функционалом я думаю объяснения будут излишне.
JDBC
Java Database Connectivity – это стандартный API для независимого соединения языка программирования Java с различными базами данных (далее – БД).
JDBC решает следующие задачи:
⟡
Создание соединения с БД⟡
Создание SQL выражений⟡
Выполнение SQL – запросов⟡
Просмотр и модификация полученных записейОдним из недостатков JDBC является то, что код, который получается в конце — выглядит очень большим по объему (хотя работы он выполняет не много). Также, очень сложно приходится, когда объект джава который мы пытаемся сохранить в базе или достать — достаточно большой. Нужно правильно замапить поля базы данных и поля класса Java. Бывает такое, что в процессе работы нужно добавить поле к готовой таблице в базе. И потом нужно находить все запросы в базу в коде приложения чтобы добавить это поле. Чтобы прочувствовать всю «боль» работы с JDBC, нужно с ним поработать. А для тех, кто уже знаком с этим функционалом я думаю объяснения будут излишне.
JPA призвана устранить вышеперечисленные недостатки.
#java
JPA
Спецификация Java Persistence API — это технология, которая позволяет удобно мапить объект Java и таблицу базы данных.
В JDBC при написании каждого запроса, Вам необходимо указать в коде все детали, необходимые для операций CRUD, такие как имена таблиц, имена столбцов. В JPA (которая использует JDBC «под капотом»).
Сама по себе спецификация JPA не является инструментом или фреймворком; скорее, она определяет набор концепций, которые могут и должны быть реализованы любым другим инструментом.
Так как JPA — это просто спецификация, Вам нужен инструмент для ее реализации. Этим инструментом может быть Hibernate, TopLink, iBatis и т. д.
Вы можете рассматривать JPA как интерфейс, а Hibernate — как реализацию.
Hibernate — это популярный фреймворк, цель которого связать ООП и реляционную базу данных. Работа с Hibernate сократит время разработки проекта в сравнении с обычным JDBC.
JPA
Спецификация Java Persistence API — это технология, которая позволяет удобно мапить объект Java и таблицу базы данных.
В JDBC при написании каждого запроса, Вам необходимо указать в коде все детали, необходимые для операций CRUD, такие как имена таблиц, имена столбцов. В JPA (которая использует JDBC «под капотом»).
Сама по себе спецификация JPA не является инструментом или фреймворком; скорее, она определяет набор концепций, которые могут и должны быть реализованы любым другим инструментом.
Так как JPA — это просто спецификация, Вам нужен инструмент для ее реализации. Этим инструментом может быть Hibernate, TopLink, iBatis и т. д.
Вы можете рассматривать JPA как интерфейс, а Hibernate — как реализацию.
Hibernate — это популярный фреймворк, цель которого связать ООП и реляционную базу данных. Работа с Hibernate сократит время разработки проекта в сравнении с обычным JDBC.
#java
Воздушные тонкие блины на молоке.
Налить в подходящую емкость молоко комнатной температуры, вбить туда яйца, добавить соль и сахар.
Все размешать, оставить на 15–20 минут и потом добавить растительное масло. Кстати, тесто для блинов можно оставить в холодильнике и приготовить блины позже. С ним ничего не случится.
На сильно раскаленную сковороду налить немного масла и жарить блины.
Постепенно подсыпать муку, при этом помешивая, чтобы не получалось комочков. Они все равно будут получаться, так что помешивать надо качественно. Довести до консистенции нежирной сметаны. Добавить разрыхлитель.
Воздушные тонкие блины на молоке.
Налить в подходящую емкость молоко комнатной температуры, вбить туда яйца, добавить соль и сахар.
Все размешать, оставить на 15–20 минут и потом добавить растительное масло. Кстати, тесто для блинов можно оставить в холодильнике и приготовить блины позже. С ним ничего не случится.
На сильно раскаленную сковороду налить немного масла и жарить блины.
Постепенно подсыпать муку, при этом помешивая, чтобы не получалось комочков. Они все равно будут получаться, так что помешивать надо качественно. Довести до консистенции нежирной сметаны. Добавить разрыхлитель.
#git_hub #easter
Шесть пасхалок GitHub 1/2
1) Полагаю, не существует такого языка программирования, в стандартной или математической библиотеке которого нет константы, хранящей значение числа π. Но если случилось так, что поисковик Google «упал», а то, чему учили на занятиях по математике, вылетело из головы, вспомнить значение числа π можно, просто перейдя по адресу https://github.com/π.
2) Продолжим тему ASCII-арта. Знали ли вы о том, что в API GitHub есть конечная точка, ведущая к ASCII-изображению октокота Моны — логотипа GitHub. Для того чтобы это изображение увидеть, нужно открыть в браузере адрес https://api.github.com/octocat (или воспользоваться curl).
3) Тот, кто весь долгий рабочий день глядит в тёмное окно терминала, пользуясь GitHub CLI, может позволить себе прогулку по дзен-саду своего репозитория, напоминающую старую текстовую игру. Для этого достаточно воспользоваться командой gh repo garden. По этому «саду» можно, в полном смысле этого слова, прогуляться, пользуясь навигационными клавишами, применяемыми в vi.
Шесть пасхалок GitHub 1/2
1) Полагаю, не существует такого языка программирования, в стандартной или математической библиотеке которого нет константы, хранящей значение числа π. Но если случилось так, что поисковик Google «упал», а то, чему учили на занятиях по математике, вылетело из головы, вспомнить значение числа π можно, просто перейдя по адресу https://github.com/π.
2) Продолжим тему ASCII-арта. Знали ли вы о том, что в API GitHub есть конечная точка, ведущая к ASCII-изображению октокота Моны — логотипа GitHub. Для того чтобы это изображение увидеть, нужно открыть в браузере адрес https://api.github.com/octocat (или воспользоваться curl).
3) Тот, кто весь долгий рабочий день глядит в тёмное окно терминала, пользуясь GitHub CLI, может позволить себе прогулку по дзен-саду своего репозитория, напоминающую старую текстовую игру. Для этого достаточно воспользоваться командой gh repo garden. По этому «саду» можно, в полном смысле этого слова, прогуляться, пользуясь навигационными клавишами, применяемыми в vi.
#news
Открыта программа раннего доступа к JetBrains DataSpell — новая IDE для Data Science
Рабочее название новой IDE — JetBrains DataSpell (но на момент релиза оно может измениться). JetBrains DataSpell — это удобная среда разработки для специалистов по Data Science, которые активно занимаются разведочным анализом данных (Exploratory Data Analysis) и прототипированием моделей машинного обучения.
Чтобы принять участие в EAP, подайте заявку на официальной странице.
https://www.jetbrains.com/ru-ru/dataspell/
Открыта программа раннего доступа к JetBrains DataSpell — новая IDE для Data Science
Рабочее название новой IDE — JetBrains DataSpell (но на момент релиза оно может измениться). JetBrains DataSpell — это удобная среда разработки для специалистов по Data Science, которые активно занимаются разведочным анализом данных (Exploratory Data Analysis) и прототипированием моделей машинного обучения.
Чтобы принять участие в EAP, подайте заявку на официальной странице.
https://www.jetbrains.com/ru-ru/dataspell/
JetBrains
JetBrains DataSpell: The IDE for Data Scientists.
JetBrains DataSpell is an IDE for data science with intelligent Jupyter notebooks, interactive Python scripts, and lots of other built-in tools.
#definition
Kubernetes - is an open-source container-orchestration system for automating computer application deployment, scaling, and management. It was originally designed by Google and is now maintained by the Cloud Native Computing Foundation. It aims to provide a "platform for automating deployment, scaling, and operations of application containers across clusters of hosts".
Kubernetes - is an open-source container-orchestration system for automating computer application deployment, scaling, and management. It was originally designed by Google and is now maintained by the Cloud Native Computing Foundation. It aims to provide a "platform for automating deployment, scaling, and operations of application containers across clusters of hosts".
#java
Двоичное дерево поиска
Дерево — это структура данных, состоящая из узлов. Ей присущи следующие свойства:
У двоичного дерева поиска есть два дополнительных свойства:
Двоичные деревья поиска позволяют быстро находить, добавлять и удалять элементы. Они устроены так, что время каждой операции пропорционально логарифму общего числа элементов в дереве.
Двоичное дерево поиска
Дерево — это структура данных, состоящая из узлов. Ей присущи следующие свойства:
⟡
Каждое дерево имеет корневой узел (вверху).⟡
Корневой узел имеет ноль или более дочерних узлов.⟡
Каждый дочерний узел имеет ноль или более дочерних узлов, и так далее.У двоичного дерева поиска есть два дополнительных свойства:
⟡
Каждый узел имеет до двух дочерних узлов (потомков).⟡
Каждый узел меньше своих потомков справа, а его потомки слева меньше его самого.Двоичные деревья поиска позволяют быстро находить, добавлять и удалять элементы. Они устроены так, что время каждой операции пропорционально логарифму общего числа элементов в дереве.
#java
Spring Data JPA
Spring Data — дополнительный удобный механизм для взаимодействия с сущностями базы данных, организации их в репозитории, извлечение данных, изменение, в каких то случаях для этого будет достаточно объявить интерфейс и метод в нем, без имплементации.
Репозитории Spring Data JPA - это интерфейсы, которые вы можете определить для доступа к данным. Запросы JPA создаются автоматически из имен ваших методов. Например, интерфейс CityRepository может объявить метод findAllByState(String state), чтобы найти все города (city) в данном штате (state).
Для более сложных запросов вы можете аннотировать ваш метод аннотацией Query в Spring Data.
Хранилища Spring Data обычно берутся из интерфейсов Repository или CrudRepository. Если вы используете автоконфигурацию, поиск в репозиториях происходит из пакета, содержащего ваш основной класс конфигурации (тот, который аннотирован @EnableAutoConfiguration или @SpringBootApplication).
Spring Data JPA
Spring Data — дополнительный удобный механизм для взаимодействия с сущностями базы данных, организации их в репозитории, извлечение данных, изменение, в каких то случаях для этого будет достаточно объявить интерфейс и метод в нем, без имплементации.
Репозитории Spring Data JPA - это интерфейсы, которые вы можете определить для доступа к данным. Запросы JPA создаются автоматически из имен ваших методов. Например, интерфейс CityRepository может объявить метод findAllByState(String state), чтобы найти все города (city) в данном штате (state).
Для более сложных запросов вы можете аннотировать ваш метод аннотацией Query в Spring Data.
Хранилища Spring Data обычно берутся из интерфейсов Repository или CrudRepository. Если вы используете автоконфигурацию, поиск в репозиториях происходит из пакета, содержащего ваш основной класс конфигурации (тот, который аннотирован @EnableAutoConfiguration или @SpringBootApplication).
#java
Регулярные выражения
В Java регулярные выражения представляют собой особую последовательность символов, позволяющую вам сопоставить или выявить другие строки либо их набор, опираясь на специализированный синтаксис в качестве шаблона. Они могут быть использованы для поиска, редактирования либо манипулирования текстом и данными.
Пакет java.util.regex исходно состоит из следующих трех классов:
Регулярные выражения
В Java регулярные выражения представляют собой особую последовательность символов, позволяющую вам сопоставить или выявить другие строки либо их набор, опираясь на специализированный синтаксис в качестве шаблона. Они могут быть использованы для поиска, редактирования либо манипулирования текстом и данными.
Пакет java.util.regex исходно состоит из следующих трех классов:
⟡
Pattern Class – объект класса Pattern представляет скомпилированное представление регулярного выражения. В классе Pattern публичный конструктор не предусмотрен. Для создания шаблона, вам сперва необходимо вызвать один из представленных публичных статичных методов compile(), который далее произведет возврат объекта класса Pattern. Регулярное выражение в данных методах принимается как первый аргумент.⟡
Matcher Class – объект класса Matcher представляет механизм, который интерпретирует шаблон, а также производит операции сопоставления с вводимой строкой. Аналогично классу Pattern, Matcher не содержит публичных конструкторов. Объект класса Matcher может быть получен путем вызова метода matcher() на объекте класса Pattern.⟡
PatternSyntaxException – объект класса PatternSyntaxException представляет непроверяемое исключение, которое обозначает синтаксическую ошибку в шаблоне регулярного выражения.#science
Знакомьтесь, первая вертушка на Марсе
Впервые в истории хитрый вертолёт покорит небеса другой планеты. Чтобы убедиться, что марсолёт готов к дебюту на Красной планете, инженеры NASA в Пасадене, в Калифорнии, разработали прототипы «Изобретательности» (название марсолета).
Всё почти готово к шоу. Когда таинственный внеземной вертолёт отделится от марсохода, чтобы провести серию в 5 тестовых полётов длительностью от 30 до 90 секунд, у него будет 30 марсианских суток, а каждые марсианские сутки состоят из 24 часов, 39 минут и 35 секунд. Хореография почти всех самых амбициозных прыжков марсолёта будет поставлена самой «Изобретательностью», а их высота будет варьироваться от высоты одноэтажного дома до 1000 футов.
Знакомьтесь, первая вертушка на Марсе
Впервые в истории хитрый вертолёт покорит небеса другой планеты. Чтобы убедиться, что марсолёт готов к дебюту на Красной планете, инженеры NASA в Пасадене, в Калифорнии, разработали прототипы «Изобретательности» (название марсолета).
Всё почти готово к шоу. Когда таинственный внеземной вертолёт отделится от марсохода, чтобы провести серию в 5 тестовых полётов длительностью от 30 до 90 секунд, у него будет 30 марсианских суток, а каждые марсианские сутки состоят из 24 часов, 39 минут и 35 секунд. Хореография почти всех самых амбициозных прыжков марсолёта будет поставлена самой «Изобретательностью», а их высота будет варьироваться от высоты одноэтажного дома до 1000 футов.
#science #hardware
Google Earth Engine (GEE) как общедоступный суперкомпьютер
Earth Engine — это многопетабайтный каталог данных, интегрированный с высокопроизводительным кластером серверов для параллельных вычислений. Доступ к системе и управление осуществляется через интерфейс прикладного программирования (API). Пользователь создаёт сценарии обработки данных в интерактивной среде разработки на JavaScript API, которая называтеся редактором кода (Code Editor) и обеспечивает оперативное создание прототипов и визуализацию результатов «на лету». То же самое можно выполнять и через Python API в локальной среде на своём компьютере или через облачные блокноты Google Colab. В каждом из вариантов основные вычисления выполняются на серверах Google.
Earth Engine — платформа уникальная, поскольку расширяет возможности не только учёных, занимающихся дистанционным зондированием Земли, но и более широкой аудитории, которой не хватает технических возможностей для использования традиционных инструментов обработки больших данных. До появления Earth Engine анализом больших геоданных могли заниматься лишь узкопрофильные специалисты с доступом к высокопроизводительным вычислительным ресурсам.
По личному опыту можем сказать, что даже в англоязычной профессиональной среде про Earth Engine знают пока немногие, а в России и СНГ платформу используют единицы.
https://earthengine.google.com/
Google Earth Engine (GEE) как общедоступный суперкомпьютер
Earth Engine — это многопетабайтный каталог данных, интегрированный с высокопроизводительным кластером серверов для параллельных вычислений. Доступ к системе и управление осуществляется через интерфейс прикладного программирования (API). Пользователь создаёт сценарии обработки данных в интерактивной среде разработки на JavaScript API, которая называтеся редактором кода (Code Editor) и обеспечивает оперативное создание прототипов и визуализацию результатов «на лету». То же самое можно выполнять и через Python API в локальной среде на своём компьютере или через облачные блокноты Google Colab. В каждом из вариантов основные вычисления выполняются на серверах Google.
Earth Engine — платформа уникальная, поскольку расширяет возможности не только учёных, занимающихся дистанционным зондированием Земли, но и более широкой аудитории, которой не хватает технических возможностей для использования традиционных инструментов обработки больших данных. До появления Earth Engine анализом больших геоданных могли заниматься лишь узкопрофильные специалисты с доступом к высокопроизводительным вычислительным ресурсам.
По личному опыту можем сказать, что даже в англоязычной профессиональной среде про Earth Engine знают пока немногие, а в России и СНГ платформу используют единицы.
https://earthengine.google.com/
Google
Google Earth Engine
Google Earth Engine combines a multi-petabyte catalog of satellite imagery and geospatial datasets with planetary-scale analysis capabilities and makes it available for scientists, researchers, and developers to detect changes, map trends, and quantify differences…
#java #interview
Зачем нужно ключевое слово assert?
Этот оператор ничего не возвращает, а принимает проверяемое утверждение типа
В Java до версии 4 слово
Включается флагом
Assertion-ы используются в основном для дополнительной проверки инвариантов состояния объекта и для подстраховки в коде, который не должен никогда вызываться. Выброшенный
Дополнительно у оператора
Зачем нужно ключевое слово assert?
assert
– не то же самое, что методы вроде assertTrue()
из тестовых библиотек. Это зарезервированное ключевое слово, унарный оператор. Этот оператор ничего не возвращает, а принимает проверяемое утверждение типа
boolean
. Если значение оказывается false
, проверка утверждения считается проваленной и выбрасывается AssertionError
. Это похоже на сокращенную запись пары if
и throw
, с фиксированным типом исключения.В Java до версии 4 слово
assert
не было ключевым. Поэтому для обратной совместимости механизм проверки утверждений выключен по умолчанию – логика программы никогда не должна полагаться на assert
!Включается флагом
-ea
или -enableassertions
команды java
. Можно указывать конкретные классы и пакеты в которых включить. Есть противоположный флаг -da
(-disableassertions
), эти флаги можно использовать в комбинации.Assertion-ы используются в основном для дополнительной проверки инвариантов состояния объекта и для подстраховки в коде, который не должен никогда вызываться. Выброшенный
AssertionError
обычно означает ошибку программиста.Дополнительно у оператора
assert
есть синтаксис передачи параметра detailMessage
в конструктор AssertionError
:assert 2*2==5 : "two times two is not five!";
#techniques
Раскладка Дворака
Клавиату́ра Дво́рака — раскладка клавиатуры, запатентованная профессором Вашингтонского университета Августом Двораком и Вильямом Дилли в 1936 для набора английских символов как альтернатива раскладке QWERTY.
Самая распространенная раскладка для английского языка QWERTY - наследие времен пишущих машинок. Она была создана для первой популярной серийной машинки Remington 1, фактически, став самым первым стандартом.
Создатели QWERTY были вынуждены отталкиваться от технических ограничений конструкции первых машинок, пожертвовав темпом печати. На современной клавиатуре эти ограничения не имеют никакого смысла. Тут мы и приходим к раскладке Дворака, которая была спроектирована из соображений эргономики.
Дворак - не единственная альтернатива QWERTY для английского языка, но в ИТ-среде ее активно популяризуют, вероятно, благодаря существованию так называемого Дворака для программистов, адаптированного для набора кода.
Раскладка Дворака
Клавиату́ра Дво́рака — раскладка клавиатуры, запатентованная профессором Вашингтонского университета Августом Двораком и Вильямом Дилли в 1936 для набора английских символов как альтернатива раскладке QWERTY.
Самая распространенная раскладка для английского языка QWERTY - наследие времен пишущих машинок. Она была создана для первой популярной серийной машинки Remington 1, фактически, став самым первым стандартом.
Создатели QWERTY были вынуждены отталкиваться от технических ограничений конструкции первых машинок, пожертвовав темпом печати. На современной клавиатуре эти ограничения не имеют никакого смысла. Тут мы и приходим к раскладке Дворака, которая была спроектирована из соображений эргономики.
Дворак - не единственная альтернатива QWERTY для английского языка, но в ИТ-среде ее активно популяризуют, вероятно, благодаря существованию так называемого Дворака для программистов, адаптированного для набора кода.
#java
Records в Java
Одной из наибольших претензий к Java является то, что для того, чтобы класс мог стать полезным, необходимо написать большое количество избыточного кода. Очень часто вам необходимо дописывать следующее:
* toString()
* hashCode() и equals()
* Геттеры
* Публичные конструкторы
Начиная с версии Java 16 в язык была добавлена новая функциональность - Records (на русском нередко называют "записями"). Records представляют классы, которые предназначены для создания контейнеров неизменяемых данных. Кроме того, records позволяют упростить разработку, сократив объем кода.
Records в Java
Одной из наибольших претензий к Java является то, что для того, чтобы класс мог стать полезным, необходимо написать большое количество избыточного кода. Очень часто вам необходимо дописывать следующее:
* toString()
* hashCode() и equals()
* Геттеры
* Публичные конструкторы
Начиная с версии Java 16 в язык была добавлена новая функциональность - Records (на русском нередко называют "записями"). Records представляют классы, которые предназначены для создания контейнеров неизменяемых данных. Кроме того, records позволяют упростить разработку, сократив объем кода.
public record Cat(String name, int numberOfLives, String color) { }Чтобы лучше это проиллюстрировать, давайте посмотрим на декомпилированную версию нашей записи:
public final class Cat extends java.lang.Record {Реализация equals() считает две записи равными, если они имеют одинаковый тип и имеют одинаковые значения. Реализация toString() печатает нашу запись следующим образом:
private final java.lang.String name;
private final int numberOfLives;
private final java.lang.String color;
public Cat(java.lang.String name, int numberOfLives, java.lang.String color) { /* compiled code */ }
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public java.lang.String name() { /* compiled code */ }
public int numberOfLives() { /* compiled code */ }
public java.lang.String color() { /* compiled code */ }
}
Cat[name=Fluffy, numberOfLives=9, color=White]
#java
Интерфейсы (OOP)
У нас у всех есть компьютер. Часто ли вы меняли видеокарту, процессор, оперативку? Впрочем, это неважно, важно то, что вы можете это сделать.
К примеру, вместо старого процессора поставить новый. Но как, как мы узнаем что мы можем это сделать? В этом нам помогают интерфейсы. Они определяют сможет ли тот или иной объект быть частью чего то.
Мать, не моя, а та, которая с сокетом, у нее есть определенный интерфейс, по котором она понимает, нужный ли проц сейчас подключен. Сокету плевать как там внутри он реализован, главное, чтобы был нужный интерфейс и хоть какая-то реализация. То есть, один процессор может быть хуже, другой лучше. Но у них есть что-то общее, и это - интерфейс.
Если бы не было интерфейса, а процессор был бы напрямую интегрирован в материнку, мы бы просто не смогли бы его поменять.
Теперь, для наглядности, немного кода:
(Мы описали интерфейс. Создали процессоры интерфейс который они реализуют. Потом, применяли композицию, в классе Computer, в качестве атрибута у нас объект реализующий интерфейс ISocket (процессор). Самое главное, что теперь, мы можем поменять процессор, i5, i7, какой хочешь, главное чтобы подходил интерфейс. Если бы его не было, наш пк был бы привязан только к какой-то определенной модели).
Интерфейсы (OOP)
У нас у всех есть компьютер. Часто ли вы меняли видеокарту, процессор, оперативку? Впрочем, это неважно, важно то, что вы можете это сделать.
К примеру, вместо старого процессора поставить новый. Но как, как мы узнаем что мы можем это сделать? В этом нам помогают интерфейсы. Они определяют сможет ли тот или иной объект быть частью чего то.
Мать, не моя, а та, которая с сокетом, у нее есть определенный интерфейс, по котором она понимает, нужный ли проц сейчас подключен. Сокету плевать как там внутри он реализован, главное, чтобы был нужный интерфейс и хоть какая-то реализация. То есть, один процессор может быть хуже, другой лучше. Но у них есть что-то общее, и это - интерфейс.
Если бы не было интерфейса, а процессор был бы напрямую интегрирован в материнку, мы бы просто не смогли бы его поменять.
Теперь, для наглядности, немного кода:
(Мы описали интерфейс. Создали процессоры интерфейс который они реализуют. Потом, применяли композицию, в классе Computer, в качестве атрибута у нас объект реализующий интерфейс ISocket (процессор). Самое главное, что теперь, мы можем поменять процессор, i5, i7, какой хочешь, главное чтобы подходил интерфейс. Если бы его не было, наш пк был бы привязан только к какой-то определенной модели).
#java
Префиксное дерево
Префиксное (нагруженное) дерево — это разновидность дерева поиска. Оно хранит данные в метках, каждая из которых представляет собой узел на дереве. Такие структуры часто используют, чтобы хранить слова и выполнять быстрый поиск по ним — например, для функции автозаполнения.
Каждый узел в языковом префиксном дереве содержит одну букву слова. Чтобы составить слово, нужно следовать по ветвям дерева, проходя по одной букве за раз. Дерево начинает ветвиться, когда порядок букв отличается от других имеющихся в нем слов или когда слово заканчивается. Каждый узел содержит букву (данные) и булево значение, которое указывает, является ли он последним в слове.
Посмотрите на иллюстрацию и попробуйте составить слова. Всегда начинайте с корневого узла вверху и спускайтесь вниз. Это дерево содержит следующие слова: ball, bat, doll, do, dork, dorm, send, sense.
Префиксное дерево
Префиксное (нагруженное) дерево — это разновидность дерева поиска. Оно хранит данные в метках, каждая из которых представляет собой узел на дереве. Такие структуры часто используют, чтобы хранить слова и выполнять быстрый поиск по ним — например, для функции автозаполнения.
Каждый узел в языковом префиксном дереве содержит одну букву слова. Чтобы составить слово, нужно следовать по ветвям дерева, проходя по одной букве за раз. Дерево начинает ветвиться, когда порядок букв отличается от других имеющихся в нем слов или когда слово заканчивается. Каждый узел содержит букву (данные) и булево значение, которое указывает, является ли он последним в слове.
Посмотрите на иллюстрацию и попробуйте составить слова. Всегда начинайте с корневого узла вверху и спускайтесь вниз. Это дерево содержит следующие слова: ball, bat, doll, do, dork, dorm, send, sense.