Задать вопрос
  • Как сделать ссылку на репозиторий?

    @bigsnake
    Создаёте новый проект в репозитории, заливаете в него проект, на гитхаб все проекты кроме платных открытые. Если это вёрстка воспользуйтесь github pages
    Ответ написан
    2 комментария
  • Откуда входящий и исходящий трафик на сервере?

    @bigsnake
    Роботы всякие по сети постоянно шарятся, отсюда входящий. ПО какое обновление может проверялов репах - отсюда исхоядщий
    Ответ написан
    Комментировать
  • Откуда сайты спортивной статистики берут информацию?

    lapka-admin
    @lapka-admin
    Редакторы, фрилансеры в штате есть, смотрят матч, ноутбук рядом, что-то произошло - заносят сразу.
    Ответ написан
  • Большая вложенность URL влияет на индексацию?

    gobananas
    @gobananas
    finishhim.ru
    Ваш вопрос никак не относится к вашей проблеме.
    В данном случае URL значения не имеет он может быть любой длинны и содержать любое количество уровней вложенности в разумных пределах. Проверь например этот запрос вы увидите что на первой странице выдачи есть сайты с адресами вида:
    http://nn.blizko.ru/predl/promgood/appliances/ruhonnaja/kofemol

    и
    https://vash.market/bytovaya-tehnika/melkaya-tehnika-dlya-kuhni/14-vidov-luchshih-kofemolok-printsip-raboty-kak-vybrat-harakteristiki.html


    В первом случае точно так же глубина 4 как у вас + сама страница kofemol
    Уровень вложенности не влияет на важность документа никак.

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

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Я же давал в прошлом ответе ссылку на чеклист, в котором написано, как правильно работать с транзакциями.

    1. PDO error reporting надо установить на PDO::ERRMODE_EXCEPTION иначе ловить будет нечего
    2. ловить надо Exception, а не PDOException
    3. после отката исключение надо перевыбросить
    4. убедиться что движок БД поддерживает транзакции (например InnoDB)
    5. среди запросов нет такого, который модифицирует стркутуру БД

    Ну и убедись, что в БД у тебя не лежат уже обновленные данные. Потому что в этом случае $Changed законно будет нулем.
    Ответ написан
    2 комментария
  • Почему крупные сайты не используют адаптивную верстку?

    gobananas
    @gobananas
    finishhim.ru
    У них всего слишком много думаю и просто сложить не вариант. Страницы на мобилах будут огромные, некоторые блоки не просто складывать а скрывать придётся, а тогда зачем их грузить. К тому же если человек с мобилки мы можем определить её марку и в играх рекомендовать уже не все, а только для этой платформы что-то.
    Причин много, но правило простое: когда нам нужны очень разные сайты или на основном сайте есть то, что не нужно в мобильном лучше сделать разные версии чем заниматься с адаптивностью. Хотя в малых компаниях, командах адаптивность проще поддерживать.
    Ответ написан
    2 комментария
  • Где настроить nginx ngx_http_headers_module?

    castomi
    @castomi
    Серверный администратор - tickets.settin.ru
    Если ты хочешь применить это для всех сайтов сервера то в файле nginx.conf в Контексте http, файл этот обычно лежит по адресу /etc/nginx/nginx.conf
    Если ты хочешь прописать для определённого сайта, то виртуальные хосты сайтов обычно лежат в /etc/nginx/sites-available там нужно указать в контексте server.
    Если ты хочешь прописать это для определённой папки или файла, то тебе нужно указать в том же виртуальном хосте только в соответствующем location
    После внесения изменений в файлы или файл настроек Nginx нужно проверить корректность конфигурации, сделать это можно командой nginx -t, если конфигурация корректная примените еёnginx -s reload
    Ответ написан
    Комментировать
  • Выборка диапазона дат из MySQL?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Лучшим по скорости вариантом будет индекс по дате и условие
    WHERE `date` >= '2017-08-01' AND `date` < '2017-09-01'

    Можно, конечно, сделать запрос вида
    WHERE YEAR(`date`) = 2017 AND MONTH(`date`) = 8
    но такой запрос, как и BETWEEN не будет использовать индекс.
    Ответ написан
    Комментировать
  • Переход с MariaDB на Percona - какие подводные камни?

    drno-reg
    @drno-reg
    см не кратко
    занимаюсь эксплуатацией zabbix на форке mysql - percona. Целью перехода была попытка оптимизации работы СУБД при переходе storage на SSD, она именно на это заточена. Дополнительных особенностей при переводе объектов БД не было.
    Ответ написан
    Комментировать
  • Куда двигаться дальше senior разработчику? Новый язык, технологии, opensource, стартап?

    gobananas
    @gobananas
    finishhim.ru
    пришло понимание, что программирование это не знание языка и фреймворков

    Какой вы для себя ответ определили на вопрос что же такое программирование?

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

    Стартап? Определите какая потребность не закрыта у вас и друзей и пилите его каждый вечер по часу-два.

    Big Data это ведь не самоцель. Вот прошли вы курс допустим. Что вы будете бигдейтить, на каких данных?

    Самое главное ответьте себе на вопрос что вам по-настоящему нравится и двигайтесь в эту сторону.
    Ответ написан
    3 комментария
  • Как переопределять системные стили Bootstrap?

    gobananas
    @gobananas
    finishhim.ru
    Файлы бутстрапа не трогать.
    Переопределить одиним из 2 методов:
    1) Подключить свой css ниже бутстрапа, в нём написать например
    .navbar{
      padding: 2rem 0.5rem;
    }

    Это переопределит отступы во всём бутстрапе

    2) Добавить свой класс в конце:
    <nav class="navbar navbar-expand-lg navbar-light myclass">

    Дальше делаете то же самое, в свой css ниже бутстрапа добавляете:
    .myclass{
      padding: 2rem 0.5rem;
    }

    Это переопределит родные бутстраповские стили стили только в одном месте.
    Ответ написан
    3 комментария
  • Как сделать шаблонизатор на php?

    copist
    @copist
    Empower people to give
    Сначала - зачем нужен шаблонизатор. Тут подмена понятий. Скорее вопрос такой: как отделить вывод от заголовков. Если не отделять, то может быть такая ошибка

    <html>
    <body>
    <?php
    // начать сессию
    session_start(); // отправить куку PHPSESSID через заголовки HTTP
    // но она не может отправиться, потому что уже начался вывод HTML в строке "<html ..."
    
    // если не авторизован, то отправить на страницу логина
    if (empty($_SESSION['username']))
        header('Location: /login.php'); // но заголовок HTTP тоже не может отправиться, как и кука
    ?>
        <h1>Hello, <?php echo $_SESSION['username'] ?></h1>
    </body>
    </html>


    Проблема решается, если вывод HTML делать после вывода заголовков. Например, использовать буфер
    <?php ob_start(); // открыть буфер ?>
    <html>
    <body>
    <?php
    session_start(); //  кука PHPSESSID отправится, потому что HTML ещё в буфере
    if (empty($_SESSION['username']))
        header('Location: /login.php'); // заголовок HTTP отправится, потому что HTML ещё в буфере
    ?>
        <h1>Hello, <?php echo $_SESSION['username'] ?></h1>
    </body>
    </html>
    <?php ob_end_flush(); // выбросить содержимое буфера наружу и закрыть его ?>


    Однако так придётся писать в каждом месте, где формируется HTML. Можно ли сократить?

    Простейшее представление через буфер

    <?php
    function render($viewPath)
    {
        if (!is_file($viewPath))
            return 'View "'. $viewPath . '" not exists';
        ob_start();
        include($viewPath);
        return ob_get_clean();
    }
    
    session_start();
    if (empty($_SESSION['username']))
        header('Location: /login.php');
    
    $viewsPath = __DIR__.'/views/'; // где лежат представления
    render($viewsPath . 'page.php'); // нарисовать страницу HTML


    <?php
    # page page.php
    ?>
    <html>
    <body>
        <h1>Hello, <?php echo $_SESSION['username'] ?></h1>
    </body>
    </html>


    А дополнительно ещё решают проблему отделения логики от формирования интерфейса. Работа с внешними данными в одном месте, а отображение их - в другом. Для этого в представление передают всё, что нужно показать. И точка. Лишних данных там не надо. В некоторых фреймворках стоит Exception если представление начнёт работать с базой данных, читает данные из входного запроса или пытается отправить заголовки.

    <?php
    function render($viewPath, $vars)
    {
        if (!is_file($viewPath))
            return 'View "'. $viewPath . '" not exists';
        extract($vars); // extract делает из массива набор переменных в локальной области видимости
        ob_start();
        include($viewPath); // эти переменные будут видны внутри подключаемого файла
        return ob_get_clean();
    }
    
    session_start();
    if (empty($_SESSION['username']))
        header('Location: /login.php');
    
    $viewsPath = __DIR__.'/views/'; // где лежат представления
    render($viewsPath . 'page.php', array( // отображаемые данные передаются массивом
        'username' => $_SESSION['username'],
    ));


    # page.php
    <?php
    /**
     * Подсказки для IDE, чтобы не подсвечивал переменные как неопределённые
     * @var string $username
     */
    <html>
    <body>
        <h1>Hello, <?php echo $sername ?></h1>
    </body>
    </html>


    Не правда ли, с представлениями код становится значительно изящнее. А если логика для реализации представлений хранится в отдельном файле-библиотеке, то код становится короче и понятнее.

    В фреймворках вместо функции render может использоваться объектная реализация

    <?php
    class ViewException extends Exception {}
    
    class View
    {
        public $viewsPath = __DIR__.'/views/';
        
        public function __construct($viewsPath = null)
        {
             // настройка представлений
            // например, можно перепределить место хранения представлений
            if (!is_null($viewsPath))
                $this->viewsPath = $viewsPath;
        }
    
        public function render($viewPath, $vars)
        {
            if (!is_file($this->viewsPath . $viewPath))
                throw new ViewException('View "'. $viewPath . '" in folder "'. $this->viewsPath . '" not exists');
            extract($vars);
            ob_start();
            include($this->viewsPath . $viewPath);
            return ob_get_clean();
        }
    }
    
    $view = new View();
    $view->render('page.php', array(
        'username' => $_SESSION['username']
    ));


    Как таблицы шаблонизаирова если в одной 3 столбца, в другой 5?

    Никто в представлениях не запрещает использовать языковые конструкции. Это могут быть конструкции языка PHP или какой-нибудь другой язык, специально написанный для шаблонизатора. Например, в Smarty, Blade, Pug свои языки. Передай в представление количество колонок и сделай цикл :)

    у первой первый столбец должен быть 70% а у второй последний?

    В представлениях можно подключать стили CSS, через которые меняется отображение (колонка 70%).
    У каждого представления может быть свои стили.
    Если нужно, чтобы были некоторые общие стили и дополнительные, нужные только для этой страницы, используют что-то типа буферизирования вывода блока стилей.

    <?php
    class Assets
    {
        public static $cssLinks = array();
        public static $css = array();
    
        // добавить ссылку на файл стилей
        public function addCssLink($link)
        {
            self::$cssLinks[$link] = $link;
        }
    
        // добавить блок стилей
        public function addCss($name, $css) // $name - это чтобы не дублировались блоки стилей, на всякий случай
        {
            self::$css[$name] = $css;
        }
    
        public function renderCss()
        {
            foreach(self::$cssLinks as $url)
                echo '<link href="'.$url.'" rel="stylesheet" type="text/css" />';
            echo '<style type="text/css">';
            foreach(self::$css as $css)
                echo $css;
            echo '</style>';
        }
    }


    # index.php
    
    $assets = new Assets();
    // общие стили
    $assets->addCssLink('https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css');
    
    // ...
    
    $view = new View();
    $view->render('page.php', array(
        'username' => $_SESSION['username']
    ));


    # page.php
    <?php
    /**
     * @var string $username
     */
    $assets = new Assets();
    $assets->addCssLink('/path/to/my/styles.css'); // ещё один файл стилей
    $assets->addCss('h1 { color: red; }'); // или даже что-нибудь микроскопическое, только для этой страницы
    ?>
    <html>
    <head>
    <?php $assets->renderCss() ?>
    </head>
    <body>
        <h1>Hello, <?php echo $username ?></h1>
    </body>
    </html>


    И аналогично про JS.
    Ответ написан
    7 комментариев
  • Как не попасть под фильтр гугл?

    gobananas
    @gobananas
    finishhim.ru
    В google webmaster tools есть опция отказа от ссылок, надо выбрать в разделе бэклинков все ссылки что они закупили и отказаться от них.
    Ответ написан
    Комментировать
  • Стоит и какие наработки выкладывать на github для будущего портфолио?

    @codemania
    По мне так просто надо что-то иметь причём максимально запутанное , что бы желания подробно смотреть не было, потому что:
    1) Напишешь ORM - фу велосипеды, есть же готовые ORM фреймворков
    2) Выложить проект на фреймворке - та ты там сам ничё и не написал
    3) Выложишь на VanillaJS - фу, на нём уже никто не пишет
    4) Выложишь на angular - фу сейчас все уже на angular2
    5) Выложишь на angular2 - фу ничё не понятно и вообще все уже на VUE

    На C надо чёнить выкладывать или на Assembler потому мало кто из нового поколения разработчиков их знают, они уже все погрязли в абстракциях ))
    Ответ написан
    7 комментариев
  • Как вырасти до middle деволпера?

    gobananas
    @gobananas
    finishhim.ru
    Изучать архитектуру. Сейчас вам фреймворк полностью дал архитектуру проекта и отчасти БД. Спроектируйте архитектуру БД для сложного проекта с нуля. Каковы недостатки архтектуры этого фреймворка, какая реализация была бы удобнее, эффективнее? Что вы делали бы, если бы пришли в компанию где старый велосипед без фреймворка работает? Ответы на все эти вопросы и делают вас мидлом.
    Ответ написан
    Комментировать
  • Какие минимальные знания нужны для технической реализации интернет-стартапа?

    gobananas
    @gobananas
    finishhim.ru
    Знание особенностей различных языков программирования и БД на уровне, достаточном, что бы принять или отклонить предлагаемую технологию.
    Особенности рынка труда, найма и работы в IT
    KPI разработчиков
    Методологию работы (как ставить задачи, контрольные точки, будете ли agile, scrum использовать)
    Основы тестирования приложений (хотя бы на уровне, что бы спросить: у нас есть unit-тесты? в какой они папке? какой покрытие?)
    Основы безопасности (основные угрозы: взлом, ddos и как от них защититься)

    Ну вот крупными мазками как-то так. Главное найти техдира, которому вы верите, если вас техдир будет обманывать, то вам почти ничего не поможет.
    Ответ написан
  • Селекты из таблицы на 5 млн строк. Если разбить её на 100 таблиц - будет выигрыш в производительности?

    gobananas
    @gobananas
    finishhim.ru
    Нет, выигрыша вы не получите, потому что в MySQL есть ещё время на открытие таблицы некоторое, и там доп. логику придётся писать с условиями из какой таблицы выбирать. Надо денормализовать данные хотя бы немного, сделать EXPLAIN, посмотреть, бывает MySQL сходит с ума и не использует правильные индексы.
    5 млн. это не очень много, уверен всё можно привести в норму.
    P.S. Сам работал с таблицей 3,5 млн. записей на сервере с 2 Гб памяти, всё отлично, дольше 0,1 секунды запросов нет, хотя и это многовато имхо.
    Ответ написан
    Комментировать