воскресенье, 26 февраля 2017 г.

Что такое property в Java?

Это поле у JavaBean  -  то есть это приватный field, у которого есть гетер и сетер.

суббота, 25 февраля 2017 г.

Groovy Metaprogramming

Runtime MetaProgramming

MOP - Meta Object Protocol, набор правил, как обрабатывается системой реального времени Groovy вызов в метод объекта и как контролируется промежуточный слой в объектах.

вторник, 21 февраля 2017 г.

Groovy для себя

* Методы классов по умолчанию публичные.
* Поля классов по умолчанию приватные.
* Поля одного типа можно писать через запятую
* Groovy по-умолчанию импортирует основные(наиболее часто используемые) Java пакеты JDK, по этому импортировать нам приходится не часто.
* самовыполняемый скрипт
Например hello.groovy файл:
#!/usr/bin/env groovy
println "Hello!"
никакой магии, просто env это не просто посмотреть переменные среды а
$ man env
ENV(1)                    BSD General Commands Manual                   ENV(1)

NAME
     env -- set environment and execute command, or print environment
...
* чтобы обойти гетер в бине, а достучаться напрямую к полю нужно применять оператор .@ 
* чтобы Groovy не генерировал для нас гетеры и сетеры нам нужно указать область видимости явно для поля

понедельник, 20 февраля 2017 г.

set магия bash

$ set -x
выводит команды, которые выполняются в фоне.

Например есть put_out_the_trash.sh:
#!/bin/bash

set -x

touch cookiewrap
mv cookiewrap dustbin
mv dustbin trashcan_kitchen
mv trashcan_kitchen outside

Если его выполнить веведется:

$ ./put_out_the_trash.sh
+ touch cookiewrap
+ mv cookiewrap dustbin
+ mv dustbin trashcan_kitchen
+ mv trashcan_kitchen outside
$


$ set -e
Означает, что нужно прекратить работу скрипта, если хотя бы одна команда выполняемая в пайплайне вернет ненулевой результат

machinelearning and data science ресурсы

http://machinelearningmastery.com/best-machine-learning-resources-for-getting-started/

https://www.coursera.org/learn/machine-learning

https://dou.ua/lenta/articles/data-science-in-outsource/?from=comment-digest_post&utm_source=transactional&utm_medium=email&utm_campaign=digest-comments



воскресенье, 19 февраля 2017 г.

Logging with docker-compose

Есть множество драйверов для логирования: json-file, syslog, journald, gelf,awslogs и другие. json-file формат по умолчанию.

version: '2'
services:
  worker:
    image: tutum/hello-world
    command: sh - c "while true; do echo test; done"
    container_name: logs_gutler
    logging:
      driver: json-file
      options:
        max-file: "5"
        max-size: "1m"
$ docker-compose up -d
$ docker inspect --format '{{.LogPath}}' logs_gutler
/var/lib/docker/containers/12fgsfgsdfgsdf....

Теперь же можно настроить логирование на внешний сервис, который напримиер принимает логи в формате syslog

version: '2'
services:
  worker:
    image: tutum/hello-world
    command: sh - c "while true; do echo test; done"
    container_name: logs_gutler
    logging:
      driver: syslog
      options:
        syslog-address: "udp://logs4.papertrailapp.com:33624"

Voluming with Docker-compose

Можно маунтить вольюмы в режиме только чтение(:ro):
version: '2'
services:
  nginx:
    image: nginx
    volumes:
      - ./cong.d:/etc/nginx/conf.d/:ro
    ports:
      - 80
Кстати, когда мы не указываем к какому именно порту примаунтить выставленный из контейнера порт, он маунтится на случайный свободный. Чтобы увидить на какой именно порт он выставился:
$ docker-compose port nginx 80
0.0.0.0:32769

Именованные томы(named volumes)

Так мы маунтим не к относительному/абсолютному пути на локальной машине место в контейнере, а к "диску/тому", который мы будем делить между несколькими контейнерами, что позволит нам разумно использовать емности физического диска, а также позволим докер-демону позаботся самому где это место будет находится в реальной файловой системе, так мы убираем проблему запуска кластера на серверах где нет исходников для сборки, а только одна возможность сказать образы с реджистри.
version: '2'
services:
  worker:
    image: tutum/hello-world
    volumes:
      - results:/results
  reposrting:
    image: tutum/hello-world
    volumes_from:
      - worker:ro

volumes:
  results:

Ну и конечно же мы можем подключать внешние томы, согданные вне компоуза
$ docker volume create --name images --driver=local

version: '2'
services:
  resizer:
    image: tutum/hello-world
    volumes:
      - images:/images:rw

volumes:
  results:
    external: true

Чудесный прием для теста, согдать контейнр с образа, увидить то, что было нужно и удалить его после закрытия
$ docker-compose up -d
Creating network "0404_default" with the default driver
Creating 0404_resizer_1
$ docker-compose exec resizer ls /images
$ docker-compose exec resizer touch /images/pic.jpg
$ docker run --rm -v images:/images tutum/hello-world ls /images
pic.jpg
Кстати как и в случае с сетями, так и с дисками мы можем установить COMPOSE_PROJECT_NAME системную переменную или --project-name ключ, чтобы получать отличное от имени текущей директории.

Плагины

Позволяют томами подключать Asure, AWS S3  и другие.

суббота, 18 февраля 2017 г.

Docker-compose networking

По умолчанию докер-компоуз всегда создает отдельную сеть типа мост, давая ей имя текущей директории с постфиксом _default. Чтобы дать определенное, можно либо определить системную переменную COMPOSE_PROJECT_NAME, либо указать имя проекта через ключ
$ docker-compose --project-name myProject up -d

суббота, 11 февраля 2017 г.

Docker-compose

docker-compose - инструмент для оркестрации мультиконтейнерного приложения.

docker-compose [COMMAND] -h - узнать помощь по конкретной команде.
docker-compose up - запускает(билдит, стягивает, создает из образов контейнеры и потом запускает) все контейнеры
docker-compose up -d --no-deps [SERVICE_NAME] - пересоборать указанный сервис, при этом не ложить даже те, что от него зависят.
docker-compose ps - проверить текущее состояние контейнеро, упрвляемых композером
docker-compose logs - выводит цветные и собранные логи из контейров, упрвляемых композером, на момент вызова команды
docker-compose logs -f - выводит цветные и собранные логи из контейров, упрвляемых композером, в режиме постоянного наблюдения за текщими обновлениями
docker-compose logs [SERVICE_NAME] - выводит цветные и собранные логи из контейра с указанным именем
docker-compose stop - останавливаем без удаления контейнеры управляемые композером
docker-compose rm - удаляет контейнеры управляемые композером
docker-compose build - пересобирает все образы
docker-compose build  [SERVICE_NAME,...] - пересобирает только указанные образы
docker-compose scale app=3 fe=2 - масшатбируем указанный сервис по имени до указанного количества контейнеров. Это не сработает, если сервису дали статическое имя контейнера container_name: someserive, потому что создать еще один контейнер с тем же именем не получится.
docker-compose pull - стягивает образы с реджистри, а не билдит их с нуля.
docker-compose create - создает контейнеры с образов, которые были до этого собраны(build) или скачены(pull).
docker-compose start - запускает созданные, но еще не запущенные, контейнеры.
docker-compose pause [SERVICE_NAME,...] - приостановть сервис, сохраняя его текущее состояние, с которого можно возобновить работу.
docker-compose unpause [SERVICE_NAME,...] - продолжить работу приостановленного сервиса/сервисов.
docker-compose run [SERVICE_NAME,...] [CMD] - запустаются команды типа "сдела одноразовое вычисление и положил контейнер". Собираются репорты, отправляются письма с накопившейся статистикой и подобные джобы.
docker-compose port --index=2 worker 80 - узнать порт сервиса, которому не было определено явного порта на хосте, ключ индекс же используется, когда сервис был отмасштабированный и нас интересует именно указанный по порядку поднятый контейнер этого сервиса.
docker-compose events - запускает процесс, который мониторит, что происходит в класете и сообщает об этом в консоль - например изменение масштабирования командой с другой сессии терминала, или падение какого-то контейнера и тому подобное.
docker-compose config - выводит содержимое компоуз файла, если в файле нет ошибок, или сообщение об ошибке - если есть.
docker-compose down - stop, rm, rm networks, rm volumes(нужен ключ -v. --volumes), rm images(нужен ключ --rmi type(all or local)).
docker-compose restart - down, up.

Компоуз также будет использовать переменные среды, чтобы заменить на их значения места в docker-compose.yml. Чтобы выставить их по умолчанию, можно завести файл .env, который компоуз читает и применяет, если явно не были выставлены переменные среды при вызове или в системе.
Также можно подключать наружные файлы:
version: '2'
services: 
  worker:
    image: tutum/hello-world:${TAG}
    environment:
      - BAR
    env_file:
      - "staging.env"
    ports:
      - 80
Если мы указываем переменную окружения без значения в секции environment, то такая переменная мигрирует с хозяйской ОС в контейнер.
Все команды будут искать в текущей директории файл docker-compose.yml.
Или же можно через ключ -f(--file) FILE указать файл с любым именем из любого места.
-H(--host) HOST - указываем хост на котором находится демон докера для запуска кластера.

Ключи для защищенного соединения:
--tls
--tlscacert CA_PATH
--tlscert CLIENT_CERT_PATH
--tlskey TLS_KEY_PATH
--tlsverify
--skip-hostname-check


четверг, 2 февраля 2017 г.

Jenkins Workflow(pipeline): как собрать результаты тестов, если тесты выкинуть ненулевой ответ?

Есть два подхода:
1.
Jenkinsfile:
node {
    /* .. snip .. */
    stage('Test') {
        /* `make check` returns non-zero on test failures,
         * using `true` to allow the Pipeline to continue nonetheless
         */
        sh 'make check || true' // <1>
        junit '**/target/*.xml' // <2>
    }
    /* .. snip .. */
}
make check || true - этот трюк всегда вернет ненулевой ответ

2.
Jenkinsfile:
node {
    /* .. snip .. */
    stage('Test') {
        try {
            sh 'make check'
        }
        finally {
            junit '**/target/*.xml'
        }
    }
    /* .. snip .. */
}