<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title><![CDATA[plutov.by]]></title>
    <link>http://plutov.by</link>
    <description><![CDATA[Блог Плютова Александра о web-разработке]]></description>
    <pubDate>Sat, 09 Sep 2017 17:02:40 +0300</pubDate>
    <generator>Zend_Feed</generator>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <item>
      <title><![CDATA[Golang tips. Part 1]]></title>
      <link>http://plutov.by/post/golang_tips_1</link>
      <description><![CDATA[Go is a simple and fun language, and as any other language, Go has a lot of unspoken tips.]]></description>
      <pubDate>Thu, 23 Mar 2017 09:02:32 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Go 1.8 released. What is new?]]></title>
      <link>http://plutov.by/post/go18_release_whats_new</link>
      <description><![CDATA[Go team has released new version on February 16. You can get it from the download page. To celebrate the release, Go User Groups around the world are holding release parties this week. Spread the word using hashtag #GoReleaseParty.]]></description>
      <pubDate>Fri, 17 Feb 2017 08:34:35 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Memory leaks with mux.Router in Go]]></title>
      <link>http://plutov.by/post/memory_leaks_in_mux_router</link>
      <description><![CDATA[Today we found that our web server written in Go has memory leaks and consume around 300M of memory, which is really a lot for our app. After restart it’s back to ~10M but each hour increased by few more. Golang has nice built-in tools to debug and find leaks.]]></description>
      <pubDate>Fri, 23 Sep 2016 05:49:13 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Game Of Logs]]></title>
      <link>http://plutov.by/post/game_of_logs</link>
      <description><![CDATA[Are you ready for a new world of Information Technology? Check yourself in the Game of Logs! Currently there are 4 tests about Golang, Docker and Docker Tools.]]></description>
      <pubDate>Wed, 16 Mar 2016 09:02:52 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[How to collect Mobile crash logs]]></title>
      <link>http://plutov.by/post/collect_mobile_crash_logs</link>
      <description><![CDATA[Eventually, in a short time we have setup the system for log collection and analysis for mobile apps. Also, with little effort we can add to this system services for analyzing Javascript errors and collecting log files from all our servers. System support is easy and doesn’t require lots of resources. LogPacker Cluster can be easily scaled horizontally by adding new nodes. At the same time service has full load control and it reports all possible issues.]]></description>
      <pubDate>Tue, 15 Mar 2016 07:59:27 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[GoMobile: Library development for IOS/Android]]></title>
      <link>http://plutov.by/post/gomobile_logpacker_sdk</link>
      <description><![CDATA[We decided to use new opportunities of Golang for cross platform library creation. First of all, our main application is written in Go and it was easier for us to use that lang and not to involve Java/Objective-C developers. Second of all, we saved development time and tried old approach with improved features.]]></description>
      <pubDate>Sun, 13 Mar 2016 11:07:57 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Разработка библиотеки для iOS/Android на Golang]]></title>
      <link>http://plutov.by/post/gomobile_sdk</link>
      <description><![CDATA[Наша основная задача разработать SDK для сборки логов и крашей с мобильных приложений, при этом SDK должно подключаться и работать и с Android и с iOS приложениями. В тоже время библиотека должна взаимодействовать с основным сервисом <a href="https://logpacker.com">LogPacker</a>, который агрегирует и анализирует данные.<br/><br/>Мы решили использовать новые возможности языка Go для создания кроссплатформенной библиотеки. Во-первых, наше основное приложение написано на Go, и для нас было проще использовать данный язык и не привлекать Java/Objective-C разработчиков. Во-вторых, мы сэкономили время на разработку и попробовали старый подход с новыми возможностями.]]></description>
      <pubDate>Wed, 02 Mar 2016 19:11:44 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Docker: Окружение для тестирования]]></title>
      <link>http://plutov.by/post/docker_test_env</link>
      <description><![CDATA[Мой знакомый и коллега Андрей Синицын написал прекрасную статью о том, как он создал среду для тестирования нашей сети, элементами которой являются Агенты  (собирают и анализируют логи сервера) и Серверы (которые принимают и хранят данные от множества Агентов). Все это объединяется в кластеры.
<br/>
<a href ="https://habrahabr.ru/post/275513/">Статья на Хабре</a>]]></description>
      <pubDate>Fri, 22 Jan 2016 06:08:55 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[gohugo.io и новый блог]]></title>
      <link>http://plutov.by/post/gohugo_new_blog</link>
      <description><![CDATA[Решил для себя, что статьи нужно писать и публиковать на английском. Но не хотелось всё это смешивать в одну кучу в этом блоге, также не нравился вариант перевода всех статей. Есть такой проект от spf13 <a href="http://gohugo.io">gohugo.io</a>, написанный на Го, помогает создавать статические сайты за 5 минут.
<br/>
<br/>
С его помощью я отпочковался со своими английскими статьями на <a href="http://pliutau.com">pliutau.com</a>, продолжая писать сюда русскоязычный контент.
<br/>
<br/>
Всем спасибо!]]></description>
      <pubDate>Thu, 21 Jan 2016 11:02:04 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Go-клиент для PayPal API]]></title>
      <link>http://plutov.by/post/paypalsdk</link>
      <description><![CDATA[В одном своем проекте, backend которого написан на Го, нам необходимо было использовать PayPal API. Для многих языков существуют официальные SDK библиотеки, но в случае с PayPal SDK для <a href="https://golang.org/">Go</a> поиск не привел к чему-то конкретному, была найдена всего пара проектов, функционала которых нам не хватало.]]></description>
      <pubDate>Tue, 29 Dec 2015 11:57:11 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Крутой профайлер памяти в Go]]></title>
      <link>http://plutov.by/post/golang_profiler_cpu</link>
      <description><![CDATA[Очень хорошо, когда вы знаете, сколько памяти использует ваше приложение. Еще лучше знать, когда наступают пики, чтобы оптимизировать приложение. У вас для этого может быть свой подход, я же хочу предложить одну очень полезную библиотеку для Го, которая буду отображать это в реальном времени в web-интерфейсе.]]></description>
      <pubDate>Thu, 30 Jul 2015 20:16:14 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Внутренние импорты в Go-проекте на GitHub и Travis CI]]></title>
      <link>http://plutov.by/post/go_github_travis</link>
      <description><![CDATA[Расскажу об одной проблеме, с которой я столкнулся при настройке <a href="https://travis-ci.org/">TravisCI</a> для проекта на Го, хостившемся на GitHub. Проект включает в себя несколько пакетов и является по-сути веб-приложением. Он готов и работает, некоторые пакеты импортируют другие общие пакеты. Включаем проект на TravisCI, создаем .travis.yml файл в корне:]]></description>
      <pubDate>Sun, 12 Jul 2015 07:27:19 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Atom.io + go плагины VS LiteIDE]]></title>
      <link>http://plutov.by/post/atom_go_plus_or_liteide</link>
      <description><![CDATA[Этот пост является исключительно моим личным мнением. Начитавшись модных статей о связке <a href="https://atom.io/">atom.io</a> и go-plus и еще паре пакетов в приставкой go-, я решил установить и попробовать. На главной странице редактора написано много слов "flexible", "hackable". Надо сказать, что я всё время использовал LiteIDE и был доволен, хоть и не могу не сказать о его ограниченности, работал дома на Mac, а на работе на Linux, и IDE вело себя одинаково при одинаковой настройке.]]></description>
      <pubDate>Fri, 10 Jul 2015 20:53:51 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[tea-weekly: golang net/http + postgresql + supervisord]]></title>
      <link>http://plutov.by/post/tea_weekly_golang</link>
      <description><![CDATA[Всегда хотел протестировать Go в production, поиграться, набраться опыта. Если CLI-скрипты еще как-то использовались в проектах, то с вебом пока ничего большого не делалось. Итак, желание есть, нет идеи. Иии в итоге... еще один чайный проект <a href="http://tea-weekly.com">tea-weekly</a>.]]></description>
      <pubDate>Wed, 22 Apr 2015 18:44:02 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Принимаю реквесты на Code Review]]></title>
      <link>http://plutov.by/post/code_review</link>
      <description><![CDATA[В последнее время по работе и не только часто приходится проводить code review. И могу сказать, что это очень полезная процедура, наравне с парным программированием. Во-первых улучшает качество кода, во-вторых дает посмотреть на свои ошибки с другой стороны. Бывают разные виды code review: когда-то важна производительность, а когда-то следование каким-то стандартам, это все индивидуально. В общем, мне это сейчас довольно интересно, в связи с этим хочу помочь начинающим девелоперам взглянуть на свой код моими глазами. Предупреждаю, что это хобби для моих вечеров, и мое ревью это не аксиома, но свой взгляд на вещи. Естественно, это открыто для всех и бесплатно. <a href="http://plutov.by/code-review/">Давайте попробуем?</a>
]]></description>
      <pubDate>Fri, 20 Mar 2015 18:03:44 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Что использовать в качестве конфигов в Golang?]]></title>
      <link>http://plutov.by/post/golang_json</link>
      <description><![CDATA[Допустим, вам необходимо хранить конфигурационные данные в файлах, какой формат вы будете использовать? YAML, INI? А почему бы не JSON? Мне очень нравится формат YAML, и в одном приложении я был начал его использовать, подключил <a href="https://godoc.org/?q=yaml">парсер</a>, но потом опомнился, ведь поддержка JSON в Го нативная. И можно довольно просто, без внешних библиотек экспортировать конфиг в Го-структуры.]]></description>
      <pubDate>Sat, 14 Mar 2015 08:43:51 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Git Bootstrap. pre-commit xук]]></title>
      <link>http://plutov.by/post/git_bootstrap_pre_commit</link>
      <description><![CDATA[Нашел сегодня на GitHub очень полезный <a href="https://github.com/kvz/ochtra">шаблон файла pre-commit хука</a>. Он позволит вам предостеречь себя от коммитов синтаксических ошибок. И решил добавить этот шаблон в Git Bootstrap как очень подходящий по теме.]]></description>
      <pubDate>Thu, 12 Feb 2015 21:18:11 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[PhpStorm. Заменяем все array() на []]]></title>
      <link>http://plutov.by/post/phpstorm_array_replace</link>
      <description><![CDATA[Захотел я заменить в одном проекте синтаксис создания массивов, со старого array() на вариант с квадратными скобками []. Естественно, делать это нужно как-то автоматически. Легко заменить пустые массивы, но как заменить вложенные массивы, мультилайновые массивы. На помощь приходит Code Inspector от PhpStorm.]]></description>
      <pubDate>Wed, 11 Feb 2015 08:06:41 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Настраиваем дебаггер для LiteIDE на OSX]]></title>
      <link>http://plutov.by/post/liteide_debug</link>
      <description><![CDATA[Я еще точно не определился с выбором IDE для Go, но пока использую официальную LiteIDE, которая не так сильна как продукты JetBrains, но зато очень быстрая и простая (иногда). Первым делом нужно настроить дебаггер, и LiteIDE использует для этого дела GDB.]]></description>
      <pubDate>Sun, 08 Feb 2015 19:19:47 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Composer - все дело в lock файле]]></title>
      <link>http://plutov.by/post/composer_lock</link>
      <description><![CDATA[Выясняем зачем нам нужен файл composer.lock и нужно ли его коммитить в репозиторий]]></description>
      <pubDate>Fri, 06 Feb 2015 20:37:54 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Как получить путь к текущему .go скрипту]]></title>
      <link>http://plutov.by/post/go_runtime_caller</link>
      <description><![CDATA[В PHP я часто использую встроенные в язык константы __DIR__, __FILE__. Но в Go таких нету, зато есть пакет runtime, который позволяет работать с Go runtime системой, а также для контроля goroutine стэка. Например, функция <a href="http://golang.org/pkg/runtime/#Caller">runtime.Caller()</a> позволяет получить информацию о названии файла, номере строки.]]></description>
      <pubDate>Fri, 06 Feb 2015 10:43:02 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Go-скрипт для выполнения команды по SSH]]></title>
      <link>http://plutov.by/post/Go-скрипт для выполнения команды по SSH</link>
      <description><![CDATA[Понадобилось мне выполнять на удаленном сервере некоторые команды из приложения, написанного на Go. Пришлось написать небольшой package, который позволяет это делать. Нам нужны следующие параметры: username, hostname и сама команда. Package будет использовать публичный ключик id_rsa.pub из домашней директории пользователя.]]></description>
      <pubDate>Wed, 04 Feb 2015 07:58:27 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Git Bootstrap]]></title>
      <link>http://plutov.by/post/Git Bootstrap</link>
      <description><![CDATA[Использование Git за последние пару лет привело к такой GitHub <a href="http://plutov.by/post/Git%20Bootstrap">страничке</a> и двум полезным файлам .gitconfig и .gitignore]]></description>
      <pubDate>Tue, 03 Feb 2015 17:50:16 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Демоны на PHP]]></title>
      <link>http://plutov.by/post/php_daemons</link>
      <description><![CDATA[В общих словах демон - это служба, запускаемая один раз и работающая в фоновом режиме без прямого общения с пользователем. Для чего может пригодиться? Нам необходимо непрерывно отслеживать папку на наличие изменений в ней и выполнять определенные команды. Наш демон должен запускаться из консоли, ничего в нее не выводить, ошибки логировать.]]></description>
      <pubDate>Thu, 18 Dec 2014 10:50:42 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Вопросы для собеседования PHP(Intermediate?) программиста]]></title>
      <link>http://plutov.by/post/interview_php_questions</link>
      <description><![CDATA[Вот уже почти месяц как я работаю на новом месте во Вьетнаме. Помимо, собственно, программирования я занимаюсь интервьюированием сотрудников в нашу компанию. За это время мы с коллегой проверили уже порядка десяти собеседований. Естественно, у нас собрался список вопросов, которые мы задаем кандидатам. У нас нет разграничений на вопросы для Senior Developer, для Intermediate и т.д. Мы просто ищем человека, с которым мы хотели бы работать в команде. Мне хотелось бы поделиться списком этих вопросов, не делая их каким-то стандартом для собеседований.]]></description>
      <pubDate>Wed, 05 Nov 2014 18:49:21 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Code style. Выравнивание массива в PhpStorm]]></title>
      <link>http://plutov.by/post/phpstorm_array_alignn</link>
      <description><![CDATA[Важным критерием качества кода является его читаемость, так называемая некомпьютерная красота. Код может быть красивым в плане использования алгоритма, в плане изящного решения вопроса производительности. А может быть красивым просто внешне, и это немаловажно. Сейчас мы рассмотрим массивы, с которыми очень часто сталкиваемся в чужом коде, и тратим драгоценное время для прочтения этого массива.]]></description>
      <pubDate>Fri, 19 Sep 2014 10:06:05 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Symfony2. Разные сессии для Prod и Test на одном домене]]></title>
      <link>http://plutov.by/post/symfony2_session_subdomain</link>
      <description><![CDATA[Очень популярным вариантом тестирования проекта перед релизом является его установка на боевом сервере, но с тестовыми настройками, к которым относятся: тестовая база данных, вывод ошибок, поддомен. Например, вы устанавливаете Prod-версию на домен example.com, а тестовую версию на test.example.com. В таком случае может возникнуть такая ситуация, когда сессии с Prod-окружения доступны на Test, и наоборот.]]></description>
      <pubDate>Wed, 17 Sep 2014 10:43:58 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Древовидные структуры данных в MySQL]]></title>
      <link>http://plutov.by/post/mysql_nested_set</link>
      <description><![CDATA[Создание модели для хранения иерархических данных - совсем непростая задача. Что же мы подразумеваем под иерархическими данными? Представьте, что вам необходимо организовать список продуктов по категориям. Например, у вас будет несколько основных категорий: продукты, оборудование, электроника. А далее вам потребуется разбить их на подкатегории, а те в свою очередь, на более узкие категории. На бумаге всё выглядит довольно просто, а вот в таблице СУБД (система управления базами данных) дело обстоит совсем по другому. В этой статье я попробую рассказать об основной идее этой модели и когда её следует применять. Начну с объяснения более простой иерархической модели, а далее перейдём к модели вложенных множеств.]]></description>
      <pubDate>Sun, 07 Sep 2014 16:37:15 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Официальная документация по Markdown]]></title>
      <link>http://plutov.by/post/markdown_docs</link>
      <description><![CDATA[Markdown стал уже довольно популярным инструментом, позволяющим писать легко читаемый текст, который также автоматически может быть сконвертирован в HTML. Но до недавнего времени так и не было официальной документации, хотя я всегда пользовался <a href="http://daringfireball.net/projects/markdown/syntax">шпаргалкой</a> создателя Markdown, Джона Грубера.]]></description>
      <pubDate>Thu, 04 Sep 2014 14:04:49 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Instagram API. /users/user-id/media/recent и count]]></title>
      <link>http://plutov.by/post/instagram_api_count</link>
      <description><![CDATA[Недавно обнаружил такой баг в одном из своих проектов. Сервис должен был получать последние 50 фотографий из Instagram-аккаунта пользователя за последние 3 месяца. Для этого я использовал метод /users/user-id/media/recent, полагаясь на <a href="http://instagram.com/developer/endpoints/users/#get_users_media_recent">официальную документацию</a>. Я решил, что 50 объектов - это не так уж и много, поэтому передал параметр count=50. Unit-тесты не покрыли то место, если у пользователя есть больше N(~36) фотографий в Instagram за последние 3 месяца. Заметил это только чуть позже, когда кейс сработал.]]></description>
      <pubDate>Thu, 04 Sep 2014 12:50:27 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Принцип открытости / закрытости]]></title>
      <link>http://plutov.by/post/solid_open_close</link>
      <description><![CDATA[Должен признаться, когда впервые увидел академическое определение принципа открытости/закрытости, его смысл был для меня удивительно ясен. Я отбросил из определения весь технический жаргон, и принцип читался как заклинание, которое мы слышали раньше много раз: «Не ломай ядро».
<br/><br/>
Ну, правда, здесь существует некоторая двусмысленность высказывания, так как есть по крайней мере два общих подхода к поддержанию «ядра» в полной сохранности, позволяющие аккуратно расширять его функциональные возможности. Первый подход (вот почему я использовал намеренно термин «расширение») — Наследование. Наследование является, пожалуй, самым переоцененным приемом для повторной реализации. Такой процесс легко осуществим, но здесь существует определенный риск разрушить хрупкую иерархию моделей. Второй подход называется Композиция. Подход не так прост, как наследование, но это тоже довольно аккуратный способ расширить программный модуль, не меняя его.]]></description>
      <pubDate>Tue, 02 Sep 2014 12:16:27 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Релиз PHP 5.6.0]]></title>
      <link>http://plutov.by/post/php5_6_release</link>
      <description><![CDATA[Сегодня вышел PHP 5.6.0. Ура! Сейчас разработчики работают над PHP 7 и PHPNG, пока мы осваиваем новые возможности новой версии. Пока серверы с моими проектами обновлять не буду, но новые проекты несомненно попробую написать в PHP 5.6.0. Дальше я опишу новые возможности топовой версии PHP.]]></description>
      <pubDate>Thu, 28 Aug 2014 21:20:27 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Senior PHP Developer. Упрощенный T9 алгоритм]]></title>
      <link>http://plutov.by/post/senior_php_dev_t9</link>
      <description><![CDATA[Представьте, что вы сейчас проходите собеседование на должность PHP Senior Developer. Очень вероятно, что вас могут попросить реализовать какой-то упрощенный алгоритм, вложившись в определенное время. В нашем случае - это 45 минут. А алгоритмом будет реализация упрощенного алгоритма T9. В реальных приложениях T9 использует дерево-словарь, но алгоритм наш проще, он должен просто вернуть всевозможные слова, основываясь на данных, введенных пользователем.]]></description>
      <pubDate>Thu, 28 Aug 2014 14:10:43 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Git pre-commit хук в Windows]]></title>
      <link>http://plutov.by/post/git_pre_commit_windows</link>
      <description><![CDATA[Сегодня прочитал статью про <a href="http://www.sitepoint.com/introduction-git-hooks/">использование хуков в Git</a>. Очень удачный пример выбрали авторы SitePoint’а, а именно, проверка синтаксиса во всех измененных/добавленных PHP-файлах перед коммитом. Так как коммиты я делаю с Windows-машины, то решение автора для меня не сработало - автор использует Linux. А потом оказалось, что все ищут решения того, как сделать это в Windows.]]></description>
      <pubDate>Sun, 17 Aug 2014 22:32:39 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[error.log рассылка]]></title>
      <link>http://plutov.by/post/error_log_mailer</link>
      <description><![CDATA[Не все ошибки может отследить разработчик, многие появляются в процессе использования ПО, в зависимости от окружения и т.д. Для меня очень важно отслеживать такие возможные баги, особенно на этапе запуска проекта. Я сильно не ухищрялся, просто периодически просматривал содержимое error.log файлов. Но проектов, которые приходится поддерживать, становится всё больше, на многих из них развернуто по несколько серверов. В итоге для меня эта операция стала довольно трудоемкой. Естественно, это дело нужно автоматизировать.
]]></description>
      <pubDate>Tue, 12 Aug 2014 10:13:02 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Постраничная выборка для динамических данных]]></title>
      <link>http://plutov.by/post/cursor_pagination</link>
      <description><![CDATA[Я уже давно внес в свой стиль программирования негласное правило о том, что все перечисления, будь это таблицы или списки, картинки или комментарии, должны загружаться порциями и поддерживать постраничную загрузку. Дело в том, что потом добавить этот функционал бывает гораздо сложнее, нежели чем сделать это сразу. Особенно на этапе разработки этим многие пренебрегают. Основным способом сделать постраничную загрузку является имплементация limit-offset подхода. Сейчас мы будем говорить о данных, возвращаемых из базы, соответственно, примеры я тоже буду строить отталкиваясь от этого. Но limit-offset, естественно, применим и для других случаев. Но что будет, если у нас высока вероятность появления новых данных? Возьмем для примера новости. Например, у нас на данный момент 20 новостей, а мы выводим по 10. Вывели первые 10 новостей, но еще до того как мы перешли к следующим десяти новостям, у нас появилась еще одна новость. Каждая новая запись будет смещать новости, и в результатах 2-й страницы мы увидим дубликат последней записи из первой выборки.]]></description>
      <pubDate>Tue, 22 Jul 2014 16:18:41 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Задача по автоматическому расположению фигур в игре "Тетрис"]]></title>
      <link>http://plutov.by/post/js_auto_tetris</link>
      <description><![CDATA[Я решил подкинуть читателям моего блога небольшую задачу по поиску и реализации лучшего алгоритма. Все знают игру "Тетрис". Представьте, что вместо вас в эту игру играет компьютер. Так вот, задачей будет описать алгоритм, который будет правильно размещать фигурки, таким образом, чтобы не было пустых мест. Я сделал <a href="http://jsfiddle.net/pltvs/Adt5z/">на JSFiddle простой UI</a> для тестирования алгоритма. Всё, что вам нужно - это реализовать одну функцию. Но стойте, для начала я объясню правила.]]></description>
      <pubDate>Thu, 17 Jul 2014 15:46:06 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[po.js — супер простая утилита для i18n]]></title>
      <link>http://plutov.by/post/po_i18n_js</link>
      <description><![CDATA[Пополнил свой аккаунт на GitHub еще одной мини-библиотекой. po.js позволяет использовать один файл перевода под проект (и для backend, и для JS). Точнее один файл под каждый язык.
<br/>
<br/>
<a href="http://habrahabr.ru/post/229495">Описание я опубликовал на Хабре</a><br/>
<a href="https://github.com/plutov/po.js">Страница на GitHub</a>]]></description>
      <pubDate>Fri, 11 Jul 2014 11:25:02 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Адаптивная верстка с Restive.JS]]></title>
      <link>http://plutov.by/post/restive_js</link>
      <description><![CDATA[Недавно нашел один интересный плагин, пока в Enterprise проектах его не использовал, но уже хотелось бы.

<a href="http://habrahabr.ru/post/229339/">Моя статья на Хабре про Restive.JS</a>]]></description>
      <pubDate>Thu, 10 Jul 2014 09:50:57 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Ожидающая функция]]></title>
      <link>http://plutov.by/post/fn_delay</link>
      <description><![CDATA[Когда-то я написал очень простую функцию, которая казалась мне костылем в том уже не помню каком проекте. Но она хорошо выполняла свою обязанность. Тогда я называл ее ожидающей функцией, а JavaScript называл ее <strong>fnDelay</strong>. Дело в том, что в приложении может быть функционал, который срабатывает после изменения какого-нибудь состояния. Но это изменение происходит (или может гипотетически происходить) так часто, что функционал будет срабатывать очень много раз, хотя на самом деле нам необходимо выполнить его только для уже измененного состояния (или еще для нескольких промежуточных). Иначе может быть чувствительная проблема в производительности вашего приложения. Ну ладно, достаточно пустых слов, разберем конкретный пример.]]></description>
      <pubDate>Mon, 30 Jun 2014 23:14:28 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Добавлены аватарки в комментарии]]></title>
      <link>http://plutov.by/post/blog_update_gravatar</link>
      <description><![CDATA[Я как-то писал про то что можно попытаться <a href="http://plutov.by/post/gravatar_get_profile">получить аватарку пользователя через сервис Gravatar по email</a>. А потом подумал, а почему бы так не сделать такое у себя в комментариях. Так как email для комментария обязателен, то для каждого мы можем запросить аватарку. К сожалению, не все указывают свой действительный email, в таких случаях Gravatar возвращает дефолтное изображение. Чтобы протестировать, можете отправить комментарий и посмотреть, что из этого выйдет.]]></description>
      <pubDate>Fri, 27 Jun 2014 00:14:26 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Gifffer. Делаем gif-анимацию управляемой]]></title>
      <link>http://plutov.by/post/gif_play_pause</link>
      <description><![CDATA[На днях наткнулся в GitHub на один очень <a href="https://github.com/krasimir/gifffer">интересный репозиторий</a>. Инструмент, разрабатываемый болгарским программистом, решает одну маленькую, но очень назойливую проблему. А именно, он позволяет остановить циклическое автопроигрывание гифок на веб-странице. Теперь у меня появилось желание использовать gif! Инструмент называется Gifffer, а под катом я опишу как просто с ним работать и покажу маленькое демо.]]></description>
      <pubDate>Thu, 26 Jun 2014 00:49:51 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Беларусь.Яндекс.Деньги]]></title>
      <link>http://plutov.by/post/belarus_yandex_money</link>
      <description><![CDATA[Думаю, многие из читателей этого блога занимаются фрилансом, а для многих это и один из основных способов заработка. Конечно же, Яндекс.Деньги являются не единственным вариантом для работы с электронными деньгами, но в странах СНГ довольно популярным. Но, к великому сожалению, в России каждый день вводят новые законодательства. И случилось так, что с 16 мая 2014 года все электронные денежные переводы в другие страны должны быть идентифицированы, точнее, вы должны доказать свою "неанонимность", подтвердив это своим паспортом. Но форма принимает только русский паспорт. Что же делать, когда вы из Беларуси, но не можете сделать ни один перевод?]]></description>
      <pubDate>Wed, 25 Jun 2014 16:32:18 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Обновление блога]]></title>
      <link>http://plutov.by/post/blog_update</link>
      <description><![CDATA[Здравствуйте, уважаемые читатели блога. Так сложилось, что пишу я сюда что-то не часто, но уже в коллекции свободных знаний целых 50 статей! Да и блог становится более-менее популярным. В связи с этим было решено его немного обновить. Как вы могли заметить, поменялся дизайн, простите уж за мой минимализм. Но кроме дизайна хотелось бы отметить небольшие нововведения по функционалу.]]></description>
      <pubDate>Sun, 22 Jun 2014 16:00:01 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Javascript. Узнаем ID клиента в VK и FB]]></title>
      <link>http://plutov.by/post/js_vk_fb_id</link>
      <description><![CDATA[Наверное, многие замечали (особенно те, у кого не установлена блокировка рекламы в браузере), как на сторонних сайтах нам показывают стилизованные под ВКонтакте сообщения, где указывается ваше имя из VK и ваше фото. Да, порой это раздражает, но давайте посмотрим на это не как пользователи, а как разработчики. Ведь полезная функция, не так ли? Конечно, если использовать это в разумных целях. Можно упростить регистрацию, сделать социальную интеграцию и еще много всего, что уже является особенностью вашего проекта.]]></description>
      <pubDate>Sun, 15 Jun 2014 01:32:31 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Установка Composer в OpenServer]]></title>
      <link>http://plutov.by/post/composer_openserver</link>
      <description><![CDATA[<a href="https://getcomposer.org/">Composer</a> - это инструмент для сборки проектов и управления зависимостями в PHP. Представьте, когда ваш проект написан на Zend Framework, использует Doctrine в качестве ORM, работает с сокетами при помощи Ratchet и т.д. Скорее всего, вам будет непросто создать один загрузчик, без конфликтов, чтобы всегда был доступ к какому-то классу. Composer же собирает все эти зависимости по заданным условиям. Всё, что вам нужно - это правильно описать файл-конфигуратор composer.json. Но статья пойдет не совсем об этом, так как хорошими людьми написано уже достаточное количество хорошего материала на эту тему.]]></description>
      <pubDate>Mon, 26 May 2014 15:45:04 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Tuffle на Android]]></title>
      <link>http://plutov.by/post/tuffle_android</link>
      <description><![CDATA[Многие нас спрашивают, когда же будет приложение для Android. Мы уже разработали приложение для iOS, которое пока еще тестируется в Великобритании. И плавно подходим к разработке нового приложения для Android. По этому случаю решили запустить кампанию по сбору средств на <a href="https://boomstarter.ru/projects/120146/24776">Boomstarter</a>, русском аналоге Kickstarter.]]></description>
      <pubDate>Tue, 06 May 2014 11:35:09 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Упрощаем регистрацию с Gravatar]]></title>
      <link>http://plutov.by/post/gravatar_get_profile</link>
      <description><![CDATA[Всем уже давно известен сервис <a href="http://gravatar.com">Gravatar</a>, который упрощает процесс работы с аватарами. Как для пользователей, так и для сайтов. Можно не загружать каждый раз своё фото на новый сайт, сайт может получить ваше фото из Gravatar по вашему email. Это удобно пользователю, потому что можно поменять своё изображение в одном месте и оно сменится везде. Удобно и сайтам, нет необходимости имплементировать процесс загрузки файлов. Конечно, в какой-то степени это затрагивает вопрос о безопасности, но у вас всегда есть право не использовать то или иное решение. Итак, об аватарках, думаю, знают многие. Но Gravatar также позволяет получить по email базовую информацию о пользователе.]]></description>
      <pubDate>Wed, 16 Apr 2014 12:48:12 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Тестирование регулярных выражений в RegExr]]></title>
      <link>http://plutov.by/post/regexr</link>
      <description><![CDATA[Иногда попадаются такие инструменты, которыми начинаешь пользоваться сам и хочется рассказать о них другим. На этот раз это не совсем новый инструмент, это обновление старого, которое вывело его на новый уровень. Речь пойдет об инструменте для изучения, написания и тестирования регулярных выражений <a href="http://www.regexr.com/">RegExr</a>. До этого выглядел <a href="http://www.regexr.com/v1/">он так</a>, и если честно, то пользоваться им было крайне неудобно.]]></description>
      <pubDate>Mon, 14 Apr 2014 12:26:35 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Как документировать API]]></title>
      <link>http://plutov.by/post/api_how_to</link>
      <description><![CDATA[Многие разработчики до сих пор создают документацию своих API в Word или Excel. Да и сам я когда-то так делал. Пока, не нашел такой инструмент как <a href="http://apiary.io">Apiary</a>. Вкратце, он позволяет оформить страницу API, расписать всё по полочкам, предоставить доступ другим пользователям, а самое интересное - тестировать свои API-методы.]]></description>
      <pubDate>Thu, 10 Apr 2014 10:27:48 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Серверная архитектура Tuffle]]></title>
      <link>http://plutov.by/post/tuffle_servers</link>
      <description><![CDATA[Как я и обещал в предыдущих статьях, расскажу читателям о серверной архитектуре проекта <a href="https://tuffle.com">Tuffle</a>. Но написали мы ее изначально для Хабра, поэтому по правилам сообщества я не могу ее полностью выложить здесь. Так что читайте эту статью <a href="http://habrahabr.ru/company/tuffle/blog/218521">на Хабре</a>.]]></description>
      <pubDate>Mon, 07 Apr 2014 13:11:36 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Запуск задачи CRON каждые 30 секунд]]></title>
      <link>http://plutov.by/post/cron_every_30_sec</link>
      <description><![CDATA[CRON как планировщик задач в UNIX-системах знаком почти каждому программисту, особенно, использующему LAMP стек. Обычно, вся работа с CRON заключается в настройке задач, а именно периодичности выполнения. Время запуска команды указывается с точностью до минуты. Но что делать, если нам нужно запускать команду 2 раза за одну минуту, т.е. через каждые 30 секунд? Или же еще чаще?]]></description>
      <pubDate>Fri, 04 Apr 2014 17:56:33 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[GitHub и самый продуктивный день]]></title>
      <link>http://plutov.by/post/github_commit_day</link>
      <description><![CDATA[Всем нравятся красивые графики. Поэтому иногда я люблю заходить на GitHub в свои репозитории и смотреть их графики по количеству коммитов, количеству новых файлов и т.д. А тут мне захотелось узнать в какой день я делаю больше всего коммитов. Скорее всего, это и можно назвать самым продуктивным днем. Итак, напишем скрипт, который поможет это сделать.]]></description>
      <pubDate>Thu, 03 Apr 2014 16:34:21 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Становимся диджеем на php и icecast]]></title>
      <link>http://plutov.by/post/dj_icecast</link>
      <description><![CDATA[Я всегда любил формат радио, потому что он включает в себя такой фактор как случайность, который мне всегда нравился. А также в последнее время я увлекаюсь чайной культурой, так что это и послужило узкой темой радиостанции. Я поставил себе цель - сделать нон-стоп онлайн радиостанцию. Так как мой блог подразумевает технические обсуждения, то приступим. Под катом кратко о процессе создания <a href="http://tea-radio.by">Радио "ЧАЙ"</a>.]]></description>
      <pubDate>Tue, 01 Apr 2014 12:19:42 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Tuffle - продукт года 2013 в Беларуси?]]></title>
      <link>http://plutov.by/post/tuffle_2013</link>
      <description><![CDATA[Belarusian IT Awards - это открытая беларуская премия, которая позволяет молодым компаниям заявить о себе. Так вот в одной из номинаций, “Продукт года”, участвует наш проект Tuffle. Мы уже прошли в финал и стоим в списке из четырех компаний, основанных в 2013 году.]]></description>
      <pubDate>Tue, 18 Mar 2014 22:47:06 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[PHP: Правильный путь]]></title>
      <link>http://plutov.by/post/php_the_right_way</link>
      <description><![CDATA[На днях я наткнулся на замечательную карманную книгу для PHP разработчиков "PHP: The Right Way". Скорее, она будет более полезна новичкам. Чем именно? По интернету разбросано огромное количество материла по PHP, но многое уже устарело или не приводит к написанию качественного кода. В этой книге присутствуют основные актуальные сведения с ссылками на проверенные ресурсы. На самом деле, сначала я хотел перевести ее, форкнуть <a href="https://github.com/codeguy/php-the-right-way">репозиторий</a>, благо <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/">лицензия</a> это позволяет. Но оказалось, что перевод уже есть. Нет только русской книги в форматах для электронных книг, но так как используется Markdown в <a href="https://github.com/getjump/ru-php-the-right-way">русском форке</a>, то это не составит труда.]]></description>
      <pubDate>Sun, 02 Feb 2014 15:06:54 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Как я разрабатывал сервис воспоминаний]]></title>
      <link>http://plutov.by/post/tuffle_intro</link>
      <description><![CDATA[Речь пойдет про мой основной проект <a href="https://tuffle.com">Tuffle.com</a>, который я и наша команда разрабатываем уже год. Думаю, из этого выйдет целый цикл статей, так как проделано и делается многое. Начну с представления проекта, основных концепций, подходах. И со временем будем углубляться в техническую сторону.]]></description>
      <pubDate>Sat, 01 Feb 2014 20:42:50 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[User Timing API]]></title>
      <link>http://plutov.by/post/user_timing_api</link>
      <description><![CDATA[Есть такой проект - <a href="http://www.html5rocks.com/en/">HTML5Rocks</a>. Многие о нем знают, чуть меньше его читают. А попадаются там очень интересные материалы. Один из них я захотел перевести для русского читателя. Речь пойдет о новой технологии - User Timing API. <a href="http://www.html5rocks.com/en/tutorials/webperformance/usertiming/">Оригинал на английском</a>.]]></description>
      <pubDate>Fri, 31 Jan 2014 16:37:53 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Валидация длины строки в Foundation]]></title>
      <link>http://plutov.by/post/foundation_validate</link>
      <description><![CDATA[Frontend одного моего мини-проекта основан на <a href="http://foundation.zurb.com/">Foundation</a> фреймворке. Не хочу здесь заводить спор о том, почему не Twitter Bootstrap, а хочу рассказать про валидаторы в этом инструменте. А именно написание своего валидатора.]]></description>
      <pubDate>Thu, 16 Jan 2014 21:05:10 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Скролл-загрузка в Tumblr теме]]></title>
      <link>http://plutov.by/post/tumblr_scroll</link>
      <description><![CDATA[Я использую словосочетание скролл-загрузка, хотя часто это называют “бесконечный скроллинг”. Что это такое? Это подгрузка следующей порции контента, когда скролл приближается к концу страницы (или другое условие). Главное - он нас избавляет от ненужных лишних кликов по кнопкам “Далее”. И я считаю это весомым плюсом. Хотя есть и минусы. Клиент становится более нагруженным. И в некоторых случаях придется пожертвовать футером, если скролл вертикальный, так как до него пользователь может никогда не добраться. Google использует такой подход в <a href="https://www.google.by/imghp">Картинках</a>. Странно, почему он не сделал так в WEB-поиске. А в статье просто небольшой how-to, как это сделать в Tumblr.]]></description>
      <pubDate>Fri, 10 Jan 2014 18:33:57 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Поворот видео в PHP по EXIF-данным]]></title>
      <link>http://plutov.by/post/ffmpeg_exif_rotate</link>
      <description><![CDATA[Видео, записанные с поворотом устройства часто так и отображаются при загрузке на сайт. Некоторые программы (или операционные системы) поворачивают их при проигрывании. Делают они это исходя из метаданных файла (например, в iPhone). Но в Windows видео будет проигрываться так, как оно записано. Поэтому при загрузке видео на ваш сайт нужно видео вручную перевернуть, чтобы гарантировать нужное положение на всех устройствах.]]></description>
      <pubDate>Mon, 23 Dec 2013 17:57:25 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Удаление стилей в contenteditable при вставке]]></title>
      <link>http://plutov.by/post/contenteditable_remove_styles</link>
      <description><![CDATA[В HTML5 есть такой атрибут contenteditable, который позволяет изменять содержимое DOM элементов. Но, по-моему, он совсем еще не готов к использованию, хотя идея классная. Например, при копировании какого-то форматированного текста и вставке в contenteditable, остаются стили и форматирование. Естественно, почти всегда это является проблемой.]]></description>
      <pubDate>Sat, 30 Nov 2013 19:42:02 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Автоматическое сжатие JS / CSS на сервере]]></title>
      <link>http://plutov.by/post/js_css_auto_compress</link>
      <description><![CDATA[От размера JS и CSS файлов (и не только их, но рассмотрим их как основные) зависит время загрузки страницы. И если мы уж говорим о производительности, то нужно сделать размер этих файлов минимальным. Конечно, их размер в основном зависит от требований и логики, которую они выполняют. Но опустим этот этап. Программисты любят покрывать свои классы JSDoc, писать потрясающие стихи-комментарии и ставить кучу пробелов.]]></description>
      <pubDate>Sat, 30 Nov 2013 01:38:21 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Как MongoDB помогает MySQL считать]]></title>
      <link>http://plutov.by/post/mongodb_counters</link>
      <description><![CDATA[Начиная разрабатывать приложение в качестве хранилища данных вы выбираете MySQL. И круто! MySQL есть и будет хорошей , а главное, стабильной СУБД еще долгие годы. Но вот ваше приложение растет, безобидные SELECT COUNT уже заметно тормозят систему. Но не стоит сразу же переписывать систему на NoSQL, поверьте, будет не лучше. Давайте лучше при помощи NoSQL (в этой статье я буду использовать MongoDB) поможем разгрузить кое-какие части системы. Итак, сказ о том, как помочь MySQL считать.]]></description>
      <pubDate>Sun, 24 Nov 2013 00:43:55 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Контроль памяти в JavaScript]]></title>
      <link>http://plutov.by/post/javascript_memory</link>
      <description><![CDATA[Как и обычно, статья начинается с общих заезженных слов, что WEB уже не тот что был пару лет назад, и всё больше ответственности и логики переносится на Front-end. Например, в <a href=”https://tuffle.com”>Tuffle.com</a> Порядка 30 JS-файлов, а так как приложение асинхронное, то нужно как-то ими управлять. Об этом и пойдет речь.]]></description>
      <pubDate>Fri, 08 Nov 2013 16:14:59 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Изменение URL без перезагрузки страницы]]></title>
      <link>http://plutov.by/post/html5_history_api</link>
      <description><![CDATA[С развитием WEB понятие о странице немного изменилось. Для конечного пользователя улучшением производительности и комфорта путешествия по сайту, для разработчиков - немного иной реализацией. Понятно, что страница целиком состоит из множества элементов, большая часть которых не изменяется при переходе на новую страницу. Зачем заставлять пользователя смотреть по 100 раз как рендерится один и тот же документ?]]></description>
      <pubDate>Fri, 01 Nov 2013 18:12:30 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Инкрементное резервное копирование]]></title>
      <link>http://plutov.by/post/incremental_backup</link>
      <description><![CDATA[Это небольшой tutorial о том, как правильно и экономно делать резервное копирование (backup) данных на сервере.]]></description>
      <pubDate>Wed, 23 Oct 2013 22:36:41 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Импорт фотографий к себе на сайт из Facebook, Vkontakte и Instagram.]]></title>
      <link>http://plutov.by/post/social_photo_import</link>
      <description><![CDATA[Сейчас рассмотрим, как импортировать фотографии из Facebook, Vkontakte и Instagram к себе на сайт, красиво и охуенно, используя API этих сервисов. Представленный код написан для Zend Framework 1.* приложения, но вы можете его использовать где угодно с небольшими изменениями. Посмотреть процесс в действии вы можете на <a href="http://tuffle.com">Tuffle.com</a> (на странице создания воспоминания).]]></description>
      <pubDate>Sat, 06 Jul 2013 23:51:32 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Конвертация видео для HTML5 в ffmpeg]]></title>
      <link>http://plutov.by/post/html5_ffmpeg</link>
      <description><![CDATA[С расцветом HTML5 использование flash видеопроигрывателей считается моветоном. HTML5 video куда более приятней и удобней. Но у каждого браузера свои интересы и стандарты, из этого вытекает проблема с форматами видео. Но пользователь этого знать не должен. Под катом инструкция о том как подготовить видео файл для просмотра в HTML5 плеере.]]></description>
      <pubDate>Wed, 20 Feb 2013 19:01:19 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Markdown разметка]]></title>
      <link>http://plutov.by/post/markdown_php</link>
      <description><![CDATA[Сейчас существует очень много "облегченных" языков разметки: BBCode, Wiki, Textile. Но самым "облегченным", на мой взгляд, языком является <a href="http://en.wikipedia.org/wiki/Markdown">Markdown</a>. За последнее время он стал очень популярным в связи с использованием на таких гигантах как GitHub и Stackoverflow.]]></description>
      <pubDate>Mon, 12 Nov 2012 13:41:02 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[DataFixures: миграции для тестовых данных]]></title>
      <link>http://plutov.by/post/data_fixtures</link>
      <description><![CDATA[Всегда, перед тем как запустить приложение в свет, разработчики / тестировщики / заказчики работают с какими-то тестовыми данными (пользователи, заказы и т.д.). Перед запуском на каком-то сервере (test, demo ...) им нужно собрать SQL с общей структурой базы, включить в этот SQL необходимые данные, выполнить всё это на сервере. Мне нравится как к этому делу подошли Symfony 2 и Doctrine 2.]]></description>
      <pubDate>Fri, 02 Nov 2012 17:22:25 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Тестирование web-приложений с использованием Selenium и PHPUnit]]></title>
      <link>http://plutov.by/post/test_phpunit_selenium</link>
      <description><![CDATA[Кратко, <a href="http://seleniumhq.org/">Selenium</a> - это инструмент для тестирования web-приложений. Он позволяет тестировать сайт “от лица пользователя” на уровне операций браузера, таких как клики, ожидание загрузки, поиск элементов на странице. Selenium устанавливается как http-сервер, написанный на java, который умеет управлять браузером и делать в нем различные действия.]]></description>
      <pubDate>Tue, 10 Jul 2012 16:23:32 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Производительность ORDER BY RAND() LIMIT]]></title>
      <link>http://plutov.by/post/order_by_rand_performance</link>
      <description><![CDATA[Для получения нескольких случайных записей из таблицы я всегда использовал всем известную конструкцию ORDER BY RAND() LIMIT. На днях я столкнулся с проблемой в производительности этого запроса. Таблица содержала более миллиона строк. И мне нужно было срочно найти решение. Под катом альтернативный вариант выбора нескольких случайных строк.]]></description>
      <pubDate>Tue, 15 May 2012 10:48:11 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Лицензия PhpStorm для open source проекта]]></title>
      <link>http://plutov.by/post/phpstorm_os_license</link>
      <description><![CDATA[Я пользуюсь PhpStorm и люблю этот продукт. Но всё время пользовался взломанной версией. На их сайте можно получить лицензию для open source проекта, но для этого нужно иметь страницу проекта. В этой статье я расскажу как получить такую лицензию на 1 год имея лишь активный репозиторий на GitHub и Demo страницу.]]></description>
      <pubDate>Fri, 06 Apr 2012 12:24:41 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[FULL OUTER JOIN]]></title>
      <link>http://plutov.by/post/mysql_full_outer_join</link>
      <description><![CDATA[На практике я столкнулся с ситуацией, когда нужно было выбрать данные из двух связанных сущностей при помощи полного соединения. К сожалению, MySQL пока не поддерживает FULL OUTER JOIN. Ниже приведен пример эмуляции этого вида JOIN.]]></description>
      <pubDate>Fri, 02 Mar 2012 14:25:39 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Полезные запросы в MySQL]]></title>
      <link>http://plutov.by/post/mysql_useful_queries</link>
      <description><![CDATA[В этой статье собраны некоторые, на мой взгляд, интересные и полезные запросы в MySQL. Список будет пополняться в будущем.]]></description>
      <pubDate>Wed, 21 Dec 2011 21:42:15 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Введение в Zend Framework 2]]></title>
      <link>http://plutov.by/post/zf2_introduction</link>
      <description><![CDATA[На подходе уже 2-я версия Zend Framework. Некоторые уже спешат переписывать и рефакторить свои сайты, используя пространства имен, менеджеры событий. Под катом хорошая презентация доклада Валерия Рабиевского с "Zend framework day".]]></description>
      <pubDate>Sat, 17 Dec 2011 18:46:30 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Планировщик событий в MySQL]]></title>
      <link>http://plutov.by/post/mysql_event</link>
      <description><![CDATA[Начиная с версии 5.1 в MySQL появился планировщик событий, позволяющий выполнять различные действия в определенное время. Из этого следует то, что часть функционала можно перенести из Cron на сам MySQL.]]></description>
      <pubDate>Thu, 15 Dec 2011 23:31:07 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Nginx для статики, Apache для динамики]]></title>
      <link>http://plutov.by/post/nginx_static_apache_dynamic</link>
      <description><![CDATA[Как известно, Nginx славится тем, что хорошо справляется с отдачей статических файлов (css, js, изображения).
Делается это за счет какого-то хитрого кэширования. Но с обработкой динамического содержания лучше работает Apache.
Имеем: сайт на PHP, Apache. Нужно настроить сервер так, чтобы Nginx отдавал статику, а остальным занимался Apache.]]></description>
      <pubDate>Mon, 12 Dec 2011 20:18:21 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Cubique - datagrid для Zend Framework и jQuery]]></title>
      <link>http://plutov.by/post/cubique_zf_jquery</link>
      <description><![CDATA[Все началось с того, что я разрабатывал один проект с использованием Zend Framework и jQuery.
В панели администратора нужно было выводить данные из различных таблиц MySQL.
Хотелось сделать это красиво, удобно, гибко, с AJAX и т.д.
Поиск в Google выдал огромное количество библиотек для отображения табличных данных.
Но, к сожалению, везде была кривая серверная сторона и не было подходящих решений для Zend Framework.
Под катом Cubique — инструмент для отображения данных для Zend Framework с функциями сортировки, поиска, сделанный на jQuery, основанный на AJAX.]]></description>
      <pubDate>Tue, 18 Oct 2011 08:14:58 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Apache Bench - простая утилита для тестирования нагрузки]]></title>
      <link>http://plutov.by/post/apache_bench_easy_tool</link>
      <description><![CDATA[Apache Bench (ab) - простой инстурмент для тестирования нагрузки веб-сервера.
Данная утилита входит в стандартную сборку Apache и даже имеется почти во всех готовых сборках, таких как Denwer, WAMP, XAMPP.
Очень проста в использовании и гибко настраиваемая.]]></description>
      <pubDate>Wed, 12 Oct 2011 04:52:01 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Drag & Drop]]></title>
      <link>http://plutov.by/post/html5_drag_and_drop</link>
      <description><![CDATA[Возможность Drag & Drop в браузерах была уже давно реализована средствами Javascript.
Сейчас же можно сделать Drag & Drop без сторонних библиотек (jQuery UI), а при помощи нативных возможностей браузера.
Под катом я расскажу как это делается.]]></description>
      <pubDate>Sat, 01 Oct 2011 07:17:00 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Командная строка в PhpStorm]]></title>
      <link>http://plutov.by/post/command_line_php_storm</link>
      <description><![CDATA[PhpStorm — IDE от хорошо зарекомендовавшей себя компании по производству ПО для разработчиков.
Цель любой IDE — создать комфортные условия для быстрой и качественной разработки.
И в создании этих условий вам может помочь Command Line Tool, позволяющий делать быстро шаблонные действия.
К сожалению, сейчас доступны команды только для Zend Framework и Symfony. В этой статье я помогу вам настроить командную строку на свой лад (Custom Framework).]]></description>
      <pubDate>Fri, 23 Sep 2011 05:02:22 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Защита от CSRF в Zend Framework]]></title>
      <link>http://plutov.by/post/zf_csrf</link>
      <description><![CDATA[CSRF (Сross Site Request Forgery) — вид web-атак, использующий недостатки протокола HTTP.
Если жертва заходит на сайт, созданный злоумышленником, от её лица тайно отправляется запрос на другой сервер (например, на сервер платёжной системы), осуществляющий некую вредоносную операцию (например, перевод денег на счёт злоумышленника).
Для осуществления данной атаки, жертва должна быть авторизована на том сервере, на который отправляется запрос, и этот запрос не должен требовать какого-либо подтверждения со стороны пользователя, который не может быть проигнорирован или подделан атакующим скриптом.]]></description>
      <pubDate>Fri, 16 Sep 2011 09:36:38 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[Web-сервис на Zend_Soap]]></title>
      <link>http://plutov.by/post/web_service_soap</link>
      <description><![CDATA[Web-сервис — компонент, предоставляющий Internet-клиентам набор функций API или web-методов. Основная задача web-сервисов — обеспечение межпрограммного взаимодействия.
В отличие от традиционного web-приложения, у web-сервиса нет пользовательского интерфейса (GUI). Вместо этого у него есть программный интерфейс, то есть web-сервис предоставляет функции (web-методы), которые могут быть вызваны удаленно.
Web-сервис не предназначен для обслуживания конечных пользователей. Его задача — предоставление услуг другим приложениям, будь то web-приложения, приложения с графическим пользовательским интерфейсом или консольные приложения.]]></description>
      <pubDate>Tue, 13 Sep 2011 02:59:55 +0300</pubDate>
    </item>
    <item>
      <title><![CDATA[HTML5 Local Storage]]></title>
      <link>http://plutov.by/post/html5_local_storage</link>
      <description><![CDATA[Local storage (локальное хранилище) — база данных на стороне клиента, содержащая пары ключ-значение. Надеюсь, что в ближайшем будущем эта технология станет стандартом в веб-разработке.]]></description>
      <pubDate>Sat, 10 Sep 2011 09:42:58 +0300</pubDate>
    </item>
  </channel>
</rss>
