Путь Golang
411 subscribers
16 photos
2 files
37 links
Всё о Golang

Ресурсы и материалы: https://t.iss.one/waygolang/12

Кроме чата, Golang обсудить можно тут: https://t.iss.one/gogolang
Download Telegram
В go 1.18 новое поведение append. Ну как новое. Немного изменен алгоритм расчета. Сомневаюсь, что большинство из вас и старый знало (я в таких деталях не знал). Любое, даже маленькое изменение, очень важно само по себе. Но некоторые детали интересны в основном только для общего развития:
https://habr.com/ru/post/660827/
Сижу, готовлю пост о Go 1.19 (я не тормоз, да), слушаю позапрошлый выпуск Go Time https://changelog.com/gotime/240 . Там некто Карл Джонсон https://carlmjohnson.net/ внезапно токает телегу про то, как он контрибьютит в GO. Собственно он говорит, что просто иногда садится, ищет какой-нибудь интересный для себя issue на github и просто пишет код на эту тему. Например, у него была маленькая библиотека для HTTP-запросов, и он внезапно видит issue от какого-то китайца с предложением функции URL.joinpath. Потом они обмениваются комментариями, потом кодом, и — ву-а-ля — функция готова! И дальше Карл пишет, что на Reddit часто люди спрашивают: "Как я могу начать контрибьютить? Какой есть хороший проект?" И Карл отвечает, что GO — хороший проект для этого. И что вот тот же URL.joinpath — это пара строчек кода и не надо быть гением.

И ведь это правда. Сколько в чатах вопросов — где можно постажироваться, какой есть проект для этого? GO — хороший ведь проект. Идите в issue и дерзайте!!
#go #git #windows #ssh Часть I. Так получилось, что на работе мы используем Windows. Мне для одного проекта потребовалось использовать пакеты из приватных репозиториев. И из шкафа посыпались скелеты.

☝️ Современный GO умеет работать с Git, Subversion, Mercurial, Bazaar, и Fossil [1], но я рассматриваю только Git.

👉 Отмечу одну важную деталь: go mod ... и go get ... «ходят» не напрямую в ваш репозиторий, а через прокси, контролируемый значением переменной GOPROXY. Посмотрите, что говорит go env [2]. GO не просто пользуется прокси, а сверяет с базой контрольных сумм из переменной GOSUMDB. Переменные GONOPROXY и GONOSUMDB указывают, для каких путей импорта не будет использоваться прокси и/или база сумм. Переменная GOPRIVATE перечисляет пути импорта, для которых не будут использоваться ни прокси, ни суммы. Работу с приватными репозиториями следует начинать с настройки GOPRIVATE, ключ -w запишет переменную:
go env -w GOPRIVATE="git.mysecret.com/myrepo,git.supersecret.com"

🌧 Подвох кроется в том, что GO подавляет ввод пароля при работе с git. Что-то с этим придется делать.

🍏 Первый способ заключается в сохранении логина и пароля через настройку конфигурации [3]:
git config credential.helper store
или
git config credential.helper cache
Затем надо «поработать» с нужными приватным репозиториями напрямую командами git, чтобы он запросил, а затем запомнил логин/пароль:
git clone или git pull или git push
В случае store git запомнит логин/пароль в файл, в случае cache — временно в память. Строго говоря, там довольно гибкая система этих credentials, можете почитать для себя. Это работает для доступа по https (умолчание). Можно сразу задать пользователя:
git config credential.https://example.com.username myusername
Ещё один способ — указать git переписывать URL [4]:
git config --global url."https://api:$[email protected]/".insteadOf "https://github.com/"

🍐 Но что, если требуется использовать SSH (например, используется gitolite) и соответственно с ключами SSH? ...

Продолжение дальше...

[1]
https://go.dev/ref/mod
[2] https://proxy.golang.org/
[3] https://git-scm.com/docs/gitcredentials
[4] https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf
#go #git #windows #ssh Часть II. Так получилось, что на работе мы используем Windows. Мне для одного проекта потребовалось использовать пакеты из приватных репозиториев. И из шкафа посыпались скелеты.

... продолжение

🍐 Но что, если требуется использовать SSH (например, используется gitolite) и соотвественно с ключами SSH? Используем перенаправление:
git config --global url."ssh://[email protected]/".insteadOf "https://examples.com/"
Это заставит git использовать протокол SSH для выбранного URL.

🌶 Если ключ SSH можно хранить прямо на машине, то всё относительно просто. А вот если на ключе SSH должен стоять пароль, то начинаются вопросы. Нам требуется ssh-agent

На современных Windows 10 и 11 прямо в поставке идёт Windows-порт OpenSSH [5], его из коробки видит Git для Windows. Всё будет работать само. Кроме ssh-agent. После выполнения в PowerShell этих простых команд, в Windows появится сервис ssh-agent, который будет запускаться автоматически при перезагрузке компьютера [6][7]:
Get-Service -Name sshd | Set-Service -StartupType Automatic
Start-Service sshd
Командой ssh-add можно добавить ключи в агента. Никаких переменных окружения не надо настраивать. Современный агент работает через именованный канал (named pipe) [8]. Переменная SSH_AUTH_SOCK не используется ssh-agent в Windows.

В Windows OpenSSH ssh-agent запоминает добавленные ключи в реестр Windows, откуда считывает их при перезагрузке.Эти ключи может использовать только тот пользователь, который их добавил. Но если у пользователя Windows нет пароля, то ключ оказывается доступен для всех [9], и придется каждый раз удалять его через ssh-agent -d или ssh-agent -D

☣️ Этим недостатком не обладает старый добрый PuTTY. Можно настроить его.

☝️ Стандартная поставка Git для Windows включает команды start-ssh-agent.cmd и start-putty-agent.cmd. Представляют исторический интерес.

🏆 В современном Windows есть подсистема WSL2 (Windows Subsystem for Linux), и можно пользоваться ею. Ставим Windows Terminal (предупреждаю, без него без слез невозможно работать в Linux-консоли), инициализируем WSL2 [10] и просто работаем. Там и агент сразу запустится. С WSL2 умеют работать и vim, и VSCode [11] и GoLand [12]. Смотрите, для VSCode достаточно набрать code . внутри вашего воркспейса в WSL!

🛠 Важно! И PowerShell, и WSL2, и OpenSSH — это часть поставки Windows. Они просто есть. Windows Terminal является родной программой Microsoft, но в Windows 10 его придется через «Приложения Microsoft», а в Windows 11 он идет в поставке системы.

[5] https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse
[6] https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
[7] https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-service
[8] https://github.com/PowerShell/Win32-OpenSSH/issues/1136
[9] https://github.com/PowerShell/Win32-OpenSSH/issues/1487
[10] https://docs.microsoft.com/en-us/windows/wsl/install
[11] https://code.visualstudio.com/docs/remote/wsl
[12] https://www.jetbrains.com/help/go/2022.1/how-to-use-wsl-development-environment-in-product.html
#go #rnotes #release Go версии 1.19 вышел конечно несколько недель назад, но я всё же хочу на него обратить внимание:
https://go.dev/doc/go1.19

🤷‍♂️ В дженериках внезапно ничего нового не произошло

👍 Произошло знаковое событие — у Go наконец-то появилась описанная модель памяти. Что это? Это формализация поведения Go при конкурентной работе с переменными. Большинство статей про версию 1.19 делают акцент на этом и разбирают, что именно там внутри. Однако, в самом документе написано примерно следующее: «Если Вам необходимо прочитать этот документ — Вы слишком умный. Не будьте умным»
https://go.dev/ref/mem

📃 Go doc теперь умеет работать с простенькой разметкой. Т.е. можно делать заголовки, параграфы, внешние и внутренние ссылки, нумерованные и ненумерованные списки, и даже блоки кода. И go fmt умеет это проверять
https://go.dev/doc/comment

• Новый тег сборки //go:build unix, включающая в себя aix, android, darwin, dragonfly, freebsd, hurd, illumos, ios, linux, netbsd, openbsd, solaris

• Реализован soft memory limit — GC будет пытаться его соблюсти. Также теперь запускается несколько маленьких GC, вместо одного большого
https://go.dev/doc/gc-guide

‼️ Для новых горутин начальный размер стека теперь задается на основе статистики использования стека горутинами. Это к слову о пулах горутин

• На UNIX-системах RLIMIT_NOFILE теперь выставляется автоматом в максимально возможное значение при импорта пакета os

• Увеличена производительность конструкции switch за счет jump tables

В sync/atomic новые типы Bool, Int32, Int64, Uint32, Uint64, Uintptr, Pointer. Причем Pointer использует дженерики (первое использование в стандартной библиотеке), чтобы избежать конвертации в/из unsafe.Pointer

‼️ crypto/rand теперь сам не буферирует чтение. Обратите на это внимание

‼️ В принципе много мелких, но чувствительных изменений в crypto/*

Подарок всем, кто работает с разным IoT и бинарными данными. И fmt, и encoding/binary теперь оснащены функциями семейства Append*. Например можно сделать fmt.Appendf(buf, "%s", "карамба") или binary.BigEndian.AppendUint16(buf, modbusReg), прощай танцы вокруг bytes.Buffer

flag обзавелся функцией TextVar упрощающий задание типизированных данных в строках, типа IP-адреса, времени и так далее

• Результаты io.NopCloser и io.MultiReader теперь реализуют метод WriteTo

• В net/http теперь можно задаваемые пользователем коды 1xx в ResponseWriter.WriteHeader

В net/http появилась функция MaxBytesReader, обратите на неё внимание, так как сильно упрощает жизнь

• Любителям подуть щёки знанием алгоритмов сортировок — в sort он изменился

👍 В`time` Duration теперь умеет Abs. Очень полезно для проверки попадания в отрезок времени +-
#go #guide #google Google выпустил руководство по стилю написания кода на Golang. В Google:
https://google.github.io/styleguide/go/index

👉 Это три документа: общее руководство по стилю, расширенное руководство по каким-то конкретным темам и практики.

👉 Да, есть мнение, что это руководство «нормально делай — нормально будет» (c) Подольский. Документ действительно максимально насыщен и лаконичен. Выжимки делать трудно. Однако, почему-то заметное большинство коллег нормально не делает. А монструозное руководство с разжевыванием от Uber даже я не осилил: https://github.com/uber-go/guide/blob/master/style.md

☝️ Основные принципы стиля:
Читаемость. Это ПЕРВОЕ правило стиля
Простота
Лаконичность
Поддерживаемость
Согласованность

Читаемость. Код должен быть ясен для любого читающего. Два аспекта:
- Что код на самом деле делает?
• задавайте смысловые имена переменным;
• добавляйте дополнительные комментарии;
• разбивайте пробелами код и комментарии;
• раскладывайте код по разным функциям для модульности.
- Почему код делает то, что должен? Общий смысл в том, что понимание кода должно быть по мере чтения.
Приведен интересный на мой взгляд пример — функция strings.Cut, которая состоит из 4-ёх строк кода, но повышает в разы читаемость.

Простота
• код должен просто читаться сверху вниз;
• код не должен подразумевать, что читающий знает, что код делает;
• код не должен подразумевать, что читающий может запомнить весь предыдущий код;
• код не должен содержать не необходимых уровней абстракции;
• имена не должны отвлекать;
• все решения должны быть понятны читающему;
• комментарии должны описывать «почему», а не «что»;
• документация должна быть самодостаточной;
• код должен содержать понятные тестируемые ошибки;
• простой код часто противоречит «умному»;
• старайтесь использовать базовые конструкции языка (слайсы, мапы, структуры);
• если функция есть в стандартной библиотеке — используйте её;
• старайтесь использовать код Google.

Лаконичность
Приводится пример if err := doSomething(); err != nil { как пример лаконичного кода.

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

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

☝️ Руководство по стилю не заменяет effective Go https://go.dev/doc/effective_go , но расширяет его. «Не думайте, что Я пришел нарушить закон или пророков: не нарушить пришел Я, но исполнить.» (Мф. 5:17).

🫵 Стиль — это конёк golang на мой взгляд. Практики, руководства по практикам и стилям, доклады по практикам и стилям — всё в наших руках.
Forwarded from Эшер II A+
У Cloudflare есть промо-акция со скидкой на Yubikey (https://www.yubico.com/) 4x5NFC или 2x5CNFC до 31 декабря 2022:
https://www.cloudflare.com/press-releases/2022/cloudflare-democratizes-hardware-security-keys/

👉 Смысл в том, что если у вас был аккаунт на Cloudflare, даже бесплатный, то в теории вам дадут купон на скидку:
https://dash.cloudflare.com/?to=/:account/yubico-promotion
Говорите «хочу», и через пару дней вам приходит на email или промокод, или отказ.

☝️ Зачем? Это можно использовать для хранения SSH-ключей, и для всяких двухфакторных авторизаций (можно в каменты покидать популярные статьи получше):
https://habr.com/ru/company/ruvds/blog/659465/

‼️ Российские спецслужбы не реагируют на наличие таких ключей. Весь разработческий офис VK в них, триггером для силовиков не является.

😿 В России его всё равно купить нельзя. И я как-то подзабыл, что читатели не из России могут быть. И не делал поста. Простите. Но, может успеете.

‼️ Обратите на свои таможенные правила. В той же Турции эти ключи будут проходить растаможку и валяться сколько-то на таможне. В Евросоюз доставляется без вопросов.

🔥 Если у кого промокод есть, но не нужен — киньте мне. Я его может или себе возьму, или распределю нуждающимся.
🙀 На собеседовании кандидата на Go-разработчика есть смысл задавать ровно два вопроса:
• Какие технологические особенности есть у языка GO?
• Что такое и как работают go-рутины?

Правда, есть риск не найти разработчика в итоге.
#go #rnotes #release Go версии 1.20 вышел конечно полтора месяца назад, но я всё же хочу на него обратить внимание:
https://go.dev/doc/go1.20

🤷‍♂️ В дженериках внезапно ничего нового не произошло.

Появилась конвертация из слайса в массив простым способом: [4]byte(x). Создаётся копия. Зачем это надо? А например чтобы получить comparable.

🤷‍♂️ Теперь интерфейсы могут удовлетворять ограничению comparable. Живите теперь с этим.

👉 У go build появился ключ -cover. Туда же пакет runtime/coverage. Все это бурно пропустили в описаниях, а меня заинтересовало, потому что ничего не понял. Что-то про интеграционные тесты: https://go.dev/testing/coverage

🔥 Компилятор научился в магию оптимизации по профайлу (PGO). Создаёте профайл pprof, подсовываете компилятору и или всё стало работать быстрее, или всё стало работать медленнее.

• Новый пакет crypto/ecdh для обмена ключами Диффи-Хеллмана (я обращаю внимание на криптографию)

Появилась поддержка множественных ошибок. Внезапно можно вернуть несколько %w в fmt.Errorf или сделать errors.Join(err, ... errN). Остановлюсь поподробнее. Считаю вредной штукой. Обработка ошибок в go может и была странной, но была идиоматичной и вынуждала обработать таки ошибку. И чем раньше, тем лучше. Теперь появился инструмент "да я не знаю, что делать с ошибкой, потом подумаю". И потом сложный путь разбора. Все кейсы, которые я смог придумать с парной ошибкой, только запутывались таким решением. Пример из proposal вообще не выдерживает никакой критики. Давать отдельные ошибки на логин и пароль является антипаттерном. Ещё одной неприятностью является то, что множественные ошибки могут теперь создаваться из-за человеческой ошибки за счёт множественного %w. Живите теперь с этим (c)

👍 Экспериментальный, но интересный пакет arena про арены памяти. Хотел написать "не лезьте туда". Да лезьте, конечно. Просто ради интереса. Идея арены простая. Если у нас много мелких аллокаций, то можно взять сразу большой кусок памяти и делать это всё там. Принцип как в append - взять с "запасиком".

🍄 Пакет http предоставляет костыль http.ResponseController. Смысл в том, что в func RequestHandler(w ResponseWriter, r *Request) добавляется возможность немного поуправлять вот этим w. Flush там сделать, или Timeout поменять. Если, конечно, изначальный тип содержит соответствующие методы. Да, у http.ResponseController под капотом тайп свитчинг.

🙀 Пакет crypto/rsa теперь использует новые алгоритмы с постоянным временем работы. Шифрование стало примерно в 20 раз дольше. Но всё ещё в пять раз быстрее дешифрования. Живите теперь с этим (c)

‼️ В пакете math/rand внезапно seed делается сам при инициализации. Если вы ожидали повторяемости при запуске, то этого больше нет (хотя, в этом случае ты немного странный, друг). Привет, обратная совместимость! Функции Seed и Read стали устаревшими.

🧌 Какой-то релиз странный получился. Как-будто бы открылось "политическое окно для хрени"



🇱🇹 Кстати. Я могу какие-то части своих излияний переводить на литовский язык. Но не понимаю, насколько это вообще надо. И насколько применимо.
Forwarded from Эшер II A+
🔐☢️ Как-то прошла незаметно новость о том, что github.com поменял свой RSA SSH ключ:
https://github.blog/2023-03-23-we-updated-our-rsa-ssh-host-key/


👉 24 марта 2023 года около 05:00 UTC GitHub на всякий случай сменил RSA SSH ключ. Смена ключа произошла в результате обнаружения утечки секретного ключа в публичный git-репозиторий. ECDSA и ED25519 ключи не затронуты.

☝️ Вкратце. SSH ключ, о котором идёт речь, это SSH ключ самого сервера github.com. Когда пользователь сервиса хочет по SSH обратиться к репозиторию на github'е. это как бы тот ключ, который использует сервер. Если следовать всем правилам, надо получить слепок этого ключа доверенным способом и всегда сравнивать его. Обычно же, клиенты SSH предлагают сохранить его при первом соединении и так все и делают. Однако, даже такое «халявное» удостоверение хоста в большинстве случаев позволяет предотвратить атаку «мужик посерёдке» (MitM). Потому что слепок сохранён и если ключ вдруг на хосте поменяется, это вызовет ошибку при попытке нового соединения.

🙀 Как вы уже догадались, это должно было поломать кучу автоматики, пайплайнов CI/CD и так далее. Однако:
• Огромный срез параноиков не пользуется github. Не, некоторые и в пещерах живут, и это не плохо.
• Кто-то всё-таки живёт в 2023 году и использует ECDSA/ED25519
• Многие используют в CI/CD https. Несмотря на отсутствие такого у самого git, есть множество устоявшихся практик git over https. В том числе «проталкиваемых» самим github'ом
• Неимоверно много в скриптах -o StrictHostKeyChecking=no — игнорирование сравнения слепка ключа с запомненным. Какой дали, с тем и работаем.
• Админы утром проснулись, увидели поломанную автоматику, увидели что-то про хосткей в новостях, не глядя приняли новый ключ (мой случай) и пошли пить утренний кофе.

🫵 А у тебя сломался пайплайн? А сразу? А точно между тем как сломался и как работал, он работал с нужным ключом? На этой радостной ноте пожелаю всем labos nakties, как говорят тут.

⚡️ Новый ключ, чтобы не искать SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s
#ИИ #Copilot #GPT4 🥂ИИ как товарищ и инструмент в руках программиста

Начну цикл постов про программирование и ИИ. Началось всё с того, что я хотел заставить ИИ нарисовать Башню Гедемина в будущем c космолётами. И так слово за слово купил доступ к разным ИИ...

Я расскажу вам как это стало для меня не просто инструментом, но и соратником, помогающим в разработке.
Я был поражён эффективностью ИИ и его способностью быть настоящим другом, который подсказывает решения и предлагает альтернативы, но при этом не делает всю работу за тебя. ИИ-технологии стали и хайпом, и в то же время неимоверно эффективным инструментом в умелых руках.

Начну с того, что может помочь вам прямо сейчас: GitHub Copilot. 10$+TAX в месяц — и он ваш.

Начало моего знакомства с Copilot было совершенно неожиданным. Однажды, активировав триальную версию, я забыл про неё. И вот пришло время поправить shell-скрипт, который, хоть и был важным, но второстепенным и не связанным с основным кодом на Golang. Начав писать функцию printdef () {, я был поражен, когда Copilot автоматически дополнил её всеми необходимыми echo и текстами. Этот момент настолько меня вдохновил, что я просидел часа три за непрерывным написанием кода, правками, написанием, улучшением, правками.

Использование: Установив Copilot как плагин в свой редактор кода (в моем случае, это VS Code), можно получать получать подсказки кода и автоматические предложения для комментариев к типам и интерфейсам, реализации рутинных функций и обработки ошибок. Copilot особенно полезен, когда код назван понятно и структурирован. И тут начинается цепная реакция — более хорошо описанный с помощью Copilot код помогает Copilot работать ещё лучше.

🔖 Если в VS Code в плагине Copilot провести мышкой поверх подсказки, то плагин подскажет клавиши управления. Сейчас можно принимать всю подсказку и пословно. А также листать варианты подсказок.

💚 Главным преимуществом Copilot является снижение рутины, что позволяет сфокусироваться на более сложных задачах.

Недостатки:
Copilot может допускать ошибки или предложить не совсем подходящий код. Или вообще не в тему. «Замечтался». Важно не торопиться и внимательно проверять предложенный Copilot код перед его использованием. Это позволяет успеть перехватить большинство ошибок. Умение отсеивать предложения AI и выбирать только подходящие решения становится одним из наиболее важных навыков для современного разработчика.

Советы для начинающих: Я бы рекомендовал начать использовать Copilot прямо сейчас, но не ждать от него чудес. Copilot отражает понятность вашего кода и обогащает его мировым опытом. Если код сложен и запутан, Copilot может быть менее полезным, или даже вредным. Так что всё зависит по прежнему от прослойки между клавиатурой и стулом, и от софт ИИ-скиллов.

💥 Я покидаю сюда прямо конкретных примеров, когда они будут у меня случаться. Если у вас есть какие-то понятные примеры — кидайте их мне, сделаем альбомчик «ИИ кодят»
#ИИ #Copilot #VSCode 💥 И сразу отличный короткий пример. Это вот это место: https://github.com/usher2/u2ckdump/blob/4ffca6caf7457840a969507b22e4ebd0a05f9ed4/parse.go#L19

☝️ Я поставил //, а Copilot серым описал, что это. Это действительно статистика последнего цикла разбора XML'ки.

🫵 Живите теперь с этим!
🖖 Ладно, пусть будет своя болталка
🔸 Коллега прислал ссылку на интересный проект. Пакет предоставляет возможность пользоваться функциями из библиотек разных систем. Насколько я понимаю, поддерживается пока только Darwin и Linux:
https://github.com/ebitengine/purego

🫴 Вместо тысячи слов:
func main() {
libc, err := purego.Dlopen(
getSystemLibrary(),
purego.RTLD_NOW|purego.RTLD_GLOBAL,
)
if err != nil {
panic(err)
}
var puts func(string)
purego.RegisterLibFunc(&puts, libc, "puts")
puts("Calling C from Go without Cgo!")
}

• Кросскомпиляция
• Динамическая подгрузка
• Отсутствие врапперов
🏆 Хотите конкурс на интерес? У меня есть.

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

• При старте и после каждого сброса счётчика записывать значение, когда надо сбросить счётчик, прибавив месяц — время Tx. Каждый раз проверять на now.Before(Tx)
• При старте и каждый сброс счётчика записывать текущее время. Каждую обработку проверять, не истёк ли месяц.

В обоих случаях надо или прибавить месяц, или отнять.

🥁 Банальщина какая-то. Давайте напишем функцию(и) добавления/вычитания месяцев к time.Time (не обязательно текущему). С тестами.

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

❗️ По возможности размещайте свой код на go.dev/play

💐 Лайк, шар, репост, вот это всё.

🐰 Внутренний голос сказал: «Вставай, иди на охоту, будет весело»
🔹 Уже вчера, 4 апреля 2023 года вышел минорный релиз Go 1.20.3:
https://go.dev/doc/devel/release#go1.20.minor

☑️ Из интересного — вроде бы он закрыл раздражавший в Dependabot alerts баг с возможностью DoS в net/http и там ещё целой пачке библиотек.

☝️ Кстати о Dependabot alerts. Вы ведь знаете о Dependabot? Мир программирования оброс конечно офигенными помощниками — подсветка кода, линтеры, Copilot... Dependabot — это github умеет сообщать вам, если в зависимостях вашего софта есть известные уязвимости. Фишку надо включить. Рекомендую
😎 Я хотел подготовить небольшое показательное выступление по chatGPT и получил смешное. «I see, you're looking for ways to integrate custom encryption into your Golang HTTP services at a higher level», — говорит мне Cylon. А потом мы полчаса толчём варианты. А дальше — картинка. «Девочка, что ты плетёшь?..» (c)
👍 Очень характерная хорошая подсказка github Copilot во время рефакторинга
👍 И вот прямо буквально через строку тоже. Я это всё показываю в качестве рекламной паузы и для чистоты понимания возможностей Copilot. Обратите внимание, он посмотрел по аналогии, вытащив строку из комментария
😄 Четверг же это маленькая пятница?

👉 Есть такой популярный среди айтишников редактор — vim . И есть у него есть режим vim -y . Попробовали?

🖖 А теперь хорошая тренировка — попробуйте с помощью chatGPT выйти из редактора, запущенного в режиме vim -y

👇 Присылайте успешные диалоги с chatGPT в каменты
💥 В битве vim -y vs chatGPT выиграл vim -y

🤙 1:0, хромированный тостер!!!

👉 Для перехода в обычный режим нажмите Ctrl+L, а дальше как обычно из vim