• Как отправить длинное SMS с помощью SMPP?

    grantur5707
    @grantur5707
    Full Stack Web Developer
    Для отправки длинных SMS необходимо вручную разбить сообщение на части и указать, что эти части составляют одно целое сообщение. Для этого нужно использовать механизм сегментирования сообщений, который реализуется через UDH (User Data Header).

    Пример реализации такого скрипта согласно стандарту GSM:

    const smpp = require('smpp');
    const session = smpp.connect('smpp://your-smpp-server');
    
    function splitMessage(message) {
      const messageParts = [];
      const partSize = 153;
      for (let i = 0; i < message.length; i += partSize) {
        messageParts.push(message.substring(i, i + partSize));
      }
      return messageParts;
    }
    
    function sendLongSms(session, destination, source, message) {
      const parts = splitMessage(message);
      const refNumber = Math.floor(Math.random() * 255);
      const totalParts = parts.length;
      
      parts.forEach((part, index) => {
        const udh = Buffer.from([
          0x05, // UDH length
          0x00, // IEI (Information Element Identifier)
          0x03, // Length of header
          refNumber, // Reference number (randomized)
          totalParts, // Total number of parts
          index + 1, // Current part number
        ]);
    
        const shortMessage = Buffer.concat([udh, Buffer.from(part, 'utf-8')]);
    
        session.submit_sm({
          destination_addr: destination,
          source_addr: source,
          short_message: shortMessage,
          data_coding: 0,
        }, (pdu) => {
          if (pdu.command_status === 0) {
            console.log('Message sent successfully.');
          } else {
            console.error('Message failed with status:', pdu.command_status);
          }
        });
      });
    }
    
    session.bind_transceiver({
      system_id: 'your_system_id',
      password: 'your_password',
    }, (pdu) => {
      if (pdu.command_status === 0) {
        console.log('Connected');
    
        const longMessage = 'Your very long message goes here...';
        sendLongSms(session, 'destination_number', 'source_number', longMessage);
      } else {
        console.error('Failed to connect:', pdu.command_status);
      }
    });
    Ответ написан
    4 комментария
  • Как динамически делать выборку по дням, неделям или месяцам?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как вы видите, тут идёт выборка за 2 дня: 2024-04-09 и 2024-04-10. Но проблема в том, что количество дней указывает пользователь и их может быть сколько угодно. Подскажите, как правильно сделать, что если пользователь указал, например, 10 дней, то выборку сделать за 10 дней (начиная от сегодня)?

    Я вижу, что количество выходных полей зависит от внешних условий. То есть структура выходного набора динамическая, а всё вместе это по сути сводная таблица. То есть штука совсем даже не реляционная.
    Да, некоторые СУБД имеют встроенные средства для формирования PIVOT TABLE. Yо вот у MariaDB с этим не очень.

    Рекомендую - на стороне СУБД получать нормализованный набор записей (country_id, ts, MAX(hangup_rate), MAX(all_answered)), а сводную строить уже на клиенте.
    Ответ написан
    Комментировать
  • Как посчитать сумму значений value в колонках с одинаковым id?

    @alexalexes
    Проверьте этот вариант:
    SELECT o.id, o.variant_id, 
                /* vp.variant_id,  */ -- заджойненные id дублировать в выборке не нужно, если, конечно, не хотите наблюдать null-значения по другую сторону присоединения таблицы vp
                  vp.quantity AS quantity_result,
                sum(vp.quantity) over (partition by vp.variant_id) as sum_by_variant_id -- сумма в пределах партиции variant_id
    FROM orders AS o
    LEFT JOIN variant_products AS vp ON vp.variant_id = o.variant_id
    LEFT JOIN products AS p ON p.id = vp.product_id
    LEFT JOIN product_types AS pt ON pt.id = p.type_id
    /*WHERE */                               and pt.id NOT IN (1, 2) -- если напишите в where, то выборка усечется до такого условия с pt.id. Но если напишите это условие в left join, то выберутся все Order, но где pt.id IN (1, 2) будут null значения.

    Но скорее всего вот такой вариант пойдет:
    SELECT o.id, o.variant_id, 
                /* vp.variant_id,  */ -- заджойненные id дублировать в выборке не нужно, если, конечно, не хотите наблюдать null-значения по другую сторону присоединения таблицы vp
                sum(vp.quantity) as sum_by_variant_id -- сумма в пределах группировки o.id, o.variant_id 
    FROM orders AS o
    LEFT JOIN variant_products AS vp ON vp.variant_id = o.variant_id
    LEFT JOIN products AS p ON p.id = vp.product_id
    LEFT JOIN product_types AS pt ON pt.id = p.type_id
    /*WHERE */                               and pt.id NOT IN (1, 2) -- если напишите в where, то выборка усечется до такого условия с pt.id. Но если напишите это условие в left join, то выберутся все Order, но где pt.id IN (1, 2) будут null значения.
    group by o.id, o.variant_id /*, vp.variant_id  */

    PS: Вы уверены в применении left join? Не просто join?
    Ответ написан
    Комментировать
  • В чем разница между двумя подходами?

    Alexandroppolus
    @Alexandroppolus
    кодир
    в обоих кейсах getCampaigns возвращает промис с результатом селекта, практической разницы нет
    Ответ написан
    6 комментариев
  • Как использовать полученное значение из подзапроса для join?

    @alexalexes
    Если я не напутал с окном partition by va.order_id, apa.sale_type_id, то скорее всего можно переписать так:
    select json_build_object('id', A.id, 'status', A.status)
    from (select apa.id,  apa.status, va.created_at,
                 row_number() over (partition by va.order_id, apa.sale_type_id order by apa.created_at desc) Rn 
              from vt.applications va
              join orders o on va.order_id = o.id 
              join cc.additional_projects_actions apa on apa.order_id = va.order_id
              and apa.sale_type_id = va.sale_type_id
              where o.id = 64
              and va.sale_type_id is not null
    ) A
    where A.Rn = 1 -- отсекаем 1 запись - аналог order by apa.created_at desc limit 1 из первоначального запроса
    order by A.created_at desc;
    Ответ написан
    1 комментарий
  • Почему нарушается последовательность вывода записей из списка при рендере?

    Krasnodar_etc
    @Krasnodar_etc
    fundraiseup
    Смотреть, как у вас заполняется dropMysteryBoxes.editable[somekey]. value . Может вам их бэк не в том порядке возвращает? Вообще, в объектах не гарантированный порядок ключей, возможно придётся добавить сортировку после Object.entries
    Ответ написан
    4 комментария
  • Как во Vue 3 добавить default value для input?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Редактируйте через инпут локальное значение:

    const filters = reactive({});

    <input v-model="filters.search">

    За которым установите наблюдение - там будут ваши debounce и отправка в стор:

    watch(
      () => filters.search,
      debounce(search => store.commit('setFilters', { search }), 1500)
    );

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

    watch(
      store.state.filters,
      val => Object.assign(filters, val), { immediate: true }
    );

    https://jsfiddle.net/xs40j5o1/
    Ответ написан
    Комментировать
  • Можно ли лезть в ИБ с python?

    @Drno
    Можно. Иб это не про програмирование
    Ответ написан
    Комментировать
  • Стоит ли придерживаться всех правил Eslint в Vue?

    Fragster
    @Fragster
    помогло? отметь решением!
    В описании к правилам описана мотивация, зачем так сделано. Если же она не устраивает - можно отключать, подумав.
    Например из раздела Essential я бы ничего не выключал, даже multi-word-component-names. Чаще всего такое встречается для элементов лэйаута. При этом всегда можно изменить имена на TheHeader (для одного лэйаута, и получить козию при нескольких лэйаутах) или MainLayoutHeader и т.п.
    А для автоисправляемых правил типа singleline-html-element-content-newline я вообще не понимаю, в чем проблема.
    Ответ написан
    3 комментария
  • По какому принципу работают плагины «линейки» в браузере?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Плагин Dimensions замеряет расстояния через canvas. Реализация выглядит достаточно сложно...

    Глаза боятся, а руки делают. Реализация не такая уж и сложная. Если на пальцах, то основной скрипт в основе dimensions берет данные по цветам всех пикселей картинки, координаты, откуда начать, а дальше просто ходит влево, вправо, вверх и вниз по пикселям и смотрит, насколько они отличаются по цвету. Если сильно отличаются - значит у нас нашлась граница между элементами. Сколько пикселей насчитал до границы - столько и показывает нам в ответ. И дальше весь вопрос в том, откуда взять картинку и координаты. В случае с расширением для браузера - он делает скриншот страницы и берет текущие координаты мышки. Но можно этот скрипт и отдельно от расширения использовать, просто скармливая ему свои картинки и координаты - это универсальная штука.

    Поскольку скрипт ходит по пикселям туда-сюда и ищет границы - он может находить их вне зависимости от их формы, не только прямоугольные. Это в нем самое важное. Принципиально более простое решение той же задачи вы не придумаете. В любом случае придется искать границы.

    Если делать тупую линейку чисто в браузере чисто до прямоугольных границ элементов, то можно было бы брать getBoundingClientRect и координаты мыши и вычитать одно из другого. Это будет более простое решение более простой задачи. Но не той же самой.
    Ответ написан
    1 комментарий
  • Какие есть бесплатные/очень не дорогие API для базового SEO?

    opium
    @opium
    Просто люблю качественно работать
    Ну надо понимать что апи такие стоят кучу за Алексу мы отдавали несколбко сотен баксов за немного запросов, какой нибудь симилар веб уже за 10к баксов, суть таких сервисов в том что они сами все измеряют а не покупают готовое
    Ответ написан
    4 комментария
  • Какие есть бесплатные/очень не дорогие API для базового SEO?

    Grinvind
    @Grinvind
    Помогаю увеличивать трафик с поисковых систем
    Topvisor
    PixelTools
    Арсёнкин тулс
    На самом деле их прям дофига. Стоит скорее найти интересующий функционал у сервисов, и дальше уточнять наличие API.
    Ответ написан
    2 комментария
  • Почему возникает ошибка при запуске next.js и как её исправить?

    @historydev Автор вопроса
    Редактирую файлы с непонятными расширениями
    Что за закон подлости???? Как только я пишу сюда, уже отчаявшись от собственной беспомощности, нахожу решение. Просто рофл парни) Мне помогло это:

    npm uninstall next && npm i next
    Ответ написан
    Комментировать
  • Как исправить ошибку "Text content did not match" в Next.JS?

    Krasnodar_etc
    @Krasnodar_etc
    fundraiseup
    Я думаю, что через dynamic + ssr: false нужно подключать не контекст/провайдер, а сам компонент, который работает со значением из стораджа и меняет разметку в зависимости от него
    Ответ написан
    3 комментария
  • Как лучше учить английский?

    @nuubie
    Начал учить в 24 года английский с абсолютного "0", т.к. в школе/универе учил только немецкий, в 28 лет сдал IELTS на 7.0.

    Несколько советов:
    1. Рекомендую учить английский только по учебникам на английском. Много времени потратил впустую на попытки выучить по Драгункиным, Илонам Давыдовым, Бонкам и т.п... Лучший вариант - взять самые простые уровни Headway и Cutting Edge и последовательно их проходить .
    2. Нужен наставник, чем выше левел, тем более опытный. Upper-Intermediate - Advanced нужен профессиональный преподаватель, желательно сам прошедший хоть какой-то международный экзамен или сертификацию.
    3. Практика - регулярное общение с носителями языка очень быстро убирает т.н. "языковой барьер" даже если сам два слова не можешь связать.
    4. Чтобы грамотно говорить и писать - надо зубарить грамматику регулярно. Лучшие учебники по грамматике: English Grammar in Use и MyGrammarLab, остальное выбирайте на свой вкус. Кроме грамматики есть еще куча нюансов в зависимости от стиля общения/письма: formal/semiformal/informal, в зависимости от страны British/American/Australian English.
    5. Регулярность занятий: выделял 20 - 30 часов еженедельно для самостоятельных занятий, когда стало больше практики на работе - достаточно 4 - 6 часов на самостоятельное изучение и 4 - 6 часов на курсы на работе+speaking club с носителями языка.
    6. Очень помогает понять свои слабые стороны и адекватно оценить текущий уровень сдача экзаменов IELTS, TOEFL.
    7. Многое зависит от целей которые вы перед собой ставите, просто поехать пообщаться в другой стране достаточно с уровнем pre-intermediate+язык жестов :) Если для карьеры - то лучше сразу брать курсы Market Leader или Business Result, English for IT pros и т.д. Во-первых, лексики нужной быстрее наберетесь, во-вторых, материал будет понятней, т.к. тесно связан с вашими интересами.
    8. Есть масса аудиоподкастов и видеоуроков, мне нравятся: EnglishBusiness Pod, ESL Pod, EnglishVid, openlanguage.com
    Ответ написан
    3 комментария
  • Можно ли использовать бесплатный тариф на mongodb.com для блога?

    @MyJaneDoe
    А как много данных вы собираетесь хранить? Не будет ли проще запустить на своем сервере docker-контейнер монги и сохранять все туда (если вдруг места нужно не много)?

    UPD:
    Не знаю откуда вы. Но если из России или РБ, то в текущих реалиях хранить данные лучше или на местных облаках иди в уже упомянутом докере. К сожалению, заграничные сервисы могут внезапно прокинуть вас и данные блога улетят в небытие.
    Ответ написан
    3 комментария
  • Можно ли использовать бесплатный тариф на mongodb.com для блога?

    Подводные камни в том, что бесплатный тариф даёт очень мало ресурсов.
    Если тебе 512мб хранилища и негарантированных vCPU и RAM - дерзай.
    В целом такой тариф для прода не рекомендуется.
    Ответ написан
    8 комментариев
  • Нужен ли Vuex в Vue 3?

    AlbertName
    @AlbertName
    Senior Javascript Developer
    Однозначно ответить на этот вопрос нельзя. Зависит от приложения. К тому же сейчас для третьего вью по дефолту pinia является стором.

    Но и при помощи композишн можно организовать подобие vuex стора, ипмпоритируя ref и reacrive из vue.

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

    Самое главное, это понять для чего это нужно использовать. Если в простом изложении, то чтобы организовать связь между компонентами минуя пропс. Связь с реактивными данными. В случае изменения данных в одном месте (клмпоненте), другой компонент отреагирует на это изменение.
    Ответ написан
    2 комментария
  • Почему я не могу получить список категорий?

    Grapeoff
    @Grapeoff
    В чём концепция...?
    Скорее всего имя коллекции отличается от имени той коллекции, в которой ищет Mongoose.

    Вызов mongoose.model устанавливает имя коллекции, к которой привязана модель, по умолчанию используется имя модели в нижнем регистре во множественном числе.

    Источник: https://stackoverflow.com/questions/14183611/mongo...

    Мне кажется, что в вашем случае проблема та же, ибо других вариантов я не представляю.
    Ответ написан
    2 комментария