• Какая ОС, по вашему мнению подойдёт лучше?

    kamalynx
    @kamalynx
    Погромист-самомучка
    Debian - стабильно и предсказуемо. Множество мануалов, хорошая wiki-документация https://wiki.debian.org/FrontPage, регулярные обновления, долгосрочная поддержка LTS.

    Пакетная база stable выпуска может показаться слегка устаревшей, но, если действительно нужно, тот же PostgreSQL можно установить из официального репозитория https://www.postgresql.org/download/linux/debian/ ;)

    У Debian удобный установщик, поддерживающий графический и текстовый режимы, с большим простором для конфигурации во время установки в режиме Expert install.
    Ответ написан
    Комментировать
  • Как отловить нажатие клавиши с Bluetooth гарнитуры на JS в браузере?

    Kozack
    @Kozack Куратор тега JavaScript
    Thinking about a11y
    https://web.dev/media-session/
    Вы вешаете обработчик событий play/pause. А эти события вызываются и при клике по системным контроллам в ОС и по нажатию клавиш на гарнитурах и так далее.
    Ответ написан
    Комментировать
  • На чем сделать упрощённый zoom?

    fdroid
    @fdroid
    press any key
    Ответ написан
    Комментировать
  • На чем сделать упрощённый zoom?

    @KoreanGuy
    можно, конечно, взять webrtc и sfu и самому всё запилить, но это сложно и долго. Гугли jitsi-meet, это готовое бесплатное решение, которое просто устанавливаешь на сервер, настраиваешь и можешь подключаться через свой домен или jitsi-meet мобильное приложение, либо своё приложение можешь запилить. Там можно настроить разные типы авторизации (кто может создавать/присоединяться) - по паролю, по токену и тп.
    Ответ написан
    Комментировать
  • Какую программу для инвентаризации и учета IT активов порекомендуете?

    anthtml
    @anthtml
    Системный администратор программист радиолюбитель
    GLPI + FUsionInventory разбросанный через AD
    Ответ написан
    6 комментариев
  • ДДос атака на nginx пакетами 1 байт?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    500 строк в секунду - это не мощно и, вероятно, даже не DDoS. Если адрес один, то просто закройте ему доступ брандмауэром, а если адреса разные, то настройте лимит запросов в Nginx.

    nginx.conf
    http {
        ...
        limit_req_zone $binary_remote_addr zone=reqlimit:10m rate=30r/s;
        ...
    }

    some_site.conf
    server {
        ...
        location / {
            ...
            limit_req zone=reqlimit burst=10 nodelay;
        }
    }

    После этого запросы с одного ip-адреса начиная с 31-го в секунду будут отбрасываться.

    Как вишенку на торт, можно добавить ещё фильтр для fail2ban:

    nginx-req-limit.conf
    [Definition]
    
    failregex = limiting requests, excess: .* by zone .*, client: <HOST>
    ignoreregex =

    и правило в jail.local
    [nginx-req-limit]
    enabled = true
    port = http,https
    filter = nginx-req-limit
    logpath = /var/www/*/*/logs/error.log # Здесь укажите свой путь к логам виртуального хоста
    findtime = 600
    maxretry = 10
    bantime = 7200

    После этого адреса DoS'еров будут автоматически блокироваться брандмауэром на два часа. Что разгрузит Nginx от обработки паразитного трафика.
    Ответ написан
    11 комментариев
  • На чем написать rest api для kanban доски?

    @ghostiam
    На Go писатель, серверов пинатель.
    На GO, "православный" стек, это стандартный пакет net/http + какой нибудь внешний роутер, например chi, либо вообще не http/rest, а gRPC (если мы говорим об API).
    Для БД чистый SQL, максимум какой нибудь маппер на структуру, типа sqlx(можно ещё использовать sql builder, но в IDE Goland хорошая поддержка чистого sql).

    ORM очень не советую, есть конечно gorm(генерирует запросы не эффективно, N+1 при связях), для мелких проектов хватит, но вот со сложными запросами любая ORM не справляется.
    Я категорически против ORM, так как за всё время моей работы в вебе, в любом проекте, самым слабым звеном всегда была ORM(долбит кучей запросов БД, когда на чистом sql это 1-2 запроса), либо программист, вместо того, чтобы написать запрос вида "SELECT SUM(amount) FROM book WHERE author = 'Petya'", достаёт все записи и суммирует это в коде(делает работу за БД + тратит ресурсы БД на чтение данных с диска и передачу их по сети).

    Не нужно использовать фреймворки, это не даст опыта написания на go(как и в большинстве языков).
    Go используют, где производительности других решений не достаточно, или нужна многопоточность, что фреймворки так себе обеспечивают.
    Шаблоны в go практически не использую, пишу фронт на vuejs и обращаюсь к go api.
    Есть генераторы документаций, но я тут не посоветую, их нужно тестировать отдельно, у каждого есть свои плюсы и минусы, сам использую другое решение(опишу в конце).

    Самое главное, побыстрее понять, что на go нужно писать как на go, а не так как привыкли в других языках, потому-что, в нём нет привычных классов, строгая типизация, процесс живёт долго и могут быть race condition(гонка состояний) при многопотоке(веб сервер многопоточный), поэтому о подходах из php советую поскорее забыть.

    В своих проектах(в проде), использую go только как сервис предоставляющий апи. Недавно начал использовать grpc-gateway(так как использую gRPC, но так же необходимо делать API доступное через web), проект позволяет описать всё что необходимо в proto файлах (см. gRPC), сгенерировать модели и обёртки под большенство языков + документацию в OpenAPI 2.0. Это не фреймворк, это обёртка над стандартным net/http, которая сразу валидирует и маппит данные на структуру.

    Коротко:
    Для новичка, советую забыть про фреймворки(они не помогут в изучении) и ORM(не эффективно).

    Использовать для веб сервера:
    net/http - встроен в го
    chi(проще) или gorilla/mux - роутер

    Для взаимодействия с БД:
    sqlx - обёртка над стандартным пакетом sql, но позволяет сразу считывать данные в структуру, без ручного сканирования.
    Ответ написан
    3 комментария
  • Как вы работаете с пулом соединений postgresql в GO?

    uvelichitel
    @uvelichitel Куратор тега Go
    habrahabr.ru/users/uvelichitel
    database.sql.DB из stdlib непрозрачно поддерживает пул соединений под капотом. Для управления пулом предлагаются методы
    • DB.SetMaxOpenConns
    • DB.SetMaxIdleConns
    • DB.SetConnMaxLifetime

    Манипулирование этими квотами не имеет четких рецептов, нужно пробовать по месту в зависимости от характера нагрузки.
    Когда вы формируете транзакцию db.BeginTxдля нее выбирается свободное соединение из пула.
    Если вам нужно получить в управление постоянное соединение из пула вы делаете
    conn, err := Db.Conn(context)
    и формируете транзакцию conn.BeginTx на этом соединении.
    sqlx и pgx не привносят ничего нового в управление пулом соединений.
    Ответ написан
    Комментировать
  • Файловый сервер на Linux с разграничением прав - в сети Windows?

    alhray
    @alhray
    freenas
    openmediavault (попроще, но тоже имеет право на жизнь. работает 3+ года 24/7 на 200-250 юзверей)
    https://www.freenas.org/freenas-vs-openmediavault/ - сравнение по функционалу
    Ответ написан
    1 комментарий
  • Как перестать говнокодить и принимать неверные архитектурные решения?

    miraage
    @miraage
    Старый прогер
    как писать поддерживаемый код?

    Если уж очень коротко, то соблюдать SOLID/GRASP. Мне понравился твит одного из авторов React Router:
    https://twitter.com/mjackson/status/1171524189850701825

    Most common mistake software developers make: putting stuff in the wrong place. Coupling responsibilities and concepts that should be kept separate.
    For me, this is 95% of software development. Just figuring out *where* things belong.


    Что гуглить, что учить?

    Фундаментальные знания, вроде вышеупомянутых SOLID/GRASP, паттерны (не только классические паттерны, но и вообще, общеизвестные решения определённых задач), базовые структуры данных. Фреймворки/библиотеки всегда будут приходить/уходить, что-то будет забываться. А фундаментальные знания всегда актуальны.

    Может литературу какую почитать посоветуете?

    Скажу за себя. Ни одной из этих известных книжек за свою жизнь не прочитал. Писал много говнокода дома, очень много. Удалял, переписывал. Смотрел код других людей, анализировал, пытался перенять то, что считал правильным.

    Можно ли себя называть миддлом, если твой код говно?

    Не пытайтесь себя оценить. В каждой компании свои понятия миддла. А если кто-то 35 лет на лиспе кодил, а потом прыгнет на Angular - кто он, джун или сеньор?
    И, да, все мы в какой-то степени пишем говнокод. Если кто-то Вам доказывает, что он пишет супер чистый код - не слушайте.

    И ответ на главный вопрос.
    Как перестать говнокодить и принимать неверные архитектурные решения?

    Это невозможно. Все проекты, которые чуток сложнее CRUD-ов, рано или поздно обрастают говнокодом. Никто не пишет идеальный код. Код должен работать и решать проблемы бизнеса.
    Ответ написан
    6 комментариев
  • Какая база данных подойдет для триллионов записей с индексами?

    vagon333
    @vagon333
    Solutions Architect, Full Stack
    Нужно больше информации о задаче:
    1. тип данных: структурированные или нет.
    Предполагаю, что структурированные, под RDBMS
    2. размер записи (в байтах)
    3. кол-во полей в записи
    4. типы данных полей (включая поля с переменной длиной)
    5. назначение базы (OLTP/OLAP)
    6. кол-во индексов и колонки в индексах

    Вот, где-то так.
    При наличии информации выше можно дать взвешенный ответ.
    Иначе получите что-то типа: "Лошадью ходи, лошадью". :)

    Удачи.
    Ответ написан
    2 комментария
  • Есть ли в Golang поддержка MySQL?

    rammtw
    @rammtw
    Press CTRL+S to save project
    Есть. Нужно импортировать стандартный пакет "database/sql"
    и дополнительно драйвер import _ "github.com/go-sql-driver/mysql"
    Ответ написан
    4 комментария
  • Почему большинство работадателей требует знание Linux, а не Unix?

    sabramovskikh
    @sabramovskikh
    Ну смотри. У меня 10 серверов на убунте. Зачем мне твои знания по фряхе и нетбсд?
    Ответ написан
    Комментировать
  • Как через php перезагрузить nginx?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Можно просто по крону раз в 15 минут делать не перезагрузку самого nginx, а только перечитку конфигов.

    в кронтабе для root, с проверкой корректности конфигов:
    15 0 0 0 0  nginx -t  &&  nginx -s reload > /dev/null 2>&1


    Ещё лучше сделать bash-скрипт, где в случае непрохождения теста конфигов, отправлять письмо с восклицаниями.
    Ответ написан
    Комментировать
  • В Postgresql схема: зачем нужна и как я её могу использовать в своих проектах?

    Melkij
    @Melkij
    PostgreSQL DBA
    В оракле схем разве нет?..

    schema - дополнительный уровень структуризации объектов. Как namespace в программировании. И, к слову, входит в стандарт SQL.

    Вы можете сделать таблицы:
    user_subscriptions
    user_orders
    user_favorites
    Вы можете сделать
    user.subscriptions
    user.orders
    user.favorites
    И в этом нет никакой разницы для СУБД. Но может быть удобно разработчику оперировать не с сотней таблиц одним списком, десятки из которых с одинаковыми префиксами (т.к. относятся к своим сущностям), а отдельные схемы по сущностях.

    Пилить же одну таблицу на несколько смысла при этом не так много, зато добавляется хлопот.
    Если вы хотите давать прямой доступ пользователю к базе - то зачем? Не надо так делать в разделяемой среде. Любую СУБД можно положить каким-нибудь интересным запросом. А в то что люди временами будут писать интересные и сильно творческие запросы - по опыту DBA вам гарантирую. Иногда такого наворотят... 0,5тб временный файлов одним запросом, например. Или сожрать 30гб RAM и увести базу в аварийный рестарт от OOM.
    Ответ написан
    1 комментарий
  • Аналоги js в web?

    @itsjustmypage
    Комментировать
  • Какой Linux стоит установить для освоения?

    @G_r_i_g_a
    Сколько людей - столько и мнений. Выбирать систему все таки придется тебе, мы лишь можем выразить мнение основываясь, зачастую, на своем опыте. Поэтому хорошо подумай и начинай пробовать дистрибутивы.
    Тут все зависит от того как легко ты адаптируешься и воспринимаешь информацию.
    Не стоит сразу выбирать дистрибутив "навсегда". Начни с дистрибутива попроще, научись работать с Линуксом в целом, когда поймёшь что тебе важно, вот тогда уже будешь выбирать дистрибутив на постоянку.
    Если основная цель программировать, то смотри где больше всего различных инструментов для этого, да и вообще пакетов в целом. Я начинал с Минт, потому что он требовал меньше всего знаний, было большое количество программ, мне понравился интерфейс, наличие русскоязычного форума. Сначала учился взаимодействовать с магазином приложений, потом постепенно перешёл на синаптик, а потом уже и непосредственно стал использовать апт в консоли. Привыкал к организации файловой системы, разбирался что лежит в корне и какой каталог за что отвечает, в общем самые азы, попутно решая разные проблемы. А они возникли очень быстро, всего через 15 минут после установки и запуска дистрибутива - система просто намертво зависла. Это был тот ещё квест. В итоге оказалось что все дело в драйверах на видеокарту, свободные не очень с ней дружили. Вот тут то я и познакомился впервые с терминалом, т к. система начала виснуть еще при запуске, то пришлось их устанавливать из "виртуального терминала".
    Когда освоился в Минте и основные проблемы решил, начал параллельно устанавливать другие дистрибутивы, настраивать, пробовать, щупать.
    Так я подружился с Дебианом, потому что там было больше места для маневра. Сценарий тот же что и с Минтом. В общей сложности пару лет на Дебиане, и вот я на Арче. Ставил с нуля, настраивал, все прошло быстро, переезжал только долго на него, по причине эмоциональной привязанности к Дебиану, как никак 2 года использования.
    Я скажу так, когда поймёшь что такое Линукс и что за что отвечает, то уже не будет больших проблем почти с любым дистрибутивом, главное уметь искать информацию и адаптировать её к конкретному дистрибутиву. Основы и принципы остаются те же, меняются только команды, названия пакетов и синтаксис. Вот и всё.
    Я начинал с использования гуи, но со временем оказалось что больше использую и предпочитаю терминал. Настройка и редактирование системных файлов происходит в терминале, обновление в терминале, даже часть файловых операций в терминале, выключаю, перезагружаю ПК тоже в терминале. Я и представить не мог что буду им так много пользоваться. Оказывается это очень удобный инструмент. Допустим, чтобы посмотреть смарт жесткого диска, мне проще вбить команду в терминале, чем лезть в меню приложений и искать программу. Вот как то так.
    Так что строй мнение о дистрибутивах не на чужом мнении, а на собственном опыте, потому что никто не решит что тебе лучше, кроме тебя.
    Ответ написан
    Комментировать
  • Как обеспечить отказоустойчивость БД Postgres?

    Melkij
    @Melkij
    PostgreSQL DBA
    как правильно обеспечить надежность и безотказность ее работы?

    Использовать адекватное железо и не мешать базе работать шаловливыми ручками.

    доступен 24 часа 7 дней в неделю.

    бекап

    Объясните, пожалуйста, как это по вашему мнению между собой связано?
    Бекапы необходимы, но как они связаны с высокой доступностью?

    в случае проблем с доступностью, перезапускать/запускать саму СУБД.

    Простой вопрос: зачем?
    Если база сложилась и даже не смогла подняться самостоятельно - значит проблема капительная и разбираться надо детально. Рестартом по кругу вы можете скорее сделать совсем плохо, чем что-либо починить.
    При том обычно проблемы начинаются от того что разработчики выкатили новую версию приложения и та начинает делать что-то странное. Например, забыли сделать индекс на 50гб табличку и засунули запрос с поиском по ней на главную сайта. Рестартом базы это, разумеется, не исправляется. А делает только больнее.

    Многолетней давности pg_postmaster_start_time() впечатлять не буду - мы периодически ставим минорные апдейты на свои базы. И вам тоже весьма рекомендую обновиться до 10.7 или лучше уже на следующих выходных сразу до 10.8.

    А так, если не трогать - то годами будет работать. Мониторинг и алерты от него, разумеется, нужны. Какая-то автоматика при наступлении алерта - обычно приносит куда больше головной боли, чем помогает.

    какие операции, запросы или их комбинации нежелательны для БД и могут привести к проблемам.

    Большая часть инцидентов с недоступностью сервиса с точки зрения приложения - про уровни блокировок. Кто-нибудь попробует сделать create index вместо create index concurrently и привет ожидание блокировки на всю запись в таблицу. Большинство форм alter table сюда же, но они и чтение заблокируют.
    Ответ написан
    Комментировать
  • Как сделать дополнительные мониторы по сети?

    @t38c3j Автор вопроса
    Оказалось все просто)
    xrandr --addmode VIRTUAL1 1920x1080
    xrandr --output VIRTUAL1 --mode 1920x1080
    x11vnc -rfbport 25901 -clip 1920x1080+1920+0 -forever

    А дальше уже на второй машине ставим VNC клиент и подключаемся.
    По аналогии команд выше можно еще один дисплей добавить.
    Ответ написан
    1 комментарий
  • Как деплоить небольшие проекты?

    @Stqs
    senior software developer
    вопросы у вас философские, на каждый можно отвести часы обсуждения
    Полноценный CI/CD поднимать не вижу смысла ввиду размеров

    вы ж все равно собираетесь какие-то скрипты мутить и чото выдумывать,
    какая разница это будут крон скрипты на сервере или джоба в дженкинсе? по-скорости написания - одно и тоже будет. так что по-моему размер тут не имеет значение
    единственное что имеет значение - насколько явно у вас описан процесс(алгоритм) билда/разворачивания приложений
    с этой точки зрения мое видение примерно такое:

    1) git не есть инструмент для развертывания по, git лишь для версионирования кода
    и по-идее результатом вашей работы должен быть не код в гитхабе, а какой-то вменяемый артефакт, готовый к деплою (docker-image, pip пакет, npm пакет, deb пакет, jar, war, zip в крайнем случае, и тд и тп). Если производить артефакты то вопрос с тегами отпадет сам собой - у вас будет артефакт какой-то версии и все
    сервер не должен знать ни про какие гиты и ни про какие-то теги в нем
    Здесь я бы рекомендовал паковать все в докер-имеджи хотя бы только потому, что сервер в итоге не будет знать ничего о зависимостях приложения, нужных библиотеках, ниочем вообще, вам нужно установить только докер
    Огромное преимущество использование докера - в Dockerfile вы вынуждены волей/неволей описать точно и явно все шаги требуемые для установки приложения. И что самое замечательное - это все будет храниться в том же репозитории, под контролем гит - шикарно.
    Артефакты желательно хранить в каком-то артефактории,
    но если реально все просто - то можно хранить несколько последних версий прямо на сервере в какой-нибудь папочке

    2) как только вы получили артефакт - его можно деплоить
    неплохо было б знать особенности вашего проекта, но грубо говоря допустим что достаточно его зааплоадить на сервер, положить в нужное место
    опять же с этим дженкинс справится на ура и займет у вас это все дело 10 минут . Если вы опишете логику в Jenkinsfile вы выиграете еще раз потому что процесс развертывания(алгоритм) будет описан опять же ЯВНО. И будет тоже под контролем гита. (Jenkins должен знать только в каком репозитарии и в каком месте ему искать Jenkinsfile)
    Если же вы будете крутить какой-то спрятанный cron скрипт на сервере - о нем никому ничего не будет известно. Поверьте уже через короткое время все это дело начнет усложнятся, что-то забудется, что-то измениться и это все вместе больно ударит вас по яйцам.

    В чем еще преимущество такого подхода: если вам нужно сделать roll-back на предыдущую версию вам не нужно собирать проект заново выкачивая все с гита, ведь у вас есть предыдущие артефакты, ролбек в таком случае вообще не проблема - просто указываем предыдущую версию артефакта и деплоим еще раз и все

    3) Env Variables
    когда приложение стартует - считывает все что ему нужно из переменных окружения
    деплой джоба может каждый раз эти переменные устанавливать перед тем как деплоить - это было бы тоже круто потому что вы сделали бы это знание так же явным

    Итого имеем
    - логика сборки проекта описана в Dockerfile и находится под гитом
    - логика деплоя находится в Jenkinsfile и находится под гитом, и что самое главное является кодом (Jenkinsfile пишем на груви, для простых вещей вам понадобиться 30 минут изучения и все)
    - на сервере мы ничего не устанавливали совершенно кроме самого докера
    - мы храним несколько версий нашего приложения на всякий случай и можем быстро откатиться не прибегая к гиту вообще
    - сервер не знает ничего о гитах
    - на сервере нет НИКАКОЙ дополнительной логики по разворачиванию вашего приложения
    - имея все это очень легко добавлять другие сервера для деплоя - что нам нужно - грубо говоря указать другой айпи и набор env variables к нему ( если они конечно отличаются)
    giphy.gif
    Ответ написан
    5 комментариев