Все сервисы Хабра

Сообщество IT-специалистов

Ответы на любые вопросы об IT

Профессиональное развитие в IT

Удаленная работа для IT-специалистов

Войти на сайт
  • Все вопросы
  • Все теги
  • Пользователи

Хабр Q&A — вопросы и ответы для IT-специалистов

Получайте ответы на вопросы по любой теме из области IT от специалистов в этой теме.

Узнать больше
другие проекты хабра
  • Хабр
  • Карьера
  • Фриланс
Задать вопрос
Yakud

Леша Киселев

  • 75
    вклад
  • 9
    вопросов
  • 78
    ответов
  • 37%
    решений
Ответы
  • Информация
  • Ответы
  • Вопросы
  • Комментарии
  • Подписки
  • Нравится
  • Достижения
  • Как включить логирование запросов ElasticSearch в docker контейнере?

    Yakud
    Леша Киселев @Yakud Автор вопроса
    Нашел в чем дело. Логи писались внутрь контейнера. Прокинул логи при старте контейнера на хост:

    docker run ... -v /var/log/elasticsearch:/usr/share/elasticsearch/logs ...
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Elasticsearch cluster unhealthy (RED) - как исправить?

    Yakud
    Леша Киселев @Yakud
    Скорее всего, вам нужно настроить свой кластер ElasticSearch. По умолчанию, кластер не работает с одной нодой.
    Для работы с одной нодой нужно применить следующие настройки:

    index.number_of_shards: 1
    index.number_of_replicas: 0
    node.local: true
    discovery.zen.ping.multicast.enabled: false
    discovery.zen.minimum_master_nodes: 1
    node.max_local_storage_nodes: 1

    Осторожно, решение не для продакшена!
    Ответ написан более трёх лет назад
    3 комментария
    3 комментария
  • Как по shh передать код для исполнения, на удаленной машине?

    Yakud
    Леша Киселев @Yakud
    Копните в сторону Ansible
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Откуда здесь могла взяться 1?

    Yakud
    Леша Киселев @Yakud
    ob_start();
    include_once('tmp/header.php');//Head
    $header = ob_get_clean();
    echo $header;
    
    ob_start();
    include_once('tmp/news.php');//News
    $news = ob_get_clean();
    echo $news;
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как посчитать количество массивов в многомерном массиве?

    Yakud
    Леша Киселев @Yakud
    function countArrays(array $array) {
        $count = 0;
        foreach ($array as $key => $value) {
            if (is_array($value)) {
                $count += countArrays($value) + 1;
            }
        }
    
        return $count;
    }
    
    $arr = [
        [ // 1
            [], // 2
            [], // 3
            [], // 4
        ],
        [ // 5
            [], // 6
            [], // 7
        ],
        [ // 8
            [], // 9
            [], // 10
            [], // 11
        ],
        [], // 12
        [], // 13
        [ // 14
            [], // 15
            [ // 16
                [], // 17
                [], // 18
            ],
        ],
    ];
    
    echo countArrays($arr); // 18
    Ответ написан более трёх лет назад
    3 комментария
    3 комментария
  • Как сделать перенос строки по пробелу?

    Yakud
    Леша Киселев @Yakud
    function stringSplit($text, $maxRowLength) {
        $result = [];
        $words = explode(' ', $text);
    
        $nextRow = '';
        foreach ($words as $word) {
            $calculatedRow = $nextRow . ' ' . $word;
    
            if (iconv_strlen($calculatedRow, 'utf-8') <= $maxRowLength) {
                $nextRow = $calculatedRow;
            } else {
                $result[] = trim($nextRow);
                $nextRow = $word;
            }
        }
    
        $result[] = trim($nextRow);
    
        return $result;
    }
    
    $text = 'Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Если вызвана статически, возвращает объект класса DOMDocument или FALSE в случае возникновения ошибки.';
    var_export(stringSplit($text, 25));
    echo PHP_EOL;
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Какие преимущества в работе с 64-битной версией PHPStorm?

    Yakud
    Леша Киселев @Yakud
    Да, будет доступно большее количество памяти для работы IDE.
    Ответ написан более трёх лет назад
    4 комментария
    4 комментария
  • Будут ли проблемы с производительностью если в директории ~100000 файлов (ФС - ext4)?

    Yakud
    Леша Киселев @Yakud
    Вот тут поднималась эта тема: Расскажите про ваш опыт с файловыми системами для мелких файлов?
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Ексепшены в PHP или как передать объект в подключаемый файл?

    Yakud
    Леша Киселев @Yakud
    Напиши ф-ю, которая рендерит шаблон и бандит в него данные. Например так:
    function render($template, array $data = []) {
      if (!file_exists($template)) {
        throw Exception("Template {$template} not found");
      }
    
      foreach($data as $key => $value) {
        $$key = $value;
      }
      ob_start();
      include $template;
      return ob_get_clean();
    }

    В твоем случае юзать так:
    catch (Exception $e)
    {
        $templateData = [
            'e' => $e,
        ];
        
        if ($config->phalcon->debug)
        {
            echo render(rtrim($config->phalcon->viewsDir, '/').'/error/exception_debug.phtml', $templateData);  
        }
        else
        {
            echo render(rtrim($config->phalcon->viewsDir, '/').'/error/exception.phtml', $templateData);  
        }
    }

    Внутри шаблона будет доступен инстанс объекта-исключения.
    Ответ написан более трёх лет назад
    2 комментария
    2 комментария
  • Порекомендуйте источники по алгоритмам проектирования приложений?

    Yakud
    Леша Киселев @Yakud
    который раз привожу ссылки:
    ruhighload.com
    https://refactoring.guru/ru
    optimization.guide

    Пользуйтесь поиском.
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Какое файловое хранилище с объемом 1ТБ и с хорошим API посоветуете?

    Yakud
    Леша Киселев @Yakud
    Amazon S3
    Получается ~30$ за ТБ
    Ответ написан более трёх лет назад
    4 комментария
    4 комментария
  • Преобразовать массив (php)?

    Yakud
    Леша Киселев @Yakud
    $newArray = [];
    $key = null;
    foreach ($array as $value) {
      if (is_null($key)) {
        $key = $value;
        continue;
      }
      $newArray[$key] = $value;
      $key = null;
    }
    
    var_export($newArray);
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как убрать html код в php?

    Yakud
    Леша Киселев @Yakud
    htmlspecialchars:
    php.net/manual/ru/function.htmlspecialchars.php
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как правильно организовать классы?

    Yakud
    Леша Киселев @Yakud
    Я использую такой подход:
    Есть три интерфейса EntityInterface, RepositoryInterface, RepositoryDriverInterface
    interface EntityInterface extends Serializable {
        public function getId();
    }
    
    interface RepositoryInterface {
        public function getDriver();
        public function findById($id, EntityInterface $Entity);
        public function save(EntityInterface $Entity);
    }
    
    interface RepositoryDriverInterface {
        public function set($id, $data);
        public function get($id);
    }

    Драйвер репозитория работает с базой данных. Сам репозиторий занимается сериализацией/десериализацией сущностей. Примеры драйверов:

    Драйвер, работающий с массивами:
    class RepositoryDriverArray implements RepositoryDriverInterface {
        private $data = [];
    
        public function set($id, $data) {
            $this->data[$id] = $data;
        }
    
        public function get($id) {
            return $this->data[$id];
        }
    }

    Драйвер работающий с Redis'ом:
    class RepositoryDriverRedis implements RepositoryDriverInterface {
        protected $Redis = null;
    
        public function __construct(Client $Redis) {
            $this->Redis = $Redis;
        }
    
        public function set($id, $data) {
            $jsonData = json_encode($data);
            $this->Redis->hset($this->getContainerName(), $id, $jsonData);
        }
    
        public function get($id) {
            $jsonData = $this->Redis->hget($this->getContainerName(), $id);
            $data = json_decode($jsonData, true);
    
            return $data;
        }
    
        public function getContainerName() {
            return 'myContainer';
        }
    }

    Пример реализации самих репозиториев:
    abstract class AbstractRepository implements RepositoryInterface {
        protected $RepositoryDriver = null;
    
        public function __construct(RepositoryDriverInterface $RepositoryDriver) {
            $this->RepositoryDriver = $RepositoryDriver;
        }
    
        public function save(EntityInterface $Entity) {
            $this->getDriver()->set($Entity->getId(), $Entity->serialize());
        }
    
        public function findById($id, EntityInterface $Entity) {
            $data = $this->getDriver()->get($id);
            $Entity->unserialize($data);
    
            return $Entity;
        }
    
        public function getDriver() {
            return $this->RepositoryDriver;
        }
    }

    Далее, пишем бизнес-логику:
    class User implements EntityInterface {
        // TODO: Implement methods
    }
    class UserRepository extends AbstractRepository {}

    И вот так работаем со всей этой системой:
    $Redis = new Client([/* connection params */]);
    $RedisDriver = new RepositoryDriverRedis($Redis);
    $UserRepository = new UserRepository($RedisDriver);
    
    $User = new User();
    $UserRepository->save($User);
    
    $User = new User();
    $UserRepository->findById(1, $User);

    Пишем юнит тесты? Подменяем драйвер репозитория:
    $ArrayDriver = new RepositoryDriverArray();
    $UserRepository = new UserRepository($ArrayDriver);
    
    $User = new User();
    $UserRepository->save($User);
    
    $User = new User();
    $UserRepository->findById(1, $User);


    Такую систему очень просто тестировать. Всю "рутину" можно обернуть в различные фасады, "конфигураторы", провайдеры.
    Я написал лишь примеры, конечно, в реальной системе больше возможностей драйвера, репозиториев.
    Кэширование стоит делать на уровне репозитория. Драйвер занимается только сохранением/загрузкой данных.
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Что лучше: красивое письмо или без форматирования?

    Yakud
    Леша Киселев @Yakud
    Попробуйте a/b тестирование провести. Выбрать аудиторию, разослать половину писем с графикой, а вторую половину без оной. Посмотреть конверсию и сделать выводы.

    Вряд ли кто-то сможет ответить на ваш вопрос. Очень от специфики зависят результаты.
    Ответ написан более трёх лет назад
    2 комментария
    2 комментария
  • Какая БД лучше всего делает аггрегации?

    Yakud
    Леша Киселев @Yakud
    ElasticSearch
    https://www.elastic.co/guide/en/elasticsearch/refe...
    https://www.elastic.co/guide/en/elasticsearch/refe...

    По собственному опыту скажу, что очень хорошо справляется. Сейчас имеется маленький кластер с 300+ гб событий статистики, все очень шустро работает.

    Вот еще несколько ссылок, дабы избежать распространенных ошибок в настройке кластера.
    radar.oreilly.com/2015/04/10-elasticsearch-metrics...
    https://www.loggly.com/blog/nine-tips-configuring-...
    https://www.elastic.co/blog/found-optimizing-elast...

    Наткнулся как раз на камень, описывающийся в этой статье:
    https://www.elastic.co/blog/support-in-the-wild-my...
    При настройке маппинга индекса, указывай параметр для не анализируемых полей:
    "doc_values" : true
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как поставить(установить) phpstorm x64 на win 7 x64?

    Yakud
    Леша Киселев @Yakud
    AtJnVVV.png
    https://www.jetbrains.com/phpstorm/download/
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
  • Какие фреймворки используются реализации краудфандинг-проекты?

    Yakud
    Леша Киселев @Yakud
    На любых
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как программно отличить профессиональную фотографию от любительской?

    Yakud
    Леша Киселев @Yakud
    Первым делом, нужно дать определение, что такое любительская фотография, что такое профессиональная фотография?
    Профессиональной считать снятую на хорошую зеркалку? Но и начинающий фотограф может пользоваться отличной зеркалкой. А настоящий профессионал фотать на мыльницу. Это субъективная оценка.
    Ответ написан более трёх лет назад
    Комментировать
    Комментировать
  • Как правильно извлечь данные из bitmap-a redis?

    Yakud
    Леша Киселев @Yakud
    $redisProducts = $redis->get('test');
    
    $ar = [];
    for($i = 0; $i < 50000; $i++){
        if ($redisProducts & pow(2, $i)){
            $ar[] = $i;
        }
    }


    php.net/manual/ru/language.operators.bitwise.php
    Ответ написан более трёх лет назад
    1 комментарий
    1 комментарий
Оценили как «Нравится»
  • 1
  • 2
  • 3
  • 4
  • Следующие →
Самые активные сегодня
  • Drno
    • 13 ответов
    • 0 вопросов
  • dimonchik2013
    Dimonchik
    • 6 ответов
    • 0 вопросов
  • telegram_value_maker
    • 5 ответов
    • 0 вопросов
  • tsklab
    Константин Цветков
    • 4 ответа
    • 0 вопросов
  • modelair
    modelair
    • 4 ответа
    • 0 вопросов
  • gkukuruz
    Геннадий
    • 4 ответа
    • 0 вопросов
  • © Habr
  • О сервисе
  • Правила
  • Обратная связь
  • Блог

Войдите на сайт

Чтобы задать вопрос и получить на него квалифицированный ответ.
Войти через центр авторизации