Программизд
178 subscribers
50 photos
2 videos
123 links
Backend developer, borisd.ru

Блог о программировании, бэкенде, IT и не только.

@hpdbru - собираю коллекции.

Иногда не пишу по две-три недели.


@purchase_list_bot
Download Telegram
"Высокоуровневые" ЯП
Когда учишься программированию сам и начинаешь с интерпретируемых языков, некоторые вещи от тебя скрыты настолько, что ты даже и не задумываешься о них.

Например, конверсия типов: типичные int(str) и str(int).

Вчера увидел задачку в курсе питона по разбивке числа на цифры, то есть число 1234 становится [1,2,3,4].

В комментах многие запостили решение типа

num = str(intNum)
num.split()
for ... {num[i] = int(v)}


И возникает вопрос, какая разница между 1234 и "1234"? А кратко и не опишешь, вот неплохая статья про представление в памяти.

Копнул исходники питона, чтоб показать, что стоит за str(int) и наоборот:

https://github.com/python/cpython/blob/3.8/Objects/longobject.c#L1752

https://github.com/python/cpython/blob/3.8/Objects/longobject.c#L2314C10

При этом, мне кажется, если изучать программирование с какого-нибудь C, неизвестного о типах и структурах данных практически не останется.

// Пример
https://leetcode.com/problems/string-to-integer-atoi/
👍3
NestJS
Запилил микросервис на NestJS, впечатления приятные: TypeScript, кодо и тестогенерация с использованием практик чистого кода, а так же npm install выдающий успокаиващее "found 0 vulnerabilities" даже после десятка установленных зависимостей (с префиксом netsjs).

Правда есть и неочевидные поведения с DI, чего можно и не заметить в документации по незнанию: injection scopes, с чем я и столкнулся.

https://docs.nestjs.com/fundamentals/injection-scopes
A controller that depends on a request-scoped provider will, itself, be request-scoped.

Прокинул по наивности либу для получения/подстановки traceID из запроса в конструктор своего другого сервиса и e2e тесты стали зависать на завершении (jest предлагал --detectOpenHandles, который не помог).

Оказалось, что эта либа request-scoped и мой сервис стал таким же и создавался на каждый запрос, а с ним и тяжелая зависимость, и onModuleDestroy для него перестал работать.

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

* Также у меня был пост про NextJS
Достигаторы

Пока страдаю от нехватки времени, натыкаюсь на интересных ребят в телеграме.

Парень из Казахстана устроился в Microsoft, а потом в Stripe.
Интересно написал об опыте собеса и переезда в своем блоге на medium.

https://kurmangaliyev.kz

#hpdb
🥱2
Упс с Nats

Раскатываешь helm'ом кластер Nats, в values.yaml

config:
cluster:
enabled: true
replicas: 3

а ниже

merge:
server_name: my_name


внезапно сервера взлетают по CPU, открываешь логи подов, а там с огромной скоростью (сотни в секунду) повторяющиeся записи:

- Route connection created
- Remote server has a duplicate name: my_name
- Router connection closed: Duplicate Server Name

В моем случае, пришлось скейлить statefulset в 0 руками в активной ssh-сессии, потому что сервера перестали отвечать на helm upgrade.
Убрал server_name и все стало ок.
Бесконечный путь
По мере переноса проектов в свой кубер-кластер, периодически всплывают внезапные недоработки.

Поднял приложение, которому необходимо знать ip-адрес клиента, а я получаю адрес из сети кубера.

Сначала переконфигурил traefik чтобы принимать proxy-protocol - не помогло.
Отбросил наивные решения со всяких stackoverflow, предлагающих поставить externalTrafficPolicy local.

Начал читать глубже, оказалось, что в k3s по дефолту стоит ServiceLB, который, по сути, является парой правил iptables с nat, и там нет никакой поддержки proxy-protocol, source ip до приложений не доходит.

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

https://docs.k3s.io/networking#service-load-balancer
https://github.com/k3s-io/klipper-lb/blob/63942dfab1d4f2a6deed94eeada077ef2462b8c1/entry#L59
ГТА моддинг
С детства любил GTA San Andreas, а когда узнал о multiplayer, тут же начал играть в нее по интернету. В то же время (лет 12 назад) начали расти role play моды, и я загорелся идеей в этом разобраться и тоже моддить гта. Правда так этого и не сделал (запомнил только название яп PAWN).

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

Seemann - российский програмист, вкатившийся в моддинг в 2003 году. Автор Sanny Builder (дизассемблер scm - скриптов rockstar, и язык для их написания), которым все пользуются для моддинга гта.

Его активный гитхаб https://github.com/x87 и блог https://www.patreon.com/seemann и прикольный проект:

CLEO Redux - встраиваемый рантайм для запуска js/ts скриптов в играх и приложениях (а не только в GTA).

#hpdb
👍2🔥1
Сколько у вас скопилось данных с телефонов за предыдущие годы, как вы их храните?
Anonymous Poll
28%
Сотни гигабайт
41%
Считанные гигабайты
35%
Храню в телефоне
35%
На компе
9%
В NAS
30%
В облаке
Облачное Архивное хранилище
Появилась идея сделать долговременное хранилище за дешево.

У меня скопилось много разных данных, которые я в оригинале пересматриваю редко, но удалять их сильно не хочется. Их с каждым годом становится больше, а чем больше, тем заметнее ценник за облачные хранилки.

Облачные хранилища хранят 1ГБ примерно за 1р/мес. 500р/мес за 500ГБ.
Дешевенький домашний NAS 20к.

Я знаю способ хранить данные в десятки раз дешевле даже без экономики масштаба.

Понадобилось бы вам, как физлицу, архивное хранилище с ценой за запись/чтение? Условно, записал 500гигов, заплатил за это 100р. В цену входит одно считывание. Само хранение с каким-то невысоким тарифом, типа тех же 100р в год.

А если у вас есть юрлицо/опыт с ними, то поделитесь, как они решают эти проблемы и на каких масштабах.

👍/👎
👍41👎1
Код Хэмминга, новый сайт
1. Реализовал давно сидевшую идею по интерактивным алгоритмам на своем сайте всеего спустя 7 лет. Первый - https://borisd.ru/algorithms/interactive/hamming-code/
Скидывайте друзьям.

С компа интерактивность удобнее.

С визуализацией проблем не возникло, немного пришлось вспомнить реакт (немного подзабылось, спустя 3 месяца). А вот с алгоритмом пришлось помучаться: "базу" накидал, а потом с этими позициями битов сам себя запутал и долго тупил.

2. Сайт накидал на Gatsby.js, который ощущается немного тормознутым в разработке (gatsby develop долго собирается). В остальном круто: билдишь статический сайт, при этом можно его и оживить с помощью headless CMS / GraphQL. Даже статичной же версии можно приделать и мета теги и прочий seo.

Пушу код в репу на гитхабе, а там автоматом предлагается поставить github action для gatsby, поставил, запустил, все задеплоилось само, бесплатно. Дожили.

3. Теперь буду развивать borisd.ru всякими интерактивами и, может быть, туда переезжать.
❤‍🔥1🔥1
Алгоритм регулярок
Я когда-то читал старую статейку про оптимальную реализацию регулярок (не помню, но будто близко к O(N)) и о том, что во многих языках (Perl, PHP и т.п.) она реализована совсем не оптимально, и можно положить программу при нужных регулярках и текстах.

Подтверждения я этому не нашел, попробовав всякие https://regex101.com/, https://www.phpliveregex.com/, ну и подумал, что это уже не актуально и забил.

А вчера наткнулся на https://javascript.info/regexp-catastrophic-backtracking 🛑
Очередной год
- устроился на работу на go
- прошел англоязычный собес
- устроился в Европу
- выполнил план по карьерному росту
- добрался до borisd.ru, сделал первую демку алгоритма

Моя рубрика с созданием проектов не выстрелила: во-первых, долго готовил свою инфу, во-вторых, какие-то тупые у меня идеи и идей мало. Также я не умею в маркетинг, ничего раскачать не могу, и даже в этот блог подписчики органически никогда не приходят, хотя я и веду его уже 3 года.

В новом году буду пилить интерактивы на borisd.ru и погружаться в системную разработку, о чем буду писать тут.

Вытаскивайте канал из архива, включайте нотификации (пишу то я редко), делитесь постами с друзьями 🙏

С наступающим НГ 🎄
🔥12
Электромеханическое программирование

Машина для пинболла, которая реализована только из переключателей, соленоидов и реле, на основе которых реализованы подсчет очков с бонусами и мультиплеер.

Пара кадров в комментах.
* Можно включить озвучку в Яндекс браузере (не знаю, потянет ли он часовые ролики)


- https://www.youtube.com/watch?v=ue-1JoJQaEg
- https://www.youtube.com/watch?v=E3p_Cv32tEo
Figma 🔥

Начал делать новый проектик, который надеюсь показать в феврале, и решил накидать прототип в фигме.

По работе я сто раз смотрел в ней макеты, но в виде готовых страничек, по которым я видел размеры элементов и т.п. Поэтому я и думал, что это инструмент для верстки дизайнерами или что-то такое.

Сам раньше пробовал, результат получался хуже, чем в ms paint, и с размерами была какая-то фигня.

А тут я просто посмотрел вводные уроки внутри самой фигмы и осознал всю мощь. Набросал интерактивный прототип проекта и, основываясь на нем, решаю что нужно и как связаны сущности между собой, чтоб пилить бэк.
👍2🔥1
Hands-on experience

Решил запилить нормальный CI/CD в свой кубер, вместо ручного деплоя. Столкнулся с тем, что за долгое время без внимания, кластер оброс какими-то проблемами. А я вообще забыл, что там и как, пришлось много читать и пробовать.

Во-первых, полно подов с ошибкой disk-pressure: смотрю kubectl describe nodes - все с диском ок. Так я начал освежать тему:

- Taints and tolerations
На ноде можно выставлять taints, чтобы ограничить, какие поды на ней могут работать. Если есть taint, в спеке пода должен быть соответствующий toleration, disk-pressure - один из них, на ноду он накидывается динамически.

Я использую capsule, который заложил для потенциального развития кластера. И он использует еще одну тему:

- Admission controllers
Это инструмент, позволяющий проверять мутирующие запросы к Kube API и не дать им выполниться (после аутентификации и авторизации).

У меня какое-то время назад возникали проблемы с диском и я их решил его увеличением. А про taint не подумал. Taint disk-pressure накинулся, многие "системные" поды поотвалились, в том числе capsule admission webhook.

Возникло что-то типа дедлока: когда решились проблемы с диском, taint убраться не смог, потому что он не мог достучаться до упавшего capsule admission webhook pod'а, которй не мог заschedule'иться из-за taint'а disk-pressure.

Пришлось делать kubectl patch с добавлением toleration disk-pressure на deployment вебхуков capsule.
После этого под поднялся, я смог снять taint disk pressure (с помощью kubectl taint) и все остальные поды тоже ожили.

Очередной раз понял, что без регулярного практического опыта, знания выпадают из головы. Восстанавливать их чуть проще, чем просто изучать с нуля, но все равно затратно.
👍4
Неудачный выбор вендора
Когда я строил свой кубер-кластер, я исходил из экономии, все должно быть легковесным, но поставляющим реальный функционал.

Так я выбрал k3s, а под него нашлось и управление стораджем (PV/PVC) - longhorn, а под него s3 гейтвей.

https://github.com/aquarist-labs/s3gw

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

Сам проект основан на костылях под radosgw, который, вообще, предназначен для Ceph, вместо которого я, в свое время, взял longhorn.

Проект прикольный, но пропатчить его я вряд ли смогу, а значит придется:
- либо отказаться от s3
- либо перейти на ceph, что влечет переделку всего, что завязано на PV longhorn'а, да и освоение ceph для начала
- либо оставить s3 на неподдерживаемой технологии и без крутых фич.

А пока придется упаковывать статику в какой-нибудь nginx или гошный веб-сервер, что требует билда, деплоя и т.п.(
Ограничение памяти для ОС
Недавно увеличил память на виртуалке в два раза, чтобы сервер смог подняться после проблемки. Проблему пофиксил, решил уменьшить память обратно, но прежде чем это делать, подумал "как можно уменьшить ее мягким образом для теста".

На линуксе так (в моем случае с almalinux):
- grub2-set-default mem=4G (уменьшаю до 4ГБ, после этого в grub2-editenv list вижу `saved_entry=mem=4G`)
- grub2-mkconfig -o /boot/grub2/grub.cfg
- reboot

проверяю через free - показывает 4ГБ. Сервер поднялся, значит можно уменьшать виртуалку перманентно.
👍1👀1
IT исчерпал себя
Нужно выбирать новую профессию. Зарплаты не растут, в мире сокращения, взлет того же AI.

Да и от этого блога на it-тематику все только отписываются.

Может мемами заняться?

1 апреля
👍4😢3🤡2😁1
Требуется перезагрузка
Этой весной, вне рабочего времени, ноутбук практически не открывал.
Кубер-кластер заморозил, чтоб не платить просто так. Проекты все забросил, потому что перестал видеть перспективу.

Но, чтоб поддерживать активность в канале, решил опубликовать свой "старый" проект lang-api,
https://github.com/boryashkin/lang-api/ о котором писал на vc. На нем я очередной раз учился React'у и напилил относительно сложный фронт, а так же инструменты для нарезки видосов по субтитрам (см. статью на vc).

А также драфт странички, на которой я в интерактивном виде хотел (потом доделаю) разобраться и показать как работают всякие арифметические операции в JS и в принципе, учитывая ограничения по размерам/памяти.
https://borisd.ru/articles/javascript-numbers/

С серией статей на своем сайте у меня большие планы, но, видимо, долгосрочные.
👍3
Теория автоматического управления
Вспомнил ТАУ с университетских времен, обдумывая идеи для проектов.

В потоке мыслей, начал смотреть проекты, которые делают студенты за рубежом, типа самобалансирующихся палок (см. self balancing stick на ютубе), и наткнулся на крутое изобретение более чем столетней давности: гироскопический монорельс (Gyro monorail)

https://youtube.com/watch?v=kUYzuAJeg3M
👍2
Набор конспектов по написанию софта
Наткнулся на интересные записи. Коротко и полезно для повторения:

https://web.mit.edu/6.005/www/fa15/

отрывок из содержания

03: Testing
04: Code Review
19: Concurrency
20: Thread Safety
21: Sockets & Networking
22: Queues & Message-Passing
23: Locks & Synchronization


там относительно Java, но на этом можно не акцентировать внимания
Программизд
Hands-on experience Решил запилить нормальный CI/CD в свой кубер, вместо ручного деплоя. Столкнулся с тем, что за долгое время без внимания, кластер оброс какими-то проблемами. А я вообще забыл, что там и как, пришлось много читать и пробовать. Во-первых…
Longhorn's failed PV
После очередного восстановления кластера, заметил, что nats не хочет подниматься на одной из нод - srv01. Под инстансы nats я выделял небольшие вольюмы для хранения данных на диске.

Смотрю kubectl describe pod nats-0 -n nats, там ошибка про аттач к PV или что-то про PVC, в общем, вольюм не предоставился.

Т.к. там ничего важного нет, сделал helm uninstall nats и снова helm install - не помогло. Руками удалил PV, переустановил - все равно именно на одной ноде вольюм не поднимался.

Решил заняться этим утром субботы, вместо будничных вечеров, и за 5 минут разобрался:
- во-первых, открыл UI longhorn (который отвечает за тот класс PV) и увидел, что проблема с одной из нод глобальная.
- во-вторых, загуглил, и наткнулся на наводящее слово "instance manager"
- в третьих kubectl get pods -n longhorn-system -o wide | grep srv01 показал instance-manager'ы в состоянии Terminating

Дернул kubectl delete instance-manager-xxx -n longhorn-system они спокойно перезапустились и вольюмы предоставились, проблемы ушли.

Хорошо разбираться с проблемами на свежую голову.

Вспоминается мой полугодовой отпуск в том году, когда я делал свои пет-проекты с невероятной скоростью, относительно прогресса при фул-тайм работе.