/*айтишные заметки*/
Связывание данных - JAXB.
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlAttribute; @XmlRootElement(name="auto") public class Auto { private Boolean newAuto; private String autoMarka; private String autoModel; private Integer horsePower; @XmlAttribute(name = "new") public Boolean getNewAuto(){ return newAuto; } public void setNewAuto(Boolean value){ newAuto = value; } @XmlElement(name = "marka",required = true) public String getAutoMarka(){ return autoMarka; } public void setAutoMarka(String value){ autoMarka = value; } @XmlElement(name = "model") public String getAutoModel(){ return autoModel; } public void setAutoModel(String value){ autoModel = value; } @XmlElement public Integer getHorsePower(){ return horsePower; } public void setHorsePower(Integer value){ horsePower = value; } }
JavaEE: EJB компонент на Jboss 7.1.
Dropbox API (Java SE).
Dropbox предоставляет множество библиотек на разных языках, для доступа к API. А если вы собираетесь работать на более низком уровне - пожалуйста, есть детальное описание REST API. В целом, все подробно документировано, но перейдя по ссылке Tutorial для Java SDK, видим руководство к Android SDK. На вопрос, где руководство к Java SDK, ответ простой: "Where are the Java instructions? For platforms other than Android, all you need is to download and uncompress the latest version of the Java SDK from Development kits. Include everything in the lib folder on your project's build path." Все конечно так, добавляем библиотеки в проект, кроме этого ничего не надо. Вместе с SDK идет и пример, но не совсем такой, как хотелось бы. Небольшая неясность, на первый взгляд, с Java SDK связана с "политическими" соображениями на данный момент. Приведу элементарный пример использования Dropbox API, для Java SE.
Автоматизация маппинга XML - Java.
<data type="dictionaries"> <dictionary name="buildings"> <itemnum>2</itemnum> <comment>Buildings</comment> <element> <id>0</id> <name>building 1</name> <cost>10000.50</cost> </element> <element> <id>1</id> <name>building 2</name> <cost>20000.50</cost> </element> </dictionary> </data>
<test-object> <items type="available browsers"> <item> Firefox </item> <item> Opera </item> <item> IE </item> <item> Chrome </item> </items> <use-browser version="12"> Opera </use-browser> </test-object>
Конвертация PDF в HTML на Java.
Coursera.org для программистов.
Рефлексия в Java - несколько примеров.
Одним из следствий популярности Java является несметное количество библиотек для этого языка, на все случаи жизни. Ввод/вывод, работа с файловыми архивами, парсеры различных форматов данных и прочее. Java - язык созданный для программистов, ориентированный в том числе на скорость разработки. Множество доступных библиотек делают разработку еще более быстрой. Кроме того, во многих случаях это снижает вероятность появления типичных ошибок в коде. Хочу привести четыре Java библиотеки, которые хорошо зарекомендавали себя на практике, которые мне приходилось использовать чаще всего при работе с Java SE и которые мне понравились больше всего. Само собой - вы можете найти еще множество хороших библиотек, которые подходят именно вам, а возможно - заменяют приведенные библиотеки.
Apache Commons IO
Сайт: http://commons.apache.org/proper/commons-io/
Проект Apache Commons включает в себя очень много составляющих и Commons IO - лишь малая часть. С одной стороны - это настолько популярная библиотека, что наверное не нуждается в представлении. Но с другой - ее просто нельзя не упомянуть! Apache Commons IO, как можно догадаться по названию, служит для задач ввода/вывода. Широко и давно используется в мире Java, а значит - хорошо отлажена.
Посмотрим на пару элементарных примеров c классами IOUtils и FileUtils.
Класс IOUtils служит для работы с классами InputStream, OutputStream, Reader и Writer. Класс FileUtils служит для работы с классом java.io.File. Для того чтобы считать текст из файла с заданной кодировкой UTF-8, нужно написать примерно следующее:
public String readTextFromFile(String path) throws Exception { final String ENCODING = "UTF-8"; return FileUtils.readFileToString(new File(path), ENCODING); }
Когда меня попросили помочь сделать/найти игру в крестики-нолики на Java с графическим UI (для двух игроков) - первым делом я погуглил на предмет наличия готового и пристойно реализованного сабжа. Возможно я плохо искал, но все что мне попадалось было сделано плохо. Где-то размер игровой доски задан жестко, в большинстве найденных примеров на Java Swing - вся логика игры неподобающим образом смешана с пользовательским интерфейсом. В сети выложено немало реализаций этой игры, но почему бы не добавить еще одну?
Итак, в этом примере для создания пользовательского интерфейса используется Swing. Размер игровой доски 5x5:
Для выигрыша необходимо составить непрерывную линию из крестиков или ноликов длиной в 5 элементов. Врочем, размер поля и длину линии, которую нужно составить для выигрыша, можно легко изменить. Как видно на скриншоте, здесь используется тема Nimbus, которая включаена в JRE начиная с Java SE 6 Update 10. Структура проекта выглядит так:
В пакете ru.spbstu.tictactoe - классы, необходимые для создания графического интерфейса; в пакете ru.spbstu.tictactoe.common - классы, необходимые для создания игры в крестики-нолики, которые не привязаны к представлению (UI). Класс GameBoard является представлением игрового поля для игры в крестики-нолики, а также содержит все необходимые для реализации игры методы:
UPDATE: Возможно вам будет интересен пример использования Spring Security 4 и AngularJS.
Spring Security - фреймворк, предоставляющий удобную реализацию механизмов аутентификации и авторизации в Java EE приложениях. Раньше был известен как Acegi Security, а в 2008 году был включен в проект Spring. Является стандартом де-факто для веб-приложений Spring MVC. Использовать Spring Security очень удобно и просто - без особых усилий можно создать гибкую систему управления правами в вашем веб-приложении.
Для того, чтобы показать как это работает - приведу простой, но подробный пример приложения, которое использует Spring Securtiy. Приложение будет состоять из страницы входа и закрытой страницы, доступ к которой имеет только один пользователь. Как нетрудно догадаться, это будет веб-приложение Spring MVC. Итак, цель поставлена, инструменты определены, приступаем к делу!
Для примера создаем шаблонный проект веб-приложения Spring MVC, используя Spring Tool Suite (File > New > Spring Template Project > Spring MVC Project ).
После этого у нас уже есть простое веб-приложение, которое можно запустить на сервере (ссылку на полный код примера можно найти в конце поста). Первое что необходимо сделать - добавить в pom.xml необходимые зависимости:
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>${org.springframework-version}</version> </dependency>
Расстояние Левенштейна между двумя строками - это минимальное количество операций вставки одного символа, удаления одного символа и замены одного символа на другой, необходимых для превращения одной строки в другую [Википедия]. Например, есть строки:
"text" и "text!"
Для того чтобы первую строку превратить во вторую, нужно добавить к ней символ "!", и наоборот - для того чтобы превратить вторую в первую - нужно удалить из нее восклицательный знак. Иными словами, нужно выполнить одну операцию. Это значение и называют расстоянием Левенштейна. Зачем используется такое понятие? Расстояние Левенштейна имеет множество практических применений. Например - различные утилиты, которые предназначены для мержа файлов исходного кода, утилита для сравнения текстов diff в Linux, нестрогое сравнение текстов - когда нужно "примерно" сравнить две порции текстовых данных, и прочее.
Сeгодня получил от Google письмо счастья, о том что Google Code в скором времени полностью прекратит свое существование, с рекомендацией перенести свои проекты куда-нибудь в другое место, например GitHub. Давным давно я сделал один проект, который сейчас казалось бы некуда деть, но он находится на Google Code. Хотелось бы сохранить этот код, поэтому решил перекинуть его на BitBucket.
BPlist2Xml - это конвертер формата Property List, который используется продуктами Apple для хранения различных настроек и т.п. Написана эта программа, прости господи, на pascal (использовался Free Pascal). Суть в том, что документ формата Property List бывает двух типов - обычный XML документ и сжатый бинарный формат. Для того, чтобы читать и редактировать последний, есть специальные редакторы. Если кому-нибудь, неизвестно для чего, понадобиться производить манипуляции с бинарным plist используя например Delphi, эта реализация - единственная, насколько мне известно, на этом языке.
Скачать (исходный код и бинарники)
UPDATE: Возможно вам будет интересен пример использования Spring Security 4 и AngularJS.
Я уже упоминал про JavaEE фреймворк Spring Security и приводил простой пример его использования. Этот пример включает в себя создание веб приложения с двумя страницами - страница логина и закрытая страница. Для авторизации, как ясно, там используется Spring Security. Однако имя пользователя и пароль (точнее SHA-1 хэш) в этом примере хранятся в XML файле настройки контекста Spring Security. Понятно, что в реальных задачах данные пользователя, как и его роли, хранятся в базе данных.
В этом посте я хочу привести усовершенствованный пример, в котором имя пользователя, хэш пароля и роль пользователя в системе будут храниться в БД Mysql. Для основы возьму код предыдущего примера, а полный код для этого поста можно найти ниже.
Итак, как можно связать авторизацию с помощью Spring и Mysql. Сделать это можно немного по разному, посмотрим на один из способов. Первым делом установим Mysql и создадим тестовую БД, в которой будет одна таблица. В таблице содержится имя пользователя, название его роли в системе, и хэш пароля. Обычно в БД хранят и другую информацию - например дату, до которой аккаунт активен и пр. Но в этом примере этого не будет.
Codenvy - облачная IDE для Java и не только
В поисках стоящей облачной IDE для JavaEE наткнулся на интересный проект - Codenvy. Codenvy это полнофункциональная облачная среда разработки, которая поддерживает различные языки и платформы. Поскольку меня интересовала именно возможность разработки веб-приложений JavaEE, я расскажу свои впечатления именно об этом.
В процессе поиска, я посмотрел на разные облачные IDE, но это первый и единственный проект, который мне действительно понравился. Во первых, мне хотелось получить именно IDE, а не просто модный_текстовый редактор аля Sublime Text. Во вторых, мне хотелось чтобы среда позволяла вести отладку JavaEE приложений, используя например Tomcat. Так вот, что мы имеем с Codenvy.
Codenvy поддерживает много платформ - Tomcat, Jboss и пр. Разумеется, можно запустить и standalone Java проект, собрав его с помощью Maven. Можно импортировать готовый Maven-проект, сделанный например в Eclipse. После чего останется лишь выбрать чем проект собирать (я выбрал maven) и на чем запускать (я выбрал Tomcat). После таких минимальных настроек, проект сразу запустился! В IDE есть:
Впечатления о Junction Hackathon 2015
Junction 2015 - хакатон, проходивший в Хельсинки 6-8 ноября 2015 года. Мне посчасливилось быть одним из тех, кто принял участие в этом событии, посему делюсь небольшим отчетом.
Junction - масштабное мероприятие, которое собирает сотни участников из множества стран. Организатором хакатона является сообщество Aaltoes (некоммерческая организация, которая объединяет студентов университета Аалто и занимается международным сотрудничеством). Также среди спонсоров и организаторов хакатона - Finnair, Uber, Microsoft, Shopify, RailsGirls, Klarna и др.
Из СПб на Junction.
Из России на хакатон поехали 18 человек. Организаторы предоставили автобус из Санкт-Петербурга, как и размещение в гостинице, за что им отдельное спасибо =). Народу было много, общее число участников хакатона составило 459 человек. Кто-то определился со своим проектом заранее, а кто-то (как я например) не готовился вообще. Кто-то ехал за главным призом - 20000 евро, и участием в Slush 2015 - мероприятие, которое собирает стартапы и инвесторов. "Билет" на Slush, который происходит также в Хельсинки, сразу после Junction получили лучшие проекты. Кто-то приехал на Junction не с целью победить и взять главный приз, а ради участия, общения, саморазвития и атмосферы хакатона.
В пятницу вечером мы добрались до места проведения хакатона - недалеко от центра Хельсинки, в здании бывшей котельной:
Spring Framework можно назвать стандартом де-факто в мире Java. Еще бы, ведь некоторые концепции, реализованные в этом фреймворке повлияли на саму спецификацию JavaEE. Spring Security является дочерним проектом Spring, и предоставляет средства аутентификации и авторизации для Java/JavaEE приложений. С другой стороны, в мире фронтенда победил JavaScript и фреймворки, позволяющие создавать SPA веб-приложения - AngularJS, ReactJS, BackboneJS и другие. Я хочу привести пример, как можно успешно использовать Spring Security 4 совместно с Angular. В этом примере мы напишем REST бекенд, используя Spring MVC. Также мы реализуем аутентификацию и авторизацию с помощью Spring Security, в то время как на фронтенде будет использоваться AngularJS.
В целом, пример больше всего ориентирован на backend составляющую. Используя описанный принцип, можно аналогично использовать какой-нибудь другой фреймфорк для фронтенда (например Angular 2). Итак, нашей целью будет создать веб-приложение с несколькими разделами - открытый раздел и два защищенных раздела, в которые имеет доступ только авторизованный пользователь. Все должно работать через AJAX и должна быть функция "запомнить меня".
В примере будет использоваться Java 8, Tomcat 8, Spring 4.3, Spring Security 4.1, AngularJS 1.4.9. В конце поста вы можете найти ссылку на полный код проекта.
Однажды я столкнулся с ситуацией, когда мне нужно было быстро сделать функционал для печати одного отчета из Java, который был несложен по структуре данных, но должен был быть красиво оформлен (с определенными шрифтами, изображением и т.п.). Если формировать PDF программно из Java, этого добиться сложно. Как правило, для печати PDF отчетов по шаблону, в Java используются библиотеки вроде JasperReports, Apache PDFBox и пр. Следовательно, если использовать типичные библиотеки для формирования отчетов, то нужно в первую очередь разработать соответствующий шаблон отчета. И здесь я подумал: "один отчет, нужен дизайн шаблона. Быстро сделать дизайн? HTML/CSS!". Лень - двигатель прогресса. В итоге, я сделал печать PDF отчета на основе HTML шаблона. Приведу пример, который показывает, как можно получить PDF документ на основе HTML5 шаблона с произвольным дизайном. Разумеется, такой способ печати PDF не претендует на замену традиционных решений, но в некоторых случаях может быть полезен.
Итак, в качестве шаблона используется HTML5 документ, который определяет структуру и дизайн шаблона. Данные, которые необходимо отображть в PDF отчете будут заполняться в документе с помощью библиотеки JSoup. Затем, заполненный документ будет преобразовываться в PDF с помощью библиотеки Openhtmltopdf. В демонстрационном проекте будет использоваться следующая структура:
В папке fonts положим шрифт, который будем использовать в отчете (он необходим для формирования PDF документа). items_report.html - шаблон отчета. В папку print будет сохраняться итоговый PDF документ.