choosing the best adhesive for Go code #1

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

Я хочу писать более абстрактный код там где это требуется, снимая ограничения системы типов если это необходимо. Для этого в серии статей буду искать такую реализацию скриптового языка, которую можно подружить с Go рантаймом и я точно знаю что хочу нечто lisp-подобное.

Зачем такой язык нужен:

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

run PostgreSQL by hands

Раз в год (или около того) мне нужно запустить PostgreSQL с целью поразрабатывать что-нибудь. За то время что я его не использую знания выветриваются, так что на будущее я делаю эту заметку, в основном для себя.

Запускать PostgreSQL можно разными способами, вот два самых распространенных:

  • использовать docker
  • поставить пакет

Оба способа немного магические. Контейнеры стараются быть удобными и покрывать как можно больше функциональности, что выливается в адские entrypoint’ы на bash с обратным удобству эффектом. Пакеты в распространенных дистрибутивах тоже содержат не мало магии, ведь они обычно (как минимум) инициализируют директорию с данными СУБД и запускают её сервис.

В nixos тоже есть пакет для PostgreSQL, но он не управляет ни запуском, ни процессом инициализации. Так что полезно помнить как работать руками.

reproducible docker containers

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

FROM golang:latest as builder
WORKDIR /go/src
COPY . .
RUN go build -o app
FROM alpine:latest
COPY --from=builder /go/src/app /bin/app
CMD /bin/app

Можно ли сказать что образ, полученный в результате сборки с указанным Dockerfile, будет воспроизводимым?

Нет. Эта заметка объясняет:

  • почему
  • как писать Dockerfile чтобы приблизиться к воспроизводимости
  • чем заменить Dockerfile чтобы сделать сборки воспроизводимыми

emacs + go-mode + lsp + REPL

Некоторое время назад я начал переезжать с spacemacs обратно на самописную конфигурацию(мне так стабильнее и кастомайзить проще). Common LISP и scheme работают почти без настройки, а вот с golang пришлось поплясать.

Цель: настроить среду разработки, которая способна:

  • к автокомплиту
  • выводу документации
  • go to definition

Это минимум, необходимый мне для работы.

Скажу сразу:

  • не всё заработало
  • некоторые вещи тормозят
  • некоторые работают странно

Но жить можно, плюс ко всему - понятно что улучшать.