IMHO большинство браузеров сейчас поддерживает WebP и с картинками теперь намного меньше возьни. Грузим как есть, исходник прогоняем через jpegoptim без потери качества (будем отдавать тем, кто не поддерживает webp), а для всех остальных делаем webp копию через cwep/gm или convert (у себя на серваке написал скрипт, который прогоняет всеми тремя с одинаковыми настройками качества и выбирает минимальный).
>Пожалуй, самая необычная головоломка на Google Play
Играл в MechBox, и хотя игра довольно качественная и интересная, но нельзя её назвать самой необычной. «There is no game» (да, именно так называется игра) гораздо более необычная. Ещё «That Level Again» очень необычная. IMHO.
Сейчас A+ тайтлов на пингвине более чем достаточно. Взять хотя бы Civilization V и Beyond Earth, две последних части Borderlands, GRID Autosport, Talos Principle, Dreamfall Chapters и так далее. И это уже не говоря о тайтлах самой Valve (все части HL, TF, L4D, DotA2, etc) куче различной индюшатины, вроде Kerbal Space Program, This War of Mine, Papers Please, Don't Starve, Shadowrun, и портах старой классики, вроде Star Wars Knights of the Old Republic.
По поводу автоваккуума, посмотрите презентации Ильи Космодемьянского, он на последнем PgDay как раз про это рассказывал http://pgday.ru/ru/papers/31 Так же много интересного есть в видео записях того же летного PgDay 2015. p.s надеюсь организаторы мне не сломают руку за ссылку.
Подскажите, верно ли я понимаю, что у постгреса или какого-то его расширения есть функциональность, которая позволяет выбрать по некоторому условию данных из таблицы, которая «размазана» по разным узлам?
Мне помогла разобраться с основами книга Электроника для начинающих Чарльза Платта. В начале описываются самые основы, в конце уже разбирается программирование микроконтроллеров. Очень доступно, упор на практику, но теория тоже кратко излагается. В качества приятного дополнения, к книге можно купить готовые наборы, чтобы не бегать по магазинам.
Создайте 2 индекса.
Один для поиска точных соответсвий типа "гитара fender" (в конфиге enable_star = 1),
второй для поиска всех совпадений типа "гитары", "гитарой" ... ;-)
Затем проставте веса для каждого индекса.
Пример для пхп
$cl->SetMatchMode(SPH_MATCH_EXTENDED);
$indexes = array('индекс_с_точным_сооответсвием'=> 10, 'индекс_для_всех_совпадений'=> 1);
$cl->SetIndexWeights($indexes);
$index = implode(', ', array_keys($indexes));
Врезультате все записи с точным соответсвием(Weight будет больше) всплывут наверх.
В мане еще написано _begin, тоже можно попробовать.
Советую varnish заменить на squid (последний рвёт предпоследнего как тузик грелку), а apache/mod_php на php-fpm, кстати в случае последнего можно на nginx включать fastcgi-кэширование.
А вот сюда:
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
root /home/pathto/drupal613;
access_log /home/httpd-logs/mysite.com.access.log;
error_page 404 = @fallback;
}
надо добавить что-нибудь вроде expires max; чтобы не раздавать закешированные у клиента картинки, а отдавать HTTP 301, да и access_log не особо нужен статике + полезно html/xml/js/css etc гзиппить nginx'ом, а не php (как происходит при выставлении соотв. галочек в друпале).
сдал вчера. вопросы показались гораздо более простыми, чем мок-тест от php|architects.
суть подготовки
1. надо несколько раз поставить и настроить php (в различных вариантах — apache + mod_php, apache + cgi, nginx + php-fpm), это заставит хотя бы пару раз заглянуть в php.ini, поняв, что и за что там отвечает;
2. в качестве обертки для БД — использовать каждый день PDO с различными драйверами под него (никаких PEAR DB или сторонних);
3. написать пару веб-сервисов (REST, XML-RPC, SOAP), применив различные шаблоны проектирования (Singleton/Registry, Builder/Factory, Adapter/Strategy, Proxy/ActiveRecord, Command/ChainOfResponsibility) — сервис погоды, случайных фраз или цитат известных людей, вариантов множество, выбирать вам. Заодно разберетесь, что есть такое валидный XML, и почему важен UTF-8 encode entities (привет w3c.org);
4. поковырять любой современный CMF (ZF, Symphony, CodeIgniter), чтобы просмотреть что такое MVC, __autoload, SPL, PPP (public, protected, private), abstract, final, понять как грамотно использовать различные предустановленные константы вроде __FILE__, __CLASS__ и функции вроде call_user_func(), func_num_args(), func_get_args();
5. найти на milw0rm'e любой бажный движок и внимательно просмотреть все патчи, разобравшись, чем грозит SQL Injection, XSS, CSRF и RFI, на php.net прочесть про magic_quotes, ===, basename(), htmlentities (с пониманием разницы между ним и htmspecialchars), strip_tags, mysql_real_escape (с разницей от mysql_escape) и hash. погуглить немного prepared statements, написать свою функцию экранирования, понять, где нужно включать allow_url_fopen, чем полезна open_basedir и как ее можно обойти, не пропустить filter_var
6. сесть и переписать свой тысячный твиттер с приобретенными знаниями о безопасности, поигравшись в запросах c EXPLAIN и EXPLAIN ANALYZE, созданием правильных индексов и применения нормализации (и почему на нагруженных проектах про нее надо забывать)
7. развернуть для своих игрищ линух (пойдет ubuntu 8.04) — для виндузятников в VMWARE. разобраться с rwx, chmod и umask. узнать про tempnam.
там же доставить xdebug через pecl, memcached и php-apc через aptitude. понять весь масштаб трагедии еще недописанного твиттера, добавить туда $mc->set('user_31337_friends', $friends, 0, 900); $friends = $mc->get('user_31337_friends'), узнать о race conditions, обойти его с помощью ключа с ttl, включить APC и увидеть прирост скорости
8. найти книжку про оптимизацию css и js, выставление грамотных header с cache-control'ом. понять про че она)
9. написать мне, я допишу квест… а пока иду спать.
Конфиг для nginx:
Играл в MechBox, и хотя игра довольно качественная и интересная, но нельзя её назвать самой необычной. «There is no game» (да, именно так называется игра) гораздо более необычная. Ещё «That Level Again» очень необычная. IMHO.
Кстати, стали доступны видео с конференции Laravel US 2017
https://streamacon.com/video/laracon-us-2017
В общем, играть есть во что, поверьте.
http://pgday.ru/ru/papers/31 Так же много интересного есть в видео записях того же летного PgDay 2015. p.s надеюсь организаторы мне не сломают руку за ссылку.
Это лучше чем вариант с хранением даты в TIMESTAMP и одном дополнительном запросе (set @@session.time_zone = '+03:00';) на сессию?
Один для поиска точных соответсвий типа "гитара fender" (в конфиге enable_star = 1),
второй для поиска всех совпадений типа "гитары", "гитарой" ... ;-)
Затем проставте веса для каждого индекса.
Пример для пхп
$cl->SetMatchMode(SPH_MATCH_EXTENDED);
$indexes = array('индекс_с_точным_сооответсвием'=> 10, 'индекс_для_всех_совпадений'=> 1);
$cl->SetIndexWeights($indexes);
$index = implode(', ', array_keys($indexes));
Врезультате все записи с точным соответсвием(Weight будет больше) всплывут наверх.
В мане еще написано _begin, тоже можно попробовать.
А вот сюда:
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar)$ {
root /home/pathto/drupal613;
access_log /home/httpd-logs/mysite.com.access.log;
error_page 404 = @fallback;
}
надо добавить что-нибудь вроде expires max; чтобы не раздавать закешированные у клиента картинки, а отдавать HTTP 301, да и access_log не особо нужен статике + полезно html/xml/js/css etc гзиппить nginx'ом, а не php (как происходит при выставлении соотв. галочек в друпале).
gzip on;
gzip_min_length 1000;
gzip_comp_level 5;
gzip_types text/plain text/html text/xml application/xml application/x-javascript text/javascript text/css text/json;
gzip_disable «msie6»;
gzip_proxied any;
суть подготовки
1. надо несколько раз поставить и настроить php (в различных вариантах — apache + mod_php, apache + cgi, nginx + php-fpm), это заставит хотя бы пару раз заглянуть в php.ini, поняв, что и за что там отвечает;
2. в качестве обертки для БД — использовать каждый день PDO с различными драйверами под него (никаких PEAR DB или сторонних);
3. написать пару веб-сервисов (REST, XML-RPC, SOAP), применив различные шаблоны проектирования (Singleton/Registry, Builder/Factory, Adapter/Strategy, Proxy/ActiveRecord, Command/ChainOfResponsibility) — сервис погоды, случайных фраз или цитат известных людей, вариантов множество, выбирать вам. Заодно разберетесь, что есть такое валидный XML, и почему важен UTF-8 encode entities (привет w3c.org);
4. поковырять любой современный CMF (ZF, Symphony, CodeIgniter), чтобы просмотреть что такое MVC, __autoload, SPL, PPP (public, protected, private), abstract, final, понять как грамотно использовать различные предустановленные константы вроде __FILE__, __CLASS__ и функции вроде call_user_func(), func_num_args(), func_get_args();
5. найти на milw0rm'e любой бажный движок и внимательно просмотреть все патчи, разобравшись, чем грозит SQL Injection, XSS, CSRF и RFI, на php.net прочесть про magic_quotes, ===, basename(), htmlentities (с пониманием разницы между ним и htmspecialchars), strip_tags, mysql_real_escape (с разницей от mysql_escape) и hash. погуглить немного prepared statements, написать свою функцию экранирования, понять, где нужно включать allow_url_fopen, чем полезна open_basedir и как ее можно обойти, не пропустить filter_var
6. сесть и переписать свой тысячный твиттер с приобретенными знаниями о безопасности, поигравшись в запросах c EXPLAIN и EXPLAIN ANALYZE, созданием правильных индексов и применения нормализации (и почему на нагруженных проектах про нее надо забывать)
7. развернуть для своих игрищ линух (пойдет ubuntu 8.04) — для виндузятников в VMWARE. разобраться с rwx, chmod и umask. узнать про tempnam.
там же доставить xdebug через pecl, memcached и php-apc через aptitude. понять весь масштаб трагедии еще недописанного твиттера, добавить туда $mc->set('user_31337_friends', $friends, 0, 900); $friends = $mc->get('user_31337_friends'), узнать о race conditions, обойти его с помощью ключа с ttl, включить APC и увидеть прирост скорости
8. найти книжку про оптимизацию css и js, выставление грамотных header с cache-control'ом. понять про че она)
9. написать мне, я допишу квест… а пока иду спать.