среда, 24 августа 2016 г.

Spring DI для servlet контейнера

Существует вероятность того, что потребуется в существующее приложение на сервлетах добавить допустим REST.
Реализаций REST несколько, наиболее популярные Spring MVC и Jersey. Spring нам дает в придачу механизм DI, что невероятно удобно.

Но нельзя так просто прикрутить REST. Дело в том, что скорее всего вам захочется предоставить REST данные используя уже написанный код. Популярной техникой является создание простого REST контроллера, который использует какой-то внутренний сервис для получения данных. А если этих сервисов много надо заиспользовать в одном REST контроллере, то тогда хорошо бы эти сервисы объединить под одним фасадом. Это нужно для того чтобы соблюдался single responsobility принцип.

В случае с REST контроллерами для спринга все просто - инжектим нужные сервисы и все. Сервисы создаются как бины в контейнере спринга. А вот как бы так вытащить эту функциональность из сервлетов, которая уже написана в бины спринга, да заинжектить эти бины обратно в сервлеты и чтобы код у нас не дублировался для REST контроллеров и для сервлетов?

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

Вот так можно в сервлете написать

public class MyServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Autowired(required = true) //@Qualifier("SettingsService") private SettingsService settingsService; public void init(ServletConfig config) { try { super.init(config); } catch (ServletException e) { e.printStackTrace(); } SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext()); } ... Нужно еще порядок загрузки поменять в web.xml. Сначала нужно инициализировать контекст спринга, а потом контекст сервлетов

понедельник, 11 июля 2016 г.

snmp v2c trap sending example with net-snmp

lets define MIB file in TRAP-TEST-MIB.mib.txt TRAP-TEST-MIB DEFINITIONS ::= BEGIN IMPORTS ucdExperimental FROM UCD-SNMP-MIB; demotraps OBJECT IDENTIFIER ::= { ucdExperimental 990 } demo-trap TRAP-TYPE STATUS current ENTERPRISE demotraps VARIABLES { sysLocation } DESCRIPTION "This is just a demo" ::= 117 END
lets start snmptrapd to recieve trap snmptrapd -c snmptrapd.conf -A -n -f -Lo -M D:\snmp_trap_example\mibs -m +TRAP-TEST-MIB
lets send trap snmptrap -M D:\snmp_trap_example\mibs -m +TRAP-TEST-MIB -v 2c -c public localhost 0 TRAP-TEST-MIB::demotraps SNMPv2-MIB::sysLocation.0 s "Hey, man!"

воскресенье, 10 июля 2016 г.

Simple upload server on python

Небольшой сервак на питоне для аплоада

Very simple HTTP server in python. Usage:: ./dummy-web-server.py [] """ from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer import os import time import subprocess python_dir = "" python_script_name = "simpleUploadServer.py" log_file_name = "simpleUploadServer.log" class SimpleHandler(BaseHTTPRequestHandler): upload_dir = "upload" def _set_headers(self): self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() def do_GET(self): self._set_headers() self.wfile.write("GET") def do_HEAD(self): self._set_headers() def do_POST(self): self.log_message('%s', "POST request") self.log_message('%s', self.headers) if self.path.startswith('/upload'): if 'content-length' not in self.headers: self._set_headers() self.log_message('%s', 'warning: no "content-length" header') self.send_response(406) return length = self.headers['content-length'] data = self.rfile.read(int(length)) url_path_name = self.path.split('/upload',1)[1] url_path_array = url_path_name.split('/') file_path = os.path.join(os.getcwd(), self.upload_dir) for f in url_path_array: file_path = os.path.join(file_path, f) millis = int(round(time.time() * 1000)) self.log_message('%s', 'POST upload ' + url_path_name + ', time: ' + str(millis) + 'ms') self.log_message('%s', 'upload file "' + file_path + '"') if not os.path.exists(os.path.dirname(file_path)): os.makedirs(os.path.dirname(file_path)) time1 = time.time() with open(file_path, 'wb+') as fh: fh.write(data) time2 = time.time() self.log_message('%s', 'file uploaded: "' + str((time2 - time1) * 1000) + 'ms') self.send_response(200) else: # Doesn't do anything with posted data self._set_headers() self.wfile.write("POST") def log_date_time_string(self): """Return the current time formatted for logging.""" from datetime import datetime return str(datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]) def run(server_class=HTTPServer, handler_class=SimpleHandler, port=8000): server_address = ('', port) httpd = server_class(server_address, handler_class) print('Starting httpd...') httpd.serve_forever() def start(): stop() from win32process import DETACHED_PROCESS process = subprocess.Popen([python_dir + 'python', python_script_name, 'daemon'], shell=True, creationflags=DETACHED_PROCESS) def stop(): title = python_dir + 'python ' + python_script_name + ' daemon' os.system('taskkill /f /t /fi "WINDOWTITLE eq ' + title) def run_system(): os.system(python_dir + 'python ' + python_script_name + ' > ' + log_file_name + ' 2>&1') if __name__ == "__main__": from sys import argv if len(argv) == 2: if argv[1] == "daemon": run_system() else: run()

воскресенье, 22 декабря 2013 г.

Подготовка к сертификации Oracle Java. Oracle Certified Associate, Java SE 7 Programmer

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

Как только я стал разрабатывать программное обеспечение (и читать хабр :) ), у меня появилась зависть к знаниям и навыкам senior developer`ов. Сопутствующим знаниям атрибутом мне казались сертификаты. Конечно, я понимаю, что это не так. Бумаги лишь говорят, что ты что-то знаешь и сдал тестовый экзамен. Тем не менее, в идеализированном модельном мире, именно такие ачивементы являются индикатором знаний. Так же, как и диплом о высшем образовании должен являться показателем того, что ты квалифицированный специалист.

Чем больше погружаешься в сообщество разработчиков, больше проникаешься этой культурой, ценностями. После определенного времени проведенного в IDE, stackOverfow и на других ресурсах, я выбрал Java, как платформу на которой буду строить свою профессиональную деятельность. По нескольким причинам - во первых меня привлекла многогранность Java. Можно делать desktop-приложения, web-приложения, запускать их на различных платформах. Кроме того, Java позволяет обучиться настоящему Computer Science. С появлением Android теперь возможно легко сделать мобильное приложение на Java (да и до андроида был Java ME). Надо ли говорить, что воображение может нарисовать при таких возможностях? А если прибавить сюда зарплаты, которые получают Java-разработчики даже в регионах РФ, которые дают перспективы для социального лифта?

Конечно я уже давно задумал получить сертификаты по Java, прямо сразу как узнал про них. Для меня это стало почему-то важным. Может быть все дело в статьях о различных sucess story. Правда везде и все, кто их получил, пишут, что сертификат - это так, для галочки. Поэтому, я не сильно переживал за немедленное получение сертификатов. Тем более, что фактическое выполнение работы требует все-таки знаний другого рода.

пятница, 13 декабря 2013 г.

Восстановление базы Adempiere из дампа в Oracle

Это короткая заметка о том, как я восстанавливал из дампа схему пользователя adempiere. Нужна в первую очередь мне. Потому что я нечасто работаю с Oracle и забываю о том, как мне разворачивать дамп.

Исходные данные: есть экспортированный дамп схемы ADEMPIERE командой EXT.
Нужно развернуть у себя на локали эту схему для тестовых целей.

В моем случае я поступаю топорно, потому что не знаю о "правильных" средствах.

четверг, 28 ноября 2013 г.

JVisualVM: Local Applications Cannot Be Detected


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

четверг, 26 сентября 2013 г.

Oracle Database 11g восстановление пароля

Давно поставил Oracle Database на рабочую машину и конечно совершенно забыл пароль.
Поэтому пришлось задать пароли по новому для пользователей.

Для этого понадобилось зайти в SQL Command Line и выполнить некоторые команды:


sqlplus system/system
SQL*Plus: Release 11.2.0.2.0 Production on +Є Tхэ 26 14:07:25 2013 Copyright (c) 1982, 2010, Oracle.  All rights reserved. SQL> conn /as sysdba Connected. SQL> alter user system identified by system; User altered. SQL> disconn Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - Produ ction SQL> conn system/system Connected. SQL> disconn Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - Produ ction SQL>

Есть такой же способ. Можно из консоли запустить sqlplus C:\Users\anteastra>sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Thu Sep 26 15:19:29 2013 Copyright (c) 1982, 2011, Oracle.  All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> alter user system identified by system; User altered. SQL>

суббота, 6 апреля 2013 г.

Пример работы с HSQLDB



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

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

воскресенье, 24 марта 2013 г.

Интересные образовательные ресурсы IT

http://try.jquery.com/ - интерактивный, увлекательный учебник jquery.
http://pcottle.github.com/learnGitBranching/ - интерактивная обучалка Git
http://git.geekjob.ru/ - русскоязычный сайт для изучения Git
http://superherojs.com/ - статьи по Javascript


Материалы по верстке:
http://www.canonium.com/articles/tutorial-css-grid-theory
http://www.canonium.com/articles/tutorial-css-grid-build

Программируем на Java NASA style

6 Августа я сопереживал команде NASA, управляющей посадкой марсохода Curiosity. Эти непередаваемые "7 минут ужаса" сделали меня отчасти причастным к технологическому прогрессу человечества. И было приятно осознавать, что со мной вместе наблюдают и ожидают первых фотографий более 200 000 человек онлайн и центр управления полетами NASA.

А недавно NASA порадовала тем, что у нее есть свой Java coding standart http://lars-lab.jpl.nasa.gov/. И я о нем обязательно еще поговорю, но сейчас я просто оставлю этот файл здесь.

Java coding style (NASA)

вторник, 12 февраля 2013 г.

План изучения J2EE и веб программирования


26 января 2013 года состоялся вебинар "Пошаговый план изучения J2EE и веб программирования" Тимур Батыршинова. Я захотел посетить его с целью немного расширить кругозор и по возможности узнать ответы на некоторые свои вопросы. Так сказать взглянуть на свой прогресс со стороны. Предыдущий вебинар по Java был о настолько элементарных темах, что у меня заранее не было иллюзий получения ответы на все вопросы. Но даже если узнать немного "живой" информации, это уже хорошо. Поэтому я выделил время и теперь вкратце изложу суть презентации, прибавлю свои комментарии.

четверг, 20 декабря 2012 г.

JasperReport в Adempiere: добавляем динамики в отчет с помощью scriptlet

Механизм JasperReport позволяет подключать внешние классы java для генерации контента отчета. Конечно, полностью изменить структуру страницы, заданной в jrxml файле, мы не можем. Однако возможность влиять на наполнение отчета данными все-равно очень сильно увеличивает  динамичость.

Эти классы называются скриптлетами. В этой статье я покажу как сделать простой скриптлет.

среда, 19 декабря 2012 г.

JasperReport в Adempiere: создание отчета

Adempiere предлагает для создания различных отчетов использовать JasperReport. В нескольких статьях я хочу осветить вопрос создания отчета, добавление динамики с помощью scriptlets, и добавление поддержки русского языка в отчет.

Все это будет применительно к Adempiere, хотя эти приемы можно использовать в различных случаях. Темы, касающиеся элементов отчетов jasper, здесь рассматривать не буду.
Для начала установим iReport. Его можно скачать с сайта http://community.jaspersoft.com/project/ireport-designer 

вторник, 11 декабря 2012 г.

Клиент JAVA для web service ЦБ РФ

Чтобы получить курс валют за любое число, можно сделать клиент веб сервиса. Но есть некоторые нюансы при использовании стандартных компонент Java. Сам сервис располагается по адресу http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx. Здесь представлен один из способов получить данные.

Создаем стандартный проект в eclipse  идем в консоли в корень проекта и выполняем команду.

wsimport -d bin -s src http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL

четверг, 6 декабря 2012 г.

JAVA библиотека padeg

В свободный доступ вышла библиотека padeg. Она позволяет склонять имена, фамилии и нарицательные имена в нужном падеже. В сети встречается сравнение различных библиотек склонения. Эта библиотека имеет процент ошибок 2,5%. В то время как платный аналог за 50000 руб. на сервер имеет 1% ошибок. Прикрепляю библиотеку и пример использования.

Пример можно посмотреть здесь:
https://test-rlab.rhcloud.com/

padeg-3.3.0.24-javadoc.jar
padeg-3.3.0.24.jar

Пример кода под катом

пятница, 31 августа 2012 г.

Adempiere: установка среды разработки


Тем, кто хочет научиться программировать на Java сразу приходят в голову вопросы - какие программы написаны на этом языке? Как посмотреть их исходный код? Что можно сделать с помощью Java? В этой статье я покажу программу, которая выполняет функцию ERP-системы, написана на Java и работает в двух режимах: как сервер и как десктопное приложение.
Для новичка установка и развертка среды для разработки Adempier представляет собой тернистый путь. Этот путь усеян множеством кочек, о которых начинающий программист Adempiere обязательно споткнется. В настоящее время я не нашел хорошего примера, который бы показал различные нюансы при установке Adempiere и этим руководством я собираюсь исправить сей факт. Объем получился довольно большим, руководство содержит много иллюстраций. Это руководство хорошо подойдет тем, кто хочет самостоятельно посмотреть, что такое мир Open Source, тем, кто еще только хочет стать программистом Java и начинающим разработчиком. Даже если вы не собираетесь заниматься разработкой для Adempiere, это руководство будет полезным, так как в нем рассматриваются многие темы, так или иначе встречающиеся в профессиональной деятельности разработчика.
Инструменты, которые будут использоваться:

  • Windows 7
  • Postgres 9.1
  • Adempiere 3.7.0LTS
  • JDK 1.6
  • Eclipse
  • TortoiseHG