junsenior | Unsorted

Telegram-канал junsenior - dev notes

1385

Subscribe to a channel

dev notes

ну чтож, дубль 2
постом выше я собирался восстановить тут активность, но случилась мобилизация
активность, конечно, восстановилась, но не в канале :)

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

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

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

в ближайшие пару недель буду делиться интересным из курса по concurrency: https://www.udemy.com/course/concurrency-in-go-golang
в целом большинство тем мне знакомы, многое пропускаю, но вот раздел про планировщик go прошел с большим интересом

в golang есть такая интересная вещь, как netpoller - это пакет, который позволяет преобразовать асинхронный ввод/вывод в блокирующий
зачем это нужно?
golang заточен работать под блокирующие вызовы
например, происходит синхронное чтение из файла, горутина блокируется и ждет, пока чтение завершится
планировщик, через 10 мс выбрасывает ее вниз очереди ожидания, и берет в работу другую горутину
с синхронными вызовами все просто и понятно
а что если вызов асинхронный? в go поступили просто - умеем работать с синхронными? значит сделаем из асинхронного синхронный :)
тут в дело вступает netpoller - компонент рантайма, который умеет блокировать горутину, при этом не блокируя текущий поток выполнения
текущий поток выполнения берет в работу новую горутину из очереди, а netpoller тем временем подписывается на API операционной системы, которое работает с асинхронными вызовами
как только API выбросит событие, что ответ получен - netpoller разбудит горутину и сообщит планировщику, что ей нужно выделить процессорное время
после чего планировщик заберет горутину в один из потоков и возьмет ее на выполнение

второй интересный момент из модуля про планировщик - asynchronous preempation
это механизм, добавленный в go 1.14, позволяющий вытеснить горутину, работающую дольше 10 мс, и дать возможность поработать другим горутинам из локальной очереди
да, до версии 1.14 в случае, если мы работали на одном ядре и запускали там горутину с бесконечным циклом - поток блокировался до явного вызова runtime.Gosched()
более подробно, если тебе интересно, про это можно почитать тут - https://habr.com/ru/post/502506/

Читать полностью…

dev notes

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

Немного скажу про то, что я тут пилил пару недель назад в режиме лайвкодинга.
Зрителей было немного, но основная идея - приложение, которое будет отслеживать реальный уровень инфляции. Источников, которые показывали бы всё кристально чисто - я не нашёл.
Смысл такой: каждый день через определённые интервалы времени я набираю одну и ту же продуктовую корзину, и смотрю, насколько изменилась цена за предыдущий день.
Раз в неделю смотрю, как изменилась за неделю.
И раз в месяц финалим стату за 30 дней.
Собственно, софтина готова, кроме ротации проксей, небольшого количества асинхронщины и интеграции с парой крутых либ - особо интересного там ничего нет, поэтому код пока открывать смысла не вижу.
Изначально идея была настроить автопостинг этого в твиттер, но переписка с dev-саппортом твиттера затягивается, поэтому на днях сделаю автопостинг этого в отдельный канал в telegram. Вероятно, кому-то будет интересно посмотреть, что происходит с ценами, и насколько больше/меньше сегодня нужно будет заплатить, чем вчера.
Затем, если будут заинтересованные, может провести несколько сессий по рефакторингу в режиме лайв-кодинга: есть идея прикрутить дженерики, добавить больше асинхронщины и в целом привести всё к божескому виду.

Читать полностью…

dev notes

Кому нужна международная Visa карта для оплаты сервисов - @Bankoff_Bo_Bot работает. Карта выдается в телеграм боте, чтоооо вообще происходит:) Пополнение через крипту USDT (её TRX или BEP20 вариант, не ETH) — видос о том, как купить крипту, был на канале. На бинансе было бы дешевле, но я брал на kassa.cc.

Пополнение этой карты с крипты долгое, до 72 часов. Много людей к ним повалило и они зашиваются, там похоже команда вся 4 офигевших от своего счастья человека:).

Но я вчера пополнил, сегодня дошли. Оплатил снова Ютуб премиум, чтобы видосы слушать можно было на телефоне, свернув программу. Работает.

Только ребят, дисклеймер — я ответственности никакой не несу за этот банкофф и никого не призываю туда слать крипту. Просто рассказал о своём опыте, он положительный.

Читать полностью…

dev notes

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

ничего сложного, проект на пару-тройку вечеров, писаться всё будет без подготовки, просто кодим в реал-тайме
если интересно - плюсуй

Читать полностью…

dev notes

⚡️ Вышел Go 1.18

Что нового: https://go.dev/doc/go1.18

Читать полностью…

dev notes

выше я делился мануалом по настройке wireguard от канала "Диджитализируй", по которому и сам настроил себе vpn
у меня и всех, кому я его расшарил - отлично работает
всем, кто пользуется сторонними решениями - рекомендую
во-первых, это дешевле
во-вторых, вероятность его блокировки гораздо ниже, чем у какого-либо стороннего сервиса
ну и в-третьих, аргументы, которые описывает автор мануала:

Читать полностью…

dev notes

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

Поэтому, всем, кто ещё не подготовился, вероятно, стоит это сделать:
https://telegra.ph/CHto-delat-pri-otklyuchenii-interneta-02-27?utm_source=tg&utm_medium=novaya&utm_campaign=chto-delat-v-sluchae-polnogo-otklyucheniya

Читать полностью…

dev notes

Настроим в этом видео WireGuard VPN. Это легко конфигурируемый, быстро работающий и нетребовательный к ресурсам VPN, работающий — внезапно — лучше тех платных VPN сервисов, которые я за прошедшие дни пробовал. Помимо доступа к ресурсам, которые перестали работать — а сейчас могут не открываться даже сайты заказа лекарств, WireGuard это безопасный интернет за счёт шифрования трафика, а также возможность объединять несколько компьютеров в одну сеть с доступом откуда угодно. И самый сок — всё настраивается куда проще, чем в случае с OpenVPN, конфиги в несколько понятных строк. Будем поднимать!

https://www.youtube.com/watch?v=5Aql0V-ta8A

Читать полностью…

dev notes

https://github.blog/2022-02-17-code-scanning-finds-vulnerabilities-using-machine-learning/

GitHub объявил о добавлении в сервис Code scanning экспериментальной системы машинного обучения для выявления распространённых типов язвимостей в коде. На этапе тестирования новая функциональность пока доступна только для репозиториев с кодом на языках JavaScript и TypeScript. Отмечается, что применение системы машинного обучения позволило заметно расширить спектр выявляемых проблем, при анализе которых система теперь не ограничивается проверкой типовых шаблонов и не привязывается к известным фреймворкам. Из выявляемых новой системой проблем упоминаются ошибки, приводящие к межсайтовому скриптингу (XSS), искажению файловых путей (например, через указание "/.."), подстановке SQL- и NoSQL-запросов.

Сервис Code scanning позволяет выявлять уязвимости на ранней стадии разработки через сканирование каждой операции "git push" на предмет потенциальных проблем. Результат прикрепляется непосредственно к pull-запросу. Ранее проверка осуществлялась с использованием движка CodeQL, анализирующего шаблоны с типовыми примерами уязвимого кода (CodeQL позволяет сформировать шаблон уязвимого кода для выявления наличия подобной уязвимости в коде других проектов). Новый движок, использующий машинное обучение, может определять ранее не известные уязвимости так как он не привязан к перебору шаблонов кода, описывающих конкретные уязвимости. Ценой подобной возможности является увеличение числа ложных срабатываний по сравнению с проверками на основе CodeQL. (https://www.opennet.ru/opennews/art.shtml?num=56719)

Читать полностью…

dev notes

мне очень нравится идея тайловых оконных менеджеров, например - i3
концепция простая: легковесный, управляемый комбинациями (запомнить нужно всего несколько), позволяющий размещать окна так, как нужно тебе и очень кастомизируемый
очень - это, например, вот так - https://www.reddit.com/r/unixporn/comments/j3mfc6/i3gaps_ready_for_fall/

arch linux + i3 занимают, суммарно, около 500 метров в памяти
настраивать их, правда, около 500 лет)

Читать полностью…

dev notes

без отладчика в принципе невозможно эффективно работать

/channel/HowToGoWrong/126

Читать полностью…

dev notes

Доделал конфиг по nvim - https://github.com/itxor/new-nvim-config, осталось докинуть туда инструкцию по сборке и настроить отладчик, и можно забыть про vs code. От Goland я давно уже отказался - чего-то особенного он не даёт, вся работа с кодом воспроизводилась и в vs code, + у меня есть старый ноут, где иногда приходится пописать на гошке, а запускать jetbrains IDE там подобно смерти.

Что касается PHP - сейчас я пишу на нём всё меньше, и в скором времени, надеюсь, перейду на go полностью. Поэтому, на настройку nvim-конфигов для PHP я забил и продолжаю с ним работать в PHPStorm с включенным vim-плагином.

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

Если коротко: есть такая штука как https://tree-sitter.github.io/tree-sitter/ - это синтаксический анализатор, строящий из открытого файла с исходным кодом полноценное синтаксическое дерево, и обновляющий его по мере редактирования самого файла. Есть его адаптер под nvim: https://github.com/nvim-treesitter/nvim-treesitter. Один только этот плагин позволяет парой команд установить поддержку ЯП (весь список поддерживаемых - https://github.com/nvim-treesitter/nvim-treesitter#supported-languages) и даёт нормальный и быстрый фолдинг (возможность сворачивать и разворачивать блоки кода).

Второй обязательный плагин - nvim-lspconfig (https://github.com/neovim/nvim-lspconfig). Мне очень нравится его идея: плагин имеет адаптеры к lsp-серверам языков, с которыми работают коммерческие редакторы и IDE, и позволяет подтягивать их к nvim. Это даёт 90% всех плюшек по работе с кодом: go-to-definition, поиск ссылок, умеет показывать, какой интерфейс реализует структура, даёт возможность массового переименования, рефакторинга, и ещё много приятных вещей.

Что lspconfig не даёт и что нужно поставить отдельно - это автокомплит. Для этого есть https://github.com/hrsh7th/nvim-cmp.
Ну и так как я привык к double-shift в jetbrains ide, то я ставлю ещё telescope (https://github.com/nvim-telescope/telescope.nvim) - по заданной комбинации он открывает модалку, где можно искать полнотекстовым поиском по названию файлов, по содержимому файлов и в целом по всему контенту, что есть в проекте. Лично я именно для этого юзал double-shift в jb ide.

В остальном - интерфейсные плюшки, вроде тем, статус-бара снизу, дерева файлов слева и подсветки в коде коммита и его автора. За подробностями - го в репу. Если будут вопросы или решишь поставить этот пак себе - смело пиши, с радостью отвечу :)

Читать полностью…

dev notes

Как фанат vim - я часто и много кастомизирую консоль, и ещё больше с ней работаю. И вот, перейдя с terminator обратно на gnome-консоль, в процессе кастомизации нашёл клёвый пак тем для стандартного терминала: https://mayccoll.github.io/Gogh/

Выполняем bash -c "$(wget -qO- https://git.io/vQgMr)", затем выбираем опцией тему (вся цветовая палитра - по первой ссылке), и тема загружается как кастомный профиль. Автору - респект за продуманный интерфейс.

Читать полностью…

dev notes

В прошлом году у меня чуть не угнали аккаунт на одном известном гос. сайте (причем, не по моей вине). Пока я слушал оправдания саппорта о том, что им очень жаль, решил пересмотреть подход к менеджменту паролей.
В процессе открыл для себя pass - консольную утилиту с открытым исходным кодом, предоставляющую минималистичный интерфейс для полноценного менеджмента паролей.
Алгоритм работы простой: создаём GPG-пару ключей, сохраняем, затем с помощью pass init инициализируем на устройстве менеджер. В корне появится дирректория .password-store, которую можно залить как приватную репу куда-нибудь в self-hosted репозиторий.
Если кто-то получит доступ к репозиторию - без ключа никакой информации оттуда не вытянуть. Ключ нужно сохранить (и желательно в нескольких копиях) на внешнем носителе, а носитель закопать под известным только тебе деревом :)
Лично для меня в pass есть несколько вещей, выделяющих его среди аналогов: открытый исходный код, linux-way интерфейс, и реализация под все платформы. Список портов есть на официальном сайте в разделе "Compatible Clients", там же вся инфа по установке и настройке

Даёшь opensource в массы 🤙

https://www.passwordstore.org/

Читать полностью…

dev notes

Коротко о том, почему no-code/low-code системы ещё долго не смогут заменить обычную разработку

Читать полностью…

dev notes

в очередной раз все пошло не по плану :)
план, собственно, был описан выше

предприму еще одну попытку оживить тут активность, и в этот раз у меня есть, что писать
несколько недель назад я сменил работу - полностью перешел на golang и теперь пишу только на нем
сейчас вкатываюсь в процессы, смотрю как тут решаются разные задачи и радуюсь красоте этого языка :)

параллельно решил добить все-таки курс от бывшего mail.ru group на coursera, последний раз я остановился на том, что решил легендарную вторую домашку и дальше забил
курс оплачен, отображается (кстати, надолго ли? или coursera решила все-таки оставить уже начатые курсы?), и надеюсь его получится завершить

пока в планах описывать разное полезное с работы касательно go, архитектуры и процессов
собственно, далеко ходить не буду и отвечу на вопросы, которым я задавался когда менял стек: насколько сильно обычная backend-разработка на go отличается от разработки на php, как отличается реальная структура проекта от описанной в golang-layout, как отличаются паттерны описания сервисов и репозиториев от тех, что можно найти в разных статьях на medium и видосах на youtube?

ответ: почти не отличаются
те примеры, что видел я и базовую структуру которых повторял в своих проектах оказались очень похожими на правду, за исключением некоторых субъективных моментов

так что всем страждущим и желающим перейти на go могу однозначно посоветовать следующие ресурсы:
https://www.youtube.com/c/TheArtofDevelopment - хорошие построения базовой структуры rest-приложения, примеры построения ddd-архитектуры и в целом большое количество видосов и автор, умеющий объяснить

https://www.youtube.com/c/MaksimZhashkevych - примеры построения приложений, выделения структуры сервисов, репозиториев и интеграции всего этого вместе

https://github.com/golang-standards/project-layout - пример структуры приложения, де-факто стандарт
на практике многое отсюда заимствуется, что-то пропускается
кто-то считает этот пример плохим и пилит свой
но ознакомится и попробовать точно стоит

Читать полностью…

dev notes

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

Читать полностью…

dev notes

всем аллоха :)
сегодня будет лайвкодинг, без подготовки, в режиме реальной разработки: с гуглом и туплением, в общем всё, как обычно :)
цели на сегодня:
- написать несколько парсеров с интеграцией с какой-нибудь субд, скорее всего это будет что-то документоориентированное, и скорее всего - монга, но может и её аналоги
- поднять веб-сервер, написать несколько ручек, которые будут выводить данные, собранные парсерами
- если всё пройдёт относительно быстро (1.5-2 часа), то порефачить всё написанное и прикрутить к парсерам многопоточную работу; если всё пройдёт не быстро, то сделаю это либо на 2-ом стриме, либо за кадром

вчера протестировал трансляции в телеге, и, как оказалось, до трансляций в хорошем качестве тут ещё очень далеко, поэтому стримить буду на твиче

кому интересно включить что-то фоном - ссылка будет в канале в 18-19 по мск

Читать полностью…

dev notes

постоянно обновляемый список пакетов/бандлов/софта, в котором обнаружена малварь или иные, связанные с последними событиями, вещи:

https://docs.google.com/spreadsheets/d/1H3xPB4PgWeFcHjZ7NOPtrcya_Ua4jUolWm-7z9-jSpQ/htmlview?usp=sharing&pru=AAABf7rAbC0*P8SbG5KHN5WLt2JJJhoK-Q

проверьте свои зависимости
возможно, имеет смысл сейчас жёстко из зафиксировать

Читать полностью…

dev notes

Многие спрашивают в комментах — это вы всё выпендриваетесь, я вот поставил бесплатный VPN и всё работает у меня. Или плагин в браузер. Или платный VPN купил.

Тем временем РКН заблокировал уже 20 VPN сервисов:) Что произойдёт, когда ваш бесплатный или платный — чужой — сервис просто перестанет работать? Или будет работать, но без нужных вам сайтов? Ну, можно будет искать очередной и ждать, пока заблокируют его.

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

И да. Стоит сказать, что понимание ценности Open Source решений у меня сейчас поднимается на новый уровень.

Читать полностью…

dev notes

отличный и как никогда актуальный тред о том, как привязать себя к валюте и найти работу за бугром: https://twitter.com/M0rtyMerr/status/1502230397245087747?s=20&t=Spg7Jh3hZUJZlTlG_Qnv_w

Читать полностью…

dev notes

Текстовая инструкция по настройке Wireguard к видео.

Обновляем сервер:

apt update && apt upgrade -y


Ставим wireguard:
apt install -y wireguard


Генерим ключи сервера:
wg genkey | tee /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey


Проставляем права на приватный ключ:
chmod 600 /etc/wireguard/privatekey


Создаём конфиг сервера:
vim /etc/wireguard/wg0.conf


[Interface]
PrivateKey = <privatekey>
Address = 10.0.0.1/24
ListenPort = 51830
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE


Вставляем вместо <privatekey> содержимое файла /etc/wireguard/privatekey

Настраиваем IP форвардинг:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p


Включаем systemd демон с wireguard:
systemctl enable wg-quick@wg0.service
systemctl start wg-quick@wg0.service
systemctl status wg-quick@wg0.service


Создаём ключи клиента:
wg genkey | tee /etc/wireguard/goloburdin_privatekey | wg pubkey | tee /etc/wireguard/goloburdin_publickey


Добавляем в конфиг сервера клиента:
vim /etc/wireguard/wg0.conf


[Peer]
PublicKey = <goloburdin_publickey>
AllowedIPs = 10.0.0.2/32


Вместо <goloburdin_publickey> — заменяем на содержимое файла /etc/wireguard/goloburdin_publickey

Перезагружаем systemd сервис с wireguard:
systemctl restart wg-quick@wg0
systemctl status wg-quick@wg0


На локальной машине (например, на ноутбуке) создаём текстовый файл с конфигом клиента:

vim goloburdin_wb.conf


[Interface]
PrivateKey = <CLIENT-PRIVATE-KEY>
Address = 10.0.0.2/32
DNS = 8.8.8.8

[Peer]
PublicKey = <SERVER-PUBKEY>
Endpoint = <SERVER-IP>:51830
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20


Здесь <CLIENT-PRIVATE-KEY> заменяем на приватный ключ клиента, то есть содержимое файла /etc/wireguard/goloburdin_privatekey на сервере. <SERVER-PUBKEY> заменяем на публичный ключ сервера, то есть на содержимое файла /etc/wireguard/publickey на сервере. <SERVER-IP> заменяем на IP сервера.

Этот файл открываем в Wireguard клиенте (есть для всех операционных систем, в том числе мобильных) — и жмем в клиенте кнопку подключения.

Читать полностью…

dev notes

Нашёл огненную статью по профилированию и отладке go-программ: https://habr.com/ru/company/badoo/blog/301990/

Огромный массив информации про инструменты и методы, позволяющие найти в программе места, где плохо памяти, процессору, или где не стоит пересобирать регулярку в цикле :)
После прочтения понимаешь, что авторы языка сумели сделать не просто много инструментов для профилирования кода, они сумели ещё и сделать их крайне удобными.
А автор статьи сумел показать на примерах, как эти инструменты использовать.

Читать полностью…

dev notes

есть один прекрасный курс по go - https://www.coursera.org/learn/golang-webservices-1, с одним широко известным заданием, вокруг которого ходят легенды
задание сводится к реализации аналога линуксового пайплайна:
grep 127.0.0.1 | awk '{print $2}' | sort | uniq -c | sort -nr
и решается весьма интересно :) автор составил его таким образом, что не вкурив весь материал и не посмотрев все ссылки из раздела с допами - задание не решить
у меня было 2 подхода: 1-ый провальный, второй вылился в 2 дня страданий, чтение всех ссылок из доп. материалов, и, по-итогу, оно живое :)

если хочешь проникнуться асинхронщиной - мой настоятельный рекомендасьён
курс можно пройти бесплатно (бесплатно нельзя отправить задание на проверку, но, если тебе не нужен сертификат, оно и не нужно)

Читать полностью…

dev notes

Контекст в golang - крайне полезная штука.
У него есть 2 основных назначения: передача параметров в нижевызываемые методы, и возможность сигнализировать всем, кто использует какие-либо ресурсы, что их пора освобождать - мы завершаемся. Называется этот процесс graceful shutdown.

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

Где-то я увидел ссылку на вот эту статью - https://golangbyexample.com/using-context-in-golang-complete-guide/, где автор утверждал, что тут пакет context описан лучше, чем в официальном руководстве и других гайдах. И, я с автором согласен, описание отличное.

Из русскоязычных материалов более-менее практический пример показан в этом ролике: https://www.youtube.com/watch?v=cbP1ShYndHg. Автор показывает и применение контекста, и связку его с gs, и не совсем очевидный пример блокировки, когда всё может пойти не по плану.

Пытаясь структурировать информацию, посмотрел ещё доклад от badoo про graceful shutdown и его косяки при интеграции с кубером - https://www.youtube.com/watch?v=me5iyiheOC8, тут показан интересный пример работы с пакетом errgroup, для более простой обработки ошибок и более лаконичного кода.

Читать полностью…

dev notes

Начал идти по https://seanprashad.com/leetcode-patterns/, отрешиваю по паре задач в день. Кто не знает - это список алгосов, которые дают большие ребята на своих собесах. Отсюда же стягивают алгосы ребята поменьше с нашего православного рынка, которые любят поиграть в больших)
Пока easy уровень, идёт неплохо. Но, без базы универа, кажется, изи не был бы изи, всё-таки развернуть связный список сходу, не понимая как оно работает, не совсем простая задача :)
Уже в предвкушении того, что будет на hard :)
Как относишься к алгосикам? Зло или не зло? Пригождались?)

Читать полностью…

dev notes

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

https://github.blog/2022-02-02-new-sponsors-only-repositories-custom-amounts-and-more/

Читать полностью…

dev notes

То, чем я буду сегодня заниматься - https://github.com/akutz/go-generics-the-hard-way
Практический пошаговый подход к пониманию работы дженериков в go. Кажется, топ

Читать полностью…

dev notes

Начал покрывать тестами один старый проект на Symfony. В процессе настройки тестовой базы выяснилось, что часть миграций удалена, и создать схему только лишь миграциями - невозможно. Соответственно, использовать фикстуры в их стандартном флоу (пересоздал схему, накатил фикстуры) - тоже невозможно, а использовать их очень хочется.
В процессе поиска решения и разбора документации открыл два малоизвестных, но отличных бандла:
https://github.com/liip/LiipTestFixturesBundle и https://github.com/dmaicher/doctrine-test-bundle
Первый позволяет накатить фикстуры внутри теста, а второй автоматически оборачивает все запросы к базе в транзакцию, и после завершения теста откатывает её, оставляя базу в первозданном виде. Тем самым освобождая разработчика от необходимости пересоздавать схему. Огонь!

Читать полностью…

dev notes

10-ая глава "Golang для профи" - продолжение темы асинхронщины, но уже более сложной. Постарался простым языком законспектировать основные тезисы подраздела о работе планировщика, велкоме.

Планировщик go - модуль, управляющий горутинами. Его задача - запустить горутину, обеспечить ей комфортную жизнь, а затем убить её.

Планировщик использует несколько стратегий работы.
Первая - стратегия справедливого планирования: максимально равномерно размазать все задачи по всем процессорам. В теории стратегия звучит хорошо, на практике - горутины часто связаны друг с другом, из-за чего на один процессор из-за связности может улететь больше горутин, чем на другой, и справедливостью уже не пахнет.

Вторая - стратегия перехвата работы, спешит на помощь первой. Находим недостаточно загруженный процессор, и начинаем кидать на него все доступные задачи, пока ему не станет плохо. Когда всем процессорам плохо в равной мере - стратегия считает, что она выполнена успешно. Доступные задачи, которые можно кинуть на процессор - могут быть забраны у других процессоров, даже если они ранее на них уже начали выполняться. Если ты ничего не понял, но тебе очень интересно, этот момент круто объяснялся в курсе по Go на stepik от mail.ru. Рекламить не буду, кому нужно - сам найдёт :)

В go есть ещё одна интересная штука с непонятным названием: алгоритм планирования m:n. Внесём ясность: m - количество горутин, которые можно выполнить одновременно, а n - количество потоков (про потоки, процессы и горутины было в предыдущем конспекте, если не читал - рекомендую: /channel/junsenior/224). Этот алгоритм подразумевает, что есть глобальная очередь горутин: создали горутину, она улетела в очередь, а затем процессоры начинают определять, кто будет с ней работать.
Помимо глобальной очереди, доступной всем процессорам, есть ещё локальные очереди внутри каждого логического процессора. Из глобальной очереди горутины переезжают в локальные очереди, а затем начинают выполняться.

На картинке ниже P - логический процессор, М - поток операционной системы, а G - горутина. Это сжатое, но основное представление того, как устроен жизненный цикл работы горутин.

Читать полностью…
Subscribe to a channel