Обновить
512K+

Java *

Объектно-ориентированный язык программирования

240,24
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

JBrainfuck — Пишем компилятор Brainfuck под Java VM

Время на прочтение13 мин
Охват и читатели23K
Меня давно интересовал вопрос написания своего компилятора под Java VM, но было недостаточно опыта, дабы сделать это. Да и как-то руки не доходили, а недавно все же решил разобраться в этой теме и заодно рассказать о своем опыте создания компилятора под эту VM.

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

JBrainfuck — оптимизирующий интерпретатор и компилятор Brainfuck под Java VM. Благодаря JIT обладает высокой производительностью.


Ну что, приступим?

Легкая и динамическая бизнес логика на JavaScript при помощи Mozilla Rhino

Время на прочтение6 мин
Охват и читатели16K
image

Предыстория


Хотелось бы начать с предыстории. В данный момент я разрабатываю некое веб-приложение на Java, ничего необычного, но в документе от заказчика есть требование: будущие администраторы приложения должны иметь возможность налету подгружать код бизнес логики на сервер. Вроде бы ничего сверхъестественного, нужно будет сделать подгрузку java-классов, думал я, пока на днях мне в голову не пришла идея: “А что, если дать возможность программировать методы бизнес логики на JavaScript?”.
В тот момент идея показалась мне очень хорошей, и я видел целый ряд преимуществ этой идеи перед простой подгрузкой java-классов:

  • Во-первых, JavaScript — это очень простой язык описания логики, писать на нем может любой программист, знакомый с принципами ООП и C-подобным синтаксисом.
  • Во-вторых, т.к. внешнее API сервера спроектировано в стиле REST, js-код отлично ложится в рамки ресурса, без проблем сериализуется в JSON-строку и не требует компиляции и дополнительных манипуляций.
  • В-третьих, исполнение JavaScript-кода интерпретатором — это исполнение кода в рамках песочницы безопасности, что дает нам возможность четко настраивать правила поведения кода бизнес-логики.

Но не стоит забывать, что большая сила — это большая ответственность, поэтому, вслед за новыми возможностями, появляются новые вопросы, которые требуют развернутого ответа.
В этой статье я бы хотел вкраце рассказать об идее описания бизнес логики на чистом js, затронуть теоретическую и практическую части, а так же описать некоторые нюансы, которые могут возникнуть вслед за этим решением.
Читать дальше →

SSO используя Jasig CAS Server 4.0.0. Часть 1

Время на прочтение4 мин
Охват и читатели11K
Представьте, что у вас есть web-проект, который состоит из двух или более частей, (part1.example.com) и вторая часть (part2.example.com). Теперь перед вам стоит задача сделать Аутентификацию пользователя, но так чтобы когда пользователь зайдя один раз в любую из частей web-проекта, например, в первую, то во второй он уже должен быть аутентифицирован.
Читать дальше →

Динамическое добавление свойств в языке Java

Время на прочтение3 мин
Охват и читатели11K
Disclaimer

Инструмент родился как способ побороть недочеты проектирования малой кровью. Я с трудом могу представить ситуацию, где использование инструмента могло бы быть продиктовано иными причинами.
Читать дальше →

Простейший Connection pool без DataSource в Java

Время на прочтение4 мин
Охват и читатели39K
Ни для кого не секрет, что в Java EE Connection Pool реализуется используя Data Source. С примером реализации в Apache Tomcat можно ознакомиться по этой ссылке: habrahabr.ru/post/101342. Но что делать, если мы используем только Java SE и нам нужно организовать многопоточный доступ к базе данных по схеме Connection Pool. Ведь сервера приложений у нас в данном случае нет, следовательно, использовать Data Source мы не можем, а для создания соединений к бд нам придется скорее всего использовать java.sql.DriverManager. Можно еще использовать в замену данному подходу что-нибудь из этой статьи: docs.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html. Скорее всего кем-то данный подход уже реализовывался на Java, по крайней мере я не обнаружил такую реализацию в сети. И я решил изобрести свой велосипед. Было бы хорошо, если в поисковике при поиске Connection pool в Java выходила ссылка на эту статью, дополненную и отредактированную по комментариям и дополнениям от habr.ru, и эта статья была бы полезна кому-нибудь. Если стало интересно, то прошу под кат.
Читать дальше →

Исследуем и тестируем распределенные вычисления от Hazelcast

Время на прочтение6 мин
Охват и читатели8.2K
Продолжаем тестировать Hazelcast. В предыдущем посте мы познакомились с его очередями. А в этом мы более внимательно взглянем на его возможность распределенного выполнения задач.

Работать с данными гораздо эффективнее как можно ближе к ним, а не выкачивать «к себе», потом считать и\или изменять и отправлять обратно в распределенное хранилище. Именно такую возможность нам предоставляет Hazelcast в виде распределенной реализации ExecutorService. Можно управлять и тем, на каких серверах хранить данные, группируя их по общему ключу, и запускать задачи на нужных серверах, используя тот-же ключ.

Мы попытаемся выяснить — так ли это и есть ли какие подводные камни?

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

Изучаем Java EE 7

Время на прочтение1 мин
Охват и читатели52K
Когда-то мы проводили на Хабре опрос по поводу издания книги "Изучаем Java EE 7". В прошлом месяце наконец-то она вышла в свет.

Аннотация:


Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java.
Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода.
Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP). В ней вы найдете максимально ценную информацию, изложенную с точки зрения эксперта по технологиям Java для предприятий.
Читать дальше →

Отладка Java приложения, которое нельзя остановить. Ловим экзотику выполнения самыми доступными средствами — BTrace подход

Время на прочтение5 мин
Охват и читатели18K

Java приложения — значит в современном Java мире возможность встретить такое процентов на 90%, а то и больше (рассматриваем самые распространённые окружения, HotSpot based JVM версии от 1.6)
которое нельзя остановить — приложение работает, и перезапускать его по тем или иным причинам категорически нельзя
экзотика — нечто такое этакое, что не каждый день в голову взбредёт поймать (определённая последовательность вызова методов, диковинные комбинации значений параметров, ...)
доступными средствами — бесплатно, работоспособно, эффективно, легко, просто и т.д и т.п. В данной статье рассмотрен замечательный инструмент BTrace kenai.com/projects/btrace

И само собой в код Java приложения заранее ничего специально не добавлено касательно средств дебага…

Как же это ?...

Spring: Реализация TaskExecutor c поддержкой транзакций

Время на прочтение7 мин
Охват и читатели22K
Spring, позаботившись о разработчиках, предлагает удобный и простой фасад для взаимодействия с менеджером транзакций. Однако всегда ли стандартного механизма будет достаточно для реализации изощрённых архитектурных идей? Очевидно — нет.

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

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

Нагрузочное тестирование базы данных. ContiPerf + DBUnit

Время на прочтение4 мин
Охват и читатели15K
Ниже представлен опыт нагрузочного тестирования базы данных с использованием JUnit и ассоциированных с ним DBUnit и ContiPerf.

ContiPerf

ContiPerf — утилита, которая позволяет использовать JUnit4 для нагрузочных тестов. Проста в использовании, легко и разнообразно настраивается. Использует Java аннотации для задания настроек теста и требований выполнения, создает подробный отчет в виде html файла с графиком распределения времени выполнения. Требует использование Java не ниже 5 версии и JUnit не ниже версии 4.7.

DBUnit

DBUnit — расширение для JUnit, упрощающее тестирование программ, работающих с бд. Впрочем, вполне популярен и в представлении не нуждается, поэтому ограничусь ссылками: знакомство для начинающих, упоминания на хабре.
Читать дальше →

Расширенный материал по Java 8

Время на прочтение4 мин
Охват и читатели53K
Не секрет, что многие Java-программисты, начиная свой путь в индустрии, уделяют большое внимание «тяжелым» технологиям — OpenJPA, Spring, JAX-RS, EJB, WS-*,… Это дает возможность как скорее влиться в современные корпоративные проекты, так и максимизировать скорость роста зарплаты.

Многие из них в конце концов «спускаются» до технологий лежащих в основе указанных фреймворков — JDBC, Servlet API, NIO/NIO.2. Однако прискорбно, что зачастую не остается время на детальное изучение самого языка и возможностей платформы.

Речь идет не о тонкостях или экзотике, а о том, что составляет существенную часть работы фреймворка: Servlet-контейнер использует множественные ClassLoader-ы, JPA2-провайдер использует манипулирование байткодом, абсолютное большинство библиотек используют Reflection API, всеобщее использование Generics только «усугубилось» с появлением функциональных интерфейсов (java.lang.function.*) и лямбд.

На недопонимание изначальной платформы (ClassLoader, Reflection API) накладываются «новвоведения» Java 5 (Generics), а теперь еще и Java 8 (методы в интерфейсах, ссылки на методы, лямбды, Stream API, JSR 308: Pluggable Type Systems). Надо обратить внимание на то, что Generics + Java 8 — это не просто языковые фичи, это частично переход к функциональному стилю программирования.

Также я веду курс «Scala for Java Developers» на платформе для онлайн-образования udemy.com (аналог Coursera/EdX).

Я собрал определенное количество полезных (на мой взгляд) ссылок по следующим темам
  1. Методы в интерфейсах, ссылки на методы, множественное наследование
  2. Лямбды (Project Lambda)
  3. Stream API
  4. Функциональные алгоритмы
  5. Аннотации
  6. Генерики
  7. Reflection API
  8. Загрузка классов

Надеюсь кто-то сочтет их полезными.
Читать дальше →

Знакомство с сервисами передачи сообщений PHP

Время на прочтение8 мин
Охват и читатели14K
Узнаем больше о тонкостях основных сервисов передачи сообщений, доступных в PHP.

  1. Семафоры
  2. Gearman
  3. JMS с PHP через QUERCUS
  4. JMS с PHP через PHPMQ->MANTARAY


1. Семафоры


Semaphore представляет собой модуль PHP, который фактически состоит из трех расширений, которые включает семафоры, разделяемую память и межпроцессный обмен сообщениями (IPC). Этот модуль предоставляет оболочки для семейства System V IPC функций и чтобы использовать его в PHP, вам необходимо включить его, потому что он не является включенным по умолчанию, поэтому для включения поддержки System V семафоров PHP используйте опцию --enable-sysvsem; чтобы включить поддержку разделяемой памяти System V скомпилируйте PHP используя опцию --enable-sysvshm; и для того, чтобы включить поддержку сообщений System V скомпилируйте PHP используя опцию --enable-sysvmsg.
Читать дальше →

Исследуем и тестируем очереди от Hazelcast

Время на прочтение5 мин
Охват и читатели44K
Многие из нас слышали о Hazelcast. Это удобный продукт, который реализует различные распределенные объекты. В частности: key-value хранилища, очереди, блокировки и т.д. К нему в целом применяются утверждения о распределенности, масштабируемости, отказоустойчивости и другие положительные свойства.

Так ли это применительно к его реализации очередей? Где границы их использования? Это мы и попытаемся выяснить.
Читать дальше →

Ближайшие события

Zetes: Java с мультиплатформенным GUI, но без Oracle JVM

Время на прочтение26 мин
Охват и читатели33K
image

Аннотация


В статье описывается фреймворк, позволяющий создавать графические кроссплатформенные приложения, написанные на языке Java, но при этом абсолютно не зависящие ни от Oracle JRE, ни от OpenJDK. Основная идеология фреймворка — по возможности снять с разработчика заботы об обеспечении «родного» look and feel для приложения под каждой операционной системой.

Фактически, на выходе вы получите исполняемый файл, опирающийся только на системные API, на котором нигде не будет клейма «написано на Java».

Все компоненты фреймворка имеют либеральные лицензии (BSD либо Apache), что позволяет использовать их в любых (в том числе, коммерческих) разработках.

Фреймворк находится в стадии публичной alpha-версии, что означает некоторую его работоспособность, но непроверенность. Использование поощряется (я постараюсь прислушаться к жалобам на проблемы и помогу их решить), но работоспособность не гарантируется.

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

Всех интересующихся подробностями милости прошу под кат.
Что же это за штука диковинная?

Реактивное программирование под Android

Время на прочтение10 мин
Охват и читатели90K
Отказоустойчивость, отзывчивость, ориентированность на события и масштабируемость — четыре принципа нынче популярного реактивного программирования. Именно следуя им создаётся backend больших систем с одновременной поддержкой десятков тысяч соединений.

Отзывчивость, простота, гибкость и расширяемость кода — принципы, которые можно закрепить за реактивным UI.

Наверняка, если совместить реактивные backend и UI, то можно получить качественный продукт. Именно его мы и попытались сделать, разрабатывая 2GIS Dialer — звонилки, которая работает через API и при этом должна оставаться быстрой и удобной.


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

Function Pointer — забытая реализация шаблона Singleton

Время на прочтение4 мин
Охват и читатели13K
Много статей написано о том, как правильно реализовывать на Java шаблон проектирования Singleton.

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

Лично я считаю единственным корректным способом реализации синглтона на Java так называемый Synchronized Accessor:

public class Singleton {
    private static Singleton instance;
    
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}


Именно так задумывали реализацию подобной задачи авторы виртуальной машины Java, именно такая реализация используется в стандартной библиотеке классов языка Java. Если же для программы метод доступа к синглтону становится узким местом, то это повод для того, чтобы произвести редизайн программы, чтобы она обращалась к глобальному объекту не так часто.

Однако, пытаясь освежить в памяти возможности Java concurrency, я почитал старые статьи о вариантах синглтонов и удивился, что не нахожу описания еще одного способа, который я называю Function Pointer.
Читать дальше →

Spring Security Hello World Java Config

Время на прочтение11 мин
Охват и читатели103K
Привет всем!

В этом материале мы постараемся написать приложение защищенное Spring Security с применением Java Config (подхода на основе использования аннотаций и классов для настройки контекста Spring приложения) вместо XML.

Используемые Технологии


  • Spring 4.0.5 Release
  • Spring Boot 1.0.1
  • Spring Security 3.2.3 Release
  • Maven
  • Tomcat 8
  • Servlet Api 3.1
  • Java 1.8


Это будет очень простое веб приложение, Hello World на базе Spring MVC и Spring Security. Все настройки мы осуществим используя только Java классы, без единой строчки конфигурации в XML.

Подробности

Spring MVC — JavaConfig либо конфигурация проекта без XML файлов

Время на прочтение6 мин
Охват и читатели102K
Доброго времени суток уважаемые хабравчане. Как-то мне пришлось писать небольшой проект, так как у меня была возможность свободного выбора технологий я решил использовать Spring Framework. Сразу же хочу сказать я не являюсь гуру в данном фреймворке, и буду благодарен правкам.

Немного поискав на хабре, я не смог найти именно того о чем хочу вам сейчас рассказать и продемонстрировать. Поэтому решил написать пост на данную тему. Речь пойдет о JavaConfig, а именно о том как сконфигурировать Spring MVC проект не используя *.xml конфигурации, например: (mvc-dispatcher-servlet.xml).
Читать дальше →

Лабораторные по многопоточности в Java: Parallel Copy

Время на прочтение4 мин
Охват и читатели27K
Хорошие лабораторные по многопоточности (простые, понятные, нетривиальные и полезные в народном хозяйстве) — большая редкость. Предлагаю Вам одно условие и четыре лабораторные работы по элементарной многопоточности на Java.

Также я веду курс «Scala for Java Developers» на платформе для онлайн-образования udemy.com (аналог Coursera/EdX).

Условия


Это реализация однопоточного побайтового копировальщика из InputStream в OutputStream. Копирование происходит в потоке вызвавшем метод copy(...)
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class CopyUtil {
    public static void copy(InputStream src, OutputStream dst)throws IOException{
        try (InputStream src0 = src; OutputStream dst0 = dst) {
            int b;
            while ((b = src.read()) != -1) {
                dst.write(b);
            }
        }
    }
}

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

Программирование под Android. 2-е изд

Время на прочтение1 мин
Охват и читатели20K


Всем привет. Когда-то мы делали небольшой обзор книги "Программирование под Android". В этом посте мы хотели бы напомнить об этой замечательной книге и предложить скидку 25% на второе обновленное издание. Код купона — e14641e7. Акция действует до 1-го июля.

Книга доступна в электронном формате (PDF, ePub) и печатном.