☕ Учебник по Java: введение в класс String
https://proglib.io/p/uchebnik-po-java-vvedenie-v-klass-string-2022-08-26
https://proglib.io/p/uchebnik-po-java-vvedenie-v-klass-string-2022-08-26
Библиотека программиста
☕ Учебник по Java: введение в класс String
Оттачиваем навык работы со строчками: создание, форматирование, конкатенация строк и самые часто используемые методы.
👍10🔥1
👨🏻💻 Weekend Offer для Java-разработчиков в команду ВКонтакте
Вам предстоит участвовать в разработке новых фич, развивать и улучшать существующие решения, работать над улучшением качества звука и видео и решать задачи бесперебойной передачи данных в сложных сетевых условиях.
Из требований опыт бэкенд-разработки на Java, способность собрать требования к задаче,
знание сетевых стеков и протоколов передачи данных и понимание классических алгоритмов и структур данных, а также умение писать читаемый, поддерживаемый и легко масштабируемый код.
Мероприятие состоится 10–11 сентября. Успейте подать заявку до 9 сентября: с вами свяжутся и выберут слот для индивидуального онлайн-интервью в выходные. Уже 11 сентября вечером определят лучших кандидатов и отправят им офферы.
➡️ Зарегестрироваться
@javatg
Вам предстоит участвовать в разработке новых фич, развивать и улучшать существующие решения, работать над улучшением качества звука и видео и решать задачи бесперебойной передачи данных в сложных сетевых условиях.
Из требований опыт бэкенд-разработки на Java, способность собрать требования к задаче,
знание сетевых стеков и протоколов передачи данных и понимание классических алгоритмов и структур данных, а также умение писать читаемый, поддерживаемый и легко масштабируемый код.
Мероприятие состоится 10–11 сентября. Успейте подать заявку до 9 сентября: с вами свяжутся и выберут слот для индивидуального онлайн-интервью в выходные. Уже 11 сентября вечером определят лучших кандидатов и отправят им офферы.
➡️ Зарегестрироваться
@javatg
👎4👍3
Эффективный Java. Тюнинг кода на Java 8, 11 и дальше (2021) PDF, EPUB
Вы сможете разобраться в производительности приложений Java в контексте как JVM, так и платформы Java, освоите средства, функции и процессы, которые могут повысить производительность в LTS-версиях Java, и познакомитесь с новыми возможностями (такими как предварительная компиляция и экспериментальные уборщики мусора).
В этой книге вы:
- Узнаете, как платформы и компиляторы Java влияют на производительность.
- Разберетесь c механизмом уборки мусора.
- Освоите четыре принципа получения наилучших результатов при тестировании производительности.
- Научитесь пользоваться JDK и другими инструментами оценки производительности.
- Узнаете как настройка и приемы программирования позволяют минимизировать последствия уборки мусора.
- Научитесь решать проблемы производительности средствами Java API.
- Поймете, как улучшить производительность приложений баз данных Java.
📖 Книга
@javatg
Вы сможете разобраться в производительности приложений Java в контексте как JVM, так и платформы Java, освоите средства, функции и процессы, которые могут повысить производительность в LTS-версиях Java, и познакомитесь с новыми возможностями (такими как предварительная компиляция и экспериментальные уборщики мусора).
В этой книге вы:
- Узнаете, как платформы и компиляторы Java влияют на производительность.
- Разберетесь c механизмом уборки мусора.
- Освоите четыре принципа получения наилучших результатов при тестировании производительности.
- Научитесь пользоваться JDK и другими инструментами оценки производительности.
- Узнаете как настройка и приемы программирования позволяют минимизировать последствия уборки мусора.
- Научитесь решать проблемы производительности средствами Java API.
- Поймете, как улучшить производительность приложений баз данных Java.
📖 Книга
@javatg
👍13
☕ Как повысить производительность приложений Java за 9 шагов.
Прежде чем углубляться в каждый конкретный шаг, мы хотели бы дать вам общий обзор того, как повысить производительность приложений Java, а именно:
Выполнить профилирование и нагрузочное тестирование - Профилирование вашего Java-приложения поможет выявить болевые точки и узкие места.
Очистить код и пересмотреть алгоритмы - чистый код легче поддерживать, редактировать, читать и уточнять; пересмотр ваших алгоритмов уменьшает вызовы тавтологических функций.
Избегайте рекурсии, когда это возможно - в некоторых случаях рекурсия является неизбежным злом, хотя ее следует использовать с осторожностью.
Обновление системного оборудования - низкая производительность приложения не может быть связана с плохим кодом и алгоритмами; вместо этого основная причина может быть связана с системой, в которой выполняется приложение.
Увеличить пропускную способность LAN и WAN - не все функции взаимодействуют с локальным оборудованием; если ваше приложение взаимодействует с удаленными системами, возможно, виновата ваша сетевая инфраструктура.
Привести в порядок свою операционную систему - беспорядочные операционные системы нуждаются в обслуживании, чтобы максимально эффективно запускать приложения.
Использование StringBuilder для повышения эффективности - строки почти неизбежны в большинстве приложений, но операция «+ =» крайне неэффективна.
Используйте кеширование для повышения производительности - кэширование является одним из лучших способов уменьшить избыточность экземпляров объектов и вызовов функций.
Пользуйся стеком кучи - стек более эффективен по отношению к системным ресурсам, поскольку он поддерживает себя и освобождает память, занимаемую недействительными объектами.
➡️ Читать дальше
@javatg
Прежде чем углубляться в каждый конкретный шаг, мы хотели бы дать вам общий обзор того, как повысить производительность приложений Java, а именно:
Выполнить профилирование и нагрузочное тестирование - Профилирование вашего Java-приложения поможет выявить болевые точки и узкие места.
Очистить код и пересмотреть алгоритмы - чистый код легче поддерживать, редактировать, читать и уточнять; пересмотр ваших алгоритмов уменьшает вызовы тавтологических функций.
Избегайте рекурсии, когда это возможно - в некоторых случаях рекурсия является неизбежным злом, хотя ее следует использовать с осторожностью.
Обновление системного оборудования - низкая производительность приложения не может быть связана с плохим кодом и алгоритмами; вместо этого основная причина может быть связана с системой, в которой выполняется приложение.
Увеличить пропускную способность LAN и WAN - не все функции взаимодействуют с локальным оборудованием; если ваше приложение взаимодействует с удаленными системами, возможно, виновата ваша сетевая инфраструктура.
Привести в порядок свою операционную систему - беспорядочные операционные системы нуждаются в обслуживании, чтобы максимально эффективно запускать приложения.
Использование StringBuilder для повышения эффективности - строки почти неизбежны в большинстве приложений, но операция «+ =» крайне неэффективна.
Используйте кеширование для повышения производительности - кэширование является одним из лучших способов уменьшить избыточность экземпляров объектов и вызовов функций.
Пользуйся стеком кучи - стек более эффективен по отношению к системным ресурсам, поскольку он поддерживает себя и освобождает память, занимаемую недействительными объектами.
➡️ Читать дальше
@javatg
👍12👎2🔥1
data_analysis_ml - аналитика данных, data science, sql
machinelearning_interview - канал подготовит к собеседованию по машинному обучению, статисике ,алгоритмам и науке о данных.
golang_interview - Вопросы с настоящих Golang собеседований, помогут Вам получить успешно пройти интервью.
python_job_interview - здесь собраны все возможные вопросы и ответы с собеседований по Python.
java_quizes - вопросы по Java
machinelearning_interview - канал подготовит к собеседованию по машинному обучению, статисике ,алгоритмам и науке о данных.
golang_interview - Вопросы с настоящих Golang собеседований, помогут Вам получить успешно пройти интервью.
python_job_interview - здесь собраны все возможные вопросы и ответы с собеседований по Python.
java_quizes - вопросы по Java
🔥4👍2
✒️ Инструкция по написанию HTTP-сервера на Java
Вы хотите реализовать HTTP-сервер , но не хотите рисковать написанием полноценного HTTP-сервера? Разработка HTTP-сервера с полной функциональностью не является тривиальной задачей. Но у Java есть решение этой проблемы. Java поддерживает встроенный HTTP-сервер. Просто написав 100 строк кода, мы можем разработать несколько приличный HTTP-сервер, который может обрабатывать запросы. Мы также можем использовать его для обработки других HTTP-команд.
➡️ Читать дальше
@javatg
Вы хотите реализовать HTTP-сервер , но не хотите рисковать написанием полноценного HTTP-сервера? Разработка HTTP-сервера с полной функциональностью не является тривиальной задачей. Но у Java есть решение этой проблемы. Java поддерживает встроенный HTTP-сервер. Просто написав 100 строк кода, мы можем разработать несколько приличный HTTP-сервер, который может обрабатывать запросы. Мы также можем использовать его для обработки других HTTP-команд.
➡️ Читать дальше
@javatg
👍5🔥2❤1
✒️ Spring WebFlux: Реактивное программирование веб-сервисов
Модуль WebFlux появился в 5й версии фреймворка Spring. Этот микрофреймворк является альтернативой Spring MVC и отражает собой реактивный подход для написания веб-сервисов. В основе WebFlux лежит библиотека Project Reactor, позволяющая легко запрограммировать неблокирующие (асинхронные) потоки (streams), работающие с вводом/выводом данных.
Следует учесть, что WebFlux для работы требуется встроенный в Spring сервер Netty. Встроенные Tomcat и Jetty не подходят. Следующая диаграмма иллюстрирует особенности окружения, в котором работает WebFlux
➡️ Читать дальше
@javatg
Модуль WebFlux появился в 5й версии фреймворка Spring. Этот микрофреймворк является альтернативой Spring MVC и отражает собой реактивный подход для написания веб-сервисов. В основе WebFlux лежит библиотека Project Reactor, позволяющая легко запрограммировать неблокирующие (асинхронные) потоки (streams), работающие с вводом/выводом данных.
Следует учесть, что WebFlux для работы требуется встроенный в Spring сервер Netty. Встроенные Tomcat и Jetty не подходят. Следующая диаграмма иллюстрирует особенности окружения, в котором работает WebFlux
➡️ Читать дальше
@javatg
👍9❤2
Модификаторы synchronized, volatile, transient, native
Модификаторы synchronized, volatile, transient, native: что обозначают и как они используются.
synchronized
Этим модификатором может быть помечена функция или блок кода.
Если помечена нестатическая функция, то такие функции для этого объекта невозможно выполнять параллельно из нескольких потоков (остальные потоки ждут, пока блок будет выполнен потоком, захватившим монитор).
Для статической функции класса то же самое, что и для объекта, только монитором будет не объект, а сам класс.
При возникновении в методе необрабатываемого исключения - монитор освобождается и блокировка с кода снимается.
Если модификатором synchronized помечается блок кода, то в скобках указывается какой объект будет монитором. Блоки с одинаковыми мониторами выполняются последовательно.
volatile
Модификатор переменной указывает на то, что при обращении к переменной на чтение требуется получить текущее значение переменной (невозможно использование кэшей и т.д.)
transient
Модификатор переменной говорит о том, что переменная не подлежит сериализации. При десериализации требуется выставить значение по умолчанию (в readObject'е).
native
Модификатор метода указывает на то, что реализация метода написана на другой программной платформе.
@javatg
Модификаторы synchronized, volatile, transient, native: что обозначают и как они используются.
synchronized
Этим модификатором может быть помечена функция или блок кода.
Если помечена нестатическая функция, то такие функции для этого объекта невозможно выполнять параллельно из нескольких потоков (остальные потоки ждут, пока блок будет выполнен потоком, захватившим монитор).
Для статической функции класса то же самое, что и для объекта, только монитором будет не объект, а сам класс.
При возникновении в методе необрабатываемого исключения - монитор освобождается и блокировка с кода снимается.
Если модификатором synchronized помечается блок кода, то в скобках указывается какой объект будет монитором. Блоки с одинаковыми мониторами выполняются последовательно.
volatile
Модификатор переменной указывает на то, что при обращении к переменной на чтение требуется получить текущее значение переменной (невозможно использование кэшей и т.д.)
transient
Модификатор переменной говорит о том, что переменная не подлежит сериализации. При десериализации требуется выставить значение по умолчанию (в readObject'е).
native
Модификатор метода указывает на то, что реализация метода написана на другой программной платформе.
@javatg
👍11🔥3😁1
Collections.min/max
Удивительно, насколько часто можно встретить написанный вручную код, который находит максимальный или минимальный элемент чего-то по какому-нибудь критерию.
Казалось бы, такая тривиальная задача должна быть давно решена. На самом деле она и так давно решена: есть методы Collections.min и Collections.max. Раньше было не очень удобно писать компараторы, но в Java-8 всё стало легче.
К примеру, вам нужно найти ключ в Map, соответствующий максимальному значению.
@javatg
Удивительно, насколько часто можно встретить написанный вручную код, который находит максимальный или минимальный элемент чего-то по какому-нибудь критерию.
Казалось бы, такая тривиальная задача должна быть давно решена. На самом деле она и так давно решена: есть методы Collections.min и Collections.max. Раньше было не очень удобно писать компараторы, но в Java-8 всё стало легче.
К примеру, вам нужно найти ключ в Map, соответствующий максимальному значению.
@javatg
👍13
Работа с БД с помощью JDBC
1. Утверждения (Statements)
Взаимодействовать с БД мы можем с помощью трёх интерфейсов, которые реализуются каждым драйвером:
Statement - этот интерфейс используется для доступа к БД для общих целей. Он крайне полезен, когда мы используем статические SQL – выражения во время работы программы. Этот интерфейс не принимает никаких параметров.
PreparedStatement - этот интерфейс может принимать параметры во время работы программы.
CallableStatement - этот интерфейс становится полезным в случае, когда мы хотим получить доступ к различным процедурам БД. Он также может принимать параметры во время работы программы.
➡️ Читать дальше
@javatg
1. Утверждения (Statements)
Взаимодействовать с БД мы можем с помощью трёх интерфейсов, которые реализуются каждым драйвером:
Statement - этот интерфейс используется для доступа к БД для общих целей. Он крайне полезен, когда мы используем статические SQL – выражения во время работы программы. Этот интерфейс не принимает никаких параметров.
PreparedStatement - этот интерфейс может принимать параметры во время работы программы.
CallableStatement - этот интерфейс становится полезным в случае, когда мы хотим получить доступ к различным процедурам БД. Он также может принимать параметры во время работы программы.
➡️ Читать дальше
@javatg
👍10
В чём отличия интерфейса от абстрактного класса?
Главное отличие – это семантика. Интерфейсы появились еще до Java, как важная концепция ООП. Смысл интерфейса – некое поведение, описание свойства. Причем если придерживаться принципа сегрегации интерфейсов, это описание единственного аспекта поведения.
Класс, даже абстрактный – это комбинация всех свойств и их реализаций, которыми определяются сущности некоторой категории (собственно, класса).
Отсюда вытекает естественность и необходимость множественного наследования для интерфейсов. Опыт таких языков как C++ показал, что множественное наследование классов не нужно и проблемно (см. проблема ромбовидного наследования). По факту же обычно нужно всего лишь переиспользование кода, что не относится к ООП и реализуется в некоторых языках «интерфейсами с независимым состоянием» – примесями.
В Java интерфейс в отличие от абстрактного класса не может иметь состояния. Реализация поведения же допустима только в двух случаях: для статических методов, и default для обычных. Статические методы являются частью всего класса, а не экземпляров. Дефолтная реализация, как говорилось ранее, добавлена только как хак для сохранения совместимости.
В интерфейсах, как публичных описаниях, не имеют смысла и запрещены непубличные члены. Отсюда синтаксическое отличие: модификатор public, как и abstract для методов или static для полей, можно не писать. Запрещены и модификаторы, несовместимые с abstract: final, synchronized и прочие.
На уровне скомпилированного байткода тоже есть небольшие различия: интерфейс помечается флагом ACC_INTERFACE а для класса генерируется конструктор по-умолчанию.
И есть еще одно небольшое отличие. Интерфейс с одним методом можно использовать как функциональный, и инстанциировать лямбда-выражением. Для абстрактного класса даже с единственным методом такое не сработает.
#Классы
@javatg
Главное отличие – это семантика. Интерфейсы появились еще до Java, как важная концепция ООП. Смысл интерфейса – некое поведение, описание свойства. Причем если придерживаться принципа сегрегации интерфейсов, это описание единственного аспекта поведения.
Класс, даже абстрактный – это комбинация всех свойств и их реализаций, которыми определяются сущности некоторой категории (собственно, класса).
Отсюда вытекает естественность и необходимость множественного наследования для интерфейсов. Опыт таких языков как C++ показал, что множественное наследование классов не нужно и проблемно (см. проблема ромбовидного наследования). По факту же обычно нужно всего лишь переиспользование кода, что не относится к ООП и реализуется в некоторых языках «интерфейсами с независимым состоянием» – примесями.
В Java интерфейс в отличие от абстрактного класса не может иметь состояния. Реализация поведения же допустима только в двух случаях: для статических методов, и default для обычных. Статические методы являются частью всего класса, а не экземпляров. Дефолтная реализация, как говорилось ранее, добавлена только как хак для сохранения совместимости.
В интерфейсах, как публичных описаниях, не имеют смысла и запрещены непубличные члены. Отсюда синтаксическое отличие: модификатор public, как и abstract для методов или static для полей, можно не писать. Запрещены и модификаторы, несовместимые с abstract: final, synchronized и прочие.
На уровне скомпилированного байткода тоже есть небольшие различия: интерфейс помечается флагом ACC_INTERFACE а для класса генерируется конструктор по-умолчанию.
И есть еще одно небольшое отличие. Интерфейс с одним методом можно использовать как функциональный, и инстанциировать лямбда-выражением. Для абстрактного класса даже с единственным методом такое не сработает.
#Классы
@javatg
👍15❤2🤔1
Топ-10 лучших фреймворков и библиотек Java
Чем отличается фреймворк от библиотеки
Фреймворки Java — по сути, блоки предварительно написанного кода, в которые программист может добавлять свой код для решения конкретных проблем. Это каркас программной системы (или подсистемы). Он может включать:
- вспомогательные программы;
- библиотеки кода;
- язык сценариев;
- другое ПО, облегчающее разработку и объединение разных компонентов большого программного проекта.
Обычно объединение происходит за счёт использования единого API. Фреймворки Java сокращают объём написания кода с нуля, который программистам приходится делать, чтобы найти решение.
Библиотеки — это код, предназначенный для решения конкретной проблемы.
➡️ Читать дальше
@javatg
Чем отличается фреймворк от библиотеки
Фреймворки Java — по сути, блоки предварительно написанного кода, в которые программист может добавлять свой код для решения конкретных проблем. Это каркас программной системы (или подсистемы). Он может включать:
- вспомогательные программы;
- библиотеки кода;
- язык сценариев;
- другое ПО, облегчающее разработку и объединение разных компонентов большого программного проекта.
Обычно объединение происходит за счёт использования единого API. Фреймворки Java сокращают объём написания кода с нуля, который программистам приходится делать, чтобы найти решение.
Библиотеки — это код, предназначенный для решения конкретной проблемы.
➡️ Читать дальше
@javatg
👍8🤩1
Фитнес-функции и их роль в эволюции архитектуры на Java.
В данной статье мы рассмотрим понятие фитнес-функций (функций приспособленности) и приведем ряд простых примеров. Изучив материал, вы узнаете о назначении этих функций и свежим взглядом посмотрите на тестирование требований к вашим проектам.
➡️ Читать дальше
@javatg
В данной статье мы рассмотрим понятие фитнес-функций (функций приспособленности) и приведем ряд простых примеров. Изучив материал, вы узнаете о назначении этих функций и свежим взглядом посмотрите на тестирование требований к вашим проектам.
➡️ Читать дальше
@javatg
👍5
🔥 Полезнейшая Подборка каналов
☕️ Java
@javatg - Java для програмистов
@javachats Java чат
@java_library - книги Java
@android_its Android разработка
@java_quizes - тесты Java
@Java_workit - работа Java
@progersit - шпаргалки ит
💡 Javascript / front
@javascriptv - javascript изучение
@about_javascript - javascript продвинутый
@JavaScript_testit -тесты JS
@htmlcssjavas - web
@hashdev - web разработка
🦾 Machine learning
@ai_machinelearning_big_data – все о машинном обучении
@data_analysis_ml – все о анализе данных.
@machinelearning_ru – машинное обучении на русском от новичка до профессионала.
@machinelearning_interview – подготовка к собеседования Data Science
@datascienceiot – бесплатные книги Machine learning
@ArtificialIntelligencedl – канал о искусственном интеллекте
@neural – все о нейронных сетях
@machinee_learning – чат о машинном обучении
@datascienceml_jobs - работа ds, ml
🦫 Golang
@golang_interview - вопросы и ответы с собеседований по Go. Для всех уровней разработчиков.
@Golang_google - go для разработчиков
@golangtests - тесты и задачи GO
@golangl - чат Golang
@GolangJobsit - вакансии и работа GO
@golang_jobsgo - чат вакансий
@golang_books - книги Golang
@golang_speak - обсуждение задач Go
🐍 Python
@pythonl – python для датасаентиста
@pro_python_code – python на русском
@python_job_interview – подготовка к Python собеседованию
@python_testit тесты на python
@pythonlbooks - книги Python
@Django_pythonl django
@python_djangojobs - работа Python
🐧 Linux
@inux_kal - чат kali linux
@inuxkalii - linux kali
@linux_read - книги linux
👷♂️ IT работа
@hr_itwork - ит-ваканнсии
🔋 SQL
@sqlhub - базы данных
@chat_sql - базы данных чат
🤡It memes
@memes_prog - ит-мемы
⚙️ Rust
@rust_code - язык программирования rust
@rust_chats - чат rust
#️⃣ c# c++
@csharp_ci - c# c++кодинг
@csharp_cplus чат
☕️ Java
@javatg - Java для програмистов
@javachats Java чат
@java_library - книги Java
@android_its Android разработка
@java_quizes - тесты Java
@Java_workit - работа Java
@progersit - шпаргалки ит
💡 Javascript / front
@javascriptv - javascript изучение
@about_javascript - javascript продвинутый
@JavaScript_testit -тесты JS
@htmlcssjavas - web
@hashdev - web разработка
🦾 Machine learning
@ai_machinelearning_big_data – все о машинном обучении
@data_analysis_ml – все о анализе данных.
@machinelearning_ru – машинное обучении на русском от новичка до профессионала.
@machinelearning_interview – подготовка к собеседования Data Science
@datascienceiot – бесплатные книги Machine learning
@ArtificialIntelligencedl – канал о искусственном интеллекте
@neural – все о нейронных сетях
@machinee_learning – чат о машинном обучении
@datascienceml_jobs - работа ds, ml
🦫 Golang
@golang_interview - вопросы и ответы с собеседований по Go. Для всех уровней разработчиков.
@Golang_google - go для разработчиков
@golangtests - тесты и задачи GO
@golangl - чат Golang
@GolangJobsit - вакансии и работа GO
@golang_jobsgo - чат вакансий
@golang_books - книги Golang
@golang_speak - обсуждение задач Go
🐍 Python
@pythonl – python для датасаентиста
@pro_python_code – python на русском
@python_job_interview – подготовка к Python собеседованию
@python_testit тесты на python
@pythonlbooks - книги Python
@Django_pythonl django
@python_djangojobs - работа Python
🐧 Linux
@inux_kal - чат kali linux
@inuxkalii - linux kali
@linux_read - книги linux
👷♂️ IT работа
@hr_itwork - ит-ваканнсии
🔋 SQL
@sqlhub - базы данных
@chat_sql - базы данных чат
🤡It memes
@memes_prog - ит-мемы
⚙️ Rust
@rust_code - язык программирования rust
@rust_chats - чат rust
#️⃣ c# c++
@csharp_ci - c# c++кодинг
@csharp_cplus чат
👍11
🔎 Распознавание символов на Java
В последнее время задача распознавания символов в прикладных программах не представляет особой сложности — можно использовать множество готовых OCR-библиотек, многие из которых доведены почти до совершенства. Но все же иногда может возникнуть задача разработать свой алгоритм распознавания без использования сторонних «навороченных» OCR-библиотек.
Именно такая задача возникла у меня по ходу работы, а причин, почему лучше не использовать готовые библиотеки, несколько: закрытость проекта, с его дальнейшей сертификацией, определенное ограничение на количество строчек кода и размер подключаемых библиотек, тем более что по предметной области распознавать приходится достаточно определенный набор символов.
Алгоритм распознавания простой, и, конечно же, не претендует на звание самого точного, быстрого и эффективного, но со своей маленькой задачей справляется хорошо.
Допустим, у нас есть входные данные в виде отсканированных изображений документов, структурированной формы. У этих документов есть специальный односимвольный код расположенный в верхнем левом углу. Наша задача этот символ распознать и дальше произвести какие-нибудь действия, например классифицировать исходный документ по заданным правилам.
➡️ Читать дальше
@javatg
В последнее время задача распознавания символов в прикладных программах не представляет особой сложности — можно использовать множество готовых OCR-библиотек, многие из которых доведены почти до совершенства. Но все же иногда может возникнуть задача разработать свой алгоритм распознавания без использования сторонних «навороченных» OCR-библиотек.
Именно такая задача возникла у меня по ходу работы, а причин, почему лучше не использовать готовые библиотеки, несколько: закрытость проекта, с его дальнейшей сертификацией, определенное ограничение на количество строчек кода и размер подключаемых библиотек, тем более что по предметной области распознавать приходится достаточно определенный набор символов.
Алгоритм распознавания простой, и, конечно же, не претендует на звание самого точного, быстрого и эффективного, но со своей маленькой задачей справляется хорошо.
Допустим, у нас есть входные данные в виде отсканированных изображений документов, структурированной формы. У этих документов есть специальный односимвольный код расположенный в верхнем левом углу. Наша задача этот символ распознать и дальше произвести какие-нибудь действия, например классифицировать исходный документ по заданным правилам.
➡️ Читать дальше
@javatg
👍6
🔃 Синхронизация потоков. Оператор synchronized
При работе потоки нередко обращаются к каким-то общим ресурсам, которые определены вне потока, например, обращение к какому-то файлу. Если одновременно несколько потоков обратятся к общему ресурсу, то результаты выполнения программы могут быть неожиданными и даже непредсказуемыми. Например, определим следующий код:
➡️ Читать дальше
@javatg
При работе потоки нередко обращаются к каким-то общим ресурсам, которые определены вне потока, например, обращение к какому-то файлу. Если одновременно несколько потоков обратятся к общему ресурсу, то результаты выполнения программы могут быть неожиданными и даже непредсказуемыми. Например, определим следующий код:
➡️ Читать дальше
@javatg
👍6
🪞 Рефлексия кода, reflection на Java
Рефлексия (от reflexio - обращение назад) - это механизм исследования данных о программе во время её выполнения. Рефлексия в Java осуществляется с помощью Java Reflection API, состоящий из классов пакетов java.lang и java.lang.reflect. В информатике рефлексия означает процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения.
Java Reflection API позволяет получать информацию о конструкторах, методах и полях классов и выполнять следующие операции над полями и методами объекта/класса :
определение класса объекта;
получение информации о полях, методах, конструкторах и суперклассах;
получение информации о модификаторах полей и методов;
создание экземпляра класса, имя которого неизвестно до момента выполнения программы;
определение и изменение значений свойств объекта/класса;
вызов методов объекта/класса.
➡️ Читать дальше
@javatg
Рефлексия (от reflexio - обращение назад) - это механизм исследования данных о программе во время её выполнения. Рефлексия в Java осуществляется с помощью Java Reflection API, состоящий из классов пакетов java.lang и java.lang.reflect. В информатике рефлексия означает процесс, во время которого программа может отслеживать и модифицировать собственную структуру и поведение во время выполнения.
Java Reflection API позволяет получать информацию о конструкторах, методах и полях классов и выполнять следующие операции над полями и методами объекта/класса :
определение класса объекта;
получение информации о полях, методах, конструкторах и суперклассах;
получение информации о модификаторах полей и методов;
создание экземпляра класса, имя которого неизвестно до момента выполнения программы;
определение и изменение значений свойств объекта/класса;
вызов методов объекта/класса.
➡️ Читать дальше
@javatg
👍10