Не стартует 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 сервер.

Генератор цифрового кода произвольной длинны 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 ;)

Преобразование результатов запроса 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 ;)

Продуктивное использование IDE PHPStorm от JetBrains. Перенос изменений в change-листах

Если Вы используете IDE PHPStorm от JetBrains, то Вам, возможно, будет интересно узнать об одной из очень удобных функций по переносу изменений в рамках проекта из одной копии данной IDE в другую. Детали под катом.


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

Ошибка обновления Yum: Thread died in Berkeley DB library

Как получилось:
Во время выполнения обновления системы при помощи yum update процесс был неожиданно завершён( При повторном запуске обновления получил ошибку вида:
rpmdb: Thread/process 17221/140413455156992 failed: Thread died in Berkeley DB library
error: db3 error(-30974) from dbenv->failchk: DB_RUNRECOVERY: Fatal error, run database recovery
error: cannot open Packages index using db3 -  (-30974)
error: cannot open Packages database in /var/lib/rpm
CRITICAL:yum.main:


Решение:
Для решения проблемы нужно удалить «плохие» файлы базы данных, которые находятся в папке /var/lib/rpm/. Для этого нужно выполнить команду
#rm /var/lib/rpm/__db*
отвечай y (yes) на все вопросы. В выводе должно быть что то на подобие:
#rm /var/lib/rpm/__db*
rm: remove regular file `/var/lib/rpm/__db.001'? y
rm: remove regular file `/var/lib/rpm/__db.002'? y
rm: remove regular file `/var/lib/rpm/__db.003'? y
rm: remove regular file `/var/lib/rpm/__db.004'? y

После чего можно смело продолжать обновление системы, использую yum update.