barbitoff programmer`s blog

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

пятница, 6 декабря 2019 г.

SpringFox и Spring Boot 2.2.1

SpringFox версии 2.9.2 (самый актуальный релиз на 06.12.2019) несовместима со Spring Boot 2.2.0 и выше из-за изменения API Spring, используемого SpringFox. На это заведен тикет https://github.com/springfox/springfox/issues/2932, однако, на текущий момент SpringFox 3.0.0-SNAPSHOT из основной ветки разработки так и не переведен на актуальный Spring Boot.
Поэтому пришлось форкнуться и внести необходимые корректировки самостоятельно: https://github.com/barbitoff/springfox/tree/2.9.2-boot-2.2.1. На первый взгляд - работает, но тесты из swagger-contract-tests пришлось проигнорировать, т.к. они падали. Однако, падали они и в оригинальной 2.9.2.

пятница, 22 ноября 2019 г.

Oracle ATG: <print-item> в dynadmin

Если попытаться получить все item'ы по определенному item-descriptor в dynadmin с помощью:
<print-item item-descriptor="xxx"/>
то будет выведено только 100 item-ов. Для получения абсолютно всех item'ов необходимо воспользоваться:
<query-items item-descriptor="xxx">all</query-items>
Правда, если item'ов очень много, они все равно могут все не напечататься, вывод обрезается в произвольном месте. Workaround - запрашивать частями с использованием RANGE:
<query-items item-descriptor="xxx">
all RANGE +30000
</query-items>
затем
<query-items item-descriptor="xxx">
all RANGE 30000+30000
</query-items>
и т.п. 

среда, 20 ноября 2019 г.

grep: поиск по всем файлам в папке по наличию некой подстроки внутри CDATA-секции

Задача

Есть папка с xml-файлами, причем папка может содержать подпапки любой глубины вложенности. Нужно найти xml-файлы, содержащие некую подстроку внутри CDATA-секции.

Решение

grep -REil ".*<!\[CDATA\[([^\]]|(\][^\]])|(\]\][^>]))*ИСКОМАЯПОДСТРОКА.*" C:/sf_phoenix --include=*.xml
где ИСКОМАЯПОДСТРОКА - собственно та подстрока, которую ищем.

среда, 13 ноября 2019 г.

Windows batch file: get current batch file location

Чтобы внутри bat-файла сослаться на директорию, в которой лежит bat-файл, можно воспользоваться %~dp0.

пятница, 25 октября 2019 г.

soapUI: "Trying XBeans path engine... Trying XQRL... Trying delegated path engine... FAILED on declare namespace..."

Проблема

В groovy-скрипте, использующем com.eviware.soapui.support.XmlHolder, при попытке выполнить xpath-поиск по XML
def requestXml = new XmlHolder(requestText);
def result = requestXml["//*[local-name() = 'xxx']"]
возникает ошибка:
Trying XBeans path engine... Trying XQRL... Trying delegated path engine... FAILED on declare namespace...
Решение

Добавить в classpath библиотеки saxon-x.x.x.jar и saxon-dom-x.x.x.jar из инсталляции soapUI.

пятница, 18 октября 2019 г.

Mockito: проверка, что метод был вызван несколько раз с определенными аргументами

Задача

Есть некий мок-объект, нужно проверить, что некоторый его метод был вызван дважды, причем с определенными значениями аргументов.

Решение

Тут поможет argument capturing:
ArgumentCaptor<String> argsCaptor = ArgumentCaptor.forClass(String.class);
verify(myMockObj, atLeastOnce()).someMethod(argsCaptor .capture());
List<String> args= argsCaptor.getAllValues();
assertEquals(2, argsCaptor.size());       
assertTrue(argsCaptor.contains("arg1));
assertTrue(argsCaptor.contains("arg2));

пятница, 26 июля 2019 г.

Microsoft Edge: не открываются страницы с 127.0.0.1

Проблема 

В Microsoft Edge не открываются сайты, размещенные локально на моей машине и доступные по IP 127.0.0.1 или хостнэймам, которые в hosts маппятся на 127.0.0.1. При этом эти же сайты открываются без проблема в других браузерах, даже в Internet Explorer.

Решение

Разрешаем для Edge использование локальной петли командой:
CheckNetIsolation LoopbackExempt -a -n="Microsoft.MicrosoftEdge_8wekyb3d8bbwe"

пятница, 21 июня 2019 г.

Visual Studio Code: начало работы с Go

Пара заметок о том, как настроить Visual Studio Code для работы с Go. Сразу оговорюсь: и в Visual Studio Code, и в Go я пока совершенно профан :)
  1. Ставим Visual Studio Code (далее - VSC, https://code.visualstudio.com)
  2. Идем по ссылке https://code.visualstudio.com/docs/languages/go и устанавливаем расширение для работы в VSC с Go
  3. Открываем любой go-файл или создаем свой новый с каким-нибудь простейшим содержимым, вроде этого:
    package main
    import (
    "fmt"
    "math/rand"
    )
    func main() {
    fmt.Println("My favorite number is", rand.Intn(10))
    }
  4. Появится всплывающая подсказка в нижнем правом углу об отсутствии некоторых расширений. Жмем Install All. Если вы за прокси-сервером, придется настроить работу через прокси:
    1. В самом VSC: File -> Preferences -> Settings, в верхнем правом углу нажимаем кнопку "{}" для переключения в json-представлению настроек. Добавляем строки:
      "http.proxy": "http://mylogin:mypass@proxy.mycompany.com:8080",
      "http.proxyStrictSSL": false,
      Логин/пароль при необходимости нужно urlencode-ить.
    2. Для Git (если это еще не сделано): в домашней директории пользователя создаем/открываем .gitconfig и добавляем туда:
      [http]
      proxy = http://mylogin:mypass@proxy.mycompany.com:8080
      Аналогично, логин/пароль при необходимости urlencode-им.
  5. Аналогично предыдущему пункту открываем settings.json студии. Добавляем следующие строки:
        "go.buildOnSave": true,
        "go.lintOnSave": true,
        "go.vetOnSave": true,
        "go.buildFlags": [],
        "go.lintFlags": [],
        "go.vetFlags": [],
        "go.useCodeSnippetsOnFunctionSuggest": false,
        "go.formatOnSave": false,
        "go.formatTool": "goreturns"
  6. Перезапускаем VCS
  7. Добавляем директорию, где лежит go-файл, который мы хотим скомпилировать и запустить, в Workspace (File -> Add folder to workspace)
  8. При открытом go-файле нажимаем ctrl+shift+B, студия предложит создать tasks.json. Соглашаемся
  9. Задаем для tasks.json содержимое вида:
    {
        // See https://go.microsoft.com/fwlink/?LinkId=733558
        // for the documentation about the tasks.json format
        "version": "2.0.0",
        "tasks": [
            {
                "label": "Build and run",
                "type": "shell",
                "command": "go build ; ./Go.exe", // применимо только для Win!
                "group": {
                    "kind": "build",
                    "isDefault": true
                }
            }
        ]
    }
  10. Все, по Ctrl+Shift+B наш go-файл компилируется и запускается

понедельник, 15 апреля 2019 г.

pandas: отбор по невхождению подстроки

Задача

Есть DataFrame, в нем в некоторой колонке Column1 есть строковые значения. Необходимо отобрать те строки, в которых значение Column1 не содержит подстроку "MyVal".

Решение

myDataFrame[~myDataFrame.Column1.str.contains('MyVal')]

пятница, 12 апреля 2019 г.

Консольная утилита для тестирования JMS-брокеров Apache ActiveMQ

Если нужно протестировать работу брокера или кластера Apache ActiveMQ (обычного или Artemis), т.е. отправить / получить сообщения, посмотреть содержимое очереди и пр., подойдёт консольная утилита amqutil: http://kevinboone.net/README_amqutil.html.

Пример отправки и получения сообщений:
java -jar amqutil-0.1.3.jar produce 1 -d TEST.Q -url tcp://localhost:61616
java -jar amqutil-0.1.3.jar consume 1 -d TEST.Q -url tcp://localhost:61616

четверг, 21 марта 2019 г.