barbitoff programmer`s blog

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

пятница, 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 г.

среда, 26 декабря 2018 г.

Wireshark: ищем в дампе траффика soap-запрос по значению одного из тегов

Задача

Нужно в дампе траффика найти soap-запрос по заданному значению некоторого тега (имя тега в поиске не участвует, только значение).

Решение

Используем фильтра xml.cdata == "{искомое значение}"

вторник, 4 декабря 2018 г.

КриптоПро JCP 2: ошибка ru.CryptoPro.JCP.tools.SelfTester.run SelfTester's test №16 failed

Проблема

Есть приложение, использующее КриптоПро JCP 2 для подписания XML. После развертывания на новом сервере при попытке подписания падает ошибка:
04-Dec-2018 18:21:54.093 WARNING [SelfTester] ru.CryptoPro.JCP.tools.SelfTester.run SelfTester's test №16 failed
 ru.CryptoPro.JCP.tools.SelfTesterException: Error during store working
at ru.CryptoPro.JCP.tools.SelfTests$TestDigestStore.run(Unknown Source)
at ru.CryptoPro.JCP.tools.SelfTester.b(Unknown Source)
at ru.CryptoPro.JCP.tools.SelfTester.a(Unknown Source)
at ru.CryptoPro.JCP.tools.SelfTester.run(Unknown Source)
at java.lang.Thread.run(Thread.java:745)
Caused by: ru.CryptoPro.JCP.tools.SelfTesterException: Error during store working
at ru.CryptoPro.JCP.tools.SelfTests.testDigestStore(Unknown Source)
... 5 more
Caused by: ru.CryptoPro.JCP.tools.CPVerify.CPVerifyException: Error during store working
at ru.CryptoPro.JCP.tools.CPVerify.DigestStoreDefault.<init>(Unknown Source)
... 6 more  
При последующих попытках падает:
SelfTester Error: some test crashed twice in a row, usage of JCP is no longer available
ru.CryptoPro.JCP.tools.SelfTesterException: SelfTester Error: some test crashed twice in a row, usage of JCP is no longer available
Причина

У пользователя, от имени которого работает приложение, не было прав на запись в директорию /var/opt/cprocsp/tmp. После выдачи прав стала падать ошибка "Permission denied" при попытке работы с какими-то файлами в этой папке, имена файлов начинаются с ".". У этих файлов владельцем был root, поэтому ошибка закономерна. После удаления этих файлов все заработало.

пятница, 9 ноября 2018 г.

soapUI и кириллица в теле POST-запроса к REST-сервису

Проблема

Нужно из soapUI (запускается под Windows 10) вызвать REST-сервис, передав ему в теле POST-запроса некий XML, содержащий кириллицу. При попытке сделать это получаю от сервиса ответ о наличии некорректного UTF8-байта в запросе.

Решение

В bin-директории soapUI открываем файл SoapUI-x.x.x.vmoptions (где x.x.x. - номер версии soapUI) и добавляем туда опцию:
-Dfile.encoding=UTF8
Перезапускаем soapUI. В поле Media Type запроса добавляем постфикс "; charset=UTF-8". Успех, запрос уходит с корркетным Content-Type заголовком, в котором указана используемая кодировка UTF-8, а также с корректно закодированным в UTF-8 телом.