barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

пятница, 24 июля 2020 г.

Ubuntu 18.04 под WSL: как переопределить resolv.conf

Проблема

WSL при генерации /etc/resolv.conf размещает DNS-сервера не в том порядке, в котором они идут в Windows. В моем конкретном случае это приводит к тому, что корпоративные ресурсы из-под Ubuntu резолвятся не в интранет, а в интернет-IP-адреса, что много чего ломает. 
При этом в файле /etc/resolv.conf первая строка следующая:
#This file was automatically generated by WSL. To stop automatic generation of this file, remove this line
Казалось бы, можно удалить эту строку, расставить DNS-сервера в правильном порядке, и наступит счастье. Но нет, файл все равно перегенеривается заново каждый раз, когда я запускаю bash в Ubuntu.

Решение

Удалить /etc/resolv.conf, затем создать его заново и прописать туда DNS-сервера в нужном порядке. Спасибо https://github.com/microsoft/WSL/issues/1908#issuecomment-315830161.

среда, 3 июня 2020 г.

Elasticsearch & Amazon EFS

Проблема

Elasticsearch, развернутый в Amazon EKS и использующий EFS для хранения данных, не работает, в логах ошибка "java.io.IOException: Disk quota exceeded".

Причина

Amazon EFS имеет ограничение на число пар "процесс-заблокированный файл", равное 256. Если зайти в контейнер Эластика и выполнить lslocks, то получаем как раз эти самые 256 блокировок.

Решение

Отказ от использования EFS для хранения данных Эластиком.

понедельник, 13 апреля 2020 г.

Grep: поиск строки, начинающейся с дефиса

Задача

Выполнить поиск подстроки, начинающейся с "-", например, "->". При попытке сделать grep "->" получаем ошибку grep: invalid option -- '>', т.к. grep трактует искомую строку как опцию.

Решение

grep -- "->"

понедельник, 6 апреля 2020 г.

Gradle 6 Jacoco plugin: как исключить пакеты и классы из отчетов и верификации

В конфигурацию тасков jacocoTestReport и/или jacocoTestCoverageVerification добавляем:
    afterEvaluate {
        classDirectories.setFrom(files(classDirectories.files.collect {
            fileTree(dir: it, exclude: [
                    '**/poc/**',
                    '**/model/**',
                    '**/*Config.class',
                    '**/*Application.class'

            ])
        })
        )
    }
Где, собственно, и указываем маски на папки и файлы для исключения. 

среда, 18 марта 2020 г.

Spring boot 2.2.5 и Tinkoff openapi-java-sdk-java8 0.4.1: конфликт версий okhttp

Есть проект, собираемый Gradle. При попытке использовать Tinkoff openapi-java-sdk-java8 версии 0.4.1 вместе со Spring boot 2.2.5 возникает ошибка вида:
An attempt was made to call a method that does not exist. The attempt was made from the following location:

     ru.tinkoff.invest.openapi.okhttp.SandboxContextImpl.performRegistration(SandboxContextImpl.java:45)

The following method did not exist:

     okhttp3.RequestBody.create([B)Lokhttp3/RequestBody;
Если сделать gradle dependencies, то видна и причина данной ошибки:
com.squareup.okhttp3:okhttp:4.3.1 -> 3.14.7
Видно, что версия okhttp, требуемая для openapi-java-sdk, даунгэйдится до 3.14.7. Причина - в https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies/2.2.5.RELEASE, где определяется версия 3.14.7. 
Выход из ситуации - добавление в build.gradle:
ext['okhttp3.version'] = '4.3.1'
В целом про переопределение версий зависимостей, диктуемых spring boot'ом, написано тут: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-customize-dependency-versions.

четверг, 5 марта 2020 г.

minikube для Windows: как дать больше памяти?

При старте minikube есть возможность установить опцию --memory с большим/меньшим размером памяти, чем дефолтные 3Гб. Однако, чтобы эта опция действительно применялась, придется пересоздать кластер, т.е. сделать:
minikube stop
minikube delete
minikube start --memory=4096m
Тогда получим в логе заветные:
Creating hyperv VM (CPUs=2, Memory=4096MB, Disk=20000MB)
, которых нет при обычном stop/start.

Необходимость удаления вызвана тем, что объем памяти - это параметр HyperV VM, которая создается единожды и при последующих запусках лишь переиспользуется. Возможно, есть возможность поменять объем памяти HyperV VM без ее удаления, но по крайней мере средствами minikube cli этого не сделать.