Не стартует Elasticsearch сервер с ошибкой: java.lang.reflect.ReflectPermission

Не стартует Elasticsearch сервер версии 2.3.2 на Ubuntu 16.04 с ошибкой: java.lang.reflect.ReflectPermission

Конфигурация системы, на которой выявлена проблема:
  • Ubuntu 16.04
  • Elasticsearch 2.3.2
  • JAVA: openjdk version «9-internal»
    OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195246.buildd.src)
    OpenJDK 64-Bit Server VM (build 9-internal+0-2016-04-14-195246.buildd.src, mixed mode)

Как одно из решений этой проблемы — отключение безопасного поиска в файле конфигурации сервера Elasticsearch.
Для этого открываем файл настроек /etc/elasticsearch/elasticsearch.yml и дописываем туда строку
security.manager.enabled: false

После чего нам следует перегрузить Elasticsearch сервер.

Как убрать дубли страницы в карте товара / рекомендуемых / новых товарах opencart

В общем столкнулся с проблемой, которая вредит seo, хлебным крошкам да и вообще смотрится не красиво. Нашел один способ в интернете, я его опишу но с корректировкой, так как в способе который я нашел, баг со скобками, код не очень чистый. Данный способ проверен и работает на opencart 1.5.6.1

И так:
Товар может быть доступен по следующим адресам:
сайт.ua/canon 70D — [товар открывается с главной страницы]
сайт.ua/зеркальные камеры/canon 70D — [товар открывается с категории]
сайт.ua/зеркальные камеры/royal-forest/canon 70D — [товар открывается со страницы производителя]
ну и соответственно товар открывается со всех модулей, где он выводится: Хиты продаж, Рекомендуемые, Последние, Акции и т.д.
кроме того, ссылки на товар формируются в блоке «Рекомендуемые» на странице другого товара; на странице с результатами поиска; на странице сравнения товаров


Читать дальше

Генератор цифрового кода произвольной длинны PHP

Пример использования
Создание кода подтверждения мобильного телефона.

Реализация
/**
 * Генератор цифрового кода произвольной длинны
 *
 * @param int $length - длинна создаваемого кода
 * @return string
 */
function generatePhoneCode($length = 5)
{
    /** @var string $code - будущий результат */
    $code = '';

    /** @var int $i - счётчик символов кода */
    for ($i = 0; $i < $length; $i++) {
        /** цифра 0 может быть только в середине строки */
        if ($i == 0 || $i == $length - 1) {
            $code .= mt_rand(1, 9);
        } else {
            $code .= mt_rand(0, 9);
        }
    }

    return $code;
}

Use this ;)

Определение имени часового пояса по смещению от UTC

Промучался сегодня, а потому пишу)

Задача:
Получить имя часового пояса, например Europe/Helsinki, по значению смещения от UTC браузера.

Решение:
1. Получаем значение смещения от UTC браузера и отправляем в PHP.
var time_offset = - new Date().getTimezoneOffset()

2. Получаем имя временной зоны (часового пояса). $request['time_offset'] — значение, пришедшее из JS
$offset = timezone_name_from_abbr('', $request['time_offset']*60, 1); 

Также, пример и подробное описание функции timezone_name_from_abbr() имеется в официальной документации php.net/manual/ru/function.timezone-name-from-abbr.php

Use this ;)

Как убрать index.php?route=common/home с главной страницы

Многие задаются вопросом «как убрать index.php?route=common/home». Я столкнулся с этой проблемой в версии opencart 1.5.6

Все достаточно просто.


Читать дальше

Преобразование результатов запроса MySQL в JSON

Говорят, MySQL сервер начиная с версии 5,7 поддерживает преобразование данных в JSON.
Но что же делать, когда версия сервера не такая продвинутая? Попробуем создать вывод в JSON самостоятельно.

Для этого запрос
SELECT
  collname,
  colldesc
FROM collection
WHERE productid = 1585546
изменим на
SELECT
  CONCAT("[",
          GROUP_CONCAT(
               CONCAT("{collname:'",collname,"'"),
               CONCAT(",colldesc:'",colldesc),"'}")
     ,"]") AS collection_json
FROM collection
WHERE productid = 1585546

Результатом запроса будет строка JSON
[
  {
    collname: 'Название 1',
    colldesc: 'Описание 1'
  },
  {
    collname: 'Название 2',
    colldesc: 'Описание 2'
  }
]

Use this ;)

Группировка результатов запроса MySQL в строку с разделителем

Пришлось создавать сложный (для меня) запрос MySQL, в котором нужно было выгружать значения из разных таблиц.
И всё бы хорошо, но для загрузки некоторых параметров была связь Many To One, что для меня означало требование использовать подзапросы. И тут ничего страшного нет, но результат подзапроса должен быть один, а у меня список, к примеру, ИДишников или результатов теста студентов.

Мне на помощь пришла функция GROUP_CONCAT(). Пример:
SELECT student_name,
        GROUP_CONCAT(test_score)
         FROM student
         GROUP BY student_name;

В данном случае результатам будет строка ['Имя студента','25,15,47,18']

Если, по какой либо причине, MySQL сервер возвращает результат в бинарном виде, то нужно добавить к результату конкатенацию с пустой строкой.
CONCAT(GROUP_CONCAT(test_score), "")

Use this ;)

Ошибка SVN - E000022: Can't convert string from native encoding to 'UTF-8'

Вот что не говори, а мне всегда больше нравилось работать с GIT, но нравится и хочется не всегда получается. Так и получилось и в этот раз — здравствуй Subversion (SVN). Оставим споры о том, что лучше для другой статьи, а может и для другой жизни. В принципе, особых проблем с SVN у меня не возникало, ну вот кроме…
Ошибка SVN — E000022: Can't convert string from native encoding to 'UTF-8'
Начнём с предыстории. Ошибка возникла при попытке выполнить команду
svn up
на в консоли FreeBSD. В результате выполнения была получена ошибка Ошибка SVN — E000022: Can't convert string from native encoding to 'UTF-8'.

Решение
Решение, в моём случае, очень простое. Достаточно выполнить в консоли
export LC_CTYPE=en_US.UTF-8
после чего ошибка SVN больше не проявлялась.

Use this ;)

Двухуровневое дерево MySQL + PHP

Немного хотелось бы описать процесс хранения двухуровневого дерева в MySQL, а так же его выгрузку одним запросом и формирование PHP массива для отображения в шаблоне и т.д.

Начну с структуры таблицы MySQL, на примере таблицы для хранения тегов Категория -> Тег.

Структура таблицы
CREATE TABLE table_tag (
  tag_id int(11) NOT NULL AUTO_INCREMENT COMMENT 'ИД тега',
  tag_name varchar(50) NOT NULL COMMENT 'ИМЯ тега',
  tag_type enum ('part', 'tag') NOT NULL DEFAULT 'tag' COMMENT 'ТИП тега',
  tag_parent int(10) UNSIGNED DEFAULT NULL COMMENT 'ИД родителя',
  PRIMARY KEY (tag_id),
  INDEX IDX_tag_parent (tag_parent),
  INDEX IDX_tag_type (tag_type)
)
ENGINE = MYISAM
COMMENT = 'Таблицы тегов';

Заполнение данными
Естественно, что заполнение данными для каждого конкретного случая будет если не уникально, то как минимум, отличаться. В данном случае, я буду использовать часть данных тегов уже существующего проекта.

Читать дальше

Ошибка ключа "s" в регулярном выражении для браузеров Chrome и Firefox

Столкнулся с проблемой использования ключа «s» в регулярных выражениях JavaScript. А именно, с ошибками типа:
  • «SyntaxError: Invalid flags supplied to RegExp constructor 's'» в Google Chrome
  • «SyntaxError: invalid regular expression flag s» в FireFox
Ключ «s» в регулярных выражениях отвечает за разбор строки без учёта символов переноса строки, другими словами «в одну строку». Очень удобно, когда нужно парсить часть html кода.
Предлагаю своё, скорее всего не оптимальное, решение данной проблемы и буду рад, если кто то предложит что-то лучше)
Идея заключается в том, чтоб перед парсингом по нужному регулярному выражению, привести многстрочный текст к однострочному. Для html выражения это не «страшно», в смысле не приведет к разрушению вёрстки. Ниже представляю пример выражения.
var html = 'Текст (например html) с переносами строк';
html.replace(/\n+/g, '') // приведение к одной строке
    .replace(/выражение для поиска нужной части/, '');

Всем удачи! Use this ;)