dev notes
1.44K subscribers
6 photos
169 links
Download Telegram
выше я делился мануалом по настройке wireguard от канала "Диджитализируй", по которому и сам настроил себе vpn
у меня и всех, кому я его расшарил - отлично работает
всем, кто пользуется сторонними решениями - рекомендую
во-первых, это дешевле
во-вторых, вероятность его блокировки гораздо ниже, чем у какого-либо стороннего сервиса
ну и в-третьих, аргументы, которые описывает автор мануала:
Многие спрашивают в комментах — это вы всё выпендриваетесь, я вот поставил бесплатный VPN и всё работает у меня. Или плагин в браузер. Или платный VPN купил.

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

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

И да. Стоит сказать, что понимание ценности Open Source решений у меня сейчас поднимается на новый уровень.
Forwarded from Go & IT
⚡️ Вышел Go 1.18

Что нового: https://go.dev/doc/go1.18
постоянно обновляемый список пакетов/бандлов/софта, в котором обнаружена малварь или иные, связанные с последними событиями, вещи:

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

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

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

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

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

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

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

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

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

предприму еще одну попытку оживить тут активность, и в этот раз у меня есть, что писать
несколько недель назад я сменил работу - полностью перешел на 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 - пример структуры приложения, де-факто стандарт
на практике многое отсюда заимствуется, что-то пропускается
кто-то считает этот пример плохим и пилит свой
но ознакомится и попробовать точно стоит
в 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/
открыл для себя тулзу для интеграционного тестирования gonkey - https://github.com/lamoda/gonkey
если коротко, она позволяет поднять в пару строк моки на все внешние сервисы, в интеграции с которыми будет тестироваться приложение, описать сценарии в yaml-файлах, где можно задать нужные фикстуры и указать их порядок, описать ответы на запросы и проверить, что в итоге залетело в базу
затянул на все свои проекты, и крайне рекомендую, если ты пишешь на go
пожалуй, лучшее объяснение того, как устроены мапы в golang - это доклад Кейта Рэндалла на GopherCon 2016 - https://www.youtube.com/watch?v=Tl7mi9QmLns
Кейт работает в google, занимается райнтаймом языка и точно знает, о чем говорит

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

мапа - это структура данных, позволяющая хранить данные в формате ключ-значение
простейшая реализация мапы делается в два действия: создаем структуру полем-ключом и полем-значением, и объявляем массив этих структур
какая основная проблема такой реализации? в случае большого объема данных мы теряем в скорости: для поиска конкретного ключа нам нужно перебрать все данные
как решить? разбить данные на несколько групп
например, по алфавиту мы бы могли разбить на 4 группы:
A-F - первая, G-M - вторая, N-S - третья и T-Z - четвертая
возникает другая проблема - данные могут распределиться неравномерно
например, ключи могут быть ссылками, ссылки начинаются с http, и все данные в таком случае улетят у нас во вторую группу
в качестве решения мы можем взять хорошую hash-функцию, которая равномерно сможет распределить данные по группам
в go такие группы называются buckets
один бакет может содержать максимум 8 пар ключ-значение
в случае, если пачка данных не вмещается в один бакет (что решает hash-функция), структура может содержать указатель на дополнительный бакет

когда мы выделяем мапу через var m map[string]float64 m - это указатель
указывает m на область памяти, называемую map header
header хранит указатель на массив с бакетами, информацию о размерности мапы, информацию о количестве бакетов и другую мета-информацию
как человек, работающим с докером только в рамках докеризации небольших кусков приложений, открыл для себя крайне интересную вещь
может быть, для многих очевидную, но как показал опрос коллег - мало кто про это знает :)

unionfs - это слоистая файловая система, 1 из 4-х базовых компонентов любого контейнера
почему система называется слоистой? потому что одно действие, например через директиву RUN в Dockerfile - выполняется на одном слое, затем этому слою выдается hash, который в дальнейшем может быть переиспользован на последующих слоях

так вот докер помечает все ранее выполненные слои как read only, и каждая следующая команда не может изменить данные, оставшиеся на слое выше

иначе говоря, если мы пытаемся скачать архив, затем распаковать его, переместить файлы и удалить, и делаем это 4-мя разными командами:
RUN wget https://releases.hashicorp.com/terraform/0.12.28/terraform_0.12.28_linux_amd64.zip
RUN unzip terraform_0.12.28_linux_amd64.zip
RUN rm terraform_0.12.28_linux_amd64.zip
RUN mv terraform /usr/local/bin/


у нас ничего не получится, в таком случае 3-я команда не сможет удалить данные, а 4-ая не сможет их перенести

чтобы все сработало, нужно сделать это в одну команду:
RUN wget https://releases.hashicorp.com/terraform/0.12.28/terraform_0.12.28_linux_amd64.zip \
&& unzip terraform_0.12.28_linux_amd64.zip \
&& rm terraform_0.12.28_linux_amd64.zip \
&& mv terraform /usr/local/bin/
в очень темное время живем
светлая память Алексею Навальному
https://www.youtube.com/watch?v=wp66e-JRlj0

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

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

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

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

я уже давно собеседовал php-разработчиков на разные грейды, и около года как начал собеседовать go-разработчиков на senior и middle позиции

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

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

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

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

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

Во-первых, SQL. Каждый раз, когда мне нужно написать запрос, будь то запрос на создание таблицы, запрос на select/insert/update, или мне нужно создать индекс - я копирую запрос, копирую структуру таблиц и кидаю в ChatGPT с вопросом "what can be improved in this query". Например, недавно я закинул запрос на создание таблицы в PostgreSQL, где была стандартная история с расширением для UUID:

create extension if not exists "uuid-ossp";
create table if not exists table (
id uuid primary key default uuid_generate_v4(),
...

И помимо всего прочего, ChatGPT посоветовал использовать не uuid-ossp, а pgcrypto, ссылаясь на документацию. Погуглив, я и правда нашел такой совет от разработчиков - https://www.postgresql.org/docs/10/uuid-ossp.html#idm46428633607040. И как правило, таких примеров - очень много. Помимо типов, GPT подсказывает, какие лучше использовать индексы, как лучше назвать поля и как переписать запрос, чтобы он быстрее работал.

Второй кейс - нейминг. Конечно, переменная, модуль или даже проект будут работать, как ты их не назови, но не зря про то, как лучше называть переменные написано много книг. Просто попробуй закинуть в GPT немного контекста и свое название, и 99%, что он подберет название лучше.

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

if !(!(price <= discount) && !((!(!(quantity >= maxLimit)) || !!(minOrderValue > 100)) && !(price*quantity-discount <= 200))) {
...
}

Кидаем ее в ChatGPT и просим кратко описать, что тут происходит. Даже в случае общения на русском, ответ получился таким:

Таким образом, условие !(!(price <= discount) && !((!(!(quantity >= maxLimit)) || !!(minOrderValue > 100)) && !(price*quantity-discount <= 200))) можно переформулировать так:

Условие выполнено, если цена товара больше скидки, и либо количество товара меньше максимального лимита, либо минимальная стоимость заказа больше 100, и при этом общая стоимость товара (цена умноженная на количество) минус скидка больше 200.

Все еще неприятно, но уже сильно-сильно проще.

Четвертый кейс - переформулировать или сформулировать. На текущей работе мне приходится много писать на английском, а английский у меня далеко не advanced. Как GPT с этим помогает:
* Сначала я прошу его исправить ошибки и опечатки - тут GPT заменяет Grammarly и любые его аналоги.
* Затем копирую что получилось, прошу упростить и перефразировать (более официально, менее официально, опционально можно накинуть любого контекста).
* Уже на этом этапе скорее всего получится сильно лучше, чем было.
* Если результат не устраивает - повторяем алгоритм.

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

Есть еще множество примеров, с которыми GPT отлично справляется, например, составление регулярок, написание тестов или в целом помощь с тем, чтобы найти ошибку, которую ты найти не можешь. Единственный минус - вызывает привыкание, так что тут нужно не разучиться думать самому 🙂
написал большой и подробный ман о том, как с нуля настроить neovim и зачем в 2024 году это нужно
постарался описать все то, чего не хватало мне, когда я погружался в эту тему
https://poltora.dev/neovim-for-developers/
го читать