javatg | Unsorted

Telegram-канал javatg - Java

17642

Самая актуальная информация из мира Java По всем вопросам- @haarrp @itchannels_telegram - 🔥лучшие ит-каналы @pythonl - 🐍 @ai_machinelearning_big_data- ml @ArtificialIntelligencedl - AI @datascienceiot - ds @pythonlbooks 📚 РКН: clck.ru/3FmwKr

Subscribe to a channel

Java

💻 Кинетические часы — интересный проект на Kotlin

Отличная идея для пет-проекта)
Создано с использованием Compose Desktop

🖥 GitHub

@javatg

Читать полностью…

Java

Скажите что-то на карьерном

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

Реклама. АО «Тинькофф Банк», ИНН 7710140679

Читать полностью…

Java

Устроиться бэкендером в Яндекс за выходные

8–9 июня устраиваем Weekend Offer Backend. До 6 июня решите задачи в Контесте, 8-го пройдите два собеседования, а 9 июня познакомьтесь с командами и получите офер.

В мероприятии участвуют команды: Crowd, Ecom-сценарии, Поиск, Алиса, Автономные автомобили, Большие данные. Вы сможете пообщаться с менеджерами и выбрать проект, который покажется самым интересным.

Нанимаем в офисы России и Республики Беларусь.

Узнать подробности и зарегистрироваться можно здесь.

Читать полностью…

Java

🖥 JMusicBot — музыкальный бот на Java для Discord, который легко настроить и запустить

Фишки бота:
— Легко запускается (нужно только Java)
— Быстрая загрузка песен
— Не требуется никаких внешних ключей (кроме токена Discord Bot)
— Плавное воспроизведение
— Настройка сервера для роли диджея, который может модерировать музыку
— Чистые и красивые меню
— Поддерживает множество сайтов, включая Youtube, Soundcloud и другие
— Поддержка многих онлайн-радио/потоков
— Поддержка локальных файлов
— Поддержка плейлистов (как веб-/ютуб, так и локальных)

🖥 GitHub

@javatg

Читать полностью…

Java

Ростов-на-Дону, приглашаем 23 мая на митап IT Talk by Sber 👨‍💻

Обещаем интересную программу и много нетворкинга. Будем слушать доклады на тему soft skills, проектирования ПО и роли AI в тестировании.

Спикеры и темы:

👉 Виталий Куценко — руководитель направления дивизиона «Кредитные продукты и процессы» — «Послание к самому себе: "…про архитектуру приложений"».

👉 Ирина Коровина — главный инженер по разработке управления технологий маркетинга — «Искусственный интеллект: новый помощник тестировщика. Как мы попробовали применить AI в Медиа».

👉 Михаил Новотарский — руководитель направления, QA-лид внутреннего сервиса «СберДруг» — «Управление гневом в работе ИТ-команд».

Локация: Ростов-на-Дону, Лофт «РУБИН» Театральный просп., 85 (этаж 4)

Ждём вас 23 мая в 18:00!
Регистрируйтесь по ссылке 😉

Читать полностью…

Java

🖥Apache Tomcat - установка и настройка на Debian

🟡Apache Tomcat – это сервер приложений, который используется для обслуживания приложений Java.
Tomcat – это открытая реализация технологий Java Servlet и JavaServer Pages.

🟡Для работы Tomcat необходимо установить Java, иначе код Java не будет выполняться. Установите OpenJDK при помощи стандартного пакетного менеджера apt:

sudo apt update && sudo apt install default-jdk wget curl

После установки Java создайте специального пользователя tomcat для запуска сервиса Tomcat.

▶️ Теперь создадим и настроим пользователя Tomcat

@javatg

Читать полностью…

Java

🖥 Я.Субботник по Java-разработке

Держите супер полезное видео — запись митапа Java-разработчиков.
О том, как устроена разработка в финтехе, как можно использовать GPT и не только.
Надеюсь, вы почерпнёте много полезного для себя.

Что внутри?
• 00:11:04 — Java и Kotlin в Яндекс.Банке
• 00:43:47 — Как строить надежные цепочки интеграций в облаке, чтобы пользователь мог изменить заказ на лету
• 01:13:15 — Взболтать, но не смешивать — пробуем GPT в быту разработчика
• 02:14:01 — Разработка на Scala — проще, чем кажется
• 02:46:12 — Отказоустойчивая архитектура Java сервисов для отправки пуш нотификаций в мобильные приложения Яндекса

📎 Кликабельный план видео
📎 YouTube

@javatg

Читать полностью…

Java

🖥 Quarkus — это cloud native фреймворк для написания Java-приложений

Особенности Quarkus:
🟡Оптимизация для контейнеризации: создаваемые Java-приложения занимают минимум места, что идеально для работы в контейнерах.

🟡Cloud Native: воплощение 12-факторной архитектуры в таких средах, как Kubernetes.

🟡Унификация императивного и реактивного подходов: объединяет в рамках одной модели программирования неблокирующий и императивный стили разработки.

🟡Основано на стандартах: основана на любимых стандартах и фреймворках (RESTEasy и JAX-RS, Hibernate ORM и JPA, Netty, Eclipse Vert.x, Eclipse MicroProfile, Apache Camel и т.д.)

🟡Microservice First: обеспечивает молниеносное время запуска и скорость выполнения кода в Java-приложениях.

curl -Ls https://sh.jbang.dev | bash -s - trust add https://repo1.maven.org/maven2/io/quarkus/quarkus-cli/
curl -Ls https://sh.jbang.dev | bash -s - app install --fresh --force quarkus@quarkusio


🖥 GitHub
🟡 Доки

@javatg

Читать полностью…

Java

🖥 Веб-фреймворк для Java — Javalin

Javalin — это очень легкий веб-фреймворк для Kotlin и Java, поддерживающий WebSockets, HTTP2 и async-запросы. Главные цели Javalin — простота, отличный опыт разработчика и первоклассная совместимость между Kotlin и Java.

Javalin — это скорее библиотека, чем фреймворк.
Пара ключевых моментов:
— Не нужно ничего расширять.
— Нет никаких @Annotations

🖥 GitHub

@javatg

Читать полностью…

Java

🖥 Преобразование кода ASCII в символы в Java

▶️Если в двух словах, то для быстрого преобразования ASCII-кода в символ на Java, вы можете использовать следующий код:

char asciiCharacter = (char) 65; // ASCII-код 65 — это 'A'

Чтобы произвести конвертацию ASCII-кода в символ, достаточно явно привести значение целочисленного типа int к символьному типу char.


▶️Чуть подробнее про ASCII и символы в Java

В Java символы ASCII представлены с использованием типа данных char, который способен представлять 16-битные символы Unicode. Поскольку ASCII является подмножеством Unicode, они корректно представлены в этой системе.

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

Важно учесть, что в ASCII кодировке есть управляющие символы (0-31, 127), а также буквы, цифры и символы пунктуации (32-126), входящие в стандартный набор ASCII.


▶️Проверка, что число в нужном диапазоне

Предварительная проверка диапазона числа спасёт от возможных проблем. Убедитесь, что число, которое вы собираетесь преобразовать, лежит в пределах от 0 до 255:
int asciiCode = 65;
if (asciiCode >= 0 && asciiCode <= 255) {
char character = (char) asciiCode;
// "Всегда подтверждай правильность диапазона перед преобразованием!" – золотое правило разработчика
}

Такой подход повышает надёжность вашего кода и помогает избежать ошибок.


▶️Преобразование символа в строку

Если вам необходим результат в виде строки, а не символа, используйте метод Character.toString или просто добавьте символ к пустой строке:
String characterStr = Character.toString((char) asciiCode);
// или проще
String characterStr = "" + (char) asciiCode;

Теперь у вас есть как символ, так и строка.

@javatg

Читать полностью…

Java

🖥 Metrics — Сбор метрик на уровне JVM и приложения

Metrics — это библиотека Java, которая позволяет найти высоконагруженные места приложения и bottleneck'и.
Metrics использует наработки библиотек Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jersey и создаёт подробный отчёт о работе приложения.

🖥 GitHub
🟡 Страничка Metrics

@javatg

Читать полностью…

Java

🔥Подборка лучших обучающих каналов для программистов.

➡️ Делитесь с коллегами и сохраняйте себе, чтобы не потерять

⚡Машинное обучение

Machine Learning - запускаем лучшие ИИ модели, пишем код, погружаемся в нейросети
Ml Собеседование - подготовка к собесу по мл, алгоритмам, коду
Ml ru - актуальные статьи, новости, код и обучающие материалы
Ml Jobs - вакансии ML
ML Книги - актуальные бесплатные книги МО
ML чат

🏆 Golang
Golang
Golang собеседование - разбор задач и вопросов с собесов
Golang вакансии -работа для Go разработчика
Golang книги библиотека книг
Golang задачи и тесты
Golang чат
Golang news - новости из мира go
Golang дайджест

💥 Linux /Этичный хакинг
Linux Academy - гайды, секреты и лучшие материалы по Linux
Kali linux - погрузись в мир этичного хакинга и кибербезопасности
linux_kal - kali чат
Информационная безопасность

🚀 Data Science

Анализ данных - полезные фишки, код, гайды и советы, маст-хэв датасаентиста
Data Jobs - ds вакансии
Аналитик данных
Data Science книги - актуальные бесплатные книги
Big data

🛢Базы данных
Sql базы данных - научим работе с базами данных профессионально
Библиотека баз данных
SQL чат
Вакансии Sql аналитик данных

#️⃣C#

С# академия - лучший канал по c#
С# заметки — код, лучшие практики, заметки программиста c#
С# задачи и тесты
С# библиотека - актуальные бесплатные книги
C# вакансии - работа

🐍 Python

Python/django - самый крупный обучающий канал по Python
Python Собеседование - подготовка к собеседовению python и разбор алгоритмов
Pro python - статьи, новости, код и обучающие материалы
Python Jobs - вакансии Python
Python чат
Python книги

☕ Java

Java академия - java от Senior разработчика
Java вакансии
Java чат
Java вопросы с собеседований
Java книги

💻 C++

C++ академия
С++ книги
C++ задачи - подготовка к собеседовению мл, алгоритмам
C++ вакансии

⚡️ Frontend
Javascript академия - крупнейший js канал
React - лучшие гайды и советы по работе с react
Frontend - тутрориалы, уроки, гайды, код
PHP
Книги frontend
Задачи frontend

🦀 Rust
Rust программирование
Rust чат
Rust книги для программистов

📲 Мобильная разработка
Android разработка
Мобильный разработчик гайды и уроки

🇬🇧 Английский для программистов

🧠 Искусственный интеллект
ИИ и технологии
Neural - нейросети для работы и жизни
Книги ИИ
Artificial Intelligence

🔥 DevOPs
Devops для программистов
Книги Devops

🌟 Docker/Kubernets
Docker
Kubernets

📓 Книги
Библиотеки Книг для программситов

💼 Папка с вакансиями:
Папка Go разработчика:
Папка Python разработчика:
Папка Data Science
Папка Java разработчика
Папка C#
Папка Frontend

💥 Бесплатный Chatgpt бот

Читать полностью…

Java

💻 Работа с интерфейсами Kotlin: правильная инициализация

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


interface MyInterface {
fun myFunction()
}

class MyClass : MyInterface {
override fun myFunction() {
println("Пришло время действовать!")
}
}

val myObject = MyClass()
myObject.myFunction()

Помните: определите класс, который должен реализовывать интерфейс, а затем инициализируйте класс, создав его экземпляр.

📎 Читать подробнее

@javatg

Читать полностью…

Java

💻 Золотой век Kotlin, и какое будущее его ждёт

«В компании Infobip с 2017 года и до сегодняшнего дня идет золотой век Kotlin. Будет ли он продолжаться, зависит исключительно от JetBrains и их способности внедрять инновации в Kotlin»

Полезная статья, в которой затрагиваются важные вещи, автор рассуждает о том, почему одни технологии сменяют другие, почему взлетевшие Scala и Groovy не так популярны сегодня и т.д.

Разбираются достоинства и недостатки Kotlin:
Плюсы Kotlin
— Интероперабельность с Java
— Корутины
— Структура данных и сопоставление шаблонов
— Работа с Null
— Другие особенности

Минусы Kotlin
— Интероперабельность с Java
— Экосистема Kotlin
— Рабочая сила
— Отсутствие прогресса

📎 Статья

@javatg

Читать полностью…

Java

🖥 Пишем на Java в VSCode

Держите отличную статью о том, как перейти с JetBrains на VSCode для разработки код на Java + Spring Boot.
Обсуждается готовый список расширений, примеры настроек IDE, подготовка расширений для работы.

Большинство разрабов пишут на Java в IDEA и даже не подозревают, что у VSCode есть разные приятные фишки — об этом и идёт речь в статье.

План статьи
Точка старта

Установка VSCode и расширений
— Extension Pack for Java
— SonarLint
— Промежуточная проверка
— Spring Boot Extension Pack
— Рекомендуемые расширения
— Расширения для переноса своего JetBrains опыта
— Настройки
— Настроить сервер для Spring Initalizr
— Активировать внешние правила оформления кода
— GitHub Copilot

Что в итоге получилось?

📎 Статья

@javatg

Читать полностью…

Java

💻 Как сделать кнопку на Android с бордером снизу и справа?

▶️Допустим, есть красная кнопка. Необходимо сделать бордер шириной 2dp снизу и справа, также нужно сделать изменение цвета кнопки во время нажатия на зеленый.

Можно это делать с помощью сторонней библиотеки BackgroundLibrary, вот так:

<androidx.appcompat.widget.AppCompatButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:stateListAnimator="@null"
app:bl_unpressed_color="@color/colorAccent"
app:bl_pressed_color="@color/colorPrimaryDark"
app:bl_stroke_width="2dp"
app:bl_stroke_color="#2196F3"
app:bl_stroke_position="right|bottom"
android:text="Button"/>

Но как это сделать нативно с помощью drawable?


▶️В целом, всё не так сложно — нужно создать в папке Drawable файл button_background_ripple.xml:
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#9C1816"> // цвет заполнения при нажатии

<item>
<shape android:shape="rectangle">
<solid android:color="@color/colorAccent" /> // цвет в обычном состоянии
</shape>
</item>

<item
android:bottom="0dp" // обводка снизу как положено
android:left="-20dp" // обводка слева выведена за края (не видно)
android:right="0dp" // обводка справа как положено
android:top="-20dp"> // обводка сверху выведена за края (не видно)
<shape>
<stroke
android:width="2dp" // толщина обводки
android:color="#0000FA" /> // цвет обводки
</shape>
</item>


Затем нужно установить на кнопку бэкграундом:
android:background="@drawable/button_background_ripple"

Вот такие дела

@android_its

Читать полностью…

Java

🖥 Руководство по версиям и возможностям Java

Java 8, Java 11, Java 13 — какая разница?
Вы можете использовать это руководство, чтобы понять различия между дистрибутивами Java (AdoptOpenJdk, OpenJDK, OracleJDK и т.д.), А также получить обзор возможностей языка Java, включая версии Java 8-13.

С появлением большого количества новых версий Java имеются следующие сценарии использования:
Унаследованные проекты в компаниях часто связаны с использованием Java 8 (см. Раздел «Почему компании все еще застревают на Java 8?» Ниже). Таким образом, вы также будете вынуждены использовать Java 8.

Некоторые унаследованные проекты даже работают на Java 1.5 (выпущен в 2004 г.) или 1.6 (выпущен в 2006 г.) — сочувствую, друзья!

Если вы уверены, что используете самые последние IDE, интегрированные среды и инструменты сборки и запускаете новый проект, вы можете без колебаний использовать Java 11 (LTS) или даже самую последнюю версию Java.

Есть специальная область разработки Android, где Java в основном застряла на версии Java 7, с доступом к определенному набору функций Java 8. Но вы можете переключиться на использование языка программирования Kotlin.

📎 Статья

@javatg

Читать полностью…

Java

🖥 LangChain4j — Java-версия LangChain

<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>0.30.0</version>
</dependency>


Цель LangChain4j - упростить интеграцию возможностей AI/LLM в Java-приложения.
Проект воплощает идеи из LangChain, Haystack и LlamaIndex.

🖥 GitHub
🟡 Доки

@javatg

Читать полностью…

Java

🖥 Вышла новая, улучшенная версия GPT-4 Omni для. И что самое главное — она доступна всем БЕСПЛАТНО!

Это самая совершенная модель из всех, намного превосходящая своих предшественников, включая таинственный gpt2-chatbot.

Она появится уже сегодня в виде приложения для пк.


GPT-4 Omni будет понимать эмоции и тон голоса.

https://www.youtube.com/watch?v=8TW0zMqIG_E

@javatg

Читать полностью…

Java

🖥 Semgrep — статический анализатор кода для Java и не только

brew install semgrep

Semgrep — это быстрый open-source инструмент статического анализа для обнаружения ошибок и проверки соблюдения стандартов в процессе редактирования, коммита и т.д.
Semgrep — это семантический grep для кода: если grep "2" будет искать только точную строку 2, то Semgrep будет искать x = 1; y = x + 1 при поиске 2. И он делает это на 30 с лишним языках!

Правила Semgrep выглядят как код, который вы уже пишете; никаких абстрактных синтаксических деревьев, сложных regex или DSL.

🖥 GitHub

@javatg

Читать полностью…

Java

🖥 Что такое stack trace, и как с его помощью находить ошибки при разработке приложений?

▶️Иногда при запуске приложения можно получить подобную ошибку:

Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Это называется «трассировка стека» или «stack trace». Что вообще такое трассировка? Какую полезную информацию об ошибке в разрабатываемой программе она содержит?


▶️Простыми словами, трассировка стека – это список методов, которые были вызваны до момента, когда в приложении произошло исключение.

🟡Простой случай. В указанном примере мы можем точно определить, когда именно произошло исключение. Рассмотрим трассировку стека:
Exception in thread "main" java.lang.NullPointerException
at com.example.myproject.Book.getTitle(Book.java:16)
at com.example.myproject.Author.getBookTitles(Author.java:25)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

Это пример очень простой трассировки. Если пойти по списку строк вида «at…» с самого начала, мы можем понять, где произошла ошибка. Мы смотрим на верхний вызов функции. В нашем случае, это:
at com.example.myproject.Book.getTitle(Book.java:16)


Для отладки этого фрагмента открываем Book.java и смотрим, что находится на строке 16:
public String getTitle() {
System.out.println(title.toString()); <-- line 16
return title;
}


Это означает то, что в приведенном фрагменте кода какая-то переменная (вероятно, title) имеет значение null.


🟡Пример цепочки исключений. Иногда приложения перехватывают исключение и выбрасывают его в виде другого исключения. Обычно это выглядит так:
try {
....
} catch (NullPointerException e) {
throw new IllegalStateException("A book has a null property", e)
}


Трассировка в этом случае может иметь следующий вид:
Exception in thread "main" java.lang.IllegalStateException: A book has a null property
at com.example.myproject.Author.getBookIds(Author.java:38)
at com.example.myproject.Bootstrap.main(Bootstrap.java:14)
Caused by: java.lang.NullPointerException
at com.example.myproject.Book.getId(Book.java:22)
at com.example.myproject.Author.getBookIds(Author.java:35)
... 1 more


📎 Подробнее

@javatg

Читать полностью…

Java

🖥 SQL-инъекции JDBC, JPA, Spring Data

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

— Использовать PreparedStatement/CallableStatement вместо Statement. Библиотеки spring-jdbc, Hibernate, MyBatis, JOOQ и прочие также внутри используют PreparedStatement.

— Передавать параметры запросов с помощью методов setParameter, а не в самом запросе.

Поэтому кажется, что большинство разработчиков уже следует этим правилам и риск подверженности SQL-инъекциям в Java приложениях преувеличен. К сожалению, контрпримеры существуют, и поэтому сохраняется необходимость в повышенном внимании к данной проблеме.
Этому и посвящена статья.

📎 Код примеров на GitHub

@javatg

Читать полностью…

Java

💻 Coil — библиотека загрузки изображений для Android, основанная на корутинах Kotlin

Фичи Coil (Coroutine Image Loader):

Скорость: Coil выполняет ряд оптимизаций, включая кэширование памяти и диска, понижение дискретизации изображения в памяти, автоматическую приостановку/отмену запросов и многое другое.

Лёгкость: Coil добавляет ~2000 методов в ваш APK (для приложений, которые уже используют OkHttp и Coroutines), что сравнимо с Picasso и значительно меньше, чем Glide и Fresco.

Простота использования: API Coil использует возможности языка Kotlin для простоты и минимального количества косяков.

Современность: Coil ориентирован на Kotlin и использует современные библиотеки, включая Coroutines, OkHttp, Okio и AndroidX Lifecycles.

🖥 GitHub

@javatg

Читать полностью…

Java

🖥 Простое управление API с Tink

Tink — это многоязычная, кроссплатформенная библиотека, предоставляющая криптографические API, которые безопасны, просты в правильном использовании и ими трудно злоупотреблять.

<dependency>
<groupId>com.google.crypto.tink</groupId>
<artifactId>tink</artifactId>
<version>1.7.0</version>
</dependency>


🖥 GitHub
🟡 Доки

@javatg

Читать полностью…

Java

🖥 Java kanban — пет-проект на Java

Суть проекта заключается в реализации помощника по организации работы. Доска kanban помогает разбить задачи на более мелкие, чтоб упростить и ускорить процесс реализации. Эта доска имеет возможность реализации простых CRUD операций и отправки и получения данных с сервера, с помощью библиотек Gson и HttpServer. В проекте реализованы 2 сервера, один из которых отвечает за приём, отправку, старт и остановку работы сервера, второй — за внутреннюю реализацию процессов работы сервера. Также в приложении есть возможность сохранять данные локально (в файле формата CSV с возможностью последующего считывания с файла при перезагрузке приложения) и написаны JUnit тесты.

🖥 GitHub

@javatg

Читать полностью…

Java

🖥 Простой генератор лабиринта на Java

файл для 2D-визуализации

файл для тестирования

🖥 GitHub

@javatg

Читать полностью…

Java

🖥 Современные практики создания Java/JVM-проектов

Это wiki со статьями о создании современных Java/JVM-проектов с помощью Gradle и Maven.
Эти советы работают и для не-Java языков на JVM, хотя детали могут измениться.

🖥 GitHub

@javatg

Читать полностью…

Java

💻 О .not() и ! в Kotlin

Мы довольно часто используем оператор .not(), поскольку это более читабельно, чем !.

Но есть одна вещь, которую оператор .not() не может сделать — поглядите:

myEvents?.forEach { myEvent -> 
if (!myEvent.events.isNullOrEmpty()) {
myEvent.events.find { it.type == eventType }
}

if (myEvent.events.isNullOrEmpty().not()) {
myEvent.events.find { it.type == eventType }
}
}

Как-то так


@javatg

Читать полностью…

Java

🖥 Package Search — крутой плагин для поиска библиотек для Java и Kotlin прямо из редактора.

По умолчанию он поддерживает поиск в следующих менеджерах пакетов: Maven, Gradle и Amper.

📌 Github

@javatg

Читать полностью…

Java

📱 Android-приложение для демонстрации работы основных функций SDK на Kotlin

Отличная идея для пет-проекта;
описание возможностей приложения:
• Инициализация платежа
• Отмена платежа
• Возврат платежа
• Проведение клиринга
• Проведение рекуррентного платежа
• Получение информации/статуса платежа
• Добавление карт/Удаление карт
• Оплата добавленными картами
• Безакцептные платежи
• Создание платежа с Google Pay

🖥 GitHub

@javatg

Читать полностью…
Subscribe to a channel