Капец! :)))
Потихоньку подходит к концу конкурс 10K Apart. Заходишь, смотришь и думаешь - “дааа, чего только люди не впихнут в 10 килобайт JavaScript-а”. :)
Из наиболее понравившегося:
- Fontanero - увлекательная игрушка на тему “жизнь водопроводчика”. На Хабре про неё уже писали создатели.
- Poker Heads Up - долго играл, доиграл до конца, выиграл, понравилось. Из названия понятно, о чем игрушка. :)
- Racer 10k - вызвавшие ностальгию по моему первому компьютеру (а это был в далеком 1995-м году первый пентиум 133МГц) гоночки. Не очень затягивает, но не написать не мог. PS. Игра работает в Chrome намного быстрее, чем в FF, что положительным образом сказывается на результатах.
Уже давным давно мой отец просил меня сделать сайт модельному агентству его жены. Основная проблема заключалась в отсутствии дизайна сайтов и нежелании нанимать дизайнера (у меня с дизайном всё не очень хорошо, если не сказать хуже). В конце-концов я с горем-пополам нафигачил простенький дизайн и за пару дней приделал к нему базовых функционал и панельку для администрирования этого всего дела.
Комментарии по поводу улучшения как дизайна так и функционала категорически приветствуются. :)
Технические подробности: сайт использует Rails 3 RC, jQuery, MongoDB (в качестве ORM используется Mongoid), а для ресайза изображений используется CarrierWave (так как больше ничего поддерживающего Mongoid я не нашел) + RMagick + ImageMagick.
Кстати говоря, для того, чтобы запустить этот сайт мне пришлось обновить операционку на моем Linode-овском VPS, т.к. RMagick требовал более новую версию ImageMagick-а, чем та, которая была в репозиториях Ubuntu 9.04. Кстати, в Linode Library есть очень хороший гайд по обновлению.
Вот такую картину я увидел сегодня у себя в админке на Linode. Что-то в ней мне показалось странным. Через пару секунд я понял, что именно - надпись “Linode 512″, хотя я точно помнил, что у меня до этого было 360 мегабайт оперативки. Законнектился на сервак, проверил - действительно 360 мегабайт доступно. Зашел на страницу тарифных планов - действительно 360 поменялось на 512, да и остальные планы явно получили побольше оперативки. Как оказалось - увеличение оперативки произошло еще месяц назад, а я его не заметил, т.к. ни разу не перезагружал сервак с того момента, как он прекратил зависать, а для того, чтобы получить заветный прирост ресурсов - нужна перезагрузка.
Некоторые свои посты я дополняю постами-линками на Хабрахабре. Последний подобный пост - “Особенности работы jQuery.live()“. Он так и не попал на главную, но в данном случае это не очень важно, т.к. свой “хабраэффект” я поймал.
До этого у меня случались странности на сервере - он начинал есть все 400% процессора и наглухо зависал - к нему было невозможно подключиться и единственным вариантом восстановления был шатдаун инстанса в админке Linode. Это случалось нечасто и не особо меня парило. Но когда на мой сайт стали постоянно заходить люди с хабра - такое поведение сервера стало постоянным. Он начинал есть весь процессор. После перезагрузки он пару минут держался, а потом опять начинал свой бравое дело. Стало ясно - что-то явно не так в настройках.
После довольно недолгих разбирательств стало ясно, что виноват Apache (у меня стоит Apache + mod_prefork + php + ruby via passenger). Параметры prefork-а:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
Теперь мне стало очевидно всё, кроме одной вещи - почему же все-таки был загружен процессор… А причина зависаний сервера была проста - параметр MaxClients отвечает за то, сколько процессов апач может запустить для обработки пользователей (в prefork-е каждый запрос обрабатывается отдельным процессом, который либо запускается, либо вытаскивается из пула свободных запущенных процессов). Процессы апача ну очень недешевые в плане ресурсов - честно говоря, я до сих пор не знаю, как можно посмотреть, сколько реально кушает процесс апача - по текущей нагрузке на сервак при создании новых процессов апач кушает лишние 10-20мб памяти. 150 процессов * 10 мегабайт… Ну вы поняли. У меня сейчас обычныя VPS-ка на 360Мб. В общем, причина зависаний была в том, что апач создавал кучу процессов и уходит в своп по самое нехочу. А вот вернуться оттуда он уже сам не мог - ему нужна была помощь.
Выход - снижать количество максимально процессов апача. Методом научного тыка была выбрана цифра в 20 процессов. Собственно, сейчас эта цифра вполне себе хорошо работает. После уменьшения MaxClients и перезапуска сервера он падать перестал. Но появилась новая проблема - из-за хабраэффекта сервак хоть и не падал, но отдавал ответы очень долго. Эту проблему я решил не решать, т.к. в тот момент был на работе. Сейчас вот появилось немного времени и я решил протестировать свой блог на отзывчивость.
ab -c 1 -n 100 http://blog.fxposter.org/
Эмм… Результата я не дождался.
Для тех, кто не работал с ab и не знает, что это такое - Apache Benchmark.
ab -c 1 -n 10 http://blog.fxposter.org/
Результат меня неприятно удивил. Результаты, к сожалению, не сохранились, но могу сказать точно, что время генерации страницы было около 1.5 секунды (судя по тому, что сейчас показывает генерация страницы, если её нет в кеше).
Собственно, стало понятно, как бороть “хабраэффект” - нужно сильно ускорить отдачу странички. Как? Да очень просто - кешированием. Слава богу, что это WordPress и тут есть такие плагины, как wp-cache - прикручивается за несколько минут и пока что отлично работает. Если бы такого плагина не было, то, наверное, у меня бы была сейчас статья о том, что такое Reverse Proxy и как его использовать для кеширования. :) А так - поставил, включил. Результаты:
Заодно решил немного пооптимизировать клиентскую часть - добавить expires и сжатие контента (использовался модуль апача deflate).
Приведу конечные файлы:
# /etc/apache2/mods-available/expires.conf
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/gif "access plus 1 weeks"
ExpiresByType image/png "access plus 1 weeks"
ExpiresByType image/jpeg "access plus 1 weeks"
ExpiresByType text/css "access plus 1 weeks"
ExpiresByType application/javascript "access plus 1 weeks"
</IfModule>
# cat /etc/apache2/mods-available/deflate.conf
<IfModule mod_deflate.c>
# AddOutputFilterByType DEFLATE text/html text/plain text/xml
DeflateCompressionLevel 9
# Insert filter
SetOutputFilter DEFLATE
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
<IfModule mod_headers.c>
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</IfModule>
</IfModule>
Если вас интересует, почему эти файлы выглядят именно так - читайте документацию к модулям апача.
На другой ОС (у меня Ubuntu 9.04) эти файлы, наверняка, должны будут находиться в других местах. У себя я их разместил так, потому что эти конфиги автоматически подключаются вместе с подключением соответствующих модов апача (при использовании команды a2enmod).
По идее теперь сайт должен получше откликаться и, думаю, все-таки теперь он выдержит хабраэффект. :)
PS. С точки зрения клиентской оптимизации - css-ки и js-ки лучше бы собрать в один файл, а кучу запросов к изображениям заменить спрайтами. Заниматься первым особо не вижу смысла, т.к. и стилей и скриптов на блоге немного, а изображениями заниматься лень, т.к. все равно собираюсь переезжать на “Twenty Ten“.
Видео от создателя Ruby On Rails и одного из первых сотрудников 37 Signals о том, что нужно делать, чтобы зарабатывать деньги в интернете (”The secret of making money online”). Видео я смотрел давно уже, но без слайдов. После того, как мне наш проджект менеджер прислал ссылку на это же видео, решил найти вариант со слайдами. Смотрим.
PS. DHH рассказывает, казалось бы, об очевидных вещах. Однако отнюдь не всем эти вещи приходят в голову без “толчка” со стороны.
26-го сентября, в субботу, в Киеве будет проведен BarCamp на тему языка Ruby и фреймворка Ruby On Rails. Место проведения зависит от количества желающих посетить данное мероприятие и на данный момент уточняется. Если не произойдет ничего особенного - я туда скорее всего поеду. Буду рад увидеть там читателей своего блога. ;)
Заходим, смотрим, регистрируемся.
Google Wave is a new tool for communication and collaboration on the web.
К этой цитате хочется добавить много-много-много всего, но лучше разработчиков вряд ли сейчас кто-то что-то сможет сказать. Поэтому смотрим видео, оставляем заявку на получение заветного аккаунта и… ждем… :)
PS. Видео просмотрел на одном дыхании - классная идея, классная реализация, классная презентация. Советую всем без исключения. Возможно, после выхода этого продукта вы откажетесь от использования всяких wiki и e-mail.
Чрезвычайно интересное видео выступления Боба Ипполито на PyCon 2009, в котором он рассказывает о современных системах хранения данных. Очень заинтересовала Cassandra и Column-Oriented Databases. Очень рекомендую посмотреть всем, кто занимается построением высокопроизводительных систем, которые оперируют большим количеством данных. У меня как раз такой случай, так что пойду изучать Cassandra, LucidDB и C-Store.
И самое приятное - всех с праздничком, с Днем Победы!
В сообществе симфонистов праздник - Фабьен наконец-то рассказал о том, что можно ожидать от следующей мажорной версии фреймворка:
IOC-контейнер
В презентации это называлось Dependency Injection Container. Подробнее о том, что это такое можно узнать в википедии: IOC, Dependency Injection. Либо спросите знакомых Java EE программистов, они должны знать, что это такое. :) За примерами лучше, опять же, обращаться к Java: Pico Container Introduction (достаточно просто и понятно), Spring IOC-container. Вкратце - скармливаем контейнеру классы и зависимости между ними и можем строить новые обьекты, которые будут построены на этих зависимостях (если у вам один обьект зависит от двух других, то они будут в него автоматически вставлены - через конструктор, методы, свойства, etc.). На PHP я IOC-контейнера ни разу не видел (хотя они есть) и… Не знаю, насколько он будет действительно удобен и нужен. Будем смотреть.
Новый шаблонный движок
Лучше смотреть презентацию - всё полностью переписано, много новых возможностей: шаблоны теперь не только file-based, но и memory-based (memcache, apc), database-based и т.д, появилось наследование шаблонов (привет, Django), все возможности предыдущих версий (типа partials, slots), думаю, останутся. Всё это будет приправлено отсутствием зависимостей от самой Symfony (как я понимаю, под “Independent library” они имеют ввиду именно это).
sfRequestHandler
Коротко и ясно - “Rails Metal in Symfony”.
Кстати говоря, довольно интересен тот факт, что засуетились все только сейчас, а ведь это не первая презентация о возможностях, которые нам приподнесут в Symfony 2.0 - на Symfony Camp 2008 об этом уже говорили. :)







Последние комментарии