Задать вопрос
  • Как в PHP узнать последний понедельник месяца, 2 среду месяца и т.п?

    Mayzer
    @Mayzer
    Yes it is!
    Может будет полезно:

    print date('d.m.Y', strtotime("last Monday")); // 25.12.2006
    print "\n";
    print date('d.m.Y', strtotime("Monday")); // 01.01.2007
    print "\n";
    print date('d.m.Y', strtotime("next Monday")); // 08.01.2007
    Ответ написан
    Комментировать
  • Как пересобрать массив, сложив некоторые значения?

    0xD34F
    @0xD34F
    $grouped = [];
    
    foreach ($arr as $key => $items) {
      $group = [
        'UF_SUBJECT' => $items[0]['UF_SUBJECT'],
        'UF_QUANTITY' => 0,
        'UF_BRAK' => 0,
        'UF_WAREHOUSENAME' => [],
      ];
    
      foreach ($items as $item) {
        $group['UF_QUANTITY'] += $item['UF_QUANTITY'];
        $group['UF_BRAK'] += $item['UF_BRAK'];
        $group['UF_WAREHOUSENAME'][] = $item['UF_WAREHOUSENAME']." (".$item['UF_QUANTITY']." шт)";
      }
    
      $group['UF_WAREHOUSENAME'] = implode(', ', $group['UF_WAREHOUSENAME']);
    
      $grouped[$key] = $group;
    }
    Ответ написан
    1 комментарий
  • Telegram bot api, как использовать answercallbackquery для отображения alert?

    @srchost
    // Ответ на нажатие кнопок
    function send_answerCallbackQuery($token, $callback_query_id, $text, $show_alert){
      file_get_contents("https://api.telegram.org/bot".$token."/answerCallbackQuery?callback_query_id=".$callback_query_id."&text=".$text."&show_alert=".$show_alert);
    }
    
    if (isset($data['callback_query'])) {
      send_answerCallbackQuery($token, $data['callback_query']['id'], "проверка ", false);
    }

    Так все работет
    Ответ написан
    1 комментарий
  • Как правильно работать с большим количеством данных?

    @rPman
    Избавляйся от ... where fld like '%...%' это самые плохие по скорости запросы, хотя не всегда это возможно без увеличения размера базы, вообще полнотекстовый поиск можно отдавать на откуп стороннему приложению (это может расширить возможности фильтрации), считай это еще одной формой индекса, хотя лучше данные по другому хранить. Я встречал ситуации когда в varchar хранили значения справочника из десятка значений, но делали по нему like %% что грузило базу прилично, когда как сделать простой комбобокс на порядок эффективнее и удобнее - поиск по подстроке лучше по справочнику делать на клиенте.

    Без индексов скорее всего никуда, если в запросе идет фильтрация по полю, то если не создать на него индекс, этот запрос и будет создавать нагрузку

    В некоторых специфических случаях, можно делать запросы заранее (для более шустрой пагинации например), запрашивая сразу несколько страниц наперед, с учетом движения вперед (и возможно назад, в общем прогноз должен предполагать что перелистывание продолжится), запрос на будущие записи делать заранее, пока пользователь смотрит текущий результат. Недостаток подхода - при удачном прогнозе действий пользователя отзывчивость интерфейса повышается, как и средняя нагрузка на базу. Так же добавляет отзывчивости если окно запроса будет больше окна отображения (т.е. для отображения 10 строк запрашиваешь 30, начиная с предыдущей страницы)

    Частный случай прогноза, не делать select ... limit ... на каждую страницу, а при смене фильтра запрашивать весь диапазон, но только идентификаторы, сохранив их либо в таблице на сервере либо на бакэенде, генерирующим запросы вида select ... id in (...), последнее если количество записей не больше тысяч. Кстати именно постраничная навигация с прогруженным списком id самая шустрая

    Кешируй результаты запросов, можно на клиенте, можно даже средствами браузерного кеша, очень часто работа человека состоит в перемещении туда сюда по своим запросам, так зачем нагружать лишний раз сервер тем что уже известно. Осторожно с инвалидацией данных, и кстати не всегда она так уж и критична.

    Некоторые фильтрации данных возможно эффективнее делать на клиенте, как бы это странно не звучало, но клиент по скорости работы может даже превосходить сервер, так почему бы часть данных не хранить в принципе на нем и не фильтровать там же, но это зависит от особенности данных, гонять и хранить гигабайты клиенту не удобно (особенно если это браузер). Это может сильно усложнить алгоритм пагинации, но подумай, так ли человеку нужно знать какой номер строки у него сейчас, обычно достаточно понимать общий прогресс (сколько примерно до конца списка и сколько данных в принципе).

    p.s. диск на сервере hdd или ssd? если не хватает денег на большой ssd, настрой маленький ssd как кеш к медленному hdd (linux bcache), даже когда данные полностью не влезают в кеш, это дает заметный прирост, потому что hdd начинает менее случайно двигаться, плюс добавляется буферизация записи (данные записываются на ssd и лежат там пока hdd не освободится), так же дает эффект ускорения записи вынос журнала файловой системы (если ext4) на ssd (требуется пара гигабайт от силы).

    Осторожно, если высокие требования к надежности хранения, кеширующий ssd в режиме записи лучше пусть будет хотя бы raid1, так как иначе при смерти ssd починить данные, размазанные по диску и кешу будет очень сложно. Для кеша только для чтения это не так критично (при смерти ssd сервер просто упадет, не убивая данные).

    Но мне больше нравится резервирование на лету (настроить онлайн репликацию, пусть и на слабый, бакап сервер)
    Ответ написан
    1 комментарий
  • Как понять есть ли нагрузка на БД?

    @rPman
    Замеры производи на синтетических тестах, написав максимально простое приложение, которое будет долбить ваш сервис запросами (например bash скрипт с использованием curl), собирай метрики типа нагрузка процессора, диска, при разных количествах одновременных запросов и т.п.

    В конечном счете ориентироваться нужно на количество запросов, которые сможет обработать сервер, при условии одновременно исполняющихся запросов (в скриптах можешь делать тесты с разным их количеством, и сравнивай результат)

    Чтобы понять, будет нагружать и что в запросе, используй EXPLAIN, на практике нагрузку создают не сами выводимые данные, а фильтрация по ним, но в случаях многоуровневых запросов, когда для получения данных нужно связывать по форенкеям с другими таблицами, нагрузка логично возрастет

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

    ssd диски безоговорочно быстрее hdd дисков, тем более если сравнивать одинаковые сегменты (серверный ssd с серверным sas)

    p.s. 1500 записей у клиента, оно ему надо? тем более сразу в dom ему все выдавать? на практике мало какие люди способны потреблять сразу всю информацию с экрана, область зрения у большинства сужена, и больше десятка уже не видят, да и на экран все не влезет, можно подгружать по мере прокрутки.

    Фильтрацию же данных можно проводить и на сервере

    С другой стороны, если говорить о кешировании, данные ведь и у клиента можно держать, снимая нагрузку на сервер при повторяющихся запросах, так что еще вопрос где лучше фильтровать данные.
    Ответ написан
    2 комментария
  • Как сделать скриншот страницы полностью?

    sokoloff-rv
    @sokoloff-rv
    Удивлен, что на айтишном ресурсе никто не рассказал про способ сделать скриншот через консоль разработчика в Google Chrome.
    1. Ctrl-Shift-I - открываем консоль разработчика.
    2. Ctrl-Shift-M - переключаемся в режим эмуляции устройств.
    3. Выбираем в настройках нужный девайс. Если хотим сделать десктопный скриншот, то выбираем в настройках Laptop with MDPI screen или создаем девайс вручную как нам нравится.
    4. Нажимаем теперь на три вертикальные точки "More options" (в верхней горизонтальной панели максимально справа) и выбираем "Capture full size screenshot", после чего готовая картинка скачается в формате PNG.
    Способ прекрасен тем, что создает один скриншот, а не делает несколько, которые склеиваются друг с другом, из-за чего потом фиксированные элементы дублируются по нескольку раз. Ну и плюс не нужно захламлять браузер лишними расширениями.
    Ответ написан
    11 комментариев
  • Как правильно прописать spf?

    jamessvetsky
    @jamessvetsky
    Специалист по почтам и рассылкам
    Добрый день!

    Полная SPF запись: "v=spf1 include:mxsmtp.sendpulse.com include:mxsspf.sendpulse.com include:_spf.mail.ru a ~all" - с одной оговоркой - отправка средствами хостера может быть по разному. Остальные удалить, SPF для самого домена должна быть одна

    v=DMARC1; p=none; sp=none; rua=mailto:username@test.ru - вот эта запись должна быть прописана для поддомена _dmarc

    Не вижу ни одного DKIM
    Ответ написан
    7 комментариев
  • Выбор наушников?

    Что бы ты не выбрвл, останутся сомнения, поэтому, бери любые
    Ответ написан
    Комментировать
  • Как сделать в 1с битрикс компонент статистики редактирования заказа менеджерами?

    @PetrPo
    Работа с историей изменения заказов
    $result = \Bitrix\Sale\Internals\OrderChangeTable::getList(array(
    
        'order'=>array('DATE_CREATE'=>'DESC','ID'=>'DESC'),
    
        'filter'=>array('ORDER_ID'=>1319)
    
    ));


    Сущность \Bitrix\Sale\Internals\OrderChangeTable
    6009e0e10ad6a816572400.jpeg

    таблица b_sale_order_change
    6009e072a3292760182388.jpeg

    Список всех значений поля TYPE
    spoiler
    public static function getManagerLogItems()
    	{
    		return array(
    			"ORDER_SYNCHRONIZATION_IMPORT",
    			"ORDER_SYNCHRONIZATION_EXPORT",
    			"ORDER_SYNCHRONIZATION_EXPORT_ERROR",
    			"ORDER_ADDED",
    			"ORDER_DEDUCTED",
    			"ORDER_MARKED",
    			"ORDER_RESERVED",
    			"ORDER_CANCELED",
    			"ORDER_COMMENTED",
    			"ORDER_STATUS_CHANGED",
    			"ORDER_DELIVERY_ALLOWED",
    			"ORDER_DELIVERY_DOC_CHANGED",
    			"ORDER_PAYMENT_SYSTEM_CHANGED",
    			"ORDER_PAYMENT_VOUCHER_CHANGED",
    			"ORDER_DELIVERY_SYSTEM_CHANGED",
    			"ORDER_PERSON_TYPE_CHANGED",
    			"ORDER_PAYED",
    			"ORDER_TRACKING_NUMBER_CHANGED",
    			"ORDER_USER_DESCRIPTION_CHANGED",
    			"ORDER_PRICE_DELIVERY_CHANGED",
    			"ORDER_PRICE_CHANGED",
    			"ORDER_RESPONSIBLE_CHANGE",
    
    			"BASKET_ADDED",
    			"BASKET_REMOVED",
    			"BASKET_QUANTITY_CHANGED",
    			"BASKET_PRICE_CHANGED",
    			"PAYMENT_ADDED",
    			"PAYMENT_REMOVED",
    			"PAYMENT_PAID",
    			"PAYMENT_SYSTEM_CHANGED",
    			"PAYMENT_VOUCHER_CHANGED",
    			"PAYMENT_PRICE_CHANGED",
    
    			"SHIPMENT_ADDED",
    			"SHIPMENT_REMOVED",
    			"SHIPMENT_ITEM_BASKET_ADDED",
    			"SHIPMENT_ITEM_BASKET_REMOVED",
    			"SHIPMENT_DELIVERY_ALLOWED",
    			"SHIPMENT_SHIPPED",
    			"SHIPMENT_MARKED",
    			"SHIPMENT_RESERVED",
    			"SHIPMENT_CANCELED",
    			"SHIPMENT_STATUS_CHANGED",
    			"SHIPMENT_DELIVERY_DOC_CHANGED",
    			"SHIPMENT_TRACKING_NUMBER_CHANGED",
    			"SHIPMENT_PRICE_DELIVERY_CHANGED",
    			"SHIPMENT_AMOUNT_CHANGED",
    			"SHIPMENT_QUANTITY_CHANGED",
    			"SHIPMENT_RESPONSIBLE_CHANGE",
    
    			"ORDER_UPDATE_ERROR",
    			"BASKET_ITEM_ADD_ERROR",
    			"BASKET_ITEM_UPDATE_ERROR",
    			"SHIPMENT_ADD_ERROR",
    			"SHIPMENT_UPDATE_ERROR",
    			"SHIPMENT_ITEM_ADD_ERROR",
    			"SHIPMENT_ITEM_UPDATE_ERROR",
    			"SHIPMENT_ITEM_STORE_ADD_ERROR",
    			"SHIPMENT_ITEM_STORE_UPDATE_ERROR",
    			"SHIPMENT_ITEM_BASKET_ITEM_EMPTY_ERROR",
    
    		);
    	}
    Ответ написан
  • Какие семантические элементы HTML5 нельзя или не рекомендуется использовать на странице больше одного раза?

    MrDecoy
    @MrDecoy Куратор тега HTML
    Верставший фронтендер
    main можно. Главное чтобы видимым был только 1.
    Спека гласит:
    A document must not have more than one main element that does not have the hidden attribute specified.

    Что в переводе:
    В документе не должно быть более одного элемента main, для которого не указан атрибут hidden.

    Что означает, что может быть много main, но все кроме одного должны быть скрыты с помощью атрибута hidden
    Ну и h1 (Как бы можно использовать несколько в разных семантических секциях, но в итоге не особо это пошло и придерживаются правила по старинке. Что не более одного на страницу)
    nav тоже стоит использовать осторожно, если нет понимания как делать правильно, то лучше придерживаться одного на страницу.
    На этом этот список всё.

    header и footer могут использоваться несколько раз, если, скажем, по одному на всю страницу, и далее внутри семантических секций, таких как, например, article.

    Вот в спеке указаны примеры как можно использовать несколько header, nav и footer
    Ответ написан
    Комментировать
  • Есть ли CMS для интернет-магазина с хорошим REST API?

    @caballero
    Программист
    чтобы был смысл писать мобильное приложение нужно сначала иметь не одну тысячу клиентов, причем постоянных клиентов, - никто не станет ставить мобильное приложение неведомого магазина.

    А чтобы иметь много клиентов надо вложить много усилий и денег - мобильное приложение там вопрос десятый - клиенту все равно через что покупать - сайт и с мобилы работать будет
    Ответ написан
  • Как правильнее сделать такой функционал?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Можно как-то так:
    $schedule = [
      'weekdays' => [
        1 => [[0, 24]],
        2 => [[0, 24]],
        ...
        7 => [[0, 6], [8, 24]]
      ],
      'dates' => [
        '2020-12-31' => [[0, 6], [8, 17]],
        '2021-01-01' => [[0, 0]],
        '2020-01-02' => [[10, 23]],
        ...
      ]
    ];
    function isWorkTime($schedule) {
      $date = date('Y-m-d');
      $weekday = intval(date('N'));
      $hour = intval(date('H'));
      $daySchedule = $schedule['weekdays'][$weekday];
      if (array_key_exists($date, $schedule['dates']]) {
        $daySchedule = $schedule['dates'][$date];
      }
      foreach ($daySchedule as $workTime) {
        if ($hour >= $workTime[0] && $hour < $workTime[1]) {
          return true;
        }
      }
      return false;
    }
    Ответ написан
    Комментировать
  • Как подключить синтез речи к сайту?

    KorniloFF
    @KorniloFF
    Работаю по font-end / JS
    Бесплатный вариант, который уже имеет довольно широкую поддержку браузерами:
    Ответ написан
    3 комментария
  • Когда и где можно и нужно добавлять префиксы браузеров(-webkit- -moz- -ms-)?

    Lynn
    @Lynn
    nginx, js, css
    Используйте автопрефиксер.
    Пусть компьютер этим заморачивается https://github.com/postcss/autoprefixer
    Ответ написан
    Комментировать
  • Как переназначить клавишу ё -> õ?

    @sand3001
    Всего по немногу
    Сейчас поменял в своей Ubuntu 18.04 в файле:
    /usr/share/X11/xkb/symbols/ru
    строку key <TLDE> на такую:
    key <TLDE> { [ 245, 213 ] };
    ребутнул комп, и вуаля õÕõõõÕõõõÕÕÕÕÕõõõ

    ЗЫ: перезапуск Икс сеанса тоже работает ё
    Ответ написан
    1 комментарий
  • Как убрать дубликаты при выводе свойств элементов на сайте битрикс?

    @PetrPo
    В result_modifier.php
    if($arResult['ITEMS']) {
    	$arResult['FILE_TYPES'] = $filmTypes = [];
    	
    	foreach($arResult['ITEMS'] as $key => $arItem) {
    		$filmTypesProp = isset($arItem['DISPLAY_PROPERTIES']['FILM_TYPES']) ? $arItem['DISPLAY_PROPERTIES']['FILM_TYPES'] : false;
    		$value = $filmTypesProp && $filmTypesProp['VALUE'] ? $filmTypesProp['VALUE'] : false;
    		$displayValue = $filmTypesProp && $filmTypesProp['DISPLAY_VALUE'] ? $filmTypesProp['DISPLAY_VALUE'] : false;
    		
    		if($value && $displayValue) {
    			$filmTypes['VALUE'][] = $value;
    			$filmTypes['DISPLAY_VALUE'][] = $displayValue;
    		}
    	}
    	
    	$arResult['FILE_TYPES'] = [
    		'VALUE' => array_values(array_unique($filmTypes['VALUE'])),
    		'DISPLAY_VALUE' => array_values(array_unique($filmTypes['DISPLAY_VALUE'])),
    	];
    }


    Где сам select выводишь
    <?if(isset($arResult['FILE_TYPES']) && $arResult['FILE_TYPES']):?>
    	<select class="drop" id="regionDropdown">
    		<option value="All">Показать все</option>
    		<?foreach($arResult['FILE_TYPES']['DISPLAY_VALUE'] as $value):?>
    			<option value="<?=$value;?>"><?=$value;?></option>
    		<?endforeach;?>
    	 </select>
    <?endif;?>
    Ответ написан
  • Fullstack: составить дорожную карту?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    Не устаю постить это раз за разом:

    1*V7TMAzvhW7_cn9FbkKqOcQ.png

    5fdd6ccf619231ae7760a7661324ff64.png
    Ответ написан
    3 комментария