Анализ 1С: Предприятие 7.7 с помощью ELK стека

Публикация № 985836

Администрирование - Журнал регистрации

Elasticsearch Logstash Kibana ELK Stack Ветис API Меркурий

25
Рассмотрим систему на базе Elasticsearch, Logstash и Kibana (ELK Stack) для анализа логов 1С Предприятие 7.7 с целью визуализации и анализа событий 1С.
Не зная прошлого, невозможно понять подлинный смысл настоящего и цели будущего. / Максим Горький
Не знать истории-значит всегда быть ребёнком. / Цицерон

1С Предприятие 7.7 хранит системную информацию в файле SYSLOG\1cv7.mlg в виде текста в формате csv, разделитель ";". Таблицы в виде текста сложно читать. Большой объем информации и событий удобнее анализировать визуально, что мы и попытаемся сделать.

Постановка задачи

  1. Видеть нагрузку на систему в реальном времени в виде графиков
    1. по времени выполнения отчетов, документов, обработок
    2. по времени выполнения процедур и функций
  2. Быстро фильтровать события
    1. по ошибкам [если они есть]
    2. по транзакциям или предупреждениям
  3. Система аналитики должна работать автономно, не использовать ресурсы рабочего сервера 1С.

пример

Что такое ELK Stack

  • Elasticsearch используется для хранения, анализа, поиска по логам.
  • Kibana представляет удобную и красивую web панель для работы с логами.
  • Logstash сервис для обработки логов и отправки их в Elasticsearch.
  • Beats — агенты для отправки логов в Logstash. Будем использовать Filebeat для отправки данных из текстовых логов linux, Winlogbeat для отправки логов из журналов Windows систем.
  • Также используем утилиту rsync - для копирования syslog\1cv7.mlg c Windows на Ubuntu

Схематично работу системы изобразим так:

1. Подготовка

Скопируем логи 1с с Windows сервера на Ubuntu с помощью утилиты rsync, входящей в пакет cygwin.com На стороне сервера Ubuntu настраиваем сервис rsync

apt-get install rsync

Настраиваем параметры в /etc/rsyncd.conf

uid = user
gid = root
use chroot = yes
max connections = 50
pid file = /var/run/rsyncd.pid
log file = /var/log/rsync.log

[share]
path = /home/files/       # каталог логов
hosts allow = 192.168.0.1 # адрес сервера 1с
hosts deny = *
#list = true
read only = false
#auth users = s1
#secrets file = /etc/rsyncd.secrets

Создаем bat file на сервере 1с

set BACKUP_DIR=E:\1c\complex\syslog\
cd /d %BACKUP_DIR%
C:\cygwin64\bin\rsync.exe -avz --inplace --append --chmod=u=rw --log-file=c:\bat\rsync.log ./*.mlg s1@192.168.100.2::share/1c/ 

Обязательно указываем параметр - копировать только изменения для уменьшения трафика. И чтобы не перезаписывать весь файл, иначе в ELK данные будут дублироваться. запускаем

C:\cygwin64\bin\rsync.exe -avz --inplace --append --chmod=u=rw --log-file=c:\bat\rsync.log ./*.mlg s1@192.168.100.2::share/1c/
sending incremental file list
1cv7.mlg

sent 298 bytes  received 35 bytes  666.00 bytes/sec
total size is 68,683,437  speedup is 206,256.57

Проверяем файл в каталоге назначения на сервере Ubuntu Добавляем задание в планировщик заданий с периодом 5 минут.

Установка Java на Ubuntu

Подключаем репозиторий с Java 8, обновляем список пакетов и устанавливаем Oracle Java 8.

add-apt-repository -y ppa:webupd8team/java
apt update
apt install oracle-java8-installer

Проверяем версию явы в консоли.

java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

Установка Elasticsearch

Копируем себе публичный ключ репозитория:

# wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | apt-key add -

Если у вас нет пакета apt-transport-https, то надо установить:

# apt install apt-transport-https

Добавляем репозиторий Elasticsearch в систему:

# echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee -a /etc/apt/sources.list.d/elastic-6.x.list

Устанавливаем Elasticsearch на Debian или Ubuntu:

apt update 
apt-get install elasticsearch

После установки добавляем elasticsearch в автозагрузку и запускаем.

systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service

Проверяем, состояние сервиса:

systemctl status elasticsearch.service

Если сервис запущен, тогда переходим к настройке Elasticsearch.

Настройка Elasticsearch

Настройки Elasticsearch находятся в файле /etc/elasticsearch/elasticsearch.yml. На начальном этапе нас будут интересовать следующие параметры:

path.data: /var/lib/elasticsearch # директория для хранения данных
network.host: 127.0.0.1 # слушаем только локальный интерфейс

По-умолчанию Elasticsearch слушает все сетевые интерфейсы. Нам это не нужно, так как данные в него будет передавать logstash, который будет установлен локально. Обратите внимание на параметр path.data для директории с данными. Чаще всего индексы будут занимать значительное место. Если останется меньше 10% свободного места elasticsearch уходит в глухой read-only и вывести сервис из этого состояния – ещё та задача. Подумайте заранее, где вы будете хранить логи. Остальные настройки - дефолтные. После изменения настроек, перезапустите службу:

systemctl restart elasticsearch.service

Смотрим, что получилось:

netstat -tulnp | grep 9200
tcp6 0 0 127.0.0.1:9200 :::* LISTEN 14130/java

Elasticsearch работает на локальном интерфейсе - слушает ipv6, про ipv4 ни слова. Но его он тоже слушает, так что все в порядке. Переходим к установке kibana.

Установка Kibana

apt-get install kibana

Добавляем Кибана в автозагрузку и запускаем:

systemctl daemon-reload
systemctl enable kibana.service
systemctl start kibana.service

Проверяем состояние запущенного сервиса:

systemctl status kibana.service

По-умолчанию, Kibana слушает порт 5601. Только не спешите его проверять после запуска. Кибана стартует долго. Подождите минуту и проверяйте.

netstat -tulnp | grep 5601
tcp 0 0 127.0.0.1:5601 0.0.0.0:* LISTEN 27401/node

Настройка Kibana

Файл с настройками Кибана располагается по пути — /etc/kibana/kibana.yml. На начальном этапе можно вообще ничего не трогать и оставить все как есть. По-умолчанию kibana слушает только localhost и не позволяет подключаться удаленно. Это нормальная ситуация, если у вас будет на этом же сервере установлен nginx в качестве reverse proxy, который будет принимать подключения и проксировать их в кибана. Так и нужно делать в продакшене, когда системой будут пользоваться разные люди из разных мест. С помощью nginx можно будет разграничивать доступ, использовать сертификат, настраивать нормальное доменное имя и т.д. Если же у вас это тестовая установка, то можно обойтись без nginx. Для этого надо разрешить Кибана слушать внешний интерфейс и принимать подключения. Измените параметр server.host, Если хотите, чтобы она слушала все интерфейсы, укажите в качестве адреса, например вот так:

server.host: "0.0.0.0"

После этого Kibana надо перезапустить:

systemctl restart kibana.service

Теперь можно зайти в веб интерфейс по адресу http://ubuntu:5601. Kibana Kibana[/caption] В процессе настройки будем подключаться напрямую к Kibana.

Установка и настройка Logstash

apt-get install logstash

Добавляем logstash в автозагрузку:

systemctl enable logstash.service

Запускать пока не будем, надо его сначала настроить. Основной конфиг logstash лежит по адресу /etc/logstash/logstash.yml его трогать не будем настройки будем по смыслу разделять по разным конфигурационным файлам в директории /etc/logstash/conf.d. Создаем первый конфиг input.conf, который будет описывать прием информации с beats агентов.

input {
  beats {
    port => 5044
  }
}

Тут все просто. Указываем, что принимаем информацию на 5044 порт. Этого достаточно. Если вы хотите использовать ssl сертификаты для передачи логов по защищенным соединениям, здесь добавляются параметры ssl. Будем собирать данные из закрытого периметра локальной сети, поэтому использовать ssl нет необходимости. Теперь укажем, куда будем передавать данные. Тут тоже все относительно просто. Рисуем конфиг output.conf, который описывает передачу данных в Elasticsearch.

  
output {
    if [type] == "s1" {
        elasticsearch {
            hosts    => "localhost:9200"
            index    => "s1-%{+YYYY.MM.dd}"
        }
    }
    else {
        elasticsearch {
            hosts    => "localhost:9200"
            index    => "unknown_messages"
        }
    }
    
    #все поступающие данные logstash будет отправлять в системный лог = /var/log/syslog 
    #Используйте только во время отладки, иначе лог быстро разрастется
    #stdout { codec => rubydebug }       
}

Здесь все просто — передавать данные в elasticsearch под указанным индексом с маской в виде даты. Разбивка индексов по дням и по типам данных удобна с точки зрения управления этими данными. Потом легко будет выполнять очистку данных по этим индексам. Остается последний конфиг с обработкой входящих данных. Тут начинается самое интересное. Рисуем конфиг filter.conf.

  
filter {
 if [type] == "s1" {
    csv {
        separator => ";"
        columns => ["date1","time2","user","t1","t2","t3","t4","t5","t6"]
    }
    mutate {
    add_field => {
        "timestamp" => "%{date1} %{time2}"
    }
#    remove_field => ["time1", "time2"]
    }
    date {
        match => ["timestamp", "YYYYMMdd HH:mm:ss"]
        target => "@timestamp"
    }
    if "_dateparsefailure" in [tags] {
        drop{}
    }
    if [t3] in ["ИзмененПроведенный","ЗапускОтчета","ВосстановлениеПоследовательности", "OpenSession", "GrbgRuntimeErr" ] {
        # пропускаем обработку этих событий
        }
    else {
      kv {
        value_split => ":"
        field_split => " ;"
        source => "t5"
        }
        mutate {
            convert => { "ВремяВыполнения" => "integer" }
        }
    }
  }
}

Первое, что делает этот фильтр - парсит логи с помощью фильтра csv, разбивая на колонки по символу ";" и выделяет значения, которые записывает в поля. Дальше используется модуль date для того, чтобы выделять дату из поступающих логов и использовать ее в качестве даты записи в elasticsearch, если не получается - прерываем обработку. Делается это для того, чтобы не возникало путаницы, если будут задержки с доставкой логов. В системе сообщения будут с одной датой, а внутри лога будет другая дата. Неудобно разбирать инциденты. Потом для колонки t3 используем фильтр kv для выделения Параметр:Значение. Разделителями являются символы " " или ";". Закончили настройку logstash. Запускаем его:

systemctl start logstash.service

Проверьте на всякий случай лог /var/log/logstash/logstash-plain.log, чтобы убедиться в том, что сервис запущен и нет ошибок. Теперь настроим агенты для отправки данных в logstash.

Установка Filebeat для отправки логов в Logstash

В Debian/Ubuntu ставим так:

apt-get install filebeat

После установки рисуем примерно такой конфиг /etc/filebeat/filebeat.yml для отправки логов в logstash.

filebeat.inputs:
- type: log
  enabled: true
  paths:
      - /home/files/1c/*.mlg
  fields:
    type: s1
  encoding: "cp1251"
  fields_under_root: true
  scan_frequency: 5s

output.logstash:
  hosts: ["localhost:5044"]

xpack.monitoring:
  enabled: true
  elasticsearch:
    hosts: ["http://localhost:9200"]

Некоторые пояснения к конфигу: с помощью поля type, указываем тип лога: s1, в зависимости от этого типа меняются правила обработки в logstash. Обязательно указываем кодировку "cp1251", иначе по умолчанию будут грузится кракозябры "utf". Запускаем filebeat и добавляем в автозагрузку.

systemctl start filebeat
systemctl enable filebeat

Проверяйте лог по адресу /var/log/filebeat/filebeat. Он весьма информативет. Если все в порядке, увидите список всех логов в директории /var/log/nginx, которые нашел filebeat и начал готовить к отправке. Если все сделали правильно, то данные уже потекли в elasticsearch. Мы их можем посмотреть в Kibana. Для этого открываем web интерфейс и переходим в раздел Discover. Так как там еще нет индекса, нас перенаправит в раздел Managemet, где мы сможем его добавить.

Добавление индекса в Kibana

Вы должны увидеть индекс, который начал заливать logstash в elasticsearch. В поле Index pattern введите s1-* и нажмите Next Step. На следующем этапе выберите имя поля для временного фильтра, выбирайте — @timestamp, и жмите Create Index Pattern.

Создание индекса с данными

Новый индекс добавлен. Теперь при переходе в раздел Discover, он будет открываться по-умолчанию со всеми данными, которые в него поступают.

Просмотр логов Elasticsearch в Kibana

Получением логов с linux серверов настроили. Переходим к анализу.

Добавляем счетчики в 1С

Добавим две функции, которые будем вызывать для анализа документов, отчетов и обработок. Функции оформим в виде класса ОбщиеФункции:

Функция Старт(Конт="") Экспорт
	Возврат _GetPerformanceCounter();
КонецФункции    

Функция Финиш(ВремяНачала, Конт, Имя="", Док="", ТипСобытия="ВнешняяОбработка") Экспорт
 	Попытка 
 		Путь = Конт.РасположениеФайла();
   	Исключение
	   	Попытка
	 		// класс
	   		Путь = Конт.ПолучитьПуть();  
	   	Исключение   
	   		//Путь = "НеопределеннаяОбработка";
			ФормаРасш = СоздатьОбъект("РасширениеФормы");
			Попытка 
				ФормаРасш.УстановитьФорму( Конт );
		 		Путь = ФормаРасш.ПолныйТипОбъекта();  		 		
		 	Исключение
		 		Путь = "Модуль";
		 	КонецПопытки;	   		
	   	КонецПопытки;
	КонецПопытки;                
	
	Время= _GetPerformanceCounter() - ВремяНачала;  
	Сообщение = "Путь:"+Путь+" ВремяВыполнения:"+Время;
	
	Попытка 
		Сообщение = Сообщение + " Вид:"+Конт.Вид();
	Исключение
	КонецПопытки;
	
	Если ПустоеЗначение(Имя)=0 Тогда 
		Сообщение = Сообщение +" Имя:"+Имя;
	КонецЕсли;
	ЗаписьЖурналаРегистрации(Сообщение, ТипСобытия, , Док, 3);
	Возврат Время;
КонецФункции //Финиш

Для замеров проведения добавляем в модуль проведения документа

Процедура ОбработкаПроведения(ВидыДвижений)	    
	оф = СоздатьОбъект("ОбщиеФункции");
	t1 = оф.Старт();
	...
	оф.Финиш(t1, Контекст, "ОбработкаПроведения", ТекущийДокумент(), "Документ");
КонецПроцедуры //ОбработкаПроведения()   

Выводы

Ветис.API - система с последовательным доступом, на текущий момент не позволяющая обрабатывать несколько запросов одновременно - значит, сначала отправляем запрос, потом дожидаемся ответа, и только после этого можно отправлять следующий запрос. Поэтому 7,5 сек за 1 транзакцию - приемлемый результат, если время одного запроса сильно больше - надо выяснять причину. Время, используемое в запросе остатков = 23,8 сек за 1 запрос в большей степени характеризует сервера Ветис.API и нагрузку на них. Если время 1 запроса остатков сильно больше требуется:

  • Сократить период запроса для Ветис.API версии 2.1
  • Привести остатки в соответствии с остатками на складе = списать "лишние" остатки.

ELK - мощный OpenSource инструмент. Мы получили инструмент, с помощью которого можно анализировать работу 1С Предприятия 7.7 в рабочем режиме, не замедляя работы системы. Изучение логов помогает определить слабые места системы и увеличить качество обслуживания систем 1С Предприятие 7.7 Оптимизировать желательно зная слабые места = сколько времени выполняется функция и как часто вызывается, помня о золотом правиле: Оптимизируй там где болит, а не там где хочется. В дальнейшем планируем рассказать о создании Dashbord и Visualize на примере 1С Предприятия 7.7.

Ссылки

установка ELK стека и настрока отправки логов Windows

Фильтры в Logstash мощный инструмент

Исходная статья

25

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. CheBurator 3389 23.01.19 00:33 Сейчас в теме
Очень много окружения надо настраивать для такого анализа.
имеетсмысл делать только если инфоситсема уже сложилась, все эти сервисы, убунты, и прочее - утсановлены итд.
Основным можно признать только ограничение
"Система аналитики должна работать автономно, не использовать ресурсы рабочего сервера 1С."
Для рядовго 1Сника-клюшечника Оправдано только если такая "подсистема анализа логов" дает действительно удобства КОГДА НИЧЕГО НЕ НАДО ПРОГРАММИТЬ, а все галочками на дашбордах/графиках можно понастраивать и весь упомянутый софт есть в виде готовых к инсталляции пакетов (где ссылки на это?). Ну и желательно без всяких убунт, если пакеты поставить еще можно асилить, то с линуксами возиться - не все могут себе позволить (возражения что "там возиться не надо - ставится с нуля одной кнопкой" - только при наличии ссылки на такую "убунту") - поэтому хочется все на виндах без линукса. А так - можно и через 1С++ с поставщиком данных "журнал регистрации" наверное не хуже сделать... тем более что разновидностей записей/событий не так уж и много...

Но полезно. Может когда и пригодится.
Про дашбоарды и визуализацию - будет интересно.
o.nikolaev; leongl; PerlAmutor; +3 1 Ответить
3. phsin 161 23.01.19 09:04 Сейчас в теме
(1)
1. изучать новое - это весело ;)
2. еще и полезно - позволяет посмотреть на существующее положение вещей с другой стороны.
тем более инструменты существуют open source

Для рядовго 1Сника-клюшечника Оправдано только если такая "подсистема анализа логов" дает действительно удобства КОГДА НИЧЕГО НЕ НАДО ПРОГРАММИТЬ, а все галочками на дашбордах/графиках можно понастраивать и весь упомянутый софт есть в виде готовых к инсталляции пакетов (где ссылки на это?). Ну и желательно без всяких убунт, если пакеты поставить еще можно асилить, то с линуксами возиться - не все могут себе позволить (возражения что "там возиться не надо - ставится с нуля одной кнопкой" - только при наличии ссылки на такую "убунту") - поэтому хочется все на виндах без линукса.

если такой опытный 1С-ник говорит о том что " рядовой 1Сник-клюшечник" не сможет Ubuntu настроить, тогда понятно почему говорят что 1С ники ничего не знают и не умеют...
"убунту" - это уже стандарт... даже MS выпускает .NET Core для linux... пора изучать... https://docs.microsoft.com/ru-ru/dotnet/core/linux-prerequisites
user1004034; artbear; +2 Ответить
8. Steelvan 23.01.19 12:07 Сейчас в теме
(3) Вы очень строги к людям.

Абсолютное большинство людей занимаются программированием на работе за деньги => делают и знают только то, за что платят на текущем рабочем месте.
И вместо изучения новых технологий тратят время на семью, игры, пиво => просто живут.
И их в этом обвинять словами "...тогда понятно почему говорят что 1С ники ничего не знают и не умеют..." какой смысл ?
10. phsin 161 23.01.19 13:04 Сейчас в теме
(8) я не обвиняю, а констатирую факт
извините, неудобно слышать Ваши оправдания - смотря на кого вы равняетесь - вот Давид Хейнемейер Ханссон например создал фреймворк Ruby on Rails,
ребята создали проект 1cpp = это же вообще магия, волшебство - практически ООП добавили в 1С, в 8ке сейчас такого нет
Алексей Лустин, кажется, в каждом интервью и выступлении говорит - расширяйте границы, изучайте новое, не замыкайтесь только на 1С
ну а семью и все остальное никто не отменял ;)
11. Steelvan 23.01.19 13:43 Сейчас в теме
(10) оправдания 0_О

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

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

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

"..тогда понятно почему говорят что 1С ники ничего не знают и не умеют... " = так говорят люди со стандартным и шаблонным мышлением, мне вас жаль.
12. phsin 161 23.01.19 17:57 Сейчас в теме
(11) если использовать Вашу терминологию - если Вы бухгалтер, тогда должны знать принципы двойной записи...
установка linux для программиста - нижний уровень вхождения в профессию программиста (это личная точка зрения)
для 8ки - это обязательно, 8ка устанавливается на *nix как серверная часть так и рабочие версии, это если вы не знали

Вы переходите на личности и превращаете инфостарт в мисту...

Если вы испугались страшных слов может не надо об этом кричать всему свету?
Я не ваш работодатель и никто Вас не упрекает, что чего-то не знаете. посмотрите в интернете там куча инструкций.
На вашем месте я бы больше обижался если бы меня назвали "программист", "КОГДА НИЧЕГО НЕ НАДО ПРОГРАММИТЬ"

И эта статья размещена чтобы поделиться опытом и возможно услышать КОНСТРУКТИВНУЮ критику.
Спасибо, Ваше мнение я услышал, дальше можете не продолжать.
13. Steelvan 23.01.19 22:52 Сейчас в теме
(12)
Нормальный 1С программист должен знать:
*) Управленческий учет;
*) Бухгалтерский учет;
*) Кадровый учет;
*) Финансовый учет.

Вы этого не знаете, зато знаете линукс, смешно.
Теперь понятно почему из-за таких как Вы говорят что 1С ники ничего не знают и не умеют.
2. Serg O. 170 23.01.19 08:58 Сейчас в теме
для 1C 7.7 ???? оно 15 лет назад было...
Вы пишете: 1С Предприятие 7.7 хранит системную информацию в файле SYSLOG\1cv7.mlg в виде текста в формате csv, разделитель ";".

а формат логов для 1С 8.2 - *.lgp - в принципе тоже через ; но файл в 10 - 100 Гб ничем не читается даже!
а тем более для 1С 8.3 - формат логов вообще другой!
а про них не слова...

напишите вариант для 8.2 или лучше для 8.3
4. phsin 161 23.01.19 09:13 Сейчас в теме
(2) еще многие работают на 7ке...
описание формата логов для 8ки - *.lgp пока не встречал...
5. phsin 161 23.01.19 09:25 Сейчас в теме
да и с 8кой как-то все там заморочено...
скорее всего сохраняются значения через ЗначениеВСтрокуВнутр
а с внутренней структурой кто будет возиться ?
вот если бы можно было хранить логи в текстовом файле...
6. artbear 1133 23.01.19 11:51 Сейчас в теме
Функции оформим в виде класса ОбщиеФункции:


(0) Дело 1С++ живет :) сколько лет прошло уже.

Приятно, понимаешь :)
7. comol 3961 23.01.19 11:57 Сейчас в теме
Предлагаю продолжить данную статью циклом где-нибудь на хабр. я бы предложил тематики:

- "Построение отказоустойчивого кластера MS DOS 6.22"
- "Анализ причин взаимоблокировок Dbase III"
- "Ускорение работы микросервисов разработанных на QBasic"
........... :)
9. phsin 161 23.01.19 12:34 Сейчас в теме
(7) тогда уж добавить и такие:
- самое дорогое внедрение
- и у кого 1С больше всего памяти кушает
Москва и Питер победят? )))

кстати на хабре недавно пробегала статья про Windows XP и надо сказать много ретроградов собралось...
17. phsin 161 04.03.19 09:50 Сейчас в теме
(7) на хабре уже ответили... :)

https://m.habr.com/ru/post/423889/

Я занимаюсь программированием уже 15 лет. Но в последнее время при разработке не принято думать об эффективности, простоте и совершенстве: вплоть до того, что мне становится грустно за свою карьеру и за IT-отрасль в целом.
18. comol 3961 05.03.19 19:22 Сейчас в теме
(17) Статья клёвая, спасибо. Но к теме то отношения не имеет. 7-ка работает медленнее 8-ки.
В мире 1С эту статью можно применить скорее к EDT и телодвижениям 1C в сторону Java...
14. CheBurator 3389 23.01.19 23:03 Сейчас в теме
93) я только "за!" начсчет изучения нового и интересного. но только в том случае, если мне за это платят. или я финансово подстрахован. А так - и жизнь пройдет в попытках догнать всякие локомотивы. я их уже несколько благополучно не догнал и они также благополучно сошли со сцены...
15. CheBurator 3389 23.01.19 23:04 Сейчас в теме
но закладочку здесь сделал и следить буду за публикациями.
16. 3vs 28.01.19 11:55 Сейчас в теме
"Установка Java на Ubuntu"
Кстати, Java, похоже, переходит на коммерческую версию.

Общедоступные обновления Oracle Java SE 8, выпущенные после января 2019 года, будут недоступны для коммерческого или производственного использования без коммерческой лицензии.

www.java.com/ru/download/release_notice.jsp
Оставьте свое сообщение