В этой небольшой заметке мы поговорим о том, как парсить флаги и аргументы командной строки в языке Go. Казалось бы, в стандартной библиотеке есть пакет flag — берешь и используешь. Но он плох тем, что заставляет пользователя указывать флаги в стиле -config, вместо всем привычных -c и --config. То есть, когда два знака минус используются для полного имени флага, и один знак для короткого. Кроме того, pflag не помогает обрабатывать сложные команды вроде тех, что использует утилита kubectlget nodes, describe pods, и так далее.

Си-Би (CB, Citizens Band) называют КВ-диапазон в окрестностях 27 МГц (11 метров), выделенный для безлицензионного использования всеми желающими. Более точный диапазон частот для России: 26.960-27.410 МГц. В отличие от безлицензионных диапазонов LPD (433 МГц) и PMR (446 МГц), здесь разрешается работать с большими мощностями, до 4 Вт в AM или FM и до 12 Вт в SSB. Кроме того, так как речь идет о коротких волнах, здесь бывают дальние прохождения. Давайте же выясним, есть ли жизнь на Си-Би, и как начать работать в этом диапазоне.

За последние десять лет подход к управлению зависимостями в Go несколько раз переосмыслялся. Все начиналось с «просто используйте go get и никогда не ломайте обратную совместимость». Как ни странно, это не работало. Потом было «Вы все не так поняли — мы не говорили, что менеджер зависимостей не нужен, мы просто не знали, как его сделать! Попробуйте dep ensure». Dep работал уже почти хорошо. Иногда он сыпал непонятными ошибками, но обычно эти ошибки проходили с удалением файла Gopkg.lock и каталога vendor. Сейчас же на смену dep, носившему статус «официального эксперимента», пришел go mod. Это уже совсем настоящий, не экспериментальный, менеджер зависимостей. Вот о паре нюансов, связанных с использованием go mod, мне и хотелось бы рассказать.

Ранее в этом блоге были рассмотрены основные способы изготовления фильтров, см пост первый и пост второй. Однако полосно-заграждающие (режекторные / band-stop / notch) фильтры также можно сделать и из куска коаксиального кабеля. Вот об этом способе изготовления фильтров далее и пойдет речь.

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

После экспериментов со speaker wire antenna меня интересовал вот какой вопрос. Что, если взять fan dipole на диапазоны 40 и 20 метров и запитать его полуволновым повторителем диапазона 40 метров? Ведь λ/2 на 40 метрах это 2*λ/2 на 20 метрах, то есть, тоже повторитель. Как результат, можно получить эффективную, легкую и не требующую тюнера многодиапазонную антенну. Если б только был какой-нибудь способ проверить эту гипотезу… Хотя постойте.

Оказывается, даже в такой простой задаче, как обжать коаксиальный кабель, бывают подводные грабли. А поскольку всему, что связано с электроникой и радио, я учился самостоятельно, граблей я собрал немало. Были у меня кабели, которые спустя пару месяцев использования расшатывались. Делаешь потом новую антенну и не понимаешь, почему КСВ высокий. Надо же еще догадаться, что виновата вовсе не антенна, а кабель. Были и такие кабели, которые прикрутишь к UHF-разъему, а обратно открутить не можешь. Вот о том, как не попадать в подобные истории, далее и пойдет речь.

Недавно мне понадобилось сходить в PostgreSQL из скрипта на Python. Была предпринята попытка воспользоваться для этого библиотекой py-postgresql, поскольку я успешно использовал ее в прошлом. Но оказалось, что py-postgresql не работает с последними версиями постгреса. В моем случае использовался PostgreSQL 11. Ну что же, тогда не будем выпендриваться, и возьмем используемый всеми psycopg2. Поскольку интерфейс psycopg2 заметно отличается от интерфейса py-postgresql, было решено написать небольшую памятку по использованию данной библиотеки.

Антенна delta loop, которая сейчас является моей основной КВ-антенной, имеет одно неудобство. Дело в том, что для смены радиолюбительского диапазона постоянно приходится крутить ручки тюнера, настраиваясь по минимуму КСВ. Спрашивается, а нельзя ли как-то сообразить коробочку с одной-единственной ручкой, просто переключающей диапазоны? Как выяснилось, можно, притом сделать такую коробочку не сложно.

Большинство современных приложений представляют собой распределенные системы. Допустим, ваша компания делает «просто» приложение для мобильных устройств. Но помимо самого приложения, с которым работает пользователь, наверняка есть и какой-то сервер-сайд. Он состоит из балансировщиков нагрузки (например, Nginx), некоторого количества микросервисов, а те в свою очередь ходят в некие СУБД (PostgreSQL), кэши (Redis, Memcached) и service discovery (Consul). СУБД скорее всего крутится не на одном сервере, а имеет энное количество реплик — для распределения нагрузки, аналитики и снятия бэкапов. По моему скромному опыту, многие люди не сильно задумываются над проблемами, которые могут возникать в подобных системах. Давайте же выясним, что это за проблемы.