Category: it

Category was added automatically. Read all entries about "it".

404

Вакансия сисадмина

Требуется сисадмин (devops, you name it). Работа на 90% в районе CI/CD (запаковать приложение, приделать интеграционные тесты, вылить в стейджинг и продакшен, configuration as a code), с элементами сисадминства (разобраться почему оно сломалось неожиданным образом). Потенциально ещё работа в R&D отделе с будущими 'as a service', подбором правильных технических решений.

Технологии и навыки: git, ansible, python, сетевой стек linux, фрагментарный docker/k8s (не критично и быстро учится), debian/ubuntu как основная система. BGP плюс. С точки зрения отладки/настройки придётся иметь дело с postgres, clickhouse, prometheus, общаться с java и иногда с ruby. Писать не придётся, читать иногда, увы.

Если знаете chef, то засчитывается за большой плюс (и заменяет собой ansible).

Ожидаются реально хорошие знания основ.

Работа без pager duty.

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

Вакансия: https://hh.ru/vacancy/36113395

404

программирование

Один навык, которму нельзя научиться иначе, чем на личном опыте, это способность замечать, когда пишется слишком много кода.

Когда пишется слишком много кода, то для сохранения работоспособности мозга второстепенные цели и нюасны отметаются, и тогда уже не программист контролирует код, а код контролирует программиста. В какой-то момент программист понимает, что для того, чтобы добиться своей цели ему нужно сделать «так-то». Но почему — он уже не понимает. И возникает дилемма — либо разбираться (т.е. писать меньше кода и владеть им), либо писать больше кода (и тогда код диктует программисту что нужно сделать чтобы получилось то, что он хочет).

Обычно такие ситуации — это ошибка планирования. Хороший продакшен-код всегда локален и скучен, он всегда работает с хорошо известной задачей с хорошо известными решениями. Часто такое возникает при попытке попробовать новый модуль/функцию/приём. Где-то в процесс применения выясняется, что начальные предположения не верны, и надо всё по-другому, а много написано под старые предположения... (заметим, ни слова про agile и изменяющиеся требования — я сейчас про внутреннюю кухню).

Если код оригинальный, дерзкий, глобальный, то это exploratory programming. Важно, нужно, но очень не желательно в продакшене. В exploratory programming программист исследует возможности, и, в какой-то момент, исследует свой код. Т.е. код контролирует что программист может сделать.

Это строгая противоположность того, когда программист владеет кодом.

(Пост написан по мотивам размышления над рабочим кодом, когда я решил не писать «интересный, но сложный» кусочек просто потому, что мне показалось, что после меня останется слишком много кода. Лучше иметь дуболомный код, который я контролирую, чем шаткий табурет тонкой работы).

404

Если долго докапываться...

Начинаешь писать модуль к Ансиблу, заканчиваешь в багтрекере kernel.org

https://bugzilla.kernel.org/show_bug.cgi?id=206241

Драма состоит в том, что даже если они его пофиксят, то вероятность получить багфикс в 6ой centos и ubuntu 14.04 стремится... Да даже в 20.04, и то — маловероятно.

Короче, с этим нам жить следующие лет 5-10.

404

ip link (create?)

Пока предыдущий PR маринуется под новогодним code review, я задумался о следующем модуле Ансибла, который позволит создавать/удалять интерфейсы (класса veth), т.е. враппером над ip link add/delete.

Проблема с которой я страдаю, это название модуля.

Вот примеры его использования:

 - ip_link_x:
      name: veth3
      state: present
      type: veth
      peer_name: veth4
      namespace: foobar
      peer_namespace: foobar2
- ip_link_x:
      name: veth3
      namespace: foobar
      state: absent


Если я его назову ip_link_add (или ip_link_create), то absent будет выглядеть wtf. Если я его назову просто ip_link, то будет не понятно, что рядом есть ip_link_set.

ip_link_exist - глупо. ip_link_add_del - незвучно. ip_link_state - неточно (т.к. звучит больше как синоним к ip_link_set).

Что является гиперонимом для add/del?
404

ip link set

цать коммитов спустя, но я прорвался через их фанатичных ботов, требующих странного. Ждём человеков на code review...

404

ansible: ip_link_set

Я всерьёз его пишу. Предыдущая попытка была несколько поверхностной и покрывала одновременно слишком много кейсов и каждый не до конца.

После срача о том, что ip link , который и up, и down, и present и absent, я согласился с аргументацией и начал писать только ip link set (разумное подмножество того, что умеет ip link set — разумное — это то, что я могу воспроизвести и понять).

В принципе, с третьей итерации я уже сделал его почти отлично. Он больше не ломается на разном числе параметров в выводе ip, я переделал его в ip -o (я бы рад, ip -j (т.е. json), но Centos6 must be supported, а там всё такое свежее, что в спеках CSV ещё чернила не высохли, что уж про json).

Ещё у меня огромная сага с netns. В отличие от большинства параметров, он эквивалентен операции 'move', а когда вы делаете 'move' для группы интерфейсов, там безумная логика (часть уже подвинута, часть уже не подвинута, плюс в разных namespace'ах могут быть интерфейсы с одинаковыми именами).

Но я постепенно всё это разгребаю и оно мне начинает нравиться всё больше. Если на code review меня сильно не завернут (... 47 юнит-тестов, 5 интеграционных...), то я потом так же ещё хочу ip route и ip address сделать. Ну и изначальный ip link add (как туда delete семантически вфигачить — это вопрос открытый).

Зачем оно мне сдалось? Когда лабы делаешь, персистентность не нужна, а вот интерфейсы, namespace'ы и бриджи плодятся тоннами. Модуль туда просто адски must have.

Оно находится тут: 

Collapse )
404

The most stupid command in linux

ip link set group 42 alias foobar

Если group 42 — это 0 или 1 интерфейса, то это команда странный выкрутас. Если group 42 — это больше 1 интерфейса, то получившимся алиасом невозможно пользоваться, потому что он дублируется.

404

DNS'ы фигня

У настоящих адресов есть Имена Собственные.

Догадайтесь, какие адреса скрываются за этими именами?
google8
google4
flare1
yandex88
404

Rust хихихи

Пришёл человек, спросил, почему его программа на расте работает за 18 секунд, а эквивалентная на ноде — за 10.

После пристальной медитации программа на расте теперь работает за 0.7 секунды.

https://users.rust-lang.org/t/why-my-rust-code-is-2-times-slower-than-my-js-code/31189/18

404

Размышляя о странном

А что такое класс (без наследования) в контексте функционального программирования?

Общее замыкание?

Замыкание, замыкающее не только данные, но и набор ассоциированных функций?