• Есть ли сервис с возможностью выполнения gulp/grunt заданий?

    27cm
    @27cm
    TODO: Написать статус
    По уму такие вещи делают с помощью Continuous Integration.
    Сервисы для организации CI легко найти в интернете. Я пользуюсь PHPCI.
    Ответ написан
    1 комментарий
  • Как отправить li на почту?

    27cm
    @27cm
    TODO: Написать статус
    Вопрос конечно бредовый... Разницы нет откуда были получены данные: из input или ajax'ом. Отправлять на почту одинаково и там и там. Причем тут таблица, и как она связана с элементом списка вообще не понятно.
    Ответ написан
    4 комментария
  • Как реализовать систему рейтинга сайтов?

    27cm
    @27cm
    TODO: Написать статус
    Я не могу придумать как хранить статистику посещаемости Хосты - Хиты.

    В любом хранилище данных на сервере, любая база данных подойдёт. Начать можно с таблиц:
    sites (id_site, url)
    hosts (id_host, ip, useragent)
    hits (id_hit, id_host, id_site, date)

    С учётом что на счётчике нужно отрисовывать хосты за сегодня, вчера и за всё время

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

    Под "отрисовывать" подразумевается изображение счётчика посещений, вроде тех, что у liveinternet?
    Ответ написан
  • Файлы для определенных пользователей?

    27cm
    @27cm
    TODO: Написать статус
    Хочется - делай. Вопрос в чем?

    В поисковике искать "php file upload", "php file download", "php file remove"...
    Ответ написан
    2 комментария
  • Return в конструкторе PHP?

    27cm
    @27cm
    TODO: Написать статус
    Если уж очень хочется: https://3v4l.org/iOpXc
    echo $a->__construct('Ivan');
    Ответ написан
    Комментировать
  • Возможно ли использование констант в константах?

    27cm
    @27cm
    TODO: Написать статус
    В PHP 5.6 константные выражения должны работать:
    php.net/manual/ru/migration56.new-features.php

    Но если очень уж хочется на старой версии, то можно сделать такой трюк:
    <?php
    
    define('QUERY_TABLE_PREFIX', 'prefix_');
    define('QUERY_TABLE_ENTITYES', 'entity');
    define('QUERY_GET_ENTITY_BY_ID', 
        'SELECT `id` AS id, `name` AS name, `origin` AS domain, `token` AS token ' . 
        'FROM ' . QUERY_TABLE_PREFIX . QUERY_TABLE_ENTITYES . ' ' .
        'WHERE `id`=?i LIMIT 1'
    );
    
    class Query
    {
      const TABLE_PREFIX = QUERY_TABLE_PREFIX;	
      
      const TABLE_ENTITYES = QUERY_TABLE_ENTITYES;
    
      const GET_ENTITY_BY_ID = QUERY_GET_ENTITY_BY_ID;
    }
     
    $queryString = Query::GET_ENTITY_BY_ID;
    Ответ написан
    3 комментария
  • Как выполнить рекомендации от гугла expiration not specified?

    27cm
    @27cm
    TODO: Написать статус
    В htaccess забыли "access plus 1 week". И все перечисленное - директивы модуля mod_expires, а не mod_headers.

    Я использую такой вариант:
    <IfModule mod_expires.c>
        ExpiresActive on
    
        ExpiresDefault "access plus 1 month"
    
        ExpiresByType text/cache-manifest "access plus 0 seconds"
    
        <FilesMatch \.(html|xhtml|xml|shtml|phtml|php|txt)$>
            ExpiresDefault "access plus 0 seconds"
        </FilesMatch>
        ExpiresByType text/html                 "access plus 0 seconds"
        ExpiresByType text/xml                  "access plus 0 seconds"
        ExpiresByType application/xml           "access plus 0 seconds"
        ExpiresByType application/json          "access plus 0 seconds"
    
        ExpiresByType application/rss+xml       "access plus 1 hour"
        ExpiresByType application/atom+xml      "access plus 1 hour"
    
        <FilesMatch \.(ico)$>
            ExpiresDefault "access plus 1 week"
        </FilesMatch>
        ExpiresByType image/x-icon "access plus 1 week"
    
        <FilesMatch \.(gif|png|jpg|jpeg|ogg|mp4|mkv|flv|swf|wmv|asf|asx|wma|wax|wmx|wm)$>
            ExpiresDefault "access plus 1 year"
        </FilesMatch>
        ExpiresByType image/gif                 "access plus 1 month"
        ExpiresByType image/png                 "access plus 1 month"
        ExpiresByType image/jpeg                "access plus 1 month"
        ExpiresByType video/ogg                 "access plus 1 month"
        ExpiresByType audio/ogg                 "access plus 1 month"
        ExpiresByType video/mp4                 "access plus 1 month"
        ExpiresByType video/webm                "access plus 1 month"
        ExpiresByType text/x-component          "access plus 1 month"
    
        <FilesMatch \.(eot|ttf|otf|svg|woff)$>
            ExpiresDefault "access plus 1 year"
        </FilesMatch>
        ExpiresByType application/x-font-ttf    "access plus 1 month"
        ExpiresByType font/opentype             "access plus 1 month"
        ExpiresByType application/x-font-woff   "access plus 1 month"
        ExpiresByType image/svg+xml             "access plus 1 month"
    
        <FilesMatch \.(css|js)$>
            ExpiresDefault "access plus 1 year"
        </FilesMatch>
        ExpiresByType text/css                  "access plus 1 year"
        ExpiresByType application/javascript    "access plus 1 year"
    </IfModule>
    Ответ написан
    Комментировать
  • Что сказать верстаку который верстает так формы?

    27cm
    @27cm
    TODO: Написать статус
    Указать ему на конкретные ошибки, основные вы уже перечислили.

    Сам периодически оказываюсь в подобной ситуации, то есть когда "специалист", которому я собираюсь оплатить его работу (или уже оплатил часть), пытается продать мне какое-то д***мо. Разбирательства стараюсь начинать с больных вопросов. В вашем случае это могли бы быть вопросы: "Почему вы не использовали тег form?", "Вы считаете данную вёрстку семантической?", "Почему в названиях классов используете смесь транслита с английским языком?". Как правило, в итоге всегда удавалось показать исполнителю его некомпетентность и мирно прекратить сотрудничество.
    Ответ написан
    Комментировать
  • Почему не создаётся phar?

    27cm
    @27cm
    TODO: Написать статус
    $hello = "Hello!";
    $phar = new Phar('test.phar');
    $phar['hello.txt'] = $hello;
    Ответ написан
    Комментировать
  • Как будет работать быстрее и насколько?

    27cm
    @27cm
    TODO: Написать статус
    Взять и проверить, замерив скорость работы и потребляемую память.

    Есть идея сделать выборку из этих таблиц сразу в начале функции и в цикле обращаться к ассоциативным массивам.

    Можно пойти ещё дальше - сохранить массив в оперативную память, например, с помощью memcache. И вообще базу дёргать не придётся.
    Ответ написан
    Комментировать
  • Как генерировать ключ?

    27cm
    @27cm
    TODO: Написать статус
    Например, можно сделать так: https://3v4l.org/LHe5q
    <?php
    
    define('SECRET', 'tostersecretcode2015');
    
    /**
     * Создаёт серийный номер с заданной проверочной частью.
     * 
     * @param string $check Часть серийного номера, используемая для проверки.
     * 
     * @return bool
     */
    function sernum ($check = null)
    {
        $template   = 'XXX99-XXX99-99XXX-99XXX';
        
        $parts = explode('-', $template, 2);
        if (!isset($check)) {
            $check = '';
            for ($i = 0; $i < strlen($parts[0]); $i++) {
                switch ($parts[0][$i]) {
                    case 'X': $check .= chr(rand(65, 90)); break;
                    case '9': $check .= strval(rand(0,9)); break;
                }
            }
        }
        
        $sernum = $check . '-';
        $hash = hash('sha256', $check . SECRET);
        
        for ($i = 0; $i < strlen($parts[1]); $i++) {
            switch ($parts[1][$i]) {
                case 'X': $sernum .= chr(65 + ord($hash[$i]) % 26); break;
                case '9': $sernum .= strval(ord($hash[$i]) % 10); break;
                case '-': $sernum .= '-';  break; 
            }
        }
        
        return $sernum;
    }
    
    /**
     * Проверяет серийный номер.
     * 
     * @return bool
     */
    function check_sernum ($sernum)
    {
        $parts = explode('-', $sernum, 2);
        return (sernum($parts[0]) === $sernum);
    }
    
    
    echo '<pre>Десять случайных номеров:<br>';
    for ($i = 0; $i < 10; $i++) 
        echo sernum(), '<br/>';
    
    if (check_sernum('XCC58-AYA68-75ZUU-19TDZ')) {
        echo 'Номер XCC58-AYA68-75ZUU-19TDZ прошёл проверку<br>';
    }
    
    if (!check_sernum('ESJ18-TBZ25-42XDX-38XWY')) {
        echo 'Номер ESJ18-TBZ25-42XDX-38XWY не прошёл проверку<br>';
    }


    Алгоритм создания серийного номера:
    1. Разбиваем шаблон XXX99-XXX99-99XXX-99XXX на две части: XXX99 и XXX99-99XXX-99XXX
    2. Для первой части XXX99 используем случайные буквы и цифры. Получаем, например: XCC58
    3. Вычисляем SHA256 хеш для строки ('XCC58' . SECRET)
    4. Используем коды символов полученного хеша, чтобы получить оставшуюся часть ключа, и подстроить её под шаблон XXX99-99XXX-99XXX. Получаем AYA68-75ZUU-19TDZ.
    5. Объединяем две полученные строки - серийный номер готов.
    Ответ написан
    Комментировать
  • Удаление похожих слов?

    27cm
    @27cm
    TODO: Написать статус
    Используйте любой из алгоритмов нечёткого поиска, например вычисляйте Расстояние Левенштейна для каждой парый слов. В зависимости от полученных значений решайте, какие слова удалять, а какие оставить.

    var str = 'тест тост тест тесто';
    var words = str.split(' ');
    var result = [];
    for (var i = 0; i < words.length; i++) {
        result.push(words[i]);
        for (var j = i + 1; j < words.length; j++) {
            if (levenshtein(words[i], words[j], {}) < 2) {
                words.splice(j--, 1);
            }
        }
    }

    https://jsfiddle.net/9hz8wmz6/
    Ответ написан
    Комментировать
  • Вложенность в css препроцессорах?

    27cm
    @27cm
    TODO: Написать статус
    Действительно чрезмерная вложенность, если она оправдана, это плохо лишь тем, что становится тяжело читать и поддерживать такой код. Ваш пример вполне читаем, всего 4 уровня. Вот, если почувствуете, что становится тяжело разобраться, какой селектор во что вложен, тогда можно подумать об "оптимизации", например так:
    .sidebar 
      width 260px
      height calc(100% - 65px)
      border-right 2px solid $border-color
      background-color #EFF4F7
    
    .sidebar-item 
      border-bottom 1px solid $border-color
      a 
        display inline-block
        width 100%
        padding 14px 25px
        i 
          margin-right 12px
      &:hover 
        background-color white  
      &:first-child 
        border-top 1px solid $border-color
    Ответ написан
    Комментировать
  • Что делать если все стили в html?

    27cm
    @27cm
    TODO: Написать статус
    Сам еще не до конца разбираюсь, но, помоему, это сильно сказывается на скорости загрузки?

    Сказывается, возможно, в лучшую сторону. Всё же на один запрос к серверу меньше.
    stackoverflow.com/questions/8284365/external-css-v...

    Сжать html надо в любом случае.
    Ответ написан
    Комментировать
  • Почему memory_limit меняется произвольно?

    27cm
    @27cm
    TODO: Написать статус
    Может какое-то странное срабатывание кеша в браузере?
    header("Cache-Control: no-store, no-cache, must-revalidate");
    header("Expires: " . date("r"));
    phpinfo();
    Ответ написан
    1 комментарий
  • Настройка выделения своей функции в phpshtorm. Возможно ли?

    27cm
    @27cm
    TODO: Написать статус
    Такие ф-ции созданы для того, чтобы отслеживать скорость запросов.

    Для этого есть профилировщики.

    В homesite я мог добавить свои ф-ции и они выделялись не как ф-ции а как mysql a-ции.

    Можно скриншот, чтобы были mysql_query() и my_query() и выделялись по-разному? По-моему это не возможно, phpStorm все функции одинаково подсвечивает. Какая версия шторма?

    Грубо говоря, мне нужно сделать так, чтоб определенная ф-ция, например my_query() выделялась не так, как все другие ф-ции а как-то иначе, например жирным. Как-то так.

    Нет такой возможности в PhpStorm.

    Имея свои ф-ции можно делать много разных полезных дел. Записывать ошибки при выборках и т.д. Я уже давно не пользуюсь напряму mysql_query заменив их на свои ф-ции.

    Но всё же для замера скорости работы функций есть профилировщики. Обрачивать каждую функцию в собственную чтобы логировать ошибки - тоже так себе решение.
    Ответ написан
    Комментировать
  • Установка Ubuntu 14.04 на SDD+HDD?

    27cm
    @27cm
    TODO: Написать статус
    Да, вполне нормально. Хотя, если для /home Вам хватит объёма SSD, то его и не зачем переносить на HDD. Добавлю только, что рекомендется оставлять 15-20% SSD диска неразмеченными:
    www.outsidethebox.ms/14484
    Ответ написан
    2 комментария
  • Как проверить строку по маске?

    27cm
    @27cm
    TODO: Написать статус
    Можно конечно как-то наговнокодить, пытаться сгенерировать регулярку, потом ее подставлять, но интересует красивый и быстрый способ

    А можно не наговнокодить, а красиво и быстро сгенерировать регулярку из маски.
    ideone.com/YY4Yhh
    $mask = 'X-XX-XX-XXXXX';
    $test = '7-Ds-re-SD434';
    
    $pattern = preg_replace_callback('/X+/', function ($m) { 
        return '[^-]{' . strlen($m[0]) . '}'; 
    }, preg_quote($mask));
    
    if (preg_match("/^{$pattern}$/", $test)) {
    	echo "Строка '$test' подходит под маску '$mask'"; 
    }


    Но есть вариант и проще:
    ideone.com/GiwMAY
    $mask = 'X-XX-XX-XXXXX';
    $test = '7-Ds-re-SD434';
    
    if (preg_replace('/[^-]/', 'X', $test) == $mask) {
        echo "Строка '$test' подходит под маску '$mask'"; 
    }
    Ответ написан
    Комментировать