Страницы

25 октября 2016 г.

Профессиональные навыки java-программиста за которые ПЛАТЯТ

На досуге сел и проанализировал вакансии компаний которые ищут java-программистов и готовы платить 200 000 - 540 000 р.

Вот summary моего анализа: 
  • Опыт: 5-8 лет
  • Технологии java: hibernate, JPA, Spring, JMS, J2EE (EJB, JPA, JTA, Servlet, JSP, JAX-WS), multithreaded/concurrent programming, In-Memory Data Grid;
  • Сторонние технологии: AWS;
  • Архитектура: Microservices, SOA (service-oriented architecture), EDA (Event-driven architecture), шаблоны проектирования.
  • NoSQL: MongoDB, Cassandra;
  • Реляционные БД: MSSQL, MySQL, Oracle, Postgres
  • Навыки: Технологии и практики разработки программного обеспечения уровня enterprise (высоконагруженные распределенные системы), развертывание виртуальных окружений (Docker), тестирование (+автоматическое), управление сетями, разговорный английский язык, TDD/BDD;
  • Методологии разработки: Agile (scrum, kanban);


Учитесь и развивайтесь!
Удачи :)

8 сентября 2016 г.

11 августа 2016 г.

Чем можно заменить JMS?

Для начала, сайт, где можно изучить варианты:
http://queues.io/


  1. Local BlockingQueue (локальная передача данных);
  2. Apache Camel (channel "seda" = blockingQueue) (локальная передача данных);
  3. Spring Integration (channels) (локальная передача данных);
  4. ZookKeeper + Curator (распределенная передача данных);
  5. Hazelcast;
  6. Redis (Jedis для Java), простой продюсер и консьюмер, (можно настроить persist, есть локальные очереди на случаи сбоев (rpoplpush)) + можно добавить кластера в для увеличения памяти. Есть репликация;
  7. ZeroMQ. Обертка над сокетом. Низкоуровневый обмен.
  8. AMQP with RabbitMQ;
  9. Amazon SQS. Просто, дорого. Есть драйвер для JMS без драйвера.
  10. Kafka - самый интересный вариант. Кластеризация с помощью ZooKeeper.

Youtube links:


Ошибка java.lang.NoSuchFieldError: WRITE_DURATIONS_AS_TIMESTAMPS.

Использую jackson-databind версии 2.8.1.. При деплое вылазит ошибка java.lang.NoSuchFieldError: WRITE_DURATIONS_AS_TIMESTAMPS.
В моем случае проблема возникала из-за того, что в WildFly 8.2 в системных модулях лежит  jackson-databind версии 2.4, и при деплое, во время создания ObjectMapper, classLoader этого класса указывал именно на модуль WildFly, а не на зависимость из pom.xml.
Лечится просто:
В boss-deployment-structure.xml просто эексклудим подсистему jaxrc (если она вам конечно не требуется). Это исключит подтягивание заисимостей из модуля при деплое.

<exclude-subsystems>
<subsystem name="jaxrs" />
</exclude-subsystems>


7 августа 2016 г.

Wildfly + HornetQ. JMS. Record is too large to store

Record is too large to store


Актуально для Wildfly 8.2. На более поздних версиях не проверялось.

Данная ошибка возникает в том случае, если входящее сообщение имеет размер более чем размер указанный в настройке journal-file-size, и менее чем указанный min-large-message-size, при включенном персисте (persistence-enabled = true). Настройки в параметрах указываются в байтах.

Вторая причина возникновения этой ошибки - разные настройки на отправителе и получаете сообщений. Дело в том, что параметризует сообщение именно отправитель, и если у него, например, выключен персист  (persistence-enabled = false), то все сообщения параметризуются как "обычные" (не large). Получатель считывает первый байт, и таким образом определяет тип сообщения установленный отправителем. Т.е. если отправитель будет помечать все сообщения как "обычные", то получатель будет их обрабатывать как обычные, не зависимо от настроек установленных на получателе. Это значит, что у вас не будет работать настройка min-large-message-size, получатель всегда будет пытаться поместить сообщение в файл журнала. Если сообщение окажется объемом больше размера файла журнала - мы получим Record is too large to store.




2 августа 2016 г.

Amazon S3 java sdk. Подключаемся локально к minio.

https://minio.io/ - это локальный аналог amazon s3.
Все инструкции по его использованию есть на сайте.

Мы имеем amazon s3 java sdk, и хотим применить его локально, без подключения к amazon.

Разворачиваем minio

Я делал так как описано здесь:
https://docs.minio.io/docs/minio-docker-quickstart-guide

После того как minio запущен нас интересует четыре параметра:

Endpoint:  http://172.17.0.2:9000  http://127.0.0.1:9000
AccessKey: GEUV76CPZT9W6LHD27WV
SecretKey: LFtXnspXOcUgZXbgxMb+OfjqedhXMa06zQ4xMQRT
Region:    us-east-1

Именно они понадобятся для создания соединения.

Подключение


public class AmazonS3ClientFactoryImpl implements AmazonS3ClientFactory {
    private static final String AMAZON_ACCESS_KEY = "GEUV76CPZT9W6LHD27WV";
    private static final String AMAZON_SECRET_KEY = "LFtXnspXOcUgZXbgxMb+OfjqedhXMa06zQ4xMQRT";
    public static final String REPOSITORY_ENDPOINT = "http://localhost:9000";

    public AmazonS3 getAmazonS3Client(){
        AWSCredentials credentials = new BasicAWSCredentials(AMAZON_ACCESS_KEY, AMAZON_SECRET_KEY);
        ClientConfiguration clientConfiguration = new ClientConfiguration();

        AmazonS3 amazonS3Client = new AmazonS3Client(credentials, clientConfiguration);
        Region usWest2 = Region.getRegion(Regions.US_EAST_1);
        amazonS3Client.setRegion(usWest2);
        amazonS3Client.setEndpoint(REPOSITORY_ENDPOINT);
        amazonS3Client.setS3ClientOptions(new S3ClientOptions().withPathStyleAccess(true).disableChunkedEncoding());

        return amazonS3Client;
    }
}

22 июня 2016 г.

jconsole. Wildfly 8. Remote connection failed?

Чтобы удаленный коннект в WildFly заработал, необходимо запустить jconsole в терминале (linux) со следующими параметрами:

jconsole -J-Djava.class.path=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/jconsole.jar:$JBOSS_HOME/bin/client/jboss-cli-client.jar

5 июня 2016 г.

Ubuntu 14.04 LTS. Netwiork manager умер... Ошибка: The overwriting error message was: Файл ключей не содержит группу «connectivity»

Если случилось (после обновления системы), делаем следующее:

1. Устройствами с доступом в интернет скачиваем пакеты:

http://ru.archive.ubuntu.com/ubuntu/pool/main/libn/libnl3/libnl-3-200_3.2.21-1_amd64.deb
http://ru.archive.ubuntu.com/ubuntu/pool/main/libn/libnl3/libnl-genl-3-200_3.2.21-1_amd64.deb
http://ru.archive.ubuntu.com/ubuntu/pool/main/libn/libnl3/libnl-route-3-200_3.2.21-1_amd64.deb


2. Копируем в любую папку в убунте;

3. В терминале переходим в папку с deb-пакетами и выполняем: sudo dpkg --force-downgrade -i *.deb;

4. Перезагружаем network manager: sudo NetworkManager restart.

Все должно работать после того как перезагрузка завершится.

25 мая 2016 г.

What is the difference between a .war and .ear file?

In J2EE application, modules are packaged as EAR, JAR and WAR based on their functionality
JAR: EJB modules which contain enterprise java beans (class files) and EJB deployment descriptor are packed as JAR files with .jar extenstion
WAR: Web modules which contain Servlet class files, JSP Files, supporting files, GIF and HTML files are packaged as JAR file with .war (web archive) extension
EAR: All above files (.jar and .war) are packaged as JAR file with .ear (enterprise archive) extension and deployed into Application Server.

Link: http://stackoverflow.com/questions/1594667/war-vs-ear-file

20 мая 2016 г.

pg_dump, ошибка!

Пытаемся стянуть дамп базы, итог:


pg_dump: [archiver (db)] connection to database "myDB" failed: FATAL:  no pg_hba.conf entry for host "ip-address", user "postgres", database "database_name", SSL on
FATAL:  no pg_hba.conf entry for host "ip-address", user "postgres", database "myDB", SSL off


Хорошая статья о том как решается проблема:
http://pgcookbook.ru/article/no_pg_hba_conf_entry_for_host.html


PostgreSql. Сколько весят базы?

select t1.datname AS db_name, 
       pg_size_pretty(pg_database_size(t1.datname)) as db_size
from pg_database t1
order by pg_database_size(t1.datname) desc;

22 декабря 2015 г.

Визуализация данных через d3js. Структуры данных.

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

Итак, хочу сделать некую классификацию по структурам данных.
Вот некоторые разновидности:

JSON - дерево


    {
     "name": "cluster",
     "children": [
      {"name": "AgglomerativeCluster", "size": 3938},
      {"name": "CommunityStructure", "size": 3812},
      {"name": "HierarchicalCluster", "size": 6714},
      {"name": "MergeEdge", "size": 743}
     ]
    },
    {
     "name": "graph",
     "children": [
      {"name": "BetweennessCentrality", "size": 3534},
      {"name": "LinkDistance", "size": 5731},
      {"name": "MaxFlowMinCut", "size": 7840},
      {"name": "ShortestPaths", "size": 5914},
      {"name": "SpanningTree", "size": 3416}
     ]
    }

10 декабря 2015 г.

Визуализация данных. Библиотека d3js.

Есть такая штука - d3js (http://d3js.org/), которая на мой взгляд очень привлекательна. Уже больше недели хочу с ней поработать, все никак не доберусь для этого.

Тупо что-то отобразить - это не интересно. Более интересна написать некий сервис который будет подсовывать нужные данные для отображения этой замечательной библиотекой.
Вот примеры, с оф. сайта:
https://github.com/mbostock/d3/wiki/Gallery
Уже не первый раз залипаю достаточно надолго на этих примерах :)

Лучше бы работал!

29 ноября 2015 г.

Визуализация данных. Мысли вслух...

Сейчас, в современном мире в базы данных не пишутся разве что ваши сны... Хотя, и они тоже туда попадают, если вы этого хотите. Это я к тому что сейчас, все, везде и всегда пишется в какие-либо базы данных, сохраняется в хранилищах, трансформируется и анализируется для принятия решений. Мир сильно изменился, теперь мы порождаем слишком много данных. Система сбора данных работает интенсивнее чем система обработки и анализа. Думаю эта проблема актуальна для всех уровней потребности в данных (от индивидуального человека, до глобальных аналитических систем). Задача современного человека - переварить как можно большую часть информации, которая предоставляется для обозрения/изучения за как можно меньшее время.
Как это сделать?
Визуализация... Представление данных в виде таблиц - это тоже визуализация. Представление данных в виде утверждений - это тоже своего рода визуализация.
Сейчас есть прямая потребность в ускорении потребления информации и принятия решений. Картинки - вот выход. Мы с детства, перед тем как читать книгу - ищем картинки. Т.к. именно они могут рассказать нам о содержимом в сотни раз проще и быстрее чем текст. Уже давно на смену простому тексту пришла инфографика... Почему? Не потому что люди стали ленивее, а потому что это реальное ускорение скорости восприятия. Чаще всего нам не нужно учить наизусть предоставляемые данные, нам просто нужно посмотреть и принять какое-то решение.
Хочется с кем-то пообщаться по поводу визуализации. Т.к. данные сейчас охватывают все сферы жизни - визуализация это очень актуальная тема, которая будет в тренде еще долгое время. Время всего лишь отшлифует методы визуализации и упростит их, но ничем не заменит...
Хочется поработать с вот этой штукой: http://d3js.org/

25 ноября 2015 г.

NetBeans 8.1. Python projects + проблема с Python 3.4. в Ubuntu

Для того чтобы разрабатывать на python в NetBeans необходимо установить плагин.
Его можно скачать здесь: http://plugins.netbeans.org/plugin/61688/python

Необходимо скачать архив и куда-нибудь распаковать.
Далее, открываем NetBeans. Главное меню - Tools - Plugins. Открывается окно - переходим на вкладку "Downloaded", нажимаем на кнопку "Add Plugins...". Открывается диалог выбора файлом. Вам просто нужно пойти в ту папку куда вы ранее распаковали архив и выбрать сразу все файлы. Далее проследует несложный диалог установки - Готово. 
NetBeans захочет перезапуститься - лучше не отказываться.

После перезапуска в список доступных конфигураций проектов добавится папка "Python"

Видео можно посмотреть тут: 

Может возникнуть проблема (у меня была на Ubuntu 14.4), по умолчанию в проекте определен Python 2.7, хотя в системе уже стоит Python 3.4. Предполагаю что это из-за алиасов, т.к. 3-й python в терминале доступен как "python3" (например pethon3 --version).
Решается проблема так: 

Кликнуть правой кнопкой мыши на проекте в окне Projects, кликнуть Properties. Откроется диалог. Рядом с пунктом "Python platform", есть кнопка "Manage...". При нажатии открывается диалог с платформами. Нужно нажать на кнопку "New", и в перейти в каталог "usr/bin", там найти python3 и выбрать его. У вас в список добавится платформа. Выбрать ее и нажать кнопку "Make default", чтобы сделать ее платформой по умолчанию.
Все!

16 ноября 2015 г.

Настраиваем рабочее место django-разработчика на linux (ubuntu 14.4) в виртуальном окружении.

Используем виртуальное окружение чтобы не захламлять систему разными версиями библиотек. (virtialenv).
Если кто-то не знаком с virtialenv - в интернете очень много материалов для ознакомления.

Устанавливаем easy_install или pip для установки дополнительных пакетов.
Установка easy_install:
sudo apt-get install python-setuptools

Установщик готов,  теперь с его помощью устанавливаем virtualenv:
sudo easy_install virtualenv

Теперь создаем папку виртуального окружения:
virtualenv --no-site-packages myvirtual

где
--no-site-packages - параметр указывающий не использовать системные библиотеки питона.
myvirtual - папка витруального окружения.

После выполнения этой команды, в текущем каталоге появился каталог myvirtual. Это легко проверить выполнив команду в терминал:
ls -l

В этом каталоге содержится несколько подкаталогов. Нас на текущий момент интересует bin. В каталоге bin  есть скрипт activate которые активирует виртуальное окружение.

Находясь в каталоге virtualenv вводим команду:
source bin/activate

Тем самым включая контекст виртуального окружения. Это означает что в с текущего момента мы будем работать только в своем виртуальном окружении. В терминале, в начале строки ввода команд в скобках должно быть указано наименование виртуального окружения в контексте которого мы сейчас находимся (myvirtual).

Теперь необходимо установить django. Для этого выполняем в терминале команду:
easy_install django

Ждем окончания установки.

Рабочее место готово!

Для выхода из виртуального окружения вводим команду:

bin/deactivate.


После чего вы вновь окажитесь в окружении своей системы.



8 ноября 2015 г.

Aqua Studio. Teradata. Пропадают комментарии в хранимках

После установки Aqua Studio не до конца настроил некоторые параметры, что в свою очередь вылилось в пропажу комментариев из текстов хранимок. Пропажа вызвала запредельное негодование, т.к. комменты вычистились из нескольких хранимок с 1000+ строк и нетривиальной логикой.

Чтобы остановить стирание комментов при сохранении хранимки в метаданных сервера терадаты, нужно в Aqua Studio установить следующие параметры:


Тем кто сидит на SQuirreL sql можно не бояться :)

Python. Ошибка Teradata beyond SQL_ACTIVE_STATEMENTS limit

Если кто-то встретился с такой проблемой, .то вы просто не закрываете "курсор" когда отправляете много statements на сервер.

Вот пример кода который генерирует ошибку:
    def executeSql(sqlCommand, parameters = ()):
        connect = SqlQuery.getConnect()
        try:
            cursor = connect.cursor()
            cursor.execute(sqlCommand, parameters)
            connect.commit()
        except Exception as e:
            logger.exception('Sql query error.', str(e))
            connect.rollback()
        finally:
            connect.close()
        return 0


Вот пример кода, который позволяет избежать ошибки:
    def executeSql(sqlCommand, parameters = ()):
        connect = SqlQuery.getConnect()
        try:
            cursor = connect.cursor()
            cursor.execute(sqlCommand, parameters)
            connect.commit()
        except Exception as e:
            logger.exception('Sql query error.', str(e))
            connect.rollback()
        finally:
            cursor.close()
            connect.close()
        return 0

SqlQuery  - это самописный билдер подключений. Он не влияет на проблему.
Проблема была замечена пока только на терадате.

17 октября 2015 г.

Теперь еще и Ubuntu!

Установил себе Ubuntu 14.4 на Sony Vaio VPCF1.
Теперь на ноуте Windows 7 и Ubuntu 14. Установилась вообще без проблем. Все работает, с драйверами заморочек не было.

Пост родился, т.к. в интернетах куча инфы что установка проходит с проблемами, а то и вообще не завершается удачно.