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

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

Кроме чата, Golang обсудить можно тут: https://t.iss.one/gogolang
Download Telegram
Forwarded from Эшер II A+
🎓 Помните, Минцифра рекламировала федеральную образовательную программу для старшеклаcсников? Типа программистов там готовят: https://digital.gov.ru/ru/events/46032/

🙀 Это задачка курса по Python с ожидаемым ответом в одной из школ (в рамках этой программы). Ответы проверяются платформой. Полученный результат сравнивается с ожидаемым.

🤷‍♂️ А потом я удивляюсь, что 146% кандидатов на разработчика на Golang не могут объяснить, что такое горутины. Не, ну счастливо, конечно. Но Максут Игоревич, это бардак вселенского масштаба.

☝️ Для непрограммистов — в программировании нельзя проверять числа с плавающей точкой на равенство. В данном случае платформа проверяет ученика по результату в том числе, и по вот этому числу.

🫵 Если ты программист и не в курсе, о чём я, то... то я не знаю что
Forwarded from Эшер II A+
🌑 Говорят, умер Никлаус Вирт, автор языка Pascal:
https://twitter.com/Bertrand_Meyer/status/1742613897675178347

«программы становятся медленнее куда шустрее, чем компьютеры становятся быстрее»
Forwarded from How to Go wrong (Alexey Palazhchenko)
Не прошло и три го… а, нет, уже прошло. Тем не менее, теперь у нас есть официальная документация по этому поводу: https://go.dev/doc/modules/layout 🎉

Выпиливайте ваши pkg/.
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from How to Go wrong (Alexey Palazhchenko)
Все написали, и Russ Cox написал:
* https://research.swtch.com/xz-script
* https://research.swtch.com/xz-timeline
🤷‍♂️ Бросил Golang Telegram Bot API и перешёл на https://github.com/go-telegram/bot

🐾 Забавно. Я всё понимаю. Я знаю все Pro и Contra. Но внезапно стал часто применять в пет-проектах на go база данных - просто файл в json. Так получается в разы быстрее на MVP. И главное, что 99% разработки не вырастает из файла. А вот тормозит "быстро накидаю" использование другого типа баз сильно
Forwarded from Эшер II A+
⚡️⚡️⚡️ Все побежали, и я побежал. VPN-бот от известного кутюрье (меня) с VPN по спекулятивной цене за 🌟:
https://t.iss.one/FarscapeBot

👉 ShadowSocks в варианте совместимом с Outline. Подключайся! Рви свой инфопузырь!

🍄 Сообщай об ошибках. Предлагай исправления. Бот сыроват. Инструкций много я не написал. Но всё работает

🫵 А может ты написал/записал обзор интересного клиента?
#swagger #oauth ☕️ Люблю и не люблю такие штуки. Переделывал немного одну вещь по работе и вдруг понял, что в go-swagger для security.type="oauth2" отсутствует flow для client_credentials. Но нет, есть. Несмотря на то, что я считаю, что это довольно частый случай — пришлось выкапывать и экспериментировать.

👉 Для способа получения ключа Client Credentials Grant в go-swagger есть flow application (согласно спецификации swagger 2.0, но это надо было догадаться туда сунуться и сложить 2+2). Из обязательных полей только tokenURL, который может быть в свою очередь в этом же API:
securityDefinitions:
OauthSecurity:
type: oauth2
flow: applicatiom
tokenUrl: '/token'
scopes:
admin: Admin scope
user: User scope


☝️ Главное не забыть у /token, если он локальный поставить:
security:
- Basic: []


👍 Flow полностью соответствует RFC 6749. Но главное, что встроенный в go-swagger Swagger-UI умеет этот flow авторизовать. Он запрашивает client_id и client_secret, и scope. Пару client_id и client_secret он сам превращает в заголовок Authorization: Basic xxxx... (как и положено по RFC). Он сам получает access_token по ссылке tokenURL, которую он распознаёт, и потом с этим токеном работает в API. Единственное, что он не отрабатывает "протухание" ключа, приходится авторизовываться каждый раз заново
Forwarded from How to Go wrong (Alexey Palazhchenko)
Лучшая четверть организаторов GopherCon Russia (не я) делает камерный четырехдневный Go-кэмп в Черногории. С 13-ого по 16-ое октября будет летний лагерь, Kubernetes операторы, горы, PyTorch в Go, отдых, создание игр на Go. Подробности тут, а наш Go-чат делает разыгрыш скидки в 15%.
😱 Простите не про Go. 22 года работаю с MySQL. CRUD для веба. Один раз что-то сложное делал, но специфическое. Не прямо чтобы DBA, я к этому. И тут фигня случается — 2млн. строк, есть индекс по int-полю, выборки строк под 20. Тормозит и всё тут

😱 Я уже и так, и сяк, и innodb в память вытащил. Ладно, думаю, дошло дело до изучения Explain. И тут вдруг вижу - индекс по колонке, по которой выбираю, есть, но explain показывает ALL.

WTF?!!!!

🤙 Просто ANALIZE TABLE ... спасает ситуцию

WTF?!!!! 2024 год на дворе
#swagger #oauth 🖌 Произвёл рефакторинг своего летнего поста про oauth2 в go-swagger

☝️ Я работаю с swagger только в режиме генерации кода. Генерация спецификации по коду делает код более гибким. Однако и возможностей ошибиться намного больше, чем при генерации кода по спецификации

☕️ Переделывал одну вещь по работе и не смог найти в go-swagger для security.type="oauth2" значение для flow для client credentials grant. Через несколько часов поисков и экспериментов, я всё-таки обнаружил нужный flow. Но считаю, что в документации это не очевидно

ℹ️ Что такое client credentials grant? Это когда клиенту API надо сходить с client_id и client_secret (считайте логин и пароль) на сервер авторизации и запросить токен доступа. А к ресурсам ходить уже с этим токеном. Токен указывается в заголовке. Обычно токен представляет собой JWT (данные в json. подписанные и закодированные в base64 с определёнными полями, указывающими что это за токен, срок действия, область действия - scope и т.д.). Принципиальное отличие от авторизации пользователя — права принадлежат приложению. Хотя, на практике в большинстве случаев права приложений строго равны правам, создавших их пользователей

👉 Для варианта client credentials grant в go-swagger есть специальный flow: application (совершенно неочевидное название). Из обязательных полей только tokenURL, который может быть в свою очередь в этом же API:
securityDefinitions:
OauthSecurity:
type: oauth2
flow: applicatiom
tokenUrl: '/token'
scopes:
admin: Admin scope
user: User scope


☝️ Главное не забыть у /token, если он локальный, указать авторизацию Basic:
paths:
/token:
post:
security:
- Basic: []

и добавить в securityDefinitions:
securityDefinitions:
Basic:
type: basic


👍 Flow полностью соответствует RFC 6749. Встроенный в go-swagger Swagger-UI умеет этот flow авторизовать. Он запрашивает client_id и client_secret, и scope у пользователя. Пару client_id и client_secret он сам превращает в заголовок Authorization: Basic xxxx... (как и положено по RFC). Он сам получает access_token по ссылке tokenURL, которую он распознаёт, и потом с этим токеном работает в API через заголовок Authorization: Bearer xxxx...

‼️ Обратите внимание, что go-swagger не учитывает формата выдаваемого токена — он может быть любым. Поле scope в блоке security носит справочную информацию и передаётся в функцию обработки авторизации для справки. Опознания JWT, его разбора и сравнения scope не происходит
  /user:
post:
security:
- JWT:
- "user:create"
This media is not supported in your browser
VIEW IN TELEGRAM
🥃 Видимо я переделаю это не раньше второго пришествия. Вдруг кому понадобится. Или я когда-нибудь переведу на английский/литовский и актуализирую. pdf первым каментом
🍭 А вот тут чуть магии. Любите оптимизировать и мерять скорости? Правда? Это точно надо переработать и перевести. Наслаждайтесь
🚬 Устаревший доклад про мапы. Но интересно. Надо бы заново сделать
Длинные селекторы в Go

Нередко встречаю такой паттерн:
x := k.c.y.SetX()
// ...
if k.c.y.Exists() {
// ...


Функционально всё корректно, но цепочка k.c.y дважды нагружает зрение и увеличивает когнитивную нагрузку (cognitive load) — мозг вынужден каждый раз «проходить» всю селекторную цепочку (dot/point-chasing).

Я предпочитаю предварительно закэшировать конечный объект, создав локальный псевдоним (alias binding):
y := k.c.y
x := y.SetX()
// ...
if y.Exists() {
// ...


Почему это выглядит чище:

* Уменьшение числа селекторов (Number of Selectors, NOC): глубина доступа падает с 3 до 1, чтение ускоряется линейно
* Семантическая прозрачность (semantic transparency): конечный объект (y) получает собственный идентификатор, сразу видно его роль
* Нулевая стоимость абстракции (zero-cost abstraction): компилятор Go инлайнит псевдоним, нет лишних аллокаций и нагрузки на GC
* Снижение синтаксического шума (syntactic noise), анализаторы IDE реже ошибаются (поверил гуглу — сам не встречал)

P.S. ChatGPT конечно неплохо поработал с моим сумбурным текстом, добавил терминов, которые я и не слышал даже. Выглядит интересно

А вы боретесь с длинными селекторами (selector hell)?