• Распараллеливание длительных операций

      Мне часто приходится сталкиваться с задачами, требующими от базы данных очень большой производительности при обработке больших массивов данных. Сегодня я расскажу об очень простом, но действенном приеме, который может вас выручить, если база уже не поспевает за тем количеством данных, которые скапливаются и должны быть обработаны. Метод не зависит от базы данных, но по привычке публикую в блог PostgreSQL, и пример будет именно на ней. Давайте сразу перейдем к примеру.
      Читать дальше →
    • Список Javascript библиотек для рисования графиков и диаграмм 2

        Продолжаем тему визуализации данных в интернете.

        Предыдущие топики:
        Читать дальше →
      • «Танцы с бубном» вокруг Thread


          При разработке cloud платформы веб-приложений был реализован сервис серверной логики на базе java scripting технологии для более гибкого управления другими сервисами платформы.

          Соответственно «стал ребром» вопрос контроля над порождением, жизнью и использованием ресурсов платформы дочерними потоками создаваемыми из скриптинга. Потоки через скриптинг могут создаваться всеми доступными способами. В GoogleAppEngine проблему дочерних потоков решили простым запретом их порождения. В нашем случае хочется иметь более гибкое решение. Поэтому необходимо иметь контроль над дочерными потоками создаваемыми из главного потока запроса.

          Изначально предполагалось что задача тривиальна и что в Java есть стандартные для этого средства. Но ожидания не оправдались.
          Читать дальше →
        • Учимся писать модуль ядра (Netfilter) или Прозрачный прокси для HTTPS

          Эта статья нацелена на читателей, которые начинают или только хотят начать заниматься программированием модулей ядра Linux и сетевых приложений. А также может помочь разобраться с прозрачным проксированием HTTPS трафика.

          Небольшое оглавление, чтобы Вы могли оценить, стоит ли читать дальше:
          1. Как работает прокси сервер. Постановка задачи.
          2. Клиент – серверное приложение с использованием неблокирующих сокетов.
          3. Написание модуля ядра с использованием библиотеки Netfilter.
          4. Взаимодействие с модулем ядра из пользовательского пространства (Netlink)

          P.S. Для тех, кому только хочется посмотреть на прозрачный прокси-сервер для HTTP и HTTPS, достаточно настроить прозрачный прокси-сервер для HTTP, например, Squid с transparent портом 3128, и скачать архив с исходниками Shifter. Скомпилировать (make) и, после удачной компиляции, выполнить ./Start с правами root. При необходимости можно поправить настройки в shifter.h до компиляции.
          Читать дальше →
        • Java-ассемблер, мета-программирование и JPA

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

            Краткая постановка задачи:
            • Есть набор виртуальных «классов» в понятии бизнес-пользователя. Например, «сайт», «папка», «новость», и т.д. Каждый из таких классов имеет набор полей (аттрибутов).
            • Пока что у нас нет наследования классов, а поля ограничены примитивными String/Integer/Long/Enum/Boolean, даже без multiple, но с возможными заданными значениями по умолчанию
            • Каждый класс записывается в отдельную таблицу, например, objects_sites, objects_news, objects_folder, etc. Таблица всегда содержит ID объекта, а также колонки для полей.
            • Нужно сделать так, чтобы загрузка этих объектов работала через JPA (Hibernate), с использованием необходимого кэширования/транзакций/Lazy-loading'а и других вкусностей, которые нам даёт JPA.

            Для выполнения данной задачи использовалось:
            • В качестве баз данных — MySQL 5.0, InnoDB, три схемы базы данных (разные типы могут лежать в разных схемах, чтобы отделить системные типы от пользовательских)
            • Sun JDK 6.0
            • Tomcat 6 + JOTM 2.1.9 + Hibernate 3.5.0-Final (patched)
            • Для создания классов использовалась связка CGLib 2.2 (входящая в Hibernate) и ASM 3.2 (в Hibernate входит 3.1)

            Читать дальше →
          • Почему программисты работают по ночам

            • Перевод
            Мозг шимпанзе в лондонском музее наукиСогласно поговорке, программисты — это устройства, преобразующие кофеин в код.

            Если спросить первого попавшегося программиста, когда он наиболее продуктивен, — скорее всего, он назовёт ночь. Кто-то пораньше, кто-то попозже. Популярен вариант встать в 4 утра и сделать работу до начала дневной суматохи. А некоторые предпочитают ложиться в 4 утра.

            Цель всего этого — избавиться от отвлекающих факторов. Но можно было бы просто закрыть дверь… Что же такого особенного в ночи?

            Я думаю, что всё сводится к трём вещам: расписанию творца, сонному мозгу, и яркому экрану компьютера.

            Читать дальше →
          • Как преодолеть традиционные проблемы при внедрении Agile

              Прочитал пост "Проблемы при внедрении Agile" хабрапользователя adnotum, захотелось предложить несколько решений описанных проблем. Поскольку решения достаточно универсальные, решил оформить их в виде отдельного поста.
              Большинство описанных проблем появляется, потому что Scrum является гибким фреймворком, а не полноценной методологией. Это является его недостатком и преимуществом одновременно. «Ванильный» или «кошерный» Scrum описан кратко в официальном авторитетном руководстве от Сазерленда и Шваббера. «Кошерный» Scrum — это когда ты все делаешь по правилам, а получается не очень вкусно, да и сам процесс не доставляет удовольствия. Такой сферический Scrum будет работать только идеальном вакууме, но его можно и нужно адаптировать, чем собственно этот фреймворк и хорош.
              Читать дальше →
            • Three20 demystifying: TTModel

                Те, кому по причине необходимости пришлось столкнуться с Three20, в процессе разработки iOS приложений, знают, что данная библиотека более-менее решать некоторый круг задач, связанный с быстрым прототипированием, использованием глобальной навигации, MVC подходом для разработки приложений.

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

                Это не единственный минус библиотеки, и в интернете можно найти много обсуждений относительно за и против Three20.

                Необходимо сказать, что главный разработчик остановил разработку над Three20, и решил создать новую библиотеку Nimbus, основной идеей которой будет простота и высокая документированность:
                «Nimbus is an iOS framework whose feature set grows only as fast as its documentation.»

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

                В данном посте будут подробно рассмотрены вопросы, связанные с работой TTModel.

                Для тех, кто не собирается использовать Three20 у себя в проектах, будет полезно подсмотреть на одну из возможных, заслуживающий внимания, реализаций модели в шаблоне MVC.

                Всех, кому еще интересно, прошу
                под кат
              • Малоизвестные особенности Java. Вторая часть

                  Как и обещал, предлагаю вашему вниманию следующие пять пунктов.

                  Малоизвестные особенности Java. Первая часть

                  6. Конфликт имён.

                  Если импортированы несколько классов с одним и тем же именем из разных пакетов, возникает конфликт имён. В таком случае при обращении к классу следует указывать его квалифицированное имя, то есть полное имя, включая и имя пакета, например java.lang.String.

                  Неужели ничего нельзя с этим поделать? Оказывается можно. Следующий код скомпилируется без проблем, несмотря на то, что класс List присутствует и в пакете java.awt, и в пакете java.util:

                  import java.awt.*;
                  import java.util.*;
                  import java.util.List;
                  
                  public class Класс {
                  	public static void main(String... аргументы) {
                  		List простоСписок = Collections.emptyList();
                  		System.out.println(простоСписок);
                  	}
                  }


                  Достаточно дополнительно импортировать необходимый класс, java.util.List в данном примере.

                  Тут, как вы заметили, используются кириллические идентификаторы. Да! Для кого-то это станет откровением, но Java… такая Java. Идентификатор может состоять из совершенно любых букв, помимо цифр, знаков подчёркивания и валюты США (однако последний знак ($) использовать не рекомендуется, он предназначен для системных нужд). Но оно нам надо? Разве только в целях обфускации. Только представьте себе, сколько разных идентификаторов можно сгенерировать всего-то из символов «А» английского, русского и греческого алфавитов…

                  Читать дальше →
                • Малоизвестные особенности Java

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

                  Вот уже подоспела и вторая часть статьи.


                  1. Нестатические блоки инициализации.

                  Всем, я думаю, известно, что в Java существуют статические блоки инициализации (class initializers), код которых выполняется при первой загрузке класса.

                  class Foo {
                  	static List<Character> abc;
                  	static {
                  		abc = new LinkedList<Character>();
                  		for (char c = 'A'; c <= 'Z'; ++c) {
                  			abc.add( c );
                  		}
                  	}
                  }


                  Но существуют также и нестатические блоки инициализации (instance initializers). Они позволяют проводить инициализацию объектов вне зависимости от того, какой конструктор был вызван или, например, вести журналирование:

                  class Bar {
                  	{
                  		System.out.println("Bar: новый экземпляр");
                  	}
                  }


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

                  Map<String, String> map = new HashMap<String, String>() {{
                  	put("паук",  "арахнид");
                  	put("птица", "архозавр");
                  	put("кит",   "зверь");
                  }};


                  Очень даже мощное средство, не находите?

                  JFrame frame = new JFrame() {{
                  	add(new JPanel() {{
                  		add(new JLabel("Хабрахабр?") {{
                  			setBackground(Color.BLACK);
                  			setForeground(Color.WHITE);
                  		}});
                  
                  		add(new JButton("Торт!") {{
                  			addActionListener(new ActionListener() {
                  				public void actionPerformed(ActionEvent event) {
                  					System.out.println("Хабрахабр - торт!");
                  				}
                  			});
                  		}});
                  	}});
                  }};


                  Остальные четыре пункта под катом.
                  Читать дальше →
                • WebSocket: Реализация web-приложения с использованием Jetty Web Socket. Часть 1

                  Добрый день, Хабражитель!

                  Поздравляю всех и каждого с великим Днем Программиста! Желаю рабочего кода, уверенных сокетов и самых продвинутых пользователей!

                  Работая над автоматизацией концертного агентства, мне на каком-то этапе разработки понадобилась система уведомлений. Доступ к автоматизации происходит через написанное мною web-приложение. И, соответственно, моментальные уведомления должны приходить в браузер пользователя.

                  Для реализации такой задачи есть три решения:
                  • «бесконечный iframe»,
                  • используя XMLHttpRequest (a.k.a. Ajax),
                  • используя WebSocket.

                  Первое решение я сразу «отметаю» (причины объяснять не буду, web-разработчики меня поймут).

                  Второе решение нравится гораздо больше, но у него есть свои минусы:
                  • браузер отправляет запрос каждую секунду создавая лишнюю нагрузку на:
                    • сервер;
                    • ОС, на которой работает браузер;
                    • и еще раз на сервер, так как сервер постоянно выполняет запрос БД на выборку последних уведомлений.
                  • тяжело отследить онлайн-статус пользователя (то есть нужно, например, хранить сессии в БД и постоянно мониторить каждую на timeout).

                  Третье решение — как раз то, что доктор прописал.

                  Итак, WebSocket.
                  Читать дальше →
                • Типичные случаи утечки памяти в Java

                  Большинству разработчиков известно, что сборщик мусора в Java не является универсальным механизмом, позволяющим программисту полностью забыть о правилах использования памяти и о том, в каких случаях осуществляется его работа. Ниже описаны типичные случаи утечки памяти в java-приложениях, встречающиеся повсеместно.
                  Итак, о чём должен помнить каждый java-программист.
                  Читать дальше →