• Nexus 7: Unboxing


      Я с самого начала хотел заказать Nexus 7 на Google Play, но природная леность не позволила мне это сделать. К тому же, до сих пор там висит уведомление, что отгрузка начнется только через 1-2 недели. А с учетом того, что через пару недель в отпуск — покупка Nexus 7 откладывалась, казалось бы, до осени. Пока я не увидел несколько сообщений, что Nexus 7 уже начал поставляться ритейлерам. В общем, как и предсказывалось — под катом unboxing cо множеством фотографий.
      Много фотографий, не так много текста
    • on{X}: приложение для Android от Microsoft

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

        На самом деле, это реальность. Как сообщает TechCrunch, Microsoft сегодня представил бета-версию on{X} (произносится «он-экс») — сайта и Android-приложения, которые предоставляют пользователям расширенный контроль над их Android-телефонами с помощью удалённого программирования (да-да, именно Microsoft). Полугики могут воспользоваться готовыми рецептами, тогда как ультрагики могут создать свои сценарии с JavaScript API.
        Читать дальше →
      • Использование Liquibase без головной боли. 10 советов из опыта реальной разработки

        • Tutorial
        kdpvLiquibase — это система управления миграциями базы данных. Это вторая статья о Liquibase, на этот раз содержащая советы «боевого» использования системы. Для получения базовых сведений подойдет первая статья-перевод «Управление миграциями БД с Liquibase» (ссылка).

        Как и многие инструменты, служащие для облегчения жизни разработчиков программного обеспечения, Liquibase имеет «обратную сторону медали», с которой приходится рано или поздно столкнуться.

        Вот 10 вещей, которые в определенный момент работы с Liquibase были для меня открытием.

        1. Версионность приложения должна быть отражена в структуре папок миграций


        Если вы не будете следовать этому правилу, файлы чейнджлогов быстро украсят папку миграций своим количеством и необычными именами.
        На данный момент для себя я выработал оптимальную стратегию именования файлов и папок. Вот она:

        /db-migrations
            /v-1.0
                /2013-03-02--01-initial-schema-import.xml
                /2013-03-02--02-core-data.xml
                /2013-03-04--01-notifications.xml
                /changelog-v.1.0-cumulative.xml
            /v-2.0
                ...
                /changelog-v.2.0-cumulative.xml
            /changelog.xml
        

        Подробнее:
        Читать дальше →
        • +17
        • 42,4k
        • 9
      • Бюджетное решение для бэкапа целого офиса



          Большинство статей в наш блог пишут разработчики. Мы решили исправить эту несправедливость и добавить немного DevOps. Сегодня поговорим о важном ― о бэкапах.
          Так как Badoo активно развивается и количество сотрудников постоянно увеличивается, мы пришли к выводу, что централизованное резервное копирование гораздо удобнее, чем частичное копирование и хранение информации в различных местах.
          В статье мы рассмотрим, как различными способами «забэкапить» довольно большое количество рабочих станций с помощью одного хранилища, не прибегая к серьёзным вложениям и избегая громоздкой реализации.
          Заранее оговоримся, что бэкап не охватывает 100% сотрудников, так как не все хранят свои данные на локальных машинах, поэтому у нас не было цели сделать бэкап обязательно-принудительным.
          Одной из основных сложностей централизованного бэкапа стало то, что сотрудники используют разные операционные системы.

          Как же мы смогли собрать всех на одном сервере?
          Читать дальше →
        • Написание простого приложения для работы с RESTful API под Android

          Работа с API различных порталов — одна из самых распространенных задач, возникающих при разработке под Android. Казалось бы, ничего сложного — асинхронно посылать HTTP-запросы и отображать ответы, но дьявол, как всегда, кроется в деталях.

          Основные антипаттерны:
          • Отправка запроса прямо из кода Activity в основном треде — тут без комментариев, т.к. это приводит к заморозке UI, вследствие чего система может предложить убить приложением;
          • Отправка запроса из кода Activity при помощи AsyncTask — плохо, т.к. если пользователь, к примеру, повернет экран, Activity пересоздастся и запрос придется выполнять заново, что приводит увеличению времени ожидания и количества потребляемого трафика;
          • Отсутствие кэширования — после каждого действия пользователя ему придется ждать полной загрузки данных.

          Читать дальше →
        • Ant + Ivy VS Maven: давайте жить дружно

          В этой статье я не буду развивать очередной холивар на тему, что круче. Скорее, будет проведен сравнительный обзор, опираясь на точку зрения самого Apache* и личного опыта нашей команды Build Factory. Обращаю внимание, что речь идет о большом Enterprise. Это означает, что в учет не берутся юзкейсы, когда вчера решили — сегодня уже должно быть сделано. Зато в учет берутся очень большие размеры проекта, распределенные по всему миру команды разработчиков и прочие прелести.
          Очень часто можно услышать мнение, что Ant сам по себе с Maven сравнивать нельзя. А вот Ant + Ivy уже может составить конкуренцию Maven. Отчасти это правда.

          Читать дальше →
        • Опции JVM. Как это работает

            С каждым днем слово java все больше и больше воспринимается уже не как язык, а как платформа благодаря небезызвестному invokeDynamic. Именно поэтому сегодня я бы хотел поговорить про виртуальную java машину, а именно — об так называемых Performance опциях в Oracle HotSpot JVM версии 1.6 и выше (server). Потому что сегодня почти не встретить людей, которые знают что-то больше чем -Xmx, -Xms и -Xss. В свое время, когда я начал углубляться в тему, то обнаружил огромное количество интересной информации, которой и хочу поделится. Отправной точкой, понятное дело, послужила официальная документация от Oracle. А дальше — гугл, эксперименты и общение:

            -XX:+DoEscapeAnalysis


            Начну, пожалуй, с самой интересной опции — DoEscapeAnalysis. Как многие из Вас знают, примитивы и ссылки на объекты создаются не в куче, а выделяются на стеке потока (256КБ по умолчанию для Hotspot). Вполне очевидно, что язык java не позволяет создавать объекты на стеке на прямую. Но это вполне себе может проделывать Ваша JVM 1.6 начиная с 14 апдейта.

            Про то, как работает сам алгоритм можно прочитать тут (PDF). Если коротко, то:

            • Если область видимости объекта не выходит за область метода, в котором он создается, то такой объект может быть создан на фрейме стека вместо кучи (на самом деле не сам объект, а его поля, на совокупность которых заменяется объект);
            • Если объект не покидает область видимости потока, то к такому объекту другие потоки не имеют доступа и следовательно все операции синхронизации над объектом могут быть удалены.


            Для реализации данного алгоритма строится и используется так называемый — граф связей (connection graph), по которому на этапе анализа (алгоритмов анализа — несколько) осуществляется проход для нахождения пересечений с другими потоками и методами.
            Таким образом после прохода графа связей для любого объекта возможно одно из следующих следующих состояний:

            • GlobalEscape — объект доступен из других потоков и из других методов, например статическое поле.
            • ArgEscape — объект был передан как аргумент или на него есть ссылка из объекта аргумента, но сам он не выходит из области видимости потока в котором был создан.
            • NoEscape — объект не покидает область видимости метода и его создание может быть вынесено на стек.


            После этапа анализа, уже сама JVM проводит возможную оптимизацию: в случае если объект NoEscape, то он может быть создан на стеке; если объект NoEscape или ArgEscape, то операции синхронизации над ним могут быть удалены.

            Следует уточнить, что на стеке создается не сам объект а его поля. Так как JVM заменяет цельный объект на совокупность его полей (спасибо Walrus за уточнение).

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

                for (int i = 0; i < 1000*1000*1000; i++) {
                    Foo foo = new Foo();
                }
            

            скорость выполнения может увеличится в 8-15 раз. Хотя, на казалось бы, очевидных случаях из практики о которых недавно писалось (тут и тут) EscapeAnalys не работает. Подозреваю, что это связано с размером стека.

            Кстати, EscapeAnalysis как раз частично ответственен за известный спор про StringBuilder и StringBuffer. То есть, если Вы вдруг в методе использовали StringBuffer вместо StringBuilder, то EscapeAnalysis (в случае срабатывания) устранит блокировки для StringBuffer'а, после чего StringBuffer вполне превращается в StringBuilder.
            Читать дальше →
          • Полезные хаки и сниппеты для .htaccess



            Это перевод очень интересной лично для меня статьи, которым я хочу поделиться с уважаемым хабрасообществом. Некоторые из приведенных рецептов я уже встречал на Хабре, но разрозненно и далеко не все из нижеприведенного.

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

            Если же вам нужны базовые сведения о предназначении данного файла, то вы можете получить из нашей статьи введение в .htaccess (перевод данной статьи не делал, так как там основы, их достаточно в русскоязычном сегменте Сети, но если будет проявлен интерес, то можно и ее перевести для полноты картины — прим. переводчика), в которой достаточно подробно раскрыты все аспекты его применения.
            Узнать больше
          • Как стать кукловодом или Puppet для начинающих

            • Tutorial
            Здравствуйте.
            image
            Этот топик открывает цикл статей по использованию системы управления конфигурацией Puppet.

            Что такое система управления конфигурацией?


            Предположим, что у вас есть парк серверов, выполняющих различные задачи. Пока серверов мало и вы не растёте, вы легко настраиваете каждый сервер вручную. Устанавливаете ОС (может быть, автоматизированно), добавляете пользователей, устанавливаете софт, вводя команды в консоль, настраиваете сервисы, правите конфиги ваших любимых текстовых редакторов (nanorc, vimrc), выставляете на них одинаковые настройки DNS-сервера, устанавливаете агент системы мониторинга, настраиваете syslog для централизованного сбора логов… Словом, работы довольно много и она не особенно интересна.
            Как спастись от рутины?
          • Контролируемое кэширование страниц в nginx

            Введение

            Как известно, nginx умеет кешировать ответ сервера, и выдавать его по запросу вместо обращения к бэкенду, экономя тем самым ресурсы сервера. Скорость отдачи таких закешированных страниц иногда поражает, ради таких скоростей иногда не жалко переносить на javascript многие функции сайта только для того, чтобы иметь возможность закешировать ещё 1 страницу целиком (Например, вынести отрисовку плашки с авторизацией юзера на js, чтобы иметь возможность кешировать страницу, которая идентична для всех пользователей, за исключением этой самой плашки).

            Я много раз использовал возможность кэширование nginxом страниц, и натыкался на пару неудобных для себя вещей:
            • Можно легко закешировать вообще все страницы, но для динамических сайтов или для сайтов с авторизацией нужно ли это?
            • Можно закешировать отдельно несколько url, вида /album/*, но не переписывать же конфиг nginx каждый раз при появлении новых разделов сайта?

            Читать дальше →