• Нужен ли кассовый аппарат или его аналогия, если продаёшь на сайте доступ в платные разделы?

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

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

    Вот чел заморочился термоусадной трубкой. Просунул таки разъём через неё, изрядно растянув.
    видео
    Ответ написан
  • Чем заклеить провод зарядки Макбука?

    DanceM
    @DanceM
    Кто хочет -ищет способ, кто не хочет -ищет причину
    Воспользуйтесь изолентой на тканевой основе.
    PS: "Изолента салонная тканевая с ворсом TESA 51608"

    Ну а вообще, как бы пора новый провод покупать.
    Ответ написан
  • Как в 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
    Ответ написан
  • Сколько нужно создавать слотов для 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 весьма призрачный)
    Ответ написан
  • Стоит ли обновлять Macbook Air 17 до Catalina?

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

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

    Сохраняете это в 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
    Ответ написан
  • Почему некоторые люди утврерждают что плохо использовать jQuery?

    locky_yotun
    @locky_yotun
    Я видел некоторый джаваскрипт
    Заказчику вообще побоку на чем написан сайт — хоть на Visual Basic делайте — главное чтобы все работало (ну и если заказчик чуть умнее — чтобы можно было это чудо поддерживать в будущем — тут конечно Visual Basic не пойдет))
    А про jQuery — ничего в нем плохого нет, кроме того что он устарел (читайте — не нужен).
    Ответ написан
  • Можно ли использовать Yandex/Google для небольших рассылок MailChimp?

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

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

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

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

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

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

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

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

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

    Punkie
    @Punkie Куратор тега WordPress
    Немножечко вордпрессирую
    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: не прочитал, что вы ищете именно готовое
    Ответ написан