Минутка просвещения

Читать в телеге. Когда-то там были посты не только от меня.

Исключение файлов без расширения в .gitignore

В дополнение к предыдущему посту — занятная проблемка. По умолчанию go build генерирует исполняемый файл прямо в корень проекта (sic!). Исполняемый файл в репозитории мы не хотим хранить, и чтобы его исключить, обычно делают Makefile (еще один прекрасный язык, кстати) или добавляют в .gitignore название проекта. Но есть способ поинтереснее:

*
!/**/
!*.*

Тут сначала игнорируются все файлы, потом с помощью отрицания (!) разрешаются все файлы внутри папок и все файлы, имеющие расширение. Правда, отвалится Dockerfile, но у него хотя бы имя фиксированное.

СсылкаКомментировать

Еще один шанс для Go

По работе надо было написать микросервис для перекладывания JSON’ов, решил дать еще один шанс языку Go и написать на нем, с разбором впечатлений, как для Elm или Rust. Микросервис-то я написал, а вот пост писать раздумал, решил ограничиться примером, который, как мне кажется, довольно показательный.

Вот у нас есть метод из стандартной библиотеки, log.Fatal. Что он делает?

Ответ

Ожидаемый ответ — выводит сообщение в лог с уровнем FATAL. Сообщение он действительно выведет. Но еще он и завершит программу с кодом возврата 1. А я еще студентам пытаюсь что-то про SRP и хорошие имена говорить…

Ок, а что делают log.Info и log.Error?

Ответ

Ошибку компиляции делают, потому что нет таких методов.

СсылкаКомментировать

Тренажер сисадмина

Приезжает дальнобойщик домой, думает, в какую бы игру залипнуть для расслабона — Euro Truck Simulator, каеф!

Если не хватает подобного для решения проблем в Linux — есть игруля. Задания не очень сложные, местами жизненные. Если непонятно, что делать, то есть подсказки и можно даже какие-то команды новые узнать.

Бонус для ИБшников и прочих хакеров — вам дают рутовый доступ к временному контейнеру в AWS, RCE as a Service, налетай!

СсылкаКомментировать

Текущие проблемы с потоками и асинхронщиной

Неплохой доклад про текущее состояние асинхронного выполнения задач в JVM, хоть и очень тезисный.

Вначале немного повторения кэши L1-L3 и устройство процессора в целом, про потоки, очередь задач и их конкурентное выполнение, переключение контекста. Потом внезапно переключается на JVM — каждый поток это корень для сборщика мусора. Чем больше потоков, тем медленнее он работает. Какой-нибудь FixedThreadPool не решает проблемы, т.к. у него случайный порядок выполнения.

Далее — основы асинхронного выполнения и epoll. “Многие из вас плохо читают на C, поэтому я перевел этот кусок кода на Scala”:) Как решить проблему, что потоки ничего не делают, пока ждут? Перекинуть все ожидание на 1 поток. Но даже это дороговато. Эту проблему решили в nodejs-ной библиотеке libuv, которая в одном потоке и полезную работу делает, и ждет IO.

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

СсылкаКомментировать

Sed и разделитель

Оказывается, в sed можно использовать почти любой разделитель, т.е. эти варианты

sed -i 's/Hello/Goodbye/g' input
sed -i 's%Hello%Goodbye%g' input
sed -i 's Hello Goodbye g' input
sed -i 'ssHellosGoodbyesg' input

будут работать одинаково. В качестве разделителя используется первый символ после s. Увы, прокатит только однобайтный символ, Ы не подойдет.

Спонсор это минутки — Ярослав:)

СсылкаКомментировать

Пофлексить

Интерактивный туториал по основам FlexBox.

В начале порадовала аналогия с шашлыком (главная ось = шампур, элементы = мясо).

А ближе к концу расстроило понимание, что вроде хотели все упростить по сравнению со “обычным” стилем, а получилось как всегда.

СсылкаКомментировать

Время коммита

Если у вас еще остались надежда на то, что история коммитов в git хоть сколько-нибудь соответствует действительности, тогда мы идем к вам!

Переписать историю через force push или изменить авторство — пройденный этап, пора поработать над временем.

GIT_AUTHOR_DATE="2022-11-17T18:00:00 +0200" GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE git commit -m"weekly update"

Вуаля, на каком-нибудь GitHub никто и не заметит.

В этом, конечно, нет ничего удивительного — сервер максимум может знать время пуша (но git это нигде не хранит) и подтвердить вашу подлинность, если коммит подписан. У джентльменов принято верить друг другу на слово.

СсылкаКомментировать

Какие изменения принесет kubectl apply?

Если доступ к кластеру имеют несколько человек, и кто-то забыл закоммитить yaml в гит, то можно узнать кластера простым выводом в yaml, например:

kubectl get deploy --all-namespaces -o yaml  > all-deployment.yaml

Однако можно просто посмотреть на отличия манифеста, который есть в репе и того, что есть по факту на кластере:

kubectl diff -f deployment.yaml

аргументы — такие же, как у apply. Можно еще посмотреть diff в графическом редакторе:

KUBECTL_EXTERNAL_DIFF=meld kubectl diff -f deployment.yaml

К сожалению, diff может провалиться из-за того, что поменялись неизменяемые поля (labels, например). В этом случае придется получить текущее состояние, поправить поля и попробовать diff еще раз.

СсылкаКомментировать

Пять стадий принятия саги

  1. Отрицание — дергаем что надо по HTTP с ретраями.
  2. Гнев — переходим на асинхронные сообщения.
  3. Торг — Transactional Outbox решит же большую часть проблем, да?
  4. Депрессия — 100% надежность не достижима, все равно что-то может сломаться. Но сделаем хотя бы идемпотентно, чтобы ретраить было проще.
  5. Принятие — ладно, сделаем еще сагу, чтобы хотя бы следить, какие шаги сделаны в рамках процесса.

по мотивам

СсылкаКомментировать