Задать вопрос
  • Стоит ли переходить на IDE?

    Vamp
    @Vamp
    В одном из ответов здесь я прочитал, что лучше на этапе обучения писать код в блокноте и без подсказок

    Такой совет могли дать только деды, которые сами учились в блокноте (потому что других вариантов тогда не существовало) и считают, что "раз уж я страдал, то пусть и другие тоже страдают".

    Когда я запрыгиваю в новый язык, всегда делаю это в полноценной IDE со встроенными подсказками, линтерами, подсветками и полным фаршем. Тогда вхождение в новый язык происходит намного быстрее и проще. И вам советую делать так же. Современной разработки не существует без IDE. Не вижу смысла оттягивать момент знакомства с IDE на более поздний срок.
    Ответ написан
    7 комментариев
  • Как перенести mdadm raid1 на новую ОС без потери данных?

    opium
    @opium
    Просто люблю качественно работать
    у меня был такой же переезд с Debian на Proxmox+OMV — данные выжили целиком.

    Superblock 1.2 хранится на самих дисках, так что RAID переедет вместе с ними. Главное при установке Proxmox — не трогай sda/sdb, ставь систему на отдельный диск.

    Дальше: пробрось оба диска в OMV-VM через /dev/disk/by-id/... (так надёжнее чем по sdX). OMV подхватит массив сама, XFS в Debian есть из коробки.

    p.s. после установки Proxmox глянь cat /proc/mdstat на хосте — если он сам собрал md0, останови (mdadm --stop /dev/md0) перед пробросом в VM.
    Ответ написан
    5 комментариев
  • Что необходимо для создания домашней сети с резервным провайдером?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Ещё один вариант жизни на двух провайдерах - весь трафик роутить через Linux 3-его ПК, раз уж он есть, а уже на нём решать, каким путём трафик должен идти дальше. В отслеживании коннектов помогут утилиты Monit и PING, а решает команда ip route change default via 123.456.789.0 dev ethN. Конечно можно банально интерфейс отключать, но тогда автоматическое восстановление трафика не сделать.
    Ответ написан
    Комментировать
  • GitLab Как сделать автоматическую проверку кода при push или merge request с уведомлением разработчика о результате и получением от него обр. связи?

    opium
    @opium
    Просто люблю качественно работать
    push в GitLab не отменить через pipeline — коммит уже в репо, и только потом стартует CI. Блокировать именно push можно через server hooks (pre-receive), но там таймаут секунды — ИИ не вписать.

    Нормальная схема: поставь protected branch на main (запрет прямого push), разраб пушит в ветку, открывает MR, CI запускает скрипт. Diff берёшь через
    git diff $CI_MERGE_REQUEST_DIFF_BASE_SHA $CI_COMMIT_SHA
    или через GitLab API изменений MR. Результат — комментарием в MR, если скрипт вернул ненулевой exit code — merge заблокирован при включённом "Pipelines must succeed".

    requests.post() в job синхронный, job стоит и ждёт пока ИИ не ответит.
    Ответ написан
    Комментировать
  • GitLab Как сделать автоматическую проверку кода при push или merge request с уведомлением разработчика о результате и получением от него обр. связи?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    1. Да, возможно. Поднимаете отдельный CI/CD сервер, создаете задачу с нужным вам функционалом и на этом сервере её запускаете. Отчёт можно любым приложением/скриптом отправить/залить куда и как угодно. Например, можно сразу в коммит или в запрос запостить сообщение через API: https://docs.gitlab.com/api/commits/#post-comment-...
    А при появлении сообщения в коммите/запросе гитлаб автоматом оповещает всех причастных, кто подписан. Просто настройте нужные вам оповещения — можно ботом в чат их слать в ТМ, на почту или ещё куда угодно.
    Так же гитлаб поддерживает стандартные форматы отчётов тестов из коробки, что позволяет сразу в интерфейсе гитлаба увидеть все результаты тестов. Возможно в вашем случае это подойдёт, возможно нет.
    Отдельный сервер нужен для того, чтобы не создавать проблемы и тормоза на основном сервере, где запущен гитлаб. А если запускаете на том же — убедитесь в установке ограничений производительности для задач. Иначе, когда у вас будет запускаться по сотне или даже тысяче задач в день — будет не очень комфортно работать с гитлабом.

    2. Это не имеет смысла. Пуш — это по факту просто загрузка коммита на сервер. Есть PR — он легко блокируется через подтверждение со стороны определённых пользователей или групп пользователей, а так же в случае если задача завершилась с ошибкой. Это всё настраивается в настройках. Вам следует просто правильно организовать рабочий процесс. Используйте стандартный Github Flow. PR для того и придуманы, чтобы в PR принимать или отклонять изменения. Не, так-то если очень хочется, то можно откатывать одиночные коммиты, но правильнее это делать через PR.

    3. Задача запускается сразу после пуша. В задаче есть полный доступ к репозиторию и всему коду. А т.к. это гит, то легко можно получить все изменения в любом виде в скрипте и делать что угодно с ними.

    4. Да, это стандартное поведение всех задач. Задача, обычно, запускается в контейнере и пока контейнер работает — статус задачи не меняется. Либо это отдельный скрипт на сервере, завершение которого гитлаб будет ждать. Задачу даже можно разбить на несколько стадий и по мере их завершения менять статус самой задачи, а результат можно даже в реальном времени в самом гитлабе в задаче наблюдать.
    Ответ написан
    Комментировать
  • Чем препроцессить в HTML сокращения?

    opium
    @opium
    Просто люблю качественно работать
    posthtml — под такой трансформ он буквально и создан. emmet тут не то, он работает с аббревиатурами (div#id.class) без угловых скобок. В posthtml пишешь плагин через tree.walk(), который переносит #id → id, .class → class. ANTLR оверкилл.
    Ответ написан
    2 комментария
  • Выбор брокеров сообщений в зависимости от задачи?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    А в чём у вас собственно вопрос-то? Вы не знаете как сделать выбор между двумя инструментами? Делаете простую табличку:
    Требования вашей задачи | Возможности Redis | Возможности RabbitMQ
    Вписываете все нужные вам пункты и далее выбираете то, что вам больше всего подходит.
    Ответ написан
    Комментировать
  • Какие есть совместимые алгоритмы хеширования между C# и Java?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Ваш вопрос не имеет никакого смысла, т.к. алгоритм реализуется идентично и независимо от ЯП. И ответ прост: все алгоритмы хэширования совместимы между любыми ЯП. Поэтому вам просто надо найти реализацию одного и того же алгоритма для обоих ЯП.
    Ответ написан
    1 комментарий
  • Как оптимизировали сайт, что он летает?

    @Vitsliputsli
    Не прав. Изучите, как минимум, что такое ping, протокол icmp, http. Пока все ваши выводы бессмысленны.
    Ответ написан
    2 комментария
  • Как понять комментарий "non-greedy" в описании синтаксиса литерала сырой строки в байтах?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Это стандартное понятие для регулярных выражения.
    Жадный матчинг берёт максимально возможное количество символов строки для совпадения с маской, нежадный - минимально возможное.
    Например, для строки axxxbxxxb жадная /a.*b/ захватит всю строку, а нежадная /a.*?b/ только до первой b.
    Ответ написан
    5 комментариев
  • Pthread, чистый си, откуда ошибка сегментирования?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега C
    Седой и строгий
    В pthread_create нужно передавать ссылку на функцию, а не результат её выполнения. Функция zapis_v_terminal возвращает NULL, функция pthread_create передаёт управление на нулевой указатель, естественно, возникает ошибка сегментирования.
    Ответ написан
    Комментировать
  • Pthread, чистый си, откуда ошибка сегментирования?

    @res2001
    Developer, ex-admin
    Потоки - это не корутины совсем.
    Корутины выполняются в одном потоке, последовательно.
    Потоки выполняются параллельно на многоядерной/многопроцессорной системе.

    Ошибка у вас в вызове pthread_create. Нужно примерно так:
    pthread_create(&t1, NULL, zapis_v_terminal, NULL);
    Потоковая функция zapis_v_terminal() должна соответствовать сигнатуре. Посмотрите man pthread_create там это написано. Последний параметр pthread_create является аргументом потоковой функции. У вас там сейчас NULL. Обычно все же в потоки передают какую-то информацию, хотя в простейшем случае можно использовать глобальные переменные.

    Вам не надо делать detach(), наоборот перед выходом из main делайте join() обоих потоков, т.е. дождитесь завершения потоков, только потом выходите из main().
    Чаще всего detach() не требуется и даже вреден. Лишь в ограниченных случаях можно/нужно использовать detach() потоки. Ваш случай не такой.
    Ответ написан
    Комментировать
  • Заголовочные файлы в Си нужны только для интерфейса?

    @Mercury13
    Программист на «си с крестами» и не только
    Хедеры служат, чтобы два c-файла — они называются «единицы трансляции» — компилировались по отдельности. Это основное назначение той разновидности include-файлов, которые называются хедерами.

    Можно в h-файлы посадить и тела функций, только убедиться, что каждое тело ровно в одной единице трансляции — есть такой подход под названием «одна единица трансляции», и он существует у больших редко перекомпилируемых библиотек, чтобы перекомпиляция была покороче.

    Подключение main.c←math_functions.h служит, чтобы сказать компилятору: а где-то в другом месте есть эти функции.

    Подключение math_functions.c←math_functions.h — частично для подключения прочего общего вроде типов, частично для проверки на ошибки. Дело в том, что Си традиционно не козявит (does not mangle) имена функций, и если в хедере sin(int), а в реализации sin(double) — будут трудноуловимые ошибки.

    Да, деление на единицы компиляции решает и другую задачу — декомпизицию программы на меньшие элементы, и есть противоречие одного с другим (особенно в языке Си++, где хедеры огромны)

    В хедере находится только то, что не производит кода. Если говорить про Си++, то…
    • inline-объекты (код производят вызовы объекта)
    • определения типов, функций и прочего; extern-определения переменных (код производят тела функций и окончательные определения переменных)
    • шаблоны, если те нужны более чем в одной единице компиляции (код производит специализация)
    Но полные специализации шаблонов производят код и находятся в cpp-файле!
    Ответ написан
    Комментировать
  • Заголовочные файлы в Си нужны только для интерфейса?

    wataru
    @wataru Куратор тега C++
    Разработчик на С++, экс-олимпиадник.
    Для того, чтобы использовать в main.c функцию, определенную в math_functions.c, вам надо иметь ее объявление в main.c

    Вам надо сказать компилятору, что вот такая функция есть и у нее вот такие вот параметры.

    Можно просто в main.c написать то, что вы бы написали в math_functions.h. Но это быстро становится сложно, если у вас проект большой и функции используются в разных файлах. Надо будет эти объявления копировать в кучу мест. А если вам еще и поменять что-то надо потом, вы офигеете. Для этого и придумали заголовочные файлы - вы пишите объявление один раз и потом его везде используете.

    Вообще, сейчас не обязательно math_functions.h включать и в math_functions.c. Раньше надо было определять функцию даже если ее объявления нигде нет. В современных стандартах это не так. Но все равно хедеры включают в соответствующий файл, чтобы ловить ошибки. Если вы поменяете функцию в .c но не поменяете в хедере, компилятор заметит несоответствие объявления и определения и сообщит об ошибке.
    Ответ написан
    6 комментариев
  • ZFS или HW RAID?

    @rPman
    Аппаратный рейд имеет смысл только на старших моделях контроллеров (с собственной памятью, батарейкой и т.п.) все остальные варианты - это вендорлок и куча проблем с доступом к данным когда контроллер сломается (эта беда и на дорогих рейдах вылезает, но если у вас есть деньги на дорогой контроллер, вы и второй про запас купите).

    Используйте софтварный raid.

    mdadm - это работа на уровне блочного устройства, сам по себе не дает снапшотов и связанных с ним фичами (их делают поверх, например тормозной lvm) и если это не используется то дает наибольшую производительность, в т.ч. за счет отсутствия фрагментации файлов. особенно если диски виртуалок хранить не как файлы а как разделы на mdadm (не важно как, напрямую или lvm)

    zfs выше требования (оперативка), но дает непревзойденные административные возможности, снапшоты (при этом высоченная их скорость), но слегка в среднем понижает производительность, особенно записи, фрагментирует файлы (это недостаток всех cow файловых систем) особенно это больно на базах данных, где часто мелкие записи (этот момент можно тюнить но все еще проблемный). у них есть zvol но так как он держит снапшоты, по факту ничем не отличается от хранения образом в файлах.

    Я как то сравнил в виртуалках (при использовании hdd) zfs и btrfs (главный и единственный конкурент zfs, в чем то даже лучше но его все еще не рекомендуют в продакшне именно со сложными конфигурациями raid), первый делал заметно больше дерганий головкой hdd чем второй, но скорее всего на ssd это станет не заметно.

    p.s. восстанавливать данные со сломанного zfs в тысячу раз сложнее чем с условного mdadm+ext4 по причине сложности первого.

    p.p.s. есть общие рекомендации по созданию хранилища данных, и одно из них - держите хранилище по дальше от сервера приложений, разделяйте... данные здоровее будут (но это дороже)
    Ответ написан
    Комментировать
  • ZFS или HW RAID?

    @Drno
    mdadm...

    если используете и довольны HW - его и юзайте

    Проксмокс и на нём будет отлично работать
    Ответ написан
    2 комментария
  • Открытие страницы без новой вкладки в tauri?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    который позволяет открыть ссылку в браузере который установлен по умолчанию, но проблема в том что каждый раз ссылка открывается в новой вкладке

    Это нормальное и правильное поведение. Открывать новую ссылку в текущей вкладке — не является нормальным и адекватным решением. Вообще, это можно рассматривать как вредное поведение. Вдруг у пользователя там что-то важное открыто или документ какой-то? За обработку протокола отвечают настройки операционной системы. Это поведение можно поменять, но это будет уже глобально, а какому пользователю это понравится? Кроме того, в хроме, например, этот функционал не поддерживается и не будет: https://issues.chromium.org/issues/40258305
    А вот для фаерфокса есть плагин. Возможно и для хрома тоже есть — не искал.
    Ответ написан
    2 комментария
  • Как добавить в массив объектов другой массив объектов?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    flover.forEach((f) => f.komment = komment.filter((k) => k.id === f.id))

    Правильно, конечно, flowers и comments
    Ответ написан
    Комментировать
  • В чем разница символической ссылки и скопированного пути?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Простой пример. Скрипт ежесуточно создаёт папку с текущей датой в названии и делает на неё символическую ссылку /some/directory/today. В настройках программы /some/directory/today указана как папка для сохранения каких-то файлов. В результате файлы каждый день сохраняются в отдельную папку, а программе не надо менять настройку.
    Ответ написан
    Комментировать
  • Апгрейда разраба с помощью нейросетки, с чего начать в 2025 году?

    Kentavr16
    @Kentavr16
    long cold winter
    Дополню ответы и комменты к ним.

    В вопросе правильно указано различие между скоростью и качеством работы программиста. По состоянию на сейчас разумнее всего рассматривать нейронки как коллегу , который супербыстро гуглит. Соответственно прокачка скорости работы - практически моментальная (при условии платного решения, присоединяюсь к ответу fkk и также рекомендую сонет интегрированый в IDE) Для меня прирост именно скорости написания составил минимум процентов 30 - почти полностью удалось делегировать написание тестов (особенно полезно), первичный рефакторинг/мелкое разбиение кода и тд.

    По улучшению качества работы все более размыто. ИИ отлично показывает себя как тренер для уровня интерна. при этом чем выше уровень, тем бесполезнее ИИ. Тут я на 90 процентов уверен что начиная с уровня мидл+ роль ИИ в обучении сводится у роли навороченной песочницы. Растить спеца ИМХО придется через практический опыт и толстые книги.

    П.С. - не ведитесь на маркетинг вокруг ИИ. Я считаю что у нейронок огромный потенциал, но судя по всему они еще минимум лет 5-7 будут вторичны. Это не программист и не учитель. Это крутое автодополнение которое помогает мясной прокладке между стулом и монитором.
    Ответ написан
    Комментировать