В go 1.18 новое поведение
https://habr.com/ru/post/660827/
append
. Ну как новое. Немного изменен алгоритм расчета. Сомневаюсь, что большинство из вас и старый знало (я в таких деталях не знал). Любое, даже маленькое изменение, очень важно само по себе. Но некоторые детали интересны в основном только для общего развития:https://habr.com/ru/post/660827/
Хабр
Изменения функции append в Go 1.18
Совсем недавно произошел релиз Go 1.18, гвоздем программы стали дженерики. Но про этот факт уже достаточно статей, а мне нечего к ним добавить. Однако, я не смог найти ни одного поста про этот кусочек...
Сижу, готовлю пост о 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 — хороший ведь проект. Идите в issue и дерзайте!!
Changelog
What's new in Go 1.19 with Carl Johnson (Go Time #240)
Go 1.18 was a major release where we saw the introduction of generics into the language as well as other notables such as fuzzing and workspaces. With Go 1.19 slated to come out next month, one has to wonder what’s next. Are we in store to be blown away by…
#go #git #windows #ssh Часть I. Так получилось, что на работе мы используем Windows. Мне для одного проекта потребовалось использовать пакеты из приватных репозиториев. И из шкафа посыпались скелеты.
☝️ Современный GO умеет работать с Git, Subversion, Mercurial, Bazaar, и Fossil [1], но я рассматриваю только Git.
👉 Отмечу одну важную деталь:
🍏 Первый способ заключается в сохранении логина и пароля через настройку конфигурации [3]:
или
Продолжение дальше...
[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, 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 использовать протокол SSH для выбранного URL.
🌶 Если ключ SSH можно хранить прямо на машине, то всё относительно просто. А вот если на ключе SSH должен стоять пароль, то начинаются вопросы. Нам требуется ssh-agent
✅ На современных Windows 10 и 11 прямо в поставке идёт Windows-порт OpenSSH [5], его из коробки видит Git для Windows. Всё будет работать само. Кроме ssh-agent. После выполнения в PowerShell этих простых команд, в Windows появится сервис ssh-agent, который будет запускаться автоматически при перезагрузке компьютера [6][7]:
❌ В Windows OpenSSH ssh-agent запоминает добавленные ключи в реестр Windows, откуда считывает их при перезагрузке.Эти ключи может использовать только тот пользователь, который их добавил. Но если у пользователя Windows нет пароля, то ключ оказывается доступен для всех [9], и придется каждый раз удалять его через
☝️ Стандартная поставка Git для Windows включает команды
🏆 В современном Windows есть подсистема WSL2 (Windows Subsystem for Linux), и можно пользоваться ею. Ставим Windows Terminal (предупреждаю, без него без слез невозможно работать в Linux-консоли), инициализируем WSL2 [10] и просто работаем. Там и агент сразу запустится. С WSL2 умеют работать и vim, и VSCode [11] и GoLand [12]. Смотрите, для VSCode достаточно набрать
🛠 Важно! И 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
... продолжение
🍐 Но что, если требуется использовать 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 теперь умеет работать с простенькой разметкой. Т.е. можно делать заголовки, параграфы, внешние и внутренние ссылки, нумерованные и ненумерованные списки, и даже блоки кода. И
https://go.dev/doc/comment
• Новый тег сборки
https://go.dev/doc/gc-guide
‼️ Для новых горутин начальный размер стека теперь задается на основе статистики использования стека горутинами. Это к слову о пулах горутин
• На UNIX-системах RLIMIT_NOFILE теперь выставляется автоматом в максимально возможное значение при импорта пакета os
• Увеличена производительность конструкции
✅ В
‼️ В принципе много мелких, но чувствительных изменений в
• Результаты
• Любителям подуть щёки знанием алгоритмов сортировок — в
👍 В`time`
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
☝️ Основные принципы стиля:
• Читаемость. Это ПЕРВОЕ правило стиля
• Простота
• Лаконичность
• Поддерживаемость
• Согласованность
✅ Читаемость. Код должен быть ясен для любого читающего. Два аспекта:
- Что код на самом деле делает?
• задавайте смысловые имена переменным;
• добавляйте дополнительные комментарии;
• разбивайте пробелами код и комментарии;
• раскладывайте код по разным функциям для модульности.
- Почему код делает то, что должен? Общий смысл в том, что понимание кода должно быть по мере чтения.
Приведен интересный на мой взгляд пример — функция
✅ Простота
• код должен просто читаться сверху вниз;
• код не должен подразумевать, что читающий знает, что код делает;
• код не должен подразумевать, что читающий может запомнить весь предыдущий код;
• код не должен содержать не необходимых уровней абстракции;
• имена не должны отвлекать;
• все решения должны быть понятны читающему;
• комментарии должны описывать «почему», а не «что»;
• документация должна быть самодостаточной;
• код должен содержать понятные тестируемые ошибки;
• простой код часто противоречит «умному»;
• старайтесь использовать базовые конструкции языка (слайсы, мапы, структуры);
• если функция есть в стандартной библиотеке — используйте её;
• старайтесь использовать код Google.
✅ Лаконичность
Приводится пример
✅ Поддерживаемость
Приводятся примеры всякого булшита, вроде игры областями видимости переменных или
✅ Согласованность
В целом, это про единообразие кода в рамках функции, файла, пакета, команды разработки, кодовой базы.
☝️ Руководство по стилю не заменяет effective Go https://go.dev/doc/effective_go , но расширяет его. «Не думайте, что Я пришел нарушить закон или пророков: не нарушить пришел Я, но исполнить.» (Мф. 5:17).
🫵 Стиль — это конёк golang на мой взгляд. Практики, руководства по практикам и стилям, доклады по практикам и стилям — всё в наших руках.
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 в них, триггером для силовиков не является.
😿 В России его всё равно купить нельзя. И я как-то подзабыл, что читатели не из России могут быть. И не делал поста. Простите. Но, может успеете.
‼️ Обратите на свои таможенные правила. В той же Турции эти ключи будут проходить растаможку и валяться сколько-то на таможне. В Евросоюз доставляется без вопросов.
🔥 Если у кого промокод есть, но не нужен — киньте мне. Я его может или себе возьму, или распределю нуждающимся.
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?
• Что такое и как работают go-рутины?
Правда, есть риск не найти разработчика в итоге.
#go #rnotes #release Go версии 1.20 вышел конечно полтора месяца назад, но я всё же хочу на него обратить внимание:
https://go.dev/doc/go1.20
🤷♂️ В дженериках внезапно ничего нового не произошло.
✅ Появилась конвертация из слайса в массив простым способом:
🤷♂️ Теперь интерфейсы могут удовлетворять ограничению
👉 У
🔥 Компилятор научился в магию оптимизации по профайлу (PGO). Создаёте профайл
• Новый пакет
❌ Появилась поддержка множественных ошибок. Внезапно можно вернуть несколько
👍 Экспериментальный, но интересный пакет
🍄 Пакет
🙀 Пакет
‼️ В пакете
🧌 Какой-то релиз странный получился. Как-будто бы открылось "политическое окно для хрени"
—
🇱🇹 Кстати. Я могу какие-то части своих излияний переводить на литовский язык. Но не понимаю, насколько это вообще надо. И насколько применимо.
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'ом
• Неимоверно много в скриптах
• Админы утром проснулись, увидели поломанную автоматику, увидели что-то про хосткей в новостях, не глядя приняли новый ключ (мой случай) и пошли пить утренний кофе.
❌🫵 А у тебя сломался пайплайн? А сразу? А точно между тем как сломался и как работал, он работал с нужным ключом? На этой радостной ноте пожелаю всем labos nakties, как говорят тут.
⚡️ Новый ключ, чтобы не искать
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
The GitHub Blog
We updated our RSA SSH host key
At approximately 05:00 UTC on March 24, out of an abundance of caution, we replaced our RSA SSH host key used to secure Git operations for GitHub.com.
#ИИ #Copilot #GPT4 🥂ИИ как товарищ и инструмент в руках программиста
Начну цикл постов про программирование и ИИ. Началось всё с того, что я хотел заставить ИИ нарисовать Башню Гедемина в будущем c космолётами. И так слово за слово купил доступ к разным ИИ...
Я расскажу вам как это стало для меня не просто инструментом, но и соратником, помогающим в разработке.
Я был поражён эффективностью ИИ и его способностью быть настоящим другом, который подсказывает решения и предлагает альтернативы, но при этом не делает всю работу за тебя. ИИ-технологии стали и хайпом, и в то же время неимоверно эффективным инструментом в умелых руках.
Начну с того, что может помочь вам прямо сейчас: GitHub Copilot. 10$+TAX в месяц — и он ваш.
Начало моего знакомства с Copilot было совершенно неожиданным. Однажды, активировав триальную версию, я забыл про неё. И вот пришло время поправить shell-скрипт, который, хоть и был важным, но второстепенным и не связанным с основным кодом на Golang. Начав писать функцию
Использование: Установив Copilot как плагин в свой редактор кода (в моем случае, это VS Code), можно получать получать подсказки кода и автоматические предложения для комментариев к типам и интерфейсам, реализации рутинных функций и обработки ошибок. Copilot особенно полезен, когда код назван понятно и структурирован. И тут начинается цепная реакция — более хорошо описанный с помощью Copilot код помогает Copilot работать ещё лучше.
🔖 Если в VS Code в плагине Copilot провести мышкой поверх подсказки, то плагин подскажет клавиши управления. Сейчас можно принимать всю подсказку и пословно. А также листать варианты подсказок.
💚 Главным преимуществом Copilot является снижение рутины, что позволяет сфокусироваться на более сложных задачах.
Недостатки: Copilot может допускать ошибки или предложить не совсем подходящий код. Или вообще не в тему. «Замечтался». Важно не торопиться и внимательно проверять предложенный Copilot код перед его использованием. Это позволяет успеть перехватить большинство ошибок. Умение отсеивать предложения AI и выбирать только подходящие решения становится одним из наиболее важных навыков для современного разработчика.
Советы для начинающих: Я бы рекомендовал начать использовать Copilot прямо сейчас, но не ждать от него чудес. Copilot отражает понятность вашего кода и обогащает его мировым опытом. Если код сложен и запутан, Copilot может быть менее полезным, или даже вредным. Так что всё зависит по прежнему от прослойки между клавиатурой и стулом, и отсофт ИИ-скиллов.
💥 Я покидаю сюда прямо конкретных примеров, когда они будут у меня случаться. Если у вас есть какие-то понятные примеры — кидайте их мне, сделаем альбомчик «ИИ кодят»
Начну цикл постов про программирование и ИИ. Началось всё с того, что я хотел заставить ИИ нарисовать Башню Гедемина в будущем 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
🫴 Вместо тысячи слов:
• Динамическая подгрузка
• Отсутствие врапперов
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!")
}
• Динамическая подгрузка
• Отсутствие врапперов
GitHub
GitHub - ebitengine/purego
Contribute to ebitengine/purego development by creating an account on GitHub.
🏆 Хотите конкурс на интерес? У меня есть.
⏰ Представьте банальную задачу. Ваш сервис что-то постоянно делает, Допустим раз в час обрабатывает какие-то данные и записывает их обработанными. Раз в месяц вы хотите сбросить какой-то счётчик. Раз в месяц от некой стартовой даты Tstart. Существуют два глобальных варианта:
• При старте и после каждого сброса счётчика записывать значение, когда надо сбросить счётчик, прибавив месяц — время Tx. Каждый раз проверять на now.Before(Tx)
• При старте и каждый сброс счётчика записывать текущее время. Каждую обработку проверять, не истёк ли месяц.
В обоих случаях надо или прибавить месяц, или отнять.
🥁 Банальщина какая-то. Давайте напишем функцию(и) добавления/вычитания месяцев к time.Time (не обязательно текущему). С тестами.
🤖 chatGPT можно и интересно. Но я попрошу опубликовать полный диалог с ним.
❗️ По возможности размещайте свой код на go.dev/play
💐 Лайк, шар, репост, вот это всё.
🐰 Внутренний голос сказал: «Вставай, иди на охоту, будет весело»
⏰ Представьте банальную задачу. Ваш сервис что-то постоянно делает, Допустим раз в час обрабатывает какие-то данные и записывает их обработанными. Раз в месяц вы хотите сбросить какой-то счётчик. Раз в месяц от некой стартовой даты Tstart. Существуют два глобальных варианта:
• При старте и после каждого сброса счётчика записывать значение, когда надо сбросить счётчик, прибавив месяц — время Tx. Каждый раз проверять на now.Before(Tx)
• При старте и каждый сброс счётчика записывать текущее время. Каждую обработку проверять, не истёк ли месяц.
В обоих случаях надо или прибавить месяц, или отнять.
🥁 Банальщина какая-то. Давайте напишем функцию(и) добавления/вычитания месяцев к time.Time (не обязательно текущему). С тестами.
🤖 chatGPT можно и интересно. Но я попрошу опубликовать полный диалог с ним.
❗️ По возможности размещайте свой код на go.dev/play
💐 Лайк, шар, репост, вот это всё.
🐰 Внутренний голос сказал: «Вставай, иди на охоту, будет весело»
go.dev
Go Playground - The Go Programming Language
🔹 Уже вчера, 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 умеет сообщать вам, если в зависимостях вашего софта есть известные уязвимости. Фишку надо включить. Рекомендую
https://go.dev/doc/devel/release#go1.20.minor
☑️ Из интересного — вроде бы он закрыл раздражавший в Dependabot alerts баг с возможностью DoS в net/http и там ещё целой пачке библиотек.
☝️ Кстати о Dependabot alerts. Вы ведь знаете о Dependabot? Мир программирования оброс конечно офигенными помощниками — подсветка кода, линтеры, Copilot... Dependabot — это github умеет сообщать вам, если в зависимостях вашего софта есть известные уязвимости. Фишку надо включить. Рекомендую
go.dev
Release History - The Go Programming Language
😎 Я хотел подготовить небольшое показательное выступление по chatGPT и получил смешное. «I see, you're looking for ways to integrate custom encryption into your Golang HTTP services at a higher level», — говорит мне Cylon. А потом мы полчаса толчём варианты. А дальше — картинка. «Девочка, что ты плетёшь?..» (c)
💥 В битве
👉 Для перехода в обычный режим нажмите
vim -y
vs chatGPT
выиграл vim -y
🤙 1:0, хромированный тостер!!!👉 Для перехода в обычный режим нажмите
Ctrl+L
, а дальше как обычно из vim