• Куда копать в сторону поиска ошибки с репликой?

    Melkij
    @Melkij
    PostgreSQL DBA
    Сообщение самодостаточное, ничего не пропущено.
    У вас есть replication slot под названием japan_replica. Неких хост, настроенный как реплика с primary_slot_name = japan_replica каждые wal_retrieve_retry_interval (5 секунд) пытается продолжить репликацию, подключаясь к primary_conninfo. Указанный в primary_conninfo сервер отвечает "товарищ, ты что-то путаешь, этот слот репликации уже используется".
    Один слот репликации = только один читатель.

    Ищите ошибку в конфигурации. Может быть завели вторую реплику на неправильный слот.
    Вьюшки pg_stat_replication, pg_replication_slots и добавление %h в log_line_prefix помогут прояснить происходящее.

    К "нет соединения с базой" отношения не имеет.
    Ответ написан
    2 комментария
  • Как добавить яндекс почту в программу Почта на Mac OS?

    @Vakan
    0. заходим в аккаунт через браузер
    1. включаем "пароли приложений", как ранее посоветовал Mr_Dr_Pr (пароль переписать на листочек, после успеха съесть)
    2. в "Почта → Все настройки → Почтовые программы" ставим галочки "с сервера imap" и "пароли приложений"
    3. на macOS запускаем программу Почта и открываем настройки / учётные записи
    4. нажимаем на экране + / другая уч.зап. / вводим имя, адрес, пароль из пункта 1
    5. появится ошибка "не удаётся проверить имя учётной записи" и окно с доп.настройками
    6. вводим имя пользователя (ваш логин на почту), тип записи imap, сервер входящий imap.yandex.ru, сервер исходящий smtp.yandex.ru
    7. после долгой проверки введённых данных, если возникает ошибка - дозаполнить пустые поля ввода, сохранить (несмотря на ошибку учётная запись создаётся и теперь можно перейти к её настройкам)
    8. в разделе "настройки сервера": имя пользователя = ваш логин, пароль из пункта 1, хост входящей почты imap.yandex.ru , убрать галочку "параметры автоматически", порт 993, поставить галочку "использовать SSL", аутентификация "пароль", доп.настройки imap (префикс пустой, сертификат TLS "нет", убрать галочку "разрешить небезопасную аутентификацию")
    9. далее здесь же настройки исходящей почты: имя пользователя = ваш логин на почту, пароль из пункта 1, имя хоста smtp.yandex.ru , убрать галочку "настроить автоматически", порт 465, поставить галочку "использовать SSL", аутентификация "пароль"
    10. нажать кнопку "сохранить"
    Ответ написан
    Комментировать
  • Как найти данные о судебных делах?

    @ra2003
    На сайте судебных приставов ИНН ЮЛ нет (может и появится когда-нибудь, но это вряд-ли). А ИНН берется из пересечения Наименования компании и адреса (база ЮЛ ФНС должна быть в наличии). Достаточно часто это нетривиальная задача.
    Ответ написан
    Комментировать
  • Нужен ли кассовый аппарат или его аналогия, если продаёшь на сайте доступ в платные разделы?

    Onnem
    @Onnem
    Финансовый клерк
    Не всегда, зависит от того как в целом реализован процесс оплаты. Похожий вопрос задавался тут Можно ли предоставлять услуги (от ИП) физикам и не выдавать чеки? Через посредников? мой ответ там же, это работает вообще со всеми, не только ИП.
    Ответ написан
    Комментировать
  • Чем заклеить провод зарядки Макбука?

    15432
    @15432
    Системный программист ^_^
    Самовулканизирующаяся лента?
    Ответ написан
    Комментировать
  • Чем заклеить провод зарядки Макбука?

    Вот чел заморочился термоусадной трубкой. Просунул таки разъём через неё, изрядно растянув.
    видео
    Ответ написан
    1 комментарий
  • Как в PostgreSQL сделать уникальный идентификатор среди всех таблиц базы (глобально)?

    Athanor
    @Athanor
    Лайк + Решение: не жмись, нажми
    Здравствуйте. То, о чем вы говорите, называется GUID, но какого-то унифицированного одного алгоритма его генерации для всех нет. Но в postgres есть расширения, которые могут вам помочь и вам не придется генерить его на уровне приложения.
    Эта суперкороткая статья может быть вам полезна: https://postgrespro.ru/docs/postgrespro/9.5/dataty... и дать начальный стимул и понимание куда копать дальше. Удачи )

    Update (29.01.20):

    Сразу к делу и примерам. Сделать это можно, например, так:

    -- Начнем со схемы данных. На всякий случай проиллюстрирую как может выглядеть идея генерации guid базой, с которой
    -- я в самом начале и начал. Но вам, наверное, не будет смысла эту функцию использовать, т.к. сценарий использования
    -- у вас другой.
    --
    -- Обратите также внимание, что я поменял тип на BIGINT. У меня была гипотеза, что вы используете TEXT, т.к., возможно,
    -- не знали про BIGINT. Недостаток TEXT в том, что Postgres не построит по нему индекс и выборки по id будут все
    -- медленнее и медленнее. Я бы порекомендовал сразу отрефакторить все так, чтобы использовался именно BIGINT.
    --
    -- Все поля также назвал английскими словами, т.к. это можно считать индустриальным стандартом. NOT NULL добавил
    -- по наитию: логика подсказывает, что PRIMARY KEY у каждой таблице обязателен, как и данные. Просто для полноты.
    
    -- Начнем с функции, которая будет генерировать нам ID для примера.
    
    CREATE OR REPLACE FUNCTION guid()
        RETURNS BIGINT AS
    $BODY$
    BEGIN
        -- Количество секунд с начала эпохи Линукса и домножаем на какой-то множитель, чтобы увеличить точность
        -- и получить 1580307917143.431 вместо 1580307917.143431
        RETURN CAST(EXTRACT(EPOCH FROM NOW()) * 1000 AS BIGINT);
    END;
    $BODY$
        LANGUAGE 'plpgsql' VOLATILE;
    
    -- Теперь перейдем к самой схеме данных и создадим ее.
    
    CREATE TABLE users (
       id BIGINT PRIMARY KEY NOT NULL DEFAULT guid(),
       pseudonym TEXT NOT NULL
    );
    
    CREATE TABLE posts (
       id BIGINT PRIMARY KEY NOT NULL DEFAULT guid(),
       content TEXT NOT NULL
    );
    
    CREATE TABLE comments (
      id BIGINT PRIMARY KEY NOT NULL DEFAULT guid(),
      text TEXT NOT NULL
    );
    
    -- Для того чтобы повесить CONSTRAINT на id целевых таблиц, понадобится сделать VIEW, котоый будет содержать все
    -- id из всех этих таблиц, а также функцию, которую мы сможем использовать для CONSTRAINT. По сути, делаем то же,
    -- что делали бы на уровне приложения, но на уровне БД.
    
    CREATE OR REPLACE VIEW all_ids AS
    SELECT id FROM users UNION
    SELECT id FROM posts UNION
    SELECT id FROM comments;
    
    -- Теперь перейдем к функции, которая и будет выполнять всю грязную работу.
    
    CREATE OR REPLACE FUNCTION is_unique_id (BIGINT)
        RETURNS BOOLEAN AS 'SELECT CASE WHEN
                                       (SELECT 1
                                        FROM all_ids
                                        WHERE  id = $1) > 0
                            THEN FALSE ELSE TRUE END'
        LANGUAGE 'sql' WITH  (isstrict);
    
    -- Осталось только повесить CONSTRAINT
    
    ALTER TABLE users ADD CONSTRAINT id CHECK (is_unique_id(id));
    ALTER TABLE posts ADD CONSTRAINT id CHECK (is_unique_id(id));
    ALTER TABLE comments ADD CONSTRAINT id CHECK (is_unique_id(id));
    
    -- А теперь внимание. Теперь вам придется быть очень внимательным при добавлении таблиц, в рамках которых id должен
    -- быть уникален. При добавлении новой таблцы будет необходимо:
    --   1. Пересоздать VIEW, дополнив запрос новыми таблицами.
    --   2. Не забыть повесить аналогичный CONSTRAINT на новую таблицу.
    --
    -- Также обратите внимание, что при вставке новой записи в любую из таблиц будет проверяться весь созданный VIEW
    -- и очень важно чтобы это был не полнотекстовый поиск, а работали индексы, поэтому так важно отрефакторить все в BIGINT.
    
    -- Пришло время тестирования. Вставляем данные.
    
    INSERT INTO users (pseudonym) VALUES ('Первый');
    INSERT INTO users (pseudonym) VALUES ('Второй');
    
    INSERT INTO posts (content) VALUES ('О том как надо');
    INSERT INTO posts (content) VALUES ('О том как не надо');
    
    INSERT INTO comments (text) VALUES ('Я думаю что решение...');
    INSERT INTO comments (text) VALUES ('Хорошо я пропробую сделать...');
    
    -- И глянем что получилось.
    
    SELECT * FROM users;
    -- 1580326610797	Первый
    -- 1580326611809	Второй
    
    SELECT * FROM posts;
    -- 1580326613690	О том как надо
    -- 1580326613712	О том как не надо
    
    SELECT * FROM comments;
    -- 1580326613779	Я думаю что решение...
    -- 1580326613797	Хорошо я пропробую сделать...
    
    -- Время X: тестируем нашу проверку, пытаясь вставить в таблицу users id из таблицы comments:
    
    INSERT INTO users (id, pseudonym) VALUES (1580326613779, 'tiabc');
    -- [23514] ERROR: new row for relation "users" violates check constraint "id" Detail: Failing row contains (1580326613779, tiabc)
    
    -- Profit!


    Что хочу сказать с точки зрения проектирования архитектуры и вообще. Использование любого нового инструмента должно быть обосновано. Как правило, сложная схема БД ведет к сложностям в поддержке и к тому, что какие-то вещи забывают обновляться, в отличие от уровня приложения.

    В вашем же случае, честно говоря, схему очень сильно хочется упростить, а не усложнить. Хочется добавить поле created_at с DEFAULT CURRENT_TIMESTAMP() и хочется добавить реляционные связи. Либо же в принципе уйти на нереляционную БД и задать структуру сущностей там (что опять же должно быть обосновано).

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

    Помимо этого, поскольку вы делаете процессинг на основе id и его порядковых номеров, не могу не порекомендовать обратить внимание на одни из базовых принципов проектирования ПО. Конечно, вся картина не видна, но я тут вижу нарушение буквы S (Single Responsibility), что id у вас и за порядок отвечает, и за уникальность (да еще и между несколькими таблицами). Хочется как-то их развязать. Со временем жизни продукта это часто оказывается полезно.

    Опять же, беспокойств о том, что вы хотите достичь, достаточно много, но если отвечать именно конкретно на ваш вопрос и давать дополнительно какие-то рекомендации, то как-то так )

    Желаем удачи, образования и всех благ )

    С уважением,
    Иван Томилов
    CEO of Athanor
    Ответ написан
    2 комментария
  • Сколько нужно создавать слотов для 10 реплик при потоковой репликации?

    Melkij
    @Melkij
    PostgreSQL DBA
    Зависит от схемы расположения реплик.

    Каждое соединение репликации использует один из допустимых max_wal_senders хоста к которому подключается. Если вы настраиваете слоты репликации - то вдобавок вам нужно соответствующее число max_replication_slots на этом хосте.
    pg_basebackup в свою очередь использует до двух коннектов max_wal_senders и до одного max_replication_slots (зависит от параметров запуска и версии)

    Так если вы будете копировать все 10 реплик одновременно с помощью basebackup с одной мастер-базы - вам понадобится 20 max_wal_senders и 10 max_replication_slots. После запуска реплик будет использовано 10 max_wal_senders и от 0 до 10 max_replication_slots - смотря как настроите. Для каждой реплики отдельный слот репликации если вы хотите использовать слоты репликации.
    Но это если настраивать репликацию без каскада.
    Коннекты репликации считаются не по кластеру, а подключённые к конкретному инстансу. В случае каскада у вас легко может быть схема, например:
    с мастера репликацию читают 3 реплики, с каждой из них репликацию получают ещё по 3 реплики - вот уже 9 реплик, а использовали только по 3 walsender на хост.

    И при таком числе реплик весьма рекомендую делать каскад. И сеть на мастере поберечь и в случае переключения мастера придётся меньше баз рестартовать (primary_conninfo всё ещё меняется только рестартом всей базы, шанс у моего патча быть принятым в pg13 весьма призрачный)
    Ответ написан
    6 комментариев
  • Стоит ли обновлять Macbook Air 17 до Catalina?

    @Jordan_Belforts
    У меня на air 17 все ок. Недели 2 назад уже как установил
    Ответ написан
    Комментировать
  • Стоит ли обновлять Macbook Air 17 до Catalina?

    @iMaximus
    У меня ничего не лагает даже на mac mini 2011 года. На который официально ее вообще ставить нельзя. На 2х macbook pro 2017г и 2018г тоже все ок. Думаю, вы поняли ответ на свой вопрос :)
    Ответ написан
    Комментировать
  • Сколько будет стоить заказать такую программу на андроид?

    NeiroNx
    @NeiroNx
    Программист
    Сохраняете это в Program.html
    <html>
    <head>
    <title></title>
    <style>
    body,input,button {font-family:Arial;font-size:2em;color:#fff;}
    body {background: linear-gradient(45deg, #2e1d92, #81168f);}
    input {background: none;border: none;border-bottom: 3px solid #fff;text-align: center;}
    label input {width:2em;}
    label.line input{margin-top: .5em;font-size: 1.5em;}
    label:before{content: " ";display: block;width: 1.5em;height: 1.5em;border: 4px solid #fff;border-radius:1em;}
    label.line:before {float:left;margin-top:.75em;margin-right: .4em;}
    label.col:before {margin-top:1em;margin-right: .2em;}
    label.col input {margin-top:.5em;font-size:1em;width:2em;}
    label.white:before{background: #fff;}
    label.red:before{background:#ea3b3b;}
    label.blue:before{background:#4850ed;}
    label.green:before{background:#56e85a;}
    label.black:before{background:#222;}
    button {font-size:1em;background: none;border: 3px solid #fff;border-radius: 1em;margin: 1em;padding: .3em 2em;}
    </style>
    <script>
    function calc(){
    let players = parseInt(pl.value),input = [iw,ir,ib,ig,il],output = [ow,or,ob,og,ol];
    input.forEach(function (v, i){output[i].value=Math.floor(parseInt(v.value)/players);})
    }
    </script>
    </head>
    <body>
    <div style="display:flex;justify-content: center;align-items:center;height:100%">
    <div style="display:flex;align-items:center;flex-direction:column;">
    <div style="text-align:center;">Кол-во участников:</div>
    <input type="text" size="1" id="pl">
    <label class="line white"><input type="text" id="iw"></label>
    <label class="line red"><input type="text" id="ir"></label>
    <label class="line blue"><input type="text" id="ib"></label>
    <label class="line green"><input type="text" id="ig"></label>
    <label class="line black"><input type="text" id="il"></label>
    <button onclick="calc()">Считать</button>
    <div>Кол-во фишек на одного игрока</div>
    <div style="display:flex;justify-content: space-evenly;width:100%">
    <label class="col white"><input type="text" id="ow"></label>
    <label class="col red"><input type="text" id="or"></label>
    <label class="col blue"><input type="text" id="ob"></label>
    <label class="col green"><input type="text" id="og"></label>
    <label class="col black"><input type="text" id="ol"></label>
    </div>
    </div>
    </div>
    </body>
    </html>

    С вас 300 рублей, целый час провозился...
    5df0de529450e741675030.jpeg
    Ответ написан
    Комментировать
  • Можно ли использовать Yandex/Google для небольших рассылок MailChimp?

    Если речь идет о рассылке с адреса в вашем домене, привязанного к Яндексу через Mailchimp (а не через Yandex), то никаких ограничений, кроме тех, что установлены получателями писем нет. Если у вашего домена достаточно хорошая репутация, подписчики лояльны и содержимое писем не является спамным и не нарушает каких-либо политик получателей, проблем с рассылкой быть не должно. 2K писем относительно небольшое число, такая рассылка не требует предварительной "прогревки" или других действий.

    Но обязательно настройте SPF и DKIM в вашем домене по инструкциям Mailchimp, чтобы отправляемые письма имели авторизацию вашего домена.
    Ответ написан
    7 комментариев
  • Можно ли использовать Yandex/Google для небольших рассылок MailChimp?

    У Яндекса ограничение на 2000 писем в сутки. По крайней мере мы уткнулись в такое пару лет назад, после чего перешли на собственные сервера рассылок.
    Текущие ограничения можно найти в документации к сервисам.
    Ответ написан
    21 комментарий
  • Как проверить Mac OS на трояны и всё такое?

    lukoie
    @lukoie
    1 это не троян, а косяк календаря. надо в календаре в настройках запретить приглашения со стороны.
    2 это проблема расширений. удаляете(не отключаете) все расширения, и пользуетесь день-второй для теста.

    если хотите все таки провериться, советую Аваст для Мака
    тем более
    https://www.av-test.org/en/antivirus/home-macos/
    https://www.macworld.com/article/3263722/best-anti...
    Ответ написан
    7 комментариев
  • Что происходит при выполнении bundle install?

    DevMan
    @DevMan
    происходит простая вещь - установка описанных зависимостей.
    и зависимости устанавливаются для каждого проекта, ибо у разных проектов могут быть разные зависимости.
    Ответ написан
    31 комментарий
  • Как узнать, что ajax-запрос точно пришёл с моего сайта, а не кто-то пытается сам его вызвать со своей машины?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Гарантированно - никак. С помощью того же cURL можно полностью имитировать работу браузера с вашим сайтом.
    Ответ написан
    Комментировать
  • Как сделать статью в виде рецензии?

    mihdan
    @mihdan
    WordPress-евангелист, ведущий РНР - разработчик
    Я бы рекомендовал создать Шаблон страницы и выбирал бы его для нужных страниц в админке. Есть годный пост 3 способа создать шаблон страницы.

    Или воспользоваться готовым плагином Schema — All In One Schema Rich Snippets или более продвинутым платным аналогом Schema Pro.
    Ответ написан
    4 комментария
  • Как скопировать сайт на wordpress?

    Punkie
    @Punkie
    https://ru.wordpress.org/plugins/duplicator/

    Заходим в плагин, жмем "Create package". Далее, далее, далее.
    Получаем installer.php и архив. Заливаем их на новый хостинг (домен). Запускаем site.com/installer.php. Вводим новые логин-пароль от базы данных.
    Далее, далее, далее.
    В конце делаем по инструкции на экране - логинимся в вп, пересохраняем постоянные ссылки. Удаляем файлы инсталлятора и архив.
    Всё. Всё перенесено.
    Ответ написан
    Комментировать
  • Находил ли кто-то реализацию эмоций для голосования как у facebook?

    Как я это вижу - создаете enum с видами реакций (0 -like, 1 - love и т.д.), в базе создаете таблицу связей с колонками user_id, post_id, reaction (уникальность по паре первых ключей). При открытии поста подгружаете из этой таблицы все лайки по post_id+user_id, группировка по reaction с подсчетом COUNT. В бэкэнде сделайте обработчик /ajax/react и отправляйте туда reaction_id, post_id в зависимости от нажатой кнопки и обновляйте таблицу связей по этим данным.
    UPD: не прочитал, что вы ищете именно готовое
    Ответ написан
    1 комментарий