• Какую структуру go-сервиса стоит использовать?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Есть еще документ имеющий рекомендательный характер, но не имеющий силы официального руководства https://github.com/golang-standards/project-layout...
    Ответ написан
    Комментировать
  • Какие программы есть для индексации и контекстного поиска в офисных файлах и файлах PDF?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    Попробовал несколько полнотекстовых поисковиков, остановился на Recoll https://www.lesbonscomptes.com/recoll/pages/index-...
    Интерфейс Qt, индекс Xapian.
    Мне удобно, рекомендую.
    Ответ написан
    Комментировать
  • Как ввернуть нескольких значений одной функцией в printf()?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Так как вы пробуете нельзя. Функции способные принять произвольное количество аргументов, на самом деле принимают один -- слайс. То, что элементы этого слайса можно привести перечислением -- синтаксический сахар.
    Конструкция func1(func2()) работает только в случае если func2() возвращает ровно такие значения и столько, сколько аргументов ожидает func1().
    В вашем случае swap() возвращает два значения, а fmt.Printf() ожидает только один аргумент -- []interface{}
    То есть можно только вот так
    func printTwoValue(x, y string) {
    	fmt.Printf("Цена: %s , ok= %s\n", x, y)
    }
    printTwoValue(swap("1", "2"))

    Работающий код https://go.dev/play/p/z9sFlujsfxd
    Ну или вот так
    func swap(x, y string) []interface{} {
    	return []interface{}{y, x}
    }
    fmt.Printf("Цена: %s , ok= %s\n", swap("1", "2")...)

    Работающий код
    https://go.dev/play/p/46ylXp9Tirv
    Ответ написан
  • Какой размер структуры в Go?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Как уже отмечалось это alignment и его можно посмотреть функцией unsafe.Alignof() https://pkg.go.dev/unsafe#Alignof
    Но не всё потеряно, акробатическими трюками можно бороться за каждый байт) Например:
    type s struct {
    	x int16
    	y int8
    	z int8
    }

    тоже будет занимать 4 байта на распространённых архитектурах. Prooflink https://play.golang.com/p/4AfhDeXDyF-
    Ответ написан
    Комментировать
  • Как проверить наличие пользователя в БД?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    По крайней мере в postgres можно обойтись внутренним механизмом sql, одним запросом:
    db.Prepare("INSERT INTO telegram (chat_id, username, timestamp) VALUES (?, ?, ?) ON CONFLICT (chat_id) DO NOTHING")

    без проверок двойным запросом уровня языка приложения.
    Ответ написан
    Комментировать
  • В чëм сейчас пишут документацию?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    Мне полюбился asciidoc. Последнее время почти весь свой текст в нём пишу. Конкретная реализация https://asciidoctor.org/ Есть поддержка формул (AsciiMath и TeX) и диаграмм (plantuml и mermaid) Можно вставлять куски TeX. При рендеринге в PDF или PS очень приличная типографика.
    Академисты пишут конечно на latex, но есть недостатки. latex -- инструмент вёрстки, семантической разметки практически нет и неудобо-человеко-читаемо.
    Обязательно посмотрите на конвертер pandoc https://pandoc.org/. Можно писать в чём попало и сконвертировать во что заблагорассудится)
    Ответ написан
    Комментировать
  • Как передать указатель на метод структуры в map?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Похоже вы пытаетесь использовать Method expressions https://go.dev/ref/spec#Method_expressions И так можно, только нужно:
    var m = map[int]methodPtr{
    	0: (*someStruct).method1,
    }
    Работающий код https://go.dev/play/p/0TqJTmuEGHU
    Правда, на мой взгляд, не очень удобно)
    Ответ написан
    Комментировать
  • Не работают мышь и клавиатура?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    Попробуйте загрузиться с загрузочной флешки.
    Перед физическим ремонтом попробуйте вытащить маленькую круглую плоскую батарейку, сбросить этим настройки bios. Часто помогает) Ещё эту батарейку нужно регулярно менять...
    Вообще, если клавиатура не работает уже в BIOS то скорее всего в ремонт.
    Ответ написан
    Комментировать
  • Golang PGX как добавлять значения в jsonb?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    А попробуйте []string
    query := `
        UPDATE type
        SET characteristics = jsonb_insert(
            characteristics, '{$1}', '{"type": "$2", "measure": "$3"}'::jsonb
        )
        WHERE id=$4`
    
      tag, err := conn.Exec(ctx, query,
        []string{c.Name},      // Вот здесь попробуйте []string
        c.Type,      // string
        c.Measure,   // string
        c.ID,        // uint64
      )
    Ответ написан
  • Какие можно использовать технологии/форматы для хранения бинарных пользовательских данных в десктопном приложении?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    В posix системах архивы принято держать и распространять в формате tar. Бинарный архив без сжатия https://ru.wikipedia.org/wiki/Tar При желании можно сжать, получится .tar.gz Пользуюсь ежедневно.
    Ответ написан
    Комментировать
  • Как постоянно получать данные с БД?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    "хэндлер, который принимает вебхуки с текстовыми сообщениями и пишет их в базу" разве не может сразу ещё отправлять эти сообщения в "сокет, который создает общий чат с людьми" ?
    Или, если операции блокирующие, то отправлять в `очередь сообщений`. Может быть и база не нужна?
    Ответ написан
    Комментировать
  • Два IP на одном домене. Как настроить переадресацию?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    Невозможно. Да и бесполезно, инфраструктура dns инерционна, изменения распространяются не мгновенно.
    Кроме уже упомянутого отдельного сервиса балансировки с гарантированным uptime, есть же ещё кривой но простой и дешевый костыль :-) Сделать A записи для www.site1.ru и site1.ru на разные IP. Ну или для www1. и www2. в общем для поддоменов :-)
    Ответ написан
    Комментировать
  • Нужен максимально простой SMTP клиент чтоб получать локально писама(отправка и получение локально), что посоветуете?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    У меня стоят для imap4 -- mbsync https://isync.sourceforge.io/mbsync.html для smtp -- msmtp https://marlam.de/msmtp/ Использую почтовый агент(Mba) -- mutt Такая связка достоверно работает)
    Если вас интересует другой usecase то возможно поможет https://suckless.org/rocks/ (подборка Mail clients)
    Ответ написан
    Комментировать
  • Работа с финансами с точки зрения транзакционности, каким образом происходит в банках?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    Что понимать под горизонтальным масштабированием и распределенной транзакцией?
    Если Саша хочет перевести деньги из отделения1 условного сбера Маше в отделение2 того же Сбера, то Машиному отделению2 нет необходимости знать кто такой Саша и какой у него счёт. И даже головной системе условного сбера нет нужды хранить данные всех Маш и Саш, достаточно только дебетовать подсчёт отделения1 и кредитовать отделение2. При межбанковских переводах дебитуются/кредитуются корреспондентские счета открытые друг у друга или в центробанке. Свой внутренний баланс отделение или банк ведёт самостоятельно. Для консистентности достаточно обеспечить гарантированную систему передачи сообщений.
    В современных системах переводов (swift, Visa, СБП, Мир) гарантии передачи сообщений даёт процессинговый центр.
    Ответ написан
    Комментировать
  • Как правильно структурировать проект в Go?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Вам в комментариях уже подсказали https://github.com/golang-standards/project-layout... Но этот документ не имеет официальной поддержки или методической силы. Это только волонтёрская попытка унификации.
    Подход команды разработчиков языка виден в сырцах компилятора и стандартной библиотеки.
    Рекомендованный и однозначно принятый сообществом layout не утверждён.
    Особые свойства есть у папок internal и vendor. Эти папки при сборке рассматриваются тулчейном go иначе чем другие. Особые свойства этих папок отражены в официальной документации.
    Ответ написан
    Комментировать
  • Что выбрать для бэкенда с нуля?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    Я, евангелист языка Go) Мне язык нравится и платят неплохо. Go быстрее чем Node.js, быстрее чем PHP.
    Но, хотел бы заметить:
    Вообщем есть проект написанный не мной, на PHP.

    переписывать работающий проект на другом языке должно быть явным побуждением стейкхолдеров.
    Ответ написан
    1 комментарий
  • Как правильно запускать хранимые процедуры?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    О каких хранимках идёт речь?
    В postgres есть собственная метафора хранимок, скомпилированных и живущих на postgres сервере. В Go пакет стандартной библиотеки sql сделан кросс-sql-движковым и ближайший аналог это sql.Stmt https://pkg.go.dev/database/sql#Stmt (в документации есть примеры кода). Вы можете скомпилировать sql стейтмент единожды в контексте соединения или транзакции и использовать многократно и потоко-безопасно пока жив контекст. Это даёт выигрыш в производительности.
    Если я правильно вопрос)
    Наивный код
    script, err := ioutil.ReadFile("path/to/procedure.sql")
    if err != nil {
        log.Fprintf(os.Stderr, "Error reading SQL script file: %v\n", err)
    }
    stmt, err := db.PrepareContext(context.Background(), string(script)) //компилируем стейтмент как шаблон c плейсхолдерами аргументов
    if err != nil {
    	log.Fatal(err)
    }
    _, err = stmt.ExecContext(ctx, args) //применяем стейтмент к аргументам args... в контексте ctx
    if err != nil {
        log.Fprintf(os.Stderr, "Error executing SQL script: %v\n", err)
    }

    Шаблон (path/to/procedure.sql) может выглядеть так
    SELECT username FROM users WHERE id = ?
    Вопросительный знак ? это плейсхолдер для аргумента
    Ответ написан
    1 комментарий
  • Подсчет hash суммы .iso образа?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    Когда скачиваю образы, обычно сумму рекоммендуют проверить командой sha256 -С SHA256
    Видимо этой же командой sha256 сумму и получают для валидации.
    Ответ написан
    Комментировать
  • Как быстрее прокачивать скиллы младшему системному администратору, если неполадки случаются редко?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    Кроме правила
    если работает - не трогай

    есть еще
    автоматизируй всё, что пришлось делать более двух раз
    Ответ написан
    Комментировать
  • Как провести деструктуризацию?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    То чего вы добиваетесь не идеоматично, паттерн не применяется в рабочем Go коде. Никакой деструктуризации base syntax не предполагает.
    Просто показать возможности языка, ну и для code golfing:
    func Destruct(s any) (e []any) {
    	v := reflect.ValueOf(s)
    	if v.Kind() != reflect.Struct {
    		return nil
    	}
    	for i := 0; i < v.NumField(); i++ {
    		e = append(e, v.Field(i).Interface())
    	}
    	return
    }

    Работающий пример в песочнице https://go.dev/play/p/uk1o-Nl4Ic8
    Ответ написан
    1 комментарий