• Как узнать курс валюты в командной строке терминала?

    erge
    @erge
    Примус починяю
    curl + awk
    curl -s https://www.cbr.ru/scripts/XML_daily.asp | awk -F '</Valute>'  '{for (i=1; i<=NF; i++) if($i ~ /USD|EUR/) print substr($i, index($i, "CharCode")+9,3)" "substr($i, index($i, "Value")+6,7)}' 2>/dev/null


    wget + awk
    wget -qO- https://www.cbr.ru/scripts/XML_daily.asp | awk -F '</Valute>'  '{for (i=1; i<=NF; i++) if($i ~ /USD|EUR/) print substr($i, index($i, "CharCode")+9,3)" "substr($i, index($i, "Value")+6,7)}' 2>/dev/null


    Perl
    perl -MLWP::Simple -e '$_=get("https://www.cbr.ru/scripts/XML_daily.asp");while(m/(USD|EUR).+?Value>([^<]+)/g){print "$1 $2\n"}'


    Python
    python3 -c 'import requests,re;print("\n".join([" ".join(i.groups()) for i in list(re.finditer(r"(USD|EUR).+?Value>([^<]+)", requests.get("https://www.cbr.ru/scripts/XML_daily.asp").text))]))'


    PowerShell
    # вариант 1 (RegEx)
    (Invoke-WebRequest -UseBasicParsing -URI 'https://www.cbr.ru/scripts/XML_daily.asp').Content | Select-String '(USD|EUR).+?Value>([^<]+)' -AllMatches | foreach {$_.Matches.Groups[1,2,4,5].Value}
    # вариант 2 (XML/XPath)
    ([xml](Invoke-WebRequest -UseBasicParsing -URI 'https://www.cbr.ru/scripts/XML_daily.asp').Content).SelectNodes('//Valute[CharCode="USD" or CharCode="EUR"]') | ft Name,Value


    JavaScript (Node.js)
    node -e "https.get('https://www.cbr.ru/scripts/XML_daily.asp',r=>{s='';r.on('data',d=>s+=d);r.on('end',()=>[...s.matchAll(/(USD|EUR).+?Value>([^<]+)/g)].forEach(e=>console.log(`${e[1]} ${e[2]}`)))})"
    Ответ написан
    Комментировать
  • Как заполнить таблицу в цикле Mysql?

    erge
    @erge
    Примус починяю
    т.к. вы не указали версию БД, то предлагаемое ниже решение написано в рамках 8+ версии
    предполагаю что product_attr_id - это автоинкрементный PRIMARY KEY
    В итого, все делается одним запросом и без циклов.
    делаем две рекурсивные CTE (см. Recursive Common Table Expressions), реализуем в них "счетчики", объединяем их и получаем желаемое, далее дело техники, в итого получаем

    INSERT INTO product_attr (attr_7, attr_29)
    WITH RECURSIVE
      param AS
    (
      SELECT
        461  AS attr_7_start,  -- начальное значение для attr_7
        10   AS attr_7_num,    -- количество итераций в attr_7
        1097 AS attr_29_start, -- начальное значение для attr_29
        3    AS attr_29_num    -- количество итераций в attr_29
    ),
      attr29_iter (n) AS
    (
      SELECT 0
      UNION ALL
      SELECT n + 1 FROM attr29_iter, param WHERE n < attr_29_num -1
    ),
     attr_7_iter (n) AS
    (
      SELECT 0
      UNION ALL
      SELECT n + 1 FROM attr_7_iter, param WHERE n < attr_7_num -1
    ),
      gen_inc AS
    (
      SELECT i7.n as inc7, i29.n as inc29
        FROM attr_7_iter i7, attr29_iter i29
    )
    SELECT attr_7_start + inc7, attr_29_start + inc29
      FROM gen_inc, param
      ORDER BY 1,2
    ;


    PS: для удобства, вынес так называемые параметры в отдельную CTEшку param

    см. пример на dbfiddle

    UPDATE:
    для "прохода" по нескольким продуктам по их категориям, просто включаете таблицы product и category в общее объединение во внешнем запросе SELECT

    INSERT INTO product_attr (product_id, product_price, product_old_price, attr_7, attr_29)
    WITH RECURSIVE
      param AS
    (
      SELECT
        461  AS attr_7_start,  -- начальное значение для attr_7
        14   AS attr_7_num,    -- количество итераций в attr_7
        1097 AS attr_29_start, -- начальное значение для attr_29
        3    AS attr_29_num    -- количество итераций в attr_29
    ),
      attr29_iter (n) AS
    (
      SELECT 0
      UNION ALL
      SELECT n + 1 FROM attr29_iter, param WHERE n < attr_29_num -1
    ),
     attr_7_iter (n) AS
    (
      SELECT 0
      UNION ALL
      SELECT n + 1 FROM attr_7_iter, param WHERE n < attr_7_num -1
    ),
      gen_inc AS
    (
      SELECT i7.n as inc7, i29.n as inc29
        FROM attr_7_iter i7, attr29_iter i29
    )
    SELECT p.product_id, p.product_price, p.product_old_price, attr_7_start + inc7 AS attr_7, attr_29_start + inc29 AS attr_29
      FROM gen_inc, param, product p, category c
      WHERE p.product_id = c.product_id
        AND c.category_id NOT IN (214, 221, 220, 217, 216, 215, 48, 42, 40, 45, 46, 44, 50, 41, 43, 31, 178, 89, 47, 179, 177, 120, 121, 59, 58, 32, 37, 56, 53, 54, 55, 29, 28, 30, 176, 237, 113, 116, 175, 114, 196, 195, 197, 218, 219, 33, 93, 92, 91, 81, 90)
      ORDER BY 1, 4, 5
    ;


    см. пример на dbfiddle
    Ответ написан
  • Как прописать регулярное выражение для замены в Notepad++?

    erge
    @erge
    Примус починяю
    поиск ^(\s*?\$[^=]+=\s*explode.*?)\);$
    замена \1 ?? '');

    см. пример

    UPDATE
    поиск ^(\s*?\$[^=]+= *explode.*?)\);
    см. пример

    UPDATE2
    сделать такое....
    поиск ^(\s*?\$[^=]+= *explode.*?)(\);)
    замена \1 ?? ''\2
    Ответ написан
  • Как удалить повторяющиеся строки с IP более N раз?

    erge
    @erge
    Примус починяю
    UPDATE:
    Через регулярку можно, если предварительно отсортировать строки

    В Notepad++ есть следующие операции:

    Сортировка:
    выбрать в меню
    En - Edit -> Line Operations -> Sort Lines Lexicographically Ascending
    Ru - Правка -> Операции со Строками -> Сортировка по возрастанию (По первой цифре)

    Удаление дубликатов:
    выбрать в меню
    En - Edit -> Line Operations -> Remove Consecutive Duplicate Lines
    Ru - Правка -> Операции со Строками -> Удалить последовательные дубликаты строк


    Через регулярку - сначала сортируем список (как описано выше), затем делаем замену через регулярку:
    Найти: (\d+\.\d+\.\d+\.\d+:\d+[\r\n]*)(?:\1)+
    Заменить на: \1

    Это удалит все дубликаты
    см. пример на regex101

    Если необходимо N-раз, то
    Найти: (\d+\.\d+\.\d+\.\d+:\d+[\r\n]*)(?:\1){2,}
    Заменить на: \1

    где цифра в фигурных скобах = N-1
    см. пример на regex101

    см. так же Регулярные выражения в Notepad++ готовые примеры, и т.п. в гуглояндексе...

    так же удаление дубликатов можно сделать через варианты:
    • в Notepad++сначала сортируем все строки, затем удаляем дубликаты, см. выше пункты меню
    • в bash сделать
      cat ip.lst | sort | uniq

    • использовать MS Excel (LibreOffice и т.п.), см. Yandex - Excel удалить дубликаты

    Ответ написан
  • Как подключиться к БД на oracle VM virtualbox c основной ОС?

    erge
    @erge
    Примус починяю
    А почему у вас во втором Rule 2 стоит IP 192.168.122.1 а не 10.0.2.15 если по 10.0.2.15 соединяется на SSH гостя ???

    UPD:
    В SQL Developer необходимо указать непосредственно порт подключения 1520, т.к. он отличается от стандартного, либо в правиле указать портфорвардинг один к одному 1521 на 1521, если конечно на хосте этот порт свободен.
    Ответ написан
  • Как по полю дататайм посчитать 90ый процентиль?

    erge
    @erge
    Примус починяю
    Не знаю почему у вас не работает!? percentile_disc нормально работает непосредственно с datetime :

    SELECT
      dt,
      DATEADD(MILLISECOND, pctcont_90_dt % 1000, DATEADD(SECOND, pctcont_90_dt / 1000, '19700101')) AS pctcont_90_dt,
      pctdisc_90_dt
      FROM (
        SELECT
          dt,
          CAST(
            percentile_cont(.90)
              WITHIN GROUP (ORDER BY (datediff_big(MS, '1970-01-01', dt)))
              OVER()
            AS BIGINT
          )
            AS pctcont_90_dt,
          percentile_disc(.90)
            WITHIN GROUP (ORDER BY dt) over()
            AS pctdisc_90_dt
        FROM test
      ) t
    ;


    см. пример на dbfiddle
    см. также percentile_disc vs percentile_cont
    Ответ написан
    Комментировать
  • Как "убить" и закрыть tmux через 10 минут?

    erge
    @erge
    Примус починяю
    ## запускаем tmux и отправляем его в фон, добавив в конце строки &
    ## где ... - это ваши параметры запуска tmux
    tmux ... &
    
    ##  ждем 610 сек и прибиваем tmux
    sleep 610 && killall -9 tmux


    UPD:
    если надо убить конкретный tmux, то в скрипте с вызовом tmux пишем...

    #!/bin/bash
    tmux new-session \; \
      send-keys 'htop' C-m \; \
      split-window -v -p 75 \; \
      split-window -h -p 30 \; \
     send-keys 'watch -n1 sensors' C-m \; \
      select-pane -t 1 \; \
      split-window -h   \; \
      send-keys './disk.sh' C-m \; \
      split-window -v -p 20 \; \
      send-keys './stress.sh' C-m \; &
    
    sleep 610 && kill -9 $!


    PS: обратите внимание, что в конце команды tmux стоит амперсанд - &
    Ответ написан
    9 комментариев
  • Можно ли посчитать количество пар с помощью sql запроса?

    erge
    @erge
    Примус починяю
    Результат больше похож на количество дублирующихся записей, а не на количество пар, потому что по количеству пар результат будет такой:

    столбец1  столбец2  результат
    фф           123            1
    фф           456            0
    йцу          123            0


    так как все же не понятно что вам необходимо, вот несколько вариантов:

    -- количество дублирующихся записей
    SELECT столбец1, столбец2, count(*)
      FROM таблица
      GROUP BY столбец1, столбец2;
    
    -- количество ПАР!!
    SELECT столбец1, столбец2, count(*) div 2
      FROM таблица
      GROUP BY столбец1, столбец2;
    
    -- если необходимо именно как в вопросе (количество дублирующихся записей):
    SELECT t1.столбец1, t1.столбец2, cnt AS результат
      FROM таблица t1
      JOIN (
      SELECT столбец1, столбец2, count(*) cnt
      FROM таблица
      GROUP BY столбец1, столбец2) t2 ON t2.столбец1 = t1.столбец1
                                     AND t2.столбец2 = t1.столбец2
    ;
    
    -- если необходимо именно как в вопросе (КОЛИЧЕСТВО ПАР!!):
    SELECT t1.столбец1, t1.столбец2, cnt div 2 AS результат
      FROM таблица t1
      JOIN (
      SELECT столбец1, столбец2, count(*) cnt
      FROM таблица
      GROUP BY столбец1, столбец2) t2 ON t2.столбец1 = t1.столбец1
                                     AND t2.столбец2 = t1.столбец2
    ;


    см. пример на dbfiddle

    PS: т.к. вы не указали СУБД, пример написан для MySQL 8
    для SQL Server div надо заменить на обычный оператор /
    для Oracle count(*) div 2 надо заменить на CEIL(count(*) / 2)
    и должно работать.
    Ответ написан
    Комментировать
  • Удалить запрещённое слово, но ошибка, как исправить?

    erge
    @erge
    Примус починяю
    как-то так:

    if (message.text  is not None and bad_words[f] in message.text.lower()  or
        message.photo is not None and bad_words[f] in message.caption.lower() or
        message.video is not None and bad_words[f] in message.caption.lower()):
        await bot.delete_message(message.chat.id, message.message_id)
        break


    UPDATE:
    Поправил ответ в соответствии с комментарием o5a
    Ответ написан
  • Можно ли удалить с помощью регулярного выражения все не UNICODE символы из колонки?

    erge
    @erge
    Примус починяю
    ну, если задача стоит почистить именно UNICODE!? это строка вида
    \u0442\u0435\u043a\u0441\u0442\u0020\u0432\u0020\u044e\u043d\u0438\u043a\u043e\u0434


    то примерно как-то так:

    поиск
    (\\u[0-9a-zA-Z]{4})(?!\\u[0-9a-zA-Z]{4}).*?(\\u[0-9a-zA-Z]{4})
    замена на
    \1\2

    см. пример на regex101

    import re
    
    regex = r"(\\u[0-9a-zA-Z]{4})(?!\\u[0-9a-zA-Z]{4}).*?(\\u[0-9a-zA-Z]{4})"
    
    test_str = ("\\u0442\\u0435\\u043a\\u0441\\u0442\\u0020\\u0432\\u0020\\u044e\\u043d\\u0438\\u043a\\u043e\\u0434\n\n"
    	"\\u0442\\u0435dsds\\n\\u043a\\u0441\\u0442das\\u0020\\u0432dsdddddd\\u0020\\u044e\\u043d\\n\\n\\n\\u0438\\u043a\\u043e\\u0434")
    
    subst = "\\1\\2"
    
    # You can manually specify the number of replacements by changing the 4th argument
    result = re.sub(regex, subst, test_str, 0)
    
    if result:
        print (result)


    см. пример python

    PS: Unicode != UTF-8 charset
    это не одно и то же.
    Ответ написан
    Комментировать
  • Как задать в Jquery чтобы минусовало не менее чем переменная?

    erge
    @erge
    Примус починяю
    Я так понимаю что в $('.knopka1') лежит "суммарная" цена = прайс * кол-во, тогда так и считать, а кол-во ограничивается снизу единицей.

    $('.quantity_inner .bt_minus').click(function() {
        let $input = $(this).parent().find('.quantity');
        let $val   = $('.knopka1');
        let count = parseInt($input.val()) - 1;
        count = count < 1 ? 1 : count;
        let price_val = parseFloat($val.data('price'));
        let curr_val = count * price_val;
        $input.val(count);
        $val.text(curr_val);
    });
    Ответ написан
    Комментировать
  • PHP как правильно написать регулярное выражение для обработки url?

    erge
    @erge
    Примус починяю
    https:\/\/site.ru\/[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}\/$


    пример на regex101
    Ответ написан
    Комментировать
  • Как отфильтровать таблицу по столбцу значение которого входит/не входит в список значений?

    erge
    @erge
    Примус починяю
    SELECT *
      FROM [dbo].[data]
      WHERE ( @p1 = 0 AND [dbo].[data].[intField] NOT IN (0,1,2,8,9) )
         OR ( @p1 = 1 AND [dbo].[data].[intField]     IN (0,1,2,8,9) )
    Ответ написан
    Комментировать
  • Как сделать выборку из одной таблицы и сгруппировать по колонке?

    erge
    @erge
    Примус починяю
    Просто джойнишь таблицу саму с собой и для каждой "таблицы" в where пишешь field_name = 'longitude'и field_name = 'latitude'

    select
        lng.object_id,
        ltd.value as latitude,
        lng.value as longitude
      from obj_table lng, obj_table ltd
      where lng.field_name = 'longitude'
        and ltd.field_name = 'latitude'
        and lng.object_id = ltd.object_id
    ;


    см. пример на dbfiddle

    UPDATE:

    еще можно так:
    select
        object_id,
        max(case field_name when 'latitude' then value else null end) as latitude,
        max(case field_name when 'longitude' then value else null end) as latitude,
        max(case field_name when 'category' then value else null end) as category
      from obj_table
      group by object_id;


    или еще...
    собрать строки в json, а затем извлечь обратно нужные поля...

    -- собираем в json:
    select
        object_id,
    	cast(replace(group_concat(json_object(field_name,value)),'},{',',') as json) json_obj
      from obj_table
      group by object_id
    ;
    
    -- или так:
    select
        object_id,
        cast(concat('{',group_concat( concat('"',field_name,'":"',value,'"') separator ',' ), '}') as json) as json_obj
      from obj_table
      group by object_id
    ;
    
    -- извлекаем поля из json:
    select
        object_id,
        json_extract(json_obj,'$.latitude') as latitude,
        json_extract(json_obj,'$.longitude') as latitude,
        json_extract(json_obj,'$.category') as category
      from (
    select
        object_id,
        cast(replace(group_concat(json_object(field_name,value)),'},{',',') as json) json_obj
      from obj_table
      group by object_id
      ) t
    ;


    см. пример на dbfiddle

    PS: JSON работает начиная с версии 5.7
    Ответ написан
    Комментировать
  • Как получить название и 'картинку' из БД?

    erge
    @erge
    Примус починяю
    Нет связи между таблицами file_managed или field_revision_field_image с таблицей node, поэтому у вас получается декартово произведение.
    состоящее в перечислении через запятую табличных выражений в предложении FROM (таблицы, представления, подзапросы) при отсутствии предложения WHERE, связывающего столбцы из перечисленных источников строк
    (см.)
    в настоящее время у вас только одна связь по типу 'article' и этого очевидно недостаточно.
    Ответ написан
    Комментировать
  • Как запрос к mysql переделать по sqlite?

    erge
    @erge
    Примус починяю
    И почему вы думаете что это должно работать в SQLite? Разные БД, разный синтаксис, разные функции в том числе работы с датами...

    в ошибке явное указание в чем проблема:

    Error: near "DAY": syntax error

    нет такого в принципе в SQLite

    смотрите функции работы с датами в SQLite!
    date функция SQLite

    т.е. в итого вместо
    DATE(DATE_ADD(NOW(), INTERVAL -3 DAY))

    надо:
    date ( 'now', '-3 day')

    PS: между - и 3 пробелов быть не должно, SQLite этого не понимает и возвращает результатом date - null !? но почему-то во многих примерах пишут с пробелом!??
    Ответ написан
    Комментировать
  • Как вывести всю строку в FOR..IN не перечисляя вручную столбцы?

    erge
    @erge
    Примус починяю
    DECLARE
        l_sql        VARCHAR2(32767):='
          SELECT 1 field_11, ''river'' field_22 FROM DUAL
          UNION ALL
          SELECT 1 field_11, ''sharf'' field_22 FROM DUAL
        ';
        l_cur        PLS_INTEGER := DBMS_SQL.OPEN_CURSOR;
        l_ind        PLS_INTEGER;
        l_col_count  PLS_INTEGER;
        l_col_names  DBMS_SQL.DESC_TAB;
        l_out        VARCHAR2(32767);
        col_val_chr  VARCHAR2(32767);
        LNBR         VARCHAR2(2)  := CHR(13)||CHR(10);
        col_delim    VARCHAR2(20) := '</td><td>';
        row_delim    VARCHAR2(20) := '</td></tr>'|| LNBR ||'<tr><td>';
    BEGIN
        -- Разбор запроса
        DBMS_SQL.PARSE (
          l_cur,
          l_sql,
          DBMS_SQL.NATIVE
        );
        -- Получение информации о столбцах
        DBMS_SQL.DESCRIBE_COLUMNS (l_cur, l_col_count, l_col_names);
        -- Вывод каждого из имен столбцов
        FOR col_ind IN 1 .. l_col_count
        LOOP
            -- Определим тип столбца
            DBMS_SQL.DEFINE_COLUMN(l_cur, col_ind, col_val_chr, 32767);
            -- Выводим наимнование столбца
            l_out := l_out || l_col_names(col_ind).col_name;
            -- Если не последний эл. вставляем разделитель
            IF col_ind != l_col_count
            THEN
                l_out := l_out || col_delim;
            END IF;
        END LOOP;
    
        -- Выполняем и фетчим курсор
        l_ind := DBMS_SQL.EXECUTE (l_cur);
        LOOP
            l_ind := DBMS_SQL.FETCH_ROWS( l_cur );
            EXIT WHEN l_ind = 0;
    
            l_out := l_out || row_delim;
    
            FOR col_ind IN 1 .. l_col_count
            LOOP
                -- Читаем и выводим значение
                DBMS_SQL.COLUMN_VALUE (l_cur, col_ind, col_val_chr);
                l_out := l_out || col_val_chr;
                -- Если не последний эл. вставляем разделитель
                IF col_ind != l_col_count
                THEN
                    l_out := l_out || col_delim;
                END IF;
            END LOOP;
        END LOOP;
        DBMS_SQL.CLOSE_CURSOR (l_cur);
        DBMS_OUTPUT.PUT_LINE('<table>'||LNBR||'<tr><td>'|| l_out ||'</td></tr>'||LNBR||'</table>');
    END;
    /
    
    /*
        -- Если задать разделители полей ; и LNBR то на выходе получим CSV данные
        col_delim    VARCHAR2(20) := ';';
        row_delim    VARCHAR2(20) := LNBR;
    */


    см. пример на dbfiddle

    PS: Вы видимо что-то недочитали :)
    Спасибо, сам разобрался, даже и не знал что так можно, теперь наверно буду использовать :)

    UPDATE:
    Можно обернуть в функцию и помимо прочего передавать в нее тип разделителя (для HTML можно передавать стили или classname для таблицы) и на выходе иметь разный формат данных.
    Ответ написан
    Комментировать
  • Как узнать количество совпадающих значений из двух разных таблиц?

    erge
    @erge
    Примус починяю
    какая СУБД !?
    У разных СУБД свои методы/функции работы с датами, а я так понимаю у вас хранится дата+время!?
    да и синтаксис SQL тоже бывает особенный...

    если предположить что это MySQL , то использовать функцию DATE() для извлечения даты.
    PS: ну либо сами перепишете соответственно

    через INNER JOIN

    SELECT count(DISTINCT c.user_id) AS first_day_order
      FROM clients c
      INNER JOIN orders o ON c.user_id = o.user_id
      WHERE DATE(c.registered_datetime) = DATE(o.when_start)
        AND DATE(c.registered_datetime) BETWEEN '2021-09-01' AND '2021-09-30'
    ;


    или через EXISTS

    SELECT count(c.user_id) AS first_day_order
      FROM clients c
      WHERE DATE(c.registered_datetime) BETWEEN '2021-09-01' AND '2021-09-30'
        AND EXISTS (
              SELECT 1 FROM orders o
                WHERE c.user_id = o.user_id
                  AND DATE(c.registered_datetime) = DATE(o.when_start)
            )
    ;
    Ответ написан
    Комментировать
  • Какие есть VDS/VPS с оплатой криптой?

    erge
    @erge
    Примус починяю
    Поиск VPS

    например при ордере на time4vps.com
    в способах оплаты пишут:
    Credit Card, PayPal, PayPal Billing Agreement, Alipay, Bitcoins and Altcoins, Bank Transfer
    Ответ написан