Найти в Дзене
Advent of Code 2023: Day 1: Trebuchet?! Снова AoC — и снова начат с опозданием. Дуплет! Основная идея прежняя – решать в jshell, пока это не станет слишком многословным. Экономия на буковках, в общем. Обвязка для загрузки условий задачи – та же, что для AoC-2022. Тег #adventofcode_2023, или страница на сайте. Для первой части загадки получилось достаточно простое и короткое решение, но для второй оно практически никак не подошло. Часть вторая и универсальное решение Совсем бесполезным решение для первой части назвать нельзя – легло в основу универсального. static void day1(String puzzleInputUri) throws IOException, InterruptedException { Map<String, String> digits = Map.of( "1", "one", "2", "two", "3", "three", "4", "four", "5", "five", "6", "six", "7", "seven", "8", "eight", "9", "nine" ); TreeMap<Integer, String> firstLast = new TreeMap<>(); var result = client.send(request.uri((URI.create(puzzleInputUri))).build(), HttpResponse.BodyHandlers.ofLines()).body() .map(string -> { firstLast.clear(); digits.forEach((digit, numeric) -> { firstLast.put(string.indexOf(digit), digit); firstLast.put(string.lastIndexOf(digit), digit); firstLast.put(string.indexOf(numeric), digit); firstLast.put(string.lastIndexOf(numeric), digit); } ); firstLast.remove(-1); // not matched substrings index return firstLast.firstEntry().getValue() + firstLast.lastEntry().getValue(); }) .mapToInt(Integer::parseInt) .sum(); System.out.println(result); } Жаль, что — для экономии буковок — не удалось отыскать где-нибудь в недрах стандартной библиотеки (Locale etc) готовых привязок цифр к числительным. Хотя и ожидаемо. Загадка первого дня была не слишком сложной, но поначалу пошла туговато на фоне повседневного “перекладывания жысонов“. Тем полезней переключаться! Участвуй! #adventofcode #adventofcode_2023 @panykey | Искусство реализации идей
2 года назад
Git хук для запуска тестов Есть у меня такой pre-push хук - автоматом прогоняет тесты локально, через maven. Подключается по необходимости через отдельные git конфиги для проектов. #!/bin/env bash set -eu # https://gist.github.com/arnobroekhof/9454645 # save the file as <git_directory>/.git/hooks/pre-<commit|push> and chmod +x # modified: dimio, 2022-09-21 echo "Running mvn clean test for errors" # retrieving current working directory CWD=$(pwd) # find dir with parent pom.xml (a top-level depth) - run tests for all modules PROJ_DIR="$(git rev-parse --show-toplevel)$(dirname $(find -type f -name 'pom.xml' -printf '%d %p\n' | sort | tr -d '[:digit:]') | tr -d . | head -n 1)" cd "${PROJ_DIR}" MVN_RESULT=$(mvn clean test 2>&1) if [ $? -ne 0 ]; then echo echo "${MVN_RESULT}" | ((tee /dev/fd/5 | grep -A 10 -B 2 "Summary:" > /dev/fd/4) 5>&1 | sed -n -e '/^Failed tests:/,/Tests run:.*$/ p' ) 4>&1 echo echo "Error while testing the code" cd "${CWD}" exit 1 fi cd "${CWD}" Стащил его, судя по всему, отсюда: https://gist.github.com/arnobroekhof/9454645. Потом допиливал немного - чтобы он с многомодульными проектами работал корректно. Может, ещё что-то по мелочи причёсывал. И он отлично работает (разве что можно через sed попробовать результаты по всем модулям агрегировать). Но вот проблема - на текущем проекте везде gradle, а под него я что-то не могу найти похожего простого решения 😕 Есть ли оно? #git #maven #bash dimio.org
2 года назад
Калькулятор здорового человека Привычно запустил хоткеем SpeedCrunch калькулятор и поймал себя на мысли - насколько же он офигенен! Пожалуй, мой идеал калькулятора, не меньше. В сравнении с чем он познавался, чтобы не быть голословным: 👉 Win калькулятор. Он просто есть, на нём можно считать, но зачастую проще на телефоне открыть эмулятор научного. Дальше Win10 я не заглядывал, что там в свежих - без понятия. 👉 Gnome калькулятор - аналогично. Нечего вспомнить про него, а ведь года четыре на Гноме просидел. 👉 Qalculate! - такой мощный комбайн. Стоял на Винде и запускал я его редко - слишком заморочный какой-то, запускался с заметной задержкой (понятно, что из-за неродной ОС). Легче в виндовом и посчитать сразу. Может, стоит его сравнить в параллели с SpeedCrunch 🤔 👉 SpeedCrunch - пока самый оптимум по шкале простота/фичи. Если всё поотключать - будет такой "Win калькулятор с удобствами". Повключать - уже похоже на Qalculate. Можно выбрать серединку 💯 Что он умеет - на картинке видно в целом. Простые пользовательские функции довольно удобны. Прям топ - автосохранение результата вычисления в ans и автоподстановка оттуда - обратно в строку ввода. Импорт/экспорт сеансов, скины, форы представления результатов - это всё есть. Разделитель десятичный можно поставить - одновременно и точку, и запятую 🔥 Не помню, где я про него вычитал, года полтора уже пользуюсь. Доволен, что это произошло! #софт @dimio | dimio.org
2 года назад
Низкоуровневое форматирование flash/SD/microSD под Linux Несколько раз приходилось форматировать флешки (к которым относятся и различные SD и microSD карточки), а поскольку происходит это довольно редко – вынужден был лезть в гугл. Конспективная памятка по форматированию флешек под Linux: Проверить подключение flash fdisk -l Выведет список подключенных дисков и их разделов. Обычно флешка – /dev/sdb, но нужно обязательно проверить, так ли это! Проверить, примонтирована ли флешка df -h Если флешка примонтирована – покажет это и точку монтирования. Перед форматированием – отмонтировать: umount /dev/sdb. Проверить защиту от записи и геометрию При желании – можно проверить защиту от записи и геометрию (защита от записи в линуксе не важна): hdparm /dev/sdb Если нужно низкоуровневое форматирование – забить нулями dd if=/dev/zero of=/dev/sdb В выводе покажет объем флешки (должен соответствовать заявленному), скорость и время записи. Также покажет, сколько было записано байт на флешку, что полезно при проверке флешки на физические ошибки (см. ниже). Проверить на физические ошибки head -c N /dev/sdb | md5sum head -c N /dev/zero | md5sum где N равно числу байт, записанных на флешку при помощи dd. Если контрольные суммы не совпадают – флешка “битая” или были ошибки записи (в реальности сталкивался с форматированием microSD через плохой кард-ридер – даже когда не выскакивали ошибки ввода-вывода при операциях – контрольные суммы не совпадали, с заменой кард-ридера проблема ушла). Пример: dimio@ibm $ dd if=/dev/zero of=/dev/sdb dd: запись в «/dev/sdb»: На устройстве кончилось место 3932161+0 записей считано 3932160+0 записей написано скопировано 2013265920 байт (2,0 GB), 1010,99 c, 2,0 MB/c dimio@ibm $ head -c 2013265920 /dev/zero | md5sum 5d0fd6273bed1c500c6fc22d86a59630 - dimio@ibm $ head -c 2013265920 /dev/sdb | md5sum 5d0fd6273bed1c500c6fc22d86a59630 - Ну и для полного счастья при желании: dimio@ibm… #linux #notes --- Ссылка на запись --- https://dimio.org/nizkourovnevoe-formatirovanie-flash-pod-linux.html
289 читали · 2 года назад
Получение класса “Enum с параметром” по значению параметра Частенько в коде встречаются перечисления, дополнительно хранящие некие значения (в виде private final поля обычно). Чтобы в дальнейшем можно было, например, при сериализации в json это значение подставлять автоматом (@JsonValue у Jackson). Тогда возникает обычно и обратная задача – десериализовать (распарсить) значение обратно в Enum (@JsonCreator у Jackson). Вот мне и надоело копипастить туда-сюда все эти методы (сериализации/десериализации) между классами Enum. Решил сделать один раз утилитный метод и в проекте им пользоваться. Благо, время позволило. В принципе, подобный метод есть в недрах Apache Commons EnumUtils, но он работает только со строковым параметром String enumName, плюс выкидывает стандартное исключение. А обычно надо выкинуть некое кастомное, принятое на проекте. Так и родился свой костылёчек, как оно зачастую и бывает. Получить класс Enum по значению Импорты копировать не буду, полагаю, IDE предложит их подставить по выбору, если автоматически не сможет этого сделать. Сам утилитный метод примитивен: public final class EnumUtil { private EnumUtil() {} public static <T extends ValuedEnum<V>, V> T fromValue(Class<T> enumType, V value) { return Arrays.stream(enumType.getEnumConstants()) .filter(it -> it.getValue().equals(value)) .findAny() .orElseThrow(() -> new IllegalArgumentException(String.format( "Wrong value [%s] for enum type [%s]", value, enumType.getSimpleName()) )); } } ValuedEnum – это интерфейс, который реализуют все Enum со значением. Вот он: public sealed interface ValuedEnum<V> permits ComplexValue, NumberValue, StringValue { V getValue(); ValuedEnum<V> fromValue(V value); } Сделан sealed, чтобы при имплементации (методом копипасты) – был дополнительный “маячок”, заставляющий обратить внимание – это именно Enum со значением. Пример работы и тесты - на сайте, в запись ТГ не влезают. #java #программинг #Памятки
2 года назад
Если нравится — подпишитесь
Так вы не пропустите новые публикации этого канала