diff --git a/.gitignore b/.gitignore index 4e396d5d..26d8c738 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ # Ignore Smart Connections folder because embeddings file is large and updated frequently .smart-connections -.DS_Store \ No newline at end of file +.DS_Store +.idea/ \ No newline at end of file diff --git a/dev/java/gc/Garbage Collector.md b/dev/java/gc/Garbage Collector.md index f53f3e52..e9049665 100644 --- a/dev/java/gc/Garbage Collector.md +++ b/dev/java/gc/Garbage Collector.md @@ -6,7 +6,7 @@ aliases: - сборки мусора - сборщику мусора tags: - - зрелость/🌿 + - maturity/🌿 zero-link: - "[[../../../meta/zero/00 Java разработка|00 Java разработка]]" parents: diff --git a/dev/snippet/Mock конфигурация Oauth2 для SpringBoot.md b/dev/snippet/Mock конфигурация Oauth2 для SpringBoot.md new file mode 100644 index 00000000..59a92235 --- /dev/null +++ b/dev/snippet/Mock конфигурация Oauth2 для SpringBoot.md @@ -0,0 +1,36 @@ +--- +tags: + - maturity/🌱 +date: + - - 2023-11-20 +zero-link: + - "[[../../../../../garden/ru/meta/zero/00 Снипеты для Java|00 Снипеты для Java]]" +parents: +linked: + - "[[../../../../../garden/ru/meta/zero/00 SpringBoot|00 SpringBoot]]" +article: https://note.struchkov.dev/mock-konfighuratsiia-dlia-oauth2-springboot/ +--- +Конфигурация для подключения к мок-сервису авторизации по auth2. Полезно при локальной разработке, чтобы не цепляться к настоящему Oauth2 серверу. + +```yml +spring: + security: + oauth2: + client: + registration: + mocklab: + provider: mocklab + client-authentication-method: basic + authorization-grant-type: authorization_code + scope: profile, email + redirect-uri: http://localhost:8080/login/oauth2/code/ + clientId: mocklab_oidc + clientSecret: whatever + provider: + mocklab: + authorization-uri: https://oauth.mocklab.io/oauth/authorize + token-uri: https://oauth.mocklab.io/oauth/token + user-info-uri: https://oauth.mocklab.io/userinfo + user-name-attribute: sub + jwk-set-uri: https://oauth.mocklab.io/.well-known/jwks.json +``` \ No newline at end of file diff --git a/dev/snippet/Игнорирование ошибок сертификата OkHttp3.md b/dev/snippet/Игнорирование ошибок сертификата OkHttp3.md new file mode 100644 index 00000000..95dad5bb --- /dev/null +++ b/dev/snippet/Игнорирование ошибок сертификата OkHttp3.md @@ -0,0 +1,111 @@ +--- +tags: + - maturity/🌱 +date: + - - 2023-11-20 +zero-link: + - "[[../../../../garden/ru/meta/zero/00 Снипеты для Java|00 Снипеты для Java]]" +parents: +linked: +article: https://note.struchkov.dev/okhttp3-ignore-ssl/ +--- + +> [!DANGER] +> Так лучше не делать, но иногда нужно проигнорировать ошибки связанные с сертификатом сайта. + +```java +import lombok.experimental.UtilityClass; +import lombok.extern.slf4j.Slf4j; +import okhttp3.OkHttpClient; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +/** + * @author upagge 03.02.2021 + */ +@Slf4j +@UtilityClass +public class OkHttpUtil { + + private static OkHttpClient client = new OkHttpClient.Builder().build(); + + public static OkHttpClient getClient() { + return client; + } + + public static void init(boolean ignoreCertificate) { + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + log.info("Initialising httpUtil with default configuration"); + if (ignoreCertificate) { + builder = configureToIgnoreCertificate(builder); + } + //Other application specific configuration + + client = builder.build(); + } + + //Setting testMode configuration. If set as testMode, the connection will skip certification check + private static OkHttpClient.Builder configureToIgnoreCertificate(OkHttpClient.Builder builder) { + log.warn("Ignore Ssl Certificate"); + try { + + // Create a trust manager that does not validate certificate chains + final TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + @Override + public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) { + } + @Override + public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) { + } + + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new java.security.cert.X509Certificate[]{}; + } + } + }; + + final SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); + final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); + + builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]); + builder.hostnameVerifier((hostname, session) -> true); + } catch (Exception e) { + log.warn("Exception while configuring IgnoreSslCertificate" + e, e); + } + return builder; + } + +} +``` +## Как это использовать? +Перед получением `OkHttpClient` необходимо инициализировать настройки игнорирования сертификатов. Для этого вызываем метод: + +```java +OkHttpUtil.init(true); +``` + +После этого можете получить `OkHttpClient`: +```java +OkHttpUtil.getClient(); +``` + +Или вот так: +```java +public class HttpParse { + + static { + OkHttpUtil.init(true); + } + + private static final OkHttpClient client = OkHttpUtil.getClient(); + + // ... ... ... ... ... + +} +``` \ No newline at end of file diff --git a/dev/snippet/Парсинг URL c помощью регулярки.md b/dev/snippet/Парсинг URL c помощью регулярки.md new file mode 100644 index 00000000..af3e08e1 --- /dev/null +++ b/dev/snippet/Парсинг URL c помощью регулярки.md @@ -0,0 +1,25 @@ +--- +tags: + - maturity/🌱 +date: + - - 2023-11-20 +zero-link: + - "[[../../../../garden/ru/meta/zero/00 Снипеты для Java|00 Снипеты для Java]]" +parents: [] +linked: +article: https://note.struchkov.dev/parsingh-url-c-pomoshchiu-rieghuliarki/ +--- +Разделение URL-адреса на протокол, домен, порт и URI с помощью регулярного выражения. + +```java +// Split URL into protocol, domain, port and URI +Pattern pattern = Pattern.compile("(https?://)([^:^/]*)(:\\d*)?(.*)?"); +Matcher matcher = pattern.matcher(url); + +matcher.find(); + +String protocol = matcher.group(1); +String domain = matcher.group(2); +String port = matcher.group(3); +String uri = matcher.group(4); +``` \ No newline at end of file diff --git a/dev/snippet/Сериализация и Десериализация даты в Jackson.md b/dev/snippet/Сериализация и Десериализация даты в Jackson.md new file mode 100644 index 00000000..49268fa1 --- /dev/null +++ b/dev/snippet/Сериализация и Десериализация даты в Jackson.md @@ -0,0 +1,110 @@ +--- +aliases: +tags: + - maturity/🌱 +date: + - - 2023-11-20 +zero-link: + - "[[../../../../garden/ru/meta/zero/00 Снипеты для Java|00 Снипеты для Java]]" +parents: +linked: +article: https://note.struchkov.dev/localdatetime-deserializer/ +--- +Чаще всего по работе я сталкиваюсь с проблемой десериализации и сериализации даты. Многие разработчики отступают от стандартного формата времени `yyyy-MM-dd'T'HH:mm:ss*SSSZZZZ` и изобретают свои форматы. + +К сожалению, в Jackson не заложены все возможные форматы даты, поэтому необходимо написать свой десериализатор. +## Десериализация +В данном случае это преобразование json формата в Java объект. Необходимо расширить абстрактный класс `StdDeserializer`. + +```java +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdDeserializer; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class CustomDeserializer extends StdDeserializer { + + protected CustomDeserializer() { + this(null); + } + + protected CustomDeserializer(Class vc) { + super(vc); + } + + @Override + public LocalDateTime deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException { + String value = jsonParser.getText(); + if (!"".equals(value)) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm"); + return LocalDateTime.parse(value, formatter); + } + return null; + } + +} +``` + +После этого необходимо над полем поставить аннотацию `@JsonDeserialize` c указанием нашего кастомного десериализатора. + +```java +public class Foo { + + // ... ... ... ... ... + + @JsonDeserialize(using = CustomDeserializer.class) + private LocalDateTime date; + + // ... ... ... ... ... + +} +``` + +## Сериализация +В данном случае это преобразование Java объекта в json формат. Для сериализации необходимо расширить класс `StdSerializer`. + +```java +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.std.StdSerializer; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class CustomSerializer extends StdSerializer { + + protected CustomSerializer(Class t) { + super(t); + } + + protected CustomSerializer() { + this(null); + } + + @Override + public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider provider) throws IOException { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"); + gen.writeString(formatter.format(value)); + } + +} +``` + +Для работы над полем поставить аннотацию `@JsonSerialize` + +```java +public class Foo { + + // ... ... ... ... ... + + @JsonSerialize(using = LocalDateTimestampSerializer.class) + private LocalDateTime date; + + // ... ... ... ... ... + +} +``` \ No newline at end of file diff --git a/dev/snippet/Создание linux сервиса для Java приложения.md b/dev/snippet/Создание linux сервиса для Java приложения.md new file mode 100644 index 00000000..aa6ef1df --- /dev/null +++ b/dev/snippet/Создание linux сервиса для Java приложения.md @@ -0,0 +1,50 @@ +--- +aliases: +tags: + - maturity/🌱 +date: + - - 2023-11-20 +zero-link: + - "[[../../../../garden/ru/meta/zero/00 Снипеты для Java|00 Снипеты для Java]]" +parents: +linked: [] +article: https://note.struchkov.dev/sozdaniie-linux-siervisa-dlia-prilozhieniia-spring-boot/ +--- +Для запуска `jar` файла в linux в виде сервиса, необходимо создать файл конфигурации. + +```java +sudo nano /etc/systemd/system/app_name_service.service +``` + +В этот файл вставляем примерно следующее. Не забудьте заменить в выделенных строках `app_path`, `app_name`. + +```java +[Unit] +Description=App Description +After=network.target + +[Service] +Type=simple +SyslogIdentifier=appdescription +WorkingDirectory=/app_path +PIDFile=/app_path/app_name.pid +ExecStart=/bin/sh -c "exec /usr/bin/java -jar app_name.jar & echo $! > /app_path/app_name.pid" +ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID + +[Service] +Type=forking +PIDFile=/app_path/app_name.pid + +[Install] +WantedBy=default.target +``` + +Для автоматического запуска приложение после перезагрузки сервиса, используйте следующую команду. +```bash +systemctl enable app_service +``` + +Чтобы убрать приложения из автозагрузки: +```bash +systemctl disable app_service +``` \ No newline at end of file diff --git a/dev/snippet/Удаление .DS_Store из Git репозитория.md b/dev/snippet/Удаление .DS_Store из Git репозитория.md new file mode 100644 index 00000000..22740e41 --- /dev/null +++ b/dev/snippet/Удаление .DS_Store из Git репозитория.md @@ -0,0 +1,32 @@ +--- +tags: + - maturity/🌳 +date: "[[2023-08-31]]" +parents: + - "[[../../meta/zero/00 Снипеты для Git|00 Снипеты для Git]]" +zero-link: + - "[[../../meta/zero/00 Разработка|00 Разработка]]" +article: https://struchkov.dev/blog/ru/remove-dsstore-git/ +--- +Симптомы: Есть не зафиксированный файл, который мешает гиту. Файл называется `.DS_Store`. + +Чтобы удалить этот файл нужно выполнить следующие команды: + +```shell +find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch +``` + +```shell +git rm --cached .DS_Store +``` + +```shell +git add . +``` + +```shell +git commit -m "Remove .DS_Store from current directory" +``` + +> [!WARNING] Терминал в Idea +> Команды необходимо выполнять из обычного родного терминала. Если выполнять из терминала Idea, то они не сработают. diff --git a/meta/zero/00 Java разработка.md b/meta/zero/00 Java разработка.md index 7212487e..e13d7ca0 100644 --- a/meta/zero/00 Java разработка.md +++ b/meta/zero/00 Java разработка.md @@ -1,8 +1,27 @@ --- tags: - type/zero-link + - type/moc parents: - "[[00 Разработка]]" title: Java разработка +aliases: [] +zero-link: + - "[[../../../garden/ru/meta/zero/00 Разработка]]" --- -- [Garbage Collector](../../dev/java/gc/Garbage%20Collector.md) \ No newline at end of file +- [Устройство Java](Устройство%20Java.md) +- [Снипеты для Java](../../../garden/ru/meta/zero/00%20Снипеты%20для%20Java.md) +- Фреймворки + - [SpringBoot](00%20SpringBoot.md) + - [Quarkus](00%20Quarkus.md) +## Версии Java +- [[Java 1]] +- [Java 7](Java%207.md) +- [[Java 8 LTS]] +- [Java 9](Java%209.md) +- [[Java 10]] +- [Java 11 LTS](Java%2011%20LTS.md) +- [Java 12](Java%2012.md) +- [[Java 15]] +- [[Java 17 LTS]] +- [[Java 21 LTS]] \ No newline at end of file diff --git a/meta/zero/00 Quarkus.md b/meta/zero/00 Quarkus.md new file mode 100644 index 00000000..9e9568af --- /dev/null +++ b/meta/zero/00 Quarkus.md @@ -0,0 +1,15 @@ +--- +aliases: + - кваркус + - кваркусе + - кваркусом + - 00 Quarkus +tags: + - type/zero-link +date: + - - 2024-03-03 +zero-link: + - "[[00 Java разработка]]" +parents: +linked: +--- diff --git a/meta/zero/00 Snippets.md b/meta/zero/00 Snippets.md new file mode 100644 index 00000000..0845bb78 --- /dev/null +++ b/meta/zero/00 Snippets.md @@ -0,0 +1,13 @@ +--- +tags: + - type/zero-link +aliases: +date: + - - 2024-09-04 +zero-link: + - "[[00 Разработка|00 Разработка]]" +parents: +linked: +--- +- [00 Снипеты для Java](00%20Снипеты%20для%20Java.md) +- [00 Снипеты для Git](00%20Снипеты%20для%20Git.md) \ No newline at end of file diff --git a/meta/zero/00 SpringBoot.md b/meta/zero/00 SpringBoot.md new file mode 100644 index 00000000..b5822e75 --- /dev/null +++ b/meta/zero/00 SpringBoot.md @@ -0,0 +1,10 @@ +--- +aliases: +tags: + - type/zero-link +date: 2023-11-15 +zero-link: + - "[[../../../../garden/ru/meta/zero/00 Java разработка|00 Java разработка]]" +parents: [] +linked: +--- diff --git a/meta/zero/00 Снипеты для Git.md b/meta/zero/00 Снипеты для Git.md new file mode 100644 index 00000000..116864cd --- /dev/null +++ b/meta/zero/00 Снипеты для Git.md @@ -0,0 +1,7 @@ +--- +tags: + - type/zero-link +zero-link: + - "[[00 Snippets|00 Snippets]]" +--- +- [Удаление .DS_Store из Git репозитория](../../dev/snippet/Удаление%20.DS_Store%20из%20Git%20репозитория.md) \ No newline at end of file diff --git a/meta/zero/00 Снипеты для Java.md b/meta/zero/00 Снипеты для Java.md new file mode 100644 index 00000000..9c241680 --- /dev/null +++ b/meta/zero/00 Снипеты для Java.md @@ -0,0 +1,13 @@ +--- +tags: + - type/zero-link +zero-link: + - "[[00 Snippets|00 Snippets]]" +aliases: + - Скрипты на Java +--- +- [Парсинг URL c помощью регулярки](../../dev/snippet/Парсинг%20URL%20c%20помощью%20регулярки.md) +- [Сериализация и Десериализация даты в Jackson](../../dev/snippet/Сериализация%20и%20Десериализация%20даты%20в%20Jackson.md) +- [Создание linux сервиса для Java приложения](../../dev/snippet/Создание%20linux%20сервиса%20для%20Java%20приложения.md) +- [Игнорирование ошибок сертификата OkHttp3](../../dev/snippet/Игнорирование%20ошибок%20сертификата%20OkHttp3.md) +- [Mock конфигурация Oauth2 для SpringBoot](../../dev/snippet/Mock%20конфигурация%20Oauth2%20для%20SpringBoot.md) \ No newline at end of file