• Unix как IDE: Работа с текстом

    • Translation
    Текстовый редактор — это основной инструмент для любого программиста, вот почему вопрос его выбора становится причиной яростных дебатов. Unix традиционно тесно связан с двумя своими многолетними фаворитами, Emacs и Vi, и их современными версиями GNU Emacs и Vim. Эти редакторы имеют очень разный подход к редактированию текста, но при этом сравнимы по мощи.

    Поскольку я отношусь к секте Vim, далее мы обсудим неисчерпаемые возможности этого редактора, а также инструменты командной строки, вызываемые прямо из Vim для расширения встроенной функциональности. Некоторые из обсуждаемых дальше принципов могут быть применимы и для Emacs, но не для простых редакторов, вроде Nano.
    Читать дальше →
  • Опасности метода finalize

      Во время написания статьи про использование фантомных ссылок, мне потребовалось сослаться на неудобства возникающие при работе с методом finalize. К тому же, считаю, что данный топик будет полезен всем начинающим java разработчикам, а некоторые пункты будет не лишним вспомнить и матерым программистам, ведь использовать метод finalize очень просто, чего не скажешь о поиске последсвий этого. Даже если вы твердо убеждены никогда не использовать метод finalize, это еще не значит, что ваши предыдущие коллеги их не использовали, и вам не надо понимать как они работают.
      Читать дальше →
    • Размещаем индекс Lucene в RAM при помощи Azul Zing JVM

      • Translation
      Весь поисковый индекс Google размещается в RAM памяти уже как минимум 5 лет. Почему бы не попробовать сделать то же самое и с поисковым индексом для Lucene?

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

      Очевидный вопрос – не попробовать ли нам загрузить весь индекс, в предоставляемый Lucene класс RAMDirectory?
      Читать дальше →
    • Как собрать свою JDK, без блекджека и автоматической сборки мусора

      • Tutorial
      На недавно прошедшей Java One Руслан cheremin рассказывал о том, что разработчики Disruptor используют JVM без сборщика мусора. У них на то были свои причины, которые не имеют к этому топику никакого отношения.

      Я же давно хотел поковыряться в исходниках виртуальной машины, и выпиливание из неё GC – отличное начало. Под катом я расскажу вам, как собрать OpenJDK, выпилить из неё сборщик мусора и снова собрать. Ближе к концу даже будет дан ответ на наверняка пришедший вам в голову вопрос «зачем».

      Читать дальше →
    • GC и большой heap: друзья или враги?

        Споры о том, что лучше: ручное управление или автоматическое ведутся во многих областях науки и техники. Положиться на человека или отдаться на откуп бесстрастным механизмам и алгоритмам? Похоже, что в мире создания Enterprise решений чаша весов склонилась все-таки в сторону автоматического управления памятью, большей частью из-за того, что возиться с указателями, ручным управлением памятью и закрашивать седину после каждого бага, появившегося из-за «неправильного» компилятора С/C++ не хочется сейчас уже никому. Но до сих пор возникают на форумах топики, где не сдающиеся суровые приверженцы ручного управления памятью яростно и непримиримо отстаивают свои ретроградные взгляды в борьбе с прогрессивной частью человечества. Пусть их, оставим их в покое.

        Одной из наиболее часто использующихся платформ с механизмами автоматического управления памятью стала Java. Но, автоматическое управление памятью принесло не только комфорт в нелегкий труд программистов, но и свои недостатки, с которыми приходиться сталкиваться всё чаще и чаще. Современные многопользовательские приложения, способные обработать огромный поток транзакций, требуют значительных аппаратных ресурсов, размеры которых раньше было трудно даже вообразить. Однако, дело не в размерах этих ресурсов, дело в том, что сборщик мусора, существующий в большинстве современных JVM, не может работать эффективно с большими объемами памяти.
        Читать дальше →
      • Использование разделяемой памяти в Java и off-heap кеширование

          На прошлой неделе состоялся успешный эксперимент по запуску нового решения для download-сервиса. Один достаточно скромный сервер (2 x Intel Xeon E5620, 64 GB RAM) под управлением Java-приложения собственной разработки принял на себя нагрузку восьми Tomcat'ов, обслуживая более 70 тысяч HTTP-запросов в секунду общей пропускной способностью 3000 Mb/s. Таким образом, весь трафик Одноклассников, связанный с пользовательскими смайликами, обрабатывался одним сервером.

          Вполне естественно, что высокие нагрузки требовали нестандартных решений. В цикле статей о разработке высоконагруженного сервера на Java я расскажу о проблемах, с которыми нам пришлось столкнуться, и о том, как мы их преодолели. Сегодня речь пойдет о кешировании изображений вне Java Heap и об использовании Shared Memory в Java.
          Читать дальше →
        • Что такое — выглядит как мемкеш, ведет себя как мемкеш, но не мемкеш?

            Доброго дня, коллеги!



            Сегодня я расскажу вам о том, как не внося большого количества изменений в приложение улучшить его быстродействие. Речь пойдет о нашем небольшом «велосипеде» [1], призванном заменить memcache в некоторых случаях.

            Статья написана по моему докладу «Кругом обман или использование стандартных протоколов для нестандартных вещей» [2] на DevConf'12.
            Читать дальше →
          • Java 8 Lambda vs LambdaJ vs Guava vs Iterative approach

              В середине 2013 года выходит Java 8 с реализацией лямбда-выражений. Лямбда-выражения предоставляют широкие возможности для применения функционального стиля программирования. Правда функциональный стиль можно использовать уже сегодня в JDK 7, 6 или 5 с помощью библиотек LambdaJ и Guava.
              Iterative Lambdaj JDK 8 lambda Guava
              Print all brands 79 472* 113 79
              Select all sales of a Ferrari 25 146 44 31
              Find buys of youngest person 1,209 1,775 1,242 1,218
              Find most costly sale 8 123 55 72
              Sum costs where both are males 23 973* 40 45
              Age of youngest who bought for > 50,000 1,521 2,576* 1,560 1,511
              Sort sales by cost 350 1,187 473 453
              Extract cars original cost 29 61 31 31
              Index cars by brand 57 70 89 415
              Group sales by buyers and sellers 2,586 3,748* 2,862 1,601
              Find most bought car 744 1,023* CRASH 1,435
              подробнее о производительности
            • Практическая оптимизация и масштабируемость MySQL InnoDB на больших объёмах данных

                Данный пост не будет рассказывать про индексы, планы запросов, триггеры для построения агрегатов и прочие общие способы оптимизации запросов и структуры БД. Так же не будет рассказывать про оптимальные настройки с префиксом innodb_. Возможно прочитав текст ниже вы лучше поймёте смысл некоторых из них. В данном посте речь пойдёт об InnoDB и его функционирование.

                Какие проблемы может помочь решить этот пост?


                • Что делать если у вас в списке процессов множественные селекты которым казалось бы никто не мешает?
                • Что делать если всё хорошо настроено, запросы пролетают как ракеты и список процессов постоянно пустой, но на сервере высокий LA и запросы начинают работать немного медленнее, ну например вместо 100мс получается 500мс ?
                • Как быстро масштабировать систему, когда нет возможности всё переделать?
                • У вас коммерческий проект в конкурентной среде и проблему надо решать немедленно?
                • Почему один и тот же запрос работает то быстро то медленно?
                • Как организовать быстрый кеш и поддерживать его в актуальном состояние?

                Читать дальше →
              • А как же всё-таки работает многопоточность? Часть I: синхронизация

                • Tutorial
                картинка для привлечения внимания(пост из серии «я склонировал себе исходники hotspot, давайте посмотрим на них вместе»)
                Все, кто сталкивается с многопоточными проблемами (будь то производительность или непонятные гейзенбаги), неизбежно сталкиваются в процессе их решения с терминами вроде «inflation», «contention», «membar», «biased locking», «thread parking» и тому подобным. А вот все ли действительно знают, что за этими терминами скрывается? К сожалению, как показывает практика, не все.

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

                Перед прочтением глубокого описания полезно убедиться в том, что вы в достаточной мере разбираетесь в Java Memory Model. Изучить её можно, например, по слайдам Сергея Walrus Куксенко или по моему раннему топику. Также отличным материалом является вот эта презентация, начиная со слайда #38.
                Читать дальше. Много.
              • Советы по правильной настройке телевизора

                Для начала, что есть «правильная настройка». Если вы хотя бы раз были в магазине электроники, то наверняка замечали, что все выставленные телевизоры показывают по-разному. С чем это связано? Какой из них лучше? Давайте разберемся.

                Я думаю, вы согласитесь, что телевизор должен не просто показывать какую-то картинку, но и вносить как можно меньше искажений в исходный контент. Сам контент всегда создается с оглядкой на стандарты и рекомендации индустрии, и главная цель любого телевизора — донести до вас именно то изображение, которое вам хотели показать. Тут важно всё: и оттенок кожи у актера, и цвет неба на закате, и какие детали изображения должны быть видны, а какие спрятаны. Существуют международные стандарты, описывающие каким должно быть изображение на экране вашего телевизора. Все вы, наверняка, встречали аббревиатуры PAL, NTSC, или HDTV, вот за этими буквами и скрываются свойства видеосигнала и различные параметры изображения. С приходом HDTV в нашу жизнь, большая часть стандартов сразу же устарела, и, фактически, наиболее актуальным сейчас является стандарт REC709, который используется в телевидении высокой четкости (HD) и в Blu-Ray видео.
                Читать дальше →
              • Desura: платформа дистрибуции игр под Linux/Windows

                  После нескольких месяцев разработки наконец-то вышел релиз клиента Desura под Linux. Теперь эта платформа дистрибуции игр работает и под Windows, и под Linux.

                  Desura специализируется на независимых разработчиках игр. В каталоге насчитывается 253 игры, в том числе 65 под Linux, из них 16 бесплатных. По случаю выхода Linux-клиента объявлена распродажа нескольких игрушек, которые сейчас можно купить по цене один-два евро. Среди них — футуристический хакерский симулятор Hacker Evolution: Untold.
                  Читать дальше →
                • Секреты JDK


                    Про Unsafe в Java не слышал только ленивый, однако это не единственный магический класс в Sun/Oracle JDK, стирающий границы Java платформы и открывающий тропинки, не нанесенные на карту публичного API. Я расскажу про некоторые из них, принесшие пользу в реальных проектах. Но помните: недокументированные возможности лишают ваше приложение переносимости на другие Java платформы и, кроме того, являются потенциальным источником нетривиальных ошибок. Я даже зря написал слово «приложение». Лучше сказать, что описанные ниже классы вовсе не годятся для приложений! Скорее, они представляют интерес лишь для системного ПО и для любознательных программистов, т.е. для вас :)
                    Читать дальше →
                  • Схватка без зеркал: Nikon J1, Sony NEX-5N, Pentax Q и Panasonic GF3

                      Рассказав о каждой из представленных в заголовке беззеркалке по-отдельности, мы решили сделать сложное: собрать все эти камеры и устроить настоящую схватку без зеркал!



                      Disclaimer: разным людям важны в камерах разные параметры, и мы к сожалению не могли осветить в этом сравнительном тесте все-все-все их фишки и особенности. В общем, не судите строго, мы старались :)
                      Вовнутрях куча тестовых фоток и видео
                    • Как бороться с паузами GC

                      В данном топике речь пойдет о причинах, вызывающих длинные паузы сборщика мусора и о способах борьбы с ними. Рассказывать я буду о CMS (low pause), так как на данный момент это наиболее часто используемый алгоритм для приложений с большой памятью и требованием малой задержки (low latency). Описание дается в предположении, что у вас приложение крутится на боксе с большим объемом памяти и большим количеством процессоров.

                      Читать дальше →
                    • Пишем собственный linux демон с возможностью автовосстановления работы

                      Уважаемые хабрапользователи, хотелось бы поделиться с вами опытом написания серверных демонов. В Рунете очень много статей по этому поводу, но большинство из них не даёт ответы на такие важные вопросы как:
                      • Как добавить демона в автозагрузку?
                      • Что делать, если в процессе работы произошла ошибка и демон рухнул?
                      • Каким образом обновить конфигурацию демона без прерывания его работы?

                      В рамках данной части рассмотрим следующие моменты:
                      • Принцип работы демона.
                      • Основы разработки мониторинга состояния демона.
                      • Обработка ошибок при работе, с подробным отчетом в лог.
                      • Некоторые вопросы связанные с ресурсами системы.

                      Для наглядности будет показан исходный код следующих частей:
                      • Шаблон основной программы.
                      • Шаблон функции мониторинга работы демона.
                      • Шаблон функции обработки ошибок.
                      • Ряд вспомогательных функций.

                      Читать дальше →
                    • Fork/Join Framework в Java 7

                      • Tutorial
                      Какое-то время назад я делал обзор нововведений в Java 7, и, среди прочего, грозился по некоторым из новшеств пройтись более конкретно. Прошло довольно много времени, в Java 7 успели даже найти серьёзный дефект, но наконец настал тот момент, когда уже пора выполнить своё обещание. Потому под катом вы можете найти описание и пример использования новой реализации ExecutorService под названием ForkJoinPool. Эта реализация разработана специально для упрощения распараллеливания рекурсивных задач и решает проблему с тем, что пока выполняется под-задача, поток, который её породил, не может быть использован.
                      Читать дальше →