• Как сделать реекспорт Typescript React компонента?

    @eugeneledenev Автор вопроса
    Разобрался:

    index.d.ts:
    export { default } from './MyComponent';
    Тут важно в поле From указать именно компонент, а не файл .d.ts
    Ответ написан
  • Как грамотно конвертировать все числа в строки и наоборот в js объектах?

    @eugeneledenev Автор вопроса
    Может кому-то пригодится.
    Решение оказалось не удачным. Если поле вводит в поле договор только цифры, то происходит преобразование к числу, хотя поле должно быть в виде строки.
    Придется делать преобразование данных внутри компонента через parse/format.
    export const convertObjectValues = (obj, numToStr) => {
      // Перебирает весь объект и производит конвертацию числа в строку и обратно.
      // numToStr = true конвертирует числовые значения в строковые
      // numToStr = false конвертирует строковые значения в числовые
      if (numToStr !== true && numToStr !== false) return;
    
      if (typeof obj === "object" && obj !== null) {
        //Получен объект
        if (Array.isArray(obj)) {
          // Объект оказался массивом. Перебор массива
          return obj.map(elem => convertObjectValues(elem, numToStr));
        } else {
          // Перебор объекта
          const result = {};
          for (const key in obj) {
            result[key] = convertObjectValues(obj[key], numToStr)
          }
          return result;
        }
      } else {
        // Получено простое значение (не объект и не массив)
        return isNaN(obj) ? obj : numToStr ? obj + '' : +obj;
      }
    };


    Тесты:
    import chai from "chai";
    import {convertObjectValues} from "./convertData";
    
    const numbers = {
      "id": 7302,
      "enabled": 1,
      "capacity": 4,
      "manualEdited": 1,
      "cutoffs": [
        1235.25,
        {
          "id": 3468,
          "cutoffType": {
            "id": 1,
            "name": "Cutoff общий",
            "code": "MNFGNRL"
          },
          "value": "12:00"
        },
        {
          "id": 3467,
          "cutoffType": {
            "id": 4,
            "name": "Cutoff груза",
            "code": "CRGRGST"
          },
          "value": "14:00"
        }
      ]
    };
    
    const strings = {
      "id": "7302",
      "enabled": "1",
      "capacity": "4",
      "manualEdited": "1",
      "cutoffs": [
        "1235.25",
        {
          "id": "3468",
          "cutoffType": {
            "id": "1",
            "name": "Cutoff общий",
            "code": "MNFGNRL"
          },
          "value": "12:00"
        },
        {
          "id": "3467",
          "cutoffType": {
            "id": "4",
            "name": "Cutoff груза",
            "code": "CRGRGST"
          },
          "value": "14:00"
        }
      ]
    };
    
    describe("Тестирование глобальных функций конвертации данных", () => {
    
      it("Преобразование числа в строку", () => {
        const result = convertObjectValues(numbers, true);
        // console.log(JSON.stringify(numbers));
        // console.log(JSON.stringify(result));
        chai.expect(result).to.deep.include(strings);
      });
    
      it("Преобразование строки число", () => {
        const result = convertObjectValues(strings, false);
        // console.log(JSON.stringify(strings));
        // console.log(JSON.stringify(result));
        chai.expect(result).to.deep.include(numbers);
      });
    
    });
    Ответ написан
  • Как запустить скрипт php с get параметрами?

    @eugeneledenev Автор вопроса
    Вроде нашел решение. Можно создать скрипт в котором "вручную" задаю get параметры и включаю в него мой основной скрипт.
    В командной строке будет:
    php -r '$_GET["param_name"]="param_value"; include "index.php";'
    Ответ написан
  • Почему запрос не работает?

    @eugeneledenev Автор вопроса
    Похоже моя субд не поддерживает from
    вот как выглядит работающий вариант:

    UPDATE 
    	oc_decomo_items di
    	LEFT JOIN oc_product p 
    	ON p.product_id=di.product_id
    SET 
    	di.product_id=NULL,
    	di.add_to_shop=0
    WHERE 
    	di.product_id IS NOT NULL 
    	AND p.product_id IS NULL
    Ответ написан
  • Как ускорить SQL запрос?

    @eugeneledenev Автор вопроса
    Проблем несколько.
    1. не работают одновременно индексы текстовые (model+sku) и числовые (status)
    SELECT SQL_NO_CACHE p.product_id
    FROM oc_product p 
    WHERE p.status = '1' AND ( p.model = 'ao' OR p.sku = 'ao' )

    0.26 сек срабатывает только индекс по status

    SELECT SQL_NO_CACHE p.product_id
    FROM oc_product p LEFT JOIN oc_product p2 ON (p.product_id=p2.product_id)
    WHERE p.status = '1' AND ( p2.model = 'ao' OR p2.sku = 'ao' )

    0 сек отрабатываю оба индекса

    2. Как писали выше наличие LCASE убивает индекс.
    SELECT SQL_NO_CACHE p.product_id
    FROM oc_product p LEFT JOIN oc_product p2 ON (p.product_id=p2.product_id)
    WHERE p.status = '1' AND ( LCASE(p2.model) = 'ao' OR LCASE(p2.sku) = 'ao' )

    0.60 сек

    В итоге запрос сильно усложнился. Время выполнения упало до 0,19 сек. (в 4 раза)
    SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS p3.product_id, NULL AS rating, NULL AS discount, NULL AS special 
    FROM 
    
     (SELECT p.product_id
     FROM oc_product p 
     LEFT JOIN oc_product p2 ON (p.product_id=p2.product_id) 
     WHERE p.status = '1' AND ( p2.model = 'ao' OR p2.sku = 'ao' ) 
     UNION
     SELECT p.product_id
     FROM oc_product p 
     LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) 
     WHERE p.status = '1' AND ( pd.name LIKE '%ao%' OR pd.tag LIKE '%ao%') ) as t1
    
    LEFT JOIN oc_product p3 ON (t1.product_id=p3.product_id)
    LEFT JOIN oc_product_description pd ON (p3.product_id = pd.product_id)
    GROUP BY p3.product_id 
    ORDER BY (p3.price=0 OR p3.price >= 7000000), p3.price DESC, LCASE(pd.name) DESC 
    LIMIT 0,20
    Ответ написан
  • Как выбрать программиста с адекватной ценой за час?

    @eugeneledenev
    Вы всегда будете недоплачивать одним и переплачивать другим.
    Вам нужно иметь определенные требования к результату и смотреть выполнены они или нет. Например скорость работы, интересные решения и т.п.
    В идеале создаете группу с которой вы работаете исходя из результатов прошлых работы. И уже внутри этой группы адекватных программистов торгуетесь кто по чем сделает. Само собой периодически кто-то в эту группу приходит и кто-то из нее уходит.
    Если выборка программистов всегда из открытого рынка, то вы стабильно будете недоплачивать и переплачивать, а так же получать адекватный материал и шлак. Как серфинг - всегда реагируете на текущую ситуацию и лавируете внутри рынка.
    Ответ написан
  • Как восстановить поврежденный архив?

    @eugeneledenev
    У меня было сжато через ZIP и тоже не открывались архивы.
    Удалось открыть только через штатный разархиватор Corbian: C:\Program Files (x86)\Cobian Backup 11\cbDecompressor.exe
    Ответ написан
  • Как переадресовать page=1 на без него?

    @eugeneledenev Автор вопроса
    RewriteCond %{QUERY_STRING} ^page=1$
    RewriteRule (.*) $1? [L,R=301]

    Это вариант работает верно!!!
    У меня эксперемент закончился неудачей из-за кеша.
    Ответ написан
  • Как написать бесконечный по времени sql запрос?

    @eugeneledenev Автор вопроса
    Если кому-то пригодится скрипт убивания зависшего SQL процесса:
    <?php
    
    include('../config.php'); //подключаем файл конфигурации cms. оттуда берем настройки БД
    $maxquerytime = 200;//максимальное время запроса в секундах
    
    $db = DB_DATABASE;//THE NAME OF YOUR MYSQL DATABASE
    $user = DB_USERNAME;//YOUR USERNAME TO ACCESS MYSQL                                                                     
    $pass = DB_PASSWORD;//YOUR PASSWORD TO ACCESS MYSQL                                                                         
    $host = DB_HOSTNAME;//THE ADDRESS OF YOUR MYSQL SERVER                                                                      
     
    $link = mysql_connect($host, $user, $pass);// Connect to the database
    if ($link) echo '<b>OK.</b> - Soedinenie ustanovleno.';
    else die('<b>Error</b>'); 
    mysql_select_db($db);
    mysql_query("SET NAMES 'utf8'"); 
    mysql_query("SET CHARACTER SET 'utf8'");
    mysql_query("SET SESSION collation_connection = 'utf8_general_ci'");
    
    $result = mysql_query("SHOW FULL PROCESSLIST");
    while ($row=mysql_fetch_array($result)) {
      $process_id=$row["Id"];
      if ($row["Time"] > $maxquerytime ) {
        $sql="KILL $process_id";
        echo "<br>Убит процесс ".$row["Info"]." - ".$sql;
        mysql_query($sql);
      }
    }
    ?>
    Ответ написан
  • Как хранить количество товара?

    @eugeneledenev
    То есть количество товара определенного цвета и количество товара без цвета

    Отдельная таблица name color price. А точнее product_id color_id price чтобы выборки шустрее делались.

    И есть еще одна фишка. Без цвета - это тоже цвет, который будет иметь свой ID
    Ответ написан
  • Как оставить базовый порядок сортировки таблицы при JOIN?

    @eugeneledenev Автор вопроса
    Почему-то order by начал работать шустро, так что вопрос снят.
    Ответ написан
  • Сайт странно грузится. Почему?

    @eugeneledenev Автор вопроса
    В общем пионер, который делал кнопку подклюючил кучу лишних js файлов, поэтому и была проблема.
    Ответ написан
  • Как исправить такую ошибку OpenCart?

    @eugeneledenev
    Не может загрузить контроллер payment/transfer_plus.1/orderAction!
    Скорее всего загрузили xml файл он либо с ошибкой либо конфликтует и как итог формируется новый system/engine/controller.php в кеше vqmod/vqcache/vq2-system_engine_controller.php с ошибкой.
    убрать xml файл который косячит, затем найти программиста который сделает чтобы все работало.
    Либо если шарите, то смотрите что в vqmod/vqcache/vq2-system_engine_controller.php on line 68 и исходя из ошибки там правьте xml
    Ответ написан
  • Как переписать SQL запрос?

    @eugeneledenev Автор вопроса
    Разобрался, сделал.
    Было:
    SELECT SQL_NO_CACHE attribute_id, text FROM (
    SELECT DISTINCT p.product_id, p2a.attribute_id, p2a.text, p.price as realprice 
    FROM oc_product p 
    LEFT JOIN oc_manufacturer m ON(m.manufacturer_id=p.manufacturer_id) 
    LEFT JOIN oc_product_option_value pov ON (pov.product_id=p.product_id) 
    LEFT JOIN oc_product_to_store p2s ON (p2s.product_id=p.product_id) 
    LEFT JOIN oc_product_to_category p2c ON (p2c.product_id=p.product_id) 
    LEFT JOIN oc_category_path cp ON(cp.category_id=p2c.category_id) 
    LEFT JOIN oc_product_attribute p2a ON (p2a.product_id=p.product_id) 
    WHERE p2a.attribute_id IS NOT NULL AND EXISTS 
    (select 1 FROM oc_product_attribute p2a0 
    WHERE p2a0.product_id=p2a.product_id AND p2a0.attribute_id = 20 
    AND (p2a0.text = '2х36 Вт' OR p2a0.text like '2х36 Вт:%' OR p2a0.text like '%:2х36 Вт' OR p2a0.text like '%:2х36 Вт:%')) 
    AND EXISTS (select 1 FROM oc_product_attribute p2a1 WHERE p2a1.product_id=p2a.product_id AND p2a1.attribute_id = 22 
    AND (p2a1.text = 'накладные' OR p2a1.text like 'накладные:%' OR p2a1.text like '%:накладные' OR p2a1.text like '%:накладные:%')) 
    AND EXISTS (select 1 FROM oc_product_attribute p2a2 WHERE p2a2.product_id=p2a.product_id AND p2a2.attribute_id = 27 
    AND (p2a2.text = '120 см' OR p2a2.text like '120 см:%' OR p2a2.text like '%:120 см' OR p2a2.text like '%:120 см:%')) 
    AND p.status = '1' AND p2s.store_id = 0) as innertable WHERE 1 GROUP BY attribute_id, text


    Стало:
    SELECT SQL_NO_CACHE attribute_id, text FROM (
    SELECT DISTINCT p.product_id, p2a.attribute_id, p2a.text, p.price as realprice 
    FROM oc_product p 
    LEFT JOIN oc_manufacturer m ON(m.manufacturer_id=p.manufacturer_id) 
    LEFT JOIN oc_product_option_value pov ON (pov.product_id=p.product_id) 
    LEFT JOIN oc_product_to_store p2s ON (p2s.product_id=p.product_id) 
    LEFT JOIN oc_product_to_category p2c ON (p2c.product_id=p.product_id) 
    LEFT JOIN oc_category_path cp ON(cp.category_id=p2c.category_id)
    LEFT JOIN oc_product_attribute_id p2a ON (p2a.product_id=p.product_id)
    INNER JOIN oc_product_attribute_id p2a0 ON (p2a0.product_id=p.product_id) 
    INNER JOIN oc_product_attribute_id p2a1 ON (p2a1.product_id=p.product_id) 
    INNER JOIN oc_product_attribute_id p2a2 ON (p2a2.product_id=p.product_id) 
    WHERE (p2a0.attribute_id = 20 AND p2a0.text like '%2х36 Вт%') 
    AND  (p2a1.attribute_id = 22 AND p2a1.text like '%накладные%')
    AND  (p2a2.attribute_id = 27 AND p2a2.text like '%120 см%')
    ) as innertable WHERE 1 GROUP BY attribute_id, text

    Время 0,13 ->0.05.
    Когда LIKE %...% заменил на text_id получилось время 0,04 :
    SELECT SQL_NO_CACHE attribute_id, text FROM (
    SELECT DISTINCT p.product_id, p2a.attribute_id, p2a.text, p.price as realprice 
    FROM oc_product p 
    LEFT JOIN oc_manufacturer m ON(m.manufacturer_id=p.manufacturer_id) 
    LEFT JOIN oc_product_option_value pov ON (pov.product_id=p.product_id) 
    LEFT JOIN oc_product_to_store p2s ON (p2s.product_id=p.product_id) 
    LEFT JOIN oc_product_to_category p2c ON (p2c.product_id=p.product_id) 
    LEFT JOIN oc_category_path cp ON(cp.category_id=p2c.category_id)
    INNER JOIN oc_product_attribute_id p2a0 ON (p2a0.product_id=p.product_id) 
    INNER JOIN oc_product_attribute_id p2a1 ON (p2a1.product_id=p.product_id) 
    INNER JOIN oc_product_attribute_id p2a2 ON (p2a2.product_id=p.product_id) 
    LEFT JOIN oc_product_attribute_id p2a ON (p2a.product_id=p.product_id)
    WHERE (p2a0.text_id = '67')
    AND  (p2a1.text_id = '82')
    AND  (p2a2.text_id = '88')
    ) as innertable WHERE 1 GROUP BY attribute_id, text

    Причем расположение строки LEFT JOIN oc_product_attribute_id p2a ON (p2a.product_id=p.product_id) влияет на время в 2 раза. После Inner join быстрее
    Ответ написан
  • Как решить большую нагрузку WordPress поисковыми ботами? Слабый хостинг?

    @eugeneledenev
    Я прибил у себя ботов(в разы снизил нагрузку) так: в .htaccess
    #kill bots
    RewriteCond %{HTTP_USER_AGENT} AhrefsBot
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} MJ12bot
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} Detectify
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} dotbot
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} Riddler
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} SemrushBot
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} LinkpadBot
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} BLEXBot
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} FlipboardProxy
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} aiHitBot
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} trovitBot
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} python-requests
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} ltx71
    RewriteRule (.*) - [F,L]
    RewriteCond %{HTTP_USER_AGENT} MegaIndex.ru
    RewriteRule (.*) - [F,L]

    Если вас заваливают яндекс и гугл, то однозначно по рецепту VVB копать с профайлером. Если переедете на VPS, то через команду top будет понятно у вас перегруз по запросам к БД или слишком много одновременных заходов.
    Ответ написан