Как получить 100/100 Google PageSpeed Insights и не подать виду

Один из заказчиков попросил меня немного причесать сайт, заодно прописать цели для Яндекс.Метрики и Google Analytics. Между делом он рассказал мне, что предыдущим «оптимизаторам» удалось разогнать сайт до 100 баллов в PageSpeed Insight, мол, работа по оптимизации была долгая и значение упорно не хотело расти, но однажды подскочило до 100 и на этом закончили.

Я был немного удивлен услышанным, т.к. это был сайт на Joomla на бюджетном шаред-хостинге, с косяками адаптивной версии, неоптимизированными прозрачными PNG-шками по несколько мегабайт весом. В перерыве между работой ради интереса решил замерить баллы, правда через встроенный в Google Chrome Lighthouse.

33 балла в Lighthouse, странно

Опять переспросил заказчика, он говорит что показывает 100, но через сервис на сайте PageSpeed’а. И действительно.

А теперь самое интересное. Идем в index.php в корне сайта, и смотрим. Начало файла.

<? eval(gzuncompress(base64_decode('eAGdUtEKgjAU/ZUegilEIFNBYg/6UoQQ2IsVIWv6EkFgkfj37WwZIZtKL/dcvWfn3p3d+TrdJXG6P5HCizwahEHk04KcWVzXvHUu/FGFflFW4l5WDhE0I7MlaRF4nrxEg4wx4i56TPyX7JbnyCQT0JiYqkJRlmyA1AWIhgEM2voEtDGBUVN2xmE7Q3VAUDP+r9M5MtLp1wmrZ+Na2tGhabWDuJhiITE52PPb4uLHH0D3MhbmZnsD64jgRc9Dnl15jA/rG2rfQRnYDZRxZ+AEh0GbtBNK97tf7uoN8+vb5g==')));
eval(gzuncompress(base64_decode('eAG9kt1qg0AQhV8lF4IKvdDNmlaCF0npGmkMuLqrbClh/alKtlqsJiah7974ALG9SHs3MHM+Zs6Zt65K2rKuJlvDhBBo8H6mSKV6lri1aBp+VGQfYUKQSYlG/UhDK0wMIt/JHiiOMdDFmvQfDBQat009AcS6tK4ogncK08jNN541MvVXXIKc1tN3HRGjO4ZmycNeXL/iZhxbdAzgfUyXBQM0SGwq2GLMmeAXu+GA/idjfXIOG3To3CCfRo+wH+rn8mGIl+zoJtAxurzME0bOSOIYmHsGeuGgwQmSk+lSsNDL/dA48TCt05U7ov7ZlRvx1XmTtV1TTWL+mc3gNs2SOs0Uib9I5as6//oGaeX0oA==')));

Я первым делом подумал что сайт завирусован. Однако постороннего кода нигде не было, кроме как в index.php.

Чуйка и тут не подвела. Убираю посторонние вставки и опять проверяю скорость в PageSpeed.

Теперь все стало ясно. Для интереса все же решил разобрать обфусцированный код. Первый проход можно сделать через любой сервис для деобфусцификации, например:

<?php function _594420476($i) {
    $a = Array('SFRUUF9VU0VSX0FHRU5U', 'Q2hyb21lLUxpZ2h0aG91c2U=', 'SFRUUF9VU0VSX0FHRU5U', 'TmV4dXMgNQ==', 'SFRUUF9VU0VSX0FHRU5U', 'Q2hyb21lLUxpZ2h0aG91c2U=', 'SFRUUF9VU0VSX0FHRU5U', 'TmV4dXMgNQ==', 'SFRUUF9VU0VSX0FHRU5U', 'UFItQ1kuUlU=', 'SFRUUF9VU0VSX0FHRU5U', 'TW9iaWxl', 'SFRUUF9VU0VSX0FHRU5U', 'UFItQ1kuUlU=', 'SFRUUF9VU0VSX0FHRU5U', 'TW9iaWxl', 'SFRUUF9VU0VSX0FHRU5U', 'UGluZ2RvbVBhZ2VTcGVlZA==', 'SFRUUF9VU0VSX0FHRU5U', 'TW9iaWxl', 'SFRUUF9VU0VSX0FHRU5U', 'UFRTVA==', 'SFRUUF9VU0VSX0FHRU5U', 'TW9iaWxl', 'SFRUUF9VU0VSX0FHRU5U', 'UFRTVA==', 'SFRUUF9VU0VSX0FHRU5U', 'TW9iaWxl', 'LzIwNFwuMTg3XC4xNFwuKi8=', 'UkVNT1RFX0FERFI=', 'SFRUUF9VU0VSX0FHRU5U', 'R29vZ2xlIFBhZ2UgU3BlZWQgSW5zaWdodHM=', 'SFRUUF9VU0VSX0FHRU5U', 'TW9iaWxl', 'SFRUUF9VU0VSX0FHRU5U', 'R29vZ2xlIFBhZ2UgU3BlZWQgSW5zaWdodHM=', 'SFRUUF9VU0VSX0FHRU5U', 'TW9iaWxl');
    return base64_decode($a[$i]);
}
$GLOBALS['_1913565943_'] = Array(base64_decode('c3R' . 'y' . 'aXBvcw' . '=='), base64_decode('' . 'c3RyaX' . 'Bvc' . 'w=='), base64_decode('c' . '3' . 'Rya' . 'XBv' . 'cw=' . '='), base64_decode('c' . '3RyaXBvcw=='), base64_decode('c3Ry' . 'aXBvcw=='), base64_decode('' . 'c' . '3RyaXBvcw=='), base64_decode('c3Ry' . 'aXBvcw=='), base64_decode('c3R' . 'yaXBvcw=='), base64_decode('' . 'c3RyaX' . 'Bvcw' . '=='), base64_decode('c3R' . 'yaXBvcw=='), base64_decode('c3RyaXBvcw=='), base64_decode('c3Rya' . 'X' . 'Bvcw=' . '='), base64_decode('c3' . 'Rya' . 'XBvcw=='), base64_decode('c' . '3Ry' . 'a' . 'XBvcw=='), base64_decode('cHJl' . 'Z' . '19tYXRjaA' . '=' . '='), base64_decode('c3RyaXB' . 'vc' . 'w=='), base64_decode('' . 'c3Ry' . 'aXBvcw=='), base64_decode('' . 'c3Rya' . 'XBvcw=='), base64_decode('c3Ry' . 'aXBv' . 'cw=' . '='));

Уже лучше. Убираем конкатенации и пробегаемся через base64_decode.

if (stripos($_SERVER["HTTP_USER_AGENT") ], "Chrome-Lighthouse") && !stripos($_SERVER["HTTP_USER_AGENT" ], "Nexus 5")) {
    echo $p_0;
    die();
}
if (stripos($_SERVER["HTTP_USER_AGENT"], "Chrome-Lighthouse") && stripos($_SERVER["HTTP_USER_AGENT" ], "Nexus 5")) {
    echo $p_1;
    die();
}
if (stripos($_SERVER["HTTP_USER_AGENT" ], "PR-CY.RU") && !stripos($_SERVER["HTTP_USER_AGENT"], "Mobile")) {
    echo $p_0;
    die();
}
if (stripos($_SERVER["HTTP_USER_AGENT"], "PR-CY.RU") && stripos($_SERVER["HTTP_USER_AGENT"], "Mobile")) {
    echo $p_1;
    die();
}
if (stripos($_SERVER["HTTP_USER_AGENT"], "PingdomPageSpeed") && !stripos($_SERVER["HTTP_USER_AGENT" ], "Mobile")) {
    echo $p_0;
    die();
}
if (stripos($_SERVER["HTTP_USER_AGENT"], "PTST") && stripos($_SERVER["HTTP_USER_AGENT" ], "Mobile")) {
    echo $p_1;
    die();
}
if (stripos($_SERVER["HTTP_USER_AGENT"], "PTST") && !stripos($_SERVER["HTTP_USER_AGENT"], "Mobile""/204\.187\.14\.*/")) {
    echo $$p_0;
    die();
}
if (preg_match("REMOTE_ADDR", $_SERVER["HTTP_USER_AGENT" ])) {
    echo $p_0;
    die();
}
if (stripos($_SERVER["HTTP_USER_AGENT" ], "Google Page Speed Insights") && stripos($_SERVER["HTTP_USER_AGENT" ], "Mobile")) {
    echo $p_1;
    die();
}
if (stripos($_SERVER["HTTP_USER_AGENT" ], "Google Page Speed Insights") && !stripos("HTTP_USER_AGENT" ], "Mobile")) {
    echo $p_0;
    die();
}

В коде проверяются заголовки User Agent’а: если заходит бот Google, либо PR-CY.RU, то отдаем им «упрощенную версию сайта», либо мобильную, либо десктопную — пустой HTML файл с одним изображением скриншота сайта.

В переменных $p_0 и $p_1 лежит текст с HTML-страницей примерно со следующим содержимым:

<!DOCTYPE html>
<html class="no-js" lang="en">
<head>
<link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgo=" type="image/x-icon"> 
<title>Pagespeed</title>
<meta charset="utf-8">
<meta name="keywords" content="Pages speed">
<meta name="description" content="Pages speed">
<meta name="viewport" content="initial-scale=1, width=device-width">
</head>
<body>
<style>*{padding:0;margin:0} img{animation: fadein 1s;} @keyframes fadein { from { opacity: 0; } to { opacity: 1; }}</style>

<img src="data:image/jpeg;base64,

Полностью код с содержимым base64 изображения не выкладываю в целях конфиденциальности. Но я думаю общий смысл понятен для тех кто разбирается.

Скрипт проверяет кто заходит на сайт. Если это бот Google или PR-CY.RU, то им заместо сайта отдается скриншот сайта. Из-за небольшого объёма страницы и быстрой загрузки баллы увеличиваются до 100.

Кстати, обратите внимание на CSS в HTML. Ребята действительно «постарались» и сделали так, чтобы скриншот загружался плавно, с анимацией прозрачности. Думаю это для того, чтобы заказчики ничего не заподозрили глядя в скриншоты trace рендеринга страницы, а может такая обманка для Google. Не ясно до конца, но красиво.

Всё было бы смешно если бы не было так грустно для клиентов. Сайт вполне может попасть под блокировку за обман, а деньги за работы уже ушли.

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

Доработка поиска Joomshopping’а — добавляем изображения в результаты поиска

Для Joomshopping существует официальный поисковый плагин, позволяющий с помощью com_search компонента джумлы находить наши товары. Но есть в этом плагине недостатки:

  1. Ищет он только по товарам. Поиск по категориям отсутствует
  2. Хотелось бы в результатах поиска видеть изображение искомого товара

Первый пункт легко дорабатывается дополнительным запросом в базу. А вот со вторым пришлось немного изменить стандартные шаблоны вывода поиска.

После установки поискового плагина Joomshopping его можно найти по сл. пути: /plugins/search/joomshopping/joomshopping.php

Сначала я дополнил в нем стандартный запрос. Добавил в SELECT поле image_name и через LEFT JOIN добавил таблицу с изображениями товаров.

Далее я прошелся по результатам этого запроса и сразу исправил ссылку на товар и заместо названия файла картинки прописал полный путь к ней:

Остается только добавить вывод картинки в шаблоне поиска. Шаблон поиска конечно лучше переопределить в папке своего шаблона. Для этого нужно создать в шаблоне папку html, создать в ней папку com_search, а в ней еще одну папку search. В конечную папку скопировать файлы из папки /components/com_search/views/search/tmpl/default.php.

В итоге структура файлов должна быть примерно такой:

Результаты поиска формируются в файле default_results.php, выводим изображение:

Немного исправив шаблоны com_search можно добиться отличного оформления вывода поиска, что особенно актуально для интернет-магазинов:

2016-04-20_01-17-13

Кому интересно, выкладываю архив со всеми изменениями. Учтите, что решение может не заработать на вашей конфигурации, возможно придется кое-что поменять. В частности, на другом сайте с Joomshopping мне пришлось поменять названия полей в запросе, т.к. таблицы отличались. Возможно это были разные версии Joomshopping’а.

Скачать: joomshopping-search-images.zip

iMacros скрипт для добавления пользователей из группы в свою группу Одноклассников

Написал небольшой iMacros скрипт для добавление пользователей ok.ru в группы со страниц других групп. Работает в Firefox версии iMacros. Возможно кому-нибудь пригодится.

 

Boot0: error, как избавиться от ошибки при загрузке

boot0-error

После успешной установки хакинтоша может возникнуть ошибка при загрузке с жесткого диска, вот такая:

Loading Operating System …

boot0: GPT
boot0: test
boot0: test
boot0: GPT
boot0: test
boot0: test
boot0: error

В чем заключается проблема:
Т.к. объем жестких дисков с каждым годом увеличивается, производители вынуждены менять стандартный размер блока диска с 512 байт до 4096 байт. Эти жесткие диски известны как «Advanced Format» или 4K. Сначала размер увеличивали на дисках больше 1 ТБ, однако в скором времени изменения затронут все выпускаемые диски. Из-за этого загрузчик Chimera не может загрузиться как положено.

Прим.: Chimera не грузится, а вот разработчики Clover-загрузчика уже давно исправили эту проблему и загрузка происходит автоматически, без изменений.

Решение №1: Использовать флешку с UniBeast

Решение очень простое, но потребует наличие флешки с установщиком Mac OS.

Прим.: я советую всегда хранить флешку с установщиком Mac OS, в случае, если потребуется распаковать бэкап или выполнить доп. настройку, например, при апгрейде оборудования

Как исправить:
1. Загрузиться в установку Mac OS с флешки с UniBeast
2. Не запуская установку, запустить из меню сверху Дисковую Утилиту (Disk Utility), в ней размонтировать жесткий диск, на который установлена Mac OS X.
3. Запустить Терминал и выполнить следующую комманду:

4. Теперь можно выйти из терминала и перезагрузить компьютер

ВАЖНОЕ ЗАМЕЧАНИЕ: Пример кода выше работает в том случае, если ваш жесткий диск подключен к SATA порту 0. Если у вас используется другой порт, то вы можете узнать его из Дисковой Утилиты.

Решение №2: Использовать SATA > USB Адаптер

Это решение сработает, если у вас есть под рукой другой работающий Mac.

Как починить:
1. Установить жесткий диск в запасной Mac, установить систему на этот жесткий диск.
2. После установки, выключить запасной Mac, вытащить жесткий, и подключить его с помощью USB-адаптера к новому Mac
3. Загрузить новый Mac
4. Запустить MultiBeast, произвести установку загрузчика
5. Теперь можно установить жесткий диск как обычно, без адаптеров

sata-usb-adapterПриобрести переходник-адаптер SATA-USB можно в большинстве компьютерных магазинов или заказать на Aliexpress или подобных сайтах.

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

Общая инструкция по установке OS X Yosemite на Intel-совместимые компьютеры

Данный пост является моим переводом гайда с сайта tonymacx86.com

Данное руководство поможет новичкам пошагово установить свежую версию OS X Yosemite, Все необходимые программы и утилиты для установки можно сказать с сайта tonymacx86.com.

os-x-yosemite-design-large

UniBeast — это утилита, которая поможет создать загрузочный диск с Mac OS для установки. Для создания вам потребуется уже существующий ПК с Mac OS, либо виртуальная VmWare с предустановленной Mac OS. Виртуальную машину с Mac OS можно найти на rutracker.org, там же и инструкции по установке.

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

Оглавление

  1. Шаг №1: Скачайте OS X Yosemite
  2. Шаг №2: Создайте загрузочный USB с UniBeast
  3. Шаг №3: Настройки BIOS
  4. Шаг №4: Установка Yosemite
  5. Шаг №5: Настройка с MultiBeast
  6. Описание проблем и их решений

Перед тем как начать

  1. Зарегистрируйтесь на сайте tonymacx86
  2. Скачайте с tonymacx86 последние версии MultiBeast и UniBeast
  3. Понадобится флешка минимум на 8GB
  4. На всякий случай, сделайте резервную копию данных на компьютере, на который собираетесь устанавливать Mac OS

Шаг №1: Скачайте OS X Yosemite

OS X Yosemite бесплатна для скачивания для всех, кто приобретал Snow Leopard, Lion, Mountain Lion или имеет Mac с предустановленным Mavericks. Скачайте Yosemite с Mac App Store используя свою учетную запись Apple ID. После скачивания приложение появится в папке Applications (Программы) под названием Install OS X Yosemite (Установка OS X Yosemite).

Шаг №2: Создайте загрузочный USB с UniBeast

1) Вставьте USB флешку
2) Откройте программу Disk Utility (Дисковая утилита)
3) Выделите USB флешку слева
4) Откройте вкладку Partition (Разделы)
5) Выберите 1 Раздел, так, как на скриншоте

yosemite-install-1

yosemite-install-2

6) Далее нажмите Options… (Параметры)
7) И выберите Master Boot Record (Главная загрузочная запись)

yosemite-install-3
8) В поле Name (Имя): введите USB (Позднее можно будет переименовать)
9) В поле Format (Формат): Выберите Mac OS Extended (Journaled — журнальный)
10) Нажмите Apply (Применить) и подтвердите действие

yosemite-install-4

11) Скачайте и запустите UniBeast
12) Continue, Continue, Continue, Agree: тут, я думаю, ясно :)

yosemite-install-5
13) В качестве Destination, выбираем нашу флешку USB и жмем Continue

yosemite-install-6
14) На следующем экране выберите Yosemite
15) Жмите Continue

yosemite-install-7
16) Если вы используете старый ПК 5-6 серии с AWARD BIOS, выберите опцию Legacy USB Support
17) Если у вас ноутбук, выберите Laptop Support
18) Жмите Continue

yosemite-install-819) Вводим пароль и жмем Install
yosemite-install-9

UniBeast создаст загрузочную флешку. Этот процесс займет длительное время (возможно до 10-15 мин), наберитесь терпения, не закрывайте окно установки и не вытаскивайте флешку!

20) После установки, перетащите MultiBeast на флешку USB, он понадобится позднее.

Шаг №3: Настройки BIOS

Если вы устанавливаете Mac OS на одну из рекомендуемых нами конфигураций с AMI UEFI BIOS, то все достаточно просто. Если нет, то убедитесь в том, что у вас установлены значения по-умолчанию в BIOS (Optimized Defaults) и в том, что жесткий диск работает в AHCI режиме.

Ниже приводятся стандартные настройки BIOS для Gigabyte AMI UEFI BIOS, Gigabyte AWARD BIOS, ASUS AMI UEFI BIOS, и MSI AMI UEFI BIOS.

  1. Зайдите в BIOS/UEFI
  2. Установите все значения по-умолчанию (Optimized Defaults)
  3. Если ваш процессор поддерживает VT-d, выключите эту опцию
  4. Если в вашей системе есть CFG-Lock, выключите эту опцию
  5. Если в вашей системе есть Secure Boot Mode, выключите эту опцию
  6. Установите OS Type в значение Other OS
  7. Сохраните значения

Шаг №4: Установка Yosemite

Вы готовы к установке! Теперь необходимо загрузиться с USB и начать установку.

1) Выключите компьютер
2) Во время включения нажимайте клавишу для выбора загрузочного диска (обычно это клавишка F12 или F8, зависит от производителя)
3) В окошке дисков выберите USB
4) Должен произойти запуск загрузчика Chimera. Выберите USB и нажмите Enter

yosemite-install-10

Возможно вы столкнетесь с проблемами до загрузки установщика Mac OS. Выяснить в чем проблема помогут специальные загрузочные опции, которые можно вводить на экране Chimera, до того как вы выберите USB, напечатайте ключ, а затем нажмите Enter.

yosemite-install-11

Один из таких ключей -v. Этот ключ включает отладку на экране так, что вы можете наблюдать весь лог загрузки. Еще вы можете использовать следующие ключи, как по отдельности, так и в комбинациях, они могут помочь, если у вас специфическая конфигурация:

  • GraphicsEnabler=Yes
  • PCIRootUID=1
  • maxmem=4096
  • maxmem=8192
  • npci=0x2000

Системы на X58 и X79 всегда требуют ключа npci=0x2000.

5) Наконец, когда вы дойдете до установщика, выберите язык:

yosemite-install-12

6) Для свежей установки вы должны стереть и отформатировать жесткий диск:

  • В верхнем меню выберите Utilities (Утилиты), и откройте Disk Utility (Дисковая утилита)
  • Выберите ваш жесткий диск в колонке слева.
  • Кликните по вкладке Partition (Раздел диска)
  • Выберите в выпадающем списке 1 Partition (Раздел: 1)
  • Нажмите Options… (Параметры)
  • Выберите схему GUID Partition Method
  • В поле Name (Имя): введите Yosemite (Можно будет переименовать позднее)
  • В поле Format (Формат): Выберите Mac OS Extended (Journaled — журнальный)
  • Нажмите Apply (Применить) и подтвердите действие
  • Закройте окно Disk Utility

yosemite-install-13
7) Когда установщик спросит, на какой жесткий устанавливать систему, выберите Yosemite.
8) После завершения установки перезагрузите компьютер.

Шаг №5: Настройка с MultiBeast

MultiBeast — это установщик, содержащий в себе набор инструментов и драйверов для оборудования: Аудио, Видео, Сетевые карты, загрузчик и прочее.

Установка прошла успешно, но жесткий диск с Mac OS еще не загрузочный, на него нужно установить загрузчик Chimera, с помощью MutiBeast, а также установить необходимые драйвера для полноценной работы оборудования.

Необходимо загрузиться с помощью загрузчика флешки, но на этот раз выбрать не установщик USB, а уже наш жесткий диск с установленной Mac OS.

1) Перезагрузите компьютер
2) Во время загрузки нажимайте на клавишу для выбора загрузочного диска
3) Выберите USB
4) На экране Chimera выберите диск Yosemite
5) Пройдите первоначальную настройку Yosemite

 

yosemite-install-14

6) Перетащите с флешки MustiBeast на рабочий стол и запустите его

yosemite-install-15

7) If this is a fresh installation, click Quick Start to choose EasyBeast, UserDSDT, or DSDT-Free. For 7/8/9 series recommended builds choose DSDT-Free.

yosemite-install-168) На вкладке Drivers можно установить необходимые драйвера для звука и сети, видео и пр.

yosemite-install-179) Во вкладке Customize можно выбрать дополнительные параметры

yosemite-install-1810) Нажмите Print или Save, чтобы сохранить текущую конфигурацию, в случае если что-то придется изменить
11) Нажмите Build, затем Install

yosemite-install-19

yosemite-install-2012) Перезагрузите компьютер. Проверьте как работает оборудование (звук, сеть, видео)

yosemite-install-21

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

Описание проблем и их решений

Такие вещи как HDMI-звук и iMessage обычно не работают из коробки и требуют настройки.

Прим.: Советую не тратить время на настройку iMessage, а пользоваться открытыми мессенджерами типа Telegram или Viber. Для включения iMessage может потребоваться звонок в службу поддержки Apple, телефон которой в России не отвечает все время.

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

HDMI-звук
boot0 Error: Руководство по исправлению ошибки
Issuing Boot Flags
Как узнать что ставить с помощью MultiBeast

Установка загрузчика и Extra на EFI раздел
База DSDT
Как починить iMessage
Ключи загрузки Chimera для HD графики: IGPEnabler, IGPlatformID, and IGPDeviceID
Основы

Альтернативные графические драйвера NVIDIA
NVIDIA выпускает альтернативные графические драйвера для совместимых устройств. Они отличаются от тех, что идут при установке, по сути являются экспериментальными версиями. Раньше с помощью этих драйверов решали проблемы с OpenCL в некоторых приложениях, а так же они лучше справлялись с управлениям питания в некоторых моделях.

Еще с этими драйверами можно включить последние ‘Maxwell’ карты с полной поддержкой, например такие: NVIDIA GeForce GTX 750, GTX 750 Ti, GTX 970, and GTX 980.

NVIDIA Alternate Graphics Drivers для Mac OS X 10.10.3 (346.01.02)